@eggjs/watcher 1.0.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.
Files changed (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +147 -0
  3. package/dist/commonjs/agent.d.ts +2 -0
  4. package/dist/commonjs/agent.js +5 -0
  5. package/dist/commonjs/app.d.ts +2 -0
  6. package/dist/commonjs/app.js +5 -0
  7. package/dist/commonjs/config/config.default.d.ts +15 -0
  8. package/dist/commonjs/config/config.default.js +22 -0
  9. package/dist/commonjs/config/config.local.d.ts +6 -0
  10. package/dist/commonjs/config/config.local.js +8 -0
  11. package/dist/commonjs/config/config.unittest.d.ts +6 -0
  12. package/dist/commonjs/config/config.unittest.js +8 -0
  13. package/dist/commonjs/index.d.ts +3 -0
  14. package/dist/commonjs/index.js +20 -0
  15. package/dist/commonjs/lib/boot.d.ts +6 -0
  16. package/dist/commonjs/lib/boot.js +23 -0
  17. package/dist/commonjs/lib/event-sources/base.d.ts +5 -0
  18. package/dist/commonjs/lib/event-sources/base.js +8 -0
  19. package/dist/commonjs/lib/event-sources/default.d.ts +6 -0
  20. package/dist/commonjs/lib/event-sources/default.js +19 -0
  21. package/dist/commonjs/lib/event-sources/development.d.ts +7 -0
  22. package/dist/commonjs/lib/event-sources/development.js +101 -0
  23. package/dist/commonjs/lib/event-sources/index.d.ts +3 -0
  24. package/dist/commonjs/lib/event-sources/index.js +20 -0
  25. package/dist/commonjs/lib/types.d.ts +33 -0
  26. package/dist/commonjs/lib/types.js +3 -0
  27. package/dist/commonjs/lib/utils.d.ts +2 -0
  28. package/dist/commonjs/lib/utils.js +25 -0
  29. package/dist/commonjs/lib/watcher.d.ts +9 -0
  30. package/dist/commonjs/lib/watcher.js +111 -0
  31. package/dist/commonjs/package.json +3 -0
  32. package/dist/esm/agent.d.ts +2 -0
  33. package/dist/esm/agent.js +3 -0
  34. package/dist/esm/app.d.ts +2 -0
  35. package/dist/esm/app.js +3 -0
  36. package/dist/esm/config/config.default.d.ts +15 -0
  37. package/dist/esm/config/config.default.js +17 -0
  38. package/dist/esm/config/config.local.d.ts +6 -0
  39. package/dist/esm/config/config.local.js +6 -0
  40. package/dist/esm/config/config.unittest.d.ts +6 -0
  41. package/dist/esm/config/config.unittest.js +6 -0
  42. package/dist/esm/index.d.ts +3 -0
  43. package/dist/esm/index.js +4 -0
  44. package/dist/esm/lib/boot.d.ts +6 -0
  45. package/dist/esm/lib/boot.js +19 -0
  46. package/dist/esm/lib/event-sources/base.d.ts +5 -0
  47. package/dist/esm/lib/event-sources/base.js +4 -0
  48. package/dist/esm/lib/event-sources/default.d.ts +6 -0
  49. package/dist/esm/lib/event-sources/default.js +16 -0
  50. package/dist/esm/lib/event-sources/development.d.ts +7 -0
  51. package/dist/esm/lib/event-sources/development.js +95 -0
  52. package/dist/esm/lib/event-sources/index.d.ts +3 -0
  53. package/dist/esm/lib/event-sources/index.js +4 -0
  54. package/dist/esm/lib/types.d.ts +33 -0
  55. package/dist/esm/lib/types.js +2 -0
  56. package/dist/esm/lib/utils.d.ts +2 -0
  57. package/dist/esm/lib/utils.js +18 -0
  58. package/dist/esm/lib/watcher.d.ts +9 -0
  59. package/dist/esm/lib/watcher.js +104 -0
  60. package/dist/esm/package.json +3 -0
  61. package/dist/package.json +4 -0
  62. package/package.json +83 -0
  63. package/src/agent.ts +3 -0
  64. package/src/app.ts +3 -0
  65. package/src/config/config.default.ts +17 -0
  66. package/src/config/config.local.ts +5 -0
  67. package/src/config/config.unittest.ts +5 -0
  68. package/src/index.ts +3 -0
  69. package/src/lib/boot.ts +22 -0
  70. package/src/lib/event-sources/base.ts +6 -0
  71. package/src/lib/event-sources/default.ts +18 -0
  72. package/src/lib/event-sources/development.ts +99 -0
  73. package/src/lib/event-sources/index.ts +3 -0
  74. package/src/lib/types.ts +35 -0
  75. package/src/lib/utils.ts +20 -0
  76. package/src/lib/watcher.ts +117 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2016-present Alibaba Group Holding Limited and other contributors.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,147 @@
1
+ # @eggjs/watcher
2
+
3
+ [![NPM version][npm-image]][npm-url]
4
+ [![Node.js CI](https://github.com/eggjs/egg-watcher/actions/workflows/nodejs.yml/badge.svg)](https://github.com/eggjs/egg-watcher/actions/workflows/nodejs.yml)
5
+ [![Test coverage][codecov-image]][codecov-url]
6
+ [![Known Vulnerabilities][snyk-image]][snyk-url]
7
+ [![npm download][download-image]][download-url]
8
+ [![Node.js Version](https://img.shields.io/node/v/@eggjs/watcher.svg?style=flat)](https://nodejs.org/en/download/)
9
+
10
+ [npm-image]: https://img.shields.io/npm/v/egg-watcher.svg?style=flat-square
11
+ [npm-url]: https://npmjs.org/package/egg-watcher
12
+ [codecov-image]: https://codecov.io/github/eggjs/egg-watcher/coverage.svg?branch=master
13
+ [codecov-url]: https://codecov.io/github/eggjs/egg-watcher?branch=master
14
+ [snyk-image]: https://snyk.io/test/npm/egg-watcher/badge.svg?style=flat-square
15
+ [snyk-url]: https://snyk.io/test/npm/egg-watcher
16
+ [download-image]: https://img.shields.io/npm/dm/egg-watcher.svg?style=flat-square
17
+ [download-url]: https://npmjs.org/package/egg-watcher
18
+
19
+ File watcher plugin for egg
20
+
21
+ ## Usage
22
+
23
+ In worker process:
24
+
25
+ ### app.watcher.watch(path, listener)
26
+
27
+ Start watching file(s).
28
+
29
+ - path(String|Array): file path(s)
30
+ - listener(Function): file change callback
31
+
32
+ ### app.watcher.unwatch(path[, listener])
33
+
34
+ Stop watching file(s).
35
+
36
+ - path(String|Array): file path(s)
37
+ - listener(Function): file change callback
38
+
39
+ In agent process:
40
+
41
+ ### agent.watcher.watch(path, listener)
42
+
43
+ Start watching file(s).
44
+
45
+ - path(String|Array): file path(s)
46
+ - listener(Function): file change callback
47
+
48
+ ### agent.watcher.unwatch(path[, listener])
49
+
50
+ Stop watching file(s).
51
+
52
+ - path(String|Array): file path(s)
53
+ - listener(Function): file change callback
54
+
55
+ ## Watching mode
56
+
57
+ ### `development` Mode
58
+
59
+ There's a built-in [development mode](https://github.com/eggjs/egg-watcher/blob/master/src/lib/event-sources/development.ts) which works in local(env is `local`). Once files on disk is modified it will emit a `change` event immediately.
60
+
61
+ ### Customize Watching Mode
62
+
63
+ Say we want to build a custom event source plugin (package name: `egg-watcher-custom`, eggPlugin.name: `watcherCustom`).
64
+
65
+ Firstly define our custom event source like this:
66
+
67
+ ```ts
68
+ // {plugin_root}/lib/custom_event_source.js
69
+ import { Base } from 'sdk-base';
70
+
71
+ export default class CustomEventSource extends Base {
72
+ // `opts` comes from app.config[${eventSourceName}]
73
+ // `eventSourceName` will be registered later in
74
+ // `config.watcher.eventSources` as the key shown below
75
+ constructor(opts) {
76
+ super(opts);
77
+ this.ready(true);
78
+ }
79
+
80
+ watch(path) {
81
+ // replace this with your desired way of watching,
82
+ // when aware of any change, emit a `change` event
83
+ // with an info object containing `path` property
84
+ // specifying the changed directory or file.
85
+ this._h = setInterval(() => {
86
+ this.emit('change', { path });
87
+ }, 1000);
88
+ }
89
+
90
+ unwatch() {
91
+ // replace this with your implementation
92
+ if (this._h) {
93
+ clearInterval(this._h);
94
+ }
95
+ }
96
+ }
97
+ ```
98
+
99
+ Event source implementations varies according to your running environment. When working with vagrant, docker, samba or such other non-standard way of development, you should use a different watch API specific to what you are working with.
100
+
101
+ Then add your custom event source to config:
102
+
103
+ ```js
104
+ // config/config.default.js
105
+ import CustomEventSource from '../lib/custom_event_source';
106
+
107
+ export default {
108
+ watcher: {
109
+ eventSources: {
110
+ custom: CustomEventSource,
111
+ },
112
+ },
113
+ };
114
+ ```
115
+
116
+ Choose to use your custom watching mode in your desired env.
117
+
118
+ ```js
119
+ // config/config.${env}.js
120
+
121
+ export default {
122
+ watcher: {
123
+ type: 'custom',
124
+ },
125
+
126
+ // this will pass to your CustomEventSource constructor as opts
127
+ watcherCustom: {
128
+ // foo: 'bar',
129
+ },
130
+ };
131
+ ```
132
+
133
+ If possible, plugins named like `egg-watcher-${customName}`(`egg-watcher-vagrant` eg.) are recommended.
134
+
135
+ ## Questions & Suggestions
136
+
137
+ Please open an issue [here](https://github.com/eggjs/egg/issues).
138
+
139
+ ## License
140
+
141
+ [MIT](LICENSE)
142
+
143
+ ## Contributors
144
+
145
+ [![Contributors](https://contrib.rocks/image?repo=eggjs/egg-watcher)](https://github.com/eggjs/egg-watcher/graphs/contributors)
146
+
147
+ Made with [contributors-img](https://contrib.rocks).
@@ -0,0 +1,2 @@
1
+ import { Boot } from './lib/boot.js';
2
+ export default Boot;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const boot_js_1 = require("./lib/boot.js");
4
+ exports.default = boot_js_1.Boot;
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQ0FBcUM7QUFFckMsa0JBQWUsY0FBSSxDQUFDIn0=
@@ -0,0 +1,2 @@
1
+ import { Boot } from './lib/boot.js';
2
+ export default Boot;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const boot_js_1 = require("./lib/boot.js");
4
+ exports.default = boot_js_1.Boot;
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJDQUFxQztBQUVyQyxrQkFBZSxjQUFJLENBQUMifQ==
@@ -0,0 +1,15 @@
1
+ declare const _default: {
2
+ /**
3
+ * watcher options
4
+ * @member Config#watcher
5
+ * @property {string} type - event source type
6
+ */
7
+ watcher: {
8
+ type: string;
9
+ eventSources: {
10
+ default: string;
11
+ development: string;
12
+ };
13
+ };
14
+ };
15
+ export default _default;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_path_1 = __importDefault(require("node:path"));
7
+ const utils_js_1 = require("../lib/utils.js");
8
+ exports.default = {
9
+ /**
10
+ * watcher options
11
+ * @member Config#watcher
12
+ * @property {string} type - event source type
13
+ */
14
+ watcher: {
15
+ type: 'default', // default event source
16
+ eventSources: {
17
+ default: node_path_1.default.join((0, utils_js_1.getSourceDirname)(), 'lib', 'event-sources', 'default'),
18
+ development: node_path_1.default.join((0, utils_js_1.getSourceDirname)(), 'lib', 'event-sources', 'development'),
19
+ },
20
+ },
21
+ };
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29uZmlnL2NvbmZpZy5kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsMERBQTZCO0FBQzdCLDhDQUFtRDtBQUVuRCxrQkFBZTtJQUNiOzs7O09BSUc7SUFDSCxPQUFPLEVBQUU7UUFDUCxJQUFJLEVBQUUsU0FBUyxFQUFFLHVCQUF1QjtRQUN4QyxZQUFZLEVBQUU7WUFDWixPQUFPLEVBQUUsbUJBQUksQ0FBQyxJQUFJLENBQUMsSUFBQSwyQkFBZ0IsR0FBRSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDO1lBQ3pFLFdBQVcsRUFBRSxtQkFBSSxDQUFDLElBQUksQ0FBQyxJQUFBLDJCQUFnQixHQUFFLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUM7U0FDbEY7S0FDRjtDQUNGLENBQUMifQ==
@@ -0,0 +1,6 @@
1
+ declare const _default: {
2
+ watcher: {
3
+ type: string;
4
+ };
5
+ };
6
+ export default _default;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = {
4
+ watcher: {
5
+ type: 'development',
6
+ },
7
+ };
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmxvY2FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbmZpZy9jb25maWcubG9jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQkFBZTtJQUNiLE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSxhQUFhO0tBQ3BCO0NBQ0YsQ0FBQyJ9
@@ -0,0 +1,6 @@
1
+ declare const _default: {
2
+ watcher: {
3
+ type: string;
4
+ };
5
+ };
6
+ export default _default;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = {
4
+ watcher: {
5
+ type: 'development',
6
+ },
7
+ };
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnVuaXR0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbmZpZy9jb25maWcudW5pdHRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQkFBZTtJQUNiLE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSxhQUFhO0tBQ3BCO0NBQ0YsQ0FBQyJ9
@@ -0,0 +1,3 @@
1
+ export * from './lib/types.js';
2
+ export * from './lib/watcher.js';
3
+ export * from './lib/event-sources/index.js';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./lib/types.js"), exports);
18
+ __exportStar(require("./lib/watcher.js"), exports);
19
+ __exportStar(require("./lib/event-sources/index.js"), exports);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUErQjtBQUMvQixtREFBaUM7QUFDakMsK0RBQTZDIn0=
@@ -0,0 +1,6 @@
1
+ import type { Application, Agent, ILifecycleBoot } from 'egg';
2
+ export declare class Boot implements ILifecycleBoot {
3
+ #private;
4
+ constructor(appOrAgent: Application | Agent);
5
+ didLoad(): Promise<void>;
6
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Boot = void 0;
4
+ const watcher_js_1 = require("./watcher.js");
5
+ class Boot {
6
+ #app;
7
+ #watcher;
8
+ constructor(appOrAgent) {
9
+ this.#app = appOrAgent;
10
+ this.#watcher = this.#app.watcher = this.#app.cluster(watcher_js_1.Watcher, {})
11
+ .delegate('watch', 'subscribe')
12
+ .create(appOrAgent.config)
13
+ .on('info', (msg, ...args) => this.#app.coreLogger.info(msg, ...args))
14
+ .on('warn', (msg, ...args) => this.#app.coreLogger.warn(msg, ...args))
15
+ .on('error', (msg, ...args) => this.#app.coreLogger.error(msg, ...args));
16
+ }
17
+ async didLoad() {
18
+ await this.#watcher.ready();
19
+ this.#app.coreLogger.info('[@eggjs/watcher:%s] watcher start success', this.#app.type);
20
+ }
21
+ }
22
+ exports.Boot = Boot;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYm9vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2Q0FBdUM7QUFFdkMsTUFBYSxJQUFJO0lBQ2YsSUFBSSxDQUFzQjtJQUMxQixRQUFRLENBQVU7SUFFbEIsWUFBWSxVQUErQjtRQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFPLEVBQUUsRUFBRSxDQUFDO2FBQy9ELFFBQVEsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDO2FBQzlCLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO2FBQ3pCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQzthQUNwRixFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBVyxFQUFFLEdBQUcsSUFBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7YUFDcEYsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQVcsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQywyQ0FBMkMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pGLENBQUM7Q0FDRjtBQWxCRCxvQkFrQkMifQ==
@@ -0,0 +1,5 @@
1
+ import { Base } from 'sdk-base';
2
+ export declare abstract class BaseEventSource extends Base {
3
+ abstract watch(file: string): void;
4
+ abstract unwatch(file: string): void;
5
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseEventSource = void 0;
4
+ const sdk_base_1 = require("sdk-base");
5
+ class BaseEventSource extends sdk_base_1.Base {
6
+ }
7
+ exports.BaseEventSource = BaseEventSource;
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZXZlbnQtc291cmNlcy9iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFnQztBQUVoQyxNQUFzQixlQUFnQixTQUFRLGVBQUk7Q0FHakQ7QUFIRCwwQ0FHQyJ9
@@ -0,0 +1,6 @@
1
+ import { BaseEventSource } from './base.js';
2
+ export default class DefaultEventSource extends BaseEventSource {
3
+ constructor();
4
+ watch(): void;
5
+ unwatch(): void;
6
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const base_js_1 = require("./base.js");
4
+ class DefaultEventSource extends base_js_1.BaseEventSource {
5
+ constructor() {
6
+ super();
7
+ // delay emit so that can be listened
8
+ setImmediate(() => this.emit('info', '[@eggjs/watcher] defaultEventSource watcher will NOT take effect'));
9
+ this.ready(true);
10
+ }
11
+ watch() {
12
+ this.emit('info', '[@eggjs/watcher] using defaultEventSource watcher.watch() does NOTHING');
13
+ }
14
+ unwatch() {
15
+ this.emit('info', '[@eggjs/watcher] using defaultEventSource watcher.unwatch() does NOTHING');
16
+ }
17
+ }
18
+ exports.default = DefaultEventSource;
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZXZlbnQtc291cmNlcy9kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsdUNBQTRDO0FBRTVDLE1BQXFCLGtCQUFtQixTQUFRLHlCQUFlO0lBQzdEO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFDUixxQ0FBcUM7UUFDckMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGtFQUFrRSxDQUFDLENBQUMsQ0FBQztRQUMxRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsd0VBQXdFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLDBFQUEwRSxDQUFDLENBQUM7SUFDaEcsQ0FBQztDQUNGO0FBZkQscUNBZUMifQ==
@@ -0,0 +1,7 @@
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
+ }
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_util_1 = require("node:util");
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const base_js_1 = require("./base.js");
10
+ const debug = (0, node_util_1.debuglog)('@eggjs/watcher/lib/event-sources/development');
11
+ // only used by local dev environment
12
+ class DevelopmentEventSource extends base_js_1.BaseEventSource {
13
+ #fileWatching = new Map();
14
+ constructor() {
15
+ super();
16
+ this.ready(true);
17
+ }
18
+ watch(file) {
19
+ try {
20
+ const stat = node_fs_1.default.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 = node_fs_1.default.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
+ }
42
+ else {
43
+ // dir
44
+ if (filename) {
45
+ changePath = node_path_1.default.join(file, filename);
46
+ }
47
+ this.#onFsWatchChange(event, changePath);
48
+ }
49
+ });
50
+ // 保存 handler,用于解除监听
51
+ this.#fileWatching.set(file, handler);
52
+ }
53
+ catch (e) {
54
+ // file not exist, do nothing
55
+ // do not emit error, in case of too many logs
56
+ this.emit('warn', '[@eggjs/watcher:DevelopmentEventSource] watch %o error: %s', file, e);
57
+ }
58
+ }
59
+ unwatch(file) {
60
+ if (!file)
61
+ return;
62
+ const h = this.#fileWatching.get(file);
63
+ if (!h)
64
+ return;
65
+ // fs.watch 文件监听
66
+ h.removeAllListeners();
67
+ h.close();
68
+ this.#fileWatching.delete(file);
69
+ }
70
+ #onFsWatchChange(event, file) {
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 info = {
93
+ path: file,
94
+ event,
95
+ stat: node_fs_1.default.statSync(file, { throwIfNoEntry: false }),
96
+ };
97
+ this.emit('change', info);
98
+ }
99
+ }
100
+ exports.default = DevelopmentEventSource;
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2ZWxvcG1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2V2ZW50LXNvdXJjZXMvZGV2ZWxvcG1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5Q0FBcUM7QUFDckMsMERBQTZCO0FBQzdCLHNEQUF3RDtBQUN4RCx1Q0FBNEM7QUFHNUMsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQkFBUSxFQUFDLDhDQUE4QyxDQUFDLENBQUM7QUFFdkUscUNBQXFDO0FBQ3JDLE1BQXFCLHNCQUF1QixTQUFRLHlCQUFlO0lBQ2pFLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBcUIsQ0FBQztJQUU3QztRQUNFLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQVk7UUFDaEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLEdBQUcsaUJBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNWLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDaEQsT0FBTztZQUNULENBQUM7WUFDRCxLQUFLLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELDhFQUE4RTtZQUM5RSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUN2RSwrQ0FBK0M7Z0JBQy9DLDZDQUE2QztnQkFDN0MsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUNwQixDQUFDO1lBQ0QsTUFB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
@@ -0,0 +1,3 @@
1
+ export * from './base.js';
2
+ export * from './default.js';
3
+ export * from './development.js';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./base.js"), exports);
18
+ __exportStar(require("./default.js"), exports);
19
+ __exportStar(require("./development.js"), exports);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2V2ZW50LXNvdXJjZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDRDQUEwQjtBQUMxQiwrQ0FBNkI7QUFDN0IsbURBQWlDIn0=
@@ -0,0 +1,33 @@
1
+ import type { WatchEventType, Stats } from 'node:fs';
2
+ import type { Watcher } from './watcher.js';
3
+ export interface WatcherConfig {
4
+ watcher: {
5
+ type: string;
6
+ eventSources: Record<string, string>;
7
+ };
8
+ [key: string]: Record<string, any>;
9
+ }
10
+ export interface ChangeInfo {
11
+ event: WatchEventType;
12
+ /**
13
+ * file stat if path exists
14
+ */
15
+ stat?: Stats;
16
+ path: string;
17
+ }
18
+ declare module 'egg' {
19
+ interface EggWatcherAgent {
20
+ watcher: Watcher;
21
+ }
22
+ interface Agent extends EggWatcherAgent {
23
+ }
24
+ interface EggWatcherApplication {
25
+ watcher: Watcher;
26
+ }
27
+ interface Application extends EggWatcherApplication {
28
+ }
29
+ interface EggWatcherAppConfig extends WatcherConfig {
30
+ }
31
+ interface EggAppConfig extends EggWatcherAppConfig {
32
+ }
33
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,2 @@
1
+ export declare function isEqualOrParentPath(parent: string, child: string): boolean;
2
+ export declare function getSourceDirname(): string;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isEqualOrParentPath = isEqualOrParentPath;
7
+ exports.getSourceDirname = getSourceDirname;
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const node_url_1 = require("node:url");
10
+ // judge if parent is child's parent path
11
+ // isEqualOrParentPath('/foo', '/foo/bar') => true
12
+ // isEqualOrParentPath('/foo/bar', '/foo') => false
13
+ function isEqualOrParentPath(parent, child) {
14
+ return !node_path_1.default.relative(parent, child).startsWith('..');
15
+ }
16
+ function getSourceDirname() {
17
+ if (typeof __dirname === 'string') {
18
+ return node_path_1.default.dirname(__dirname);
19
+ }
20
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
21
+ // @ts-ignore
22
+ const __filename = (0, node_url_1.fileURLToPath)('import_meta_url_placeholder_by_tshy_after');
23
+ return node_path_1.default.dirname(node_path_1.default.dirname(__filename));
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBTUEsa0RBRUM7QUFFRCw0Q0FTQztBQW5CRCwwREFBNkI7QUFDN0IsdUNBQXlDO0FBRXpDLHlDQUF5QztBQUN6QyxrREFBa0Q7QUFDbEQsbURBQW1EO0FBQ25ELFNBQWdCLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxLQUFhO0lBQy9ELE9BQU8sQ0FBQyxtQkFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCxTQUFnQixnQkFBZ0I7SUFDOUIsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNsQyxPQUFPLG1CQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCw2REFBNkQ7SUFDN0QsYUFBYTtJQUNiLE1BQU0sVUFBVSxHQUFHLElBQUEsd0JBQWEsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sbUJBQUksQ0FBQyxPQUFPLENBQUMsbUJBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUNoRCxDQUFDIn0=
@@ -0,0 +1,9 @@
1
+ import { Base } from 'sdk-base';
2
+ import type { ChangeInfo, WatcherConfig } from './types.js';
3
+ export type WatchListener = (info: ChangeInfo) => void;
4
+ export declare class Watcher extends Base {
5
+ #private;
6
+ constructor(config: WatcherConfig);
7
+ protected _init(): Promise<void>;
8
+ watch(path: string | string[], listener: WatchListener): void;
9
+ }