unified-video-framework 1.4.413 → 1.4.415

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 (107) hide show
  1. package/package.json +6 -1
  2. package/packages/core/src/BasePlayer.d.ts +61 -0
  3. package/packages/core/src/BasePlayer.d.ts.map +1 -0
  4. package/packages/core/src/BasePlayer.js +175 -0
  5. package/packages/core/src/BasePlayer.js.map +1 -0
  6. package/packages/core/src/VideoPlayerFactory.d.ts +8 -0
  7. package/packages/core/src/VideoPlayerFactory.d.ts.map +1 -0
  8. package/packages/core/src/VideoPlayerFactory.js +95 -0
  9. package/packages/core/src/VideoPlayerFactory.js.map +1 -0
  10. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.d.ts +18 -0
  11. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.d.ts.map +1 -0
  12. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.js +117 -0
  13. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.js.map +1 -0
  14. package/packages/core/src/analytics/core/AnalyticsProvider.d.ts +18 -0
  15. package/packages/core/src/analytics/core/AnalyticsProvider.d.ts.map +1 -0
  16. package/packages/core/src/analytics/core/AnalyticsProvider.js +99 -0
  17. package/packages/core/src/analytics/core/AnalyticsProvider.js.map +1 -0
  18. package/packages/core/src/analytics/core/DynamicAnalyticsManager.d.ts +20 -0
  19. package/packages/core/src/analytics/core/DynamicAnalyticsManager.d.ts.map +1 -0
  20. package/packages/core/src/analytics/core/DynamicAnalyticsManager.js +161 -0
  21. package/packages/core/src/analytics/core/DynamicAnalyticsManager.js.map +1 -0
  22. package/packages/core/src/analytics/core/EventBatcher.d.ts +32 -0
  23. package/packages/core/src/analytics/core/EventBatcher.d.ts.map +1 -0
  24. package/packages/core/src/analytics/core/EventBatcher.js +98 -0
  25. package/packages/core/src/analytics/core/EventBatcher.js.map +1 -0
  26. package/packages/core/src/analytics/core/PlayerAnalytics.d.ts +19 -0
  27. package/packages/core/src/analytics/core/PlayerAnalytics.d.ts.map +1 -0
  28. package/packages/core/src/analytics/core/PlayerAnalytics.js +80 -0
  29. package/packages/core/src/analytics/core/PlayerAnalytics.js.map +1 -0
  30. package/packages/core/src/analytics/index.d.ts +13 -0
  31. package/packages/core/src/analytics/index.d.ts.map +1 -0
  32. package/packages/core/src/analytics/index.js +13 -0
  33. package/packages/core/src/analytics/index.js.map +1 -0
  34. package/packages/core/src/analytics/types/AnalyticsTypes.d.ts +239 -0
  35. package/packages/core/src/analytics/types/AnalyticsTypes.d.ts.map +1 -0
  36. package/packages/core/src/analytics/types/AnalyticsTypes.js +8 -0
  37. package/packages/core/src/analytics/types/AnalyticsTypes.js.map +1 -0
  38. package/packages/core/src/analytics/utils/DeviceDetection.d.ts +27 -0
  39. package/packages/core/src/analytics/utils/DeviceDetection.d.ts.map +1 -0
  40. package/packages/core/src/analytics/utils/DeviceDetection.js +184 -0
  41. package/packages/core/src/analytics/utils/DeviceDetection.js.map +1 -0
  42. package/packages/core/src/chapter-manager.d.ts +39 -0
  43. package/packages/core/src/chapter-manager.d.ts.map +1 -0
  44. package/packages/core/src/chapter-manager.js +173 -0
  45. package/packages/core/src/chapter-manager.js.map +1 -0
  46. package/packages/core/src/index.d.ts +10 -0
  47. package/packages/core/src/index.d.ts.map +1 -0
  48. package/packages/core/src/index.js +8 -0
  49. package/packages/core/src/index.js.map +1 -0
  50. package/packages/core/src/interfaces/IVideoPlayer.d.ts +229 -0
  51. package/packages/core/src/interfaces/IVideoPlayer.d.ts.map +1 -0
  52. package/packages/core/src/interfaces/IVideoPlayer.js +2 -0
  53. package/packages/core/src/interfaces/IVideoPlayer.js.map +1 -0
  54. package/packages/core/src/interfaces.d.ts +455 -0
  55. package/packages/core/src/interfaces.d.ts.map +1 -0
  56. package/packages/core/src/interfaces.js +32 -0
  57. package/packages/core/src/interfaces.js.map +1 -0
  58. package/packages/core/src/utils/EventEmitter.d.ts +14 -0
  59. package/packages/core/src/utils/EventEmitter.d.ts.map +1 -0
  60. package/packages/core/src/utils/EventEmitter.js +55 -0
  61. package/packages/core/src/utils/EventEmitter.js.map +1 -0
  62. package/packages/web/dist/drm/DRMManager.d.ts +1 -1
  63. package/packages/web/dist/drm/DRMManager.d.ts.map +1 -1
  64. package/packages/web/dist/drm/DRMManager.js +7 -7
  65. package/packages/web/dist/drm/DRMManager.js.map +1 -1
  66. package/packages/web/dist/drm/providers/BunnyNetProvider.d.ts +1 -1
  67. package/packages/web/dist/drm/providers/BunnyNetProvider.d.ts.map +1 -1
  68. package/packages/web/dist/drm/providers/BunnyNetProvider.js +13 -13
  69. package/packages/web/dist/drm/providers/BunnyNetProvider.js.map +1 -1
  70. package/packages/web/dist/drm/providers/GenericProvider.d.ts +1 -1
  71. package/packages/web/dist/drm/providers/GenericProvider.d.ts.map +1 -1
  72. package/packages/web/dist/drm/providers/GenericProvider.js +8 -6
  73. package/packages/web/dist/drm/providers/GenericProvider.js.map +1 -1
  74. package/packages/web/dist/drm/systems/FairPlayDRM.d.ts.map +1 -1
  75. package/packages/web/dist/drm/systems/FairPlayDRM.js +2 -2
  76. package/packages/web/dist/drm/systems/FairPlayDRM.js.map +1 -1
  77. package/packages/web/dist/drm/systems/PlayReadyDRM.d.ts.map +1 -1
  78. package/packages/web/dist/drm/systems/PlayReadyDRM.js +7 -7
  79. package/packages/web/dist/drm/systems/PlayReadyDRM.js.map +1 -1
  80. package/packages/web/dist/drm/systems/WidevineDRM.d.ts.map +1 -1
  81. package/packages/web/dist/drm/systems/WidevineDRM.js +2 -2
  82. package/packages/web/dist/drm/systems/WidevineDRM.js.map +1 -1
  83. package/packages/web/dist/drm/types/BunnyNetTypes.d.ts +1 -1
  84. package/packages/web/dist/drm/types/BunnyNetTypes.d.ts.map +1 -1
  85. package/packages/web/dist/drm/types/DRMTypes.d.ts +1 -1
  86. package/packages/web/dist/drm/types/DRMTypes.d.ts.map +1 -1
  87. package/packages/web/dist/drm/types/DRMTypes.js +5 -5
  88. package/packages/web/dist/drm/types/DRMTypes.js.map +1 -1
  89. package/packages/web/dist/drm/utils/BrowserDetector.d.ts +1 -1
  90. package/packages/web/dist/drm/utils/BrowserDetector.d.ts.map +1 -1
  91. package/packages/web/dist/drm/utils/BrowserDetector.js +10 -10
  92. package/packages/web/dist/drm/utils/BrowserDetector.js.map +1 -1
  93. package/packages/web/src/drm/DRMManager.ts +214 -213
  94. package/packages/web/src/drm/index.ts +37 -37
  95. package/packages/web/src/drm/providers/BunnyNetProvider.ts +171 -170
  96. package/packages/web/src/drm/providers/GenericProvider.ts +151 -148
  97. package/packages/web/src/drm/systems/BaseDRM.ts +68 -68
  98. package/packages/web/src/drm/systems/FairPlayDRM.ts +306 -305
  99. package/packages/web/src/drm/systems/PlayReadyDRM.ts +132 -131
  100. package/packages/web/src/drm/systems/WidevineDRM.ts +106 -105
  101. package/packages/web/src/drm/types/BunnyNetTypes.ts +35 -35
  102. package/packages/web/src/drm/types/DRMTypes.ts +92 -91
  103. package/packages/web/src/drm/utils/BrowserDetector.ts +233 -232
  104. package/packages/web/src/drm/utils/CertificateManager.ts +86 -86
  105. package/packages/web/src/drm/utils/DRMErrorHandler.ts +84 -84
  106. package/packages/web/src/drm/utils/LicenseRequestHandler.ts +180 -180
  107. package/scripts/fix-imports.js +54 -8
@@ -1,180 +1,180 @@
1
- /**
2
- * License Request Handler
3
- * Centralized HTTP request handling for license servers with retry logic
4
- */
5
-
6
- import { ExtendedDRMConfig, LicenseRequest, LicenseResponse, DRMErrorCode } from '../types/DRMTypes';
7
-
8
- export class LicenseRequestHandler {
9
- private config: ExtendedDRMConfig;
10
- private debug: boolean;
11
-
12
- constructor(config: ExtendedDRMConfig, debug: boolean = false) {
13
- this.config = config;
14
- this.debug = debug;
15
- }
16
-
17
- /**
18
- * Request license from server with retry logic
19
- */
20
- async requestLicense(request: LicenseRequest): Promise<LicenseResponse> {
21
- const maxRetries = this.config.retryConfig?.maxRetries || 3;
22
- const retryDelay = this.config.retryConfig?.retryDelay || 1000;
23
-
24
- let lastError: any;
25
-
26
- for (let attempt = 0; attempt <= maxRetries; attempt++) {
27
- try {
28
- if (attempt > 0) {
29
- this.log(`Retry attempt ${attempt}/${maxRetries}`);
30
- await this.delay(retryDelay * attempt); // Exponential backoff
31
- }
32
-
33
- const response = await this.makeRequest(request);
34
- return response;
35
- } catch (error: any) {
36
- lastError = error;
37
- this.log(`License request failed (attempt ${attempt + 1}/${maxRetries + 1}):`, error);
38
-
39
- // Don't retry on certain errors
40
- if (this.isFatalError(error)) {
41
- throw error;
42
- }
43
- }
44
- }
45
-
46
- // All retries exhausted
47
- throw this.createError(
48
- DRMErrorCode.LICENSE_REQUEST_FAILED,
49
- `Failed to request license after ${maxRetries + 1} attempts`,
50
- lastError
51
- );
52
- }
53
-
54
- /**
55
- * Make HTTP request to license server
56
- */
57
- private async makeRequest(request: LicenseRequest): Promise<LicenseResponse> {
58
- this.log('Requesting license from:', request.url);
59
-
60
- try {
61
- const response = await fetch(request.url, {
62
- method: request.method,
63
- headers: request.headers,
64
- body: request.body,
65
- });
66
-
67
- if (!response.ok) {
68
- throw this.createError(
69
- DRMErrorCode.LICENSE_REQUEST_FAILED,
70
- `License server returned ${response.status}: ${response.statusText}`,
71
- { status: response.status, statusText: response.statusText }
72
- );
73
- }
74
-
75
- // Parse response based on type
76
- let license: ArrayBuffer;
77
-
78
- if (request.responseType === 'arraybuffer') {
79
- license = await response.arrayBuffer();
80
- } else if (request.responseType === 'text') {
81
- const text = await response.text();
82
- license = this.textToArrayBuffer(text);
83
- } else if (request.responseType === 'json') {
84
- const json = await response.json();
85
- // Assume license is in a 'license' field or is base64-encoded
86
- if (json.license) {
87
- license = this.base64ToArrayBuffer(json.license);
88
- } else {
89
- throw this.createError(
90
- DRMErrorCode.LICENSE_INVALID,
91
- 'License response does not contain license field',
92
- json
93
- );
94
- }
95
- } else {
96
- license = await response.arrayBuffer();
97
- }
98
-
99
- this.log('License received, size:', license.byteLength, 'bytes');
100
-
101
- return {
102
- license,
103
- metadata: response.headers,
104
- };
105
- } catch (error: any) {
106
- if (error.code && error.code.startsWith('DRM_')) {
107
- throw error;
108
- }
109
-
110
- throw this.createError(
111
- DRMErrorCode.NETWORK_ERROR,
112
- `Network error requesting license: ${error.message}`,
113
- error
114
- );
115
- }
116
- }
117
-
118
- /**
119
- * Check if error is fatal (should not retry)
120
- */
121
- private isFatalError(error: any): boolean {
122
- // Don't retry authentication errors (401, 403)
123
- if (error.details?.status === 401 || error.details?.status === 403) {
124
- return true;
125
- }
126
-
127
- // Don't retry invalid license errors
128
- if (error.code === DRMErrorCode.LICENSE_INVALID) {
129
- return true;
130
- }
131
-
132
- return false;
133
- }
134
-
135
- /**
136
- * Convert text to ArrayBuffer
137
- */
138
- private textToArrayBuffer(text: string): ArrayBuffer {
139
- const encoder = new TextEncoder();
140
- return encoder.encode(text).buffer;
141
- }
142
-
143
- /**
144
- * Convert base64 string to ArrayBuffer
145
- */
146
- private base64ToArrayBuffer(base64: string): ArrayBuffer {
147
- const binaryString = atob(base64);
148
- const bytes = new Uint8Array(binaryString.length);
149
- for (let i = 0; i < binaryString.length; i++) {
150
- bytes[i] = binaryString.charCodeAt(i);
151
- }
152
- return bytes.buffer;
153
- }
154
-
155
- /**
156
- * Delay helper for retry logic
157
- */
158
- private delay(ms: number): Promise<void> {
159
- return new Promise(resolve => setTimeout(resolve, ms));
160
- }
161
-
162
- /**
163
- * Create standardized DRM error
164
- */
165
- private createError(code: DRMErrorCode, message: string, details?: any): any {
166
- const error = new Error(message);
167
- (error as any).code = code;
168
- (error as any).details = details;
169
- return error;
170
- }
171
-
172
- /**
173
- * Debug logging
174
- */
175
- private log(...args: any[]): void {
176
- if (this.debug) {
177
- console.log('[LicenseRequestHandler]', ...args);
178
- }
179
- }
180
- }
1
+ /**
2
+ * License Request Handler
3
+ * Centralized HTTP request handling for license servers with retry logic
4
+ */
5
+
6
+ import { ExtendedDRMConfig, LicenseRequest, LicenseResponse, DRMErrorCode } from '../types/DRMTypes';
7
+
8
+ export class LicenseRequestHandler {
9
+ private config: ExtendedDRMConfig;
10
+ private debug: boolean;
11
+
12
+ constructor(config: ExtendedDRMConfig, debug: boolean = false) {
13
+ this.config = config;
14
+ this.debug = debug;
15
+ }
16
+
17
+ /**
18
+ * Request license from server with retry logic
19
+ */
20
+ async requestLicense(request: LicenseRequest): Promise<LicenseResponse> {
21
+ const maxRetries = this.config.retryConfig?.maxRetries || 3;
22
+ const retryDelay = this.config.retryConfig?.retryDelay || 1000;
23
+
24
+ let lastError: any;
25
+
26
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
27
+ try {
28
+ if (attempt > 0) {
29
+ this.log(`Retry attempt ${attempt}/${maxRetries}`);
30
+ await this.delay(retryDelay * attempt); // Exponential backoff
31
+ }
32
+
33
+ const response = await this.makeRequest(request);
34
+ return response;
35
+ } catch (error: any) {
36
+ lastError = error;
37
+ this.log(`License request failed (attempt ${attempt + 1}/${maxRetries + 1}):`, error);
38
+
39
+ // Don't retry on certain errors
40
+ if (this.isFatalError(error)) {
41
+ throw error;
42
+ }
43
+ }
44
+ }
45
+
46
+ // All retries exhausted
47
+ throw this.createError(
48
+ DRMErrorCode.LICENSE_REQUEST_FAILED,
49
+ `Failed to request license after ${maxRetries + 1} attempts`,
50
+ lastError
51
+ );
52
+ }
53
+
54
+ /**
55
+ * Make HTTP request to license server
56
+ */
57
+ private async makeRequest(request: LicenseRequest): Promise<LicenseResponse> {
58
+ this.log('Requesting license from:', request.url);
59
+
60
+ try {
61
+ const response = await fetch(request.url, {
62
+ method: request.method,
63
+ headers: request.headers,
64
+ body: request.body,
65
+ });
66
+
67
+ if (!response.ok) {
68
+ throw this.createError(
69
+ DRMErrorCode.LICENSE_REQUEST_FAILED,
70
+ `License server returned ${response.status}: ${response.statusText}`,
71
+ { status: response.status, statusText: response.statusText }
72
+ );
73
+ }
74
+
75
+ // Parse response based on type
76
+ let license: ArrayBuffer;
77
+
78
+ if (request.responseType === 'arraybuffer') {
79
+ license = await response.arrayBuffer();
80
+ } else if (request.responseType === 'text') {
81
+ const text = await response.text();
82
+ license = this.textToArrayBuffer(text);
83
+ } else if (request.responseType === 'json') {
84
+ const json = await response.json();
85
+ // Assume license is in a 'license' field or is base64-encoded
86
+ if (json.license) {
87
+ license = this.base64ToArrayBuffer(json.license);
88
+ } else {
89
+ throw this.createError(
90
+ DRMErrorCode.LICENSE_INVALID,
91
+ 'License response does not contain license field',
92
+ json
93
+ );
94
+ }
95
+ } else {
96
+ license = await response.arrayBuffer();
97
+ }
98
+
99
+ this.log('License received, size:', license.byteLength, 'bytes');
100
+
101
+ return {
102
+ license,
103
+ metadata: response.headers,
104
+ };
105
+ } catch (error: any) {
106
+ if (error.code && error.code.startsWith('DRM_')) {
107
+ throw error;
108
+ }
109
+
110
+ throw this.createError(
111
+ DRMErrorCode.NETWORK_ERROR,
112
+ `Network error requesting license: ${error.message}`,
113
+ error
114
+ );
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Check if error is fatal (should not retry)
120
+ */
121
+ private isFatalError(error: any): boolean {
122
+ // Don't retry authentication errors (401, 403)
123
+ if (error.details?.status === 401 || error.details?.status === 403) {
124
+ return true;
125
+ }
126
+
127
+ // Don't retry invalid license errors
128
+ if (error.code === DRMErrorCode.LICENSE_INVALID) {
129
+ return true;
130
+ }
131
+
132
+ return false;
133
+ }
134
+
135
+ /**
136
+ * Convert text to ArrayBuffer
137
+ */
138
+ private textToArrayBuffer(text: string): ArrayBuffer {
139
+ const encoder = new TextEncoder();
140
+ return encoder.encode(text).buffer;
141
+ }
142
+
143
+ /**
144
+ * Convert base64 string to ArrayBuffer
145
+ */
146
+ private base64ToArrayBuffer(base64: string): ArrayBuffer {
147
+ const binaryString = atob(base64);
148
+ const bytes = new Uint8Array(binaryString.length);
149
+ for (let i = 0; i < binaryString.length; i++) {
150
+ bytes[i] = binaryString.charCodeAt(i);
151
+ }
152
+ return bytes.buffer;
153
+ }
154
+
155
+ /**
156
+ * Delay helper for retry logic
157
+ */
158
+ private delay(ms: number): Promise<void> {
159
+ return new Promise(resolve => setTimeout(resolve, ms));
160
+ }
161
+
162
+ /**
163
+ * Create standardized DRM error
164
+ */
165
+ private createError(code: DRMErrorCode, message: string, details?: any): any {
166
+ const error = new Error(message);
167
+ (error as any).code = code;
168
+ (error as any).details = details;
169
+ return error;
170
+ }
171
+
172
+ /**
173
+ * Debug logging
174
+ */
175
+ private log(...args: any[]): void {
176
+ if (this.debug) {
177
+ console.log('[LicenseRequestHandler]', ...args);
178
+ }
179
+ }
180
+ }
@@ -10,24 +10,61 @@ const path = require('path');
10
10
 
11
11
  function fixImports(filePath) {
12
12
  let content = fs.readFileSync(filePath, 'utf8');
13
-
13
+
14
14
  // Replace @unified-video/core imports with relative paths
15
15
  if (filePath.includes(path.join('packages', 'web', 'dist'))) {
16
+ // Calculate the correct relative path depth based on file location
17
+ const distPath = path.join('packages', 'web', 'dist');
18
+ const distIndex = filePath.indexOf(distPath);
19
+ const relativePath = filePath.substring(distIndex + distPath.length + 1);
20
+ const depth = relativePath.split(path.sep).length;
21
+ const upLevels = '../'.repeat(depth + 1); // +1 to get out of web/, then to packages/
22
+ const coreImportPath = `${upLevels}core/dist/index.js`;
23
+ const coreRequirePath = `${upLevels}core/dist`;
24
+
16
25
  // Fix CommonJS require statements
17
26
  content = content.replace(
18
27
  /require\(["']@unified-video\/core["']\)/g,
19
- 'require("../../core/dist")'
28
+ `require("${coreRequirePath}")`
20
29
  );
21
30
  // Fix ES module import statements
22
31
  content = content.replace(
23
32
  /from\s+["']@unified-video\/core["']/g,
24
- 'from "../../core/dist/index.js"'
33
+ `from "${coreImportPath}"`
25
34
  );
26
35
  content = content.replace(
27
36
  /import\s+["']@unified-video\/core["']/g,
28
- 'import "../../core/dist/index.js"'
37
+ `import "${coreImportPath}"`
29
38
  );
30
-
39
+
40
+ // Fix any leftover old-style imports from core/src
41
+ content = content.replace(
42
+ /require\(['"]\.\.\/\.\.\/\.\.\/core\/src\/interfaces['"]\)/g,
43
+ `require("${coreRequirePath}")`
44
+ );
45
+ content = content.replace(
46
+ /from\s+['"]\.\.\/\.\.\/\.\.\/core\/src\/interfaces['"]/g,
47
+ `from "${coreImportPath}"`
48
+ );
49
+ content = content.replace(
50
+ /from\s+['"]\.\.\/\.\.\/core\/src\/interfaces['"]/g,
51
+ `from "${coreImportPath}"`
52
+ );
53
+
54
+ // Fix incorrect relative paths to core/dist (already converted by TypeScript)
55
+ content = content.replace(
56
+ /from\s+['"](\.\.\/)+core\/dist\/index\.js['"]/g,
57
+ `from "${coreImportPath}"`
58
+ );
59
+ content = content.replace(
60
+ /import\s+['"](\.\.\/)+core\/dist\/index\.js['"]/g,
61
+ `import "${coreImportPath}"`
62
+ );
63
+ content = content.replace(
64
+ /require\(['"](\.\.\/)+core\/dist['"]\)/g,
65
+ `require("${coreRequirePath}")`
66
+ );
67
+
31
68
  // Fix relative imports within the same package to include .js extension
32
69
  content = content.replace(
33
70
  /from\s+["']\.\/([^"']+)(?<!\.js)["']/g,
@@ -43,19 +80,28 @@ function fixImports(filePath) {
43
80
  }
44
81
  );
45
82
  } else if (filePath.includes(path.join('packages', 'react-native', 'dist'))) {
83
+ // Calculate the correct relative path depth based on file location
84
+ const distPath = path.join('packages', 'react-native', 'dist');
85
+ const distIndex = filePath.indexOf(distPath);
86
+ const relativePath = filePath.substring(distIndex + distPath.length + 1);
87
+ const depth = relativePath.split(path.sep).length;
88
+ const upLevels = '../'.repeat(depth + 1); // +1 to get out of react-native/, then to packages/
89
+ const coreImportPath = `${upLevels}core/dist/index.js`;
90
+ const coreRequirePath = `${upLevels}core/dist`;
91
+
46
92
  // Fix CommonJS require statements
47
93
  content = content.replace(
48
94
  /require\(["']@unified-video\/core["']\)/g,
49
- 'require("../../core/dist")'
95
+ `require("${coreRequirePath}")`
50
96
  );
51
97
  // Fix ES module import statements
52
98
  content = content.replace(
53
99
  /from\s+["']@unified-video\/core["']/g,
54
- 'from "../../core/dist/index.js"'
100
+ `from "${coreImportPath}"`
55
101
  );
56
102
  content = content.replace(
57
103
  /import\s+["']@unified-video\/core["']/g,
58
- 'import "../../core/dist/index.js"'
104
+ `import "${coreImportPath}"`
59
105
  );
60
106
 
61
107
  // Fix relative imports within the same package to include .js extension