@eggjs/watcher 4.0.4 → 4.0.5-beta.2

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.
Files changed (102) hide show
  1. package/README.md +1 -5
  2. package/dist/agent.d.ts +2 -0
  3. package/dist/agent.js +7 -0
  4. package/dist/app.d.ts +2 -0
  5. package/dist/app.js +7 -0
  6. package/dist/config/config.default.d.ts +13 -0
  7. package/dist/config/config.default.js +14 -0
  8. package/dist/config/config.local.d.ts +8 -0
  9. package/dist/config/config.local.js +5 -0
  10. package/dist/config/config.unittest.d.ts +8 -0
  11. package/dist/config/config.unittest.js +5 -0
  12. package/dist/index.d.ts +6 -0
  13. package/dist/index.js +7 -0
  14. package/dist/lib/boot.d.ts +10 -0
  15. package/dist/lib/boot.js +19 -0
  16. package/dist/lib/event-sources/base.d.ts +9 -0
  17. package/dist/lib/event-sources/base.js +7 -0
  18. package/dist/lib/event-sources/default.d.ts +10 -0
  19. package/dist/lib/event-sources/default.js +19 -0
  20. package/dist/lib/event-sources/development.d.ts +11 -0
  21. package/dist/lib/event-sources/development.js +66 -0
  22. package/dist/lib/event-sources/index.d.ts +4 -0
  23. package/dist/lib/event-sources/index.js +5 -0
  24. package/{src/lib/types.ts → dist/lib/types.d.ts} +10 -12
  25. package/dist/lib/types.js +1 -0
  26. package/dist/lib/utils.d.ts +5 -0
  27. package/dist/lib/utils.js +15 -0
  28. package/dist/lib/watcher.d.ts +14 -0
  29. package/dist/lib/watcher.js +59 -0
  30. package/package.json +49 -59
  31. package/dist/commonjs/agent.d.ts +0 -2
  32. package/dist/commonjs/agent.js +0 -5
  33. package/dist/commonjs/app.d.ts +0 -2
  34. package/dist/commonjs/app.js +0 -5
  35. package/dist/commonjs/config/config.default.d.ts +0 -10
  36. package/dist/commonjs/config/config.default.js +0 -22
  37. package/dist/commonjs/config/config.local.d.ts +0 -5
  38. package/dist/commonjs/config/config.local.js +0 -8
  39. package/dist/commonjs/config/config.unittest.d.ts +0 -5
  40. package/dist/commonjs/config/config.unittest.js +0 -8
  41. package/dist/commonjs/index.d.ts +0 -3
  42. package/dist/commonjs/index.js +0 -20
  43. package/dist/commonjs/lib/boot.d.ts +0 -6
  44. package/dist/commonjs/lib/boot.js +0 -23
  45. package/dist/commonjs/lib/event-sources/base.d.ts +0 -5
  46. package/dist/commonjs/lib/event-sources/base.js +0 -8
  47. package/dist/commonjs/lib/event-sources/default.d.ts +0 -6
  48. package/dist/commonjs/lib/event-sources/default.js +0 -19
  49. package/dist/commonjs/lib/event-sources/development.d.ts +0 -7
  50. package/dist/commonjs/lib/event-sources/development.js +0 -103
  51. package/dist/commonjs/lib/event-sources/index.d.ts +0 -4
  52. package/dist/commonjs/lib/event-sources/index.js +0 -13
  53. package/dist/commonjs/lib/types.d.ts +0 -31
  54. package/dist/commonjs/lib/types.js +0 -3
  55. package/dist/commonjs/lib/utils.d.ts +0 -2
  56. package/dist/commonjs/lib/utils.js +0 -25
  57. package/dist/commonjs/lib/watcher.d.ts +0 -10
  58. package/dist/commonjs/lib/watcher.js +0 -113
  59. package/dist/commonjs/package.json +0 -3
  60. package/dist/esm/agent.d.ts +0 -2
  61. package/dist/esm/agent.js +0 -3
  62. package/dist/esm/app.d.ts +0 -2
  63. package/dist/esm/app.js +0 -3
  64. package/dist/esm/config/config.default.d.ts +0 -10
  65. package/dist/esm/config/config.default.js +0 -17
  66. package/dist/esm/config/config.local.d.ts +0 -5
  67. package/dist/esm/config/config.local.js +0 -6
  68. package/dist/esm/config/config.unittest.d.ts +0 -5
  69. package/dist/esm/config/config.unittest.js +0 -6
  70. package/dist/esm/index.d.ts +0 -3
  71. package/dist/esm/index.js +0 -4
  72. package/dist/esm/lib/boot.d.ts +0 -6
  73. package/dist/esm/lib/boot.js +0 -19
  74. package/dist/esm/lib/event-sources/base.d.ts +0 -5
  75. package/dist/esm/lib/event-sources/base.js +0 -4
  76. package/dist/esm/lib/event-sources/default.d.ts +0 -6
  77. package/dist/esm/lib/event-sources/default.js +0 -16
  78. package/dist/esm/lib/event-sources/development.d.ts +0 -7
  79. package/dist/esm/lib/event-sources/development.js +0 -97
  80. package/dist/esm/lib/event-sources/index.d.ts +0 -4
  81. package/dist/esm/lib/event-sources/index.js +0 -5
  82. package/dist/esm/lib/types.d.ts +0 -31
  83. package/dist/esm/lib/types.js +0 -2
  84. package/dist/esm/lib/utils.d.ts +0 -2
  85. package/dist/esm/lib/utils.js +0 -18
  86. package/dist/esm/lib/watcher.d.ts +0 -10
  87. package/dist/esm/lib/watcher.js +0 -106
  88. package/dist/esm/package.json +0 -3
  89. package/dist/package.json +0 -4
  90. package/src/agent.ts +0 -3
  91. package/src/app.ts +0 -3
  92. package/src/config/config.default.ts +0 -18
  93. package/src/config/config.local.ts +0 -7
  94. package/src/config/config.unittest.ts +0 -7
  95. package/src/index.ts +0 -3
  96. package/src/lib/boot.ts +0 -22
  97. package/src/lib/event-sources/base.ts +0 -6
  98. package/src/lib/event-sources/default.ts +0 -18
  99. package/src/lib/event-sources/development.ts +0 -101
  100. package/src/lib/event-sources/index.ts +0 -9
  101. package/src/lib/utils.ts +0 -20
  102. package/src/lib/watcher.ts +0 -120
@@ -1,16 +0,0 @@
1
- import { BaseEventSource } from './base.js';
2
- export default class DefaultEventSource extends BaseEventSource {
3
- constructor() {
4
- super();
5
- // delay emit so that can be listened
6
- setImmediate(() => this.emit('info', '[@eggjs/watcher] defaultEventSource watcher will NOT take effect'));
7
- this.ready(true);
8
- }
9
- watch() {
10
- this.emit('info', '[@eggjs/watcher] using defaultEventSource watcher.watch() does NOTHING');
11
- }
12
- unwatch() {
13
- this.emit('info', '[@eggjs/watcher] using defaultEventSource watcher.unwatch() does NOTHING');
14
- }
15
- }
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZXZlbnQtc291cmNlcy9kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUMsTUFBTSxDQUFDLE9BQU8sT0FBTyxrQkFBbUIsU0FBUSxlQUFlO0lBQzdEO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFDUixxQ0FBcUM7UUFDckMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGtFQUFrRSxDQUFDLENBQUMsQ0FBQztRQUMxRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsd0VBQXdFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLDBFQUEwRSxDQUFDLENBQUM7SUFDaEcsQ0FBQztDQUNGIn0=
@@ -1,7 +0,0 @@
1
- import { BaseEventSource } from './base.js';
2
- export default class DevelopmentEventSource extends BaseEventSource {
3
- #private;
4
- constructor();
5
- watch(file: string): void;
6
- unwatch(file: string): void;
7
- }
@@ -1,97 +0,0 @@
1
- import { debuglog } from 'node:util';
2
- import path from 'node:path';
3
- import fs from 'node:fs';
4
- import { BaseEventSource } from './base.js';
5
- const debug = debuglog('@eggjs/watcher/lib/event-sources/development');
6
- // only used by local dev environment
7
- export default class DevelopmentEventSource extends BaseEventSource {
8
- #fileWatching = new Map();
9
- constructor() {
10
- super();
11
- this.ready(true);
12
- }
13
- watch(file) {
14
- try {
15
- const stat = fs.statSync(file, { throwIfNoEntry: false });
16
- if (!stat) {
17
- debug('watch %o ignore, file not exists', file);
18
- return;
19
- }
20
- debug('watch %o, isFile: %o', file, stat.isFile());
21
- // https://nodejs.org/docs/latest/api/fs.html#fswatchfilename-options-listener
22
- let recursive = true;
23
- if (process.platform === 'linux' && process.version.startsWith('v18.')) {
24
- // https://github.com/fgnass/filewatcher/pull/6
25
- // disable recursive on linux + Node.js <= 18
26
- recursive = false;
27
- }
28
- const handler = fs.watch(file, {
29
- persistent: true,
30
- recursive,
31
- }, (event, filename) => {
32
- debug('watch %o => event: %o, filename: %o', file, event, filename);
33
- let changePath = file;
34
- if (stat.isFile()) {
35
- this.#onFsWatchChange(event, changePath);
36
- }
37
- else {
38
- // dir
39
- if (filename) {
40
- changePath = path.join(file, filename);
41
- }
42
- this.#onFsWatchChange(event, changePath);
43
- }
44
- });
45
- // 保存 handler,用于解除监听
46
- this.#fileWatching.set(file, handler);
47
- }
48
- catch (e) {
49
- // file not exist, do nothing
50
- // do not emit error, in case of too many logs
51
- this.emit('warn', '[@eggjs/watcher:DevelopmentEventSource] watch %o error: %s', file, e);
52
- }
53
- }
54
- unwatch(file) {
55
- if (!file)
56
- return;
57
- const h = this.#fileWatching.get(file);
58
- if (!h)
59
- return;
60
- // fs.watch 文件监听
61
- h.removeAllListeners();
62
- h.close();
63
- this.#fileWatching.delete(file);
64
- }
65
- #onFsWatchChange(event, file) {
66
- if (!file) {
67
- this.emit('warn', '[@eggjs/watcher:DevelopmentEventSource] event: %o', event);
68
- return;
69
- }
70
- // { event: 'change',
71
- // path: '/Users/mk2/git/changing/test/fixtures/foo.js',
72
- // stat:
73
- // { dev: 16777220,
74
- // mode: 33188,
75
- // nlink: 1,
76
- // uid: 501,
77
- // gid: 20,
78
- // rdev: 0,
79
- // blksize: 4096,
80
- // ino: 72656587,
81
- // size: 11,
82
- // blocks: 8,
83
- // atime: Wed Jun 17 2015 00:08:11 GMT+0800 (CST),
84
- // mtime: Wed Jun 17 2015 00:08:38 GMT+0800 (CST),
85
- // ctime: Wed Jun 17 2015 00:08:38 GMT+0800 (CST),
86
- // birthtime: Tue Jun 16 2015 23:19:13 GMT+0800 (CST) } }
87
- const stat = fs.statSync(file, { throwIfNoEntry: false });
88
- const info = {
89
- path: file,
90
- event,
91
- stat,
92
- isDirectory: stat?.isDirectory(),
93
- };
94
- this.emit('change', info);
95
- }
96
- }
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2ZWxvcG1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2V2ZW50LXNvdXJjZXMvZGV2ZWxvcG1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFpQyxNQUFNLFNBQVMsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRzVDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0FBRXZFLHFDQUFxQztBQUNyQyxNQUFNLENBQUMsT0FBTyxPQUFPLHNCQUF1QixTQUFRLGVBQWU7SUFDakUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFxQixDQUFDO0lBRTdDO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBWTtRQUNoQixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixLQUFLLENBQUMsa0NBQWtDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2hELE9BQU87WUFDVCxDQUFDO1lBQ0QsS0FBSyxDQUFDLHNCQUFzQixFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNuRCw4RUFBOEU7WUFDOUUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMs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
@@ -1,4 +0,0 @@
1
- import { BaseEventSource } from './base.js';
2
- import DefaultEventSource from './default.js';
3
- import DevelopmentEventSource from './development.js';
4
- export { BaseEventSource, DefaultEventSource, DevelopmentEventSource, };
@@ -1,5 +0,0 @@
1
- import { BaseEventSource } from './base.js';
2
- import DefaultEventSource from './default.js';
3
- import DevelopmentEventSource from './development.js';
4
- export { BaseEventSource, DefaultEventSource, DevelopmentEventSource, };
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2V2ZW50LXNvdXJjZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1QyxPQUFPLGtCQUFrQixNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLHNCQUFzQixNQUFNLGtCQUFrQixDQUFDO0FBRXRELE9BQU8sRUFDTCxlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLHNCQUFzQixHQUN2QixDQUFDIn0=
@@ -1,31 +0,0 @@
1
- import type { WatchEventType, Stats } from 'node:fs';
2
- import type { Watcher } from './watcher.js';
3
- export interface WatcherConfig {
4
- /**
5
- * event source type, default is `default`
6
- * can be `default` or `development`
7
- */
8
- type: string;
9
- /**
10
- * event sources
11
- * key is event source type, value is event source module path
12
- */
13
- eventSources: Record<string, string>;
14
- }
15
- export interface ChangeInfo extends Record<string, any> {
16
- event: WatchEventType;
17
- /**
18
- * file stat if path exists
19
- */
20
- stat?: Stats;
21
- path: string;
22
- isDirectory?: boolean;
23
- }
24
- declare module '@eggjs/core' {
25
- interface EggCore {
26
- watcher: Watcher;
27
- }
28
- interface EggAppConfig {
29
- watcher: WatcherConfig;
30
- }
31
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -1,2 +0,0 @@
1
- export declare function isEqualOrParentPath(parent: string, child: string): boolean;
2
- export declare function getSourceDirname(): string;
@@ -1,18 +0,0 @@
1
- import path from 'node:path';
2
- import { fileURLToPath } from 'node:url';
3
- // judge if parent is child's parent path
4
- // isEqualOrParentPath('/foo', '/foo/bar') => true
5
- // isEqualOrParentPath('/foo/bar', '/foo') => false
6
- export function isEqualOrParentPath(parent, child) {
7
- return !path.relative(parent, child).startsWith('..');
8
- }
9
- export function getSourceDirname() {
10
- if (typeof __dirname === 'string') {
11
- return path.dirname(__dirname);
12
- }
13
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
14
- // @ts-ignore
15
- const __filename = fileURLToPath(import.meta.url);
16
- return path.dirname(path.dirname(__filename));
17
- }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpDLHlDQUF5QztBQUN6QyxrREFBa0Q7QUFDbEQsbURBQW1EO0FBQ25ELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxNQUFjLEVBQUUsS0FBYTtJQUMvRCxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCw2REFBNkQ7SUFDN0QsYUFBYTtJQUNiLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDaEQsQ0FBQyJ9
@@ -1,10 +0,0 @@
1
- import { Base } from 'sdk-base';
2
- import type { EggAppConfig } from '@eggjs/core';
3
- import type { ChangeInfo } from './types.js';
4
- export type WatchListener = (info: ChangeInfo) => void;
5
- export declare class Watcher extends Base {
6
- #private;
7
- constructor(config: EggAppConfig);
8
- protected _init(): Promise<void>;
9
- watch(path: string | string[], listener: WatchListener): void;
10
- }
@@ -1,106 +0,0 @@
1
- import { debuglog } from 'node:util';
2
- import { Base } from 'sdk-base';
3
- import camelcase from 'camelcase';
4
- import { importModule } from '@eggjs/utils';
5
- import { isEqualOrParentPath } from './utils.js';
6
- const debug = debuglog('@eggjs/watcher/lib/watcher');
7
- export class Watcher extends Base {
8
- #config;
9
- #eventSource;
10
- constructor(config) {
11
- super({
12
- initMethod: '_init',
13
- });
14
- this.#config = config;
15
- }
16
- async _init() {
17
- const watcherType = this.#config.watcher.type;
18
- let EventSource = this.#config.watcher.eventSources[watcherType];
19
- if (typeof EventSource === 'string') {
20
- EventSource = await importModule(EventSource, {
21
- importDefaultOnly: true,
22
- });
23
- }
24
- // chokidar => watcherChokidar
25
- // custom => watcherCustom
26
- //
27
- // e.g:
28
- // config => { watcher: { type: 'custom' }, watcherCustom: { ... } }
29
- const key = camelcase(['watcher', watcherType]);
30
- const eventSourceOptions = this.#config[key] ?? {};
31
- this.#eventSource = Reflect.construct(EventSource, [eventSourceOptions]);
32
- this.#eventSource.on('change', this.#onChange.bind(this))
33
- .on('fuzzy-change', this.#onFuzzyChange.bind(this))
34
- .on('info', (...args) => this.emit('info', ...args))
35
- .on('warn', (...args) => this.emit('warn', ...args))
36
- .on('error', (...args) => this.emit('error', ...args));
37
- await this.#eventSource.ready();
38
- }
39
- watch(path, listener) {
40
- this.emit('info', '[@eggjs/watcher] Start watching: %j', path);
41
- if (!path)
42
- return;
43
- // support array
44
- if (Array.isArray(path)) {
45
- path.forEach(p => this.watch(p, listener));
46
- return;
47
- }
48
- // one file only watch once
49
- if (!this.listenerCount(path)) {
50
- this.#eventSource.watch(path);
51
- }
52
- this.on(path, listener);
53
- }
54
- /*
55
- // TODO wait unsubscribe implementation of cluster-client
56
- unwatch(path, callback) {
57
- if (!path) return;
58
-
59
- // support array
60
- if (Array.isArray(path)) {
61
- path.forEach(p => this.unwatch(p, callback));
62
- return;
63
- }
64
-
65
- if (callback) {
66
- this.removeListener(path, callback);
67
- // stop watching when no listener bound to the path
68
- if (this.listenerCount(path) === 0) {
69
- this._eventSource.unwatch(path);
70
- }
71
- return;
72
- }
73
-
74
- this.removeAllListeners(path);
75
- this._eventSource.unwatch(path);
76
- }
77
- */
78
- #onChange(info) {
79
- debug('onChange %o', info);
80
- this.emit('info', '[@eggjs/watcher] Received a change event from eventSource: %j', info);
81
- const path = info.path;
82
- for (const p of this.eventNames()) {
83
- if (typeof p !== 'string')
84
- continue;
85
- // if it is a sub path, emit a `change` event
86
- if (isEqualOrParentPath(p, path)) {
87
- this.emit(p, info);
88
- }
89
- }
90
- }
91
- #onFuzzyChange(info) {
92
- debug('onFuzzyChange %o', info);
93
- this.emit('info', '[@eggjs/watcher] Received a fuzzy-change event from eventSource: %j', info);
94
- const path = info.path;
95
- for (const p of this.eventNames()) {
96
- if (typeof p !== 'string')
97
- continue;
98
- // if it is a parent path, emit a `change` event
99
- // just the opposite to `_onChange`
100
- if (isEqualOrParentPath(path, p)) {
101
- this.emit(p, info);
102
- }
103
- }
104
- }
105
- }
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvd2F0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHNUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR2pELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0FBSXJELE1BQU0sT0FBTyxPQUFRLFNBQVEsSUFBSTtJQUMvQixPQUFPLENBQWU7SUFDdEIsWUFBWSxDQUFrQjtJQUU5QixZQUFZLE1BQW9CO1FBQzlCLEtBQUssQ0FBQztZQUNKLFVBQVUsRUFBRSxPQUFPO1NBQ3BCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLENBQUM7SUFFUyxLQUFLLENBQUMsS0FBSztRQUNuQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDOUMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBc0MsQ0FBQztRQUN0RyxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLFdBQVcsR0FBRyxNQUFNLFlBQVksQ0FBQyxXQUFXLEVBQUU7Z0JBQzVDLGlCQUFpQixFQUFFLElBQUk7YUFDeEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELDhCQUE4QjtRQUM5QiwwQkFBMEI7UUFDMUIsRUFBRTtRQUNGLE9BQU87UUFDUCxxRUFBcUU7UUFDckUsTUFBTSxHQUFH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
@@ -1,3 +0,0 @@
1
- {
2
- "type": "module"
3
- }
package/dist/package.json DELETED
@@ -1,4 +0,0 @@
1
- {
2
- "name": "@eggjs/watcher",
3
- "version": "4.0.4"
4
- }
package/src/agent.ts DELETED
@@ -1,3 +0,0 @@
1
- import { Boot } from './lib/boot.js';
2
-
3
- export default Boot;
package/src/app.ts DELETED
@@ -1,3 +0,0 @@
1
- import { Boot } from './lib/boot.js';
2
-
3
- export default Boot;
@@ -1,18 +0,0 @@
1
- import path from 'node:path';
2
- import { getSourceDirname } from '../lib/utils.js';
3
- import type { WatcherConfig } from '../lib/types.js';
4
-
5
- export default {
6
- /**
7
- * watcher options
8
- * @member Config#watcher
9
- * @property {string} type - event source type
10
- */
11
- watcher: {
12
- type: 'default', // default event source
13
- eventSources: {
14
- default: path.join(getSourceDirname(), 'lib', 'event-sources', 'default'),
15
- development: path.join(getSourceDirname(), 'lib', 'event-sources', 'development'),
16
- },
17
- } as WatcherConfig,
18
- };
@@ -1,7 +0,0 @@
1
- import type { WatcherConfig } from '../lib/types.js';
2
-
3
- export default {
4
- watcher: {
5
- type: 'development',
6
- } as WatcherConfig,
7
- };
@@ -1,7 +0,0 @@
1
- import type { WatcherConfig } from '../lib/types.js';
2
-
3
- export default {
4
- watcher: {
5
- type: 'development',
6
- } as WatcherConfig,
7
- };
package/src/index.ts DELETED
@@ -1,3 +0,0 @@
1
- export * from './lib/types.js';
2
- export * from './lib/watcher.js';
3
- export * from './lib/event-sources/index.js';
package/src/lib/boot.ts DELETED
@@ -1,22 +0,0 @@
1
- import type { ILifecycleBoot, EggApplicationCore } from 'egg';
2
- import { Watcher } from './watcher.js';
3
-
4
- export class Boot implements ILifecycleBoot {
5
- #app: EggApplicationCore;
6
- #watcher: Watcher;
7
-
8
- constructor(appOrAgent: EggApplicationCore) {
9
- this.#app = appOrAgent;
10
- this.#watcher = this.#app.watcher = this.#app.cluster(Watcher, {})
11
- .delegate('watch', 'subscribe')
12
- .create(appOrAgent.config);
13
- this.#watcher.on('info', (msg: string, ...args: any[]) => this.#app.coreLogger.info(msg, ...args))
14
- .on('warn', (msg: string, ...args: any[]) => this.#app.coreLogger.warn(msg, ...args))
15
- .on('error', (msg: string, ...args: any[]) => this.#app.coreLogger.error(msg, ...args));
16
- }
17
-
18
- async didLoad(): Promise<void> {
19
- await this.#watcher.ready();
20
- this.#app.coreLogger.info('[@eggjs/watcher:%s] watcher start success', this.#app.type);
21
- }
22
- }
@@ -1,6 +0,0 @@
1
- import { Base } from 'sdk-base';
2
-
3
- export abstract class BaseEventSource extends Base {
4
- abstract watch(file: string): void;
5
- abstract unwatch(file: string): void;
6
- }
@@ -1,18 +0,0 @@
1
- import { BaseEventSource } from './base.js';
2
-
3
- export default class DefaultEventSource extends BaseEventSource {
4
- constructor() {
5
- super();
6
- // delay emit so that can be listened
7
- setImmediate(() => this.emit('info', '[@eggjs/watcher] defaultEventSource watcher will NOT take effect'));
8
- this.ready(true);
9
- }
10
-
11
- watch() {
12
- this.emit('info', '[@eggjs/watcher] using defaultEventSource watcher.watch() does NOTHING');
13
- }
14
-
15
- unwatch() {
16
- this.emit('info', '[@eggjs/watcher] using defaultEventSource watcher.unwatch() does NOTHING');
17
- }
18
- }
@@ -1,101 +0,0 @@
1
- import { debuglog } from 'node:util';
2
- import path from 'node:path';
3
- import fs, { FSWatcher, WatchEventType } from 'node:fs';
4
- import { BaseEventSource } from './base.js';
5
- import type { ChangeInfo } from '../types.js';
6
-
7
- const debug = debuglog('@eggjs/watcher/lib/event-sources/development');
8
-
9
- // only used by local dev environment
10
- export default class DevelopmentEventSource extends BaseEventSource {
11
- #fileWatching = new Map<string, FSWatcher>();
12
-
13
- constructor() {
14
- super();
15
- this.ready(true);
16
- }
17
-
18
- watch(file: string) {
19
- try {
20
- const stat = fs.statSync(file, { throwIfNoEntry: false });
21
- if (!stat) {
22
- debug('watch %o ignore, file not exists', file);
23
- return;
24
- }
25
- debug('watch %o, isFile: %o', file, stat.isFile());
26
- // https://nodejs.org/docs/latest/api/fs.html#fswatchfilename-options-listener
27
- let recursive = true;
28
- if (process.platform === 'linux' && process.version.startsWith('v18.')) {
29
- // https://github.com/fgnass/filewatcher/pull/6
30
- // disable recursive on linux + Node.js <= 18
31
- recursive = false;
32
- }
33
- const handler = fs.watch(file, {
34
- persistent: true,
35
- recursive,
36
- }, (event, filename) => {
37
- debug('watch %o => event: %o, filename: %o', file, event, filename);
38
- let changePath = file;
39
- if (stat.isFile()) {
40
- this.#onFsWatchChange(event, changePath);
41
- } else {
42
- // dir
43
- if (filename) {
44
- changePath = path.join(file, filename);
45
- }
46
- this.#onFsWatchChange(event, changePath);
47
- }
48
- });
49
- // 保存 handler,用于解除监听
50
- this.#fileWatching.set(file, handler);
51
- } catch (e) {
52
- // file not exist, do nothing
53
- // do not emit error, in case of too many logs
54
- this.emit('warn', '[@eggjs/watcher:DevelopmentEventSource] watch %o error: %s', file, e);
55
- }
56
- }
57
-
58
- unwatch(file: string) {
59
- if (!file) return;
60
-
61
- const h = this.#fileWatching.get(file);
62
- if (!h) return;
63
-
64
- // fs.watch 文件监听
65
- h.removeAllListeners();
66
- h.close();
67
- this.#fileWatching.delete(file);
68
- }
69
-
70
- #onFsWatchChange(event: WatchEventType, file: string) {
71
- if (!file) {
72
- this.emit('warn', '[@eggjs/watcher:DevelopmentEventSource] event: %o', event);
73
- return;
74
- }
75
- // { event: 'change',
76
- // path: '/Users/mk2/git/changing/test/fixtures/foo.js',
77
- // stat:
78
- // { dev: 16777220,
79
- // mode: 33188,
80
- // nlink: 1,
81
- // uid: 501,
82
- // gid: 20,
83
- // rdev: 0,
84
- // blksize: 4096,
85
- // ino: 72656587,
86
- // size: 11,
87
- // blocks: 8,
88
- // atime: Wed Jun 17 2015 00:08:11 GMT+0800 (CST),
89
- // mtime: Wed Jun 17 2015 00:08:38 GMT+0800 (CST),
90
- // ctime: Wed Jun 17 2015 00:08:38 GMT+0800 (CST),
91
- // birthtime: Tue Jun 16 2015 23:19:13 GMT+0800 (CST) } }
92
- const stat = fs.statSync(file, { throwIfNoEntry: false });
93
- const info = {
94
- path: file,
95
- event,
96
- stat,
97
- isDirectory: stat?.isDirectory(),
98
- } as ChangeInfo;
99
- this.emit('change', info);
100
- }
101
- }
@@ -1,9 +0,0 @@
1
- import { BaseEventSource } from './base.js';
2
- import DefaultEventSource from './default.js';
3
- import DevelopmentEventSource from './development.js';
4
-
5
- export {
6
- BaseEventSource,
7
- DefaultEventSource,
8
- DevelopmentEventSource,
9
- };
package/src/lib/utils.ts DELETED
@@ -1,20 +0,0 @@
1
- import path from 'node:path';
2
- import { fileURLToPath } from 'node:url';
3
-
4
- // judge if parent is child's parent path
5
- // isEqualOrParentPath('/foo', '/foo/bar') => true
6
- // isEqualOrParentPath('/foo/bar', '/foo') => false
7
- export function isEqualOrParentPath(parent: string, child: string) {
8
- return !path.relative(parent, child).startsWith('..');
9
- }
10
-
11
- export function getSourceDirname() {
12
- if (typeof __dirname === 'string') {
13
- return path.dirname(__dirname);
14
- }
15
-
16
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
17
- // @ts-ignore
18
- const __filename = fileURLToPath(import.meta.url);
19
- return path.dirname(path.dirname(__filename));
20
- }