@strapi/core 5.48.1 → 5.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/dist/Strapi.js +9 -5
  2. package/dist/Strapi.js.map +1 -1
  3. package/dist/Strapi.mjs +0 -1
  4. package/dist/Strapi.mjs.map +1 -1
  5. package/dist/ai.d.ts +2 -0
  6. package/dist/ai.d.ts.map +1 -0
  7. package/dist/ai.js +8 -0
  8. package/dist/ai.js.map +1 -0
  9. package/dist/ai.mjs +3 -0
  10. package/dist/ai.mjs.map +1 -0
  11. package/dist/configuration/config-loader.js +11 -6
  12. package/dist/configuration/config-loader.js.map +1 -1
  13. package/dist/configuration/index.js +22 -15
  14. package/dist/configuration/index.js.map +1 -1
  15. package/dist/configuration/urls.js +11 -7
  16. package/dist/configuration/urls.js.map +1 -1
  17. package/dist/core-api/routes/index.js +3 -2
  18. package/dist/core-api/routes/index.js.map +1 -1
  19. package/dist/core-api/routes/validation/common.js +3 -2
  20. package/dist/core-api/routes/validation/common.js.map +1 -1
  21. package/dist/core-api/routes/validation/content-type.js +3 -2
  22. package/dist/core-api/routes/validation/content-type.js.map +1 -1
  23. package/dist/core-api/routes/validation/mappers.js +3 -2
  24. package/dist/core-api/routes/validation/mappers.js.map +1 -1
  25. package/dist/core-api/routes/validation/utils.js +3 -2
  26. package/dist/core-api/routes/validation/utils.js.map +1 -1
  27. package/dist/domain/content-type/index.js +9 -5
  28. package/dist/domain/content-type/index.js.map +1 -1
  29. package/dist/domain/content-type/validator.js +6 -2
  30. package/dist/domain/content-type/validator.js.map +1 -1
  31. package/dist/domain/module/index.js +6 -2
  32. package/dist/domain/module/index.js.map +1 -1
  33. package/dist/ee/license.js +8 -3
  34. package/dist/ee/license.js.map +1 -1
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +2 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/index.mjs +2 -0
  40. package/dist/index.mjs.map +1 -1
  41. package/dist/loaders/admin.js +5 -1
  42. package/dist/loaders/admin.js.map +1 -1
  43. package/dist/loaders/apis.js +16 -11
  44. package/dist/loaders/apis.js.map +1 -1
  45. package/dist/loaders/components.js +6 -2
  46. package/dist/loaders/components.js.map +1 -1
  47. package/dist/loaders/middlewares.js +6 -2
  48. package/dist/loaders/middlewares.js.map +1 -1
  49. package/dist/loaders/plugins/get-enabled-plugins.js +5 -1
  50. package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
  51. package/dist/loaders/plugins/get-user-plugins-config.js +6 -2
  52. package/dist/loaders/plugins/get-user-plugins-config.js.map +1 -1
  53. package/dist/loaders/plugins/index.js +8 -4
  54. package/dist/loaders/plugins/index.js.map +1 -1
  55. package/dist/loaders/policies.js +6 -2
  56. package/dist/loaders/policies.js.map +1 -1
  57. package/dist/mcp.d.ts +4 -0
  58. package/dist/mcp.d.ts.map +1 -0
  59. package/dist/mcp.js +12 -0
  60. package/dist/mcp.js.map +1 -0
  61. package/dist/mcp.mjs +4 -0
  62. package/dist/mcp.mjs.map +1 -0
  63. package/dist/middlewares/body.js +8 -3
  64. package/dist/middlewares/body.js.map +1 -1
  65. package/dist/middlewares/compression.js +5 -1
  66. package/dist/middlewares/compression.js.map +1 -1
  67. package/dist/middlewares/cors.js +5 -1
  68. package/dist/middlewares/cors.js.map +1 -1
  69. package/dist/middlewares/favicon.js +5 -1
  70. package/dist/middlewares/favicon.js.map +1 -1
  71. package/dist/middlewares/ip.js +5 -1
  72. package/dist/middlewares/ip.js.map +1 -1
  73. package/dist/middlewares/public.js +5 -1
  74. package/dist/middlewares/public.js.map +1 -1
  75. package/dist/middlewares/query.js +6 -2
  76. package/dist/middlewares/query.js.map +1 -1
  77. package/dist/middlewares/security.js +5 -1
  78. package/dist/middlewares/security.js.map +1 -1
  79. package/dist/migrations/database/5.0.0-discard-drafts.js +5 -1
  80. package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
  81. package/dist/migrations/first-published-at.js +5 -1
  82. package/dist/migrations/first-published-at.js.map +1 -1
  83. package/dist/package.json.js +15 -15
  84. package/dist/package.json.mjs +15 -15
  85. package/dist/registries/sanitizers.js +7 -3
  86. package/dist/registries/sanitizers.js.map +1 -1
  87. package/dist/registries/validators.js +7 -3
  88. package/dist/registries/validators.js.map +1 -1
  89. package/dist/services/auth/index.js +7 -3
  90. package/dist/services/auth/index.js.map +1 -1
  91. package/dist/services/content-api/index.js +10 -6
  92. package/dist/services/content-api/index.js.map +1 -1
  93. package/dist/services/content-api/permissions/engine.js +5 -1
  94. package/dist/services/content-api/permissions/engine.js.map +1 -1
  95. package/dist/services/content-api/permissions/index.js +10 -6
  96. package/dist/services/content-api/permissions/index.js.map +1 -1
  97. package/dist/services/document-service/attributes/transforms.js +5 -1
  98. package/dist/services/document-service/attributes/transforms.js.map +1 -1
  99. package/dist/services/document-service/components.d.ts.map +1 -1
  100. package/dist/services/document-service/components.js +14 -10
  101. package/dist/services/document-service/components.js.map +1 -1
  102. package/dist/services/document-service/components.mjs.map +1 -1
  103. package/dist/services/document-service/draft-and-publish.js +1 -1
  104. package/dist/services/document-service/draft-and-publish.js.map +1 -1
  105. package/dist/services/document-service/draft-and-publish.mjs +1 -1
  106. package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
  107. package/dist/services/document-service/entries.d.ts.map +1 -1
  108. package/dist/services/document-service/entries.js +6 -2
  109. package/dist/services/document-service/entries.js.map +1 -1
  110. package/dist/services/document-service/entries.mjs +7 -3
  111. package/dist/services/document-service/entries.mjs.map +1 -1
  112. package/dist/services/document-service/internationalization.js.map +1 -1
  113. package/dist/services/document-service/internationalization.mjs.map +1 -1
  114. package/dist/services/document-service/transform/data.d.ts +2 -0
  115. package/dist/services/document-service/transform/data.d.ts.map +1 -1
  116. package/dist/services/document-service/transform/data.js +7 -1
  117. package/dist/services/document-service/transform/data.js.map +1 -1
  118. package/dist/services/document-service/transform/data.mjs +7 -2
  119. package/dist/services/document-service/transform/data.mjs.map +1 -1
  120. package/dist/services/document-service/utils/populate.d.ts +1 -1
  121. package/dist/services/document-service/utils/populate.d.ts.map +1 -1
  122. package/dist/services/document-service/utils/populate.js.map +1 -1
  123. package/dist/services/document-service/utils/populate.mjs.map +1 -1
  124. package/dist/services/entity-service/index.js +9 -4
  125. package/dist/services/entity-service/index.js.map +1 -1
  126. package/dist/services/entity-validator/index.d.ts.map +1 -1
  127. package/dist/services/entity-validator/index.js +9 -4
  128. package/dist/services/entity-validator/index.js.map +1 -1
  129. package/dist/services/entity-validator/index.mjs.map +1 -1
  130. package/dist/services/entity-validator/validators.js +10 -6
  131. package/dist/services/entity-validator/validators.js.map +1 -1
  132. package/dist/services/errors.js +7 -3
  133. package/dist/services/errors.js.map +1 -1
  134. package/dist/services/fs.js +10 -5
  135. package/dist/services/fs.js.map +1 -1
  136. package/dist/services/mcp/prompt-registry.d.ts +31 -3
  137. package/dist/services/mcp/prompt-registry.d.ts.map +1 -1
  138. package/dist/services/mcp/prompt-registry.js +31 -0
  139. package/dist/services/mcp/prompt-registry.js.map +1 -1
  140. package/dist/services/mcp/prompt-registry.mjs +31 -1
  141. package/dist/services/mcp/prompt-registry.mjs.map +1 -1
  142. package/dist/services/mcp/resource-registry.d.ts +31 -1
  143. package/dist/services/mcp/resource-registry.d.ts.map +1 -1
  144. package/dist/services/mcp/resource-registry.js +31 -0
  145. package/dist/services/mcp/resource-registry.js.map +1 -1
  146. package/dist/services/mcp/resource-registry.mjs +31 -1
  147. package/dist/services/mcp/resource-registry.mjs.map +1 -1
  148. package/dist/services/mcp/tool-registry.d.ts +36 -9
  149. package/dist/services/mcp/tool-registry.d.ts.map +1 -1
  150. package/dist/services/mcp/tool-registry.js +35 -3
  151. package/dist/services/mcp/tool-registry.js.map +1 -1
  152. package/dist/services/mcp/tool-registry.mjs +35 -3
  153. package/dist/services/mcp/tool-registry.mjs.map +1 -1
  154. package/dist/services/mcp/tools/log.d.ts +15 -85
  155. package/dist/services/mcp/tools/log.d.ts.map +1 -1
  156. package/dist/services/metrics/admin-user-hash.js +5 -1
  157. package/dist/services/metrics/admin-user-hash.js.map +1 -1
  158. package/dist/services/metrics/is-truthy.js +5 -1
  159. package/dist/services/metrics/is-truthy.js.map +1 -1
  160. package/dist/services/metrics/sender.js +17 -9
  161. package/dist/services/metrics/sender.js.map +1 -1
  162. package/dist/services/server/api.js +5 -1
  163. package/dist/services/server/api.js.map +1 -1
  164. package/dist/services/server/compose-endpoint.js +5 -1
  165. package/dist/services/server/compose-endpoint.js.map +1 -1
  166. package/dist/services/server/http-server.js +5 -1
  167. package/dist/services/server/http-server.js.map +1 -1
  168. package/dist/services/server/index.js +5 -1
  169. package/dist/services/server/index.js.map +1 -1
  170. package/dist/services/server/koa.js +12 -5
  171. package/dist/services/server/koa.js.map +1 -1
  172. package/dist/services/server/middleware.js +5 -1
  173. package/dist/services/server/middleware.js.map +1 -1
  174. package/dist/services/server/openapi.js +11 -6
  175. package/dist/services/server/openapi.js.map +1 -1
  176. package/dist/services/server/register-routes.js +8 -4
  177. package/dist/services/server/register-routes.js.map +1 -1
  178. package/dist/services/server/routing.js +5 -1
  179. package/dist/services/server/routing.js.map +1 -1
  180. package/dist/services/session-manager.js +14 -9
  181. package/dist/services/session-manager.js.map +1 -1
  182. package/dist/services/webhook-runner.js +7 -2
  183. package/dist/services/webhook-runner.js.map +1 -1
  184. package/dist/services/worker-queue.js +5 -1
  185. package/dist/services/worker-queue.js.map +1 -1
  186. package/dist/utils/filepath-to-prop-path.js +13 -8
  187. package/dist/utils/filepath-to-prop-path.js.map +1 -1
  188. package/dist/utils/load-config-file.js +7 -2
  189. package/dist/utils/load-config-file.js.map +1 -1
  190. package/dist/utils/load-files.js +12 -6
  191. package/dist/utils/load-files.js.map +1 -1
  192. package/dist/utils/open-browser.js +5 -1
  193. package/dist/utils/open-browser.js.map +1 -1
  194. package/dist/utils/resolve-working-dirs.js +6 -2
  195. package/dist/utils/resolve-working-dirs.js.map +1 -1
  196. package/dist/utils/startup-logger.js +27 -21
  197. package/dist/utils/startup-logger.js.map +1 -1
  198. package/dist/utils/transform-content-types-to-models.js +10 -5
  199. package/dist/utils/transform-content-types-to-models.js.map +1 -1
  200. package/dist/utils/update-notifier/index.d.ts.map +1 -1
  201. package/dist/utils/update-notifier/index.js +21 -8
  202. package/dist/utils/update-notifier/index.js.map +1 -1
  203. package/dist/utils/update-notifier/index.mjs +6 -1
  204. package/dist/utils/update-notifier/index.mjs.map +1 -1
  205. package/package.json +15 -15
@@ -4,6 +4,11 @@ var crypto = require('crypto');
4
4
  var jwt = require('jsonwebtoken');
5
5
  var constants = require('../constants.js');
6
6
 
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var crypto__default = /*#__PURE__*/_interopDefault(crypto);
10
+ var jwt__default = /*#__PURE__*/_interopDefault(jwt);
11
+
7
12
  class DatabaseSessionProvider {
8
13
  async create(session) {
9
14
  const result = await this.db.query(this.contentType).create({
@@ -140,7 +145,7 @@ class SessionManager {
140
145
  }
141
146
  }
142
147
  generateSessionId() {
143
- return crypto.randomBytes(16).toString('hex');
148
+ return crypto__default.default.randomBytes(16).toString('hex');
144
149
  }
145
150
  async maybeCleanupExpired() {
146
151
  this.cleanupInvocationCounter += 1;
@@ -196,7 +201,7 @@ class SessionManager {
196
201
  // Filter out conflicting options that are already handled by the payload or used for key selection
197
202
  const jwtOptions = config.jwtOptions || {};
198
203
  const { expiresIn, privateKey, publicKey, ...jwtSignOptions } = jwtOptions;
199
- const token = jwt.sign(payload, jwtKey, {
204
+ const token = jwt__default.default.sign(payload, jwtKey, {
200
205
  algorithm,
201
206
  noTimestamp: true,
202
207
  ...jwtSignOptions
@@ -215,7 +220,7 @@ class SessionManager {
215
220
  const config = this.getConfigForOrigin(origin);
216
221
  const algorithm = config.algorithm || constants.DEFAULT_ALGORITHM;
217
222
  const jwtKey = this.getJwtKey(config, algorithm, 'verify');
218
- const payload = jwt.verify(token, jwtKey, {
223
+ const payload = jwt__default.default.verify(token, jwtKey, {
219
224
  algorithms: [
220
225
  algorithm
221
226
  ],
@@ -253,7 +258,7 @@ class SessionManager {
253
258
  ],
254
259
  ...config.jwtOptions
255
260
  };
256
- const payload = jwt.verify(token, jwtKey, verifyOptions);
261
+ const payload = jwt__default.default.verify(token, jwtKey, verifyOptions);
257
262
  if (payload.type !== 'refresh') {
258
263
  return {
259
264
  isValid: false
@@ -294,7 +299,7 @@ class SessionManager {
294
299
  sessionId: payload.sessionId
295
300
  };
296
301
  } catch (error) {
297
- if (error instanceof jwt.JsonWebTokenError) {
302
+ if (error instanceof jwt__default.default.JsonWebTokenError) {
298
303
  return {
299
304
  isValid: false
300
305
  };
@@ -330,7 +335,7 @@ class SessionManager {
330
335
  // Filter out conflicting options that are already handled by the payload or used for key selection
331
336
  const jwtOptions = config.jwtOptions || {};
332
337
  const { expiresIn, privateKey, publicKey, ...jwtSignOptions } = jwtOptions;
333
- const token = jwt.sign(payload, jwtKey, {
338
+ const token = jwt__default.default.sign(payload, jwtKey, {
334
339
  algorithm,
335
340
  expiresIn: config.accessTokenLifespan,
336
341
  ...jwtSignOptions
@@ -347,7 +352,7 @@ class SessionManager {
347
352
  const config = this.getConfigForOrigin(origin);
348
353
  const algorithm = config.algorithm || constants.DEFAULT_ALGORITHM;
349
354
  const jwtKey = this.getJwtKey(config, algorithm, 'verify');
350
- const payload = jwt.verify(refreshToken, jwtKey, {
355
+ const payload = jwt__default.default.verify(refreshToken, jwtKey, {
351
356
  algorithms: [
352
357
  algorithm
353
358
  ],
@@ -379,7 +384,7 @@ class SessionManager {
379
384
  };
380
385
  // Filter out conflicting options that are already handled by the payload
381
386
  const { expiresIn, ...jwtSignOptions } = config.jwtOptions || {};
382
- const childToken = jwt.sign(childPayload, jwtKey, {
387
+ const childToken = jwt__default.default.sign(childPayload, jwtKey, {
383
388
  algorithm,
384
389
  noTimestamp: true,
385
390
  ...jwtSignOptions
@@ -441,7 +446,7 @@ class SessionManager {
441
446
  };
442
447
  // Filter out conflicting options that are already handled by the payload
443
448
  const { expiresIn, ...jwtSignOptions } = config.jwtOptions || {};
444
- const childToken = jwt.sign(payloadOut, jwtKey, {
449
+ const childToken = jwt__default.default.sign(payloadOut, jwtKey, {
445
450
  algorithm,
446
451
  noTimestamp: true,
447
452
  ...jwtSignOptions
@@ -1 +1 @@
1
- {"version":3,"file":"session-manager.js","sources":["../../src/services/session-manager.ts"],"sourcesContent":["import crypto from 'crypto';\nimport jwt from 'jsonwebtoken';\nimport type { VerifyOptions, Algorithm } from 'jsonwebtoken';\nimport type { Database } from '@strapi/database';\nimport { DEFAULT_ALGORITHM } from '../constants';\n\nexport interface SessionProvider {\n create(session: SessionData): Promise<SessionData>;\n findBySessionId(sessionId: string): Promise<SessionData | null>;\n updateBySessionId(sessionId: string, data: Partial<SessionData>): Promise<void>;\n deleteBySessionId(sessionId: string): Promise<void>;\n deleteExpired(): Promise<void>;\n deleteBy(criteria: { userId?: string; origin?: string; deviceId?: string }): Promise<void>;\n}\n\nexport interface SessionData {\n id?: string;\n userId: string; // User ID stored as string (key-value store)\n sessionId: string;\n deviceId?: string; // Optional for origins that don't need device tracking\n origin: string;\n childId?: string | null;\n\n type?: 'refresh' | 'session';\n status?: 'active' | 'rotated' | 'revoked';\n expiresAt: Date;\n absoluteExpiresAt?: Date | null;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nexport interface RefreshTokenPayload {\n userId: string;\n sessionId: string;\n type: 'refresh';\n exp: number;\n iat: number;\n}\n\nexport interface AccessTokenPayload {\n userId: string;\n sessionId: string;\n type: 'access';\n exp: number;\n iat: number;\n}\n\nexport type TokenPayload = RefreshTokenPayload | AccessTokenPayload;\n\nexport interface ValidateRefreshTokenResult {\n isValid: boolean;\n userId?: string;\n sessionId?: string;\n error?:\n | 'invalid_token'\n | 'token_expired'\n | 'session_not_found'\n | 'session_expired'\n | 'wrong_token_type';\n}\n\nclass DatabaseSessionProvider implements SessionProvider {\n private db: Database;\n\n private contentType: string;\n\n constructor(db: Database, contentType: string) {\n this.db = db;\n this.contentType = contentType;\n }\n\n async create(session: SessionData): Promise<SessionData> {\n const result = await this.db.query(this.contentType).create({\n data: session,\n });\n return result as SessionData;\n }\n\n async findBySessionId(sessionId: string): Promise<SessionData | null> {\n const result = await this.db.query(this.contentType).findOne({\n where: { sessionId },\n });\n return result as SessionData | null;\n }\n\n async updateBySessionId(sessionId: string, data: Partial<SessionData>): Promise<void> {\n await this.db.query(this.contentType).update({ where: { sessionId }, data });\n }\n\n async deleteBySessionId(sessionId: string): Promise<void> {\n await this.db.query(this.contentType).delete({\n where: { sessionId },\n });\n }\n\n async deleteExpired(): Promise<void> {\n await this.db.query(this.contentType).deleteMany({\n where: { absoluteExpiresAt: { $lt: new Date() } },\n });\n }\n\n async deleteBy(criteria: { userId?: string; origin?: string; deviceId?: string }): Promise<void> {\n await this.db.query(this.contentType).deleteMany({\n where: {\n ...(criteria.userId ? { userId: criteria.userId } : {}),\n ...(criteria.origin ? { origin: criteria.origin } : {}),\n ...(criteria.deviceId ? { deviceId: criteria.deviceId } : {}),\n },\n });\n }\n}\n\nexport interface SessionManagerConfig {\n jwtSecret?: string;\n accessTokenLifespan: number;\n maxRefreshTokenLifespan: number;\n idleRefreshTokenLifespan: number;\n maxSessionLifespan: number;\n idleSessionLifespan: number;\n algorithm?: Algorithm;\n jwtOptions?: Record<string, unknown>;\n}\n\nclass OriginSessionManager {\n constructor(\n private sessionManager: SessionManager,\n private origin: string\n ) {}\n\n async generateRefreshToken(\n userId: string,\n deviceId: string | undefined,\n options?: { type?: 'refresh' | 'session' }\n ): Promise<{ token: string; sessionId: string; absoluteExpiresAt: string }> {\n return this.sessionManager.generateRefreshToken(userId, deviceId, this.origin, options);\n }\n\n async generateAccessToken(refreshToken: string): Promise<{ token: string } | { error: string }> {\n return this.sessionManager.generateAccessToken(refreshToken, this.origin);\n }\n\n async rotateRefreshToken(refreshToken: string): Promise<\n | {\n token: string;\n sessionId: string;\n absoluteExpiresAt: string;\n type: 'refresh' | 'session';\n }\n | { error: string }\n > {\n return this.sessionManager.rotateRefreshToken(refreshToken, this.origin);\n }\n\n validateAccessToken(\n token: string\n ): { isValid: true; payload: AccessTokenPayload } | { isValid: false; payload: null } {\n return this.sessionManager.validateAccessToken(token, this.origin);\n }\n\n async validateRefreshToken(token: string): Promise<ValidateRefreshTokenResult> {\n return this.sessionManager.validateRefreshToken(token, this.origin);\n }\n\n async invalidateRefreshToken(userId: string, deviceId?: string): Promise<void> {\n return this.sessionManager.invalidateRefreshToken(this.origin, userId, deviceId);\n }\n\n /**\n * Returns true when a session exists and is not expired for this origin.\n * If the session exists but is expired, it will be deleted as part of this check.\n */\n async isSessionActive(sessionId: string): Promise<boolean> {\n return this.sessionManager.isSessionActive(sessionId, this.origin);\n }\n}\n\nclass SessionManager {\n private provider: SessionProvider;\n\n // Store origin-specific configurations\n private originConfigs: Map<string, SessionManagerConfig> = new Map();\n\n // Run expired cleanup only every N calls to avoid extra queries\n private cleanupInvocationCounter: number = 0;\n\n private readonly cleanupEveryCalls: number = 50;\n\n constructor(provider: SessionProvider) {\n this.provider = provider;\n }\n\n /**\n * Define configuration for a specific origin\n */\n defineOrigin(origin: string, config: SessionManagerConfig): void {\n this.originConfigs.set(origin, config);\n }\n\n /**\n * Check if an origin is defined\n */\n hasOrigin(origin: string): boolean {\n return this.originConfigs.has(origin);\n }\n\n /**\n * Get configuration for a specific origin, throw error if not defined\n */\n private getConfigForOrigin(origin: string): SessionManagerConfig {\n const originConfig = this.originConfigs.get(origin);\n if (originConfig) {\n return originConfig;\n }\n throw new Error(\n `SessionManager: Origin '${origin}' is not defined. Please define it using defineOrigin('${origin}', config).`\n );\n }\n\n /**\n * Get the appropriate JWT key based on the algorithm\n */\n private getJwtKey(\n config: SessionManagerConfig,\n algorithm: Algorithm,\n operation: 'sign' | 'verify'\n ): string {\n const isAsymmetric =\n algorithm.startsWith('RS') || algorithm.startsWith('ES') || algorithm.startsWith('PS');\n\n if (isAsymmetric) {\n // For asymmetric algorithms, check if user has provided proper key configuration\n if (operation === 'sign') {\n const privateKey = config.jwtOptions?.privateKey as string;\n if (privateKey) {\n return privateKey;\n }\n throw new Error(\n `SessionManager: Private key is required for asymmetric algorithm ${algorithm}. Please configure admin.auth.options.privateKey.`\n );\n } else {\n const publicKey = config.jwtOptions?.publicKey as string;\n if (publicKey) {\n return publicKey;\n }\n throw new Error(\n `SessionManager: Public key is required for asymmetric algorithm ${algorithm}. Please configure admin.auth.options.publicKey.`\n );\n }\n } else {\n if (!config.jwtSecret) {\n throw new Error(\n `SessionManager: Secret key is required for symmetric algorithm ${algorithm}`\n );\n }\n return config.jwtSecret;\n }\n }\n\n generateSessionId(): string {\n return crypto.randomBytes(16).toString('hex');\n }\n\n private async maybeCleanupExpired(): Promise<void> {\n this.cleanupInvocationCounter += 1;\n if (this.cleanupInvocationCounter >= this.cleanupEveryCalls) {\n this.cleanupInvocationCounter = 0;\n\n await this.provider.deleteExpired();\n }\n }\n\n /**\n * Get the cleanup every calls threshold\n */\n get cleanupThreshold(): number {\n return this.cleanupEveryCalls;\n }\n\n async generateRefreshToken(\n userId: string,\n deviceId: string | undefined,\n origin: string,\n options?: { type?: 'refresh' | 'session' }\n ): Promise<{ token: string; sessionId: string; absoluteExpiresAt: string }> {\n if (!origin || typeof origin !== 'string') {\n throw new Error(\n 'SessionManager: Origin parameter is required and must be a non-empty string'\n );\n }\n\n await this.maybeCleanupExpired();\n\n const config = this.getConfigForOrigin(origin);\n const algorithm = config.algorithm || DEFAULT_ALGORITHM;\n const jwtKey = this.getJwtKey(config, algorithm, 'sign');\n const sessionId = this.generateSessionId();\n const tokenType = options?.type ?? 'refresh';\n const isRefresh = tokenType === 'refresh';\n\n const idleLifespan = isRefresh ? config.idleRefreshTokenLifespan : config.idleSessionLifespan;\n\n const maxLifespan = isRefresh ? config.maxRefreshTokenLifespan : config.maxSessionLifespan;\n\n const now = Date.now();\n const expiresAt = new Date(now + idleLifespan * 1000);\n const absoluteExpiresAt = new Date(now + maxLifespan * 1000);\n\n // Create the root record first so createdAt can be used for signing.\n const record = await this.provider.create({\n userId,\n sessionId,\n ...(deviceId && { deviceId }),\n origin,\n childId: null,\n type: tokenType,\n status: 'active',\n expiresAt,\n absoluteExpiresAt,\n });\n\n const issuedAtSeconds = Math.floor(new Date(record.createdAt ?? new Date()).getTime() / 1000);\n const expiresAtSeconds = Math.floor(new Date(record.expiresAt).getTime() / 1000);\n\n const payload: RefreshTokenPayload = {\n userId,\n sessionId,\n type: 'refresh',\n iat: issuedAtSeconds,\n exp: expiresAtSeconds,\n };\n\n // Filter out conflicting options that are already handled by the payload or used for key selection\n const jwtOptions = config.jwtOptions || {};\n const { expiresIn, privateKey, publicKey, ...jwtSignOptions } = jwtOptions;\n\n const token = jwt.sign(payload, jwtKey, {\n algorithm,\n noTimestamp: true,\n ...jwtSignOptions,\n });\n\n return {\n token,\n sessionId,\n absoluteExpiresAt: absoluteExpiresAt.toISOString(),\n };\n }\n\n validateAccessToken(\n token: string,\n origin: string\n ): { isValid: true; payload: AccessTokenPayload } | { isValid: false; payload: null } {\n if (!origin || typeof origin !== 'string') {\n throw new Error(\n 'SessionManager: Origin parameter is required and must be a non-empty string'\n );\n }\n\n try {\n const config = this.getConfigForOrigin(origin);\n const algorithm = config.algorithm || DEFAULT_ALGORITHM;\n const jwtKey = this.getJwtKey(config, algorithm, 'verify');\n const payload = jwt.verify(token, jwtKey, {\n algorithms: [algorithm],\n ...config.jwtOptions,\n }) as TokenPayload;\n\n // Ensure this is an access token\n if (!payload || payload.type !== 'access') {\n return { isValid: false, payload: null };\n }\n\n return { isValid: true, payload };\n } catch (err) {\n return { isValid: false, payload: null };\n }\n }\n\n async validateRefreshToken(token: string, origin: string): Promise<ValidateRefreshTokenResult> {\n if (!origin || typeof origin !== 'string') {\n throw new Error(\n 'SessionManager: Origin parameter is required and must be a non-empty string'\n );\n }\n\n try {\n const config = this.getConfigForOrigin(origin);\n const algorithm = config.algorithm || DEFAULT_ALGORITHM;\n const jwtKey = this.getJwtKey(config, algorithm, 'verify');\n const verifyOptions: VerifyOptions = {\n algorithms: [algorithm],\n ...config.jwtOptions,\n };\n\n const payload = jwt.verify(token, jwtKey, verifyOptions) as RefreshTokenPayload;\n\n if (payload.type !== 'refresh') {\n return { isValid: false };\n }\n\n const session = await this.provider.findBySessionId(payload.sessionId);\n if (!session) {\n return { isValid: false };\n }\n\n const now = new Date();\n if (new Date(session.expiresAt) <= now) {\n return { isValid: false };\n }\n\n // Absolute family expiry check\n if (session.absoluteExpiresAt && new Date(session.absoluteExpiresAt) <= now) {\n return { isValid: false };\n }\n\n // Only 'active' sessions are eligible to create access tokens.\n if (session.status !== 'active') {\n return { isValid: false };\n }\n\n if (session.userId !== payload.userId) {\n return { isValid: false };\n }\n\n return {\n isValid: true,\n userId: payload.userId,\n sessionId: payload.sessionId,\n };\n } catch (error: any) {\n if (error instanceof jwt.JsonWebTokenError) {\n return { isValid: false };\n }\n\n throw error;\n }\n }\n\n async invalidateRefreshToken(origin: string, userId: string, deviceId?: string): Promise<void> {\n await this.provider.deleteBy({ userId, origin, deviceId });\n }\n\n async generateAccessToken(\n refreshToken: string,\n origin: string\n ): Promise<{ token: string } | { error: string }> {\n if (!origin || typeof origin !== 'string') {\n throw new Error(\n 'SessionManager: Origin parameter is required and must be a non-empty string'\n );\n }\n\n const validation = await this.validateRefreshToken(refreshToken, origin);\n\n if (!validation.isValid) {\n return { error: 'invalid_refresh_token' };\n }\n\n const payload: Omit<AccessTokenPayload, 'iat' | 'exp'> = {\n userId: String(validation.userId!),\n sessionId: validation.sessionId!,\n type: 'access',\n };\n\n const config = this.getConfigForOrigin(origin);\n const algorithm = config.algorithm || DEFAULT_ALGORITHM;\n const jwtKey = this.getJwtKey(config, algorithm, 'sign');\n // Filter out conflicting options that are already handled by the payload or used for key selection\n const jwtOptions = config.jwtOptions || {};\n const { expiresIn, privateKey, publicKey, ...jwtSignOptions } = jwtOptions;\n\n const token = jwt.sign(payload, jwtKey, {\n algorithm,\n expiresIn: config.accessTokenLifespan,\n ...jwtSignOptions,\n });\n\n return { token };\n }\n\n async rotateRefreshToken(\n refreshToken: string,\n origin: string\n ): Promise<\n | {\n token: string;\n sessionId: string;\n absoluteExpiresAt: string;\n type: 'refresh' | 'session';\n }\n | { error: string }\n > {\n if (!origin || typeof origin !== 'string') {\n throw new Error(\n 'SessionManager: Origin parameter is required and must be a non-empty string'\n );\n }\n\n try {\n const config = this.getConfigForOrigin(origin);\n const algorithm = config.algorithm || DEFAULT_ALGORITHM;\n const jwtKey = this.getJwtKey(config, algorithm, 'verify');\n const payload = jwt.verify(refreshToken, jwtKey, {\n algorithms: [algorithm],\n ...config.jwtOptions,\n }) as RefreshTokenPayload;\n\n if (!payload || payload.type !== 'refresh') {\n return { error: 'invalid_refresh_token' };\n }\n\n const current = await this.provider.findBySessionId(payload.sessionId);\n if (!current) {\n return { error: 'invalid_refresh_token' };\n }\n\n // If parent already has a child, return the same child token\n if (current.childId) {\n const child = await this.provider.findBySessionId(current.childId);\n\n if (child) {\n const childIat = Math.floor(new Date(child.createdAt ?? new Date()).getTime() / 1000);\n const childExp = Math.floor(new Date(child.expiresAt).getTime() / 1000);\n\n const childPayload: RefreshTokenPayload = {\n userId: child.userId,\n sessionId: child.sessionId,\n type: 'refresh',\n iat: childIat,\n exp: childExp,\n };\n\n // Filter out conflicting options that are already handled by the payload\n const { expiresIn, ...jwtSignOptions } = config.jwtOptions || {};\n\n const childToken = jwt.sign(childPayload, jwtKey, {\n algorithm,\n noTimestamp: true,\n ...jwtSignOptions,\n });\n\n let absoluteExpiresAt;\n if (child.absoluteExpiresAt) {\n absoluteExpiresAt =\n typeof child.absoluteExpiresAt === 'string'\n ? child.absoluteExpiresAt\n : child.absoluteExpiresAt.toISOString();\n } else {\n absoluteExpiresAt = new Date(0).toISOString();\n }\n\n return {\n token: childToken,\n sessionId: child.sessionId,\n absoluteExpiresAt,\n type: child.type ?? 'refresh',\n };\n }\n }\n\n const now = Date.now();\n const tokenType = current.type ?? 'refresh';\n const idleLifespan =\n tokenType === 'refresh' ? config.idleRefreshTokenLifespan : config.idleSessionLifespan;\n\n // Enforce idle window since creation of the current token\n if (current.createdAt && now - new Date(current.createdAt).getTime() > idleLifespan * 1000) {\n return { error: 'idle_window_elapsed' };\n }\n\n // Enforce max family window using absoluteExpiresAt\n const absolute = current.absoluteExpiresAt\n ? new Date(current.absoluteExpiresAt).getTime()\n : now;\n if (absolute <= now) {\n return { error: 'max_window_elapsed' };\n }\n\n // Create child token\n const childSessionId = this.generateSessionId();\n const childExpiresAt = new Date(now + idleLifespan * 1000);\n\n const childRecord = await this.provider.create({\n userId: current.userId,\n sessionId: childSessionId,\n ...(current.deviceId && { deviceId: current.deviceId }),\n origin: current.origin,\n childId: null,\n type: tokenType,\n status: 'active',\n expiresAt: childExpiresAt,\n absoluteExpiresAt: current.absoluteExpiresAt ?? new Date(absolute),\n });\n\n const childIat = Math.floor(new Date(childRecord.createdAt ?? new Date()).getTime() / 1000);\n const childExp = Math.floor(new Date(childRecord.expiresAt).getTime() / 1000);\n const payloadOut: RefreshTokenPayload = {\n userId: current.userId,\n sessionId: childSessionId,\n type: 'refresh',\n iat: childIat,\n exp: childExp,\n };\n // Filter out conflicting options that are already handled by the payload\n const { expiresIn, ...jwtSignOptions } = config.jwtOptions || {};\n\n const childToken = jwt.sign(payloadOut, jwtKey, {\n algorithm,\n noTimestamp: true,\n ...jwtSignOptions,\n });\n\n await this.provider.updateBySessionId(current.sessionId, {\n status: 'rotated',\n childId: childSessionId,\n });\n\n let absoluteExpiresAt;\n if (childRecord.absoluteExpiresAt) {\n absoluteExpiresAt =\n typeof childRecord.absoluteExpiresAt === 'string'\n ? childRecord.absoluteExpiresAt\n : childRecord.absoluteExpiresAt.toISOString();\n } else {\n absoluteExpiresAt = new Date(absolute).toISOString();\n }\n\n return {\n token: childToken,\n sessionId: childSessionId,\n absoluteExpiresAt,\n type: tokenType,\n };\n } catch {\n return { error: 'invalid_refresh_token' };\n }\n }\n\n /**\n * Returns true when a session exists and is not expired.\n * If the session exists but is expired, it will be deleted as part of this check.\n */\n async isSessionActive(sessionId: string, origin: string): Promise<boolean> {\n const session = await this.provider.findBySessionId(sessionId);\n if (!session) {\n return false;\n }\n\n if (session.origin !== origin) {\n return false;\n }\n\n if (new Date(session.expiresAt) <= new Date()) {\n // Clean up expired session eagerly\n await this.provider.deleteBySessionId(sessionId);\n\n return false;\n }\n\n return true;\n }\n}\n\nconst createDatabaseProvider = (db: Database, contentType: string): SessionProvider => {\n return new DatabaseSessionProvider(db, contentType);\n};\n\nconst createSessionManager = ({\n db,\n}: {\n db: Database;\n}): SessionManager & ((origin: string) => OriginSessionManager) => {\n const provider = createDatabaseProvider(db, 'admin::session');\n const sessionManager = new SessionManager(provider);\n\n // Add callable functionality\n const fluentApi = (origin: string): OriginSessionManager => {\n if (!origin || typeof origin !== 'string') {\n throw new Error(\n 'SessionManager: Origin parameter is required and must be a non-empty string'\n );\n }\n return new OriginSessionManager(sessionManager, origin);\n };\n\n // Attach only the public SessionManagerService API to the callable\n const api = fluentApi as unknown as any;\n api.generateSessionId = sessionManager.generateSessionId.bind(sessionManager);\n api.defineOrigin = sessionManager.defineOrigin.bind(sessionManager);\n api.hasOrigin = sessionManager.hasOrigin.bind(sessionManager);\n // Note: isSessionActive is origin-scoped and exposed on OriginSessionManager only\n\n // Forward the cleanupThreshold getter (used in tests)\n Object.defineProperty(api, 'cleanupThreshold', {\n get() {\n return sessionManager.cleanupThreshold;\n },\n enumerable: true,\n });\n\n return api as SessionManager & ((origin: string) => OriginSessionManager);\n};\n\nexport { createSessionManager, createDatabaseProvider };\n"],"names":["DatabaseSessionProvider","create","session","result","db","query","contentType","data","findBySessionId","sessionId","findOne","where","updateBySessionId","update","deleteBySessionId","delete","deleteExpired","deleteMany","absoluteExpiresAt","$lt","Date","deleteBy","criteria","userId","origin","deviceId","OriginSessionManager","generateRefreshToken","options","sessionManager","generateAccessToken","refreshToken","rotateRefreshToken","validateAccessToken","token","validateRefreshToken","invalidateRefreshToken","isSessionActive","SessionManager","defineOrigin","config","originConfigs","set","hasOrigin","has","getConfigForOrigin","originConfig","get","Error","getJwtKey","algorithm","operation","isAsymmetric","startsWith","privateKey","jwtOptions","publicKey","jwtSecret","generateSessionId","crypto","randomBytes","toString","maybeCleanupExpired","cleanupInvocationCounter","cleanupEveryCalls","provider","cleanupThreshold","DEFAULT_ALGORITHM","jwtKey","tokenType","type","isRefresh","idleLifespan","idleRefreshTokenLifespan","idleSessionLifespan","maxLifespan","maxRefreshTokenLifespan","maxSessionLifespan","now","expiresAt","record","childId","status","issuedAtSeconds","Math","floor","createdAt","getTime","expiresAtSeconds","payload","iat","exp","expiresIn","jwtSignOptions","jwt","sign","noTimestamp","toISOString","verify","algorithms","isValid","err","verifyOptions","error","JsonWebTokenError","validation","String","accessTokenLifespan","current","child","childIat","childExp","childPayload","childToken","absolute","childSessionId","childExpiresAt","childRecord","payloadOut","Map","createDatabaseProvider","createSessionManager","fluentApi","api","bind","Object","defineProperty","enumerable"],"mappings":"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"}
1
+ {"version":3,"file":"session-manager.js","sources":["../../src/services/session-manager.ts"],"sourcesContent":["import crypto from 'crypto';\nimport jwt from 'jsonwebtoken';\nimport type { VerifyOptions, Algorithm } from 'jsonwebtoken';\nimport type { Database } from '@strapi/database';\nimport { DEFAULT_ALGORITHM } from '../constants';\n\nexport interface SessionProvider {\n create(session: SessionData): Promise<SessionData>;\n findBySessionId(sessionId: string): Promise<SessionData | null>;\n updateBySessionId(sessionId: string, data: Partial<SessionData>): Promise<void>;\n deleteBySessionId(sessionId: string): Promise<void>;\n deleteExpired(): Promise<void>;\n deleteBy(criteria: { userId?: string; origin?: string; deviceId?: string }): Promise<void>;\n}\n\nexport interface SessionData {\n id?: string;\n userId: string; // User ID stored as string (key-value store)\n sessionId: string;\n deviceId?: string; // Optional for origins that don't need device tracking\n origin: string;\n childId?: string | null;\n\n type?: 'refresh' | 'session';\n status?: 'active' | 'rotated' | 'revoked';\n expiresAt: Date;\n absoluteExpiresAt?: Date | null;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nexport interface RefreshTokenPayload {\n userId: string;\n sessionId: string;\n type: 'refresh';\n exp: number;\n iat: number;\n}\n\nexport interface AccessTokenPayload {\n userId: string;\n sessionId: string;\n type: 'access';\n exp: number;\n iat: number;\n}\n\nexport type TokenPayload = RefreshTokenPayload | AccessTokenPayload;\n\nexport interface ValidateRefreshTokenResult {\n isValid: boolean;\n userId?: string;\n sessionId?: string;\n error?:\n | 'invalid_token'\n | 'token_expired'\n | 'session_not_found'\n | 'session_expired'\n | 'wrong_token_type';\n}\n\nclass DatabaseSessionProvider implements SessionProvider {\n private db: Database;\n\n private contentType: string;\n\n constructor(db: Database, contentType: string) {\n this.db = db;\n this.contentType = contentType;\n }\n\n async create(session: SessionData): Promise<SessionData> {\n const result = await this.db.query(this.contentType).create({\n data: session,\n });\n return result as SessionData;\n }\n\n async findBySessionId(sessionId: string): Promise<SessionData | null> {\n const result = await this.db.query(this.contentType).findOne({\n where: { sessionId },\n });\n return result as SessionData | null;\n }\n\n async updateBySessionId(sessionId: string, data: Partial<SessionData>): Promise<void> {\n await this.db.query(this.contentType).update({ where: { sessionId }, data });\n }\n\n async deleteBySessionId(sessionId: string): Promise<void> {\n await this.db.query(this.contentType).delete({\n where: { sessionId },\n });\n }\n\n async deleteExpired(): Promise<void> {\n await this.db.query(this.contentType).deleteMany({\n where: { absoluteExpiresAt: { $lt: new Date() } },\n });\n }\n\n async deleteBy(criteria: { userId?: string; origin?: string; deviceId?: string }): Promise<void> {\n await this.db.query(this.contentType).deleteMany({\n where: {\n ...(criteria.userId ? { userId: criteria.userId } : {}),\n ...(criteria.origin ? { origin: criteria.origin } : {}),\n ...(criteria.deviceId ? { deviceId: criteria.deviceId } : {}),\n },\n });\n }\n}\n\nexport interface SessionManagerConfig {\n jwtSecret?: string;\n accessTokenLifespan: number;\n maxRefreshTokenLifespan: number;\n idleRefreshTokenLifespan: number;\n maxSessionLifespan: number;\n idleSessionLifespan: number;\n algorithm?: Algorithm;\n jwtOptions?: Record<string, unknown>;\n}\n\nclass OriginSessionManager {\n constructor(\n private sessionManager: SessionManager,\n private origin: string\n ) {}\n\n async generateRefreshToken(\n userId: string,\n deviceId: string | undefined,\n options?: { type?: 'refresh' | 'session' }\n ): Promise<{ token: string; sessionId: string; absoluteExpiresAt: string }> {\n return this.sessionManager.generateRefreshToken(userId, deviceId, this.origin, options);\n }\n\n async generateAccessToken(refreshToken: string): Promise<{ token: string } | { error: string }> {\n return this.sessionManager.generateAccessToken(refreshToken, this.origin);\n }\n\n async rotateRefreshToken(refreshToken: string): Promise<\n | {\n token: string;\n sessionId: string;\n absoluteExpiresAt: string;\n type: 'refresh' | 'session';\n }\n | { error: string }\n > {\n return this.sessionManager.rotateRefreshToken(refreshToken, this.origin);\n }\n\n validateAccessToken(\n token: string\n ): { isValid: true; payload: AccessTokenPayload } | { isValid: false; payload: null } {\n return this.sessionManager.validateAccessToken(token, this.origin);\n }\n\n async validateRefreshToken(token: string): Promise<ValidateRefreshTokenResult> {\n return this.sessionManager.validateRefreshToken(token, this.origin);\n }\n\n async invalidateRefreshToken(userId: string, deviceId?: string): Promise<void> {\n return this.sessionManager.invalidateRefreshToken(this.origin, userId, deviceId);\n }\n\n /**\n * Returns true when a session exists and is not expired for this origin.\n * If the session exists but is expired, it will be deleted as part of this check.\n */\n async isSessionActive(sessionId: string): Promise<boolean> {\n return this.sessionManager.isSessionActive(sessionId, this.origin);\n }\n}\n\nclass SessionManager {\n private provider: SessionProvider;\n\n // Store origin-specific configurations\n private originConfigs: Map<string, SessionManagerConfig> = new Map();\n\n // Run expired cleanup only every N calls to avoid extra queries\n private cleanupInvocationCounter: number = 0;\n\n private readonly cleanupEveryCalls: number = 50;\n\n constructor(provider: SessionProvider) {\n this.provider = provider;\n }\n\n /**\n * Define configuration for a specific origin\n */\n defineOrigin(origin: string, config: SessionManagerConfig): void {\n this.originConfigs.set(origin, config);\n }\n\n /**\n * Check if an origin is defined\n */\n hasOrigin(origin: string): boolean {\n return this.originConfigs.has(origin);\n }\n\n /**\n * Get configuration for a specific origin, throw error if not defined\n */\n private getConfigForOrigin(origin: string): SessionManagerConfig {\n const originConfig = this.originConfigs.get(origin);\n if (originConfig) {\n return originConfig;\n }\n throw new Error(\n `SessionManager: Origin '${origin}' is not defined. Please define it using defineOrigin('${origin}', config).`\n );\n }\n\n /**\n * Get the appropriate JWT key based on the algorithm\n */\n private getJwtKey(\n config: SessionManagerConfig,\n algorithm: Algorithm,\n operation: 'sign' | 'verify'\n ): string {\n const isAsymmetric =\n algorithm.startsWith('RS') || algorithm.startsWith('ES') || algorithm.startsWith('PS');\n\n if (isAsymmetric) {\n // For asymmetric algorithms, check if user has provided proper key configuration\n if (operation === 'sign') {\n const privateKey = config.jwtOptions?.privateKey as string;\n if (privateKey) {\n return privateKey;\n }\n throw new Error(\n `SessionManager: Private key is required for asymmetric algorithm ${algorithm}. Please configure admin.auth.options.privateKey.`\n );\n } else {\n const publicKey = config.jwtOptions?.publicKey as string;\n if (publicKey) {\n return publicKey;\n }\n throw new Error(\n `SessionManager: Public key is required for asymmetric algorithm ${algorithm}. Please configure admin.auth.options.publicKey.`\n );\n }\n } else {\n if (!config.jwtSecret) {\n throw new Error(\n `SessionManager: Secret key is required for symmetric algorithm ${algorithm}`\n );\n }\n return config.jwtSecret;\n }\n }\n\n generateSessionId(): string {\n return crypto.randomBytes(16).toString('hex');\n }\n\n private async maybeCleanupExpired(): Promise<void> {\n this.cleanupInvocationCounter += 1;\n if (this.cleanupInvocationCounter >= this.cleanupEveryCalls) {\n this.cleanupInvocationCounter = 0;\n\n await this.provider.deleteExpired();\n }\n }\n\n /**\n * Get the cleanup every calls threshold\n */\n get cleanupThreshold(): number {\n return this.cleanupEveryCalls;\n }\n\n async generateRefreshToken(\n userId: string,\n deviceId: string | undefined,\n origin: string,\n options?: { type?: 'refresh' | 'session' }\n ): Promise<{ token: string; sessionId: string; absoluteExpiresAt: string }> {\n if (!origin || typeof origin !== 'string') {\n throw new Error(\n 'SessionManager: Origin parameter is required and must be a non-empty string'\n );\n }\n\n await this.maybeCleanupExpired();\n\n const config = this.getConfigForOrigin(origin);\n const algorithm = config.algorithm || DEFAULT_ALGORITHM;\n const jwtKey = this.getJwtKey(config, algorithm, 'sign');\n const sessionId = this.generateSessionId();\n const tokenType = options?.type ?? 'refresh';\n const isRefresh = tokenType === 'refresh';\n\n const idleLifespan = isRefresh ? config.idleRefreshTokenLifespan : config.idleSessionLifespan;\n\n const maxLifespan = isRefresh ? config.maxRefreshTokenLifespan : config.maxSessionLifespan;\n\n const now = Date.now();\n const expiresAt = new Date(now + idleLifespan * 1000);\n const absoluteExpiresAt = new Date(now + maxLifespan * 1000);\n\n // Create the root record first so createdAt can be used for signing.\n const record = await this.provider.create({\n userId,\n sessionId,\n ...(deviceId && { deviceId }),\n origin,\n childId: null,\n type: tokenType,\n status: 'active',\n expiresAt,\n absoluteExpiresAt,\n });\n\n const issuedAtSeconds = Math.floor(new Date(record.createdAt ?? new Date()).getTime() / 1000);\n const expiresAtSeconds = Math.floor(new Date(record.expiresAt).getTime() / 1000);\n\n const payload: RefreshTokenPayload = {\n userId,\n sessionId,\n type: 'refresh',\n iat: issuedAtSeconds,\n exp: expiresAtSeconds,\n };\n\n // Filter out conflicting options that are already handled by the payload or used for key selection\n const jwtOptions = config.jwtOptions || {};\n const { expiresIn, privateKey, publicKey, ...jwtSignOptions } = jwtOptions;\n\n const token = jwt.sign(payload, jwtKey, {\n algorithm,\n noTimestamp: true,\n ...jwtSignOptions,\n });\n\n return {\n token,\n sessionId,\n absoluteExpiresAt: absoluteExpiresAt.toISOString(),\n };\n }\n\n validateAccessToken(\n token: string,\n origin: string\n ): { isValid: true; payload: AccessTokenPayload } | { isValid: false; payload: null } {\n if (!origin || typeof origin !== 'string') {\n throw new Error(\n 'SessionManager: Origin parameter is required and must be a non-empty string'\n );\n }\n\n try {\n const config = this.getConfigForOrigin(origin);\n const algorithm = config.algorithm || DEFAULT_ALGORITHM;\n const jwtKey = this.getJwtKey(config, algorithm, 'verify');\n const payload = jwt.verify(token, jwtKey, {\n algorithms: [algorithm],\n ...config.jwtOptions,\n }) as TokenPayload;\n\n // Ensure this is an access token\n if (!payload || payload.type !== 'access') {\n return { isValid: false, payload: null };\n }\n\n return { isValid: true, payload };\n } catch (err) {\n return { isValid: false, payload: null };\n }\n }\n\n async validateRefreshToken(token: string, origin: string): Promise<ValidateRefreshTokenResult> {\n if (!origin || typeof origin !== 'string') {\n throw new Error(\n 'SessionManager: Origin parameter is required and must be a non-empty string'\n );\n }\n\n try {\n const config = this.getConfigForOrigin(origin);\n const algorithm = config.algorithm || DEFAULT_ALGORITHM;\n const jwtKey = this.getJwtKey(config, algorithm, 'verify');\n const verifyOptions: VerifyOptions = {\n algorithms: [algorithm],\n ...config.jwtOptions,\n };\n\n const payload = jwt.verify(token, jwtKey, verifyOptions) as RefreshTokenPayload;\n\n if (payload.type !== 'refresh') {\n return { isValid: false };\n }\n\n const session = await this.provider.findBySessionId(payload.sessionId);\n if (!session) {\n return { isValid: false };\n }\n\n const now = new Date();\n if (new Date(session.expiresAt) <= now) {\n return { isValid: false };\n }\n\n // Absolute family expiry check\n if (session.absoluteExpiresAt && new Date(session.absoluteExpiresAt) <= now) {\n return { isValid: false };\n }\n\n // Only 'active' sessions are eligible to create access tokens.\n if (session.status !== 'active') {\n return { isValid: false };\n }\n\n if (session.userId !== payload.userId) {\n return { isValid: false };\n }\n\n return {\n isValid: true,\n userId: payload.userId,\n sessionId: payload.sessionId,\n };\n } catch (error: any) {\n if (error instanceof jwt.JsonWebTokenError) {\n return { isValid: false };\n }\n\n throw error;\n }\n }\n\n async invalidateRefreshToken(origin: string, userId: string, deviceId?: string): Promise<void> {\n await this.provider.deleteBy({ userId, origin, deviceId });\n }\n\n async generateAccessToken(\n refreshToken: string,\n origin: string\n ): Promise<{ token: string } | { error: string }> {\n if (!origin || typeof origin !== 'string') {\n throw new Error(\n 'SessionManager: Origin parameter is required and must be a non-empty string'\n );\n }\n\n const validation = await this.validateRefreshToken(refreshToken, origin);\n\n if (!validation.isValid) {\n return { error: 'invalid_refresh_token' };\n }\n\n const payload: Omit<AccessTokenPayload, 'iat' | 'exp'> = {\n userId: String(validation.userId!),\n sessionId: validation.sessionId!,\n type: 'access',\n };\n\n const config = this.getConfigForOrigin(origin);\n const algorithm = config.algorithm || DEFAULT_ALGORITHM;\n const jwtKey = this.getJwtKey(config, algorithm, 'sign');\n // Filter out conflicting options that are already handled by the payload or used for key selection\n const jwtOptions = config.jwtOptions || {};\n const { expiresIn, privateKey, publicKey, ...jwtSignOptions } = jwtOptions;\n\n const token = jwt.sign(payload, jwtKey, {\n algorithm,\n expiresIn: config.accessTokenLifespan,\n ...jwtSignOptions,\n });\n\n return { token };\n }\n\n async rotateRefreshToken(\n refreshToken: string,\n origin: string\n ): Promise<\n | {\n token: string;\n sessionId: string;\n absoluteExpiresAt: string;\n type: 'refresh' | 'session';\n }\n | { error: string }\n > {\n if (!origin || typeof origin !== 'string') {\n throw new Error(\n 'SessionManager: Origin parameter is required and must be a non-empty string'\n );\n }\n\n try {\n const config = this.getConfigForOrigin(origin);\n const algorithm = config.algorithm || DEFAULT_ALGORITHM;\n const jwtKey = this.getJwtKey(config, algorithm, 'verify');\n const payload = jwt.verify(refreshToken, jwtKey, {\n algorithms: [algorithm],\n ...config.jwtOptions,\n }) as RefreshTokenPayload;\n\n if (!payload || payload.type !== 'refresh') {\n return { error: 'invalid_refresh_token' };\n }\n\n const current = await this.provider.findBySessionId(payload.sessionId);\n if (!current) {\n return { error: 'invalid_refresh_token' };\n }\n\n // If parent already has a child, return the same child token\n if (current.childId) {\n const child = await this.provider.findBySessionId(current.childId);\n\n if (child) {\n const childIat = Math.floor(new Date(child.createdAt ?? new Date()).getTime() / 1000);\n const childExp = Math.floor(new Date(child.expiresAt).getTime() / 1000);\n\n const childPayload: RefreshTokenPayload = {\n userId: child.userId,\n sessionId: child.sessionId,\n type: 'refresh',\n iat: childIat,\n exp: childExp,\n };\n\n // Filter out conflicting options that are already handled by the payload\n const { expiresIn, ...jwtSignOptions } = config.jwtOptions || {};\n\n const childToken = jwt.sign(childPayload, jwtKey, {\n algorithm,\n noTimestamp: true,\n ...jwtSignOptions,\n });\n\n let absoluteExpiresAt;\n if (child.absoluteExpiresAt) {\n absoluteExpiresAt =\n typeof child.absoluteExpiresAt === 'string'\n ? child.absoluteExpiresAt\n : child.absoluteExpiresAt.toISOString();\n } else {\n absoluteExpiresAt = new Date(0).toISOString();\n }\n\n return {\n token: childToken,\n sessionId: child.sessionId,\n absoluteExpiresAt,\n type: child.type ?? 'refresh',\n };\n }\n }\n\n const now = Date.now();\n const tokenType = current.type ?? 'refresh';\n const idleLifespan =\n tokenType === 'refresh' ? config.idleRefreshTokenLifespan : config.idleSessionLifespan;\n\n // Enforce idle window since creation of the current token\n if (current.createdAt && now - new Date(current.createdAt).getTime() > idleLifespan * 1000) {\n return { error: 'idle_window_elapsed' };\n }\n\n // Enforce max family window using absoluteExpiresAt\n const absolute = current.absoluteExpiresAt\n ? new Date(current.absoluteExpiresAt).getTime()\n : now;\n if (absolute <= now) {\n return { error: 'max_window_elapsed' };\n }\n\n // Create child token\n const childSessionId = this.generateSessionId();\n const childExpiresAt = new Date(now + idleLifespan * 1000);\n\n const childRecord = await this.provider.create({\n userId: current.userId,\n sessionId: childSessionId,\n ...(current.deviceId && { deviceId: current.deviceId }),\n origin: current.origin,\n childId: null,\n type: tokenType,\n status: 'active',\n expiresAt: childExpiresAt,\n absoluteExpiresAt: current.absoluteExpiresAt ?? new Date(absolute),\n });\n\n const childIat = Math.floor(new Date(childRecord.createdAt ?? new Date()).getTime() / 1000);\n const childExp = Math.floor(new Date(childRecord.expiresAt).getTime() / 1000);\n const payloadOut: RefreshTokenPayload = {\n userId: current.userId,\n sessionId: childSessionId,\n type: 'refresh',\n iat: childIat,\n exp: childExp,\n };\n // Filter out conflicting options that are already handled by the payload\n const { expiresIn, ...jwtSignOptions } = config.jwtOptions || {};\n\n const childToken = jwt.sign(payloadOut, jwtKey, {\n algorithm,\n noTimestamp: true,\n ...jwtSignOptions,\n });\n\n await this.provider.updateBySessionId(current.sessionId, {\n status: 'rotated',\n childId: childSessionId,\n });\n\n let absoluteExpiresAt;\n if (childRecord.absoluteExpiresAt) {\n absoluteExpiresAt =\n typeof childRecord.absoluteExpiresAt === 'string'\n ? childRecord.absoluteExpiresAt\n : childRecord.absoluteExpiresAt.toISOString();\n } else {\n absoluteExpiresAt = new Date(absolute).toISOString();\n }\n\n return {\n token: childToken,\n sessionId: childSessionId,\n absoluteExpiresAt,\n type: tokenType,\n };\n } catch {\n return { error: 'invalid_refresh_token' };\n }\n }\n\n /**\n * Returns true when a session exists and is not expired.\n * If the session exists but is expired, it will be deleted as part of this check.\n */\n async isSessionActive(sessionId: string, origin: string): Promise<boolean> {\n const session = await this.provider.findBySessionId(sessionId);\n if (!session) {\n return false;\n }\n\n if (session.origin !== origin) {\n return false;\n }\n\n if (new Date(session.expiresAt) <= new Date()) {\n // Clean up expired session eagerly\n await this.provider.deleteBySessionId(sessionId);\n\n return false;\n }\n\n return true;\n }\n}\n\nconst createDatabaseProvider = (db: Database, contentType: string): SessionProvider => {\n return new DatabaseSessionProvider(db, contentType);\n};\n\nconst createSessionManager = ({\n db,\n}: {\n db: Database;\n}): SessionManager & ((origin: string) => OriginSessionManager) => {\n const provider = createDatabaseProvider(db, 'admin::session');\n const sessionManager = new SessionManager(provider);\n\n // Add callable functionality\n const fluentApi = (origin: string): OriginSessionManager => {\n if (!origin || typeof origin !== 'string') {\n throw new Error(\n 'SessionManager: Origin parameter is required and must be a non-empty string'\n );\n }\n return new OriginSessionManager(sessionManager, origin);\n };\n\n // Attach only the public SessionManagerService API to the callable\n const api = fluentApi as unknown as any;\n api.generateSessionId = sessionManager.generateSessionId.bind(sessionManager);\n api.defineOrigin = sessionManager.defineOrigin.bind(sessionManager);\n api.hasOrigin = sessionManager.hasOrigin.bind(sessionManager);\n // Note: isSessionActive is origin-scoped and exposed on OriginSessionManager only\n\n // Forward the cleanupThreshold getter (used in tests)\n Object.defineProperty(api, 'cleanupThreshold', {\n get() {\n return sessionManager.cleanupThreshold;\n },\n enumerable: true,\n });\n\n return api as SessionManager & ((origin: string) => OriginSessionManager);\n};\n\nexport { createSessionManager, createDatabaseProvider };\n"],"names":["DatabaseSessionProvider","create","session","result","db","query","contentType","data","findBySessionId","sessionId","findOne","where","updateBySessionId","update","deleteBySessionId","delete","deleteExpired","deleteMany","absoluteExpiresAt","$lt","Date","deleteBy","criteria","userId","origin","deviceId","OriginSessionManager","generateRefreshToken","options","sessionManager","generateAccessToken","refreshToken","rotateRefreshToken","validateAccessToken","token","validateRefreshToken","invalidateRefreshToken","isSessionActive","SessionManager","defineOrigin","config","originConfigs","set","hasOrigin","has","getConfigForOrigin","originConfig","get","Error","getJwtKey","algorithm","operation","isAsymmetric","startsWith","privateKey","jwtOptions","publicKey","jwtSecret","generateSessionId","crypto","randomBytes","toString","maybeCleanupExpired","cleanupInvocationCounter","cleanupEveryCalls","provider","cleanupThreshold","DEFAULT_ALGORITHM","jwtKey","tokenType","type","isRefresh","idleLifespan","idleRefreshTokenLifespan","idleSessionLifespan","maxLifespan","maxRefreshTokenLifespan","maxSessionLifespan","now","expiresAt","record","childId","status","issuedAtSeconds","Math","floor","createdAt","getTime","expiresAtSeconds","payload","iat","exp","expiresIn","jwtSignOptions","jwt","sign","noTimestamp","toISOString","verify","algorithms","isValid","err","verifyOptions","error","JsonWebTokenError","validation","String","accessTokenLifespan","current","child","childIat","childExp","childPayload","childToken","absolute","childSessionId","childExpiresAt","childRecord","payloadOut","Map","createDatabaseProvider","createSessionManager","fluentApi","api","bind","Object","defineProperty","enumerable"],"mappings":"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"}
@@ -4,7 +4,12 @@ var createDebug = require('debug');
4
4
  var _ = require('lodash');
5
5
  var workerQueue = require('./worker-queue.js');
6
6
 
7
- const debug = createDebug('strapi:webhook');
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var createDebug__default = /*#__PURE__*/_interopDefault(createDebug);
10
+ var ___default = /*#__PURE__*/_interopDefault(_);
11
+
12
+ const debug = createDebug__default.default('strapi:webhook');
8
13
  const defaultConfiguration = {
9
14
  defaultHeaders: {}
10
15
  };
@@ -117,7 +122,7 @@ class WebhookRunner {
117
122
  if (typeof configuration !== 'object') {
118
123
  throw new Error('Invalid configuration provided to the webhookRunner.\nCheck your server.json -> webhooks configuration');
119
124
  }
120
- this.config = _.merge(defaultConfiguration, configuration);
125
+ this.config = ___default.default.merge(defaultConfiguration, configuration);
121
126
  this.queue = new workerQueue({
122
127
  logger,
123
128
  concurrency: 5
@@ -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 type { Modules } from '@strapi/types';\nimport WorkerQueue from './worker-queue';\nimport type { EventHub } from './event-hub';\nimport type { Fetch } from '../utils/fetch';\n\ntype Webhook = Modules.WebhookStore.Webhook;\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: unknown) => {\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 signal: AbortSignal.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":["debug","createdDebugger","defaultConfiguration","defaultHeaders","WebhookRunner","deleteListener","event","fn","listeners","get","undefined","eventHub","off","delete","createListener","has","logger","error","listen","info","queue","enqueue","set","on","executeListener","webhooks","webhooksMap","activeWebhooks","filter","webhook","isEnabled","run","catch","url","headers","fetch","method","body","JSON","stringify","createdAt","Date","config","signal","AbortSignal","timeout","then","res","ok","statusCode","status","message","text","err","add","id","events","forEach","push","update","remove","filteredWebhooks","value","length","configuration","Map","Error","_","merge","WorkerQueue","concurrency","subscribe","bind","createWebhookRunner","opts"],"mappings":"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"}
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 type { Modules } from '@strapi/types';\nimport WorkerQueue from './worker-queue';\nimport type { EventHub } from './event-hub';\nimport type { Fetch } from '../utils/fetch';\n\ntype Webhook = Modules.WebhookStore.Webhook;\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: unknown) => {\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 signal: AbortSignal.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":["debug","createdDebugger","defaultConfiguration","defaultHeaders","WebhookRunner","deleteListener","event","fn","listeners","get","undefined","eventHub","off","delete","createListener","has","logger","error","listen","info","queue","enqueue","set","on","executeListener","webhooks","webhooksMap","activeWebhooks","filter","webhook","isEnabled","run","catch","url","headers","fetch","method","body","JSON","stringify","createdAt","Date","config","signal","AbortSignal","timeout","then","res","ok","statusCode","status","message","text","err","add","id","events","forEach","push","update","remove","filteredWebhooks","value","length","configuration","Map","Error","_","merge","WorkerQueue","concurrency","subscribe","bind","createWebhookRunner","opts"],"mappings":"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"}
@@ -2,7 +2,11 @@
2
2
 
3
3
  var createDebug = require('debug');
4
4
 
5
- const debug = createDebug('strapi:worker-queue');
5
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
+
7
+ var createDebug__default = /*#__PURE__*/_interopDefault(createDebug);
8
+
9
+ const debug = createDebug__default.default('strapi:worker-queue');
6
10
  const noop = ()=>{};
7
11
  class WorkerQueue {
8
12
  subscribe(worker) {
@@ -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":["debug","createDebugger","noop","WorkerQueue","subscribe","worker","enqueue","payload","running","concurrency","execute","queue","unshift","pop","error","logger"],"mappings":";;;;AAOA,MAAMA,QAAQC,WAAAA,CAAe,qBAAA,CAAA;AAS7B,MAAMC,OAA2B,IAAA,CAAO,CAAA;AAEzB,MAAMC,WAAAA,CAAAA;AAsBnBC,IAAAA,SAAAA,CAAUC,MAAiC,EAAE;QAC3CL,KAAAA,CAAM,2BAAA,CAAA;QACN,IAAI,CAACK,MAAM,GAAGA,MAAAA;AAChB,IAAA;AAEAC,IAAAA,OAAAA,CAAQC,OAAiB,EAAE;QACzBP,KAAAA,CAAM,+BAAA,CAAA;AACN,QAAA,IAAI,IAAI,CAACQ,OAAO,GAAG,IAAI,CAACC,WAAW,EAAE;YACnC,IAAI,CAACD,OAAO,IAAI,CAAA;YAChB,IAAI,CAACE,OAAO,CAACH,OAAAA,CAAAA;QACf,CAAA,MAAO;AACL,YAAA,IAAI,CAACI,KAAK,CAACC,OAAO,CAACL,OAAAA,CAAAA;AACrB,QAAA;AACF,IAAA;IAEAM,GAAAA,GAAM;QACJb,KAAAA,CAAM,8BAAA,CAAA;AACN,QAAA,MAAMO,OAAAA,GAAU,IAAI,CAACI,KAAK,CAACE,GAAG,EAAA;AAE9B,QAAA,IAAIN,OAAAA,EAAS;YACX,IAAI,CAACG,OAAO,CAACH,OAAAA,CAAAA;QACf,CAAA,MAAO;YACL,IAAI,CAACC,OAAO,IAAI,CAAA;AAClB,QAAA;AACF,IAAA;IAEA,MAAME,OAAAA,CAAQH,OAAiB,EAAE;QAC/BP,KAAAA,CAAM,gBAAA,CAAA;QACN,IAAI;YACF,MAAM,IAAI,CAACK,MAAM,CAACE,OAAAA,CAAAA;AACpB,QAAA,CAAA,CAAE,OAAOO,KAAAA,EAAO;AACd,YAAA,IAAI,CAACC,MAAM,CAACD,KAAK,CAACA,KAAAA,CAAAA;QACpB,CAAA,QAAU;AACR,YAAA,IAAI,CAACD,GAAG,EAAA;AACV,QAAA;AACF,IAAA;AA9CA,IAAA,WAAA,CAAY,EAAEE,MAAM,EAAEN,WAAAA,GAAc,CAAC,EAAyB,CAAE;QAC9DT,KAAAA,CAAM,yBAAA,CAAA;QAEN,IAAI,CAACe,MAAM,GAAGA,MAAAA;QACd,IAAI,CAACV,MAAM,GAAGH,IAAAA;QAEd,IAAI,CAACO,WAAW,GAAGA,WAAAA;QACnB,IAAI,CAACD,OAAO,GAAG,CAAA;QACf,IAAI,CAACG,KAAK,GAAG,EAAE;AACjB,IAAA;AAsCF;;;;"}
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":["debug","createDebugger","noop","WorkerQueue","subscribe","worker","enqueue","payload","running","concurrency","execute","queue","unshift","pop","error","logger"],"mappings":";;;;;;;;AAOA,MAAMA,QAAQC,4BAAAA,CAAe,qBAAA,CAAA;AAS7B,MAAMC,OAA2B,IAAA,CAAO,CAAA;AAEzB,MAAMC,WAAAA,CAAAA;AAsBnBC,IAAAA,SAAAA,CAAUC,MAAiC,EAAE;QAC3CL,KAAAA,CAAM,2BAAA,CAAA;QACN,IAAI,CAACK,MAAM,GAAGA,MAAAA;AAChB,IAAA;AAEAC,IAAAA,OAAAA,CAAQC,OAAiB,EAAE;QACzBP,KAAAA,CAAM,+BAAA,CAAA;AACN,QAAA,IAAI,IAAI,CAACQ,OAAO,GAAG,IAAI,CAACC,WAAW,EAAE;YACnC,IAAI,CAACD,OAAO,IAAI,CAAA;YAChB,IAAI,CAACE,OAAO,CAACH,OAAAA,CAAAA;QACf,CAAA,MAAO;AACL,YAAA,IAAI,CAACI,KAAK,CAACC,OAAO,CAACL,OAAAA,CAAAA;AACrB,QAAA;AACF,IAAA;IAEAM,GAAAA,GAAM;QACJb,KAAAA,CAAM,8BAAA,CAAA;AACN,QAAA,MAAMO,OAAAA,GAAU,IAAI,CAACI,KAAK,CAACE,GAAG,EAAA;AAE9B,QAAA,IAAIN,OAAAA,EAAS;YACX,IAAI,CAACG,OAAO,CAACH,OAAAA,CAAAA;QACf,CAAA,MAAO;YACL,IAAI,CAACC,OAAO,IAAI,CAAA;AAClB,QAAA;AACF,IAAA;IAEA,MAAME,OAAAA,CAAQH,OAAiB,EAAE;QAC/BP,KAAAA,CAAM,gBAAA,CAAA;QACN,IAAI;YACF,MAAM,IAAI,CAACK,MAAM,CAACE,OAAAA,CAAAA;AACpB,QAAA,CAAA,CAAE,OAAOO,KAAAA,EAAO;AACd,YAAA,IAAI,CAACC,MAAM,CAACD,KAAK,CAACA,KAAAA,CAAAA;QACpB,CAAA,QAAU;AACR,YAAA,IAAI,CAACD,GAAG,EAAA;AACV,QAAA;AACF,IAAA;AA9CA,IAAA,WAAA,CAAY,EAAEE,MAAM,EAAEN,WAAAA,GAAc,CAAC,EAAyB,CAAE;QAC9DT,KAAAA,CAAM,yBAAA,CAAA;QAEN,IAAI,CAACe,MAAM,GAAGA,MAAAA;QACd,IAAI,CAACV,MAAM,GAAGH,IAAAA;QAEd,IAAI,CAACO,WAAW,GAAGA,WAAAA;QACnB,IAAI,CAACD,OAAO,GAAG,CAAA;QACf,IAAI,CAACG,KAAK,GAAG,EAAE;AACjB,IAAA;AAsCF;;;;"}
@@ -3,22 +3,27 @@
3
3
  var path = require('node:path');
4
4
  var fp = require('lodash/fp');
5
5
 
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+
8
+ var path__default = /*#__PURE__*/_interopDefault(path);
9
+ var fp__default = /*#__PURE__*/_interopDefault(fp);
10
+
6
11
  /**
7
12
  * Returns a path (as an array) from a file path
8
13
  */ const filePathToPropPath = (entryPath, useFileNameAsKey = true)=>{
9
- const transform = fp.pipe(// Remove the relative path prefixes: './' for posix (and some win32) and ".\" for win32
14
+ const transform = fp__default.default.pipe(// Remove the relative path prefixes: './' for posix (and some win32) and ".\" for win32
10
15
  removeRelativePrefix, // Remove the path metadata and extensions
11
- fp.replace(/(\.settings|\.json|\.js)/g, ''), // Transform to lowercase
16
+ fp__default.default.replace(/(\.settings|\.json|\.js)/g, ''), // Transform to lowercase
12
17
  // Note: We're using fp.toLower instead of fp.lowercase as the latest removes special characters such as "/"
13
- fp.toLower, // Split the cleaned path by matching every possible separator (either "/" or "\" depending on the OS)
14
- fp.split(new RegExp(`[\\${path.win32.sep}|${path.posix.sep}]`, 'g')), // Make sure to remove leading '.' from the different path parts
15
- fp.map(fp.trimCharsStart('.')), // join + split in case some '.' characters are still present in different parts of the path
16
- fp.join('.'), fp.split('.'), // Remove the last portion of the path array if the file name shouldn't be used as a key
17
- useFileNameAsKey ? fp.identity : fp.slice(0, -1));
18
+ fp__default.default.toLower, // Split the cleaned path by matching every possible separator (either "/" or "\" depending on the OS)
19
+ fp__default.default.split(new RegExp(`[\\${path__default.default.win32.sep}|${path__default.default.posix.sep}]`, 'g')), // Make sure to remove leading '.' from the different path parts
20
+ fp__default.default.map(fp__default.default.trimCharsStart('.')), // join + split in case some '.' characters are still present in different parts of the path
21
+ fp__default.default.join('.'), fp__default.default.split('.'), // Remove the last portion of the path array if the file name shouldn't be used as a key
22
+ useFileNameAsKey ? fp__default.default.identity : fp__default.default.slice(0, -1));
18
23
  return transform(entryPath);
19
24
  };
20
25
  const removeRelativePrefix = (filePath)=>{
21
- return filePath.startsWith(`.${path.win32.sep}`) || filePath.startsWith(`.${path.posix.sep}`) ? filePath.slice(2) : filePath;
26
+ return filePath.startsWith(`.${path__default.default.win32.sep}`) || filePath.startsWith(`.${path__default.default.posix.sep}`) ? filePath.slice(2) : filePath;
22
27
  };
23
28
 
24
29
  exports.filePathToPropPath = filePathToPropPath;
@@ -1 +1 @@
1
- {"version":3,"file":"filepath-to-prop-path.js","sources":["../../src/utils/filepath-to-prop-path.ts"],"sourcesContent":["import path from 'node:path';\nimport fp from 'lodash/fp';\n\n/**\n * Returns a path (as an array) from a file path\n */\nexport const filePathToPropPath = (\n entryPath: string,\n useFileNameAsKey: boolean = true\n): string[] => {\n const transform = fp.pipe(\n // Remove the relative path prefixes: './' for posix (and some win32) and \".\\\" for win32\n removeRelativePrefix,\n // Remove the path metadata and extensions\n fp.replace(/(\\.settings|\\.json|\\.js)/g, ''),\n // Transform to lowercase\n // Note: We're using fp.toLower instead of fp.lowercase as the latest removes special characters such as \"/\"\n fp.toLower,\n // Split the cleaned path by matching every possible separator (either \"/\" or \"\\\" depending on the OS)\n fp.split(new RegExp(`[\\\\${path.win32.sep}|${path.posix.sep}]`, 'g')),\n // Make sure to remove leading '.' from the different path parts\n fp.map(fp.trimCharsStart('.')),\n // join + split in case some '.' characters are still present in different parts of the path\n fp.join('.'),\n fp.split('.'),\n // Remove the last portion of the path array if the file name shouldn't be used as a key\n useFileNameAsKey ? fp.identity : fp.slice(0, -1)\n );\n\n return transform(entryPath) as string[];\n};\n\nconst removeRelativePrefix = (filePath: string) => {\n return filePath.startsWith(`.${path.win32.sep}`) || filePath.startsWith(`.${path.posix.sep}`)\n ? filePath.slice(2)\n : filePath;\n};\n"],"names":["filePathToPropPath","entryPath","useFileNameAsKey","transform","fp","pipe","removeRelativePrefix","replace","toLower","split","RegExp","path","win32","sep","posix","map","trimCharsStart","join","identity","slice","filePath","startsWith"],"mappings":";;;;;AAGA;;AAEC,IACM,MAAMA,kBAAAA,GAAqB,CAChCC,SAAAA,EACAC,mBAA4B,IAAI,GAAA;AAEhC,IAAA,MAAMC,SAAAA,GAAYC,EAAAA,CAAGC,IAAI;AAEvBC,IAAAA,oBAAAA;AAEAF,IAAAA,EAAAA,CAAGG,OAAO,CAAC,2BAAA,EAA6B,EAAA,CAAA;;IAGxCH,EAAAA,CAAGI,OAAO;IAEVJ,EAAAA,CAAGK,KAAK,CAAC,IAAIC,MAAAA,CAAO,CAAC,GAAG,EAAEC,IAAAA,CAAKC,KAAK,CAACC,GAAG,CAAC,CAAC,EAAEF,IAAAA,CAAKG,KAAK,CAACD,GAAG,CAAC,CAAC,CAAC,EAAE,GAAA,CAAA,CAAA;AAE/DT,IAAAA,EAAAA,CAAGW,GAAG,CAACX,EAAAA,CAAGY,cAAc,CAAC;AAEzBZ,IAAAA,EAAAA,CAAGa,IAAI,CAAC,GAAA,CAAA,EACRb,GAAGK,KAAK,CAAC;AAETP,IAAAA,gBAAAA,GAAmBE,GAAGc,QAAQ,GAAGd,GAAGe,KAAK,CAAC,GAAG,EAAC,CAAA,CAAA;AAGhD,IAAA,OAAOhB,SAAAA,CAAUF,SAAAA,CAAAA;AACnB;AAEA,MAAMK,uBAAuB,CAACc,QAAAA,GAAAA;IAC5B,OAAOA,QAAAA,CAASC,UAAU,CAAC,CAAC,CAAC,EAAEV,IAAAA,CAAKC,KAAK,CAACC,GAAG,CAAA,CAAE,CAAA,IAAKO,QAAAA,CAASC,UAAU,CAAC,CAAC,CAAC,EAAEV,IAAAA,CAAKG,KAAK,CAACD,GAAG,CAAA,CAAE,CAAA,GACxFO,QAAAA,CAASD,KAAK,CAAC,CAAA,CAAA,GACfC,QAAAA;AACN,CAAA;;;;"}
1
+ {"version":3,"file":"filepath-to-prop-path.js","sources":["../../src/utils/filepath-to-prop-path.ts"],"sourcesContent":["import path from 'node:path';\nimport fp from 'lodash/fp';\n\n/**\n * Returns a path (as an array) from a file path\n */\nexport const filePathToPropPath = (\n entryPath: string,\n useFileNameAsKey: boolean = true\n): string[] => {\n const transform = fp.pipe(\n // Remove the relative path prefixes: './' for posix (and some win32) and \".\\\" for win32\n removeRelativePrefix,\n // Remove the path metadata and extensions\n fp.replace(/(\\.settings|\\.json|\\.js)/g, ''),\n // Transform to lowercase\n // Note: We're using fp.toLower instead of fp.lowercase as the latest removes special characters such as \"/\"\n fp.toLower,\n // Split the cleaned path by matching every possible separator (either \"/\" or \"\\\" depending on the OS)\n fp.split(new RegExp(`[\\\\${path.win32.sep}|${path.posix.sep}]`, 'g')),\n // Make sure to remove leading '.' from the different path parts\n fp.map(fp.trimCharsStart('.')),\n // join + split in case some '.' characters are still present in different parts of the path\n fp.join('.'),\n fp.split('.'),\n // Remove the last portion of the path array if the file name shouldn't be used as a key\n useFileNameAsKey ? fp.identity : fp.slice(0, -1)\n );\n\n return transform(entryPath) as string[];\n};\n\nconst removeRelativePrefix = (filePath: string) => {\n return filePath.startsWith(`.${path.win32.sep}`) || filePath.startsWith(`.${path.posix.sep}`)\n ? filePath.slice(2)\n : filePath;\n};\n"],"names":["filePathToPropPath","entryPath","useFileNameAsKey","transform","fp","pipe","removeRelativePrefix","replace","toLower","split","RegExp","path","win32","sep","posix","map","trimCharsStart","join","identity","slice","filePath","startsWith"],"mappings":";;;;;;;;;;AAGA;;AAEC,IACM,MAAMA,kBAAAA,GAAqB,CAChCC,SAAAA,EACAC,mBAA4B,IAAI,GAAA;AAEhC,IAAA,MAAMC,SAAAA,GAAYC,mBAAAA,CAAGC,IAAI;AAEvBC,IAAAA,oBAAAA;AAEAF,IAAAA,mBAAAA,CAAGG,OAAO,CAAC,2BAAA,EAA6B,EAAA,CAAA;;IAGxCH,mBAAAA,CAAGI,OAAO;IAEVJ,mBAAAA,CAAGK,KAAK,CAAC,IAAIC,MAAAA,CAAO,CAAC,GAAG,EAAEC,qBAAAA,CAAKC,KAAK,CAACC,GAAG,CAAC,CAAC,EAAEF,qBAAAA,CAAKG,KAAK,CAACD,GAAG,CAAC,CAAC,CAAC,EAAE,GAAA,CAAA,CAAA;AAE/DT,IAAAA,mBAAAA,CAAGW,GAAG,CAACX,mBAAAA,CAAGY,cAAc,CAAC;AAEzBZ,IAAAA,mBAAAA,CAAGa,IAAI,CAAC,GAAA,CAAA,EACRb,oBAAGK,KAAK,CAAC;AAETP,IAAAA,gBAAAA,GAAmBE,oBAAGc,QAAQ,GAAGd,oBAAGe,KAAK,CAAC,GAAG,EAAC,CAAA,CAAA;AAGhD,IAAA,OAAOhB,SAAAA,CAAUF,SAAAA,CAAAA;AACnB;AAEA,MAAMK,uBAAuB,CAACc,QAAAA,GAAAA;IAC5B,OAAOA,QAAAA,CAASC,UAAU,CAAC,CAAC,CAAC,EAAEV,qBAAAA,CAAKC,KAAK,CAACC,GAAG,CAAA,CAAE,CAAA,IAAKO,QAAAA,CAASC,UAAU,CAAC,CAAC,CAAC,EAAEV,qBAAAA,CAAKG,KAAK,CAACD,GAAG,CAAA,CAAE,CAAA,GACxFO,QAAAA,CAASD,KAAK,CAAC,CAAA,CAAA,GACfC,QAAAA;AACN,CAAA;;;;"}
@@ -4,6 +4,11 @@ var path = require('path');
4
4
  var fs = require('fs');
5
5
  var strapiUtils = require('@strapi/utils');
6
6
 
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var path__default = /*#__PURE__*/_interopDefault(path);
10
+ var fs__default = /*#__PURE__*/_interopDefault(fs);
11
+
7
12
  const loadJsFile = (file)=>{
8
13
  try {
9
14
  const jsModule = strapiUtils.importDefault(file);
@@ -23,7 +28,7 @@ const loadJsFile = (file)=>{
23
28
  };
24
29
  const loadJSONFile = (file)=>{
25
30
  try {
26
- return JSON.parse(fs.readFileSync(file).toString());
31
+ return JSON.parse(fs__default.default.readFileSync(file).toString());
27
32
  } catch (error) {
28
33
  if (error instanceof Error) {
29
34
  throw new Error(`Could not load json config file ${file}: ${error.message}`);
@@ -32,7 +37,7 @@ const loadJSONFile = (file)=>{
32
37
  }
33
38
  };
34
39
  const loadConfigFile = (file)=>{
35
- const ext = path.extname(file);
40
+ const ext = path__default.default.extname(file);
36
41
  switch(ext){
37
42
  case '.js':
38
43
  return loadJsFile(file);
@@ -1 +1 @@
1
- {"version":3,"file":"load-config-file.js","sources":["../../src/utils/load-config-file.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport { env, importDefault } from '@strapi/utils';\n\nconst loadJsFile = (file: string) => {\n try {\n const jsModule = importDefault(file);\n\n // call if function\n if (typeof jsModule === 'function') {\n return jsModule({ env });\n }\n\n return jsModule;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Could not load js config file ${file}: ${error.message}`);\n }\n\n throw new Error('Unknown error');\n }\n};\n\nconst loadJSONFile = (file: string) => {\n try {\n return JSON.parse(fs.readFileSync(file).toString());\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Could not load json config file ${file}: ${error.message}`);\n }\n\n throw new Error('Unknown error');\n }\n};\n\nexport const loadConfigFile = (file: string) => {\n const ext = path.extname(file);\n\n switch (ext) {\n case '.js':\n return loadJsFile(file);\n case '.json':\n return loadJSONFile(file);\n default:\n return {};\n }\n};\n"],"names":["loadJsFile","file","jsModule","importDefault","env","error","Error","message","loadJSONFile","JSON","parse","fs","readFileSync","toString","loadConfigFile","ext","path","extname"],"mappings":";;;;;;AAIA,MAAMA,aAAa,CAACC,IAAAA,GAAAA;IAClB,IAAI;AACF,QAAA,MAAMC,WAAWC,yBAAAA,CAAcF,IAAAA,CAAAA;;QAG/B,IAAI,OAAOC,aAAa,UAAA,EAAY;AAClC,YAAA,OAAOA,QAAAA,CAAS;AAAEE,qBAAAA;AAAI,aAAA,CAAA;AACxB,QAAA;QAEA,OAAOF,QAAAA;AACT,IAAA,CAAA,CAAE,OAAOG,KAAAA,EAAO;AACd,QAAA,IAAIA,iBAAiBC,KAAAA,EAAO;YAC1B,MAAM,IAAIA,KAAAA,CAAM,CAAC,8BAA8B,EAAEL,KAAK,EAAE,EAAEI,KAAAA,CAAME,OAAO,CAAA,CAAE,CAAA;AAC3E,QAAA;AAEA,QAAA,MAAM,IAAID,KAAAA,CAAM,eAAA,CAAA;AAClB,IAAA;AACF,CAAA;AAEA,MAAME,eAAe,CAACP,IAAAA,GAAAA;IACpB,IAAI;AACF,QAAA,OAAOQ,KAAKC,KAAK,CAACC,GAAGC,YAAY,CAACX,MAAMY,QAAQ,EAAA,CAAA;AAClD,IAAA,CAAA,CAAE,OAAOR,KAAAA,EAAO;AACd,QAAA,IAAIA,iBAAiBC,KAAAA,EAAO;YAC1B,MAAM,IAAIA,KAAAA,CAAM,CAAC,gCAAgC,EAAEL,KAAK,EAAE,EAAEI,KAAAA,CAAME,OAAO,CAAA,CAAE,CAAA;AAC7E,QAAA;AAEA,QAAA,MAAM,IAAID,KAAAA,CAAM,eAAA,CAAA;AAClB,IAAA;AACF,CAAA;AAEO,MAAMQ,iBAAiB,CAACb,IAAAA,GAAAA;IAC7B,MAAMc,GAAAA,GAAMC,IAAAA,CAAKC,OAAO,CAAChB,IAAAA,CAAAA;IAEzB,OAAQc,GAAAA;QACN,KAAK,KAAA;AACH,YAAA,OAAOf,UAAAA,CAAWC,IAAAA,CAAAA;QACpB,KAAK,OAAA;AACH,YAAA,OAAOO,YAAAA,CAAaP,IAAAA,CAAAA;AACtB,QAAA;AACE,YAAA,OAAO,EAAC;AACZ;AACF;;;;"}
1
+ {"version":3,"file":"load-config-file.js","sources":["../../src/utils/load-config-file.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport { env, importDefault } from '@strapi/utils';\n\nconst loadJsFile = (file: string) => {\n try {\n const jsModule = importDefault(file);\n\n // call if function\n if (typeof jsModule === 'function') {\n return jsModule({ env });\n }\n\n return jsModule;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Could not load js config file ${file}: ${error.message}`);\n }\n\n throw new Error('Unknown error');\n }\n};\n\nconst loadJSONFile = (file: string) => {\n try {\n return JSON.parse(fs.readFileSync(file).toString());\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Could not load json config file ${file}: ${error.message}`);\n }\n\n throw new Error('Unknown error');\n }\n};\n\nexport const loadConfigFile = (file: string) => {\n const ext = path.extname(file);\n\n switch (ext) {\n case '.js':\n return loadJsFile(file);\n case '.json':\n return loadJSONFile(file);\n default:\n return {};\n }\n};\n"],"names":["loadJsFile","file","jsModule","importDefault","env","error","Error","message","loadJSONFile","JSON","parse","fs","readFileSync","toString","loadConfigFile","ext","path","extname"],"mappings":";;;;;;;;;;;AAIA,MAAMA,aAAa,CAACC,IAAAA,GAAAA;IAClB,IAAI;AACF,QAAA,MAAMC,WAAWC,yBAAAA,CAAcF,IAAAA,CAAAA;;QAG/B,IAAI,OAAOC,aAAa,UAAA,EAAY;AAClC,YAAA,OAAOA,QAAAA,CAAS;AAAEE,qBAAAA;AAAI,aAAA,CAAA;AACxB,QAAA;QAEA,OAAOF,QAAAA;AACT,IAAA,CAAA,CAAE,OAAOG,KAAAA,EAAO;AACd,QAAA,IAAIA,iBAAiBC,KAAAA,EAAO;YAC1B,MAAM,IAAIA,KAAAA,CAAM,CAAC,8BAA8B,EAAEL,KAAK,EAAE,EAAEI,KAAAA,CAAME,OAAO,CAAA,CAAE,CAAA;AAC3E,QAAA;AAEA,QAAA,MAAM,IAAID,KAAAA,CAAM,eAAA,CAAA;AAClB,IAAA;AACF,CAAA;AAEA,MAAME,eAAe,CAACP,IAAAA,GAAAA;IACpB,IAAI;AACF,QAAA,OAAOQ,KAAKC,KAAK,CAACC,oBAAGC,YAAY,CAACX,MAAMY,QAAQ,EAAA,CAAA;AAClD,IAAA,CAAA,CAAE,OAAOR,KAAAA,EAAO;AACd,QAAA,IAAIA,iBAAiBC,KAAAA,EAAO;YAC1B,MAAM,IAAIA,KAAAA,CAAM,CAAC,gCAAgC,EAAEL,KAAK,EAAE,EAAEI,KAAAA,CAAME,OAAO,CAAA,CAAE,CAAA;AAC7E,QAAA;AAEA,QAAA,MAAM,IAAID,KAAAA,CAAM,eAAA,CAAA;AAClB,IAAA;AACF,CAAA;AAEO,MAAMQ,iBAAiB,CAACb,IAAAA,GAAAA;IAC7B,MAAMc,GAAAA,GAAMC,qBAAAA,CAAKC,OAAO,CAAChB,IAAAA,CAAAA;IAEzB,OAAQc,GAAAA;QACN,KAAK,KAAA;AACH,YAAA,OAAOf,UAAAA,CAAWC,IAAAA,CAAAA;QACpB,KAAK,OAAA;AACH,YAAA,OAAOO,YAAAA,CAAaP,IAAAA,CAAAA;AACtB,QAAA;AACE,YAAA,OAAO,EAAC;AACZ;AACF;;;;"}
@@ -7,6 +7,12 @@ var strapiUtils = require('@strapi/utils');
7
7
  var glob = require('glob');
8
8
  var filepathToPropPath = require('./filepath-to-prop-path.js');
9
9
 
10
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
+
12
+ var path__default = /*#__PURE__*/_interopDefault(path);
13
+ var ___default = /*#__PURE__*/_interopDefault(_);
14
+ var fse__default = /*#__PURE__*/_interopDefault(fse);
15
+
10
16
  /**
11
17
  * Returns an Object build from a list of files matching a glob pattern in a directory
12
18
  * It builds a tree structure resembling the folder structure in dir
@@ -18,12 +24,12 @@ var filepathToPropPath = require('./filepath-to-prop-path.js');
18
24
  ...globArgs
19
25
  });
20
26
  for (const file of files){
21
- const absolutePath = path.resolve(dir, file);
27
+ const absolutePath = path__default.default.resolve(dir, file);
22
28
  // load module
23
29
  delete require.cache[absolutePath];
24
30
  let mod;
25
- if (path.extname(absolutePath) === '.json') {
26
- mod = await fse.readJson(absolutePath);
31
+ if (path__default.default.extname(absolutePath) === '.json') {
32
+ mod = await fse__default.default.readJson(absolutePath);
27
33
  } else {
28
34
  mod = requireFn(absolutePath);
29
35
  }
@@ -31,11 +37,11 @@ var filepathToPropPath = require('./filepath-to-prop-path.js');
31
37
  enumerable: true,
32
38
  configurable: false,
33
39
  writable: false,
34
- value: path.basename(file)
40
+ value: path__default.default.basename(file)
35
41
  });
36
42
  const propPath = filepathToPropPath.filePathToPropPath(file, shouldUseFileNameAsKey(file));
37
- if (propPath.length === 0) _.merge(root, mod);
38
- _.merge(root, _.setWith({}, propPath, mod, Object));
43
+ if (propPath.length === 0) ___default.default.merge(root, mod);
44
+ ___default.default.merge(root, ___default.default.setWith({}, propPath, mod, Object));
39
45
  }
40
46
  return root;
41
47
  };
@@ -1 +1 @@
1
- {"version":3,"file":"load-files.js","sources":["../../src/utils/load-files.ts"],"sourcesContent":["import path from 'path';\nimport _ from 'lodash';\nimport fse from 'fs-extra';\n\nimport { importDefault } from '@strapi/utils';\nimport { glob } from 'glob';\nimport { filePathToPropPath } from './filepath-to-prop-path';\n\n/**\n * Returns an Object build from a list of files matching a glob pattern in a directory\n * It builds a tree structure resembling the folder structure in dir\n */\nexport const loadFiles = async <T extends object>(\n dir: string,\n pattern: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n { requireFn = importDefault, shouldUseFileNameAsKey = (_: any) => true, globArgs = {} } = {}\n): Promise<T> => {\n const root = {};\n const files = await glob(pattern, { cwd: dir, ...globArgs });\n\n for (const file of files) {\n const absolutePath = path.resolve(dir, file);\n\n // load module\n delete require.cache[absolutePath];\n let mod;\n\n if (path.extname(absolutePath) === '.json') {\n mod = await fse.readJson(absolutePath);\n } else {\n mod = requireFn(absolutePath);\n }\n\n Object.defineProperty(mod, '__filename__', {\n enumerable: true,\n configurable: false,\n writable: false,\n value: path.basename(file),\n });\n\n const propPath = filePathToPropPath(file, shouldUseFileNameAsKey(file));\n\n if (propPath.length === 0) _.merge(root, mod);\n _.merge(root, _.setWith({}, propPath, mod, Object));\n }\n\n return root as T;\n};\n"],"names":["loadFiles","dir","pattern","requireFn","importDefault","shouldUseFileNameAsKey","_","globArgs","root","files","glob","cwd","file","absolutePath","path","resolve","require","cache","mod","extname","fse","readJson","Object","defineProperty","enumerable","configurable","writable","value","basename","propPath","filePathToPropPath","length","merge","setWith"],"mappings":";;;;;;;;;AAQA;;;AAGC,IACM,MAAMA,SAAAA,GAAY,OACvBC,GAAAA,EACAC;AAEA,EAAEC,SAAAA,GAAYC,yBAAa,EAAEC,sBAAAA,GAAyB,CAACC,CAAAA,GAAW,IAAI,EAAEC,QAAAA,GAAW,EAAE,EAAE,GAAG,EAAE,GAAA;AAE5F,IAAA,MAAMC,OAAO,EAAC;IACd,MAAMC,KAAAA,GAAQ,MAAMC,SAAAA,CAAKR,OAAAA,EAAS;QAAES,GAAAA,EAAKV,GAAAA;AAAK,QAAA,GAAGM;AAAS,KAAA,CAAA;IAE1D,KAAK,MAAMK,QAAQH,KAAAA,CAAO;AACxB,QAAA,MAAMI,YAAAA,GAAeC,IAAAA,CAAKC,OAAO,CAACd,GAAAA,EAAKW,IAAAA,CAAAA;;QAGvC,OAAOI,OAAAA,CAAQC,KAAK,CAACJ,YAAAA,CAAa;QAClC,IAAIK,GAAAA;AAEJ,QAAA,IAAIJ,IAAAA,CAAKK,OAAO,CAACN,YAAAA,CAAAA,KAAkB,OAAA,EAAS;YAC1CK,GAAAA,GAAM,MAAME,GAAAA,CAAIC,QAAQ,CAACR,YAAAA,CAAAA;QAC3B,CAAA,MAAO;AACLK,YAAAA,GAAAA,GAAMf,SAAAA,CAAUU,YAAAA,CAAAA;AAClB,QAAA;QAEAS,MAAAA,CAAOC,cAAc,CAACL,GAAAA,EAAK,cAAA,EAAgB;YACzCM,UAAAA,EAAY,IAAA;YACZC,YAAAA,EAAc,KAAA;YACdC,QAAAA,EAAU,KAAA;YACVC,KAAAA,EAAOb,IAAAA,CAAKc,QAAQ,CAAChB,IAAAA;AACvB,SAAA,CAAA;QAEA,MAAMiB,QAAAA,GAAWC,qCAAAA,CAAmBlB,IAAAA,EAAMP,sBAAAA,CAAuBO,IAAAA,CAAAA,CAAAA;AAEjE,QAAA,IAAIiB,SAASE,MAAM,KAAK,GAAGzB,CAAAA,CAAE0B,KAAK,CAACxB,IAAAA,EAAMU,GAAAA,CAAAA;QACzCZ,CAAAA,CAAE0B,KAAK,CAACxB,IAAAA,EAAMF,CAAAA,CAAE2B,OAAO,CAAC,EAAC,EAAGJ,QAAAA,EAAUX,GAAAA,EAAKI,MAAAA,CAAAA,CAAAA;AAC7C,IAAA;IAEA,OAAOd,IAAAA;AACT;;;;"}
1
+ {"version":3,"file":"load-files.js","sources":["../../src/utils/load-files.ts"],"sourcesContent":["import path from 'path';\nimport _ from 'lodash';\nimport fse from 'fs-extra';\n\nimport { importDefault } from '@strapi/utils';\nimport { glob } from 'glob';\nimport { filePathToPropPath } from './filepath-to-prop-path';\n\n/**\n * Returns an Object build from a list of files matching a glob pattern in a directory\n * It builds a tree structure resembling the folder structure in dir\n */\nexport const loadFiles = async <T extends object>(\n dir: string,\n pattern: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n { requireFn = importDefault, shouldUseFileNameAsKey = (_: any) => true, globArgs = {} } = {}\n): Promise<T> => {\n const root = {};\n const files = await glob(pattern, { cwd: dir, ...globArgs });\n\n for (const file of files) {\n const absolutePath = path.resolve(dir, file);\n\n // load module\n delete require.cache[absolutePath];\n let mod;\n\n if (path.extname(absolutePath) === '.json') {\n mod = await fse.readJson(absolutePath);\n } else {\n mod = requireFn(absolutePath);\n }\n\n Object.defineProperty(mod, '__filename__', {\n enumerable: true,\n configurable: false,\n writable: false,\n value: path.basename(file),\n });\n\n const propPath = filePathToPropPath(file, shouldUseFileNameAsKey(file));\n\n if (propPath.length === 0) _.merge(root, mod);\n _.merge(root, _.setWith({}, propPath, mod, Object));\n }\n\n return root as T;\n};\n"],"names":["loadFiles","dir","pattern","requireFn","importDefault","shouldUseFileNameAsKey","_","globArgs","root","files","glob","cwd","file","absolutePath","path","resolve","require","cache","mod","extname","fse","readJson","Object","defineProperty","enumerable","configurable","writable","value","basename","propPath","filePathToPropPath","length","merge","setWith"],"mappings":";;;;;;;;;;;;;;;AAQA;;;AAGC,IACM,MAAMA,SAAAA,GAAY,OACvBC,GAAAA,EACAC;AAEA,EAAEC,SAAAA,GAAYC,yBAAa,EAAEC,sBAAAA,GAAyB,CAACC,CAAAA,GAAW,IAAI,EAAEC,QAAAA,GAAW,EAAE,EAAE,GAAG,EAAE,GAAA;AAE5F,IAAA,MAAMC,OAAO,EAAC;IACd,MAAMC,KAAAA,GAAQ,MAAMC,SAAAA,CAAKR,OAAAA,EAAS;QAAES,GAAAA,EAAKV,GAAAA;AAAK,QAAA,GAAGM;AAAS,KAAA,CAAA;IAE1D,KAAK,MAAMK,QAAQH,KAAAA,CAAO;AACxB,QAAA,MAAMI,YAAAA,GAAeC,qBAAAA,CAAKC,OAAO,CAACd,GAAAA,EAAKW,IAAAA,CAAAA;;QAGvC,OAAOI,OAAAA,CAAQC,KAAK,CAACJ,YAAAA,CAAa;QAClC,IAAIK,GAAAA;AAEJ,QAAA,IAAIJ,qBAAAA,CAAKK,OAAO,CAACN,YAAAA,CAAAA,KAAkB,OAAA,EAAS;YAC1CK,GAAAA,GAAM,MAAME,oBAAAA,CAAIC,QAAQ,CAACR,YAAAA,CAAAA;QAC3B,CAAA,MAAO;AACLK,YAAAA,GAAAA,GAAMf,SAAAA,CAAUU,YAAAA,CAAAA;AAClB,QAAA;QAEAS,MAAAA,CAAOC,cAAc,CAACL,GAAAA,EAAK,cAAA,EAAgB;YACzCM,UAAAA,EAAY,IAAA;YACZC,YAAAA,EAAc,KAAA;YACdC,QAAAA,EAAU,KAAA;YACVC,KAAAA,EAAOb,qBAAAA,CAAKc,QAAQ,CAAChB,IAAAA;AACvB,SAAA,CAAA;QAEA,MAAMiB,QAAAA,GAAWC,qCAAAA,CAAmBlB,IAAAA,EAAMP,sBAAAA,CAAuBO,IAAAA,CAAAA,CAAAA;AAEjE,QAAA,IAAIiB,SAASE,MAAM,KAAK,GAAGzB,kBAAAA,CAAE0B,KAAK,CAACxB,IAAAA,EAAMU,GAAAA,CAAAA;QACzCZ,kBAAAA,CAAE0B,KAAK,CAACxB,IAAAA,EAAMF,kBAAAA,CAAE2B,OAAO,CAAC,EAAC,EAAGJ,QAAAA,EAAUX,GAAAA,EAAKI,MAAAA,CAAAA,CAAAA;AAC7C,IAAA;IAEA,OAAOd,IAAAA;AACT;;;;"}
@@ -2,9 +2,13 @@
2
2
 
3
3
  var open = require('open');
4
4
 
5
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
+
7
+ var open__default = /*#__PURE__*/_interopDefault(open);
8
+
5
9
  const openBrowser = async (config)=>{
6
10
  const url = config.get('admin.absoluteUrl');
7
- return open(url);
11
+ return open__default.default(url);
8
12
  };
9
13
 
10
14
  exports.openBrowser = openBrowser;
@@ -1 +1 @@
1
- {"version":3,"file":"open-browser.js","sources":["../../src/utils/open-browser.ts"],"sourcesContent":["import open from 'open';\n\nimport type { Core } from '@strapi/types';\n\nexport const openBrowser = async (config: Core.ConfigProvider) => {\n const url = config.get<string>('admin.absoluteUrl');\n\n return open(url);\n};\n"],"names":["openBrowser","config","url","get","open"],"mappings":";;;;AAIO,MAAMA,cAAc,OAAOC,MAAAA,GAAAA;IAChC,MAAMC,GAAAA,GAAMD,MAAAA,CAAOE,GAAG,CAAS,mBAAA,CAAA;AAE/B,IAAA,OAAOC,IAAAA,CAAKF,GAAAA,CAAAA;AACd;;;;"}
1
+ {"version":3,"file":"open-browser.js","sources":["../../src/utils/open-browser.ts"],"sourcesContent":["import open from 'open';\n\nimport type { Core } from '@strapi/types';\n\nexport const openBrowser = async (config: Core.ConfigProvider) => {\n const url = config.get<string>('admin.absoluteUrl');\n\n return open(url);\n};\n"],"names":["openBrowser","config","url","get","open"],"mappings":";;;;;;;;AAIO,MAAMA,cAAc,OAAOC,MAAAA,GAAAA;IAChC,MAAMC,GAAAA,GAAMD,MAAAA,CAAOE,GAAG,CAAS,mBAAA,CAAA;AAE/B,IAAA,OAAOC,qBAAAA,CAAKF,GAAAA,CAAAA;AACd;;;;"}