@jsenv/core 40.12.13 → 41.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,7 +7,7 @@ import { readFileSync, existsSync, readdirSync, lstatSync, realpathSync } from "
7
7
  import { lookupPackageDirectory, registerDirectoryLifecycle, urlToRelativeUrl, createDetailedMessage, stringifyUrlSite, generateContentFrame, validateResponseIntegrity, urlIsOrIsInsideOf, ensureWindowsDriveLetter, setUrlFilename, moveUrl, getCallerPosition, urlToBasename, urlToExtension, asSpecifierWithoutSearch, asUrlWithoutSearch, injectQueryParamsIntoSpecifier, bufferToEtag, isFileSystemPath, urlToPathname, setUrlBasename, urlToFileSystemPath, writeFileSync, createLogger, URL_META, applyNodeEsmResolution, normalizeUrl, ANSI, RUNTIME_COMPAT, CONTENT_TYPE, readPackageAtOrNull, urlToFilename, DATA_URL, errorToHTML, normalizeImportMap, composeTwoImportMaps, resolveImport, JS_QUOTES, readCustomConditionsFromProcessArgs, readEntryStatSync, ensurePathnameTrailingSlash, compareFileUrls, applyFileSystemMagicResolution, getExtensionsToTry, setUrlExtension, isSpecifierForNodeBuiltin, injectQueryParams, renderDetails, humanizeDuration, humanizeFileSize, renderTable, renderBigSection, distributePercentages, humanizeMemory, comparePathnames, UNICODE, escapeRegexpSpecialChars, injectQueryParamIntoSpecifierWithoutEncoding, renderUrlOrRelativeUrlFilename, assertAndNormalizeDirectoryUrl, Abort, raceProcessTeardownEvents, startMonitoringCpuUsage, startMonitoringMemoryUsage, inferRuntimeCompatFromClosestPackage, browserDefaultRuntimeCompat, nodeDefaultRuntimeCompat, clearDirectorySync, createTaskLog, createLookupPackageDirectory, ensureEmptyDirectory, updateJsonFileSync, createDynamicLog } from "./jsenv_core_packages.js";
8
8
  import { pathToFileURL } from "node:url";
9
9
  import { generateSourcemapFileUrl, createMagicSource, composeTwoSourcemaps, generateSourcemapDataUrl, SOURCEMAP } from "@jsenv/sourcemap";
10
- import { performance } from "node:perf_hooks";
10
+ import { createPluginsController } from "@jsenv/server/src/plugins_controller.js";
11
11
  import { jsenvPluginSupervisor } from "@jsenv/plugin-supervisor";
12
12
  import { WebSocketResponse, pickContentType } from "@jsenv/server";
13
13
  import { randomUUID, createHash } from "node:crypto";
@@ -133,7 +133,7 @@ const watchSourceFiles = (
133
133
  const jsenvCoreDirectoryUrl = new URL("../", import.meta.url);
134
134
 
135
135
  const createResolveUrlError = ({
136
- pluginController,
136
+ jsenvPluginsController,
137
137
  reference,
138
138
  error,
139
139
  }) => {
@@ -151,7 +151,7 @@ ${reason}`,
151
151
  {
152
152
  ...detailsFromFirstReference(reference),
153
153
  ...details,
154
- ...detailsFromPluginController(pluginController),
154
+ ...detailsFromPluginController(jsenvPluginsController),
155
155
  },
156
156
  ),
157
157
  );
@@ -196,7 +196,7 @@ ${reason}`,
196
196
  };
197
197
 
198
198
  const createFetchUrlContentError = ({
199
- pluginController,
199
+ jsenvPluginsController,
200
200
  urlInfo,
201
201
  error,
202
202
  }) => {
@@ -215,7 +215,7 @@ ${reason}`,
215
215
  {
216
216
  ...detailsFromFirstReference(reference),
217
217
  ...details,
218
- ...detailsFromPluginController(pluginController),
218
+ ...detailsFromPluginController(jsenvPluginsController),
219
219
  },
220
220
  ),
221
221
  );
@@ -271,7 +271,7 @@ ${reason}`,
271
271
  };
272
272
 
273
273
  const createTransformUrlContentError = ({
274
- pluginController,
274
+ jsenvPluginsController,
275
275
  urlInfo,
276
276
  error,
277
277
  }) => {
@@ -300,7 +300,7 @@ ${error.message}`,
300
300
  ? `${reference.trace.url}:${reference.trace.line}:${reference.trace.column}`
301
301
  : reference.trace.message,
302
302
  ...detailsFromFirstReference(reference),
303
- ...detailsFromPluginController(pluginController),
303
+ ...detailsFromPluginController(jsenvPluginsController),
304
304
  },
305
305
  ),
306
306
  );
@@ -332,7 +332,7 @@ ${reason}`,
332
332
  {
333
333
  ...detailsFromFirstReference(reference),
334
334
  ...details,
335
- ...detailsFromPluginController(pluginController),
335
+ ...detailsFromPluginController(jsenvPluginsController),
336
336
  },
337
337
  ),
338
338
  );
@@ -356,7 +356,7 @@ ${reason}`,
356
356
  };
357
357
 
358
358
  const createFinalizeUrlContentError = ({
359
- pluginController,
359
+ jsenvPluginsController,
360
360
  urlInfo,
361
361
  error,
362
362
  }) => {
@@ -368,7 +368,7 @@ ${reference.trace.message}`,
368
368
  {
369
369
  ...detailsFromFirstReference(reference),
370
370
  ...detailsFromValueThrown(error),
371
- ...detailsFromPluginController(pluginController),
371
+ ...detailsFromPluginController(jsenvPluginsController),
372
372
  },
373
373
  ),
374
374
  );
@@ -458,8 +458,8 @@ const getFirstReferenceInProject = (reference) => {
458
458
  return getFirstReferenceInProject(firstReference);
459
459
  };
460
460
 
461
- const detailsFromPluginController = (pluginController) => {
462
- const currentPlugin = pluginController.getCurrentPlugin();
461
+ const detailsFromPluginController = (jsenvPluginsController) => {
462
+ const currentPlugin = jsenvPluginsController.getCurrentPlugin();
463
463
  if (!currentPlugin) {
464
464
  return null;
465
465
  }
@@ -3031,14 +3031,14 @@ const createKitchen = ({
3031
3031
  },
3032
3032
  graph: null,
3033
3033
  urlInfoTransformer: null,
3034
- pluginController: null,
3034
+ jsenvPluginsController: null,
3035
3035
  };
3036
3036
  const kitchenContext = kitchen.context;
3037
3037
  kitchenContext.kitchen = kitchen;
3038
3038
 
3039
- let pluginController;
3040
- kitchen.setPluginController = (value) => {
3041
- pluginController = kitchen.pluginController = value;
3039
+ let jsenvPluginsController;
3040
+ kitchen.setJsenvPluginsController = (value) => {
3041
+ jsenvPluginsController = kitchen.jsenvPluginsController = value;
3042
3042
  };
3043
3043
 
3044
3044
  const graph = createUrlGraph({
@@ -3047,7 +3047,11 @@ const createKitchen = ({
3047
3047
  kitchen,
3048
3048
  });
3049
3049
  graph.urlInfoCreatedEventEmitter.on((urlInfoCreated) => {
3050
- pluginController.callHooks("urlInfoCreated", urlInfoCreated, () => {});
3050
+ jsenvPluginsController.callHooks(
3051
+ "urlInfoCreated",
3052
+ urlInfoCreated,
3053
+ () => {},
3054
+ );
3051
3055
  });
3052
3056
  kitchen.graph = graph;
3053
3057
 
@@ -3221,7 +3225,7 @@ const createKitchen = ({
3221
3225
  setReferenceUrl(reference.url);
3222
3226
  break resolve;
3223
3227
  }
3224
- const resolvedUrl = pluginController.callHooksUntil(
3228
+ const resolvedUrl = jsenvPluginsController.callHooksUntil(
3225
3229
  "resolveReference",
3226
3230
  reference,
3227
3231
  );
@@ -3235,7 +3239,7 @@ const createKitchen = ({
3235
3239
  setReferenceUrl(normalizedUrl);
3236
3240
  if (reference.debug) {
3237
3241
  logger.debug(`url resolved by "${
3238
- pluginController.getLastPluginUsed().name
3242
+ jsenvPluginsController.getLastPluginUsed().name
3239
3243
  }"
3240
3244
  ${ANSI.color(reference.specifier, ANSI.GREY)} ->
3241
3245
  ${ANSI.color(reference.url, ANSI.YELLOW)}
@@ -3249,7 +3253,7 @@ ${ANSI.color(reference.url, ANSI.YELLOW)}
3249
3253
  // - side_effect_file references injected in entry points or at the top of files
3250
3254
  break redirect;
3251
3255
  }
3252
- pluginController.callHooks(
3256
+ jsenvPluginsController.callHooks(
3253
3257
  "redirectReference",
3254
3258
  reference,
3255
3259
  (returnValue, plugin, setReference) => {
@@ -3294,7 +3298,7 @@ ${ANSI.color(normalizedReturnValue, ANSI.YELLOW)}
3294
3298
  return reference;
3295
3299
  } catch (error) {
3296
3300
  throw createResolveUrlError({
3297
- pluginController,
3301
+ jsenvPluginsController,
3298
3302
  reference,
3299
3303
  error,
3300
3304
  });
@@ -3321,7 +3325,7 @@ ${ANSI.color(normalizedReturnValue, ANSI.YELLOW)}
3321
3325
  // But do not represent an other resource, it is considered as
3322
3326
  // the same resource under the hood
3323
3327
  const searchParamTransformationMap = new Map();
3324
- pluginController.callHooks(
3328
+ jsenvPluginsController.callHooks(
3325
3329
  "transformReferenceSearchParams",
3326
3330
  reference,
3327
3331
  (returnValue) => {
@@ -3349,7 +3353,7 @@ ${ANSI.color(normalizedReturnValue, ANSI.YELLOW)}
3349
3353
  }
3350
3354
  }
3351
3355
  {
3352
- const returnValue = pluginController.callHooksUntil(
3356
+ const returnValue = jsenvPluginsController.callHooksUntil(
3353
3357
  "formatReference",
3354
3358
  reference,
3355
3359
  );
@@ -3370,7 +3374,10 @@ ${ANSI.color(normalizedReturnValue, ANSI.YELLOW)}
3370
3374
  const fetchUrlContent = async (urlInfo) => {
3371
3375
  try {
3372
3376
  const fetchUrlContentReturnValue =
3373
- await pluginController.callAsyncHooksUntil("fetchUrlContent", urlInfo);
3377
+ await jsenvPluginsController.callAsyncHooksUntil(
3378
+ "fetchUrlContent",
3379
+ urlInfo,
3380
+ );
3374
3381
  if (!fetchUrlContentReturnValue) {
3375
3382
  logger.warn(
3376
3383
  createDetailedMessage(
@@ -3469,7 +3476,7 @@ ${ANSI.color(normalizedReturnValue, ANSI.YELLOW)}
3469
3476
  });
3470
3477
  } catch (error) {
3471
3478
  throw createFetchUrlContentError({
3472
- pluginController,
3479
+ jsenvPluginsController,
3473
3480
  urlInfo,
3474
3481
  error,
3475
3482
  });
@@ -3479,7 +3486,7 @@ ${ANSI.color(normalizedReturnValue, ANSI.YELLOW)}
3479
3486
 
3480
3487
  const transformUrlContent = async (urlInfo) => {
3481
3488
  try {
3482
- await pluginController.callAsyncHooks(
3489
+ await jsenvPluginsController.callAsyncHooks(
3483
3490
  "transformUrlContent",
3484
3491
  urlInfo,
3485
3492
  (transformReturnValue) => {
@@ -3491,7 +3498,7 @@ ${ANSI.color(normalizedReturnValue, ANSI.YELLOW)}
3491
3498
  );
3492
3499
  } catch (error) {
3493
3500
  const transformError = createTransformUrlContentError({
3494
- pluginController,
3501
+ jsenvPluginsController,
3495
3502
  urlInfo,
3496
3503
  error,
3497
3504
  });
@@ -3503,14 +3510,15 @@ ${ANSI.color(normalizedReturnValue, ANSI.YELLOW)}
3503
3510
  const finalizeUrlContent = async (urlInfo) => {
3504
3511
  try {
3505
3512
  await urlInfo.applyContentTransformationCallbacks();
3506
- const finalizeReturnValue = await pluginController.callAsyncHooksUntil(
3507
- "finalizeUrlContent",
3508
- urlInfo,
3509
- );
3513
+ const finalizeReturnValue =
3514
+ await jsenvPluginsController.callAsyncHooksUntil(
3515
+ "finalizeUrlContent",
3516
+ urlInfo,
3517
+ );
3510
3518
  urlInfoTransformer.endTransformations(urlInfo, finalizeReturnValue);
3511
3519
  } catch (error) {
3512
3520
  throw createFinalizeUrlContentError({
3513
- pluginController,
3521
+ jsenvPluginsController,
3514
3522
  urlInfo,
3515
3523
  error,
3516
3524
  });
@@ -3591,7 +3599,7 @@ ${urlInfo.firstReference.trace.message}`;
3591
3599
  }
3592
3600
 
3593
3601
  // "cooked" hook
3594
- pluginController.callHooks("cooked", urlInfo, (cookedReturnValue) => {
3602
+ jsenvPluginsController.callHooks("cooked", urlInfo, (cookedReturnValue) => {
3595
3603
  if (typeof cookedReturnValue === "function") {
3596
3604
  const removeCallback = urlInfo.graph.urlInfoDereferencedEventEmitter.on(
3597
3605
  (urlInfoDereferenced, lastReferenceFromOther) => {
@@ -4223,9 +4231,9 @@ const replacePlaceholders = (html, replacers) => {
4223
4231
  });
4224
4232
  };
4225
4233
 
4226
- const createPluginStore = async (plugins) => {
4227
- const allDevServerRoutes = [];
4228
- const allDevServerServices = [];
4234
+ const createJsenvPluginStore = async (plugins) => {
4235
+ const allServerRoutes = [];
4236
+ const allServerPlugins = [];
4229
4237
  const pluginArray = [];
4230
4238
 
4231
4239
  const pluginPromises = [];
@@ -4248,16 +4256,17 @@ const createPluginStore = async (plugins) => {
4248
4256
  if (!plugin.name) {
4249
4257
  plugin.name = "anonymous";
4250
4258
  }
4251
- if (plugin.devServerRoutes) {
4252
- const devServerRoutes = plugin.devServerRoutes;
4253
- for (const devServerRoute of devServerRoutes) {
4254
- allDevServerRoutes.push(devServerRoute);
4259
+ const { serverRoutes } = plugin;
4260
+ if (serverRoutes) {
4261
+ for (const serverRoute of serverRoutes) {
4262
+ allServerRoutes.push(serverRoute);
4255
4263
  }
4256
4264
  }
4257
- if (plugin.devServerServices) {
4258
- const devServerServices = plugin.devServerServices;
4259
- for (const devServerService of devServerServices) {
4260
- allDevServerServices.push(devServerService);
4265
+ const { serverPlugins } = plugin;
4266
+ if (serverPlugins) {
4267
+ const serverPlugins = plugin.serverPlugins;
4268
+ for (const serverPlugin of serverPlugins) {
4269
+ allServerPlugins.push(serverPlugin);
4261
4270
  }
4262
4271
  }
4263
4272
  pluginArray.push(plugin);
@@ -4270,283 +4279,120 @@ const createPluginStore = async (plugins) => {
4270
4279
 
4271
4280
  return {
4272
4281
  pluginArray,
4273
- allDevServerRoutes,
4274
- allDevServerServices,
4282
+ allServerRoutes,
4283
+ allServerPlugins,
4275
4284
  };
4276
4285
  };
4277
4286
 
4278
- const createPluginController = async (
4287
+ const createJsenvPluginsController = async (
4279
4288
  pluginStore,
4280
4289
  kitchen,
4281
- { initialPuginsMeta = {} } = {},
4290
+ { meta } = {},
4282
4291
  ) => {
4283
- const pluginsMeta = initialPuginsMeta;
4284
- kitchen.context.getPluginMeta = (id) => {
4285
- const value = pluginsMeta[id];
4286
- return value;
4287
- };
4292
+ kitchen.context.getPluginMeta = (id) => pluginsController.getPluginMeta(id);
4293
+ const pluginsController = await createPluginsController({
4294
+ plugins: pluginStore.pluginArray,
4295
+ pluginDescription: JSENV_PLUGIN_DESCRIPTION,
4296
+ filterPlugin: (plugin) => testAppliesDuring(plugin, kitchen),
4297
+ getInitPluginArgs: (plugin) => [kitchen.context, { plugin }],
4298
+ getEffectArgs: ({ otherPlugins }) => [
4299
+ { kitchenContext: kitchen.context, otherPlugins },
4300
+ ],
4301
+ meta,
4302
+ });
4303
+ return pluginsController;
4304
+ };
4288
4305
 
4289
- // precompute a list of hooks per hookName because:
4290
- // 1. [MAJOR REASON] when debugging, there is less iteration (so much better)
4291
- // 2. [MINOR REASON] it should increase perf as there is less work to do
4292
- const hookSetMap = new Map();
4293
- const pluginCandidates = pluginStore.pluginArray;
4294
- const activePluginArray = [];
4295
- const pluginWithEffectCandidateForActivationArray = [];
4296
- for (const pluginCandidate of pluginCandidates) {
4297
- if (!testAppliesDuring(pluginCandidate, kitchen)) {
4298
- pluginCandidate.destroy?.();
4299
- continue;
4300
- }
4301
- const initPluginResult = await initPlugin(pluginCandidate, kitchen);
4302
- if (!initPluginResult) {
4303
- pluginCandidate.destroy?.();
4304
- continue;
4305
- }
4306
- if (pluginCandidate.effect) {
4307
- pluginWithEffectCandidateForActivationArray.push(pluginCandidate);
4308
- } else {
4309
- activePluginArray.push(pluginCandidate);
4310
- }
4311
- }
4306
+ const hook = { type: "hook" };
4307
+ const nonHook = {};
4312
4308
 
4313
- const activeEffectSet = new Set();
4314
- for (const pluginWithEffectCandidateForActivation of pluginWithEffectCandidateForActivationArray) {
4315
- const returnValue = pluginWithEffectCandidateForActivation.effect({
4316
- kitchenContext: kitchen.context,
4317
- otherPlugins: activePluginArray,
4318
- });
4319
- if (!returnValue) {
4320
- continue;
4321
- }
4322
- activePluginArray.push(pluginWithEffectCandidateForActivation);
4323
- activeEffectSet.add({
4324
- plugin: pluginWithEffectCandidateForActivation,
4325
- cleanup: typeof returnValue === "function" ? returnValue : () => {},
4326
- });
4309
+ const assertUrlReturnValue = (valueReturned, urlInfo, { hook }) => {
4310
+ if (valueReturned instanceof URL) {
4311
+ return valueReturned.href;
4327
4312
  }
4328
- activePluginArray.sort((a, b) => {
4329
- return pluginCandidates.indexOf(a) - pluginCandidates.indexOf(b);
4330
- });
4331
- for (const activePlugin of activePluginArray) {
4332
- for (const key of Object.keys(activePlugin)) {
4333
- if (key === "meta") {
4334
- const value = activePlugin[key];
4335
- if (typeof value !== "object" || value === null) {
4336
- console.warn(`plugin.meta must be an object, got ${value}`);
4337
- continue;
4338
- }
4339
- Object.assign(pluginsMeta, value);
4340
- // any extension/modification on plugin.meta
4341
- // won't be taken into account so we freeze object
4342
- // to throw in case it happen
4343
- Object.freeze(value);
4344
- continue;
4345
- }
4346
- if (
4347
- key === "name" ||
4348
- key === "appliesDuring" ||
4349
- key === "init" ||
4350
- key === "serverEvents" ||
4351
- key === "mustStayFirst" ||
4352
- key === "devServerRoutes" ||
4353
- key === "devServerServices" ||
4354
- key === "effect"
4355
- ) {
4356
- continue;
4357
- }
4358
- const isHook = HOOK_NAMES.includes(key);
4359
- if (!isHook) {
4360
- console.warn(
4361
- `Unexpected "${key}" property on "${activePlugin.name}" plugin`,
4362
- );
4363
- continue;
4364
- }
4365
- const hookName = key;
4366
- const hookValue = activePlugin[hookName];
4367
- if (hookValue) {
4368
- let hookSet = hookSetMap.get(hookName);
4369
- if (!hookSet) {
4370
- hookSet = new Set();
4371
- hookSetMap.set(hookName, hookSet);
4372
- }
4373
- const hook = {
4374
- plugin: activePlugin,
4375
- name: hookName,
4376
- value: hookValue,
4377
- };
4378
- // if (position === "start") {
4379
- // let i = 0;
4380
- // while (i < group.length) {
4381
- // const before = group[i];
4382
- // if (!before.plugin.mustStayFirst) {
4383
- // break;
4384
- // }
4385
- // i++;
4386
- // }
4387
- // group.splice(i, 0, hook);
4388
- // } else {
4389
- hookSet.add(hook);
4390
- }
4391
- }
4392
- }
4393
-
4394
- let lastPluginUsed = null;
4395
- let currentPlugin = null;
4396
- let currentHookName = null;
4397
- const callHook = (hook, info) => {
4398
- const hookFn = getHookFunction(hook, info);
4399
- if (!hookFn) {
4400
- return null;
4401
- }
4402
- let startTimestamp;
4403
- if (info.timing) {
4404
- startTimestamp = performance.now();
4405
- }
4406
- lastPluginUsed = hook.plugin;
4407
- currentPlugin = hook.plugin;
4408
- currentHookName = hook.name;
4409
- let valueReturned = hookFn(info);
4410
- if (info.timing) {
4411
- info.timing[`${hook.name}-${hook.plugin.name.replace("jsenv:", "")}`] =
4412
- performance.now() - startTimestamp;
4413
- }
4414
- valueReturned = assertAndNormalizeReturnValue(hook, valueReturned, info);
4415
- currentPlugin = null;
4416
- currentHookName = null;
4313
+ if (typeof valueReturned === "string") {
4417
4314
  return valueReturned;
4418
- };
4419
- const callAsyncHook = async (hook, info) => {
4420
- const hookFn = getHookFunction(hook, info);
4421
- if (!hookFn) {
4422
- return null;
4423
- }
4424
-
4425
- let startTimestamp;
4426
- if (info.timing) {
4427
- startTimestamp = performance.now();
4428
- }
4429
- lastPluginUsed = hook.plugin;
4430
- currentPlugin = hook.plugin;
4431
- currentHookName = hook.name;
4432
- let valueReturned = await hookFn(info);
4433
- if (info.timing) {
4434
- info.timing[`${hook.name}-${hook.plugin.name.replace("jsenv:", "")}`] =
4435
- performance.now() - startTimestamp;
4436
- }
4437
- valueReturned = assertAndNormalizeReturnValue(hook, valueReturned, info);
4438
- currentPlugin = null;
4439
- currentHookName = null;
4440
- return valueReturned;
4441
- };
4442
- const callHooks = (hookName, info, callback) => {
4443
- const hookSet = hookSetMap.get(hookName);
4444
- if (!hookSet) {
4445
- return;
4446
- }
4447
- const setHookParams = (firstArg = info) => {
4448
- info = firstArg;
4449
- };
4450
- for (const hook of hookSet) {
4451
- const returnValue = callHook(hook, info);
4452
- if (returnValue && callback) {
4453
- callback(returnValue, hook.plugin, setHookParams);
4454
- }
4455
- }
4456
- };
4457
- const callAsyncHooks = async (hookName, info, callback, options) => {
4458
- const hookSet = hookSetMap.get(hookName);
4459
- if (!hookSet) {
4460
- return;
4461
- }
4462
- for (const hook of hookSet) {
4463
- const returnValue = await callAsyncHook(hook, info);
4464
- if (returnValue && callback) {
4465
- await callback(returnValue, hook.plugin);
4466
- }
4467
- }
4468
- };
4469
- const callHooksUntil = (hookName, info) => {
4470
- const hookSet = hookSetMap.get(hookName);
4471
- if (!hookSet) {
4472
- return null;
4315
+ }
4316
+ throw new Error(
4317
+ `Unexpected value returned by hook "${hook.plugin.name}.${hook.name}()": it must be a string; got ${valueReturned}`,
4318
+ );
4319
+ };
4320
+ const assertContentReturnValue = (valueReturned, urlInfo, { hook }) => {
4321
+ if (typeof valueReturned === "string" || Buffer.isBuffer(valueReturned)) {
4322
+ return { content: valueReturned };
4323
+ }
4324
+ if (typeof valueReturned === "object") {
4325
+ const { content, body } = valueReturned;
4326
+ if (urlInfo.url.startsWith("ignore:")) {
4327
+ return valueReturned;
4473
4328
  }
4474
- for (const hook of hookSet) {
4475
- const returnValue = callHook(hook, info);
4476
- if (returnValue) {
4477
- return returnValue;
4329
+ if (typeof content !== "string" && !Buffer.isBuffer(content) && !body) {
4330
+ if (Object.hasOwn(valueReturned, "contentInjections")) {
4331
+ return valueReturned;
4478
4332
  }
4333
+ throw new Error(
4334
+ `Unexpected "content" returned by hook "${hook.plugin.name}.${hook.name}()": it must be a string or a buffer; got ${content}`,
4335
+ );
4479
4336
  }
4480
- return null;
4481
- };
4482
- const callAsyncHooksUntil = async (hookName, info, options) => {
4483
- const hookSet = hookSetMap.get(hookName);
4484
- if (!hookSet) {
4485
- return null;
4486
- }
4487
- if (hookSet.size === 0) {
4488
- return null;
4489
- }
4490
- const iterator = hookSet.values()[Symbol.iterator]();
4491
- let result;
4492
- const visit = async () => {
4493
- const { done, value: hook } = iterator.next();
4494
- if (done) {
4495
- return;
4496
- }
4497
- const returnValue = await callAsyncHook(hook, info);
4498
- if (returnValue) {
4499
- result = returnValue;
4500
- return;
4501
- }
4502
- await visit();
4503
- };
4504
- await visit();
4505
- return result;
4506
- };
4337
+ return valueReturned;
4338
+ }
4339
+ throw new Error(
4340
+ `Unexpected value returned by hook "${hook.plugin.name}.${hook.name}()": it must be a string, a buffer or an object; got ${valueReturned}`,
4341
+ );
4342
+ };
4507
4343
 
4508
- return {
4509
- activePlugins: activePluginArray,
4510
-
4511
- callHook,
4512
- callAsyncHook,
4513
- callHooks,
4514
- callHooksUntil,
4515
- callAsyncHooks,
4516
- callAsyncHooksUntil,
4517
-
4518
- getLastPluginUsed: () => lastPluginUsed,
4519
- getCurrentPlugin: () => currentPlugin,
4520
- getCurrentHookName: () => currentHookName,
4521
- };
4522
- };
4523
-
4524
- const HOOK_NAMES = [
4525
- "init",
4526
- "devServerRoutes", // is called only during dev/tests
4527
- "devServerServices", // is called only during dev/tests
4528
- "resolveReference",
4529
- "redirectReference",
4530
- "transformReferenceSearchParams",
4531
- "formatReference",
4532
- "urlInfoCreated",
4533
- "fetchUrlContent",
4534
- "transformUrlContent",
4535
- "finalizeUrlContent",
4536
- "bundle", // is called only during build
4537
- "optimizeBuildUrlContent", // is called only during build
4538
- "cooked",
4539
- "augmentResponse", // is called only during dev/tests
4540
- "destroy",
4541
- "effect",
4542
- "refineBuildUrlContent", // called only during build
4543
- "refineBuild", // called only during build
4544
- ];
4344
+ const JSENV_PLUGIN_DESCRIPTION = {
4345
+ name: "jsenv plugin",
4346
+ properties: {
4347
+ // non-hook properties (silently skipped)
4348
+ appliesDuring: nonHook,
4349
+ serverEvents: nonHook,
4350
+ mustStayFirst: nonHook,
4351
+ serverRoutes: nonHook,
4352
+ serverPlugins: nonHook,
4353
+ // hooks
4354
+ init: hook,
4355
+ resolveReference: {
4356
+ type: "hook",
4357
+ assertAndNormalize: assertUrlReturnValue,
4358
+ },
4359
+ redirectReference: {
4360
+ type: "hook",
4361
+ assertAndNormalize: assertUrlReturnValue,
4362
+ },
4363
+ transformReferenceSearchParams: hook,
4364
+ formatReference: hook,
4365
+ urlInfoCreated: hook,
4366
+ fetchUrlContent: {
4367
+ type: "hook",
4368
+ assertAndNormalize: assertContentReturnValue,
4369
+ },
4370
+ transformUrlContent: {
4371
+ type: "hook",
4372
+ assertAndNormalize: assertContentReturnValue,
4373
+ },
4374
+ finalizeUrlContent: {
4375
+ type: "hook",
4376
+ assertAndNormalize: assertContentReturnValue,
4377
+ },
4378
+ bundle: hook,
4379
+ optimizeBuildUrlContent: {
4380
+ type: "hook",
4381
+ assertAndNormalize: assertContentReturnValue,
4382
+ },
4383
+ cooked: hook,
4384
+ augmentResponse: hook,
4385
+ destroy: hook,
4386
+ effect: hook,
4387
+ refineBuildUrlContent: hook,
4388
+ refineBuild: hook,
4389
+ // serverRoutes and serverPlugins are nonHook above
4390
+ },
4391
+ };
4545
4392
 
4546
4393
  const testAppliesDuring = (plugin, kitchen) => {
4547
4394
  const { appliesDuring } = plugin;
4548
4395
  if (appliesDuring === undefined) {
4549
- // console.debug(`"appliesDuring" is undefined on ${pluginEntry.name}`)
4550
4396
  return true;
4551
4397
  }
4552
4398
  if (appliesDuring === "*") {
@@ -4572,112 +4418,12 @@ const testAppliesDuring = (plugin, kitchen) => {
4572
4418
  return true;
4573
4419
  }
4574
4420
  }
4575
- // throw new Error(`"appliesDuring" is empty`)
4576
4421
  return false;
4577
4422
  }
4578
4423
  throw new TypeError(
4579
4424
  `"appliesDuring" must be an object or a string, got ${appliesDuring}`,
4580
4425
  );
4581
4426
  };
4582
- const initPlugin = async (plugin, kitchen) => {
4583
- const { init } = plugin;
4584
- if (!init) {
4585
- return true;
4586
- }
4587
- const initReturnValue = await init(kitchen.context, { plugin });
4588
- if (initReturnValue === false) {
4589
- return false;
4590
- }
4591
- if (typeof initReturnValue === "function" && !plugin.destroy) {
4592
- plugin.destroy = initReturnValue;
4593
- }
4594
- return true;
4595
- };
4596
- const getHookFunction = (
4597
- hook,
4598
- // can be undefined, reference, or urlInfo
4599
- info = {},
4600
- ) => {
4601
- const hookValue = hook.value;
4602
- if (typeof hookValue === "object") {
4603
- const hookForType = hookValue[info.type] || hookValue["*"];
4604
- if (!hookForType) {
4605
- return null;
4606
- }
4607
- return hookForType;
4608
- }
4609
- return hookValue;
4610
- };
4611
-
4612
- const assertAndNormalizeReturnValue = (hook, returnValue, info) => {
4613
- // all hooks are allowed to return null/undefined as a signal of "I don't do anything"
4614
- if (returnValue === null || returnValue === undefined) {
4615
- return returnValue;
4616
- }
4617
- for (const returnValueAssertion of returnValueAssertions) {
4618
- if (!returnValueAssertion.appliesTo.includes(hook.name)) {
4619
- continue;
4620
- }
4621
- const assertionResult = returnValueAssertion.assertion(returnValue, info, {
4622
- hook,
4623
- });
4624
- if (assertionResult !== undefined) {
4625
- // normalization
4626
- returnValue = assertionResult;
4627
- break;
4628
- }
4629
- }
4630
- return returnValue;
4631
- };
4632
- const returnValueAssertions = [
4633
- {
4634
- name: "url_assertion",
4635
- appliesTo: ["resolveReference", "redirectReference"],
4636
- assertion: (valueReturned, urlInfo, { hook }) => {
4637
- if (valueReturned instanceof URL) {
4638
- return valueReturned.href;
4639
- }
4640
- if (typeof valueReturned === "string") {
4641
- return undefined;
4642
- }
4643
- throw new Error(
4644
- `Unexpected value returned by "${hook.plugin.name}" plugin: it must be a string; got ${valueReturned}`,
4645
- );
4646
- },
4647
- },
4648
- {
4649
- name: "content_assertion",
4650
- appliesTo: [
4651
- "fetchUrlContent",
4652
- "transformUrlContent",
4653
- "finalizeUrlContent",
4654
- "optimizeBuildUrlContent",
4655
- ],
4656
- assertion: (valueReturned, urlInfo, { hook }) => {
4657
- if (typeof valueReturned === "string" || Buffer.isBuffer(valueReturned)) {
4658
- return { content: valueReturned };
4659
- }
4660
- if (typeof valueReturned === "object") {
4661
- const { content, body } = valueReturned;
4662
- if (urlInfo.url.startsWith("ignore:")) {
4663
- return undefined;
4664
- }
4665
- if (typeof content !== "string" && !Buffer.isBuffer(content) && !body) {
4666
- if (Object.hasOwn(valueReturned, "contentInjections")) {
4667
- return undefined;
4668
- }
4669
- throw new Error(
4670
- `Unexpected "content" returned by "${hook.plugin.name}" ${hook.name} hook: it must be a string or a buffer; got ${content}`,
4671
- );
4672
- }
4673
- return undefined;
4674
- }
4675
- throw new Error(
4676
- `Unexpected value returned by "${hook.plugin.name}" ${hook.name} hook: it must be a string, a buffer or an object; got ${valueReturned}`,
4677
- );
4678
- },
4679
- },
4680
- ];
4681
4427
 
4682
4428
  /*
4683
4429
  * https://github.com/parcel-bundler/parcel/blob/v2/packages/transformers/css/src/CSSTransformer.js
@@ -6732,7 +6478,7 @@ const jsenvPluginDirectoryListing = ({
6732
6478
  };
6733
6479
  },
6734
6480
  },
6735
- devServerRoutes: [
6481
+ serverRoutes: [
6736
6482
  {
6737
6483
  endpoint:
6738
6484
  "GET /.internal/directory_content.websocket?directory=:directory",
@@ -7916,11 +7662,7 @@ const jsenvPluginImportMetaCss = () => {
7916
7662
  appliesDuring: "*",
7917
7663
  transformUrlContent: {
7918
7664
  js_module: async (urlInfo) => {
7919
- if (
7920
- !urlInfo.content.includes("import.meta.css") ||
7921
- // there is already our installImportMetaCssBuild in the file
7922
- urlInfo.content.includes("installImportMetaCssBuild")
7923
- ) {
7665
+ if (!urlInfo.content.includes("import.meta.css")) {
7924
7666
  return null;
7925
7667
  }
7926
7668
  const { metadata } = await applyBabelPlugins({
@@ -7934,22 +7676,78 @@ const jsenvPluginImportMetaCss = () => {
7934
7676
  if (!usesImportMetaCss) {
7935
7677
  return null;
7936
7678
  }
7679
+ if (urlInfo.context.build) {
7680
+ const rootDirectoryUrl = urlInfo.context.rootDirectoryUrl;
7681
+ const relativeUrl = urlInfo.originalUrl.slice(
7682
+ rootDirectoryUrl.length - 1,
7683
+ );
7684
+ const { code } = await applyBabelPlugins({
7685
+ babelPlugins: [
7686
+ [babelPluginRewriteImportMetaCssAssignment, { relativeUrl }],
7687
+ ],
7688
+ input: urlInfo.content,
7689
+ inputIsJsModule: true,
7690
+ inputUrl: urlInfo.originalUrl,
7691
+ outputUrl: urlInfo.generatedUrl,
7692
+ });
7693
+ if (code === urlInfo.content) {
7694
+ // all assignments were already in array form (pre-built file) — nothing to do
7695
+ return null;
7696
+ }
7697
+ return injectImportMetaCss(urlInfo, {
7698
+ content: code,
7699
+ importFrom: importMetaCssBuildClientFileUrl,
7700
+ importName: "installImportMetaCssBuild",
7701
+ importAs: "__installImportMetaCssBuild__",
7702
+ });
7703
+ }
7937
7704
  return injectImportMetaCss(urlInfo, {
7938
- importFrom: urlInfo.context.build
7939
- ? importMetaCssBuildClientFileUrl
7940
- : importMetaCssDevClientFileUrl,
7941
- importName: urlInfo.context.build
7942
- ? "installImportMetaCssBuild"
7943
- : "installImportMetaCssDev",
7944
- importAs: urlInfo.context.build
7945
- ? "__installImportMetaCssBuild__"
7946
- : "__installImportMetaCssDev__",
7705
+ content: urlInfo.content,
7706
+ importFrom: importMetaCssDevClientFileUrl,
7707
+ importName: "installImportMetaCssDev",
7708
+ importAs: "__installImportMetaCssDev__",
7709
+ hot: true,
7947
7710
  });
7948
7711
  },
7949
7712
  },
7950
7713
  };
7951
7714
  };
7952
7715
 
7716
+ const babelPluginRewriteImportMetaCssAssignment = (
7717
+ { types: t },
7718
+ { relativeUrl },
7719
+ ) => {
7720
+ return {
7721
+ name: "rewrite-import-meta-css-assignment",
7722
+ visitor: {
7723
+ AssignmentExpression(path) {
7724
+ const { left, right } = path.node;
7725
+ if (left.type !== "MemberExpression") {
7726
+ return;
7727
+ }
7728
+ const { object, property } = left;
7729
+ if (object.type !== "MetaProperty") {
7730
+ return;
7731
+ }
7732
+ if (object.meta.name !== "import" || object.property.name !== "meta") {
7733
+ return;
7734
+ }
7735
+ if (property.name !== "css") {
7736
+ return;
7737
+ }
7738
+ // already transformed (e.g. pre-built file): leave as-is
7739
+ if (right.type === "ArrayExpression") {
7740
+ return;
7741
+ }
7742
+ path.node.right = t.arrayExpression([
7743
+ right,
7744
+ t.stringLiteral(relativeUrl),
7745
+ ]);
7746
+ },
7747
+ },
7748
+ };
7749
+ };
7750
+
7953
7751
  const babelPluginMetadataUsesImportMetaCss = () => {
7954
7752
  return {
7955
7753
  name: "metadata-uses-import-meta-css",
@@ -7981,7 +7779,10 @@ const babelPluginMetadataUsesImportMetaCss = () => {
7981
7779
  };
7982
7780
  };
7983
7781
 
7984
- const injectImportMetaCss = (urlInfo, { importFrom, importName, importAs }) => {
7782
+ const injectImportMetaCss = (
7783
+ urlInfo,
7784
+ { content, importFrom, importName, importAs, hot },
7785
+ ) => {
7985
7786
  const importMetaCssClientFileReference = urlInfo.dependencies.inject({
7986
7787
  parentUrl: urlInfo.url,
7987
7788
  type: "js_import",
@@ -7990,14 +7791,16 @@ const injectImportMetaCss = (urlInfo, { importFrom, importName, importAs }) => {
7990
7791
  });
7991
7792
  let importVariableName;
7992
7793
  let importBeforeFrom;
7993
- if (importAs !== importName) {
7794
+ if (importAs && importAs !== importName) {
7994
7795
  importBeforeFrom = `{ ${importName} as ${importAs} }`;
7995
7796
  importVariableName = importAs;
7996
7797
  } else {
7997
7798
  importBeforeFrom = `{ ${importName} } }`;
7998
7799
  importVariableName = importName;
7999
7800
  }
8000
- let prelude = `import ${importBeforeFrom} from ${importMetaCssClientFileReference.generatedSpecifier};
7801
+
7802
+ const prelude = hot
7803
+ ? `import ${importBeforeFrom} from ${importMetaCssClientFileReference.generatedSpecifier};
8001
7804
 
8002
7805
  const remove = ${importVariableName}(import.meta);
8003
7806
  if (import.meta.hot) {
@@ -8006,9 +7809,13 @@ if (import.meta.hot) {
8006
7809
  });
8007
7810
  }
8008
7811
 
7812
+ `
7813
+ : `import ${importBeforeFrom} from ${importMetaCssClientFileReference.generatedSpecifier};
7814
+
7815
+ ${importVariableName}(import.meta);
7816
+
8009
7817
  `;
8010
7818
 
8011
- let content = urlInfo.content;
8012
7819
  return {
8013
7820
  content: `${prelude.replace(/\n/g, "")}${content}`,
8014
7821
  };
@@ -8742,7 +8549,7 @@ const jsenvPluginAutoreloadServer = ({
8742
8549
  );
8743
8550
  },
8744
8551
  },
8745
- devServerRoutes: [
8552
+ serverRoutes: [
8746
8553
  {
8747
8554
  endpoint: "GET /.internal/graph.json",
8748
8555
  description:
@@ -9034,7 +8841,7 @@ const jsenvPluginChromeDevtoolsJson = () => {
9034
8841
  return {
9035
8842
  name: "jsenv_plugin_chrome_devtools_json",
9036
8843
  appliesDuring: "dev",
9037
- devServerRoutes: [
8844
+ serverRoutes: [
9038
8845
  {
9039
8846
  endpoint: "GET /.well-known/appspecific/com.chrome.devtools.json",
9040
8847
  declarationSource: import.meta.url,
@@ -9054,7 +8861,7 @@ const jsenvPluginChromeDevtoolsJson = () => {
9054
8861
 
9055
8862
  const jsenvPluginAutoreloadOnServerRestart = () => {
9056
8863
  const autoreloadOnRestartClientFileUrl = import.meta
9057
- .resolve("@jsenv/server/src/services/autoreload_on_server_restart/client/autoreload_on_server_restart.js");
8864
+ .resolve("@jsenv/server/src/plugins/autoreload_on_server_restart/client/autoreload_on_server_restart.js");
9058
8865
 
9059
8866
  return {
9060
8867
  name: "jsenv:autoreload_on_server_restart",
@@ -9787,25 +9594,27 @@ const logsDefault = {
9787
9594
  // https://bundlers.tooling.report/hashing/avoid-cascade/
9788
9595
 
9789
9596
 
9597
+ // we nevery minify those because they are already very small
9598
+ // and would hurt the readability of something that can be critical to debug
9790
9599
  const injectGlobalMappings = async (urlInfo, mappings) => {
9791
9600
  if (urlInfo.type === "html") {
9792
- const minification = Boolean(
9793
- urlInfo.context.getPluginMeta("willMinifyJsClassic"),
9794
- );
9601
+ // const minification = Boolean(
9602
+ // urlInfo.context.getPluginMeta("willMinifyJsClassic"),
9603
+ // );
9795
9604
  const content = generateClientCodeForMappings(mappings, {
9796
9605
  globalName: "window",
9797
- minification,
9606
+ minification: false,
9798
9607
  });
9799
9608
  await prependContent(urlInfo, { type: "js_classic", content });
9800
9609
  return;
9801
9610
  }
9802
9611
  if (urlInfo.type === "js_classic" || urlInfo.type === "js_module") {
9803
- const minification = Boolean(
9804
- urlInfo.context.getPluginMeta("willMinifyJsClassic"),
9805
- );
9612
+ // const minification = Boolean(
9613
+ // urlInfo.context.getPluginMeta("willMinifyJsClassic"),
9614
+ // );
9806
9615
  const content = generateClientCodeForMappings(mappings, {
9807
9616
  globalName: isWebWorkerUrlInfo(urlInfo) ? "self" : "window",
9808
- minification,
9617
+ minification: false,
9809
9618
  });
9810
9619
  await prependContent(urlInfo, { type: "js_classic", content });
9811
9620
  return;
@@ -9816,11 +9625,6 @@ const generateClientCodeForMappings = (
9816
9625
  versionMappings,
9817
9626
  { globalName, minification },
9818
9627
  ) => {
9819
- if (minification) {
9820
- return `;(function(){var m = ${JSON.stringify(
9821
- versionMappings,
9822
- )}; ${globalName}.__v__ = function (s) { return m[s] || s }; })();`;
9823
- }
9824
9628
  return `;(function() {
9825
9629
  var __versionMappings__ = {
9826
9630
  ${stringifyParams(versionMappings, " ")}
@@ -9837,12 +9641,7 @@ const injectImportmapMappings = (urlInfo, getMappings) => {
9837
9641
  url: urlInfo.url,
9838
9642
  storeOriginalPositions: false,
9839
9643
  });
9840
- // jsenv_plugin_importmap.js is removing importmap during build
9841
- // it means at this point we know HTML has no importmap in it
9842
- // we can safely inject one
9843
- const importmapMinification = Boolean(
9844
- urlInfo.context.getPluginMeta("willMinifyJson"),
9845
- );
9644
+ // Boolean(urlInfo.context.getPluginMeta("willMinifyJson"));
9846
9645
  const importmapNode = findHtmlNode(htmlAst, (node) => {
9847
9646
  return (
9848
9647
  node.tagName === "script" &&
@@ -9850,9 +9649,6 @@ const injectImportmapMappings = (urlInfo, getMappings) => {
9850
9649
  );
9851
9650
  });
9852
9651
  const generateMappingText = (mappings) => {
9853
- if (importmapMinification) {
9854
- return JSON.stringify({ imports: mappings });
9855
- }
9856
9652
  return JSON.stringify({ imports: mappings }, null, " ");
9857
9653
  };
9858
9654
 
@@ -9998,14 +9794,15 @@ const createBuildSpecifierManager = ({
9998
9794
  const bundleInfoMap = new Map();
9999
9795
 
10000
9796
  const applyBundling = async ({ bundler, urlInfosToBundle }) => {
10001
- const urlInfosBundled = await rawKitchen.pluginController.callAsyncHook(
10002
- {
10003
- plugin: bundler.plugin,
10004
- hookName: "bundle",
10005
- value: bundler.bundleFunction,
10006
- },
10007
- urlInfosToBundle,
10008
- );
9797
+ const urlInfosBundled =
9798
+ await rawKitchen.jsenvPluginsController.callAsyncHook(
9799
+ {
9800
+ plugin: bundler.plugin,
9801
+ hookName: "bundle",
9802
+ value: bundler.bundleFunction,
9803
+ },
9804
+ urlInfosToBundle,
9805
+ );
10009
9806
  for (const url of Object.keys(urlInfosBundled)) {
10010
9807
  const urlInfoBundled = urlInfosBundled[url];
10011
9808
  const contentSideEffects = [];
@@ -11196,9 +10993,9 @@ const isWrappedByQuote = (content, start, end) => {
11196
10993
  // https://github.com/rollup/rollup/blob/5a5391971d695c808eed0c5d7d2c6ccb594fc689/src/Chunk.ts#L870
11197
10994
  const generateVersion = (parts, length) => {
11198
10995
  const hash = createHash("sha256");
11199
- parts.forEach((part) => {
10996
+ for (const part of parts) {
11200
10997
  hash.update(part);
11201
- });
10998
+ }
11202
10999
  return hash.digest("hex").slice(0, length);
11203
11000
  };
11204
11001
 
@@ -12585,7 +12382,7 @@ const prepareEntryPointBuild = async (
12585
12382
  });
12586
12383
 
12587
12384
  let _getOtherEntryBuildInfo;
12588
- const rawPluginStore = await createPluginStore([
12385
+ const rawJsenvPluginStore = await createJsenvPluginStore([
12589
12386
  ...(mappings ? [jsenvPluginMappings(mappings)] : []),
12590
12387
  {
12591
12388
  name: "jsenv:other_entry_point_build_during_craft",
@@ -12631,11 +12428,11 @@ const prepareEntryPointBuild = async (
12631
12428
  packageSideEffects,
12632
12429
  }),
12633
12430
  ]);
12634
- const rawPluginController = await createPluginController(
12635
- rawPluginStore,
12431
+ const rawJsenvPluginsController = await createJsenvPluginsController(
12432
+ rawJsenvPluginStore,
12636
12433
  rawKitchen,
12637
12434
  );
12638
- rawKitchen.setPluginController(rawPluginController);
12435
+ rawKitchen.setJsenvPluginsController(rawJsenvPluginsController);
12639
12436
 
12640
12437
  const rawRootUrlInfo = rawKitchen.graph.rootUrlInfo;
12641
12438
  let entryReference;
@@ -12703,7 +12500,7 @@ const prepareEntryPointBuild = async (
12703
12500
  rawKitchen.graph.getUrlInfo(entryReference.url).type === "html" &&
12704
12501
  rawKitchen.context.isSupportedOnCurrentClients("importmap"),
12705
12502
  });
12706
- const finalPluginStore = await createPluginStore([
12503
+ const finalJsenvPluginStore = await createJsenvPluginStore([
12707
12504
  jsenvPluginReferenceAnalysis({
12708
12505
  ...referenceAnalysis,
12709
12506
  fetchInlineUrls: false,
@@ -12725,7 +12522,7 @@ const prepareEntryPointBuild = async (
12725
12522
  name: "jsenv:optimize",
12726
12523
  appliesDuring: "build",
12727
12524
  transformUrlContent: async (urlInfo) => {
12728
- await rawKitchen.pluginController.callAsyncHooks(
12525
+ await rawKitchen.jsenvPluginsController.callAsyncHooks(
12729
12526
  "optimizeBuildUrlContent",
12730
12527
  urlInfo,
12731
12528
  (optimizeReturnValue) => {
@@ -12736,18 +12533,18 @@ const prepareEntryPointBuild = async (
12736
12533
  },
12737
12534
  buildSpecifierManager.jsenvPluginMoveToBuildDirectory,
12738
12535
  ]);
12739
- const finalPluginController = await createPluginController(
12740
- finalPluginStore,
12536
+ const finalJsenvPluginsController = await createJsenvPluginsController(
12537
+ finalJsenvPluginStore,
12741
12538
  finalKitchen,
12742
12539
  {
12743
- initialPuginsMeta: rawKitchen.pluginController.pluginsMeta,
12540
+ meta: rawKitchen.jsenvPluginsController.getMeta(),
12744
12541
  },
12745
12542
  );
12746
- finalKitchen.setPluginController(finalPluginController);
12543
+ finalKitchen.setJsenvPluginsController(finalJsenvPluginsController);
12747
12544
 
12748
12545
  bundle: {
12749
12546
  const bundlerMap = new Map();
12750
- for (const plugin of rawKitchen.pluginController.activePlugins) {
12547
+ for (const plugin of rawKitchen.jsenvPluginsController.activePlugins) {
12751
12548
  const bundle = plugin.bundle;
12752
12549
  if (!bundle) {
12753
12550
  continue;
@@ -12957,7 +12754,8 @@ const prepareEntryPointBuild = async (
12957
12754
  {
12958
12755
  const refineBuildUrlContentCallbackSet = new Set();
12959
12756
  const refineBuildCallbackSet = new Set();
12960
- for (const plugin of rawKitchen.pluginController.activePlugins) {
12757
+ for (const plugin of rawKitchen.jsenvPluginsController
12758
+ .activePlugins) {
12961
12759
  const refineBuildUrlContent = plugin.refineBuildUrlContent;
12962
12760
  if (refineBuildUrlContent) {
12963
12761
  refineBuildUrlContentCallbackSet.add(refineBuildUrlContent);