Skip to content

Commit

Permalink
tweak API
Browse files Browse the repository at this point in the history
  • Loading branch information
iamstarkov committed Apr 29, 2016
1 parent c26cf50 commit 308a363
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 99 deletions.
76 changes: 43 additions & 33 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,36 @@

npm install --save es-dep-kit

## API

Every function requires one `dep` argument — `Object` described by [es-dep-unit][es-dep-unit].

* `_requested` — returns `dep.requested`
* `_from` — returns `dep.from`
* `_resolved` — returns `dep.resolved`

* `isEntry` — true if `dep.requested` is `null`
* `isRequestedPackage` — true if `dep.requested` is not a local file
* `isRequestedLocalFile` — true if `dep.requested` is a local file
* `isResolvedInNM` — true if `dep.resolved` contains `node_modules`
* `isRequestedFromNM` — true if `dep.from` contains `node_modules`
* `isResolved` — true if `dep.resolved` is not `null`
* `isNotResolved` — true if `dep.resolved` is `null`
* `isThirdParty` — true if `dep` is not direct dependency: not local file and not `package` being requested from local file

## Usage

```js
import kit from 'es-dep-kit';
import { esDepUnit as dep } from 'es-dep-unit';

// arguments are `requested`, `from` and `resolved` respectively
// is string is relative path, it concatenated with `process.cwd()`
// if string is relative path, it will be prepended with `process.cwd()`
const entry = dep(null, null, 'index.js');

const file = dep('./file', 'index.js', 'file.js');
const fileExtra = dep('./file-extra', 'index.js', null);

const folder = dep('./folder', 'index.js', 'folder/index.js');
const folderExtra = dep('./folder-extra', 'index.js', null);

const pkg = dep('pkg', 'index.js', 'node_modules/pkg/index.js');
const pkgExtra = dep('pkg-extra', 'index.js', null);

Expand All @@ -40,42 +54,38 @@ const nestedPkgExtra = dep('nested-pkg-extra', 'node_modules/pkg/index.js', null
const nestedPkgFile = dep('./nested-pkg-file', 'node_modules/pkg/node_modules/nested-pkg/index.js', 'node_modules/pkg/node_modules/nested-pkg/file.js'); // eslint-disable-line
const nestedPkgFileExtra = dep('./nested-pkg-file-extra', 'node_modules/pkg/node_modules/nested-pkg/index.js', null); // eslint-disable-line

kit._requested(file); //
kit._resolved(); //
kit._from(); //
kit.isEntry(); //
kit.requestedModule(); //
kit.requestedLocalFile(); //
kit.inNodeModules(); //
kit.requestedFromNodeModules(); //
kit.resolved(); //
kit.notResolved(); //
kit.isThirdParty(); //
```
kit._requested(file); // ./file
kit._resolved(file); // /Users/iamstarkov/projects/es-dep-kit/file.js
kit._from(file); // /Users/iamstarkov/projects/es-dep-kit/index.js

## API

### esDepKit(input, [options])

### esDepKitAsync(input, [options])
kit.isEntry(entry); // true
kit.isEntry(file); // false

Return a promise that resolves to `result`.
kit.isRequestedPackage(file); // false
kit.isRequestedPackage(pkg); // true

#### input
kit.isRequestedLocalFile(file); // true
kit.isRequestedLocalFile(pkg); // false
kit.isRequestedLocalFile(pkgFile); // true
kit.isRequestedLocalFile(nestedPkg); // false

*Required*
Type: `String`
kit.isResolvedInNM(file); // false
kit.isResolvedInNM(pkg); // true
kit.isResolvedInNM(pkgExtra); // false

Lorem ipsum.
kit.isRequestedFromNM(file); // false
kit.isRequestedFromNM(pkg); // false
kit.isRequestedFromNM(nestedPkg); // true

#### options
kit.isResolved(file); // true
kit.isNotResolved(fileExtra); // true

##### foo

Type: `Boolean`
Default: `false`

Lorem ipsum.
kit.isThirdParty(file); // false
kit.isThirdParty(pkg); // false
kit.isThirdParty(pkgFile); // true
kit.isThirdParty(nestedPkg); // true
kit.isThirdParty(nestedPkgFile); // true
```

## Related

Expand Down
59 changes: 29 additions & 30 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,87 +13,86 @@ const _isLocalFile = R.pipe(
R.either(pathIsAbsolute, pathIsRelative)
);

// _isModule :: String -> Boolean
const _isModule = R.pipe(
// _isPackage :: String -> Boolean
const _isPackage = R.pipe(
contract('path', String),
R.complement(_isLocalFile)
);

// _requested :: Object -> String
const _requested = R.prop('requested');

// _resolved :: Object -> String
const _resolved = R.prop('resolved');

// _from :: Object -> String
const _from = R.prop('from');

// requestedModule :: Object -> Boolean
// _resolved :: Object -> String
const _resolved = R.prop('resolved');

// isEntry :: Object -> Boolean
const isEntry = R.unary(R.pipe(
contract('dep', Object),
_requested,
R.isNil
));

// requestedModule :: Object -> Boolean
const requestedModule = R.unary(R.pipe(
// isRequestedPackage :: Object -> Boolean
const isRequestedPackage = R.unary(R.pipe(
contract('dep', Object),
_requested,
R.ifElse(isNotNil, _isModule, R.F)
R.ifElse(isNotNil, _isPackage, R.F)
));

// requestedLocalFile :: Object -> Boolean
const requestedLocalFile = R.unary(R.pipe(
// isRequestedLocalFile :: Object -> Boolean
const isRequestedLocalFile = R.unary(R.pipe(
contract('dep', Object),
_requested,
R.ifElse(isNotNil, _isLocalFile, R.F)
));

// inNodeModules :: Object -> Boolean
const inNodeModules = R.unary(R.pipe(
// isResolvedInNM :: Object -> Boolean
const isResolvedInNM = R.unary(R.pipe(
contract('dep', Object),
_resolved,
R.ifElse(isNotNil, R.test(/node_modules/), R.F)
));

// requestedFromNodeModules :: Object -> Boolean
const requestedFromNodeModules = R.unary(R.pipe(
// isRequestedFromNM :: Object -> Boolean
const isRequestedFromNM = R.unary(R.pipe(
contract('dep', Object),
_from,
R.ifElse(isNotNil, R.test(/node_modules/), R.F)
));

// resolved :: Object -> Boolean
const resolved = R.unary(R.pipe(
// isResolved :: Object -> Boolean
const isResolved = R.unary(R.pipe(
contract('dep', Object),
_resolved,
isNotNil
));

// notResolved :: Object -> Boolean
const notResolved = R.unary(R.pipe(
// isNotResolved :: Object -> Boolean
const isNotResolved = R.unary(R.pipe(
contract('dep', Object),
_resolved,
R.isNil
R.complement(isResolved)
));

// isThirdParty :: Object -> Boolean
const isThirdParty = R.cond([
[isEntry, R.F],
[requestedModule, requestedFromNodeModules],
[requestedLocalFile, R.either(requestedFromNodeModules, inNodeModules)],
[isRequestedPackage, isRequestedFromNM],
[isRequestedLocalFile, R.either(isRequestedFromNM, isResolvedInNM)],
]);

export default {
_requested,
_resolved,
_from,
_resolved,
isEntry,
requestedModule,
requestedLocalFile,
inNodeModules,
requestedFromNodeModules,
resolved,
notResolved,
isRequestedPackage,
isRequestedLocalFile,
isResolvedInNM,
isRequestedFromNM,
isResolved,
isNotResolved,
isThirdParty,
};
60 changes: 24 additions & 36 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ const entry = dep(null, null, 'index.js');
const file = dep('./file', 'index.js', 'file.js');
const fileExtra = dep('./file-extra', 'index.js', null);

const folder = dep('./folder', 'index.js', 'folder/index.js');
const folderExtra = dep('./folder-extra', 'index.js', null);

const pkg = dep('pkg', 'index.js', 'node_modules/pkg/index.js');
const pkgExtra = dep('pkg-extra', 'index.js', null);

Expand All @@ -26,7 +23,6 @@ const nestedPkgFileExtra = dep('./nested-pkg-file-extra', 'node_modules/pkg/node
const cases = [
entry,
file, fileExtra,
folder, folderExtra,
pkg, pkgExtra,
pkgFile, pkgFileExtra,
nestedPkg, nestedPkgExtra,
Expand All @@ -37,7 +33,6 @@ test('isEntry', t => {
const expected = [
true, // entry
false, false, // file
false, false, // folder
false, false, // pkg
false, false, // pkgFile
false, false, // nestedPkg
Expand All @@ -50,113 +45,106 @@ test('isEntry', t => {
test('isEntry: empty input', t => t.throws(() => { kit.isEntry(); }, TypeError));
test('isEntry: invalid input', t => t.throws(() => { kit.isEntry(2); }, TypeError));

test('requestedModule', t => {
test('isRequestedPackage', t => {
const expected = [
false, // entry
false, false, // file
false, false, // folder
true, true, // pkg
false, false, // pkgFile
true, true, // nestedPkg
false, false, // nestedPkgFile
];
expected.forEach((item, i) => {
t.is(kit.requestedModule(cases[i]), expected[i]);
t.is(kit.isRequestedPackage(cases[i]), expected[i]);
});
});
test('requestedModule: empty input', t => t.throws(() => { kit.requestedModule(); }, TypeError));
test('requestedModule: invalid input', t => t.throws(() => { kit.requestedModule(2); }, TypeError));
test('isRequestedPackage: empty input', t => t.throws(() => { kit.isRequestedPackage(); }, TypeError)); // eslint-disable-line
test('isRequestedPackage: invalid input', t => t.throws(() => { kit.isRequestedPackage(2); }, TypeError)); // eslint-disable-line

test('requestedLocalFile', t => {
test('isRequestedLocalFile', t => {
const expected = [
false, // entry
true, true, // file
true, true, // folder
false, false, // pkg
true, true, // pkgFile
false, false, // nestedPkg
true, true, // nestedPkgFile
];
expected.forEach((item, i) => {
t.is(kit.requestedLocalFile(cases[i]), expected[i]);
t.is(kit.isRequestedLocalFile(cases[i]), expected[i]);
});
});
test('requestedLocalFile: empty input', t => t.throws(() => { kit.requestedLocalFile(); }, TypeError));
test('requestedLocalFile: invalid input', t => t.throws(() => { kit.requestedLocalFile(2); }, TypeError));
test('isRequestedLocalFile: empty input', t => t.throws(() => { kit.isRequestedLocalFile(); }, TypeError)); // eslint-disable-line
test('isRequestedLocalFile: invalid input', t => t.throws(() => { kit.isRequestedLocalFile(2); }, TypeError)); // eslint-disable-line

test('inNodeModules', t => {
test('isResolvedInNM', t => {
const expected = [
false, // entry
false, false, // file
false, false, // folder
true, false, // pkg
true, false, // pkgFile
true, false, // nestedPkg
true, false, // nestedPkgFile
];
expected.forEach((item, i) => {
t.is(kit.inNodeModules(cases[i]), expected[i]);
t.is(kit.isResolvedInNM(cases[i]), expected[i]);
});
});
test('inNodeModules: empty input', t => t.throws(() => { kit.inNodeModules(); }, TypeError));
test('inNodeModules: invalid input', t => t.throws(() => { kit.inNodeModules(2); }, TypeError));
test('isResolvedInNM: empty input', t => t.throws(() => { kit.isResolvedInNM(); }, TypeError));
test('isResolvedInNM: invalid input', t => t.throws(() => { kit.isResolvedInNM(2); }, TypeError));

test('requestedFromNodeModules', t => {
test('isRequestedFromNM', t => {
const expected = [
false, // entry
false, false, // file
false, false, // folder
false, false, // pkg
true, true, // pkgFile
true, true, // nestedPkg
true, true, // nestedPkgFile
];
expected.forEach((item, i) => {
t.is(kit.requestedFromNodeModules(cases[i]), expected[i]);
t.is(kit.isRequestedFromNM(cases[i]), expected[i]);
});
});
test('requestedFromNodeModules: empty input', t => t.throws(() => { kit.requestedFromNodeModules(); }, TypeError)); // eslint-disable-line
test('requestedFromNodeModules: invalid input', t => t.throws(() => { kit.requestedFromNodeModules(2); }, TypeError)); // eslint-disable-line
test('isRequestedFromNM: empty input', t => t.throws(() => { kit.isRequestedFromNM(); }, TypeError)); // eslint-disable-line
test('isRequestedFromNM: invalid input', t => t.throws(() => { kit.isRequestedFromNM(2); }, TypeError)); // eslint-disable-line

test('resolved', t => {
test('is resolved', t => {
const expected = [
true, // entry
true, false, // file
true, false, // folder
true, false, // pkg
true, false, // pkgFile
true, false, // nestedPkg
true, false, // nestedPkgFile
];
expected.forEach((item, i) => {
t.is(kit.resolved(cases[i]), expected[i]);
t.is(kit.isResolved(cases[i]), expected[i]);
});
});
test('resolved: empty input', t => t.throws(() => { kit.resolved(); }, TypeError));
test('resolved: invalid input', t => t.throws(() => { kit.resolved(2); }, TypeError));
test('isResolved: empty input', t => t.throws(() => { kit.isResolved(); }, TypeError));
test('isResolved: invalid input', t => t.throws(() => { kit.isResolved(2); }, TypeError));

test('not resolved', t => {
test('is not resolved', t => {
const expected = [
false, // entry
false, true, // file
false, true, // folder
false, true, // pkg
false, true, // pkgFile
false, true, // nestedPkg
false, true, // nestedPkgFile
];
expected.forEach((item, i) => {
t.is(kit.notResolved(cases[i]), expected[i]);
t.is(kit.isNotResolved(cases[i]), expected[i]);
});
});
test('notResolved: empty input', t => t.throws(() => { kit.notResolved(); }, TypeError));
test('notResolved: invalid input', t => t.throws(() => { kit.notResolved(2); }, TypeError));
test('isNotResolved: empty input', t => t.throws(() => { kit.isNotResolved(); }, TypeError));
test('isNotResolved: invalid input', t => t.throws(() => { kit.isNotResolved(2); }, TypeError));

test('isThirdParty', t => {
const expected = [
false, // entry
false, false, // file
false, false, // folder
false, false, // pkg
true, true, // pkgFile
true, true, // nestedPkg
Expand Down

0 comments on commit 308a363

Please sign in to comment.