@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 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;
@@ -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;
@@ -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 function watch({ files, directories, missing, aggregateTimeout, startTime }: WatchOptions, cb: WatchCallback): () => void;
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;
@@ -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() }, cb) {
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
- cb({
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shuvi/utils",
3
- "version": "1.0.0-rc.4",
3
+ "version": "1.0.0-rc.7",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/shuvijs/shuvi.git",
@@ -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 {};
@@ -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;