@decohere/flux 0.0.1-dev.8 → 0.0.1-dev.81

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 (51) hide show
  1. package/commonjs/src/deferred-script-runner.js +58 -0
  2. package/commonjs/src/flux.command.js +29 -0
  3. package/commonjs/src/flux.module.js +38 -0
  4. package/commonjs/src/hot-reload-server.js +293 -160
  5. package/commonjs/src/index.js +33 -32
  6. package/commonjs/src/rewrite-serve-specifier.js +46 -0
  7. package/commonjs/src/run.action.js +71 -0
  8. package/commonjs/src/run.command.js +67 -0
  9. package/commonjs/src/serve.action.js +94 -10
  10. package/commonjs/src/serve.command.js +36 -4
  11. package/commonjs/src/slice-serve.js +132 -0
  12. package/commonjs/src/source-module-loader.js +216 -0
  13. package/es6/src/deferred-script-runner.js +48 -0
  14. package/es6/src/flux.command.js +19 -0
  15. package/es6/src/flux.module.js +28 -0
  16. package/es6/src/hot-reload-server.js +280 -117
  17. package/es6/src/index.js +6 -7
  18. package/es6/src/rewrite-serve-specifier.js +40 -0
  19. package/es6/src/run.action.js +58 -0
  20. package/es6/src/run.command.js +57 -0
  21. package/es6/src/serve.action.js +92 -10
  22. package/es6/src/serve.command.js +37 -5
  23. package/es6/src/slice-serve.js +107 -0
  24. package/es6/src/source-module-loader.js +160 -0
  25. package/package.json +8 -12
  26. package/types/src/deferred-script-runner.d.ts +18 -0
  27. package/types/src/{ember.command.d.ts → flux.command.d.ts} +1 -1
  28. package/types/src/flux.module.d.ts +16 -0
  29. package/types/src/hot-reload-server.d.ts +62 -22
  30. package/types/src/index.d.ts +8 -8
  31. package/types/src/rewrite-serve-specifier.d.ts +13 -0
  32. package/types/src/run.action.d.ts +17 -0
  33. package/types/src/run.command.d.ts +11 -0
  34. package/types/src/serve.action.d.ts +17 -2
  35. package/types/src/serve.command.d.ts +7 -2
  36. package/types/src/slice-serve.d.ts +52 -0
  37. package/types/src/source-module-loader.d.ts +49 -0
  38. package/commonjs/src/ember.command.js +0 -27
  39. package/commonjs/src/ember.module.js +0 -37
  40. package/commonjs/src/hot-module-hooks.js +0 -47
  41. package/commonjs/src/serve.js +0 -36
  42. package/commonjs/src/workspace-serve.action.js +0 -59
  43. package/es6/src/ember.command.js +0 -17
  44. package/es6/src/ember.module.js +0 -19
  45. package/es6/src/hot-module-hooks.js +0 -26
  46. package/es6/src/serve.js +0 -32
  47. package/es6/src/workspace-serve.action.js +0 -45
  48. package/types/src/ember.module.d.ts +0 -22
  49. package/types/src/hot-module-hooks.d.ts +0 -5
  50. package/types/src/serve.d.ts +0 -1
  51. package/types/src/workspace-serve.action.d.ts +0 -11
@@ -0,0 +1,160 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ import { registerHooks } from "node:module";
8
+ import path from "node:path";
9
+ import { injectable } from "@decohere/crucible/decorators";
10
+ import { BuildTargets, SwcTranspiler, WorkspaceDefaults } from "@decohere/forge";
11
+ import { packageAliases, WorkspaceFactory } from "@decohere/mesh";
12
+ import { FileEx, io } from "@decohere/nexus/io";
13
+ import { scribe } from "@decohere/scribe";
14
+ import { rewriteServeSpecifier } from "./rewrite-serve-specifier.js";
15
+ export class SourceModuleLoader {
16
+ logger = scribe.logger(SourceModuleLoader.name);
17
+ transpiler = new SwcTranspiler();
18
+ disposed = false;
19
+ hooksRegistered = false;
20
+ workspace;
21
+ buildConfig = "debug";
22
+ fileInfoMap = new Map();
23
+ transpileCache = new Map();
24
+ aliasPaths = {};
25
+ aliasBaseUrl = path.resolve(".");
26
+ versionFileUrl = (fileUrl)=>fileUrl;
27
+ onResolved;
28
+ getWorkspace() {
29
+ return this.workspace;
30
+ }
31
+ getBuildConfig() {
32
+ return this.buildConfig;
33
+ }
34
+ hasSourceFile(absolutePath) {
35
+ return this.fileInfoMap.has(absolutePath);
36
+ }
37
+ sourceFilePaths() {
38
+ return this.fileInfoMap.keys();
39
+ }
40
+ setSourceFile(absolutePath, project) {
41
+ this.fileInfoMap.set(absolutePath, {
42
+ project
43
+ });
44
+ }
45
+ async configure(options) {
46
+ this.disposed = false;
47
+ this.transpileCache.clear();
48
+ this.buildConfig = options.buildConfig;
49
+ this.workspace = options.workspace ?? await WorkspaceFactory.create({
50
+ ...WorkspaceDefaults,
51
+ rootDir: process.cwd()
52
+ });
53
+ this.versionFileUrl = options.versionFileUrl ?? ((fileUrl)=>fileUrl);
54
+ this.onResolved = options.onResolved;
55
+ this.fileInfoMap = await this.buildFileInfoMap(this.buildConfig);
56
+ const aliases = this.workspace.getPackageAliases(this.buildConfig);
57
+ this.aliasBaseUrl = aliases.baseUrl;
58
+ this.aliasPaths = aliases.paths;
59
+ }
60
+ registerHooks() {
61
+ if (this.hooksRegistered) return;
62
+ this.hooksRegistered = true;
63
+ registerHooks({
64
+ resolve: (specifier, context, next)=>{
65
+ if (this.disposed) return next(specifier, context);
66
+ const parentUrl = context.parentURL ?? "";
67
+ const rewritten = rewriteServeSpecifier({
68
+ specifier,
69
+ parentUrl,
70
+ isWatchedTs: (filePath)=>this.fileInfoMap.has(filePath),
71
+ resolveBare: (bare)=>packageAliases.resolvePath(bare, this.aliasPaths, this.aliasBaseUrl),
72
+ versionFileUrl: this.versionFileUrl
73
+ }) ?? specifier;
74
+ const result = next(rewritten, context);
75
+ this.onResolved?.(result, parentUrl);
76
+ return result;
77
+ },
78
+ load: (url, context, next)=>{
79
+ if (this.disposed) return next(url, context);
80
+ const result = this.loadTs(url);
81
+ if (result != null) {
82
+ return {
83
+ format: "module",
84
+ source: result.source,
85
+ shortCircuit: true
86
+ };
87
+ }
88
+ return next(url, context);
89
+ }
90
+ });
91
+ }
92
+ async importEntry(absolutePath) {
93
+ const url = this.versionFileUrl(io.pathToFileUrl(path.resolve(absolutePath)));
94
+ return import(url);
95
+ }
96
+ invalidateTranspile(...absolutePaths) {
97
+ for (const fullPath of absolutePaths){
98
+ this.transpileCache.delete(fullPath);
99
+ this.transpiler.invalidateContentCache(new FileEx({
100
+ fullPath
101
+ }));
102
+ }
103
+ }
104
+ dispose() {
105
+ this.disposed = true;
106
+ this.transpileCache.clear();
107
+ this.fileInfoMap.clear();
108
+ this.workspace?.[Symbol.dispose]();
109
+ this.workspace = undefined;
110
+ }
111
+ async buildFileInfoMap(buildConfig) {
112
+ const projects = this.workspace?.getProjects(buildConfig) ?? [];
113
+ const entries = await Promise.all(projects.map(async (project)=>{
114
+ const files = await project.getAllFiles();
115
+ return files.map((file)=>[
116
+ file.fullPath,
117
+ {
118
+ project
119
+ }
120
+ ]);
121
+ }));
122
+ return new Map(entries.flat());
123
+ }
124
+ loadTs(url) {
125
+ if (!url.startsWith("file:")) return null;
126
+ const cleanPath = new URL(url).pathname;
127
+ const fileInfo = this.fileInfoMap.get(cleanPath);
128
+ if (fileInfo == null) return null;
129
+ const cached = this.transpileCache.get(cleanPath);
130
+ if (cached != null) return {
131
+ source: cached
132
+ };
133
+ const { project } = fileInfo;
134
+ const tsConfig = project.getTsConfigSync();
135
+ const userConfig = project.getSwcConfigSync();
136
+ const file = new FileEx({
137
+ fullPath: cleanPath
138
+ });
139
+ const response = this.transpiler.transformFileSync(file, BuildTargets.es6, {
140
+ tsConfig,
141
+ aliasPaths: true,
142
+ userConfig,
143
+ workspace: this.workspace,
144
+ projects: this.workspace?.getProjects(this.buildConfig)
145
+ });
146
+ if (response.outcome !== "success") {
147
+ this.logger.error(`Failed to transpile ${cleanPath}`, response);
148
+ throw new Error(`Failed to transpile ${cleanPath}`);
149
+ }
150
+ this.transpileCache.set(cleanPath, response.code);
151
+ return {
152
+ source: response.code
153
+ };
154
+ }
155
+ }
156
+ SourceModuleLoader = _ts_decorate([
157
+ injectable()
158
+ ], SourceModuleLoader);
159
+
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NvdXJjZS1tb2R1bGUtbG9hZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcblx0TG9hZEZuT3V0cHV0LFxuXHRMb2FkSG9va0NvbnRleHQsXG5cdFJlc29sdmVGbk91dHB1dCxcblx0UmVzb2x2ZUhvb2tDb250ZXh0LFxufSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IHJlZ2lzdGVySG9va3MgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tIFwiQGRlY29oZXJlL2NydWNpYmxlL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEJ1aWxkVGFyZ2V0cywgU3djVHJhbnNwaWxlciwgV29ya3NwYWNlRGVmYXVsdHMgfSBmcm9tIFwiQGRlY29oZXJlL2ZvcmdlXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QsIFdvcmtzcGFjZSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgcGFja2FnZUFsaWFzZXMsIFdvcmtzcGFjZUZhY3RvcnkgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB7IEZpbGVFeCwgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgeyB0eXBlIExvZ2dlciwgc2NyaWJlIH0gZnJvbSBcIkBkZWNvaGVyZS9zY3JpYmVcIjtcbmltcG9ydCB7IHJld3JpdGVTZXJ2ZVNwZWNpZmllciB9IGZyb20gXCIuL3Jld3JpdGUtc2VydmUtc3BlY2lmaWVyLmpzXCI7XG5cbnR5cGUgRmlsZUluZm8gPSB7IHByb2plY3Q6IFByb2plY3QgfTtcblxuZXhwb3J0IGludGVyZmFjZSBTb3VyY2VNb2R1bGVMb2FkZXJPcHRpb25zIHtcblx0LyoqIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbmFtZS4gKi9cblx0YnVpbGRDb25maWc6IHN0cmluZztcblx0LyoqXG5cdCAqIFByZS1idWlsdCBXb3Jrc3BhY2UgaW5zdGFuY2UgdG8gdXNlIGluc3RlYWQgb2YgcnVubmluZyBXb3Jrc3BhY2VGYWN0b3J5LlxuXHQgKiBVc2VmdWwgaW4gdGVzdHMgdG8gYnlwYXNzIGZpbGVzeXN0ZW0tYmFzZWQgd29ya3NwYWNlIGRpc2NvdmVyeS5cblx0ICovXG5cdHdvcmtzcGFjZT86IFdvcmtzcGFjZTtcblx0LyoqXG5cdCAqIE1hcCBhIHdhdGNoZWQgYC50c2AgZmlsZSBVUkwgZm9yIEVTTSByZXNvbHV0aW9uLlxuXHQgKiBIb3QgcmVsb2FkIHBhc3NlcyBhIGA/dmVyc2lvbj1gIGJ1c3Q7IG9uZS1zaG90IHJ1biB1c2VzIGlkZW50aXR5LlxuXHQgKi9cblx0dmVyc2lvbkZpbGVVcmw/OiAoZmlsZVVybDogc3RyaW5nKSA9PiBzdHJpbmc7XG5cdC8qKiBPcHRpb25hbCBwb3N0LXJlc29sdmUgaG9vayAoZS5nLiBkZXBlbmRlbmN5IHRyYWNraW5nIGZvciBITVIpLiAqL1xuXHRvblJlc29sdmVkPzogKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgTm9kZSBFU00gcmVzb2x2ZS9sb2FkIGhvb2tzIGFuZCBTV0MtdHJhbnNwaWxlcyB3b3Jrc3BhY2UgYC50c2BcbiAqIG9uIHRoZSBmbHkuIE5vIGZpbGUgd2F0Y2hpbmcgYW5kIG5vIGVudHJ5IHJlYm9vdCDigJQgdGhhdCBiZWxvbmdzIHRvXG4gKiB7QGxpbmsgSG90UmVsb2FkU2VydmVyfS5cbiAqL1xuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNvdXJjZU1vZHVsZUxvYWRlciB7XG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFNvdXJjZU1vZHVsZUxvYWRlci5uYW1lKTtcblx0cHJpdmF0ZSByZWFkb25seSB0cmFuc3BpbGVyID0gbmV3IFN3Y1RyYW5zcGlsZXIoKTtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGhvb2tzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXHRwcml2YXRlIHdvcmtzcGFjZT86IFdvcmtzcGFjZTtcblx0cHJpdmF0ZSBidWlsZENvbmZpZyA9IFwiZGVidWdcIjtcblx0cHJpdmF0ZSBmaWxlSW5mb01hcCA9IG5ldyBNYXA8c3RyaW5nLCBGaWxlSW5mbz4oKTtcblx0cHJpdmF0ZSB0cmFuc3BpbGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cdHByaXZhdGUgYWxpYXNQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cdHByaXZhdGUgYWxpYXNCYXNlVXJsID0gcGF0aC5yZXNvbHZlKFwiLlwiKTtcblx0cHJpdmF0ZSB2ZXJzaW9uRmlsZVVybDogKGZpbGVVcmw6IHN0cmluZykgPT4gc3RyaW5nID0gKGZpbGVVcmwpID0+IGZpbGVVcmw7XG5cdHByaXZhdGUgb25SZXNvbHZlZD86IChyZXN1bHQ6IFJlc29sdmVGbk91dHB1dCwgcGFyZW50VXJsOiBzdHJpbmcpID0+IHZvaWQ7XG5cblx0cHVibGljIGdldFdvcmtzcGFjZSgpOiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLndvcmtzcGFjZTtcblx0fVxuXG5cdHB1YmxpYyBnZXRCdWlsZENvbmZpZygpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmJ1aWxkQ29uZmlnO1xuXHR9XG5cblx0cHVibGljIGhhc1NvdXJjZUZpbGUoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5maWxlSW5mb01hcC5oYXMoYWJzb2x1dGVQYXRoKTtcblx0fVxuXG5cdHB1YmxpYyBzb3VyY2VGaWxlUGF0aHMoKTogSXRlcmFibGVJdGVyYXRvcjxzdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5maWxlSW5mb01hcC5rZXlzKCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0U291cmNlRmlsZShhYnNvbHV0ZVBhdGg6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuXHRcdHRoaXMuZmlsZUluZm9NYXAuc2V0KGFic29sdXRlUGF0aCwgeyBwcm9qZWN0IH0pO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGNvbmZpZ3VyZShvcHRpb25zOiBTb3VyY2VNb2R1bGVMb2FkZXJPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuY2xlYXIoKTtcblx0XHR0aGlzLmJ1aWxkQ29uZmlnID0gb3B0aW9ucy5idWlsZENvbmZpZztcblx0XHR0aGlzLndvcmtzcGFjZSA9XG5cdFx0XHRvcHRpb25zLndvcmtzcGFjZSA/P1xuXHRcdFx0KGF3YWl0IFdvcmtzcGFjZUZhY3RvcnkuY3JlYXRlKHsgLi4uV29ya3NwYWNlRGVmYXVsdHMsIHJvb3REaXI6IHByb2Nlc3MuY3dkKCkgfSkpO1xuXHRcdHRoaXMudmVyc2lvbkZpbGVVcmwgPSBvcHRpb25zLnZlcnNpb25GaWxlVXJsID8/ICgoZmlsZVVybCkgPT4gZmlsZVVybCk7XG5cdFx0dGhpcy5vblJlc29sdmVkID0gb3B0aW9ucy5vblJlc29sdmVkO1xuXHRcdHRoaXMuZmlsZUluZm9NYXAgPSBhd2FpdCB0aGlzLmJ1aWxkRmlsZUluZm9NYXAodGhpcy5idWlsZENvbmZpZyk7XG5cdFx0Y29uc3QgYWxpYXNlcyA9IHRoaXMud29ya3NwYWNlLmdldFBhY2thZ2VBbGlhc2VzKHRoaXMuYnVpbGRDb25maWcpO1xuXHRcdHRoaXMuYWxpYXNCYXNlVXJsID0gYWxpYXNlcy5iYXNlVXJsO1xuXHRcdHRoaXMuYWxpYXNQYXRocyA9IGFsaWFzZXMucGF0aHM7XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJIb29rcygpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5ob29rc1JlZ2lzdGVyZWQpIHJldHVybjtcblx0XHR0aGlzLmhvb2tzUmVnaXN0ZXJlZCA9IHRydWU7XG5cdFx0cmVnaXN0ZXJIb29rcyh7XG5cdFx0XHRyZXNvbHZlOiAoXG5cdFx0XHRcdHNwZWNpZmllcjogc3RyaW5nLFxuXHRcdFx0XHRjb250ZXh0OiBSZXNvbHZlSG9va0NvbnRleHQsXG5cdFx0XHRcdG5leHQ6IChzcGVjaWZpZXI6IHN0cmluZywgY29udGV4dD86IFBhcnRpYWw8UmVzb2x2ZUhvb2tDb250ZXh0PikgPT4gUmVzb2x2ZUZuT3V0cHV0LFxuXHRcdFx0KSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm4gbmV4dChzcGVjaWZpZXIsIGNvbnRleHQpO1xuXHRcdFx0XHRjb25zdCBwYXJlbnRVcmwgPSBjb250ZXh0LnBhcmVudFVSTCA/PyBcIlwiO1xuXHRcdFx0XHRjb25zdCByZXdyaXR0ZW4gPVxuXHRcdFx0XHRcdHJld3JpdGVTZXJ2ZVNwZWNpZmllcih7XG5cdFx0XHRcdFx0XHRzcGVjaWZpZXIsXG5cdFx0XHRcdFx0XHRwYXJlbnRVcmwsXG5cdFx0XHRcdFx0XHRpc1dhdGNoZWRUczogKGZpbGVQYXRoKSA9PiB0aGlzLmZpbGVJbmZvTWFwLmhhcyhmaWxlUGF0aCksXG5cdFx0XHRcdFx0XHRyZXNvbHZlQmFyZTogKGJhcmUpID0+XG5cdFx0XHRcdFx0XHRcdHBhY2thZ2VBbGlhc2VzLnJlc29sdmVQYXRoKGJhcmUsIHRoaXMuYWxpYXNQYXRocywgdGhpcy5hbGlhc0Jhc2VVcmwpLFxuXHRcdFx0XHRcdFx0dmVyc2lvbkZpbGVVcmw6IHRoaXMudmVyc2lvbkZpbGVVcmwsXG5cdFx0XHRcdFx0fSkgPz8gc3BlY2lmaWVyO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBuZXh0KHJld3JpdHRlbiwgY29udGV4dCkgYXMgUmVzb2x2ZUZuT3V0cHV0O1xuXHRcdFx0XHR0aGlzLm9uUmVzb2x2ZWQ/LihyZXN1bHQsIHBhcmVudFVybCk7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXHRcdFx0bG9hZDogKFxuXHRcdFx0XHR1cmw6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogTG9hZEhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAodXJsOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPExvYWRIb29rQ29udGV4dD4pID0+IExvYWRGbk91dHB1dCxcblx0XHRcdCk6IExvYWRGbk91dHB1dCA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSB0aGlzLmxvYWRUcyh1cmwpO1xuXHRcdFx0XHRpZiAocmVzdWx0ICE9IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4geyBmb3JtYXQ6IFwibW9kdWxlXCIsIHNvdXJjZTogcmVzdWx0LnNvdXJjZSwgc2hvcnRDaXJjdWl0OiB0cnVlIH07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG5leHQodXJsLCBjb250ZXh0KTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgaW1wb3J0RW50cnkoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRjb25zdCB1cmwgPSB0aGlzLnZlcnNpb25GaWxlVXJsKGlvLnBhdGhUb0ZpbGVVcmwocGF0aC5yZXNvbHZlKGFic29sdXRlUGF0aCkpKTtcblx0XHRyZXR1cm4gaW1wb3J0KHVybCk7XG5cdH1cblxuXHRwdWJsaWMgaW52YWxpZGF0ZVRyYW5zcGlsZSguLi5hYnNvbHV0ZVBhdGhzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgZnVsbFBhdGggb2YgYWJzb2x1dGVQYXRocykge1xuXHRcdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdFx0dGhpcy50cmFuc3BpbGVyLmludmFsaWRhdGVDb250ZW50Q2FjaGUobmV3IEZpbGVFeCh7IGZ1bGxQYXRoIH0pKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHR0aGlzLnRyYW5zcGlsZUNhY2hlLmNsZWFyKCk7XG5cdFx0dGhpcy5maWxlSW5mb01hcC5jbGVhcigpO1xuXHRcdHRoaXMud29ya3NwYWNlPy5bU3ltYm9sLmRpc3Bvc2VdKCk7XG5cdFx0dGhpcy53b3Jrc3BhY2UgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJ1aWxkRmlsZUluZm9NYXAoYnVpbGRDb25maWc6IHN0cmluZyk6IFByb21pc2U8TWFwPHN0cmluZywgRmlsZUluZm8+PiB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IGVudHJpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdHByb2plY3RzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCBmaWxlcyA9IGF3YWl0IHByb2plY3QuZ2V0QWxsRmlsZXMoKTtcblx0XHRcdFx0cmV0dXJuIGZpbGVzLm1hcCgoZmlsZSk6IFtzdHJpbmcsIEZpbGVJbmZvXSA9PiBbZmlsZS5mdWxsUGF0aCwgeyBwcm9qZWN0IH1dKTtcblx0XHRcdH0pLFxuXHRcdCk7XG5cdFx0cmV0dXJuIG5ldyBNYXAoZW50cmllcy5mbGF0KCkpO1xuXHR9XG5cblx0cHJpdmF0ZSBsb2FkVHModXJsOiBzdHJpbmcpOiB7IHNvdXJjZTogc3RyaW5nIH0gfCBudWxsIHtcblx0XHRpZiAoIXVybC5zdGFydHNXaXRoKFwiZmlsZTpcIikpIHJldHVybiBudWxsO1xuXG5cdFx0Y29uc3QgY2xlYW5QYXRoID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lO1xuXHRcdGNvbnN0IGZpbGVJbmZvID0gdGhpcy5maWxlSW5mb01hcC5nZXQoY2xlYW5QYXRoKTtcblx0XHRpZiAoZmlsZUluZm8gPT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLnRyYW5zcGlsZUNhY2hlLmdldChjbGVhblBhdGgpO1xuXHRcdGlmIChjYWNoZWQgIT0gbnVsbCkgcmV0dXJuIHsgc291cmNlOiBjYWNoZWQgfTtcblxuXHRcdGNvbnN0IHsgcHJvamVjdCB9ID0gZmlsZUluZm87XG5cdFx0Y29uc3QgdHNDb25maWcgPSBwcm9qZWN0LmdldFRzQ29uZmlnU3luYygpO1xuXHRcdGNvbnN0IHVzZXJDb25maWcgPSBwcm9qZWN0LmdldFN3Y0NvbmZpZ1N5bmMoKTtcblxuXHRcdGNvbnN0IGZpbGUgPSBuZXcgRmlsZUV4KHsgZnVsbFBhdGg6IGNsZWFuUGF0aCB9KTtcblx0XHRjb25zdCByZXNwb25zZSA9IHRoaXMudHJhbnNwaWxlci50cmFuc2Zvcm1GaWxlU3luYyhmaWxlLCBCdWlsZFRhcmdldHMuZXM2LCB7XG5cdFx0XHR0c0NvbmZpZyxcblx0XHRcdGFsaWFzUGF0aHM6IHRydWUsXG5cdFx0XHR1c2VyQ29uZmlnLFxuXHRcdFx0d29ya3NwYWNlOiB0aGlzLndvcmtzcGFjZSxcblx0XHRcdHByb2plY3RzOiB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHModGhpcy5idWlsZENvbmZpZyksXG5cdFx0fSk7XG5cblx0XHRpZiAocmVzcG9uc2Uub3V0Y29tZSAhPT0gXCJzdWNjZXNzXCIpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gdHJhbnNwaWxlICR7Y2xlYW5QYXRofWAsIHJlc3BvbnNlKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHRyYW5zcGlsZSAke2NsZWFuUGF0aH1gKTtcblx0XHR9XG5cblx0XHR0aGlzLnRyYW5zcGlsZUNhY2hlLnNldChjbGVhblBhdGgsIHJlc3BvbnNlLmNvZGUpO1xuXHRcdHJldHVybiB7IHNvdXJjZTogcmVzcG9uc2UuY29kZSB9O1xuXHR9XG59XG4iXSwibmFtZXMiOlsicmVnaXN0ZXJIb29rcyIsInBhdGgiLCJpbmplY3RhYmxlIiwiQnVpbGRUYXJnZXRzIiwiU3djVHJhbnNwaWxlciIsIldvcmtzcGFjZURlZmF1bHRzIiwicGFja2FnZUFsaWFzZXMiLCJXb3Jrc3BhY2VGYWN0b3J5IiwiRmlsZUV4IiwiaW8iLCJzY3JpYmUiLCJyZXdyaXRlU2VydmVTcGVjaWZpZXIiLCJTb3VyY2VNb2R1bGVMb2FkZXIiLCJsb2dnZXIiLCJuYW1lIiwidHJhbnNwaWxlciIsImRpc3Bvc2VkIiwiaG9va3NSZWdpc3RlcmVkIiwid29ya3NwYWNlIiwiYnVpbGRDb25maWciLCJmaWxlSW5mb01hcCIsIk1hcCIsInRyYW5zcGlsZUNhY2hlIiwiYWxpYXNQYXRocyIsImFsaWFzQmFzZVVybCIsInJlc29sdmUiLCJ2ZXJzaW9uRmlsZVVybCIsImZpbGVVcmwiLCJvblJlc29sdmVkIiwiZ2V0V29ya3NwYWNlIiwiZ2V0QnVpbGRDb25maWciLCJoYXNTb3VyY2VGaWxlIiwiYWJzb2x1dGVQYXRoIiwiaGFzIiwic291cmNlRmlsZVBhdGhzIiwia2V5cyIsInNldFNvdXJjZUZpbGUiLCJwcm9qZWN0Iiwic2V0IiwiY29uZmlndXJlIiwib3B0aW9ucyIsImNsZWFyIiwiY3JlYXRlIiwicm9vdERpciIsInByb2Nlc3MiLCJjd2QiLCJidWlsZEZpbGVJbmZvTWFwIiwiYWxpYXNlcyIsImdldFBhY2thZ2VBbGlhc2VzIiwiYmFzZVVybCIsInBhdGhzIiwic3BlY2lmaWVyIiwiY29udGV4dCIsIm5leHQiLCJwYXJlbnRVcmwiLCJwYXJlbnRVUkwiLCJyZXdyaXR0ZW4iLCJpc1dhdGNoZWRUcyIsImZpbGVQYXRoIiwicmVzb2x2ZUJhcmUiLCJiYXJlIiwicmVzb2x2ZVBhdGgiLCJyZXN1bHQiLCJsb2FkIiwidXJsIiwibG9hZFRzIiwiZm9ybWF0Iiwic291cmNlIiwic2hvcnRDaXJjdWl0IiwiaW1wb3J0RW50cnkiLCJwYXRoVG9GaWxlVXJsIiwiaW52YWxpZGF0ZVRyYW5zcGlsZSIsImFic29sdXRlUGF0aHMiLCJmdWxsUGF0aCIsImRlbGV0ZSIsImludmFsaWRhdGVDb250ZW50Q2FjaGUiLCJkaXNwb3NlIiwiU3ltYm9sIiwidW5kZWZpbmVkIiwicHJvamVjdHMiLCJnZXRQcm9qZWN0cyIsImVudHJpZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiZmlsZXMiLCJnZXRBbGxGaWxlcyIsImZpbGUiLCJmbGF0Iiwic3RhcnRzV2l0aCIsImNsZWFuUGF0aCIsIlVSTCIsInBhdGhuYW1lIiwiZmlsZUluZm8iLCJnZXQiLCJjYWNoZWQiLCJ0c0NvbmZpZyIsImdldFRzQ29uZmlnU3luYyIsInVzZXJDb25maWciLCJnZXRTd2NDb25maWdTeW5jIiwicmVzcG9uc2UiLCJ0cmFuc2Zvcm1GaWxlU3luYyIsImVzNiIsIm91dGNvbWUiLCJlcnJvciIsIkVycm9yIiwiY29kZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBTUEsU0FBU0EsYUFBYSxRQUFRLGNBQWM7QUFDNUMsT0FBT0MsVUFBVSxZQUFZO0FBQzdCLFNBQVNDLFVBQVUsUUFBUSxnQ0FBZ0M7QUFDM0QsU0FBU0MsWUFBWSxFQUFFQyxhQUFhLEVBQUVDLGlCQUFpQixRQUFRLGtCQUFrQjtBQUVqRixTQUFTQyxjQUFjLEVBQUVDLGdCQUFnQixRQUFRLGlCQUFpQjtBQUNsRSxTQUFTQyxNQUFNLEVBQUVDLEVBQUUsUUFBUSxxQkFBcUI7QUFDaEQsU0FBc0JDLE1BQU0sUUFBUSxtQkFBbUI7QUFDdkQsU0FBU0MscUJBQXFCLFFBQVEsK0JBQStCO0FBMkJyRSxPQUFPLE1BQU1DO0lBQ0tDLFNBQWlCSCxPQUFPRyxNQUFNLENBQUNELG1CQUFtQkUsSUFBSSxFQUFFO0lBQ3hEQyxhQUFhLElBQUlYLGdCQUFnQjtJQUMxQ1ksV0FBVyxNQUFNO0lBQ2pCQyxrQkFBa0IsTUFBTTtJQUN4QkMsVUFBc0I7SUFDdEJDLGNBQWMsUUFBUTtJQUN0QkMsY0FBYyxJQUFJQyxNQUF3QjtJQUMxQ0MsaUJBQWlCLElBQUlELE1BQXNCO0lBQzNDRSxhQUF1QyxDQUFDLEVBQUU7SUFDMUNDLGVBQWV2QixLQUFLd0IsT0FBTyxDQUFDLEtBQUs7SUFDakNDLGlCQUE4QyxDQUFDQyxVQUFZQSxRQUFRO0lB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decohere/flux",
3
- "version": "0.0.1-dev.8",
3
+ "version": "0.0.1-dev.81",
4
4
  "description": "Hot module reload server for Node.js ESM applications",
5
5
  "keywords": [
6
6
  "typescript",
@@ -19,23 +19,19 @@
19
19
  "types": "./types/src/index.d.ts",
20
20
  "import": "./es6/src/index.js",
21
21
  "require": "./commonjs/src/index.js"
22
- },
23
- "./serve": {
24
- "types": "./types/src/serve.d.ts",
25
- "import": "./es6/src/serve.js"
26
22
  }
27
23
  },
28
- "bin": {
29
- "ember": "./es6/src/serve.js"
30
- },
31
24
  "scripts": {
32
25
  "test": "echo \"Error: no test specified\" && exit 1"
33
26
  },
34
27
  "dependencies": {
35
- "@decohere/crucible": "0.0.1-dev.8",
36
- "@decohere/mesh": "0.0.1-dev.8",
37
- "@decohere/nexus": "0.0.1-dev.8",
38
- "@decohere/scribe": "0.0.1-dev.8"
28
+ "@decohere/crucible": "0.0.1-dev.81",
29
+ "@decohere/forge": "0.0.1-dev.81",
30
+ "@decohere/mesh": "0.0.1-dev.81",
31
+ "@decohere/nexus": "0.0.1-dev.81",
32
+ "@decohere/scribe": "0.0.1-dev.81",
33
+ "commander": "^13.1.0",
34
+ "rxjs": "^7.8.2"
39
35
  },
40
36
  "devDependencies": {}
41
37
  }
@@ -0,0 +1,18 @@
1
+ import { type ChildProcess } from "node:child_process";
2
+ export type DeferredScriptStart = {
3
+ readonly label: string;
4
+ readonly cwd: string;
5
+ readonly script: string;
6
+ /** Workspace root used to detect pnpm/npm/yarn. */
7
+ readonly workspaceRoot: string;
8
+ };
9
+ /**
10
+ * Nixpacks-style child processes for foreign packages in a flux serve slice.
11
+ * Killed when the Flux container disposes (SIGINT → RootModule teardown).
12
+ */
13
+ export declare class DeferredScriptRunner implements AsyncDisposable {
14
+ private readonly logger;
15
+ private readonly children;
16
+ start(options: DeferredScriptStart): ChildProcess;
17
+ [Symbol.asyncDispose](): Promise<void>;
18
+ }
@@ -1,6 +1,6 @@
1
1
  import type { Actions } from "@decohere/nexus/cli";
2
2
  import { type CommandHandler, type CommandResponse, type CommandType, DecohereCommand } from "@decohere/nexus/cli";
3
- export declare class EmberCommand extends DecohereCommand {
3
+ export declare class FluxCommand extends DecohereCommand {
4
4
  constructor(commands: Record<string, CommandType>, handler: CommandHandler);
5
5
  run(_actions: Actions, _options: never): Promise<CommandResponse>;
6
6
  }
@@ -0,0 +1,16 @@
1
+ import type { WorkspaceFactoryOptions } from "@decohere/nexus/cli";
2
+ import { ModuleManifest } from "@decohere/nexus/cli";
3
+ import type { ContainerBuilder } from "@decohere/nexus/composition";
4
+ import { FluxCommand } from "./flux.command.js";
5
+ import { RunAction } from "./run.action.js";
6
+ import { ServeAction } from "./serve.action.js";
7
+ export declare class FluxModule extends ModuleManifest {
8
+ readonly id = "flux";
9
+ readonly command: typeof FluxCommand;
10
+ readonly actions: {
11
+ serve: typeof ServeAction;
12
+ run: typeof RunAction;
13
+ };
14
+ registerServices(builder: ContainerBuilder): void;
15
+ createWorkspace(options: WorkspaceFactoryOptions): Promise<import("@decohere/mesh").Workspace>;
16
+ }
@@ -1,38 +1,78 @@
1
1
  import { EventEmitter } from "node:events";
2
- import type { Logger } from "@decohere/scribe";
2
+ import type { Workspace } from "@decohere/mesh";
3
+ /** Default quiet window before a file-change reboot. */
4
+ export declare const DEFAULT_REBOOT_DEBOUNCE_MS = 250;
5
+ export declare function resolveRebootDebounceMs(value: number | undefined): number;
3
6
  export interface HotReloadServerEvents {
7
+ start: [];
4
8
  reboot: [];
5
9
  }
10
+ export interface HotReloadServerOptions {
11
+ /** Build configuration name. */
12
+ buildConfig: string;
13
+ /** Name of the project to serve. Defaults to the first project in the workspace. */
14
+ project?: string;
15
+ /**
16
+ * Multiple Flux app package names to boot in one process (directory slice).
17
+ * When set, takes precedence over {@link project}.
18
+ */
19
+ projects?: readonly string[];
20
+ /**
21
+ * Pre-built Workspace instance to use instead of running WorkspaceFactory.
22
+ * Useful in tests to bypass filesystem-based workspace discovery.
23
+ */
24
+ workspace?: Workspace;
25
+ /**
26
+ * Quiet window in milliseconds after the last affecting save before a reboot.
27
+ * Defaults to {@link DEFAULT_REBOOT_DEBOUNCE_MS}. Raise this for agent save trains.
28
+ */
29
+ rebootDebounceMs?: number;
30
+ }
6
31
  export declare class HotReloadServer extends EventEmitter<HotReloadServerEvents> {
7
32
  private readonly logger;
33
+ private readonly loader;
8
34
  private disposed;
9
- private entryModule;
10
- private entry;
11
- private sourceFiles;
35
+ /** Absolute entry paths currently served (one or more Flux apps). */
36
+ private entries;
37
+ private pendingEntryReboots;
38
+ private watchSubscription?;
12
39
  private moduleCache;
13
40
  private dependencies;
14
- private watchers;
15
- constructor(logger: Logger);
16
- start(entry: string, ...watchDirs: string[]): Promise<void>;
41
+ private rebootTail;
42
+ private rebootDebounceGen;
43
+ private rebootInFlight;
44
+ private rebootFollowUp;
45
+ private rebootQueued;
46
+ /** Modules whose reverse-graph edges are pruned at reboot, not on schedule. */
47
+ private pendingGraphPrune;
48
+ private scheduleReboot;
49
+ start(options: HotReloadServerOptions): Promise<void>;
17
50
  dispose(): Promise<void>;
18
- private removeSourceFiles;
19
- private getSourceFiles;
20
- private configureModuleHooks;
21
- private onResolve;
22
- private isSourceModule;
51
+ [Symbol.asyncDispose](): Promise<void>;
52
+ private bootEntries;
53
+ private bootEntry;
54
+ private bindScheduleReboot;
55
+ private requestReboot;
56
+ private runReboot;
57
+ private disposeEntries;
58
+ private disposeEntry;
59
+ private requireWorkspace;
60
+ private resolveProjects;
61
+ /**
62
+ * Post-next dependency tracker: records which source files import which
63
+ * other source files so that reloadIfAffected can traverse the graph.
64
+ */
65
+ private onPostResolve;
66
+ private onFileChange;
67
+ private reloadIfAffected;
23
68
  private getDependencyGraph;
24
69
  private trackDependency;
25
70
  private getCachedOrNew;
26
71
  private versionModule;
27
- private watch;
28
- private onFileAdded;
29
- private onSourceFileChanged;
30
- private onFileDeleted;
31
- private reloadIfAffected;
32
- private isSelf;
33
- private invlidateModule;
72
+ private invalidateModuleCaches;
73
+ private prunePendingDependencyEdges;
74
+ /** Remove these modules as parents so boot can rebuild edges without stale importers. */
75
+ private pruneDependencyParents;
34
76
  private invalidateAllSourceFiles;
35
- private disposeAndBoot;
36
- private disposeEntry;
37
- private bootEntry;
77
+ private isSelf;
38
78
  }
@@ -1,9 +1,9 @@
1
- export { EmberCommand } from "./ember.command.js";
2
- export type { EmberModuleContext, EmberModuleResult } from "./ember.module.js";
3
- export { EmberActions, EmberModule } from "./ember.module.js";
4
- export * from "./hot-reload-server.js";
1
+ export { DeferredScriptRunner } from "./deferred-script-runner.js";
2
+ export { FluxModule } from "./flux.module.js";
3
+ export type { HotReloadServerOptions } from "./hot-reload-server.js";
4
+ export { DEFAULT_REBOOT_DEBOUNCE_MS, HotReloadServer } from "./hot-reload-server.js";
5
+ export type { RunOptions } from "./run.action.js";
5
6
  export type { ServeOptions } from "./serve.action.js";
6
- export { ServeAction } from "./serve.action.js";
7
- export { ServeCommand } from "./serve.command.js";
8
- export type { WorkspaceServeOptions } from "./workspace-serve.action.js";
9
- export { WorkspaceServeAction } from "./workspace-serve.action.js";
7
+ export { type ClassifiedSlice, classifySliceProject, classifySliceProjects, normalizeSlicePrefix, projectsInSlice, projectsInSlices, resolveDeferScript, type SliceKind, type SliceProjectView, } from "./slice-serve.js";
8
+ export type { SourceModuleLoaderOptions } from "./source-module-loader.js";
9
+ export { SourceModuleLoader } from "./source-module-loader.js";
@@ -0,0 +1,13 @@
1
+ export type RewriteServeSpecifierOptions = {
2
+ specifier: string;
3
+ parentUrl: string;
4
+ isWatchedTs: (absolutePath: string) => boolean;
5
+ resolveBare: (specifier: string) => string | null;
6
+ versionFileUrl: (fileUrl: string) => string;
7
+ };
8
+ /**
9
+ * Map a resolve-hook specifier to a versioned watched `.ts` file URL.
10
+ * Covers relative `.js` / `.ts` / extensionless imports and bare workspace
11
+ * package names (dynamic `import()` never goes through SWC path rewrite).
12
+ */
13
+ export declare function rewriteServeSpecifier(options: RewriteServeSpecifierOptions): string | null;
@@ -0,0 +1,17 @@
1
+ import { Workspace } from "@decohere/mesh";
2
+ import { type Action, ActionResponse } from "@decohere/nexus/cli";
3
+ import { SourceModuleLoader } from "./source-module-loader.js";
4
+ export type RunOptions = {
5
+ /** Absolute or cwd-relative path to a `.ts` entry file. */
6
+ entry: string;
7
+ configuration: string;
8
+ /** Arguments forwarded to the entry (bin-style `process.argv.slice(2)`). */
9
+ args?: string[];
10
+ };
11
+ export declare class RunAction implements Action<RunOptions> {
12
+ private readonly loader;
13
+ private readonly workspace;
14
+ private readonly logger;
15
+ constructor(loader: SourceModuleLoader, workspace: Workspace);
16
+ run(options: RunOptions): Promise<ActionResponse>;
17
+ }
@@ -0,0 +1,11 @@
1
+ import { DecohereCommand } from "@decohere/nexus/cli";
2
+ import { RunAction } from "./run.action.js";
3
+ export declare class RunCommand extends DecohereCommand {
4
+ get actions(): (typeof RunAction)[];
5
+ constructor(name: string);
6
+ /**
7
+ * Commander passes positionals before options when `<entry> [args...]` is declared.
8
+ * The CLI host ModuleFactory expects `(opts, cmd)` — normalize and stash entry/args on opts.
9
+ */
10
+ action(fn: (...args: any[]) => void | Promise<void>): this;
11
+ }
@@ -1,8 +1,23 @@
1
+ import { Workspace } from "@decohere/mesh";
1
2
  import { type Action, ActionResponse } from "@decohere/nexus/cli";
3
+ import { DeferredScriptRunner } from "./deferred-script-runner.js";
4
+ import { HotReloadServer } from "./hot-reload-server.js";
2
5
  export type ServeOptions = {
3
- entry: string;
4
- watchDir: string;
6
+ configuration: string;
7
+ project?: string;
8
+ /** One or more module directory tokens (`funding`, `shell`, `projects/funding`). */
9
+ slices?: string[];
10
+ rebootDebounceMs?: number;
5
11
  };
6
12
  export declare class ServeAction implements Action<ServeOptions> {
13
+ private readonly server;
14
+ private readonly workspace;
15
+ private readonly deferredScripts;
16
+ private readonly logger;
17
+ constructor(server: HotReloadServer, workspace: Workspace, deferredScripts: DeferredScriptRunner);
7
18
  run(options: ServeOptions): Promise<ActionResponse>;
19
+ private runSlices;
20
+ private toSliceViews;
21
+ private toSliceView;
22
+ private findProject;
8
23
  }
@@ -1,6 +1,11 @@
1
1
  import { DecohereCommand } from "@decohere/nexus/cli";
2
- import { WorkspaceServeAction } from "./workspace-serve.action.js";
2
+ import { ServeAction } from "./serve.action.js";
3
3
  export declare class ServeCommand extends DecohereCommand {
4
- get actions(): (typeof WorkspaceServeAction)[];
4
+ get actions(): (typeof ServeAction)[];
5
5
  constructor(name: string);
6
+ /**
7
+ * Commander passes positional args before options when `[slices...]` is declared.
8
+ * The CLI host ModuleFactory expects `(opts, cmd)` — normalize here.
9
+ */
10
+ action(fn: (...args: any[]) => void | Promise<void>): this;
6
11
  }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Directory-slice helpers for `flux serve <dir>…` — classify Mesh packages as
3
+ * Flux apps, Nixpacks-style script deferrals, or libraries to skip.
4
+ */
5
+ export type SliceProjectView = {
6
+ readonly name: string;
7
+ /** Relative project dir from workspace root (e.g. `projects/funding/api`). */
8
+ readonly projectDirectory: string;
9
+ readonly main: string;
10
+ readonly scripts: Record<string, string>;
11
+ };
12
+ export type SliceKind = "flux" | "defer" | "skip";
13
+ export type ClassifiedSlice = {
14
+ readonly flux: SliceProjectView[];
15
+ readonly defer: SliceProjectView[];
16
+ readonly skip: SliceProjectView[];
17
+ };
18
+ /** Preferred package scripts for foreign toolchains (Nixpacks-style). */
19
+ export declare const DEFER_SCRIPT_CANDIDATES: readonly ["dev", "serve"];
20
+ /**
21
+ * Normalize a CLI slice token to a `projects/…` prefix without a trailing slash.
22
+ * `funding` and `projects/funding` both become `projects/funding`.
23
+ */
24
+ export declare function normalizeSlicePrefix(slice: string): string;
25
+ /**
26
+ * True when `projectDirectory` belongs to the slice token.
27
+ *
28
+ * Matches:
29
+ * - nested: `projects/funding`, `projects/funding/api`
30
+ * - flat dotted package dirs: `projects/funding.web` for token `funding`
31
+ *
32
+ * Does not match siblings that only share a string prefix (`funding` vs `funding-fee.api`).
33
+ */
34
+ export declare function isUnderSlice(projectDirectory: string, slicePrefix: string): boolean;
35
+ export declare function projectsInSlice(projects: readonly SliceProjectView[], slice: string): SliceProjectView[];
36
+ /** Union of packages under any of the slice tokens (deduped by package name). */
37
+ export declare function projectsInSlices(projects: readonly SliceProjectView[], slices: readonly string[]): SliceProjectView[];
38
+ /** Script invokes Flux (in-process serve stays on Flux, not deferred). */
39
+ export declare function isFluxOwnedScript(script: string): boolean;
40
+ /**
41
+ * First Nixpacks-style serve script that is not Flux-owned.
42
+ * Prefers `dev`, then `serve`.
43
+ */
44
+ export declare function resolveDeferScript(scripts: Record<string, string>): string | undefined;
45
+ /** Convention: Flux Node apps use `main` ending in `main.ts` / `main.tsx`. */
46
+ export declare function isFluxAppMain(main: string): boolean;
47
+ /**
48
+ * Classify one package. Foreign serve scripts win over `main.ts` (Vite apps
49
+ * often have a main entry but must not be HMR-booted by Flux).
50
+ */
51
+ export declare function classifySliceProject(project: SliceProjectView): SliceKind;
52
+ export declare function classifySliceProjects(projects: readonly SliceProjectView[], slices: string | readonly string[]): ClassifiedSlice;
@@ -0,0 +1,49 @@
1
+ import type { ResolveFnOutput } from "node:module";
2
+ import type { Project, Workspace } from "@decohere/mesh";
3
+ export interface SourceModuleLoaderOptions {
4
+ /** Build configuration name. */
5
+ buildConfig: string;
6
+ /**
7
+ * Pre-built Workspace instance to use instead of running WorkspaceFactory.
8
+ * Useful in tests to bypass filesystem-based workspace discovery.
9
+ */
10
+ workspace?: Workspace;
11
+ /**
12
+ * Map a watched `.ts` file URL for ESM resolution.
13
+ * Hot reload passes a `?version=` bust; one-shot run uses identity.
14
+ */
15
+ versionFileUrl?: (fileUrl: string) => string;
16
+ /** Optional post-resolve hook (e.g. dependency tracking for HMR). */
17
+ onResolved?: (result: ResolveFnOutput, parentUrl: string) => void;
18
+ }
19
+ /**
20
+ * Registers Node ESM resolve/load hooks and SWC-transpiles workspace `.ts`
21
+ * on the fly. No file watching and no entry reboot — that belongs to
22
+ * {@link HotReloadServer}.
23
+ */
24
+ export declare class SourceModuleLoader {
25
+ private readonly logger;
26
+ private readonly transpiler;
27
+ private disposed;
28
+ private hooksRegistered;
29
+ private workspace?;
30
+ private buildConfig;
31
+ private fileInfoMap;
32
+ private transpileCache;
33
+ private aliasPaths;
34
+ private aliasBaseUrl;
35
+ private versionFileUrl;
36
+ private onResolved?;
37
+ getWorkspace(): Workspace | undefined;
38
+ getBuildConfig(): string;
39
+ hasSourceFile(absolutePath: string): boolean;
40
+ sourceFilePaths(): IterableIterator<string>;
41
+ setSourceFile(absolutePath: string, project: Project): void;
42
+ configure(options: SourceModuleLoaderOptions): Promise<void>;
43
+ registerHooks(): void;
44
+ importEntry(absolutePath: string): Promise<unknown>;
45
+ invalidateTranspile(...absolutePaths: string[]): void;
46
+ dispose(): void;
47
+ private buildFileInfoMap;
48
+ private loadTs;
49
+ }
@@ -1,27 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "EmberCommand", {
6
- enumerable: true,
7
- get: function() {
8
- return EmberCommand;
9
- }
10
- });
11
- const _cli = require("@decohere/nexus/cli");
12
- const _servecommand = require("./serve.command.js");
13
- class EmberCommand extends _cli.DecohereCommand {
14
- constructor(commands, handler){
15
- super(EmberCommand);
16
- this.exitOverride();
17
- this.registerSubcommand({
18
- serve: _servecommand.ServeCommand,
19
- ...commands
20
- }, handler);
21
- }
22
- run(_actions, _options) {
23
- return this.help();
24
- }
25
- }
26
-
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2VtYmVyLmNvbW1hbmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb25zIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7XG5cdHR5cGUgQ29tbWFuZEhhbmRsZXIsXG5cdHR5cGUgQ29tbWFuZFJlc3BvbnNlLFxuXHR0eXBlIENvbW1hbmRUeXBlLFxuXHREZWNvaGVyZUNvbW1hbmQsXG59IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBTZXJ2ZUNvbW1hbmQgfSBmcm9tIFwiLi9zZXJ2ZS5jb21tYW5kLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBFbWJlckNvbW1hbmQgZXh0ZW5kcyBEZWNvaGVyZUNvbW1hbmQge1xuXHRwdWJsaWMgY29uc3RydWN0b3IoY29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIENvbW1hbmRUeXBlPiwgaGFuZGxlcjogQ29tbWFuZEhhbmRsZXIpIHtcblx0XHRzdXBlcihFbWJlckNvbW1hbmQpO1xuXHRcdHRoaXMuZXhpdE92ZXJyaWRlKCk7XG5cdFx0dGhpcy5yZWdpc3RlclN1YmNvbW1hbmQoeyBzZXJ2ZTogU2VydmVDb21tYW5kLCAuLi5jb21tYW5kcyB9LCBoYW5kbGVyKTtcblx0fVxuXG5cdHB1YmxpYyBydW4oX2FjdGlvbnM6IEFjdGlvbnMsIF9vcHRpb25zOiBuZXZlcik6IFByb21pc2U8Q29tbWFuZFJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIHRoaXMuaGVscCgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiRW1iZXJDb21tYW5kIiwiRGVjb2hlcmVDb21tYW5kIiwiY29tbWFuZHMiLCJoYW5kbGVyIiwiZXhpdE92ZXJyaWRlIiwicmVnaXN0ZXJTdWJjb21tYW5kIiwic2VydmUiLCJTZXJ2ZUNvbW1hbmQiLCJydW4iLCJfYWN0aW9ucyIsIl9vcHRpb25zIiwiaGVscCJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFTYUE7OztlQUFBQTs7O3FCQUhOOzhCQUNzQjtBQUV0QixNQUFNQSxxQkFBcUJDLG9CQUFlO0lBQ2hELFlBQW1CQyxRQUFxQyxFQUFFQyxPQUF1QixDQUFFO1FBQ2xGLEtBQUssQ0FBQ0g7UUFDTixJQUFJLENBQUNJLFlBQVk7UUFDakIsSUFBSSxDQUFDQyxrQkFBa0IsQ0FBQztZQUFFQyxPQUFPQywwQkFBWTtZQUFFLEdBQUdMLFFBQVE7UUFBQyxHQUFHQztJQUMvRDtJQUVPSyxJQUFJQyxRQUFpQixFQUFFQyxRQUFlLEVBQTRCO1FBQ3hFLE9BQU8sSUFBSSxDQUFDQyxJQUFJO0lBQ2pCO0FBQ0QifQ==