diff --git a/.gitignore b/.gitignore index bf4fb70..547aa64 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules build yarn.lock +test-d/build.ts diff --git a/rollup.config.js b/rollup.config.js index db0976e..534a397 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,3 +1,4 @@ +import fs from 'node:fs/promises'; import {nodeResolve} from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import json from '@rollup/plugin-json'; @@ -16,10 +17,11 @@ const stripComments = createTag( replaceResultTransformer(emptyLineRegex, ''), ); +const sourceDirectory = 'source'; const outputDirectory = 'build'; const config = defineConfig({ - input: await globby('source/**/*.js'), + input: await globby(`${sourceDirectory}/**/*.js`), output: { dir: outputDirectory, interop: 'esModule', @@ -58,7 +60,7 @@ const config = defineConfig({ }); const dtsConfig = defineConfig({ - input: './source/index.d.ts', + input: `./${sourceDirectory}/index.d.ts`, output: { file: `./${outputDirectory}/index.d.ts`, format: 'es', @@ -67,6 +69,18 @@ const dtsConfig = defineConfig({ dts({ respectExternal: true, }), + { + name: 'copy-tsd', + async generateBundle() { + let tsdFile = await fs.readFile('./test-d/index.ts', 'utf8'); + tsdFile = tsdFile.replace( + `import meow from '../${sourceDirectory}/index.js'`, + `import meow from '../${outputDirectory}/index.js'`, + ); + + await fs.writeFile(`./test-d/${outputDirectory}.ts`, tsdFile); + }, + }, ], }); diff --git a/test-d/build.test-d.ts b/test-d/build.test-d.ts deleted file mode 100644 index 532e7e2..0000000 --- a/test-d/build.test-d.ts +++ /dev/null @@ -1,131 +0,0 @@ -import {expectAssignable, expectError, expectType} from 'tsd'; -import type {PackageJson} from 'type-fest'; -import meow, {type Result} from '../build/index.js'; - -type AnyFlag = NonNullable[0]>['flags']>[string]; - -const importMeta = import.meta; - -expectError(meow('Help text')); -expectError(meow('Help text', {})); -expectType>(meow('Help text', {importMeta})); -expectAssignable<{flags: {foo: number}}>( - meow({importMeta: import.meta, flags: {foo: {type: 'number', isRequired: true}}}), -); -expectAssignable<{flags: {foo: string}}>( - meow({importMeta, flags: {foo: {type: 'string', isRequired: true}}}), -); -expectAssignable<{flags: {foo: boolean}}>( - meow({importMeta, flags: {foo: {type: 'boolean', isRequired: true}}}), -); -expectAssignable<{flags: {foo: number | undefined}}>( - meow({importMeta, flags: {foo: {type: 'number'}}}), -); -expectAssignable<{flags: {foo: string | undefined}}>( - meow({importMeta, flags: {foo: {type: 'string'}}}), -); -expectAssignable<{flags: {foo: boolean | undefined}}>( - meow({importMeta, flags: {foo: {type: 'boolean'}}}), -); -expectAssignable<{flags: {foo: number[] | undefined}}>( - meow({importMeta, flags: {foo: {type: 'number', isMultiple: true}}}), -); -expectAssignable<{flags: {foo: string[] | undefined}}>( - meow({importMeta, flags: {foo: {type: 'string', isMultiple: true}}}), -); -expectAssignable<{flags: {foo: boolean[] | undefined}}>( - meow({importMeta, flags: {foo: {type: 'boolean', isMultiple: true}}}), -); -expectType>(meow({importMeta, description: 'foo'})); -expectType>(meow({importMeta, description: false})); -expectType>(meow({importMeta, help: 'foo'})); -expectType>(meow({importMeta, help: false})); -expectType>(meow({importMeta, version: 'foo'})); -expectType>(meow({importMeta, autoHelp: false})); -expectType>(meow({importMeta, autoVersion: false})); -expectType>(meow({importMeta, pkg: {foo: 'bar'}})); -expectType>(meow({importMeta, argv: ['foo', 'bar']})); -expectType>(meow({importMeta, inferType: true})); -expectType>(meow({importMeta, booleanDefault: true})); -expectType>(meow({importMeta, booleanDefault: undefined})); -expectType>(meow({importMeta})); - -const result = meow('Help text', { - importMeta, - flags: { - foo: {type: 'boolean', shortFlag: 'f'}, - 'foo-bar': {type: 'number', aliases: ['foobar', 'fooBar']}, - bar: {type: 'string', default: ''}, - abc: {type: 'string', isMultiple: true}, - baz: {type: 'string', choices: ['rainbow', 'cat', 'unicorn']}, - }, -}); - -expectType(result.input); -expectType(result.pkg); -expectType(result.help); - -expectType(result.flags.foo); -expectType(result.flags.fooBar); -expectType(result.flags.bar); -expectType(result.flags.abc); -expectType(result.flags.baz); -expectType(result.unnormalizedFlags.foo); -expectType(result.unnormalizedFlags.f); -expectType(result.unnormalizedFlags['foo-bar']); -expectType(result.unnormalizedFlags.foobar); -expectType(result.unnormalizedFlags.fooBar); -expectType(result.unnormalizedFlags.bar); -expectType(result.unnormalizedFlags.abc); -expectType(result.unnormalizedFlags.baz); - -result.showHelp(); -result.showHelp(1); -result.showVersion(); - -const options = { - importMeta, - flags: { - rainbow: { - type: 'boolean', - shortFlag: 'r', - }, - }, -} as const; - -meow('', options); - -expectAssignable({type: 'string', default: 'cat'}); -expectAssignable({type: 'number', default: 42}); -expectAssignable({type: 'boolean', default: true}); - -expectAssignable({type: 'string', default: undefined}); -expectAssignable({type: 'number', default: undefined}); -expectAssignable({type: 'boolean', default: undefined}); - -expectAssignable({type: 'string', isMultiple: true, default: ['cat']}); -expectAssignable({type: 'number', isMultiple: true, default: [42]}); -expectAssignable({type: 'boolean', isMultiple: true, default: [false]}); - -expectError({type: 'string', isMultiple: true, default: 'cat'}); -expectError({type: 'number', isMultiple: true, default: 42}); -expectError({type: 'boolean', isMultiple: true, default: false}); - -expectAssignable({type: 'string', choices: ['cat', 'unicorn']}); -expectAssignable({type: 'number', choices: [1, 2]}); -expectAssignable({type: 'boolean', choices: [true, false]}); -expectAssignable({type: 'string', isMultiple: true, choices: ['cat']}); -expectAssignable({type: 'string', isMultiple: false, choices: ['cat']}); - -expectError({type: 'string', choices: 'cat'}); -expectError({type: 'number', choices: 1}); -expectError({type: 'boolean', choices: true}); - -expectError({type: 'string', choices: [1]}); -expectError({type: 'number', choices: ['cat']}); -expectError({type: 'boolean', choices: ['cat']}); - -expectAssignable({choices: ['cat']}); -expectAssignable({choices: [1]}); -expectAssignable({choices: [true]}); -expectError({choices: ['cat', 1, true]}); diff --git a/test-d/index.test-d.ts b/test-d/index.ts similarity index 100% rename from test-d/index.test-d.ts rename to test-d/index.ts