Skip to content

Commit 158415f

Browse files
authored
[Fix] Prevent generators from attempting to be copied (#112)
1 parent 36f35bd commit 158415f

File tree

5 files changed

+33
-2
lines changed

5 files changed

+33
-2
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# fast-copy CHANGELOG
22

3+
## 4.0.2
4+
5+
- [#112](https://github.com/planttheidea/fast-copy/pull/112) - Prevent generators from attempting to be copied (fixes
6+
[#111](https://github.com/planttheidea/fast-copy/issues/111))
7+
38
## 4.0.1
49

510
- [#110](https://github.com/planttheidea/fast-copy/pull/110) - Fix legacy types not aligning with types from build

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,9 +262,11 @@ The following object types are copied directly, as they are either primitives, c
262262
implementation does not expect cloning:
263263

264264
- `AsyncFunction`
265+
- `AsyncGenerator`
265266
- `Boolean` primitives
266267
- `Error`
267268
- `Function`
269+
- `Generator`
268270
- `GeneratorFunction`
269271
- `Number` primitives
270272
- `Null`

__tests__/index.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ interface PlainObject {
77
[index: number]: any;
88
}
99

10+
function* generator() {
11+
yield 'foo';
12+
}
13+
14+
async function* asyncGenerator() {
15+
await Promise.resolve();
16+
yield 'foo';
17+
}
18+
1019
const SIMPLE_TYPES: PlainObject = {
1120
boolean: true,
1221
error: new TypeError('boom'),
@@ -50,6 +59,7 @@ const COMPLEX_TYPES: PlainObject = {
5059
})('foo', 'bar', 'baz'),
5160
array: ['foo', { bar: 'baz' }],
5261
arrayBuffer: new ArrayBuffer(8),
62+
asyncGenerator: asyncGenerator(),
5363
blob: new Blob(['<a id="a">hey!</a>'], { type: 'text/html' }),
5464
buffer: Buffer.from('this is a test buffer'),
5565
customPrototype: Object.create({
@@ -62,6 +72,7 @@ const COMPLEX_TYPES: PlainObject = {
6272
date: new Date(),
6373
float32Array: new Float32Array([1, 2]),
6474
float64Array: new Float64Array([3, 4]),
75+
generator: generator(),
6576
int8Array: new Int8Array([5, 6]),
6677
int16Array: new Int16Array([7, 8]),
6778
int32Array: new Int32Array([9, 10]),
@@ -336,6 +347,8 @@ describe('copyStrict', () => {
336347
} else if (property === 'customPrototype') {
337348
expect(Object.getPrototypeOf(value)).toBe(Object.getPrototypeOf(COMPLEX_TYPES[property]));
338349
expect(value).toEqual(COMPLEX_TYPES[property]);
350+
} else if (property === 'asyncGenerator' || property === 'generator') {
351+
expect(value).toBe(COMPLEX_TYPES[property]);
339352
} else {
340353
// @ts-expect-error - Symbol not supported property type
341354
expect(value).toEqual(COMPLEX_TYPES[property]);

index.d.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ interface State {
1515
interface CopierMethods {
1616
array?: InternalCopier<any[]>;
1717
arrayBuffer?: InternalCopier<ArrayBuffer>;
18+
asyncGenerator?: InternalCopier<AsyncGenerator>;
1819
blob?: InternalCopier<Blob>;
1920
dataView?: InternalCopier<DataView>;
2021
date?: InternalCopier<Date>;
21-
error?: InternalCopier<any>;
22+
error?: InternalCopier<Error>;
23+
generator?: InternalCopier<Generator>;
2224
map?: InternalCopier<Map<any, any>>;
2325
object?: InternalCopier<Record<string, any>>;
2426
regExp?: InternalCopier<RegExp>;

src/options.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@ import type { Cache } from './utils.ts';
2121
export interface CopierMethods {
2222
array?: InternalCopier<any[]>;
2323
arrayBuffer?: InternalCopier<ArrayBuffer>;
24+
asyncGenerator?: InternalCopier<AsyncGenerator>;
2425
blob?: InternalCopier<Blob>;
2526
dataView?: InternalCopier<DataView>;
2627
date?: InternalCopier<Date>;
27-
error?: InternalCopier<any>;
28+
error?: InternalCopier<Error>;
29+
generator?: InternalCopier<Generator>;
2830
map?: InternalCopier<Map<any, any>>;
2931
object?: InternalCopier<Record<string, any>>;
3032
regExp?: InternalCopier<RegExp>;
@@ -37,6 +39,7 @@ interface Copiers {
3739
Arguments: InternalCopier<Record<string, any>>;
3840
Array: InternalCopier<any[]>;
3941
ArrayBuffer: InternalCopier<ArrayBuffer>;
42+
AsyncGenerator: InternalCopier<AsyncGenerator>;
4043
Blob: InternalCopier<Blob>;
4144
// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
4245
Boolean: InternalCopier<Boolean>;
@@ -45,6 +48,8 @@ interface Copiers {
4548
Error: InternalCopier<Error>;
4649
Float32Array: InternalCopier<ArrayBuffer>;
4750
Float64Array: InternalCopier<ArrayBuffer>;
51+
Generator: InternalCopier<Generator>;
52+
4853
Int8Array: InternalCopier<ArrayBuffer>;
4954
Int16Array: InternalCopier<ArrayBuffer>;
5055
Int32Array: InternalCopier<ArrayBuffer>;
@@ -89,10 +94,12 @@ export function getOptions({
8994
const defaultMethods = {
9095
array: strict ? copyArrayStrict : copyArrayLoose,
9196
arrayBuffer: copyArrayBuffer,
97+
asyncGenerator: copySelf,
9298
blob: copyBlob,
9399
dataView: copyDataView,
94100
date: copyDate,
95101
error: copySelf,
102+
generator: copySelf,
96103
map: strict ? copyMapStrict : copyMapLoose,
97104
object: strict ? copyObjectStrict : copyObjectLoose,
98105
regExp: copyRegExp,
@@ -121,13 +128,15 @@ export function getTagSpecificCopiers(methods: Required<CopierMethods>): Copiers
121128
Arguments: methods.object,
122129
Array: methods.array,
123130
ArrayBuffer: methods.arrayBuffer,
131+
AsyncGenerator: methods.asyncGenerator,
124132
Blob: methods.blob,
125133
Boolean: copyPrimitiveWrapper,
126134
DataView: methods.dataView,
127135
Date: methods.date,
128136
Error: methods.error,
129137
Float32Array: methods.arrayBuffer,
130138
Float64Array: methods.arrayBuffer,
139+
Generator: methods.generator,
131140
Int8Array: methods.arrayBuffer,
132141
Int16Array: methods.arrayBuffer,
133142
Int32Array: methods.arrayBuffer,

0 commit comments

Comments
 (0)