Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Require Node.js 12 and move to ESM #181

Merged
merged 11 commits into from Apr 27, 2021
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/main.yml
Expand Up @@ -10,12 +10,12 @@ jobs:
fail-fast: false
matrix:
node-version:
- 16
- 14
- 12
- 10
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
- uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- run: npm install
Expand Down
4 changes: 1 addition & 3 deletions estest/index.js
@@ -1,6 +1,4 @@
import {createRequire} from 'module';

const meow = createRequire(import.meta.url)('../index.js');
import meow from '../index.js';

meow(`
Usage
Expand Down
11 changes: 6 additions & 5 deletions index.d.ts
Expand Up @@ -138,7 +138,7 @@ declare namespace meow {

@example
```
import meow = require('meow');
import meow from 'meow';

const cli = meow(`
Usage
Expand Down Expand Up @@ -277,9 +277,8 @@ declare namespace meow {
@example
```
#!/usr/bin/env node
'use strict';
import meow = require('meow');
import foo = require('.');
import meow = from 'meow';
LitoMore marked this conversation as resolved.
Show resolved Hide resolved
import foo from './index.js';

const cli = meow(`
Usage
Expand Down Expand Up @@ -309,7 +308,9 @@ const cli = meow(`
foo(cli.input[0], cli.flags);
```
*/
// eslint-disable-next-line no-redeclare
declare function meow<Flags extends meow.AnyFlags>(helpMessage: string, options?: meow.Options<Flags>): meow.Result<Flags>;
// eslint-disable-next-line no-redeclare
declare function meow<Flags extends meow.AnyFlags>(options?: meow.Options<Flags>): meow.Result<Flags>;
LitoMore marked this conversation as resolved.
Show resolved Hide resolved

export = meow;
export default meow;
31 changes: 12 additions & 19 deletions index.js
@@ -1,19 +1,13 @@
'use strict';
const path = require('path');
const buildParserOptions = require('minimist-options');
const parseArguments = require('yargs-parser');
const camelCaseKeys = require('camelcase-keys');
const decamelize = require('decamelize');
const decamelizeKeys = require('decamelize-keys');
const trimNewlines = require('trim-newlines');
const redent = require('redent');
const readPkgUp = require('read-pkg-up');
const hardRejection = require('hard-rejection');
const normalizePackageData = require('normalize-package-data');

// Prevent caching of this module so module.parent is always accurate
delete require.cache[__filename];
const parentDir = path.dirname(module.parent && module.parent.filename ? module.parent.filename : '.');
import buildParserOptions from 'minimist-options';
import parseArguments from 'yargs-parser';
import camelCaseKeys from 'camelcase-keys';
import decamelize from 'decamelize';
import decamelizeKeys from 'decamelize-keys';
import trimNewlines from 'trim-newlines';
import redent from 'redent';
import {readPackageUpSync} from 'read-pkg-up';
import hardRejection from 'hard-rejection';
import normalizePackageData from 'normalize-package-data';

const isFlagMissing = (flagName, definedFlags, receivedFlags, input) => {
const flag = definedFlags[flagName];
Expand Down Expand Up @@ -109,8 +103,7 @@ const meow = (helpText, options) => {
helpText = '';
}

const foundPkg = readPkgUp.sync({
cwd: parentDir,
const foundPkg = readPackageUpSync({
normalize: false
});

Expand Down Expand Up @@ -231,4 +224,4 @@ const meow = (helpText, options) => {
};
};

module.exports = meow;
export default meow;
37 changes: 18 additions & 19 deletions index.test-d.ts
@@ -1,10 +1,9 @@
import {expectAssignable, expectType} from 'tsd';
import {PackageJson} from 'type-fest';
import meow = require('.');
import {Result} from '.';
import meow from './index.js';

expectType<Result<never>>(meow('Help text'));
expectType<Result<never>>(meow('Help text', {hardRejection: false}));
expectType<meow.Result<never>>(meow('Help text'));
expectType<meow.Result<never>>(meow('Help text', {hardRejection: false}));
expectAssignable<{flags: {foo: number}}>(
meow({flags: {foo: {type: 'number', isRequired: true}}})
);
Expand All @@ -23,21 +22,21 @@ expectAssignable<{flags: {foo: string | undefined}}>(
expectAssignable<{flags: {foo: boolean | undefined}}>(
meow({flags: {foo: {type: 'boolean'}}})
);
expectType<Result<never>>(meow({description: 'foo'}));
expectType<Result<never>>(meow({description: false}));
expectType<Result<never>>(meow({help: 'foo'}));
expectType<Result<never>>(meow({help: false}));
expectType<Result<never>>(meow({version: 'foo'}));
expectType<Result<never>>(meow({version: false}));
expectType<Result<never>>(meow({autoHelp: false}));
expectType<Result<never>>(meow({autoVersion: false}));
expectType<Result<never>>(meow({pkg: {foo: 'bar'}}));
expectType<Result<never>>(meow({argv: ['foo', 'bar']}));
expectType<Result<never>>(meow({inferType: true}));
expectType<Result<never>>(meow({booleanDefault: true}));
expectType<Result<never>>(meow({booleanDefault: null}));
expectType<Result<never>>(meow({booleanDefault: undefined}));
expectType<Result<never>>(meow({hardRejection: false}));
expectType<meow.Result<never>>(meow({description: 'foo'}));
expectType<meow.Result<never>>(meow({description: false}));
expectType<meow.Result<never>>(meow({help: 'foo'}));
expectType<meow.Result<never>>(meow({help: false}));
expectType<meow.Result<never>>(meow({version: 'foo'}));
expectType<meow.Result<never>>(meow({version: false}));
expectType<meow.Result<never>>(meow({autoHelp: false}));
expectType<meow.Result<never>>(meow({autoVersion: false}));
expectType<meow.Result<never>>(meow({pkg: {foo: 'bar'}}));
expectType<meow.Result<never>>(meow({argv: ['foo', 'bar']}));
expectType<meow.Result<never>>(meow({inferType: true}));
expectType<meow.Result<never>>(meow({booleanDefault: true}));
expectType<meow.Result<never>>(meow({booleanDefault: null}));
expectType<meow.Result<never>>(meow({booleanDefault: undefined}));
expectType<meow.Result<never>>(meow({hardRejection: false}));

const result = meow('Help text', {
flags: {
Expand Down
11 changes: 7 additions & 4 deletions package.json
Expand Up @@ -10,8 +10,10 @@
"email": "sindresorhus@gmail.com",
"url": "https://sindresorhus.com"
},
"type": "module",
"exports": "./index.js",
"engines": {
"node": ">=10"
"node": ">=12"
},
"scripts": {
"test": "xo && ava && tsd"
Expand Down Expand Up @@ -47,18 +49,19 @@
"hard-rejection": "^2.1.0",
"minimist-options": "4.1.0",
"normalize-package-data": "^3.0.0",
"read-pkg-up": "^7.0.1",
"read-pkg-up": "^8.0.0",
"redent": "^3.0.0",
"trim-newlines": "^3.0.0",
"type-fest": "^0.18.0",
"yargs-parser": "^20.2.3"
},
"devDependencies": {
"ava": "^2.4.0",
"ava": "^3.15.0",
"execa": "^4.1.0",
"indent-string": "^4.0.0",
"read-pkg": "^6.0.0",
"tsd": "^0.13.1",
"xo": "^0.34.1"
"xo": "^0.39.1"
},
"xo": {
"rules": {
Expand Down
2 changes: 2 additions & 0 deletions test/allow-unkonwn-flags.js
@@ -1,7 +1,9 @@
import path from 'path';
import {fileURLToPath} from 'url';
import test from 'ava';
import execa from 'execa';

const __dirname = path.dirname(fileURLToPath(import.meta.url));
const fixtureAllowUnknownFlags = path.join(__dirname, 'fixtures', 'fixture-allow-unknown-flags.js');

test('spawn CLI and test specifying unknown flags', async t => {
Expand Down
3 changes: 1 addition & 2 deletions test/fixtures/fixture-allow-unknown-flags.js
@@ -1,6 +1,5 @@
#!/usr/bin/env node
'use strict';
const meow = require('../..');
import meow from '../../index.js';

const cli = meow({
description: 'Custom description',
Expand Down
3 changes: 1 addition & 2 deletions test/fixtures/fixture-required-function.js
@@ -1,6 +1,5 @@
#!/usr/bin/env node
'use strict';
const meow = require('../..');
import meow from '../../index.js';

const cli = meow({
description: 'Custom description',
Expand Down
3 changes: 1 addition & 2 deletions test/fixtures/fixture-required-multiple.js
@@ -1,6 +1,5 @@
#!/usr/bin/env node
'use strict';
const meow = require('../..');
import meow from '../../index.js';

const cli = meow({
description: 'Custom description',
Expand Down
2 changes: 1 addition & 1 deletion test/fixtures/fixture-required.js
@@ -1,6 +1,6 @@
#!/usr/bin/env node
'use strict';
const meow = require('../..');
import meow from '../../index.js';

const cli = meow({
description: 'Custom description',
Expand Down
7 changes: 3 additions & 4 deletions test/fixtures/fixture.js
@@ -1,6 +1,5 @@
#!/usr/bin/env node
'use strict';
const meow = require('../..');
import meow from '../../index.js';

const cli = meow({
description: 'Custom description',
Expand All @@ -18,9 +17,9 @@ const cli = meow({
});

if (cli.flags.camelCaseOption === 'foo') {
Object.keys(cli.flags).forEach(x => {
for (const x of Object.keys(cli.flags)) {
console.log(x);
});
}
} else {
console.log(cli.flags.camelCaseOption);
}
4 changes: 3 additions & 1 deletion test/is-required-flag.js
@@ -1,7 +1,9 @@
import test from 'ava';
import execa from 'execa';
const path = require('path');
import path from 'path';
LitoMore marked this conversation as resolved.
Show resolved Hide resolved
import {fileURLToPath} from 'url';

const __dirname = path.dirname(fileURLToPath(import.meta.url));
const fixtureRequiredPath = path.join(__dirname, 'fixtures', 'fixture-required.js');
const fixtureRequiredFunctionPath = path.join(__dirname, 'fixtures', 'fixture-required-function.js');
const fixtureRequiredMultiplePath = path.join(__dirname, 'fixtures', 'fixture-required-multiple.js');
Expand Down
7 changes: 5 additions & 2 deletions test/test.js
Expand Up @@ -2,9 +2,11 @@ import test from 'ava';
import indentString from 'indent-string';
import execa from 'execa';
import path from 'path';
import pkg from '../package.json';
import meow from '..';
import {fileURLToPath} from 'url';
import {readPackageAsync} from 'read-pkg';
import meow from '../index.js';

const __dirname = path.dirname(fileURLToPath(import.meta.url));
const fixturePath = path.join(__dirname, 'fixtures', 'fixture.js');
const NODE_MAJOR_VERSION = process.versions.node.split('.')[0];

Expand Down Expand Up @@ -40,6 +42,7 @@ test('support help shortcut', t => {
});

test('spawn cli and show version', async t => {
const pkg = await readPackageAsync();
const {stdout} = await execa(fixturePath, ['--version']);
t.is(stdout, pkg.version);
});
Expand Down