diff --git a/eslint.config.js b/eslint.config.js index 03d96499..945fdb6a 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -115,6 +115,9 @@ export default tseslint.config( // Custom assertion functions 'assertNetlifyToml', + + // Vitest type testing functions + 'expectTypeOf', ], }, ], diff --git a/packages/functions/src/global-types.test.ts b/packages/functions/src/global-types.test.ts new file mode 100644 index 00000000..4ec42959 --- /dev/null +++ b/packages/functions/src/global-types.test.ts @@ -0,0 +1,13 @@ +import { describe, test, expectTypeOf } from 'vitest' +import type { NetlifyGlobal } from '@netlify/types' + +// Import the main module to ensure global augmentation is loaded +import './main.js' + +describe('Netlify global type declaration regression test', () => { + test('should augment global scope with `Netlify` global', () => { + expectTypeOf().toEqualTypeOf() + expectTypeOf().toHaveProperty('env') + expectTypeOf().toHaveProperty('context') + }) +}) diff --git a/packages/functions/src/main.ts b/packages/functions/src/main.ts index a3154338..736ee659 100644 --- a/packages/functions/src/main.ts +++ b/packages/functions/src/main.ts @@ -1,3 +1,9 @@ +import type { NetlifyGlobal } from '@netlify/types' + +declare global { + const Netlify: NetlifyGlobal +} + export { builder } from './lib/builder.js' export { purgeCache } from './lib/purge_cache.js' export { schedule } from './lib/schedule.js' diff --git a/packages/functions/tsconfig.json b/packages/functions/tsconfig.json index 12ec691d..49490e9d 100644 --- a/packages/functions/tsconfig.json +++ b/packages/functions/tsconfig.json @@ -11,6 +11,7 @@ "removeComments": false, "strict": true, "moduleResolution": "node", + "skipLibCheck": true, "forceConsistentCasingInFileNames": true }, "include": ["src", "dev"] diff --git a/packages/functions/vitest.config.ts b/packages/functions/vitest.config.ts index 0bbc0597..6f0b1819 100644 --- a/packages/functions/vitest.config.ts +++ b/packages/functions/vitest.config.ts @@ -7,5 +7,8 @@ export default defineConfig({ test: { include: ['(src|dev)/**/*.test.ts'], testTimeout: 30_000, + typecheck: { + enabled: true, + }, }, }) diff --git a/packages/types/src/main.test.ts b/packages/types/src/main.test.ts index 1e77f5f6..72c2acd2 100644 --- a/packages/types/src/main.test.ts +++ b/packages/types/src/main.test.ts @@ -4,12 +4,12 @@ import { fileURLToPath } from 'node:url' import { expect, expectTypeOf, test } from 'vitest' -import { Context, NetlifyGlobal } from './main.js' +import type { Context, NetlifyGlobal } from './main.js' import * as main from './main.js' test('Exports types', () => { - expectTypeOf() - expectTypeOf() + expectTypeOf().toExtend() + expectTypeOf().toExtend() }) test('Does not export runtime code', () => { diff --git a/packages/types/vitest.config.ts b/packages/types/vitest.config.ts new file mode 100644 index 00000000..4428598a --- /dev/null +++ b/packages/types/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + typecheck: { + enabled: true, + }, + }, +})