native-update 1.3.0 → 1.3.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 (66) hide show
  1. package/Readme.md +5 -5
  2. package/cli/index.js +5 -6
  3. package/cli/node_modules/.yarn-integrity +16 -0
  4. package/cli/node_modules/commander/LICENSE +22 -0
  5. package/cli/node_modules/commander/Readme.md +1148 -0
  6. package/cli/node_modules/commander/esm.mjs +16 -0
  7. package/cli/node_modules/commander/index.js +26 -0
  8. package/cli/node_modules/commander/lib/argument.js +145 -0
  9. package/cli/node_modules/commander/lib/command.js +2179 -0
  10. package/cli/node_modules/commander/lib/error.js +43 -0
  11. package/cli/node_modules/commander/lib/help.js +462 -0
  12. package/cli/node_modules/commander/lib/option.js +329 -0
  13. package/cli/node_modules/commander/lib/suggestSimilar.js +100 -0
  14. package/cli/node_modules/commander/package-support.json +16 -0
  15. package/cli/node_modules/commander/package.json +80 -0
  16. package/cli/node_modules/commander/typings/esm.d.mts +3 -0
  17. package/cli/node_modules/commander/typings/index.d.ts +884 -0
  18. package/cli/yarn.lock +8 -0
  19. package/dist/esm/__tests__/delta-processor.test.d.ts +1 -0
  20. package/dist/esm/__tests__/delta-processor.test.js +77 -0
  21. package/dist/esm/__tests__/delta-processor.test.js.map +1 -0
  22. package/dist/esm/__tests__/firestore-schema.test.d.ts +1 -0
  23. package/dist/esm/__tests__/firestore-schema.test.js +74 -0
  24. package/dist/esm/__tests__/firestore-schema.test.js.map +1 -0
  25. package/dist/esm/__tests__/manifest-reader.test.d.ts +1 -0
  26. package/dist/esm/__tests__/manifest-reader.test.js +271 -0
  27. package/dist/esm/__tests__/manifest-reader.test.js.map +1 -0
  28. package/dist/esm/__tests__/rollout-checker.test.d.ts +1 -0
  29. package/dist/esm/__tests__/rollout-checker.test.js +210 -0
  30. package/dist/esm/__tests__/rollout-checker.test.js.map +1 -0
  31. package/dist/esm/core/config.d.ts +26 -0
  32. package/dist/esm/core/config.js +6 -0
  33. package/dist/esm/core/config.js.map +1 -1
  34. package/dist/esm/firestore/firestore-client.d.ts +109 -0
  35. package/dist/esm/firestore/firestore-client.js +260 -0
  36. package/dist/esm/firestore/firestore-client.js.map +1 -0
  37. package/dist/esm/firestore/index.d.ts +11 -0
  38. package/dist/esm/firestore/index.js +11 -0
  39. package/dist/esm/firestore/index.js.map +1 -0
  40. package/dist/esm/firestore/manifest-reader.d.ts +87 -0
  41. package/dist/esm/firestore/manifest-reader.js +294 -0
  42. package/dist/esm/firestore/manifest-reader.js.map +1 -0
  43. package/dist/esm/firestore/schema.d.ts +504 -0
  44. package/dist/esm/firestore/schema.js +69 -0
  45. package/dist/esm/firestore/schema.js.map +1 -0
  46. package/dist/esm/live-update/delta-processor.d.ts +94 -0
  47. package/dist/esm/live-update/delta-processor.js +212 -0
  48. package/dist/esm/live-update/delta-processor.js.map +1 -0
  49. package/dist/esm/live-update/rollout-checker.d.ts +86 -0
  50. package/dist/esm/live-update/rollout-checker.js +305 -0
  51. package/dist/esm/live-update/rollout-checker.js.map +1 -0
  52. package/dist/esm/live-update/version-manager.d.ts +12 -0
  53. package/dist/esm/live-update/version-manager.js +67 -0
  54. package/dist/esm/live-update/version-manager.js.map +1 -1
  55. package/dist/plugin.cjs.js +1 -1
  56. package/dist/plugin.cjs.js.map +1 -1
  57. package/dist/plugin.esm.js +1 -1
  58. package/dist/plugin.esm.js.map +1 -1
  59. package/dist/plugin.js +1 -1
  60. package/dist/plugin.js.map +1 -1
  61. package/docs/QUICK_START.md +3 -3
  62. package/docs/README.md +4 -4
  63. package/docs/api/API.md +4 -3
  64. package/docs/getting-started/installation.md +2 -2
  65. package/docs/play-console-rejection-rules.json +428 -0
  66. package/package.json +20 -18
package/cli/yarn.lock ADDED
@@ -0,0 +1,8 @@
1
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
+ # yarn lockfile v1
3
+
4
+
5
+ commander@^11.0.0:
6
+ version "11.1.0"
7
+ resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906"
8
+ integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,77 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { DeltaProcessor } from '../live-update/delta-processor';
3
+ import { ConfigManager } from '../core/config';
4
+ // Mock crypto.subtle
5
+ const mockDigest = vi.fn();
6
+ Object.defineProperty(global, 'crypto', {
7
+ value: {
8
+ subtle: {
9
+ digest: mockDigest,
10
+ },
11
+ },
12
+ });
13
+ describe('DeltaProcessor', () => {
14
+ let deltaProcessor;
15
+ let configManager;
16
+ beforeEach(() => {
17
+ // Reset ConfigManager singleton
18
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
+ ConfigManager['instance'] = undefined;
20
+ configManager = ConfigManager.getInstance();
21
+ configManager.configure({ enableDeltaUpdates: true });
22
+ deltaProcessor = new DeltaProcessor();
23
+ // Reset mocks
24
+ mockDigest.mockReset();
25
+ });
26
+ describe('downloadWithDelta', () => {
27
+ it('should throw error when no bundle URL provided', async () => {
28
+ const updateInfo = {
29
+ updateAvailable: true,
30
+ version: '1.1.0',
31
+ size: 1000,
32
+ };
33
+ await expect(deltaProcessor.downloadWithDelta(updateInfo, null)).rejects.toThrow('No bundle URL provided');
34
+ });
35
+ });
36
+ describe('calculateChecksum', () => {
37
+ it('should calculate SHA-256 checksum', async () => {
38
+ const data = new ArrayBuffer(100);
39
+ const expectedHash = new Uint8Array([0xab, 0xcd, 0xef, 0x12]);
40
+ mockDigest.mockResolvedValue(expectedHash.buffer);
41
+ const checksum = await deltaProcessor.calculateChecksum(data);
42
+ expect(mockDigest).toHaveBeenCalledWith('SHA-256', data);
43
+ expect(checksum).toBe('abcdef12');
44
+ });
45
+ });
46
+ describe('verifyChecksum', () => {
47
+ it('should return true for matching checksums', async () => {
48
+ const data = new ArrayBuffer(100);
49
+ mockDigest.mockResolvedValue(new Uint8Array([0xab, 0xcd, 0xef, 0x12]).buffer);
50
+ const result = await deltaProcessor.verifyChecksum(data, 'abcdef12');
51
+ expect(result).toBe(true);
52
+ });
53
+ it('should return true for case-insensitive match', async () => {
54
+ const data = new ArrayBuffer(100);
55
+ mockDigest.mockResolvedValue(new Uint8Array([0xab, 0xcd, 0xef, 0x12]).buffer);
56
+ const result = await deltaProcessor.verifyChecksum(data, 'ABCDEF12');
57
+ expect(result).toBe(true);
58
+ });
59
+ it('should return false for non-matching checksums', async () => {
60
+ const data = new ArrayBuffer(100);
61
+ mockDigest.mockResolvedValue(new Uint8Array([0xab, 0xcd, 0xef, 0x12]).buffer);
62
+ const result = await deltaProcessor.verifyChecksum(data, 'different');
63
+ expect(result).toBe(false);
64
+ });
65
+ });
66
+ describe('isDeltaEnabled', () => {
67
+ it('should return config value', () => {
68
+ configManager.configure({ enableDeltaUpdates: true });
69
+ deltaProcessor = new DeltaProcessor();
70
+ expect(deltaProcessor.isDeltaEnabled()).toBe(true);
71
+ configManager.configure({ enableDeltaUpdates: false });
72
+ deltaProcessor = new DeltaProcessor();
73
+ expect(deltaProcessor.isDeltaEnabled()).toBe(false);
74
+ });
75
+ });
76
+ });
77
+ //# sourceMappingURL=delta-processor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta-processor.test.js","sourceRoot":"","sources":["../../../src/__tests__/delta-processor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,74 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { timestampToDate, dateToTimestamp, getManifestId, getDeltaId, } from '../firestore/schema';
3
+ describe('Firestore Schema', () => {
4
+ describe('timestampToDate', () => {
5
+ it('should convert Firestore timestamp to Date', () => {
6
+ const timestamp = {
7
+ seconds: 1704067200, // 2024-01-01 00:00:00 UTC
8
+ nanoseconds: 500000000,
9
+ };
10
+ const date = timestampToDate(timestamp);
11
+ expect(date).toBeInstanceOf(Date);
12
+ expect(date.getTime()).toBe(1704067200500);
13
+ });
14
+ it('should handle zero nanoseconds', () => {
15
+ const timestamp = {
16
+ seconds: 1704067200,
17
+ nanoseconds: 0,
18
+ };
19
+ const date = timestampToDate(timestamp);
20
+ expect(date.getTime()).toBe(1704067200000);
21
+ });
22
+ it('should handle maximum nanoseconds', () => {
23
+ const timestamp = {
24
+ seconds: 1704067200,
25
+ nanoseconds: 999999999,
26
+ };
27
+ const date = timestampToDate(timestamp);
28
+ // nanoseconds: 999999999 / 1000000 = 999.999999 ms
29
+ // So total should be 1704067200000 + 999.999999 ≈ 1704067200999
30
+ expect(date.getTime()).toBeGreaterThanOrEqual(1704067200999);
31
+ expect(date.getTime()).toBeLessThan(1704067201000);
32
+ });
33
+ });
34
+ describe('dateToTimestamp', () => {
35
+ it('should convert Date to Firestore timestamp', () => {
36
+ const date = new Date(1704067200500); // 2024-01-01 with 500ms
37
+ const timestamp = dateToTimestamp(date);
38
+ expect(timestamp.seconds).toBe(1704067200);
39
+ expect(timestamp.nanoseconds).toBe(500000000);
40
+ });
41
+ it('should handle exact seconds', () => {
42
+ const date = new Date(1704067200000);
43
+ const timestamp = dateToTimestamp(date);
44
+ expect(timestamp.seconds).toBe(1704067200);
45
+ expect(timestamp.nanoseconds).toBe(0);
46
+ });
47
+ it('should be reversible', () => {
48
+ const originalDate = new Date();
49
+ const timestamp = dateToTimestamp(originalDate);
50
+ const convertedDate = timestampToDate(timestamp);
51
+ // Allow 1ms difference due to nanosecond precision
52
+ expect(Math.abs(convertedDate.getTime() - originalDate.getTime())).toBeLessThan(1);
53
+ });
54
+ });
55
+ describe('getManifestId', () => {
56
+ it('should generate correct manifest ID', () => {
57
+ expect(getManifestId('com.example.app', 'production')).toBe('com.example.app_production');
58
+ expect(getManifestId('com.example.app', 'staging')).toBe('com.example.app_staging');
59
+ expect(getManifestId('com.example.app', 'development')).toBe('com.example.app_development');
60
+ });
61
+ it('should handle special characters in appId', () => {
62
+ expect(getManifestId('com.example-app.test', 'production')).toBe('com.example-app.test_production');
63
+ });
64
+ });
65
+ describe('getDeltaId', () => {
66
+ it('should generate correct delta ID', () => {
67
+ expect(getDeltaId('com.example.app', '1.0.0', '1.1.0')).toBe('com.example.app_1.0.0_1.1.0');
68
+ });
69
+ it('should handle pre-release versions', () => {
70
+ expect(getDeltaId('com.example.app', '1.0.0-beta', '1.0.0')).toBe('com.example.app_1.0.0-beta_1.0.0');
71
+ });
72
+ });
73
+ });
74
+ //# sourceMappingURL=firestore-schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firestore-schema.test.js","sourceRoot":"","sources":["../../../src/__tests__/firestore-schema.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,271 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { ManifestReader } from '../firestore/manifest-reader';
3
+ // Mock crypto.subtle
4
+ const mockDigest = vi.fn();
5
+ Object.defineProperty(global, 'crypto', {
6
+ value: {
7
+ subtle: {
8
+ digest: mockDigest,
9
+ },
10
+ },
11
+ });
12
+ // Mock FirestoreClient
13
+ vi.mock('../firestore/firestore-client', () => ({
14
+ FirestoreClient: vi.fn().mockImplementation(() => ({
15
+ getManifest: vi.fn(),
16
+ getManifestFor: vi.fn(),
17
+ clearCache: vi.fn(),
18
+ })),
19
+ }));
20
+ describe('ManifestReader', () => {
21
+ let manifestReader;
22
+ let mockFirestoreClient;
23
+ const createTimestamp = (date) => ({
24
+ seconds: Math.floor(date.getTime() / 1000),
25
+ nanoseconds: 0,
26
+ });
27
+ const mockDeviceInfo = {
28
+ deviceId: 'device-123',
29
+ platform: 'ios',
30
+ appVersion: '1.5.0',
31
+ bundleVersion: '1.0.0',
32
+ osVersion: '17.0',
33
+ locale: 'en-US',
34
+ };
35
+ const mockManifest = {
36
+ appId: 'com.example.app',
37
+ channel: 'production',
38
+ current: {
39
+ version: '2.0.0',
40
+ bundleId: 'build-123',
41
+ bundleUrl: 'https://example.com/bundle.zip',
42
+ manifestUrl: 'https://example.com/manifest.json',
43
+ checksum: 'abc123',
44
+ size: 1000000,
45
+ releaseNotes: 'New features',
46
+ releaseDate: createTimestamp(new Date()),
47
+ mandatory: false,
48
+ minNativeVersion: '1.0.0',
49
+ },
50
+ deltas: {
51
+ '1.5.0': {
52
+ patchUrl: 'https://example.com/patch-1.5.0.bin',
53
+ patchSize: 50000,
54
+ patchChecksum: 'patch123',
55
+ targetChecksum: 'abc123',
56
+ },
57
+ },
58
+ rollout: {
59
+ enabled: false,
60
+ percentage: 100,
61
+ startTime: createTimestamp(new Date(Date.now() - 86400000)),
62
+ endTime: null,
63
+ },
64
+ previousVersions: [],
65
+ updatedAt: createTimestamp(new Date()),
66
+ updatedBy: 'user-123',
67
+ };
68
+ beforeEach(() => {
69
+ mockFirestoreClient = {
70
+ getManifest: vi.fn(),
71
+ getManifestFor: vi.fn(),
72
+ clearCache: vi.fn(),
73
+ };
74
+ manifestReader = new ManifestReader(mockFirestoreClient);
75
+ // Mock crypto for device percentile calculation
76
+ mockDigest.mockResolvedValue(new Uint8Array([0x10, 0x00, 0x00, 0x00]).buffer); // ~6% percentile
77
+ });
78
+ describe('checkForUpdates', () => {
79
+ it('should return updateAvailable: false when no manifest found', async () => {
80
+ mockFirestoreClient.getManifest.mockResolvedValue(null);
81
+ const result = await manifestReader.checkForUpdates({
82
+ currentVersion: '1.0.0',
83
+ deviceInfo: mockDeviceInfo,
84
+ });
85
+ expect(result.updateAvailable).toBe(false);
86
+ });
87
+ it('should return updateAvailable: false when current version is latest', async () => {
88
+ mockFirestoreClient.getManifest.mockResolvedValue(mockManifest);
89
+ const result = await manifestReader.checkForUpdates({
90
+ currentVersion: '2.0.0',
91
+ deviceInfo: mockDeviceInfo,
92
+ });
93
+ expect(result.updateAvailable).toBe(false);
94
+ expect(result.version).toBe('2.0.0');
95
+ });
96
+ it('should return updateAvailable: true when update is available', async () => {
97
+ mockFirestoreClient.getManifest.mockResolvedValue(mockManifest);
98
+ const result = await manifestReader.checkForUpdates({
99
+ currentVersion: '1.5.0',
100
+ deviceInfo: mockDeviceInfo,
101
+ });
102
+ expect(result.updateAvailable).toBe(true);
103
+ expect(result.version).toBe('2.0.0');
104
+ expect(result.bundleUrl).toBe('https://example.com/bundle.zip');
105
+ expect(result.checksum).toBe('abc123');
106
+ });
107
+ it('should include delta info when available for current version', async () => {
108
+ var _a, _b, _c;
109
+ mockFirestoreClient.getManifest.mockResolvedValue(mockManifest);
110
+ const result = await manifestReader.checkForUpdates({
111
+ currentVersion: '1.5.0',
112
+ deviceInfo: mockDeviceInfo,
113
+ checkDeltas: true,
114
+ });
115
+ expect(result.delta).toBeDefined();
116
+ expect((_a = result.delta) === null || _a === void 0 ? void 0 : _a.available).toBe(true);
117
+ expect((_b = result.delta) === null || _b === void 0 ? void 0 : _b.patchUrl).toBe('https://example.com/patch-1.5.0.bin');
118
+ expect((_c = result.delta) === null || _c === void 0 ? void 0 : _c.patchSize).toBe(50000);
119
+ });
120
+ it('should not include delta when checkDeltas is false', async () => {
121
+ mockFirestoreClient.getManifest.mockResolvedValue(mockManifest);
122
+ const result = await manifestReader.checkForUpdates({
123
+ currentVersion: '1.5.0',
124
+ deviceInfo: mockDeviceInfo,
125
+ checkDeltas: false,
126
+ });
127
+ expect(result.delta).toBeUndefined();
128
+ });
129
+ it('should indicate delta not available when no delta for current version', async () => {
130
+ var _a;
131
+ mockFirestoreClient.getManifest.mockResolvedValue(mockManifest);
132
+ const result = await manifestReader.checkForUpdates({
133
+ currentVersion: '1.0.0', // No delta for this version
134
+ deviceInfo: mockDeviceInfo,
135
+ checkDeltas: true,
136
+ });
137
+ expect(result.delta).toBeDefined();
138
+ expect((_a = result.delta) === null || _a === void 0 ? void 0 : _a.available).toBe(false);
139
+ });
140
+ it('should clear cache when forceRefresh is true', async () => {
141
+ mockFirestoreClient.getManifest.mockResolvedValue(mockManifest);
142
+ await manifestReader.checkForUpdates({
143
+ currentVersion: '1.5.0',
144
+ deviceInfo: mockDeviceInfo,
145
+ forceRefresh: true,
146
+ });
147
+ expect(mockFirestoreClient.clearCache).toHaveBeenCalled();
148
+ });
149
+ });
150
+ describe('checkRolloutEligibility', () => {
151
+ it('should return eligible when rollout is not enabled', async () => {
152
+ const rollout = {
153
+ enabled: false,
154
+ percentage: 10,
155
+ startTime: createTimestamp(new Date()),
156
+ endTime: null,
157
+ };
158
+ const result = await manifestReader.checkRolloutEligibility(rollout, mockDeviceInfo);
159
+ expect(result.eligible).toBe(true);
160
+ expect(result.reason).toBe('Rollout not enabled, all devices eligible');
161
+ });
162
+ it('should return ineligible when rollout not started', async () => {
163
+ const rollout = {
164
+ enabled: true,
165
+ percentage: 100,
166
+ startTime: createTimestamp(new Date(Date.now() + 86400000)),
167
+ endTime: null,
168
+ };
169
+ const result = await manifestReader.checkRolloutEligibility(rollout, mockDeviceInfo);
170
+ expect(result.eligible).toBe(false);
171
+ expect(result.reason).toBe('Rollout not started yet');
172
+ });
173
+ it('should return ineligible when rollout ended', async () => {
174
+ const rollout = {
175
+ enabled: true,
176
+ percentage: 100,
177
+ startTime: createTimestamp(new Date(Date.now() - 86400000 * 7)),
178
+ endTime: createTimestamp(new Date(Date.now() - 86400000)),
179
+ };
180
+ const result = await manifestReader.checkRolloutEligibility(rollout, mockDeviceInfo);
181
+ expect(result.eligible).toBe(false);
182
+ expect(result.reason).toBe('Rollout ended');
183
+ });
184
+ it('should check scheduled rollout time', async () => {
185
+ const rollout = {
186
+ enabled: true,
187
+ percentage: 100,
188
+ startTime: createTimestamp(new Date(Date.now() - 86400000)),
189
+ endTime: null,
190
+ schedule: {
191
+ type: 'scheduled',
192
+ scheduledTime: createTimestamp(new Date(Date.now() + 86400000)),
193
+ },
194
+ };
195
+ const result = await manifestReader.checkRolloutEligibility(rollout, mockDeviceInfo);
196
+ expect(result.eligible).toBe(false);
197
+ expect(result.reason).toBe('Scheduled for later');
198
+ });
199
+ it('should calculate gradual rollout percentage', async () => {
200
+ const rollout = {
201
+ enabled: true,
202
+ percentage: 100,
203
+ startTime: createTimestamp(new Date(Date.now() - 3600000)), // 1 hour ago
204
+ endTime: null,
205
+ schedule: {
206
+ type: 'gradual',
207
+ gradualSteps: [10, 25, 50, 100],
208
+ gradualInterval: 24, // 24 hours per step
209
+ },
210
+ };
211
+ // Device is at ~6% percentile, first step is 10%, should be eligible
212
+ const result = await manifestReader.checkRolloutEligibility(rollout, mockDeviceInfo);
213
+ expect(result.eligible).toBe(true);
214
+ });
215
+ });
216
+ describe('version comparison', () => {
217
+ it('should correctly compare versions', async () => {
218
+ mockFirestoreClient.getManifest.mockResolvedValue(mockManifest);
219
+ // 1.5.0 < 2.0.0 - update available
220
+ let result = await manifestReader.checkForUpdates({
221
+ currentVersion: '1.5.0',
222
+ deviceInfo: mockDeviceInfo,
223
+ });
224
+ expect(result.updateAvailable).toBe(true);
225
+ // 2.0.0 = 2.0.0 - no update
226
+ result = await manifestReader.checkForUpdates({
227
+ currentVersion: '2.0.0',
228
+ deviceInfo: mockDeviceInfo,
229
+ });
230
+ expect(result.updateAvailable).toBe(false);
231
+ // 3.0.0 > 2.0.0 - no update (already ahead)
232
+ result = await manifestReader.checkForUpdates({
233
+ currentVersion: '3.0.0',
234
+ deviceInfo: mockDeviceInfo,
235
+ });
236
+ expect(result.updateAvailable).toBe(false);
237
+ });
238
+ it('should handle pre-release versions', async () => {
239
+ const manifestWithPreRelease = Object.assign(Object.assign({}, mockManifest), { current: Object.assign(Object.assign({}, mockManifest.current), { version: '2.0.0' }) });
240
+ mockFirestoreClient.getManifest.mockResolvedValue(manifestWithPreRelease);
241
+ // 2.0.0-beta < 2.0.0 - update available
242
+ const result = await manifestReader.checkForUpdates({
243
+ currentVersion: '2.0.0-beta',
244
+ deviceInfo: mockDeviceInfo,
245
+ });
246
+ expect(result.updateAvailable).toBe(true);
247
+ });
248
+ });
249
+ describe('getManifest', () => {
250
+ it('should return raw manifest', async () => {
251
+ mockFirestoreClient.getManifest.mockResolvedValue(mockManifest);
252
+ const result = await manifestReader.getManifest();
253
+ expect(result).toEqual(mockManifest);
254
+ });
255
+ });
256
+ describe('getManifestFor', () => {
257
+ it('should get manifest for specific app and channel', async () => {
258
+ mockFirestoreClient.getManifestFor.mockResolvedValue(mockManifest);
259
+ const result = await manifestReader.getManifestFor('com.example.app', 'production');
260
+ expect(mockFirestoreClient.getManifestFor).toHaveBeenCalledWith('com.example.app', 'production');
261
+ expect(result).toEqual(mockManifest);
262
+ });
263
+ });
264
+ describe('clearCache', () => {
265
+ it('should clear firestore client cache', () => {
266
+ manifestReader.clearCache();
267
+ expect(mockFirestoreClient.clearCache).toHaveBeenCalled();
268
+ });
269
+ });
270
+ });
271
+ //# sourceMappingURL=manifest-reader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-reader.test.js","sourceRoot":"","sources":["../../../src/__tests__/manifest-reader.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};