File
Blob: types/test/transforms/iterators.spec.ts
| 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 | |
| 5 | import assert from "assert"; |
| 6 | import { test } from "node:test"; |
| 7 | import path from "path"; |
| 8 | import ts from "typescript"; |
| 9 | import { printer } from "../../src/print"; |
| 10 | import { createMemoryProgram } from "../../src/program"; |
| 11 | import { createIteratorTransformer } from "../../src/transforms"; |
| 12 | |
| 13 | test("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 | } |
| 22 | export interface ThingIterator extends Iterator { |
| 23 | next(): ThingIteratorNext; |
| 24 | [Symbol.iterator](): any; |
| 25 | } |
| 26 | export interface ThingIteratorNext { |
| 27 | done: boolean; |
| 28 | value?: string; |
| 29 | } |
| 30 | export interface AsyncThingIterator extends AsyncIterator { |
| 31 | next(): Promise<AsyncThingIteratorNext>; |
| 32 | return(value?: any): Promise<AsyncThingIteratorNext>; |
| 33 | [Symbol.asyncIterator](): any; |
| 34 | } |
| 35 | export 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 | }); |