doc.mjs 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233
  1. var __defProp = Object.defineProperty;
  2. var __export = (target, all) => {
  3. for (var name in all)
  4. __defProp(target, name, { get: all[name], enumerable: true });
  5. };
  6. // src/document/public.js
  7. var public_exports = {};
  8. __export(public_exports, {
  9. builders: () => builders,
  10. printer: () => printer,
  11. utils: () => utils
  12. });
  13. // src/document/constants.js
  14. var DOC_TYPE_STRING = "string";
  15. var DOC_TYPE_ARRAY = "array";
  16. var DOC_TYPE_CURSOR = "cursor";
  17. var DOC_TYPE_INDENT = "indent";
  18. var DOC_TYPE_ALIGN = "align";
  19. var DOC_TYPE_TRIM = "trim";
  20. var DOC_TYPE_GROUP = "group";
  21. var DOC_TYPE_FILL = "fill";
  22. var DOC_TYPE_IF_BREAK = "if-break";
  23. var DOC_TYPE_INDENT_IF_BREAK = "indent-if-break";
  24. var DOC_TYPE_LINE_SUFFIX = "line-suffix";
  25. var DOC_TYPE_LINE_SUFFIX_BOUNDARY = "line-suffix-boundary";
  26. var DOC_TYPE_LINE = "line";
  27. var DOC_TYPE_LABEL = "label";
  28. var DOC_TYPE_BREAK_PARENT = "break-parent";
  29. var VALID_OBJECT_DOC_TYPES = /* @__PURE__ */ new Set([
  30. DOC_TYPE_CURSOR,
  31. DOC_TYPE_INDENT,
  32. DOC_TYPE_ALIGN,
  33. DOC_TYPE_TRIM,
  34. DOC_TYPE_GROUP,
  35. DOC_TYPE_FILL,
  36. DOC_TYPE_IF_BREAK,
  37. DOC_TYPE_INDENT_IF_BREAK,
  38. DOC_TYPE_LINE_SUFFIX,
  39. DOC_TYPE_LINE_SUFFIX_BOUNDARY,
  40. DOC_TYPE_LINE,
  41. DOC_TYPE_LABEL,
  42. DOC_TYPE_BREAK_PARENT
  43. ]);
  44. // scripts/build/shims/at.js
  45. var at = (isOptionalObject, object, index) => {
  46. if (isOptionalObject && (object === void 0 || object === null)) {
  47. return;
  48. }
  49. if (Array.isArray(object) || typeof object === "string") {
  50. return object[index < 0 ? object.length + index : index];
  51. }
  52. return object.at(index);
  53. };
  54. var at_default = at;
  55. // src/document/utils/get-doc-type.js
  56. function getDocType(doc) {
  57. if (typeof doc === "string") {
  58. return DOC_TYPE_STRING;
  59. }
  60. if (Array.isArray(doc)) {
  61. return DOC_TYPE_ARRAY;
  62. }
  63. if (!doc) {
  64. return;
  65. }
  66. const { type } = doc;
  67. if (VALID_OBJECT_DOC_TYPES.has(type)) {
  68. return type;
  69. }
  70. }
  71. var get_doc_type_default = getDocType;
  72. // src/document/invalid-doc-error.js
  73. var disjunctionListFormat = (list) => new Intl.ListFormat("en-US", { type: "disjunction" }).format(list);
  74. function getDocErrorMessage(doc) {
  75. const type = doc === null ? "null" : typeof doc;
  76. if (type !== "string" && type !== "object") {
  77. return `Unexpected doc '${type}',
  78. Expected it to be 'string' or 'object'.`;
  79. }
  80. if (get_doc_type_default(doc)) {
  81. throw new Error("doc is valid.");
  82. }
  83. const objectType = Object.prototype.toString.call(doc);
  84. if (objectType !== "[object Object]") {
  85. return `Unexpected doc '${objectType}'.`;
  86. }
  87. const EXPECTED_TYPE_VALUES = disjunctionListFormat(
  88. [...VALID_OBJECT_DOC_TYPES].map((type2) => `'${type2}'`)
  89. );
  90. return `Unexpected doc.type '${doc.type}'.
  91. Expected it to be ${EXPECTED_TYPE_VALUES}.`;
  92. }
  93. var InvalidDocError = class extends Error {
  94. name = "InvalidDocError";
  95. constructor(doc) {
  96. super(getDocErrorMessage(doc));
  97. this.doc = doc;
  98. }
  99. };
  100. var invalid_doc_error_default = InvalidDocError;
  101. // src/document/utils/traverse-doc.js
  102. var traverseDocOnExitStackMarker = {};
  103. function traverseDoc(doc, onEnter, onExit, shouldTraverseConditionalGroups) {
  104. const docsStack = [doc];
  105. while (docsStack.length > 0) {
  106. const doc2 = docsStack.pop();
  107. if (doc2 === traverseDocOnExitStackMarker) {
  108. onExit(docsStack.pop());
  109. continue;
  110. }
  111. if (onExit) {
  112. docsStack.push(doc2, traverseDocOnExitStackMarker);
  113. }
  114. const docType = get_doc_type_default(doc2);
  115. if (!docType) {
  116. throw new invalid_doc_error_default(doc2);
  117. }
  118. if ((onEnter == null ? void 0 : onEnter(doc2)) === false) {
  119. continue;
  120. }
  121. switch (docType) {
  122. case DOC_TYPE_ARRAY:
  123. case DOC_TYPE_FILL: {
  124. const parts = docType === DOC_TYPE_ARRAY ? doc2 : doc2.parts;
  125. for (let ic = parts.length, i = ic - 1; i >= 0; --i) {
  126. docsStack.push(parts[i]);
  127. }
  128. break;
  129. }
  130. case DOC_TYPE_IF_BREAK:
  131. docsStack.push(doc2.flatContents, doc2.breakContents);
  132. break;
  133. case DOC_TYPE_GROUP:
  134. if (shouldTraverseConditionalGroups && doc2.expandedStates) {
  135. for (let ic = doc2.expandedStates.length, i = ic - 1; i >= 0; --i) {
  136. docsStack.push(doc2.expandedStates[i]);
  137. }
  138. } else {
  139. docsStack.push(doc2.contents);
  140. }
  141. break;
  142. case DOC_TYPE_ALIGN:
  143. case DOC_TYPE_INDENT:
  144. case DOC_TYPE_INDENT_IF_BREAK:
  145. case DOC_TYPE_LABEL:
  146. case DOC_TYPE_LINE_SUFFIX:
  147. docsStack.push(doc2.contents);
  148. break;
  149. case DOC_TYPE_STRING:
  150. case DOC_TYPE_CURSOR:
  151. case DOC_TYPE_TRIM:
  152. case DOC_TYPE_LINE_SUFFIX_BOUNDARY:
  153. case DOC_TYPE_LINE:
  154. case DOC_TYPE_BREAK_PARENT:
  155. break;
  156. default:
  157. throw new invalid_doc_error_default(doc2);
  158. }
  159. }
  160. }
  161. var traverse_doc_default = traverseDoc;
  162. // src/document/utils.js
  163. function mapDoc(doc, cb) {
  164. if (typeof doc === "string") {
  165. return cb(doc);
  166. }
  167. const mapped = /* @__PURE__ */ new Map();
  168. return rec(doc);
  169. function rec(doc2) {
  170. if (mapped.has(doc2)) {
  171. return mapped.get(doc2);
  172. }
  173. const result = process2(doc2);
  174. mapped.set(doc2, result);
  175. return result;
  176. }
  177. function process2(doc2) {
  178. switch (get_doc_type_default(doc2)) {
  179. case DOC_TYPE_ARRAY:
  180. return cb(doc2.map(rec));
  181. case DOC_TYPE_FILL:
  182. return cb({ ...doc2, parts: doc2.parts.map(rec) });
  183. case DOC_TYPE_IF_BREAK:
  184. return cb({
  185. ...doc2,
  186. breakContents: rec(doc2.breakContents),
  187. flatContents: rec(doc2.flatContents)
  188. });
  189. case DOC_TYPE_GROUP: {
  190. let { expandedStates, contents } = doc2;
  191. if (expandedStates) {
  192. expandedStates = expandedStates.map(rec);
  193. contents = expandedStates[0];
  194. } else {
  195. contents = rec(contents);
  196. }
  197. return cb({ ...doc2, contents, expandedStates });
  198. }
  199. case DOC_TYPE_ALIGN:
  200. case DOC_TYPE_INDENT:
  201. case DOC_TYPE_INDENT_IF_BREAK:
  202. case DOC_TYPE_LABEL:
  203. case DOC_TYPE_LINE_SUFFIX:
  204. return cb({ ...doc2, contents: rec(doc2.contents) });
  205. case DOC_TYPE_STRING:
  206. case DOC_TYPE_CURSOR:
  207. case DOC_TYPE_TRIM:
  208. case DOC_TYPE_LINE_SUFFIX_BOUNDARY:
  209. case DOC_TYPE_LINE:
  210. case DOC_TYPE_BREAK_PARENT:
  211. return cb(doc2);
  212. default:
  213. throw new invalid_doc_error_default(doc2);
  214. }
  215. }
  216. }
  217. function findInDoc(doc, fn, defaultValue) {
  218. let result = defaultValue;
  219. let shouldSkipFurtherProcessing = false;
  220. function findInDocOnEnterFn(doc2) {
  221. if (shouldSkipFurtherProcessing) {
  222. return false;
  223. }
  224. const maybeResult = fn(doc2);
  225. if (maybeResult !== void 0) {
  226. shouldSkipFurtherProcessing = true;
  227. result = maybeResult;
  228. }
  229. }
  230. traverse_doc_default(doc, findInDocOnEnterFn);
  231. return result;
  232. }
  233. function willBreakFn(doc) {
  234. if (doc.type === DOC_TYPE_GROUP && doc.break) {
  235. return true;
  236. }
  237. if (doc.type === DOC_TYPE_LINE && doc.hard) {
  238. return true;
  239. }
  240. if (doc.type === DOC_TYPE_BREAK_PARENT) {
  241. return true;
  242. }
  243. }
  244. function willBreak(doc) {
  245. return findInDoc(doc, willBreakFn, false);
  246. }
  247. function breakParentGroup(groupStack) {
  248. if (groupStack.length > 0) {
  249. const parentGroup = at_default(
  250. /* isOptionalObject */
  251. false,
  252. groupStack,
  253. -1
  254. );
  255. if (!parentGroup.expandedStates && !parentGroup.break) {
  256. parentGroup.break = "propagated";
  257. }
  258. }
  259. return null;
  260. }
  261. function propagateBreaks(doc) {
  262. const alreadyVisitedSet = /* @__PURE__ */ new Set();
  263. const groupStack = [];
  264. function propagateBreaksOnEnterFn(doc2) {
  265. if (doc2.type === DOC_TYPE_BREAK_PARENT) {
  266. breakParentGroup(groupStack);
  267. }
  268. if (doc2.type === DOC_TYPE_GROUP) {
  269. groupStack.push(doc2);
  270. if (alreadyVisitedSet.has(doc2)) {
  271. return false;
  272. }
  273. alreadyVisitedSet.add(doc2);
  274. }
  275. }
  276. function propagateBreaksOnExitFn(doc2) {
  277. if (doc2.type === DOC_TYPE_GROUP) {
  278. const group2 = groupStack.pop();
  279. if (group2.break) {
  280. breakParentGroup(groupStack);
  281. }
  282. }
  283. }
  284. traverse_doc_default(
  285. doc,
  286. propagateBreaksOnEnterFn,
  287. propagateBreaksOnExitFn,
  288. /* shouldTraverseConditionalGroups */
  289. true
  290. );
  291. }
  292. function removeLinesFn(doc) {
  293. if (doc.type === DOC_TYPE_LINE && !doc.hard) {
  294. return doc.soft ? "" : " ";
  295. }
  296. if (doc.type === DOC_TYPE_IF_BREAK) {
  297. return doc.flatContents;
  298. }
  299. return doc;
  300. }
  301. function removeLines(doc) {
  302. return mapDoc(doc, removeLinesFn);
  303. }
  304. function stripTrailingHardlineFromParts(parts) {
  305. parts = [...parts];
  306. while (parts.length >= 2 && at_default(
  307. /* isOptionalObject */
  308. false,
  309. parts,
  310. -2
  311. ).type === DOC_TYPE_LINE && at_default(
  312. /* isOptionalObject */
  313. false,
  314. parts,
  315. -1
  316. ).type === DOC_TYPE_BREAK_PARENT) {
  317. parts.length -= 2;
  318. }
  319. if (parts.length > 0) {
  320. const lastPart = stripTrailingHardlineFromDoc(at_default(
  321. /* isOptionalObject */
  322. false,
  323. parts,
  324. -1
  325. ));
  326. parts[parts.length - 1] = lastPart;
  327. }
  328. return parts;
  329. }
  330. function stripTrailingHardlineFromDoc(doc) {
  331. switch (get_doc_type_default(doc)) {
  332. case DOC_TYPE_INDENT:
  333. case DOC_TYPE_INDENT_IF_BREAK:
  334. case DOC_TYPE_GROUP:
  335. case DOC_TYPE_LINE_SUFFIX:
  336. case DOC_TYPE_LABEL: {
  337. const contents = stripTrailingHardlineFromDoc(doc.contents);
  338. return { ...doc, contents };
  339. }
  340. case DOC_TYPE_IF_BREAK:
  341. return {
  342. ...doc,
  343. breakContents: stripTrailingHardlineFromDoc(doc.breakContents),
  344. flatContents: stripTrailingHardlineFromDoc(doc.flatContents)
  345. };
  346. case DOC_TYPE_FILL:
  347. return { ...doc, parts: stripTrailingHardlineFromParts(doc.parts) };
  348. case DOC_TYPE_ARRAY:
  349. return stripTrailingHardlineFromParts(doc);
  350. case DOC_TYPE_STRING:
  351. return doc.replace(/[\n\r]*$/u, "");
  352. case DOC_TYPE_ALIGN:
  353. case DOC_TYPE_CURSOR:
  354. case DOC_TYPE_TRIM:
  355. case DOC_TYPE_LINE_SUFFIX_BOUNDARY:
  356. case DOC_TYPE_LINE:
  357. case DOC_TYPE_BREAK_PARENT:
  358. break;
  359. default:
  360. throw new invalid_doc_error_default(doc);
  361. }
  362. return doc;
  363. }
  364. function stripTrailingHardline(doc) {
  365. return stripTrailingHardlineFromDoc(cleanDoc(doc));
  366. }
  367. function cleanDocFn(doc) {
  368. switch (get_doc_type_default(doc)) {
  369. case DOC_TYPE_FILL:
  370. if (doc.parts.every((part) => part === "")) {
  371. return "";
  372. }
  373. break;
  374. case DOC_TYPE_GROUP:
  375. if (!doc.contents && !doc.id && !doc.break && !doc.expandedStates) {
  376. return "";
  377. }
  378. if (doc.contents.type === DOC_TYPE_GROUP && doc.contents.id === doc.id && doc.contents.break === doc.break && doc.contents.expandedStates === doc.expandedStates) {
  379. return doc.contents;
  380. }
  381. break;
  382. case DOC_TYPE_ALIGN:
  383. case DOC_TYPE_INDENT:
  384. case DOC_TYPE_INDENT_IF_BREAK:
  385. case DOC_TYPE_LINE_SUFFIX:
  386. if (!doc.contents) {
  387. return "";
  388. }
  389. break;
  390. case DOC_TYPE_IF_BREAK:
  391. if (!doc.flatContents && !doc.breakContents) {
  392. return "";
  393. }
  394. break;
  395. case DOC_TYPE_ARRAY: {
  396. const parts = [];
  397. for (const part of doc) {
  398. if (!part) {
  399. continue;
  400. }
  401. const [currentPart, ...restParts] = Array.isArray(part) ? part : [part];
  402. if (typeof currentPart === "string" && typeof at_default(
  403. /* isOptionalObject */
  404. false,
  405. parts,
  406. -1
  407. ) === "string") {
  408. parts[parts.length - 1] += currentPart;
  409. } else {
  410. parts.push(currentPart);
  411. }
  412. parts.push(...restParts);
  413. }
  414. if (parts.length === 0) {
  415. return "";
  416. }
  417. if (parts.length === 1) {
  418. return parts[0];
  419. }
  420. return parts;
  421. }
  422. case DOC_TYPE_STRING:
  423. case DOC_TYPE_CURSOR:
  424. case DOC_TYPE_TRIM:
  425. case DOC_TYPE_LINE_SUFFIX_BOUNDARY:
  426. case DOC_TYPE_LINE:
  427. case DOC_TYPE_LABEL:
  428. case DOC_TYPE_BREAK_PARENT:
  429. break;
  430. default:
  431. throw new invalid_doc_error_default(doc);
  432. }
  433. return doc;
  434. }
  435. function cleanDoc(doc) {
  436. return mapDoc(doc, (currentDoc) => cleanDocFn(currentDoc));
  437. }
  438. function replaceEndOfLine(doc, replacement = literalline) {
  439. return mapDoc(
  440. doc,
  441. (currentDoc) => typeof currentDoc === "string" ? join(replacement, currentDoc.split("\n")) : currentDoc
  442. );
  443. }
  444. function canBreakFn(doc) {
  445. if (doc.type === DOC_TYPE_LINE) {
  446. return true;
  447. }
  448. }
  449. function canBreak(doc) {
  450. return findInDoc(doc, canBreakFn, false);
  451. }
  452. // src/document/utils/assert-doc.js
  453. var noop = () => {
  454. };
  455. var assertDoc = true ? noop : function(doc) {
  456. traverse_doc_default(doc, (doc2) => {
  457. if (checked.has(doc2)) {
  458. return false;
  459. }
  460. if (typeof doc2 !== "string") {
  461. checked.add(doc2);
  462. }
  463. });
  464. };
  465. var assertDocArray = true ? noop : function(docs, optional = false) {
  466. if (optional && !docs) {
  467. return;
  468. }
  469. if (!Array.isArray(docs)) {
  470. throw new TypeError("Unexpected doc array.");
  471. }
  472. for (const doc of docs) {
  473. assertDoc(doc);
  474. }
  475. };
  476. var assertDocFillParts = true ? noop : (
  477. /**
  478. * @param {Doc[]} parts
  479. */
  480. function(parts) {
  481. assertDocArray(parts);
  482. if (parts.length > 1 && isEmptyDoc(at_default(
  483. /* isOptionalObject */
  484. false,
  485. parts,
  486. -1
  487. ))) {
  488. parts = parts.slice(0, -1);
  489. }
  490. for (const [i, doc] of parts.entries()) {
  491. if (i % 2 === 1 && !isValidSeparator(doc)) {
  492. const type = get_doc_type_default(doc);
  493. throw new Error(
  494. `Unexpected non-line-break doc at ${i}. Doc type is ${type}.`
  495. );
  496. }
  497. }
  498. }
  499. );
  500. // src/document/builders.js
  501. function indent(contents) {
  502. assertDoc(contents);
  503. return { type: DOC_TYPE_INDENT, contents };
  504. }
  505. function align(widthOrString, contents) {
  506. assertDoc(contents);
  507. return { type: DOC_TYPE_ALIGN, contents, n: widthOrString };
  508. }
  509. function group(contents, opts = {}) {
  510. assertDoc(contents);
  511. assertDocArray(
  512. opts.expandedStates,
  513. /* optional */
  514. true
  515. );
  516. return {
  517. type: DOC_TYPE_GROUP,
  518. id: opts.id,
  519. contents,
  520. break: Boolean(opts.shouldBreak),
  521. expandedStates: opts.expandedStates
  522. };
  523. }
  524. function dedentToRoot(contents) {
  525. return align(Number.NEGATIVE_INFINITY, contents);
  526. }
  527. function markAsRoot(contents) {
  528. return align({ type: "root" }, contents);
  529. }
  530. function dedent(contents) {
  531. return align(-1, contents);
  532. }
  533. function conditionalGroup(states, opts) {
  534. return group(states[0], { ...opts, expandedStates: states });
  535. }
  536. function fill(parts) {
  537. assertDocFillParts(parts);
  538. return { type: DOC_TYPE_FILL, parts };
  539. }
  540. function ifBreak(breakContents, flatContents = "", opts = {}) {
  541. assertDoc(breakContents);
  542. if (flatContents !== "") {
  543. assertDoc(flatContents);
  544. }
  545. return {
  546. type: DOC_TYPE_IF_BREAK,
  547. breakContents,
  548. flatContents,
  549. groupId: opts.groupId
  550. };
  551. }
  552. function indentIfBreak(contents, opts) {
  553. assertDoc(contents);
  554. return {
  555. type: DOC_TYPE_INDENT_IF_BREAK,
  556. contents,
  557. groupId: opts.groupId,
  558. negate: opts.negate
  559. };
  560. }
  561. function lineSuffix(contents) {
  562. assertDoc(contents);
  563. return { type: DOC_TYPE_LINE_SUFFIX, contents };
  564. }
  565. var lineSuffixBoundary = { type: DOC_TYPE_LINE_SUFFIX_BOUNDARY };
  566. var breakParent = { type: DOC_TYPE_BREAK_PARENT };
  567. var trim = { type: DOC_TYPE_TRIM };
  568. var hardlineWithoutBreakParent = { type: DOC_TYPE_LINE, hard: true };
  569. var literallineWithoutBreakParent = {
  570. type: DOC_TYPE_LINE,
  571. hard: true,
  572. literal: true
  573. };
  574. var line = { type: DOC_TYPE_LINE };
  575. var softline = { type: DOC_TYPE_LINE, soft: true };
  576. var hardline = [hardlineWithoutBreakParent, breakParent];
  577. var literalline = [literallineWithoutBreakParent, breakParent];
  578. var cursor = { type: DOC_TYPE_CURSOR };
  579. function join(separator, docs) {
  580. assertDoc(separator);
  581. assertDocArray(docs);
  582. const parts = [];
  583. for (let i = 0; i < docs.length; i++) {
  584. if (i !== 0) {
  585. parts.push(separator);
  586. }
  587. parts.push(docs[i]);
  588. }
  589. return parts;
  590. }
  591. function addAlignmentToDoc(doc, size, tabWidth) {
  592. assertDoc(doc);
  593. let aligned = doc;
  594. if (size > 0) {
  595. for (let i = 0; i < Math.floor(size / tabWidth); ++i) {
  596. aligned = indent(aligned);
  597. }
  598. aligned = align(size % tabWidth, aligned);
  599. aligned = align(Number.NEGATIVE_INFINITY, aligned);
  600. }
  601. return aligned;
  602. }
  603. function label(label2, contents) {
  604. assertDoc(contents);
  605. return label2 ? { type: DOC_TYPE_LABEL, label: label2, contents } : contents;
  606. }
  607. // scripts/build/shims/string-replace-all.js
  608. var stringReplaceAll = (isOptionalObject, original, pattern, replacement) => {
  609. if (isOptionalObject && (original === void 0 || original === null)) {
  610. return;
  611. }
  612. if (original.replaceAll) {
  613. return original.replaceAll(pattern, replacement);
  614. }
  615. if (pattern.global) {
  616. return original.replace(pattern, replacement);
  617. }
  618. return original.split(pattern).join(replacement);
  619. };
  620. var string_replace_all_default = stringReplaceAll;
  621. // src/common/end-of-line.js
  622. function convertEndOfLineToChars(value) {
  623. switch (value) {
  624. case "cr":
  625. return "\r";
  626. case "crlf":
  627. return "\r\n";
  628. default:
  629. return "\n";
  630. }
  631. }
  632. // node_modules/emoji-regex/index.mjs
  633. var emoji_regex_default = () => {
  634. return /[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE])))?))?|\uDC6F(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDD75(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE89\uDE8F-\uDEC2\uDEC6\uDECE-\uDEDC\uDEDF-\uDEE9]|\uDD3C(?:\u200D[\u2640\u2642]\uFE0F?|\uD83C[\uDFFB-\uDFFF])?|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g;
  635. };
  636. // node_modules/get-east-asian-width/lookup.js
  637. function isFullWidth(x) {
  638. return x === 12288 || x >= 65281 && x <= 65376 || x >= 65504 && x <= 65510;
  639. }
  640. function isWide(x) {
  641. return x >= 4352 && x <= 4447 || x === 8986 || x === 8987 || x === 9001 || x === 9002 || x >= 9193 && x <= 9196 || x === 9200 || x === 9203 || x === 9725 || x === 9726 || x === 9748 || x === 9749 || x >= 9776 && x <= 9783 || x >= 9800 && x <= 9811 || x === 9855 || x >= 9866 && x <= 9871 || x === 9875 || x === 9889 || x === 9898 || x === 9899 || x === 9917 || x === 9918 || x === 9924 || x === 9925 || x === 9934 || x === 9940 || x === 9962 || x === 9970 || x === 9971 || x === 9973 || x === 9978 || x === 9981 || x === 9989 || x === 9994 || x === 9995 || x === 10024 || x === 10060 || x === 10062 || x >= 10067 && x <= 10069 || x === 10071 || x >= 10133 && x <= 10135 || x === 10160 || x === 10175 || x === 11035 || x === 11036 || x === 11088 || x === 11093 || x >= 11904 && x <= 11929 || x >= 11931 && x <= 12019 || x >= 12032 && x <= 12245 || x >= 12272 && x <= 12287 || x >= 12289 && x <= 12350 || x >= 12353 && x <= 12438 || x >= 12441 && x <= 12543 || x >= 12549 && x <= 12591 || x >= 12593 && x <= 12686 || x >= 12688 && x <= 12773 || x >= 12783 && x <= 12830 || x >= 12832 && x <= 12871 || x >= 12880 && x <= 42124 || x >= 42128 && x <= 42182 || x >= 43360 && x <= 43388 || x >= 44032 && x <= 55203 || x >= 63744 && x <= 64255 || x >= 65040 && x <= 65049 || x >= 65072 && x <= 65106 || x >= 65108 && x <= 65126 || x >= 65128 && x <= 65131 || x >= 94176 && x <= 94180 || x === 94192 || x === 94193 || x >= 94208 && x <= 100343 || x >= 100352 && x <= 101589 || x >= 101631 && x <= 101640 || x >= 110576 && x <= 110579 || x >= 110581 && x <= 110587 || x === 110589 || x === 110590 || x >= 110592 && x <= 110882 || x === 110898 || x >= 110928 && x <= 110930 || x === 110933 || x >= 110948 && x <= 110951 || x >= 110960 && x <= 111355 || x >= 119552 && x <= 119638 || x >= 119648 && x <= 119670 || x === 126980 || x === 127183 || x === 127374 || x >= 127377 && x <= 127386 || x >= 127488 && x <= 127490 || x >= 127504 && x <= 127547 || x >= 127552 && x <= 127560 || x === 127568 || x === 127569 || x >= 127584 && x <= 127589 || x >= 127744 && x <= 127776 || x >= 127789 && x <= 127797 || x >= 127799 && x <= 127868 || x >= 127870 && x <= 127891 || x >= 127904 && x <= 127946 || x >= 127951 && x <= 127955 || x >= 127968 && x <= 127984 || x === 127988 || x >= 127992 && x <= 128062 || x === 128064 || x >= 128066 && x <= 128252 || x >= 128255 && x <= 128317 || x >= 128331 && x <= 128334 || x >= 128336 && x <= 128359 || x === 128378 || x === 128405 || x === 128406 || x === 128420 || x >= 128507 && x <= 128591 || x >= 128640 && x <= 128709 || x === 128716 || x >= 128720 && x <= 128722 || x >= 128725 && x <= 128727 || x >= 128732 && x <= 128735 || x === 128747 || x === 128748 || x >= 128756 && x <= 128764 || x >= 128992 && x <= 129003 || x === 129008 || x >= 129292 && x <= 129338 || x >= 129340 && x <= 129349 || x >= 129351 && x <= 129535 || x >= 129648 && x <= 129660 || x >= 129664 && x <= 129673 || x >= 129679 && x <= 129734 || x >= 129742 && x <= 129756 || x >= 129759 && x <= 129769 || x >= 129776 && x <= 129784 || x >= 131072 && x <= 196605 || x >= 196608 && x <= 262141;
  642. }
  643. // node_modules/get-east-asian-width/index.js
  644. var _isNarrowWidth = (codePoint) => !(isFullWidth(codePoint) || isWide(codePoint));
  645. // src/utils/get-string-width.js
  646. var notAsciiRegex = /[^\x20-\x7F]/u;
  647. function getStringWidth(text) {
  648. if (!text) {
  649. return 0;
  650. }
  651. if (!notAsciiRegex.test(text)) {
  652. return text.length;
  653. }
  654. text = text.replace(emoji_regex_default(), " ");
  655. let width = 0;
  656. for (const character of text) {
  657. const codePoint = character.codePointAt(0);
  658. if (codePoint <= 31 || codePoint >= 127 && codePoint <= 159) {
  659. continue;
  660. }
  661. if (codePoint >= 768 && codePoint <= 879) {
  662. continue;
  663. }
  664. width += _isNarrowWidth(codePoint) ? 1 : 2;
  665. }
  666. return width;
  667. }
  668. var get_string_width_default = getStringWidth;
  669. // src/document/printer.js
  670. var MODE_BREAK = Symbol("MODE_BREAK");
  671. var MODE_FLAT = Symbol("MODE_FLAT");
  672. var CURSOR_PLACEHOLDER = Symbol("cursor");
  673. var DOC_FILL_PRINTED_LENGTH = Symbol("DOC_FILL_PRINTED_LENGTH");
  674. function rootIndent() {
  675. return { value: "", length: 0, queue: [] };
  676. }
  677. function makeIndent(ind, options) {
  678. return generateInd(ind, { type: "indent" }, options);
  679. }
  680. function makeAlign(indent2, widthOrDoc, options) {
  681. if (widthOrDoc === Number.NEGATIVE_INFINITY) {
  682. return indent2.root || rootIndent();
  683. }
  684. if (widthOrDoc < 0) {
  685. return generateInd(indent2, { type: "dedent" }, options);
  686. }
  687. if (!widthOrDoc) {
  688. return indent2;
  689. }
  690. if (widthOrDoc.type === "root") {
  691. return { ...indent2, root: indent2 };
  692. }
  693. const alignType = typeof widthOrDoc === "string" ? "stringAlign" : "numberAlign";
  694. return generateInd(indent2, { type: alignType, n: widthOrDoc }, options);
  695. }
  696. function generateInd(ind, newPart, options) {
  697. const queue = newPart.type === "dedent" ? ind.queue.slice(0, -1) : [...ind.queue, newPart];
  698. let value = "";
  699. let length = 0;
  700. let lastTabs = 0;
  701. let lastSpaces = 0;
  702. for (const part of queue) {
  703. switch (part.type) {
  704. case "indent":
  705. flush();
  706. if (options.useTabs) {
  707. addTabs(1);
  708. } else {
  709. addSpaces(options.tabWidth);
  710. }
  711. break;
  712. case "stringAlign":
  713. flush();
  714. value += part.n;
  715. length += part.n.length;
  716. break;
  717. case "numberAlign":
  718. lastTabs += 1;
  719. lastSpaces += part.n;
  720. break;
  721. default:
  722. throw new Error(`Unexpected type '${part.type}'`);
  723. }
  724. }
  725. flushSpaces();
  726. return { ...ind, value, length, queue };
  727. function addTabs(count) {
  728. value += " ".repeat(count);
  729. length += options.tabWidth * count;
  730. }
  731. function addSpaces(count) {
  732. value += " ".repeat(count);
  733. length += count;
  734. }
  735. function flush() {
  736. if (options.useTabs) {
  737. flushTabs();
  738. } else {
  739. flushSpaces();
  740. }
  741. }
  742. function flushTabs() {
  743. if (lastTabs > 0) {
  744. addTabs(lastTabs);
  745. }
  746. resetLast();
  747. }
  748. function flushSpaces() {
  749. if (lastSpaces > 0) {
  750. addSpaces(lastSpaces);
  751. }
  752. resetLast();
  753. }
  754. function resetLast() {
  755. lastTabs = 0;
  756. lastSpaces = 0;
  757. }
  758. }
  759. function trim2(out) {
  760. let trimCount = 0;
  761. let cursorCount = 0;
  762. let outIndex = out.length;
  763. outer: while (outIndex--) {
  764. const last = out[outIndex];
  765. if (last === CURSOR_PLACEHOLDER) {
  766. cursorCount++;
  767. continue;
  768. }
  769. if (false) {
  770. throw new Error(`Unexpected value in trim: '${typeof last}'`);
  771. }
  772. for (let charIndex = last.length - 1; charIndex >= 0; charIndex--) {
  773. const char = last[charIndex];
  774. if (char === " " || char === " ") {
  775. trimCount++;
  776. } else {
  777. out[outIndex] = last.slice(0, charIndex + 1);
  778. break outer;
  779. }
  780. }
  781. }
  782. if (trimCount > 0 || cursorCount > 0) {
  783. out.length = outIndex + 1;
  784. while (cursorCount-- > 0) {
  785. out.push(CURSOR_PLACEHOLDER);
  786. }
  787. }
  788. return trimCount;
  789. }
  790. function fits(next, restCommands, width, hasLineSuffix, groupModeMap, mustBeFlat) {
  791. if (width === Number.POSITIVE_INFINITY) {
  792. return true;
  793. }
  794. let restIdx = restCommands.length;
  795. const cmds = [next];
  796. const out = [];
  797. while (width >= 0) {
  798. if (cmds.length === 0) {
  799. if (restIdx === 0) {
  800. return true;
  801. }
  802. cmds.push(restCommands[--restIdx]);
  803. continue;
  804. }
  805. const { mode, doc } = cmds.pop();
  806. const docType = get_doc_type_default(doc);
  807. switch (docType) {
  808. case DOC_TYPE_STRING:
  809. out.push(doc);
  810. width -= get_string_width_default(doc);
  811. break;
  812. case DOC_TYPE_ARRAY:
  813. case DOC_TYPE_FILL: {
  814. const parts = docType === DOC_TYPE_ARRAY ? doc : doc.parts;
  815. const end = doc[DOC_FILL_PRINTED_LENGTH] ?? 0;
  816. for (let i = parts.length - 1; i >= end; i--) {
  817. cmds.push({ mode, doc: parts[i] });
  818. }
  819. break;
  820. }
  821. case DOC_TYPE_INDENT:
  822. case DOC_TYPE_ALIGN:
  823. case DOC_TYPE_INDENT_IF_BREAK:
  824. case DOC_TYPE_LABEL:
  825. cmds.push({ mode, doc: doc.contents });
  826. break;
  827. case DOC_TYPE_TRIM:
  828. width += trim2(out);
  829. break;
  830. case DOC_TYPE_GROUP: {
  831. if (mustBeFlat && doc.break) {
  832. return false;
  833. }
  834. const groupMode = doc.break ? MODE_BREAK : mode;
  835. const contents = doc.expandedStates && groupMode === MODE_BREAK ? at_default(
  836. /* isOptionalObject */
  837. false,
  838. doc.expandedStates,
  839. -1
  840. ) : doc.contents;
  841. cmds.push({ mode: groupMode, doc: contents });
  842. break;
  843. }
  844. case DOC_TYPE_IF_BREAK: {
  845. const groupMode = doc.groupId ? groupModeMap[doc.groupId] || MODE_FLAT : mode;
  846. const contents = groupMode === MODE_BREAK ? doc.breakContents : doc.flatContents;
  847. if (contents) {
  848. cmds.push({ mode, doc: contents });
  849. }
  850. break;
  851. }
  852. case DOC_TYPE_LINE:
  853. if (mode === MODE_BREAK || doc.hard) {
  854. return true;
  855. }
  856. if (!doc.soft) {
  857. out.push(" ");
  858. width--;
  859. }
  860. break;
  861. case DOC_TYPE_LINE_SUFFIX:
  862. hasLineSuffix = true;
  863. break;
  864. case DOC_TYPE_LINE_SUFFIX_BOUNDARY:
  865. if (hasLineSuffix) {
  866. return false;
  867. }
  868. break;
  869. }
  870. }
  871. return false;
  872. }
  873. function printDocToString(doc, options) {
  874. const groupModeMap = {};
  875. const width = options.printWidth;
  876. const newLine = convertEndOfLineToChars(options.endOfLine);
  877. let pos = 0;
  878. const cmds = [{ ind: rootIndent(), mode: MODE_BREAK, doc }];
  879. const out = [];
  880. let shouldRemeasure = false;
  881. const lineSuffix2 = [];
  882. let printedCursorCount = 0;
  883. propagateBreaks(doc);
  884. while (cmds.length > 0) {
  885. const { ind, mode, doc: doc2 } = cmds.pop();
  886. switch (get_doc_type_default(doc2)) {
  887. case DOC_TYPE_STRING: {
  888. const formatted = newLine !== "\n" ? string_replace_all_default(
  889. /* isOptionalObject */
  890. false,
  891. doc2,
  892. "\n",
  893. newLine
  894. ) : doc2;
  895. out.push(formatted);
  896. if (cmds.length > 0) {
  897. pos += get_string_width_default(formatted);
  898. }
  899. break;
  900. }
  901. case DOC_TYPE_ARRAY:
  902. for (let i = doc2.length - 1; i >= 0; i--) {
  903. cmds.push({ ind, mode, doc: doc2[i] });
  904. }
  905. break;
  906. case DOC_TYPE_CURSOR:
  907. if (printedCursorCount >= 2) {
  908. throw new Error("There are too many 'cursor' in doc.");
  909. }
  910. out.push(CURSOR_PLACEHOLDER);
  911. printedCursorCount++;
  912. break;
  913. case DOC_TYPE_INDENT:
  914. cmds.push({ ind: makeIndent(ind, options), mode, doc: doc2.contents });
  915. break;
  916. case DOC_TYPE_ALIGN:
  917. cmds.push({
  918. ind: makeAlign(ind, doc2.n, options),
  919. mode,
  920. doc: doc2.contents
  921. });
  922. break;
  923. case DOC_TYPE_TRIM:
  924. pos -= trim2(out);
  925. break;
  926. case DOC_TYPE_GROUP:
  927. switch (mode) {
  928. case MODE_FLAT:
  929. if (!shouldRemeasure) {
  930. cmds.push({
  931. ind,
  932. mode: doc2.break ? MODE_BREAK : MODE_FLAT,
  933. doc: doc2.contents
  934. });
  935. break;
  936. }
  937. // fallthrough
  938. case MODE_BREAK: {
  939. shouldRemeasure = false;
  940. const next = { ind, mode: MODE_FLAT, doc: doc2.contents };
  941. const rem = width - pos;
  942. const hasLineSuffix = lineSuffix2.length > 0;
  943. if (!doc2.break && fits(next, cmds, rem, hasLineSuffix, groupModeMap)) {
  944. cmds.push(next);
  945. } else {
  946. if (doc2.expandedStates) {
  947. const mostExpanded = at_default(
  948. /* isOptionalObject */
  949. false,
  950. doc2.expandedStates,
  951. -1
  952. );
  953. if (doc2.break) {
  954. cmds.push({ ind, mode: MODE_BREAK, doc: mostExpanded });
  955. break;
  956. } else {
  957. for (let i = 1; i < doc2.expandedStates.length + 1; i++) {
  958. if (i >= doc2.expandedStates.length) {
  959. cmds.push({ ind, mode: MODE_BREAK, doc: mostExpanded });
  960. break;
  961. } else {
  962. const state = doc2.expandedStates[i];
  963. const cmd = { ind, mode: MODE_FLAT, doc: state };
  964. if (fits(cmd, cmds, rem, hasLineSuffix, groupModeMap)) {
  965. cmds.push(cmd);
  966. break;
  967. }
  968. }
  969. }
  970. }
  971. } else {
  972. cmds.push({ ind, mode: MODE_BREAK, doc: doc2.contents });
  973. }
  974. }
  975. break;
  976. }
  977. }
  978. if (doc2.id) {
  979. groupModeMap[doc2.id] = at_default(
  980. /* isOptionalObject */
  981. false,
  982. cmds,
  983. -1
  984. ).mode;
  985. }
  986. break;
  987. // Fills each line with as much code as possible before moving to a new
  988. // line with the same indentation.
  989. //
  990. // Expects doc.parts to be an array of alternating content and
  991. // whitespace. The whitespace contains the linebreaks.
  992. //
  993. // For example:
  994. // ["I", line, "love", line, "monkeys"]
  995. // or
  996. // [{ type: group, ... }, softline, { type: group, ... }]
  997. //
  998. // It uses this parts structure to handle three main layout cases:
  999. // * The first two content items fit on the same line without
  1000. // breaking
  1001. // -> output the first content item and the whitespace "flat".
  1002. // * Only the first content item fits on the line without breaking
  1003. // -> output the first content item "flat" and the whitespace with
  1004. // "break".
  1005. // * Neither content item fits on the line without breaking
  1006. // -> output the first content item and the whitespace with "break".
  1007. case DOC_TYPE_FILL: {
  1008. const rem = width - pos;
  1009. const offset = doc2[DOC_FILL_PRINTED_LENGTH] ?? 0;
  1010. const { parts } = doc2;
  1011. const length = parts.length - offset;
  1012. if (length === 0) {
  1013. break;
  1014. }
  1015. const content = parts[offset + 0];
  1016. const whitespace = parts[offset + 1];
  1017. const contentFlatCmd = { ind, mode: MODE_FLAT, doc: content };
  1018. const contentBreakCmd = { ind, mode: MODE_BREAK, doc: content };
  1019. const contentFits = fits(
  1020. contentFlatCmd,
  1021. [],
  1022. rem,
  1023. lineSuffix2.length > 0,
  1024. groupModeMap,
  1025. true
  1026. );
  1027. if (length === 1) {
  1028. if (contentFits) {
  1029. cmds.push(contentFlatCmd);
  1030. } else {
  1031. cmds.push(contentBreakCmd);
  1032. }
  1033. break;
  1034. }
  1035. const whitespaceFlatCmd = { ind, mode: MODE_FLAT, doc: whitespace };
  1036. const whitespaceBreakCmd = { ind, mode: MODE_BREAK, doc: whitespace };
  1037. if (length === 2) {
  1038. if (contentFits) {
  1039. cmds.push(whitespaceFlatCmd, contentFlatCmd);
  1040. } else {
  1041. cmds.push(whitespaceBreakCmd, contentBreakCmd);
  1042. }
  1043. break;
  1044. }
  1045. const secondContent = parts[offset + 2];
  1046. const remainingCmd = {
  1047. ind,
  1048. mode,
  1049. doc: { ...doc2, [DOC_FILL_PRINTED_LENGTH]: offset + 2 }
  1050. };
  1051. const firstAndSecondContentFlatCmd = {
  1052. ind,
  1053. mode: MODE_FLAT,
  1054. doc: [content, whitespace, secondContent]
  1055. };
  1056. const firstAndSecondContentFits = fits(
  1057. firstAndSecondContentFlatCmd,
  1058. [],
  1059. rem,
  1060. lineSuffix2.length > 0,
  1061. groupModeMap,
  1062. true
  1063. );
  1064. if (firstAndSecondContentFits) {
  1065. cmds.push(remainingCmd, whitespaceFlatCmd, contentFlatCmd);
  1066. } else if (contentFits) {
  1067. cmds.push(remainingCmd, whitespaceBreakCmd, contentFlatCmd);
  1068. } else {
  1069. cmds.push(remainingCmd, whitespaceBreakCmd, contentBreakCmd);
  1070. }
  1071. break;
  1072. }
  1073. case DOC_TYPE_IF_BREAK:
  1074. case DOC_TYPE_INDENT_IF_BREAK: {
  1075. const groupMode = doc2.groupId ? groupModeMap[doc2.groupId] : mode;
  1076. if (groupMode === MODE_BREAK) {
  1077. const breakContents = doc2.type === DOC_TYPE_IF_BREAK ? doc2.breakContents : doc2.negate ? doc2.contents : indent(doc2.contents);
  1078. if (breakContents) {
  1079. cmds.push({ ind, mode, doc: breakContents });
  1080. }
  1081. }
  1082. if (groupMode === MODE_FLAT) {
  1083. const flatContents = doc2.type === DOC_TYPE_IF_BREAK ? doc2.flatContents : doc2.negate ? indent(doc2.contents) : doc2.contents;
  1084. if (flatContents) {
  1085. cmds.push({ ind, mode, doc: flatContents });
  1086. }
  1087. }
  1088. break;
  1089. }
  1090. case DOC_TYPE_LINE_SUFFIX:
  1091. lineSuffix2.push({ ind, mode, doc: doc2.contents });
  1092. break;
  1093. case DOC_TYPE_LINE_SUFFIX_BOUNDARY:
  1094. if (lineSuffix2.length > 0) {
  1095. cmds.push({ ind, mode, doc: hardlineWithoutBreakParent });
  1096. }
  1097. break;
  1098. case DOC_TYPE_LINE:
  1099. switch (mode) {
  1100. case MODE_FLAT:
  1101. if (!doc2.hard) {
  1102. if (!doc2.soft) {
  1103. out.push(" ");
  1104. pos += 1;
  1105. }
  1106. break;
  1107. } else {
  1108. shouldRemeasure = true;
  1109. }
  1110. // fallthrough
  1111. case MODE_BREAK:
  1112. if (lineSuffix2.length > 0) {
  1113. cmds.push({ ind, mode, doc: doc2 }, ...lineSuffix2.reverse());
  1114. lineSuffix2.length = 0;
  1115. break;
  1116. }
  1117. if (doc2.literal) {
  1118. if (ind.root) {
  1119. out.push(newLine, ind.root.value);
  1120. pos = ind.root.length;
  1121. } else {
  1122. out.push(newLine);
  1123. pos = 0;
  1124. }
  1125. } else {
  1126. pos -= trim2(out);
  1127. out.push(newLine + ind.value);
  1128. pos = ind.length;
  1129. }
  1130. break;
  1131. }
  1132. break;
  1133. case DOC_TYPE_LABEL:
  1134. cmds.push({ ind, mode, doc: doc2.contents });
  1135. break;
  1136. case DOC_TYPE_BREAK_PARENT:
  1137. break;
  1138. default:
  1139. throw new invalid_doc_error_default(doc2);
  1140. }
  1141. if (cmds.length === 0 && lineSuffix2.length > 0) {
  1142. cmds.push(...lineSuffix2.reverse());
  1143. lineSuffix2.length = 0;
  1144. }
  1145. }
  1146. const cursorPlaceholderIndex = out.indexOf(CURSOR_PLACEHOLDER);
  1147. if (cursorPlaceholderIndex !== -1) {
  1148. const otherCursorPlaceholderIndex = out.indexOf(
  1149. CURSOR_PLACEHOLDER,
  1150. cursorPlaceholderIndex + 1
  1151. );
  1152. if (otherCursorPlaceholderIndex === -1) {
  1153. return {
  1154. formatted: out.filter((char) => char !== CURSOR_PLACEHOLDER).join("")
  1155. };
  1156. }
  1157. const beforeCursor = out.slice(0, cursorPlaceholderIndex).join("");
  1158. const aroundCursor = out.slice(cursorPlaceholderIndex + 1, otherCursorPlaceholderIndex).join("");
  1159. const afterCursor = out.slice(otherCursorPlaceholderIndex + 1).join("");
  1160. return {
  1161. formatted: beforeCursor + aroundCursor + afterCursor,
  1162. cursorNodeStart: beforeCursor.length,
  1163. cursorNodeText: aroundCursor
  1164. };
  1165. }
  1166. return { formatted: out.join("") };
  1167. }
  1168. // src/document/public.js
  1169. var builders = {
  1170. join,
  1171. line,
  1172. softline,
  1173. hardline,
  1174. literalline,
  1175. group,
  1176. conditionalGroup,
  1177. fill,
  1178. lineSuffix,
  1179. lineSuffixBoundary,
  1180. cursor,
  1181. breakParent,
  1182. ifBreak,
  1183. trim,
  1184. indent,
  1185. indentIfBreak,
  1186. align,
  1187. addAlignmentToDoc,
  1188. markAsRoot,
  1189. dedentToRoot,
  1190. dedent,
  1191. hardlineWithoutBreakParent,
  1192. literallineWithoutBreakParent,
  1193. label,
  1194. // TODO: Remove this in v4
  1195. concat: (parts) => parts
  1196. };
  1197. var printer = { printDocToString };
  1198. var utils = {
  1199. willBreak,
  1200. traverseDoc: traverse_doc_default,
  1201. findInDoc,
  1202. mapDoc,
  1203. removeLines,
  1204. stripTrailingHardline,
  1205. replaceEndOfLine,
  1206. canBreak
  1207. };
  1208. // with-default-export:src/document/public.js
  1209. var public_default = public_exports;
  1210. export {
  1211. builders,
  1212. public_default as default,
  1213. printer,
  1214. utils
  1215. };