musora-content-services 2.77.0 → 2.77.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/.claude/settings.local.json +3 -6
  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/.github/workflows/node.js.yml +0 -0
  8. package/.prettierignore +0 -0
  9. package/.prettierrc +0 -0
  10. package/CHANGELOG.md +9 -0
  11. package/README.md +0 -0
  12. package/babel.config.cjs +0 -0
  13. package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  14. package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  15. package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  16. package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  17. package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  18. package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  19. package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  20. package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  21. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  22. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +0 -0
  23. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  24. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  25. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  26. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  27. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +0 -0
  28. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  29. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  30. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  31. package/docs/forums_discussions.js.html +0 -0
  32. package/docs/forums_forum.js.html +0 -0
  33. package/docs/gamification_awards.js.html +0 -0
  34. package/docs/gamification_types.js.html +0 -0
  35. package/docs/module-Categories.html +0 -0
  36. package/docs/module-ForumCategories.html +0 -0
  37. package/docs/module-ForumDiscussions.html +0 -0
  38. package/docs/module-Threads.html +0 -0
  39. package/docs/scripts/collapse.js +0 -0
  40. package/docs/scripts/commonNav.js +0 -0
  41. package/docs/scripts/linenumber.js +0 -0
  42. package/docs/scripts/nav.js +0 -0
  43. package/docs/scripts/polyfill.js +0 -0
  44. package/docs/scripts/prettify/Apache-License-2.0.txt +0 -0
  45. package/docs/scripts/prettify/lang-css.js +0 -0
  46. package/docs/scripts/prettify/prettify.js +0 -0
  47. package/docs/scripts/search.js +0 -0
  48. package/docs/styles/jsdoc.css +0 -0
  49. package/docs/styles/prettify.css +0 -0
  50. package/docs/user_memberships.js.html +0 -0
  51. package/jest.config.js +0 -0
  52. package/jsdoc.json +0 -0
  53. package/package.json +1 -1
  54. package/src/contentMetaData.js +0 -0
  55. package/src/contentTypeConfig.js +9 -61
  56. package/src/filterBuilder.js +0 -0
  57. package/src/infrastructure/http/executors/FetchRequestExecutor.ts +0 -0
  58. package/src/infrastructure/http/index.ts +0 -0
  59. package/src/infrastructure/http/interfaces/HeaderProvider.ts +0 -0
  60. package/src/infrastructure/http/interfaces/HttpError.ts +0 -0
  61. package/src/infrastructure/http/interfaces/NetworkError.ts +0 -0
  62. package/src/infrastructure/http/interfaces/RequestExecutor.ts +0 -0
  63. package/src/infrastructure/http/interfaces/RequestOptions.ts +0 -0
  64. package/src/infrastructure/http/providers/DefaultHeaderProvider.ts +0 -0
  65. package/src/lib/httpHelper.js +0 -0
  66. package/src/lib/lastUpdated.js +0 -0
  67. package/src/services/api/types.js +0 -0
  68. package/src/services/api/types.ts +0 -0
  69. package/src/services/config.js +0 -0
  70. package/src/services/content-org/content-org.js +0 -0
  71. package/src/services/content-org/guided-courses.ts +0 -0
  72. package/src/services/content-org/learning-paths.ts +1 -0
  73. package/src/services/content-org/playlists-types.js +0 -0
  74. package/src/services/content-org/playlists.js +0 -0
  75. package/src/services/content.js +0 -0
  76. package/src/services/contentLikes.js +0 -0
  77. package/src/services/dataContext.js +0 -0
  78. package/src/services/dateUtils.js +0 -0
  79. package/src/services/eventsAPI.js +0 -0
  80. package/src/services/forums/categories.ts +0 -0
  81. package/src/services/forums/forums.ts +0 -0
  82. package/src/services/gamification/awards.ts +0 -0
  83. package/src/services/gamification/gamification.js +0 -0
  84. package/src/services/imageSRCBuilder.js +0 -0
  85. package/src/services/imageSRCVerify.js +0 -0
  86. package/src/services/liveTesting.ts +0 -0
  87. package/src/services/progress-row/method-card.js +6 -5
  88. package/src/services/railcontent.js +0 -0
  89. package/src/services/recommendations.js +0 -0
  90. package/src/services/sanity.js +2 -1
  91. package/src/services/types.js +0 -0
  92. package/src/services/user/chat.js +0 -0
  93. package/src/services/user/interests.js +0 -0
  94. package/src/services/user/management.js +0 -0
  95. package/src/services/user/memberships.ts +0 -0
  96. package/src/services/user/notifications.js +0 -0
  97. package/src/services/user/onboarding.ts +0 -0
  98. package/src/services/user/payments.ts +0 -0
  99. package/src/services/user/permissions.js +0 -0
  100. package/src/services/user/profile.js +0 -0
  101. package/src/services/user/sessions.js +0 -0
  102. package/src/services/user/user-management-system.js +0 -0
  103. package/test/HttpClient.test.js +0 -0
  104. package/test/content.test.js +0 -0
  105. package/test/contentLikes.test.js +0 -0
  106. package/test/contentProgress.test.js +0 -0
  107. package/test/dataContext.test.js +0 -0
  108. package/test/forum.test.js +0 -0
  109. package/test/imageSRCBuilder.test.js +0 -0
  110. package/test/imageSRCVerify.test.js +0 -0
  111. package/test/initializeTests.js +0 -0
  112. package/test/lib/lastUpdated.test.js +0 -0
  113. package/test/live/contentProgressLive.test.js +0 -0
  114. package/test/live/railcontentLive.test.js +0 -0
  115. package/test/localStorageMock.js +0 -0
  116. package/test/log.js +0 -0
  117. package/test/mockData/mockData_fetchByRailContentIds_one_content.json +0 -0
  118. package/test/mockData/mockData_progress_content.json +0 -0
  119. package/test/mockData/mockData_sanity_progress_content.json +0 -0
  120. package/test/mockData/mockData_user_practices.json +0 -0
  121. package/test/notifications.test.js +0 -0
  122. package/test/progressRows.test.js +0 -0
  123. package/test/sanityQueryService.test.js +0 -0
  124. package/test/streakMessage.test.js +0 -0
  125. package/test/user/permissions.test.js +0 -0
  126. package/test/userActivity.test.js +0 -0
  127. package/tools/generate-index.cjs +0 -0
  128. package/.yarnrc.yml +0 -1
@@ -1,11 +1,8 @@
1
1
  {
2
2
  "permissions": {
3
3
  "allow": [
4
- "Read(//app/musora-platform-backend/**)",
5
- "Read(//app/musora-platform-frontend/**)",
6
- "Bash(find:*)"
4
+ "Bash(rg:*)"
7
5
  ],
8
- "deny": [],
9
- "ask": []
6
+ "deny": []
10
7
  }
11
- }
8
+ }
package/.coderabbit.yaml CHANGED
File without changes
package/.editorconfig CHANGED
File without changes
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,15 @@
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.77.2](https://github.com/railroadmedia/musora-content-services/compare/v2.77.1...v2.77.2) (2025-11-14)
6
+
7
+ ### [2.77.1](https://github.com/railroadmedia/musora-content-services/compare/v2.77.0...v2.77.1) (2025-11-13)
8
+
9
+
10
+ ### Bug Fixes
11
+
12
+ * difficulty & instructor fields ([#559](https://github.com/railroadmedia/musora-content-services/issues/559)) ([bd12f4e](https://github.com/railroadmedia/musora-content-services/commit/bd12f4e825f89eca3476bd130a23710991dff7a9))
13
+
5
14
  ## [2.77.0](https://github.com/railroadmedia/musora-content-services/compare/v2.64.0...v2.77.0) (2025-11-13)
6
15
 
7
16
 
package/README.md CHANGED
File without changes
package/babel.config.cjs 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
package/jest.config.js CHANGED
File without changes
package/jsdoc.json CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "musora-content-services",
3
- "version": "2.77.0",
3
+ "version": "2.77.2",
4
4
  "description": "A package for Musoras content services ",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
File without changes
@@ -299,8 +299,7 @@ export const progressTypesMapping = {
299
299
  'play along': playAlongLessonTypes,
300
300
  'guided course': ['guided-course'],
301
301
  pack: ['pack', 'semester-pack'],
302
- method: ['method-card', 'method-intro'],
303
- 'learning path': ['learning-path'],
302
+ 'learning path': ['learning-path-v2'],
304
303
  'jam track': jamTrackLessonTypes,
305
304
  'course video': ['course-part'],
306
305
  }
@@ -346,7 +345,7 @@ export const recentTypes = {
346
345
  ...transcriptionsLessonTypes,
347
346
  ...playAlongLessonTypes,
348
347
  'guided-course',
349
- 'learning-path',
348
+ 'learning-path-v2',
350
349
  'live',
351
350
  'course',
352
351
  'pack',
@@ -460,28 +459,9 @@ export let contentTypeConfig = {
460
459
  )`,
461
460
  ],
462
461
  },
463
- method: {
464
- fields: [
465
- `"description": ${descriptionField}`,
466
- 'hide_from_recsys',
467
- '"image": thumbnail.asset->url',
468
- '"instructors":instructor[]->name',
469
- '"lesson_count": child_count',
470
- 'length_in_seconds',
471
- 'permission',
472
- 'popularity',
473
- 'published_on',
474
- 'railcontent_id',
475
- '"thumbnail_logo": logo_image_url.asset->url',
476
- 'title',
477
- 'total_xp',
478
- '"type": _type',
479
- 'xp',
480
- ],
481
- },
482
462
  'learning-path-v2': {
483
463
  fields: [
484
- `"intro_video": intro_video->{ ${getIntroVideoFields('learning-path').join(', ')} }`,
464
+ `"intro_video": intro_video->{ ${getIntroVideoFields('learning-path-v2').join(', ')} }`,
485
465
  'total_skills',
486
466
  `"resource": ${resourcesField}`,
487
467
  `"badge": *[
@@ -491,40 +471,6 @@ export let contentTypeConfig = {
491
471
  ],
492
472
  includeChildFields: true,
493
473
  },
494
- 'learning-path-course': {
495
- fields: [
496
- '"lesson_count": child_count',
497
- '"instructors": instructor[]->name',
498
- `"description": ${descriptionField}`,
499
- `"resource": ${resourcesField}`,
500
- 'xp',
501
- 'total_xp',
502
- `"lessons": child[]->{
503
- "id": railcontent_id,
504
- title,
505
- "image": thumbnail.asset->url,
506
- "instructors": instructor[]->name,
507
- length_in_seconds,
508
- }`,
509
- ],
510
- },
511
- 'learning-path-level': {
512
- fields: [
513
- '"lesson_count": child_count',
514
- '"instructors": instructor[]->name',
515
- `"description": ${descriptionField}`,
516
- `"resource": ${resourcesField}`,
517
- 'xp',
518
- 'total_xp',
519
- `"lessons": child[]->{
520
- "id": railcontent_id,
521
- title,
522
- "image": thumbnail.asset->url,
523
- "instructors": instructor[]->name,
524
- length_in_seconds,
525
- }`,
526
- ],
527
- },
528
474
  workout: {
529
475
  fields: [artistOrInstructorNameAsArray()],
530
476
  slug: 'workouts',
@@ -680,7 +626,7 @@ export let contentTypeConfig = {
680
626
  `"type":_type`,
681
627
  'title',
682
628
  'brand',
683
- `"intro_video": intro_video->{ ${getIntroVideoFields('method').join(', ')} }`,
629
+ `"intro_video": intro_video->{ ${getIntroVideoFields('method-v2').join(', ')} }`,
684
630
  `child[]->{
685
631
  "resource": ${resourcesField},
686
632
  total_skills,
@@ -705,6 +651,9 @@ export function getIntroVideoFields(type) {
705
651
  `"id": railcontent_id`,
706
652
  'title',
707
653
  'brand',
654
+ `"instructor": *[_type == "method-v2" && brand == ^.brand && references(^._id)][0].${instructorField}`,
655
+ `"difficulty": *[_type == "method-v2" && brand == ^.brand && references(^._id)][0].difficulty`,
656
+ `"difficulty_string": *[_type == "method-v2" && brand == ^.brand][0].difficulty_string`,
708
657
  `"type": _type`,
709
658
  'brand',
710
659
  `"description": ${descriptionField}`,
@@ -712,9 +661,9 @@ export function getIntroVideoFields(type) {
712
661
  'length_in_seconds',
713
662
  ]
714
663
 
715
- if (type === 'method') {
664
+ if (type === 'method-v2') {
716
665
  fields.push(...['video_desktop', 'video_mobile'])
717
- } else if (type === 'learning-path') {
666
+ } else if (type === 'learning-path-v2') {
718
667
  fields.push('video')
719
668
  }
720
669
 
@@ -737,7 +686,6 @@ export function getNewReleasesTypes(brand) {
737
686
  'podcasts',
738
687
  'pack',
739
688
  'song',
740
- 'learning-path-level',
741
689
  'play-along',
742
690
  'course',
743
691
  'unit',
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
@@ -198,6 +198,7 @@ export async function fetchLearningPathLessons(
198
198
  upcoming_lessons: upcomingLessons,
199
199
  todays_lessons: todaysLessons,
200
200
  next_learning_path_lessons: nextLPLessons,
201
+ next_learning_path_id: nextLearningPathId,
201
202
  completed_lessons: completedLessons,
202
203
  previous_learning_path_todays: previousLearningPathTodays,
203
204
  }
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
@@ -16,19 +16,20 @@ import { getProgressState } from '../contentProgress'
16
16
 
17
17
  export async function getMethodCard(brand) {
18
18
  const introVideo = await fetchMethodV2IntroVideo(brand)
19
- const introVideoProgressState = await getProgressState(introVideo.id)
19
+ const introVideoProgressState = await getProgressState(introVideo?.id)
20
20
  //resetAllLearningPaths()
21
21
  if (introVideoProgressState != 'completed') {
22
22
  //startLearningPath('drumeo', 422533)
23
23
  const timestamp = Math.floor(Date.now() / 1000)
24
24
  return {
25
- id: 0, // method card has no id
25
+ id: 1, // method card has no id
26
26
  type: 'method',
27
27
  header: 'Method',
28
+ progressType: 'method',
28
29
  body: {
29
30
  thumbnail: introVideo.thumbnail,
30
31
  title: introVideo.title,
31
- subtitle: `${introVideo.difficulty_string} • ${introVideo.artist_name}`,
32
+ subtitle: `${introVideo.difficulty_string} • ${introVideo.instructor?.[0]?.name}`,
32
33
  },
33
34
  cta: {
34
35
  text: 'Get Started',
@@ -85,9 +86,9 @@ export async function getMethodCard(brand) {
85
86
  }
86
87
 
87
88
  return {
88
- id: 0,
89
+ id: 1,
89
90
  type: 'learning-path-v2',
90
- progressType: 'content',
91
+ progressType: 'method',
91
92
  header: 'Method',
92
93
  body: learningPath,
93
94
  cta: {
File without changes
File without changes
@@ -878,6 +878,7 @@ export async function fetchAllFilterOptions(
878
878
  return includeTabs ? { ...results, tabs, catalogName } : results
879
879
  }
880
880
 
881
+ //Daniel Nov 14 2025 note - keeping this for when we migrate foundations to packs, so we know what fields to use.
881
882
  /**
882
883
  * Fetch the Foundations 2019.
883
884
  * @param {string} slug - The slug of the method.
@@ -2299,7 +2300,7 @@ export async function fetchShows(brand, type, sort = 'sort') {
2299
2300
  export async function fetchMethodV2IntroVideo(brand) {
2300
2301
  const type = "method-intro";
2301
2302
  const filter = `_type == '${type}' && brand == '${brand}'`;
2302
- const fields = getIntroVideoFields('method');
2303
+ const fields = getIntroVideoFields('method-v2');
2303
2304
 
2304
2305
  const query = `*[${filter}] { ${fields.join(", ")} }`;
2305
2306
  return fetchSanity(query, false);
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
package/.yarnrc.yml DELETED
@@ -1 +0,0 @@
1
- nodeLinker: node-modules