Skip to content

Commit 5cc0b10

Browse files
authored
Merge pull request #26 from aaditmshah/feature/fetch-json
💥 Add strong type definition for `fetch().json()`
2 parents 956af03 + 01b9989 commit 5cc0b10

28 files changed

+864
-1933
lines changed

build/diff.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { mkdir, readFile, rm, writeFile } from "fs/promises";
55
import path from "path";
66
import prettier from "prettier";
77
import { generate } from "./logic/generate";
8-
import { getLibFiles } from "./logic/getLibFiles";
8+
import { getLibFiles, tsLibDir } from "./logic/getLibFiles";
99
import { projectDir } from "./logic/projectDir";
1010

1111
const docsDir = path.join(projectDir, "docs");
@@ -20,17 +20,17 @@ async function main() {
2020
recursive: true,
2121
});
2222

23-
const { tsLibDir, libFiles } = await getLibFiles();
23+
const libFiles = await getLibFiles();
2424
const hasDiffFiles: string[] = [];
25-
for (const libFile of libFiles) {
26-
const betterLib = generate(tsLibDir, libFile, false);
25+
for (const [targetFile, sourceFile] of libFiles.entries()) {
26+
const betterLib = generate(tsLibDir, targetFile, sourceFile, false);
2727
if (betterLib === undefined) {
2828
continue;
2929
}
3030

31-
const diffFile = path.join(docsDiffDir, libFile + ".md");
31+
const diffFile = path.join(docsDiffDir, sourceFile + ".md");
3232

33-
const originalLib = await readFile(path.join(tsLibDir, libFile), "utf8");
33+
const originalLib = await readFile(path.join(tsLibDir, sourceFile), "utf8");
3434
const formattedOriginalLib = prettier.format(originalLib, {
3535
parser: "typescript",
3636
});
@@ -42,21 +42,21 @@ async function main() {
4242
}
4343

4444
const diffPatch = createPatch(
45-
libFile,
45+
sourceFile,
4646
formattedOriginalLib,
4747
formattedBetterLib
4848
);
4949

50-
const md = `# ${libFile} Diffs
50+
const md = `# ${sourceFile} Diffs
5151
5252
\`\`\`diff
5353
${diffPatch}
5454
\`\`\`
5555
`;
5656

5757
await writeFile(diffFile, md);
58-
console.log(libFile);
59-
hasDiffFiles.push(libFile);
58+
console.log(sourceFile);
59+
hasDiffFiles.push(sourceFile);
6060
}
6161
const diffDoc = `
6262
# Diffs

build/build.ts renamed to build/lib.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { mkdir, rm, writeFile } from "fs/promises";
22
import path from "path";
33
import prettier from "prettier";
44
import { generate } from "./logic/generate";
5-
import { getLibFiles } from "./logic/getLibFiles";
5+
import { getLibFiles, tsLibDir } from "./logic/getLibFiles";
66
import { projectDir } from "./logic/projectDir";
77

88
const distDir = path.join(projectDir, "generated");
@@ -17,20 +17,20 @@ async function main() {
1717
});
1818

1919
// copy TypeScript lib files
20-
const { tsLibDir, libFiles } = await getLibFiles();
20+
const libFiles = await getLibFiles();
2121

2222
// modify each lib file
23-
for (const libFile of libFiles) {
24-
let result = generate(tsLibDir, libFile, true);
23+
for (const [targetFile, sourceFile] of libFiles.entries()) {
24+
let result = generate(tsLibDir, targetFile, sourceFile, true);
2525
if (result === undefined) {
2626
continue;
2727
}
2828
result = prettier.format(result, {
2929
parser: "typescript",
3030
});
3131

32-
await writeFile(path.join(distDir, "lib." + libFile), result);
33-
console.log(libFile);
32+
await writeFile(path.join(distDir, targetFile), result);
33+
console.log(sourceFile);
3434
}
3535
}
3636

build/logic/generate.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import path from "path";
22
import ts from "typescript";
3-
import { alias } from "../alias";
3+
import { alias } from "../util/alias";
44
import { upsert } from "../util/upsert";
55
import { projectDir } from "./projectDir";
66

@@ -11,10 +11,11 @@ const betterLibDir = path.join(projectDir, "lib");
1111
*/
1212
export function generate(
1313
tsLibDir: string,
14-
libFile: string,
14+
targetFile: string,
15+
sourceFile: string,
1516
emitOriginalAsComment: boolean
1617
): string | undefined {
17-
const tsLibFile = path.join(tsLibDir, libFile);
18+
const tsLibFile = path.join(tsLibDir, sourceFile);
1819
const originalProgram = ts.createProgram([tsLibFile], {});
1920
const originalFile = originalProgram.getSourceFile(tsLibFile);
2021
if (!originalFile) {
@@ -27,7 +28,7 @@ export function generate(
2728
let result = `/// <reference no-default-lib="true"/>
2829
`;
2930

30-
const replacementTargets = scanBetterFile(printer, libFile);
31+
const replacementTargets = scanBetterFile(printer, targetFile);
3132

3233
if (replacementTargets.size === 0) {
3334
return result + originalFile.text;
@@ -189,11 +190,11 @@ type ReplacementTarget = (
189190
*/
190191
function scanBetterFile(
191192
printer: ts.Printer,
192-
libFile: string
193+
targetFile: string
193194
): Map<string, ReplacementTarget[]> {
194195
const replacementTargets = new Map<string, ReplacementTarget[]>();
195196
{
196-
const betterLibFile = path.join(betterLibDir, `lib.${libFile}`);
197+
const betterLibFile = path.join(betterLibDir, targetFile);
197198
const betterProgram = ts.createProgram([betterLibFile], {});
198199
const betterFile = betterProgram.getSourceFile(betterLibFile);
199200
if (betterFile) {

build/logic/getLibFiles.ts

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
1-
import { readdir } from "fs/promises";
1+
import { readFile } from "fs/promises";
2+
import JSON5 from "json5";
23
import path from "path";
4+
import { array, record, string, unknown } from "../util/parsers";
35
import { projectDir } from "./projectDir";
46

5-
const tsDir = path.join(projectDir, "TypeScript");
6-
const tsLibDir = path.join(tsDir, "src", "lib");
7+
export const tsLibDir = path.join(projectDir, "TypeScript", "src", "lib");
78

8-
export async function getLibFiles(): Promise<{
9-
tsLibDir: string;
10-
libFiles: string[];
11-
}> {
12-
// copy TypeScript lib files
13-
const libs = await readdir(tsLibDir);
14-
const libFiles: string[] = libs.filter((libFile) =>
15-
/(?:^|\/|\\).+\.d\.ts$/.test(libFile)
9+
const libsFile = path.join(tsLibDir, "libs.json");
10+
11+
export const getLibFiles = async () => {
12+
const json5 = await readFile(libsFile, "utf8");
13+
const result = record(unknown)(JSON5.parse(json5));
14+
const libs = array(string)(result.libs);
15+
const paths = record(string)(result.paths);
16+
return new Map(
17+
libs.map((lib) => {
18+
const sourceFile = `${lib}.d.ts`;
19+
const targetFile = paths[lib] || `lib.${sourceFile}`;
20+
return [targetFile, sourceFile];
21+
})
1622
);
17-
return {
18-
tsLibDir,
19-
libFiles,
20-
};
21-
}
23+
};

build/package.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { mkdir, readdir, readFile, rm, symlink, writeFile } from "fs/promises";
22
import path from "path";
3+
import { name as rootPackageName, version } from "../package.json";
4+
import { projectDir } from "./logic/projectDir";
35

46
const scope = "better-typescript-lib";
57

6-
const projectDir = process.env.PROJECT || process.cwd();
78
const libDir = path.join(projectDir, "generated");
89
const templateDir = path.join(projectDir, "package-template");
910
const packageDir = path.join(projectDir, "dist-package");
@@ -18,13 +19,6 @@ async function main() {
1819
recursive: true,
1920
});
2021

21-
// Read version from root package.json
22-
const rootPackageJson = JSON.parse(
23-
await readFile(path.join(projectDir, "package.json"), "utf-8")
24-
);
25-
const rootPackageName: string = rootPackageJson.name;
26-
const version: string = rootPackageJson.version;
27-
2822
const packageTemplateFiles = await readdir(templateDir);
2923

3024
const libFiles = (await readdir(libDir)).filter((libFile) =>
@@ -33,6 +27,7 @@ async function main() {
3327

3428
const packageNames = new Set<string>();
3529
for (const libFile of libFiles) {
30+
if (libFile === "lib.d.ts") continue;
3631
console.log(`Processing ${libFile}`);
3732
const libFilePath = path.join(libDir, libFile);
3833
const { packageName, packagePath } =
File renamed without changes.

build/util/isNotNullish.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.

build/util/parsers.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
export type Parser<A> = (input: unknown) => A;
2+
3+
export const unknown: Parser<unknown> = (input) => input;
4+
5+
export const string: Parser<string> = (input) => {
6+
if (typeof input === "string") return input;
7+
throw new TypeError(`Expected a string but received ${input}`);
8+
};
9+
10+
export const array =
11+
<A>(parser: Parser<A>): Parser<A[]> =>
12+
(input) => {
13+
if (!Array.isArray(input))
14+
throw new TypeError(`Expected an array but received ${input}`);
15+
const result = new Array<A>(input.length);
16+
for (let i = 0; i < input.length; i++) result[i] = parser(input[i]);
17+
return result;
18+
};
19+
20+
export const record =
21+
<A>(parser: Parser<A>): Parser<Record<string, A>> =>
22+
(input) => {
23+
if (typeof input !== "object" || input === null)
24+
throw new TypeError(`Expected a non-null object but received ${input}`);
25+
const result: Record<string, A> = {};
26+
for (const [key, value] of Object.entries(input))
27+
result[key] = parser(value);
28+
return result;
29+
};

docs/diff.md

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,24 @@
33

44
The following files are improved in better-typescript-lib:
55

6+
- [es5.d.ts](./diff/es5.d.ts.md)
7+
- [es2015.d.ts](./diff/es2015.d.ts.md)
8+
- [es2016.d.ts](./diff/es2016.d.ts.md)
9+
- [es2017.d.ts](./diff/es2017.d.ts.md)
10+
- [es2018.d.ts](./diff/es2018.d.ts.md)
11+
- [es2019.d.ts](./diff/es2019.d.ts.md)
12+
- [es2020.d.ts](./diff/es2020.d.ts.md)
13+
- [es2021.d.ts](./diff/es2021.d.ts.md)
14+
- [es2022.d.ts](./diff/es2022.d.ts.md)
15+
- [esnext.d.ts](./diff/esnext.d.ts.md)
616
- [dom.generated.d.ts](./diff/dom.generated.d.ts.md)
7-
- [dom.iterable.d.ts](./diff/dom.iterable.d.ts.md)
817
- [dom.iterable.generated.d.ts](./diff/dom.iterable.generated.d.ts.md)
9-
- [es2015.collection.d.ts](./diff/es2015.collection.d.ts.md)
18+
- [webworker.generated.d.ts](./diff/webworker.generated.d.ts.md)
19+
- [webworker.importscripts.d.ts](./diff/webworker.importscripts.d.ts.md)
20+
- [webworker.iterable.generated.d.ts](./diff/webworker.iterable.generated.d.ts.md)
21+
- [scripthost.d.ts](./diff/scripthost.d.ts.md)
1022
- [es2015.core.d.ts](./diff/es2015.core.d.ts.md)
11-
- [es2015.d.ts](./diff/es2015.d.ts.md)
12-
- [es2015.full.d.ts](./diff/es2015.full.d.ts.md)
23+
- [es2015.collection.d.ts](./diff/es2015.collection.d.ts.md)
1324
- [es2015.generator.d.ts](./diff/es2015.generator.d.ts.md)
1425
- [es2015.iterable.d.ts](./diff/es2015.iterable.d.ts.md)
1526
- [es2015.promise.d.ts](./diff/es2015.promise.d.ts.md)
@@ -18,60 +29,47 @@ The following files are improved in better-typescript-lib:
1829
- [es2015.symbol.d.ts](./diff/es2015.symbol.d.ts.md)
1930
- [es2015.symbol.wellknown.d.ts](./diff/es2015.symbol.wellknown.d.ts.md)
2031
- [es2016.array.include.d.ts](./diff/es2016.array.include.d.ts.md)
21-
- [es2016.d.ts](./diff/es2016.d.ts.md)
22-
- [es2016.full.d.ts](./diff/es2016.full.d.ts.md)
23-
- [es2017.d.ts](./diff/es2017.d.ts.md)
24-
- [es2017.full.d.ts](./diff/es2017.full.d.ts.md)
25-
- [es2017.intl.d.ts](./diff/es2017.intl.d.ts.md)
2632
- [es2017.object.d.ts](./diff/es2017.object.d.ts.md)
2733
- [es2017.sharedmemory.d.ts](./diff/es2017.sharedmemory.d.ts.md)
2834
- [es2017.string.d.ts](./diff/es2017.string.d.ts.md)
35+
- [es2017.intl.d.ts](./diff/es2017.intl.d.ts.md)
2936
- [es2017.typedarrays.d.ts](./diff/es2017.typedarrays.d.ts.md)
3037
- [es2018.asyncgenerator.d.ts](./diff/es2018.asyncgenerator.d.ts.md)
3138
- [es2018.asynciterable.d.ts](./diff/es2018.asynciterable.d.ts.md)
32-
- [es2018.d.ts](./diff/es2018.d.ts.md)
33-
- [es2018.full.d.ts](./diff/es2018.full.d.ts.md)
34-
- [es2018.intl.d.ts](./diff/es2018.intl.d.ts.md)
35-
- [es2018.promise.d.ts](./diff/es2018.promise.d.ts.md)
3639
- [es2018.regexp.d.ts](./diff/es2018.regexp.d.ts.md)
40+
- [es2018.promise.d.ts](./diff/es2018.promise.d.ts.md)
41+
- [es2018.intl.d.ts](./diff/es2018.intl.d.ts.md)
3742
- [es2019.array.d.ts](./diff/es2019.array.d.ts.md)
38-
- [es2019.d.ts](./diff/es2019.d.ts.md)
39-
- [es2019.full.d.ts](./diff/es2019.full.d.ts.md)
40-
- [es2019.intl.d.ts](./diff/es2019.intl.d.ts.md)
4143
- [es2019.object.d.ts](./diff/es2019.object.d.ts.md)
4244
- [es2019.string.d.ts](./diff/es2019.string.d.ts.md)
4345
- [es2019.symbol.d.ts](./diff/es2019.symbol.d.ts.md)
46+
- [es2019.intl.d.ts](./diff/es2019.intl.d.ts.md)
4447
- [es2020.bigint.d.ts](./diff/es2020.bigint.d.ts.md)
45-
- [es2020.d.ts](./diff/es2020.d.ts.md)
4648
- [es2020.date.d.ts](./diff/es2020.date.d.ts.md)
47-
- [es2020.full.d.ts](./diff/es2020.full.d.ts.md)
48-
- [es2020.intl.d.ts](./diff/es2020.intl.d.ts.md)
49-
- [es2020.number.d.ts](./diff/es2020.number.d.ts.md)
5049
- [es2020.promise.d.ts](./diff/es2020.promise.d.ts.md)
5150
- [es2020.sharedmemory.d.ts](./diff/es2020.sharedmemory.d.ts.md)
5251
- [es2020.string.d.ts](./diff/es2020.string.d.ts.md)
5352
- [es2020.symbol.wellknown.d.ts](./diff/es2020.symbol.wellknown.d.ts.md)
54-
- [es2021.d.ts](./diff/es2021.d.ts.md)
55-
- [es2021.full.d.ts](./diff/es2021.full.d.ts.md)
56-
- [es2021.intl.d.ts](./diff/es2021.intl.d.ts.md)
57-
- [es2021.promise.d.ts](./diff/es2021.promise.d.ts.md)
53+
- [es2020.intl.d.ts](./diff/es2020.intl.d.ts.md)
54+
- [es2020.number.d.ts](./diff/es2020.number.d.ts.md)
5855
- [es2021.string.d.ts](./diff/es2021.string.d.ts.md)
56+
- [es2021.promise.d.ts](./diff/es2021.promise.d.ts.md)
5957
- [es2021.weakref.d.ts](./diff/es2021.weakref.d.ts.md)
58+
- [es2021.intl.d.ts](./diff/es2021.intl.d.ts.md)
6059
- [es2022.array.d.ts](./diff/es2022.array.d.ts.md)
61-
- [es2022.d.ts](./diff/es2022.d.ts.md)
6260
- [es2022.error.d.ts](./diff/es2022.error.d.ts.md)
63-
- [es2022.full.d.ts](./diff/es2022.full.d.ts.md)
6461
- [es2022.intl.d.ts](./diff/es2022.intl.d.ts.md)
6562
- [es2022.object.d.ts](./diff/es2022.object.d.ts.md)
6663
- [es2022.sharedmemory.d.ts](./diff/es2022.sharedmemory.d.ts.md)
6764
- [es2022.string.d.ts](./diff/es2022.string.d.ts.md)
68-
- [es5.d.ts](./diff/es5.d.ts.md)
65+
- [esnext.intl.d.ts](./diff/esnext.intl.d.ts.md)
6966
- [es5.full.d.ts](./diff/es5.full.d.ts.md)
70-
- [esnext.d.ts](./diff/esnext.d.ts.md)
67+
- [es2015.full.d.ts](./diff/es2015.full.d.ts.md)
68+
- [es2016.full.d.ts](./diff/es2016.full.d.ts.md)
69+
- [es2017.full.d.ts](./diff/es2017.full.d.ts.md)
70+
- [es2018.full.d.ts](./diff/es2018.full.d.ts.md)
71+
- [es2019.full.d.ts](./diff/es2019.full.d.ts.md)
72+
- [es2020.full.d.ts](./diff/es2020.full.d.ts.md)
73+
- [es2021.full.d.ts](./diff/es2021.full.d.ts.md)
74+
- [es2022.full.d.ts](./diff/es2022.full.d.ts.md)
7175
- [esnext.full.d.ts](./diff/esnext.full.d.ts.md)
72-
- [esnext.intl.d.ts](./diff/esnext.intl.d.ts.md)
73-
- [header.d.ts](./diff/header.d.ts.md)
74-
- [scripthost.d.ts](./diff/scripthost.d.ts.md)
75-
- [webworker.generated.d.ts](./diff/webworker.generated.d.ts.md)
76-
- [webworker.importscripts.d.ts](./diff/webworker.importscripts.d.ts.md)
77-
- [webworker.iterable.generated.d.ts](./diff/webworker.iterable.generated.d.ts.md)

docs/diff/dom.generated.d.ts.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,16 @@ Index: dom.generated.d.ts
1111
/// Window APIs
1212
/////////////////////////////
1313

14+
@@ -2800,9 +2801,9 @@
15+
readonly bodyUsed: boolean;
16+
arrayBuffer(): Promise<ArrayBuffer>;
17+
blob(): Promise<Blob>;
18+
formData(): Promise<FormData>;
19+
- json(): Promise<any>;
20+
+ json(): Promise<JSONValue>;
21+
text(): Promise<string>;
22+
}
23+
24+
interface BroadcastChannelEventMap {
1425

1526
```

docs/diff/dom.iterable.d.ts.md

Lines changed: 0 additions & 15 deletions
This file was deleted.

docs/diff/header.d.ts.md

Lines changed: 0 additions & 12 deletions
This file was deleted.
File renamed without changes.

0 commit comments

Comments
 (0)