From f7fa8fb69ca7587f2443581f17ca62e29e139576 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sat, 3 Apr 2021 14:44:22 -0700 Subject: [PATCH 1/3] test(typescript): do not permit unknown keys on `octokit` instance --- package.json | 3 ++- test/typescript-validate.ts | 39 +++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 test/typescript-validate.ts diff --git a/package.json b/package.json index cf3c7cb26..1e9758d5e 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "lint": "prettier --check '{src,test}/**/*.{ts,md}' README.md package.json", "lint:fix": "prettier --write '{src,test}/**/*.{ts,md}' README.md package.json", "pretest": "npm run -s lint", - "test": "jest --coverage" + "test": "jest --coverage", + "test:typescript": "npx tsc --noEmit --declaration --noUnusedLocals test/typescript-validate.ts" }, "repository": "github:octokit/core.js", "keywords": [ diff --git a/test/typescript-validate.ts b/test/typescript-validate.ts new file mode 100644 index 000000000..0cf3eb9ae --- /dev/null +++ b/test/typescript-validate.ts @@ -0,0 +1,39 @@ +// ************************************************************ +// THIS CODE IS NOT EXECUTED. IT IS JUST FOR TYPECHECKING +// ************************************************************ + +import { Octokit } from "../src"; + +export function pluginsTest() { + // `octokit` instance does not permit unknown keys + const octokit = new Octokit(); + + // @ts-expect-error Property 'unknown' does not exist on type 'Octokit'.(2339) + octokit.unknown; + + const OctokitWithDefaults = Octokit.defaults({}); + const octokitWithDefaults = new OctokitWithDefaults(); + + // Error: `octokitWithDefaults` does permit unknown keys + // @ts-expect-error `.unknown` should not be typed as `any` + octokitWithDefaults.unknown; + + const OctokitWithPlugin = Octokit.plugin(() => ({})); + const octokitWithPlugin = new OctokitWithPlugin(); + + // Error: `octokitWithPlugin` does permit unknown keys + // @ts-expect-error `.unknown` should not be typed as `any` + octokitWithPlugin.unknown; + + const OctokitWithPluginAndDefaults = Octokit.plugin(() => ({ + foo: 42, + })).defaults({ + baz: "daz", + }); + + const octokitWithPluginAndDefaults = new OctokitWithPluginAndDefaults(); + + octokitWithPluginAndDefaults.foo; + // @ts-expect-error `.unknown` should not be typed as `any` + octokitWithPluginAndDefaults.unknown; +} From 21aabbde640eb639b648354bf4300e675f31116a Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sat, 3 Apr 2021 14:49:52 -0700 Subject: [PATCH 2/3] ci(test): validate typescript, run lint only once --- .github/workflows/test.yml | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8d7d3df9f..b83fd2bb1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,8 +7,9 @@ name: Test types: - opened - synchronize + jobs: - test: + test_matrix: runs-on: ubuntu-latest strategy: matrix: @@ -16,11 +17,27 @@ jobs: - 10 - 12 - 14 + steps: - uses: actions/checkout@v2 - - name: "Use Node.js ${{ matrix.node_version }}" + - name: Use Node.js ${{ matrix.node_version }} uses: actions/setup-node@v2 with: - node-version: "${{ matrix.node_version }}" + node-version: ${{ matrix.node_version }} + - uses: actions/cache@v1 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + - run: npm ci + - run: npm test --ignore-scripts # run lint only once + + test: + runs-on: ubuntu-latest + needs: test_matrix + steps: + - uses: actions/checkout@v2 - run: npm ci - - run: npm test + - run: npm run lint + - run: npm run test:typescript From f22dfffbadc24d738a8abf21f94a47d30c5e045e Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Sat, 3 Apr 2021 14:55:41 -0700 Subject: [PATCH 3/3] fix(typescript): do not permit unknown keys on `octokit` instance --- src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 6cc798801..8ca8b1da1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -45,7 +45,7 @@ export class Octokit { } }; - return OctokitWithDefaults; + return OctokitWithDefaults as typeof this; } static plugins: OctokitPlugin[] = []; @@ -66,7 +66,7 @@ export class Octokit { ); }; - return NewOctokit as typeof NewOctokit & + return NewOctokit as typeof this & Constructor>>; }