@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.
- package/package.json +3 -3
- 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.
|
|
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.
|
|
36
|
-
"@flighthq/types": "0.2.
|
|
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
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
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
|
|