@decohere/flux 0.0.1-dev.75 → 0.0.1-dev.77

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.
@@ -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.75",
3
+ "version": "0.0.1-dev.77",
4
4
  "description": "Hot module reload server for Node.js ESM applications",
5
5
  "keywords": [
6
6
  "typescript",
@@ -25,11 +25,11 @@
25
25
  "test": "echo \"Error: no test specified\" && exit 1"
26
26
  },
27
27
  "dependencies": {
28
- "@decohere/crucible": "0.0.1-dev.75",
29
- "@decohere/forge": "0.0.1-dev.75",
30
- "@decohere/mesh": "0.0.1-dev.75",
31
- "@decohere/nexus": "0.0.1-dev.75",
32
- "@decohere/scribe": "0.0.1-dev.75",
28
+ "@decohere/crucible": "0.0.1-dev.77",
29
+ "@decohere/forge": "0.0.1-dev.77",
30
+ "@decohere/mesh": "0.0.1-dev.77",
31
+ "@decohere/nexus": "0.0.1-dev.77",
32
+ "@decohere/scribe": "0.0.1-dev.77",
33
33
  "commander": "^13.1.0",
34
34
  "rxjs": "^7.8.2"
35
35
  },
@@ -2,12 +2,14 @@ import type { WorkspaceFactoryOptions } from "@decohere/nexus/cli";
2
2
  import { ModuleManifest } from "@decohere/nexus/cli";
3
3
  import type { ContainerBuilder } from "@decohere/nexus/composition";
4
4
  import { FluxCommand } from "./flux.command.js";
5
+ import { RunAction } from "./run.action.js";
5
6
  import { ServeAction } from "./serve.action.js";
6
7
  export declare class FluxModule extends ModuleManifest {
7
8
  readonly id = "flux";
8
9
  readonly command: typeof FluxCommand;
9
10
  readonly actions: {
10
11
  serve: typeof ServeAction;
12
+ run: typeof RunAction;
11
13
  };
12
14
  registerServices(builder: ContainerBuilder): void;
13
15
  createWorkspace(options: WorkspaceFactoryOptions): Promise<import("@decohere/mesh").Workspace>;
@@ -30,22 +30,14 @@ export interface HotReloadServerOptions {
30
30
  }
31
31
  export declare class HotReloadServer extends EventEmitter<HotReloadServerEvents> {
32
32
  private readonly logger;
33
+ private readonly loader;
33
34
  private disposed;
34
- private hooksRegistered;
35
35
  /** Absolute entry paths currently served (one or more Flux apps). */
36
36
  private entries;
37
37
  private pendingEntryReboots;
38
- private workspace?;
39
- private buildConfig;
40
38
  private watchSubscription?;
41
- /** Map from absolute .ts source file path to project info */
42
- private fileInfoMap;
43
39
  private moduleCache;
44
40
  private dependencies;
45
- private transpileCache;
46
- private transpiler;
47
- private aliasPaths;
48
- private aliasBaseUrl;
49
41
  private rebootTail;
50
42
  private rebootDebounceGen;
51
43
  private rebootInFlight;
@@ -62,17 +54,13 @@ export declare class HotReloadServer extends EventEmitter<HotReloadServerEvents>
62
54
  private runReboot;
63
55
  private disposeEntries;
64
56
  private disposeEntry;
65
- private resolveWorkspace;
57
+ private requireWorkspace;
66
58
  private resolveProjects;
67
- private buildFileInfoMap;
68
- private registerHooks;
69
- private buildAliasPaths;
70
59
  /**
71
60
  * Post-next dependency tracker: records which source files import which
72
61
  * other source files so that reloadIfAffected can traverse the graph.
73
62
  */
74
63
  private onPostResolve;
75
- private loadTs;
76
64
  private onFileChange;
77
65
  private reloadIfAffected;
78
66
  private getDependencyGraph;
@@ -2,5 +2,8 @@ export { DeferredScriptRunner } from "./deferred-script-runner.js";
2
2
  export { FluxModule } from "./flux.module.js";
3
3
  export type { HotReloadServerOptions } from "./hot-reload-server.js";
4
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
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,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
+ * Terminal's ModuleFactory expects `(opts, cmd)` — normalize and stash entry/args on opts.
9
+ */
10
+ action(fn: (...args: any[]) => void | Promise<void>): this;
11
+ }
@@ -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
+ }