@flighthq/share 0.2.0 → 0.2.1-next.410.a23f189

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 (2) hide show
  1. package/package.json +3 -3
  2. package/src/share.test.ts +37 -40
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/share",
3
- "version": "0.2.0",
3
+ "version": "0.2.1-next.410.a23f189",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/flighthq/flight.git",
@@ -32,8 +32,8 @@
32
32
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
33
33
  },
34
34
  "dependencies": {
35
- "@flighthq/signals": "0.2.0",
36
- "@flighthq/types": "0.2.0"
35
+ "@flighthq/signals": "0.2.1-next.410.a23f189",
36
+ "@flighthq/types": "0.2.1-next.410.a23f189"
37
37
  },
38
38
  "devDependencies": {
39
39
  "typescript": "^5.3.0"
package/src/share.test.ts CHANGED
@@ -41,7 +41,24 @@ function fakeBackend(
41
41
  };
42
42
  }
43
43
 
44
- afterEach(() => setShareBackend(null));
44
+ const originalNavigatorDescriptor = Object.getOwnPropertyDescriptor(globalThis, 'navigator');
45
+
46
+ function mockNavigator(value: unknown): void {
47
+ Object.defineProperty(globalThis, 'navigator', { value, configurable: true });
48
+ }
49
+
50
+ function restoreNavigator(): void {
51
+ if (originalNavigatorDescriptor !== undefined) {
52
+ Object.defineProperty(globalThis, 'navigator', originalNavigatorDescriptor);
53
+ } else {
54
+ delete (globalThis as { navigator?: unknown }).navigator;
55
+ }
56
+ }
57
+
58
+ afterEach(() => {
59
+ setShareBackend(null);
60
+ restoreNavigator();
61
+ });
45
62
 
46
63
  describe('attachShareSignals', () => {
47
64
  it('replaces an existing attachment idempotently', async () => {
@@ -126,70 +143,54 @@ describe('createWebShareBackend', () => {
126
143
 
127
144
  it('shareWithResult returns dismissed=true on AbortError', async () => {
128
145
  const backend = createWebShareBackend();
129
- Object.defineProperty(globalThis, 'navigator', {
130
- value: {
131
- share: async () => {
132
- const err = new Error('User aborted');
133
- err.name = 'AbortError';
134
- throw err;
135
- },
136
- canShare: () => true,
146
+ mockNavigator({
147
+ share: async () => {
148
+ const err = new Error('User aborted');
149
+ err.name = 'AbortError';
150
+ throw err;
137
151
  },
138
- configurable: true,
152
+ canShare: () => true,
139
153
  });
140
154
  const result = await backend.shareWithResult({ text: 'hi' });
141
155
  expect(result.completed).toBe(false);
142
156
  expect(result.dismissed).toBe(true);
143
- Object.defineProperty(globalThis, 'navigator', { value: undefined, configurable: true });
144
157
  });
145
158
 
146
159
  it('shareWithResult returns dismissed=false on non-AbortError', async () => {
147
160
  const backend = createWebShareBackend();
148
- Object.defineProperty(globalThis, 'navigator', {
149
- value: {
150
- share: async () => {
151
- const err = new Error('Data error');
152
- err.name = 'DataError';
153
- throw err;
154
- },
155
- canShare: () => true,
161
+ mockNavigator({
162
+ share: async () => {
163
+ const err = new Error('Data error');
164
+ err.name = 'DataError';
165
+ throw err;
156
166
  },
157
- configurable: true,
167
+ canShare: () => true,
158
168
  });
159
169
  const result = await backend.shareWithResult({ text: 'hi' });
160
170
  expect(result.completed).toBe(false);
161
171
  expect(result.dismissed).toBe(false);
162
- Object.defineProperty(globalThis, 'navigator', { value: undefined, configurable: true });
163
172
  });
164
173
 
165
174
  it('isAvailable returns true when navigator.share exists', () => {
166
- Object.defineProperty(globalThis, 'navigator', {
167
- value: { share: async () => {} },
168
- configurable: true,
169
- });
175
+ mockNavigator({ share: async () => {} });
170
176
  const backend = createWebShareBackend();
171
177
  expect(backend.isAvailable()).toBe(true);
172
- Object.defineProperty(globalThis, 'navigator', { value: undefined, configurable: true });
173
178
  });
174
179
 
175
180
  it('canShare delegates files to navigator.canShare', () => {
176
181
  let passedData: ShareData | undefined;
177
- Object.defineProperty(globalThis, 'navigator', {
178
- value: {
179
- share: async () => {},
180
- canShare: (data: ShareData) => {
181
- passedData = data;
182
- return true;
183
- },
182
+ mockNavigator({
183
+ share: async () => {},
184
+ canShare: (data: ShareData) => {
185
+ passedData = data;
186
+ return true;
184
187
  },
185
- configurable: true,
186
188
  });
187
189
  const backend = createWebShareBackend();
188
190
  const file: ShareFile = { name: 'img.png', mimeType: 'image/png', dataUrl: 'data:image/png;base64,AA==' };
189
191
  backend.canShare({ files: [file] });
190
192
  expect(passedData?.files).toHaveLength(1);
191
193
  expect(passedData?.files?.[0]).toBeInstanceOf(File);
192
- Object.defineProperty(globalThis, 'navigator', { value: undefined, configurable: true });
193
194
  });
194
195
  });
195
196
 
@@ -269,12 +270,8 @@ describe('isShareAvailable', () => {
269
270
  });
270
271
 
271
272
  it('returns true when navigator.share exists', () => {
272
- Object.defineProperty(globalThis, 'navigator', {
273
- value: { share: async () => {} },
274
- configurable: true,
275
- });
273
+ mockNavigator({ share: async () => {} });
276
274
  expect(isShareAvailable()).toBe(true);
277
- Object.defineProperty(globalThis, 'navigator', { value: undefined, configurable: true });
278
275
  });
279
276
  });
280
277