main.js 51 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489
  1. var __defProp = Object.defineProperty;
  2. var __assign = Object.assign;
  3. var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
  4. var __export = (target, all) => {
  5. for (var name in all)
  6. __defProp(target, name, {get: all[name], enumerable: true});
  7. };
  8. var __async = (__this, __arguments, generator) => {
  9. return new Promise((resolve, reject) => {
  10. var fulfilled = (value) => {
  11. try {
  12. step(generator.next(value));
  13. } catch (e) {
  14. reject(e);
  15. }
  16. };
  17. var rejected = (value) => {
  18. try {
  19. step(generator.throw(value));
  20. } catch (e) {
  21. reject(e);
  22. }
  23. };
  24. var step = (result) => {
  25. return result.done ? resolve(result.value) : Promise.resolve(result.value).then(fulfilled, rejected);
  26. };
  27. step((generator = generator.apply(__this, __arguments)).next());
  28. });
  29. };
  30. // lib/node.ts
  31. __markAsModule(exports);
  32. __export(exports, {
  33. build: () => build,
  34. buildSync: () => buildSync,
  35. serve: () => serve,
  36. startService: () => startService,
  37. transform: () => transform,
  38. transformSync: () => transformSync,
  39. version: () => version
  40. });
  41. // lib/stdio_protocol.ts
  42. function encodePacket(packet) {
  43. let visit = (value) => {
  44. if (value === null) {
  45. bb.write8(0);
  46. } else if (typeof value === "boolean") {
  47. bb.write8(1);
  48. bb.write8(+value);
  49. } else if (typeof value === "number") {
  50. bb.write8(2);
  51. bb.write32(value | 0);
  52. } else if (typeof value === "string") {
  53. bb.write8(3);
  54. bb.write(encodeUTF8(value));
  55. } else if (value instanceof Uint8Array) {
  56. bb.write8(4);
  57. bb.write(value);
  58. } else if (value instanceof Array) {
  59. bb.write8(5);
  60. bb.write32(value.length);
  61. for (let item of value) {
  62. visit(item);
  63. }
  64. } else {
  65. let keys = Object.keys(value);
  66. bb.write8(6);
  67. bb.write32(keys.length);
  68. for (let key of keys) {
  69. bb.write(encodeUTF8(key));
  70. visit(value[key]);
  71. }
  72. }
  73. };
  74. let bb = new ByteBuffer();
  75. bb.write32(0);
  76. bb.write32(packet.id << 1 | +!packet.isRequest);
  77. visit(packet.value);
  78. writeUInt32LE(bb.buf, bb.len - 4, 0);
  79. return bb.buf.subarray(0, bb.len);
  80. }
  81. function decodePacket(bytes) {
  82. let visit = () => {
  83. switch (bb.read8()) {
  84. case 0:
  85. return null;
  86. case 1:
  87. return !!bb.read8();
  88. case 2:
  89. return bb.read32();
  90. case 3:
  91. return decodeUTF8(bb.read());
  92. case 4:
  93. return bb.read();
  94. case 5: {
  95. let count = bb.read32();
  96. let value2 = [];
  97. for (let i = 0; i < count; i++) {
  98. value2.push(visit());
  99. }
  100. return value2;
  101. }
  102. case 6: {
  103. let count = bb.read32();
  104. let value2 = {};
  105. for (let i = 0; i < count; i++) {
  106. value2[decodeUTF8(bb.read())] = visit();
  107. }
  108. return value2;
  109. }
  110. default:
  111. throw new Error("Invalid packet");
  112. }
  113. };
  114. let bb = new ByteBuffer(bytes);
  115. let id = bb.read32();
  116. let isRequest = (id & 1) === 0;
  117. id >>>= 1;
  118. let value = visit();
  119. if (bb.ptr !== bytes.length) {
  120. throw new Error("Invalid packet");
  121. }
  122. return {id, isRequest, value};
  123. }
  124. var ByteBuffer = class {
  125. constructor(buf = new Uint8Array(1024)) {
  126. this.buf = buf;
  127. this.len = 0;
  128. this.ptr = 0;
  129. }
  130. _write(delta) {
  131. if (this.len + delta > this.buf.length) {
  132. let clone = new Uint8Array((this.len + delta) * 2);
  133. clone.set(this.buf);
  134. this.buf = clone;
  135. }
  136. this.len += delta;
  137. return this.len - delta;
  138. }
  139. write8(value) {
  140. let offset = this._write(1);
  141. this.buf[offset] = value;
  142. }
  143. write32(value) {
  144. let offset = this._write(4);
  145. writeUInt32LE(this.buf, value, offset);
  146. }
  147. write(bytes) {
  148. let offset = this._write(4 + bytes.length);
  149. writeUInt32LE(this.buf, bytes.length, offset);
  150. this.buf.set(bytes, offset + 4);
  151. }
  152. _read(delta) {
  153. if (this.ptr + delta > this.buf.length) {
  154. throw new Error("Invalid packet");
  155. }
  156. this.ptr += delta;
  157. return this.ptr - delta;
  158. }
  159. read8() {
  160. return this.buf[this._read(1)];
  161. }
  162. read32() {
  163. return readUInt32LE(this.buf, this._read(4));
  164. }
  165. read() {
  166. let length = this.read32();
  167. let bytes = new Uint8Array(length);
  168. let ptr = this._read(bytes.length);
  169. bytes.set(this.buf.subarray(ptr, ptr + length));
  170. return bytes;
  171. }
  172. };
  173. var encodeUTF8;
  174. var decodeUTF8;
  175. if (typeof TextEncoder !== "undefined" && typeof TextDecoder !== "undefined") {
  176. let encoder = new TextEncoder();
  177. let decoder = new TextDecoder();
  178. encodeUTF8 = (text) => encoder.encode(text);
  179. decodeUTF8 = (bytes) => decoder.decode(bytes);
  180. } else if (typeof Buffer !== "undefined") {
  181. encodeUTF8 = (text) => Buffer.from(text);
  182. decodeUTF8 = (bytes) => Buffer.from(bytes).toString();
  183. } else {
  184. throw new Error("No UTF-8 codec found");
  185. }
  186. function readUInt32LE(buffer, offset) {
  187. return buffer[offset++] | buffer[offset++] << 8 | buffer[offset++] << 16 | buffer[offset++] << 24;
  188. }
  189. function writeUInt32LE(buffer, value, offset) {
  190. buffer[offset++] = value;
  191. buffer[offset++] = value >> 8;
  192. buffer[offset++] = value >> 16;
  193. buffer[offset++] = value >> 24;
  194. }
  195. // lib/common.ts
  196. function validateTarget(target) {
  197. target += "";
  198. if (target.indexOf(",") >= 0)
  199. throw new Error(`Invalid target: ${target}`);
  200. return target;
  201. }
  202. var canBeAnything = () => null;
  203. var mustBeBoolean = (value) => typeof value === "boolean" ? null : "a boolean";
  204. var mustBeBooleanOrObject = (value) => typeof value === "boolean" || typeof value === "object" && !Array.isArray(value) ? null : "a boolean or an object";
  205. var mustBeString = (value) => typeof value === "string" ? null : "a string";
  206. var mustBeRegExp = (value) => value instanceof RegExp ? null : "a RegExp object";
  207. var mustBeInteger = (value) => typeof value === "number" && value === (value | 0) ? null : "an integer";
  208. var mustBeFunction = (value) => typeof value === "function" ? null : "a function";
  209. var mustBeArray = (value) => Array.isArray(value) ? null : "an array";
  210. var mustBeObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value) ? null : "an object";
  211. var mustBeObjectOrNull = (value) => typeof value === "object" && !Array.isArray(value) ? null : "an object or null";
  212. var mustBeStringOrBoolean = (value) => typeof value === "string" || typeof value === "boolean" ? null : "a string or a boolean";
  213. var mustBeStringOrObject = (value) => typeof value === "string" || typeof value === "object" && value !== null && !Array.isArray(value) ? null : "a string or an object";
  214. var mustBeStringOrArray = (value) => typeof value === "string" || Array.isArray(value) ? null : "a string or an array";
  215. var mustBeStringOrUint8Array = (value) => typeof value === "string" || value instanceof Uint8Array ? null : "a string or a Uint8Array";
  216. function getFlag(object, keys, key, mustBeFn) {
  217. let value = object[key];
  218. keys[key + ""] = true;
  219. if (value === void 0)
  220. return void 0;
  221. let mustBe = mustBeFn(value);
  222. if (mustBe !== null)
  223. throw new Error(`"${key}" must be ${mustBe}`);
  224. return value;
  225. }
  226. function checkForInvalidFlags(object, keys, where) {
  227. for (let key in object) {
  228. if (!(key in keys)) {
  229. throw new Error(`Invalid option ${where}: "${key}"`);
  230. }
  231. }
  232. }
  233. function validateServiceOptions(options) {
  234. let keys = Object.create(null);
  235. let wasmURL = getFlag(options, keys, "wasmURL", mustBeString);
  236. let worker = getFlag(options, keys, "worker", mustBeBoolean);
  237. checkForInvalidFlags(options, keys, "in startService() call");
  238. return {
  239. wasmURL,
  240. worker
  241. };
  242. }
  243. function pushLogFlags(flags, options, keys, isTTY2, logLevelDefault) {
  244. let color = getFlag(options, keys, "color", mustBeBoolean);
  245. let logLevel = getFlag(options, keys, "logLevel", mustBeString);
  246. let errorLimit = getFlag(options, keys, "errorLimit", mustBeInteger);
  247. if (color)
  248. flags.push(`--color=${color}`);
  249. else if (isTTY2)
  250. flags.push(`--color=true`);
  251. flags.push(`--log-level=${logLevel || logLevelDefault}`);
  252. flags.push(`--error-limit=${errorLimit || 0}`);
  253. }
  254. function pushCommonFlags(flags, options, keys) {
  255. let sourcesContent = getFlag(options, keys, "sourcesContent", mustBeBoolean);
  256. let target = getFlag(options, keys, "target", mustBeStringOrArray);
  257. let format = getFlag(options, keys, "format", mustBeString);
  258. let globalName = getFlag(options, keys, "globalName", mustBeString);
  259. let minify = getFlag(options, keys, "minify", mustBeBoolean);
  260. let minifySyntax = getFlag(options, keys, "minifySyntax", mustBeBoolean);
  261. let minifyWhitespace = getFlag(options, keys, "minifyWhitespace", mustBeBoolean);
  262. let minifyIdentifiers = getFlag(options, keys, "minifyIdentifiers", mustBeBoolean);
  263. let charset = getFlag(options, keys, "charset", mustBeString);
  264. let treeShaking = getFlag(options, keys, "treeShaking", mustBeStringOrBoolean);
  265. let jsxFactory = getFlag(options, keys, "jsxFactory", mustBeString);
  266. let jsxFragment = getFlag(options, keys, "jsxFragment", mustBeString);
  267. let define = getFlag(options, keys, "define", mustBeObject);
  268. let pure = getFlag(options, keys, "pure", mustBeArray);
  269. let avoidTDZ = getFlag(options, keys, "avoidTDZ", mustBeBoolean);
  270. let keepNames = getFlag(options, keys, "keepNames", mustBeBoolean);
  271. let banner = getFlag(options, keys, "banner", mustBeString);
  272. let footer = getFlag(options, keys, "footer", mustBeString);
  273. if (sourcesContent !== void 0)
  274. flags.push(`--sources-content=${sourcesContent}`);
  275. if (target) {
  276. if (Array.isArray(target))
  277. flags.push(`--target=${Array.from(target).map(validateTarget).join(",")}`);
  278. else
  279. flags.push(`--target=${validateTarget(target)}`);
  280. }
  281. if (format)
  282. flags.push(`--format=${format}`);
  283. if (globalName)
  284. flags.push(`--global-name=${globalName}`);
  285. if (minify)
  286. flags.push("--minify");
  287. if (minifySyntax)
  288. flags.push("--minify-syntax");
  289. if (minifyWhitespace)
  290. flags.push("--minify-whitespace");
  291. if (minifyIdentifiers)
  292. flags.push("--minify-identifiers");
  293. if (charset)
  294. flags.push(`--charset=${charset}`);
  295. if (treeShaking !== void 0 && treeShaking !== true)
  296. flags.push(`--tree-shaking=${treeShaking}`);
  297. if (jsxFactory)
  298. flags.push(`--jsx-factory=${jsxFactory}`);
  299. if (jsxFragment)
  300. flags.push(`--jsx-fragment=${jsxFragment}`);
  301. if (define) {
  302. for (let key in define) {
  303. if (key.indexOf("=") >= 0)
  304. throw new Error(`Invalid define: ${key}`);
  305. flags.push(`--define:${key}=${define[key]}`);
  306. }
  307. }
  308. if (pure)
  309. for (let fn of pure)
  310. flags.push(`--pure:${fn}`);
  311. if (avoidTDZ)
  312. flags.push(`--avoid-tdz`);
  313. if (keepNames)
  314. flags.push(`--keep-names`);
  315. if (banner)
  316. flags.push(`--banner=${banner}`);
  317. if (footer)
  318. flags.push(`--footer=${footer}`);
  319. }
  320. function flagsForBuildOptions(callName, options, isTTY2, logLevelDefault, writeDefault) {
  321. var _a;
  322. let flags = [];
  323. let keys = Object.create(null);
  324. let stdinContents = null;
  325. let stdinResolveDir = null;
  326. let watchMode = null;
  327. pushLogFlags(flags, options, keys, isTTY2, logLevelDefault);
  328. pushCommonFlags(flags, options, keys);
  329. let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean);
  330. let bundle = getFlag(options, keys, "bundle", mustBeBoolean);
  331. let watch = getFlag(options, keys, "watch", mustBeBooleanOrObject);
  332. let splitting = getFlag(options, keys, "splitting", mustBeBoolean);
  333. let preserveSymlinks = getFlag(options, keys, "preserveSymlinks", mustBeBoolean);
  334. let metafile = getFlag(options, keys, "metafile", mustBeString);
  335. let outfile = getFlag(options, keys, "outfile", mustBeString);
  336. let outdir = getFlag(options, keys, "outdir", mustBeString);
  337. let outbase = getFlag(options, keys, "outbase", mustBeString);
  338. let platform = getFlag(options, keys, "platform", mustBeString);
  339. let tsconfig = getFlag(options, keys, "tsconfig", mustBeString);
  340. let resolveExtensions = getFlag(options, keys, "resolveExtensions", mustBeArray);
  341. let nodePathsInput = getFlag(options, keys, "nodePaths", mustBeArray);
  342. let mainFields = getFlag(options, keys, "mainFields", mustBeArray);
  343. let external = getFlag(options, keys, "external", mustBeArray);
  344. let loader = getFlag(options, keys, "loader", mustBeObject);
  345. let outExtension = getFlag(options, keys, "outExtension", mustBeObject);
  346. let publicPath = getFlag(options, keys, "publicPath", mustBeString);
  347. let chunkNames = getFlag(options, keys, "chunkNames", mustBeString);
  348. let assetNames = getFlag(options, keys, "assetNames", mustBeString);
  349. let inject = getFlag(options, keys, "inject", mustBeArray);
  350. let entryPoints = getFlag(options, keys, "entryPoints", mustBeArray);
  351. let absWorkingDir = getFlag(options, keys, "absWorkingDir", mustBeString);
  352. let stdin = getFlag(options, keys, "stdin", mustBeObject);
  353. let write = (_a = getFlag(options, keys, "write", mustBeBoolean)) != null ? _a : writeDefault;
  354. let incremental = getFlag(options, keys, "incremental", mustBeBoolean) === true;
  355. let plugins = getFlag(options, keys, "plugins", mustBeArray);
  356. checkForInvalidFlags(options, keys, `in ${callName}() call`);
  357. if (sourcemap)
  358. flags.push(`--sourcemap${sourcemap === true ? "" : `=${sourcemap}`}`);
  359. if (bundle)
  360. flags.push("--bundle");
  361. if (watch) {
  362. flags.push("--watch");
  363. if (typeof watch === "boolean") {
  364. watchMode = {};
  365. } else {
  366. let watchKeys = Object.create(null);
  367. let onRebuild = getFlag(watch, watchKeys, "onRebuild", mustBeFunction);
  368. checkForInvalidFlags(watch, watchKeys, `on "watch" in ${callName}() call`);
  369. watchMode = {onRebuild};
  370. }
  371. }
  372. if (splitting)
  373. flags.push("--splitting");
  374. if (preserveSymlinks)
  375. flags.push("--preserve-symlinks");
  376. if (metafile)
  377. flags.push(`--metafile=${metafile}`);
  378. if (outfile)
  379. flags.push(`--outfile=${outfile}`);
  380. if (outdir)
  381. flags.push(`--outdir=${outdir}`);
  382. if (outbase)
  383. flags.push(`--outbase=${outbase}`);
  384. if (platform)
  385. flags.push(`--platform=${platform}`);
  386. if (tsconfig)
  387. flags.push(`--tsconfig=${tsconfig}`);
  388. if (resolveExtensions) {
  389. let values = [];
  390. for (let value of resolveExtensions) {
  391. value += "";
  392. if (value.indexOf(",") >= 0)
  393. throw new Error(`Invalid resolve extension: ${value}`);
  394. values.push(value);
  395. }
  396. flags.push(`--resolve-extensions=${values.join(",")}`);
  397. }
  398. if (publicPath)
  399. flags.push(`--public-path=${publicPath}`);
  400. if (chunkNames)
  401. flags.push(`--chunk-names=${chunkNames}`);
  402. if (assetNames)
  403. flags.push(`--asset-names=${assetNames}`);
  404. if (mainFields) {
  405. let values = [];
  406. for (let value of mainFields) {
  407. value += "";
  408. if (value.indexOf(",") >= 0)
  409. throw new Error(`Invalid main field: ${value}`);
  410. values.push(value);
  411. }
  412. flags.push(`--main-fields=${values.join(",")}`);
  413. }
  414. if (external)
  415. for (let name of external)
  416. flags.push(`--external:${name}`);
  417. if (inject)
  418. for (let path2 of inject)
  419. flags.push(`--inject:${path2}`);
  420. if (loader) {
  421. for (let ext in loader) {
  422. if (ext.indexOf("=") >= 0)
  423. throw new Error(`Invalid loader extension: ${ext}`);
  424. flags.push(`--loader:${ext}=${loader[ext]}`);
  425. }
  426. }
  427. if (outExtension) {
  428. for (let ext in outExtension) {
  429. if (ext.indexOf("=") >= 0)
  430. throw new Error(`Invalid out extension: ${ext}`);
  431. flags.push(`--out-extension:${ext}=${outExtension[ext]}`);
  432. }
  433. }
  434. if (entryPoints) {
  435. for (let entryPoint of entryPoints) {
  436. entryPoint += "";
  437. if (entryPoint.startsWith("-"))
  438. throw new Error(`Invalid entry point: ${entryPoint}`);
  439. flags.push(entryPoint);
  440. }
  441. }
  442. if (stdin) {
  443. let stdinKeys = Object.create(null);
  444. let contents = getFlag(stdin, stdinKeys, "contents", mustBeString);
  445. let resolveDir = getFlag(stdin, stdinKeys, "resolveDir", mustBeString);
  446. let sourcefile = getFlag(stdin, stdinKeys, "sourcefile", mustBeString);
  447. let loader2 = getFlag(stdin, stdinKeys, "loader", mustBeString);
  448. checkForInvalidFlags(stdin, stdinKeys, 'in "stdin" object');
  449. if (sourcefile)
  450. flags.push(`--sourcefile=${sourcefile}`);
  451. if (loader2)
  452. flags.push(`--loader=${loader2}`);
  453. if (resolveDir)
  454. stdinResolveDir = resolveDir + "";
  455. stdinContents = contents ? contents + "" : "";
  456. }
  457. let nodePaths = [];
  458. if (nodePathsInput) {
  459. for (let value of nodePathsInput) {
  460. value += "";
  461. nodePaths.push(value);
  462. }
  463. }
  464. return {
  465. flags,
  466. write,
  467. plugins,
  468. stdinContents,
  469. stdinResolveDir,
  470. absWorkingDir,
  471. incremental,
  472. nodePaths,
  473. watch: watchMode
  474. };
  475. }
  476. function flagsForTransformOptions(callName, options, isTTY2, logLevelDefault) {
  477. let flags = [];
  478. let keys = Object.create(null);
  479. pushLogFlags(flags, options, keys, isTTY2, logLevelDefault);
  480. pushCommonFlags(flags, options, keys);
  481. let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean);
  482. let tsconfigRaw = getFlag(options, keys, "tsconfigRaw", mustBeStringOrObject);
  483. let sourcefile = getFlag(options, keys, "sourcefile", mustBeString);
  484. let loader = getFlag(options, keys, "loader", mustBeString);
  485. checkForInvalidFlags(options, keys, `in ${callName}() call`);
  486. if (sourcemap)
  487. flags.push(`--sourcemap=${sourcemap === true ? "external" : sourcemap}`);
  488. if (tsconfigRaw)
  489. flags.push(`--tsconfig-raw=${typeof tsconfigRaw === "string" ? tsconfigRaw : JSON.stringify(tsconfigRaw)}`);
  490. if (sourcefile)
  491. flags.push(`--sourcefile=${sourcefile}`);
  492. if (loader)
  493. flags.push(`--loader=${loader}`);
  494. return flags;
  495. }
  496. function createChannel(streamIn) {
  497. let responseCallbacks = new Map();
  498. let pluginCallbacks = new Map();
  499. let watchCallbacks = new Map();
  500. let serveCallbacks = new Map();
  501. let nextServeID = 0;
  502. let isClosed = false;
  503. let nextRequestID = 0;
  504. let nextBuildKey = 0;
  505. let stdout = new Uint8Array(16 * 1024);
  506. let stdoutUsed = 0;
  507. let readFromStdout = (chunk) => {
  508. let limit = stdoutUsed + chunk.length;
  509. if (limit > stdout.length) {
  510. let swap = new Uint8Array(limit * 2);
  511. swap.set(stdout);
  512. stdout = swap;
  513. }
  514. stdout.set(chunk, stdoutUsed);
  515. stdoutUsed += chunk.length;
  516. let offset = 0;
  517. while (offset + 4 <= stdoutUsed) {
  518. let length = readUInt32LE(stdout, offset);
  519. if (offset + 4 + length > stdoutUsed) {
  520. break;
  521. }
  522. offset += 4;
  523. handleIncomingPacket(stdout.slice(offset, offset + length));
  524. offset += length;
  525. }
  526. if (offset > 0) {
  527. stdout.set(stdout.slice(offset));
  528. stdoutUsed -= offset;
  529. }
  530. };
  531. let afterClose = () => {
  532. isClosed = true;
  533. for (let callback of responseCallbacks.values()) {
  534. callback("The service was stopped", null);
  535. }
  536. responseCallbacks.clear();
  537. for (let callbacks of serveCallbacks.values()) {
  538. callbacks.onWait("The service was stopped");
  539. }
  540. serveCallbacks.clear();
  541. for (let callback of watchCallbacks.values()) {
  542. try {
  543. callback(new Error("The service was stopped"), null);
  544. } catch (e) {
  545. console.error(e);
  546. }
  547. }
  548. watchCallbacks.clear();
  549. };
  550. let sendRequest = (refs, value, callback) => {
  551. if (isClosed)
  552. return callback("The service is no longer running", null);
  553. let id = nextRequestID++;
  554. responseCallbacks.set(id, (error, response) => {
  555. try {
  556. callback(error, response);
  557. } finally {
  558. if (refs)
  559. refs.unref();
  560. }
  561. });
  562. if (refs)
  563. refs.ref();
  564. streamIn.writeToStdin(encodePacket({id, isRequest: true, value}));
  565. };
  566. let sendResponse = (id, value) => {
  567. if (isClosed)
  568. throw new Error("The service is no longer running");
  569. streamIn.writeToStdin(encodePacket({id, isRequest: false, value}));
  570. };
  571. let handleRequest = (id, request) => __async(this, null, function* () {
  572. try {
  573. switch (request.command) {
  574. case "ping": {
  575. sendResponse(id, {});
  576. break;
  577. }
  578. case "resolve": {
  579. let callback = pluginCallbacks.get(request.key);
  580. if (!callback)
  581. sendResponse(id, {});
  582. else
  583. sendResponse(id, yield callback(request));
  584. break;
  585. }
  586. case "load": {
  587. let callback = pluginCallbacks.get(request.key);
  588. if (!callback)
  589. sendResponse(id, {});
  590. else
  591. sendResponse(id, yield callback(request));
  592. break;
  593. }
  594. case "serve-request": {
  595. let callbacks = serveCallbacks.get(request.serveID);
  596. if (callbacks && callbacks.onRequest)
  597. callbacks.onRequest(request.args);
  598. sendResponse(id, {});
  599. break;
  600. }
  601. case "serve-wait": {
  602. let callbacks = serveCallbacks.get(request.serveID);
  603. if (callbacks)
  604. callbacks.onWait(request.error);
  605. sendResponse(id, {});
  606. break;
  607. }
  608. case "watch-rebuild": {
  609. let callback = watchCallbacks.get(request.watchID);
  610. try {
  611. if (callback)
  612. callback(null, request.args);
  613. } catch (err) {
  614. console.error(err);
  615. }
  616. sendResponse(id, {});
  617. break;
  618. }
  619. default:
  620. throw new Error(`Invalid command: ` + request.command);
  621. }
  622. } catch (e) {
  623. sendResponse(id, {errors: [extractErrorMessageV8(e, streamIn, null, void 0)]});
  624. }
  625. });
  626. let isFirstPacket = true;
  627. let handleIncomingPacket = (bytes) => {
  628. if (isFirstPacket) {
  629. isFirstPacket = false;
  630. let binaryVersion = String.fromCharCode(...bytes);
  631. if (binaryVersion !== "0.8.53") {
  632. throw new Error(`Cannot start service: Host version "${"0.8.53"}" does not match binary version ${JSON.stringify(binaryVersion)}`);
  633. }
  634. return;
  635. }
  636. let packet = decodePacket(bytes);
  637. if (packet.isRequest) {
  638. handleRequest(packet.id, packet.value);
  639. } else {
  640. let callback = responseCallbacks.get(packet.id);
  641. responseCallbacks.delete(packet.id);
  642. if (packet.value.error)
  643. callback(packet.value.error, {});
  644. else
  645. callback(null, packet.value);
  646. }
  647. };
  648. let handlePlugins = (plugins, request, buildKey, stash) => {
  649. if (streamIn.isSync)
  650. throw new Error("Cannot use plugins in synchronous API calls");
  651. let onResolveCallbacks = {};
  652. let onLoadCallbacks = {};
  653. let nextCallbackID = 0;
  654. let i = 0;
  655. request.plugins = [];
  656. for (let item of plugins) {
  657. let keys = {};
  658. if (typeof item !== "object")
  659. throw new Error(`Plugin at index ${i} must be an object`);
  660. let name = getFlag(item, keys, "name", mustBeString);
  661. let setup = getFlag(item, keys, "setup", mustBeFunction);
  662. if (typeof name !== "string" || name === "")
  663. throw new Error(`Plugin at index ${i} is missing a name`);
  664. if (typeof setup !== "function")
  665. throw new Error(`[${name}] Plugin is missing a setup function`);
  666. checkForInvalidFlags(item, keys, `on plugin ${JSON.stringify(name)}`);
  667. let plugin = {
  668. name,
  669. onResolve: [],
  670. onLoad: []
  671. };
  672. i++;
  673. setup({
  674. onResolve(options, callback2) {
  675. let registeredText = `This error came from the "onResolve" callback registered here`;
  676. let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onResolve");
  677. let keys2 = {};
  678. let filter = getFlag(options, keys2, "filter", mustBeRegExp);
  679. let namespace = getFlag(options, keys2, "namespace", mustBeString);
  680. checkForInvalidFlags(options, keys2, `in onResolve() call for plugin ${JSON.stringify(name)}`);
  681. if (filter == null)
  682. throw new Error(`[${plugin.name}] onResolve() call is missing a filter`);
  683. let id = nextCallbackID++;
  684. onResolveCallbacks[id] = {name, callback: callback2, note: registeredNote};
  685. plugin.onResolve.push({id, filter: filter.source, namespace: namespace || ""});
  686. },
  687. onLoad(options, callback2) {
  688. let registeredText = `This error came from the "onLoad" callback registered here`;
  689. let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onLoad");
  690. let keys2 = {};
  691. let filter = getFlag(options, keys2, "filter", mustBeRegExp);
  692. let namespace = getFlag(options, keys2, "namespace", mustBeString);
  693. checkForInvalidFlags(options, keys2, `in onLoad() call for plugin ${JSON.stringify(name)}`);
  694. if (filter == null)
  695. throw new Error(`[${plugin.name}] onLoad() call is missing a filter`);
  696. let id = nextCallbackID++;
  697. onLoadCallbacks[id] = {name, callback: callback2, note: registeredNote};
  698. plugin.onLoad.push({id, filter: filter.source, namespace: namespace || ""});
  699. }
  700. });
  701. request.plugins.push(plugin);
  702. }
  703. const callback = (request2) => __async(this, null, function* () {
  704. switch (request2.command) {
  705. case "resolve": {
  706. let response = {}, name, callback2, note;
  707. for (let id of request2.ids) {
  708. try {
  709. ({name, callback: callback2, note} = onResolveCallbacks[id]);
  710. let result = yield callback2({
  711. path: request2.path,
  712. importer: request2.importer,
  713. namespace: request2.namespace,
  714. resolveDir: request2.resolveDir,
  715. kind: request2.kind,
  716. pluginData: stash.load(request2.pluginData)
  717. });
  718. if (result != null) {
  719. if (typeof result !== "object")
  720. throw new Error(`Expected onResolve() callback in plugin ${JSON.stringify(name)} to return an object`);
  721. let keys = {};
  722. let pluginName = getFlag(result, keys, "pluginName", mustBeString);
  723. let path2 = getFlag(result, keys, "path", mustBeString);
  724. let namespace = getFlag(result, keys, "namespace", mustBeString);
  725. let external = getFlag(result, keys, "external", mustBeBoolean);
  726. let pluginData = getFlag(result, keys, "pluginData", canBeAnything);
  727. let errors = getFlag(result, keys, "errors", mustBeArray);
  728. let warnings = getFlag(result, keys, "warnings", mustBeArray);
  729. checkForInvalidFlags(result, keys, `from onResolve() callback in plugin ${JSON.stringify(name)}`);
  730. response.id = id;
  731. if (pluginName != null)
  732. response.pluginName = pluginName;
  733. if (path2 != null)
  734. response.path = path2;
  735. if (namespace != null)
  736. response.namespace = namespace;
  737. if (external != null)
  738. response.external = external;
  739. if (pluginData != null)
  740. response.pluginData = stash.store(pluginData);
  741. if (errors != null)
  742. response.errors = sanitizeMessages(errors, "errors", stash);
  743. if (warnings != null)
  744. response.warnings = sanitizeMessages(warnings, "warnings", stash);
  745. break;
  746. }
  747. } catch (e) {
  748. return {id, errors: [extractErrorMessageV8(e, streamIn, stash, note)]};
  749. }
  750. }
  751. return response;
  752. }
  753. case "load": {
  754. let response = {}, name, callback2, note;
  755. for (let id of request2.ids) {
  756. try {
  757. ({name, callback: callback2, note} = onLoadCallbacks[id]);
  758. let result = yield callback2({
  759. path: request2.path,
  760. namespace: request2.namespace,
  761. pluginData: stash.load(request2.pluginData)
  762. });
  763. if (result != null) {
  764. if (typeof result !== "object")
  765. throw new Error(`Expected onLoad() callback in plugin ${JSON.stringify(name)} to return an object`);
  766. let keys = {};
  767. let pluginName = getFlag(result, keys, "pluginName", mustBeString);
  768. let contents = getFlag(result, keys, "contents", mustBeStringOrUint8Array);
  769. let resolveDir = getFlag(result, keys, "resolveDir", mustBeString);
  770. let pluginData = getFlag(result, keys, "pluginData", canBeAnything);
  771. let loader = getFlag(result, keys, "loader", mustBeString);
  772. let errors = getFlag(result, keys, "errors", mustBeArray);
  773. let warnings = getFlag(result, keys, "warnings", mustBeArray);
  774. checkForInvalidFlags(result, keys, `from onLoad() callback in plugin ${JSON.stringify(name)}`);
  775. response.id = id;
  776. if (pluginName != null)
  777. response.pluginName = pluginName;
  778. if (contents instanceof Uint8Array)
  779. response.contents = contents;
  780. else if (contents != null)
  781. response.contents = encodeUTF8(contents);
  782. if (resolveDir != null)
  783. response.resolveDir = resolveDir;
  784. if (pluginData != null)
  785. response.pluginData = stash.store(pluginData);
  786. if (loader != null)
  787. response.loader = loader;
  788. if (errors != null)
  789. response.errors = sanitizeMessages(errors, "errors", stash);
  790. if (warnings != null)
  791. response.warnings = sanitizeMessages(warnings, "warnings", stash);
  792. break;
  793. }
  794. } catch (e) {
  795. return {id, errors: [extractErrorMessageV8(e, streamIn, stash, note)]};
  796. }
  797. }
  798. return response;
  799. }
  800. default:
  801. throw new Error(`Invalid command: ` + request2.command);
  802. }
  803. });
  804. let refCount = 0;
  805. return {
  806. ref() {
  807. if (++refCount === 1)
  808. pluginCallbacks.set(buildKey, callback);
  809. },
  810. unref() {
  811. if (--refCount === 0)
  812. pluginCallbacks.delete(buildKey);
  813. }
  814. };
  815. };
  816. let buildServeData = (refs, options, request) => {
  817. let keys = {};
  818. let port = getFlag(options, keys, "port", mustBeInteger);
  819. let host = getFlag(options, keys, "host", mustBeString);
  820. let servedir = getFlag(options, keys, "servedir", mustBeString);
  821. let onRequest = getFlag(options, keys, "onRequest", mustBeFunction);
  822. let serveID = nextServeID++;
  823. let onWait;
  824. let wait = new Promise((resolve, reject) => {
  825. onWait = (error) => {
  826. serveCallbacks.delete(serveID);
  827. if (error !== null)
  828. reject(new Error(error));
  829. else
  830. resolve();
  831. };
  832. });
  833. request.serve = {serveID};
  834. checkForInvalidFlags(options, keys, `in serve() call`);
  835. if (port !== void 0)
  836. request.serve.port = port;
  837. if (host !== void 0)
  838. request.serve.host = host;
  839. if (servedir !== void 0)
  840. request.serve.servedir = servedir;
  841. serveCallbacks.set(serveID, {
  842. onRequest,
  843. onWait
  844. });
  845. return {
  846. wait,
  847. stop() {
  848. sendRequest(refs, {command: "serve-stop", serveID}, () => {
  849. });
  850. }
  851. };
  852. };
  853. return {
  854. readFromStdout,
  855. afterClose,
  856. service: {
  857. buildOrServe(callName, callerRefs, serveOptions, options, isTTY2, defaultWD, callback) {
  858. let pluginRefs;
  859. const details = createObjectStash();
  860. const logLevelDefault = "info";
  861. const refs = {
  862. ref() {
  863. if (pluginRefs)
  864. pluginRefs.ref();
  865. if (callerRefs)
  866. callerRefs.ref();
  867. },
  868. unref() {
  869. if (pluginRefs)
  870. pluginRefs.unref();
  871. if (callerRefs)
  872. callerRefs.unref();
  873. }
  874. };
  875. try {
  876. let key = nextBuildKey++;
  877. let writeDefault = !streamIn.isBrowser;
  878. let {
  879. flags,
  880. write,
  881. plugins,
  882. stdinContents,
  883. stdinResolveDir,
  884. absWorkingDir,
  885. incremental,
  886. nodePaths,
  887. watch
  888. } = flagsForBuildOptions(callName, options, isTTY2, logLevelDefault, writeDefault);
  889. let request = {
  890. command: "build",
  891. key,
  892. flags,
  893. write,
  894. stdinContents,
  895. stdinResolveDir,
  896. absWorkingDir: absWorkingDir || defaultWD,
  897. incremental,
  898. nodePaths,
  899. hasOnRebuild: !!(watch && watch.onRebuild)
  900. };
  901. let serve2 = serveOptions && buildServeData(refs, serveOptions, request);
  902. if (plugins && plugins.length > 0)
  903. pluginRefs = handlePlugins(plugins, request, key, details);
  904. let rebuild;
  905. let stop;
  906. let buildResponseToResult = (response, callback2) => {
  907. let errors = replaceDetailsInMessages(response.errors, details);
  908. let warnings = replaceDetailsInMessages(response.warnings, details);
  909. if (errors.length > 0)
  910. return callback2(failureErrorWithLog("Build failed", errors, warnings), null);
  911. let result = {warnings};
  912. if (response.outputFiles)
  913. result.outputFiles = response.outputFiles.map(convertOutputFiles);
  914. if (response.rebuildID !== void 0) {
  915. if (!rebuild) {
  916. let isDisposed = false;
  917. rebuild = () => new Promise((resolve, reject) => {
  918. if (isDisposed || isClosed)
  919. throw new Error("Cannot rebuild");
  920. sendRequest(refs, {command: "rebuild", rebuildID: response.rebuildID}, (error2, response2) => {
  921. if (error2)
  922. return callback2(new Error(error2), null);
  923. buildResponseToResult(response2, (error3, result3) => {
  924. if (error3)
  925. reject(error3);
  926. else
  927. resolve(result3);
  928. });
  929. });
  930. });
  931. refs.ref();
  932. rebuild.dispose = () => {
  933. if (isDisposed)
  934. return;
  935. isDisposed = true;
  936. sendRequest(refs, {command: "rebuild-dispose", rebuildID: response.rebuildID}, () => {
  937. });
  938. refs.unref();
  939. };
  940. }
  941. result.rebuild = rebuild;
  942. }
  943. if (response.watchID !== void 0) {
  944. if (!stop) {
  945. let isStopped = false;
  946. refs.ref();
  947. stop = () => {
  948. if (isStopped)
  949. return;
  950. isStopped = true;
  951. watchCallbacks.delete(response.watchID);
  952. sendRequest(refs, {command: "watch-stop", watchID: response.watchID}, () => {
  953. });
  954. refs.unref();
  955. };
  956. if (watch && watch.onRebuild) {
  957. watchCallbacks.set(response.watchID, (serviceStopError, watchResponse) => {
  958. if (serviceStopError)
  959. return watch.onRebuild(serviceStopError, null);
  960. let errors2 = replaceDetailsInMessages(watchResponse.errors, details);
  961. let warnings2 = replaceDetailsInMessages(watchResponse.warnings, details);
  962. if (errors2.length > 0)
  963. return watch.onRebuild(failureErrorWithLog("Build failed", errors2, warnings2), null);
  964. let result2 = {warnings: warnings2};
  965. if (watchResponse.outputFiles)
  966. result2.outputFiles = watchResponse.outputFiles.map(convertOutputFiles);
  967. if (watchResponse.rebuildID !== void 0)
  968. result2.rebuild = rebuild;
  969. result2.stop = stop;
  970. watch.onRebuild(null, result2);
  971. });
  972. }
  973. }
  974. result.stop = stop;
  975. }
  976. return callback2(null, result);
  977. };
  978. if (write && streamIn.isBrowser)
  979. throw new Error(`Cannot enable "write" in the browser`);
  980. if (incremental && streamIn.isSync)
  981. throw new Error(`Cannot use "incremental" with a synchronous build`);
  982. sendRequest(refs, request, (error, response) => {
  983. if (error)
  984. return callback(new Error(error), null);
  985. if (serve2) {
  986. let serveResponse = response;
  987. let isStopped = false;
  988. refs.ref();
  989. let result = {
  990. port: serveResponse.port,
  991. host: serveResponse.host,
  992. wait: serve2.wait,
  993. stop() {
  994. if (isStopped)
  995. return;
  996. isStopped = true;
  997. serve2.stop();
  998. refs.unref();
  999. }
  1000. };
  1001. refs.ref();
  1002. serve2.wait.then(refs.unref, refs.unref);
  1003. return callback(null, result);
  1004. }
  1005. return buildResponseToResult(response, callback);
  1006. });
  1007. } catch (e) {
  1008. let flags = [];
  1009. try {
  1010. pushLogFlags(flags, options, {}, isTTY2, logLevelDefault);
  1011. } catch (e2) {
  1012. }
  1013. const error = extractErrorMessageV8(e, streamIn, details, void 0);
  1014. sendRequest(refs, {command: "error", flags, error}, () => {
  1015. error.detail = details.load(error.detail);
  1016. callback(failureErrorWithLog("Build failed", [error], []), null);
  1017. });
  1018. }
  1019. },
  1020. transform(callName, refs, input, options, isTTY2, fs2, callback) {
  1021. const details = createObjectStash();
  1022. const logLevelDefault = "silent";
  1023. let start = (inputPath) => {
  1024. try {
  1025. let flags = flagsForTransformOptions(callName, options, isTTY2, logLevelDefault);
  1026. let request = {
  1027. command: "transform",
  1028. flags,
  1029. inputFS: inputPath !== null,
  1030. input: inputPath !== null ? inputPath : input
  1031. };
  1032. sendRequest(refs, request, (error, response) => {
  1033. if (error)
  1034. return callback(new Error(error), null);
  1035. let errors = replaceDetailsInMessages(response.errors, details);
  1036. let warnings = replaceDetailsInMessages(response.warnings, details);
  1037. let outstanding = 1;
  1038. let next = () => --outstanding === 0 && callback(null, {warnings, code: response.code, map: response.map});
  1039. if (errors.length > 0)
  1040. return callback(failureErrorWithLog("Transform failed", errors, warnings), null);
  1041. if (response.codeFS) {
  1042. outstanding++;
  1043. fs2.readFile(response.code, (err, contents) => {
  1044. if (err !== null) {
  1045. callback(err, null);
  1046. } else {
  1047. response.code = contents;
  1048. next();
  1049. }
  1050. });
  1051. }
  1052. if (response.mapFS) {
  1053. outstanding++;
  1054. fs2.readFile(response.map, (err, contents) => {
  1055. if (err !== null) {
  1056. callback(err, null);
  1057. } else {
  1058. response.map = contents;
  1059. next();
  1060. }
  1061. });
  1062. }
  1063. next();
  1064. });
  1065. } catch (e) {
  1066. let flags = [];
  1067. try {
  1068. pushLogFlags(flags, options, {}, isTTY2, logLevelDefault);
  1069. } catch (e2) {
  1070. }
  1071. const error = extractErrorMessageV8(e, streamIn, details, void 0);
  1072. sendRequest(refs, {command: "error", flags, error}, () => {
  1073. error.detail = details.load(error.detail);
  1074. callback(failureErrorWithLog("Transform failed", [error], []), null);
  1075. });
  1076. }
  1077. };
  1078. if (input.length > 1024 * 1024) {
  1079. let next = start;
  1080. start = () => fs2.writeFile(input, next);
  1081. }
  1082. start(null);
  1083. }
  1084. }
  1085. };
  1086. }
  1087. function createObjectStash() {
  1088. const map = new Map();
  1089. let nextID = 0;
  1090. return {
  1091. load(id) {
  1092. return map.get(id);
  1093. },
  1094. store(value) {
  1095. if (value === void 0)
  1096. return -1;
  1097. const id = nextID++;
  1098. map.set(id, value);
  1099. return id;
  1100. }
  1101. };
  1102. }
  1103. function extractCallerV8(e, streamIn, ident) {
  1104. try {
  1105. let lines = (e.stack + "").split("\n", 4);
  1106. lines.splice(1, 1);
  1107. let location = parseStackLinesV8(streamIn, lines, ident);
  1108. if (location) {
  1109. return {text: e.message, location};
  1110. }
  1111. } catch (e2) {
  1112. }
  1113. }
  1114. function extractErrorMessageV8(e, streamIn, stash, note) {
  1115. let text = "Internal error";
  1116. let location = null;
  1117. try {
  1118. text = (e && e.message || e) + "";
  1119. } catch (e2) {
  1120. }
  1121. try {
  1122. location = parseStackLinesV8(streamIn, (e.stack + "").split("\n", 3), "");
  1123. } catch (e2) {
  1124. }
  1125. return {text, location, notes: note ? [note] : [], detail: stash ? stash.store(e) : -1};
  1126. }
  1127. function parseStackLinesV8(streamIn, lines, ident) {
  1128. let at = " at ";
  1129. if (streamIn.readFileSync && !lines[0].startsWith(at) && lines[1].startsWith(at)) {
  1130. let line = lines[1].slice(at.length);
  1131. while (true) {
  1132. let match = /^\S+ \((.*)\)$/.exec(line);
  1133. if (match) {
  1134. line = match[1];
  1135. continue;
  1136. }
  1137. match = /^eval at \S+ \((.*)\)(?:, \S+:\d+:\d+)?$/.exec(line);
  1138. if (match) {
  1139. line = match[1];
  1140. continue;
  1141. }
  1142. match = /^(\S+):(\d+):(\d+)$/.exec(line);
  1143. if (match) {
  1144. let contents = streamIn.readFileSync(match[1], "utf8");
  1145. let lineText = contents.split(/\r\n|\r|\n|\u2028|\u2029/)[+match[2] - 1] || "";
  1146. let column = +match[3] - 1;
  1147. let length = lineText.slice(column, column + ident.length) === ident ? ident.length : 0;
  1148. return {
  1149. file: match[1],
  1150. namespace: "file",
  1151. line: +match[2],
  1152. column: encodeUTF8(lineText.slice(0, column)).length,
  1153. length: encodeUTF8(lineText.slice(column, column + length)).length,
  1154. lineText: lineText + "\n" + lines.slice(1).join("\n")
  1155. };
  1156. }
  1157. break;
  1158. }
  1159. }
  1160. return null;
  1161. }
  1162. function failureErrorWithLog(text, errors, warnings) {
  1163. let limit = 5;
  1164. let summary = errors.length < 1 ? "" : ` with ${errors.length} error${errors.length < 2 ? "" : "s"}:` + errors.slice(0, limit + 1).map((e, i) => {
  1165. if (i === limit)
  1166. return "\n...";
  1167. if (!e.location)
  1168. return `
  1169. error: ${e.text}`;
  1170. let {file, line, column} = e.location;
  1171. return `
  1172. ${file}:${line}:${column}: error: ${e.text}`;
  1173. }).join("");
  1174. let error = new Error(`${text}${summary}`);
  1175. error.errors = errors;
  1176. error.warnings = warnings;
  1177. return error;
  1178. }
  1179. function replaceDetailsInMessages(messages, stash) {
  1180. for (const message of messages) {
  1181. message.detail = stash.load(message.detail);
  1182. }
  1183. return messages;
  1184. }
  1185. function sanitizeLocation(location, where) {
  1186. if (location == null)
  1187. return null;
  1188. let keys = {};
  1189. let file = getFlag(location, keys, "file", mustBeString);
  1190. let namespace = getFlag(location, keys, "namespace", mustBeString);
  1191. let line = getFlag(location, keys, "line", mustBeInteger);
  1192. let column = getFlag(location, keys, "column", mustBeInteger);
  1193. let length = getFlag(location, keys, "length", mustBeInteger);
  1194. let lineText = getFlag(location, keys, "lineText", mustBeString);
  1195. checkForInvalidFlags(location, keys, where);
  1196. return {
  1197. file: file || "",
  1198. namespace: namespace || "",
  1199. line: line || 0,
  1200. column: column || 0,
  1201. length: length || 0,
  1202. lineText: lineText || ""
  1203. };
  1204. }
  1205. function sanitizeMessages(messages, property, stash) {
  1206. let messagesClone = [];
  1207. let index = 0;
  1208. for (const message of messages) {
  1209. let keys = {};
  1210. let text = getFlag(message, keys, "text", mustBeString);
  1211. let location = getFlag(message, keys, "location", mustBeObjectOrNull);
  1212. let notes = getFlag(message, keys, "notes", mustBeArray);
  1213. let detail = getFlag(message, keys, "detail", canBeAnything);
  1214. let where = `in element ${index} of "${property}"`;
  1215. checkForInvalidFlags(message, keys, where);
  1216. let notesClone = [];
  1217. if (notes) {
  1218. for (const note of notes) {
  1219. let noteKeys = {};
  1220. let noteText = getFlag(note, noteKeys, "text", mustBeString);
  1221. let noteLocation = getFlag(note, noteKeys, "location", mustBeObjectOrNull);
  1222. checkForInvalidFlags(note, noteKeys, where);
  1223. notesClone.push({
  1224. text: noteText || "",
  1225. location: sanitizeLocation(noteLocation, where)
  1226. });
  1227. }
  1228. }
  1229. messagesClone.push({
  1230. text: text || "",
  1231. location: sanitizeLocation(location, where),
  1232. notes: notesClone,
  1233. detail: stash.store(detail)
  1234. });
  1235. index++;
  1236. }
  1237. return messagesClone;
  1238. }
  1239. function convertOutputFiles({path: path2, contents}) {
  1240. let text = null;
  1241. return {
  1242. path: path2,
  1243. contents,
  1244. get text() {
  1245. if (text === null)
  1246. text = decodeUTF8(contents);
  1247. return text;
  1248. }
  1249. };
  1250. }
  1251. function longLivedService(getwd, startService2) {
  1252. let entries = new Map();
  1253. return (options) => __async(this, null, function* () {
  1254. let cwd = getwd();
  1255. let optionsJSON = JSON.stringify(options || {});
  1256. let key = optionsJSON;
  1257. let entry = entries.get(key);
  1258. if (entry === void 0) {
  1259. entry = startService2(JSON.parse(optionsJSON));
  1260. entries.set(key, entry);
  1261. }
  1262. try {
  1263. let service = yield entry;
  1264. return {
  1265. build: (options2 = {}) => {
  1266. if (cwd) {
  1267. let absWorkingDir = options2.absWorkingDir;
  1268. if (!absWorkingDir)
  1269. options2 = __assign(__assign({}, options2), {absWorkingDir: cwd});
  1270. }
  1271. return service.build(options2);
  1272. },
  1273. serve(serveOptions, buildOptions = {}) {
  1274. if (cwd) {
  1275. let absWorkingDir = buildOptions.absWorkingDir;
  1276. if (!absWorkingDir)
  1277. buildOptions = __assign(__assign({}, buildOptions), {absWorkingDir: cwd});
  1278. }
  1279. return service.serve(serveOptions, buildOptions);
  1280. },
  1281. transform(input, options2) {
  1282. return service.transform(input, options2);
  1283. },
  1284. stop() {
  1285. }
  1286. };
  1287. } catch (e) {
  1288. entries.delete(key);
  1289. throw e;
  1290. }
  1291. });
  1292. }
  1293. // lib/node.ts
  1294. var child_process = require("child_process");
  1295. var crypto = require("crypto");
  1296. var path = require("path");
  1297. var fs = require("fs");
  1298. var os = require("os");
  1299. var tty = require("tty");
  1300. var esbuildCommandAndArgs = () => {
  1301. if (process.env.ESBUILD_BINARY_PATH) {
  1302. return [path.resolve(process.env.ESBUILD_BINARY_PATH), []];
  1303. }
  1304. if (false) {
  1305. return ["node", [path.join(__dirname, "..", "bin", "esbuild")]];
  1306. }
  1307. if (process.platform === "win32") {
  1308. return [path.join(__dirname, "..", "esbuild.exe"), []];
  1309. }
  1310. let pathForYarn2 = path.join(__dirname, "..", "esbuild");
  1311. if (fs.existsSync(pathForYarn2)) {
  1312. return [pathForYarn2, []];
  1313. }
  1314. return [path.join(__dirname, "..", "bin", "esbuild"), []];
  1315. };
  1316. var isTTY = () => tty.isatty(2);
  1317. var version = "0.8.53";
  1318. var build = (options) => startService().then((service) => service.build(options));
  1319. var serve = (serveOptions, buildOptions) => startService().then((service) => service.serve(serveOptions, buildOptions));
  1320. var transform = (input, options) => {
  1321. input += "";
  1322. return startService().then((service) => service.transform(input, options));
  1323. };
  1324. var buildSync = (options) => {
  1325. let result;
  1326. runServiceSync((service) => service.buildOrServe("buildSync", null, null, options, isTTY(), process.cwd(), (err, res) => {
  1327. if (err)
  1328. throw err;
  1329. result = res;
  1330. }));
  1331. return result;
  1332. };
  1333. var transformSync = (input, options) => {
  1334. input += "";
  1335. let result;
  1336. runServiceSync((service) => service.transform("transformSync", null, input, options || {}, isTTY(), {
  1337. readFile(tempFile, callback) {
  1338. try {
  1339. let contents = fs.readFileSync(tempFile, "utf8");
  1340. try {
  1341. fs.unlinkSync(tempFile);
  1342. } catch (e) {
  1343. }
  1344. callback(null, contents);
  1345. } catch (err) {
  1346. callback(err, null);
  1347. }
  1348. },
  1349. writeFile(contents, callback) {
  1350. try {
  1351. let tempFile = randomFileName();
  1352. fs.writeFileSync(tempFile, contents);
  1353. callback(tempFile);
  1354. } catch (e) {
  1355. callback(null);
  1356. }
  1357. }
  1358. }, (err, res) => {
  1359. if (err)
  1360. throw err;
  1361. result = res;
  1362. }));
  1363. return result;
  1364. };
  1365. var startService = longLivedService(() => process.cwd(), (options) => {
  1366. options = validateServiceOptions(options || {});
  1367. if (options.wasmURL)
  1368. throw new Error(`The "wasmURL" option only works in the browser`);
  1369. if (options.worker)
  1370. throw new Error(`The "worker" option only works in the browser`);
  1371. let [command, args] = esbuildCommandAndArgs();
  1372. let defaultWD = process.cwd();
  1373. let child = child_process.spawn(command, args.concat(`--service=${"0.8.53"}`, "--ping"), {
  1374. windowsHide: true,
  1375. stdio: ["pipe", "pipe", "inherit"]
  1376. });
  1377. let {readFromStdout, afterClose, service} = createChannel({
  1378. writeToStdin(bytes) {
  1379. child.stdin.write(bytes);
  1380. },
  1381. readFileSync: fs.readFileSync,
  1382. isSync: false,
  1383. isBrowser: false
  1384. });
  1385. const stdin = child.stdin;
  1386. const stdout = child.stdout;
  1387. stdout.on("data", readFromStdout);
  1388. stdout.on("end", afterClose);
  1389. let refCount = 0;
  1390. child.unref();
  1391. if (stdin.unref) {
  1392. stdin.unref();
  1393. }
  1394. if (stdout.unref) {
  1395. stdout.unref();
  1396. }
  1397. const refs = {
  1398. ref() {
  1399. if (++refCount === 1)
  1400. child.ref();
  1401. },
  1402. unref() {
  1403. if (--refCount === 0)
  1404. child.unref();
  1405. }
  1406. };
  1407. return Promise.resolve({
  1408. build: (options2) => {
  1409. return new Promise((resolve, reject) => {
  1410. service.buildOrServe("build", refs, null, options2, isTTY(), defaultWD, (err, res) => {
  1411. if (err) {
  1412. reject(err);
  1413. } else {
  1414. resolve(res);
  1415. }
  1416. });
  1417. });
  1418. },
  1419. serve: (serveOptions, buildOptions) => {
  1420. if (serveOptions === null || typeof serveOptions !== "object")
  1421. throw new Error("The first argument must be an object");
  1422. return new Promise((resolve, reject) => service.buildOrServe("serve", refs, serveOptions, buildOptions, isTTY(), defaultWD, (err, res) => {
  1423. if (err) {
  1424. reject(err);
  1425. } else {
  1426. resolve(res);
  1427. }
  1428. }));
  1429. },
  1430. transform: (input, options2) => {
  1431. input += "";
  1432. return new Promise((resolve, reject) => service.transform("transform", refs, input, options2 || {}, isTTY(), {
  1433. readFile(tempFile, callback) {
  1434. try {
  1435. fs.readFile(tempFile, "utf8", (err, contents) => {
  1436. try {
  1437. fs.unlink(tempFile, () => callback(err, contents));
  1438. } catch (e) {
  1439. callback(err, contents);
  1440. }
  1441. });
  1442. } catch (err) {
  1443. callback(err, null);
  1444. }
  1445. },
  1446. writeFile(contents, callback) {
  1447. try {
  1448. let tempFile = randomFileName();
  1449. fs.writeFile(tempFile, contents, (err) => err !== null ? callback(null) : callback(tempFile));
  1450. } catch (e) {
  1451. callback(null);
  1452. }
  1453. }
  1454. }, (err, res) => err ? reject(err) : resolve(res)));
  1455. },
  1456. stop() {
  1457. child.kill();
  1458. }
  1459. });
  1460. });
  1461. var runServiceSync = (callback) => {
  1462. let [command, args] = esbuildCommandAndArgs();
  1463. let stdin = new Uint8Array();
  1464. let {readFromStdout, afterClose, service} = createChannel({
  1465. writeToStdin(bytes) {
  1466. if (stdin.length !== 0)
  1467. throw new Error("Must run at most one command");
  1468. stdin = bytes;
  1469. },
  1470. isSync: true,
  1471. isBrowser: false
  1472. });
  1473. callback(service);
  1474. let stdout = child_process.execFileSync(command, args.concat(`--service=${"0.8.53"}`), {
  1475. cwd: process.cwd(),
  1476. windowsHide: true,
  1477. input: stdin,
  1478. maxBuffer: +process.env.ESBUILD_MAX_BUFFER || 16 * 1024 * 1024
  1479. });
  1480. readFromStdout(stdout);
  1481. afterClose();
  1482. };
  1483. var randomFileName = () => {
  1484. return path.join(os.tmpdir(), `esbuild-${crypto.randomBytes(32).toString("hex")}`);
  1485. };