From 0322e0aa8e4ba604506fa36a18290c1d9d3aaa48 Mon Sep 17 00:00:00 2001 From: George Fu Date: Thu, 22 May 2025 10:54:15 -0400 Subject: [PATCH 1/2] chore: fix command retry script --- scripts/retry.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/retry.js b/scripts/retry.js index 0a0064e5bba..c7d7eadbe29 100644 --- a/scripts/retry.js +++ b/scripts/retry.js @@ -15,11 +15,13 @@ const [command, ...args] = process.argv.slice(process.argv.indexOf("--") + 1); stdio: "inherit", cwd: path.join(__dirname, ".."), }); - break; + return; } catch (e) { console.error("Command exited non-zero:", command, ...args); console.error(e); console.log(`Starting attempt: ${attempt}`); } } + + process.exit(1); })(); From 977e4454304a046443d7b9577967c56d64e7df34 Mon Sep 17 00:00:00 2001 From: George Fu Date: Thu, 22 May 2025 12:11:56 -0400 Subject: [PATCH 2/2] chore: test typefixes and update to integ test model --- .changeset/rare-dancers-sparkle.md | 2 + Makefile | 15 +++++++ package.json | 4 +- .../src/regionConfig/isFipsRegion.spec.ts | 2 +- .../regionConfig/resolveRegionConfig.spec.ts | 4 +- .../src/regionInfo/getRegionInfo.spec.ts | 4 +- .../regionInfo/getResolvedPartition.spec.ts | 2 +- .../core/src/submodules/cbor/cbor.spec.ts | 3 +- .../schemaDeserializationMiddleware.spec.ts | 2 +- .../schemaSerializationMiddleware.spec.ts | 2 +- .../src/remoteProvider/httpRequest.spec.ts | 13 +++--- .../utils/getInstanceMetadataEndpoint.spec.ts | 2 +- .../src/utils/staticStabilityProvider.spec.ts | 2 +- packages/hash-blob-browser/src/index.spec.ts | 2 +- .../src/readableStreamHasher.spec.ts | 6 +-- .../src/compressStream.browser.spec.ts | 1 + .../src/compressStream.spec.ts | 2 +- .../src/compressString.browser.spec.ts | 10 ++--- .../src/compressString.spec.ts | 2 +- .../src/compressionMiddleware.spec.ts | 6 +-- .../src/getCompressionPlugin.spec.ts | 2 +- .../src/AdaptiveRetryStrategy.spec.ts | 6 +-- .../src/configLoader.spec.ts | 10 ++--- .../src/fromSharedConfigFiles.spec.ts | 2 +- .../src/fromStatic.spec.ts | 2 +- .../src/node-http2-handler.spec.ts | 23 +++++----- .../property-provider/src/memoize.spec.ts | 8 ++-- .../src/index.spec.ts | 2 +- .../src/getHomeDir.spec.ts | 8 ++-- .../src/getSSOTokenFilepath.spec.ts | 2 +- .../src/loadSharedConfigFiles.spec.ts | 2 +- .../src/loadSsoSessionData.spec.ts | 2 +- .../src/slurpFile.spec.ts | 2 +- packages/signature-v4/src/SignatureV4.spec.ts | 7 +-- .../src/getCanonicalHeaders.spec.ts | 4 +- .../src/create-aggregated-client.spec.ts | 2 +- .../emitWarningIfUnsupportedVersion.spec.ts | 2 +- .../smithy-client/src/object-mapping.spec.ts | 44 +++++++++---------- .../src/booleanSelector.spec.ts | 6 +-- .../src/numberSelector.spec.ts | 6 +-- .../src/resolveEndpoint.spec.ts | 2 +- .../src/utils/callFunction.spec.ts | 4 +- .../src/utils/evaluateCondition.spec.ts | 2 +- .../src/utils/evaluateConditions.spec.ts | 4 +- .../src/utils/evaluateTreeRule.spec.ts | 2 +- .../src/utils/getEndpointHeaders.spec.ts | 2 +- .../src/AdaptiveRetryStrategy.spec.ts | 2 +- .../src/StandardRetryStrategy.spec.ts | 36 +++++++++++++++ .../model/weather/main.smithy | 23 +++++++--- tsconfig.test.json | 15 +++++++ vitest.config.browser.ts | 9 ++++ 51 files changed, 211 insertions(+), 118 deletions(-) create mode 100644 .changeset/rare-dancers-sparkle.md create mode 100644 tsconfig.test.json create mode 100644 vitest.config.browser.ts diff --git a/.changeset/rare-dancers-sparkle.md b/.changeset/rare-dancers-sparkle.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/rare-dancers-sparkle.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/Makefile b/Makefile index ad3cd778f9a..7a64c3434f6 100644 --- a/Makefile +++ b/Makefile @@ -18,6 +18,21 @@ generate-protocol-tests: test-protocols: (cd ./private/smithy-rpcv2-cbor && npx vitest run --globals) +test-unit: + yarn g:vitest run -c vitest.config.ts + +test-browser: + yarn g:vitest run -c vitest.config.browser.ts + +# typecheck for test code. +test-types: + npx tsc -p tsconfig.test.json + +test-integration: + make test-browser + yarn g:vitest run -c vitest.config.integ.ts + make test-types + turbo-clean: @read -p "Are you sure you want to delete your local cache? [y/N]: " ans && [ $${ans:-N} = y ] @echo "\nDeleted cache folders: \n--------" diff --git a/package.json b/package.json index 6be68653f5a..439076036fd 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,8 @@ "scripts": { "clean": "turbo run clean --force --parallel", "build": "turbo run build", - "test": "turbo run test", - "test:integration": "yarn build-test-packages && turbo run test:integration", + "test": "make test-unit", + "test:integration": "yarn build-test-packages && make test-integration", "test:protocols": "make generate-protocol-tests test-protocols", "lint": "turbo run lint", "lint-fix": "turbo run lint -- --fix", diff --git a/packages/config-resolver/src/regionConfig/isFipsRegion.spec.ts b/packages/config-resolver/src/regionConfig/isFipsRegion.spec.ts index 165ae8130b9..a3104707fc5 100644 --- a/packages/config-resolver/src/regionConfig/isFipsRegion.spec.ts +++ b/packages/config-resolver/src/regionConfig/isFipsRegion.spec.ts @@ -12,6 +12,6 @@ describe(isFipsRegion.name, () => { }); it.each([undefined, null])("returns false for %s", (input) => { - expect(isFipsRegion(input)).toEqual(false); + expect(isFipsRegion(input as any)).toEqual(false); }); }); diff --git a/packages/config-resolver/src/regionConfig/resolveRegionConfig.spec.ts b/packages/config-resolver/src/regionConfig/resolveRegionConfig.spec.ts index 6b8ce06efc5..610c4afb5a1 100644 --- a/packages/config-resolver/src/regionConfig/resolveRegionConfig.spec.ts +++ b/packages/config-resolver/src/regionConfig/resolveRegionConfig.spec.ts @@ -54,8 +54,8 @@ describe("RegionConfig", () => { }); describe("useFipsEndpoint", () => { - let mockRegionProvider; - let mockUseFipsEndpoint; + let mockRegionProvider: () => Promise; + let mockUseFipsEndpoint: () => Promise; beforeEach(() => { mockRegionProvider = vi.fn().mockResolvedValueOnce(Promise.resolve(mockRegion)); diff --git a/packages/config-resolver/src/regionInfo/getRegionInfo.spec.ts b/packages/config-resolver/src/regionInfo/getRegionInfo.spec.ts index 7dd84b6ad1d..7181bca07a7 100644 --- a/packages/config-resolver/src/regionInfo/getRegionInfo.spec.ts +++ b/packages/config-resolver/src/regionInfo/getRegionInfo.spec.ts @@ -56,9 +56,9 @@ describe(getRegionInfo.name, () => { const getMockResolvedRegion = (regionCase: RegionCase): string => regionCase !== RegionCase.ENDPOINT ? mockRegion : mockEndpointRegion; - const getMockResolvedPartitionOptions = (partitionHash) => ({ partitionHash }); + const getMockResolvedPartitionOptions = (partitionHash: PartitionHash) => ({ partitionHash }); - const getMockRegionInfoOptions = (regionHash, getResolvedPartitionOptions) => ({ + const getMockRegionInfoOptions = (regionHash: RegionHash, getResolvedPartitionOptions: any) => ({ ...getResolvedPartitionOptions, signingService: mockSigningService, regionHash, diff --git a/packages/config-resolver/src/regionInfo/getResolvedPartition.spec.ts b/packages/config-resolver/src/regionInfo/getResolvedPartition.spec.ts index 080cac64db9..7f02e4b48ef 100644 --- a/packages/config-resolver/src/regionInfo/getResolvedPartition.spec.ts +++ b/packages/config-resolver/src/regionInfo/getResolvedPartition.spec.ts @@ -32,6 +32,6 @@ describe(getResolvedPartition.name, () => { }); it("returns aws if partitionHash is empty", () => { - expect(getResolvedPartition(mockRegion, { partitionHash: undefined })).toBe("aws"); + expect(getResolvedPartition(mockRegion, { partitionHash: undefined as any })).toBe("aws"); }); }); diff --git a/packages/core/src/submodules/cbor/cbor.spec.ts b/packages/core/src/submodules/cbor/cbor.spec.ts index 09a59b652c2..2c736242ea6 100644 --- a/packages/core/src/submodules/cbor/cbor.spec.ts +++ b/packages/core/src/submodules/cbor/cbor.spec.ts @@ -1,4 +1,5 @@ import * as fs from "fs"; +// @ts-ignore import JSONbig from "json-bigint"; import * as path from "path"; import { describe, expect, test as it } from "vitest"; @@ -290,7 +291,7 @@ describe("cbor", () => { return scalar * sum * exponentScalar; } - function translateTestData(data: any) { + function translateTestData(data: any): any { const [type, value] = Object.entries(data)[0] as [string, any]; switch (type) { case "null": diff --git a/packages/core/src/submodules/schema/middleware/schemaDeserializationMiddleware.spec.ts b/packages/core/src/submodules/schema/middleware/schemaDeserializationMiddleware.spec.ts index 73fe5a54cb5..47e16f65931 100644 --- a/packages/core/src/submodules/schema/middleware/schemaDeserializationMiddleware.spec.ts +++ b/packages/core/src/submodules/schema/middleware/schemaDeserializationMiddleware.spec.ts @@ -85,7 +85,7 @@ describe(schemaDeserializationMiddleware.name, () => { expect(mockNext).toHaveBeenCalledWith(mockArgs); expect(mockDeserializer).toHaveBeenCalledTimes(1); expect(mockDeserializer).toHaveBeenCalledWith( - undefined as SchemaRef, + undefined as any as SchemaRef, { ...mockOptions, __smithy_context: {}, diff --git a/packages/core/src/submodules/schema/middleware/schemaSerializationMiddleware.spec.ts b/packages/core/src/submodules/schema/middleware/schemaSerializationMiddleware.spec.ts index dd91eb33ce0..8ea05e91f72 100644 --- a/packages/core/src/submodules/schema/middleware/schemaSerializationMiddleware.spec.ts +++ b/packages/core/src/submodules/schema/middleware/schemaSerializationMiddleware.spec.ts @@ -59,7 +59,7 @@ describe(schemaSerializationMiddleware.name, () => { await expect(schemaSerializationMiddleware(mockOptions)(mockNext, {})(mockArgs)).resolves.toStrictEqual(mockReturn); expect(mockSerializer).toHaveBeenCalledTimes(1); - expect(mockSerializer).toHaveBeenCalledWith(undefined as SchemaRef, mockArgs.input, { + expect(mockSerializer).toHaveBeenCalledWith(undefined as unknown as SchemaRef, mockArgs.input, { ...mockOptions, __smithy_context: {}, }); diff --git a/packages/credential-provider-imds/src/remoteProvider/httpRequest.spec.ts b/packages/credential-provider-imds/src/remoteProvider/httpRequest.spec.ts index 3ef01c315a5..eb5e4fc5d87 100644 --- a/packages/credential-provider-imds/src/remoteProvider/httpRequest.spec.ts +++ b/packages/credential-provider-imds/src/remoteProvider/httpRequest.spec.ts @@ -20,7 +20,6 @@ import EventEmitter from "events"; import { request } from "http"; describe("httpRequest", () => { - let port: number; const hostname = "localhost"; const path = "/"; @@ -53,7 +52,7 @@ describe("httpRequest", () => { mockResponse({ expectedResponse }); - const response = await httpRequest({ hostname, path, port }); + const response = await httpRequest({ hostname, path }); expect(response.toString()).toStrictEqual(expectedResponse); }); @@ -62,7 +61,7 @@ describe("httpRequest", () => { const expectedResponse = "expectedResponse"; mockResponse({ expectedResponse }); - const response = await httpRequest({ hostname, path, port, method }); + const response = await httpRequest({ hostname, path, method }); expect(response.toString()).toStrictEqual(expectedResponse); }); @@ -71,7 +70,7 @@ describe("httpRequest", () => { const encapsulatedIPv6Hostname = "[::1]"; mockResponse({ expectedResponse }); - const response = await httpRequest({ hostname: encapsulatedIPv6Hostname, path, port }); + const response = await httpRequest({ hostname: encapsulatedIPv6Hostname, path }); expect(response.toString()).toStrictEqual(expectedResponse); }); }); @@ -84,7 +83,7 @@ describe("httpRequest", () => { expectedResponse: "continue", }); - await expect(httpRequest({ hostname, path, port })).rejects.toStrictEqual( + await expect(httpRequest({ hostname, path })).rejects.toStrictEqual( Object.assign(new ProviderError("Error response received from instance metadata service"), { statusCode }) ); }); @@ -102,7 +101,7 @@ describe("httpRequest", () => { return request; }) as any); - await expect(httpRequest({ hostname, path, port })).rejects.toStrictEqual( + await expect(httpRequest({ hostname, path })).rejects.toStrictEqual( new ProviderError("Unable to connect to instance metadata service") ); }); @@ -131,7 +130,7 @@ describe("httpRequest", () => { return request; }) as any); - await expect(httpRequest({ hostname, path, port, timeout })).rejects.toStrictEqual( + await expect(httpRequest({ hostname, path, timeout })).rejects.toStrictEqual( new ProviderError("TimeoutError from instance metadata service") ); }); diff --git a/packages/credential-provider-imds/src/utils/getInstanceMetadataEndpoint.spec.ts b/packages/credential-provider-imds/src/utils/getInstanceMetadataEndpoint.spec.ts index b0ec2f76719..652234a63bf 100644 --- a/packages/credential-provider-imds/src/utils/getInstanceMetadataEndpoint.spec.ts +++ b/packages/credential-provider-imds/src/utils/getInstanceMetadataEndpoint.spec.ts @@ -13,7 +13,7 @@ vi.mock("@smithy/url-parser"); describe(getInstanceMetadataEndpoint.name, () => { let mockURL: string; - const mockEndpoint = { protocol: "http:", hostname: "localhost", port: "80" }; + const mockEndpoint = { protocol: "http:", hostname: "localhost", port: 80, path: "" }; beforeEach(() => { vi.mocked(parseUrl).mockReturnValue(mockEndpoint); diff --git a/packages/credential-provider-imds/src/utils/staticStabilityProvider.spec.ts b/packages/credential-provider-imds/src/utils/staticStabilityProvider.spec.ts index 58188b250ba..27be18a9e8e 100644 --- a/packages/credential-provider-imds/src/utils/staticStabilityProvider.spec.ts +++ b/packages/credential-provider-imds/src/utils/staticStabilityProvider.spec.ts @@ -24,7 +24,7 @@ describe("staticStabilityProvider", () => { return { ...input, expiration: `Extending expiration count: ${extensionCount}`, - }; + } as any; }; })() ); diff --git a/packages/hash-blob-browser/src/index.spec.ts b/packages/hash-blob-browser/src/index.spec.ts index ea6e80f2fc7..5995ebfb438 100644 --- a/packages/hash-blob-browser/src/index.spec.ts +++ b/packages/hash-blob-browser/src/index.spec.ts @@ -7,7 +7,7 @@ describe("blobHasher", () => { const blob = new Blob(["test-string"]); class Hash { - public value: string; + public value: string = ""; update(value: string) { this.value = value; } diff --git a/packages/hash-stream-node/src/readableStreamHasher.spec.ts b/packages/hash-stream-node/src/readableStreamHasher.spec.ts index aad64a8550f..219c32f1295 100644 --- a/packages/hash-stream-node/src/readableStreamHasher.spec.ts +++ b/packages/hash-stream-node/src/readableStreamHasher.spec.ts @@ -22,8 +22,8 @@ describe(readableStreamHasher.name, () => { class MockHashCalculator extends Writable { constructor( public readonly hash: Hash, - public readonly mockWrite, - public readonly mockEnd + public readonly mockWrite: any, + public readonly mockEnd: any ) { super(); } @@ -41,7 +41,7 @@ describe(readableStreamHasher.name, () => { beforeEach(() => { (HashCalculator as unknown as any).mockImplementation( - (hash) => new MockHashCalculator(hash, mockHashCalculatorWrite, mockHashCalculatorEnd) + (hash: Hash) => new MockHashCalculator(hash, mockHashCalculatorWrite, mockHashCalculatorEnd) ); mockDigest.mockResolvedValue(mockHash); }); diff --git a/packages/middleware-compression/src/compressStream.browser.spec.ts b/packages/middleware-compression/src/compressStream.browser.spec.ts index aca381e9d95..73f35b001fb 100644 --- a/packages/middleware-compression/src/compressStream.browser.spec.ts +++ b/packages/middleware-compression/src/compressStream.browser.spec.ts @@ -16,6 +16,7 @@ describe(compressStream.name, () => { const data = typeof chunk === "string" ? [chunk, compressionSuffix].join(compressionSeparator) : null; asyncGzip.ondata(undefined, data, final); }), + terminate() {} }; beforeEach(() => { diff --git a/packages/middleware-compression/src/compressStream.spec.ts b/packages/middleware-compression/src/compressStream.spec.ts index e9e9e02c06f..2df87215b97 100644 --- a/packages/middleware-compression/src/compressStream.spec.ts +++ b/packages/middleware-compression/src/compressStream.spec.ts @@ -20,7 +20,7 @@ describe(compressStream.name, () => { const testOutputStream = Readable.from(getGenerator(["input", "gzipped"])()); beforeEach(() => { - (vi.mocked(createGzip)).mockReturnValue(mockGzipFn); + (vi.mocked(createGzip)).mockReturnValue(mockGzipFn as any); testInputStream.pipe = vi.fn().mockReturnValue(testOutputStream); }); diff --git a/packages/middleware-compression/src/compressString.browser.spec.ts b/packages/middleware-compression/src/compressString.browser.spec.ts index 92b1ae1f22e..9d0e3125d29 100644 --- a/packages/middleware-compression/src/compressString.browser.spec.ts +++ b/packages/middleware-compression/src/compressString.browser.spec.ts @@ -14,7 +14,7 @@ describe(compressString.name, () => { const compressionSeparator = "."; beforeEach(() => { - (vi.mocked(toUint8Array)).mockImplementation((data) => data); + vi.mocked(toUint8Array).mockImplementation((data) => data as any); }); afterEach(() => { @@ -22,9 +22,9 @@ describe(compressString.name, () => { }); it("should compress data with gzip", async () => { - (vi.mocked(gzip)).mockImplementation((data, callback) => { + vi.mocked(gzip).mockImplementation(((data: any, callback: any) => { callback(null, [data, compressionSuffix].join(compressionSeparator)); - }); + }) as any); const receivedOutput = await compressString(testData); const expectedOutput = [testData, compressionSuffix].join(compressionSeparator); @@ -38,9 +38,9 @@ describe(compressString.name, () => { it("should throw an error if compression fails", async () => { const compressionErrorMsg = "compression error message"; const compressionError = new Error(compressionErrorMsg); - (vi.mocked(gzip)).mockImplementation((data, callback) => { + vi.mocked(gzip).mockImplementation(((data: any, callback: any) => { callback(compressionError); - }); + }) as any); await expect(compressString(testData)).rejects.toThrow( new Error("Failure during compression: " + compressionErrorMsg) diff --git a/packages/middleware-compression/src/compressString.spec.ts b/packages/middleware-compression/src/compressString.spec.ts index bdfe8838a6e..f1a8f090393 100644 --- a/packages/middleware-compression/src/compressString.spec.ts +++ b/packages/middleware-compression/src/compressString.spec.ts @@ -18,7 +18,7 @@ describe(compressString.name, () => { const testData = "test"; beforeEach(() => { - (vi.mocked(toUint8Array)).mockImplementation((data) => data); + (vi.mocked(toUint8Array)).mockImplementation((data: any) => data); }); afterEach(() => { diff --git a/packages/middleware-compression/src/compressionMiddleware.spec.ts b/packages/middleware-compression/src/compressionMiddleware.spec.ts index 99f925f1163..8c207ebc29a 100644 --- a/packages/middleware-compression/src/compressionMiddleware.spec.ts +++ b/packages/middleware-compression/src/compressionMiddleware.spec.ts @@ -83,7 +83,7 @@ describe(compressionMiddleware.name, () => { }); it("compresses streaming blob", async () => { - const mockCompressedStream = "compressed-stream"; + const mockCompressedStream = "compressed-stream" as any; (vi.mocked(compressStream)).mockResolvedValueOnce(mockCompressedStream); await compressionMiddleware(mockConfig, mockMiddlewareConfig)(mockNext, mockContext)({ ...mockArgs } as any); @@ -120,7 +120,7 @@ describe(compressionMiddleware.name, () => { }); it("compresses body", async () => { - const mockCompressedBody = "compressed-body"; + const mockCompressedBody = "compressed-body" as any; (vi.mocked(compressString)).mockResolvedValueOnce(mockCompressedBody); await compressionMiddleware(mockConfig, mockMiddlewareConfig)(mockNext, mockContext)({ ...mockArgs } as any); @@ -141,7 +141,7 @@ describe(compressionMiddleware.name, () => { }); it("appends algorithm to existing Content-Encoding header", async () => { - const mockCompressedBody = "compressed-body"; + const mockCompressedBody = "compressed-body" as any; (vi.mocked(compressString)).mockResolvedValueOnce(mockCompressedBody); const mockExistingContentEncoding = "deflate"; diff --git a/packages/middleware-compression/src/getCompressionPlugin.spec.ts b/packages/middleware-compression/src/getCompressionPlugin.spec.ts index b1c3f04b192..95572933ab5 100644 --- a/packages/middleware-compression/src/getCompressionPlugin.spec.ts +++ b/packages/middleware-compression/src/getCompressionPlugin.spec.ts @@ -14,7 +14,7 @@ describe(getCompressionPlugin.name, () => { const middlewareConfig = { encodings: [] }; it("applyToStack adds compressionMiddleware", () => { - const middlewareReturn = {}; + const middlewareReturn = {} as any; (vi.mocked(compressionMiddleware)).mockReturnValueOnce(middlewareReturn); const plugin = getCompressionPlugin(config, middlewareConfig); diff --git a/packages/middleware-retry/src/AdaptiveRetryStrategy.spec.ts b/packages/middleware-retry/src/AdaptiveRetryStrategy.spec.ts index 0e0a7e94ed9..8320881788c 100644 --- a/packages/middleware-retry/src/AdaptiveRetryStrategy.spec.ts +++ b/packages/middleware-retry/src/AdaptiveRetryStrategy.spec.ts @@ -13,7 +13,7 @@ describe(AdaptiveRetryStrategy.name, () => { const mockDefaultRateLimiter = { getSendToken: vi.fn(), updateClientSendingRate: vi.fn(), - }; + } as any; beforeEach(() => { vi.mocked(DefaultRateLimiter).mockReturnValue(mockDefaultRateLimiter); @@ -85,13 +85,13 @@ describe(AdaptiveRetryStrategy.name, () => { it("calls rateLimiter.getSendToken in beforeRequest", async () => { expect(mockDefaultRateLimiter.getSendToken).toHaveBeenCalledTimes(0); - await mockedSuperRetry.mock.calls[0][2].beforeRequest(); + await mockedSuperRetry.mock.calls[0][2]!.beforeRequest(); expect(mockDefaultRateLimiter.getSendToken).toHaveBeenCalledTimes(1); }); it("calls rateLimiter.updateClientSendingRate in afterRequest", async () => { expect(mockDefaultRateLimiter.updateClientSendingRate).toHaveBeenCalledTimes(0); - await mockedSuperRetry.mock.calls[0][2].afterRequest(); + await mockedSuperRetry.mock.calls[0][2]!.afterRequest(); expect(mockDefaultRateLimiter.updateClientSendingRate).toHaveBeenCalledTimes(1); }); }); diff --git a/packages/node-config-provider/src/configLoader.spec.ts b/packages/node-config-provider/src/configLoader.spec.ts index 4ca14edc3ab..e37a112297d 100644 --- a/packages/node-config-provider/src/configLoader.spec.ts +++ b/packages/node-config-provider/src/configLoader.spec.ts @@ -20,11 +20,11 @@ describe("loadConfig", () => { }); it("passes fromEnv(), fromSharedConfigFiles() and fromStatic() to chain", () => { - const mockFromEnvReturn = "mockFromEnvReturn"; + const mockFromEnvReturn = "mockFromEnvReturn" as any; vi.mocked(fromEnv).mockReturnValueOnce(mockFromEnvReturn); - const mockFromSharedConfigFilesReturn = "mockFromSharedConfigFilesReturn"; + const mockFromSharedConfigFilesReturn = "mockFromSharedConfigFilesReturn" as any; vi.mocked(fromSharedConfigFiles).mockReturnValueOnce(mockFromSharedConfigFilesReturn); - const mockFromStatic = "mockFromStatic"; + const mockFromStatic = "mockFromStatic" as any; vi.mocked(fromStatic).mockReturnValueOnce(mockFromStatic); // Using Record instead of NodeJS.ProcessEnv, in order to not get type errors in non node environments const envVarSelector = (env: Record) => env["AWS_CONFIG_FOO"]; @@ -49,7 +49,7 @@ describe("loadConfig", () => { }); it("passes output of chain to memoize", () => { - const mockChainReturn = "mockChainReturn"; + const mockChainReturn = "mockChainReturn" as any; vi.mocked(chain).mockReturnValueOnce(mockChainReturn); loadConfig({} as any); expect(chain).toHaveBeenCalledTimes(1); @@ -58,7 +58,7 @@ describe("loadConfig", () => { }); it("returns output memoize", () => { - const mockMemoizeReturn = "mockMemoizeReturn"; + const mockMemoizeReturn = "mockMemoizeReturn" as any; vi.mocked(memoize).mockReturnValueOnce(mockMemoizeReturn); expect(loadConfig({} as any)).toEqual(mockMemoizeReturn); }); diff --git a/packages/node-config-provider/src/fromSharedConfigFiles.spec.ts b/packages/node-config-provider/src/fromSharedConfigFiles.spec.ts index fa8dffc36df..72c257f72ef 100644 --- a/packages/node-config-provider/src/fromSharedConfigFiles.spec.ts +++ b/packages/node-config-provider/src/fromSharedConfigFiles.spec.ts @@ -165,7 +165,7 @@ describe("fromSharedConfigFiles", () => { it.each(["foo", "default"])("returns config value from %s profile", (profile) => { vi.mocked(getProfileName).mockReturnValueOnce(profile); return expect(fromSharedConfigFiles(configGetter)()).resolves.toBe( - loadedConfigData.configFile[profile][CONFIG_KEY] + (loadedConfigData.configFile as Record)[profile][CONFIG_KEY] ); }); }); diff --git a/packages/node-config-provider/src/fromStatic.spec.ts b/packages/node-config-provider/src/fromStatic.spec.ts index edf840501ae..e70036d8798 100644 --- a/packages/node-config-provider/src/fromStatic.spec.ts +++ b/packages/node-config-provider/src/fromStatic.spec.ts @@ -8,7 +8,7 @@ vi.mock("@smithy/property-provider", () => ({ })); describe("fromStatic", () => { - const value = "default"; + const value = "default" as any; it("should convert static values to provider", async () => { vi.mocked(convertToProvider).mockReturnValue(value); fromStatic(value); diff --git a/packages/node-http-handler/src/node-http2-handler.spec.ts b/packages/node-http-handler/src/node-http2-handler.spec.ts index 654004037da..f8f680ed764 100644 --- a/packages/node-http-handler/src/node-http2-handler.spec.ts +++ b/packages/node-http-handler/src/node-http2-handler.spec.ts @@ -1,8 +1,9 @@ import { AbortController } from "@smithy/abort-controller"; import { HttpRequest, HttpResponse } from "@smithy/protocol-http"; +import { Mutable } from "@smithy/types"; import { rejects } from "assert"; import getPort, { portNumbers } from "get-port"; -import http2, { ClientHttp2Session, ClientHttp2Stream, constants, Http2Server, Http2Stream } from "http2"; +import http2, { ClientHttp2Session, ClientHttp2Stream, constants, Http2Server, Http2Session, Http2Stream } from "http2"; import { Duplex } from "stream"; import { promisify } from "util"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; @@ -23,7 +24,7 @@ describe(NodeHttp2Handler.name, () => { let port4: number = 0; let mockH2Server: any = undefined; - const mockH2Servers: Record = {}; + const mockH2Servers: Record = {}; let authority: string; const getMockReqOptions = () => ({ @@ -244,7 +245,7 @@ describe(NodeHttp2Handler.name, () => { // ...and validate that the mocked response is received const responseBody = await new Promise((resolve) => { const buffers: any[] = []; - resultReader.on("data", (chunk) => buffers.push(chunk)); + resultReader.on("data", (chunk: any) => buffers.push(chunk)); resultReader.on("close", () => { resolve(Buffer.concat(buffers).toString("utf8")); }); @@ -260,9 +261,9 @@ describe(NodeHttp2Handler.name, () => { }); it.each([ - ["destroy", 1], - ["close", 2], - ])("handles servers calling connections %s", async (func, portIndex) => { + ["destroy" as keyof Http2Session, 1], + ["close" as keyof Http2Session, 2], + ])("handles servers calling connections %s", async (func: keyof Http2Session, portIndex) => { const port = [port1, port2, port3, port4][portIndex]; const mockH2Server4 = mockH2Servers[port]; let establishedConnections = 0; @@ -270,7 +271,7 @@ describe(NodeHttp2Handler.name, () => { mockH2Server4.on("stream", (request: Http2Stream) => { numRequests += 1; - request.session![func](); + (request.session as any)![func](); }); mockH2Server4.on("connection", () => { establishedConnections += 1; @@ -462,7 +463,7 @@ describe(NodeHttp2Handler.name, () => { ["object provider", async () => ({ sessionTimeout, disableConcurrentStreams: true })], ["static object", { sessionTimeout, disableConcurrentStreams: true }], ])("disableConcurrentStreams: true in constructor parameter of %s", async (_, options) => { - let session; + let session: any; nodeH2Handler = new NodeHttp2Handler(options); @@ -474,9 +475,9 @@ describe(NodeHttp2Handler.name, () => { }); await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); - expect(session.destroyed).toBe(false); + expect(session?.destroyed).toBe(false); await promisify(setTimeout)(sessionTimeout + 100); - expect(session.destroyed).toBe(true); + expect(session?.destroyed).toBe(true); }); }); }); @@ -528,7 +529,7 @@ describe(NodeHttp2Handler.name, () => { const fakeStream = new Duplex() as ClientHttp2Stream; const fakeRstCode = 1; // @ts-ignore: fake result code - fakeStream.rstCode = fakeRstCode; + (fakeStream as Mutable).rstCode = fakeRstCode; vi.spyOn(session, "request").mockImplementation(() => fakeStream); // @ts-ignore: access private property nodeH2Handler.connectionManager.sessionCache.set(authority, new NodeHttp2ConnectionPool([session])); diff --git a/packages/property-provider/src/memoize.spec.ts b/packages/property-provider/src/memoize.spec.ts index 3d6cbb631cd..634c5c7e1cf 100644 --- a/packages/property-provider/src/memoize.spec.ts +++ b/packages/property-provider/src/memoize.spec.ts @@ -1,9 +1,9 @@ -import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; +import { afterEach, beforeEach, describe, expect, Mock, test as it, vi } from "vitest"; import { memoize } from "./memoize"; describe("memoize", () => { - let provider: vi.Mock; + let provider: Mock; const mockReturn = "foo"; const repeatTimes = 10; @@ -70,8 +70,8 @@ describe("memoize", () => { }); describe("refreshing memoization", () => { - let isExpired: vi.Mock; - let requiresRefresh: vi.Mock; + let isExpired: Mock; + let requiresRefresh: Mock; beforeEach(() => { isExpired = vi.fn().mockReturnValue(true); diff --git a/packages/service-error-classification/src/index.spec.ts b/packages/service-error-classification/src/index.spec.ts index b6173f3d9e0..66b9ab9d795 100644 --- a/packages/service-error-classification/src/index.spec.ts +++ b/packages/service-error-classification/src/index.spec.ts @@ -137,7 +137,7 @@ describe("isTransientError", () => { }); it("should limit recursion to 10 depth", () => { - const error = { cause: null } as SdkError; + const error = { cause: null } as unknown as SdkError; error.cause = error; checkForErrorType(isTransientError, { cause: error }, false); }); diff --git a/packages/shared-ini-file-loader/src/getHomeDir.spec.ts b/packages/shared-ini-file-loader/src/getHomeDir.spec.ts index db10b4c8afc..02280232d8e 100644 --- a/packages/shared-ini-file-loader/src/getHomeDir.spec.ts +++ b/packages/shared-ini-file-loader/src/getHomeDir.spec.ts @@ -1,6 +1,6 @@ import { homedir } from "os"; import { sep } from "path"; -import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, test as it, vi } from "vitest"; +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, Mock, test as it, vi } from "vitest"; import { getHomeDir } from "./getHomeDir"; @@ -64,7 +64,7 @@ describe(getHomeDir.name, () => { }); it("returns value from homedir fourth", () => { - const processGeteuidSpy = vi.spyOn(process, "geteuid").mockReturnValue(mockUid); + const processGeteuidSpy = (vi.spyOn(process, "geteuid") as Mock).mockReturnValue(mockUid); process.env = { ...process.env, HOME: undefined, USERPROFILE: undefined, HOMEPATH: undefined }; expect(getHomeDir()).toEqual(mockHomeDir); expect(homedir).toHaveBeenCalledTimes(1); @@ -88,7 +88,7 @@ describe(getHomeDir.name, () => { describe("when geteuid is available", () => { it.each([10, 100, 1000, 10000])("calls: %d ", async (num: number) => { - const processGeteuidSpy = vi.spyOn(process, "geteuid").mockReturnValue(mockUid); + const processGeteuidSpy = (vi.spyOn(process, "geteuid") as Mock).mockReturnValue(mockUid); expect(processGeteuidSpy).not.toHaveBeenCalled(); await testSingleHomeDirCall(num); expect(processGeteuidSpy).toHaveBeenCalledTimes(num); @@ -114,7 +114,7 @@ describe(getHomeDir.name, () => { describe("makes multiple homedir calls with based on UIDs", async () => { it.each([2, 10, 100])("calls: %d ", async (num: number) => { const { getHomeDir } = await import("./getHomeDir"); - const processGeteuidSpy = vi.spyOn(process, "geteuid"); + const processGeteuidSpy = vi.spyOn(process, "geteuid") as Mock; processGeteuidSpy.mockReturnValue(mockUid); for (let i = 0; i < num; i++) { processGeteuidSpy.mockReturnValueOnce(mockUid + i); diff --git a/packages/shared-ini-file-loader/src/getSSOTokenFilepath.spec.ts b/packages/shared-ini-file-loader/src/getSSOTokenFilepath.spec.ts index 2f35d4573c6..c248274a6b4 100644 --- a/packages/shared-ini-file-loader/src/getSSOTokenFilepath.spec.ts +++ b/packages/shared-ini-file-loader/src/getSSOTokenFilepath.spec.ts @@ -16,7 +16,7 @@ describe(getSSOTokenFilepath.name, () => { const mockSsoStartUrl = "mock_sso_start_url"; beforeEach(() => { - vi.mocked(createHash).mockReturnValue({ update: mockUpdate }); + vi.mocked(createHash).mockReturnValue({ update: mockUpdate } as any); vi.mocked(getHomeDir).mockReturnValue(mockHomeDir); }); diff --git a/packages/shared-ini-file-loader/src/loadSharedConfigFiles.spec.ts b/packages/shared-ini-file-loader/src/loadSharedConfigFiles.spec.ts index 20442f16d99..da823ed75fd 100644 --- a/packages/shared-ini-file-loader/src/loadSharedConfigFiles.spec.ts +++ b/packages/shared-ini-file-loader/src/loadSharedConfigFiles.spec.ts @@ -27,7 +27,7 @@ describe("loadSharedConfigFiles", () => { beforeEach(() => { vi.mocked(getConfigFilepath).mockReturnValue(mockConfigFilepath); vi.mocked(getCredentialsFilepath).mockReturnValue(mockCredsFilepath); - vi.mocked(parseIni).mockImplementation((args) => args); + vi.mocked(parseIni).mockImplementation((args: any) => args); vi.mocked(getConfigData).mockImplementation((args) => args); vi.mocked(slurpFile).mockImplementation((path) => Promise.resolve(path)); vi.mocked(getHomeDir).mockReturnValue(mockHomeDir); diff --git a/packages/shared-ini-file-loader/src/loadSsoSessionData.spec.ts b/packages/shared-ini-file-loader/src/loadSsoSessionData.spec.ts index ef3a25f495a..baa0e965454 100644 --- a/packages/shared-ini-file-loader/src/loadSsoSessionData.spec.ts +++ b/packages/shared-ini-file-loader/src/loadSsoSessionData.spec.ts @@ -17,7 +17,7 @@ describe(loadSsoSessionData.name, () => { beforeEach(() => { vi.mocked(getConfigFilepath).mockReturnValue(mockConfigFilepath); - vi.mocked(parseIni).mockImplementation((args) => args); + vi.mocked(parseIni).mockImplementation((args: any) => args); vi.mocked(getSsoSessionData).mockReturnValue(mockSsoSessionData); vi.mocked(slurpFile).mockImplementation((path) => Promise.resolve(path)); }); diff --git a/packages/shared-ini-file-loader/src/slurpFile.spec.ts b/packages/shared-ini-file-loader/src/slurpFile.spec.ts index b2f45bb231e..3b84db07eca 100644 --- a/packages/shared-ini-file-loader/src/slurpFile.spec.ts +++ b/packages/shared-ini-file-loader/src/slurpFile.spec.ts @@ -9,7 +9,7 @@ describe("slurpFile", () => { const getMockFileContents = (path: string, options = UTF8) => JSON.stringify({ path, options }); beforeEach(() => { - (promises.readFile as any).mockImplementation(async (path, options) => { + (promises.readFile as any).mockImplementation(async (path: any, options: any) => { await new Promise((resolve) => setTimeout(resolve, 100)); return getMockFileContents(path, options); }); diff --git a/packages/signature-v4/src/SignatureV4.spec.ts b/packages/signature-v4/src/SignatureV4.spec.ts index 394b5b99e59..3106ddae54a 100644 --- a/packages/signature-v4/src/SignatureV4.spec.ts +++ b/packages/signature-v4/src/SignatureV4.spec.ts @@ -1,7 +1,7 @@ import { Sha256 } from "@aws-crypto/sha256-js"; import { HttpRequest } from "@smithy/protocol-http"; import { AwsCredentialIdentity, SignableMessage, TimestampHeaderValue } from "@smithy/types"; -import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; +import { afterEach, beforeEach, describe, expect, MockInstance, test as it, vi } from "vitest"; import { ALGORITHM_IDENTIFIER, @@ -20,6 +20,7 @@ import { } from "./constants"; import { SignatureV4 } from "./SignatureV4"; import { iso8601 } from "./utilDate"; +import Spy = jasmine.Spy; const signerInit = { service: "foo", @@ -834,11 +835,11 @@ describe("SignatureV4", () => { }); describe("ambient Date usage", () => { - let dateSpy; + let dateSpy: MockInstance; const mockDate = new Date(); beforeEach(() => { - dateSpy = vi.spyOn(global, "Date").mockImplementation(() => mockDate as unknown as string); + dateSpy = vi.spyOn(global, "Date").mockImplementation(() => mockDate as any); }); afterEach(() => { diff --git a/packages/signature-v4/src/getCanonicalHeaders.spec.ts b/packages/signature-v4/src/getCanonicalHeaders.spec.ts index 271b6f7fe66..2c0b1f6e853 100644 --- a/packages/signature-v4/src/getCanonicalHeaders.spec.ts +++ b/packages/signature-v4/src/getCanonicalHeaders.spec.ts @@ -64,8 +64,8 @@ describe("getCanonicalHeaders", () => { path: "/", headers: { ...headers, - foo: undefined, - bar: null, + foo: undefined as any, + bar: null as any, }, hostname: "foo.us-east-1.amazonaws.com", }); diff --git a/packages/smithy-client/src/create-aggregated-client.spec.ts b/packages/smithy-client/src/create-aggregated-client.spec.ts index 6de932fd688..801fa09c930 100644 --- a/packages/smithy-client/src/create-aggregated-client.spec.ts +++ b/packages/smithy-client/src/create-aggregated-client.spec.ts @@ -6,7 +6,7 @@ class BaseClient { send = vi.fn() as any; } class AggregatedClient extends BaseClient { - constructor(commands) { + constructor(commands: Record) { super(); createAggregatedClient(commands, AggregatedClient as any); } diff --git a/packages/smithy-client/src/emitWarningIfUnsupportedVersion.spec.ts b/packages/smithy-client/src/emitWarningIfUnsupportedVersion.spec.ts index 775726ef765..9fce56bf3ba 100644 --- a/packages/smithy-client/src/emitWarningIfUnsupportedVersion.spec.ts +++ b/packages/smithy-client/src/emitWarningIfUnsupportedVersion.spec.ts @@ -1,7 +1,7 @@ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; describe.skip("emitWarningIfUnsupportedVersion", () => { - let emitWarningIfUnsupportedVersion; + let emitWarningIfUnsupportedVersion: any; const emitWarning = process.emitWarning; const supportedVersion = "16.0.0"; diff --git a/packages/smithy-client/src/object-mapping.spec.ts b/packages/smithy-client/src/object-mapping.spec.ts index f6b6044d401..578e7923208 100644 --- a/packages/smithy-client/src/object-mapping.spec.ts +++ b/packages/smithy-client/src/object-mapping.spec.ts @@ -75,9 +75,9 @@ describe("object mapping", () => { k: [[], void 0], l: [{}, void 0], m: [() => true, void 0], - n: [(val) => val === void 0, void 1], + n: [(val: any) => val === void 0, void 1], o: [() => true, () => void 0], - p: [(val) => val !== 1, () => 1], // value is not provided to filter fn when value provider is lazy + p: [(val: any) => val !== 1, () => 1], // value is not provided to filter fn when value provider is lazy q: 0, r: false, s: "", @@ -114,17 +114,17 @@ describe("object mapping", () => { map({ a: [, undefined], b: [, null], - c: [(_) => _ !== "", ""], - d: [(_) => _.length !== 0, []], + c: [(_: any) => _ !== "", ""], + d: [(_: any) => _.length !== 0, []], e: [0, 0], f: [false, false], g: ["", ""], h: [undefined, undefined], i: [null, null], j: [() => false, void 0], - k: [(val) => val !== void 0, void 0], + k: [(val: any) => val !== void 0, void 0], l: [() => false, () => void 0], - m: [(val) => val === 1, () => 1], // value is not provided to filter fn when value provider is lazy + m: [(val: any) => val === 1, () => 1], // value is not provided to filter fn when value provider is lazy n: [, () => undefined], }) ).toEqual({}); @@ -148,14 +148,14 @@ describe("object mapping", () => { filteredDefault: [], supplier: [, () => "x"], filteredSupplier: [, () => "x"], - mapper: [, (_) => _ + "x"], - filteredMapper: [, (_) => _ + "x"], - filter: [(_) => _ === 42], - filteredFilter: [(_) => _ === 42], + mapper: [, (_: any) => _ + "x"], + filteredMapper: [, (_: any) => _ + "x"], + filter: [(_: any) => _ === 42], + filteredFilter: [(_: any) => _ === 42], sourceKey: [, , "SOURCE_KEY"], - sourceKey2: [, (_) => "mapped" + _, "SOURCE_KEY2"], - mapperOnly: (_) => _ + "Only", - filteredMapperOnly: (_) => _ + "Only", + sourceKey2: [, (_: any) => "mapped" + _, "SOURCE_KEY2"], + mapperOnly: (_: any) => _ + "Only", + filteredMapperOnly: (_: any) => _ + "Only", }; expect(take(input, instructions)).toEqual(output); @@ -182,8 +182,8 @@ describe("object mapping", () => { b: [1], c: [false, () => 1], d: [0, () => 1], - e: [(_) => _ == 1], - f: [(_) => _ == 2], + e: [(_: any) => _ == 1], + f: [(_: any) => _ == 2], }; expect(take(input, instructions)).toEqual(output); @@ -220,14 +220,14 @@ describe("object mapping", () => { filteredDefault: [], supplier: [, () => "x"], filteredSupplier: [, () => "x"], - mapper: [, (_) => _ + "x"], - filteredMapper: [, (_) => _ + "x"], - filter: [(_) => _ === 42], - filteredFilter: [(_) => _ === 42], + mapper: [, (_: any) => _ + "x"], + filteredMapper: [, (_: any) => _ + "x"], + filter: [(_: any) => _ === 42], + filteredFilter: [(_: any) => _ === 42], sourceKey: [, , "SOURCE_KEY"], - sourceKey2: [, (_) => "mapped" + _, "SOURCE_KEY2"], - mapperOnly: (_) => _ + "Only", - filteredMapperOnly: (_) => _ + "Only", + sourceKey2: [, (_: any) => "mapped" + _, "SOURCE_KEY2"], + mapperOnly: (_: any) => _ + "Only", + filteredMapperOnly: (_: any) => _ + "Only", }; expect(take(input, instructions)).toEqual(output); diff --git a/packages/util-config-provider/src/booleanSelector.spec.ts b/packages/util-config-provider/src/booleanSelector.spec.ts index 14004b30f9d..2308090e58e 100644 --- a/packages/util-config-provider/src/booleanSelector.spec.ts +++ b/packages/util-config-provider/src/booleanSelector.spec.ts @@ -13,7 +13,7 @@ describe(booleanSelector.name, () => { }); it(`should return undefined if ${key} is not defined`, () => { - expect(booleanSelector(obj, key, SelectorType[selectorKey])).toBeUndefined(); + expect(booleanSelector(obj, key, SelectorType[selectorKey as keyof typeof SelectorType])).toBeUndefined(); }); it.each([ @@ -21,12 +21,12 @@ describe(booleanSelector.name, () => { [false, "false"], ])(`should return boolean %s if ${key}="%s"`, (output, input) => { obj[key] = input; - expect(booleanSelector(obj, key, SelectorType[selectorKey])).toBe(output); + expect(booleanSelector(obj, key, SelectorType[selectorKey as keyof typeof SelectorType])).toBe(output); }); it.each(["0", "1", "yes", "no", undefined, null, void 0, ""])(`should throw if ${key}=%s`, (input) => { obj[key] = input; - expect(() => booleanSelector(obj, key, SelectorType[selectorKey])).toThrow( + expect(() => booleanSelector(obj, key, SelectorType[selectorKey as keyof typeof SelectorType])).toThrow( `Cannot load ${selectorValue} "${key}". Expected "true" or "false", got ${obj[key]}.` ); }); diff --git a/packages/util-config-provider/src/numberSelector.spec.ts b/packages/util-config-provider/src/numberSelector.spec.ts index 48a9e8cbe62..2f62c267614 100644 --- a/packages/util-config-provider/src/numberSelector.spec.ts +++ b/packages/util-config-provider/src/numberSelector.spec.ts @@ -13,7 +13,7 @@ describe(numberSelector.name, () => { }); it(`should return undefined if ${key} is not defined`, () => { - expect(numberSelector(obj, key, SelectorType[selectorKey])).toBeUndefined(); + expect(numberSelector(obj, key, SelectorType[selectorKey as keyof typeof SelectorType])).toBeUndefined(); }); it.each([ @@ -21,12 +21,12 @@ describe(numberSelector.name, () => { [1, "1"], ])(`should return number %s if ${key}="%s"`, (output, input) => { obj[key] = input; - expect(numberSelector(obj, key, SelectorType[selectorKey])).toBe(output); + expect(numberSelector(obj, key, SelectorType[selectorKey as keyof typeof SelectorType])).toBe(output); }); it.each(["yes", "no", undefined, null, void 0, ""])(`should throw if ${key}=%s`, (input) => { obj[key] = input; - expect(() => numberSelector(obj, key, SelectorType[selectorKey])).toThrow( + expect(() => numberSelector(obj, key, SelectorType[selectorKey as keyof typeof SelectorType])).toThrow( new TypeError(`Cannot load ${selectorValue} '${key}'. Expected number, got '${obj[key]}'.`) ); }); diff --git a/packages/util-endpoints/src/resolveEndpoint.spec.ts b/packages/util-endpoints/src/resolveEndpoint.spec.ts index 6485ae23908..71769c589f1 100644 --- a/packages/util-endpoints/src/resolveEndpoint.spec.ts +++ b/packages/util-endpoints/src/resolveEndpoint.spec.ts @@ -20,7 +20,7 @@ describe(resolveEndpoint.name, () => { [paramWithDefaultKey]: "defaultParamValue", }; - const mockRules = []; + const mockRules: any[] = []; const mockRuleSetParameters: Record = { [boolParamKey]: { type: "Boolean", diff --git a/packages/util-endpoints/src/utils/callFunction.spec.ts b/packages/util-endpoints/src/utils/callFunction.spec.ts index 105d334f568..cc98883f110 100644 --- a/packages/util-endpoints/src/utils/callFunction.spec.ts +++ b/packages/util-endpoints/src/utils/callFunction.spec.ts @@ -33,8 +33,8 @@ describe(callFunction.name, () => { "stringEquals", "subsgtring", "urlEncode", - ])("calls built-in endpoint function %s", (builtIn) => { - endpointFunctions[builtIn] = vi.fn().mockReturnValue(mockReturn); + ] as Array)("calls built-in endpoint function %s", (builtIn) => { + endpointFunctions[builtIn] = vi.fn().mockReturnValue(mockReturn) as any; const mockArg = "mockArg"; const mockFn = { fn: builtIn, argv: [mockArg] }; diff --git a/packages/util-endpoints/src/utils/evaluateCondition.spec.ts b/packages/util-endpoints/src/utils/evaluateCondition.spec.ts index 2f04b37dc74..fc3167c5c49 100644 --- a/packages/util-endpoints/src/utils/evaluateCondition.spec.ts +++ b/packages/util-endpoints/src/utils/evaluateCondition.spec.ts @@ -33,7 +33,7 @@ describe(evaluateCondition.name, () => { [true, [true, 1, -1, "true", "false", ""]], [false, [false, 0, -0, null, undefined, NaN]], ])("returns %s for", (result, testCases) => { - it.each(testCases)(`value: '%s'`, (mockReturn) => { + it.each(testCases)(`value: '%s'`, (mockReturn: any) => { const mockLogger = { debug: vi.fn(), info: vi.fn(), diff --git a/packages/util-endpoints/src/utils/evaluateConditions.spec.ts b/packages/util-endpoints/src/utils/evaluateConditions.spec.ts index 161aacd2752..91665b624b8 100644 --- a/packages/util-endpoints/src/utils/evaluateConditions.spec.ts +++ b/packages/util-endpoints/src/utils/evaluateConditions.spec.ts @@ -52,11 +52,11 @@ describe(evaluateConditions.name, () => { vi.mocked(evaluateCondition).mockReturnValueOnce({ result: true, - toAssign: { name: mockCn1.assign, value: value1 }, + toAssign: { name: mockCn1.assign!, value: value1 }, }); vi.mocked(evaluateCondition).mockReturnValueOnce({ result: true, - toAssign: { name: mockCn2.assign, value: value2 }, + toAssign: { name: mockCn2.assign!, value: value2 }, }); const { result, referenceRecord } = evaluateConditions([mockCn1, mockCn2], { ...mockOptions }); diff --git a/packages/util-endpoints/src/utils/evaluateTreeRule.spec.ts b/packages/util-endpoints/src/utils/evaluateTreeRule.spec.ts index 318339e209b..16aafd2b3bf 100644 --- a/packages/util-endpoints/src/utils/evaluateTreeRule.spec.ts +++ b/packages/util-endpoints/src/utils/evaluateTreeRule.spec.ts @@ -36,7 +36,7 @@ describe(evaluateTreeRule.name, () => { const mockEndpointUrl = new URL("http://example.com"); vi.mocked(evaluateConditions).mockReturnValue({ result: true, referenceRecord: mockReferenceRecord }); - vi.mocked(evaluateRules).mockReturnValue(mockEndpointUrl); + vi.mocked(evaluateRules).mockReturnValue(mockEndpointUrl as any); const result = evaluateTreeRule(mockTreeRule, mockOptions); expect(result).toBe(mockEndpointUrl); diff --git a/packages/util-endpoints/src/utils/getEndpointHeaders.spec.ts b/packages/util-endpoints/src/utils/getEndpointHeaders.spec.ts index 9f2c354890d..d95fcfd5282 100644 --- a/packages/util-endpoints/src/utils/getEndpointHeaders.spec.ts +++ b/packages/util-endpoints/src/utils/getEndpointHeaders.spec.ts @@ -32,7 +32,7 @@ describe(getEndpointHeaders.name, () => { it.each([null, undefined, true, 1])( "should throw error if evaluated expression is not string: %s", - (notStringValue) => { + (notStringValue: any) => { const inputHeaderKey = "inputHeaderKey"; const inputHeaderValue = "inputHeaderValue"; const mockHeaders = { [inputHeaderKey]: [inputHeaderValue] }; diff --git a/packages/util-retry/src/AdaptiveRetryStrategy.spec.ts b/packages/util-retry/src/AdaptiveRetryStrategy.spec.ts index e6d54ad7b1b..5dd2b30ae02 100644 --- a/packages/util-retry/src/AdaptiveRetryStrategy.spec.ts +++ b/packages/util-retry/src/AdaptiveRetryStrategy.spec.ts @@ -16,7 +16,7 @@ describe(AdaptiveRetryStrategy.name, () => { const mockDefaultRateLimiter = { getSendToken: vi.fn(), updateClientSendingRate: vi.fn(), - }; + } as any; const mockRetryToken: StandardRetryToken = { getRetryCost: () => 1, getRetryCount: () => 1, diff --git a/packages/util-retry/src/StandardRetryStrategy.spec.ts b/packages/util-retry/src/StandardRetryStrategy.spec.ts index d8b3a4dff6a..43deee9c768 100644 --- a/packages/util-retry/src/StandardRetryStrategy.spec.ts +++ b/packages/util-retry/src/StandardRetryStrategy.spec.ts @@ -15,6 +15,12 @@ describe(StandardRetryStrategy.name, () => { const mockRetryToken = { getRetryCount: () => 1, getRetryTokenCount: (errorInfo: any) => 1, + getRetryCost() { + return 0; + }, + getRetryDelay() { + return 0; + }, }; const noRetryTokenAvailableError = new Error("No retry token available"); const errorInfo = { errorType: "TRANSIENT" } as RetryErrorInfo; @@ -59,6 +65,12 @@ describe(StandardRetryStrategy.name, () => { const mockRetryToken = { getRetryCount, hasRetryTokens, + getRetryCost() { + return 0; + }, + getRetryDelay() { + return 0; + }, }; vi.mocked(createDefaultRetryToken).mockReturnValue(mockRetryToken); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); @@ -71,6 +83,12 @@ describe(StandardRetryStrategy.name, () => { const mockRetryToken = { getRetryCount: () => 0, getRetryTokenCount: (errorInfo: any) => 1, + getRetryCost() { + return 0; + }, + getRetryDelay() { + return 0; + }, }; vi.mocked(createDefaultRetryToken).mockReturnValue(mockRetryToken); const retryStrategy = new StandardRetryStrategy(1); @@ -87,6 +105,12 @@ describe(StandardRetryStrategy.name, () => { const mockRetryToken = { getRetryCount: () => 2, getRetryTokenCount: (errorInfo: any) => 1, + getRetryCost() { + return 0; + }, + getRetryDelay() { + return 0; + }, }; vi.mocked(createDefaultRetryToken).mockReturnValue(mockRetryToken); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(1)); @@ -103,6 +127,12 @@ describe(StandardRetryStrategy.name, () => { const mockRetryToken = { getRetryCount: () => 5, getRetryTokenCount: (errorInfo: any) => 1, + getRetryCost() { + return 0; + }, + getRetryDelay() { + return 0; + }, }; vi.mocked(createDefaultRetryToken).mockReturnValue(mockRetryToken); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(5)); @@ -120,6 +150,12 @@ describe(StandardRetryStrategy.name, () => { getRetryCount: () => 0, getRetryTokenCount: (errorInfo: any) => 1, hasRetryTokens: (errorType: RetryErrorType) => true, + getRetryCost() { + return 0; + }, + getRetryDelay() { + return 0; + }, }; vi.mocked(createDefaultRetryToken).mockReturnValue(mockRetryToken); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); diff --git a/smithy-typescript-codegen-test/model/weather/main.smithy b/smithy-typescript-codegen-test/model/weather/main.smithy index 4462903d1a4..ff69bda9586 100644 --- a/smithy-typescript-codegen-test/model/weather/main.smithy +++ b/smithy-typescript-codegen-test/model/weather/main.smithy @@ -496,21 +496,34 @@ apply Weather @smithy.rules#endpointRuleSet({ version: "1.3" parameters: { Region: { required: true, type: "String", documentation: "docs" } + endpoint: { required: false, type: "String", documentation: "docs" } } rules: [ { - conditions: [] - documentation: "base rule" + conditions: [ + { + fn: "isSet" + argv: [ + { + ref: "endpoint" + } + ] + } + ] endpoint: { - url: "https://{Region}.amazonaws.com" - properties: {} - headers: {} + url: { ref: "endpoint" } } type: "endpoint" } + { + conditions: [] + error: "(default endpointRuleSet) endpoint is not set - you must configure an endpoint." + type: "error" + } ] }) apply Weather @smithy.rules#clientContextParams( Region: { type: "string", documentation: "docs" } + endpoint: { type: "string", documentation: "docs" } ) diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 00000000000..202ad984fa0 --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "noEmit": true, + "noCheck": false, + "skipLibCheck": true + }, + "extends": "./tsconfig.types.json", + "include": ["packages/**/*.spec.ts", "private/**/*.spec.ts"], + "exclude": [ + "node_modules/", + "node_modules", + "vitest.*.ts" + ] +} diff --git a/vitest.config.browser.ts b/vitest.config.browser.ts new file mode 100644 index 00000000000..05f9727f95c --- /dev/null +++ b/vitest.config.browser.ts @@ -0,0 +1,9 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + exclude: ["node_modules"], + include: ["{packages,private}/**/*.browser.spec.ts"], + environment: "happy-dom", + }, +});