@uptime.app/contracts 3.0.45-rc.0 → 3.0.45

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 (196) hide show
  1. package/dist/cjs/acl/acl-utils.d.ts +40 -0
  2. package/dist/cjs/acl/acl-utils.d.ts.map +1 -0
  3. package/dist/cjs/acl/acl-utils.js +131 -0
  4. package/dist/cjs/acl/acl-utils.js.map +1 -0
  5. package/dist/cjs/collection/enriched-collection.d.ts +0 -2
  6. package/dist/cjs/collection/enriched-collection.d.ts.map +1 -1
  7. package/dist/cjs/index.d.ts +1 -0
  8. package/dist/cjs/index.d.ts.map +1 -1
  9. package/dist/cjs/index.js +1 -0
  10. package/dist/cjs/index.js.map +1 -1
  11. package/dist/esm/acl/acl-utils.d.ts +40 -0
  12. package/dist/esm/acl/acl-utils.d.ts.map +1 -0
  13. package/dist/esm/acl/acl-utils.js +124 -0
  14. package/dist/esm/acl/acl-utils.js.map +1 -0
  15. package/dist/esm/collection/enriched-collection.d.ts +0 -2
  16. package/dist/esm/collection/enriched-collection.d.ts.map +1 -1
  17. package/dist/esm/index.d.ts +1 -0
  18. package/dist/esm/index.d.ts.map +1 -1
  19. package/dist/esm/index.js +1 -0
  20. package/dist/esm/index.js.map +1 -1
  21. package/package.json +2 -2
  22. package/src/access-control/collection-access-control.ts +28 -28
  23. package/src/access-control/hack-access-control.ts +32 -32
  24. package/src/access-control/profile-access-control.ts +27 -27
  25. package/src/acl/acl-utils.ts +175 -0
  26. package/src/app-hack/app-full-hack.ts +9 -9
  27. package/src/app-hack/app-hack-metadata.ts +61 -61
  28. package/src/app-hack/app-restricted-hack.ts +22 -22
  29. package/src/b2b-content-access/b2b-content-access.ts +57 -57
  30. package/src/b2b-organisation/b2b-carousel.ts +33 -33
  31. package/src/b2b-organisation/b2b-org-idp-mapping.ts +27 -27
  32. package/src/b2b-organisation/b2b-organisation-events.ts +21 -21
  33. package/src/b2b-organisation/b2b-organisation-group-events.ts +21 -21
  34. package/src/b2b-organisation/b2b-organisation-group-membership-events.ts +21 -21
  35. package/src/b2b-organisation/b2b-organisation-group-membership.ts +10 -10
  36. package/src/b2b-organisation/b2b-organisation-group.ts +16 -16
  37. package/src/b2b-organisation/b2b-organisation-invitation.ts +45 -45
  38. package/src/b2b-organisation/b2b-organisation-member-events.ts +21 -21
  39. package/src/b2b-organisation/b2b-organisation-member.ts +19 -19
  40. package/src/b2b-organisation/b2b-organisation.ts +38 -38
  41. package/src/brand/brand-events.ts +21 -21
  42. package/src/brand/brand.ts +77 -77
  43. package/src/catalogue/catalogue.ts +152 -152
  44. package/src/cms-hack/cms-searchable-hack.ts +44 -44
  45. package/src/collection/collection-events.ts +21 -21
  46. package/src/collection/collection.ts +59 -59
  47. package/src/collection/enriched-collection-events.ts +18 -18
  48. package/src/collection/enriched-collection.ts +63 -65
  49. package/src/course/course-events.ts +20 -20
  50. package/src/course/course.ts +25 -25
  51. package/src/course-enrollment/course-enrollment-events.ts +21 -21
  52. package/src/course-enrollment/course-enrollment.ts +36 -36
  53. package/src/creator/creator-events.ts +32 -32
  54. package/src/creator/creator.ts +7 -7
  55. package/src/distribution/collection-distribution.ts +17 -17
  56. package/src/distribution/distribution-events.ts +61 -61
  57. package/src/distribution/hack-distribution.ts +18 -18
  58. package/src/draft-hack/draft-hack-events.ts +21 -21
  59. package/src/draft-hack/draft-hack.ts +190 -190
  60. package/src/draft-hack-generation/draft-hack-generation-commands.ts +10 -10
  61. package/src/draft-hack-generation/draft-hack-generation-events.ts +52 -52
  62. package/src/draft-hack-generation/draft-hack-generation.ts +39 -39
  63. package/src/enriched-b2b-organisation/enriched-b2b-organisation-events.ts +21 -21
  64. package/src/enriched-b2b-organisation/enriched-b2b-organisation.ts +37 -37
  65. package/src/enriched-hack/enriched-hack-events.ts +21 -21
  66. package/src/enriched-hack/enriched-hack.ts +109 -109
  67. package/src/enrichment-asset/hack-enrichment-video-events.ts +55 -55
  68. package/src/enrichment-asset/hack-enrichment-video.ts +40 -40
  69. package/src/entitlement/user-entitlements-commands.ts +54 -54
  70. package/src/entitlement/user-entitlements-events.ts +29 -29
  71. package/src/entitlement/user-entitlements.ts +18 -18
  72. package/src/flashcard/flashcard-events.ts +85 -85
  73. package/src/flashcard/flashcard.ts +138 -138
  74. package/src/hack/extracted-subject.ts +31 -31
  75. package/src/hack/hack-events.ts +21 -21
  76. package/src/hack/hack-published.ts +21 -21
  77. package/src/hack/hack-with-voice-events.ts +20 -20
  78. package/src/hack/hack-with-voice.ts +36 -36
  79. package/src/hack/hack.ts +127 -127
  80. package/src/hack/publish-hack-command.ts +20 -20
  81. package/src/hack/republish-hack-command.ts +20 -20
  82. package/src/hack-mapping/access-helper.ts +6 -6
  83. package/src/hack-mapping/app-full-hack.test.ts +12 -12
  84. package/src/hack-mapping/app-full-hack.ts +14 -14
  85. package/src/hack-mapping/app-hack-metadata.test.ts +22 -22
  86. package/src/hack-mapping/app-hack-metadata.ts +82 -82
  87. package/src/hack-mapping/app-restricted-hack.test.ts +11 -11
  88. package/src/hack-mapping/app-restricted-hack.ts +21 -21
  89. package/src/hack-mapping/remove-undefined-fields.ts +9 -9
  90. package/src/hack-mapping/test-data/enriched-hack.json +2576 -2576
  91. package/src/hack-mapping/test-data/expected-app-full-hack.json +2509 -2509
  92. package/src/hack-mapping/test-data/expected-app-hack-metadata.json +93 -93
  93. package/src/hack-mapping/test-data/expected-app-restricted-hack.json +799 -799
  94. package/src/hack-metadata/hack-metadata-events.ts +21 -21
  95. package/src/hack-metadata/hack-metadata.ts +17 -17
  96. package/src/hack-of-the-day/hack-of-the-day-events.ts +21 -21
  97. package/src/hack-of-the-day/hack-of-the-day.ts +13 -13
  98. package/src/hack-statistics/hack-statistics-events.ts +21 -21
  99. package/src/hack-statistics/hack-statistics.ts +9 -9
  100. package/src/hackbot/hack-generation-commands.ts +45 -45
  101. package/src/hackbot/hack-generation-trigger-events.ts +21 -21
  102. package/src/hackbot/hack-generation-trigger.ts +57 -57
  103. package/src/history/history-events.ts +21 -21
  104. package/src/history/history.ts +46 -46
  105. package/src/identity-provider/domain-identity-provider-events.ts +20 -20
  106. package/src/identity-provider/domain-identity-provider.ts +10 -10
  107. package/src/identity-provider/identity-provider-events.ts +20 -20
  108. package/src/identity-provider/identity-provider.ts +46 -46
  109. package/src/index.ts +221 -219
  110. package/src/interest/interest-events.ts +21 -21
  111. package/src/interest/interest.ts +15 -15
  112. package/src/knowledge-source/knowledge-source-events.ts +21 -21
  113. package/src/knowledge-source/knowledge-source.ts +43 -43
  114. package/src/knowledge-source-parsing/knowledge-source-metadata.ts +58 -58
  115. package/src/knowledge-source-parsing/knowledge-source-parsing-commands.ts +41 -41
  116. package/src/knowledge-source-parsing/knowledge-source-parsing-events.ts +30 -30
  117. package/src/knowledge-source-parsing/podcast-metadata.ts +44 -44
  118. package/src/knowledge-source-parsing/podcast-parsing-events.ts +28 -28
  119. package/src/knowledge-source-parsing/user-hack-generation-options.ts +7 -7
  120. package/src/learn-upon/get-sqsso-url.ts +13 -13
  121. package/src/learn-upon/learn-upon-commands.ts +33 -33
  122. package/src/learn-upon/learn-upon-course-enrollment-events.ts +21 -21
  123. package/src/learn-upon/learn-upon-course-enrollment.ts +62 -62
  124. package/src/learn-upon/learn-upon-course-events.ts +21 -21
  125. package/src/learn-upon/learn-upon-course.ts +108 -108
  126. package/src/learn-upon/learn-upon-portal-events.ts +20 -20
  127. package/src/learn-upon/learn-upon-portal.ts +12 -12
  128. package/src/learn-upon/learn-upon-user-mapping-events.ts +18 -18
  129. package/src/learn-upon/learn-upon-user-mapping.ts +9 -9
  130. package/src/learn-upon/learn-upon-webhook-events.ts +80 -80
  131. package/src/learn-upon/learn-upon-webhook-types.ts +346 -346
  132. package/src/learn-upon/unenroll.ts +6 -6
  133. package/src/localisation/live-locales.ts +45 -45
  134. package/src/localisation/locale-language.ts +4 -4
  135. package/src/localisation/supported-languages.ts +11 -11
  136. package/src/localisation/supported-locales.ts +67 -67
  137. package/src/message-bus/context.ts +7 -7
  138. package/src/moderation/hack-moderation-result-events.ts +18 -18
  139. package/src/moderation/hack-moderation-result.ts +27 -27
  140. package/src/partner/partner-events.ts +21 -21
  141. package/src/partner/partner.ts +7 -7
  142. package/src/pending-hack/pending-hack-events.ts +20 -20
  143. package/src/pending-hack/pending-hack-with-voice-events.ts +20 -20
  144. package/src/pending-hack/pending-hack-with-voice.ts +25 -25
  145. package/src/pending-hack/pending-hack.ts +78 -78
  146. package/src/preferences/preferences-events.ts +15 -15
  147. package/src/preferences/preferences.ts +35 -35
  148. package/src/profile/profile-events.ts +41 -41
  149. package/src/profile/profile.ts +36 -36
  150. package/src/profile/translated-profile.ts +13 -13
  151. package/src/referral/referral-events.ts +41 -41
  152. package/src/referral/referral.ts +76 -76
  153. package/src/saved/saved-collection-events.ts +19 -19
  154. package/src/saved/saved-collection.ts +8 -8
  155. package/src/segment/segment-commands.ts +75 -75
  156. package/src/segment/segment-events.ts +42 -42
  157. package/src/segment/segment-with-voice.ts +8 -8
  158. package/src/segment/segment.ts +82 -82
  159. package/src/service-simulator/mock-request-response.ts +17 -17
  160. package/src/skin/skin-events.ts +21 -21
  161. package/src/skin/skin.ts +6 -6
  162. package/src/spark/spark-board-read-model.ts +17 -17
  163. package/src/spark/spark-board.ts +12 -12
  164. package/src/spark/spark-events.ts +42 -42
  165. package/src/spark/spark.ts +75 -75
  166. package/src/text-analysis/hack-categories-extracted-events.ts +24 -24
  167. package/src/text-analysis/hack-categories-extracted.ts +31 -31
  168. package/src/text-analysis/hack-entities-extracted-events.ts +24 -24
  169. package/src/text-analysis/hack-entities-extracted.ts +38 -38
  170. package/src/text-analysis/hack-keywords-extracted-events.ts +24 -24
  171. package/src/text-analysis/hack-keywords-extracted.ts +23 -23
  172. package/src/text-analysis/hack-topics-extracted-events.ts +24 -24
  173. package/src/text-analysis/hack-topics-extracted.ts +31 -31
  174. package/src/text-to-speech/create-speech-commands.ts +22 -22
  175. package/src/text-to-speech/speech-created-events.ts +10 -10
  176. package/src/text-to-speech/supported-voices.ts +222 -222
  177. package/src/text-to-speech/text-segment.ts +29 -29
  178. package/src/theme/theme-events.ts +21 -21
  179. package/src/theme/theme.ts +68 -68
  180. package/src/translation/translation-events.ts +73 -73
  181. package/src/translation/translation.ts +25 -25
  182. package/src/trending/trending-events.ts +21 -21
  183. package/src/trending/trending-hacks.ts +8 -8
  184. package/src/user/cognito-user-authentication-log.ts +7 -7
  185. package/src/user/get-user.ts +63 -63
  186. package/src/user/user-events.ts +39 -39
  187. package/src/user-context/user-context-events.ts +21 -21
  188. package/src/user-context/user-context.ts +15 -15
  189. package/src/user-notification-context/user-notification-context-events.ts +21 -21
  190. package/src/user-notification-context/user-notification-context.ts +9 -9
  191. package/src/user-statistics/user-statistics-events.ts +97 -97
  192. package/src/user-statistics/user-statistics.ts +82 -82
  193. package/src/video-cropping/video-cropping-events.ts +43 -43
  194. package/src/video-cropping/video-metadata.ts +12 -12
  195. package/tsconfig.cjs.json +7 -7
  196. package/tsconfig.npm.json +22 -22
package/src/hack/hack.ts CHANGED
@@ -1,127 +1,127 @@
1
- import { ExtractedSubject } from './extracted-subject';
2
- export interface Hack {
3
- /** The unique id of the hack. */
4
- id: string;
5
- /** The locale (language and region) of the hack e.g. fr-FR. Use @uptime.app/localisation-contracts Mandatory property since 12/01/2023. */
6
- locale: string;
7
- /** The id of the hack in its original locale. Mandatory property since 12/01/2023. */
8
- baseLocaleHackId: string;
9
- v: number;
10
- createdAt: string;
11
- updatedAt: string;
12
- owner: string;
13
- tenant?: string;
14
- sourceId?: string;
15
- title: string;
16
- themeId: string;
17
-
18
- /** introduced Aug 2025. Will be on all hacks republished since then **/
19
- publishCompletedAt?: string;
20
-
21
- /** introduced Oct 2023 **/
22
- draftHackId: string;
23
- draftHackVersion: number;
24
-
25
- // TODO I'd remove it altogether, but it would be a breaking contract change. Thoughts?
26
- isHidden?: boolean;
27
-
28
- editorialTags?: string[];
29
-
30
- /** Added in October 2025. Internal use only.
31
- * It surfaces the "trending" tag from editorialTags if it exists.
32
- * It's a number, 1 meaning true, because DynamoDB does not allow Boolean attributes in indexes.
33
- */
34
- _isTrending?: number;
35
-
36
- coverUrl?: string;
37
- /** Added in July 2024. This is the URL of the cover image that is free to use without any copyright. */
38
- copyrightFreeCoverUrl?: string;
39
- notifications?: {
40
- aiGeneratedText?: string
41
- humanCuratedText?: string;
42
- },
43
- segments: {
44
- favouriteQuote: {
45
- id: string;
46
- /** added 04/2023 */
47
- v?: number;
48
- };
49
- inANutshell: {
50
- id: string;
51
- /** added 04/2023 */
52
- v?: number;
53
- };
54
- introduction: {
55
- id: string;
56
- /** added 04/2023 */
57
- v?: number;
58
- };
59
- insights: {
60
- id: string
61
- /** added 04/2023 */
62
- v?: number;
63
- }[];
64
- conclusion: {
65
- id: string;
66
- /** added 04/2023 */
67
- v?: number;
68
- };
69
-
70
- // composite segments
71
- overview: {
72
- id: string;
73
- /** added 04/2023 */
74
- v?: number;
75
- };
76
- shareableOverview: {
77
- id: string;
78
- /** added 04/2023 */
79
- v?: number;
80
- };
81
- hereAreTheInsights: {
82
- id: string;
83
- /** added 04/2023 */
84
- v?: number;
85
- };
86
- putInAction?: {
87
- id: string;
88
- /** added 04/2023 */
89
- v?: number;
90
- };
91
- };
92
- affiliate?: HackAffiliate;
93
- topics: HackTopic[];
94
- contributors?: HackContributor[];
95
- type: HackType;
96
- sourceData?: HackSourceData;
97
- externalLink?: HackExternalLink;
98
-
99
- /** added Mar 2024 */
100
- // TODO make it mandatory after a republish
101
- subjects?: ExtractedSubject[];
102
- }
103
-
104
- export interface HackContributor {
105
- name: string;
106
- }
107
-
108
- export interface HackTopic {
109
- name: string;
110
- }
111
-
112
- export interface HackAffiliate {
113
- url: string;
114
- name: string;
115
- }
116
-
117
- export type HackType = 'book' | 'course' | 'documentary' | 'podcast' | 'original';
118
-
119
- export interface HackSourceData {
120
- episodeTitle?: string;
121
- releaseDate?: string;
122
- }
123
-
124
- export interface HackExternalLink {
125
- url: string;
126
- type: 'Website' | 'Book' | 'Course' | 'Podcast' | 'Video' | 'Other';
127
- }
1
+ import { ExtractedSubject } from './extracted-subject';
2
+ export interface Hack {
3
+ /** The unique id of the hack. */
4
+ id: string;
5
+ /** The locale (language and region) of the hack e.g. fr-FR. Use @uptime.app/localisation-contracts Mandatory property since 12/01/2023. */
6
+ locale: string;
7
+ /** The id of the hack in its original locale. Mandatory property since 12/01/2023. */
8
+ baseLocaleHackId: string;
9
+ v: number;
10
+ createdAt: string;
11
+ updatedAt: string;
12
+ owner: string;
13
+ tenant?: string;
14
+ sourceId?: string;
15
+ title: string;
16
+ themeId: string;
17
+
18
+ /** introduced Aug 2025. Will be on all hacks republished since then **/
19
+ publishCompletedAt?: string;
20
+
21
+ /** introduced Oct 2023 **/
22
+ draftHackId: string;
23
+ draftHackVersion: number;
24
+
25
+ // TODO I'd remove it altogether, but it would be a breaking contract change. Thoughts?
26
+ isHidden?: boolean;
27
+
28
+ editorialTags?: string[];
29
+
30
+ /** Added in October 2025. Internal use only.
31
+ * It surfaces the "trending" tag from editorialTags if it exists.
32
+ * It's a number, 1 meaning true, because DynamoDB does not allow Boolean attributes in indexes.
33
+ */
34
+ _isTrending?: number;
35
+
36
+ coverUrl?: string;
37
+ /** Added in July 2024. This is the URL of the cover image that is free to use without any copyright. */
38
+ copyrightFreeCoverUrl?: string;
39
+ notifications?: {
40
+ aiGeneratedText?: string
41
+ humanCuratedText?: string;
42
+ },
43
+ segments: {
44
+ favouriteQuote: {
45
+ id: string;
46
+ /** added 04/2023 */
47
+ v?: number;
48
+ };
49
+ inANutshell: {
50
+ id: string;
51
+ /** added 04/2023 */
52
+ v?: number;
53
+ };
54
+ introduction: {
55
+ id: string;
56
+ /** added 04/2023 */
57
+ v?: number;
58
+ };
59
+ insights: {
60
+ id: string
61
+ /** added 04/2023 */
62
+ v?: number;
63
+ }[];
64
+ conclusion: {
65
+ id: string;
66
+ /** added 04/2023 */
67
+ v?: number;
68
+ };
69
+
70
+ // composite segments
71
+ overview: {
72
+ id: string;
73
+ /** added 04/2023 */
74
+ v?: number;
75
+ };
76
+ shareableOverview: {
77
+ id: string;
78
+ /** added 04/2023 */
79
+ v?: number;
80
+ };
81
+ hereAreTheInsights: {
82
+ id: string;
83
+ /** added 04/2023 */
84
+ v?: number;
85
+ };
86
+ putInAction?: {
87
+ id: string;
88
+ /** added 04/2023 */
89
+ v?: number;
90
+ };
91
+ };
92
+ affiliate?: HackAffiliate;
93
+ topics: HackTopic[];
94
+ contributors?: HackContributor[];
95
+ type: HackType;
96
+ sourceData?: HackSourceData;
97
+ externalLink?: HackExternalLink;
98
+
99
+ /** added Mar 2024 */
100
+ // TODO make it mandatory after a republish
101
+ subjects?: ExtractedSubject[];
102
+ }
103
+
104
+ export interface HackContributor {
105
+ name: string;
106
+ }
107
+
108
+ export interface HackTopic {
109
+ name: string;
110
+ }
111
+
112
+ export interface HackAffiliate {
113
+ url: string;
114
+ name: string;
115
+ }
116
+
117
+ export type HackType = 'book' | 'course' | 'documentary' | 'podcast' | 'original';
118
+
119
+ export interface HackSourceData {
120
+ episodeTitle?: string;
121
+ releaseDate?: string;
122
+ }
123
+
124
+ export interface HackExternalLink {
125
+ url: string;
126
+ type: 'Website' | 'Book' | 'Course' | 'Podcast' | 'Video' | 'Other';
127
+ }
@@ -1,20 +1,20 @@
1
- export interface PublishHackCommandBody {
2
- // a command needs an id and a version so that it can be more easily replayed
3
- // for this specific PublishHack command, the id is the draftHackId and the version is the timestamp
4
- id: string;
5
- v: number;
6
- draftHackId: string;
7
- draftHackVersion: number;
8
- hackId: string;
9
- publishSource: PublishHackSource;
10
- /** if no voice ids are specified then all voices are generated */
11
- voiceIds?: string[];
12
- }
13
-
14
- export type PublishHackSource = 'web-app' | 'cms' | 'script' | 'translation';
15
-
16
- export interface PublishHackCommand {
17
- id: string;
18
- type: 'PublishHackCommand';
19
- payload: PublishHackCommandBody;
20
- }
1
+ export interface PublishHackCommandBody {
2
+ // a command needs an id and a version so that it can be more easily replayed
3
+ // for this specific PublishHack command, the id is the draftHackId and the version is the timestamp
4
+ id: string;
5
+ v: number;
6
+ draftHackId: string;
7
+ draftHackVersion: number;
8
+ hackId: string;
9
+ publishSource: PublishHackSource;
10
+ /** if no voice ids are specified then all voices are generated */
11
+ voiceIds?: string[];
12
+ }
13
+
14
+ export type PublishHackSource = 'web-app' | 'cms' | 'script' | 'translation';
15
+
16
+ export interface PublishHackCommand {
17
+ id: string;
18
+ type: 'PublishHackCommand';
19
+ payload: PublishHackCommandBody;
20
+ }
@@ -1,20 +1,20 @@
1
- import { PublishHackSource } from './publish-hack-command';
2
-
3
- /**
4
- * Republishes a hack. If the hack has never been published then the command will fail.
5
- * Will republish the current draft version and use the current hacks voices. Will not use new voices
6
- */
7
- export interface RepublishHackCommandBody {
8
- id: string;
9
- v: number;
10
- hackId: string;
11
- publishSource: PublishHackSource;
12
- /** will skip the republished if the hack as been published since this date. ISO date format */
13
- skipIfPublishedSince?: string;
14
- }
15
-
16
- export interface RepublishHackCommand {
17
- id: string;
18
- type: 'RepublishHack';
19
- payload: RepublishHackCommandBody;
20
- }
1
+ import { PublishHackSource } from './publish-hack-command';
2
+
3
+ /**
4
+ * Republishes a hack. If the hack has never been published then the command will fail.
5
+ * Will republish the current draft version and use the current hacks voices. Will not use new voices
6
+ */
7
+ export interface RepublishHackCommandBody {
8
+ id: string;
9
+ v: number;
10
+ hackId: string;
11
+ publishSource: PublishHackSource;
12
+ /** will skip the republished if the hack as been published since this date. ISO date format */
13
+ skipIfPublishedSince?: string;
14
+ }
15
+
16
+ export interface RepublishHackCommand {
17
+ id: string;
18
+ type: 'RepublishHack';
19
+ payload: RepublishHackCommandBody;
20
+ }
@@ -1,6 +1,6 @@
1
- export function hackIsInUptimeCatalogue({acl}: {acl: string[]}): boolean {
2
- if (!acl) {
3
- return false;
4
- }
5
- return acl.includes('catalogue:uptime');
6
- }
1
+ export function hackIsInUptimeCatalogue({acl}: {acl: string[]}): boolean {
2
+ if (!acl) {
3
+ return false;
4
+ }
5
+ return acl.includes('catalogue:uptime');
6
+ }
@@ -1,12 +1,12 @@
1
- import { EnrichedHack } from '@uptime.app/contracts';
2
- import ENRICHED_HACK from './test-data/enriched-hack.json';
3
- import EXPECTED_APP_FULL_HACK from './test-data/expected-app-full-hack.json';
4
- import { mapToAppFullHack } from './app-full-hack';
5
-
6
- describe('converting an EnrichedHack to an AppFullHack', () => {
7
- test('it returns the expected fields', () => {
8
- const fullHackData = ENRICHED_HACK as any as EnrichedHack;
9
- const fullHack = mapToAppFullHack(fullHackData);
10
- expect(fullHack).toEqual(EXPECTED_APP_FULL_HACK);
11
- });
12
- });
1
+ import { EnrichedHack } from '@uptime.app/contracts';
2
+ import ENRICHED_HACK from './test-data/enriched-hack.json';
3
+ import EXPECTED_APP_FULL_HACK from './test-data/expected-app-full-hack.json';
4
+ import { mapToAppFullHack } from './app-full-hack';
5
+
6
+ describe('converting an EnrichedHack to an AppFullHack', () => {
7
+ test('it returns the expected fields', () => {
8
+ const fullHackData = ENRICHED_HACK as any as EnrichedHack;
9
+ const fullHack = mapToAppFullHack(fullHackData);
10
+ expect(fullHack).toEqual(EXPECTED_APP_FULL_HACK);
11
+ });
12
+ });
@@ -1,14 +1,14 @@
1
- import { AppFullHack } from '../app-hack/app-full-hack';
2
- import { EnrichedHack } from '../enriched-hack/enriched-hack';
3
- import { mapToAppRestrictedHack } from './app-restricted-hack';
4
- import { removeUndefinedFields } from './remove-undefined-fields';
5
-
6
- export function mapToAppFullHack(hack: EnrichedHack): AppFullHack {
7
- const appHack = mapToAppRestrictedHack(hack);
8
- // allow access to all segments
9
- const segments = removeUndefinedFields(hack.segments);
10
- return removeUndefinedFields({
11
- ...appHack,
12
- segments
13
- });
14
- }
1
+ import { AppFullHack } from '../app-hack/app-full-hack';
2
+ import { EnrichedHack } from '../enriched-hack/enriched-hack';
3
+ import { mapToAppRestrictedHack } from './app-restricted-hack';
4
+ import { removeUndefinedFields } from './remove-undefined-fields';
5
+
6
+ export function mapToAppFullHack(hack: EnrichedHack): AppFullHack {
7
+ const appHack = mapToAppRestrictedHack(hack);
8
+ // allow access to all segments
9
+ const segments = removeUndefinedFields(hack.segments);
10
+ return removeUndefinedFields({
11
+ ...appHack,
12
+ segments
13
+ });
14
+ }
@@ -1,22 +1,22 @@
1
- import { EnrichedHack } from '@uptime.app/contracts';
2
- import ENRICHED_HACK from './test-data/enriched-hack.json';
3
- import EXPECTED_APP_HACK_METADATA from './test-data/expected-app-hack-metadata.json';
4
- import { mapToAppHackMetadata } from './app-hack-metadata';
5
- describe('converting an EnrichedHack to an AppHackMetadata', () => {
6
-
7
- test('it returns the expected fields', () => {
8
- const appHackMetadataData = ENRICHED_HACK as any as EnrichedHack;
9
- const appHackMetadata = mapToAppHackMetadata(appHackMetadataData);
10
- expect(appHackMetadata).toEqual(EXPECTED_APP_HACK_METADATA);
11
- });
12
-
13
- test('a hack not in the uptime catalogue has shareScope set to private', () => {
14
- const appHackMetadata = mapToAppHackMetadata({...ENRICHED_HACK, acl: ['catalogue:not-uptime']} as EnrichedHack);
15
- expect(appHackMetadata.shareScope).toBe('private');
16
- });
17
-
18
- test('a hack not included on the website has shareScope set to private', () => {
19
- const appHackMetadata = mapToAppHackMetadata({...ENRICHED_HACK, includeInWebsite: false} as EnrichedHack);
20
- expect(appHackMetadata.shareScope).toBe('private');
21
- });
22
- });
1
+ import { EnrichedHack } from '@uptime.app/contracts';
2
+ import ENRICHED_HACK from './test-data/enriched-hack.json';
3
+ import EXPECTED_APP_HACK_METADATA from './test-data/expected-app-hack-metadata.json';
4
+ import { mapToAppHackMetadata } from './app-hack-metadata';
5
+ describe('converting an EnrichedHack to an AppHackMetadata', () => {
6
+
7
+ test('it returns the expected fields', () => {
8
+ const appHackMetadataData = ENRICHED_HACK as any as EnrichedHack;
9
+ const appHackMetadata = mapToAppHackMetadata(appHackMetadataData);
10
+ expect(appHackMetadata).toEqual(EXPECTED_APP_HACK_METADATA);
11
+ });
12
+
13
+ test('a hack not in the uptime catalogue has shareScope set to private', () => {
14
+ const appHackMetadata = mapToAppHackMetadata({...ENRICHED_HACK, acl: ['catalogue:not-uptime']} as EnrichedHack);
15
+ expect(appHackMetadata.shareScope).toBe('private');
16
+ });
17
+
18
+ test('a hack not included on the website has shareScope set to private', () => {
19
+ const appHackMetadata = mapToAppHackMetadata({...ENRICHED_HACK, includeInWebsite: false} as EnrichedHack);
20
+ expect(appHackMetadata.shareScope).toBe('private');
21
+ });
22
+ });
@@ -1,82 +1,82 @@
1
- import { removeUndefinedFields } from './remove-undefined-fields';
2
- import { hackIsInUptimeCatalogue } from './access-helper';
3
- import { EnrichedHack } from '../enriched-hack/enriched-hack';
4
- import { AppHackMetadata } from '../app-hack/app-hack-metadata';
5
-
6
- export function mapToAppHackMetadata(hack: EnrichedHack): AppHackMetadata {
7
- // This function purposely picks the required fields from the EnrichedHack rather than deleting the unnecessary fields from EnrichedHack
8
- // This ensures that if the EnrichedHack model is updated then those extra fields are not returned accidentally.
9
- // This means that a service will not reflect any updated fields until it updates this module
10
- return removeUndefinedFields({
11
- id: hack.id,
12
- title: hack.title,
13
- owner: hack.owner,
14
- v: hack.v,
15
- hackVersion: hack.hackVersion,
16
- createdAt: hack.createdAt,
17
- updatedAt: hack.updatedAt,
18
- baseLocaleHackId: hack.baseLocaleHackId,
19
- language: hack.language,
20
- locale: hack.locale,
21
- acl: hack.acl,
22
- themeId: hack.theme.id,
23
- isHidden: hack.isHidden,
24
- editorialTags: hack.editorialTags,
25
- coverUrl: hack.coverUrl,
26
- description: hack.description,
27
- segments: toHackAppMetadataSegments(hack.segments),
28
- topics: hack.topics,
29
- contributors: hack.contributors,
30
- type: hack.type,
31
- sourceData: hack.sourceData,
32
- // todo - should we pick the required fields from profile rather than the entire object?
33
- profile: hack.profile,
34
- timeSaved: hack.timeSaved,
35
- estimatedTimeSaved: hack.estimatedTimeSaved,
36
- shareScope: getShareScope(hack),
37
- catalogues: aclToCatalogues(hack.acl),
38
- tenantDisplayName: hack.tenantDisplayName
39
- });
40
- }
41
-
42
- function toHackAppMetadataSegments(segments: EnrichedHack['segments']): AppHackMetadata['segments'] {
43
- return removeUndefinedFields({
44
- favouriteQuote: {
45
- id: segments.favouriteQuote.id,
46
- },
47
- inANutshell: {
48
- id: segments.inANutshell.id,
49
- },
50
- introduction: {
51
- id: segments.introduction.id,
52
- },
53
- insights: segments.insights.map(insight => ({
54
- id: insight.id,
55
- })),
56
- conclusion: {
57
- id: segments.conclusion.id,
58
- },
59
- overview: {
60
- id: segments.overview.id,
61
- },
62
- shareableOverview: {
63
- id: segments.shareableOverview.id,
64
- },
65
- hereAreTheInsights: {
66
- id: segments.hereAreTheInsights.id,
67
- },
68
- putInAction: segments.putInAction && {
69
- id: segments.putInAction.id,
70
- },
71
- });
72
- }
73
-
74
- function getShareScope(hack: {acl: string[]; includeInWebsite: boolean}): 'public' | 'private' {
75
- return (hack.includeInWebsite && hackIsInUptimeCatalogue(hack)) ? 'public' : 'private';
76
- }
77
-
78
- function aclToCatalogues(acl: string[]): string[] {
79
- return acl
80
- .filter(entry => entry.startsWith('catalogue:'))
81
- .map(entry => entry.replace('catalogue:', ''));
82
- }
1
+ import { removeUndefinedFields } from './remove-undefined-fields';
2
+ import { hackIsInUptimeCatalogue } from './access-helper';
3
+ import { EnrichedHack } from '../enriched-hack/enriched-hack';
4
+ import { AppHackMetadata } from '../app-hack/app-hack-metadata';
5
+
6
+ export function mapToAppHackMetadata(hack: EnrichedHack): AppHackMetadata {
7
+ // This function purposely picks the required fields from the EnrichedHack rather than deleting the unnecessary fields from EnrichedHack
8
+ // This ensures that if the EnrichedHack model is updated then those extra fields are not returned accidentally.
9
+ // This means that a service will not reflect any updated fields until it updates this module
10
+ return removeUndefinedFields({
11
+ id: hack.id,
12
+ title: hack.title,
13
+ owner: hack.owner,
14
+ v: hack.v,
15
+ hackVersion: hack.hackVersion,
16
+ createdAt: hack.createdAt,
17
+ updatedAt: hack.updatedAt,
18
+ baseLocaleHackId: hack.baseLocaleHackId,
19
+ language: hack.language,
20
+ locale: hack.locale,
21
+ acl: hack.acl,
22
+ themeId: hack.theme.id,
23
+ isHidden: hack.isHidden,
24
+ editorialTags: hack.editorialTags,
25
+ coverUrl: hack.coverUrl,
26
+ description: hack.description,
27
+ segments: toHackAppMetadataSegments(hack.segments),
28
+ topics: hack.topics,
29
+ contributors: hack.contributors,
30
+ type: hack.type,
31
+ sourceData: hack.sourceData,
32
+ // todo - should we pick the required fields from profile rather than the entire object?
33
+ profile: hack.profile,
34
+ timeSaved: hack.timeSaved,
35
+ estimatedTimeSaved: hack.estimatedTimeSaved,
36
+ shareScope: getShareScope(hack),
37
+ catalogues: aclToCatalogues(hack.acl),
38
+ tenantDisplayName: hack.tenantDisplayName
39
+ });
40
+ }
41
+
42
+ function toHackAppMetadataSegments(segments: EnrichedHack['segments']): AppHackMetadata['segments'] {
43
+ return removeUndefinedFields({
44
+ favouriteQuote: {
45
+ id: segments.favouriteQuote.id,
46
+ },
47
+ inANutshell: {
48
+ id: segments.inANutshell.id,
49
+ },
50
+ introduction: {
51
+ id: segments.introduction.id,
52
+ },
53
+ insights: segments.insights.map(insight => ({
54
+ id: insight.id,
55
+ })),
56
+ conclusion: {
57
+ id: segments.conclusion.id,
58
+ },
59
+ overview: {
60
+ id: segments.overview.id,
61
+ },
62
+ shareableOverview: {
63
+ id: segments.shareableOverview.id,
64
+ },
65
+ hereAreTheInsights: {
66
+ id: segments.hereAreTheInsights.id,
67
+ },
68
+ putInAction: segments.putInAction && {
69
+ id: segments.putInAction.id,
70
+ },
71
+ });
72
+ }
73
+
74
+ function getShareScope(hack: {acl: string[]; includeInWebsite: boolean}): 'public' | 'private' {
75
+ return (hack.includeInWebsite && hackIsInUptimeCatalogue(hack)) ? 'public' : 'private';
76
+ }
77
+
78
+ function aclToCatalogues(acl: string[]): string[] {
79
+ return acl
80
+ .filter(entry => entry.startsWith('catalogue:'))
81
+ .map(entry => entry.replace('catalogue:', ''));
82
+ }
@@ -1,11 +1,11 @@
1
- import { EnrichedHack } from '@uptime.app/contracts';
2
- import ENRICHED_HACK from './test-data/enriched-hack.json';
3
- import EXPECTED_APP_RESTRICTED_HACK from './test-data/expected-app-restricted-hack.json';
4
- import { mapToAppRestrictedHack } from './app-restricted-hack';
5
- describe('converting an EnrichedHack to an AppRestrictedHack', () => {
6
- test('it returns the expected fields', () => {
7
- const enrichedHackData = ENRICHED_HACK as any as EnrichedHack;
8
- const restrictedHack = mapToAppRestrictedHack(enrichedHackData);
9
- expect(restrictedHack).toEqual(EXPECTED_APP_RESTRICTED_HACK);
10
- });
11
- });
1
+ import { EnrichedHack } from '@uptime.app/contracts';
2
+ import ENRICHED_HACK from './test-data/enriched-hack.json';
3
+ import EXPECTED_APP_RESTRICTED_HACK from './test-data/expected-app-restricted-hack.json';
4
+ import { mapToAppRestrictedHack } from './app-restricted-hack';
5
+ describe('converting an EnrichedHack to an AppRestrictedHack', () => {
6
+ test('it returns the expected fields', () => {
7
+ const enrichedHackData = ENRICHED_HACK as any as EnrichedHack;
8
+ const restrictedHack = mapToAppRestrictedHack(enrichedHackData);
9
+ expect(restrictedHack).toEqual(EXPECTED_APP_RESTRICTED_HACK);
10
+ });
11
+ });