musora-content-services 2.147.0 → 2.148.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/.claude/settings.local.json +22 -0
  2. package/.coderabbit.yaml +0 -0
  3. package/.editorconfig +0 -0
  4. package/.github/pull_request_template.md +0 -0
  5. package/.github/workflows/conventional-commits.yaml +0 -0
  6. package/.github/workflows/docs.js.yml +0 -0
  7. package/.prettierignore +0 -0
  8. package/.prettierrc +0 -0
  9. package/CHANGELOG.md +20 -0
  10. package/CLAUDE.md +0 -0
  11. package/README.md +0 -0
  12. package/babel.config.cjs +0 -0
  13. package/jest.config.js +0 -0
  14. package/package.json +1 -1
  15. package/src/constants/award-assets.js +0 -0
  16. package/src/constants/membership-permissions.ts +0 -0
  17. package/src/contentMetaData.js +0 -0
  18. package/src/filterBuilder.js +0 -0
  19. package/src/infrastructure/http/HttpClient.ts +0 -0
  20. package/src/infrastructure/http/executors/FetchRequestExecutor.ts +0 -0
  21. package/src/infrastructure/http/index.ts +0 -0
  22. package/src/infrastructure/http/interfaces/HeaderProvider.ts +0 -0
  23. package/src/infrastructure/http/interfaces/HttpError.ts +0 -0
  24. package/src/infrastructure/http/interfaces/NetworkError.ts +0 -0
  25. package/src/infrastructure/http/interfaces/RequestExecutor.ts +0 -0
  26. package/src/infrastructure/http/interfaces/RequestOptions.ts +0 -0
  27. package/src/infrastructure/http/providers/DefaultHeaderProvider.ts +0 -0
  28. package/src/lib/ads/monoid.ts +0 -0
  29. package/src/lib/ads/semigroup.ts +0 -0
  30. package/src/lib/brands.ts +0 -0
  31. package/src/lib/lastUpdated.js +0 -0
  32. package/src/lib/sanity/field-access.ts +0 -0
  33. package/src/lib/sanity/filter.ts +0 -0
  34. package/src/lib/sanity/query.ts +0 -0
  35. package/src/services/api/types.js +0 -0
  36. package/src/services/api/types.ts +0 -0
  37. package/src/services/awards/award-callbacks.js +0 -0
  38. package/src/services/awards/award-query.js +0 -0
  39. package/src/services/awards/internal/.indexignore +0 -0
  40. package/src/services/awards/internal/award-definitions.js +0 -0
  41. package/src/services/awards/internal/award-events.js +0 -0
  42. package/src/services/awards/internal/award-manager.js +0 -0
  43. package/src/services/awards/internal/certificate-builder.js +0 -0
  44. package/src/services/awards/internal/content-progress-observer.js +0 -0
  45. package/src/services/awards/internal/image-utils.js +0 -0
  46. package/src/services/awards/internal/types.js +0 -0
  47. package/src/services/awards/types.d.ts +0 -0
  48. package/src/services/awards/types.js +0 -0
  49. package/src/services/content/artist.ts +0 -0
  50. package/src/services/content/content.ts +0 -0
  51. package/src/services/content/genre.ts +0 -0
  52. package/src/services/content/instructor.ts +0 -0
  53. package/src/services/content-org/content-org.js +0 -0
  54. package/src/services/content-org/guided-courses.ts +0 -0
  55. package/src/services/content-org/learning-paths.ts +0 -0
  56. package/src/services/content-org/playlists-types.js +0 -0
  57. package/src/services/content-org/playlists.js +0 -0
  58. package/src/services/contentLikes.js +0 -0
  59. package/src/services/dataContext.js +0 -0
  60. package/src/services/dateUtils.js +0 -0
  61. package/src/services/eventsAPI.js +0 -0
  62. package/src/services/forums/categories.ts +0 -0
  63. package/src/services/forums/forums.ts +0 -0
  64. package/src/services/forums/posts.ts +0 -0
  65. package/src/services/forums/threads.ts +0 -0
  66. package/src/services/forums/types.ts +0 -0
  67. package/src/services/gamification/awards.ts +0 -0
  68. package/src/services/gamification/gamification.js +0 -0
  69. package/src/services/imageSRCBuilder.js +0 -0
  70. package/src/services/imageSRCVerify.js +0 -0
  71. package/src/services/liveTesting.ts +0 -0
  72. package/src/services/permissions/PermissionsAdapter.ts +0 -0
  73. package/src/services/permissions/PermissionsAdapterFactory.ts +0 -0
  74. package/src/services/permissions/PermissionsV1Adapter.ts +0 -0
  75. package/src/services/permissions/PermissionsV2Adapter.ts +0 -0
  76. package/src/services/permissions/README.md +0 -0
  77. package/src/services/permissions/index.ts +0 -0
  78. package/src/services/progress-events.js +0 -0
  79. package/src/services/progress-row/base.js +0 -0
  80. package/src/services/progress-row/rows/.indexignore +0 -0
  81. package/src/services/progress-row/rows/method-card.js +0 -0
  82. package/src/services/progress-row/rows/playlist-card.js +0 -0
  83. package/src/services/railcontent.js +0 -0
  84. package/src/services/recommendations.js +0 -0
  85. package/src/services/reporting/README.md +0 -0
  86. package/src/services/reporting/reporting.ts +0 -0
  87. package/src/services/reporting/types.ts +0 -0
  88. package/src/services/sentry/.indexignore +0 -0
  89. package/src/services/sentry/index.ts +0 -0
  90. package/src/services/state.ts +0 -0
  91. package/src/services/sync/.indexignore +0 -0
  92. package/src/services/sync/adapters/lokijs.ts +35 -0
  93. package/src/services/sync/adapters/sqlite.ts +0 -0
  94. package/src/services/sync/context/index.ts +0 -0
  95. package/src/services/sync/context/providers/base.ts +0 -0
  96. package/src/services/sync/context/providers/connectivity.ts +0 -0
  97. package/src/services/sync/context/providers/durability.ts +0 -0
  98. package/src/services/sync/context/providers/index.ts +0 -0
  99. package/src/services/sync/context/providers/session.ts +0 -0
  100. package/src/services/sync/context/providers/tabs.ts +0 -0
  101. package/src/services/sync/context/providers/visibility.ts +0 -0
  102. package/src/services/sync/database/factory.ts +0 -0
  103. package/src/services/sync/effects/index.ts +0 -0
  104. package/src/services/sync/effects/logout-warning.ts +0 -0
  105. package/src/services/sync/effects/push-failure-notification.ts +0 -0
  106. package/src/services/sync/errors/boundary.ts +0 -0
  107. package/src/services/sync/errors/index.ts +0 -0
  108. package/src/services/sync/errors/validators.ts +0 -0
  109. package/src/services/sync/fetch.ts +0 -0
  110. package/src/services/sync/index.ts +0 -0
  111. package/src/services/sync/manager.ts +0 -0
  112. package/src/services/sync/models/Base.ts +0 -0
  113. package/src/services/sync/models/ContentLike.ts +0 -0
  114. package/src/services/sync/models/ContentProgress.ts +0 -0
  115. package/src/services/sync/models/Practice.ts +0 -0
  116. package/src/services/sync/models/PracticeDayNote.ts +0 -0
  117. package/src/services/sync/models/UserAwardProgress.ts +0 -0
  118. package/src/services/sync/models/index.ts +0 -0
  119. package/src/services/sync/repositories/base.ts +0 -0
  120. package/src/services/sync/repositories/content-likes.ts +0 -0
  121. package/src/services/sync/repositories/content-progress.ts +0 -0
  122. package/src/services/sync/repositories/index.ts +0 -0
  123. package/src/services/sync/repositories/practice-day-notes.ts +0 -0
  124. package/src/services/sync/repositories/practices.ts +0 -0
  125. package/src/services/sync/repositories/user-award-progress.ts +0 -0
  126. package/src/services/sync/repository-proxy.ts +0 -0
  127. package/src/services/sync/resolver.ts +0 -0
  128. package/src/services/sync/retry.ts +0 -0
  129. package/src/services/sync/run-scope.ts +0 -0
  130. package/src/services/sync/schema/index.ts +0 -0
  131. package/src/services/sync/serializers/index.ts +0 -0
  132. package/src/services/sync/serializers/model.ts +0 -0
  133. package/src/services/sync/serializers/raw.ts +0 -0
  134. package/src/services/sync/store/index.ts +0 -0
  135. package/src/services/sync/store/push-coalescer.ts +0 -0
  136. package/src/services/sync/store-configs.ts +0 -0
  137. package/src/services/sync/strategies/base.ts +0 -0
  138. package/src/services/sync/strategies/index.ts +0 -0
  139. package/src/services/sync/strategies/initial.ts +0 -0
  140. package/src/services/sync/strategies/polling.ts +0 -0
  141. package/src/services/sync/telemetry/flood-prevention.ts +0 -0
  142. package/src/services/sync/telemetry/index.ts +0 -0
  143. package/src/services/sync/telemetry/sampling.ts +0 -0
  144. package/src/services/sync/utils/event-emitter.ts +0 -0
  145. package/src/services/sync/utils/index.ts +0 -0
  146. package/src/services/sync/utils/throttle.ts +0 -0
  147. package/src/services/sync/utils/timers.ts +0 -0
  148. package/src/services/urlBuilder.ts +0 -0
  149. package/src/services/user/chat.js +0 -0
  150. package/src/services/user/interests.js +0 -0
  151. package/src/services/user/management.js +0 -0
  152. package/src/services/user/memberships.ts +0 -0
  153. package/src/services/user/notifications.js +0 -0
  154. package/src/services/user/payments.ts +0 -0
  155. package/src/services/user/permissions.js +0 -0
  156. package/src/services/user/sessions.js +0 -0
  157. package/src/services/user/streakCalculator.ts +0 -0
  158. package/src/services/user/types.d.ts +0 -0
  159. package/src/services/user/types.js +0 -0
  160. package/src/services/user/user-management-system.js +0 -0
  161. package/src/services/userActivity.js +3 -4
  162. package/test/HttpClient.test.js +0 -0
  163. package/test/awards/award-alacarte-observer.test.js +0 -0
  164. package/test/awards/award-auto-refresh.test.js +0 -0
  165. package/test/awards/award-calculations.test.js +0 -0
  166. package/test/awards/award-certificate-display.test.js +0 -0
  167. package/test/awards/award-collection-edge-cases.test.js +0 -0
  168. package/test/awards/award-collection-filtering.test.js +0 -0
  169. package/test/awards/award-completion-flow.test.js +0 -0
  170. package/test/awards/award-exclusion-handling.test.js +0 -0
  171. package/test/awards/award-multi-lesson.test.js +0 -0
  172. package/test/awards/award-observer-integration.test.js +0 -0
  173. package/test/awards/award-query-messages.test.js +0 -0
  174. package/test/awards/award-user-collection.test.js +0 -0
  175. package/test/awards/duplicate-prevention.test.js +0 -0
  176. package/test/awards/helpers/completion-mock.js +0 -0
  177. package/test/awards/helpers/index.js +0 -0
  178. package/test/awards/helpers/mock-setup.js +0 -0
  179. package/test/awards/helpers/progress-emitter.js +0 -0
  180. package/test/awards/message-generator.test.js +0 -0
  181. package/test/content.test.js +0 -0
  182. package/test/contentLikes.test.js +0 -0
  183. package/test/contentProgress.test.js +0 -0
  184. package/test/dataContext.test.js +0 -0
  185. package/test/forum.test.js +0 -0
  186. package/test/imageSRCBuilder.test.js +0 -0
  187. package/test/imageSRCVerify.test.js +0 -0
  188. package/test/initializeTests.js +0 -0
  189. package/test/learningPaths.test.js +0 -0
  190. package/test/lib/__snapshots__/filter.test.ts.snap +0 -0
  191. package/test/lib/filter.test.ts +0 -0
  192. package/test/lib/lastUpdated.test.js +0 -0
  193. package/test/lib/query.test.ts +0 -0
  194. package/test/live/contentProgressLive.test.js +0 -0
  195. package/test/live/railcontentLive.test.js +0 -0
  196. package/test/localStorageMock.js +0 -0
  197. package/test/log.js +0 -0
  198. package/test/mockData/award-definitions.js +0 -0
  199. package/test/mockData/mockData_fetchByRailContentIds_one_content.json +0 -0
  200. package/test/mockData/mockData_progress_content.json +0 -0
  201. package/test/mockData/mockData_sanity_progress_content.json +0 -0
  202. package/test/mockData/mockData_user_practices.json +0 -0
  203. package/test/notifications.test.js +0 -0
  204. package/test/progressRows.test.js +0 -0
  205. package/test/sanityQueryService.test.js +0 -0
  206. package/test/streakMessage.test.js +0 -0
  207. package/test/sync/adapter.ts +0 -0
  208. package/test/sync/initialize-sync-manager.js +0 -0
  209. package/test/sync/models/award-database-integration.test.js +0 -0
  210. package/test/user/permissions.test.js +0 -0
  211. package/test/userActivity.test.js +0 -0
  212. package/tools/generate-index.cjs +0 -0
@@ -0,0 +1,22 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(tree:*)",
5
+ "Bash(find:*)",
6
+ "Bash(docker exec:*)",
7
+ "Bash(node:*)",
8
+ "Bash(npm run build-index:*)",
9
+ "Bash(npm run link_mcs:*)",
10
+ "Bash(./link_mcs.sh:*)",
11
+ "Bash(curl:*)",
12
+ "Bash(php artisan:*)",
13
+ "Bash(git checkout:*)",
14
+ "Bash(source .env)",
15
+ "Bash(echo:*)",
16
+ "Bash(grep:*)",
17
+ "Bash(gh api repos/railroadmedia/musora-platform-backend/commits/1f9878a5e681bf1e2233c0d59a618d477b118c49 --jq '.commit.message' 2>/dev/null || echo \"no access\")",
18
+ "WebFetch(domain:github.com)",
19
+ "Read(//app/**)"
20
+ ]
21
+ }
22
+ }
package/.coderabbit.yaml CHANGED
File without changes
package/.editorconfig CHANGED
File without changes
File without changes
File without changes
File without changes
package/.prettierignore CHANGED
File without changes
package/.prettierrc CHANGED
File without changes
package/CHANGELOG.md CHANGED
@@ -2,6 +2,26 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ## [2.148.0](https://github.com/railroadmedia/musora-content-services/compare/v2.145.6...v2.148.0) (2026-04-03)
6
+
7
+
8
+ ### Features
9
+
10
+ * Add children to fetchScheduledAndNewReleases for navigateTo calculations ([#901](https://github.com/railroadmedia/musora-content-services/issues/901)) ([3ade1ad](https://github.com/railroadmedia/musora-content-services/commit/3ade1ad400e1dd9e56d245f3a37d77d709a0d4e1))
11
+ * **BEHLPT-18:** remove user from muppet ([#891](https://github.com/railroadmedia/musora-content-services/issues/891)) ([ecdf778](https://github.com/railroadmedia/musora-content-services/commit/ecdf778108f974f59885c3d442c47c90152c5554))
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * patches indexedDB.deleteDatabase to silence noisy safari errs ([#888](https://github.com/railroadmedia/musora-content-services/issues/888)) ([c67d408](https://github.com/railroadmedia/musora-content-services/commit/c67d40800ffe64d3eab204b97eaf26413b5a6e79))
17
+
18
+ ### [2.147.1](https://github.com/railroadmedia/musora-content-services/compare/v2.147.0...v2.147.1) (2026-04-02)
19
+
20
+
21
+ ### Bug Fixes
22
+
23
+ * patches indexedDB.deleteDatabase to silence noisy safari errs ([#888](https://github.com/railroadmedia/musora-content-services/issues/888)) ([c67d408](https://github.com/railroadmedia/musora-content-services/commit/c67d40800ffe64d3eab204b97eaf26413b5a6e79))
24
+
5
25
  ## [2.147.0](https://github.com/railroadmedia/musora-content-services/compare/v2.146.1...v2.147.0) (2026-04-02)
6
26
 
7
27
 
package/CLAUDE.md CHANGED
File without changes
package/README.md CHANGED
File without changes
package/babel.config.cjs CHANGED
File without changes
package/jest.config.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "musora-content-services",
3
- "version": "2.147.0",
3
+ "version": "2.148.0",
4
4
  "description": "A package for Musoras content services ",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/src/lib/brands.ts CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -15,6 +15,41 @@ export function muteImpendingDriverErrors() {
15
15
  )
16
16
  }
17
17
 
18
+ /**
19
+ * Patch indexedDB.deleteDatabase to delay the real call by 1ms
20
+ * as Safari logs tons of noisy errors, due to watermelon's
21
+ * `IncrementalIndexedDBAdapter.prototype.deleteDatabase` fn not waiting for
22
+ * a `close()` call to complete before trying `deleteDatabase`
23
+ * (which consistently triggers `request.onblocked`)
24
+ */
25
+ export function patchIndexedDBDeleteDatabaseErrors() {
26
+ const idb = window.indexedDB as any
27
+ const originalDeleteDatabase = idb.deleteDatabase
28
+
29
+ idb.deleteDatabase = function(...args: any[]) {
30
+ const proxyRequest = new Proxy({} as IDBOpenDBRequest, {
31
+ get(target, prop) {
32
+ return target[prop]
33
+ },
34
+ set(target, prop, value) {
35
+ target[prop] = value
36
+ return true
37
+ },
38
+ })
39
+
40
+ // Delay the real call by 1ms
41
+ setTimeout(() => {
42
+ const realRequest = originalDeleteDatabase.apply(this, args)
43
+
44
+ Object.keys(proxyRequest).forEach(prop => {
45
+ realRequest[prop] = (event: Event) => proxyRequest[prop]?.call(proxyRequest, event)
46
+ })
47
+ }, 1)
48
+
49
+ return proxyRequest
50
+ }
51
+ }
52
+
18
53
  /**
19
54
  * Patch IndexedDB open to listen for specifically definitely asynchronous errors
20
55
  */
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -718,8 +718,7 @@ export async function calculateLongestStreaks(userId = globalConfig.sessionConfi
718
718
  let practiceDates = Object.keys(practices)
719
719
  .map((dateStr) => {
720
720
  const [y, m, d] = dateStr.split('-').map(Number)
721
- const newDate = new Date()
722
- newDate.setFullYear(y, m - 1, d)
721
+ const newDate = new Date(y, m - 1, d, 0, 0, 0, 0)
723
722
  return newDate
724
723
  })
725
724
  .sort((a, b) => a - b)
@@ -744,7 +743,7 @@ export async function calculateLongestStreaks(userId = globalConfig.sessionConfi
744
743
  let currentDailyStreak = 1
745
744
  for (let i = 1; i < normalizedDates.length; i++) {
746
745
  const diffInDays = (normalizedDates[i] - normalizedDates[i - 1]) / (1000 * 60 * 60 * 24)
747
- if (diffInDays === 1) {
746
+ if (Math.round(diffInDays) === 1) {
748
747
  currentDailyStreak++
749
748
  longestDailyStreak = Math.max(longestDailyStreak, currentDailyStreak)
750
749
  } else {
@@ -770,7 +769,7 @@ export async function calculateLongestStreaks(userId = globalConfig.sessionConfi
770
769
 
771
770
  for (let i = 1; i < weekStartDates.length; i++) {
772
771
  const diffInWeeks = (weekStartDates[i] - weekStartDates[i - 1]) / (1000 * 60 * 60 * 24 * 7)
773
- if (diffInWeeks === 1) {
772
+ if (Math.round(diffInWeeks) === 1) {
774
773
  currentWeeklyStreak++
775
774
  longestWeeklyStreak = Math.max(longestWeeklyStreak, currentWeeklyStreak)
776
775
  } else {
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/test/log.js CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes