@shuvi/utils 1.0.0-rc.4 → 1.0.0-rc.7
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/lib/async.d.ts +19 -0
- package/lib/async.js +56 -0
- package/lib/events.d.ts +18 -0
- package/lib/events.js +46 -0
- package/lib/fileWatcher.d.ts +2 -1
- package/lib/fileWatcher.js +6 -2
- package/package.json +1 -1
- package/lib/eventEmitter.d.ts +0 -8
- package/lib/eventEmitter.js +0 -24
package/lib/async.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare type Results<T = any> = T[] & {
|
|
2
|
+
first: T;
|
|
3
|
+
_firstFlag: boolean;
|
|
4
|
+
};
|
|
5
|
+
export declare type SimpleCallback = () => any;
|
|
6
|
+
export interface AsyncParallelIteratorCallback<T = unknown, E = unknown> {
|
|
7
|
+
(err?: E | null, value?: T): void;
|
|
8
|
+
}
|
|
9
|
+
export interface AsyncParallelIterator<T, E> {
|
|
10
|
+
(item: T, callback: AsyncParallelIteratorCallback<T, E>): void;
|
|
11
|
+
}
|
|
12
|
+
export interface AsyncIterator<T, E> {
|
|
13
|
+
(item: T, callback: ErrorCallback<E>): void;
|
|
14
|
+
}
|
|
15
|
+
export interface ErrorCallback<T> {
|
|
16
|
+
(err?: T | null): void;
|
|
17
|
+
}
|
|
18
|
+
export declare type AsyncParallelCallback<T, E> = (finishedNum: number, values: Results<T>, errors: Results<E>, done: SimpleCallback) => any;
|
|
19
|
+
export declare function each<T = unknown, E = unknown>(targets: T[], handler: AsyncIterator<T, E>, cb?: ErrorCallback<E>): void;
|
package/lib/async.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.each = void 0;
|
|
4
|
+
function runParallel(targets, handler, cb) {
|
|
5
|
+
const values = [];
|
|
6
|
+
const errors = [];
|
|
7
|
+
let finishedNum = 0;
|
|
8
|
+
let abort = false;
|
|
9
|
+
const done = () => {
|
|
10
|
+
abort = true;
|
|
11
|
+
};
|
|
12
|
+
if (targets.length <= 0) {
|
|
13
|
+
return cb(finishedNum, values, errors, done);
|
|
14
|
+
}
|
|
15
|
+
const handlerCallback = (index) => {
|
|
16
|
+
let called = false;
|
|
17
|
+
return (err, value) => {
|
|
18
|
+
if (called) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
called = true;
|
|
22
|
+
if (abort) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
finishedNum++;
|
|
26
|
+
if (err) {
|
|
27
|
+
if (!errors.first) {
|
|
28
|
+
errors.first = err;
|
|
29
|
+
}
|
|
30
|
+
errors[index] = err;
|
|
31
|
+
return cb(finishedNum, values, errors, done);
|
|
32
|
+
}
|
|
33
|
+
if (!values._firstFlag) {
|
|
34
|
+
values._firstFlag = true;
|
|
35
|
+
values[index] = value;
|
|
36
|
+
}
|
|
37
|
+
cb(finishedNum, values, errors, done);
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
targets.forEach((t, index) => {
|
|
41
|
+
handler(t, handlerCallback(index));
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function each(targets, handler, cb) {
|
|
45
|
+
runParallel(targets, handler, (finishedNum, values, errors, done) => {
|
|
46
|
+
if (errors.first) {
|
|
47
|
+
done();
|
|
48
|
+
return cb && cb(errors.first);
|
|
49
|
+
}
|
|
50
|
+
if (finishedNum === targets.length) {
|
|
51
|
+
done();
|
|
52
|
+
cb && cb(null);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
exports.each = each;
|
package/lib/events.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
declare type AnyHandler = (...args: any) => void;
|
|
2
|
+
export declare type RemoveListenerCallback = () => void | undefined;
|
|
3
|
+
export declare type Event<F extends AnyHandler> = {
|
|
4
|
+
toArray: () => F[];
|
|
5
|
+
length: number;
|
|
6
|
+
on: (fn: F) => RemoveListenerCallback;
|
|
7
|
+
emit: (...arg: Parameters<F>) => void;
|
|
8
|
+
};
|
|
9
|
+
export interface EventMap {
|
|
10
|
+
[key: string]: AnyHandler;
|
|
11
|
+
}
|
|
12
|
+
export declare type Events<EM extends EventMap = EventMap> = {
|
|
13
|
+
on<Name extends keyof EM, Handler = EM[Name]>(type: Name, handler: Handler): RemoveListenerCallback;
|
|
14
|
+
emit<Name extends keyof EM, Handler extends AnyHandler = EM[Name]>(type: string, ...args: Parameters<Handler>): void;
|
|
15
|
+
};
|
|
16
|
+
export declare function createEvent<F extends AnyHandler>(): Event<F>;
|
|
17
|
+
export declare function createEvents<EM extends EventMap = EventMap>(): Events<EM>;
|
|
18
|
+
export {};
|
package/lib/events.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createEvents = exports.createEvent = void 0;
|
|
4
|
+
function createEvent() {
|
|
5
|
+
let handlers = [];
|
|
6
|
+
return {
|
|
7
|
+
get length() {
|
|
8
|
+
return handlers.length;
|
|
9
|
+
},
|
|
10
|
+
toArray() {
|
|
11
|
+
return handlers;
|
|
12
|
+
},
|
|
13
|
+
on(fn) {
|
|
14
|
+
handlers.push(fn);
|
|
15
|
+
return function () {
|
|
16
|
+
handlers = handlers.filter(handler => handler !== fn);
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
emit(...arg) {
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
handlers.forEach(fn => fn && fn(...arg));
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
exports.createEvent = createEvent;
|
|
26
|
+
function createEvents() {
|
|
27
|
+
const all = Object.create(null);
|
|
28
|
+
return {
|
|
29
|
+
on(type, handler) {
|
|
30
|
+
(all[type] || (all[type] = [])).push(handler);
|
|
31
|
+
return () => {
|
|
32
|
+
const index = all[type].indexOf(handler);
|
|
33
|
+
if (index > -1) {
|
|
34
|
+
all[type].splice(index, 1);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
emit(type, ...args) {
|
|
39
|
+
(all[type] || []).slice().forEach(handler => {
|
|
40
|
+
// @ts-ignore
|
|
41
|
+
handler(...args);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
exports.createEvents = createEvents;
|
package/lib/fileWatcher.d.ts
CHANGED
|
@@ -13,4 +13,5 @@ export interface WatchOptions {
|
|
|
13
13
|
startTime?: number;
|
|
14
14
|
}
|
|
15
15
|
export declare type WatchCallback = (event: WatchEvent) => void;
|
|
16
|
-
export declare
|
|
16
|
+
export declare type ChangeCallback = (file: string, time: number) => void;
|
|
17
|
+
export declare function watch({ files, directories, missing, aggregateTimeout, startTime }: WatchOptions, callback: WatchCallback, callbackUndelayed?: ChangeCallback): () => void;
|
package/lib/fileWatcher.js
CHANGED
|
@@ -16,7 +16,7 @@ const options = {
|
|
|
16
16
|
// ignored: /regexp/ - a regular expression for files or folders that should not be watched
|
|
17
17
|
// All subdirectories are ignored too
|
|
18
18
|
};
|
|
19
|
-
function watch({ files, directories, missing, aggregateTimeout, startTime = Date.now() },
|
|
19
|
+
function watch({ files, directories, missing, aggregateTimeout, startTime = Date.now() }, callback, callbackUndelayed) {
|
|
20
20
|
const watchPackOptions = Object.assign({}, options);
|
|
21
21
|
if (aggregateTimeout !== undefined) {
|
|
22
22
|
watchPackOptions.aggregateTimeout = aggregateTimeout;
|
|
@@ -24,7 +24,7 @@ function watch({ files, directories, missing, aggregateTimeout, startTime = Date
|
|
|
24
24
|
const wp = new watchpack_1.default(watchPackOptions);
|
|
25
25
|
wp.on('aggregated', (changes, removals) => {
|
|
26
26
|
const knownFiles = wp.getTimeInfoEntries();
|
|
27
|
-
|
|
27
|
+
callback({
|
|
28
28
|
changes: Array.from(changes),
|
|
29
29
|
removals: Array.from(removals),
|
|
30
30
|
getAllFiles() {
|
|
@@ -38,6 +38,10 @@ function watch({ files, directories, missing, aggregateTimeout, startTime = Date
|
|
|
38
38
|
}
|
|
39
39
|
});
|
|
40
40
|
});
|
|
41
|
+
if (callbackUndelayed) {
|
|
42
|
+
wp.on('change', callbackUndelayed);
|
|
43
|
+
wp.on('remove', callbackUndelayed);
|
|
44
|
+
}
|
|
41
45
|
wp.watch({ files, directories, missing, startTime });
|
|
42
46
|
return () => {
|
|
43
47
|
wp.close();
|
package/package.json
CHANGED
package/lib/eventEmitter.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
declare type Handler = (...evts: any[]) => void;
|
|
2
|
-
export declare type EventEmitter<F extends Function = Handler> = {
|
|
3
|
-
on(type: string, handler: F): void;
|
|
4
|
-
off(type: string, handler: F): void;
|
|
5
|
-
emit(type: string, ...evts: any[]): void;
|
|
6
|
-
};
|
|
7
|
-
export default function emitter<F extends Function = Handler>(): EventEmitter<F>;
|
|
8
|
-
export {};
|
package/lib/eventEmitter.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
function emitter() {
|
|
4
|
-
const all = Object.create(null);
|
|
5
|
-
return {
|
|
6
|
-
on(type, handler) {
|
|
7
|
-
(all[type] || (all[type] = [])).push(handler);
|
|
8
|
-
},
|
|
9
|
-
off(type, handler) {
|
|
10
|
-
if (all[type]) {
|
|
11
|
-
const index = all[type].indexOf(handler);
|
|
12
|
-
if (index >= 0) {
|
|
13
|
-
all[type].splice(index, 1);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
emit(type, ...evts) {
|
|
18
|
-
(all[type] || []).slice().forEach((handler) => {
|
|
19
|
-
handler(...evts);
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
exports.default = emitter;
|