isomorfeus-asset-manager 0.16.2 → 0.17.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.
@@ -24,11 +24,11 @@ __export(node_exports, {
24
24
  analyzeMetafileSync: () => analyzeMetafileSync,
25
25
  build: () => build,
26
26
  buildSync: () => buildSync,
27
+ context: () => context,
27
28
  default: () => node_default,
28
29
  formatMessages: () => formatMessages,
29
30
  formatMessagesSync: () => formatMessagesSync,
30
31
  initialize: () => initialize,
31
- serve: () => serve,
32
32
  transform: () => transform,
33
33
  transformSync: () => transformSync,
34
34
  version: () => version
@@ -215,15 +215,14 @@ function validateTarget(target) {
215
215
  }
216
216
  var canBeAnything = () => null;
217
217
  var mustBeBoolean = (value) => typeof value === "boolean" ? null : "a boolean";
218
- var mustBeBooleanOrObject = (value) => typeof value === "boolean" || typeof value === "object" && !Array.isArray(value) ? null : "a boolean or an object";
219
218
  var mustBeString = (value) => typeof value === "string" ? null : "a string";
220
219
  var mustBeRegExp = (value) => value instanceof RegExp ? null : "a RegExp object";
221
220
  var mustBeInteger = (value) => typeof value === "number" && value === (value | 0) ? null : "an integer";
222
221
  var mustBeFunction = (value) => typeof value === "function" ? null : "a function";
223
222
  var mustBeArray = (value) => Array.isArray(value) ? null : "an array";
224
223
  var mustBeObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value) ? null : "an object";
224
+ var mustBeEntryPoints = (value) => typeof value === "object" && value !== null ? null : "an array or an object";
225
225
  var mustBeWebAssemblyModule = (value) => value instanceof WebAssembly.Module ? null : "a WebAssembly.Module";
226
- var mustBeArrayOrRecord = (value) => typeof value === "object" && value !== null ? null : "an array or an object";
227
226
  var mustBeObjectOrNull = (value) => typeof value === "object" && !Array.isArray(value) ? null : "an object or null";
228
227
  var mustBeStringOrBoolean = (value) => typeof value === "string" || typeof value === "boolean" ? null : "a string or a boolean";
229
228
  var mustBeStringOrObject = (value) => typeof value === "string" || typeof value === "object" && value !== null && !Array.isArray(value) ? null : "a string or an object";
@@ -411,12 +410,10 @@ function flagsForBuildOptions(callName, options, isTTY2, logLevelDefault, writeD
411
410
  let keys = /* @__PURE__ */ Object.create(null);
412
411
  let stdinContents = null;
413
412
  let stdinResolveDir = null;
414
- let watchMode = null;
415
413
  pushLogFlags(flags, options, keys, isTTY2, logLevelDefault);
416
414
  pushCommonFlags(flags, options, keys);
417
415
  let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean);
418
416
  let bundle = getFlag(options, keys, "bundle", mustBeBoolean);
419
- let watch = getFlag(options, keys, "watch", mustBeBooleanOrObject);
420
417
  let splitting = getFlag(options, keys, "splitting", mustBeBoolean);
421
418
  let preserveSymlinks = getFlag(options, keys, "preserveSymlinks", mustBeBoolean);
422
419
  let metafile = getFlag(options, keys, "metafile", mustBeBoolean);
@@ -440,12 +437,11 @@ function flagsForBuildOptions(callName, options, isTTY2, logLevelDefault, writeD
440
437
  let inject = getFlag(options, keys, "inject", mustBeArray);
441
438
  let banner = getFlag(options, keys, "banner", mustBeObject);
442
439
  let footer = getFlag(options, keys, "footer", mustBeObject);
443
- let entryPoints = getFlag(options, keys, "entryPoints", mustBeArrayOrRecord);
440
+ let entryPoints = getFlag(options, keys, "entryPoints", mustBeEntryPoints);
444
441
  let absWorkingDir = getFlag(options, keys, "absWorkingDir", mustBeString);
445
442
  let stdin = getFlag(options, keys, "stdin", mustBeObject);
446
443
  let write = (_a2 = getFlag(options, keys, "write", mustBeBoolean)) != null ? _a2 : writeDefault;
447
444
  let allowOverwrite = getFlag(options, keys, "allowOverwrite", mustBeBoolean);
448
- let incremental = getFlag(options, keys, "incremental", mustBeBoolean) === true;
449
445
  let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject);
450
446
  keys.plugins = true;
451
447
  checkForInvalidFlags(options, keys, `in ${callName}() call`);
@@ -455,17 +451,6 @@ function flagsForBuildOptions(callName, options, isTTY2, logLevelDefault, writeD
455
451
  flags.push("--bundle");
456
452
  if (allowOverwrite)
457
453
  flags.push("--allow-overwrite");
458
- if (watch) {
459
- flags.push("--watch");
460
- if (typeof watch === "boolean") {
461
- watchMode = {};
462
- } else {
463
- let watchKeys = /* @__PURE__ */ Object.create(null);
464
- let onRebuild = getFlag(watch, watchKeys, "onRebuild", mustBeFunction);
465
- checkForInvalidFlags(watch, watchKeys, `on "watch" in ${callName}() call`);
466
- watchMode = { onRebuild };
467
- }
468
- }
469
454
  if (splitting)
470
455
  flags.push("--splitting");
471
456
  if (preserveSymlinks)
@@ -563,8 +548,21 @@ function flagsForBuildOptions(callName, options, isTTY2, logLevelDefault, writeD
563
548
  }
564
549
  if (entryPoints) {
565
550
  if (Array.isArray(entryPoints)) {
566
- for (let entryPoint of entryPoints) {
567
- entries.push(["", validateStringValue(entryPoint, "entry point")]);
551
+ for (let i = 0, n = entryPoints.length; i < n; i++) {
552
+ let entryPoint = entryPoints[i];
553
+ if (typeof entryPoint === "object" && entryPoint !== null) {
554
+ let entryPointKeys = /* @__PURE__ */ Object.create(null);
555
+ let input = getFlag(entryPoint, entryPointKeys, "in", mustBeString);
556
+ let output = getFlag(entryPoint, entryPointKeys, "out", mustBeString);
557
+ checkForInvalidFlags(entryPoint, entryPointKeys, "in entry point at index " + i);
558
+ if (input === void 0)
559
+ throw new Error('Missing property "in" for entry point at index ' + i);
560
+ if (output === void 0)
561
+ throw new Error('Missing property "out" for entry point at index ' + i);
562
+ entries.push([output, input]);
563
+ } else {
564
+ entries.push(["", validateStringValue(entryPoint, "entry point at index " + i)]);
565
+ }
568
566
  }
569
567
  } else {
570
568
  for (let key in entryPoints) {
@@ -604,9 +602,7 @@ function flagsForBuildOptions(callName, options, isTTY2, logLevelDefault, writeD
604
602
  stdinContents,
605
603
  stdinResolveDir,
606
604
  absWorkingDir,
607
- incremental,
608
605
  nodePaths,
609
- watch: watchMode,
610
606
  mangleCache: validateMangleCache(mangleCache)
611
607
  };
612
608
  }
@@ -729,8 +725,8 @@ function createChannel(streamIn) {
729
725
  if (isFirstPacket) {
730
726
  isFirstPacket = false;
731
727
  let binaryVersion = String.fromCharCode(...bytes);
732
- if (binaryVersion !== "0.16.10") {
733
- throw new Error(`Cannot start service: Host version "${"0.16.10"}" does not match binary version ${quote(binaryVersion)}`);
728
+ if (binaryVersion !== "0.17.12") {
729
+ throw new Error(`Cannot start service: Host version "${"0.17.12"}" does not match binary version ${quote(binaryVersion)}`);
734
730
  }
735
731
  return;
736
732
  }
@@ -746,7 +742,7 @@ function createChannel(streamIn) {
746
742
  callback(null, packet.value);
747
743
  }
748
744
  };
749
- let buildOrServe = ({ callName, refs, serveOptions, options, isTTY: isTTY2, defaultWD: defaultWD2, callback }) => {
745
+ let buildOrContext = ({ callName, refs, options, isTTY: isTTY2, defaultWD: defaultWD2, callback }) => {
750
746
  let refCount = 0;
751
747
  const buildKey = nextBuildKey++;
752
748
  const requestCallbacks = {};
@@ -767,7 +763,7 @@ function createChannel(streamIn) {
767
763
  };
768
764
  requestCallbacksByKey[buildKey] = requestCallbacks;
769
765
  buildRefs.ref();
770
- buildOrServeImpl(
766
+ buildOrContextImpl(
771
767
  callName,
772
768
  buildKey,
773
769
  sendRequest,
@@ -776,10 +772,8 @@ function createChannel(streamIn) {
776
772
  streamIn,
777
773
  requestCallbacks,
778
774
  options,
779
- serveOptions,
780
775
  isTTY2,
781
776
  defaultWD2,
782
- closeData,
783
777
  (err, res) => {
784
778
  try {
785
779
  callback(err, res);
@@ -815,7 +809,13 @@ function createChannel(streamIn) {
815
809
  let outstanding = 1;
816
810
  let next = () => {
817
811
  if (--outstanding === 0) {
818
- let result = { warnings, code: response.code, map: response.map };
812
+ let result = {
813
+ warnings,
814
+ code: response.code,
815
+ map: response.map,
816
+ mangleCache: void 0,
817
+ legalComments: void 0
818
+ };
819
819
  if ("legalComments" in response)
820
820
  result.legalComments = response == null ? void 0 : response.legalComments;
821
821
  if (response.mangleCache)
@@ -921,30 +921,26 @@ function createChannel(streamIn) {
921
921
  readFromStdout,
922
922
  afterClose,
923
923
  service: {
924
- buildOrServe,
924
+ buildOrContext,
925
925
  transform: transform2,
926
926
  formatMessages: formatMessages2,
927
927
  analyzeMetafile: analyzeMetafile2
928
928
  }
929
929
  };
930
930
  }
931
- function buildOrServeImpl(callName, buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, options, serveOptions, isTTY2, defaultWD2, closeData, callback) {
931
+ function buildOrContextImpl(callName, buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, options, isTTY2, defaultWD2, callback) {
932
932
  const details = createObjectStash();
933
- const logPluginError = (e, pluginName, note, done) => {
933
+ const isContext = callName === "context";
934
+ const handleError = (e, pluginName) => {
934
935
  const flags = [];
935
936
  try {
936
937
  pushLogFlags(flags, options, {}, isTTY2, buildLogLevelDefault);
937
938
  } catch {
938
939
  }
939
- const message = extractErrorMessageV8(e, streamIn, details, note, pluginName);
940
+ const message = extractErrorMessageV8(e, streamIn, details, void 0, pluginName);
940
941
  sendRequest(refs, { command: "error", flags, error: message }, () => {
941
942
  message.detail = details.load(message.detail);
942
- done(message);
943
- });
944
- };
945
- const handleError = (e, pluginName) => {
946
- logPluginError(e, pluginName, void 0, (error) => {
947
- callback(failureErrorWithLog("Build failed", [error], []), null);
943
+ callback(failureErrorWithLog(isContext ? "Context failed" : "Build failed", [message], []), null);
948
944
  });
949
945
  };
950
946
  let plugins;
@@ -952,15 +948,13 @@ function buildOrServeImpl(callName, buildKey, sendRequest, sendResponse, refs, s
952
948
  const value = options.plugins;
953
949
  if (value !== void 0) {
954
950
  if (!Array.isArray(value))
955
- throw new Error(`"plugins" must be an array`);
951
+ return handleError(new Error(`"plugins" must be an array`), "");
956
952
  plugins = value;
957
953
  }
958
954
  }
959
955
  if (plugins && plugins.length > 0) {
960
- if (streamIn.isSync) {
961
- handleError(new Error("Cannot use plugins in synchronous API calls"), "");
962
- return;
963
- }
956
+ if (streamIn.isSync)
957
+ return handleError(new Error("Cannot use plugins in synchronous API calls"), "");
964
958
  handlePlugins(
965
959
  buildKey,
966
960
  sendRequest,
@@ -973,12 +967,10 @@ function buildOrServeImpl(callName, buildKey, sendRequest, sendResponse, refs, s
973
967
  details
974
968
  ).then(
975
969
  (result) => {
976
- if (!result.ok) {
977
- handleError(result.error, result.pluginName);
978
- return;
979
- }
970
+ if (!result.ok)
971
+ return handleError(result.error, result.pluginName);
980
972
  try {
981
- buildOrServeContinue(result.requestPlugins, result.runOnEndCallbacks);
973
+ buildOrContextContinue(result.requestPlugins, result.runOnEndCallbacks, result.scheduleOnDisposeCallbacks);
982
974
  } catch (e) {
983
975
  handleError(e, "");
984
976
  }
@@ -988,25 +980,26 @@ function buildOrServeImpl(callName, buildKey, sendRequest, sendResponse, refs, s
988
980
  return;
989
981
  }
990
982
  try {
991
- buildOrServeContinue(null, (result, logPluginError2, done) => done());
983
+ buildOrContextContinue(null, (result, done) => done([], []), () => {
984
+ });
992
985
  } catch (e) {
993
986
  handleError(e, "");
994
987
  }
995
- function buildOrServeContinue(requestPlugins, runOnEndCallbacks) {
996
- let writeDefault = !streamIn.isWriteUnavailable;
997
- let {
988
+ function buildOrContextContinue(requestPlugins, runOnEndCallbacks, scheduleOnDisposeCallbacks) {
989
+ const writeDefault = streamIn.hasFS;
990
+ const {
998
991
  entries,
999
992
  flags,
1000
993
  write,
1001
994
  stdinContents,
1002
995
  stdinResolveDir,
1003
996
  absWorkingDir,
1004
- incremental,
1005
997
  nodePaths,
1006
- watch,
1007
998
  mangleCache
1008
999
  } = flagsForBuildOptions(callName, options, isTTY2, buildLogLevelDefault, writeDefault);
1009
- let request = {
1000
+ if (write && !streamIn.hasFS)
1001
+ throw new Error(`The "write" option is unavailable in this environment`);
1002
+ const request = {
1010
1003
  command: "build",
1011
1004
  key: buildKey,
1012
1005
  entries,
@@ -1015,17 +1008,23 @@ function buildOrServeImpl(callName, buildKey, sendRequest, sendResponse, refs, s
1015
1008
  stdinContents,
1016
1009
  stdinResolveDir,
1017
1010
  absWorkingDir: absWorkingDir || defaultWD2,
1018
- incremental,
1019
- nodePaths
1011
+ nodePaths,
1012
+ context: isContext
1020
1013
  };
1021
1014
  if (requestPlugins)
1022
1015
  request.plugins = requestPlugins;
1023
1016
  if (mangleCache)
1024
1017
  request.mangleCache = mangleCache;
1025
- let serve2 = serveOptions && buildServeData(buildKey, sendRequest, sendResponse, refs, requestCallbacks, serveOptions, request);
1026
- let rebuild;
1027
- let stop;
1028
- let copyResponseToResult = (response, result) => {
1018
+ const buildResponseToResult = (response, callback2) => {
1019
+ const result = {
1020
+ errors: replaceDetailsInMessages(response.errors, details),
1021
+ warnings: replaceDetailsInMessages(response.warnings, details),
1022
+ outputFiles: void 0,
1023
+ metafile: void 0,
1024
+ mangleCache: void 0
1025
+ };
1026
+ const originalErrors = result.errors.slice();
1027
+ const originalWarnings = result.warnings.slice();
1029
1028
  if (response.outputFiles)
1030
1029
  result.outputFiles = response.outputFiles.map(convertOutputFiles);
1031
1030
  if (response.metafile)
@@ -1034,170 +1033,163 @@ function buildOrServeImpl(callName, buildKey, sendRequest, sendResponse, refs, s
1034
1033
  result.mangleCache = response.mangleCache;
1035
1034
  if (response.writeToStdout !== void 0)
1036
1035
  console.log(decodeUTF8(response.writeToStdout).replace(/\n$/, ""));
1037
- };
1038
- let buildResponseToResult = (response, callback2) => {
1039
- let result = {
1040
- errors: replaceDetailsInMessages(response.errors, details),
1041
- warnings: replaceDetailsInMessages(response.warnings, details)
1042
- };
1043
- copyResponseToResult(response, result);
1044
- runOnEndCallbacks(result, logPluginError, () => {
1045
- if (result.errors.length > 0) {
1046
- return callback2(failureErrorWithLog("Build failed", result.errors, result.warnings), null);
1036
+ runOnEndCallbacks(result, (onEndErrors, onEndWarnings) => {
1037
+ if (originalErrors.length > 0 || onEndErrors.length > 0) {
1038
+ const error = failureErrorWithLog("Build failed", originalErrors.concat(onEndErrors), originalWarnings.concat(onEndWarnings));
1039
+ return callback2(error, null, onEndErrors, onEndWarnings);
1047
1040
  }
1048
- if (response.rebuild) {
1049
- if (!rebuild) {
1050
- let isDisposed = false;
1051
- rebuild = () => new Promise((resolve, reject) => {
1052
- if (isDisposed || closeData.didClose)
1053
- throw new Error("Cannot rebuild");
1054
- sendRequest(
1055
- refs,
1056
- { command: "rebuild", key: buildKey },
1057
- (error2, response2) => {
1041
+ callback2(null, result, onEndErrors, onEndWarnings);
1042
+ });
1043
+ };
1044
+ let latestResultPromise;
1045
+ let provideLatestResult;
1046
+ if (isContext)
1047
+ requestCallbacks["on-end"] = (id, request2) => new Promise((resolve) => {
1048
+ buildResponseToResult(request2, (err, result, onEndErrors, onEndWarnings) => {
1049
+ const response = {
1050
+ errors: onEndErrors,
1051
+ warnings: onEndWarnings
1052
+ };
1053
+ if (provideLatestResult)
1054
+ provideLatestResult(err, result);
1055
+ latestResultPromise = void 0;
1056
+ provideLatestResult = void 0;
1057
+ sendResponse(id, response);
1058
+ resolve();
1059
+ });
1060
+ });
1061
+ sendRequest(refs, request, (error, response) => {
1062
+ if (error)
1063
+ return callback(new Error(error), null);
1064
+ if (!isContext) {
1065
+ return buildResponseToResult(response, (err, res) => {
1066
+ scheduleOnDisposeCallbacks();
1067
+ return callback(err, res);
1068
+ });
1069
+ }
1070
+ if (response.errors.length > 0) {
1071
+ return callback(failureErrorWithLog("Context failed", response.errors, response.warnings), null);
1072
+ }
1073
+ let didDispose = false;
1074
+ const result = {
1075
+ rebuild: () => {
1076
+ if (!latestResultPromise)
1077
+ latestResultPromise = new Promise((resolve, reject) => {
1078
+ let settlePromise;
1079
+ provideLatestResult = (err, result2) => {
1080
+ if (!settlePromise)
1081
+ settlePromise = () => err ? reject(err) : resolve(result2);
1082
+ };
1083
+ const triggerAnotherBuild = () => {
1084
+ const request2 = {
1085
+ command: "rebuild",
1086
+ key: buildKey
1087
+ };
1088
+ sendRequest(refs, request2, (error2, response2) => {
1058
1089
  if (error2) {
1059
- const message = { id: "", pluginName: "", text: error2, location: null, notes: [], detail: void 0 };
1060
- return callback2(failureErrorWithLog("Build failed", [message], []), null);
1090
+ reject(new Error(error2));
1091
+ } else if (settlePromise) {
1092
+ settlePromise();
1093
+ } else {
1094
+ triggerAnotherBuild();
1061
1095
  }
1062
- buildResponseToResult(response2, (error3, result3) => {
1063
- if (error3)
1064
- reject(error3);
1065
- else
1066
- resolve(result3);
1067
- });
1068
- }
1069
- );
1096
+ });
1097
+ };
1098
+ triggerAnotherBuild();
1070
1099
  });
1071
- refs.ref();
1072
- rebuild.dispose = () => {
1073
- if (isDisposed)
1074
- return;
1075
- isDisposed = true;
1076
- sendRequest(refs, { command: "rebuild-dispose", key: buildKey }, () => {
1077
- });
1078
- refs.unref();
1079
- };
1080
- }
1081
- result.rebuild = rebuild;
1082
- }
1083
- if (response.watch) {
1084
- if (!stop) {
1085
- let isStopped = false;
1086
- refs.ref();
1087
- stop = () => {
1088
- if (isStopped)
1089
- return;
1090
- isStopped = true;
1091
- delete requestCallbacks["watch-rebuild"];
1092
- sendRequest(refs, { command: "watch-stop", key: buildKey }, () => {
1093
- });
1094
- refs.unref();
1095
- };
1096
- if (watch) {
1097
- requestCallbacks["watch-rebuild"] = (id, request2) => {
1098
- try {
1099
- let watchResponse = request2.args;
1100
- let result2 = {
1101
- errors: replaceDetailsInMessages(watchResponse.errors, details),
1102
- warnings: replaceDetailsInMessages(watchResponse.warnings, details)
1103
- };
1104
- copyResponseToResult(watchResponse, result2);
1105
- runOnEndCallbacks(result2, logPluginError, () => {
1106
- if (result2.errors.length > 0) {
1107
- if (watch.onRebuild)
1108
- watch.onRebuild(failureErrorWithLog("Build failed", result2.errors, result2.warnings), null);
1109
- return;
1110
- }
1111
- result2.stop = stop;
1112
- if (watch.onRebuild)
1113
- watch.onRebuild(null, result2);
1114
- });
1115
- } catch (err) {
1116
- console.error(err);
1117
- }
1100
+ return latestResultPromise;
1101
+ },
1102
+ watch: (options2 = {}) => new Promise((resolve, reject) => {
1103
+ if (!streamIn.hasFS)
1104
+ throw new Error(`Cannot use the "watch" API in this environment`);
1105
+ const keys = {};
1106
+ checkForInvalidFlags(options2, keys, `in watch() call`);
1107
+ const request2 = {
1108
+ command: "watch",
1109
+ key: buildKey
1110
+ };
1111
+ sendRequest(refs, request2, (error2) => {
1112
+ if (error2)
1113
+ reject(new Error(error2));
1114
+ else
1115
+ resolve(void 0);
1116
+ });
1117
+ }),
1118
+ serve: (options2 = {}) => new Promise((resolve, reject) => {
1119
+ if (!streamIn.hasFS)
1120
+ throw new Error(`Cannot use the "serve" API in this environment`);
1121
+ const keys = {};
1122
+ const port = getFlag(options2, keys, "port", mustBeInteger);
1123
+ const host = getFlag(options2, keys, "host", mustBeString);
1124
+ const servedir = getFlag(options2, keys, "servedir", mustBeString);
1125
+ const keyfile = getFlag(options2, keys, "keyfile", mustBeString);
1126
+ const certfile = getFlag(options2, keys, "certfile", mustBeString);
1127
+ const onRequest = getFlag(options2, keys, "onRequest", mustBeFunction);
1128
+ checkForInvalidFlags(options2, keys, `in serve() call`);
1129
+ const request2 = {
1130
+ command: "serve",
1131
+ key: buildKey,
1132
+ onRequest: !!onRequest
1133
+ };
1134
+ if (port !== void 0)
1135
+ request2.port = port;
1136
+ if (host !== void 0)
1137
+ request2.host = host;
1138
+ if (servedir !== void 0)
1139
+ request2.servedir = servedir;
1140
+ if (keyfile !== void 0)
1141
+ request2.keyfile = keyfile;
1142
+ if (certfile !== void 0)
1143
+ request2.certfile = certfile;
1144
+ sendRequest(refs, request2, (error2, response2) => {
1145
+ if (error2)
1146
+ return reject(new Error(error2));
1147
+ if (onRequest) {
1148
+ requestCallbacks["serve-request"] = (id, request3) => {
1149
+ onRequest(request3.args);
1118
1150
  sendResponse(id, {});
1119
1151
  };
1120
1152
  }
1121
- }
1122
- result.stop = stop;
1123
- }
1124
- callback2(null, result);
1125
- });
1126
- };
1127
- if (write && streamIn.isWriteUnavailable)
1128
- throw new Error(`The "write" option is unavailable in this environment`);
1129
- if (incremental && streamIn.isSync)
1130
- throw new Error(`Cannot use "incremental" with a synchronous build`);
1131
- if (watch && streamIn.isSync)
1132
- throw new Error(`Cannot use "watch" with a synchronous build`);
1133
- sendRequest(refs, request, (error, response) => {
1134
- if (error)
1135
- return callback(new Error(error), null);
1136
- if (serve2) {
1137
- let serveResponse = response;
1138
- let isStopped = false;
1139
- refs.ref();
1140
- let result = {
1141
- port: serveResponse.port,
1142
- host: serveResponse.host,
1143
- wait: serve2.wait,
1144
- stop() {
1145
- if (isStopped)
1146
- return;
1147
- isStopped = true;
1148
- serve2.stop();
1153
+ resolve(response2);
1154
+ });
1155
+ }),
1156
+ cancel: () => new Promise((resolve) => {
1157
+ if (didDispose)
1158
+ return resolve();
1159
+ const request2 = {
1160
+ command: "cancel",
1161
+ key: buildKey
1162
+ };
1163
+ sendRequest(refs, request2, () => {
1164
+ resolve();
1165
+ });
1166
+ }),
1167
+ dispose: () => new Promise((resolve) => {
1168
+ if (didDispose)
1169
+ return resolve();
1170
+ didDispose = true;
1171
+ const request2 = {
1172
+ command: "dispose",
1173
+ key: buildKey
1174
+ };
1175
+ sendRequest(refs, request2, () => {
1176
+ resolve();
1177
+ scheduleOnDisposeCallbacks();
1149
1178
  refs.unref();
1150
- }
1151
- };
1152
- refs.ref();
1153
- serve2.wait.then(refs.unref, refs.unref);
1154
- return callback(null, result);
1155
- }
1156
- return buildResponseToResult(response, callback);
1179
+ });
1180
+ })
1181
+ };
1182
+ refs.ref();
1183
+ callback(null, result);
1157
1184
  });
1158
1185
  }
1159
1186
  }
1160
- var buildServeData = (buildKey, sendRequest, sendResponse, refs, requestCallbacks, options, request) => {
1161
- let keys = {};
1162
- let port = getFlag(options, keys, "port", mustBeInteger);
1163
- let host = getFlag(options, keys, "host", mustBeString);
1164
- let servedir = getFlag(options, keys, "servedir", mustBeString);
1165
- let onRequest = getFlag(options, keys, "onRequest", mustBeFunction);
1166
- let wait = new Promise((resolve, reject) => {
1167
- requestCallbacks["serve-wait"] = (id, request2) => {
1168
- if (request2.error !== null)
1169
- reject(new Error(request2.error));
1170
- else
1171
- resolve();
1172
- sendResponse(id, {});
1173
- };
1174
- });
1175
- request.serve = {};
1176
- checkForInvalidFlags(options, keys, `in serve() call`);
1177
- if (port !== void 0)
1178
- request.serve.port = port;
1179
- if (host !== void 0)
1180
- request.serve.host = host;
1181
- if (servedir !== void 0)
1182
- request.serve.servedir = servedir;
1183
- requestCallbacks["serve-request"] = (id, request2) => {
1184
- if (onRequest)
1185
- onRequest(request2.args);
1186
- sendResponse(id, {});
1187
- };
1188
- return {
1189
- wait,
1190
- stop() {
1191
- sendRequest(refs, { command: "serve-stop", key: buildKey }, () => {
1192
- });
1193
- }
1194
- };
1195
- };
1196
1187
  var handlePlugins = async (buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, initialOptions, plugins, details) => {
1197
1188
  let onStartCallbacks = [];
1198
1189
  let onEndCallbacks = [];
1199
1190
  let onResolveCallbacks = {};
1200
1191
  let onLoadCallbacks = {};
1192
+ let onDisposeCallbacks = [];
1201
1193
  let nextCallbackID = 0;
1202
1194
  let i = 0;
1203
1195
  let requestPlugins = [];
@@ -1217,6 +1209,8 @@ var handlePlugins = async (buildKey, sendRequest, sendResponse, refs, streamIn,
1217
1209
  checkForInvalidFlags(item, keys, `on plugin ${quote(name)}`);
1218
1210
  let plugin = {
1219
1211
  name,
1212
+ onStart: false,
1213
+ onEnd: false,
1220
1214
  onResolve: [],
1221
1215
  onLoad: []
1222
1216
  };
@@ -1279,11 +1273,13 @@ var handlePlugins = async (buildKey, sendRequest, sendResponse, refs, streamIn,
1279
1273
  let registeredText = `This error came from the "onStart" callback registered here:`;
1280
1274
  let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onStart");
1281
1275
  onStartCallbacks.push({ name, callback, note: registeredNote });
1276
+ plugin.onStart = true;
1282
1277
  },
1283
1278
  onEnd(callback) {
1284
1279
  let registeredText = `This error came from the "onEnd" callback registered here:`;
1285
1280
  let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onEnd");
1286
1281
  onEndCallbacks.push({ name, callback, note: registeredNote });
1282
+ plugin.onEnd = true;
1287
1283
  },
1288
1284
  onResolve(options, callback) {
1289
1285
  let registeredText = `This error came from the "onResolve" callback registered here:`;
@@ -1311,6 +1307,9 @@ var handlePlugins = async (buildKey, sendRequest, sendResponse, refs, streamIn,
1311
1307
  onLoadCallbacks[id] = { name, callback, note: registeredNote };
1312
1308
  plugin.onLoad.push({ id, filter: filter.source, namespace: namespace || "" });
1313
1309
  },
1310
+ onDispose(callback) {
1311
+ onDisposeCallbacks.push(callback);
1312
+ },
1314
1313
  esbuild: streamIn.esbuild
1315
1314
  });
1316
1315
  if (promise)
@@ -1459,25 +1458,62 @@ var handlePlugins = async (buildKey, sendRequest, sendResponse, refs, streamIn,
1459
1458
  }
1460
1459
  sendResponse(id, response);
1461
1460
  };
1462
- let runOnEndCallbacks = (result, logPluginError, done) => done();
1461
+ let runOnEndCallbacks = (result, done) => done([], []);
1463
1462
  if (onEndCallbacks.length > 0) {
1464
- runOnEndCallbacks = (result, logPluginError, done) => {
1463
+ runOnEndCallbacks = (result, done) => {
1465
1464
  (async () => {
1465
+ const onEndErrors = [];
1466
+ const onEndWarnings = [];
1466
1467
  for (const { name, callback, note } of onEndCallbacks) {
1468
+ let newErrors;
1469
+ let newWarnings;
1467
1470
  try {
1468
- await callback(result);
1471
+ const value = await callback(result);
1472
+ if (value != null) {
1473
+ if (typeof value !== "object")
1474
+ throw new Error(`Expected onEnd() callback in plugin ${quote(name)} to return an object`);
1475
+ let keys = {};
1476
+ let errors = getFlag(value, keys, "errors", mustBeArray);
1477
+ let warnings = getFlag(value, keys, "warnings", mustBeArray);
1478
+ checkForInvalidFlags(value, keys, `from onEnd() callback in plugin ${quote(name)}`);
1479
+ if (errors != null)
1480
+ newErrors = sanitizeMessages(errors, "errors", details, name);
1481
+ if (warnings != null)
1482
+ newWarnings = sanitizeMessages(warnings, "warnings", details, name);
1483
+ }
1469
1484
  } catch (e) {
1470
- result.errors.push(await new Promise((resolve) => logPluginError(e, name, note && note(), resolve)));
1485
+ newErrors = [extractErrorMessageV8(e, streamIn, details, note && note(), name)];
1486
+ }
1487
+ if (newErrors) {
1488
+ onEndErrors.push(...newErrors);
1489
+ try {
1490
+ result.errors.push(...newErrors);
1491
+ } catch {
1492
+ }
1493
+ }
1494
+ if (newWarnings) {
1495
+ onEndWarnings.push(...newWarnings);
1496
+ try {
1497
+ result.warnings.push(...newWarnings);
1498
+ } catch {
1499
+ }
1471
1500
  }
1472
1501
  }
1473
- })().then(done);
1502
+ done(onEndErrors, onEndWarnings);
1503
+ })();
1474
1504
  };
1475
1505
  }
1506
+ let scheduleOnDisposeCallbacks = () => {
1507
+ for (const cb of onDisposeCallbacks) {
1508
+ setTimeout(() => cb(), 0);
1509
+ }
1510
+ };
1476
1511
  isSetupDone = true;
1477
1512
  return {
1478
1513
  ok: true,
1479
1514
  requestPlugins,
1480
- runOnEndCallbacks
1515
+ runOnEndCallbacks,
1516
+ scheduleOnDisposeCallbacks
1481
1517
  };
1482
1518
  };
1483
1519
  function createObjectStash() {
@@ -1703,12 +1739,15 @@ if (process.env.ESBUILD_WORKER_THREADS !== "0") {
1703
1739
  } catch {
1704
1740
  }
1705
1741
  let [major, minor] = process.versions.node.split(".");
1706
- if (+major < 12 || +major === 12 && +minor < 17 || +major === 13 && +minor < 13) {
1742
+ if (
1743
+ // <v12.17.0 does not work
1744
+ +major < 12 || +major === 12 && +minor < 17 || +major === 13 && +minor < 13
1745
+ ) {
1707
1746
  worker_threads = void 0;
1708
1747
  }
1709
1748
  }
1710
1749
  var _a;
1711
- var isInternalWorkerThread = ((_a = worker_threads == null ? void 0 : worker_threads.workerData) == null ? void 0 : _a.esbuildVersion) === "0.16.10";
1750
+ var isInternalWorkerThread = ((_a = worker_threads == null ? void 0 : worker_threads.workerData) == null ? void 0 : _a.esbuildVersion) === "0.17.12";
1712
1751
  var esbuildCommandAndArgs = () => {
1713
1752
  if ((!ESBUILD_BINARY_PATH || true) && (path2.basename(__filename) !== "main.js" || path2.basename(__dirname) !== "lib")) {
1714
1753
  throw new Error(
@@ -1775,9 +1814,9 @@ var fsAsync = {
1775
1814
  }
1776
1815
  }
1777
1816
  };
1778
- var version = "0.16.10";
1817
+ var version = "0.17.12";
1779
1818
  var build = (options) => ensureServiceIsRunning().build(options);
1780
- var serve = (serveOptions, buildOptions) => ensureServiceIsRunning().serve(serveOptions, buildOptions);
1819
+ var context = (buildOptions) => ensureServiceIsRunning().context(buildOptions);
1781
1820
  var transform = (input, options) => ensureServiceIsRunning().transform(input, options);
1782
1821
  var formatMessages = (messages, options) => ensureServiceIsRunning().formatMessages(messages, options);
1783
1822
  var analyzeMetafile = (messages, options) => ensureServiceIsRunning().analyzeMetafile(messages, options);
@@ -1788,10 +1827,9 @@ var buildSync = (options) => {
1788
1827
  return workerThreadService.buildSync(options);
1789
1828
  }
1790
1829
  let result;
1791
- runServiceSync((service) => service.buildOrServe({
1830
+ runServiceSync((service) => service.buildOrContext({
1792
1831
  callName: "buildSync",
1793
1832
  refs: null,
1794
- serveOptions: null,
1795
1833
  options,
1796
1834
  isTTY: isTTY(),
1797
1835
  defaultWD,
@@ -1886,7 +1924,7 @@ var ensureServiceIsRunning = () => {
1886
1924
  if (longLivedService)
1887
1925
  return longLivedService;
1888
1926
  let [command, args] = esbuildCommandAndArgs();
1889
- let child = child_process.spawn(command, args.concat(`--service=${"0.16.10"}`, "--ping"), {
1927
+ let child = child_process.spawn(command, args.concat(`--service=${"0.17.12"}`, "--ping"), {
1890
1928
  windowsHide: true,
1891
1929
  stdio: ["pipe", "pipe", "inherit"],
1892
1930
  cwd: defaultWD
@@ -1900,7 +1938,7 @@ var ensureServiceIsRunning = () => {
1900
1938
  },
1901
1939
  readFileSync: fs2.readFileSync,
1902
1940
  isSync: false,
1903
- isWriteUnavailable: false,
1941
+ hasFS: true,
1904
1942
  esbuild: node_exports
1905
1943
  });
1906
1944
  child.stdin.on("error", afterClose);
@@ -1928,61 +1966,47 @@ var ensureServiceIsRunning = () => {
1928
1966
  }
1929
1967
  };
1930
1968
  longLivedService = {
1931
- build: (options) => {
1932
- return new Promise((resolve, reject) => {
1933
- service.buildOrServe({
1934
- callName: "build",
1935
- refs,
1936
- serveOptions: null,
1937
- options,
1938
- isTTY: isTTY(),
1939
- defaultWD,
1940
- callback: (err, res) => err ? reject(err) : resolve(res)
1941
- });
1942
- });
1943
- },
1944
- serve: (serveOptions, buildOptions) => {
1945
- if (serveOptions === null || typeof serveOptions !== "object")
1946
- throw new Error("The first argument must be an object");
1947
- return new Promise((resolve, reject) => service.buildOrServe({
1948
- callName: "serve",
1969
+ build: (options) => new Promise((resolve, reject) => {
1970
+ service.buildOrContext({
1971
+ callName: "build",
1949
1972
  refs,
1950
- serveOptions,
1951
- options: buildOptions,
1973
+ options,
1952
1974
  isTTY: isTTY(),
1953
1975
  defaultWD,
1954
1976
  callback: (err, res) => err ? reject(err) : resolve(res)
1955
- }));
1956
- },
1957
- transform: (input, options) => {
1958
- return new Promise((resolve, reject) => service.transform({
1959
- callName: "transform",
1960
- refs,
1961
- input,
1962
- options: options || {},
1963
- isTTY: isTTY(),
1964
- fs: fsAsync,
1965
- callback: (err, res) => err ? reject(err) : resolve(res)
1966
- }));
1967
- },
1968
- formatMessages: (messages, options) => {
1969
- return new Promise((resolve, reject) => service.formatMessages({
1970
- callName: "formatMessages",
1971
- refs,
1972
- messages,
1973
- options,
1974
- callback: (err, res) => err ? reject(err) : resolve(res)
1975
- }));
1976
- },
1977
- analyzeMetafile: (metafile, options) => {
1978
- return new Promise((resolve, reject) => service.analyzeMetafile({
1979
- callName: "analyzeMetafile",
1980
- refs,
1981
- metafile: typeof metafile === "string" ? metafile : JSON.stringify(metafile),
1982
- options,
1983
- callback: (err, res) => err ? reject(err) : resolve(res)
1984
- }));
1985
- }
1977
+ });
1978
+ }),
1979
+ context: (options) => new Promise((resolve, reject) => service.buildOrContext({
1980
+ callName: "context",
1981
+ refs,
1982
+ options,
1983
+ isTTY: isTTY(),
1984
+ defaultWD,
1985
+ callback: (err, res) => err ? reject(err) : resolve(res)
1986
+ })),
1987
+ transform: (input, options) => new Promise((resolve, reject) => service.transform({
1988
+ callName: "transform",
1989
+ refs,
1990
+ input,
1991
+ options: options || {},
1992
+ isTTY: isTTY(),
1993
+ fs: fsAsync,
1994
+ callback: (err, res) => err ? reject(err) : resolve(res)
1995
+ })),
1996
+ formatMessages: (messages, options) => new Promise((resolve, reject) => service.formatMessages({
1997
+ callName: "formatMessages",
1998
+ refs,
1999
+ messages,
2000
+ options,
2001
+ callback: (err, res) => err ? reject(err) : resolve(res)
2002
+ })),
2003
+ analyzeMetafile: (metafile, options) => new Promise((resolve, reject) => service.analyzeMetafile({
2004
+ callName: "analyzeMetafile",
2005
+ refs,
2006
+ metafile: typeof metafile === "string" ? metafile : JSON.stringify(metafile),
2007
+ options,
2008
+ callback: (err, res) => err ? reject(err) : resolve(res)
2009
+ }))
1986
2010
  };
1987
2011
  return longLivedService;
1988
2012
  };
@@ -1996,14 +2020,18 @@ var runServiceSync = (callback) => {
1996
2020
  stdin = bytes;
1997
2021
  },
1998
2022
  isSync: true,
1999
- isWriteUnavailable: false,
2023
+ hasFS: true,
2000
2024
  esbuild: node_exports
2001
2025
  });
2002
2026
  callback(service);
2003
- let stdout = child_process.execFileSync(command, args.concat(`--service=${"0.16.10"}`), {
2027
+ let stdout = child_process.execFileSync(command, args.concat(`--service=${"0.17.12"}`), {
2004
2028
  cwd: defaultWD,
2005
2029
  windowsHide: true,
2006
2030
  input: stdin,
2031
+ // We don't know how large the output could be. If it's too large, the
2032
+ // command will fail with ENOBUFS. Reserve 16mb for now since that feels
2033
+ // like it should be enough. Also allow overriding this with an environment
2034
+ // variable.
2007
2035
  maxBuffer: +process.env.ESBUILD_MAX_BUFFER || 16 * 1024 * 1024
2008
2036
  });
2009
2037
  readFromStdout(stdout);
@@ -2016,8 +2044,17 @@ var workerThreadService = null;
2016
2044
  var startWorkerThreadService = (worker_threads2) => {
2017
2045
  let { port1: mainPort, port2: workerPort } = new worker_threads2.MessageChannel();
2018
2046
  let worker = new worker_threads2.Worker(__filename, {
2019
- workerData: { workerPort, defaultWD, esbuildVersion: "0.16.10" },
2047
+ workerData: { workerPort, defaultWD, esbuildVersion: "0.17.12" },
2020
2048
  transferList: [workerPort],
2049
+ // From node's documentation: https://nodejs.org/api/worker_threads.html
2050
+ //
2051
+ // Take care when launching worker threads from preload scripts (scripts loaded
2052
+ // and run using the `-r` command line flag). Unless the `execArgv` option is
2053
+ // explicitly set, new Worker threads automatically inherit the command line flags
2054
+ // from the running process and will preload the same preload scripts as the main
2055
+ // thread. If the preload script unconditionally launches a worker thread, every
2056
+ // thread spawned will spawn another until the application crashes.
2057
+ //
2021
2058
  execArgv: []
2022
2059
  });
2023
2060
  let nextID = 0;
@@ -2033,14 +2070,8 @@ error: ${text}`);
2033
2070
  if (!options)
2034
2071
  return;
2035
2072
  let plugins = options.plugins;
2036
- let incremental = options.incremental;
2037
- let watch = options.watch;
2038
2073
  if (plugins && plugins.length > 0)
2039
2074
  throw fakeBuildError(`Cannot use plugins in synchronous API calls`);
2040
- if (incremental)
2041
- throw fakeBuildError(`Cannot use "incremental" with a synchronous build`);
2042
- if (watch)
2043
- throw fakeBuildError(`Cannot use "watch" with a synchronous build`);
2044
2075
  };
2045
2076
  let applyProperties = (object, properties) => {
2046
2077
  for (let key in properties) {
@@ -2145,10 +2176,10 @@ var node_default = node_exports;
2145
2176
  analyzeMetafileSync,
2146
2177
  build,
2147
2178
  buildSync,
2179
+ context,
2148
2180
  formatMessages,
2149
2181
  formatMessagesSync,
2150
2182
  initialize,
2151
- serve,
2152
2183
  transform,
2153
2184
  transformSync,
2154
2185
  version