@esauflores/plugin-sdk 0.0.0-stage → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +213 -2
- package/dist/hooks.d.ts +76 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +155 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +429 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +12 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +78 -0
- package/dist/loader.js.map +1 -0
- package/dist/types.d.ts +135 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +49 -0
- package/dist/types.js.map +1 -0
- package/package.json +65 -4
- package/src/hooks.ts +253 -0
- package/src/index.ts +568 -0
- package/src/loader.ts +83 -0
- package/src/types.ts +196 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
// plugin-sdk: a plugin system for Bun and Node 24+. Its only dependency is @standard-schema/spec (types only).
|
|
2
|
+
//
|
|
3
|
+
// Lifecycle: register/load → setup (all, in dependency order) → start (all) → stop (reverse order) → dispose
|
|
4
|
+
import { HookBus } from "./hooks.js";
|
|
5
|
+
import { isPlugin, parseWith, PluginError, TimeoutError, } from "./types.js";
|
|
6
|
+
export * from "./types.js";
|
|
7
|
+
export { HookBus, } from "./hooks.js";
|
|
8
|
+
/** Identity helper for type inference. Untyped hooks/services; see `definePluginFor` for app-typed plugins. */
|
|
9
|
+
export function definePlugin(plugin) {
|
|
10
|
+
return plugin;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Returns a `definePlugin` bound to your app's hook and service maps:
|
|
14
|
+
* export const definePlugin = definePluginFor<MyHooks, MyServices>();
|
|
15
|
+
*/
|
|
16
|
+
export function definePluginFor() {
|
|
17
|
+
return (plugin) => plugin;
|
|
18
|
+
}
|
|
19
|
+
const HOST = "<host>";
|
|
20
|
+
/**
|
|
21
|
+
* The host is single-use: once stopped it can't be started again. To reload plugins,
|
|
22
|
+
* create a new host (or restart the process; ES modules can't be unloaded).
|
|
23
|
+
*/
|
|
24
|
+
export class PluginHost {
|
|
25
|
+
app;
|
|
26
|
+
/** Host-owned view of the hook bus: emit hooks from your app through this. */
|
|
27
|
+
hooks;
|
|
28
|
+
#apiVersion;
|
|
29
|
+
#manifestKey;
|
|
30
|
+
#log;
|
|
31
|
+
#timeoutMs;
|
|
32
|
+
#failure;
|
|
33
|
+
#hookErrors;
|
|
34
|
+
#entries = new Map();
|
|
35
|
+
#services = new Map();
|
|
36
|
+
#listeners = new Set();
|
|
37
|
+
#order = [];
|
|
38
|
+
#phase = "idle";
|
|
39
|
+
#starting;
|
|
40
|
+
#stopping;
|
|
41
|
+
constructor(options) {
|
|
42
|
+
this.app = options.app;
|
|
43
|
+
this.hooks = new HookBus(options.hookSchemas, (error) => this.#onHookError(error));
|
|
44
|
+
this.#apiVersion = options.apiVersion ?? 1;
|
|
45
|
+
this.#manifestKey = options.manifestKey ?? options.app.name;
|
|
46
|
+
this.#log = options.logger ?? console;
|
|
47
|
+
this.#timeoutMs = options.timeoutMs ?? 10_000;
|
|
48
|
+
this.#failure = options.failure ?? "isolate";
|
|
49
|
+
this.#hookErrors = options.hookErrors ?? "log";
|
|
50
|
+
}
|
|
51
|
+
get phase() {
|
|
52
|
+
return this.#phase;
|
|
53
|
+
}
|
|
54
|
+
/** Adds a plugin object directly (local plugins, or ones you imported yourself). */
|
|
55
|
+
register(plugin, options) {
|
|
56
|
+
this.#add(plugin, options, "inline");
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Loads installed plugin packages, resolving from `cwd`'s node_modules upwards.
|
|
61
|
+
* Imports run in parallel; plugins are registered in the order given.
|
|
62
|
+
* Under "isolate", a package that fails to load is listed as failed and skipped.
|
|
63
|
+
*/
|
|
64
|
+
async load(specs, { cwd = process.cwd() } = {}) {
|
|
65
|
+
this.#assertPhase("idle", "load plugins");
|
|
66
|
+
// Imported lazily so the core never pulls in node:fs unless you load packages.
|
|
67
|
+
const { loadPluginPackage } = await import("./loader.js");
|
|
68
|
+
const normalized = specs.map((spec) => (typeof spec === "string" ? [spec, undefined] : spec));
|
|
69
|
+
const results = await Promise.allSettled(normalized.map(([specifier]) => loadPluginPackage(specifier, { cwd, apiVersion: this.#apiVersion, manifestKey: this.#manifestKey })));
|
|
70
|
+
for (const [i, result] of results.entries()) {
|
|
71
|
+
const [specifier, options] = normalized[i];
|
|
72
|
+
if (result.status === "fulfilled") {
|
|
73
|
+
this.#add(result.value, options, specifier);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (this.#failure === "strict")
|
|
77
|
+
throw result.reason;
|
|
78
|
+
this.#log.error(result.reason);
|
|
79
|
+
if (!this.#entries.has(specifier)) {
|
|
80
|
+
this.#entries.set(specifier, {
|
|
81
|
+
...newEntry({ name: specifier, setup() { } }, options, specifier),
|
|
82
|
+
state: "failed",
|
|
83
|
+
reason: result.reason instanceof Error ? result.reason.message : String(result.reason),
|
|
84
|
+
error: result.reason,
|
|
85
|
+
tornDown: true,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return this;
|
|
90
|
+
}
|
|
91
|
+
/** Sets up every plugin, then starts every plugin, both in dependency order. */
|
|
92
|
+
start() {
|
|
93
|
+
this.#assertPhase("idle", "start");
|
|
94
|
+
this.#phase = "starting";
|
|
95
|
+
this.#starting = this.#start();
|
|
96
|
+
return this.#starting;
|
|
97
|
+
}
|
|
98
|
+
/** Stops started plugins in reverse order and tears everything down. Safe to call repeatedly or mid-start. */
|
|
99
|
+
stop() {
|
|
100
|
+
this.#stopping ??= (async () => {
|
|
101
|
+
await this.#starting?.catch(() => { });
|
|
102
|
+
await this.#shutdown();
|
|
103
|
+
})();
|
|
104
|
+
return this.#stopping;
|
|
105
|
+
}
|
|
106
|
+
/** Services provided by the host are usable by every plugin without declaring a dependency. */
|
|
107
|
+
provide(key, value) {
|
|
108
|
+
this.#provide(HOST, key, value);
|
|
109
|
+
}
|
|
110
|
+
service(key) {
|
|
111
|
+
return this.#services.get(key)?.value;
|
|
112
|
+
}
|
|
113
|
+
list() {
|
|
114
|
+
return [...this.#entries.values()].map(info);
|
|
115
|
+
}
|
|
116
|
+
get(name) {
|
|
117
|
+
const entry = this.#entries.get(name);
|
|
118
|
+
return entry && info(entry);
|
|
119
|
+
}
|
|
120
|
+
onStateChange(listener) {
|
|
121
|
+
this.#listeners.add(listener);
|
|
122
|
+
return () => this.#listeners.delete(listener);
|
|
123
|
+
}
|
|
124
|
+
async #start() {
|
|
125
|
+
try {
|
|
126
|
+
const { order, unresolved } = resolveOrder([...this.#entries.values()].map((e) => e.plugin));
|
|
127
|
+
this.#order = order;
|
|
128
|
+
for (const name of unresolved) {
|
|
129
|
+
await this.#fail(this.#entries.get(name), "disabled", "setup", `dependency cycle among: ${unresolved.join(", ")}`);
|
|
130
|
+
}
|
|
131
|
+
for (const entry of this.#ordered("registered")) {
|
|
132
|
+
if (this.#stopping)
|
|
133
|
+
return;
|
|
134
|
+
const blocker = this.#blockingDependency(entry, "setup");
|
|
135
|
+
if (blocker)
|
|
136
|
+
await this.#fail(entry, "disabled", "setup", blocker);
|
|
137
|
+
else
|
|
138
|
+
await this.#run(entry, "setup");
|
|
139
|
+
}
|
|
140
|
+
for (const entry of this.#ordered("setup")) {
|
|
141
|
+
if (this.#stopping)
|
|
142
|
+
return;
|
|
143
|
+
const blocker = this.#blockingDependency(entry, "started");
|
|
144
|
+
if (blocker)
|
|
145
|
+
await this.#fail(entry, "disabled", "start", blocker);
|
|
146
|
+
else
|
|
147
|
+
await this.#run(entry, "start");
|
|
148
|
+
}
|
|
149
|
+
this.#phase = "started";
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
await this.#shutdown();
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async #shutdown() {
|
|
157
|
+
if (this.#phase === "stopped")
|
|
158
|
+
return;
|
|
159
|
+
this.#phase = "stopping";
|
|
160
|
+
for (const name of [...this.#order].reverse()) {
|
|
161
|
+
const entry = this.#entries.get(name);
|
|
162
|
+
if (entry.state !== "started" && entry.state !== "setup")
|
|
163
|
+
continue;
|
|
164
|
+
await this.#stopEntry(entry, entry.state === "started");
|
|
165
|
+
this.#setState(entry, "stopped");
|
|
166
|
+
}
|
|
167
|
+
this.#phase = "stopped";
|
|
168
|
+
}
|
|
169
|
+
/** Aborts the signal, calls stop() if the plugin started, then tears it down. */
|
|
170
|
+
async #stopEntry(entry, callStop) {
|
|
171
|
+
entry.controller.abort(new Error("plugin is stopping"));
|
|
172
|
+
if (callStop && entry.plugin.stop) {
|
|
173
|
+
try {
|
|
174
|
+
await withTimeout(() => entry.plugin.stop(entry.ctx), this.#timeoutMs);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
entry.error = error;
|
|
178
|
+
this.#log.error(new PluginError(entry.plugin.name, "stop", "stop failed", { cause: error }));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
await this.#teardown(entry);
|
|
182
|
+
}
|
|
183
|
+
async #onHookError(error) {
|
|
184
|
+
if (this.#hookErrors === "throw")
|
|
185
|
+
throw error;
|
|
186
|
+
this.#log.error(error);
|
|
187
|
+
const entry = this.#entries.get(error.plugin);
|
|
188
|
+
if (this.#hookErrors === "disable" && this.#phase === "started" && entry?.state === "started") {
|
|
189
|
+
await this.#disableAtRuntime(entry, error);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/** Stops a running plugin as failed, and the started plugins that depend on it (directly or not) as disabled. */
|
|
193
|
+
async #disableAtRuntime(culprit, error) {
|
|
194
|
+
const affected = new Set([culprit.plugin.name]);
|
|
195
|
+
// #order lists dependencies first, so one pass collects every transitive dependent.
|
|
196
|
+
for (const name of this.#order) {
|
|
197
|
+
if (this.#entries.get(name).plugin.dependsOn?.some((dep) => affected.has(dep)))
|
|
198
|
+
affected.add(name);
|
|
199
|
+
}
|
|
200
|
+
for (const name of [...this.#order].reverse()) {
|
|
201
|
+
const entry = this.#entries.get(name);
|
|
202
|
+
if (!affected.has(name) || entry.state !== "started")
|
|
203
|
+
continue;
|
|
204
|
+
// State changes first, so a concurrent hook error doesn't stop the same plugin twice.
|
|
205
|
+
if (entry === culprit) {
|
|
206
|
+
entry.reason = `disabled at runtime: ${error.reason}`;
|
|
207
|
+
entry.error = error;
|
|
208
|
+
this.#setState(entry, "failed");
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
entry.reason = `dependency "${culprit.plugin.name}" is failed`;
|
|
212
|
+
this.#setState(entry, "disabled");
|
|
213
|
+
this.#log.warn(`[${name}] ${entry.reason}`);
|
|
214
|
+
}
|
|
215
|
+
await this.#stopEntry(entry, true);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
*#ordered(state) {
|
|
219
|
+
for (const name of this.#order) {
|
|
220
|
+
const entry = this.#entries.get(name);
|
|
221
|
+
if (entry.state === state)
|
|
222
|
+
yield entry;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
#blockingDependency(entry, needed) {
|
|
226
|
+
for (const dep of entry.plugin.dependsOn ?? []) {
|
|
227
|
+
const target = this.#entries.get(dep);
|
|
228
|
+
if (!target)
|
|
229
|
+
return `missing dependency "${dep}"`;
|
|
230
|
+
if (target.state !== needed)
|
|
231
|
+
return `dependency "${dep}" is ${target.state}`;
|
|
232
|
+
}
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
async #run(entry, phase) {
|
|
236
|
+
// Before the context exists, so ctx.options is the parsed value.
|
|
237
|
+
if (phase === "setup" && entry.plugin.optionsSchema) {
|
|
238
|
+
try {
|
|
239
|
+
entry.options = await parseWith(entry.plugin.optionsSchema, entry.options);
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
243
|
+
await this.#fail(entry, "failed", "setup", `invalid options: ${detail}`, error);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
const ctx = (entry.ctx ??= this.#createContext(entry));
|
|
248
|
+
const { plugin } = entry;
|
|
249
|
+
try {
|
|
250
|
+
await withTimeout(() => (phase === "setup" ? plugin.setup(ctx) : plugin.start?.(ctx)), this.#timeoutMs, entry.controller);
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
await this.#fail(entry, "failed", phase, `${phase} failed: ${error instanceof Error ? error.message : String(error)}`, error);
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
this.#setState(entry, phase === "setup" ? "setup" : "started");
|
|
257
|
+
}
|
|
258
|
+
/** Tears the plugin down and records why. Under "strict", also throws (and #start shuts everything down). */
|
|
259
|
+
async #fail(entry, state, phase, reason, error) {
|
|
260
|
+
entry.reason = reason;
|
|
261
|
+
entry.error = error;
|
|
262
|
+
await this.#teardown(entry);
|
|
263
|
+
this.#setState(entry, state);
|
|
264
|
+
const err = new PluginError(entry.plugin.name, phase, reason, error === undefined ? undefined : { cause: error });
|
|
265
|
+
if (this.#failure === "strict")
|
|
266
|
+
throw err;
|
|
267
|
+
if (state === "failed")
|
|
268
|
+
this.#log.error(err);
|
|
269
|
+
else
|
|
270
|
+
this.#log.warn(err.message);
|
|
271
|
+
}
|
|
272
|
+
async #teardown(entry) {
|
|
273
|
+
if (entry.tornDown)
|
|
274
|
+
return;
|
|
275
|
+
entry.tornDown = true;
|
|
276
|
+
if (!entry.controller.signal.aborted)
|
|
277
|
+
entry.controller.abort(new Error("plugin was torn down"));
|
|
278
|
+
for (const dispose of entry.disposers.splice(0).reverse()) {
|
|
279
|
+
try {
|
|
280
|
+
await withTimeout(dispose, this.#timeoutMs);
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
this.#log.error(new PluginError(entry.plugin.name, "dispose", "disposer failed", { cause: error }));
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
this.hooks.removeOwner(entry.plugin.name);
|
|
287
|
+
for (const [key, service] of this.#services) {
|
|
288
|
+
if (service.owner === entry.plugin.name)
|
|
289
|
+
this.#services.delete(key);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
#createContext(entry) {
|
|
293
|
+
const { name } = entry.plugin;
|
|
294
|
+
const allowed = new Set([name, HOST, ...(entry.plugin.dependsOn ?? []), ...(entry.plugin.optionalDependsOn ?? [])]);
|
|
295
|
+
const lookup = (key) => {
|
|
296
|
+
const service = this.#services.get(key);
|
|
297
|
+
if (service && !allowed.has(service.owner)) {
|
|
298
|
+
throw new PluginError(name, "service", `uses "${key}" from "${service.owner}" without listing "${service.owner}" in dependsOn`);
|
|
299
|
+
}
|
|
300
|
+
return service;
|
|
301
|
+
};
|
|
302
|
+
const tag = `[${this.app.name}:${name}]`;
|
|
303
|
+
return {
|
|
304
|
+
name,
|
|
305
|
+
options: entry.options,
|
|
306
|
+
app: this.app,
|
|
307
|
+
signal: entry.controller.signal,
|
|
308
|
+
log: {
|
|
309
|
+
debug: (...args) => this.#log.debug(tag, ...args),
|
|
310
|
+
info: (...args) => this.#log.info(tag, ...args),
|
|
311
|
+
warn: (...args) => this.#log.warn(tag, ...args),
|
|
312
|
+
error: (...args) => this.#log.error(tag, ...args),
|
|
313
|
+
},
|
|
314
|
+
hooks: this.hooks.scope(name),
|
|
315
|
+
provide: (key, value) => this.#provide(name, key, value),
|
|
316
|
+
use: (key) => {
|
|
317
|
+
const service = lookup(key);
|
|
318
|
+
if (!service)
|
|
319
|
+
throw new PluginError(name, "service", `service "${key}" is not provided`);
|
|
320
|
+
return service.value;
|
|
321
|
+
},
|
|
322
|
+
tryUse: (key) => lookup(key)?.value,
|
|
323
|
+
onDispose: (fn) => {
|
|
324
|
+
if (entry.tornDown)
|
|
325
|
+
throw new PluginError(name, "dispose", "onDispose called after the plugin was torn down");
|
|
326
|
+
entry.disposers.push(fn);
|
|
327
|
+
},
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
#provide(owner, key, value) {
|
|
331
|
+
const existing = this.#services.get(key);
|
|
332
|
+
if (existing) {
|
|
333
|
+
throw new PluginError(owner, "service", `service "${key}" is already provided by "${existing.owner}"`);
|
|
334
|
+
}
|
|
335
|
+
this.#services.set(key, { owner, value });
|
|
336
|
+
}
|
|
337
|
+
#add(plugin, options, source) {
|
|
338
|
+
this.#assertPhase("idle", "register plugins");
|
|
339
|
+
if (!isPlugin(plugin))
|
|
340
|
+
throw new PluginError(source, "register", "not a valid plugin (expected { name, setup })");
|
|
341
|
+
const existing = this.#entries.get(plugin.name);
|
|
342
|
+
if (existing)
|
|
343
|
+
throw new PluginError(plugin.name, "register", `already registered (from ${existing.source})`);
|
|
344
|
+
this.#entries.set(plugin.name, newEntry(plugin, options, source));
|
|
345
|
+
}
|
|
346
|
+
#setState(entry, state) {
|
|
347
|
+
const previous = entry.state;
|
|
348
|
+
entry.state = state;
|
|
349
|
+
for (const listener of this.#listeners) {
|
|
350
|
+
try {
|
|
351
|
+
listener(info(entry), previous);
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
this.#log.error("onStateChange listener threw", error);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
#assertPhase(expected, action) {
|
|
359
|
+
if (this.#phase !== expected)
|
|
360
|
+
throw new Error(`Cannot ${action}: host is ${this.#phase}`);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Orders plugins so dependencies come first. Ties keep registration order, so the
|
|
365
|
+
* result is deterministic. Dependencies that aren't registered are ignored here
|
|
366
|
+
* (the host reports them); plugins in, or blocked by, a cycle end up in `unresolved`.
|
|
367
|
+
*/
|
|
368
|
+
function resolveOrder(plugins) {
|
|
369
|
+
const names = new Set(plugins.map((p) => p.name));
|
|
370
|
+
const pending = plugins.map((p) => ({
|
|
371
|
+
name: p.name,
|
|
372
|
+
deps: [...(p.dependsOn ?? []), ...(p.optionalDependsOn ?? [])].filter((d) => names.has(d)),
|
|
373
|
+
}));
|
|
374
|
+
const done = new Set();
|
|
375
|
+
const order = [];
|
|
376
|
+
for (let i = 0; i < pending.length;) {
|
|
377
|
+
if (pending[i].deps.every((d) => done.has(d))) {
|
|
378
|
+
const [node] = pending.splice(i, 1);
|
|
379
|
+
order.push(node.name);
|
|
380
|
+
done.add(node.name);
|
|
381
|
+
i = 0;
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
i++;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return { order, unresolved: pending.map((n) => n.name) };
|
|
388
|
+
}
|
|
389
|
+
/** Rejects after `ms` (and aborts `controller`). The underlying work can't be cancelled, only abandoned. */
|
|
390
|
+
async function withTimeout(fn, ms, controller) {
|
|
391
|
+
if (!(ms > 0) || !Number.isFinite(ms))
|
|
392
|
+
return await fn();
|
|
393
|
+
let timer;
|
|
394
|
+
const timeout = new Promise((_, reject) => {
|
|
395
|
+
timer = setTimeout(() => {
|
|
396
|
+
const error = new TimeoutError(ms);
|
|
397
|
+
controller?.abort(error);
|
|
398
|
+
reject(error);
|
|
399
|
+
}, ms);
|
|
400
|
+
});
|
|
401
|
+
try {
|
|
402
|
+
return await Promise.race([Promise.resolve().then(fn), timeout]);
|
|
403
|
+
}
|
|
404
|
+
finally {
|
|
405
|
+
clearTimeout(timer);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
function newEntry(plugin, options, source) {
|
|
409
|
+
return {
|
|
410
|
+
plugin,
|
|
411
|
+
options,
|
|
412
|
+
source,
|
|
413
|
+
state: "registered",
|
|
414
|
+
controller: new AbortController(),
|
|
415
|
+
disposers: [],
|
|
416
|
+
tornDown: false,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
function info(entry) {
|
|
420
|
+
return {
|
|
421
|
+
name: entry.plugin.name,
|
|
422
|
+
version: entry.plugin.version,
|
|
423
|
+
source: entry.source,
|
|
424
|
+
state: entry.state,
|
|
425
|
+
reason: entry.reason,
|
|
426
|
+
error: entry.error,
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/loader.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Plugin } from "./types.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Finds an installed plugin package, checks its manifest, and imports its entry.
|
|
4
|
+
* Doesn't use require.resolve / import.meta.resolve, which behave differently
|
|
5
|
+
* across runtimes and with ESM-only packages.
|
|
6
|
+
*/
|
|
7
|
+
export declare function loadPluginPackage(specifier: string, opts: {
|
|
8
|
+
cwd: string;
|
|
9
|
+
apiVersion: number;
|
|
10
|
+
manifestKey: string;
|
|
11
|
+
}): Promise<Plugin>;
|
|
12
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAOA,OAAO,EAAyB,KAAK,MAAM,EAAuB,MAAM,YAAY,CAAC;AAErF;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC7D,OAAO,CAAC,MAAM,CAAC,CAyCjB"}
|
package/dist/loader.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// The only module that touches the filesystem. index.ts imports it lazily from
|
|
2
|
+
// PluginHost.load(), so the core runs without Node APIs when you only use register().
|
|
3
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
4
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
5
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
6
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
return path;
|
|
10
|
+
};
|
|
11
|
+
import { readFile, stat } from "node:fs/promises";
|
|
12
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
13
|
+
import { pathToFileURL } from "node:url";
|
|
14
|
+
import { isPlugin, PluginError } from "./types.js";
|
|
15
|
+
/**
|
|
16
|
+
* Finds an installed plugin package, checks its manifest, and imports its entry.
|
|
17
|
+
* Doesn't use require.resolve / import.meta.resolve, which behave differently
|
|
18
|
+
* across runtimes and with ESM-only packages.
|
|
19
|
+
*/
|
|
20
|
+
export async function loadPluginPackage(specifier, opts) {
|
|
21
|
+
const fail = (message, cause) => new PluginError(specifier, "load", message, cause === undefined ? undefined : { cause });
|
|
22
|
+
const dir = await findPackageDir(specifier, opts.cwd);
|
|
23
|
+
if (!dir)
|
|
24
|
+
throw fail(`package not found from ${opts.cwd} (is it installed?)`);
|
|
25
|
+
let pkg;
|
|
26
|
+
try {
|
|
27
|
+
pkg = JSON.parse(await readFile(join(dir, "package.json"), "utf8"));
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
throw fail(`could not read ${join(dir, "package.json")}`, error);
|
|
31
|
+
}
|
|
32
|
+
const manifest = pkg[opts.manifestKey];
|
|
33
|
+
if (!manifest || typeof manifest !== "object") {
|
|
34
|
+
throw fail(`not a plugin: package.json has no "${opts.manifestKey}" field`);
|
|
35
|
+
}
|
|
36
|
+
if (manifest.apiVersion !== opts.apiVersion) {
|
|
37
|
+
const declared = typeof manifest.apiVersion === "number" ? `v${manifest.apiVersion}` : "no version";
|
|
38
|
+
throw fail(`targets plugin API ${declared}, but this host supports v${opts.apiVersion}`);
|
|
39
|
+
}
|
|
40
|
+
if (typeof manifest.entry !== "string") {
|
|
41
|
+
throw fail(`manifest "${opts.manifestKey}" has no "entry" (e.g. "./dist/index.js")`);
|
|
42
|
+
}
|
|
43
|
+
const entry = resolve(dir, manifest.entry);
|
|
44
|
+
let mod;
|
|
45
|
+
try {
|
|
46
|
+
mod = await import(__rewriteRelativeImportExtension(pathToFileURL(entry).href));
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
throw fail(`failed to import ${entry}`, error);
|
|
50
|
+
}
|
|
51
|
+
const plugin = mod.default ?? mod.plugin;
|
|
52
|
+
if (!isPlugin(plugin))
|
|
53
|
+
throw fail(`${entry} must export a plugin ({ name, setup }) as its default export`);
|
|
54
|
+
return plugin;
|
|
55
|
+
}
|
|
56
|
+
async function findPackageDir(specifier, cwd) {
|
|
57
|
+
if (specifier.startsWith(".") || isAbsolute(specifier)) {
|
|
58
|
+
const dir = resolve(cwd, specifier);
|
|
59
|
+
return (await isFile(join(dir, "package.json"))) ? dir : undefined;
|
|
60
|
+
}
|
|
61
|
+
// Same lookup Node does: node_modules in cwd, then each parent directory.
|
|
62
|
+
for (let dir = resolve(cwd);; dir = dirname(dir)) {
|
|
63
|
+
const candidate = join(dir, "node_modules", specifier);
|
|
64
|
+
if (await isFile(join(candidate, "package.json")))
|
|
65
|
+
return candidate;
|
|
66
|
+
if (dirname(dir) === dir)
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function isFile(path) {
|
|
71
|
+
try {
|
|
72
|
+
return (await stat(path)).isFile();
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
|