@strapi/strapi 4.26.1 → 4.26.2

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 (345) hide show
  1. package/dist/Strapi.js.map +1 -1
  2. package/dist/Strapi.mjs.map +1 -1
  3. package/dist/admin.js.map +1 -1
  4. package/dist/admin.mjs.map +1 -1
  5. package/dist/commands/actions/admin/create-user/action.js.map +1 -1
  6. package/dist/commands/actions/admin/reset-user-password/action.js.map +1 -1
  7. package/dist/commands/actions/admin/reset-user-password/command.js.map +1 -1
  8. package/dist/commands/actions/components/list/action.js.map +1 -1
  9. package/dist/commands/actions/components/list/command.js.map +1 -1
  10. package/dist/commands/actions/configuration/dump/action.js.map +1 -1
  11. package/dist/commands/actions/configuration/dump/command.js.map +1 -1
  12. package/dist/commands/actions/configuration/restore/action.js +1 -2
  13. package/dist/commands/actions/configuration/restore/action.js.map +1 -1
  14. package/dist/commands/actions/configuration/restore/command.js.map +1 -1
  15. package/dist/commands/actions/console/action.js.map +1 -1
  16. package/dist/commands/actions/console/command.js.map +1 -1
  17. package/dist/commands/actions/content-types/list/action.js.map +1 -1
  18. package/dist/commands/actions/content-types/list/command.js.map +1 -1
  19. package/dist/commands/actions/controllers/list/action.js.map +1 -1
  20. package/dist/commands/actions/controllers/list/command.js.map +1 -1
  21. package/dist/commands/actions/generate/command.js.map +1 -1
  22. package/dist/commands/actions/hooks/list/action.js.map +1 -1
  23. package/dist/commands/actions/hooks/list/command.js.map +1 -1
  24. package/dist/commands/actions/install/action.js.map +1 -1
  25. package/dist/commands/actions/install/command.js.map +1 -1
  26. package/dist/commands/actions/middlewares/list/action.js.map +1 -1
  27. package/dist/commands/actions/middlewares/list/command.js.map +1 -1
  28. package/dist/commands/actions/new/action.js.map +1 -1
  29. package/dist/commands/actions/new/command.js.map +1 -1
  30. package/dist/commands/actions/plugin/build-command/action.js.map +1 -1
  31. package/dist/commands/actions/plugin/build-command/command.js.map +1 -1
  32. package/dist/commands/actions/plugin/init/action.js.map +1 -1
  33. package/dist/commands/actions/plugin/init/command.js.map +1 -1
  34. package/dist/commands/actions/plugin/init/files/admin.js.map +1 -1
  35. package/dist/commands/actions/plugin/init/files/server.js.map +1 -1
  36. package/dist/commands/actions/plugin/init/files/typescript.js.map +1 -1
  37. package/dist/commands/actions/plugin/link-watch/action.js.map +1 -1
  38. package/dist/commands/actions/plugin/verify/action.js.map +1 -1
  39. package/dist/commands/actions/plugin/watch/action.js.map +1 -1
  40. package/dist/commands/actions/policies/list/action.js.map +1 -1
  41. package/dist/commands/actions/policies/list/command.js.map +1 -1
  42. package/dist/commands/actions/report/action.js.map +1 -1
  43. package/dist/commands/actions/report/command.js.map +1 -1
  44. package/dist/commands/actions/routes/list/action.js.map +1 -1
  45. package/dist/commands/actions/routes/list/command.js.map +1 -1
  46. package/dist/commands/actions/services/list/action.js.map +1 -1
  47. package/dist/commands/actions/services/list/command.js.map +1 -1
  48. package/dist/commands/actions/start/action.js.map +1 -1
  49. package/dist/commands/actions/start/command.js.map +1 -1
  50. package/dist/commands/actions/telemetry/disable/action.js.map +1 -1
  51. package/dist/commands/actions/telemetry/disable/command.js.map +1 -1
  52. package/dist/commands/actions/telemetry/enable/action.js.map +1 -1
  53. package/dist/commands/actions/telemetry/enable/command.js.map +1 -1
  54. package/dist/commands/actions/templates/generate/action.js.map +1 -1
  55. package/dist/commands/actions/templates/generate/command.js.map +1 -1
  56. package/dist/commands/actions/ts/generate-types/action.js.map +1 -1
  57. package/dist/commands/actions/ts/generate-types/command.js.map +1 -1
  58. package/dist/commands/actions/uninstall/action.js.map +1 -1
  59. package/dist/commands/actions/uninstall/command.js.map +1 -1
  60. package/dist/commands/actions/version/command.js.map +1 -1
  61. package/dist/commands/actions/watch-admin/action.js.map +1 -1
  62. package/dist/commands/actions/watch-admin/command.js.map +1 -1
  63. package/dist/commands/index.js +60 -60
  64. package/dist/commands/index.js.map +1 -1
  65. package/dist/commands/utils/commander.js.map +1 -1
  66. package/dist/commands/utils/helpers.js.map +1 -1
  67. package/dist/commands/utils/logger.js +1 -2
  68. package/dist/commands/utils/logger.js.map +1 -1
  69. package/dist/commands/utils/pkg.js +1 -2
  70. package/dist/commands/utils/pkg.js.map +1 -1
  71. package/dist/commands/utils/tsconfig.js.map +1 -1
  72. package/dist/compile.js.map +1 -1
  73. package/dist/compile.mjs.map +1 -1
  74. package/dist/container.js.map +1 -1
  75. package/dist/container.mjs.map +1 -1
  76. package/dist/core/app-configuration/config-loader.js +1 -2
  77. package/dist/core/app-configuration/config-loader.js.map +1 -1
  78. package/dist/core/app-configuration/config-loader.mjs +1 -2
  79. package/dist/core/app-configuration/config-loader.mjs.map +1 -1
  80. package/dist/core/app-configuration/index.js.map +1 -1
  81. package/dist/core/app-configuration/index.mjs.map +1 -1
  82. package/dist/core/app-configuration/load-config-file.js.map +1 -1
  83. package/dist/core/app-configuration/load-config-file.mjs +1 -1
  84. package/dist/core/app-configuration/load-config-file.mjs.map +1 -1
  85. package/dist/core/bootstrap.js.map +1 -1
  86. package/dist/core/bootstrap.mjs.map +1 -1
  87. package/dist/core/domain/content-type/index.js.map +1 -1
  88. package/dist/core/domain/content-type/index.mjs.map +1 -1
  89. package/dist/core/domain/content-type/validator.js.map +1 -1
  90. package/dist/core/domain/content-type/validator.mjs.map +1 -1
  91. package/dist/core/domain/module/index.js.map +1 -1
  92. package/dist/core/domain/module/index.mjs.map +1 -1
  93. package/dist/core/domain/module/validation.js.map +1 -1
  94. package/dist/core/domain/module/validation.mjs.map +1 -1
  95. package/dist/core/loaders/admin.js.map +1 -1
  96. package/dist/core/loaders/admin.mjs.map +1 -1
  97. package/dist/core/loaders/apis.js.map +1 -1
  98. package/dist/core/loaders/apis.mjs.map +1 -1
  99. package/dist/core/loaders/components.js.map +1 -1
  100. package/dist/core/loaders/components.mjs.map +1 -1
  101. package/dist/core/loaders/index.js.map +1 -1
  102. package/dist/core/loaders/index.mjs.map +1 -1
  103. package/dist/core/loaders/middlewares.js.map +1 -1
  104. package/dist/core/loaders/middlewares.mjs.map +1 -1
  105. package/dist/core/loaders/plugins/get-enabled-plugins.js.map +1 -1
  106. package/dist/core/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
  107. package/dist/core/loaders/plugins/get-user-plugins-config.js.map +1 -1
  108. package/dist/core/loaders/plugins/get-user-plugins-config.mjs.map +1 -1
  109. package/dist/core/loaders/plugins/index.js.map +1 -1
  110. package/dist/core/loaders/plugins/index.mjs +1 -1
  111. package/dist/core/loaders/plugins/index.mjs.map +1 -1
  112. package/dist/core/loaders/policies.js.map +1 -1
  113. package/dist/core/loaders/policies.mjs.map +1 -1
  114. package/dist/core/loaders/sanitizers.js.map +1 -1
  115. package/dist/core/loaders/sanitizers.mjs.map +1 -1
  116. package/dist/core/loaders/src-index.js.map +1 -1
  117. package/dist/core/loaders/src-index.mjs.map +1 -1
  118. package/dist/core/loaders/validators.js.map +1 -1
  119. package/dist/core/loaders/validators.mjs.map +1 -1
  120. package/dist/core/registries/apis.js.map +1 -1
  121. package/dist/core/registries/apis.mjs.map +1 -1
  122. package/dist/core/registries/config.js.map +1 -1
  123. package/dist/core/registries/config.mjs.map +1 -1
  124. package/dist/core/registries/content-types.js.map +1 -1
  125. package/dist/core/registries/content-types.mjs +2 -2
  126. package/dist/core/registries/content-types.mjs.map +1 -1
  127. package/dist/core/registries/controllers.js.map +1 -1
  128. package/dist/core/registries/controllers.mjs +2 -2
  129. package/dist/core/registries/controllers.mjs.map +1 -1
  130. package/dist/core/registries/custom-fields.js.map +1 -1
  131. package/dist/core/registries/custom-fields.mjs.map +1 -1
  132. package/dist/core/registries/hooks.js.map +1 -1
  133. package/dist/core/registries/hooks.mjs +1 -1
  134. package/dist/core/registries/hooks.mjs.map +1 -1
  135. package/dist/core/registries/middlewares.js.map +1 -1
  136. package/dist/core/registries/middlewares.mjs +2 -2
  137. package/dist/core/registries/middlewares.mjs.map +1 -1
  138. package/dist/core/registries/modules.js.map +1 -1
  139. package/dist/core/registries/modules.mjs +1 -1
  140. package/dist/core/registries/modules.mjs.map +1 -1
  141. package/dist/core/registries/plugins.js.map +1 -1
  142. package/dist/core/registries/plugins.mjs.map +1 -1
  143. package/dist/core/registries/policies.js.map +1 -1
  144. package/dist/core/registries/policies.mjs +2 -2
  145. package/dist/core/registries/policies.mjs.map +1 -1
  146. package/dist/core/registries/sanitizers.js.map +1 -1
  147. package/dist/core/registries/sanitizers.mjs.map +1 -1
  148. package/dist/core/registries/services.js.map +1 -1
  149. package/dist/core/registries/services.mjs +2 -2
  150. package/dist/core/registries/services.mjs.map +1 -1
  151. package/dist/core/registries/validators.js.map +1 -1
  152. package/dist/core/registries/validators.mjs.map +1 -1
  153. package/dist/core/utils.js.map +1 -1
  154. package/dist/core/utils.mjs.map +1 -1
  155. package/dist/core-api/controller/collection-type.js.map +1 -1
  156. package/dist/core-api/controller/collection-type.mjs.map +1 -1
  157. package/dist/core-api/controller/index.js.map +1 -1
  158. package/dist/core-api/controller/index.mjs +1 -1
  159. package/dist/core-api/controller/index.mjs.map +1 -1
  160. package/dist/core-api/controller/single-type.js.map +1 -1
  161. package/dist/core-api/controller/single-type.mjs.map +1 -1
  162. package/dist/core-api/controller/transform.js.map +1 -1
  163. package/dist/core-api/controller/transform.mjs.map +1 -1
  164. package/dist/core-api/routes/index.js.map +1 -1
  165. package/dist/core-api/routes/index.mjs.map +1 -1
  166. package/dist/core-api/service/collection-type.js.map +1 -1
  167. package/dist/core-api/service/collection-type.mjs.map +1 -1
  168. package/dist/core-api/service/get-fetch-params.js.map +1 -1
  169. package/dist/core-api/service/get-fetch-params.mjs.map +1 -1
  170. package/dist/core-api/service/index.js.map +1 -1
  171. package/dist/core-api/service/index.mjs.map +1 -1
  172. package/dist/core-api/service/pagination.js.map +1 -1
  173. package/dist/core-api/service/pagination.mjs +1 -1
  174. package/dist/core-api/service/pagination.mjs.map +1 -1
  175. package/dist/core-api/service/single-type.js +1 -2
  176. package/dist/core-api/service/single-type.js.map +1 -1
  177. package/dist/core-api/service/single-type.mjs +2 -3
  178. package/dist/core-api/service/single-type.mjs.map +1 -1
  179. package/dist/ee/index.js.map +1 -1
  180. package/dist/ee/index.mjs +1 -1
  181. package/dist/ee/index.mjs.map +1 -1
  182. package/dist/ee/license.js.map +1 -1
  183. package/dist/ee/license.mjs.map +1 -1
  184. package/dist/factories.js +4 -4
  185. package/dist/factories.js.map +1 -1
  186. package/dist/factories.mjs.map +1 -1
  187. package/dist/load/filepath-to-prop-path.js.map +1 -1
  188. package/dist/load/load-files.js +1 -2
  189. package/dist/load/load-files.js.map +1 -1
  190. package/dist/load/load-files.mjs +1 -2
  191. package/dist/load/load-files.mjs.map +1 -1
  192. package/dist/middlewares/body.js.map +1 -1
  193. package/dist/middlewares/body.mjs.map +1 -1
  194. package/dist/middlewares/cors.js.map +1 -1
  195. package/dist/middlewares/cors.mjs.map +1 -1
  196. package/dist/middlewares/errors.js.map +1 -1
  197. package/dist/middlewares/errors.mjs.map +1 -1
  198. package/dist/middlewares/favicon.js.map +1 -1
  199. package/dist/middlewares/favicon.mjs.map +1 -1
  200. package/dist/middlewares/index.js.map +1 -1
  201. package/dist/middlewares/logger.js.map +1 -1
  202. package/dist/middlewares/logger.mjs.map +1 -1
  203. package/dist/middlewares/powered-by.js.map +1 -1
  204. package/dist/middlewares/powered-by.mjs.map +1 -1
  205. package/dist/middlewares/public/index.js +1 -2
  206. package/dist/middlewares/public/index.js.map +1 -1
  207. package/dist/middlewares/public/index.mjs +1 -2
  208. package/dist/middlewares/public/index.mjs.map +1 -1
  209. package/dist/middlewares/public/serve-static.js.map +1 -1
  210. package/dist/middlewares/public/serve-static.mjs.map +1 -1
  211. package/dist/middlewares/query.js.map +1 -1
  212. package/dist/middlewares/query.mjs.map +1 -1
  213. package/dist/middlewares/response-time.js.map +1 -1
  214. package/dist/middlewares/response-time.mjs.map +1 -1
  215. package/dist/middlewares/responses.js.map +1 -1
  216. package/dist/middlewares/responses.mjs.map +1 -1
  217. package/dist/middlewares/security.js.map +1 -1
  218. package/dist/middlewares/security.mjs.map +1 -1
  219. package/dist/middlewares/session.js.map +1 -1
  220. package/dist/middlewares/session.mjs.map +1 -1
  221. package/dist/migrations/draft-publish.js.map +1 -1
  222. package/dist/migrations/draft-publish.mjs.map +1 -1
  223. package/dist/services/auth/index.js.map +1 -1
  224. package/dist/services/auth/index.mjs.map +1 -1
  225. package/dist/services/content-api/index.js.map +1 -1
  226. package/dist/services/content-api/index.mjs.map +1 -1
  227. package/dist/services/content-api/permissions/engine.js.map +1 -1
  228. package/dist/services/content-api/permissions/engine.mjs.map +1 -1
  229. package/dist/services/content-api/permissions/index.js.map +1 -1
  230. package/dist/services/content-api/permissions/index.mjs.map +1 -1
  231. package/dist/services/content-api/permissions/providers/action.js.map +1 -1
  232. package/dist/services/content-api/permissions/providers/action.mjs.map +1 -1
  233. package/dist/services/content-api/permissions/providers/condition.js.map +1 -1
  234. package/dist/services/content-api/permissions/providers/condition.mjs.map +1 -1
  235. package/dist/services/core-store.js.map +1 -1
  236. package/dist/services/core-store.mjs.map +1 -1
  237. package/dist/services/cron.js +1 -2
  238. package/dist/services/cron.js.map +1 -1
  239. package/dist/services/cron.mjs +1 -2
  240. package/dist/services/cron.mjs.map +1 -1
  241. package/dist/services/custom-fields.js.map +1 -1
  242. package/dist/services/custom-fields.mjs.map +1 -1
  243. package/dist/services/entity-service/attributes/index.js.map +1 -1
  244. package/dist/services/entity-service/attributes/index.mjs.map +1 -1
  245. package/dist/services/entity-service/attributes/transforms.js.map +1 -1
  246. package/dist/services/entity-service/attributes/transforms.mjs.map +1 -1
  247. package/dist/services/entity-service/components.js.map +1 -1
  248. package/dist/services/entity-service/components.mjs +1 -1
  249. package/dist/services/entity-service/components.mjs.map +1 -1
  250. package/dist/services/entity-service/index.js.map +1 -1
  251. package/dist/services/entity-service/index.mjs +2 -2
  252. package/dist/services/entity-service/index.mjs.map +1 -1
  253. package/dist/services/entity-service/params.js.map +1 -1
  254. package/dist/services/entity-service/params.mjs.map +1 -1
  255. package/dist/services/entity-validator/blocks-validator.js.map +1 -1
  256. package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
  257. package/dist/services/entity-validator/index.js.map +1 -1
  258. package/dist/services/entity-validator/index.mjs +1 -1
  259. package/dist/services/entity-validator/index.mjs.map +1 -1
  260. package/dist/services/entity-validator/validators.js.map +1 -1
  261. package/dist/services/entity-validator/validators.mjs.map +1 -1
  262. package/dist/services/errors.js.map +1 -1
  263. package/dist/services/errors.mjs.map +1 -1
  264. package/dist/services/event-hub.js.map +1 -1
  265. package/dist/services/event-hub.mjs.map +1 -1
  266. package/dist/services/features.js.map +1 -1
  267. package/dist/services/features.mjs.map +1 -1
  268. package/dist/services/fs.js.map +1 -1
  269. package/dist/services/fs.mjs.map +1 -1
  270. package/dist/services/metrics/admin-user-hash.js.map +1 -1
  271. package/dist/services/metrics/admin-user-hash.mjs.map +1 -1
  272. package/dist/services/metrics/index.js +1 -2
  273. package/dist/services/metrics/index.js.map +1 -1
  274. package/dist/services/metrics/index.mjs +1 -2
  275. package/dist/services/metrics/index.mjs.map +1 -1
  276. package/dist/services/metrics/is-truthy.js.map +1 -1
  277. package/dist/services/metrics/is-truthy.mjs.map +1 -1
  278. package/dist/services/metrics/middleware.js.map +1 -1
  279. package/dist/services/metrics/middleware.mjs.map +1 -1
  280. package/dist/services/metrics/rate-limiter.js.map +1 -1
  281. package/dist/services/metrics/rate-limiter.mjs.map +1 -1
  282. package/dist/services/metrics/sender.js.map +1 -1
  283. package/dist/services/metrics/sender.mjs.map +1 -1
  284. package/dist/services/request-context.js.map +1 -1
  285. package/dist/services/request-context.mjs.map +1 -1
  286. package/dist/services/server/admin-api.js.map +1 -1
  287. package/dist/services/server/admin-api.mjs.map +1 -1
  288. package/dist/services/server/api.js.map +1 -1
  289. package/dist/services/server/api.mjs.map +1 -1
  290. package/dist/services/server/compose-endpoint.js +1 -1
  291. package/dist/services/server/compose-endpoint.js.map +1 -1
  292. package/dist/services/server/compose-endpoint.mjs +1 -1
  293. package/dist/services/server/compose-endpoint.mjs.map +1 -1
  294. package/dist/services/server/content-api.js.map +1 -1
  295. package/dist/services/server/content-api.mjs.map +1 -1
  296. package/dist/services/server/http-server.js.map +1 -1
  297. package/dist/services/server/http-server.mjs.map +1 -1
  298. package/dist/services/server/index.js.map +1 -1
  299. package/dist/services/server/index.mjs.map +1 -1
  300. package/dist/services/server/koa.js.map +1 -1
  301. package/dist/services/server/koa.mjs.map +1 -1
  302. package/dist/services/server/middleware.js.map +1 -1
  303. package/dist/services/server/middleware.mjs.map +1 -1
  304. package/dist/services/server/policy.js.map +1 -1
  305. package/dist/services/server/policy.mjs.map +1 -1
  306. package/dist/services/server/register-middlewares.js.map +1 -1
  307. package/dist/services/server/register-middlewares.mjs.map +1 -1
  308. package/dist/services/server/register-routes.js.map +1 -1
  309. package/dist/services/server/register-routes.mjs.map +1 -1
  310. package/dist/services/server/routing.js.map +1 -1
  311. package/dist/services/server/routing.mjs.map +1 -1
  312. package/dist/services/utils/dynamic-zones.js.map +1 -1
  313. package/dist/services/utils/dynamic-zones.mjs.map +1 -1
  314. package/dist/services/utils/upload-files.js +2 -4
  315. package/dist/services/utils/upload-files.js.map +1 -1
  316. package/dist/services/utils/upload-files.mjs +2 -4
  317. package/dist/services/utils/upload-files.mjs.map +1 -1
  318. package/dist/services/webhook-runner.js.map +1 -1
  319. package/dist/services/webhook-runner.mjs.map +1 -1
  320. package/dist/services/webhook-store.js.map +1 -1
  321. package/dist/services/webhook-store.mjs.map +1 -1
  322. package/dist/services/worker-queue.js.map +1 -1
  323. package/dist/services/worker-queue.mjs.map +1 -1
  324. package/dist/utils/convert-custom-field-type.js.map +1 -1
  325. package/dist/utils/convert-custom-field-type.mjs.map +1 -1
  326. package/dist/utils/cron.js.map +1 -1
  327. package/dist/utils/cron.mjs.map +1 -1
  328. package/dist/utils/fetch.js.map +1 -1
  329. package/dist/utils/fetch.mjs.map +1 -1
  330. package/dist/utils/get-dirs.js.map +1 -1
  331. package/dist/utils/get-dirs.mjs +1 -1
  332. package/dist/utils/get-dirs.mjs.map +1 -1
  333. package/dist/utils/is-initialized.js.map +1 -1
  334. package/dist/utils/is-initialized.mjs.map +1 -1
  335. package/dist/utils/machine-id.js.map +1 -1
  336. package/dist/utils/machine-id.mjs.map +1 -1
  337. package/dist/utils/open-browser.js.map +1 -1
  338. package/dist/utils/open-browser.mjs.map +1 -1
  339. package/dist/utils/signals.js.map +1 -1
  340. package/dist/utils/signals.mjs.map +1 -1
  341. package/dist/utils/startup-logger.js.map +1 -1
  342. package/dist/utils/startup-logger.mjs.map +1 -1
  343. package/dist/utils/update-notifier/index.js.map +1 -1
  344. package/dist/utils/update-notifier/index.mjs.map +1 -1
  345. package/package.json +26 -26
@@ -1 +1 @@
1
- {"version":3,"file":"register-routes.js","sources":["../../../src/services/server/register-routes.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Strapi, Common } from '@strapi/types';\n\nconst createRouteScopeGenerator = (namespace: string) => (route: Common.RouteInput) => {\n const prefix = namespace.endsWith('::') ? namespace : `${namespace}.`;\n\n if (typeof route.handler === 'string') {\n _.defaultsDeep(route, {\n config: {\n auth: {\n scope: [`${route.handler.startsWith(prefix) ? '' : prefix}${route.handler}`],\n },\n },\n });\n }\n};\n\n/**\n * Register all routes\n */\nexport default (strapi: Strapi) => {\n registerAdminRoutes(strapi);\n registerAPIRoutes(strapi);\n registerPluginRoutes(strapi);\n};\n\n/**\n * Register admin routes\n * @param {import('../../').Strapi} strapi\n */\nconst registerAdminRoutes = (strapi: Strapi) => {\n const generateRouteScope = createRouteScopeGenerator(`admin::`);\n\n _.forEach(strapi.admin?.routes, (router) => {\n router.type = router.type || 'admin';\n router.prefix = router.prefix || `/admin`;\n router.routes.forEach((route) => {\n generateRouteScope(route);\n route.info = { pluginName: 'admin' };\n });\n strapi.server.routes(router);\n });\n};\n\n/**\n * Register plugin routes\n * @param {import('../../').Strapi} strapi\n */\nconst registerPluginRoutes = (strapi: Strapi) => {\n for (const pluginName of Object.keys(strapi.plugins)) {\n const plugin = strapi.plugins[pluginName];\n\n const generateRouteScope = createRouteScopeGenerator(`plugin::${pluginName}`);\n\n if (Array.isArray(plugin.routes)) {\n plugin.routes.forEach((route) => {\n generateRouteScope(route);\n route.info = { pluginName };\n });\n\n strapi.server.routes({\n type: 'admin',\n prefix: `/${pluginName}`,\n routes: plugin.routes,\n });\n } else {\n _.forEach(plugin.routes, (router) => {\n router.type = router.type || 'admin';\n router.prefix = router.prefix || `/${pluginName}`;\n router.routes.forEach((route) => {\n generateRouteScope(route);\n route.info = { pluginName };\n });\n\n strapi.server.routes(router);\n });\n }\n }\n};\n\n/**\n * Register api routes\n */\nconst registerAPIRoutes = (strapi: Strapi) => {\n for (const apiName of Object.keys(strapi.api)) {\n const api = strapi.api[apiName];\n\n const generateRouteScope = createRouteScopeGenerator(`api::${apiName}`);\n\n _.forEach(api.routes, (router) => {\n // TODO: remove once auth setup\n // pass meta down to compose endpoint\n router.type = 'content-api';\n router.routes?.forEach((route) => {\n generateRouteScope(route);\n route.info = { apiName };\n });\n\n return strapi.server.routes(router);\n });\n }\n};\n"],"names":["_"],"mappings":";;;;AAGA,MAAM,4BAA4B,CAAC,cAAsB,CAAC,UAA6B;AACrF,QAAM,SAAS,UAAU,SAAS,IAAI,IAAI,YAAY,GAAG,SAAS;AAE9D,MAAA,OAAO,MAAM,YAAY,UAAU;AACrCA,eAAA,QAAE,aAAa,OAAO;AAAA,MACpB,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ,OAAO,CAAC,GAAG,MAAM,QAAQ,WAAW,MAAM,IAAI,KAAK,MAAM,GAAG,MAAM,OAAO,EAAE;AAAA,QAC7E;AAAA,MACF;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAKA,MAAe,oBAAA,CAAC,WAAmB;AACjC,sBAAoB,MAAM;AAC1B,oBAAkB,MAAM;AACxB,uBAAqB,MAAM;AAC7B;AAMA,MAAM,sBAAsB,CAAC,WAAmB;AACxC,QAAA,qBAAqB,0BAA0B,SAAS;AAE9DA,aAAA,QAAE,QAAQ,OAAO,OAAO,QAAQ,CAAC,WAAW;AACnC,WAAA,OAAO,OAAO,QAAQ;AACtB,WAAA,SAAS,OAAO,UAAU;AAC1B,WAAA,OAAO,QAAQ,CAAC,UAAU;AAC/B,yBAAmB,KAAK;AAClB,YAAA,OAAO,EAAE,YAAY,QAAQ;AAAA,IAAA,CACpC;AACM,WAAA,OAAO,OAAO,MAAM;AAAA,EAAA,CAC5B;AACH;AAMA,MAAM,uBAAuB,CAAC,WAAmB;AAC/C,aAAW,cAAc,OAAO,KAAK,OAAO,OAAO,GAAG;AAC9C,UAAA,SAAS,OAAO,QAAQ,UAAU;AAExC,UAAM,qBAAqB,0BAA0B,WAAW,UAAU,EAAE;AAE5E,QAAI,MAAM,QAAQ,OAAO,MAAM,GAAG;AACzB,aAAA,OAAO,QAAQ,CAAC,UAAU;AAC/B,2BAAmB,KAAK;AAClB,cAAA,OAAO,EAAE;MAAW,CAC3B;AAED,aAAO,OAAO,OAAO;AAAA,QACnB,MAAM;AAAA,QACN,QAAQ,IAAI,UAAU;AAAA,QACtB,QAAQ,OAAO;AAAA,MAAA,CAChB;AAAA,IAAA,OACI;AACLA,iBAAAA,QAAE,QAAQ,OAAO,QAAQ,CAAC,WAAW;AAC5B,eAAA,OAAO,OAAO,QAAQ;AAC7B,eAAO,SAAS,OAAO,UAAU,IAAI,UAAU;AACxC,eAAA,OAAO,QAAQ,CAAC,UAAU;AAC/B,6BAAmB,KAAK;AAClB,gBAAA,OAAO,EAAE;QAAW,CAC3B;AAEM,eAAA,OAAO,OAAO,MAAM;AAAA,MAAA,CAC5B;AAAA,IACH;AAAA,EACF;AACF;AAKA,MAAM,oBAAoB,CAAC,WAAmB;AAC5C,aAAW,WAAW,OAAO,KAAK,OAAO,GAAG,GAAG;AACvC,UAAA,MAAM,OAAO,IAAI,OAAO;AAE9B,UAAM,qBAAqB,0BAA0B,QAAQ,OAAO,EAAE;AAEtEA,eAAAA,QAAE,QAAQ,IAAI,QAAQ,CAAC,WAAW;AAGhC,aAAO,OAAO;AACP,aAAA,QAAQ,QAAQ,CAAC,UAAU;AAChC,2BAAmB,KAAK;AAClB,cAAA,OAAO,EAAE;MAAQ,CACxB;AAEM,aAAA,OAAO,OAAO,OAAO,MAAM;AAAA,IAAA,CACnC;AAAA,EACH;AACF;;"}
1
+ {"version":3,"file":"register-routes.js","sources":["../../../src/services/server/register-routes.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Strapi, Common } from '@strapi/types';\n\nconst createRouteScopeGenerator = (namespace: string) => (route: Common.RouteInput) => {\n const prefix = namespace.endsWith('::') ? namespace : `${namespace}.`;\n\n if (typeof route.handler === 'string') {\n _.defaultsDeep(route, {\n config: {\n auth: {\n scope: [`${route.handler.startsWith(prefix) ? '' : prefix}${route.handler}`],\n },\n },\n });\n }\n};\n\n/**\n * Register all routes\n */\nexport default (strapi: Strapi) => {\n registerAdminRoutes(strapi);\n registerAPIRoutes(strapi);\n registerPluginRoutes(strapi);\n};\n\n/**\n * Register admin routes\n * @param {import('../../').Strapi} strapi\n */\nconst registerAdminRoutes = (strapi: Strapi) => {\n const generateRouteScope = createRouteScopeGenerator(`admin::`);\n\n _.forEach(strapi.admin?.routes, (router) => {\n router.type = router.type || 'admin';\n router.prefix = router.prefix || `/admin`;\n router.routes.forEach((route) => {\n generateRouteScope(route);\n route.info = { pluginName: 'admin' };\n });\n strapi.server.routes(router);\n });\n};\n\n/**\n * Register plugin routes\n * @param {import('../../').Strapi} strapi\n */\nconst registerPluginRoutes = (strapi: Strapi) => {\n for (const pluginName of Object.keys(strapi.plugins)) {\n const plugin = strapi.plugins[pluginName];\n\n const generateRouteScope = createRouteScopeGenerator(`plugin::${pluginName}`);\n\n if (Array.isArray(plugin.routes)) {\n plugin.routes.forEach((route) => {\n generateRouteScope(route);\n route.info = { pluginName };\n });\n\n strapi.server.routes({\n type: 'admin',\n prefix: `/${pluginName}`,\n routes: plugin.routes,\n });\n } else {\n _.forEach(plugin.routes, (router) => {\n router.type = router.type || 'admin';\n router.prefix = router.prefix || `/${pluginName}`;\n router.routes.forEach((route) => {\n generateRouteScope(route);\n route.info = { pluginName };\n });\n\n strapi.server.routes(router);\n });\n }\n }\n};\n\n/**\n * Register api routes\n */\nconst registerAPIRoutes = (strapi: Strapi) => {\n for (const apiName of Object.keys(strapi.api)) {\n const api = strapi.api[apiName];\n\n const generateRouteScope = createRouteScopeGenerator(`api::${apiName}`);\n\n _.forEach(api.routes, (router) => {\n // TODO: remove once auth setup\n // pass meta down to compose endpoint\n router.type = 'content-api';\n router.routes?.forEach((route) => {\n generateRouteScope(route);\n route.info = { apiName };\n });\n\n return strapi.server.routes(router);\n });\n }\n};\n"],"names":["_"],"mappings":";;;;AAGA,MAAM,4BAA4B,CAAC,cAAsB,CAAC,UAA6B;AACrF,QAAM,SAAS,UAAU,SAAS,IAAI,IAAI,YAAY,GAAG,SAAS;AAElE,MAAI,OAAO,MAAM,YAAY,UAAU;AACrCA,eAAAA,QAAE,aAAa,OAAO;AAAA,MACpB,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ,OAAO,CAAC,GAAG,MAAM,QAAQ,WAAW,MAAM,IAAI,KAAK,MAAM,GAAG,MAAM,OAAO,EAAE;AAAA,QAAA;AAAA,MAC7E;AAAA,IACF,CACD;AAAA,EACH;AACF;AAKA,MAAA,oBAAe,CAAC,WAAmB;AACjC,sBAAoB,MAAM;AAC1B,oBAAkB,MAAM;AACxB,uBAAqB,MAAM;AAC7B;AAMA,MAAM,sBAAsB,CAAC,WAAmB;AAC9C,QAAM,qBAAqB,0BAA0B,SAAS;AAE9DA,aAAAA,QAAE,QAAQ,OAAO,OAAO,QAAQ,CAAC,WAAW;AAC1C,WAAO,OAAO,OAAO,QAAQ;AAC7B,WAAO,SAAS,OAAO,UAAU;AACjC,WAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,yBAAmB,KAAK;AACxB,YAAM,OAAO,EAAE,YAAY,QAAA;AAAA,IAC7B,CAAC;AACD,WAAO,OAAO,OAAO,MAAM;AAAA,EAC7B,CAAC;AACH;AAMA,MAAM,uBAAuB,CAAC,WAAmB;AAC/C,aAAW,cAAc,OAAO,KAAK,OAAO,OAAO,GAAG;AACpD,UAAM,SAAS,OAAO,QAAQ,UAAU;AAExC,UAAM,qBAAqB,0BAA0B,WAAW,UAAU,EAAE;AAE5E,QAAI,MAAM,QAAQ,OAAO,MAAM,GAAG;AAChC,aAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,2BAAmB,KAAK;AACxB,cAAM,OAAO,EAAE,WAAA;AAAA,MACjB,CAAC;AAED,aAAO,OAAO,OAAO;AAAA,QACnB,MAAM;AAAA,QACN,QAAQ,IAAI,UAAU;AAAA,QACtB,QAAQ,OAAO;AAAA,MAAA,CAChB;AAAA,IACH,OAAO;AACLA,iBAAAA,QAAE,QAAQ,OAAO,QAAQ,CAAC,WAAW;AACnC,eAAO,OAAO,OAAO,QAAQ;AAC7B,eAAO,SAAS,OAAO,UAAU,IAAI,UAAU;AAC/C,eAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,6BAAmB,KAAK;AACxB,gBAAM,OAAO,EAAE,WAAA;AAAA,QACjB,CAAC;AAED,eAAO,OAAO,OAAO,MAAM;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAKA,MAAM,oBAAoB,CAAC,WAAmB;AAC5C,aAAW,WAAW,OAAO,KAAK,OAAO,GAAG,GAAG;AAC7C,UAAM,MAAM,OAAO,IAAI,OAAO;AAE9B,UAAM,qBAAqB,0BAA0B,QAAQ,OAAO,EAAE;AAEtEA,eAAAA,QAAE,QAAQ,IAAI,QAAQ,CAAC,WAAW;AAGhC,aAAO,OAAO;AACd,aAAO,QAAQ,QAAQ,CAAC,UAAU;AAChC,2BAAmB,KAAK;AACxB,cAAM,OAAO,EAAE,QAAA;AAAA,MACjB,CAAC;AAED,aAAO,OAAO,OAAO,OAAO,MAAM;AAAA,IACpC,CAAC;AAAA,EACH;AACF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"register-routes.mjs","sources":["../../../src/services/server/register-routes.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Strapi, Common } from '@strapi/types';\n\nconst createRouteScopeGenerator = (namespace: string) => (route: Common.RouteInput) => {\n const prefix = namespace.endsWith('::') ? namespace : `${namespace}.`;\n\n if (typeof route.handler === 'string') {\n _.defaultsDeep(route, {\n config: {\n auth: {\n scope: [`${route.handler.startsWith(prefix) ? '' : prefix}${route.handler}`],\n },\n },\n });\n }\n};\n\n/**\n * Register all routes\n */\nexport default (strapi: Strapi) => {\n registerAdminRoutes(strapi);\n registerAPIRoutes(strapi);\n registerPluginRoutes(strapi);\n};\n\n/**\n * Register admin routes\n * @param {import('../../').Strapi} strapi\n */\nconst registerAdminRoutes = (strapi: Strapi) => {\n const generateRouteScope = createRouteScopeGenerator(`admin::`);\n\n _.forEach(strapi.admin?.routes, (router) => {\n router.type = router.type || 'admin';\n router.prefix = router.prefix || `/admin`;\n router.routes.forEach((route) => {\n generateRouteScope(route);\n route.info = { pluginName: 'admin' };\n });\n strapi.server.routes(router);\n });\n};\n\n/**\n * Register plugin routes\n * @param {import('../../').Strapi} strapi\n */\nconst registerPluginRoutes = (strapi: Strapi) => {\n for (const pluginName of Object.keys(strapi.plugins)) {\n const plugin = strapi.plugins[pluginName];\n\n const generateRouteScope = createRouteScopeGenerator(`plugin::${pluginName}`);\n\n if (Array.isArray(plugin.routes)) {\n plugin.routes.forEach((route) => {\n generateRouteScope(route);\n route.info = { pluginName };\n });\n\n strapi.server.routes({\n type: 'admin',\n prefix: `/${pluginName}`,\n routes: plugin.routes,\n });\n } else {\n _.forEach(plugin.routes, (router) => {\n router.type = router.type || 'admin';\n router.prefix = router.prefix || `/${pluginName}`;\n router.routes.forEach((route) => {\n generateRouteScope(route);\n route.info = { pluginName };\n });\n\n strapi.server.routes(router);\n });\n }\n }\n};\n\n/**\n * Register api routes\n */\nconst registerAPIRoutes = (strapi: Strapi) => {\n for (const apiName of Object.keys(strapi.api)) {\n const api = strapi.api[apiName];\n\n const generateRouteScope = createRouteScopeGenerator(`api::${apiName}`);\n\n _.forEach(api.routes, (router) => {\n // TODO: remove once auth setup\n // pass meta down to compose endpoint\n router.type = 'content-api';\n router.routes?.forEach((route) => {\n generateRouteScope(route);\n route.info = { apiName };\n });\n\n return strapi.server.routes(router);\n });\n }\n};\n"],"names":[],"mappings":";AAGA,MAAM,4BAA4B,CAAC,cAAsB,CAAC,UAA6B;AACrF,QAAM,SAAS,UAAU,SAAS,IAAI,IAAI,YAAY,GAAG,SAAS;AAE9D,MAAA,OAAO,MAAM,YAAY,UAAU;AACrC,MAAE,aAAa,OAAO;AAAA,MACpB,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ,OAAO,CAAC,GAAG,MAAM,QAAQ,WAAW,MAAM,IAAI,KAAK,MAAM,GAAG,MAAM,OAAO,EAAE;AAAA,QAC7E;AAAA,MACF;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAKA,MAAe,oBAAA,CAAC,WAAmB;AACjC,sBAAoB,MAAM;AAC1B,oBAAkB,MAAM;AACxB,uBAAqB,MAAM;AAC7B;AAMA,MAAM,sBAAsB,CAAC,WAAmB;AACxC,QAAA,qBAAqB,0BAA0B,SAAS;AAE9D,IAAE,QAAQ,OAAO,OAAO,QAAQ,CAAC,WAAW;AACnC,WAAA,OAAO,OAAO,QAAQ;AACtB,WAAA,SAAS,OAAO,UAAU;AAC1B,WAAA,OAAO,QAAQ,CAAC,UAAU;AAC/B,yBAAmB,KAAK;AAClB,YAAA,OAAO,EAAE,YAAY,QAAQ;AAAA,IAAA,CACpC;AACM,WAAA,OAAO,OAAO,MAAM;AAAA,EAAA,CAC5B;AACH;AAMA,MAAM,uBAAuB,CAAC,WAAmB;AAC/C,aAAW,cAAc,OAAO,KAAK,OAAO,OAAO,GAAG;AAC9C,UAAA,SAAS,OAAO,QAAQ,UAAU;AAExC,UAAM,qBAAqB,0BAA0B,WAAW,UAAU,EAAE;AAE5E,QAAI,MAAM,QAAQ,OAAO,MAAM,GAAG;AACzB,aAAA,OAAO,QAAQ,CAAC,UAAU;AAC/B,2BAAmB,KAAK;AAClB,cAAA,OAAO,EAAE;MAAW,CAC3B;AAED,aAAO,OAAO,OAAO;AAAA,QACnB,MAAM;AAAA,QACN,QAAQ,IAAI,UAAU;AAAA,QACtB,QAAQ,OAAO;AAAA,MAAA,CAChB;AAAA,IAAA,OACI;AACL,QAAE,QAAQ,OAAO,QAAQ,CAAC,WAAW;AAC5B,eAAA,OAAO,OAAO,QAAQ;AAC7B,eAAO,SAAS,OAAO,UAAU,IAAI,UAAU;AACxC,eAAA,OAAO,QAAQ,CAAC,UAAU;AAC/B,6BAAmB,KAAK;AAClB,gBAAA,OAAO,EAAE;QAAW,CAC3B;AAEM,eAAA,OAAO,OAAO,MAAM;AAAA,MAAA,CAC5B;AAAA,IACH;AAAA,EACF;AACF;AAKA,MAAM,oBAAoB,CAAC,WAAmB;AAC5C,aAAW,WAAW,OAAO,KAAK,OAAO,GAAG,GAAG;AACvC,UAAA,MAAM,OAAO,IAAI,OAAO;AAE9B,UAAM,qBAAqB,0BAA0B,QAAQ,OAAO,EAAE;AAEtE,MAAE,QAAQ,IAAI,QAAQ,CAAC,WAAW;AAGhC,aAAO,OAAO;AACP,aAAA,QAAQ,QAAQ,CAAC,UAAU;AAChC,2BAAmB,KAAK;AAClB,cAAA,OAAO,EAAE;MAAQ,CACxB;AAEM,aAAA,OAAO,OAAO,OAAO,MAAM;AAAA,IAAA,CACnC;AAAA,EACH;AACF;"}
1
+ {"version":3,"file":"register-routes.mjs","sources":["../../../src/services/server/register-routes.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Strapi, Common } from '@strapi/types';\n\nconst createRouteScopeGenerator = (namespace: string) => (route: Common.RouteInput) => {\n const prefix = namespace.endsWith('::') ? namespace : `${namespace}.`;\n\n if (typeof route.handler === 'string') {\n _.defaultsDeep(route, {\n config: {\n auth: {\n scope: [`${route.handler.startsWith(prefix) ? '' : prefix}${route.handler}`],\n },\n },\n });\n }\n};\n\n/**\n * Register all routes\n */\nexport default (strapi: Strapi) => {\n registerAdminRoutes(strapi);\n registerAPIRoutes(strapi);\n registerPluginRoutes(strapi);\n};\n\n/**\n * Register admin routes\n * @param {import('../../').Strapi} strapi\n */\nconst registerAdminRoutes = (strapi: Strapi) => {\n const generateRouteScope = createRouteScopeGenerator(`admin::`);\n\n _.forEach(strapi.admin?.routes, (router) => {\n router.type = router.type || 'admin';\n router.prefix = router.prefix || `/admin`;\n router.routes.forEach((route) => {\n generateRouteScope(route);\n route.info = { pluginName: 'admin' };\n });\n strapi.server.routes(router);\n });\n};\n\n/**\n * Register plugin routes\n * @param {import('../../').Strapi} strapi\n */\nconst registerPluginRoutes = (strapi: Strapi) => {\n for (const pluginName of Object.keys(strapi.plugins)) {\n const plugin = strapi.plugins[pluginName];\n\n const generateRouteScope = createRouteScopeGenerator(`plugin::${pluginName}`);\n\n if (Array.isArray(plugin.routes)) {\n plugin.routes.forEach((route) => {\n generateRouteScope(route);\n route.info = { pluginName };\n });\n\n strapi.server.routes({\n type: 'admin',\n prefix: `/${pluginName}`,\n routes: plugin.routes,\n });\n } else {\n _.forEach(plugin.routes, (router) => {\n router.type = router.type || 'admin';\n router.prefix = router.prefix || `/${pluginName}`;\n router.routes.forEach((route) => {\n generateRouteScope(route);\n route.info = { pluginName };\n });\n\n strapi.server.routes(router);\n });\n }\n }\n};\n\n/**\n * Register api routes\n */\nconst registerAPIRoutes = (strapi: Strapi) => {\n for (const apiName of Object.keys(strapi.api)) {\n const api = strapi.api[apiName];\n\n const generateRouteScope = createRouteScopeGenerator(`api::${apiName}`);\n\n _.forEach(api.routes, (router) => {\n // TODO: remove once auth setup\n // pass meta down to compose endpoint\n router.type = 'content-api';\n router.routes?.forEach((route) => {\n generateRouteScope(route);\n route.info = { apiName };\n });\n\n return strapi.server.routes(router);\n });\n }\n};\n"],"names":[],"mappings":";AAGA,MAAM,4BAA4B,CAAC,cAAsB,CAAC,UAA6B;AACrF,QAAM,SAAS,UAAU,SAAS,IAAI,IAAI,YAAY,GAAG,SAAS;AAElE,MAAI,OAAO,MAAM,YAAY,UAAU;AACrC,MAAE,aAAa,OAAO;AAAA,MACpB,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ,OAAO,CAAC,GAAG,MAAM,QAAQ,WAAW,MAAM,IAAI,KAAK,MAAM,GAAG,MAAM,OAAO,EAAE;AAAA,QAAA;AAAA,MAC7E;AAAA,IACF,CACD;AAAA,EACH;AACF;AAKA,MAAA,oBAAe,CAAC,WAAmB;AACjC,sBAAoB,MAAM;AAC1B,oBAAkB,MAAM;AACxB,uBAAqB,MAAM;AAC7B;AAMA,MAAM,sBAAsB,CAAC,WAAmB;AAC9C,QAAM,qBAAqB,0BAA0B,SAAS;AAE9D,IAAE,QAAQ,OAAO,OAAO,QAAQ,CAAC,WAAW;AAC1C,WAAO,OAAO,OAAO,QAAQ;AAC7B,WAAO,SAAS,OAAO,UAAU;AACjC,WAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,yBAAmB,KAAK;AACxB,YAAM,OAAO,EAAE,YAAY,QAAA;AAAA,IAC7B,CAAC;AACD,WAAO,OAAO,OAAO,MAAM;AAAA,EAC7B,CAAC;AACH;AAMA,MAAM,uBAAuB,CAAC,WAAmB;AAC/C,aAAW,cAAc,OAAO,KAAK,OAAO,OAAO,GAAG;AACpD,UAAM,SAAS,OAAO,QAAQ,UAAU;AAExC,UAAM,qBAAqB,0BAA0B,WAAW,UAAU,EAAE;AAE5E,QAAI,MAAM,QAAQ,OAAO,MAAM,GAAG;AAChC,aAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,2BAAmB,KAAK;AACxB,cAAM,OAAO,EAAE,WAAA;AAAA,MACjB,CAAC;AAED,aAAO,OAAO,OAAO;AAAA,QACnB,MAAM;AAAA,QACN,QAAQ,IAAI,UAAU;AAAA,QACtB,QAAQ,OAAO;AAAA,MAAA,CAChB;AAAA,IACH,OAAO;AACL,QAAE,QAAQ,OAAO,QAAQ,CAAC,WAAW;AACnC,eAAO,OAAO,OAAO,QAAQ;AAC7B,eAAO,SAAS,OAAO,UAAU,IAAI,UAAU;AAC/C,eAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,6BAAmB,KAAK;AACxB,gBAAM,OAAO,EAAE,WAAA;AAAA,QACjB,CAAC;AAED,eAAO,OAAO,OAAO,MAAM;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAKA,MAAM,oBAAoB,CAAC,WAAmB;AAC5C,aAAW,WAAW,OAAO,KAAK,OAAO,GAAG,GAAG;AAC7C,UAAM,MAAM,OAAO,IAAI,OAAO;AAE9B,UAAM,qBAAqB,0BAA0B,QAAQ,OAAO,EAAE;AAEtE,MAAE,QAAQ,IAAI,QAAQ,CAAC,WAAW;AAGhC,aAAO,OAAO;AACd,aAAO,QAAQ,QAAQ,CAAC,UAAU;AAChC,2BAAmB,KAAK;AACxB,cAAM,OAAO,EAAE,QAAA;AAAA,MACjB,CAAC;AAED,aAAO,OAAO,OAAO,OAAO,MAAM;AAAA,IACpC,CAAC;AAAA,EACH;AACF;"}
@@ -1 +1 @@
1
- {"version":3,"file":"routing.js","sources":["../../../src/services/server/routing.ts"],"sourcesContent":["import Router from '@koa/router';\nimport { has } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { Strapi, Common } from '@strapi/types';\n\nimport createEndpointComposer from './compose-endpoint';\n\nconst policyOrMiddlewareSchema = yup.lazy((value) => {\n if (typeof value === 'string') {\n return yup.string().required();\n }\n\n if (typeof value === 'function') {\n return yup.mixed().isFunction();\n }\n\n return yup.object({\n name: yup.string().required(),\n options: yup.object().notRequired(), // any options\n });\n});\n\nconst routeSchema = yup.object({\n method: yup.string().oneOf(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'ALL']).required(),\n path: yup.string().required(),\n handler: yup.lazy((value) => {\n if (typeof value === 'string') {\n return yup.string().required();\n }\n\n if (Array.isArray(value)) {\n return yup.array().required();\n }\n\n return yup.mixed().isFunction().required();\n }),\n config: yup\n .object({\n auth: yup.lazy((value) => {\n if (value === false) {\n return yup.boolean().required();\n }\n\n return yup.object({\n scope: yup.array().of(yup.string()).required(),\n });\n }),\n policies: yup\n .array()\n // FIXME: fixed in yup v1\n .of(policyOrMiddlewareSchema as any)\n .notRequired(),\n middlewares: yup\n .array()\n // FIXME: fixed in yup v1\n .of(policyOrMiddlewareSchema as any)\n .notRequired(),\n })\n .notRequired(),\n});\n\nconst validateRouteConfig = (routeConfig: Common.RouteInput) => {\n try {\n return routeSchema.validateSync(routeConfig, {\n strict: true,\n abortEarly: false,\n stripUnknown: true,\n });\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new Error(`Invalid route config ${error.message}`);\n }\n }\n};\n\nconst createRouteManager = (strapi: Strapi, opts: { type?: string } = {}) => {\n const { type } = opts;\n\n const composeEndpoint = createEndpointComposer(strapi);\n\n const createRoute = (route: Common.RouteInput, router: Router) => {\n validateRouteConfig(route);\n\n // NOTE: the router type is used to tag controller actions and for authentication / authorization so we need to pass this info down to the route level\n const routeWithInfo = Object.assign(route, {\n info: {\n ...(route.info ?? {}),\n type: type || 'api',\n },\n });\n\n composeEndpoint(routeWithInfo, { router });\n };\n\n const addRoutes = (routes: Common.Router | Common.RouteInput[], router: Router) => {\n if (Array.isArray(routes)) {\n routes.forEach((route) => createRoute(route, router));\n } else if (routes.routes) {\n const subRouter = new Router({ prefix: routes.prefix });\n\n routes.routes.forEach((route) => {\n const hasPrefix = has('prefix', route.config);\n createRoute(route, hasPrefix ? router : subRouter);\n });\n\n return router.use(subRouter.routes(), subRouter.allowedMethods());\n }\n };\n\n return {\n addRoutes,\n };\n};\n\nexport { validateRouteConfig, createRouteManager };\n"],"names":["yup","composeEndpoint","createEndpointComposer","Router","has"],"mappings":"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"}
1
+ {"version":3,"file":"routing.js","sources":["../../../src/services/server/routing.ts"],"sourcesContent":["import Router from '@koa/router';\nimport { has } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { Strapi, Common } from '@strapi/types';\n\nimport createEndpointComposer from './compose-endpoint';\n\nconst policyOrMiddlewareSchema = yup.lazy((value) => {\n if (typeof value === 'string') {\n return yup.string().required();\n }\n\n if (typeof value === 'function') {\n return yup.mixed().isFunction();\n }\n\n return yup.object({\n name: yup.string().required(),\n options: yup.object().notRequired(), // any options\n });\n});\n\nconst routeSchema = yup.object({\n method: yup.string().oneOf(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'ALL']).required(),\n path: yup.string().required(),\n handler: yup.lazy((value) => {\n if (typeof value === 'string') {\n return yup.string().required();\n }\n\n if (Array.isArray(value)) {\n return yup.array().required();\n }\n\n return yup.mixed().isFunction().required();\n }),\n config: yup\n .object({\n auth: yup.lazy((value) => {\n if (value === false) {\n return yup.boolean().required();\n }\n\n return yup.object({\n scope: yup.array().of(yup.string()).required(),\n });\n }),\n policies: yup\n .array()\n // FIXME: fixed in yup v1\n .of(policyOrMiddlewareSchema as any)\n .notRequired(),\n middlewares: yup\n .array()\n // FIXME: fixed in yup v1\n .of(policyOrMiddlewareSchema as any)\n .notRequired(),\n })\n .notRequired(),\n});\n\nconst validateRouteConfig = (routeConfig: Common.RouteInput) => {\n try {\n return routeSchema.validateSync(routeConfig, {\n strict: true,\n abortEarly: false,\n stripUnknown: true,\n });\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new Error(`Invalid route config ${error.message}`);\n }\n }\n};\n\nconst createRouteManager = (strapi: Strapi, opts: { type?: string } = {}) => {\n const { type } = opts;\n\n const composeEndpoint = createEndpointComposer(strapi);\n\n const createRoute = (route: Common.RouteInput, router: Router) => {\n validateRouteConfig(route);\n\n // NOTE: the router type is used to tag controller actions and for authentication / authorization so we need to pass this info down to the route level\n const routeWithInfo = Object.assign(route, {\n info: {\n ...(route.info ?? {}),\n type: type || 'api',\n },\n });\n\n composeEndpoint(routeWithInfo, { router });\n };\n\n const addRoutes = (routes: Common.Router | Common.RouteInput[], router: Router) => {\n if (Array.isArray(routes)) {\n routes.forEach((route) => createRoute(route, router));\n } else if (routes.routes) {\n const subRouter = new Router({ prefix: routes.prefix });\n\n routes.routes.forEach((route) => {\n const hasPrefix = has('prefix', route.config);\n createRoute(route, hasPrefix ? router : subRouter);\n });\n\n return router.use(subRouter.routes(), subRouter.allowedMethods());\n }\n };\n\n return {\n addRoutes,\n };\n};\n\nexport { validateRouteConfig, createRouteManager };\n"],"names":["yup","composeEndpoint","createEndpointComposer","Router","has"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"routing.mjs","sources":["../../../src/services/server/routing.ts"],"sourcesContent":["import Router from '@koa/router';\nimport { has } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { Strapi, Common } from '@strapi/types';\n\nimport createEndpointComposer from './compose-endpoint';\n\nconst policyOrMiddlewareSchema = yup.lazy((value) => {\n if (typeof value === 'string') {\n return yup.string().required();\n }\n\n if (typeof value === 'function') {\n return yup.mixed().isFunction();\n }\n\n return yup.object({\n name: yup.string().required(),\n options: yup.object().notRequired(), // any options\n });\n});\n\nconst routeSchema = yup.object({\n method: yup.string().oneOf(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'ALL']).required(),\n path: yup.string().required(),\n handler: yup.lazy((value) => {\n if (typeof value === 'string') {\n return yup.string().required();\n }\n\n if (Array.isArray(value)) {\n return yup.array().required();\n }\n\n return yup.mixed().isFunction().required();\n }),\n config: yup\n .object({\n auth: yup.lazy((value) => {\n if (value === false) {\n return yup.boolean().required();\n }\n\n return yup.object({\n scope: yup.array().of(yup.string()).required(),\n });\n }),\n policies: yup\n .array()\n // FIXME: fixed in yup v1\n .of(policyOrMiddlewareSchema as any)\n .notRequired(),\n middlewares: yup\n .array()\n // FIXME: fixed in yup v1\n .of(policyOrMiddlewareSchema as any)\n .notRequired(),\n })\n .notRequired(),\n});\n\nconst validateRouteConfig = (routeConfig: Common.RouteInput) => {\n try {\n return routeSchema.validateSync(routeConfig, {\n strict: true,\n abortEarly: false,\n stripUnknown: true,\n });\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new Error(`Invalid route config ${error.message}`);\n }\n }\n};\n\nconst createRouteManager = (strapi: Strapi, opts: { type?: string } = {}) => {\n const { type } = opts;\n\n const composeEndpoint = createEndpointComposer(strapi);\n\n const createRoute = (route: Common.RouteInput, router: Router) => {\n validateRouteConfig(route);\n\n // NOTE: the router type is used to tag controller actions and for authentication / authorization so we need to pass this info down to the route level\n const routeWithInfo = Object.assign(route, {\n info: {\n ...(route.info ?? {}),\n type: type || 'api',\n },\n });\n\n composeEndpoint(routeWithInfo, { router });\n };\n\n const addRoutes = (routes: Common.Router | Common.RouteInput[], router: Router) => {\n if (Array.isArray(routes)) {\n routes.forEach((route) => createRoute(route, router));\n } else if (routes.routes) {\n const subRouter = new Router({ prefix: routes.prefix });\n\n routes.routes.forEach((route) => {\n const hasPrefix = has('prefix', route.config);\n createRoute(route, hasPrefix ? router : subRouter);\n });\n\n return router.use(subRouter.routes(), subRouter.allowedMethods());\n }\n };\n\n return {\n addRoutes,\n };\n};\n\nexport { validateRouteConfig, createRouteManager };\n"],"names":[],"mappings":";;;;AAOA,MAAM,2BAA2B,IAAI,KAAK,CAAC,UAAU;AAC/C,MAAA,OAAO,UAAU,UAAU;AACtB,WAAA,IAAI,SAAS;EACtB;AAEI,MAAA,OAAO,UAAU,YAAY;AACxB,WAAA,IAAI,QAAQ;EACrB;AAEA,SAAO,IAAI,OAAO;AAAA,IAChB,MAAM,IAAI,OAAO,EAAE,SAAS;AAAA,IAC5B,SAAS,IAAI,OAAO,EAAE,YAAY;AAAA;AAAA,EAAA,CACnC;AACH,CAAC;AAED,MAAM,cAAc,IAAI,OAAO;AAAA,EAC7B,QAAQ,IAAI,SAAS,MAAM,CAAC,OAAO,QAAQ,OAAO,SAAS,UAAU,KAAK,CAAC,EAAE,SAAS;AAAA,EACtF,MAAM,IAAI,OAAO,EAAE,SAAS;AAAA,EAC5B,SAAS,IAAI,KAAK,CAAC,UAAU;AACvB,QAAA,OAAO,UAAU,UAAU;AACtB,aAAA,IAAI,SAAS;IACtB;AAEI,QAAA,MAAM,QAAQ,KAAK,GAAG;AACjB,aAAA,IAAI,QAAQ;IACrB;AAEA,WAAO,IAAI,MAAA,EAAQ,aAAa,SAAS;AAAA,EAAA,CAC1C;AAAA,EACD,QAAQ,IACL,OAAO;AAAA,IACN,MAAM,IAAI,KAAK,CAAC,UAAU;AACxB,UAAI,UAAU,OAAO;AACZ,eAAA,IAAI,UAAU;MACvB;AAEA,aAAO,IAAI,OAAO;AAAA,QAChB,OAAO,IAAI,QAAQ,GAAG,IAAI,OAAA,CAAQ,EAAE,SAAS;AAAA,MAAA,CAC9C;AAAA,IAAA,CACF;AAAA,IACD,UAAU,IACP,MAAA,EAEA,GAAG,wBAA+B,EAClC,YAAY;AAAA,IACf,aAAa,IACV,MAAA,EAEA,GAAG,wBAA+B,EAClC,YAAY;AAAA,EAChB,CAAA,EACA,YAAY;AACjB,CAAC;AAEK,MAAA,sBAAsB,CAAC,gBAAmC;AAC1D,MAAA;AACK,WAAA,YAAY,aAAa,aAAa;AAAA,MAC3C,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AAAA,WACM,OAAO;AACV,QAAA,iBAAiB,IAAI,iBAAiB;AACxC,YAAM,IAAI,MAAM,wBAAwB,MAAM,OAAO,EAAE;AAAA,IACzD;AAAA,EACF;AACF;AAEA,MAAM,qBAAqB,CAAC,QAAgB,OAA0B,OAAO;AACrE,QAAA,EAAE,KAAS,IAAA;AAEX,QAAA,kBAAkB,uBAAuB,MAAM;AAE/C,QAAA,cAAc,CAAC,OAA0B,WAAmB;AAChE,wBAAoB,KAAK;AAGnB,UAAA,gBAAgB,OAAO,OAAO,OAAO;AAAA,MACzC,MAAM;AAAA,QACJ,GAAI,MAAM,QAAQ,CAAC;AAAA,QACnB,MAAM,QAAQ;AAAA,MAChB;AAAA,IAAA,CACD;AAEe,oBAAA,eAAe,EAAE,OAAA,CAAQ;AAAA,EAAA;AAGrC,QAAA,YAAY,CAAC,QAA6C,WAAmB;AAC7E,QAAA,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAO,QAAQ,CAAC,UAAU,YAAY,OAAO,MAAM,CAAC;AAAA,IAAA,WAC3C,OAAO,QAAQ;AACxB,YAAM,YAAY,IAAI,OAAO,EAAE,QAAQ,OAAO,QAAQ;AAE/C,aAAA,OAAO,QAAQ,CAAC,UAAU;AAC/B,cAAM,YAAY,IAAI,UAAU,MAAM,MAAM;AAChC,oBAAA,OAAO,YAAY,SAAS,SAAS;AAAA,MAAA,CAClD;AAED,aAAO,OAAO,IAAI,UAAU,UAAU,UAAU,gBAAgB;AAAA,IAClE;AAAA,EAAA;AAGK,SAAA;AAAA,IACL;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"routing.mjs","sources":["../../../src/services/server/routing.ts"],"sourcesContent":["import Router from '@koa/router';\nimport { has } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { Strapi, Common } from '@strapi/types';\n\nimport createEndpointComposer from './compose-endpoint';\n\nconst policyOrMiddlewareSchema = yup.lazy((value) => {\n if (typeof value === 'string') {\n return yup.string().required();\n }\n\n if (typeof value === 'function') {\n return yup.mixed().isFunction();\n }\n\n return yup.object({\n name: yup.string().required(),\n options: yup.object().notRequired(), // any options\n });\n});\n\nconst routeSchema = yup.object({\n method: yup.string().oneOf(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'ALL']).required(),\n path: yup.string().required(),\n handler: yup.lazy((value) => {\n if (typeof value === 'string') {\n return yup.string().required();\n }\n\n if (Array.isArray(value)) {\n return yup.array().required();\n }\n\n return yup.mixed().isFunction().required();\n }),\n config: yup\n .object({\n auth: yup.lazy((value) => {\n if (value === false) {\n return yup.boolean().required();\n }\n\n return yup.object({\n scope: yup.array().of(yup.string()).required(),\n });\n }),\n policies: yup\n .array()\n // FIXME: fixed in yup v1\n .of(policyOrMiddlewareSchema as any)\n .notRequired(),\n middlewares: yup\n .array()\n // FIXME: fixed in yup v1\n .of(policyOrMiddlewareSchema as any)\n .notRequired(),\n })\n .notRequired(),\n});\n\nconst validateRouteConfig = (routeConfig: Common.RouteInput) => {\n try {\n return routeSchema.validateSync(routeConfig, {\n strict: true,\n abortEarly: false,\n stripUnknown: true,\n });\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n throw new Error(`Invalid route config ${error.message}`);\n }\n }\n};\n\nconst createRouteManager = (strapi: Strapi, opts: { type?: string } = {}) => {\n const { type } = opts;\n\n const composeEndpoint = createEndpointComposer(strapi);\n\n const createRoute = (route: Common.RouteInput, router: Router) => {\n validateRouteConfig(route);\n\n // NOTE: the router type is used to tag controller actions and for authentication / authorization so we need to pass this info down to the route level\n const routeWithInfo = Object.assign(route, {\n info: {\n ...(route.info ?? {}),\n type: type || 'api',\n },\n });\n\n composeEndpoint(routeWithInfo, { router });\n };\n\n const addRoutes = (routes: Common.Router | Common.RouteInput[], router: Router) => {\n if (Array.isArray(routes)) {\n routes.forEach((route) => createRoute(route, router));\n } else if (routes.routes) {\n const subRouter = new Router({ prefix: routes.prefix });\n\n routes.routes.forEach((route) => {\n const hasPrefix = has('prefix', route.config);\n createRoute(route, hasPrefix ? router : subRouter);\n });\n\n return router.use(subRouter.routes(), subRouter.allowedMethods());\n }\n };\n\n return {\n addRoutes,\n };\n};\n\nexport { validateRouteConfig, createRouteManager };\n"],"names":[],"mappings":";;;;AAOA,MAAM,2BAA2B,IAAI,KAAK,CAAC,UAAU;AACnD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB;AAEA,MAAI,OAAO,UAAU,YAAY;AAC/B,WAAO,IAAI,MAAA,EAAQ,WAAA;AAAA,EACrB;AAEA,SAAO,IAAI,OAAO;AAAA,IAChB,MAAM,IAAI,OAAA,EAAS,SAAA;AAAA,IACnB,SAAS,IAAI,OAAA,EAAS,YAAA;AAAA;AAAA,EAAY,CACnC;AACH,CAAC;AAED,MAAM,cAAc,IAAI,OAAO;AAAA,EAC7B,QAAQ,IAAI,SAAS,MAAM,CAAC,OAAO,QAAQ,OAAO,SAAS,UAAU,KAAK,CAAC,EAAE,SAAA;AAAA,EAC7E,MAAM,IAAI,OAAA,EAAS,SAAA;AAAA,EACnB,SAAS,IAAI,KAAK,CAAC,UAAU;AAC3B,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,IAAI,OAAA,EAAS,SAAA;AAAA,IACtB;AAEA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO,IAAI,MAAA,EAAQ,SAAA;AAAA,IACrB;AAEA,WAAO,IAAI,MAAA,EAAQ,WAAA,EAAa,SAAA;AAAA,EAClC,CAAC;AAAA,EACD,QAAQ,IACL,OAAO;AAAA,IACN,MAAM,IAAI,KAAK,CAAC,UAAU;AACxB,UAAI,UAAU,OAAO;AACnB,eAAO,IAAI,QAAA,EAAU,SAAA;AAAA,MACvB;AAEA,aAAO,IAAI,OAAO;AAAA,QAChB,OAAO,IAAI,MAAA,EAAQ,GAAG,IAAI,OAAA,CAAQ,EAAE,SAAA;AAAA,MAAS,CAC9C;AAAA,IACH,CAAC;AAAA,IACD,UAAU,IACP,MAAA,EAEA,GAAG,wBAA+B,EAClC,YAAA;AAAA,IACH,aAAa,IACV,MAAA,EAEA,GAAG,wBAA+B,EAClC,YAAA;AAAA,EAAY,CAChB,EACA,YAAA;AACL,CAAC;AAED,MAAM,sBAAsB,CAAC,gBAAmC;AAC9D,MAAI;AACF,WAAO,YAAY,aAAa,aAAa;AAAA,MAC3C,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AAAA,EACH,SAAS,OAAO;AACd,QAAI,iBAAiB,IAAI,iBAAiB;AACxC,YAAM,IAAI,MAAM,wBAAwB,MAAM,OAAO,EAAE;AAAA,IACzD;AAAA,EACF;AACF;AAEA,MAAM,qBAAqB,CAAC,QAAgB,OAA0B,OAAO;AAC3E,QAAM,EAAE,SAAS;AAEjB,QAAM,kBAAkB,uBAAuB,MAAM;AAErD,QAAM,cAAc,CAAC,OAA0B,WAAmB;AAChE,wBAAoB,KAAK;AAGzB,UAAM,gBAAgB,OAAO,OAAO,OAAO;AAAA,MACzC,MAAM;AAAA,QACJ,GAAI,MAAM,QAAQ,CAAA;AAAA,QAClB,MAAM,QAAQ;AAAA,MAAA;AAAA,IAChB,CACD;AAED,oBAAgB,eAAe,EAAE,QAAQ;AAAA,EAC3C;AAEA,QAAM,YAAY,CAAC,QAA6C,WAAmB;AACjF,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAO,QAAQ,CAAC,UAAU,YAAY,OAAO,MAAM,CAAC;AAAA,IACtD,WAAW,OAAO,QAAQ;AACxB,YAAM,YAAY,IAAI,OAAO,EAAE,QAAQ,OAAO,QAAQ;AAEtD,aAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,cAAM,YAAY,IAAI,UAAU,MAAM,MAAM;AAC5C,oBAAY,OAAO,YAAY,SAAS,SAAS;AAAA,MACnD,CAAC;AAED,aAAO,OAAO,IAAI,UAAU,UAAU,UAAU,gBAAgB;AAAA,IAClE;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,EAAA;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-zones.js","sources":["../../../src/services/utils/dynamic-zones.ts"],"sourcesContent":["import { map, values, sumBy, pipe, flatMap } from 'lodash/fp';\nimport { Schema } from '@strapi/types';\n\nconst getNumberOfDynamicZones = () => {\n return pipe(\n map('attributes'),\n flatMap(values),\n sumBy((item) => {\n if (item.type === 'dynamiczone') {\n return 1;\n }\n return 0;\n })\n )(strapi.contentTypes as Record<string, Schema.ContentType>);\n};\n\nexport default getNumberOfDynamicZones;\n"],"names":["pipe","map","flatMap","values","sumBy"],"mappings":";;AAGA,MAAM,0BAA0B,MAAM;AAC7B,SAAAA,GAAA;AAAA,IACLC,GAAAA,IAAI,YAAY;AAAA,IAChBC,GAAAA,QAAQC,GAAAA,MAAM;AAAA,IACdC,GAAA,MAAM,CAAC,SAAS;AACV,UAAA,KAAK,SAAS,eAAe;AACxB,eAAA;AAAA,MACT;AACO,aAAA;AAAA,IAAA,CACR;AAAA,EAAA,EACD,OAAO,YAAkD;AAC7D;;"}
1
+ {"version":3,"file":"dynamic-zones.js","sources":["../../../src/services/utils/dynamic-zones.ts"],"sourcesContent":["import { map, values, sumBy, pipe, flatMap } from 'lodash/fp';\nimport { Schema } from '@strapi/types';\n\nconst getNumberOfDynamicZones = () => {\n return pipe(\n map('attributes'),\n flatMap(values),\n sumBy((item) => {\n if (item.type === 'dynamiczone') {\n return 1;\n }\n return 0;\n })\n )(strapi.contentTypes as Record<string, Schema.ContentType>);\n};\n\nexport default getNumberOfDynamicZones;\n"],"names":["pipe","map","flatMap","values","sumBy"],"mappings":";;AAGA,MAAM,0BAA0B,MAAM;AACpC,SAAOA,GAAAA;AAAAA,IACLC,GAAAA,IAAI,YAAY;AAAA,IAChBC,GAAAA,QAAQC,GAAAA,MAAM;AAAA,IACdC,GAAAA,MAAM,CAAC,SAAS;AACd,UAAI,KAAK,SAAS,eAAe;AAC/B,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EAAA,EACD,OAAO,YAAkD;AAC7D;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-zones.mjs","sources":["../../../src/services/utils/dynamic-zones.ts"],"sourcesContent":["import { map, values, sumBy, pipe, flatMap } from 'lodash/fp';\nimport { Schema } from '@strapi/types';\n\nconst getNumberOfDynamicZones = () => {\n return pipe(\n map('attributes'),\n flatMap(values),\n sumBy((item) => {\n if (item.type === 'dynamiczone') {\n return 1;\n }\n return 0;\n })\n )(strapi.contentTypes as Record<string, Schema.ContentType>);\n};\n\nexport default getNumberOfDynamicZones;\n"],"names":[],"mappings":";AAGA,MAAM,0BAA0B,MAAM;AAC7B,SAAA;AAAA,IACL,IAAI,YAAY;AAAA,IAChB,QAAQ,MAAM;AAAA,IACd,MAAM,CAAC,SAAS;AACV,UAAA,KAAK,SAAS,eAAe;AACxB,eAAA;AAAA,MACT;AACO,aAAA;AAAA,IAAA,CACR;AAAA,EAAA,EACD,OAAO,YAAkD;AAC7D;"}
1
+ {"version":3,"file":"dynamic-zones.mjs","sources":["../../../src/services/utils/dynamic-zones.ts"],"sourcesContent":["import { map, values, sumBy, pipe, flatMap } from 'lodash/fp';\nimport { Schema } from '@strapi/types';\n\nconst getNumberOfDynamicZones = () => {\n return pipe(\n map('attributes'),\n flatMap(values),\n sumBy((item) => {\n if (item.type === 'dynamiczone') {\n return 1;\n }\n return 0;\n })\n )(strapi.contentTypes as Record<string, Schema.ContentType>);\n};\n\nexport default getNumberOfDynamicZones;\n"],"names":[],"mappings":";AAGA,MAAM,0BAA0B,MAAM;AACpC,SAAO;AAAA,IACL,IAAI,YAAY;AAAA,IAChB,QAAQ,MAAM;AAAA,IACd,MAAM,CAAC,SAAS;AACd,UAAI,KAAK,SAAS,eAAe;AAC/B,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EAAA,EACD,OAAO,YAAkD;AAC7D;"}
@@ -25,16 +25,14 @@ const uploadFile = async (uid, entity, files) => {
25
25
  if (___default.default.isFinite(___default.default.toNumber(path[i]))) {
26
26
  continue;
27
27
  }
28
- if (!attr)
29
- return {};
28
+ if (!attr) return {};
30
29
  if (attr.type === "component") {
31
30
  modelUID = attr.component;
32
31
  tmpModel = strapi.components[attr.component];
33
32
  } else if (attr.type === "dynamiczone") {
34
33
  const entryIdx = path[i + 1];
35
34
  const value = ___default.default.get(entity, [...currentPath, entryIdx]);
36
- if (!value)
37
- return {};
35
+ if (!value) return {};
38
36
  modelUID = value.__component;
39
37
  tmpModel = strapi.components[modelUID];
40
38
  } else if (attr.type === "relation") {
@@ -1 +1 @@
1
- {"version":3,"file":"upload-files.js","sources":["../../../src/services/utils/upload-files.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Attribute, Common, Schema } from '@strapi/types';\n\nexport type UploadFile = (\n uid: Common.UID.Schema,\n entity: Record<string, unknown>,\n files: Record<string, unknown>\n) => Promise<void>;\n\n/**\n * Upload files and link them to an entity\n */\nconst uploadFile: UploadFile = async (uid, entity, files) => {\n const modelDef = strapi.getModel(uid);\n\n if (!_.has(strapi.plugins, 'upload')) {\n return;\n }\n\n const uploadService = strapi.plugin('upload').service('upload');\n\n const findModelFromUploadPath = (path: string[]) => {\n if (path.length === 0) {\n return uid;\n }\n\n const currentPath = [];\n let tmpModel: Schema.ContentType | Schema.Component = modelDef;\n let modelUID = uid;\n\n for (let i = 0; i < path.length; i += 1) {\n if (!tmpModel) {\n return {};\n }\n\n const part = path[i];\n const attr: Attribute.Any = tmpModel.attributes[part];\n\n currentPath.push(part);\n\n // ignore array indexes => handled in the dynamic zone section\n if (_.isFinite(_.toNumber(path[i]))) {\n continue;\n }\n\n if (!attr) return {};\n\n if (attr.type === 'component') {\n modelUID = attr.component;\n tmpModel = strapi.components[attr.component];\n } else if (attr.type === 'dynamiczone') {\n const entryIdx = path[i + 1]; // get component index\n const value = _.get(entity, [...currentPath, entryIdx]);\n\n if (!value) return {};\n\n modelUID = value.__component; // get component type\n tmpModel = strapi.components[modelUID as Common.UID.Component];\n } else if (attr.type === 'relation') {\n if (!('target' in attr)) {\n return {};\n }\n\n modelUID = attr.target;\n tmpModel = strapi.getModel(modelUID);\n } else {\n return;\n }\n }\n\n return modelUID;\n };\n\n const doUpload = async (key: string, files: unknown) => {\n const parts = key.split('.');\n const [path, field] = [_.initial(parts), _.last(parts)];\n\n const modelUID = findModelFromUploadPath(path);\n\n if (modelUID) {\n const id = _.get(entity, path.concat('id'));\n return uploadService.uploadToEntity({ id, model: modelUID, field }, files);\n }\n };\n\n await Promise.all(Object.keys(files).map((key) => doUpload(key, files[key])));\n};\n\nexport default uploadFile;\n"],"names":["_","files"],"mappings":";;;;AAYA,MAAM,aAAyB,OAAO,KAAK,QAAQ,UAAU;AACrD,QAAA,WAAW,OAAO,SAAS,GAAG;AAEpC,MAAI,CAACA,WAAE,QAAA,IAAI,OAAO,SAAS,QAAQ,GAAG;AACpC;AAAA,EACF;AAEA,QAAM,gBAAgB,OAAO,OAAO,QAAQ,EAAE,QAAQ,QAAQ;AAExD,QAAA,0BAA0B,CAAC,SAAmB;AAC9C,QAAA,KAAK,WAAW,GAAG;AACd,aAAA;AAAA,IACT;AAEA,UAAM,cAAc,CAAA;AACpB,QAAI,WAAkD;AACtD,QAAI,WAAW;AAEf,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAI,CAAC,UAAU;AACb,eAAO;MACT;AAEM,YAAA,OAAO,KAAK,CAAC;AACb,YAAA,OAAsB,SAAS,WAAW,IAAI;AAEpD,kBAAY,KAAK,IAAI;AAGjB,UAAAA,WAAAA,QAAE,SAASA,WAAE,QAAA,SAAS,KAAK,CAAC,CAAC,CAAC,GAAG;AACnC;AAAA,MACF;AAEA,UAAI,CAAC;AAAM,eAAO;AAEd,UAAA,KAAK,SAAS,aAAa;AAC7B,mBAAW,KAAK;AACL,mBAAA,OAAO,WAAW,KAAK,SAAS;AAAA,MAAA,WAClC,KAAK,SAAS,eAAe;AAChC,cAAA,WAAW,KAAK,IAAI,CAAC;AACrB,cAAA,QAAQA,mBAAE,IAAI,QAAQ,CAAC,GAAG,aAAa,QAAQ,CAAC;AAEtD,YAAI,CAAC;AAAO,iBAAO;AAEnB,mBAAW,MAAM;AACN,mBAAA,OAAO,WAAW,QAAgC;AAAA,MAAA,WACpD,KAAK,SAAS,YAAY;AAC/B,YAAA,EAAE,YAAY,OAAO;AACvB,iBAAO;QACT;AAEA,mBAAW,KAAK;AACL,mBAAA,OAAO,SAAS,QAAQ;AAAA,MAAA,OAC9B;AACL;AAAA,MACF;AAAA,IACF;AAEO,WAAA;AAAA,EAAA;AAGH,QAAA,WAAW,OAAO,KAAaC,WAAmB;AAChD,UAAA,QAAQ,IAAI,MAAM,GAAG;AAC3B,UAAM,CAAC,MAAM,KAAK,IAAI,CAACD,WAAAA,QAAE,QAAQ,KAAK,GAAGA,WAAA,QAAE,KAAK,KAAK,CAAC;AAEhD,UAAA,WAAW,wBAAwB,IAAI;AAE7C,QAAI,UAAU;AACZ,YAAM,KAAKA,WAAE,QAAA,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC;AACnC,aAAA,cAAc,eAAe,EAAE,IAAI,OAAO,UAAU,SAASC,MAAK;AAAA,IAC3E;AAAA,EAAA;AAGF,QAAM,QAAQ,IAAI,OAAO,KAAK,KAAK,EAAE,IAAI,CAAC,QAAQ,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC;AAC9E;;"}
1
+ {"version":3,"file":"upload-files.js","sources":["../../../src/services/utils/upload-files.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Attribute, Common, Schema } from '@strapi/types';\n\nexport type UploadFile = (\n uid: Common.UID.Schema,\n entity: Record<string, unknown>,\n files: Record<string, unknown>\n) => Promise<void>;\n\n/**\n * Upload files and link them to an entity\n */\nconst uploadFile: UploadFile = async (uid, entity, files) => {\n const modelDef = strapi.getModel(uid);\n\n if (!_.has(strapi.plugins, 'upload')) {\n return;\n }\n\n const uploadService = strapi.plugin('upload').service('upload');\n\n const findModelFromUploadPath = (path: string[]) => {\n if (path.length === 0) {\n return uid;\n }\n\n const currentPath = [];\n let tmpModel: Schema.ContentType | Schema.Component = modelDef;\n let modelUID = uid;\n\n for (let i = 0; i < path.length; i += 1) {\n if (!tmpModel) {\n return {};\n }\n\n const part = path[i];\n const attr: Attribute.Any = tmpModel.attributes[part];\n\n currentPath.push(part);\n\n // ignore array indexes => handled in the dynamic zone section\n if (_.isFinite(_.toNumber(path[i]))) {\n continue;\n }\n\n if (!attr) return {};\n\n if (attr.type === 'component') {\n modelUID = attr.component;\n tmpModel = strapi.components[attr.component];\n } else if (attr.type === 'dynamiczone') {\n const entryIdx = path[i + 1]; // get component index\n const value = _.get(entity, [...currentPath, entryIdx]);\n\n if (!value) return {};\n\n modelUID = value.__component; // get component type\n tmpModel = strapi.components[modelUID as Common.UID.Component];\n } else if (attr.type === 'relation') {\n if (!('target' in attr)) {\n return {};\n }\n\n modelUID = attr.target;\n tmpModel = strapi.getModel(modelUID);\n } else {\n return;\n }\n }\n\n return modelUID;\n };\n\n const doUpload = async (key: string, files: unknown) => {\n const parts = key.split('.');\n const [path, field] = [_.initial(parts), _.last(parts)];\n\n const modelUID = findModelFromUploadPath(path);\n\n if (modelUID) {\n const id = _.get(entity, path.concat('id'));\n return uploadService.uploadToEntity({ id, model: modelUID, field }, files);\n }\n };\n\n await Promise.all(Object.keys(files).map((key) => doUpload(key, files[key])));\n};\n\nexport default uploadFile;\n"],"names":["_","files"],"mappings":";;;;AAYA,MAAM,aAAyB,OAAO,KAAK,QAAQ,UAAU;AAC3D,QAAM,WAAW,OAAO,SAAS,GAAG;AAEpC,MAAI,CAACA,WAAAA,QAAE,IAAI,OAAO,SAAS,QAAQ,GAAG;AACpC;AAAA,EACF;AAEA,QAAM,gBAAgB,OAAO,OAAO,QAAQ,EAAE,QAAQ,QAAQ;AAE9D,QAAM,0BAA0B,CAAC,SAAmB;AAClD,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,CAAA;AACpB,QAAI,WAAkD;AACtD,QAAI,WAAW;AAEf,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAI,CAAC,UAAU;AACb,eAAO,CAAA;AAAA,MACT;AAEA,YAAM,OAAO,KAAK,CAAC;AACnB,YAAM,OAAsB,SAAS,WAAW,IAAI;AAEpD,kBAAY,KAAK,IAAI;AAGrB,UAAIA,WAAAA,QAAE,SAASA,WAAAA,QAAE,SAAS,KAAK,CAAC,CAAC,CAAC,GAAG;AACnC;AAAA,MACF;AAEA,UAAI,CAAC,KAAM,QAAO,CAAA;AAElB,UAAI,KAAK,SAAS,aAAa;AAC7B,mBAAW,KAAK;AAChB,mBAAW,OAAO,WAAW,KAAK,SAAS;AAAA,MAC7C,WAAW,KAAK,SAAS,eAAe;AACtC,cAAM,WAAW,KAAK,IAAI,CAAC;AAC3B,cAAM,QAAQA,WAAAA,QAAE,IAAI,QAAQ,CAAC,GAAG,aAAa,QAAQ,CAAC;AAEtD,YAAI,CAAC,MAAO,QAAO,CAAA;AAEnB,mBAAW,MAAM;AACjB,mBAAW,OAAO,WAAW,QAAgC;AAAA,MAC/D,WAAW,KAAK,SAAS,YAAY;AACnC,YAAI,EAAE,YAAY,OAAO;AACvB,iBAAO,CAAA;AAAA,QACT;AAEA,mBAAW,KAAK;AAChB,mBAAW,OAAO,SAAS,QAAQ;AAAA,MACrC,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,OAAO,KAAaC,WAAmB;AACtD,UAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,UAAM,CAAC,MAAM,KAAK,IAAI,CAACD,WAAAA,QAAE,QAAQ,KAAK,GAAGA,WAAAA,QAAE,KAAK,KAAK,CAAC;AAEtD,UAAM,WAAW,wBAAwB,IAAI;AAE7C,QAAI,UAAU;AACZ,YAAM,KAAKA,WAAAA,QAAE,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC;AAC1C,aAAO,cAAc,eAAe,EAAE,IAAI,OAAO,UAAU,MAAA,GAASC,MAAK;AAAA,IAC3E;AAAA,EACF;AAEA,QAAM,QAAQ,IAAI,OAAO,KAAK,KAAK,EAAE,IAAI,CAAC,QAAQ,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC;AAC9E;;"}
@@ -22,16 +22,14 @@ const uploadFile = async (uid, entity, files) => {
22
22
  if (_.isFinite(_.toNumber(path[i]))) {
23
23
  continue;
24
24
  }
25
- if (!attr)
26
- return {};
25
+ if (!attr) return {};
27
26
  if (attr.type === "component") {
28
27
  modelUID = attr.component;
29
28
  tmpModel = strapi.components[attr.component];
30
29
  } else if (attr.type === "dynamiczone") {
31
30
  const entryIdx = path[i + 1];
32
31
  const value = _.get(entity, [...currentPath, entryIdx]);
33
- if (!value)
34
- return {};
32
+ if (!value) return {};
35
33
  modelUID = value.__component;
36
34
  tmpModel = strapi.components[modelUID];
37
35
  } else if (attr.type === "relation") {
@@ -1 +1 @@
1
- {"version":3,"file":"upload-files.mjs","sources":["../../../src/services/utils/upload-files.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Attribute, Common, Schema } from '@strapi/types';\n\nexport type UploadFile = (\n uid: Common.UID.Schema,\n entity: Record<string, unknown>,\n files: Record<string, unknown>\n) => Promise<void>;\n\n/**\n * Upload files and link them to an entity\n */\nconst uploadFile: UploadFile = async (uid, entity, files) => {\n const modelDef = strapi.getModel(uid);\n\n if (!_.has(strapi.plugins, 'upload')) {\n return;\n }\n\n const uploadService = strapi.plugin('upload').service('upload');\n\n const findModelFromUploadPath = (path: string[]) => {\n if (path.length === 0) {\n return uid;\n }\n\n const currentPath = [];\n let tmpModel: Schema.ContentType | Schema.Component = modelDef;\n let modelUID = uid;\n\n for (let i = 0; i < path.length; i += 1) {\n if (!tmpModel) {\n return {};\n }\n\n const part = path[i];\n const attr: Attribute.Any = tmpModel.attributes[part];\n\n currentPath.push(part);\n\n // ignore array indexes => handled in the dynamic zone section\n if (_.isFinite(_.toNumber(path[i]))) {\n continue;\n }\n\n if (!attr) return {};\n\n if (attr.type === 'component') {\n modelUID = attr.component;\n tmpModel = strapi.components[attr.component];\n } else if (attr.type === 'dynamiczone') {\n const entryIdx = path[i + 1]; // get component index\n const value = _.get(entity, [...currentPath, entryIdx]);\n\n if (!value) return {};\n\n modelUID = value.__component; // get component type\n tmpModel = strapi.components[modelUID as Common.UID.Component];\n } else if (attr.type === 'relation') {\n if (!('target' in attr)) {\n return {};\n }\n\n modelUID = attr.target;\n tmpModel = strapi.getModel(modelUID);\n } else {\n return;\n }\n }\n\n return modelUID;\n };\n\n const doUpload = async (key: string, files: unknown) => {\n const parts = key.split('.');\n const [path, field] = [_.initial(parts), _.last(parts)];\n\n const modelUID = findModelFromUploadPath(path);\n\n if (modelUID) {\n const id = _.get(entity, path.concat('id'));\n return uploadService.uploadToEntity({ id, model: modelUID, field }, files);\n }\n };\n\n await Promise.all(Object.keys(files).map((key) => doUpload(key, files[key])));\n};\n\nexport default uploadFile;\n"],"names":["files"],"mappings":";AAYA,MAAM,aAAyB,OAAO,KAAK,QAAQ,UAAU;AACrD,QAAA,WAAW,OAAO,SAAS,GAAG;AAEpC,MAAI,CAAC,EAAE,IAAI,OAAO,SAAS,QAAQ,GAAG;AACpC;AAAA,EACF;AAEA,QAAM,gBAAgB,OAAO,OAAO,QAAQ,EAAE,QAAQ,QAAQ;AAExD,QAAA,0BAA0B,CAAC,SAAmB;AAC9C,QAAA,KAAK,WAAW,GAAG;AACd,aAAA;AAAA,IACT;AAEA,UAAM,cAAc,CAAA;AACpB,QAAI,WAAkD;AACtD,QAAI,WAAW;AAEf,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAI,CAAC,UAAU;AACb,eAAO;MACT;AAEM,YAAA,OAAO,KAAK,CAAC;AACb,YAAA,OAAsB,SAAS,WAAW,IAAI;AAEpD,kBAAY,KAAK,IAAI;AAGjB,UAAA,EAAE,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC,CAAC,GAAG;AACnC;AAAA,MACF;AAEA,UAAI,CAAC;AAAM,eAAO;AAEd,UAAA,KAAK,SAAS,aAAa;AAC7B,mBAAW,KAAK;AACL,mBAAA,OAAO,WAAW,KAAK,SAAS;AAAA,MAAA,WAClC,KAAK,SAAS,eAAe;AAChC,cAAA,WAAW,KAAK,IAAI,CAAC;AACrB,cAAA,QAAQ,EAAE,IAAI,QAAQ,CAAC,GAAG,aAAa,QAAQ,CAAC;AAEtD,YAAI,CAAC;AAAO,iBAAO;AAEnB,mBAAW,MAAM;AACN,mBAAA,OAAO,WAAW,QAAgC;AAAA,MAAA,WACpD,KAAK,SAAS,YAAY;AAC/B,YAAA,EAAE,YAAY,OAAO;AACvB,iBAAO;QACT;AAEA,mBAAW,KAAK;AACL,mBAAA,OAAO,SAAS,QAAQ;AAAA,MAAA,OAC9B;AACL;AAAA,MACF;AAAA,IACF;AAEO,WAAA;AAAA,EAAA;AAGH,QAAA,WAAW,OAAO,KAAaA,WAAmB;AAChD,UAAA,QAAQ,IAAI,MAAM,GAAG;AAC3B,UAAM,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,QAAQ,KAAK,GAAG,EAAE,KAAK,KAAK,CAAC;AAEhD,UAAA,WAAW,wBAAwB,IAAI;AAE7C,QAAI,UAAU;AACZ,YAAM,KAAK,EAAE,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC;AACnC,aAAA,cAAc,eAAe,EAAE,IAAI,OAAO,UAAU,SAASA,MAAK;AAAA,IAC3E;AAAA,EAAA;AAGF,QAAM,QAAQ,IAAI,OAAO,KAAK,KAAK,EAAE,IAAI,CAAC,QAAQ,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC;AAC9E;"}
1
+ {"version":3,"file":"upload-files.mjs","sources":["../../../src/services/utils/upload-files.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Attribute, Common, Schema } from '@strapi/types';\n\nexport type UploadFile = (\n uid: Common.UID.Schema,\n entity: Record<string, unknown>,\n files: Record<string, unknown>\n) => Promise<void>;\n\n/**\n * Upload files and link them to an entity\n */\nconst uploadFile: UploadFile = async (uid, entity, files) => {\n const modelDef = strapi.getModel(uid);\n\n if (!_.has(strapi.plugins, 'upload')) {\n return;\n }\n\n const uploadService = strapi.plugin('upload').service('upload');\n\n const findModelFromUploadPath = (path: string[]) => {\n if (path.length === 0) {\n return uid;\n }\n\n const currentPath = [];\n let tmpModel: Schema.ContentType | Schema.Component = modelDef;\n let modelUID = uid;\n\n for (let i = 0; i < path.length; i += 1) {\n if (!tmpModel) {\n return {};\n }\n\n const part = path[i];\n const attr: Attribute.Any = tmpModel.attributes[part];\n\n currentPath.push(part);\n\n // ignore array indexes => handled in the dynamic zone section\n if (_.isFinite(_.toNumber(path[i]))) {\n continue;\n }\n\n if (!attr) return {};\n\n if (attr.type === 'component') {\n modelUID = attr.component;\n tmpModel = strapi.components[attr.component];\n } else if (attr.type === 'dynamiczone') {\n const entryIdx = path[i + 1]; // get component index\n const value = _.get(entity, [...currentPath, entryIdx]);\n\n if (!value) return {};\n\n modelUID = value.__component; // get component type\n tmpModel = strapi.components[modelUID as Common.UID.Component];\n } else if (attr.type === 'relation') {\n if (!('target' in attr)) {\n return {};\n }\n\n modelUID = attr.target;\n tmpModel = strapi.getModel(modelUID);\n } else {\n return;\n }\n }\n\n return modelUID;\n };\n\n const doUpload = async (key: string, files: unknown) => {\n const parts = key.split('.');\n const [path, field] = [_.initial(parts), _.last(parts)];\n\n const modelUID = findModelFromUploadPath(path);\n\n if (modelUID) {\n const id = _.get(entity, path.concat('id'));\n return uploadService.uploadToEntity({ id, model: modelUID, field }, files);\n }\n };\n\n await Promise.all(Object.keys(files).map((key) => doUpload(key, files[key])));\n};\n\nexport default uploadFile;\n"],"names":["files"],"mappings":";AAYA,MAAM,aAAyB,OAAO,KAAK,QAAQ,UAAU;AAC3D,QAAM,WAAW,OAAO,SAAS,GAAG;AAEpC,MAAI,CAAC,EAAE,IAAI,OAAO,SAAS,QAAQ,GAAG;AACpC;AAAA,EACF;AAEA,QAAM,gBAAgB,OAAO,OAAO,QAAQ,EAAE,QAAQ,QAAQ;AAE9D,QAAM,0BAA0B,CAAC,SAAmB;AAClD,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,CAAA;AACpB,QAAI,WAAkD;AACtD,QAAI,WAAW;AAEf,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAI,CAAC,UAAU;AACb,eAAO,CAAA;AAAA,MACT;AAEA,YAAM,OAAO,KAAK,CAAC;AACnB,YAAM,OAAsB,SAAS,WAAW,IAAI;AAEpD,kBAAY,KAAK,IAAI;AAGrB,UAAI,EAAE,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC,CAAC,GAAG;AACnC;AAAA,MACF;AAEA,UAAI,CAAC,KAAM,QAAO,CAAA;AAElB,UAAI,KAAK,SAAS,aAAa;AAC7B,mBAAW,KAAK;AAChB,mBAAW,OAAO,WAAW,KAAK,SAAS;AAAA,MAC7C,WAAW,KAAK,SAAS,eAAe;AACtC,cAAM,WAAW,KAAK,IAAI,CAAC;AAC3B,cAAM,QAAQ,EAAE,IAAI,QAAQ,CAAC,GAAG,aAAa,QAAQ,CAAC;AAEtD,YAAI,CAAC,MAAO,QAAO,CAAA;AAEnB,mBAAW,MAAM;AACjB,mBAAW,OAAO,WAAW,QAAgC;AAAA,MAC/D,WAAW,KAAK,SAAS,YAAY;AACnC,YAAI,EAAE,YAAY,OAAO;AACvB,iBAAO,CAAA;AAAA,QACT;AAEA,mBAAW,KAAK;AAChB,mBAAW,OAAO,SAAS,QAAQ;AAAA,MACrC,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,OAAO,KAAaA,WAAmB;AACtD,UAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,UAAM,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,QAAQ,KAAK,GAAG,EAAE,KAAK,KAAK,CAAC;AAEtD,UAAM,WAAW,wBAAwB,IAAI;AAE7C,QAAI,UAAU;AACZ,YAAM,KAAK,EAAE,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC;AAC1C,aAAO,cAAc,eAAe,EAAE,IAAI,OAAO,UAAU,MAAA,GAASA,MAAK;AAAA,IAC3E;AAAA,EACF;AAEA,QAAM,QAAQ,IAAI,OAAO,KAAK,KAAK,EAAE,IAAI,CAAC,QAAQ,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC;AAC9E;"}
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-runner.js","sources":["../../src/services/webhook-runner.ts"],"sourcesContent":["/**\n * The event hub is Strapi's event control center.\n */\n\nimport createdDebugger from 'debug';\nimport _ from 'lodash';\nimport type { Logger } from '@strapi/logger';\n\nimport WorkerQueue from './worker-queue';\nimport type { Webhook } from './webhook-store';\nimport type { EventHub } from './event-hub';\nimport type { Fetch } from '../utils/fetch';\n\ninterface Config {\n defaultHeaders: Record<string, string>;\n}\n\ninterface ConstructorParameters {\n eventHub: EventHub;\n logger: Logger;\n configuration?: Record<string, unknown>;\n fetch: Fetch;\n}\n\ninterface Event {\n event: string;\n info: Record<string, unknown>;\n}\n\ntype Listener = (info: Record<string, unknown>) => Promise<void>;\n\nconst debug = createdDebugger('strapi:webhook');\n\nconst defaultConfiguration: Config = {\n defaultHeaders: {},\n};\n\nclass WebhookRunner {\n private eventHub: EventHub;\n\n private logger: Logger;\n\n private config: Config;\n\n private webhooksMap: Map<string, Webhook[]> = new Map();\n\n private listeners: Map<string, Listener> = new Map();\n\n private queue: WorkerQueue<Event, void>;\n\n private fetch: Fetch;\n\n constructor({ eventHub, logger, configuration = {}, fetch }: ConstructorParameters) {\n debug('Initialized webhook runner');\n this.eventHub = eventHub;\n this.logger = logger;\n this.fetch = fetch;\n\n if (typeof configuration !== 'object') {\n throw new Error(\n 'Invalid configuration provided to the webhookRunner.\\nCheck your server.json -> webhooks configuration'\n );\n }\n\n this.config = _.merge(defaultConfiguration, configuration);\n\n this.queue = new WorkerQueue({ logger, concurrency: 5 });\n\n this.queue.subscribe(this.executeListener.bind(this));\n }\n\n deleteListener(event: string) {\n debug(`Deleting listener for event '${event}'`);\n\n const fn = this.listeners.get(event);\n\n if (fn !== undefined) {\n this.eventHub.off(event, fn);\n this.listeners.delete(event);\n }\n }\n\n createListener(event: string) {\n debug(`Creating listener for event '${event}'`);\n if (this.listeners.has(event)) {\n this.logger.error(\n `The webhook runner is already listening for the event '${event}'. Did you mean to call .register() ?`\n );\n }\n\n const listen = async (info: Event['info']) => {\n this.queue.enqueue({ event, info });\n };\n\n this.listeners.set(event, listen);\n this.eventHub.on(event, listen);\n }\n\n async executeListener({ event, info }: Event) {\n debug(`Executing webhook for event '${event}'`);\n const webhooks = this.webhooksMap.get(event) || [];\n const activeWebhooks = webhooks.filter((webhook) => webhook.isEnabled === true);\n\n for (const webhook of activeWebhooks) {\n await this.run(webhook, event, info).catch((error) => {\n this.logger.error('Error running webhook');\n this.logger.error(error);\n });\n }\n }\n\n run(webhook: Webhook, event: string, info = {}) {\n const { url, headers } = webhook;\n\n return this.fetch(url, {\n method: 'post',\n body: JSON.stringify({\n event,\n createdAt: new Date(),\n ...info,\n }),\n headers: {\n ...this.config.defaultHeaders,\n ...headers,\n 'X-Strapi-Event': event,\n 'Content-Type': 'application/json',\n },\n timeout: 10000,\n })\n .then(async (res) => {\n if (res.ok) {\n return {\n statusCode: res.status,\n };\n }\n\n return {\n statusCode: res.status,\n message: await res.text(),\n };\n })\n .catch((err) => {\n return {\n statusCode: 500,\n message: err.message,\n };\n });\n }\n\n add(webhook: Webhook) {\n debug(`Registering webhook '${webhook.id}'`);\n const { events } = webhook;\n\n events.forEach((event) => {\n if (this.webhooksMap.has(event)) {\n this.webhooksMap.get(event)?.push(webhook);\n } else {\n this.webhooksMap.set(event, [webhook]);\n this.createListener(event);\n }\n });\n }\n\n update(webhook: Webhook) {\n debug(`Refreshing webhook '${webhook.id}'`);\n this.remove(webhook);\n this.add(webhook);\n }\n\n remove(webhook: Webhook) {\n debug(`Unregistering webhook '${webhook.id}'`);\n\n this.webhooksMap.forEach((webhooks, event) => {\n const filteredWebhooks = webhooks.filter((value) => value.id !== webhook.id);\n\n // Cleanup hanging listeners\n if (filteredWebhooks.length === 0) {\n this.webhooksMap.delete(event);\n this.deleteListener(event);\n } else {\n this.webhooksMap.set(event, filteredWebhooks);\n }\n });\n }\n}\n\n/**\n * Expose a factory function instead of the class\n */\nexport default function createWebhookRunner(opts: ConstructorParameters): WebhookRunner {\n return new WebhookRunner(opts);\n}\n\nexport type { WebhookRunner };\n"],"names":["createdDebugger","_","WorkerQueue"],"mappings":";;;;;;;AA+BA,MAAM,QAAQA,wBAAAA,QAAgB,gBAAgB;AAE9C,MAAM,uBAA+B;AAAA,EACnC,gBAAgB,CAAC;AACnB;AAEA,MAAM,cAAc;AAAA,EACV;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA,kCAA0C;EAE1C,gCAAuC;EAEvC;AAAA,EAEA;AAAA,EAER,YAAY,EAAE,UAAU,QAAQ,gBAAgB,CAAA,GAAI,SAAgC;AAClF,UAAM,4BAA4B;AAClC,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,QAAQ;AAET,QAAA,OAAO,kBAAkB,UAAU;AACrC,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAEA,SAAK,SAASC,WAAA,QAAE,MAAM,sBAAsB,aAAa;AAEzD,SAAK,QAAQ,IAAIC,YAAY,EAAE,QAAQ,aAAa,GAAG;AAEvD,SAAK,MAAM,UAAU,KAAK,gBAAgB,KAAK,IAAI,CAAC;AAAA,EACtD;AAAA,EAEA,eAAe,OAAe;AACtB,UAAA,gCAAgC,KAAK,GAAG;AAE9C,UAAM,KAAK,KAAK,UAAU,IAAI,KAAK;AAEnC,QAAI,OAAO,QAAW;AACf,WAAA,SAAS,IAAI,OAAO,EAAE;AACtB,WAAA,UAAU,OAAO,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,eAAe,OAAe;AACtB,UAAA,gCAAgC,KAAK,GAAG;AAC9C,QAAI,KAAK,UAAU,IAAI,KAAK,GAAG;AAC7B,WAAK,OAAO;AAAA,QACV,0DAA0D,KAAK;AAAA,MAAA;AAAA,IAEnE;AAEM,UAAA,SAAS,OAAO,SAAwB;AAC5C,WAAK,MAAM,QAAQ,EAAE,OAAO,KAAM,CAAA;AAAA,IAAA;AAG/B,SAAA,UAAU,IAAI,OAAO,MAAM;AAC3B,SAAA,SAAS,GAAG,OAAO,MAAM;AAAA,EAChC;AAAA,EAEA,MAAM,gBAAgB,EAAE,OAAO,QAAe;AACtC,UAAA,gCAAgC,KAAK,GAAG;AAC9C,UAAM,WAAW,KAAK,YAAY,IAAI,KAAK,KAAK;AAChD,UAAM,iBAAiB,SAAS,OAAO,CAAC,YAAY,QAAQ,cAAc,IAAI;AAE9E,eAAW,WAAW,gBAAgB;AAC9B,YAAA,KAAK,IAAI,SAAS,OAAO,IAAI,EAAE,MAAM,CAAC,UAAU;AAC/C,aAAA,OAAO,MAAM,uBAAuB;AACpC,aAAA,OAAO,MAAM,KAAK;AAAA,MAAA,CACxB;AAAA,IACH;AAAA,EACF;AAAA,EAEA,IAAI,SAAkB,OAAe,OAAO,CAAA,GAAI;AACxC,UAAA,EAAE,KAAK,QAAY,IAAA;AAElB,WAAA,KAAK,MAAM,KAAK;AAAA,MACrB,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,+BAAe,KAAK;AAAA,QACpB,GAAG;AAAA,MAAA,CACJ;AAAA,MACD,SAAS;AAAA,QACP,GAAG,KAAK,OAAO;AAAA,QACf,GAAG;AAAA,QACH,kBAAkB;AAAA,QAClB,gBAAgB;AAAA,MAClB;AAAA,MACA,SAAS;AAAA,IAAA,CACV,EACE,KAAK,OAAO,QAAQ;AACnB,UAAI,IAAI,IAAI;AACH,eAAA;AAAA,UACL,YAAY,IAAI;AAAA,QAAA;AAAA,MAEpB;AAEO,aAAA;AAAA,QACL,YAAY,IAAI;AAAA,QAChB,SAAS,MAAM,IAAI,KAAK;AAAA,MAAA;AAAA,IAC1B,CACD,EACA,MAAM,CAAC,QAAQ;AACP,aAAA;AAAA,QACL,YAAY;AAAA,QACZ,SAAS,IAAI;AAAA,MAAA;AAAA,IACf,CACD;AAAA,EACL;AAAA,EAEA,IAAI,SAAkB;AACd,UAAA,wBAAwB,QAAQ,EAAE,GAAG;AACrC,UAAA,EAAE,OAAW,IAAA;AAEZ,WAAA,QAAQ,CAAC,UAAU;AACxB,UAAI,KAAK,YAAY,IAAI,KAAK,GAAG;AAC/B,aAAK,YAAY,IAAI,KAAK,GAAG,KAAK,OAAO;AAAA,MAAA,OACpC;AACL,aAAK,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;AACrC,aAAK,eAAe,KAAK;AAAA,MAC3B;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,OAAO,SAAkB;AACjB,UAAA,uBAAuB,QAAQ,EAAE,GAAG;AAC1C,SAAK,OAAO,OAAO;AACnB,SAAK,IAAI,OAAO;AAAA,EAClB;AAAA,EAEA,OAAO,SAAkB;AACjB,UAAA,0BAA0B,QAAQ,EAAE,GAAG;AAE7C,SAAK,YAAY,QAAQ,CAAC,UAAU,UAAU;AACtC,YAAA,mBAAmB,SAAS,OAAO,CAAC,UAAU,MAAM,OAAO,QAAQ,EAAE;AAGvE,UAAA,iBAAiB,WAAW,GAAG;AAC5B,aAAA,YAAY,OAAO,KAAK;AAC7B,aAAK,eAAe,KAAK;AAAA,MAAA,OACpB;AACA,aAAA,YAAY,IAAI,OAAO,gBAAgB;AAAA,MAC9C;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAKA,SAAwB,oBAAoB,MAA4C;AAC/E,SAAA,IAAI,cAAc,IAAI;AAC/B;;"}
1
+ {"version":3,"file":"webhook-runner.js","sources":["../../src/services/webhook-runner.ts"],"sourcesContent":["/**\n * The event hub is Strapi's event control center.\n */\n\nimport createdDebugger from 'debug';\nimport _ from 'lodash';\nimport type { Logger } from '@strapi/logger';\n\nimport WorkerQueue from './worker-queue';\nimport type { Webhook } from './webhook-store';\nimport type { EventHub } from './event-hub';\nimport type { Fetch } from '../utils/fetch';\n\ninterface Config {\n defaultHeaders: Record<string, string>;\n}\n\ninterface ConstructorParameters {\n eventHub: EventHub;\n logger: Logger;\n configuration?: Record<string, unknown>;\n fetch: Fetch;\n}\n\ninterface Event {\n event: string;\n info: Record<string, unknown>;\n}\n\ntype Listener = (info: Record<string, unknown>) => Promise<void>;\n\nconst debug = createdDebugger('strapi:webhook');\n\nconst defaultConfiguration: Config = {\n defaultHeaders: {},\n};\n\nclass WebhookRunner {\n private eventHub: EventHub;\n\n private logger: Logger;\n\n private config: Config;\n\n private webhooksMap: Map<string, Webhook[]> = new Map();\n\n private listeners: Map<string, Listener> = new Map();\n\n private queue: WorkerQueue<Event, void>;\n\n private fetch: Fetch;\n\n constructor({ eventHub, logger, configuration = {}, fetch }: ConstructorParameters) {\n debug('Initialized webhook runner');\n this.eventHub = eventHub;\n this.logger = logger;\n this.fetch = fetch;\n\n if (typeof configuration !== 'object') {\n throw new Error(\n 'Invalid configuration provided to the webhookRunner.\\nCheck your server.json -> webhooks configuration'\n );\n }\n\n this.config = _.merge(defaultConfiguration, configuration);\n\n this.queue = new WorkerQueue({ logger, concurrency: 5 });\n\n this.queue.subscribe(this.executeListener.bind(this));\n }\n\n deleteListener(event: string) {\n debug(`Deleting listener for event '${event}'`);\n\n const fn = this.listeners.get(event);\n\n if (fn !== undefined) {\n this.eventHub.off(event, fn);\n this.listeners.delete(event);\n }\n }\n\n createListener(event: string) {\n debug(`Creating listener for event '${event}'`);\n if (this.listeners.has(event)) {\n this.logger.error(\n `The webhook runner is already listening for the event '${event}'. Did you mean to call .register() ?`\n );\n }\n\n const listen = async (info: Event['info']) => {\n this.queue.enqueue({ event, info });\n };\n\n this.listeners.set(event, listen);\n this.eventHub.on(event, listen);\n }\n\n async executeListener({ event, info }: Event) {\n debug(`Executing webhook for event '${event}'`);\n const webhooks = this.webhooksMap.get(event) || [];\n const activeWebhooks = webhooks.filter((webhook) => webhook.isEnabled === true);\n\n for (const webhook of activeWebhooks) {\n await this.run(webhook, event, info).catch((error) => {\n this.logger.error('Error running webhook');\n this.logger.error(error);\n });\n }\n }\n\n run(webhook: Webhook, event: string, info = {}) {\n const { url, headers } = webhook;\n\n return this.fetch(url, {\n method: 'post',\n body: JSON.stringify({\n event,\n createdAt: new Date(),\n ...info,\n }),\n headers: {\n ...this.config.defaultHeaders,\n ...headers,\n 'X-Strapi-Event': event,\n 'Content-Type': 'application/json',\n },\n timeout: 10000,\n })\n .then(async (res) => {\n if (res.ok) {\n return {\n statusCode: res.status,\n };\n }\n\n return {\n statusCode: res.status,\n message: await res.text(),\n };\n })\n .catch((err) => {\n return {\n statusCode: 500,\n message: err.message,\n };\n });\n }\n\n add(webhook: Webhook) {\n debug(`Registering webhook '${webhook.id}'`);\n const { events } = webhook;\n\n events.forEach((event) => {\n if (this.webhooksMap.has(event)) {\n this.webhooksMap.get(event)?.push(webhook);\n } else {\n this.webhooksMap.set(event, [webhook]);\n this.createListener(event);\n }\n });\n }\n\n update(webhook: Webhook) {\n debug(`Refreshing webhook '${webhook.id}'`);\n this.remove(webhook);\n this.add(webhook);\n }\n\n remove(webhook: Webhook) {\n debug(`Unregistering webhook '${webhook.id}'`);\n\n this.webhooksMap.forEach((webhooks, event) => {\n const filteredWebhooks = webhooks.filter((value) => value.id !== webhook.id);\n\n // Cleanup hanging listeners\n if (filteredWebhooks.length === 0) {\n this.webhooksMap.delete(event);\n this.deleteListener(event);\n } else {\n this.webhooksMap.set(event, filteredWebhooks);\n }\n });\n }\n}\n\n/**\n * Expose a factory function instead of the class\n */\nexport default function createWebhookRunner(opts: ConstructorParameters): WebhookRunner {\n return new WebhookRunner(opts);\n}\n\nexport type { WebhookRunner };\n"],"names":["createdDebugger","_","WorkerQueue"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-runner.mjs","sources":["../../src/services/webhook-runner.ts"],"sourcesContent":["/**\n * The event hub is Strapi's event control center.\n */\n\nimport createdDebugger from 'debug';\nimport _ from 'lodash';\nimport type { Logger } from '@strapi/logger';\n\nimport WorkerQueue from './worker-queue';\nimport type { Webhook } from './webhook-store';\nimport type { EventHub } from './event-hub';\nimport type { Fetch } from '../utils/fetch';\n\ninterface Config {\n defaultHeaders: Record<string, string>;\n}\n\ninterface ConstructorParameters {\n eventHub: EventHub;\n logger: Logger;\n configuration?: Record<string, unknown>;\n fetch: Fetch;\n}\n\ninterface Event {\n event: string;\n info: Record<string, unknown>;\n}\n\ntype Listener = (info: Record<string, unknown>) => Promise<void>;\n\nconst debug = createdDebugger('strapi:webhook');\n\nconst defaultConfiguration: Config = {\n defaultHeaders: {},\n};\n\nclass WebhookRunner {\n private eventHub: EventHub;\n\n private logger: Logger;\n\n private config: Config;\n\n private webhooksMap: Map<string, Webhook[]> = new Map();\n\n private listeners: Map<string, Listener> = new Map();\n\n private queue: WorkerQueue<Event, void>;\n\n private fetch: Fetch;\n\n constructor({ eventHub, logger, configuration = {}, fetch }: ConstructorParameters) {\n debug('Initialized webhook runner');\n this.eventHub = eventHub;\n this.logger = logger;\n this.fetch = fetch;\n\n if (typeof configuration !== 'object') {\n throw new Error(\n 'Invalid configuration provided to the webhookRunner.\\nCheck your server.json -> webhooks configuration'\n );\n }\n\n this.config = _.merge(defaultConfiguration, configuration);\n\n this.queue = new WorkerQueue({ logger, concurrency: 5 });\n\n this.queue.subscribe(this.executeListener.bind(this));\n }\n\n deleteListener(event: string) {\n debug(`Deleting listener for event '${event}'`);\n\n const fn = this.listeners.get(event);\n\n if (fn !== undefined) {\n this.eventHub.off(event, fn);\n this.listeners.delete(event);\n }\n }\n\n createListener(event: string) {\n debug(`Creating listener for event '${event}'`);\n if (this.listeners.has(event)) {\n this.logger.error(\n `The webhook runner is already listening for the event '${event}'. Did you mean to call .register() ?`\n );\n }\n\n const listen = async (info: Event['info']) => {\n this.queue.enqueue({ event, info });\n };\n\n this.listeners.set(event, listen);\n this.eventHub.on(event, listen);\n }\n\n async executeListener({ event, info }: Event) {\n debug(`Executing webhook for event '${event}'`);\n const webhooks = this.webhooksMap.get(event) || [];\n const activeWebhooks = webhooks.filter((webhook) => webhook.isEnabled === true);\n\n for (const webhook of activeWebhooks) {\n await this.run(webhook, event, info).catch((error) => {\n this.logger.error('Error running webhook');\n this.logger.error(error);\n });\n }\n }\n\n run(webhook: Webhook, event: string, info = {}) {\n const { url, headers } = webhook;\n\n return this.fetch(url, {\n method: 'post',\n body: JSON.stringify({\n event,\n createdAt: new Date(),\n ...info,\n }),\n headers: {\n ...this.config.defaultHeaders,\n ...headers,\n 'X-Strapi-Event': event,\n 'Content-Type': 'application/json',\n },\n timeout: 10000,\n })\n .then(async (res) => {\n if (res.ok) {\n return {\n statusCode: res.status,\n };\n }\n\n return {\n statusCode: res.status,\n message: await res.text(),\n };\n })\n .catch((err) => {\n return {\n statusCode: 500,\n message: err.message,\n };\n });\n }\n\n add(webhook: Webhook) {\n debug(`Registering webhook '${webhook.id}'`);\n const { events } = webhook;\n\n events.forEach((event) => {\n if (this.webhooksMap.has(event)) {\n this.webhooksMap.get(event)?.push(webhook);\n } else {\n this.webhooksMap.set(event, [webhook]);\n this.createListener(event);\n }\n });\n }\n\n update(webhook: Webhook) {\n debug(`Refreshing webhook '${webhook.id}'`);\n this.remove(webhook);\n this.add(webhook);\n }\n\n remove(webhook: Webhook) {\n debug(`Unregistering webhook '${webhook.id}'`);\n\n this.webhooksMap.forEach((webhooks, event) => {\n const filteredWebhooks = webhooks.filter((value) => value.id !== webhook.id);\n\n // Cleanup hanging listeners\n if (filteredWebhooks.length === 0) {\n this.webhooksMap.delete(event);\n this.deleteListener(event);\n } else {\n this.webhooksMap.set(event, filteredWebhooks);\n }\n });\n }\n}\n\n/**\n * Expose a factory function instead of the class\n */\nexport default function createWebhookRunner(opts: ConstructorParameters): WebhookRunner {\n return new WebhookRunner(opts);\n}\n\nexport type { WebhookRunner };\n"],"names":["createdDebugger"],"mappings":"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"}
1
+ {"version":3,"file":"webhook-runner.mjs","sources":["../../src/services/webhook-runner.ts"],"sourcesContent":["/**\n * The event hub is Strapi's event control center.\n */\n\nimport createdDebugger from 'debug';\nimport _ from 'lodash';\nimport type { Logger } from '@strapi/logger';\n\nimport WorkerQueue from './worker-queue';\nimport type { Webhook } from './webhook-store';\nimport type { EventHub } from './event-hub';\nimport type { Fetch } from '../utils/fetch';\n\ninterface Config {\n defaultHeaders: Record<string, string>;\n}\n\ninterface ConstructorParameters {\n eventHub: EventHub;\n logger: Logger;\n configuration?: Record<string, unknown>;\n fetch: Fetch;\n}\n\ninterface Event {\n event: string;\n info: Record<string, unknown>;\n}\n\ntype Listener = (info: Record<string, unknown>) => Promise<void>;\n\nconst debug = createdDebugger('strapi:webhook');\n\nconst defaultConfiguration: Config = {\n defaultHeaders: {},\n};\n\nclass WebhookRunner {\n private eventHub: EventHub;\n\n private logger: Logger;\n\n private config: Config;\n\n private webhooksMap: Map<string, Webhook[]> = new Map();\n\n private listeners: Map<string, Listener> = new Map();\n\n private queue: WorkerQueue<Event, void>;\n\n private fetch: Fetch;\n\n constructor({ eventHub, logger, configuration = {}, fetch }: ConstructorParameters) {\n debug('Initialized webhook runner');\n this.eventHub = eventHub;\n this.logger = logger;\n this.fetch = fetch;\n\n if (typeof configuration !== 'object') {\n throw new Error(\n 'Invalid configuration provided to the webhookRunner.\\nCheck your server.json -> webhooks configuration'\n );\n }\n\n this.config = _.merge(defaultConfiguration, configuration);\n\n this.queue = new WorkerQueue({ logger, concurrency: 5 });\n\n this.queue.subscribe(this.executeListener.bind(this));\n }\n\n deleteListener(event: string) {\n debug(`Deleting listener for event '${event}'`);\n\n const fn = this.listeners.get(event);\n\n if (fn !== undefined) {\n this.eventHub.off(event, fn);\n this.listeners.delete(event);\n }\n }\n\n createListener(event: string) {\n debug(`Creating listener for event '${event}'`);\n if (this.listeners.has(event)) {\n this.logger.error(\n `The webhook runner is already listening for the event '${event}'. Did you mean to call .register() ?`\n );\n }\n\n const listen = async (info: Event['info']) => {\n this.queue.enqueue({ event, info });\n };\n\n this.listeners.set(event, listen);\n this.eventHub.on(event, listen);\n }\n\n async executeListener({ event, info }: Event) {\n debug(`Executing webhook for event '${event}'`);\n const webhooks = this.webhooksMap.get(event) || [];\n const activeWebhooks = webhooks.filter((webhook) => webhook.isEnabled === true);\n\n for (const webhook of activeWebhooks) {\n await this.run(webhook, event, info).catch((error) => {\n this.logger.error('Error running webhook');\n this.logger.error(error);\n });\n }\n }\n\n run(webhook: Webhook, event: string, info = {}) {\n const { url, headers } = webhook;\n\n return this.fetch(url, {\n method: 'post',\n body: JSON.stringify({\n event,\n createdAt: new Date(),\n ...info,\n }),\n headers: {\n ...this.config.defaultHeaders,\n ...headers,\n 'X-Strapi-Event': event,\n 'Content-Type': 'application/json',\n },\n timeout: 10000,\n })\n .then(async (res) => {\n if (res.ok) {\n return {\n statusCode: res.status,\n };\n }\n\n return {\n statusCode: res.status,\n message: await res.text(),\n };\n })\n .catch((err) => {\n return {\n statusCode: 500,\n message: err.message,\n };\n });\n }\n\n add(webhook: Webhook) {\n debug(`Registering webhook '${webhook.id}'`);\n const { events } = webhook;\n\n events.forEach((event) => {\n if (this.webhooksMap.has(event)) {\n this.webhooksMap.get(event)?.push(webhook);\n } else {\n this.webhooksMap.set(event, [webhook]);\n this.createListener(event);\n }\n });\n }\n\n update(webhook: Webhook) {\n debug(`Refreshing webhook '${webhook.id}'`);\n this.remove(webhook);\n this.add(webhook);\n }\n\n remove(webhook: Webhook) {\n debug(`Unregistering webhook '${webhook.id}'`);\n\n this.webhooksMap.forEach((webhooks, event) => {\n const filteredWebhooks = webhooks.filter((value) => value.id !== webhook.id);\n\n // Cleanup hanging listeners\n if (filteredWebhooks.length === 0) {\n this.webhooksMap.delete(event);\n this.deleteListener(event);\n } else {\n this.webhooksMap.set(event, filteredWebhooks);\n }\n });\n }\n}\n\n/**\n * Expose a factory function instead of the class\n */\nexport default function createWebhookRunner(opts: ConstructorParameters): WebhookRunner {\n return new WebhookRunner(opts);\n}\n\nexport type { WebhookRunner };\n"],"names":["createdDebugger"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-store.js","sources":["../../src/services/webhook-store.ts"],"sourcesContent":["/**\n * Webhook store is the implementation of webhook storage over the core_store\n */\n\nimport { errors } from '@strapi/utils';\nimport type { Database } from '@strapi/database';\n\nconst { ValidationError } = errors;\n\nconst webhookModel = {\n uid: 'webhook',\n collectionName: 'strapi_webhooks',\n attributes: {\n name: {\n type: 'string',\n },\n url: {\n type: 'text',\n },\n headers: {\n type: 'json',\n },\n events: {\n type: 'json',\n },\n enabled: {\n type: 'boolean',\n },\n },\n};\n\ninterface DBInput {\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n enabled: boolean;\n}\n\ninterface DBOutput {\n id: string;\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n enabled: boolean;\n}\n\nexport interface Webhook {\n id: string;\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n isEnabled: boolean;\n}\n\nconst toDBObject = (data: Webhook): DBInput => {\n return {\n name: data.name,\n url: data.url,\n headers: data.headers,\n events: data.events,\n enabled: data.isEnabled,\n };\n};\n\nconst fromDBObject = (row: DBOutput): Webhook => {\n return {\n id: row.id,\n name: row.name,\n url: row.url,\n headers: row.headers,\n events: row.events,\n isEnabled: row.enabled,\n };\n};\n\nconst webhookEventValidator = async (allowedEvents: Map<string, string>, events: string[]) => {\n const allowedValues = Array.from(allowedEvents.values());\n\n events.forEach((event) => {\n if (allowedValues.includes(event)) {\n return;\n }\n\n throw new ValidationError(`Webhook event ${event} is not supported`);\n });\n};\n\nexport interface WebhookStore {\n allowedEvents: Map<string, string>;\n addAllowedEvent(key: string, value: string): void;\n removeAllowedEvent(key: string): void;\n listAllowedEvents(): string[];\n getAllowedEvent(key: string): string | undefined;\n findWebhooks(): Promise<Webhook[]>;\n findWebhook(id: string): Promise<Webhook | null>;\n createWebhook(data: Webhook): Promise<Webhook>;\n updateWebhook(id: string, data: Webhook): Promise<Webhook | null>;\n deleteWebhook(id: string): Promise<Webhook | null>;\n}\n\nconst createWebhookStore = ({ db }: { db: Database }): WebhookStore => {\n const webhookQueries = db.query('webhook');\n\n return {\n allowedEvents: new Map([]),\n addAllowedEvent(key, value) {\n this.allowedEvents.set(key, value);\n },\n removeAllowedEvent(key) {\n this.allowedEvents.delete(key);\n },\n listAllowedEvents() {\n return Array.from(this.allowedEvents.keys());\n },\n getAllowedEvent(key) {\n return this.allowedEvents.get(key);\n },\n async findWebhooks() {\n const results = await webhookQueries.findMany();\n\n return results.map(fromDBObject);\n },\n async findWebhook(id) {\n const result = await webhookQueries.findOne({ where: { id } });\n return result ? fromDBObject(result) : null;\n },\n async createWebhook(data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n return webhookQueries\n .create({\n data: toDBObject({ ...data, isEnabled: true }),\n })\n .then(fromDBObject);\n },\n async updateWebhook(id, data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n const webhook = await webhookQueries.update({\n where: { id },\n data: toDBObject(data),\n });\n\n return webhook ? fromDBObject(webhook) : null;\n },\n async deleteWebhook(id) {\n const webhook = await webhookQueries.delete({ where: { id } });\n return webhook ? fromDBObject(webhook) : null;\n },\n };\n};\n\nexport { webhookModel, createWebhookStore };\n"],"names":["errors"],"mappings":";;;AAOA,MAAM,EAAE,gBAAoB,IAAAA;AAE5B,MAAM,eAAe;AAAA,EACnB,KAAK;AAAA,EACL,gBAAgB;AAAA,EAChB,YAAY;AAAA,IACV,MAAM;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,IACR;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,IACR;AAAA,EACF;AACF;AA4BA,MAAM,aAAa,CAAC,SAA2B;AACtC,SAAA;AAAA,IACL,MAAM,KAAK;AAAA,IACX,KAAK,KAAK;AAAA,IACV,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,EAAA;AAElB;AAEA,MAAM,eAAe,CAAC,QAA2B;AACxC,SAAA;AAAA,IACL,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,KAAK,IAAI;AAAA,IACT,SAAS,IAAI;AAAA,IACb,QAAQ,IAAI;AAAA,IACZ,WAAW,IAAI;AAAA,EAAA;AAEnB;AAEA,MAAM,wBAAwB,OAAO,eAAoC,WAAqB;AAC5F,QAAM,gBAAgB,MAAM,KAAK,cAAc,OAAQ,CAAA;AAEhD,SAAA,QAAQ,CAAC,UAAU;AACpB,QAAA,cAAc,SAAS,KAAK,GAAG;AACjC;AAAA,IACF;AAEA,UAAM,IAAI,gBAAgB,iBAAiB,KAAK,mBAAmB;AAAA,EAAA,CACpE;AACH;AAeA,MAAM,qBAAqB,CAAC,EAAE,SAAyC;AAC/D,QAAA,iBAAiB,GAAG,MAAM,SAAS;AAElC,SAAA;AAAA,IACL,eAAe,oBAAI,IAAI,EAAE;AAAA,IACzB,gBAAgB,KAAK,OAAO;AACrB,WAAA,cAAc,IAAI,KAAK,KAAK;AAAA,IACnC;AAAA,IACA,mBAAmB,KAAK;AACjB,WAAA,cAAc,OAAO,GAAG;AAAA,IAC/B;AAAA,IACA,oBAAoB;AAClB,aAAO,MAAM,KAAK,KAAK,cAAc,KAAM,CAAA;AAAA,IAC7C;AAAA,IACA,gBAAgB,KAAK;AACZ,aAAA,KAAK,cAAc,IAAI,GAAG;AAAA,IACnC;AAAA,IACA,MAAM,eAAe;AACb,YAAA,UAAU,MAAM,eAAe;AAE9B,aAAA,QAAQ,IAAI,YAAY;AAAA,IACjC;AAAA,IACA,MAAM,YAAY,IAAI;AACd,YAAA,SAAS,MAAM,eAAe,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAA,CAAG;AACtD,aAAA,SAAS,aAAa,MAAM,IAAI;AAAA,IACzC;AAAA,IACA,MAAM,cAAc,MAAM;AACxB,YAAM,sBAAsB,KAAK,eAAe,KAAK,MAAM;AAE3D,aAAO,eACJ,OAAO;AAAA,QACN,MAAM,WAAW,EAAE,GAAG,MAAM,WAAW,MAAM;AAAA,MAAA,CAC9C,EACA,KAAK,YAAY;AAAA,IACtB;AAAA,IACA,MAAM,cAAc,IAAI,MAAM;AAC5B,YAAM,sBAAsB,KAAK,eAAe,KAAK,MAAM;AAErD,YAAA,UAAU,MAAM,eAAe,OAAO;AAAA,QAC1C,OAAO,EAAE,GAAG;AAAA,QACZ,MAAM,WAAW,IAAI;AAAA,MAAA,CACtB;AAEM,aAAA,UAAU,aAAa,OAAO,IAAI;AAAA,IAC3C;AAAA,IACA,MAAM,cAAc,IAAI;AAChB,YAAA,UAAU,MAAM,eAAe,OAAO,EAAE,OAAO,EAAE,GAAG,EAAA,CAAG;AACtD,aAAA,UAAU,aAAa,OAAO,IAAI;AAAA,IAC3C;AAAA,EAAA;AAEJ;;;"}
1
+ {"version":3,"file":"webhook-store.js","sources":["../../src/services/webhook-store.ts"],"sourcesContent":["/**\n * Webhook store is the implementation of webhook storage over the core_store\n */\n\nimport { errors } from '@strapi/utils';\nimport type { Database } from '@strapi/database';\n\nconst { ValidationError } = errors;\n\nconst webhookModel = {\n uid: 'webhook',\n collectionName: 'strapi_webhooks',\n attributes: {\n name: {\n type: 'string',\n },\n url: {\n type: 'text',\n },\n headers: {\n type: 'json',\n },\n events: {\n type: 'json',\n },\n enabled: {\n type: 'boolean',\n },\n },\n};\n\ninterface DBInput {\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n enabled: boolean;\n}\n\ninterface DBOutput {\n id: string;\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n enabled: boolean;\n}\n\nexport interface Webhook {\n id: string;\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n isEnabled: boolean;\n}\n\nconst toDBObject = (data: Webhook): DBInput => {\n return {\n name: data.name,\n url: data.url,\n headers: data.headers,\n events: data.events,\n enabled: data.isEnabled,\n };\n};\n\nconst fromDBObject = (row: DBOutput): Webhook => {\n return {\n id: row.id,\n name: row.name,\n url: row.url,\n headers: row.headers,\n events: row.events,\n isEnabled: row.enabled,\n };\n};\n\nconst webhookEventValidator = async (allowedEvents: Map<string, string>, events: string[]) => {\n const allowedValues = Array.from(allowedEvents.values());\n\n events.forEach((event) => {\n if (allowedValues.includes(event)) {\n return;\n }\n\n throw new ValidationError(`Webhook event ${event} is not supported`);\n });\n};\n\nexport interface WebhookStore {\n allowedEvents: Map<string, string>;\n addAllowedEvent(key: string, value: string): void;\n removeAllowedEvent(key: string): void;\n listAllowedEvents(): string[];\n getAllowedEvent(key: string): string | undefined;\n findWebhooks(): Promise<Webhook[]>;\n findWebhook(id: string): Promise<Webhook | null>;\n createWebhook(data: Webhook): Promise<Webhook>;\n updateWebhook(id: string, data: Webhook): Promise<Webhook | null>;\n deleteWebhook(id: string): Promise<Webhook | null>;\n}\n\nconst createWebhookStore = ({ db }: { db: Database }): WebhookStore => {\n const webhookQueries = db.query('webhook');\n\n return {\n allowedEvents: new Map([]),\n addAllowedEvent(key, value) {\n this.allowedEvents.set(key, value);\n },\n removeAllowedEvent(key) {\n this.allowedEvents.delete(key);\n },\n listAllowedEvents() {\n return Array.from(this.allowedEvents.keys());\n },\n getAllowedEvent(key) {\n return this.allowedEvents.get(key);\n },\n async findWebhooks() {\n const results = await webhookQueries.findMany();\n\n return results.map(fromDBObject);\n },\n async findWebhook(id) {\n const result = await webhookQueries.findOne({ where: { id } });\n return result ? fromDBObject(result) : null;\n },\n async createWebhook(data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n return webhookQueries\n .create({\n data: toDBObject({ ...data, isEnabled: true }),\n })\n .then(fromDBObject);\n },\n async updateWebhook(id, data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n const webhook = await webhookQueries.update({\n where: { id },\n data: toDBObject(data),\n });\n\n return webhook ? fromDBObject(webhook) : null;\n },\n async deleteWebhook(id) {\n const webhook = await webhookQueries.delete({ where: { id } });\n return webhook ? fromDBObject(webhook) : null;\n },\n };\n};\n\nexport { webhookModel, createWebhookStore };\n"],"names":["errors"],"mappings":";;;AAOA,MAAM,EAAE,oBAAoBA,YAAAA;AAE5B,MAAM,eAAe;AAAA,EACnB,KAAK;AAAA,EACL,gBAAgB;AAAA,EAChB,YAAY;AAAA,IACV,MAAM;AAAA,MACJ,MAAM;AAAA,IAAA;AAAA,IAER,KAAK;AAAA,MACH,MAAM;AAAA,IAAA;AAAA,IAER,SAAS;AAAA,MACP,MAAM;AAAA,IAAA;AAAA,IAER,QAAQ;AAAA,MACN,MAAM;AAAA,IAAA;AAAA,IAER,SAAS;AAAA,MACP,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ;AA4BA,MAAM,aAAa,CAAC,SAA2B;AAC7C,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,KAAK,KAAK;AAAA,IACV,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,EAAA;AAElB;AAEA,MAAM,eAAe,CAAC,QAA2B;AAC/C,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,KAAK,IAAI;AAAA,IACT,SAAS,IAAI;AAAA,IACb,QAAQ,IAAI;AAAA,IACZ,WAAW,IAAI;AAAA,EAAA;AAEnB;AAEA,MAAM,wBAAwB,OAAO,eAAoC,WAAqB;AAC5F,QAAM,gBAAgB,MAAM,KAAK,cAAc,QAAQ;AAEvD,SAAO,QAAQ,CAAC,UAAU;AACxB,QAAI,cAAc,SAAS,KAAK,GAAG;AACjC;AAAA,IACF;AAEA,UAAM,IAAI,gBAAgB,iBAAiB,KAAK,mBAAmB;AAAA,EACrE,CAAC;AACH;AAeA,MAAM,qBAAqB,CAAC,EAAE,SAAyC;AACrE,QAAM,iBAAiB,GAAG,MAAM,SAAS;AAEzC,SAAO;AAAA,IACL,eAAe,oBAAI,IAAI,EAAE;AAAA,IACzB,gBAAgB,KAAK,OAAO;AAC1B,WAAK,cAAc,IAAI,KAAK,KAAK;AAAA,IACnC;AAAA,IACA,mBAAmB,KAAK;AACtB,WAAK,cAAc,OAAO,GAAG;AAAA,IAC/B;AAAA,IACA,oBAAoB;AAClB,aAAO,MAAM,KAAK,KAAK,cAAc,MAAM;AAAA,IAC7C;AAAA,IACA,gBAAgB,KAAK;AACnB,aAAO,KAAK,cAAc,IAAI,GAAG;AAAA,IACnC;AAAA,IACA,MAAM,eAAe;AACnB,YAAM,UAAU,MAAM,eAAe,SAAA;AAErC,aAAO,QAAQ,IAAI,YAAY;AAAA,IACjC;AAAA,IACA,MAAM,YAAY,IAAI;AACpB,YAAM,SAAS,MAAM,eAAe,QAAQ,EAAE,OAAO,EAAE,GAAA,GAAM;AAC7D,aAAO,SAAS,aAAa,MAAM,IAAI;AAAA,IACzC;AAAA,IACA,MAAM,cAAc,MAAM;AACxB,YAAM,sBAAsB,KAAK,eAAe,KAAK,MAAM;AAE3D,aAAO,eACJ,OAAO;AAAA,QACN,MAAM,WAAW,EAAE,GAAG,MAAM,WAAW,MAAM;AAAA,MAAA,CAC9C,EACA,KAAK,YAAY;AAAA,IACtB;AAAA,IACA,MAAM,cAAc,IAAI,MAAM;AAC5B,YAAM,sBAAsB,KAAK,eAAe,KAAK,MAAM;AAE3D,YAAM,UAAU,MAAM,eAAe,OAAO;AAAA,QAC1C,OAAO,EAAE,GAAA;AAAA,QACT,MAAM,WAAW,IAAI;AAAA,MAAA,CACtB;AAED,aAAO,UAAU,aAAa,OAAO,IAAI;AAAA,IAC3C;AAAA,IACA,MAAM,cAAc,IAAI;AACtB,YAAM,UAAU,MAAM,eAAe,OAAO,EAAE,OAAO,EAAE,GAAA,GAAM;AAC7D,aAAO,UAAU,aAAa,OAAO,IAAI;AAAA,IAC3C;AAAA,EAAA;AAEJ;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-store.mjs","sources":["../../src/services/webhook-store.ts"],"sourcesContent":["/**\n * Webhook store is the implementation of webhook storage over the core_store\n */\n\nimport { errors } from '@strapi/utils';\nimport type { Database } from '@strapi/database';\n\nconst { ValidationError } = errors;\n\nconst webhookModel = {\n uid: 'webhook',\n collectionName: 'strapi_webhooks',\n attributes: {\n name: {\n type: 'string',\n },\n url: {\n type: 'text',\n },\n headers: {\n type: 'json',\n },\n events: {\n type: 'json',\n },\n enabled: {\n type: 'boolean',\n },\n },\n};\n\ninterface DBInput {\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n enabled: boolean;\n}\n\ninterface DBOutput {\n id: string;\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n enabled: boolean;\n}\n\nexport interface Webhook {\n id: string;\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n isEnabled: boolean;\n}\n\nconst toDBObject = (data: Webhook): DBInput => {\n return {\n name: data.name,\n url: data.url,\n headers: data.headers,\n events: data.events,\n enabled: data.isEnabled,\n };\n};\n\nconst fromDBObject = (row: DBOutput): Webhook => {\n return {\n id: row.id,\n name: row.name,\n url: row.url,\n headers: row.headers,\n events: row.events,\n isEnabled: row.enabled,\n };\n};\n\nconst webhookEventValidator = async (allowedEvents: Map<string, string>, events: string[]) => {\n const allowedValues = Array.from(allowedEvents.values());\n\n events.forEach((event) => {\n if (allowedValues.includes(event)) {\n return;\n }\n\n throw new ValidationError(`Webhook event ${event} is not supported`);\n });\n};\n\nexport interface WebhookStore {\n allowedEvents: Map<string, string>;\n addAllowedEvent(key: string, value: string): void;\n removeAllowedEvent(key: string): void;\n listAllowedEvents(): string[];\n getAllowedEvent(key: string): string | undefined;\n findWebhooks(): Promise<Webhook[]>;\n findWebhook(id: string): Promise<Webhook | null>;\n createWebhook(data: Webhook): Promise<Webhook>;\n updateWebhook(id: string, data: Webhook): Promise<Webhook | null>;\n deleteWebhook(id: string): Promise<Webhook | null>;\n}\n\nconst createWebhookStore = ({ db }: { db: Database }): WebhookStore => {\n const webhookQueries = db.query('webhook');\n\n return {\n allowedEvents: new Map([]),\n addAllowedEvent(key, value) {\n this.allowedEvents.set(key, value);\n },\n removeAllowedEvent(key) {\n this.allowedEvents.delete(key);\n },\n listAllowedEvents() {\n return Array.from(this.allowedEvents.keys());\n },\n getAllowedEvent(key) {\n return this.allowedEvents.get(key);\n },\n async findWebhooks() {\n const results = await webhookQueries.findMany();\n\n return results.map(fromDBObject);\n },\n async findWebhook(id) {\n const result = await webhookQueries.findOne({ where: { id } });\n return result ? fromDBObject(result) : null;\n },\n async createWebhook(data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n return webhookQueries\n .create({\n data: toDBObject({ ...data, isEnabled: true }),\n })\n .then(fromDBObject);\n },\n async updateWebhook(id, data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n const webhook = await webhookQueries.update({\n where: { id },\n data: toDBObject(data),\n });\n\n return webhook ? fromDBObject(webhook) : null;\n },\n async deleteWebhook(id) {\n const webhook = await webhookQueries.delete({ where: { id } });\n return webhook ? fromDBObject(webhook) : null;\n },\n };\n};\n\nexport { webhookModel, createWebhookStore };\n"],"names":[],"mappings":";AAOA,MAAM,EAAE,gBAAoB,IAAA;AAE5B,MAAM,eAAe;AAAA,EACnB,KAAK;AAAA,EACL,gBAAgB;AAAA,EAChB,YAAY;AAAA,IACV,MAAM;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,IACR;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,IACR;AAAA,EACF;AACF;AA4BA,MAAM,aAAa,CAAC,SAA2B;AACtC,SAAA;AAAA,IACL,MAAM,KAAK;AAAA,IACX,KAAK,KAAK;AAAA,IACV,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,EAAA;AAElB;AAEA,MAAM,eAAe,CAAC,QAA2B;AACxC,SAAA;AAAA,IACL,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,KAAK,IAAI;AAAA,IACT,SAAS,IAAI;AAAA,IACb,QAAQ,IAAI;AAAA,IACZ,WAAW,IAAI;AAAA,EAAA;AAEnB;AAEA,MAAM,wBAAwB,OAAO,eAAoC,WAAqB;AAC5F,QAAM,gBAAgB,MAAM,KAAK,cAAc,OAAQ,CAAA;AAEhD,SAAA,QAAQ,CAAC,UAAU;AACpB,QAAA,cAAc,SAAS,KAAK,GAAG;AACjC;AAAA,IACF;AAEA,UAAM,IAAI,gBAAgB,iBAAiB,KAAK,mBAAmB;AAAA,EAAA,CACpE;AACH;AAeA,MAAM,qBAAqB,CAAC,EAAE,SAAyC;AAC/D,QAAA,iBAAiB,GAAG,MAAM,SAAS;AAElC,SAAA;AAAA,IACL,eAAe,oBAAI,IAAI,EAAE;AAAA,IACzB,gBAAgB,KAAK,OAAO;AACrB,WAAA,cAAc,IAAI,KAAK,KAAK;AAAA,IACnC;AAAA,IACA,mBAAmB,KAAK;AACjB,WAAA,cAAc,OAAO,GAAG;AAAA,IAC/B;AAAA,IACA,oBAAoB;AAClB,aAAO,MAAM,KAAK,KAAK,cAAc,KAAM,CAAA;AAAA,IAC7C;AAAA,IACA,gBAAgB,KAAK;AACZ,aAAA,KAAK,cAAc,IAAI,GAAG;AAAA,IACnC;AAAA,IACA,MAAM,eAAe;AACb,YAAA,UAAU,MAAM,eAAe;AAE9B,aAAA,QAAQ,IAAI,YAAY;AAAA,IACjC;AAAA,IACA,MAAM,YAAY,IAAI;AACd,YAAA,SAAS,MAAM,eAAe,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAA,CAAG;AACtD,aAAA,SAAS,aAAa,MAAM,IAAI;AAAA,IACzC;AAAA,IACA,MAAM,cAAc,MAAM;AACxB,YAAM,sBAAsB,KAAK,eAAe,KAAK,MAAM;AAE3D,aAAO,eACJ,OAAO;AAAA,QACN,MAAM,WAAW,EAAE,GAAG,MAAM,WAAW,MAAM;AAAA,MAAA,CAC9C,EACA,KAAK,YAAY;AAAA,IACtB;AAAA,IACA,MAAM,cAAc,IAAI,MAAM;AAC5B,YAAM,sBAAsB,KAAK,eAAe,KAAK,MAAM;AAErD,YAAA,UAAU,MAAM,eAAe,OAAO;AAAA,QAC1C,OAAO,EAAE,GAAG;AAAA,QACZ,MAAM,WAAW,IAAI;AAAA,MAAA,CACtB;AAEM,aAAA,UAAU,aAAa,OAAO,IAAI;AAAA,IAC3C;AAAA,IACA,MAAM,cAAc,IAAI;AAChB,YAAA,UAAU,MAAM,eAAe,OAAO,EAAE,OAAO,EAAE,GAAG,EAAA,CAAG;AACtD,aAAA,UAAU,aAAa,OAAO,IAAI;AAAA,IAC3C;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"webhook-store.mjs","sources":["../../src/services/webhook-store.ts"],"sourcesContent":["/**\n * Webhook store is the implementation of webhook storage over the core_store\n */\n\nimport { errors } from '@strapi/utils';\nimport type { Database } from '@strapi/database';\n\nconst { ValidationError } = errors;\n\nconst webhookModel = {\n uid: 'webhook',\n collectionName: 'strapi_webhooks',\n attributes: {\n name: {\n type: 'string',\n },\n url: {\n type: 'text',\n },\n headers: {\n type: 'json',\n },\n events: {\n type: 'json',\n },\n enabled: {\n type: 'boolean',\n },\n },\n};\n\ninterface DBInput {\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n enabled: boolean;\n}\n\ninterface DBOutput {\n id: string;\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n enabled: boolean;\n}\n\nexport interface Webhook {\n id: string;\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n isEnabled: boolean;\n}\n\nconst toDBObject = (data: Webhook): DBInput => {\n return {\n name: data.name,\n url: data.url,\n headers: data.headers,\n events: data.events,\n enabled: data.isEnabled,\n };\n};\n\nconst fromDBObject = (row: DBOutput): Webhook => {\n return {\n id: row.id,\n name: row.name,\n url: row.url,\n headers: row.headers,\n events: row.events,\n isEnabled: row.enabled,\n };\n};\n\nconst webhookEventValidator = async (allowedEvents: Map<string, string>, events: string[]) => {\n const allowedValues = Array.from(allowedEvents.values());\n\n events.forEach((event) => {\n if (allowedValues.includes(event)) {\n return;\n }\n\n throw new ValidationError(`Webhook event ${event} is not supported`);\n });\n};\n\nexport interface WebhookStore {\n allowedEvents: Map<string, string>;\n addAllowedEvent(key: string, value: string): void;\n removeAllowedEvent(key: string): void;\n listAllowedEvents(): string[];\n getAllowedEvent(key: string): string | undefined;\n findWebhooks(): Promise<Webhook[]>;\n findWebhook(id: string): Promise<Webhook | null>;\n createWebhook(data: Webhook): Promise<Webhook>;\n updateWebhook(id: string, data: Webhook): Promise<Webhook | null>;\n deleteWebhook(id: string): Promise<Webhook | null>;\n}\n\nconst createWebhookStore = ({ db }: { db: Database }): WebhookStore => {\n const webhookQueries = db.query('webhook');\n\n return {\n allowedEvents: new Map([]),\n addAllowedEvent(key, value) {\n this.allowedEvents.set(key, value);\n },\n removeAllowedEvent(key) {\n this.allowedEvents.delete(key);\n },\n listAllowedEvents() {\n return Array.from(this.allowedEvents.keys());\n },\n getAllowedEvent(key) {\n return this.allowedEvents.get(key);\n },\n async findWebhooks() {\n const results = await webhookQueries.findMany();\n\n return results.map(fromDBObject);\n },\n async findWebhook(id) {\n const result = await webhookQueries.findOne({ where: { id } });\n return result ? fromDBObject(result) : null;\n },\n async createWebhook(data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n return webhookQueries\n .create({\n data: toDBObject({ ...data, isEnabled: true }),\n })\n .then(fromDBObject);\n },\n async updateWebhook(id, data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n const webhook = await webhookQueries.update({\n where: { id },\n data: toDBObject(data),\n });\n\n return webhook ? fromDBObject(webhook) : null;\n },\n async deleteWebhook(id) {\n const webhook = await webhookQueries.delete({ where: { id } });\n return webhook ? fromDBObject(webhook) : null;\n },\n };\n};\n\nexport { webhookModel, createWebhookStore };\n"],"names":[],"mappings":";AAOA,MAAM,EAAE,oBAAoB;AAE5B,MAAM,eAAe;AAAA,EACnB,KAAK;AAAA,EACL,gBAAgB;AAAA,EAChB,YAAY;AAAA,IACV,MAAM;AAAA,MACJ,MAAM;AAAA,IAAA;AAAA,IAER,KAAK;AAAA,MACH,MAAM;AAAA,IAAA;AAAA,IAER,SAAS;AAAA,MACP,MAAM;AAAA,IAAA;AAAA,IAER,QAAQ;AAAA,MACN,MAAM;AAAA,IAAA;AAAA,IAER,SAAS;AAAA,MACP,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ;AA4BA,MAAM,aAAa,CAAC,SAA2B;AAC7C,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,KAAK,KAAK;AAAA,IACV,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,EAAA;AAElB;AAEA,MAAM,eAAe,CAAC,QAA2B;AAC/C,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,KAAK,IAAI;AAAA,IACT,SAAS,IAAI;AAAA,IACb,QAAQ,IAAI;AAAA,IACZ,WAAW,IAAI;AAAA,EAAA;AAEnB;AAEA,MAAM,wBAAwB,OAAO,eAAoC,WAAqB;AAC5F,QAAM,gBAAgB,MAAM,KAAK,cAAc,QAAQ;AAEvD,SAAO,QAAQ,CAAC,UAAU;AACxB,QAAI,cAAc,SAAS,KAAK,GAAG;AACjC;AAAA,IACF;AAEA,UAAM,IAAI,gBAAgB,iBAAiB,KAAK,mBAAmB;AAAA,EACrE,CAAC;AACH;AAeA,MAAM,qBAAqB,CAAC,EAAE,SAAyC;AACrE,QAAM,iBAAiB,GAAG,MAAM,SAAS;AAEzC,SAAO;AAAA,IACL,eAAe,oBAAI,IAAI,EAAE;AAAA,IACzB,gBAAgB,KAAK,OAAO;AAC1B,WAAK,cAAc,IAAI,KAAK,KAAK;AAAA,IACnC;AAAA,IACA,mBAAmB,KAAK;AACtB,WAAK,cAAc,OAAO,GAAG;AAAA,IAC/B;AAAA,IACA,oBAAoB;AAClB,aAAO,MAAM,KAAK,KAAK,cAAc,MAAM;AAAA,IAC7C;AAAA,IACA,gBAAgB,KAAK;AACnB,aAAO,KAAK,cAAc,IAAI,GAAG;AAAA,IACnC;AAAA,IACA,MAAM,eAAe;AACnB,YAAM,UAAU,MAAM,eAAe,SAAA;AAErC,aAAO,QAAQ,IAAI,YAAY;AAAA,IACjC;AAAA,IACA,MAAM,YAAY,IAAI;AACpB,YAAM,SAAS,MAAM,eAAe,QAAQ,EAAE,OAAO,EAAE,GAAA,GAAM;AAC7D,aAAO,SAAS,aAAa,MAAM,IAAI;AAAA,IACzC;AAAA,IACA,MAAM,cAAc,MAAM;AACxB,YAAM,sBAAsB,KAAK,eAAe,KAAK,MAAM;AAE3D,aAAO,eACJ,OAAO;AAAA,QACN,MAAM,WAAW,EAAE,GAAG,MAAM,WAAW,MAAM;AAAA,MAAA,CAC9C,EACA,KAAK,YAAY;AAAA,IACtB;AAAA,IACA,MAAM,cAAc,IAAI,MAAM;AAC5B,YAAM,sBAAsB,KAAK,eAAe,KAAK,MAAM;AAE3D,YAAM,UAAU,MAAM,eAAe,OAAO;AAAA,QAC1C,OAAO,EAAE,GAAA;AAAA,QACT,MAAM,WAAW,IAAI;AAAA,MAAA,CACtB;AAED,aAAO,UAAU,aAAa,OAAO,IAAI;AAAA,IAC3C;AAAA,IACA,MAAM,cAAc,IAAI;AACtB,YAAM,UAAU,MAAM,eAAe,OAAO,EAAE,OAAO,EAAE,GAAA,GAAM;AAC7D,aAAO,UAAU,aAAa,OAAO,IAAI;AAAA,IAC3C;AAAA,EAAA;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"worker-queue.js","sources":["../../src/services/worker-queue.ts"],"sourcesContent":["/**\n * Simple worker queue in memory\n */\nimport createDebugger from 'debug';\nimport type { Logger } from '@strapi/logger';\nimport type { Utils } from '@strapi/types';\n\nconst debug = createDebugger('strapi:worker-queue');\n\ninterface ConstructorParameters {\n logger: Logger;\n concurrency?: number;\n}\n\ntype Worker<TPayload, TReturn> = (payload: TPayload) => Promise<TReturn> | TReturn;\n\nconst noop: Utils.Function.Any = () => {};\n\nexport default class WorkerQueue<TPayload, TReturn> {\n logger: Logger;\n\n worker: Worker<TPayload, TReturn>;\n\n concurrency: number;\n\n running: number;\n\n queue: TPayload[];\n\n constructor({ logger, concurrency = 5 }: ConstructorParameters) {\n debug('Initialize worker queue');\n\n this.logger = logger;\n this.worker = noop;\n\n this.concurrency = concurrency;\n this.running = 0;\n this.queue = [];\n }\n\n subscribe(worker: Worker<TPayload, TReturn>) {\n debug('Subscribe to worker queue');\n this.worker = worker;\n }\n\n enqueue(payload: TPayload) {\n debug('Enqueue event in worker queue');\n if (this.running < this.concurrency) {\n this.running += 1;\n this.execute(payload);\n } else {\n this.queue.unshift(payload);\n }\n }\n\n pop() {\n debug('Pop worker queue and execute');\n const payload = this.queue.pop();\n\n if (payload) {\n this.execute(payload);\n } else {\n this.running -= 1;\n }\n }\n\n async execute(payload: TPayload) {\n debug('Execute worker');\n try {\n await this.worker(payload);\n } catch (error) {\n this.logger.error(error);\n } finally {\n this.pop();\n }\n }\n}\n"],"names":["createDebugger"],"mappings":";;;;AAOA,MAAM,QAAQA,wBAAAA,QAAe,qBAAqB;AASlD,MAAM,OAA2B,MAAM;AAAC;AAExC,MAAqB,YAA+B;AAAA,EAClD;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA,YAAY,EAAE,QAAQ,cAAc,KAA4B;AAC9D,UAAM,yBAAyB;AAE/B,SAAK,SAAS;AACd,SAAK,SAAS;AAEd,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,QAAQ;EACf;AAAA,EAEA,UAAU,QAAmC;AAC3C,UAAM,2BAA2B;AACjC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAQ,SAAmB;AACzB,UAAM,+BAA+B;AACjC,QAAA,KAAK,UAAU,KAAK,aAAa;AACnC,WAAK,WAAW;AAChB,WAAK,QAAQ,OAAO;AAAA,IAAA,OACf;AACA,WAAA,MAAM,QAAQ,OAAO;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM;AACJ,UAAM,8BAA8B;AAC9B,UAAA,UAAU,KAAK,MAAM,IAAI;AAE/B,QAAI,SAAS;AACX,WAAK,QAAQ,OAAO;AAAA,IAAA,OACf;AACL,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,SAAmB;AAC/B,UAAM,gBAAgB;AAClB,QAAA;AACI,YAAA,KAAK,OAAO,OAAO;AAAA,aAClB,OAAO;AACT,WAAA,OAAO,MAAM,KAAK;AAAA,IAAA,UACvB;AACA,WAAK,IAAI;AAAA,IACX;AAAA,EACF;AACF;;"}
1
+ {"version":3,"file":"worker-queue.js","sources":["../../src/services/worker-queue.ts"],"sourcesContent":["/**\n * Simple worker queue in memory\n */\nimport createDebugger from 'debug';\nimport type { Logger } from '@strapi/logger';\nimport type { Utils } from '@strapi/types';\n\nconst debug = createDebugger('strapi:worker-queue');\n\ninterface ConstructorParameters {\n logger: Logger;\n concurrency?: number;\n}\n\ntype Worker<TPayload, TReturn> = (payload: TPayload) => Promise<TReturn> | TReturn;\n\nconst noop: Utils.Function.Any = () => {};\n\nexport default class WorkerQueue<TPayload, TReturn> {\n logger: Logger;\n\n worker: Worker<TPayload, TReturn>;\n\n concurrency: number;\n\n running: number;\n\n queue: TPayload[];\n\n constructor({ logger, concurrency = 5 }: ConstructorParameters) {\n debug('Initialize worker queue');\n\n this.logger = logger;\n this.worker = noop;\n\n this.concurrency = concurrency;\n this.running = 0;\n this.queue = [];\n }\n\n subscribe(worker: Worker<TPayload, TReturn>) {\n debug('Subscribe to worker queue');\n this.worker = worker;\n }\n\n enqueue(payload: TPayload) {\n debug('Enqueue event in worker queue');\n if (this.running < this.concurrency) {\n this.running += 1;\n this.execute(payload);\n } else {\n this.queue.unshift(payload);\n }\n }\n\n pop() {\n debug('Pop worker queue and execute');\n const payload = this.queue.pop();\n\n if (payload) {\n this.execute(payload);\n } else {\n this.running -= 1;\n }\n }\n\n async execute(payload: TPayload) {\n debug('Execute worker');\n try {\n await this.worker(payload);\n } catch (error) {\n this.logger.error(error);\n } finally {\n this.pop();\n }\n }\n}\n"],"names":["createDebugger"],"mappings":";;;;AAOA,MAAM,QAAQA,wBAAAA,QAAe,qBAAqB;AASlD,MAAM,OAA2B,MAAM;AAAC;AAExC,MAAqB,YAA+B;AAAA,EAClD;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA,YAAY,EAAE,QAAQ,cAAc,KAA4B;AAC9D,UAAM,yBAAyB;AAE/B,SAAK,SAAS;AACd,SAAK,SAAS;AAEd,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,QAAQ,CAAA;AAAA,EACf;AAAA,EAEA,UAAU,QAAmC;AAC3C,UAAM,2BAA2B;AACjC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAQ,SAAmB;AACzB,UAAM,+BAA+B;AACrC,QAAI,KAAK,UAAU,KAAK,aAAa;AACnC,WAAK,WAAW;AAChB,WAAK,QAAQ,OAAO;AAAA,IACtB,OAAO;AACL,WAAK,MAAM,QAAQ,OAAO;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM;AACJ,UAAM,8BAA8B;AACpC,UAAM,UAAU,KAAK,MAAM,IAAA;AAE3B,QAAI,SAAS;AACX,WAAK,QAAQ,OAAO;AAAA,IACtB,OAAO;AACL,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,SAAmB;AAC/B,UAAM,gBAAgB;AACtB,QAAI;AACF,YAAM,KAAK,OAAO,OAAO;AAAA,IAC3B,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,KAAK;AAAA,IACzB,UAAA;AACE,WAAK,IAAA;AAAA,IACP;AAAA,EACF;AACF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"worker-queue.mjs","sources":["../../src/services/worker-queue.ts"],"sourcesContent":["/**\n * Simple worker queue in memory\n */\nimport createDebugger from 'debug';\nimport type { Logger } from '@strapi/logger';\nimport type { Utils } from '@strapi/types';\n\nconst debug = createDebugger('strapi:worker-queue');\n\ninterface ConstructorParameters {\n logger: Logger;\n concurrency?: number;\n}\n\ntype Worker<TPayload, TReturn> = (payload: TPayload) => Promise<TReturn> | TReturn;\n\nconst noop: Utils.Function.Any = () => {};\n\nexport default class WorkerQueue<TPayload, TReturn> {\n logger: Logger;\n\n worker: Worker<TPayload, TReturn>;\n\n concurrency: number;\n\n running: number;\n\n queue: TPayload[];\n\n constructor({ logger, concurrency = 5 }: ConstructorParameters) {\n debug('Initialize worker queue');\n\n this.logger = logger;\n this.worker = noop;\n\n this.concurrency = concurrency;\n this.running = 0;\n this.queue = [];\n }\n\n subscribe(worker: Worker<TPayload, TReturn>) {\n debug('Subscribe to worker queue');\n this.worker = worker;\n }\n\n enqueue(payload: TPayload) {\n debug('Enqueue event in worker queue');\n if (this.running < this.concurrency) {\n this.running += 1;\n this.execute(payload);\n } else {\n this.queue.unshift(payload);\n }\n }\n\n pop() {\n debug('Pop worker queue and execute');\n const payload = this.queue.pop();\n\n if (payload) {\n this.execute(payload);\n } else {\n this.running -= 1;\n }\n }\n\n async execute(payload: TPayload) {\n debug('Execute worker');\n try {\n await this.worker(payload);\n } catch (error) {\n this.logger.error(error);\n } finally {\n this.pop();\n }\n }\n}\n"],"names":[],"mappings":";AAOA,MAAM,QAAQ,eAAe,qBAAqB;AASlD,MAAM,OAA2B,MAAM;AAAC;AAExC,MAAqB,YAA+B;AAAA,EAClD;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA,YAAY,EAAE,QAAQ,cAAc,KAA4B;AAC9D,UAAM,yBAAyB;AAE/B,SAAK,SAAS;AACd,SAAK,SAAS;AAEd,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,QAAQ;EACf;AAAA,EAEA,UAAU,QAAmC;AAC3C,UAAM,2BAA2B;AACjC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAQ,SAAmB;AACzB,UAAM,+BAA+B;AACjC,QAAA,KAAK,UAAU,KAAK,aAAa;AACnC,WAAK,WAAW;AAChB,WAAK,QAAQ,OAAO;AAAA,IAAA,OACf;AACA,WAAA,MAAM,QAAQ,OAAO;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM;AACJ,UAAM,8BAA8B;AAC9B,UAAA,UAAU,KAAK,MAAM,IAAI;AAE/B,QAAI,SAAS;AACX,WAAK,QAAQ,OAAO;AAAA,IAAA,OACf;AACL,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,SAAmB;AAC/B,UAAM,gBAAgB;AAClB,QAAA;AACI,YAAA,KAAK,OAAO,OAAO;AAAA,aAClB,OAAO;AACT,WAAA,OAAO,MAAM,KAAK;AAAA,IAAA,UACvB;AACA,WAAK,IAAI;AAAA,IACX;AAAA,EACF;AACF;"}
1
+ {"version":3,"file":"worker-queue.mjs","sources":["../../src/services/worker-queue.ts"],"sourcesContent":["/**\n * Simple worker queue in memory\n */\nimport createDebugger from 'debug';\nimport type { Logger } from '@strapi/logger';\nimport type { Utils } from '@strapi/types';\n\nconst debug = createDebugger('strapi:worker-queue');\n\ninterface ConstructorParameters {\n logger: Logger;\n concurrency?: number;\n}\n\ntype Worker<TPayload, TReturn> = (payload: TPayload) => Promise<TReturn> | TReturn;\n\nconst noop: Utils.Function.Any = () => {};\n\nexport default class WorkerQueue<TPayload, TReturn> {\n logger: Logger;\n\n worker: Worker<TPayload, TReturn>;\n\n concurrency: number;\n\n running: number;\n\n queue: TPayload[];\n\n constructor({ logger, concurrency = 5 }: ConstructorParameters) {\n debug('Initialize worker queue');\n\n this.logger = logger;\n this.worker = noop;\n\n this.concurrency = concurrency;\n this.running = 0;\n this.queue = [];\n }\n\n subscribe(worker: Worker<TPayload, TReturn>) {\n debug('Subscribe to worker queue');\n this.worker = worker;\n }\n\n enqueue(payload: TPayload) {\n debug('Enqueue event in worker queue');\n if (this.running < this.concurrency) {\n this.running += 1;\n this.execute(payload);\n } else {\n this.queue.unshift(payload);\n }\n }\n\n pop() {\n debug('Pop worker queue and execute');\n const payload = this.queue.pop();\n\n if (payload) {\n this.execute(payload);\n } else {\n this.running -= 1;\n }\n }\n\n async execute(payload: TPayload) {\n debug('Execute worker');\n try {\n await this.worker(payload);\n } catch (error) {\n this.logger.error(error);\n } finally {\n this.pop();\n }\n }\n}\n"],"names":[],"mappings":";AAOA,MAAM,QAAQ,eAAe,qBAAqB;AASlD,MAAM,OAA2B,MAAM;AAAC;AAExC,MAAqB,YAA+B;AAAA,EAClD;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA,YAAY,EAAE,QAAQ,cAAc,KAA4B;AAC9D,UAAM,yBAAyB;AAE/B,SAAK,SAAS;AACd,SAAK,SAAS;AAEd,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,QAAQ,CAAA;AAAA,EACf;AAAA,EAEA,UAAU,QAAmC;AAC3C,UAAM,2BAA2B;AACjC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAQ,SAAmB;AACzB,UAAM,+BAA+B;AACrC,QAAI,KAAK,UAAU,KAAK,aAAa;AACnC,WAAK,WAAW;AAChB,WAAK,QAAQ,OAAO;AAAA,IACtB,OAAO;AACL,WAAK,MAAM,QAAQ,OAAO;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM;AACJ,UAAM,8BAA8B;AACpC,UAAM,UAAU,KAAK,MAAM,IAAA;AAE3B,QAAI,SAAS;AACX,WAAK,QAAQ,OAAO;AAAA,IACtB,OAAO;AACL,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,SAAmB;AAC/B,UAAM,gBAAgB;AACtB,QAAI;AACF,YAAM,KAAK,OAAO,OAAO;AAAA,IAC3B,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,KAAK;AAAA,IACzB,UAAA;AACE,WAAK,IAAA;AAAA,IACP;AAAA,EACF;AACF;"}
@@ -1 +1 @@
1
- {"version":3,"file":"convert-custom-field-type.js","sources":["../../src/utils/convert-custom-field-type.ts"],"sourcesContent":["import type { Strapi } from '@strapi/types';\n\ntype InputAttributes = {\n [key: string]: {\n type: string;\n customField?: string;\n };\n};\n\nconst convertCustomFieldType = (strapi: Strapi) => {\n const allContentTypeSchemaAttributes = Object.values(strapi.contentTypes).map(\n (schema) => schema.attributes\n );\n\n const allComponentSchemaAttributes = Object.values(strapi.components).map(\n (schema) => schema.attributes\n );\n const allSchemasAttributes: InputAttributes[] = [\n ...allContentTypeSchemaAttributes,\n ...allComponentSchemaAttributes,\n ];\n\n for (const schemaAttrbutes of allSchemasAttributes) {\n for (const attribute of Object.values(schemaAttrbutes)) {\n if (attribute.type === 'customField') {\n const customField = strapi.container.get('custom-fields').get(attribute.customField);\n attribute.type = customField.type;\n }\n }\n }\n};\n\nexport default convertCustomFieldType;\n"],"names":[],"mappings":";AASM,MAAA,yBAAyB,CAAC,WAAmB;AACjD,QAAM,iCAAiC,OAAO,OAAO,OAAO,YAAY,EAAE;AAAA,IACxE,CAAC,WAAW,OAAO;AAAA,EAAA;AAGrB,QAAM,+BAA+B,OAAO,OAAO,OAAO,UAAU,EAAE;AAAA,IACpE,CAAC,WAAW,OAAO;AAAA,EAAA;AAErB,QAAM,uBAA0C;AAAA,IAC9C,GAAG;AAAA,IACH,GAAG;AAAA,EAAA;AAGL,aAAW,mBAAmB,sBAAsB;AAClD,eAAW,aAAa,OAAO,OAAO,eAAe,GAAG;AAClD,UAAA,UAAU,SAAS,eAAe;AAC9B,cAAA,cAAc,OAAO,UAAU,IAAI,eAAe,EAAE,IAAI,UAAU,WAAW;AACnF,kBAAU,OAAO,YAAY;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;;"}
1
+ {"version":3,"file":"convert-custom-field-type.js","sources":["../../src/utils/convert-custom-field-type.ts"],"sourcesContent":["import type { Strapi } from '@strapi/types';\n\ntype InputAttributes = {\n [key: string]: {\n type: string;\n customField?: string;\n };\n};\n\nconst convertCustomFieldType = (strapi: Strapi) => {\n const allContentTypeSchemaAttributes = Object.values(strapi.contentTypes).map(\n (schema) => schema.attributes\n );\n\n const allComponentSchemaAttributes = Object.values(strapi.components).map(\n (schema) => schema.attributes\n );\n const allSchemasAttributes: InputAttributes[] = [\n ...allContentTypeSchemaAttributes,\n ...allComponentSchemaAttributes,\n ];\n\n for (const schemaAttrbutes of allSchemasAttributes) {\n for (const attribute of Object.values(schemaAttrbutes)) {\n if (attribute.type === 'customField') {\n const customField = strapi.container.get('custom-fields').get(attribute.customField);\n attribute.type = customField.type;\n }\n }\n }\n};\n\nexport default convertCustomFieldType;\n"],"names":[],"mappings":";AASA,MAAM,yBAAyB,CAAC,WAAmB;AACjD,QAAM,iCAAiC,OAAO,OAAO,OAAO,YAAY,EAAE;AAAA,IACxE,CAAC,WAAW,OAAO;AAAA,EAAA;AAGrB,QAAM,+BAA+B,OAAO,OAAO,OAAO,UAAU,EAAE;AAAA,IACpE,CAAC,WAAW,OAAO;AAAA,EAAA;AAErB,QAAM,uBAA0C;AAAA,IAC9C,GAAG;AAAA,IACH,GAAG;AAAA,EAAA;AAGL,aAAW,mBAAmB,sBAAsB;AAClD,eAAW,aAAa,OAAO,OAAO,eAAe,GAAG;AACtD,UAAI,UAAU,SAAS,eAAe;AACpC,cAAM,cAAc,OAAO,UAAU,IAAI,eAAe,EAAE,IAAI,UAAU,WAAW;AACnF,kBAAU,OAAO,YAAY;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"convert-custom-field-type.mjs","sources":["../../src/utils/convert-custom-field-type.ts"],"sourcesContent":["import type { Strapi } from '@strapi/types';\n\ntype InputAttributes = {\n [key: string]: {\n type: string;\n customField?: string;\n };\n};\n\nconst convertCustomFieldType = (strapi: Strapi) => {\n const allContentTypeSchemaAttributes = Object.values(strapi.contentTypes).map(\n (schema) => schema.attributes\n );\n\n const allComponentSchemaAttributes = Object.values(strapi.components).map(\n (schema) => schema.attributes\n );\n const allSchemasAttributes: InputAttributes[] = [\n ...allContentTypeSchemaAttributes,\n ...allComponentSchemaAttributes,\n ];\n\n for (const schemaAttrbutes of allSchemasAttributes) {\n for (const attribute of Object.values(schemaAttrbutes)) {\n if (attribute.type === 'customField') {\n const customField = strapi.container.get('custom-fields').get(attribute.customField);\n attribute.type = customField.type;\n }\n }\n }\n};\n\nexport default convertCustomFieldType;\n"],"names":[],"mappings":"AASM,MAAA,yBAAyB,CAAC,WAAmB;AACjD,QAAM,iCAAiC,OAAO,OAAO,OAAO,YAAY,EAAE;AAAA,IACxE,CAAC,WAAW,OAAO;AAAA,EAAA;AAGrB,QAAM,+BAA+B,OAAO,OAAO,OAAO,UAAU,EAAE;AAAA,IACpE,CAAC,WAAW,OAAO;AAAA,EAAA;AAErB,QAAM,uBAA0C;AAAA,IAC9C,GAAG;AAAA,IACH,GAAG;AAAA,EAAA;AAGL,aAAW,mBAAmB,sBAAsB;AAClD,eAAW,aAAa,OAAO,OAAO,eAAe,GAAG;AAClD,UAAA,UAAU,SAAS,eAAe;AAC9B,cAAA,cAAc,OAAO,UAAU,IAAI,eAAe,EAAE,IAAI,UAAU,WAAW;AACnF,kBAAU,OAAO,YAAY;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;"}
1
+ {"version":3,"file":"convert-custom-field-type.mjs","sources":["../../src/utils/convert-custom-field-type.ts"],"sourcesContent":["import type { Strapi } from '@strapi/types';\n\ntype InputAttributes = {\n [key: string]: {\n type: string;\n customField?: string;\n };\n};\n\nconst convertCustomFieldType = (strapi: Strapi) => {\n const allContentTypeSchemaAttributes = Object.values(strapi.contentTypes).map(\n (schema) => schema.attributes\n );\n\n const allComponentSchemaAttributes = Object.values(strapi.components).map(\n (schema) => schema.attributes\n );\n const allSchemasAttributes: InputAttributes[] = [\n ...allContentTypeSchemaAttributes,\n ...allComponentSchemaAttributes,\n ];\n\n for (const schemaAttrbutes of allSchemasAttributes) {\n for (const attribute of Object.values(schemaAttrbutes)) {\n if (attribute.type === 'customField') {\n const customField = strapi.container.get('custom-fields').get(attribute.customField);\n attribute.type = customField.type;\n }\n }\n }\n};\n\nexport default convertCustomFieldType;\n"],"names":[],"mappings":"AASA,MAAM,yBAAyB,CAAC,WAAmB;AACjD,QAAM,iCAAiC,OAAO,OAAO,OAAO,YAAY,EAAE;AAAA,IACxE,CAAC,WAAW,OAAO;AAAA,EAAA;AAGrB,QAAM,+BAA+B,OAAO,OAAO,OAAO,UAAU,EAAE;AAAA,IACpE,CAAC,WAAW,OAAO;AAAA,EAAA;AAErB,QAAM,uBAA0C;AAAA,IAC9C,GAAG;AAAA,IACH,GAAG;AAAA,EAAA;AAGL,aAAW,mBAAmB,sBAAsB;AAClD,eAAW,aAAa,OAAO,OAAO,eAAe,GAAG;AACtD,UAAI,UAAU,SAAS,eAAe;AACpC,cAAM,cAAc,OAAO,UAAU,IAAI,eAAe,EAAE,IAAI,UAAU,WAAW;AACnF,kBAAU,OAAO,YAAY;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;"}
@@ -1 +1 @@
1
- {"version":3,"file":"cron.js","sources":["../../src/utils/cron.ts"],"sourcesContent":["import { isEmpty, negate } from 'lodash/fp';\n\nconst DATE_FUNCTIONS = [\n 'getSeconds',\n 'getMinutes',\n 'getHours',\n 'getDate',\n 'getMonth',\n 'getDay',\n] as const;\n\nconst INTEGER_REGEX = /^\\d+$/;\nconst STEP_REGEX = /^\\*\\/\\d+$/;\nconst COMPONENTS: {\n limit: number;\n zeroBasedIndices: boolean;\n functionName: (typeof DATE_FUNCTIONS)[number];\n}[] = [\n { limit: 60, zeroBasedIndices: true, functionName: 'getSeconds' },\n { limit: 60, zeroBasedIndices: true, functionName: 'getMinutes' },\n { limit: 24, zeroBasedIndices: true, functionName: 'getHours' },\n { limit: 31, zeroBasedIndices: false, functionName: 'getDate' },\n { limit: 12, zeroBasedIndices: false, functionName: 'getMonth' },\n { limit: 7, zeroBasedIndices: true, functionName: 'getDay' },\n];\n\nconst shift = (component: string, index: number, date: Date) => {\n if (component === '*') {\n return '*';\n }\n\n const { limit, zeroBasedIndices, functionName } = COMPONENTS[index];\n const offset = +!zeroBasedIndices;\n const currentValue = date[functionName]();\n\n if (INTEGER_REGEX.test(component)) {\n return ((Number.parseInt(component, 10) + currentValue) % limit) + offset;\n }\n\n if (STEP_REGEX.test(component)) {\n const [, step] = component.split('/');\n const frequency = Math.floor(limit / Number(step));\n const list = Array.from({ length: frequency }, (_, index) => index * Number(step));\n return list.map((value) => ((value + currentValue) % limit) + offset).sort((a, b) => a - b);\n }\n\n // Unsupported syntax\n return component;\n};\n\n/**\n * Simulate an interval by shifting a cron expression using the specified date.\n * @param {string} rule A cron expression you want to shift.\n * @param {Date} date The date that's gonna be used as the start of the \"interval\", it defaults to now.\n * @returns The shifted cron expression.\n */\nexport const shiftCronExpression = (rule: string, date = new Date()) => {\n const components = rule.trim().split(' ').filter(negate(isEmpty));\n const secondsIncluded = components.length === 6;\n return components\n .map((component, index) => shift(component, secondsIncluded ? index : index + 1, date))\n .join(' ');\n};\n"],"names":["index","negate","isEmpty"],"mappings":";;;AAWA,MAAM,gBAAgB;AACtB,MAAM,aAAa;AACnB,MAAM,aAIA;AAAA,EACJ,EAAE,OAAO,IAAI,kBAAkB,MAAM,cAAc,aAAa;AAAA,EAChE,EAAE,OAAO,IAAI,kBAAkB,MAAM,cAAc,aAAa;AAAA,EAChE,EAAE,OAAO,IAAI,kBAAkB,MAAM,cAAc,WAAW;AAAA,EAC9D,EAAE,OAAO,IAAI,kBAAkB,OAAO,cAAc,UAAU;AAAA,EAC9D,EAAE,OAAO,IAAI,kBAAkB,OAAO,cAAc,WAAW;AAAA,EAC/D,EAAE,OAAO,GAAG,kBAAkB,MAAM,cAAc,SAAS;AAC7D;AAEA,MAAM,QAAQ,CAAC,WAAmB,OAAe,SAAe;AAC9D,MAAI,cAAc,KAAK;AACd,WAAA;AAAA,EACT;AAEA,QAAM,EAAE,OAAO,kBAAkB,aAAa,IAAI,WAAW,KAAK;AAC5D,QAAA,SAAS,CAAC,CAAC;AACX,QAAA,eAAe,KAAK,YAAY;AAElC,MAAA,cAAc,KAAK,SAAS,GAAG;AACjC,YAAS,OAAO,SAAS,WAAW,EAAE,IAAI,gBAAgB,QAAS;AAAA,EACrE;AAEI,MAAA,WAAW,KAAK,SAAS,GAAG;AAC9B,UAAM,CAAG,EAAA,IAAI,IAAI,UAAU,MAAM,GAAG;AACpC,UAAM,YAAY,KAAK,MAAM,QAAQ,OAAO,IAAI,CAAC;AACjD,UAAM,OAAO,MAAM,KAAK,EAAE,QAAQ,UAAA,GAAa,CAAC,GAAGA,WAAUA,SAAQ,OAAO,IAAI,CAAC;AACjF,WAAO,KAAK,IAAI,CAAC,WAAY,QAAQ,gBAAgB,QAAS,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EAC5F;AAGO,SAAA;AACT;AAQO,MAAM,sBAAsB,CAAC,MAAc,OAAO,oBAAI,WAAW;AAChE,QAAA,aAAa,KAAK,KAAA,EAAO,MAAM,GAAG,EAAE,OAAOC,GAAAA,OAAOC,GAAO,OAAA,CAAC;AAC1D,QAAA,kBAAkB,WAAW,WAAW;AAC9C,SAAO,WACJ,IAAI,CAAC,WAAW,UAAU,MAAM,WAAW,kBAAkB,QAAQ,QAAQ,GAAG,IAAI,CAAC,EACrF,KAAK,GAAG;AACb;;"}
1
+ {"version":3,"file":"cron.js","sources":["../../src/utils/cron.ts"],"sourcesContent":["import { isEmpty, negate } from 'lodash/fp';\n\nconst DATE_FUNCTIONS = [\n 'getSeconds',\n 'getMinutes',\n 'getHours',\n 'getDate',\n 'getMonth',\n 'getDay',\n] as const;\n\nconst INTEGER_REGEX = /^\\d+$/;\nconst STEP_REGEX = /^\\*\\/\\d+$/;\nconst COMPONENTS: {\n limit: number;\n zeroBasedIndices: boolean;\n functionName: (typeof DATE_FUNCTIONS)[number];\n}[] = [\n { limit: 60, zeroBasedIndices: true, functionName: 'getSeconds' },\n { limit: 60, zeroBasedIndices: true, functionName: 'getMinutes' },\n { limit: 24, zeroBasedIndices: true, functionName: 'getHours' },\n { limit: 31, zeroBasedIndices: false, functionName: 'getDate' },\n { limit: 12, zeroBasedIndices: false, functionName: 'getMonth' },\n { limit: 7, zeroBasedIndices: true, functionName: 'getDay' },\n];\n\nconst shift = (component: string, index: number, date: Date) => {\n if (component === '*') {\n return '*';\n }\n\n const { limit, zeroBasedIndices, functionName } = COMPONENTS[index];\n const offset = +!zeroBasedIndices;\n const currentValue = date[functionName]();\n\n if (INTEGER_REGEX.test(component)) {\n return ((Number.parseInt(component, 10) + currentValue) % limit) + offset;\n }\n\n if (STEP_REGEX.test(component)) {\n const [, step] = component.split('/');\n const frequency = Math.floor(limit / Number(step));\n const list = Array.from({ length: frequency }, (_, index) => index * Number(step));\n return list.map((value) => ((value + currentValue) % limit) + offset).sort((a, b) => a - b);\n }\n\n // Unsupported syntax\n return component;\n};\n\n/**\n * Simulate an interval by shifting a cron expression using the specified date.\n * @param {string} rule A cron expression you want to shift.\n * @param {Date} date The date that's gonna be used as the start of the \"interval\", it defaults to now.\n * @returns The shifted cron expression.\n */\nexport const shiftCronExpression = (rule: string, date = new Date()) => {\n const components = rule.trim().split(' ').filter(negate(isEmpty));\n const secondsIncluded = components.length === 6;\n return components\n .map((component, index) => shift(component, secondsIncluded ? index : index + 1, date))\n .join(' ');\n};\n"],"names":["index","negate","isEmpty"],"mappings":";;;AAWA,MAAM,gBAAgB;AACtB,MAAM,aAAa;AACnB,MAAM,aAIA;AAAA,EACJ,EAAE,OAAO,IAAI,kBAAkB,MAAM,cAAc,aAAA;AAAA,EACnD,EAAE,OAAO,IAAI,kBAAkB,MAAM,cAAc,aAAA;AAAA,EACnD,EAAE,OAAO,IAAI,kBAAkB,MAAM,cAAc,WAAA;AAAA,EACnD,EAAE,OAAO,IAAI,kBAAkB,OAAO,cAAc,UAAA;AAAA,EACpD,EAAE,OAAO,IAAI,kBAAkB,OAAO,cAAc,WAAA;AAAA,EACpD,EAAE,OAAO,GAAG,kBAAkB,MAAM,cAAc,SAAA;AACpD;AAEA,MAAM,QAAQ,CAAC,WAAmB,OAAe,SAAe;AAC9D,MAAI,cAAc,KAAK;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,OAAO,kBAAkB,aAAA,IAAiB,WAAW,KAAK;AAClE,QAAM,SAAS,CAAC,CAAC;AACjB,QAAM,eAAe,KAAK,YAAY,EAAA;AAEtC,MAAI,cAAc,KAAK,SAAS,GAAG;AACjC,YAAS,OAAO,SAAS,WAAW,EAAE,IAAI,gBAAgB,QAAS;AAAA,EACrE;AAEA,MAAI,WAAW,KAAK,SAAS,GAAG;AAC9B,UAAM,CAAA,EAAG,IAAI,IAAI,UAAU,MAAM,GAAG;AACpC,UAAM,YAAY,KAAK,MAAM,QAAQ,OAAO,IAAI,CAAC;AACjD,UAAM,OAAO,MAAM,KAAK,EAAE,QAAQ,UAAA,GAAa,CAAC,GAAGA,WAAUA,SAAQ,OAAO,IAAI,CAAC;AACjF,WAAO,KAAK,IAAI,CAAC,WAAY,QAAQ,gBAAgB,QAAS,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EAC5F;AAGA,SAAO;AACT;AAQO,MAAM,sBAAsB,CAAC,MAAc,OAAO,oBAAI,WAAW;AACtE,QAAM,aAAa,KAAK,OAAO,MAAM,GAAG,EAAE,OAAOC,UAAOC,GAAAA,OAAO,CAAC;AAChE,QAAM,kBAAkB,WAAW,WAAW;AAC9C,SAAO,WACJ,IAAI,CAAC,WAAW,UAAU,MAAM,WAAW,kBAAkB,QAAQ,QAAQ,GAAG,IAAI,CAAC,EACrF,KAAK,GAAG;AACb;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"cron.mjs","sources":["../../src/utils/cron.ts"],"sourcesContent":["import { isEmpty, negate } from 'lodash/fp';\n\nconst DATE_FUNCTIONS = [\n 'getSeconds',\n 'getMinutes',\n 'getHours',\n 'getDate',\n 'getMonth',\n 'getDay',\n] as const;\n\nconst INTEGER_REGEX = /^\\d+$/;\nconst STEP_REGEX = /^\\*\\/\\d+$/;\nconst COMPONENTS: {\n limit: number;\n zeroBasedIndices: boolean;\n functionName: (typeof DATE_FUNCTIONS)[number];\n}[] = [\n { limit: 60, zeroBasedIndices: true, functionName: 'getSeconds' },\n { limit: 60, zeroBasedIndices: true, functionName: 'getMinutes' },\n { limit: 24, zeroBasedIndices: true, functionName: 'getHours' },\n { limit: 31, zeroBasedIndices: false, functionName: 'getDate' },\n { limit: 12, zeroBasedIndices: false, functionName: 'getMonth' },\n { limit: 7, zeroBasedIndices: true, functionName: 'getDay' },\n];\n\nconst shift = (component: string, index: number, date: Date) => {\n if (component === '*') {\n return '*';\n }\n\n const { limit, zeroBasedIndices, functionName } = COMPONENTS[index];\n const offset = +!zeroBasedIndices;\n const currentValue = date[functionName]();\n\n if (INTEGER_REGEX.test(component)) {\n return ((Number.parseInt(component, 10) + currentValue) % limit) + offset;\n }\n\n if (STEP_REGEX.test(component)) {\n const [, step] = component.split('/');\n const frequency = Math.floor(limit / Number(step));\n const list = Array.from({ length: frequency }, (_, index) => index * Number(step));\n return list.map((value) => ((value + currentValue) % limit) + offset).sort((a, b) => a - b);\n }\n\n // Unsupported syntax\n return component;\n};\n\n/**\n * Simulate an interval by shifting a cron expression using the specified date.\n * @param {string} rule A cron expression you want to shift.\n * @param {Date} date The date that's gonna be used as the start of the \"interval\", it defaults to now.\n * @returns The shifted cron expression.\n */\nexport const shiftCronExpression = (rule: string, date = new Date()) => {\n const components = rule.trim().split(' ').filter(negate(isEmpty));\n const secondsIncluded = components.length === 6;\n return components\n .map((component, index) => shift(component, secondsIncluded ? index : index + 1, date))\n .join(' ');\n};\n"],"names":["index"],"mappings":";AAWA,MAAM,gBAAgB;AACtB,MAAM,aAAa;AACnB,MAAM,aAIA;AAAA,EACJ,EAAE,OAAO,IAAI,kBAAkB,MAAM,cAAc,aAAa;AAAA,EAChE,EAAE,OAAO,IAAI,kBAAkB,MAAM,cAAc,aAAa;AAAA,EAChE,EAAE,OAAO,IAAI,kBAAkB,MAAM,cAAc,WAAW;AAAA,EAC9D,EAAE,OAAO,IAAI,kBAAkB,OAAO,cAAc,UAAU;AAAA,EAC9D,EAAE,OAAO,IAAI,kBAAkB,OAAO,cAAc,WAAW;AAAA,EAC/D,EAAE,OAAO,GAAG,kBAAkB,MAAM,cAAc,SAAS;AAC7D;AAEA,MAAM,QAAQ,CAAC,WAAmB,OAAe,SAAe;AAC9D,MAAI,cAAc,KAAK;AACd,WAAA;AAAA,EACT;AAEA,QAAM,EAAE,OAAO,kBAAkB,aAAa,IAAI,WAAW,KAAK;AAC5D,QAAA,SAAS,CAAC,CAAC;AACX,QAAA,eAAe,KAAK,YAAY;AAElC,MAAA,cAAc,KAAK,SAAS,GAAG;AACjC,YAAS,OAAO,SAAS,WAAW,EAAE,IAAI,gBAAgB,QAAS;AAAA,EACrE;AAEI,MAAA,WAAW,KAAK,SAAS,GAAG;AAC9B,UAAM,CAAG,EAAA,IAAI,IAAI,UAAU,MAAM,GAAG;AACpC,UAAM,YAAY,KAAK,MAAM,QAAQ,OAAO,IAAI,CAAC;AACjD,UAAM,OAAO,MAAM,KAAK,EAAE,QAAQ,UAAA,GAAa,CAAC,GAAGA,WAAUA,SAAQ,OAAO,IAAI,CAAC;AACjF,WAAO,KAAK,IAAI,CAAC,WAAY,QAAQ,gBAAgB,QAAS,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EAC5F;AAGO,SAAA;AACT;AAQO,MAAM,sBAAsB,CAAC,MAAc,OAAO,oBAAI,WAAW;AAChE,QAAA,aAAa,KAAK,KAAA,EAAO,MAAM,GAAG,EAAE,OAAO,OAAO,OAAO,CAAC;AAC1D,QAAA,kBAAkB,WAAW,WAAW;AAC9C,SAAO,WACJ,IAAI,CAAC,WAAW,UAAU,MAAM,WAAW,kBAAkB,QAAQ,QAAQ,GAAG,IAAI,CAAC,EACrF,KAAK,GAAG;AACb;"}
1
+ {"version":3,"file":"cron.mjs","sources":["../../src/utils/cron.ts"],"sourcesContent":["import { isEmpty, negate } from 'lodash/fp';\n\nconst DATE_FUNCTIONS = [\n 'getSeconds',\n 'getMinutes',\n 'getHours',\n 'getDate',\n 'getMonth',\n 'getDay',\n] as const;\n\nconst INTEGER_REGEX = /^\\d+$/;\nconst STEP_REGEX = /^\\*\\/\\d+$/;\nconst COMPONENTS: {\n limit: number;\n zeroBasedIndices: boolean;\n functionName: (typeof DATE_FUNCTIONS)[number];\n}[] = [\n { limit: 60, zeroBasedIndices: true, functionName: 'getSeconds' },\n { limit: 60, zeroBasedIndices: true, functionName: 'getMinutes' },\n { limit: 24, zeroBasedIndices: true, functionName: 'getHours' },\n { limit: 31, zeroBasedIndices: false, functionName: 'getDate' },\n { limit: 12, zeroBasedIndices: false, functionName: 'getMonth' },\n { limit: 7, zeroBasedIndices: true, functionName: 'getDay' },\n];\n\nconst shift = (component: string, index: number, date: Date) => {\n if (component === '*') {\n return '*';\n }\n\n const { limit, zeroBasedIndices, functionName } = COMPONENTS[index];\n const offset = +!zeroBasedIndices;\n const currentValue = date[functionName]();\n\n if (INTEGER_REGEX.test(component)) {\n return ((Number.parseInt(component, 10) + currentValue) % limit) + offset;\n }\n\n if (STEP_REGEX.test(component)) {\n const [, step] = component.split('/');\n const frequency = Math.floor(limit / Number(step));\n const list = Array.from({ length: frequency }, (_, index) => index * Number(step));\n return list.map((value) => ((value + currentValue) % limit) + offset).sort((a, b) => a - b);\n }\n\n // Unsupported syntax\n return component;\n};\n\n/**\n * Simulate an interval by shifting a cron expression using the specified date.\n * @param {string} rule A cron expression you want to shift.\n * @param {Date} date The date that's gonna be used as the start of the \"interval\", it defaults to now.\n * @returns The shifted cron expression.\n */\nexport const shiftCronExpression = (rule: string, date = new Date()) => {\n const components = rule.trim().split(' ').filter(negate(isEmpty));\n const secondsIncluded = components.length === 6;\n return components\n .map((component, index) => shift(component, secondsIncluded ? index : index + 1, date))\n .join(' ');\n};\n"],"names":["index"],"mappings":";AAWA,MAAM,gBAAgB;AACtB,MAAM,aAAa;AACnB,MAAM,aAIA;AAAA,EACJ,EAAE,OAAO,IAAI,kBAAkB,MAAM,cAAc,aAAA;AAAA,EACnD,EAAE,OAAO,IAAI,kBAAkB,MAAM,cAAc,aAAA;AAAA,EACnD,EAAE,OAAO,IAAI,kBAAkB,MAAM,cAAc,WAAA;AAAA,EACnD,EAAE,OAAO,IAAI,kBAAkB,OAAO,cAAc,UAAA;AAAA,EACpD,EAAE,OAAO,IAAI,kBAAkB,OAAO,cAAc,WAAA;AAAA,EACpD,EAAE,OAAO,GAAG,kBAAkB,MAAM,cAAc,SAAA;AACpD;AAEA,MAAM,QAAQ,CAAC,WAAmB,OAAe,SAAe;AAC9D,MAAI,cAAc,KAAK;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,OAAO,kBAAkB,aAAA,IAAiB,WAAW,KAAK;AAClE,QAAM,SAAS,CAAC,CAAC;AACjB,QAAM,eAAe,KAAK,YAAY,EAAA;AAEtC,MAAI,cAAc,KAAK,SAAS,GAAG;AACjC,YAAS,OAAO,SAAS,WAAW,EAAE,IAAI,gBAAgB,QAAS;AAAA,EACrE;AAEA,MAAI,WAAW,KAAK,SAAS,GAAG;AAC9B,UAAM,CAAA,EAAG,IAAI,IAAI,UAAU,MAAM,GAAG;AACpC,UAAM,YAAY,KAAK,MAAM,QAAQ,OAAO,IAAI,CAAC;AACjD,UAAM,OAAO,MAAM,KAAK,EAAE,QAAQ,UAAA,GAAa,CAAC,GAAGA,WAAUA,SAAQ,OAAO,IAAI,CAAC;AACjF,WAAO,KAAK,IAAI,CAAC,WAAY,QAAQ,gBAAgB,QAAS,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EAC5F;AAGA,SAAO;AACT;AAQO,MAAM,sBAAsB,CAAC,MAAc,OAAO,oBAAI,WAAW;AACtE,QAAM,aAAa,KAAK,OAAO,MAAM,GAAG,EAAE,OAAO,OAAO,OAAO,CAAC;AAChE,QAAM,kBAAkB,WAAW,WAAW;AAC9C,SAAO,WACJ,IAAI,CAAC,WAAW,UAAU,MAAM,WAAW,kBAAkB,QAAQ,QAAQ,GAAG,IAAI,CAAC,EACrF,KAAK,GAAG;AACb;"}
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.js","sources":["../../src/utils/fetch.ts"],"sourcesContent":["import nodeFetch, { RequestInit, Response } from 'node-fetch';\nimport { HttpsProxyAgent, HttpsProxyAgentOptions } from 'https-proxy-agent';\n\nimport type { Strapi } from '@strapi/types';\n\nexport interface Fetch {\n (url: string, options: RequestInit): Promise<Response>;\n agent?: HttpsProxyAgent;\n}\n\nexport function createStrapiFetch(strapi: Strapi): Fetch {\n function fetch(url: string, options: RequestInit) {\n return nodeFetch(url, {\n ...(fetch.agent ? { agent: fetch.agent } : {}),\n ...options,\n });\n }\n\n const { globalProxy: proxy } = strapi.config.get<{\n globalProxy: HttpsProxyAgentOptions;\n }>('server');\n\n if (proxy) {\n fetch.agent = new HttpsProxyAgent(proxy);\n }\n\n return fetch;\n}\n"],"names":["fetch","nodeFetch","HttpsProxyAgent"],"mappings":";;;;;;AAUO,SAAS,kBAAkB,QAAuB;AAC9C,WAAAA,OAAM,KAAa,SAAsB;AAChD,WAAOC,eAAAA,QAAU,KAAK;AAAA,MACpB,GAAID,OAAM,QAAQ,EAAE,OAAOA,OAAM,MAAA,IAAU,CAAC;AAAA,MAC5C,GAAG;AAAA,IAAA,CACJ;AAAA,EACH;AAEA,QAAM,EAAE,aAAa,UAAU,OAAO,OAAO,IAE1C,QAAQ;AAEX,MAAI,OAAO;AACH,IAAAA,OAAA,QAAQ,IAAIE,gBAAA,gBAAgB,KAAK;AAAA,EACzC;AAEO,SAAAF;AACT;;"}
1
+ {"version":3,"file":"fetch.js","sources":["../../src/utils/fetch.ts"],"sourcesContent":["import nodeFetch, { RequestInit, Response } from 'node-fetch';\nimport { HttpsProxyAgent, HttpsProxyAgentOptions } from 'https-proxy-agent';\n\nimport type { Strapi } from '@strapi/types';\n\nexport interface Fetch {\n (url: string, options: RequestInit): Promise<Response>;\n agent?: HttpsProxyAgent;\n}\n\nexport function createStrapiFetch(strapi: Strapi): Fetch {\n function fetch(url: string, options: RequestInit) {\n return nodeFetch(url, {\n ...(fetch.agent ? { agent: fetch.agent } : {}),\n ...options,\n });\n }\n\n const { globalProxy: proxy } = strapi.config.get<{\n globalProxy: HttpsProxyAgentOptions;\n }>('server');\n\n if (proxy) {\n fetch.agent = new HttpsProxyAgent(proxy);\n }\n\n return fetch;\n}\n"],"names":["fetch","nodeFetch","HttpsProxyAgent"],"mappings":";;;;;;AAUO,SAAS,kBAAkB,QAAuB;AACvD,WAASA,OAAM,KAAa,SAAsB;AAChD,WAAOC,eAAAA,QAAU,KAAK;AAAA,MACpB,GAAID,OAAM,QAAQ,EAAE,OAAOA,OAAM,MAAA,IAAU,CAAA;AAAA,MAC3C,GAAG;AAAA,IAAA,CACJ;AAAA,EACH;AAEA,QAAM,EAAE,aAAa,MAAA,IAAU,OAAO,OAAO,IAE1C,QAAQ;AAEX,MAAI,OAAO;AACT,IAAAA,OAAM,QAAQ,IAAIE,gBAAAA,gBAAgB,KAAK;AAAA,EACzC;AAEA,SAAOF;AACT;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.mjs","sources":["../../src/utils/fetch.ts"],"sourcesContent":["import nodeFetch, { RequestInit, Response } from 'node-fetch';\nimport { HttpsProxyAgent, HttpsProxyAgentOptions } from 'https-proxy-agent';\n\nimport type { Strapi } from '@strapi/types';\n\nexport interface Fetch {\n (url: string, options: RequestInit): Promise<Response>;\n agent?: HttpsProxyAgent;\n}\n\nexport function createStrapiFetch(strapi: Strapi): Fetch {\n function fetch(url: string, options: RequestInit) {\n return nodeFetch(url, {\n ...(fetch.agent ? { agent: fetch.agent } : {}),\n ...options,\n });\n }\n\n const { globalProxy: proxy } = strapi.config.get<{\n globalProxy: HttpsProxyAgentOptions;\n }>('server');\n\n if (proxy) {\n fetch.agent = new HttpsProxyAgent(proxy);\n }\n\n return fetch;\n}\n"],"names":[],"mappings":";;AAUO,SAAS,kBAAkB,QAAuB;AAC9C,WAAA,MAAM,KAAa,SAAsB;AAChD,WAAO,UAAU,KAAK;AAAA,MACpB,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAA,IAAU,CAAC;AAAA,MAC5C,GAAG;AAAA,IAAA,CACJ;AAAA,EACH;AAEA,QAAM,EAAE,aAAa,UAAU,OAAO,OAAO,IAE1C,QAAQ;AAEX,MAAI,OAAO;AACH,UAAA,QAAQ,IAAI,gBAAgB,KAAK;AAAA,EACzC;AAEO,SAAA;AACT;"}
1
+ {"version":3,"file":"fetch.mjs","sources":["../../src/utils/fetch.ts"],"sourcesContent":["import nodeFetch, { RequestInit, Response } from 'node-fetch';\nimport { HttpsProxyAgent, HttpsProxyAgentOptions } from 'https-proxy-agent';\n\nimport type { Strapi } from '@strapi/types';\n\nexport interface Fetch {\n (url: string, options: RequestInit): Promise<Response>;\n agent?: HttpsProxyAgent;\n}\n\nexport function createStrapiFetch(strapi: Strapi): Fetch {\n function fetch(url: string, options: RequestInit) {\n return nodeFetch(url, {\n ...(fetch.agent ? { agent: fetch.agent } : {}),\n ...options,\n });\n }\n\n const { globalProxy: proxy } = strapi.config.get<{\n globalProxy: HttpsProxyAgentOptions;\n }>('server');\n\n if (proxy) {\n fetch.agent = new HttpsProxyAgent(proxy);\n }\n\n return fetch;\n}\n"],"names":[],"mappings":";;AAUO,SAAS,kBAAkB,QAAuB;AACvD,WAAS,MAAM,KAAa,SAAsB;AAChD,WAAO,UAAU,KAAK;AAAA,MACpB,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAA,IAAU,CAAA;AAAA,MAC3C,GAAG;AAAA,IAAA,CACJ;AAAA,EACH;AAEA,QAAM,EAAE,aAAa,MAAA,IAAU,OAAO,OAAO,IAE1C,QAAQ;AAEX,MAAI,OAAO;AACT,UAAM,QAAQ,IAAI,gBAAgB,KAAK;AAAA,EACzC;AAEA,SAAO;AACT;"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-dirs.js","sources":["../../src/utils/get-dirs.ts"],"sourcesContent":["import { join, resolve } from 'path';\nimport type { Strapi, StrapiDirectories } from '@strapi/types';\n\nexport type Options = {\n app: string;\n dist: string;\n};\n\nconst getDirs = (\n { app: appDir, dist: distDir }: Options,\n { strapi }: { strapi: Strapi }\n): StrapiDirectories => ({\n dist: {\n root: distDir,\n src: join(distDir, 'src'),\n api: join(distDir, 'src', 'api'),\n components: join(distDir, 'src', 'components'),\n extensions: join(distDir, 'src', 'extensions'),\n policies: join(distDir, 'src', 'policies'),\n middlewares: join(distDir, 'src', 'middlewares'),\n config: join(distDir, 'config'),\n },\n app: {\n root: appDir,\n src: join(appDir, 'src'),\n api: join(appDir, 'src', 'api'),\n components: join(appDir, 'src', 'components'),\n extensions: join(appDir, 'src', 'extensions'),\n policies: join(appDir, 'src', 'policies'),\n middlewares: join(appDir, 'src', 'middlewares'),\n config: join(appDir, 'config'),\n },\n static: {\n public: resolve(appDir, strapi.config.get('server.dirs.public')),\n },\n});\n\nexport default getDirs;\n"],"names":["join","resolve"],"mappings":";;AAQM,MAAA,UAAU,CACd,EAAE,KAAK,QAAQ,MAAM,QAAQ,GAC7B,EAAE,cACqB;AAAA,EACvB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,KAAKA,KAAAA,KAAK,SAAS,KAAK;AAAA,IACxB,KAAKA,KAAA,KAAK,SAAS,OAAO,KAAK;AAAA,IAC/B,YAAYA,KAAA,KAAK,SAAS,OAAO,YAAY;AAAA,IAC7C,YAAYA,KAAA,KAAK,SAAS,OAAO,YAAY;AAAA,IAC7C,UAAUA,KAAA,KAAK,SAAS,OAAO,UAAU;AAAA,IACzC,aAAaA,KAAA,KAAK,SAAS,OAAO,aAAa;AAAA,IAC/C,QAAQA,KAAAA,KAAK,SAAS,QAAQ;AAAA,EAChC;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,KAAKA,KAAAA,KAAK,QAAQ,KAAK;AAAA,IACvB,KAAKA,KAAA,KAAK,QAAQ,OAAO,KAAK;AAAA,IAC9B,YAAYA,KAAA,KAAK,QAAQ,OAAO,YAAY;AAAA,IAC5C,YAAYA,KAAA,KAAK,QAAQ,OAAO,YAAY;AAAA,IAC5C,UAAUA,KAAA,KAAK,QAAQ,OAAO,UAAU;AAAA,IACxC,aAAaA,KAAA,KAAK,QAAQ,OAAO,aAAa;AAAA,IAC9C,QAAQA,KAAAA,KAAK,QAAQ,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,QAAQC,KAAQ,QAAA,QAAQ,OAAO,OAAO,IAAI,oBAAoB,CAAC;AAAA,EACjE;AACF;;"}
1
+ {"version":3,"file":"get-dirs.js","sources":["../../src/utils/get-dirs.ts"],"sourcesContent":["import { join, resolve } from 'path';\nimport type { Strapi, StrapiDirectories } from '@strapi/types';\n\nexport type Options = {\n app: string;\n dist: string;\n};\n\nconst getDirs = (\n { app: appDir, dist: distDir }: Options,\n { strapi }: { strapi: Strapi }\n): StrapiDirectories => ({\n dist: {\n root: distDir,\n src: join(distDir, 'src'),\n api: join(distDir, 'src', 'api'),\n components: join(distDir, 'src', 'components'),\n extensions: join(distDir, 'src', 'extensions'),\n policies: join(distDir, 'src', 'policies'),\n middlewares: join(distDir, 'src', 'middlewares'),\n config: join(distDir, 'config'),\n },\n app: {\n root: appDir,\n src: join(appDir, 'src'),\n api: join(appDir, 'src', 'api'),\n components: join(appDir, 'src', 'components'),\n extensions: join(appDir, 'src', 'extensions'),\n policies: join(appDir, 'src', 'policies'),\n middlewares: join(appDir, 'src', 'middlewares'),\n config: join(appDir, 'config'),\n },\n static: {\n public: resolve(appDir, strapi.config.get('server.dirs.public')),\n },\n});\n\nexport default getDirs;\n"],"names":["join","resolve"],"mappings":";;AAQA,MAAM,UAAU,CACd,EAAE,KAAK,QAAQ,MAAM,QAAA,GACrB,EAAE,cACqB;AAAA,EACvB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,KAAKA,KAAAA,KAAK,SAAS,KAAK;AAAA,IACxB,KAAKA,KAAAA,KAAK,SAAS,OAAO,KAAK;AAAA,IAC/B,YAAYA,KAAAA,KAAK,SAAS,OAAO,YAAY;AAAA,IAC7C,YAAYA,KAAAA,KAAK,SAAS,OAAO,YAAY;AAAA,IAC7C,UAAUA,KAAAA,KAAK,SAAS,OAAO,UAAU;AAAA,IACzC,aAAaA,KAAAA,KAAK,SAAS,OAAO,aAAa;AAAA,IAC/C,QAAQA,KAAAA,KAAK,SAAS,QAAQ;AAAA,EAAA;AAAA,EAEhC,KAAK;AAAA,IACH,MAAM;AAAA,IACN,KAAKA,KAAAA,KAAK,QAAQ,KAAK;AAAA,IACvB,KAAKA,KAAAA,KAAK,QAAQ,OAAO,KAAK;AAAA,IAC9B,YAAYA,KAAAA,KAAK,QAAQ,OAAO,YAAY;AAAA,IAC5C,YAAYA,KAAAA,KAAK,QAAQ,OAAO,YAAY;AAAA,IAC5C,UAAUA,KAAAA,KAAK,QAAQ,OAAO,UAAU;AAAA,IACxC,aAAaA,KAAAA,KAAK,QAAQ,OAAO,aAAa;AAAA,IAC9C,QAAQA,KAAAA,KAAK,QAAQ,QAAQ;AAAA,EAAA;AAAA,EAE/B,QAAQ;AAAA,IACN,QAAQC,KAAAA,QAAQ,QAAQ,OAAO,OAAO,IAAI,oBAAoB,CAAC;AAAA,EAAA;AAEnE;;"}
@@ -1,4 +1,4 @@
1
- import { join, resolve } from "path";
1
+ import { resolve, join } from "path";
2
2
  const getDirs = ({ app: appDir, dist: distDir }, { strapi }) => ({
3
3
  dist: {
4
4
  root: distDir,
@@ -1 +1 @@
1
- {"version":3,"file":"get-dirs.mjs","sources":["../../src/utils/get-dirs.ts"],"sourcesContent":["import { join, resolve } from 'path';\nimport type { Strapi, StrapiDirectories } from '@strapi/types';\n\nexport type Options = {\n app: string;\n dist: string;\n};\n\nconst getDirs = (\n { app: appDir, dist: distDir }: Options,\n { strapi }: { strapi: Strapi }\n): StrapiDirectories => ({\n dist: {\n root: distDir,\n src: join(distDir, 'src'),\n api: join(distDir, 'src', 'api'),\n components: join(distDir, 'src', 'components'),\n extensions: join(distDir, 'src', 'extensions'),\n policies: join(distDir, 'src', 'policies'),\n middlewares: join(distDir, 'src', 'middlewares'),\n config: join(distDir, 'config'),\n },\n app: {\n root: appDir,\n src: join(appDir, 'src'),\n api: join(appDir, 'src', 'api'),\n components: join(appDir, 'src', 'components'),\n extensions: join(appDir, 'src', 'extensions'),\n policies: join(appDir, 'src', 'policies'),\n middlewares: join(appDir, 'src', 'middlewares'),\n config: join(appDir, 'config'),\n },\n static: {\n public: resolve(appDir, strapi.config.get('server.dirs.public')),\n },\n});\n\nexport default getDirs;\n"],"names":[],"mappings":";AAQM,MAAA,UAAU,CACd,EAAE,KAAK,QAAQ,MAAM,QAAQ,GAC7B,EAAE,cACqB;AAAA,EACvB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,KAAK,KAAK,SAAS,KAAK;AAAA,IACxB,KAAK,KAAK,SAAS,OAAO,KAAK;AAAA,IAC/B,YAAY,KAAK,SAAS,OAAO,YAAY;AAAA,IAC7C,YAAY,KAAK,SAAS,OAAO,YAAY;AAAA,IAC7C,UAAU,KAAK,SAAS,OAAO,UAAU;AAAA,IACzC,aAAa,KAAK,SAAS,OAAO,aAAa;AAAA,IAC/C,QAAQ,KAAK,SAAS,QAAQ;AAAA,EAChC;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,KAAK,KAAK,QAAQ,KAAK;AAAA,IACvB,KAAK,KAAK,QAAQ,OAAO,KAAK;AAAA,IAC9B,YAAY,KAAK,QAAQ,OAAO,YAAY;AAAA,IAC5C,YAAY,KAAK,QAAQ,OAAO,YAAY;AAAA,IAC5C,UAAU,KAAK,QAAQ,OAAO,UAAU;AAAA,IACxC,aAAa,KAAK,QAAQ,OAAO,aAAa;AAAA,IAC9C,QAAQ,KAAK,QAAQ,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ,QAAQ,QAAQ,OAAO,OAAO,IAAI,oBAAoB,CAAC;AAAA,EACjE;AACF;"}
1
+ {"version":3,"file":"get-dirs.mjs","sources":["../../src/utils/get-dirs.ts"],"sourcesContent":["import { join, resolve } from 'path';\nimport type { Strapi, StrapiDirectories } from '@strapi/types';\n\nexport type Options = {\n app: string;\n dist: string;\n};\n\nconst getDirs = (\n { app: appDir, dist: distDir }: Options,\n { strapi }: { strapi: Strapi }\n): StrapiDirectories => ({\n dist: {\n root: distDir,\n src: join(distDir, 'src'),\n api: join(distDir, 'src', 'api'),\n components: join(distDir, 'src', 'components'),\n extensions: join(distDir, 'src', 'extensions'),\n policies: join(distDir, 'src', 'policies'),\n middlewares: join(distDir, 'src', 'middlewares'),\n config: join(distDir, 'config'),\n },\n app: {\n root: appDir,\n src: join(appDir, 'src'),\n api: join(appDir, 'src', 'api'),\n components: join(appDir, 'src', 'components'),\n extensions: join(appDir, 'src', 'extensions'),\n policies: join(appDir, 'src', 'policies'),\n middlewares: join(appDir, 'src', 'middlewares'),\n config: join(appDir, 'config'),\n },\n static: {\n public: resolve(appDir, strapi.config.get('server.dirs.public')),\n },\n});\n\nexport default getDirs;\n"],"names":[],"mappings":";AAQA,MAAM,UAAU,CACd,EAAE,KAAK,QAAQ,MAAM,QAAA,GACrB,EAAE,cACqB;AAAA,EACvB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,KAAK,KAAK,SAAS,KAAK;AAAA,IACxB,KAAK,KAAK,SAAS,OAAO,KAAK;AAAA,IAC/B,YAAY,KAAK,SAAS,OAAO,YAAY;AAAA,IAC7C,YAAY,KAAK,SAAS,OAAO,YAAY;AAAA,IAC7C,UAAU,KAAK,SAAS,OAAO,UAAU;AAAA,IACzC,aAAa,KAAK,SAAS,OAAO,aAAa;AAAA,IAC/C,QAAQ,KAAK,SAAS,QAAQ;AAAA,EAAA;AAAA,EAEhC,KAAK;AAAA,IACH,MAAM;AAAA,IACN,KAAK,KAAK,QAAQ,KAAK;AAAA,IACvB,KAAK,KAAK,QAAQ,OAAO,KAAK;AAAA,IAC9B,YAAY,KAAK,QAAQ,OAAO,YAAY;AAAA,IAC5C,YAAY,KAAK,QAAQ,OAAO,YAAY;AAAA,IAC5C,UAAU,KAAK,QAAQ,OAAO,UAAU;AAAA,IACxC,aAAa,KAAK,QAAQ,OAAO,aAAa;AAAA,IAC9C,QAAQ,KAAK,QAAQ,QAAQ;AAAA,EAAA;AAAA,EAE/B,QAAQ;AAAA,IACN,QAAQ,QAAQ,QAAQ,OAAO,OAAO,IAAI,oBAAoB,CAAC;AAAA,EAAA;AAEnE;"}
@@ -1 +1 @@
1
- {"version":3,"file":"is-initialized.js","sources":["../../src/utils/is-initialized.ts"],"sourcesContent":["import { isEmpty, isNil } from 'lodash/fp';\n\nimport type { Strapi } from '@strapi/types';\n\n/**\n * Test if the strapi application is considered as initialized (1st user has been created)\n */\nexport default async function isInitialized(strapi: Strapi): Promise<boolean> {\n try {\n if (isEmpty(strapi.admin)) {\n return true;\n }\n\n // test if there is at least one admin\n const anyAdministrator = await strapi.query('admin::user').findOne({ select: ['id'] });\n\n return !isNil(anyAdministrator);\n } catch (err) {\n strapi.stopWithError(err);\n }\n}\n"],"names":["isEmpty","isNil"],"mappings":";;AAOA,eAA8B,cAAc,QAAkC;AACxE,MAAA;AACE,QAAAA,GAAA,QAAQ,OAAO,KAAK,GAAG;AAClB,aAAA;AAAA,IACT;AAGA,UAAM,mBAAmB,MAAM,OAAO,MAAM,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAG,CAAA;AAE9E,WAAA,CAACC,GAAAA,MAAM,gBAAgB;AAAA,WACvB,KAAK;AACZ,WAAO,cAAc,GAAG;AAAA,EAC1B;AACF;;"}
1
+ {"version":3,"file":"is-initialized.js","sources":["../../src/utils/is-initialized.ts"],"sourcesContent":["import { isEmpty, isNil } from 'lodash/fp';\n\nimport type { Strapi } from '@strapi/types';\n\n/**\n * Test if the strapi application is considered as initialized (1st user has been created)\n */\nexport default async function isInitialized(strapi: Strapi): Promise<boolean> {\n try {\n if (isEmpty(strapi.admin)) {\n return true;\n }\n\n // test if there is at least one admin\n const anyAdministrator = await strapi.query('admin::user').findOne({ select: ['id'] });\n\n return !isNil(anyAdministrator);\n } catch (err) {\n strapi.stopWithError(err);\n }\n}\n"],"names":["isEmpty","isNil"],"mappings":";;AAOA,eAA8B,cAAc,QAAkC;AAC5E,MAAI;AACF,QAAIA,GAAAA,QAAQ,OAAO,KAAK,GAAG;AACzB,aAAO;AAAA,IACT;AAGA,UAAM,mBAAmB,MAAM,OAAO,MAAM,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,GAAG;AAErF,WAAO,CAACC,GAAAA,MAAM,gBAAgB;AAAA,EAChC,SAAS,KAAK;AACZ,WAAO,cAAc,GAAG;AAAA,EAC1B;AACF;;"}