Skip to content

Commit b824171

Browse files
authored
Merge pull request #3 from luistak/feat/cli-enchancements
Feat/cli enchancements
2 parents 25d9220 + d806de5 commit b824171

File tree

9 files changed

+148
-90
lines changed

9 files changed

+148
-90
lines changed

README.md

Lines changed: 49 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,35 +23,62 @@ Given a few options you can gets details about how your library is being importe
2323
```js
2424
import { getPackagesUsages } from 'pkg-usage';
2525

26-
const usages = getPackagesUsages({
26+
const usages: PackageUsage[] = getPackagesUsages({
2727
packages: ['react'],
2828
fileGlobs: `**/**.ts`,
2929
});
3030

3131
console.log(usages);
3232
```
3333

34-
Output
35-
36-
```json
37-
[
38-
{
39-
count: 1,
40-
files: [
41-
{
42-
defaultImport: undefined,
43-
name: `${fileName}.ts`,
44-
namedImports: imports,
45-
},
46-
],
47-
name: pkg,
48-
version,
49-
}
50-
]
34+
Package Usage types
35+
36+
```ts
37+
export type FileUsage = {
38+
name: string;
39+
filePath: string;
40+
defaultImport: string | undefined;
41+
namedImports: string[];
42+
};
43+
44+
export type PackageUsage = {
45+
name: string;
46+
count: number;
47+
files?: FileUsage[];
48+
version?: string;
49+
};
5150
```
5251

53-
## Current features:
52+
## CLI usage
5453

55-
- The package version
56-
- How many files are importing your `package`
57-
- What are the default and named imports by file
54+
| Options | Description | Example |
55+
| ------------------------ | ------------------------------------ | ---------------------------------------------- |
56+
| -p, --packages | Packages to analyze | -p vue,vuex or --packages="react,redux" |
57+
| -f, --file-globs | Files to analyze based on file globs | -f "_.(ts\|tsx)" or --file-globs="_.(js\|jsx)" |
58+
| -cwd, --package-json-CWD | Directory to start from | -cwd "/path/to/start/from" |
59+
60+
### npx
61+
62+
[`npx`](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b) is a package runner tool
63+
64+
```bash
65+
npx pkg-usage -p "react,redux" --f "**/*.(ts|tsx)"
66+
```
67+
68+
Or
69+
70+
```bash
71+
npx pkg-usage --packages="vue,vuex" --file-globs="**/*.(js|jsx)"
72+
```
73+
74+
If you use npm 5.1 or earlier, you can't use npx. Instead, install it globally:
75+
76+
```bash
77+
npm install -g pkg-usage
78+
```
79+
80+
Now you can run:
81+
82+
```bash
83+
pkg-usage -p "react,redux" --f "**/*.(ts|tsx)"
84+
```

__tests__/pkg-usage.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ describe('getPackagesUsages()', () => {
6060
files: [
6161
{
6262
defaultImport: undefined,
63+
filePath: `${MOCKS_DIR_CWD}/${fileName}.ts`,
6364
name: `${fileName}.ts`,
6465
namedImports: imports,
6566
},

package.json

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "pkg-usage",
3-
"version": "0.2.1-pre",
3+
"version": "0.2.1",
44
"description": "Npm package usage metrics",
55
"main": "dist/src/index.js",
66
"files": [
@@ -9,6 +9,13 @@
99
"example",
1010
"scripts"
1111
],
12+
"keywords": [
13+
"node",
14+
"npm",
15+
"package",
16+
"usage",
17+
"resources"
18+
],
1219
"bin": {
1320
"pkg-usage": "./scripts/pkg-usage.js"
1421
},
@@ -45,15 +52,18 @@
4552
"lint": "eslint . --cache --fix --ext .ts,.tsx",
4653
"format": "prettier --loglevel warn --write \"**/*.{ts,tsx,css,md}\"",
4754
"test:ci": "CI=true yarn test:coverage",
48-
"test:jest": "jest",
49-
"test:watch": "jest --watch",
50-
"test:coverage": "jest --coverage",
55+
"test:jest": "NODE_OPTIONS=--max_old_space_size=4096 jest -w=2",
56+
"test:watch": "yarn test --watch",
57+
"test:coverage": "yarn test --coverage",
5158
"test": "yarn test:jest",
5259
"prebuild": "rm -Rf dist",
53-
"build": "tsc"
60+
"build": "tsc",
61+
"prerelease": "cz bump",
62+
"release": "npm publish"
5463
},
5564
"jest": {
5665
"testPathIgnorePatterns": [
66+
"/dist/",
5767
"/node_modules/",
5868
"/__tests__/utils.ts"
5969
],
@@ -68,6 +78,7 @@
6878
]
6979
},
7080
"dependencies": {
81+
"commander": "^8.2.0",
7182
"pkg-up": "^3.1.0",
7283
"ts-morph": "^11.0.3"
7384
},

scripts/pkg-usage.js

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,37 @@
11
#!/usr/bin/env node
22

3-
const { getPackagesUsages } = require('pkg-usage');
3+
// const { getPackagesUsages } = require('pkg-usage');
4+
const { getPackagesUsages } = require('../dist/src');
5+
const { Command } = require('commander');
46

5-
function getOptionsFromArgs(options) {
6-
const argsMap = {
7-
'--packages': 'packages',
8-
'--file-globs': 'fileGlobs',
9-
};
7+
const program = new Command();
108

11-
return options.reduce((acc, option) => {
12-
const [key, value] = option.split('=');
13-
14-
if (value) {
15-
return { ...acc, [argsMap[key]]: value };
16-
}
17-
18-
return acc;
19-
}, {});
9+
function commaSeparatedList(value) {
10+
return value.split(',');
2011
}
2112

22-
async function run() {
23-
const args = process.argv.slice(2);
24-
25-
const { packages, fileGlobs } = getOptionsFromArgs(args);
26-
27-
const usages = getPackagesUsages({
28-
packages: packages.split(','),
29-
fileGlobs,
13+
program
14+
.requiredOption(
15+
'-p, --packages <items>',
16+
'Packages to analyze ex: -p vue,vuex or --packages="react,redux"',
17+
commaSeparatedList
18+
)
19+
.requiredOption(
20+
'-f, --file-globs <value>',
21+
'Files to analyze based on file globs ex: -f "**/*.(ts|tsx)" or --file-globs="**/*.(js|jsx)"'
22+
)
23+
.option(
24+
'-cwd, --package-json-CWD <value>',
25+
'Directory to start from ex: -cwd "/path/to/start/from"'
26+
)
27+
.action(({ packages, fileGlobs, packageJsonCWD }) => {
28+
const usages = getPackagesUsages({
29+
packages,
30+
fileGlobs,
31+
packageJsonCWD,
32+
});
33+
34+
console.log(JSON.stringify(usages, undefined, 2));
3035
});
3136

32-
console.log(JSON.stringify(usages, undefined, 2));
33-
}
34-
35-
run();
37+
program.parse(process.argv);

src/core.ts

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import { Project, SourceFile } from 'ts-morph';
2-
import pkgup from 'pkg-up';
32

3+
import { getPackageVersion, nonNullish } from './helpers';
44
import { FileUsage, PackageUsage, Options } from './types';
5-
import { readFileSync } from 'fs';
65

76
function getPackageUsage(
87
pkg: string,
@@ -27,42 +26,12 @@ function getPackageUsage(
2726

2827
return {
2928
name: sourceFile.getBaseName(),
29+
filePath: sourceFile.getFilePath(),
3030
defaultImport: defaultImport?.getText(),
3131
namedImports: namedImports.map((a) => a.getName()),
3232
};
3333
}
3434

35-
function getPackageJson(packageJsonCWD?: string) {
36-
const pkgJsonPath = pkgup.sync({ cwd: packageJsonCWD });
37-
38-
const { dependencies, peerDependencies, devDependencies } = JSON.parse(
39-
readFileSync(pkgJsonPath!, 'utf8')
40-
);
41-
42-
return {
43-
dependencies: new Map<string, string>(
44-
dependencies ? Object.entries(dependencies) : undefined
45-
),
46-
peerDependencies: new Map<string, string>(
47-
peerDependencies ? Object.entries(peerDependencies) : undefined
48-
),
49-
devDependencies: new Map<string, string>(
50-
devDependencies ? Object.entries(devDependencies) : undefined
51-
),
52-
};
53-
}
54-
55-
function getPackageVersion(pkg: string, packageJsonCWD?: string) {
56-
const { dependencies, peerDependencies, devDependencies } =
57-
getPackageJson(packageJsonCWD);
58-
59-
return (
60-
dependencies.get(pkg) ||
61-
devDependencies.get(pkg) ||
62-
peerDependencies.get(pkg)
63-
);
64-
}
65-
6635
export function getPackagesUsages({
6736
packages,
6837
fileGlobs,
@@ -78,7 +47,7 @@ export function getPackagesUsages({
7847
const result = packages.map((pkg) => {
7948
const fileUsages = sourceFiles
8049
.map((sourceFile) => getPackageUsage(pkg, sourceFile))
81-
.filter(Boolean);
50+
.filter(nonNullish);
8251

8352
return {
8453
name: pkg,

src/helpers.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import pkgup from 'pkg-up';
2+
3+
import { readFileSync } from 'fs';
4+
5+
// istanbul ignore next
6+
function getPackageJson(packageJsonCWD?: string) {
7+
const pkgJsonPath = pkgup.sync({ cwd: packageJsonCWD });
8+
9+
const { dependencies, peerDependencies, devDependencies } = JSON.parse(
10+
readFileSync(pkgJsonPath!, 'utf8')
11+
);
12+
13+
return {
14+
dependencies: new Map<string, string>(
15+
dependencies ? Object.entries(dependencies) : undefined
16+
),
17+
peerDependencies: new Map<string, string>(
18+
peerDependencies ? Object.entries(peerDependencies) : undefined
19+
),
20+
devDependencies: new Map<string, string>(
21+
devDependencies ? Object.entries(devDependencies) : undefined
22+
),
23+
};
24+
}
25+
26+
// istanbul ignore next
27+
export function getPackageVersion(pkg: string, packageJsonCWD?: string) {
28+
const { dependencies, peerDependencies, devDependencies } =
29+
getPackageJson(packageJsonCWD);
30+
31+
return (
32+
dependencies.get(pkg) ||
33+
devDependencies.get(pkg) ||
34+
peerDependencies.get(pkg)
35+
);
36+
}
37+
38+
export function nonNullish<Value>(v: Value): v is NonNullable<Value> {
39+
return v !== undefined && v !== null;
40+
}

src/types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ export type Options = {
66

77
export type FileUsage = {
88
name: string;
9+
filePath: string;
910
defaultImport: string | undefined;
1011
namedImports: string[];
1112
};
1213

1314
export type PackageUsage = {
1415
name: string;
1516
count: number;
16-
files?: (FileUsage | undefined)[];
17+
files?: FileUsage[];
1718
version?: string;
1819
};

tsconfig.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
"compilerOptions": {
44
"preserveConstEnums": true,
55
"declaration": true,
6-
"outDir": "dist"
6+
"outDir": "dist",
7+
"allowJs": true
78
},
89
"include": [
910
"src/**/*",
11+
"scripts/*",
1012
"__tests__/*",
1113
"node_modules/@tsconfig/node14/tsconfig.json"
1214
],

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,6 +1225,11 @@ combined-stream@^1.0.8:
12251225
dependencies:
12261226
delayed-stream "~1.0.0"
12271227

1228+
commander@^8.2.0:
1229+
version "8.2.0"
1230+
resolved "https://registry.yarnpkg.com/commander/-/commander-8.2.0.tgz#37fe2bde301d87d47a53adeff8b5915db1381ca8"
1231+
integrity sha512-LLKxDvHeL91/8MIyTAD5BFMNtoIwztGPMiM/7Bl8rIPmHCZXRxmSWr91h57dpOpnQ6jIUqEWdXE/uBYMfiVZDA==
1232+
12281233
commitizen@^4.0.3, commitizen@^4.2.4:
12291234
version "4.2.4"
12301235
resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.2.4.tgz#a3e5b36bd7575f6bf6e7aa19dbbf06b0d8f37165"

0 commit comments

Comments
 (0)