@plugjs/plug 0.1.3 → 0.2.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 (120) hide show
  1. package/README.md +2 -2
  2. package/cli/plug.mjs +1397 -0
  3. package/cli/ts-loader.mjs +273 -0
  4. package/cli/tsrun.mjs +136 -0
  5. package/dist/asserts.cjs +6 -3
  6. package/dist/asserts.cjs.map +1 -1
  7. package/dist/asserts.d.ts +2 -2
  8. package/dist/asserts.mjs +6 -3
  9. package/dist/asserts.mjs.map +1 -1
  10. package/dist/build.cjs +39 -28
  11. package/dist/build.cjs.map +2 -2
  12. package/dist/build.mjs +39 -28
  13. package/dist/build.mjs.map +2 -2
  14. package/dist/files.cjs +9 -0
  15. package/dist/files.cjs.map +1 -1
  16. package/dist/files.d.ts +2 -2
  17. package/dist/files.mjs +9 -0
  18. package/dist/files.mjs.map +1 -1
  19. package/dist/fork.cjs +12 -10
  20. package/dist/fork.cjs.map +2 -2
  21. package/dist/fork.mjs +12 -10
  22. package/dist/fork.mjs.map +2 -2
  23. package/dist/fs.cjs +11 -4
  24. package/dist/fs.cjs.map +1 -1
  25. package/dist/fs.mjs +7 -4
  26. package/dist/fs.mjs.map +1 -1
  27. package/dist/helpers.cjs +5 -2
  28. package/dist/helpers.cjs.map +1 -1
  29. package/dist/helpers.mjs +5 -2
  30. package/dist/helpers.mjs.map +1 -1
  31. package/dist/index.cjs +9 -0
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.d.ts +4 -1
  34. package/dist/index.mjs +4 -1
  35. package/dist/index.mjs.map +1 -1
  36. package/dist/logging/levels.cjs.map +1 -1
  37. package/dist/logging/levels.mjs.map +1 -1
  38. package/dist/logging/logger.cjs +1 -1
  39. package/dist/logging/logger.cjs.map +1 -1
  40. package/dist/logging/logger.mjs +1 -1
  41. package/dist/logging/logger.mjs.map +1 -1
  42. package/dist/logging/options.cjs +5 -0
  43. package/dist/logging/options.cjs.map +1 -1
  44. package/dist/logging/options.mjs +5 -0
  45. package/dist/logging/options.mjs.map +1 -1
  46. package/dist/logging/report.cjs.map +1 -1
  47. package/dist/logging/report.mjs.map +1 -1
  48. package/dist/logging/spinner.cjs +12 -0
  49. package/dist/logging/spinner.cjs.map +1 -1
  50. package/dist/logging/spinner.mjs +12 -0
  51. package/dist/logging/spinner.mjs.map +1 -1
  52. package/dist/paths.cjs.map +1 -1
  53. package/dist/paths.mjs.map +1 -1
  54. package/dist/pipe.cjs +34 -0
  55. package/dist/pipe.cjs.map +1 -1
  56. package/dist/pipe.mjs +34 -0
  57. package/dist/pipe.mjs.map +1 -1
  58. package/dist/plugs/debug.cjs.map +1 -1
  59. package/dist/plugs/debug.mjs.map +1 -1
  60. package/dist/plugs/edit.cjs +1 -1
  61. package/dist/plugs/edit.cjs.map +1 -1
  62. package/dist/plugs/edit.d.ts +2 -2
  63. package/dist/plugs/edit.mjs +1 -1
  64. package/dist/plugs/edit.mjs.map +1 -1
  65. package/dist/plugs/esbuild/fix-extensions.cjs +4 -0
  66. package/dist/plugs/esbuild/fix-extensions.cjs.map +1 -1
  67. package/dist/plugs/esbuild/fix-extensions.mjs.map +1 -1
  68. package/dist/plugs/esbuild.cjs +6 -2
  69. package/dist/plugs/esbuild.cjs.map +1 -1
  70. package/dist/plugs/esbuild.mjs +6 -2
  71. package/dist/plugs/esbuild.mjs.map +1 -1
  72. package/dist/plugs/exec.cjs.map +1 -1
  73. package/dist/plugs/exec.mjs.map +1 -1
  74. package/dist/plugs/exports.cjs +122 -0
  75. package/dist/plugs/exports.cjs.map +6 -0
  76. package/dist/plugs/exports.d.ts +17 -0
  77. package/dist/plugs/exports.mjs +105 -0
  78. package/dist/plugs/exports.mjs.map +6 -0
  79. package/dist/plugs/filter.cjs.map +1 -1
  80. package/dist/plugs/filter.mjs.map +1 -1
  81. package/dist/plugs.cjs +1 -0
  82. package/dist/plugs.cjs.map +1 -1
  83. package/dist/plugs.d.ts +1 -0
  84. package/dist/plugs.mjs +1 -0
  85. package/dist/plugs.mjs.map +1 -1
  86. package/dist/types.d.ts +7 -5
  87. package/dist/utils/exec.cjs +9 -0
  88. package/dist/utils/exec.cjs.map +1 -1
  89. package/dist/utils/exec.mjs +5 -0
  90. package/dist/utils/exec.mjs.map +1 -1
  91. package/dist/utils/match.cjs +5 -0
  92. package/dist/utils/match.cjs.map +1 -1
  93. package/dist/utils/match.mjs +1 -0
  94. package/dist/utils/match.mjs.map +1 -1
  95. package/dist/utils/options.cjs.map +1 -1
  96. package/dist/utils/options.mjs.map +1 -1
  97. package/dist/utils/walk.cjs.map +1 -1
  98. package/dist/utils/walk.mjs.map +1 -1
  99. package/extra/plug.mts +373 -0
  100. package/extra/ts-loader.mts +545 -0
  101. package/extra/tsrun.mts +64 -0
  102. package/extra/utils.ts +168 -0
  103. package/package.json +9 -19
  104. package/src/asserts.ts +7 -4
  105. package/src/build.ts +49 -22
  106. package/src/files.ts +2 -2
  107. package/src/fork.ts +9 -8
  108. package/src/helpers.ts +6 -2
  109. package/src/index.ts +5 -1
  110. package/src/logging/logger.ts +1 -1
  111. package/src/plugs/edit.ts +4 -3
  112. package/src/plugs/esbuild.ts +0 -1
  113. package/src/plugs/exports.ts +175 -0
  114. package/src/plugs.ts +1 -0
  115. package/src/types.ts +9 -7
  116. package/types/plugjs.d.ts +0 -2
  117. package/LICENSE.md +0 -211
  118. package/NOTICE.md +0 -13
  119. package/extra/cli.mjs +0 -1356
  120. package/extra/ts-loader.mjs +0 -223
@@ -1,223 +0,0 @@
1
- // extra/ts-loader.mts
2
- import _fs from "node:fs";
3
- import _module from "node:module";
4
- import _path from "node:path";
5
- import _url from "node:url";
6
- import _esbuild from "esbuild";
7
- var CJS = "commonjs";
8
- var ESM = "module";
9
- var _debug = process.env.DEBUG_TS_LOADER === "true";
10
- function _log(type, arg, ...args) {
11
- if (!_debug)
12
- return;
13
- const t = type === "module" ? "esm" : type === "commonjs" ? "cjs" : "---";
14
- const prefix = `[ts-loader|${t}|pid=${process.pid}]`;
15
- console.log(prefix, arg, ...args);
16
- }
17
- function _throw(type, message, options = {}) {
18
- const t = type === "module" ? "esm" : type === "commonjs" ? "cjs" : "---";
19
- const prefix = `[ts-loader|${t}|pid=${process.pid}]`;
20
- const { start = _throw, ...extra } = options;
21
- const error = new Error(`${prefix} ${message}`);
22
- Error.captureStackTrace(error, start);
23
- Object.assign(error, extra);
24
- throw error;
25
- }
26
- var _moduleFormatCache = /* @__PURE__ */ new Map();
27
- if (process.env.__TS_LOADER_FORCE_TYPE) {
28
- const type = process.env.__TS_LOADER_FORCE_TYPE;
29
- const dir = process.cwd();
30
- _log(null, `Forcing ".ts" files from "${dir}" to be interpreted as "${type}"`);
31
- _moduleFormatCache.set(dir, type);
32
- }
33
- if (_debug)
34
- process.on("exit", () => _log(null, "Format cache", _moduleFormatCache));
35
- function _moduleFormat(directory) {
36
- const type = _moduleFormatCache.get(directory);
37
- if (type)
38
- return type;
39
- const file = _path.resolve(directory, "package.json");
40
- try {
41
- const json = _fs.readFileSync(file, "utf-8");
42
- const data = JSON.parse(json);
43
- const type2 = data.type === "module" ? ESM : CJS;
44
- _log(null, `File "${file}" defines module type as "${data.type}" (${type2})`);
45
- _moduleFormatCache.set(directory, type2);
46
- return type2;
47
- } catch (cause) {
48
- if (cause.code !== "ENOENT" && cause.code !== "EISDIR") {
49
- _throw(null, `Unable to read or parse "${file}"`, { cause, start: _moduleFormat });
50
- }
51
- }
52
- const name = _path.basename(directory);
53
- const parent = _path.dirname(directory);
54
- if (name === "node_modules" || parent === directory) {
55
- _moduleFormatCache.set(directory, CJS);
56
- return CJS;
57
- } else {
58
- const type2 = _moduleFormat(parent);
59
- _moduleFormatCache.set(directory, type2);
60
- return type2;
61
- }
62
- }
63
- function _isFile(path) {
64
- try {
65
- return _fs.statSync(path).isFile();
66
- } catch (error) {
67
- return false;
68
- }
69
- }
70
- function _isDirectory(path) {
71
- try {
72
- return _fs.statSync(path).isDirectory();
73
- } catch (error) {
74
- return false;
75
- }
76
- }
77
- function _esbReport(kind, messages = []) {
78
- const output = process.stderr;
79
- const options = { color: !!output.isTTY, terminalWidth: output.columns || 80 };
80
- const array = _esbuild.formatMessagesSync(messages, { kind, ...options });
81
- array.forEach((message) => output.write(`${message}
82
- `));
83
- }
84
- function _esbTranpile(filename, type) {
85
- _log(type, `Transpiling "${filename}`);
86
- const [format, __fileurl] = type === ESM ? ["esm", "import.meta.url"] : ["cjs", "__filename"];
87
- const options = {
88
- sourcefile: filename,
89
- format,
90
- loader: "ts",
91
- sourcemap: "inline",
92
- sourcesContent: false,
93
- platform: "node",
94
- logLevel: "silent",
95
- target: `node${process.versions["node"]}`,
96
- define: { __fileurl }
97
- };
98
- if (_debug) {
99
- options.banner = `console.log(\`[ts-loader|${format}]: Loaded "\${${__fileurl}}"\`);`;
100
- }
101
- let result;
102
- try {
103
- const source = _fs.readFileSync(filename, "utf-8");
104
- result = _esbuild.transformSync(source, options);
105
- } catch (cause) {
106
- _esbReport("error", cause.errors);
107
- _esbReport("warning", cause.warnings);
108
- _throw(type, `ESBuild error transpiling "${filename}"`, { cause, start: _esbTranpile });
109
- }
110
- if (_debug)
111
- _esbReport("warning", result.warnings);
112
- return result.code;
113
- }
114
- var resolve = (specifier, context, nextResolve) => {
115
- _log(ESM, `Resolving "${specifier}" from "${context.parentURL}"`);
116
- if (!specifier.match(/^\.\.?\//))
117
- return nextResolve(specifier, context);
118
- const parentURL = context.parentURL;
119
- if (!parentURL)
120
- return nextResolve(specifier, context);
121
- if (!parentURL.startsWith("file:"))
122
- return nextResolve(specifier, context);
123
- if (!parentURL.match(/\.m?ts$/))
124
- return nextResolve(specifier, context);
125
- const url = new URL(specifier, parentURL).href;
126
- const path = _url.fileURLToPath(url);
127
- if (_isFile(path)) {
128
- _log(ESM, `Positive match for "${specifier}" as "${path}" (1)`);
129
- return nextResolve(specifier, context);
130
- }
131
- const match = specifier.match(/(.*)(\.[mc]?js$)/);
132
- if (match) {
133
- const [, base, ext] = match;
134
- const tsspecifier = base + ext.replace("js", "ts");
135
- const tsurl = new URL(tsspecifier, parentURL).href;
136
- const tspath = _url.fileURLToPath(tsurl);
137
- if (_isFile(tspath)) {
138
- _log(ESM, `Positive match for "${specifier}" as "${tspath}" (2)`);
139
- return nextResolve(tsspecifier, context);
140
- }
141
- }
142
- if (_isFile(`${path}.ts`)) {
143
- _log(ESM, `Positive match for "${specifier}.ts" as "${path}.ts" (3)`);
144
- return nextResolve(`${specifier}.ts`, context);
145
- }
146
- if (_isDirectory(path)) {
147
- const file = _path.resolve(path, "index.ts");
148
- if (_isFile(file)) {
149
- _log(ESM, `Positive match for "${specifier}" as "${file}" (4)`);
150
- const spec = _url.pathToFileURL(file).pathname;
151
- return nextResolve(spec, context);
152
- }
153
- }
154
- return nextResolve(specifier, context);
155
- };
156
- var load = (url, context, nextLoad) => {
157
- var _a;
158
- _log(ESM, `Attempting to load "${url}"`);
159
- if (!url.startsWith("file:"))
160
- return nextLoad(url, context);
161
- const ext = (_a = url.match(/\.[cm]?ts$/)) == null ? void 0 : _a[0];
162
- if (!ext)
163
- return nextLoad(url, context);
164
- if (ext === ".cts")
165
- return { format: "commonjs", shortCircuit: true };
166
- const filename = _url.fileURLToPath(url);
167
- if (ext === ".ts") {
168
- const format = _moduleFormat(_path.dirname(filename));
169
- if (format === CJS)
170
- return { format: "commonjs", shortCircuit: true };
171
- }
172
- const source = _esbTranpile(filename, ESM);
173
- return { source, format: "module", shortCircuit: true };
174
- };
175
- var loader = (module, filename) => {
176
- _log(ESM, `Attempting to load "${filename}"`);
177
- const ext = _path.extname(filename);
178
- if (ext === ".ts") {
179
- const format = _moduleFormat(_path.dirname(filename));
180
- if (format === ESM) {
181
- _throw(CJS, `Must use import to load ES Module: ${filename}`, { code: "ERR_REQUIRE_ESM" });
182
- }
183
- } else if (ext !== ".cts") {
184
- _throw(CJS, `Unsupported filename "${filename}"`);
185
- }
186
- const source = _esbTranpile(filename, CJS);
187
- try {
188
- module._compile(source, filename);
189
- } catch (cause) {
190
- console.log(`Error compiling module "${filename}"`, cause);
191
- }
192
- };
193
- _module._extensions[".ts"] = _module._extensions[".cts"] = loader;
194
- var _oldResolveFilename = _module._resolveFilename;
195
- _module._resolveFilename = function(request, parent, ...args) {
196
- try {
197
- return _oldResolveFilename.call(this, request, parent, ...args);
198
- } catch (error) {
199
- if (error.code !== "MODULE_NOT_FOUND")
200
- throw error;
201
- const match = request.match(/(.*)(\.[mc]?js$)/);
202
- if (parent && match) {
203
- const [, name, ext] = match;
204
- const tsrequest = name + ext.replace("js", "ts");
205
- try {
206
- const result = _oldResolveFilename.call(this, tsrequest, parent, ...args);
207
- _log("commonjs", `Resolution for "${request}" intercepted as "${tsrequest}`);
208
- return result;
209
- } catch (discard) {
210
- throw error;
211
- }
212
- }
213
- throw error;
214
- }
215
- };
216
- var tsLoaderMarker = Symbol.for("plugjs:tsLoader");
217
- globalThis[tsLoaderMarker] = tsLoaderMarker;
218
- _log(null, `Installing loader from "${import.meta.url}"`);
219
- export {
220
- load,
221
- resolve
222
- };
223
- //# sourceMappingURL=data:application/json;base64,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