just-task 1.8.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +46 -1
- package/CHANGELOG.md +18 -2
- package/lib/cli.js +3 -0
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +3 -2
- package/lib/enableTypeScript.d.ts +2 -1
- package/lib/enableTypeScript.d.ts.map +1 -1
- package/lib/enableTypeScript.js +3 -3
- package/package.json +2 -2
- package/src/cli.ts +4 -0
- package/src/config.ts +3 -2
- package/src/enableTypeScript.ts +3 -3
- package/api-extractor.json +0 -4
- package/etc/just-task.api.md +0 -126
- package/src/__tests__/__mocks__/just-task.js +0 -5
- package/src/__tests__/chain.spec.ts +0 -50
- package/src/__tests__/resolve.spec.ts +0 -260
- package/src/__tests__/task.spec.ts +0 -65
- package/src/__tests__/watch.spec.ts +0 -38
package/CHANGELOG.json
CHANGED
|
@@ -2,7 +2,52 @@
|
|
|
2
2
|
"name": "just-task",
|
|
3
3
|
"entries": [
|
|
4
4
|
{
|
|
5
|
-
"date": "Tue,
|
|
5
|
+
"date": "Tue, 26 Mar 2024 00:12:31 GMT",
|
|
6
|
+
"version": "1.10.0",
|
|
7
|
+
"tag": "just-task_v1.10.0",
|
|
8
|
+
"comments": {
|
|
9
|
+
"minor": [
|
|
10
|
+
{
|
|
11
|
+
"author": "email not defined",
|
|
12
|
+
"package": "just-task",
|
|
13
|
+
"commit": "83bfae7bad6e4137a07ec633a5f5c910df1ffe67",
|
|
14
|
+
"comment": "Update dependency undertaker to v2"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"date": "Sat, 02 Mar 2024 08:01:34 GMT",
|
|
21
|
+
"version": "1.9.0",
|
|
22
|
+
"tag": "just-task_v1.9.0",
|
|
23
|
+
"comments": {
|
|
24
|
+
"none": [
|
|
25
|
+
{
|
|
26
|
+
"author": "elcraig@microsoft.com",
|
|
27
|
+
"package": "just-task",
|
|
28
|
+
"commit": "feb6217bf318c7d606c6147a4f5d6568572bb2f3",
|
|
29
|
+
"comment": "Update build setup"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"date": "Sat, 02 Mar 2024 02:16:34 GMT",
|
|
36
|
+
"version": "1.9.0",
|
|
37
|
+
"tag": "just-task_v1.9.0",
|
|
38
|
+
"comments": {
|
|
39
|
+
"minor": [
|
|
40
|
+
{
|
|
41
|
+
"author": "elcraig@microsoft.com",
|
|
42
|
+
"package": "just-task",
|
|
43
|
+
"commit": "f5c5378f4b41dbb07bc5b6889e284277a0bfe5ce",
|
|
44
|
+
"comment": "Add an option --esm to support imports of ESM packages"
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"date": "Tue, 12 Sep 2023 08:02:05 GMT",
|
|
6
51
|
"version": "1.8.0",
|
|
7
52
|
"tag": "just-task_v1.8.0",
|
|
8
53
|
"comments": {
|
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,28 @@
|
|
|
1
1
|
# Change Log - just-task
|
|
2
2
|
|
|
3
|
-
This log was last generated on Tue,
|
|
3
|
+
This log was last generated on Tue, 26 Mar 2024 00:12:31 GMT and should not be manually modified.
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
+
## 1.10.0
|
|
8
|
+
|
|
9
|
+
Tue, 26 Mar 2024 00:12:31 GMT
|
|
10
|
+
|
|
11
|
+
### Minor changes
|
|
12
|
+
|
|
13
|
+
- Update dependency undertaker to v2 (email not defined)
|
|
14
|
+
|
|
15
|
+
## 1.9.0
|
|
16
|
+
|
|
17
|
+
Sat, 02 Mar 2024 02:16:34 GMT
|
|
18
|
+
|
|
19
|
+
### Minor changes
|
|
20
|
+
|
|
21
|
+
- Add an option --esm to support imports of ESM packages (elcraig@microsoft.com)
|
|
22
|
+
|
|
7
23
|
## 1.8.0
|
|
8
24
|
|
|
9
|
-
Tue, 12 Sep 2023 08:
|
|
25
|
+
Tue, 12 Sep 2023 08:02:05 GMT
|
|
10
26
|
|
|
11
27
|
### Minor changes
|
|
12
28
|
|
package/lib/cli.js
CHANGED
|
@@ -36,6 +36,9 @@ option_1.option('config', {
|
|
|
36
36
|
option_1.option('defaultConfig', {
|
|
37
37
|
describe: 'path to a default just configuration file that will be used when the current project does not have a just configuration file. (includes the file name, e.g. /path/to/just.config.ts)',
|
|
38
38
|
});
|
|
39
|
+
option_1.option('esm', {
|
|
40
|
+
describe: 'Configure ts-node to support imports of ESM package (changes TS module/moduleResolution settings to Node16)',
|
|
41
|
+
});
|
|
39
42
|
const registry = undertaker_1.undertaker.registry();
|
|
40
43
|
const configModule = config_1.readConfig();
|
|
41
44
|
// Support named task function as exports of a config module
|
package/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,OAAO,WAAW,GAAG,QAAQ,cAAc,CAAC,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,GAAG,MAAM,GAAG,IAAI,CAS5E;AAED,wBAAgB,UAAU,IAAI;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,OAAO,WAAW,GAAG,QAAQ,cAAc,CAAC,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,GAAG,MAAM,GAAG,IAAI,CAS5E;AAED,wBAAgB,UAAU,IAAI;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,GAAG,IAAI,CAmCnE"}
|
package/lib/config.js
CHANGED
|
@@ -19,12 +19,13 @@ function resolveConfigFile(args) {
|
|
|
19
19
|
exports.resolveConfigFile = resolveConfigFile;
|
|
20
20
|
function readConfig() {
|
|
21
21
|
// uses a separate instance of yargs to first parse the config (without the --help in the way) so we can parse the configFile first regardless
|
|
22
|
-
const
|
|
22
|
+
const args = option_1.argv();
|
|
23
|
+
const configFile = resolveConfigFile(args);
|
|
23
24
|
if (configFile && fs.existsSync(configFile)) {
|
|
24
25
|
const ext = path.extname(configFile);
|
|
25
26
|
if (ext === '.ts' || ext === '.tsx') {
|
|
26
27
|
// TODO: add option to do typechecking as well
|
|
27
|
-
enableTypeScript_1.enableTypeScript({ transpileOnly: true });
|
|
28
|
+
enableTypeScript_1.enableTypeScript({ transpileOnly: true, esm: args.esm });
|
|
28
29
|
}
|
|
29
30
|
try {
|
|
30
31
|
const configModule = require(configFile);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enableTypeScript.d.ts","sourceRoot":"","sources":["../src/enableTypeScript.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAAC,EAAE,aAAoB,EAAE
|
|
1
|
+
{"version":3,"file":"enableTypeScript.d.ts","sourceRoot":"","sources":["../src/enableTypeScript.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAAC,EAAE,aAAoB,EAAE,GAAW,EAAE;;;CAAA,GAAG,IAAI,CA8B5E"}
|
package/lib/enableTypeScript.js
CHANGED
|
@@ -4,7 +4,7 @@ exports.enableTypeScript = void 0;
|
|
|
4
4
|
const resolve_1 = require("./resolve");
|
|
5
5
|
const just_task_logger_1 = require("just-task-logger");
|
|
6
6
|
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
7
|
-
function enableTypeScript({ transpileOnly = true }) {
|
|
7
|
+
function enableTypeScript({ transpileOnly = true, esm = false }) {
|
|
8
8
|
const tsNodeModule = resolve_1.resolve('ts-node');
|
|
9
9
|
if (tsNodeModule) {
|
|
10
10
|
const tsNode = require(tsNodeModule);
|
|
@@ -13,11 +13,11 @@ function enableTypeScript({ transpileOnly = true }) {
|
|
|
13
13
|
skipProject: true,
|
|
14
14
|
compilerOptions: {
|
|
15
15
|
target: 'es2017',
|
|
16
|
-
module: 'commonjs',
|
|
16
|
+
module: esm ? 'node16' : 'commonjs',
|
|
17
17
|
strict: false,
|
|
18
18
|
skipLibCheck: true,
|
|
19
19
|
skipDefaultLibCheck: true,
|
|
20
|
-
moduleResolution: 'node',
|
|
20
|
+
moduleResolution: esm ? 'node16' : 'node',
|
|
21
21
|
allowJs: true,
|
|
22
22
|
esModuleInterop: true,
|
|
23
23
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "just-task",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.0",
|
|
4
4
|
"description": "Build task definition library",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"repository": {
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"fs-extra": "^11.0.0",
|
|
37
37
|
"just-task-logger": ">=1.2.1 <2.0.0",
|
|
38
38
|
"resolve": "^1.19.0",
|
|
39
|
-
"undertaker": "^
|
|
39
|
+
"undertaker": "^2.0.0",
|
|
40
40
|
"undertaker-registry": "^2.0.0",
|
|
41
41
|
"yargs-parser": "^20.2.3"
|
|
42
42
|
},
|
package/src/cli.ts
CHANGED
|
@@ -47,6 +47,10 @@ option('defaultConfig', {
|
|
|
47
47
|
describe:
|
|
48
48
|
'path to a default just configuration file that will be used when the current project does not have a just configuration file. (includes the file name, e.g. /path/to/just.config.ts)',
|
|
49
49
|
});
|
|
50
|
+
option('esm', {
|
|
51
|
+
describe:
|
|
52
|
+
'Configure ts-node to support imports of ESM package (changes TS module/moduleResolution settings to Node16)',
|
|
53
|
+
});
|
|
50
54
|
|
|
51
55
|
const registry = undertaker.registry();
|
|
52
56
|
|
package/src/config.ts
CHANGED
|
@@ -21,13 +21,14 @@ export function resolveConfigFile(args: yargsParser.Arguments): string | null {
|
|
|
21
21
|
|
|
22
22
|
export function readConfig(): { [key: string]: TaskFunction } | void {
|
|
23
23
|
// uses a separate instance of yargs to first parse the config (without the --help in the way) so we can parse the configFile first regardless
|
|
24
|
-
const
|
|
24
|
+
const args = argv();
|
|
25
|
+
const configFile = resolveConfigFile(args);
|
|
25
26
|
|
|
26
27
|
if (configFile && fs.existsSync(configFile)) {
|
|
27
28
|
const ext = path.extname(configFile);
|
|
28
29
|
if (ext === '.ts' || ext === '.tsx') {
|
|
29
30
|
// TODO: add option to do typechecking as well
|
|
30
|
-
enableTypeScript({ transpileOnly: true });
|
|
31
|
+
enableTypeScript({ transpileOnly: true, esm: args.esm });
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
try {
|
package/src/enableTypeScript.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { resolve } from './resolve';
|
|
|
2
2
|
import { logger } from 'just-task-logger';
|
|
3
3
|
|
|
4
4
|
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
5
|
-
export function enableTypeScript({ transpileOnly = true }): void {
|
|
5
|
+
export function enableTypeScript({ transpileOnly = true, esm = false }): void {
|
|
6
6
|
const tsNodeModule = resolve('ts-node');
|
|
7
7
|
if (tsNodeModule) {
|
|
8
8
|
const tsNode = require(tsNodeModule);
|
|
@@ -11,11 +11,11 @@ export function enableTypeScript({ transpileOnly = true }): void {
|
|
|
11
11
|
skipProject: true,
|
|
12
12
|
compilerOptions: {
|
|
13
13
|
target: 'es2017',
|
|
14
|
-
module: 'commonjs',
|
|
14
|
+
module: esm ? 'node16' : 'commonjs',
|
|
15
15
|
strict: false,
|
|
16
16
|
skipLibCheck: true,
|
|
17
17
|
skipDefaultLibCheck: true,
|
|
18
|
-
moduleResolution: 'node',
|
|
18
|
+
moduleResolution: esm ? 'node16' : 'node',
|
|
19
19
|
allowJs: true,
|
|
20
20
|
esModuleInterop: true,
|
|
21
21
|
},
|
package/api-extractor.json
DELETED
package/etc/just-task.api.md
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
## API Report File for "just-task"
|
|
2
|
-
|
|
3
|
-
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
|
|
4
|
-
|
|
5
|
-
```ts
|
|
6
|
-
|
|
7
|
-
/// <reference types="node" />
|
|
8
|
-
|
|
9
|
-
import { Arguments } from 'yargs-parser';
|
|
10
|
-
import { Duplex } from 'stream';
|
|
11
|
-
import type { FSWatcher } from 'chokidar';
|
|
12
|
-
import { Logger } from 'just-task-logger';
|
|
13
|
-
import type { Stats } from 'fs';
|
|
14
|
-
import { TaskFunction as TaskFunction_2 } from 'undertaker';
|
|
15
|
-
import { TaskFunctionParams } from 'undertaker';
|
|
16
|
-
import Undertaker = require('undertaker');
|
|
17
|
-
import type { WatchOptions } from 'chokidar';
|
|
18
|
-
|
|
19
|
-
// @public
|
|
20
|
-
export function addResolvePath(pathName: string): void;
|
|
21
|
-
|
|
22
|
-
// @public (undocumented)
|
|
23
|
-
export function argv(): Arguments;
|
|
24
|
-
|
|
25
|
-
// @public (undocumented)
|
|
26
|
-
export function chain(subjectTaskName: string): {
|
|
27
|
-
before: (taskName: string) => void;
|
|
28
|
-
after: (taskName: string) => void;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
// @public (undocumented)
|
|
32
|
-
export function clearCache(): void;
|
|
33
|
-
|
|
34
|
-
// @public (undocumented)
|
|
35
|
-
export function condition(taskName: string, conditional: () => boolean): TaskFunction_2;
|
|
36
|
-
|
|
37
|
-
// Warning: (ae-forgotten-export) The symbol "OptionConfig" needs to be exported by the entry point index.d.ts
|
|
38
|
-
//
|
|
39
|
-
// @public (undocumented)
|
|
40
|
-
export function option(key: string, options?: OptionConfig): void;
|
|
41
|
-
|
|
42
|
-
// @public (undocumented)
|
|
43
|
-
interface OptionConfig {
|
|
44
|
-
alias?: string | string[];
|
|
45
|
-
array?: boolean;
|
|
46
|
-
boolean?: boolean;
|
|
47
|
-
coerce?: (arg: any) => any;
|
|
48
|
-
count?: boolean;
|
|
49
|
-
default?: any;
|
|
50
|
-
describe?: string;
|
|
51
|
-
narg?: number;
|
|
52
|
-
normalize?: boolean;
|
|
53
|
-
number?: boolean;
|
|
54
|
-
string?: boolean;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// @public (undocumented)
|
|
58
|
-
export function parallel(...tasks: Task[]): Undertaker.TaskFunction;
|
|
59
|
-
|
|
60
|
-
// @public
|
|
61
|
-
export function resetResolvePaths(): void;
|
|
62
|
-
|
|
63
|
-
// Warning: (ae-forgotten-export) The symbol "ResolveOptions" needs to be exported by the entry point index.d.ts
|
|
64
|
-
//
|
|
65
|
-
// @public
|
|
66
|
-
export function resolve(moduleName: string, options?: ResolveOptions): string | null;
|
|
67
|
-
|
|
68
|
-
// @public @deprecated
|
|
69
|
-
export function resolve(moduleName: string, cwd?: string): string | null;
|
|
70
|
-
|
|
71
|
-
// @public
|
|
72
|
-
export function resolveCwd(moduleName: string, options?: ResolveOptions): string | null;
|
|
73
|
-
|
|
74
|
-
// @public @deprecated
|
|
75
|
-
export function resolveCwd(moduleName: string, cwd?: string): string | null;
|
|
76
|
-
|
|
77
|
-
// @public (undocumented)
|
|
78
|
-
interface ResolveOptions {
|
|
79
|
-
cwd?: string;
|
|
80
|
-
extensions?: string[];
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// @public (undocumented)
|
|
84
|
-
export function series(...tasks: Task[]): Undertaker.TaskFunction;
|
|
85
|
-
|
|
86
|
-
// @public (undocumented)
|
|
87
|
-
export type Task = string | TaskFunction;
|
|
88
|
-
|
|
89
|
-
// @public (undocumented)
|
|
90
|
-
export function task(firstParam: string | TaskFunction, secondParam?: string | TaskFunction, thirdParam?: TaskFunction): TaskFunction;
|
|
91
|
-
|
|
92
|
-
// @public (undocumented)
|
|
93
|
-
export interface TaskContext {
|
|
94
|
-
// (undocumented)
|
|
95
|
-
argv: Arguments;
|
|
96
|
-
// (undocumented)
|
|
97
|
-
logger: Logger;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// @public (undocumented)
|
|
101
|
-
export interface TaskFunction extends TaskFunctionParams {
|
|
102
|
-
// (undocumented)
|
|
103
|
-
(this: TaskContext, done: (error?: any) => void): void | Duplex | NodeJS.Process | Promise<never> | any;
|
|
104
|
-
// (undocumented)
|
|
105
|
-
cached?: () => void;
|
|
106
|
-
// (undocumented)
|
|
107
|
-
description?: string;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// @public (undocumented)
|
|
111
|
-
export const undertaker: Undertaker;
|
|
112
|
-
|
|
113
|
-
// Warning: (ae-forgotten-export) The symbol "WatchListener" needs to be exported by the entry point index.d.ts
|
|
114
|
-
//
|
|
115
|
-
// @public (undocumented)
|
|
116
|
-
export function watch(globs: string | string[], optionsOrListener?: WatchListener | WatchOptions | undefined, listener?: WatchListener | undefined): FSWatcher;
|
|
117
|
-
|
|
118
|
-
// @public (undocumented)
|
|
119
|
-
type WatchListener = (path: string, stats?: Stats) => void;
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
export * from "just-task-logger";
|
|
123
|
-
|
|
124
|
-
// (No @packageDocumentation comment for this package)
|
|
125
|
-
|
|
126
|
-
```
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { task } from '../task';
|
|
2
|
-
import { chain } from '../chain';
|
|
3
|
-
import { parallel } from '../undertaker';
|
|
4
|
-
|
|
5
|
-
describe('chain', () => {
|
|
6
|
-
it('allows tasks to be injected before another one after definition', done => {
|
|
7
|
-
const callOrder: number[] = [];
|
|
8
|
-
|
|
9
|
-
const test1Function = jest.fn(() => {
|
|
10
|
-
callOrder.push(1);
|
|
11
|
-
});
|
|
12
|
-
const test2Function = jest.fn(() => {
|
|
13
|
-
callOrder.push(2);
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
task('test1', test1Function);
|
|
17
|
-
task('test2', test2Function);
|
|
18
|
-
chain('test2').before('test1');
|
|
19
|
-
|
|
20
|
-
parallel('test1')(() => {
|
|
21
|
-
expect(test2Function).toBeCalledTimes(1);
|
|
22
|
-
expect(test1Function).toBeCalledTimes(1);
|
|
23
|
-
expect(callOrder).toEqual([2, 1]);
|
|
24
|
-
done();
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('allows tasks to be injected after another one', done => {
|
|
29
|
-
const callOrder: number[] = [];
|
|
30
|
-
|
|
31
|
-
const test1Function = jest.fn(() => {
|
|
32
|
-
callOrder.push(1);
|
|
33
|
-
});
|
|
34
|
-
const test2Function = jest.fn(() => {
|
|
35
|
-
callOrder.push(2);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
task('test1', test1Function);
|
|
39
|
-
task('test2', test2Function);
|
|
40
|
-
|
|
41
|
-
chain('test2').after('test1');
|
|
42
|
-
|
|
43
|
-
parallel('test1')(() => {
|
|
44
|
-
expect(test2Function).toBeCalledTimes(1);
|
|
45
|
-
expect(test1Function).toBeCalledTimes(1);
|
|
46
|
-
expect(callOrder).toEqual([1, 2]);
|
|
47
|
-
done();
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
});
|
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
import * as path from 'path';
|
|
2
|
-
import {
|
|
3
|
-
_isFileNameLike,
|
|
4
|
-
_tryResolve,
|
|
5
|
-
resetResolvePaths,
|
|
6
|
-
resolveCwd,
|
|
7
|
-
addResolvePath,
|
|
8
|
-
resolve,
|
|
9
|
-
_getResolvePaths,
|
|
10
|
-
} from '../resolve';
|
|
11
|
-
import * as option from '../option';
|
|
12
|
-
import * as config from '../config';
|
|
13
|
-
import * as mockfs from 'mock-fs';
|
|
14
|
-
|
|
15
|
-
describe('_isFileNameLike', () => {
|
|
16
|
-
it('returns false for empty input', () => {
|
|
17
|
-
expect(_isFileNameLike('')).toBe(false);
|
|
18
|
-
expect(_isFileNameLike(undefined as any)).toBe(false);
|
|
19
|
-
expect(_isFileNameLike(null as any)).toBe(false);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('returns true for filenames', () => {
|
|
23
|
-
expect(_isFileNameLike('.')).toBe(true);
|
|
24
|
-
expect(_isFileNameLike('.gitignore')).toBe(true);
|
|
25
|
-
expect(_isFileNameLike('foo.js')).toBe(true);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('returns false for possible non-filenames', () => {
|
|
29
|
-
expect(_isFileNameLike('foo')).toBe(false);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('returns false for names with separators', () => {
|
|
33
|
-
expect(_isFileNameLike('foo/bar')).toBe(false);
|
|
34
|
-
expect(_isFileNameLike('foo\\bar')).toBe(false);
|
|
35
|
-
expect(_isFileNameLike('foo/bar.txt')).toBe(false);
|
|
36
|
-
expect(_isFileNameLike('foo\\bar.txt')).toBe(false);
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
describe('_tryResolve', () => {
|
|
41
|
-
afterEach(() => {
|
|
42
|
-
mockfs.restore();
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('does not throw', () => {
|
|
46
|
-
expect(_tryResolve('foo', { cwd: 'bar' })).toBeNull();
|
|
47
|
-
expect(_tryResolve(undefined as any, undefined as any)).toBeNull();
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('does not recurse into child dirs', () => {
|
|
51
|
-
mockfs({
|
|
52
|
-
a: { 'b.txt': '' },
|
|
53
|
-
});
|
|
54
|
-
expect(_tryResolve('b.txt', { cwd: process.cwd() })).toBeNull();
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('resolves filename relative to basedir', () => {
|
|
58
|
-
mockfs({
|
|
59
|
-
a: { 'b.txt': '' }, // right
|
|
60
|
-
'b.txt': '', // wrong
|
|
61
|
-
});
|
|
62
|
-
expect(_tryResolve('b.txt', { cwd: 'a' })).toContain(path.join('a', 'b.txt'));
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('resolves non-filename relative to node_modules in basedir', () => {
|
|
66
|
-
mockfs({
|
|
67
|
-
a: {
|
|
68
|
-
'b.js': '', // wrong
|
|
69
|
-
node_modules: { 'b.js': '' }, // right
|
|
70
|
-
},
|
|
71
|
-
node_modules: { 'b.js': '' }, // wrong
|
|
72
|
-
});
|
|
73
|
-
expect(_tryResolve('b', { cwd: 'a' })).toContain(path.join('a', 'node_modules', 'b.js'));
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it('resolves path with /', () => {
|
|
77
|
-
mockfs({
|
|
78
|
-
a: { node_modules: { b: { 'c.js': '' } } },
|
|
79
|
-
});
|
|
80
|
-
expect(_tryResolve('b/c', { cwd: 'a' })).toContain(path.join('a', 'node_modules', 'b', 'c.js'));
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
describe('_getResolvePaths', () => {
|
|
85
|
-
afterEach(() => {
|
|
86
|
-
resetResolvePaths();
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it('uses resolvePaths for before __dirname', () => {
|
|
90
|
-
jest.spyOn(option, 'argv').mockImplementation(() => ({ config: 'config/just-task.js' } as any));
|
|
91
|
-
addResolvePath('custom1');
|
|
92
|
-
addResolvePath('custom2');
|
|
93
|
-
|
|
94
|
-
const paths = _getResolvePaths('cwd');
|
|
95
|
-
|
|
96
|
-
expect(paths.map(p => path.basename(p))).toEqual(['cwd', 'config', 'custom1', 'custom2', 'src']);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
describe('resolveCwd', () => {
|
|
101
|
-
beforeEach(() => {
|
|
102
|
-
jest.spyOn(option, 'argv').mockImplementation(() => ({ config: undefined } as any));
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
afterEach(() => {
|
|
106
|
-
mockfs.restore();
|
|
107
|
-
resetResolvePaths();
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
// Not testing this one extensively since it's basically a pass-through to _tryResolve
|
|
111
|
-
|
|
112
|
-
it('defaults to searching relative to process cwd', () => {
|
|
113
|
-
mockfs({
|
|
114
|
-
a: { 'b.txt': '' }, // right
|
|
115
|
-
'b.txt': '', // wrong
|
|
116
|
-
});
|
|
117
|
-
jest.spyOn(process, 'cwd').mockReturnValueOnce('a');
|
|
118
|
-
expect(resolveCwd('b.txt')).toContain(path.join('a', 'b.txt'));
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('uses provided cwd', () => {
|
|
122
|
-
mockfs({
|
|
123
|
-
a: { 'b.txt': '' }, // right
|
|
124
|
-
'b.txt': '', // wrong
|
|
125
|
-
});
|
|
126
|
-
expect(resolveCwd('b.txt', 'a')).toContain(path.join('a', 'b.txt'));
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it('ignores resolvePaths', () => {
|
|
130
|
-
mockfs({
|
|
131
|
-
a: { 'b.txt': '' },
|
|
132
|
-
});
|
|
133
|
-
addResolvePath('a');
|
|
134
|
-
expect(resolveCwd('b.txt')).toBeNull();
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
describe('resolve', () => {
|
|
139
|
-
jest.spyOn(option, 'argv').mockImplementation(() => ({ config: undefined } as any));
|
|
140
|
-
|
|
141
|
-
afterEach(() => {
|
|
142
|
-
mockfs.restore();
|
|
143
|
-
resetResolvePaths();
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
it('defaults to searching relative to process cwd', () => {
|
|
147
|
-
mockfs({
|
|
148
|
-
a: { 'b.txt': '' }, // right
|
|
149
|
-
'b.txt': '', // wrong
|
|
150
|
-
});
|
|
151
|
-
jest.spyOn(process, 'cwd').mockReturnValueOnce('a');
|
|
152
|
-
expect(resolve('b.txt')).toContain(path.join('a', 'b.txt'));
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
it('uses provided cwd', () => {
|
|
156
|
-
mockfs({
|
|
157
|
-
a: { 'b.txt': '' }, // right
|
|
158
|
-
'b.txt': '', // wrong
|
|
159
|
-
c: { 'b.txt': '' },
|
|
160
|
-
});
|
|
161
|
-
expect(resolve('b.txt', 'a')).toContain(path.join('a', 'b.txt'));
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
it('uses dirname of --config arg', () => {
|
|
165
|
-
mockfs({
|
|
166
|
-
a: { 'b.txt': '' },
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
jest.spyOn(option, 'argv').mockImplementation(() => ({ config: 'a/just-task.js' } as any));
|
|
170
|
-
|
|
171
|
-
expect(resolve('b.txt')).toContain(path.join('a', 'b.txt'));
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
it('uses resolvePaths for file', () => {
|
|
175
|
-
mockfs({
|
|
176
|
-
a: {},
|
|
177
|
-
c: { 'b.txt': '' },
|
|
178
|
-
});
|
|
179
|
-
addResolvePath('a');
|
|
180
|
-
addResolvePath('c');
|
|
181
|
-
expect(resolve('b.txt')).toContain(path.join('c', 'b.txt'));
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
it('prefers provided cwd', () => {
|
|
185
|
-
mockfs({
|
|
186
|
-
a: { 'b.txt': '' }, // right
|
|
187
|
-
c: { 'b.txt': '' }, // wrong
|
|
188
|
-
d: { 'b.txt': '' }, // wrong
|
|
189
|
-
'b.txt': '', // wrong
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
jest.spyOn(option, 'argv').mockImplementation(() => ({ config: 'a/just-task.js' } as any));
|
|
193
|
-
|
|
194
|
-
addResolvePath('c');
|
|
195
|
-
expect(resolve('b.txt', 'd')).toContain(path.join('d', 'b.txt'));
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
describe('resolveConfigFile', () => {
|
|
200
|
-
afterEach(() => {
|
|
201
|
-
mockfs.restore();
|
|
202
|
-
resetResolvePaths();
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
it('default chooses local config', () => {
|
|
206
|
-
mockfs({
|
|
207
|
-
config: {
|
|
208
|
-
'configArgument.ts': 'formConfig',
|
|
209
|
-
'defaultConfigArgument.ts': 'formDefaultConfig',
|
|
210
|
-
},
|
|
211
|
-
'just.config.ts': 'localConfig',
|
|
212
|
-
});
|
|
213
|
-
const resolvedConfig = config.resolveConfigFile({ config: undefined, defaultConfig: undefined } as any);
|
|
214
|
-
expect(resolvedConfig).toContain('just.config.ts');
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
it('config argument wins over local config and defaultConfig', () => {
|
|
218
|
-
mockfs({
|
|
219
|
-
config: {
|
|
220
|
-
'configArgument.ts': 'formConfig',
|
|
221
|
-
'defaultConfigArgument.ts': 'formDefaultConfig',
|
|
222
|
-
},
|
|
223
|
-
'just.config.ts': 'localConfig',
|
|
224
|
-
});
|
|
225
|
-
const resolvedConfig = config.resolveConfigFile({
|
|
226
|
-
config: './config/configArgument.ts',
|
|
227
|
-
defaultConfig: './config/defaultConfigArgument.ts',
|
|
228
|
-
} as any);
|
|
229
|
-
expect(resolvedConfig).toContain('configArgument.ts');
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
it('local config file wins over defaultConfig', () => {
|
|
233
|
-
mockfs({
|
|
234
|
-
config: {
|
|
235
|
-
'configArgument.ts': 'formConfig',
|
|
236
|
-
'defaultConfigArgument.ts': 'formDefaultConfig',
|
|
237
|
-
},
|
|
238
|
-
'just.config.ts': 'localConfig',
|
|
239
|
-
});
|
|
240
|
-
const resolvedConfig = config.resolveConfigFile({
|
|
241
|
-
config: undefined,
|
|
242
|
-
defaultConfig: './config/defaultConfigArgument.ts',
|
|
243
|
-
} as any);
|
|
244
|
-
expect(resolvedConfig).toContain('just.config.ts');
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
it('default config is used as last fallback', () => {
|
|
248
|
-
mockfs({
|
|
249
|
-
config: {
|
|
250
|
-
'configArgument.ts': 'formConfig',
|
|
251
|
-
'defaultConfigArgument.ts': 'formDefaultConfig',
|
|
252
|
-
},
|
|
253
|
-
});
|
|
254
|
-
const resolvedConfig = config.resolveConfigFile({
|
|
255
|
-
config: undefined,
|
|
256
|
-
defaultConfig: './config/defaultConfigArgument.ts',
|
|
257
|
-
} as any);
|
|
258
|
-
expect(resolvedConfig).toContain('defaultConfigArgument.ts');
|
|
259
|
-
});
|
|
260
|
-
});
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { task } from '../task';
|
|
2
|
-
import { parallel, undertaker } from '../undertaker';
|
|
3
|
-
import { logger } from '../logger';
|
|
4
|
-
import * as path from 'path';
|
|
5
|
-
import * as option from '../option';
|
|
6
|
-
import * as UndertakerRegistry from 'undertaker-registry';
|
|
7
|
-
|
|
8
|
-
describe('task', () => {
|
|
9
|
-
beforeAll(() => {
|
|
10
|
-
jest
|
|
11
|
-
.spyOn(option, 'argv')
|
|
12
|
-
.mockImplementation(() => ({ config: path.resolve(__dirname, '__mocks__/just-task.js') } as any));
|
|
13
|
-
jest.spyOn(logger, 'info').mockImplementation(() => undefined);
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
undertaker.registry(new UndertakerRegistry());
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
afterAll(() => {
|
|
21
|
-
jest.spyOn(option, 'argv').mockImplementation(() => ({ config: 'a/just-task.js' } as any));
|
|
22
|
-
jest.restoreAllMocks();
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('allows synchronous tasks to be defined and be run', done => {
|
|
26
|
-
const testFunction = jest.fn(() => undefined);
|
|
27
|
-
|
|
28
|
-
task('test', function () {
|
|
29
|
-
testFunction();
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
parallel('test')(function () {
|
|
33
|
-
expect(testFunction).toBeCalledTimes(1);
|
|
34
|
-
done();
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('allows callback-based tasks to be defined and be run', done => {
|
|
39
|
-
const testFunction = jest.fn(() => undefined);
|
|
40
|
-
|
|
41
|
-
task('test', function (cb) {
|
|
42
|
-
testFunction();
|
|
43
|
-
cb();
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
parallel('test')(function () {
|
|
47
|
-
expect(testFunction).toBeCalledTimes(1);
|
|
48
|
-
done();
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('allows promise-based tasks to be defined and be run', done => {
|
|
53
|
-
const testFunction = jest.fn(() => undefined);
|
|
54
|
-
|
|
55
|
-
task('test', function () {
|
|
56
|
-
const result = testFunction();
|
|
57
|
-
return Promise.resolve(result);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
parallel('test')(function () {
|
|
61
|
-
expect(testFunction).toBeCalledTimes(1);
|
|
62
|
-
done();
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
});
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { watch } from '../watch';
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
import * as path from 'path';
|
|
4
|
-
import * as os from 'os';
|
|
5
|
-
|
|
6
|
-
describe('watch', () => {
|
|
7
|
-
it('can take a synchronous taskFunction', done => {
|
|
8
|
-
const tmpDir = path.join(os.tmpdir(), fs.mkdtempSync('watch-sync'));
|
|
9
|
-
const changeFile = path.join(tmpDir, 'change.txt');
|
|
10
|
-
|
|
11
|
-
fs.mkdirSync(tmpDir, { recursive: true });
|
|
12
|
-
fs.writeFileSync(changeFile, 'to be changed');
|
|
13
|
-
|
|
14
|
-
const cleanup = () => {
|
|
15
|
-
watcher.close();
|
|
16
|
-
|
|
17
|
-
fs.unlinkSync(changeFile);
|
|
18
|
-
fs.rmdirSync(tmpDir);
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const callback = () => {
|
|
22
|
-
try {
|
|
23
|
-
expect(true).toBeTruthy();
|
|
24
|
-
cleanup();
|
|
25
|
-
done();
|
|
26
|
-
} catch (error) {
|
|
27
|
-
cleanup();
|
|
28
|
-
done(error);
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
const watcher = watch([path.join(changeFile)], callback);
|
|
33
|
-
|
|
34
|
-
watcher.on('ready', () => {
|
|
35
|
-
fs.writeFileSync(changeFile, 'new content');
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
});
|