@strapi/core 0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403 → 0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d

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 (122) hide show
  1. package/dist/core-api/controller/collection-type.d.ts.map +1 -1
  2. package/dist/core-api/controller/collection-type.js +2 -0
  3. package/dist/core-api/controller/collection-type.js.map +1 -1
  4. package/dist/core-api/controller/collection-type.mjs +2 -0
  5. package/dist/core-api/controller/collection-type.mjs.map +1 -1
  6. package/dist/core-api/controller/single-type.d.ts.map +1 -1
  7. package/dist/core-api/controller/single-type.js +1 -0
  8. package/dist/core-api/controller/single-type.js.map +1 -1
  9. package/dist/core-api/controller/single-type.mjs +1 -0
  10. package/dist/core-api/controller/single-type.mjs.map +1 -1
  11. package/dist/core-api/service/collection-type.d.ts +1 -7
  12. package/dist/core-api/service/collection-type.d.ts.map +1 -1
  13. package/dist/core-api/service/collection-type.js +5 -3
  14. package/dist/core-api/service/collection-type.js.map +1 -1
  15. package/dist/core-api/service/collection-type.mjs +6 -4
  16. package/dist/core-api/service/collection-type.mjs.map +1 -1
  17. package/dist/core-api/service/pagination.d.ts +4 -11
  18. package/dist/core-api/service/pagination.d.ts.map +1 -1
  19. package/dist/core-api/service/pagination.js +14 -40
  20. package/dist/core-api/service/pagination.js.map +1 -1
  21. package/dist/core-api/service/pagination.mjs +16 -42
  22. package/dist/core-api/service/pagination.mjs.map +1 -1
  23. package/dist/core-api/service/single-type.d.ts.map +1 -1
  24. package/dist/core-api/service/single-type.js +2 -1
  25. package/dist/core-api/service/single-type.js.map +1 -1
  26. package/dist/core-api/service/single-type.mjs +2 -1
  27. package/dist/core-api/service/single-type.mjs.map +1 -1
  28. package/dist/loaders/apis.d.ts.map +1 -1
  29. package/dist/loaders/apis.js +10 -10
  30. package/dist/loaders/apis.js.map +1 -1
  31. package/dist/loaders/apis.mjs +10 -10
  32. package/dist/loaders/apis.mjs.map +1 -1
  33. package/dist/loaders/plugins/get-enabled-plugins.d.ts.map +1 -1
  34. package/dist/loaders/plugins/get-enabled-plugins.js +5 -5
  35. package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
  36. package/dist/loaders/plugins/get-enabled-plugins.mjs +5 -5
  37. package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
  38. package/dist/middlewares/cors.d.ts.map +1 -1
  39. package/dist/middlewares/cors.js +6 -8
  40. package/dist/middlewares/cors.js.map +1 -1
  41. package/dist/middlewares/cors.mjs +6 -8
  42. package/dist/middlewares/cors.mjs.map +1 -1
  43. package/dist/migrations/database/5.0.0-discard-drafts.d.ts +30 -0
  44. package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -0
  45. package/dist/migrations/database/5.0.0-discard-drafts.js +50 -0
  46. package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -0
  47. package/dist/migrations/database/5.0.0-discard-drafts.mjs +50 -0
  48. package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -0
  49. package/dist/migrations/draft-publish.d.ts.map +1 -1
  50. package/dist/migrations/draft-publish.js +14 -31
  51. package/dist/migrations/draft-publish.js.map +1 -1
  52. package/dist/migrations/draft-publish.mjs +15 -32
  53. package/dist/migrations/draft-publish.mjs.map +1 -1
  54. package/dist/providers/registries.d.ts.map +1 -1
  55. package/dist/providers/registries.js +2 -0
  56. package/dist/providers/registries.js.map +1 -1
  57. package/dist/providers/registries.mjs +2 -0
  58. package/dist/providers/registries.mjs.map +1 -1
  59. package/dist/services/document-service/entries.d.ts +1 -1
  60. package/dist/services/document-service/entries.d.ts.map +1 -1
  61. package/dist/services/document-service/entries.js +2 -1
  62. package/dist/services/document-service/entries.js.map +1 -1
  63. package/dist/services/document-service/entries.mjs +2 -1
  64. package/dist/services/document-service/entries.mjs.map +1 -1
  65. package/dist/services/document-service/events.d.ts +25 -0
  66. package/dist/services/document-service/events.d.ts.map +1 -0
  67. package/dist/services/document-service/events.js +47 -0
  68. package/dist/services/document-service/events.js.map +1 -0
  69. package/dist/services/document-service/events.mjs +47 -0
  70. package/dist/services/document-service/events.mjs.map +1 -0
  71. package/dist/services/document-service/index.d.ts.map +1 -1
  72. package/dist/services/document-service/index.js.map +1 -1
  73. package/dist/services/document-service/index.mjs.map +1 -1
  74. package/dist/services/document-service/internationalization.d.ts.map +1 -1
  75. package/dist/services/document-service/internationalization.js +14 -5
  76. package/dist/services/document-service/internationalization.js.map +1 -1
  77. package/dist/services/document-service/internationalization.mjs +14 -5
  78. package/dist/services/document-service/internationalization.mjs.map +1 -1
  79. package/dist/services/document-service/repository.d.ts.map +1 -1
  80. package/dist/services/document-service/repository.js +73 -45
  81. package/dist/services/document-service/repository.js.map +1 -1
  82. package/dist/services/document-service/repository.mjs +75 -47
  83. package/dist/services/document-service/repository.mjs.map +1 -1
  84. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts.map +1 -1
  85. package/dist/services/document-service/transform/relations/extract/data-ids.js +3 -0
  86. package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
  87. package/dist/services/document-service/transform/relations/extract/data-ids.mjs +3 -0
  88. package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
  89. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts.map +1 -1
  90. package/dist/services/document-service/transform/relations/transform/data-ids.js +3 -0
  91. package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
  92. package/dist/services/document-service/transform/relations/transform/data-ids.mjs +3 -0
  93. package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
  94. package/dist/services/document-service/transform/relations/utils/map-relation.d.ts.map +1 -1
  95. package/dist/services/document-service/transform/relations/utils/map-relation.js +7 -3
  96. package/dist/services/document-service/transform/relations/utils/map-relation.js.map +1 -1
  97. package/dist/services/document-service/transform/relations/utils/map-relation.mjs +7 -3
  98. package/dist/services/document-service/transform/relations/utils/map-relation.mjs.map +1 -1
  99. package/dist/services/event-hub.d.ts +1 -0
  100. package/dist/services/event-hub.d.ts.map +1 -1
  101. package/dist/services/event-hub.js +9 -4
  102. package/dist/services/event-hub.js.map +1 -1
  103. package/dist/services/event-hub.mjs +9 -4
  104. package/dist/services/event-hub.mjs.map +1 -1
  105. package/dist/services/server/koa.d.ts.map +1 -1
  106. package/dist/services/server/koa.js +1 -1
  107. package/dist/services/server/koa.js.map +1 -1
  108. package/dist/services/server/koa.mjs +1 -1
  109. package/dist/services/server/koa.mjs.map +1 -1
  110. package/dist/services/webhook-runner.d.ts +2 -1
  111. package/dist/services/webhook-runner.d.ts.map +1 -1
  112. package/dist/services/webhook-runner.js.map +1 -1
  113. package/dist/services/webhook-runner.mjs.map +1 -1
  114. package/dist/services/webhook-store.d.ts +2 -8
  115. package/dist/services/webhook-store.d.ts.map +1 -1
  116. package/dist/services/webhook-store.js +9 -2
  117. package/dist/services/webhook-store.js.map +1 -1
  118. package/dist/services/webhook-store.mjs +9 -2
  119. package/dist/services/webhook-store.mjs.map +1 -1
  120. package/package.json +19 -17
  121. package/dist/services/document-service/document-engine.d.ts +0 -1
  122. package/dist/services/document-service/document-engine.d.ts.map +0 -1
@@ -38,7 +38,7 @@ function createEventHub() {
38
38
  };
39
39
  },
40
40
  off(eventName, listener) {
41
- listeners.get(eventName).splice(listeners.get(eventName).indexOf(listener), 1);
41
+ listeners.get(eventName)?.splice(listeners.get(eventName).indexOf(listener), 1);
42
42
  },
43
43
  once(eventName, listener) {
44
44
  return eventHub.on(eventName, async (...args) => {
@@ -47,15 +47,20 @@ function createEventHub() {
47
47
  });
48
48
  },
49
49
  destroy() {
50
- listeners.clear();
51
- subscribers.length = 0;
50
+ this.removeAllListeners();
51
+ this.removeAllSubscribers();
52
52
  return this;
53
53
  },
54
54
  removeListener(eventName, listener) {
55
55
  return eventHub.off(eventName, listener);
56
56
  },
57
57
  removeAllListeners() {
58
- return eventHub.destroy();
58
+ listeners.clear();
59
+ return this;
60
+ },
61
+ removeAllSubscribers() {
62
+ subscribers.length = 0;
63
+ return this;
59
64
  },
60
65
  addListener(eventName, listener) {
61
66
  return eventHub.on(eventName, listener);
@@ -1 +1 @@
1
- {"version":3,"file":"event-hub.js","sources":["../../src/services/event-hub.ts"],"sourcesContent":["export type Subscriber = (eventName: string, ...args: any[]) => Promise<void>;\nexport type Listener = (...args: any[]) => Promise<void>;\n\nexport interface EventHub {\n emit(eventName: string, ...args: unknown[]): Promise<void>;\n subscribe(subscriber: Subscriber): () => void;\n unsubscribe(subscriber: Subscriber): void;\n on(eventName: string, listener: Listener): () => void;\n off(eventName: string, listener: Listener): void;\n once(eventName: string, listener: Listener): () => void;\n destroy(): EventHub;\n removeListener(eventName: string, listener: Listener): void;\n removeAllListeners(): EventHub;\n addListener(eventName: string, listener: Listener): () => void;\n}\n\n/**\n * The event hub is Strapi's event control center.\n */\nexport default function createEventHub(): EventHub {\n const listeners = new Map();\n\n // Default subscriber to easily add listeners with the on() method\n const defaultSubscriber = async (eventName: string, ...args: unknown[]) => {\n if (listeners.has(eventName)) {\n for (const listener of listeners.get(eventName)) {\n await listener(...args);\n }\n }\n };\n\n // Store of subscribers that will be called when an event is emitted\n const subscribers = [defaultSubscriber];\n\n const eventHub: EventHub = {\n async emit(eventName, ...args) {\n for (const subscriber of subscribers) {\n await subscriber(eventName, ...args);\n }\n },\n\n subscribe(subscriber) {\n subscribers.push(subscriber);\n\n // Return a function to remove the subscriber\n return () => {\n eventHub.unsubscribe(subscriber);\n };\n },\n\n unsubscribe(subscriber) {\n const subscriberIndex = subscribers.indexOf(subscriber);\n\n // Only remove the subscriber if it exists\n if (subscriberIndex >= 0) {\n subscribers.splice(subscriberIndex, 1);\n }\n },\n\n on(eventName, listener) {\n if (!listeners.has(eventName)) {\n listeners.set(eventName, [listener]);\n } else {\n listeners.get(eventName).push(listener);\n }\n\n // Return a function to remove the listener\n return () => {\n eventHub.off(eventName, listener);\n };\n },\n\n off(eventName, listener) {\n listeners.get(eventName).splice(listeners.get(eventName).indexOf(listener), 1);\n },\n\n once(eventName, listener) {\n return eventHub.on(eventName, async (...args) => {\n eventHub.off(eventName, listener);\n return listener(...args);\n });\n },\n\n destroy() {\n listeners.clear();\n subscribers.length = 0;\n return this;\n },\n\n removeListener(eventName, listener) {\n return eventHub.off(eventName, listener);\n },\n\n removeAllListeners() {\n return eventHub.destroy();\n },\n\n addListener(eventName, listener) {\n return eventHub.on(eventName, listener);\n },\n };\n\n return eventHub;\n}\n"],"names":[],"mappings":";AAmBA,SAAwB,iBAA2B;AAC3C,QAAA,gCAAgB;AAGhB,QAAA,oBAAoB,OAAO,cAAsB,SAAoB;AACrE,QAAA,UAAU,IAAI,SAAS,GAAG;AAC5B,iBAAW,YAAY,UAAU,IAAI,SAAS,GAAG;AACzC,cAAA,SAAS,GAAG,IAAI;AAAA,MACxB;AAAA,IACF;AAAA,EAAA;AAII,QAAA,cAAc,CAAC,iBAAiB;AAEtC,QAAM,WAAqB;AAAA,IACzB,MAAM,KAAK,cAAc,MAAM;AAC7B,iBAAW,cAAc,aAAa;AAC9B,cAAA,WAAW,WAAW,GAAG,IAAI;AAAA,MACrC;AAAA,IACF;AAAA,IAEA,UAAU,YAAY;AACpB,kBAAY,KAAK,UAAU;AAG3B,aAAO,MAAM;AACX,iBAAS,YAAY,UAAU;AAAA,MAAA;AAAA,IAEnC;AAAA,IAEA,YAAY,YAAY;AAChB,YAAA,kBAAkB,YAAY,QAAQ,UAAU;AAGtD,UAAI,mBAAmB,GAAG;AACZ,oBAAA,OAAO,iBAAiB,CAAC;AAAA,MACvC;AAAA,IACF;AAAA,IAEA,GAAG,WAAW,UAAU;AACtB,UAAI,CAAC,UAAU,IAAI,SAAS,GAAG;AAC7B,kBAAU,IAAI,WAAW,CAAC,QAAQ,CAAC;AAAA,MAAA,OAC9B;AACL,kBAAU,IAAI,SAAS,EAAE,KAAK,QAAQ;AAAA,MACxC;AAGA,aAAO,MAAM;AACF,iBAAA,IAAI,WAAW,QAAQ;AAAA,MAAA;AAAA,IAEpC;AAAA,IAEA,IAAI,WAAW,UAAU;AACb,gBAAA,IAAI,SAAS,EAAE,OAAO,UAAU,IAAI,SAAS,EAAE,QAAQ,QAAQ,GAAG,CAAC;AAAA,IAC/E;AAAA,IAEA,KAAK,WAAW,UAAU;AACxB,aAAO,SAAS,GAAG,WAAW,UAAU,SAAS;AACtC,iBAAA,IAAI,WAAW,QAAQ;AACzB,eAAA,SAAS,GAAG,IAAI;AAAA,MAAA,CACxB;AAAA,IACH;AAAA,IAEA,UAAU;AACR,gBAAU,MAAM;AAChB,kBAAY,SAAS;AACd,aAAA;AAAA,IACT;AAAA,IAEA,eAAe,WAAW,UAAU;AAC3B,aAAA,SAAS,IAAI,WAAW,QAAQ;AAAA,IACzC;AAAA,IAEA,qBAAqB;AACnB,aAAO,SAAS;IAClB;AAAA,IAEA,YAAY,WAAW,UAAU;AACxB,aAAA,SAAS,GAAG,WAAW,QAAQ;AAAA,IACxC;AAAA,EAAA;AAGK,SAAA;AACT;;"}
1
+ {"version":3,"file":"event-hub.js","sources":["../../src/services/event-hub.ts"],"sourcesContent":["export type Subscriber = (eventName: string, ...args: any[]) => Promise<void>;\nexport type Listener = (...args: any[]) => Promise<void>;\n\nexport interface EventHub {\n emit(eventName: string, ...args: unknown[]): Promise<void>;\n subscribe(subscriber: Subscriber): () => void;\n unsubscribe(subscriber: Subscriber): void;\n on(eventName: string, listener: Listener): () => void;\n off(eventName: string, listener: Listener): void;\n once(eventName: string, listener: Listener): () => void;\n destroy(): EventHub;\n removeListener(eventName: string, listener: Listener): void;\n removeAllListeners(): EventHub;\n removeAllSubscribers(): EventHub;\n addListener(eventName: string, listener: Listener): () => void;\n}\n\n/**\n * The event hub is Strapi's event control center.\n */\nexport default function createEventHub(): EventHub {\n const listeners = new Map();\n\n // Default subscriber to easily add listeners with the on() method\n const defaultSubscriber = async (eventName: string, ...args: unknown[]) => {\n if (listeners.has(eventName)) {\n for (const listener of listeners.get(eventName)) {\n await listener(...args);\n }\n }\n };\n\n // Store of subscribers that will be called when an event is emitted\n const subscribers = [defaultSubscriber];\n\n const eventHub: EventHub = {\n async emit(eventName, ...args) {\n for (const subscriber of subscribers) {\n await subscriber(eventName, ...args);\n }\n },\n\n subscribe(subscriber) {\n subscribers.push(subscriber);\n\n // Return a function to remove the subscriber\n return () => {\n eventHub.unsubscribe(subscriber);\n };\n },\n\n unsubscribe(subscriber) {\n const subscriberIndex = subscribers.indexOf(subscriber);\n\n // Only remove the subscriber if it exists\n if (subscriberIndex >= 0) {\n subscribers.splice(subscriberIndex, 1);\n }\n },\n\n on(eventName, listener) {\n if (!listeners.has(eventName)) {\n listeners.set(eventName, [listener]);\n } else {\n listeners.get(eventName).push(listener);\n }\n\n // Return a function to remove the listener\n return () => {\n eventHub.off(eventName, listener);\n };\n },\n\n off(eventName, listener) {\n listeners.get(eventName)?.splice(listeners.get(eventName).indexOf(listener), 1);\n },\n\n once(eventName, listener) {\n return eventHub.on(eventName, async (...args) => {\n eventHub.off(eventName, listener);\n return listener(...args);\n });\n },\n\n destroy() {\n this.removeAllListeners();\n this.removeAllSubscribers();\n return this;\n },\n\n removeListener(eventName, listener) {\n return eventHub.off(eventName, listener);\n },\n\n removeAllListeners() {\n listeners.clear();\n return this;\n },\n\n removeAllSubscribers() {\n subscribers.length = 0;\n return this;\n },\n\n addListener(eventName, listener) {\n return eventHub.on(eventName, listener);\n },\n };\n\n return eventHub;\n}\n"],"names":[],"mappings":";AAoBA,SAAwB,iBAA2B;AAC3C,QAAA,gCAAgB;AAGhB,QAAA,oBAAoB,OAAO,cAAsB,SAAoB;AACrE,QAAA,UAAU,IAAI,SAAS,GAAG;AAC5B,iBAAW,YAAY,UAAU,IAAI,SAAS,GAAG;AACzC,cAAA,SAAS,GAAG,IAAI;AAAA,MACxB;AAAA,IACF;AAAA,EAAA;AAII,QAAA,cAAc,CAAC,iBAAiB;AAEtC,QAAM,WAAqB;AAAA,IACzB,MAAM,KAAK,cAAc,MAAM;AAC7B,iBAAW,cAAc,aAAa;AAC9B,cAAA,WAAW,WAAW,GAAG,IAAI;AAAA,MACrC;AAAA,IACF;AAAA,IAEA,UAAU,YAAY;AACpB,kBAAY,KAAK,UAAU;AAG3B,aAAO,MAAM;AACX,iBAAS,YAAY,UAAU;AAAA,MAAA;AAAA,IAEnC;AAAA,IAEA,YAAY,YAAY;AAChB,YAAA,kBAAkB,YAAY,QAAQ,UAAU;AAGtD,UAAI,mBAAmB,GAAG;AACZ,oBAAA,OAAO,iBAAiB,CAAC;AAAA,MACvC;AAAA,IACF;AAAA,IAEA,GAAG,WAAW,UAAU;AACtB,UAAI,CAAC,UAAU,IAAI,SAAS,GAAG;AAC7B,kBAAU,IAAI,WAAW,CAAC,QAAQ,CAAC;AAAA,MAAA,OAC9B;AACL,kBAAU,IAAI,SAAS,EAAE,KAAK,QAAQ;AAAA,MACxC;AAGA,aAAO,MAAM;AACF,iBAAA,IAAI,WAAW,QAAQ;AAAA,MAAA;AAAA,IAEpC;AAAA,IAEA,IAAI,WAAW,UAAU;AACb,gBAAA,IAAI,SAAS,GAAG,OAAO,UAAU,IAAI,SAAS,EAAE,QAAQ,QAAQ,GAAG,CAAC;AAAA,IAChF;AAAA,IAEA,KAAK,WAAW,UAAU;AACxB,aAAO,SAAS,GAAG,WAAW,UAAU,SAAS;AACtC,iBAAA,IAAI,WAAW,QAAQ;AACzB,eAAA,SAAS,GAAG,IAAI;AAAA,MAAA,CACxB;AAAA,IACH;AAAA,IAEA,UAAU;AACR,WAAK,mBAAmB;AACxB,WAAK,qBAAqB;AACnB,aAAA;AAAA,IACT;AAAA,IAEA,eAAe,WAAW,UAAU;AAC3B,aAAA,SAAS,IAAI,WAAW,QAAQ;AAAA,IACzC;AAAA,IAEA,qBAAqB;AACnB,gBAAU,MAAM;AACT,aAAA;AAAA,IACT;AAAA,IAEA,uBAAuB;AACrB,kBAAY,SAAS;AACd,aAAA;AAAA,IACT;AAAA,IAEA,YAAY,WAAW,UAAU;AACxB,aAAA,SAAS,GAAG,WAAW,QAAQ;AAAA,IACxC;AAAA,EAAA;AAGK,SAAA;AACT;;"}
@@ -37,7 +37,7 @@ function createEventHub() {
37
37
  };
38
38
  },
39
39
  off(eventName, listener) {
40
- listeners.get(eventName).splice(listeners.get(eventName).indexOf(listener), 1);
40
+ listeners.get(eventName)?.splice(listeners.get(eventName).indexOf(listener), 1);
41
41
  },
42
42
  once(eventName, listener) {
43
43
  return eventHub.on(eventName, async (...args) => {
@@ -46,15 +46,20 @@ function createEventHub() {
46
46
  });
47
47
  },
48
48
  destroy() {
49
- listeners.clear();
50
- subscribers.length = 0;
49
+ this.removeAllListeners();
50
+ this.removeAllSubscribers();
51
51
  return this;
52
52
  },
53
53
  removeListener(eventName, listener) {
54
54
  return eventHub.off(eventName, listener);
55
55
  },
56
56
  removeAllListeners() {
57
- return eventHub.destroy();
57
+ listeners.clear();
58
+ return this;
59
+ },
60
+ removeAllSubscribers() {
61
+ subscribers.length = 0;
62
+ return this;
58
63
  },
59
64
  addListener(eventName, listener) {
60
65
  return eventHub.on(eventName, listener);
@@ -1 +1 @@
1
- {"version":3,"file":"event-hub.mjs","sources":["../../src/services/event-hub.ts"],"sourcesContent":["export type Subscriber = (eventName: string, ...args: any[]) => Promise<void>;\nexport type Listener = (...args: any[]) => Promise<void>;\n\nexport interface EventHub {\n emit(eventName: string, ...args: unknown[]): Promise<void>;\n subscribe(subscriber: Subscriber): () => void;\n unsubscribe(subscriber: Subscriber): void;\n on(eventName: string, listener: Listener): () => void;\n off(eventName: string, listener: Listener): void;\n once(eventName: string, listener: Listener): () => void;\n destroy(): EventHub;\n removeListener(eventName: string, listener: Listener): void;\n removeAllListeners(): EventHub;\n addListener(eventName: string, listener: Listener): () => void;\n}\n\n/**\n * The event hub is Strapi's event control center.\n */\nexport default function createEventHub(): EventHub {\n const listeners = new Map();\n\n // Default subscriber to easily add listeners with the on() method\n const defaultSubscriber = async (eventName: string, ...args: unknown[]) => {\n if (listeners.has(eventName)) {\n for (const listener of listeners.get(eventName)) {\n await listener(...args);\n }\n }\n };\n\n // Store of subscribers that will be called when an event is emitted\n const subscribers = [defaultSubscriber];\n\n const eventHub: EventHub = {\n async emit(eventName, ...args) {\n for (const subscriber of subscribers) {\n await subscriber(eventName, ...args);\n }\n },\n\n subscribe(subscriber) {\n subscribers.push(subscriber);\n\n // Return a function to remove the subscriber\n return () => {\n eventHub.unsubscribe(subscriber);\n };\n },\n\n unsubscribe(subscriber) {\n const subscriberIndex = subscribers.indexOf(subscriber);\n\n // Only remove the subscriber if it exists\n if (subscriberIndex >= 0) {\n subscribers.splice(subscriberIndex, 1);\n }\n },\n\n on(eventName, listener) {\n if (!listeners.has(eventName)) {\n listeners.set(eventName, [listener]);\n } else {\n listeners.get(eventName).push(listener);\n }\n\n // Return a function to remove the listener\n return () => {\n eventHub.off(eventName, listener);\n };\n },\n\n off(eventName, listener) {\n listeners.get(eventName).splice(listeners.get(eventName).indexOf(listener), 1);\n },\n\n once(eventName, listener) {\n return eventHub.on(eventName, async (...args) => {\n eventHub.off(eventName, listener);\n return listener(...args);\n });\n },\n\n destroy() {\n listeners.clear();\n subscribers.length = 0;\n return this;\n },\n\n removeListener(eventName, listener) {\n return eventHub.off(eventName, listener);\n },\n\n removeAllListeners() {\n return eventHub.destroy();\n },\n\n addListener(eventName, listener) {\n return eventHub.on(eventName, listener);\n },\n };\n\n return eventHub;\n}\n"],"names":[],"mappings":"AAmBA,SAAwB,iBAA2B;AAC3C,QAAA,gCAAgB;AAGhB,QAAA,oBAAoB,OAAO,cAAsB,SAAoB;AACrE,QAAA,UAAU,IAAI,SAAS,GAAG;AAC5B,iBAAW,YAAY,UAAU,IAAI,SAAS,GAAG;AACzC,cAAA,SAAS,GAAG,IAAI;AAAA,MACxB;AAAA,IACF;AAAA,EAAA;AAII,QAAA,cAAc,CAAC,iBAAiB;AAEtC,QAAM,WAAqB;AAAA,IACzB,MAAM,KAAK,cAAc,MAAM;AAC7B,iBAAW,cAAc,aAAa;AAC9B,cAAA,WAAW,WAAW,GAAG,IAAI;AAAA,MACrC;AAAA,IACF;AAAA,IAEA,UAAU,YAAY;AACpB,kBAAY,KAAK,UAAU;AAG3B,aAAO,MAAM;AACX,iBAAS,YAAY,UAAU;AAAA,MAAA;AAAA,IAEnC;AAAA,IAEA,YAAY,YAAY;AAChB,YAAA,kBAAkB,YAAY,QAAQ,UAAU;AAGtD,UAAI,mBAAmB,GAAG;AACZ,oBAAA,OAAO,iBAAiB,CAAC;AAAA,MACvC;AAAA,IACF;AAAA,IAEA,GAAG,WAAW,UAAU;AACtB,UAAI,CAAC,UAAU,IAAI,SAAS,GAAG;AAC7B,kBAAU,IAAI,WAAW,CAAC,QAAQ,CAAC;AAAA,MAAA,OAC9B;AACL,kBAAU,IAAI,SAAS,EAAE,KAAK,QAAQ;AAAA,MACxC;AAGA,aAAO,MAAM;AACF,iBAAA,IAAI,WAAW,QAAQ;AAAA,MAAA;AAAA,IAEpC;AAAA,IAEA,IAAI,WAAW,UAAU;AACb,gBAAA,IAAI,SAAS,EAAE,OAAO,UAAU,IAAI,SAAS,EAAE,QAAQ,QAAQ,GAAG,CAAC;AAAA,IAC/E;AAAA,IAEA,KAAK,WAAW,UAAU;AACxB,aAAO,SAAS,GAAG,WAAW,UAAU,SAAS;AACtC,iBAAA,IAAI,WAAW,QAAQ;AACzB,eAAA,SAAS,GAAG,IAAI;AAAA,MAAA,CACxB;AAAA,IACH;AAAA,IAEA,UAAU;AACR,gBAAU,MAAM;AAChB,kBAAY,SAAS;AACd,aAAA;AAAA,IACT;AAAA,IAEA,eAAe,WAAW,UAAU;AAC3B,aAAA,SAAS,IAAI,WAAW,QAAQ;AAAA,IACzC;AAAA,IAEA,qBAAqB;AACnB,aAAO,SAAS;IAClB;AAAA,IAEA,YAAY,WAAW,UAAU;AACxB,aAAA,SAAS,GAAG,WAAW,QAAQ;AAAA,IACxC;AAAA,EAAA;AAGK,SAAA;AACT;"}
1
+ {"version":3,"file":"event-hub.mjs","sources":["../../src/services/event-hub.ts"],"sourcesContent":["export type Subscriber = (eventName: string, ...args: any[]) => Promise<void>;\nexport type Listener = (...args: any[]) => Promise<void>;\n\nexport interface EventHub {\n emit(eventName: string, ...args: unknown[]): Promise<void>;\n subscribe(subscriber: Subscriber): () => void;\n unsubscribe(subscriber: Subscriber): void;\n on(eventName: string, listener: Listener): () => void;\n off(eventName: string, listener: Listener): void;\n once(eventName: string, listener: Listener): () => void;\n destroy(): EventHub;\n removeListener(eventName: string, listener: Listener): void;\n removeAllListeners(): EventHub;\n removeAllSubscribers(): EventHub;\n addListener(eventName: string, listener: Listener): () => void;\n}\n\n/**\n * The event hub is Strapi's event control center.\n */\nexport default function createEventHub(): EventHub {\n const listeners = new Map();\n\n // Default subscriber to easily add listeners with the on() method\n const defaultSubscriber = async (eventName: string, ...args: unknown[]) => {\n if (listeners.has(eventName)) {\n for (const listener of listeners.get(eventName)) {\n await listener(...args);\n }\n }\n };\n\n // Store of subscribers that will be called when an event is emitted\n const subscribers = [defaultSubscriber];\n\n const eventHub: EventHub = {\n async emit(eventName, ...args) {\n for (const subscriber of subscribers) {\n await subscriber(eventName, ...args);\n }\n },\n\n subscribe(subscriber) {\n subscribers.push(subscriber);\n\n // Return a function to remove the subscriber\n return () => {\n eventHub.unsubscribe(subscriber);\n };\n },\n\n unsubscribe(subscriber) {\n const subscriberIndex = subscribers.indexOf(subscriber);\n\n // Only remove the subscriber if it exists\n if (subscriberIndex >= 0) {\n subscribers.splice(subscriberIndex, 1);\n }\n },\n\n on(eventName, listener) {\n if (!listeners.has(eventName)) {\n listeners.set(eventName, [listener]);\n } else {\n listeners.get(eventName).push(listener);\n }\n\n // Return a function to remove the listener\n return () => {\n eventHub.off(eventName, listener);\n };\n },\n\n off(eventName, listener) {\n listeners.get(eventName)?.splice(listeners.get(eventName).indexOf(listener), 1);\n },\n\n once(eventName, listener) {\n return eventHub.on(eventName, async (...args) => {\n eventHub.off(eventName, listener);\n return listener(...args);\n });\n },\n\n destroy() {\n this.removeAllListeners();\n this.removeAllSubscribers();\n return this;\n },\n\n removeListener(eventName, listener) {\n return eventHub.off(eventName, listener);\n },\n\n removeAllListeners() {\n listeners.clear();\n return this;\n },\n\n removeAllSubscribers() {\n subscribers.length = 0;\n return this;\n },\n\n addListener(eventName, listener) {\n return eventHub.on(eventName, listener);\n },\n };\n\n return eventHub;\n}\n"],"names":[],"mappings":"AAoBA,SAAwB,iBAA2B;AAC3C,QAAA,gCAAgB;AAGhB,QAAA,oBAAoB,OAAO,cAAsB,SAAoB;AACrE,QAAA,UAAU,IAAI,SAAS,GAAG;AAC5B,iBAAW,YAAY,UAAU,IAAI,SAAS,GAAG;AACzC,cAAA,SAAS,GAAG,IAAI;AAAA,MACxB;AAAA,IACF;AAAA,EAAA;AAII,QAAA,cAAc,CAAC,iBAAiB;AAEtC,QAAM,WAAqB;AAAA,IACzB,MAAM,KAAK,cAAc,MAAM;AAC7B,iBAAW,cAAc,aAAa;AAC9B,cAAA,WAAW,WAAW,GAAG,IAAI;AAAA,MACrC;AAAA,IACF;AAAA,IAEA,UAAU,YAAY;AACpB,kBAAY,KAAK,UAAU;AAG3B,aAAO,MAAM;AACX,iBAAS,YAAY,UAAU;AAAA,MAAA;AAAA,IAEnC;AAAA,IAEA,YAAY,YAAY;AAChB,YAAA,kBAAkB,YAAY,QAAQ,UAAU;AAGtD,UAAI,mBAAmB,GAAG;AACZ,oBAAA,OAAO,iBAAiB,CAAC;AAAA,MACvC;AAAA,IACF;AAAA,IAEA,GAAG,WAAW,UAAU;AACtB,UAAI,CAAC,UAAU,IAAI,SAAS,GAAG;AAC7B,kBAAU,IAAI,WAAW,CAAC,QAAQ,CAAC;AAAA,MAAA,OAC9B;AACL,kBAAU,IAAI,SAAS,EAAE,KAAK,QAAQ;AAAA,MACxC;AAGA,aAAO,MAAM;AACF,iBAAA,IAAI,WAAW,QAAQ;AAAA,MAAA;AAAA,IAEpC;AAAA,IAEA,IAAI,WAAW,UAAU;AACb,gBAAA,IAAI,SAAS,GAAG,OAAO,UAAU,IAAI,SAAS,EAAE,QAAQ,QAAQ,GAAG,CAAC;AAAA,IAChF;AAAA,IAEA,KAAK,WAAW,UAAU;AACxB,aAAO,SAAS,GAAG,WAAW,UAAU,SAAS;AACtC,iBAAA,IAAI,WAAW,QAAQ;AACzB,eAAA,SAAS,GAAG,IAAI;AAAA,MAAA,CACxB;AAAA,IACH;AAAA,IAEA,UAAU;AACR,WAAK,mBAAmB;AACxB,WAAK,qBAAqB;AACnB,aAAA;AAAA,IACT;AAAA,IAEA,eAAe,WAAW,UAAU;AAC3B,aAAA,SAAS,IAAI,WAAW,QAAQ;AAAA,IACzC;AAAA,IAEA,qBAAqB;AACnB,gBAAU,MAAM;AACT,aAAA;AAAA,IACT;AAAA,IAEA,uBAAuB;AACrB,kBAAY,SAAS;AACd,aAAA;AAAA,IACT;AAAA,IAEA,YAAY,WAAW,UAAU;AACxB,aAAA,SAAS,GAAG,WAAW,QAAQ;AAAA,IACxC;AAAA,EAAA;AAGK,SAAA;AACT;"}
@@ -1 +1 @@
1
- {"version":3,"file":"koa.d.ts","sourceRoot":"","sources":["../../../src/services/server/koa.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,KAAK,CAAC;AAMtB,OAAO,QAAQ,KAAK,CAAC;IACnB,UAAU,YAAY;QACpB,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAC3C,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;QAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;QAC7B,eAAe,EAAE,OAAO,CAAC;QACzB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;KAC7D;CACF;AA6CD,QAAA,MAAM,YAAY,oBAAqB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,8CAOxE,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"koa.d.ts","sourceRoot":"","sources":["../../../src/services/server/koa.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,KAAK,CAAC;AAMtB,OAAO,QAAQ,KAAK,CAAC;IACnB,UAAU,YAAY;QACpB,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAC3C,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;QAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;QAC7B,eAAe,EAAE,OAAO,CAAC;QACzB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;KAC7D;CACF;AA8CD,QAAA,MAAM,YAAY,oBAAqB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,8CAOxE,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -15,7 +15,7 @@ const addCustomMethods = (app) => {
15
15
  statuses__default.default.codes.filter((code) => code >= 400 && code < 600).forEach((code) => {
16
16
  const name = statuses__default.default(code);
17
17
  const camelCasedName = _.camelCase(name);
18
- app.response[camelCasedName] = function responseCode(message, details = {}) {
18
+ app.response[camelCasedName] = function responseCode(message = name, details = {}) {
19
19
  const httpError = createError__default.default(code, message, { details });
20
20
  const { status, body } = errors.formatHttpError(httpError);
21
21
  this.status = status;
@@ -1 +1 @@
1
- {"version":3,"file":"koa.js","sources":["../../../src/services/server/koa.ts"],"sourcesContent":["import { isNil, camelCase } from 'lodash/fp';\nimport Koa from 'koa';\nimport createError from 'http-errors';\nimport delegate from 'delegates';\nimport statuses from 'statuses';\nimport { formatHttpError } from '../errors';\n\ndeclare module 'koa' {\n interface BaseResponse {\n send: (data: any, status?: number) => void;\n created: (data: any) => void;\n deleted: (data: any) => void;\n _explicitStatus: boolean;\n [key: string]: (message: string, details?: unknown) => void;\n }\n}\n\nconst addCustomMethods = (app: Koa) => {\n const delegator = delegate(app.context, 'response');\n\n /* errors */\n statuses.codes\n .filter((code) => code >= 400 && code < 600)\n .forEach((code) => {\n const name = statuses(code);\n const camelCasedName = camelCase(name);\n app.response[camelCasedName] = function responseCode(message, details = {}) {\n const httpError = createError(code, message, { details });\n const { status, body } = formatHttpError(httpError);\n this.status = status;\n this.body = body;\n };\n delegator.method(camelCasedName);\n });\n\n /* send, created, deleted */\n app.response.send = function send(data, status = 200) {\n this.status = status;\n this.body = data;\n };\n\n app.response.created = function created(data) {\n this.status = 201;\n this.body = data;\n };\n\n app.response.deleted = function deleted(data) {\n if (isNil(data)) {\n this.status = 204;\n } else {\n this.status = 200;\n this.body = data;\n }\n };\n\n delegator.method('send').method('created').method('deleted');\n\n return app;\n};\n\nconst createKoaApp = ({ proxy, keys }: { proxy: boolean; keys: string[] }) => {\n const app = new Koa({ proxy });\n app.keys = keys;\n\n addCustomMethods(app);\n\n return app;\n};\n\nexport default createKoaApp;\n"],"names":["delegate","statuses","camelCase","createError","formatHttpError","isNil","Koa"],"mappings":";;;;;;;;;;;;AAiBA,MAAM,mBAAmB,CAAC,QAAa;AACrC,QAAM,YAAYA,kBAAA,QAAS,IAAI,SAAS,UAAU;AAGzCC,oBAAAA,QAAA,MACN,OAAO,CAAC,SAAS,QAAQ,OAAO,OAAO,GAAG,EAC1C,QAAQ,CAAC,SAAS;AACX,UAAA,OAAOA,0BAAS,IAAI;AACpB,UAAA,iBAAiBC,YAAU,IAAI;AACjC,QAAA,SAAS,cAAc,IAAI,SAAS,aAAa,SAAS,UAAU,IAAI;AAC1E,YAAM,YAAYC,qBAAAA,QAAY,MAAM,SAAS,EAAE,SAAS;AACxD,YAAM,EAAE,QAAQ,KAAK,IAAIC,uBAAgB,SAAS;AAClD,WAAK,SAAS;AACd,WAAK,OAAO;AAAA,IAAA;AAEd,cAAU,OAAO,cAAc;AAAA,EAAA,CAChC;AAGH,MAAI,SAAS,OAAO,SAAS,KAAK,MAAM,SAAS,KAAK;AACpD,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EAAA;AAGd,MAAI,SAAS,UAAU,SAAS,QAAQ,MAAM;AAC5C,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EAAA;AAGd,MAAI,SAAS,UAAU,SAAS,QAAQ,MAAM;AACxC,QAAAC,EAAAA,MAAM,IAAI,GAAG;AACf,WAAK,SAAS;AAAA,IAAA,OACT;AACL,WAAK,SAAS;AACd,WAAK,OAAO;AAAA,IACd;AAAA,EAAA;AAGF,YAAU,OAAO,MAAM,EAAE,OAAO,SAAS,EAAE,OAAO,SAAS;AAEpD,SAAA;AACT;AAEA,MAAM,eAAe,CAAC,EAAE,OAAO,WAA+C;AAC5E,QAAM,MAAM,IAAIC,aAAAA,QAAI,EAAE,MAAO,CAAA;AAC7B,MAAI,OAAO;AAEX,mBAAiB,GAAG;AAEb,SAAA;AACT;;"}
1
+ {"version":3,"file":"koa.js","sources":["../../../src/services/server/koa.ts"],"sourcesContent":["import { isNil, camelCase } from 'lodash/fp';\nimport Koa from 'koa';\nimport createError from 'http-errors';\nimport delegate from 'delegates';\nimport statuses from 'statuses';\nimport { formatHttpError } from '../errors';\n\ndeclare module 'koa' {\n interface BaseResponse {\n send: (data: any, status?: number) => void;\n created: (data: any) => void;\n deleted: (data: any) => void;\n _explicitStatus: boolean;\n [key: string]: (message: string, details?: unknown) => void;\n }\n}\n\nconst addCustomMethods = (app: Koa) => {\n const delegator = delegate(app.context, 'response');\n\n /* errors */\n statuses.codes\n .filter((code) => code >= 400 && code < 600)\n .forEach((code) => {\n const name = statuses(code);\n\n const camelCasedName = camelCase(name);\n app.response[camelCasedName] = function responseCode(message = name, details = {}) {\n const httpError = createError(code, message, { details });\n const { status, body } = formatHttpError(httpError);\n this.status = status;\n this.body = body;\n };\n delegator.method(camelCasedName);\n });\n\n /* send, created, deleted */\n app.response.send = function send(data, status = 200) {\n this.status = status;\n this.body = data;\n };\n\n app.response.created = function created(data) {\n this.status = 201;\n this.body = data;\n };\n\n app.response.deleted = function deleted(data) {\n if (isNil(data)) {\n this.status = 204;\n } else {\n this.status = 200;\n this.body = data;\n }\n };\n\n delegator.method('send').method('created').method('deleted');\n\n return app;\n};\n\nconst createKoaApp = ({ proxy, keys }: { proxy: boolean; keys: string[] }) => {\n const app = new Koa({ proxy });\n app.keys = keys;\n\n addCustomMethods(app);\n\n return app;\n};\n\nexport default createKoaApp;\n"],"names":["delegate","statuses","camelCase","createError","formatHttpError","isNil","Koa"],"mappings":";;;;;;;;;;;;AAiBA,MAAM,mBAAmB,CAAC,QAAa;AACrC,QAAM,YAAYA,kBAAA,QAAS,IAAI,SAAS,UAAU;AAGzCC,oBAAAA,QAAA,MACN,OAAO,CAAC,SAAS,QAAQ,OAAO,OAAO,GAAG,EAC1C,QAAQ,CAAC,SAAS;AACX,UAAA,OAAOA,0BAAS,IAAI;AAEpB,UAAA,iBAAiBC,YAAU,IAAI;AACjC,QAAA,SAAS,cAAc,IAAI,SAAS,aAAa,UAAU,MAAM,UAAU,IAAI;AACjF,YAAM,YAAYC,qBAAAA,QAAY,MAAM,SAAS,EAAE,SAAS;AACxD,YAAM,EAAE,QAAQ,KAAK,IAAIC,uBAAgB,SAAS;AAClD,WAAK,SAAS;AACd,WAAK,OAAO;AAAA,IAAA;AAEd,cAAU,OAAO,cAAc;AAAA,EAAA,CAChC;AAGH,MAAI,SAAS,OAAO,SAAS,KAAK,MAAM,SAAS,KAAK;AACpD,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EAAA;AAGd,MAAI,SAAS,UAAU,SAAS,QAAQ,MAAM;AAC5C,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EAAA;AAGd,MAAI,SAAS,UAAU,SAAS,QAAQ,MAAM;AACxC,QAAAC,EAAAA,MAAM,IAAI,GAAG;AACf,WAAK,SAAS;AAAA,IAAA,OACT;AACL,WAAK,SAAS;AACd,WAAK,OAAO;AAAA,IACd;AAAA,EAAA;AAGF,YAAU,OAAO,MAAM,EAAE,OAAO,SAAS,EAAE,OAAO,SAAS;AAEpD,SAAA;AACT;AAEA,MAAM,eAAe,CAAC,EAAE,OAAO,WAA+C;AAC5E,QAAM,MAAM,IAAIC,aAAAA,QAAI,EAAE,MAAO,CAAA;AAC7B,MAAI,OAAO;AAEX,mBAAiB,GAAG;AAEb,SAAA;AACT;;"}
@@ -9,7 +9,7 @@ const addCustomMethods = (app) => {
9
9
  statuses.codes.filter((code) => code >= 400 && code < 600).forEach((code) => {
10
10
  const name = statuses(code);
11
11
  const camelCasedName = camelCase(name);
12
- app.response[camelCasedName] = function responseCode(message, details = {}) {
12
+ app.response[camelCasedName] = function responseCode(message = name, details = {}) {
13
13
  const httpError = createError(code, message, { details });
14
14
  const { status, body } = formatHttpError(httpError);
15
15
  this.status = status;
@@ -1 +1 @@
1
- {"version":3,"file":"koa.mjs","sources":["../../../src/services/server/koa.ts"],"sourcesContent":["import { isNil, camelCase } from 'lodash/fp';\nimport Koa from 'koa';\nimport createError from 'http-errors';\nimport delegate from 'delegates';\nimport statuses from 'statuses';\nimport { formatHttpError } from '../errors';\n\ndeclare module 'koa' {\n interface BaseResponse {\n send: (data: any, status?: number) => void;\n created: (data: any) => void;\n deleted: (data: any) => void;\n _explicitStatus: boolean;\n [key: string]: (message: string, details?: unknown) => void;\n }\n}\n\nconst addCustomMethods = (app: Koa) => {\n const delegator = delegate(app.context, 'response');\n\n /* errors */\n statuses.codes\n .filter((code) => code >= 400 && code < 600)\n .forEach((code) => {\n const name = statuses(code);\n const camelCasedName = camelCase(name);\n app.response[camelCasedName] = function responseCode(message, details = {}) {\n const httpError = createError(code, message, { details });\n const { status, body } = formatHttpError(httpError);\n this.status = status;\n this.body = body;\n };\n delegator.method(camelCasedName);\n });\n\n /* send, created, deleted */\n app.response.send = function send(data, status = 200) {\n this.status = status;\n this.body = data;\n };\n\n app.response.created = function created(data) {\n this.status = 201;\n this.body = data;\n };\n\n app.response.deleted = function deleted(data) {\n if (isNil(data)) {\n this.status = 204;\n } else {\n this.status = 200;\n this.body = data;\n }\n };\n\n delegator.method('send').method('created').method('deleted');\n\n return app;\n};\n\nconst createKoaApp = ({ proxy, keys }: { proxy: boolean; keys: string[] }) => {\n const app = new Koa({ proxy });\n app.keys = keys;\n\n addCustomMethods(app);\n\n return app;\n};\n\nexport default createKoaApp;\n"],"names":[],"mappings":";;;;;;AAiBA,MAAM,mBAAmB,CAAC,QAAa;AACrC,QAAM,YAAY,SAAS,IAAI,SAAS,UAAU;AAGzC,WAAA,MACN,OAAO,CAAC,SAAS,QAAQ,OAAO,OAAO,GAAG,EAC1C,QAAQ,CAAC,SAAS;AACX,UAAA,OAAO,SAAS,IAAI;AACpB,UAAA,iBAAiB,UAAU,IAAI;AACjC,QAAA,SAAS,cAAc,IAAI,SAAS,aAAa,SAAS,UAAU,IAAI;AAC1E,YAAM,YAAY,YAAY,MAAM,SAAS,EAAE,SAAS;AACxD,YAAM,EAAE,QAAQ,KAAK,IAAI,gBAAgB,SAAS;AAClD,WAAK,SAAS;AACd,WAAK,OAAO;AAAA,IAAA;AAEd,cAAU,OAAO,cAAc;AAAA,EAAA,CAChC;AAGH,MAAI,SAAS,OAAO,SAAS,KAAK,MAAM,SAAS,KAAK;AACpD,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EAAA;AAGd,MAAI,SAAS,UAAU,SAAS,QAAQ,MAAM;AAC5C,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EAAA;AAGd,MAAI,SAAS,UAAU,SAAS,QAAQ,MAAM;AACxC,QAAA,MAAM,IAAI,GAAG;AACf,WAAK,SAAS;AAAA,IAAA,OACT;AACL,WAAK,SAAS;AACd,WAAK,OAAO;AAAA,IACd;AAAA,EAAA;AAGF,YAAU,OAAO,MAAM,EAAE,OAAO,SAAS,EAAE,OAAO,SAAS;AAEpD,SAAA;AACT;AAEA,MAAM,eAAe,CAAC,EAAE,OAAO,WAA+C;AAC5E,QAAM,MAAM,IAAI,IAAI,EAAE,MAAO,CAAA;AAC7B,MAAI,OAAO;AAEX,mBAAiB,GAAG;AAEb,SAAA;AACT;"}
1
+ {"version":3,"file":"koa.mjs","sources":["../../../src/services/server/koa.ts"],"sourcesContent":["import { isNil, camelCase } from 'lodash/fp';\nimport Koa from 'koa';\nimport createError from 'http-errors';\nimport delegate from 'delegates';\nimport statuses from 'statuses';\nimport { formatHttpError } from '../errors';\n\ndeclare module 'koa' {\n interface BaseResponse {\n send: (data: any, status?: number) => void;\n created: (data: any) => void;\n deleted: (data: any) => void;\n _explicitStatus: boolean;\n [key: string]: (message: string, details?: unknown) => void;\n }\n}\n\nconst addCustomMethods = (app: Koa) => {\n const delegator = delegate(app.context, 'response');\n\n /* errors */\n statuses.codes\n .filter((code) => code >= 400 && code < 600)\n .forEach((code) => {\n const name = statuses(code);\n\n const camelCasedName = camelCase(name);\n app.response[camelCasedName] = function responseCode(message = name, details = {}) {\n const httpError = createError(code, message, { details });\n const { status, body } = formatHttpError(httpError);\n this.status = status;\n this.body = body;\n };\n delegator.method(camelCasedName);\n });\n\n /* send, created, deleted */\n app.response.send = function send(data, status = 200) {\n this.status = status;\n this.body = data;\n };\n\n app.response.created = function created(data) {\n this.status = 201;\n this.body = data;\n };\n\n app.response.deleted = function deleted(data) {\n if (isNil(data)) {\n this.status = 204;\n } else {\n this.status = 200;\n this.body = data;\n }\n };\n\n delegator.method('send').method('created').method('deleted');\n\n return app;\n};\n\nconst createKoaApp = ({ proxy, keys }: { proxy: boolean; keys: string[] }) => {\n const app = new Koa({ proxy });\n app.keys = keys;\n\n addCustomMethods(app);\n\n return app;\n};\n\nexport default createKoaApp;\n"],"names":[],"mappings":";;;;;;AAiBA,MAAM,mBAAmB,CAAC,QAAa;AACrC,QAAM,YAAY,SAAS,IAAI,SAAS,UAAU;AAGzC,WAAA,MACN,OAAO,CAAC,SAAS,QAAQ,OAAO,OAAO,GAAG,EAC1C,QAAQ,CAAC,SAAS;AACX,UAAA,OAAO,SAAS,IAAI;AAEpB,UAAA,iBAAiB,UAAU,IAAI;AACjC,QAAA,SAAS,cAAc,IAAI,SAAS,aAAa,UAAU,MAAM,UAAU,IAAI;AACjF,YAAM,YAAY,YAAY,MAAM,SAAS,EAAE,SAAS;AACxD,YAAM,EAAE,QAAQ,KAAK,IAAI,gBAAgB,SAAS;AAClD,WAAK,SAAS;AACd,WAAK,OAAO;AAAA,IAAA;AAEd,cAAU,OAAO,cAAc;AAAA,EAAA,CAChC;AAGH,MAAI,SAAS,OAAO,SAAS,KAAK,MAAM,SAAS,KAAK;AACpD,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EAAA;AAGd,MAAI,SAAS,UAAU,SAAS,QAAQ,MAAM;AAC5C,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EAAA;AAGd,MAAI,SAAS,UAAU,SAAS,QAAQ,MAAM;AACxC,QAAA,MAAM,IAAI,GAAG;AACf,WAAK,SAAS;AAAA,IAAA,OACT;AACL,WAAK,SAAS;AACd,WAAK,OAAO;AAAA,IACd;AAAA,EAAA;AAGF,YAAU,OAAO,MAAM,EAAE,OAAO,SAAS,EAAE,OAAO,SAAS;AAEpD,SAAA;AACT;AAEA,MAAM,eAAe,CAAC,EAAE,OAAO,WAA+C;AAC5E,QAAM,MAAM,IAAI,IAAI,EAAE,MAAO,CAAA;AAC7B,MAAI,OAAO;AAEX,mBAAiB,GAAG;AAEb,SAAA;AACT;"}
@@ -2,9 +2,10 @@
2
2
  * The event hub is Strapi's event control center.
3
3
  */
4
4
  import type { Logger } from '@strapi/logger';
5
- import type { Webhook } from './webhook-store';
5
+ import type { Modules } from '@strapi/types';
6
6
  import type { EventHub } from './event-hub';
7
7
  import type { Fetch } from '../utils/fetch';
8
+ type Webhook = Modules.WebhookStore.Webhook;
8
9
  interface ConstructorParameters {
9
10
  eventHub: EventHub;
10
11
  logger: Logger;
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-runner.d.ts","sourceRoot":"","sources":["../../src/services/webhook-runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAM5C,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,KAAK,EAAE,KAAK,CAAC;CACd;AAED,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAUD,cAAM,aAAa;IACjB,OAAO,CAAC,QAAQ,CAAW;IAE3B,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,WAAW,CAAqC;IAExD,OAAO,CAAC,SAAS,CAAoC;IAErD,OAAO,CAAC,KAAK,CAA2B;IAExC,OAAO,CAAC,KAAK,CAAQ;gBAET,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAkB,EAAE,KAAK,EAAE,EAAE,qBAAqB;IAmBlF,cAAc,CAAC,KAAK,EAAE,MAAM;IAW5B,cAAc,CAAC,KAAK,EAAE,MAAM;IAgBtB,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK;IAa5C,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,KAAK;;;;;;;;;;IAsC9C,GAAG,CAAC,OAAO,EAAE,OAAO;IAcpB,MAAM,CAAC,OAAO,EAAE,OAAO;IAMvB,MAAM,CAAC,OAAO,EAAE,OAAO;CAexB;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,aAAa,CAEtF;AAED,YAAY,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"webhook-runner.d.ts","sourceRoot":"","sources":["../../src/services/webhook-runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C,KAAK,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;AAM5C,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,KAAK,EAAE,KAAK,CAAC;CACd;AAED,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAUD,cAAM,aAAa;IACjB,OAAO,CAAC,QAAQ,CAAW;IAE3B,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,WAAW,CAAqC;IAExD,OAAO,CAAC,SAAS,CAAoC;IAErD,OAAO,CAAC,KAAK,CAA2B;IAExC,OAAO,CAAC,KAAK,CAAQ;gBAET,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAkB,EAAE,KAAK,EAAE,EAAE,qBAAqB;IAmBlF,cAAc,CAAC,KAAK,EAAE,MAAM;IAW5B,cAAc,CAAC,KAAK,EAAE,MAAM;IAgBtB,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK;IAa5C,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,KAAK;;;;;;;;;;IAsC9C,GAAG,CAAC,OAAO,EAAE,OAAO;IAcpB,MAAM,CAAC,OAAO,EAAE,OAAO;IAMvB,MAAM,CAAC,OAAO,EAAE,OAAO;CAexB;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,aAAa,CAEtF;AAED,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-runner.js","sources":["../../src/services/webhook-runner.ts"],"sourcesContent":["/**\n * The event hub is Strapi's event control center.\n */\n\nimport createdDebugger from 'debug';\nimport _ from 'lodash';\nimport type { Logger } from '@strapi/logger';\n\nimport WorkerQueue from './worker-queue';\nimport type { Webhook } from './webhook-store';\nimport type { EventHub } from './event-hub';\nimport type { Fetch } from '../utils/fetch';\n\ninterface Config {\n defaultHeaders: Record<string, string>;\n}\n\ninterface ConstructorParameters {\n eventHub: EventHub;\n logger: Logger;\n configuration?: Record<string, unknown>;\n fetch: Fetch;\n}\n\ninterface Event {\n event: string;\n info: Record<string, unknown>;\n}\n\ntype Listener = (info: Record<string, unknown>) => Promise<void>;\n\nconst debug = createdDebugger('strapi:webhook');\n\nconst defaultConfiguration: Config = {\n defaultHeaders: {},\n};\n\nclass WebhookRunner {\n private eventHub: EventHub;\n\n private logger: Logger;\n\n private config: Config;\n\n private webhooksMap: Map<string, Webhook[]> = new Map();\n\n private listeners: Map<string, Listener> = new Map();\n\n private queue: WorkerQueue<Event, void>;\n\n private fetch: Fetch;\n\n constructor({ eventHub, logger, configuration = {}, fetch }: ConstructorParameters) {\n debug('Initialized webhook runner');\n this.eventHub = eventHub;\n this.logger = logger;\n this.fetch = fetch;\n\n if (typeof configuration !== 'object') {\n throw new Error(\n 'Invalid configuration provided to the webhookRunner.\\nCheck your server.json -> webhooks configuration'\n );\n }\n\n this.config = _.merge(defaultConfiguration, configuration);\n\n this.queue = new WorkerQueue({ logger, concurrency: 5 });\n\n this.queue.subscribe(this.executeListener.bind(this));\n }\n\n deleteListener(event: string) {\n debug(`Deleting listener for event '${event}'`);\n\n const fn = this.listeners.get(event);\n\n if (fn !== undefined) {\n this.eventHub.off(event, fn);\n this.listeners.delete(event);\n }\n }\n\n createListener(event: string) {\n debug(`Creating listener for event '${event}'`);\n if (this.listeners.has(event)) {\n this.logger.error(\n `The webhook runner is already listening for the event '${event}'. Did you mean to call .register() ?`\n );\n }\n\n const listen = async (info: Event['info']) => {\n this.queue.enqueue({ event, info });\n };\n\n this.listeners.set(event, listen);\n this.eventHub.on(event, listen);\n }\n\n async executeListener({ event, info }: Event) {\n debug(`Executing webhook for event '${event}'`);\n const webhooks = this.webhooksMap.get(event) || [];\n const activeWebhooks = webhooks.filter((webhook) => webhook.isEnabled === true);\n\n for (const webhook of activeWebhooks) {\n await this.run(webhook, event, info).catch((error: 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":["createdDebugger","_","WorkerQueue"],"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":["createdDebugger","_","WorkerQueue"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-runner.mjs","sources":["../../src/services/webhook-runner.ts"],"sourcesContent":["/**\n * The event hub is Strapi's event control center.\n */\n\nimport createdDebugger from 'debug';\nimport _ from 'lodash';\nimport type { Logger } from '@strapi/logger';\n\nimport WorkerQueue from './worker-queue';\nimport type { Webhook } from './webhook-store';\nimport type { EventHub } from './event-hub';\nimport type { Fetch } from '../utils/fetch';\n\ninterface Config {\n defaultHeaders: Record<string, string>;\n}\n\ninterface ConstructorParameters {\n eventHub: EventHub;\n logger: Logger;\n configuration?: Record<string, unknown>;\n fetch: Fetch;\n}\n\ninterface Event {\n event: string;\n info: Record<string, unknown>;\n}\n\ntype Listener = (info: Record<string, unknown>) => Promise<void>;\n\nconst debug = createdDebugger('strapi:webhook');\n\nconst defaultConfiguration: Config = {\n defaultHeaders: {},\n};\n\nclass WebhookRunner {\n private eventHub: EventHub;\n\n private logger: Logger;\n\n private config: Config;\n\n private webhooksMap: Map<string, Webhook[]> = new Map();\n\n private listeners: Map<string, Listener> = new Map();\n\n private queue: WorkerQueue<Event, void>;\n\n private fetch: Fetch;\n\n constructor({ eventHub, logger, configuration = {}, fetch }: ConstructorParameters) {\n debug('Initialized webhook runner');\n this.eventHub = eventHub;\n this.logger = logger;\n this.fetch = fetch;\n\n if (typeof configuration !== 'object') {\n throw new Error(\n 'Invalid configuration provided to the webhookRunner.\\nCheck your server.json -> webhooks configuration'\n );\n }\n\n this.config = _.merge(defaultConfiguration, configuration);\n\n this.queue = new WorkerQueue({ logger, concurrency: 5 });\n\n this.queue.subscribe(this.executeListener.bind(this));\n }\n\n deleteListener(event: string) {\n debug(`Deleting listener for event '${event}'`);\n\n const fn = this.listeners.get(event);\n\n if (fn !== undefined) {\n this.eventHub.off(event, fn);\n this.listeners.delete(event);\n }\n }\n\n createListener(event: string) {\n debug(`Creating listener for event '${event}'`);\n if (this.listeners.has(event)) {\n this.logger.error(\n `The webhook runner is already listening for the event '${event}'. Did you mean to call .register() ?`\n );\n }\n\n const listen = async (info: Event['info']) => {\n this.queue.enqueue({ event, info });\n };\n\n this.listeners.set(event, listen);\n this.eventHub.on(event, listen);\n }\n\n async executeListener({ event, info }: Event) {\n debug(`Executing webhook for event '${event}'`);\n const webhooks = this.webhooksMap.get(event) || [];\n const activeWebhooks = webhooks.filter((webhook) => webhook.isEnabled === true);\n\n for (const webhook of activeWebhooks) {\n await this.run(webhook, event, info).catch((error: 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":["createdDebugger"],"mappings":"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"}
1
+ {"version":3,"file":"webhook-runner.mjs","sources":["../../src/services/webhook-runner.ts"],"sourcesContent":["/**\n * The event hub is Strapi's event control center.\n */\n\nimport createdDebugger from 'debug';\nimport _ from 'lodash';\nimport type { Logger } from '@strapi/logger';\n\nimport 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":["createdDebugger"],"mappings":"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"}
@@ -2,15 +2,9 @@
2
2
  * Webhook store is the implementation of webhook storage over the core_store
3
3
  */
4
4
  import type { Model, Database } from '@strapi/database';
5
+ import type { Modules } from '@strapi/types';
5
6
  declare const webhookModel: Model;
6
- export interface Webhook {
7
- id: string;
8
- name: string;
9
- url: string;
10
- headers: Record<string, string>;
11
- events: string[];
12
- isEnabled: boolean;
13
- }
7
+ type Webhook = Modules.WebhookStore.Webhook;
14
8
  export interface WebhookStore {
15
9
  allowedEvents: Map<string, string>;
16
10
  addAllowedEvent(key: string, value: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-store.d.ts","sourceRoot":"","sources":["../../src/services/webhook-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIxD,QAAA,MAAM,YAAY,EAAE,KAwBnB,CAAC;AAmBF,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAmCD,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,iBAAiB,IAAI,MAAM,EAAE,CAAC;IAC9B,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACjD,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACjD,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAClE,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CACpD;AAED,QAAA,MAAM,kBAAkB,WAAY;IAAE,EAAE,EAAE,QAAQ,CAAA;CAAE,KAAG,YAiDtD,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"webhook-store.d.ts","sourceRoot":"","sources":["../../src/services/webhook-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,QAAA,MAAM,YAAY,EAAE,KAwBnB,CAAC;AAEF,KAAK,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;AAqC5C,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,iBAAiB,IAAI,MAAM,EAAE,CAAC;IAC9B,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACjD,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACjD,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAClE,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CACpD;AAED,QAAA,MAAM,kBAAkB,WAAY;IAAE,EAAE,EAAE,QAAQ,CAAA;CAAE,KAAG,YAwDtD,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
@@ -38,7 +38,7 @@ const toDBObject = (data) => {
38
38
  };
39
39
  const fromDBObject = (row) => {
40
40
  return {
41
- id: row.id,
41
+ id: typeof row.id === "number" ? row.id.toString() : row.id,
42
42
  name: row.name,
43
43
  url: row.url,
44
44
  headers: row.headers,
@@ -57,7 +57,14 @@ const webhookEventValidator = async (allowedEvents, events) => {
57
57
  };
58
58
  const createWebhookStore = ({ db }) => {
59
59
  return {
60
- allowedEvents: /* @__PURE__ */ new Map([]),
60
+ allowedEvents: /* @__PURE__ */ new Map([
61
+ ["ENTRY_CREATE", "entry.create"],
62
+ ["ENTRY_UPDATE", "entry.update"],
63
+ ["ENTRY_DELETE", "entry.delete"],
64
+ ["ENTRY_PUBLISH", "entry.publish"],
65
+ ["ENTRY_UNPUBLISH", "entry.unpublish"],
66
+ ["ENTRY_DRAFT_DISCARD", "entry.draft-discard"]
67
+ ]),
61
68
  addAllowedEvent(key, value) {
62
69
  this.allowedEvents.set(key, value);
63
70
  },
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-store.js","sources":["../../src/services/webhook-store.ts"],"sourcesContent":["/**\n * Webhook store is the implementation of webhook storage over the core_store\n */\n\nimport { errors } from '@strapi/utils';\nimport type { Model, Database } from '@strapi/database';\n\nconst { ValidationError } = errors;\n\nconst webhookModel: Model = {\n uid: 'strapi::webhook',\n singularName: 'strapi_webhooks',\n tableName: 'strapi_webhooks',\n attributes: {\n id: {\n type: 'increments',\n },\n name: {\n type: 'string',\n },\n url: {\n type: 'text',\n },\n headers: {\n type: 'json',\n },\n events: {\n type: 'json',\n },\n enabled: {\n type: 'boolean',\n },\n },\n};\n\ninterface DBInput {\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n enabled: boolean;\n}\n\ninterface DBOutput {\n id: string;\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n enabled: boolean;\n}\n\nexport interface Webhook {\n id: string;\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n isEnabled: boolean;\n}\n\nconst toDBObject = (data: Webhook): DBInput => {\n return {\n name: data.name,\n url: data.url,\n headers: data.headers,\n events: data.events,\n enabled: data.isEnabled,\n };\n};\n\nconst fromDBObject = (row: DBOutput): Webhook => {\n return {\n id: row.id,\n name: row.name,\n url: row.url,\n headers: row.headers,\n events: row.events,\n isEnabled: row.enabled,\n };\n};\n\nconst webhookEventValidator = async (allowedEvents: Map<string, string>, events: string[]) => {\n const allowedValues = Array.from(allowedEvents.values());\n\n events.forEach((event) => {\n if (allowedValues.includes(event)) {\n return;\n }\n\n throw new ValidationError(`Webhook event ${event} is not supported`);\n });\n};\n\nexport interface WebhookStore {\n allowedEvents: Map<string, string>;\n addAllowedEvent(key: string, value: string): void;\n removeAllowedEvent(key: string): void;\n listAllowedEvents(): string[];\n getAllowedEvent(key: string): string | undefined;\n findWebhooks(): Promise<Webhook[]>;\n findWebhook(id: string): Promise<Webhook | null>;\n createWebhook(data: Webhook): Promise<Webhook>;\n updateWebhook(id: string, data: Webhook): Promise<Webhook | null>;\n deleteWebhook(id: string): Promise<Webhook | null>;\n}\n\nconst createWebhookStore = ({ db }: { db: Database }): WebhookStore => {\n return {\n allowedEvents: new Map([]),\n addAllowedEvent(key, value) {\n this.allowedEvents.set(key, value);\n },\n removeAllowedEvent(key) {\n this.allowedEvents.delete(key);\n },\n listAllowedEvents() {\n return Array.from(this.allowedEvents.keys());\n },\n getAllowedEvent(key) {\n return this.allowedEvents.get(key);\n },\n async findWebhooks() {\n const results = await db.query('strapi::webhook').findMany();\n\n return results.map(fromDBObject);\n },\n async findWebhook(id) {\n const result = await db.query('strapi::webhook').findOne({ where: { id } });\n return result ? fromDBObject(result) : null;\n },\n async createWebhook(data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n return db\n .query('strapi::webhook')\n .create({\n data: toDBObject({ ...data, isEnabled: true }),\n })\n .then(fromDBObject);\n },\n async updateWebhook(id, data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n const webhook = await db.query('strapi::webhook').update({\n where: { id },\n data: toDBObject(data),\n });\n\n return webhook ? fromDBObject(webhook) : null;\n },\n async deleteWebhook(id) {\n const webhook = await db.query('strapi::webhook').delete({ where: { id } });\n return webhook ? fromDBObject(webhook) : null;\n },\n };\n};\n\nexport { webhookModel, createWebhookStore };\n"],"names":["errors"],"mappings":"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"}
1
+ {"version":3,"file":"webhook-store.js","sources":["../../src/services/webhook-store.ts"],"sourcesContent":["/**\n * Webhook store is the implementation of webhook storage over the core_store\n */\n\nimport { errors } from '@strapi/utils';\nimport type { Model, Database } from '@strapi/database';\nimport type { Modules } from '@strapi/types';\n\nconst { ValidationError } = errors;\n\nconst webhookModel: Model = {\n uid: 'strapi::webhook',\n singularName: 'strapi_webhooks',\n tableName: 'strapi_webhooks',\n attributes: {\n id: {\n type: 'increments',\n },\n name: {\n type: 'string',\n },\n url: {\n type: 'text',\n },\n headers: {\n type: 'json',\n },\n events: {\n type: 'json',\n },\n enabled: {\n type: 'boolean',\n },\n },\n};\n\ntype Webhook = Modules.WebhookStore.Webhook;\ntype DBOutput = Omit<Webhook, 'id' | 'isEnabled'> & { id: string | number; enabled: boolean };\ntype DBInput = Omit<DBOutput, 'id'>;\n\nconst toDBObject = (data: Webhook): DBInput => {\n return {\n name: data.name,\n url: data.url,\n headers: data.headers,\n events: data.events,\n enabled: data.isEnabled,\n };\n};\n\nconst fromDBObject = (row: DBOutput): Webhook => {\n return {\n id: typeof row.id === 'number' ? row.id.toString() : row.id,\n name: row.name,\n url: row.url,\n headers: row.headers,\n events: row.events,\n isEnabled: row.enabled,\n };\n};\n\nconst webhookEventValidator = async (allowedEvents: Map<string, string>, events: string[]) => {\n const allowedValues = Array.from(allowedEvents.values());\n\n events.forEach((event) => {\n if (allowedValues.includes(event)) {\n return;\n }\n\n throw new ValidationError(`Webhook event ${event} is not supported`);\n });\n};\n\nexport interface WebhookStore {\n allowedEvents: Map<string, string>;\n addAllowedEvent(key: string, value: string): void;\n removeAllowedEvent(key: string): void;\n listAllowedEvents(): string[];\n getAllowedEvent(key: string): string | undefined;\n findWebhooks(): Promise<Webhook[]>;\n findWebhook(id: string): Promise<Webhook | null>;\n createWebhook(data: Webhook): Promise<Webhook>;\n updateWebhook(id: string, data: Webhook): Promise<Webhook | null>;\n deleteWebhook(id: string): Promise<Webhook | null>;\n}\n\nconst createWebhookStore = ({ db }: { db: Database }): WebhookStore => {\n return {\n allowedEvents: new Map([\n ['ENTRY_CREATE', 'entry.create'],\n ['ENTRY_UPDATE', 'entry.update'],\n ['ENTRY_DELETE', 'entry.delete'],\n ['ENTRY_PUBLISH', 'entry.publish'],\n ['ENTRY_UNPUBLISH', 'entry.unpublish'],\n ['ENTRY_DRAFT_DISCARD', 'entry.draft-discard'],\n ]),\n addAllowedEvent(key, value) {\n this.allowedEvents.set(key, value);\n },\n removeAllowedEvent(key) {\n this.allowedEvents.delete(key);\n },\n listAllowedEvents() {\n return Array.from(this.allowedEvents.keys());\n },\n getAllowedEvent(key) {\n return this.allowedEvents.get(key);\n },\n async findWebhooks() {\n const results = await db.query('strapi::webhook').findMany();\n\n return results.map(fromDBObject);\n },\n async findWebhook(id) {\n const result = await db.query('strapi::webhook').findOne({ where: { id } });\n return result ? fromDBObject(result) : null;\n },\n async createWebhook(data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n return db\n .query('strapi::webhook')\n .create({\n data: toDBObject({ ...data, isEnabled: true }),\n })\n .then(fromDBObject);\n },\n async updateWebhook(id, data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n const webhook = await db.query('strapi::webhook').update({\n where: { id },\n data: toDBObject(data),\n });\n\n return webhook ? fromDBObject(webhook) : null;\n },\n async deleteWebhook(id) {\n const webhook = await db.query('strapi::webhook').delete({ where: { id } });\n return webhook ? fromDBObject(webhook) : null;\n },\n };\n};\n\nexport { webhookModel, createWebhookStore };\n"],"names":["errors"],"mappings":"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"}
@@ -36,7 +36,7 @@ const toDBObject = (data) => {
36
36
  };
37
37
  const fromDBObject = (row) => {
38
38
  return {
39
- id: row.id,
39
+ id: typeof row.id === "number" ? row.id.toString() : row.id,
40
40
  name: row.name,
41
41
  url: row.url,
42
42
  headers: row.headers,
@@ -55,7 +55,14 @@ const webhookEventValidator = async (allowedEvents, events) => {
55
55
  };
56
56
  const createWebhookStore = ({ db }) => {
57
57
  return {
58
- allowedEvents: /* @__PURE__ */ new Map([]),
58
+ allowedEvents: /* @__PURE__ */ new Map([
59
+ ["ENTRY_CREATE", "entry.create"],
60
+ ["ENTRY_UPDATE", "entry.update"],
61
+ ["ENTRY_DELETE", "entry.delete"],
62
+ ["ENTRY_PUBLISH", "entry.publish"],
63
+ ["ENTRY_UNPUBLISH", "entry.unpublish"],
64
+ ["ENTRY_DRAFT_DISCARD", "entry.draft-discard"]
65
+ ]),
59
66
  addAllowedEvent(key, value) {
60
67
  this.allowedEvents.set(key, value);
61
68
  },
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-store.mjs","sources":["../../src/services/webhook-store.ts"],"sourcesContent":["/**\n * Webhook store is the implementation of webhook storage over the core_store\n */\n\nimport { errors } from '@strapi/utils';\nimport type { Model, Database } from '@strapi/database';\n\nconst { ValidationError } = errors;\n\nconst webhookModel: Model = {\n uid: 'strapi::webhook',\n singularName: 'strapi_webhooks',\n tableName: 'strapi_webhooks',\n attributes: {\n id: {\n type: 'increments',\n },\n name: {\n type: 'string',\n },\n url: {\n type: 'text',\n },\n headers: {\n type: 'json',\n },\n events: {\n type: 'json',\n },\n enabled: {\n type: 'boolean',\n },\n },\n};\n\ninterface DBInput {\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n enabled: boolean;\n}\n\ninterface DBOutput {\n id: string;\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n enabled: boolean;\n}\n\nexport interface Webhook {\n id: string;\n name: string;\n url: string;\n headers: Record<string, string>;\n events: string[];\n isEnabled: boolean;\n}\n\nconst toDBObject = (data: Webhook): DBInput => {\n return {\n name: data.name,\n url: data.url,\n headers: data.headers,\n events: data.events,\n enabled: data.isEnabled,\n };\n};\n\nconst fromDBObject = (row: DBOutput): Webhook => {\n return {\n id: row.id,\n name: row.name,\n url: row.url,\n headers: row.headers,\n events: row.events,\n isEnabled: row.enabled,\n };\n};\n\nconst webhookEventValidator = async (allowedEvents: Map<string, string>, events: string[]) => {\n const allowedValues = Array.from(allowedEvents.values());\n\n events.forEach((event) => {\n if (allowedValues.includes(event)) {\n return;\n }\n\n throw new ValidationError(`Webhook event ${event} is not supported`);\n });\n};\n\nexport interface WebhookStore {\n allowedEvents: Map<string, string>;\n addAllowedEvent(key: string, value: string): void;\n removeAllowedEvent(key: string): void;\n listAllowedEvents(): string[];\n getAllowedEvent(key: string): string | undefined;\n findWebhooks(): Promise<Webhook[]>;\n findWebhook(id: string): Promise<Webhook | null>;\n createWebhook(data: Webhook): Promise<Webhook>;\n updateWebhook(id: string, data: Webhook): Promise<Webhook | null>;\n deleteWebhook(id: string): Promise<Webhook | null>;\n}\n\nconst createWebhookStore = ({ db }: { db: Database }): WebhookStore => {\n return {\n allowedEvents: new Map([]),\n addAllowedEvent(key, value) {\n this.allowedEvents.set(key, value);\n },\n removeAllowedEvent(key) {\n this.allowedEvents.delete(key);\n },\n listAllowedEvents() {\n return Array.from(this.allowedEvents.keys());\n },\n getAllowedEvent(key) {\n return this.allowedEvents.get(key);\n },\n async findWebhooks() {\n const results = await db.query('strapi::webhook').findMany();\n\n return results.map(fromDBObject);\n },\n async findWebhook(id) {\n const result = await db.query('strapi::webhook').findOne({ where: { id } });\n return result ? fromDBObject(result) : null;\n },\n async createWebhook(data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n return db\n .query('strapi::webhook')\n .create({\n data: toDBObject({ ...data, isEnabled: true }),\n })\n .then(fromDBObject);\n },\n async updateWebhook(id, data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n const webhook = await db.query('strapi::webhook').update({\n where: { id },\n data: toDBObject(data),\n });\n\n return webhook ? fromDBObject(webhook) : null;\n },\n async deleteWebhook(id) {\n const webhook = await db.query('strapi::webhook').delete({ where: { id } });\n return webhook ? fromDBObject(webhook) : null;\n },\n };\n};\n\nexport { webhookModel, createWebhookStore };\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webhook-store.mjs","sources":["../../src/services/webhook-store.ts"],"sourcesContent":["/**\n * Webhook store is the implementation of webhook storage over the core_store\n */\n\nimport { errors } from '@strapi/utils';\nimport type { Model, Database } from '@strapi/database';\nimport type { Modules } from '@strapi/types';\n\nconst { ValidationError } = errors;\n\nconst webhookModel: Model = {\n uid: 'strapi::webhook',\n singularName: 'strapi_webhooks',\n tableName: 'strapi_webhooks',\n attributes: {\n id: {\n type: 'increments',\n },\n name: {\n type: 'string',\n },\n url: {\n type: 'text',\n },\n headers: {\n type: 'json',\n },\n events: {\n type: 'json',\n },\n enabled: {\n type: 'boolean',\n },\n },\n};\n\ntype Webhook = Modules.WebhookStore.Webhook;\ntype DBOutput = Omit<Webhook, 'id' | 'isEnabled'> & { id: string | number; enabled: boolean };\ntype DBInput = Omit<DBOutput, 'id'>;\n\nconst toDBObject = (data: Webhook): DBInput => {\n return {\n name: data.name,\n url: data.url,\n headers: data.headers,\n events: data.events,\n enabled: data.isEnabled,\n };\n};\n\nconst fromDBObject = (row: DBOutput): Webhook => {\n return {\n id: typeof row.id === 'number' ? row.id.toString() : row.id,\n name: row.name,\n url: row.url,\n headers: row.headers,\n events: row.events,\n isEnabled: row.enabled,\n };\n};\n\nconst webhookEventValidator = async (allowedEvents: Map<string, string>, events: string[]) => {\n const allowedValues = Array.from(allowedEvents.values());\n\n events.forEach((event) => {\n if (allowedValues.includes(event)) {\n return;\n }\n\n throw new ValidationError(`Webhook event ${event} is not supported`);\n });\n};\n\nexport interface WebhookStore {\n allowedEvents: Map<string, string>;\n addAllowedEvent(key: string, value: string): void;\n removeAllowedEvent(key: string): void;\n listAllowedEvents(): string[];\n getAllowedEvent(key: string): string | undefined;\n findWebhooks(): Promise<Webhook[]>;\n findWebhook(id: string): Promise<Webhook | null>;\n createWebhook(data: Webhook): Promise<Webhook>;\n updateWebhook(id: string, data: Webhook): Promise<Webhook | null>;\n deleteWebhook(id: string): Promise<Webhook | null>;\n}\n\nconst createWebhookStore = ({ db }: { db: Database }): WebhookStore => {\n return {\n allowedEvents: new Map([\n ['ENTRY_CREATE', 'entry.create'],\n ['ENTRY_UPDATE', 'entry.update'],\n ['ENTRY_DELETE', 'entry.delete'],\n ['ENTRY_PUBLISH', 'entry.publish'],\n ['ENTRY_UNPUBLISH', 'entry.unpublish'],\n ['ENTRY_DRAFT_DISCARD', 'entry.draft-discard'],\n ]),\n addAllowedEvent(key, value) {\n this.allowedEvents.set(key, value);\n },\n removeAllowedEvent(key) {\n this.allowedEvents.delete(key);\n },\n listAllowedEvents() {\n return Array.from(this.allowedEvents.keys());\n },\n getAllowedEvent(key) {\n return this.allowedEvents.get(key);\n },\n async findWebhooks() {\n const results = await db.query('strapi::webhook').findMany();\n\n return results.map(fromDBObject);\n },\n async findWebhook(id) {\n const result = await db.query('strapi::webhook').findOne({ where: { id } });\n return result ? fromDBObject(result) : null;\n },\n async createWebhook(data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n return db\n .query('strapi::webhook')\n .create({\n data: toDBObject({ ...data, isEnabled: true }),\n })\n .then(fromDBObject);\n },\n async updateWebhook(id, data) {\n await webhookEventValidator(this.allowedEvents, data.events);\n\n const webhook = await db.query('strapi::webhook').update({\n where: { id },\n data: toDBObject(data),\n });\n\n return webhook ? fromDBObject(webhook) : null;\n },\n async deleteWebhook(id) {\n const webhook = await db.query('strapi::webhook').delete({ where: { id } });\n return webhook ? fromDBObject(webhook) : null;\n },\n };\n};\n\nexport { webhookModel, createWebhookStore };\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/core",
3
- "version": "0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403",
3
+ "version": "0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d",
4
4
  "description": "Core of Strapi",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -55,31 +55,31 @@
55
55
  "@koa/cors": "5.0.0",
56
56
  "@koa/router": "12.0.1",
57
57
  "@paralleldrive/cuid2": "2.2.2",
58
- "@strapi/admin": "0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403",
59
- "@strapi/database": "0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403",
60
- "@strapi/generate-new": "0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403",
61
- "@strapi/generators": "0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403",
62
- "@strapi/logger": "0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403",
58
+ "@strapi/admin": "0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d",
59
+ "@strapi/database": "0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d",
60
+ "@strapi/generate-new": "0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d",
61
+ "@strapi/generators": "0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d",
62
+ "@strapi/logger": "0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d",
63
63
  "@strapi/pack-up": "5.0.0",
64
- "@strapi/permissions": "0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403",
65
- "@strapi/types": "0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403",
66
- "@strapi/typescript-utils": "0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403",
67
- "@strapi/utils": "0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403",
64
+ "@strapi/permissions": "0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d",
65
+ "@strapi/types": "0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d",
66
+ "@strapi/typescript-utils": "0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d",
67
+ "@strapi/utils": "0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d",
68
68
  "bcryptjs": "2.4.3",
69
69
  "boxen": "5.1.2",
70
70
  "chalk": "4.1.2",
71
- "ci-info": "3.8.0",
71
+ "ci-info": "4.0.0",
72
72
  "cli-table3": "0.6.2",
73
73
  "commander": "8.3.0",
74
74
  "configstore": "5.0.1",
75
75
  "copyfiles": "2.4.1",
76
76
  "debug": "4.3.4",
77
77
  "delegates": "1.0.0",
78
- "dotenv": "14.2.0",
78
+ "dotenv": "16.4.5",
79
79
  "execa": "5.1.1",
80
- "fs-extra": "10.0.0",
80
+ "fs-extra": "11.2.0",
81
81
  "glob": "10.3.10",
82
- "http-errors": "1.8.1",
82
+ "http-errors": "2.0.0",
83
83
  "inquirer": "8.2.5",
84
84
  "is-docker": "2.2.1",
85
85
  "koa": "2.15.2",
@@ -111,6 +111,8 @@
111
111
  "@types/bcryptjs": "2.4.3",
112
112
  "@types/configstore": "5.0.1",
113
113
  "@types/delegates": "1.0.0",
114
+ "@types/fs-extra": "11.0.4",
115
+ "@types/http-errors": "2.0.4",
114
116
  "@types/jest": "29.5.2",
115
117
  "@types/koa": "2.13.4",
116
118
  "@types/koa-compress": "4.0.3",
@@ -122,13 +124,13 @@
122
124
  "@types/node": "18.19.24",
123
125
  "@types/node-schedule": "2.1.0",
124
126
  "@types/statuses": "2.0.1",
125
- "eslint-config-custom": "0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403",
127
+ "eslint-config-custom": "0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d",
126
128
  "supertest": "6.3.3",
127
- "tsconfig": "0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403"
129
+ "tsconfig": "0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d"
128
130
  },
129
131
  "engines": {
130
132
  "node": ">=18.0.0 <=20.x.x",
131
133
  "npm": ">=6.0.0"
132
134
  },
133
- "gitHead": "d23c1d5b0e45dd06ef09977f526c85468be05403"
135
+ "gitHead": "d954d57341a6623992a0d211daaec8e245c3517d"
134
136
  }
@@ -1 +0,0 @@
1
- //# sourceMappingURL=document-engine.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-engine.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/document-engine.ts"],"names":[],"mappings":""}