Skip to content
File

Blob: types/test/transforms/iterators.spec.ts

typescript64 lines
1// Copyright (c) 2022-2023 Cloudflare, Inc.
2// Licensed under the Apache 2.0 license found in the LICENSE file or at:
3// https://opensource.org/licenses/Apache-2.0
4 
5import assert from "assert";
6import { test } from "node:test";
7import path from "path";
8import ts from "typescript";
9import { printer } from "../../src/print";
10import { createMemoryProgram } from "../../src/program";
11import { createIteratorTransformer } from "../../src/transforms";
12 
13test("createIteratorTransformer: replaces Iterator-like interfaces with built-in Iterators", () => {
14 const source = `export class Thing {
15 readonly thingsProperty: ThingIterator;
16 readonly asyncThingsProperty: AsyncThingIterator;
17 things(): ThingIterator;
18 asyncThings(): AsyncThingIterator;
19 [Symbol.iterator](): ThingIterator;
20 [Symbol.asyncIterator](): AsyncThingIterator;
21}
22export interface ThingIterator extends Iterator {
23 next(): ThingIteratorNext;
24 [Symbol.iterator](): any;
25}
26export interface ThingIteratorNext {
27 done: boolean;
28 value?: string;
29}
30export interface AsyncThingIterator extends AsyncIterator {
31 next(): Promise<AsyncThingIteratorNext>;
32 return(value?: any): Promise<AsyncThingIteratorNext>;
33 [Symbol.asyncIterator](): any;
34}
35export interface AsyncThingIteratorNext {
36 done: boolean;
37 value?: number;
38}
39`;
40 const sourcePath = path.resolve(__dirname, "source.ts");
41 const sources = new Map([[sourcePath, source]]);
42 const program = createMemoryProgram(sources);
43 const checker = program.getTypeChecker();
44 const sourceFile = program.getSourceFile(sourcePath);
45 assert(sourceFile !== undefined);
46 
47 const result = ts.transform(sourceFile, [createIteratorTransformer(checker)]);
48 assert.strictEqual(result.transformed.length, 1);
49 
50 const output = printer.printFile(result.transformed[0]);
51 assert.strictEqual(
52 output,
53 `export class Thing {
54 readonly thingsProperty: IterableIterator<string>;
55 readonly asyncThingsProperty: AsyncIterableIterator<number>;
56 things(): IterableIterator<string>;
57 asyncThings(): AsyncIterableIterator<number>;
58 [Symbol.iterator](): IterableIterator<string>;
59 [Symbol.asyncIterator](): AsyncIterableIterator<number>;
60}
61`
62 );
63});