From 29373633bc540ff1e7bfe8fb3e5c5b391e79c2d9 Mon Sep 17 00:00:00 2001 From: Filip Skokan Date: Thu, 26 Nov 2020 18:53:01 +0100 Subject: [PATCH] fix(typescript): refactored how types are published resolves #119 --- .github/workflows/test.yml | 1 + package.json | 15 ++++++++------- src/jwk/embedded.ts | 2 +- src/jwk/parse.ts | 2 +- src/jwt/encrypt.ts | 2 +- src/jwt/sign.ts | 2 +- src/jwt/unsecured.ts | 2 +- src/runtime/aesgcmkw.d.ts | 3 --- src/runtime/aeskw.d.ts | 3 --- src/runtime/base64url.d.ts | 3 --- src/runtime/browser/base64url.ts | 5 ++--- src/runtime/browser/random.ts | 3 +-- src/runtime/decrypt.d.ts | 3 --- src/runtime/digest.d.ts | 3 --- src/runtime/ecdhes.d.ts | 12 ------------ src/runtime/encrypt.d.ts | 3 --- src/runtime/fetch.d.ts | 3 --- src/runtime/generate.d.ts | 14 -------------- src/runtime/interfaces.d.ts | 19 ------------------- src/runtime/jwk_to_key.d.ts | 3 --- src/runtime/key_to_jwk.d.ts | 3 --- src/runtime/node/base64url.ts | 5 ++--- src/runtime/node/random.ts | 5 +---- src/runtime/pbes2kw.d.ts | 3 --- src/runtime/random.d.ts | 3 --- src/runtime/rsaes.d.ts | 3 --- src/runtime/sign.d.ts | 3 --- src/runtime/verify.d.ts | 3 --- src/runtime/zlib.d.ts | 3 --- src/util/base64url.ts | 24 +++++++++++++++++++++++- src/util/random.ts | 7 ++++++- tsconfig/types.json | 10 ++++++++++ 32 files changed, 59 insertions(+), 116 deletions(-) delete mode 100644 src/runtime/aesgcmkw.d.ts delete mode 100644 src/runtime/aeskw.d.ts delete mode 100644 src/runtime/base64url.d.ts delete mode 100644 src/runtime/decrypt.d.ts delete mode 100644 src/runtime/digest.d.ts delete mode 100644 src/runtime/ecdhes.d.ts delete mode 100644 src/runtime/encrypt.d.ts delete mode 100644 src/runtime/fetch.d.ts delete mode 100644 src/runtime/generate.d.ts delete mode 100644 src/runtime/jwk_to_key.d.ts delete mode 100644 src/runtime/key_to_jwk.d.ts delete mode 100644 src/runtime/pbes2kw.d.ts delete mode 100644 src/runtime/random.d.ts delete mode 100644 src/runtime/rsaes.d.ts delete mode 100644 src/runtime/sign.d.ts delete mode 100644 src/runtime/verify.d.ts delete mode 100644 src/runtime/zlib.d.ts create mode 100644 tsconfig/types.json diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2a418d0d01..6db277360d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -41,6 +41,7 @@ jobs: path: dist key: dist-${{ hashFiles('src/**/*.ts') }}-${{ hashFiles('tsconfig/*.json') }} - run: sed -i -e "s/-i ''/-i/g" package.json + - run: sed -i -e "s/gcp/cp/g" package.json - name: Build run: npm run build-all if: ${{ steps.dist.outputs.cache-hit != 'true' }} diff --git a/package.json b/package.json index c952744163..a72a26e50e 100644 --- a/package.json +++ b/package.json @@ -265,11 +265,11 @@ "files": [ "dist/**/package.json", "dist/**/*.js", - "src/**/*.d.ts", - "src/**/*.ts", - "!src/runtime/*/*.ts", - "!src/runtime/*.ts", - "src/runtime/*.d.ts" + "dist/types/**/*.d.ts", + "!dist/types/**/*.i.d.ts", + "!dist/types/runtime*", + "!dist/types/lib*", + "dist/types/lib/jwt_producer.d.ts" ], "scripts": { "build": "tsc", @@ -281,6 +281,7 @@ "build-fast:node-webcrypto-cjs": "npm run-script runtime-node-webcrypto && npm run-script -s esbuild-find | xargs -0 esbuild --platform=node --target=esnext --outdir=dist/node/webcrypto/cjs --format=cjs", "build-fast:node-webcrypto-esm": "npm run-script runtime-node-webcrypto && npm run-script -s esbuild-find | xargs -0 esbuild --platform=node --target=esnext --outdir=dist/node/webcrypto/esm --format=esm && echo '{\"type\": \"module\"}'> dist/node/webcrypto/esm/package.json", "build:browser": "run-s runtime-browser lint 'build -- -p ./tsconfig/browser.json' && echo '{\"type\": \"module\"}'> dist/browser/package.json", + "build:types": "npm run-script build -- -p ./tsconfig/types.json && cd src && find . -name '*.d.ts' -maxdepth 2 -type f -exec gcp --parents \"{}\" ../dist/types \\; && cd ..", "build:node-cjs": "run-s runtime-node lint 'build -- -p ./tsconfig/node-cjs.json'", "build:node-esm": "run-s runtime-node lint 'build -- -p ./tsconfig/node-esm.json' && echo '{\"type\": \"module\"}'> dist/node/esm/package.json", "build:node-webcrypto-cjs": "run-s runtime-node-webcrypto lint 'build -- -p ./tsconfig/node-webcrypto-cjs.json'", @@ -395,10 +396,10 @@ "typesVersions": { "*": { "webcrypto/*": [ - "./src/*" + "./dist/types/*" ], "*": [ - "./src/*" + "./dist/types/*" ] } } diff --git a/src/jwk/embedded.ts b/src/jwk/embedded.ts index 71dafdc6db..309972a05f 100644 --- a/src/jwk/embedded.ts +++ b/src/jwk/embedded.ts @@ -1,6 +1,6 @@ /* eslint-disable jsdoc/require-param */ import type { KeyObject } from 'crypto' -import { FlattenedJWSInput, JWSHeaderParameters } from '../types.d' +import type { FlattenedJWSInput, JWSHeaderParameters } from '../types.d' import parseJwk from './parse.js' import isObject from '../lib/is_object.js' import { JWSInvalid } from '../util/errors.js' diff --git a/src/jwk/parse.ts b/src/jwk/parse.ts index 52cfc977e2..9201459809 100644 --- a/src/jwk/parse.ts +++ b/src/jwk/parse.ts @@ -2,7 +2,7 @@ import { decode as base64url } from '../runtime/base64url.js' import asKeyObject from '../runtime/jwk_to_key.js' import { JOSENotSupported } from '../util/errors.js' import isObject from '../lib/is_object.js' -import type { JWK, KeyLike } from '../types.js' +import type { JWK, KeyLike } from '../types.d' /** * Converts a JWK to a runtime-specific key representation (KeyLike). Either diff --git a/src/jwt/encrypt.ts b/src/jwt/encrypt.ts index cb1aaed5fe..92e1f9cbe1 100644 --- a/src/jwt/encrypt.ts +++ b/src/jwt/encrypt.ts @@ -1,7 +1,7 @@ /* eslint-disable no-underscore-dangle */ import CompactEncrypt from '../jwe/compact/encrypt.js' -import { +import type { EncryptOptions, JWEHeaderParameters, JWEKeyManagementHeaderParameters, diff --git a/src/jwt/sign.ts b/src/jwt/sign.ts index 5d92cbd542..cdb81cfa48 100644 --- a/src/jwt/sign.ts +++ b/src/jwt/sign.ts @@ -2,7 +2,7 @@ import CompactSign from '../jws/compact/sign.js' import { JWTInvalid } from '../util/errors.js' -import { JWSHeaderParameters, JWTPayload, KeyLike } from '../types.d' +import type { JWSHeaderParameters, JWTPayload, KeyLike } from '../types.d' import { encoder } from '../lib/buffer_utils.js' import ProduceJWT from '../lib/jwt_producer.js' diff --git a/src/jwt/unsecured.ts b/src/jwt/unsecured.ts index 40a51a9f74..d847643a2c 100644 --- a/src/jwt/unsecured.ts +++ b/src/jwt/unsecured.ts @@ -1,6 +1,6 @@ /* eslint-disable no-underscore-dangle */ -import { JWSHeaderParameters, JWTClaimVerificationOptions, JWTPayload } from '../types.d' +import type { JWSHeaderParameters, JWTClaimVerificationOptions, JWTPayload } from '../types.d' import { decoder } from '../lib/buffer_utils.js' import * as base64url from '../runtime/base64url.js' import { JWTInvalid } from '../util/errors.js' diff --git a/src/runtime/aesgcmkw.d.ts b/src/runtime/aesgcmkw.d.ts deleted file mode 100644 index 8d90e3d1ed..0000000000 --- a/src/runtime/aesgcmkw.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { AesGcmKwUnwrapFunction, AesGcmKwWrapFunction } from './interfaces.d' -export declare const wrap: AesGcmKwWrapFunction -export declare const unwrap: AesGcmKwUnwrapFunction diff --git a/src/runtime/aeskw.d.ts b/src/runtime/aeskw.d.ts deleted file mode 100644 index 9d9219e6d5..0000000000 --- a/src/runtime/aeskw.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { AesKwUnwrapFunction, AesKwWrapFunction } from './interfaces.d' -export declare const wrap: AesKwWrapFunction -export declare const unwrap: AesKwUnwrapFunction diff --git a/src/runtime/base64url.d.ts b/src/runtime/base64url.d.ts deleted file mode 100644 index 393dad8b8f..0000000000 --- a/src/runtime/base64url.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { Base64UrlDecode, Base64UrlEncode } from './interfaces.d' -export declare const encode: Base64UrlEncode -export declare const decode: Base64UrlDecode diff --git a/src/runtime/browser/base64url.ts b/src/runtime/browser/base64url.ts index b4b81e7f28..af266311d6 100644 --- a/src/runtime/browser/base64url.ts +++ b/src/runtime/browser/base64url.ts @@ -1,8 +1,7 @@ -import type { Base64UrlDecode, Base64UrlEncode } from '../interfaces.d' import { encoder, decoder } from '../../lib/buffer_utils.js' import globalThis from './global.js' -export const encode: Base64UrlEncode = (input) => { +export const encode = (input: Uint8Array | string) => { let unencoded = input if (typeof unencoded === 'string') { unencoded = encoder.encode(unencoded) @@ -11,7 +10,7 @@ export const encode: Base64UrlEncode = (input) => { return base64string.replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_') } -export const decode: Base64UrlDecode = (input) => { +export const decode = (input: Uint8Array | string) => { let encoded = input if (encoded instanceof Uint8Array) { encoded = decoder.decode(encoded) diff --git a/src/runtime/browser/random.ts b/src/runtime/browser/random.ts index 6eac560909..79339de040 100644 --- a/src/runtime/browser/random.ts +++ b/src/runtime/browser/random.ts @@ -1,6 +1,5 @@ -import type { GetRandomValuesFunction } from '../interfaces.d' import crypto from './webcrypto.js' -const random: GetRandomValuesFunction = crypto.getRandomValues.bind(crypto) +const random = crypto.getRandomValues.bind(crypto) export default random diff --git a/src/runtime/decrypt.d.ts b/src/runtime/decrypt.d.ts deleted file mode 100644 index 95755c82ea..0000000000 --- a/src/runtime/decrypt.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { DecryptFunction } from './interfaces.d' -declare const decrypt: DecryptFunction -export default decrypt diff --git a/src/runtime/digest.d.ts b/src/runtime/digest.d.ts deleted file mode 100644 index 12ca1c2c69..0000000000 --- a/src/runtime/digest.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { DigestFunction } from './interfaces.d' -declare const digest: DigestFunction -export default digest diff --git a/src/runtime/ecdhes.d.ts b/src/runtime/ecdhes.d.ts deleted file mode 100644 index 5612b5dbf2..0000000000 --- a/src/runtime/ecdhes.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { - EcdhAllowedFunction, - EcdhESDeriveKeyFunction, - EphemeralKeyToPublicJwkFunction, - GenerateEpkFunction, - PublicJwkToEphemeralKeyFunction, -} from './interfaces.d' -export declare const deriveKey: EcdhESDeriveKeyFunction -export declare const ephemeralKeyToPublicJWK: EphemeralKeyToPublicJwkFunction -export declare const generateEpk: GenerateEpkFunction -export declare const publicJwkToEphemeralKey: PublicJwkToEphemeralKeyFunction -export declare const ecdhAllowed: EcdhAllowedFunction diff --git a/src/runtime/encrypt.d.ts b/src/runtime/encrypt.d.ts deleted file mode 100644 index a0e4f664ca..0000000000 --- a/src/runtime/encrypt.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { EncryptFunction } from './interfaces.d' -declare const encrypt: EncryptFunction -export default encrypt diff --git a/src/runtime/fetch.d.ts b/src/runtime/fetch.d.ts deleted file mode 100644 index 9f048b761a..0000000000 --- a/src/runtime/fetch.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { FetchFunction } from './interfaces.d' -declare const fetch: FetchFunction -export default fetch diff --git a/src/runtime/generate.d.ts b/src/runtime/generate.d.ts deleted file mode 100644 index 2df80ed3b0..0000000000 --- a/src/runtime/generate.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { KeyObject } from 'crypto' -import type { KeyLike } from '../types.d' -export declare function generateSecret(alg: string): Promise -interface Options { - crv?: string -} -export declare function generateKeyPair( - alg: string, - options?: Options, -): Promise<{ - privateKey: CryptoKey | KeyObject - publicKey: CryptoKey | KeyObject -}> -export {} diff --git a/src/runtime/interfaces.d.ts b/src/runtime/interfaces.d.ts index 10efc2d4c4..baf620f0d8 100644 --- a/src/runtime/interfaces.d.ts +++ b/src/runtime/interfaces.d.ts @@ -1,22 +1,6 @@ import type { JWK, KeyLike } from '../types.d' import type { EpkJwk, AsyncOrSync } from '../types.i.d' -/** - * Utility function to encode a string or Uint8Array as a base64url string. - * - * @param input Value that will be base64url-encoded. - */ -export interface Base64UrlEncode { - (input: Uint8Array | string): string -} -/** - * Utility function to decode a base64url encoded string. - * - * @param input Value that will be base64url-decoded. - */ -export interface Base64UrlDecode { - (input: Uint8Array | string): Uint8Array -} export interface TimingSafeEqual { (a: Uint8Array, b: Uint8Array): boolean } @@ -26,9 +10,6 @@ export interface SignFunction { export interface VerifyFunction { (alg: string, key: any, signature: Uint8Array, data: Uint8Array): Promise } -export interface GetRandomValuesFunction { - (array: Uint8Array): Uint8Array -} export interface ExportCekFunction { (key: any): AsyncOrSync } diff --git a/src/runtime/jwk_to_key.d.ts b/src/runtime/jwk_to_key.d.ts deleted file mode 100644 index 1e1770cbd6..0000000000 --- a/src/runtime/jwk_to_key.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { JWKParseFunction } from './interfaces.d' -declare const parse: JWKParseFunction -export default parse diff --git a/src/runtime/key_to_jwk.d.ts b/src/runtime/key_to_jwk.d.ts deleted file mode 100644 index 6549565236..0000000000 --- a/src/runtime/key_to_jwk.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { JWKConvertFunction } from './interfaces.d' -declare const keyToJWK: JWKConvertFunction -export default keyToJWK diff --git a/src/runtime/node/base64url.ts b/src/runtime/node/base64url.ts index 319cdc2651..e7236b1ee0 100644 --- a/src/runtime/node/base64url.ts +++ b/src/runtime/node/base64url.ts @@ -1,10 +1,9 @@ -import type { Base64UrlDecode, Base64UrlEncode } from '../interfaces.d' import { decoder } from '../../lib/buffer_utils.js' -export const encode: Base64UrlEncode = (input) => +export const encode = (input: Uint8Array | string) => Buffer.from(input).toString('base64').replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_') -export const decode: Base64UrlDecode = (input) => { +export const decode = (input: Uint8Array | string) => { let encoded = input if (encoded instanceof Uint8Array) { encoded = decoder.decode(encoded) diff --git a/src/runtime/node/random.ts b/src/runtime/node/random.ts index e4f9c8852a..3e03b3be2d 100644 --- a/src/runtime/node/random.ts +++ b/src/runtime/node/random.ts @@ -1,6 +1,3 @@ import { randomFillSync } from 'crypto' -import type { GetRandomValuesFunction } from '../interfaces.d' -const random: GetRandomValuesFunction = randomFillSync - -export default random +export default randomFillSync diff --git a/src/runtime/pbes2kw.d.ts b/src/runtime/pbes2kw.d.ts deleted file mode 100644 index eb5a2551e9..0000000000 --- a/src/runtime/pbes2kw.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { Pbes2KWDecryptFunction, Pbes2KWEncryptFunction } from './interfaces.d' -export declare const encrypt: Pbes2KWEncryptFunction -export declare const decrypt: Pbes2KWDecryptFunction diff --git a/src/runtime/random.d.ts b/src/runtime/random.d.ts deleted file mode 100644 index e6e021cc30..0000000000 --- a/src/runtime/random.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { GetRandomValuesFunction } from './interfaces.d' -declare const random: GetRandomValuesFunction -export default random diff --git a/src/runtime/rsaes.d.ts b/src/runtime/rsaes.d.ts deleted file mode 100644 index 9370f902f9..0000000000 --- a/src/runtime/rsaes.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { RsaEsDecryptFunction, RsaEsEncryptFunction } from './interfaces.d' -export declare const encrypt: RsaEsEncryptFunction -export declare const decrypt: RsaEsDecryptFunction diff --git a/src/runtime/sign.d.ts b/src/runtime/sign.d.ts deleted file mode 100644 index 73c9c3ab44..0000000000 --- a/src/runtime/sign.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { SignFunction } from './interfaces.d' -declare const sign: SignFunction -export default sign diff --git a/src/runtime/verify.d.ts b/src/runtime/verify.d.ts deleted file mode 100644 index 0443cd286c..0000000000 --- a/src/runtime/verify.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { VerifyFunction } from './interfaces.d' -declare const verify: VerifyFunction -export default verify diff --git a/src/runtime/zlib.d.ts b/src/runtime/zlib.d.ts deleted file mode 100644 index ea0545657e..0000000000 --- a/src/runtime/zlib.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { InflateFunction, DeflateFunction } from '../types.d' -export declare const inflate: InflateFunction -export declare const deflate: DeflateFunction diff --git a/src/util/base64url.ts b/src/util/base64url.ts index c587ba7db3..318a53e155 100644 --- a/src/util/base64url.ts +++ b/src/util/base64url.ts @@ -1 +1,23 @@ -export * from '../runtime/base64url.js' +/* eslint-disable prefer-destructuring */ + +import * as base64url from '../runtime/base64url.js' + +/** + * Utility function to encode a string or Uint8Array as a base64url string. + * + * @param input Value that will be base64url-encoded. + */ +interface Base64UrlEncode { + (input: Uint8Array | string): string +} +/** + * Utility function to decode a base64url encoded string. + * + * @param input Value that will be base64url-decoded. + */ +interface Base64UrlDecode { + (input: Uint8Array | string): Uint8Array +} + +export const encode: Base64UrlEncode = base64url.encode +export const decode: Base64UrlDecode = base64url.decode diff --git a/src/util/random.ts b/src/util/random.ts index 3c0d72fdde..669e2bf046 100644 --- a/src/util/random.ts +++ b/src/util/random.ts @@ -1,3 +1,8 @@ -import random from '../runtime/random.js' +import runtimeRandom from '../runtime/random.js' +interface GetRandomValuesFunction { + (array: Uint8Array): Uint8Array +} + +const random: GetRandomValuesFunction = runtimeRandom export default random diff --git a/tsconfig/types.json b/tsconfig/types.json new file mode 100644 index 0000000000..ab13cee95d --- /dev/null +++ b/tsconfig/types.json @@ -0,0 +1,10 @@ +{ + "extends": "./base.json", + "compilerOptions": { + "target": "ESNext", + "outDir": "../dist/types", + "removeComments": false, + "declaration": true, + "emitDeclarationOnly": true + } +}