doc.js 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261
  1. (function (factory) {
  2. function interopModuleDefault() {
  3. var module = factory();
  4. return module.default || module;
  5. }
  6. if (typeof exports === "object" && typeof module === "object") {
  7. module.exports = interopModuleDefault();
  8. } else if (typeof define === "function" && define.amd) {
  9. define(interopModuleDefault);
  10. } else {
  11. var root =
  12. typeof globalThis !== "undefined"
  13. ? globalThis
  14. : typeof global !== "undefined"
  15. ? global
  16. : typeof self !== "undefined"
  17. ? self
  18. : this || {};
  19. root.doc = interopModuleDefault();
  20. }
  21. })(function () {
  22. "use strict";
  23. var __defProp = Object.defineProperty;
  24. var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  25. var __getOwnPropNames = Object.getOwnPropertyNames;
  26. var __hasOwnProp = Object.prototype.hasOwnProperty;
  27. var __export = (target, all) => {
  28. for (var name in all)
  29. __defProp(target, name, { get: all[name], enumerable: true });
  30. };
  31. var __copyProps = (to, from, except, desc) => {
  32. if (from && typeof from === "object" || typeof from === "function") {
  33. for (let key of __getOwnPropNames(from))
  34. if (!__hasOwnProp.call(to, key) && key !== except)
  35. __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  36. }
  37. return to;
  38. };
  39. var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
  40. // src/document/public.js
  41. var public_exports = {};
  42. __export(public_exports, {
  43. builders: () => builders,
  44. printer: () => printer,
  45. utils: () => utils
  46. });
  47. // src/document/constants.js
  48. var DOC_TYPE_STRING = "string";
  49. var DOC_TYPE_ARRAY = "array";
  50. var DOC_TYPE_CURSOR = "cursor";
  51. var DOC_TYPE_INDENT = "indent";
  52. var DOC_TYPE_ALIGN = "align";
  53. var DOC_TYPE_TRIM = "trim";
  54. var DOC_TYPE_GROUP = "group";
  55. var DOC_TYPE_FILL = "fill";
  56. var DOC_TYPE_IF_BREAK = "if-break";
  57. var DOC_TYPE_INDENT_IF_BREAK = "indent-if-break";
  58. var DOC_TYPE_LINE_SUFFIX = "line-suffix";
  59. var DOC_TYPE_LINE_SUFFIX_BOUNDARY = "line-suffix-boundary";
  60. var DOC_TYPE_LINE = "line";
  61. var DOC_TYPE_LABEL = "label";
  62. var DOC_TYPE_BREAK_PARENT = "break-parent";
  63. var VALID_OBJECT_DOC_TYPES = /* @__PURE__ */ new Set([
  64. DOC_TYPE_CURSOR,
  65. DOC_TYPE_INDENT,
  66. DOC_TYPE_ALIGN,
  67. DOC_TYPE_TRIM,
  68. DOC_TYPE_GROUP,
  69. DOC_TYPE_FILL,
  70. DOC_TYPE_IF_BREAK,
  71. DOC_TYPE_INDENT_IF_BREAK,
  72. DOC_TYPE_LINE_SUFFIX,
  73. DOC_TYPE_LINE_SUFFIX_BOUNDARY,
  74. DOC_TYPE_LINE,
  75. DOC_TYPE_LABEL,
  76. DOC_TYPE_BREAK_PARENT
  77. ]);
  78. // scripts/build/shims/at.js
  79. var at = (isOptionalObject, object, index) => {
  80. if (isOptionalObject && (object === void 0 || object === null)) {
  81. return;
  82. }
  83. if (Array.isArray(object) || typeof object === "string") {
  84. return object[index < 0 ? object.length + index : index];
  85. }
  86. return object.at(index);
  87. };
  88. var at_default = at;
  89. // src/document/utils/get-doc-type.js
  90. function getDocType(doc) {
  91. if (typeof doc === "string") {
  92. return DOC_TYPE_STRING;
  93. }
  94. if (Array.isArray(doc)) {
  95. return DOC_TYPE_ARRAY;
  96. }
  97. if (!doc) {
  98. return;
  99. }
  100. const { type } = doc;
  101. if (VALID_OBJECT_DOC_TYPES.has(type)) {
  102. return type;
  103. }
  104. }
  105. var get_doc_type_default = getDocType;
  106. // src/document/invalid-doc-error.js
  107. var disjunctionListFormat = (list) => new Intl.ListFormat("en-US", { type: "disjunction" }).format(list);
  108. function getDocErrorMessage(doc) {
  109. const type = doc === null ? "null" : typeof doc;
  110. if (type !== "string" && type !== "object") {
  111. return `Unexpected doc '${type}',
  112. Expected it to be 'string' or 'object'.`;
  113. }
  114. if (get_doc_type_default(doc)) {
  115. throw new Error("doc is valid.");
  116. }
  117. const objectType = Object.prototype.toString.call(doc);
  118. if (objectType !== "[object Object]") {
  119. return `Unexpected doc '${objectType}'.`;
  120. }
  121. const EXPECTED_TYPE_VALUES = disjunctionListFormat(
  122. [...VALID_OBJECT_DOC_TYPES].map((type2) => `'${type2}'`)
  123. );
  124. return `Unexpected doc.type '${doc.type}'.
  125. Expected it to be ${EXPECTED_TYPE_VALUES}.`;
  126. }
  127. var InvalidDocError = class extends Error {
  128. name = "InvalidDocError";
  129. constructor(doc) {
  130. super(getDocErrorMessage(doc));
  131. this.doc = doc;
  132. }
  133. };
  134. var invalid_doc_error_default = InvalidDocError;
  135. // src/document/utils/traverse-doc.js
  136. var traverseDocOnExitStackMarker = {};
  137. function traverseDoc(doc, onEnter, onExit, shouldTraverseConditionalGroups) {
  138. const docsStack = [doc];
  139. while (docsStack.length > 0) {
  140. const doc2 = docsStack.pop();
  141. if (doc2 === traverseDocOnExitStackMarker) {
  142. onExit(docsStack.pop());
  143. continue;
  144. }
  145. if (onExit) {
  146. docsStack.push(doc2, traverseDocOnExitStackMarker);
  147. }
  148. const docType = get_doc_type_default(doc2);
  149. if (!docType) {
  150. throw new invalid_doc_error_default(doc2);
  151. }
  152. if ((onEnter == null ? void 0 : onEnter(doc2)) === false) {
  153. continue;
  154. }
  155. switch (docType) {
  156. case DOC_TYPE_ARRAY:
  157. case DOC_TYPE_FILL: {
  158. const parts = docType === DOC_TYPE_ARRAY ? doc2 : doc2.parts;
  159. for (let ic = parts.length, i = ic - 1; i >= 0; --i) {
  160. docsStack.push(parts[i]);
  161. }
  162. break;
  163. }
  164. case DOC_TYPE_IF_BREAK:
  165. docsStack.push(doc2.flatContents, doc2.breakContents);
  166. break;
  167. case DOC_TYPE_GROUP:
  168. if (shouldTraverseConditionalGroups && doc2.expandedStates) {
  169. for (let ic = doc2.expandedStates.length, i = ic - 1; i >= 0; --i) {
  170. docsStack.push(doc2.expandedStates[i]);
  171. }
  172. } else {
  173. docsStack.push(doc2.contents);
  174. }
  175. break;
  176. case DOC_TYPE_ALIGN:
  177. case DOC_TYPE_INDENT:
  178. case DOC_TYPE_INDENT_IF_BREAK:
  179. case DOC_TYPE_LABEL:
  180. case DOC_TYPE_LINE_SUFFIX:
  181. docsStack.push(doc2.contents);
  182. break;
  183. case DOC_TYPE_STRING:
  184. case DOC_TYPE_CURSOR:
  185. case DOC_TYPE_TRIM:
  186. case DOC_TYPE_LINE_SUFFIX_BOUNDARY:
  187. case DOC_TYPE_LINE:
  188. case DOC_TYPE_BREAK_PARENT:
  189. break;
  190. default:
  191. throw new invalid_doc_error_default(doc2);
  192. }
  193. }
  194. }
  195. var traverse_doc_default = traverseDoc;
  196. // src/document/utils.js
  197. function mapDoc(doc, cb) {
  198. if (typeof doc === "string") {
  199. return cb(doc);
  200. }
  201. const mapped = /* @__PURE__ */ new Map();
  202. return rec(doc);
  203. function rec(doc2) {
  204. if (mapped.has(doc2)) {
  205. return mapped.get(doc2);
  206. }
  207. const result = process2(doc2);
  208. mapped.set(doc2, result);
  209. return result;
  210. }
  211. function process2(doc2) {
  212. switch (get_doc_type_default(doc2)) {
  213. case DOC_TYPE_ARRAY:
  214. return cb(doc2.map(rec));
  215. case DOC_TYPE_FILL:
  216. return cb({ ...doc2, parts: doc2.parts.map(rec) });
  217. case DOC_TYPE_IF_BREAK:
  218. return cb({
  219. ...doc2,
  220. breakContents: rec(doc2.breakContents),
  221. flatContents: rec(doc2.flatContents)
  222. });
  223. case DOC_TYPE_GROUP: {
  224. let { expandedStates, contents } = doc2;
  225. if (expandedStates) {
  226. expandedStates = expandedStates.map(rec);
  227. contents = expandedStates[0];
  228. } else {
  229. contents = rec(contents);
  230. }
  231. return cb({ ...doc2, contents, expandedStates });
  232. }
  233. case DOC_TYPE_ALIGN:
  234. case DOC_TYPE_INDENT:
  235. case DOC_TYPE_INDENT_IF_BREAK:
  236. case DOC_TYPE_LABEL:
  237. case DOC_TYPE_LINE_SUFFIX:
  238. return cb({ ...doc2, contents: rec(doc2.contents) });
  239. case DOC_TYPE_STRING:
  240. case DOC_TYPE_CURSOR:
  241. case DOC_TYPE_TRIM:
  242. case DOC_TYPE_LINE_SUFFIX_BOUNDARY:
  243. case DOC_TYPE_LINE:
  244. case DOC_TYPE_BREAK_PARENT:
  245. return cb(doc2);
  246. default:
  247. throw new invalid_doc_error_default(doc2);
  248. }
  249. }
  250. }
  251. function findInDoc(doc, fn, defaultValue) {
  252. let result = defaultValue;
  253. let shouldSkipFurtherProcessing = false;
  254. function findInDocOnEnterFn(doc2) {
  255. if (shouldSkipFurtherProcessing) {
  256. return false;
  257. }
  258. const maybeResult = fn(doc2);
  259. if (maybeResult !== void 0) {
  260. shouldSkipFurtherProcessing = true;
  261. result = maybeResult;
  262. }
  263. }
  264. traverse_doc_default(doc, findInDocOnEnterFn);
  265. return result;
  266. }
  267. function willBreakFn(doc) {
  268. if (doc.type === DOC_TYPE_GROUP && doc.break) {
  269. return true;
  270. }
  271. if (doc.type === DOC_TYPE_LINE && doc.hard) {
  272. return true;
  273. }
  274. if (doc.type === DOC_TYPE_BREAK_PARENT) {
  275. return true;
  276. }
  277. }
  278. function willBreak(doc) {
  279. return findInDoc(doc, willBreakFn, false);
  280. }
  281. function breakParentGroup(groupStack) {
  282. if (groupStack.length > 0) {
  283. const parentGroup = at_default(
  284. /* isOptionalObject */
  285. false,
  286. groupStack,
  287. -1
  288. );
  289. if (!parentGroup.expandedStates && !parentGroup.break) {
  290. parentGroup.break = "propagated";
  291. }
  292. }
  293. return null;
  294. }
  295. function propagateBreaks(doc) {
  296. const alreadyVisitedSet = /* @__PURE__ */ new Set();
  297. const groupStack = [];
  298. function propagateBreaksOnEnterFn(doc2) {
  299. if (doc2.type === DOC_TYPE_BREAK_PARENT) {
  300. breakParentGroup(groupStack);
  301. }
  302. if (doc2.type === DOC_TYPE_GROUP) {
  303. groupStack.push(doc2);
  304. if (alreadyVisitedSet.has(doc2)) {
  305. return false;
  306. }
  307. alreadyVisitedSet.add(doc2);
  308. }
  309. }
  310. function propagateBreaksOnExitFn(doc2) {
  311. if (doc2.type === DOC_TYPE_GROUP) {
  312. const group2 = groupStack.pop();
  313. if (group2.break) {
  314. breakParentGroup(groupStack);
  315. }
  316. }
  317. }
  318. traverse_doc_default(
  319. doc,
  320. propagateBreaksOnEnterFn,
  321. propagateBreaksOnExitFn,
  322. /* shouldTraverseConditionalGroups */
  323. true
  324. );
  325. }
  326. function removeLinesFn(doc) {
  327. if (doc.type === DOC_TYPE_LINE && !doc.hard) {
  328. return doc.soft ? "" : " ";
  329. }
  330. if (doc.type === DOC_TYPE_IF_BREAK) {
  331. return doc.flatContents;
  332. }
  333. return doc;
  334. }
  335. function removeLines(doc) {
  336. return mapDoc(doc, removeLinesFn);
  337. }
  338. function stripTrailingHardlineFromParts(parts) {
  339. parts = [...parts];
  340. while (parts.length >= 2 && at_default(
  341. /* isOptionalObject */
  342. false,
  343. parts,
  344. -2
  345. ).type === DOC_TYPE_LINE && at_default(
  346. /* isOptionalObject */
  347. false,
  348. parts,
  349. -1
  350. ).type === DOC_TYPE_BREAK_PARENT) {
  351. parts.length -= 2;
  352. }
  353. if (parts.length > 0) {
  354. const lastPart = stripTrailingHardlineFromDoc(at_default(
  355. /* isOptionalObject */
  356. false,
  357. parts,
  358. -1
  359. ));
  360. parts[parts.length - 1] = lastPart;
  361. }
  362. return parts;
  363. }
  364. function stripTrailingHardlineFromDoc(doc) {
  365. switch (get_doc_type_default(doc)) {
  366. case DOC_TYPE_INDENT:
  367. case DOC_TYPE_INDENT_IF_BREAK:
  368. case DOC_TYPE_GROUP:
  369. case DOC_TYPE_LINE_SUFFIX:
  370. case DOC_TYPE_LABEL: {
  371. const contents = stripTrailingHardlineFromDoc(doc.contents);
  372. return { ...doc, contents };
  373. }
  374. case DOC_TYPE_IF_BREAK:
  375. return {
  376. ...doc,
  377. breakContents: stripTrailingHardlineFromDoc(doc.breakContents),
  378. flatContents: stripTrailingHardlineFromDoc(doc.flatContents)
  379. };
  380. case DOC_TYPE_FILL:
  381. return { ...doc, parts: stripTrailingHardlineFromParts(doc.parts) };
  382. case DOC_TYPE_ARRAY:
  383. return stripTrailingHardlineFromParts(doc);
  384. case DOC_TYPE_STRING:
  385. return doc.replace(/[\n\r]*$/u, "");
  386. case DOC_TYPE_ALIGN:
  387. case DOC_TYPE_CURSOR:
  388. case DOC_TYPE_TRIM:
  389. case DOC_TYPE_LINE_SUFFIX_BOUNDARY:
  390. case DOC_TYPE_LINE:
  391. case DOC_TYPE_BREAK_PARENT:
  392. break;
  393. default:
  394. throw new invalid_doc_error_default(doc);
  395. }
  396. return doc;
  397. }
  398. function stripTrailingHardline(doc) {
  399. return stripTrailingHardlineFromDoc(cleanDoc(doc));
  400. }
  401. function cleanDocFn(doc) {
  402. switch (get_doc_type_default(doc)) {
  403. case DOC_TYPE_FILL:
  404. if (doc.parts.every((part) => part === "")) {
  405. return "";
  406. }
  407. break;
  408. case DOC_TYPE_GROUP:
  409. if (!doc.contents && !doc.id && !doc.break && !doc.expandedStates) {
  410. return "";
  411. }
  412. if (doc.contents.type === DOC_TYPE_GROUP && doc.contents.id === doc.id && doc.contents.break === doc.break && doc.contents.expandedStates === doc.expandedStates) {
  413. return doc.contents;
  414. }
  415. break;
  416. case DOC_TYPE_ALIGN:
  417. case DOC_TYPE_INDENT:
  418. case DOC_TYPE_INDENT_IF_BREAK:
  419. case DOC_TYPE_LINE_SUFFIX:
  420. if (!doc.contents) {
  421. return "";
  422. }
  423. break;
  424. case DOC_TYPE_IF_BREAK:
  425. if (!doc.flatContents && !doc.breakContents) {
  426. return "";
  427. }
  428. break;
  429. case DOC_TYPE_ARRAY: {
  430. const parts = [];
  431. for (const part of doc) {
  432. if (!part) {
  433. continue;
  434. }
  435. const [currentPart, ...restParts] = Array.isArray(part) ? part : [part];
  436. if (typeof currentPart === "string" && typeof at_default(
  437. /* isOptionalObject */
  438. false,
  439. parts,
  440. -1
  441. ) === "string") {
  442. parts[parts.length - 1] += currentPart;
  443. } else {
  444. parts.push(currentPart);
  445. }
  446. parts.push(...restParts);
  447. }
  448. if (parts.length === 0) {
  449. return "";
  450. }
  451. if (parts.length === 1) {
  452. return parts[0];
  453. }
  454. return parts;
  455. }
  456. case DOC_TYPE_STRING:
  457. case DOC_TYPE_CURSOR:
  458. case DOC_TYPE_TRIM:
  459. case DOC_TYPE_LINE_SUFFIX_BOUNDARY:
  460. case DOC_TYPE_LINE:
  461. case DOC_TYPE_LABEL:
  462. case DOC_TYPE_BREAK_PARENT:
  463. break;
  464. default:
  465. throw new invalid_doc_error_default(doc);
  466. }
  467. return doc;
  468. }
  469. function cleanDoc(doc) {
  470. return mapDoc(doc, (currentDoc) => cleanDocFn(currentDoc));
  471. }
  472. function replaceEndOfLine(doc, replacement = literalline) {
  473. return mapDoc(
  474. doc,
  475. (currentDoc) => typeof currentDoc === "string" ? join(replacement, currentDoc.split("\n")) : currentDoc
  476. );
  477. }
  478. function canBreakFn(doc) {
  479. if (doc.type === DOC_TYPE_LINE) {
  480. return true;
  481. }
  482. }
  483. function canBreak(doc) {
  484. return findInDoc(doc, canBreakFn, false);
  485. }
  486. // src/document/utils/assert-doc.js
  487. var noop = () => {
  488. };
  489. var assertDoc = true ? noop : function(doc) {
  490. traverse_doc_default(doc, (doc2) => {
  491. if (checked.has(doc2)) {
  492. return false;
  493. }
  494. if (typeof doc2 !== "string") {
  495. checked.add(doc2);
  496. }
  497. });
  498. };
  499. var assertDocArray = true ? noop : function(docs, optional = false) {
  500. if (optional && !docs) {
  501. return;
  502. }
  503. if (!Array.isArray(docs)) {
  504. throw new TypeError("Unexpected doc array.");
  505. }
  506. for (const doc of docs) {
  507. assertDoc(doc);
  508. }
  509. };
  510. var assertDocFillParts = true ? noop : (
  511. /**
  512. * @param {Doc[]} parts
  513. */
  514. function(parts) {
  515. assertDocArray(parts);
  516. if (parts.length > 1 && isEmptyDoc(at_default(
  517. /* isOptionalObject */
  518. false,
  519. parts,
  520. -1
  521. ))) {
  522. parts = parts.slice(0, -1);
  523. }
  524. for (const [i, doc] of parts.entries()) {
  525. if (i % 2 === 1 && !isValidSeparator(doc)) {
  526. const type = get_doc_type_default(doc);
  527. throw new Error(
  528. `Unexpected non-line-break doc at ${i}. Doc type is ${type}.`
  529. );
  530. }
  531. }
  532. }
  533. );
  534. // src/document/builders.js
  535. function indent(contents) {
  536. assertDoc(contents);
  537. return { type: DOC_TYPE_INDENT, contents };
  538. }
  539. function align(widthOrString, contents) {
  540. assertDoc(contents);
  541. return { type: DOC_TYPE_ALIGN, contents, n: widthOrString };
  542. }
  543. function group(contents, opts = {}) {
  544. assertDoc(contents);
  545. assertDocArray(
  546. opts.expandedStates,
  547. /* optional */
  548. true
  549. );
  550. return {
  551. type: DOC_TYPE_GROUP,
  552. id: opts.id,
  553. contents,
  554. break: Boolean(opts.shouldBreak),
  555. expandedStates: opts.expandedStates
  556. };
  557. }
  558. function dedentToRoot(contents) {
  559. return align(Number.NEGATIVE_INFINITY, contents);
  560. }
  561. function markAsRoot(contents) {
  562. return align({ type: "root" }, contents);
  563. }
  564. function dedent(contents) {
  565. return align(-1, contents);
  566. }
  567. function conditionalGroup(states, opts) {
  568. return group(states[0], { ...opts, expandedStates: states });
  569. }
  570. function fill(parts) {
  571. assertDocFillParts(parts);
  572. return { type: DOC_TYPE_FILL, parts };
  573. }
  574. function ifBreak(breakContents, flatContents = "", opts = {}) {
  575. assertDoc(breakContents);
  576. if (flatContents !== "") {
  577. assertDoc(flatContents);
  578. }
  579. return {
  580. type: DOC_TYPE_IF_BREAK,
  581. breakContents,
  582. flatContents,
  583. groupId: opts.groupId
  584. };
  585. }
  586. function indentIfBreak(contents, opts) {
  587. assertDoc(contents);
  588. return {
  589. type: DOC_TYPE_INDENT_IF_BREAK,
  590. contents,
  591. groupId: opts.groupId,
  592. negate: opts.negate
  593. };
  594. }
  595. function lineSuffix(contents) {
  596. assertDoc(contents);
  597. return { type: DOC_TYPE_LINE_SUFFIX, contents };
  598. }
  599. var lineSuffixBoundary = { type: DOC_TYPE_LINE_SUFFIX_BOUNDARY };
  600. var breakParent = { type: DOC_TYPE_BREAK_PARENT };
  601. var trim = { type: DOC_TYPE_TRIM };
  602. var hardlineWithoutBreakParent = { type: DOC_TYPE_LINE, hard: true };
  603. var literallineWithoutBreakParent = {
  604. type: DOC_TYPE_LINE,
  605. hard: true,
  606. literal: true
  607. };
  608. var line = { type: DOC_TYPE_LINE };
  609. var softline = { type: DOC_TYPE_LINE, soft: true };
  610. var hardline = [hardlineWithoutBreakParent, breakParent];
  611. var literalline = [literallineWithoutBreakParent, breakParent];
  612. var cursor = { type: DOC_TYPE_CURSOR };
  613. function join(separator, docs) {
  614. assertDoc(separator);
  615. assertDocArray(docs);
  616. const parts = [];
  617. for (let i = 0; i < docs.length; i++) {
  618. if (i !== 0) {
  619. parts.push(separator);
  620. }
  621. parts.push(docs[i]);
  622. }
  623. return parts;
  624. }
  625. function addAlignmentToDoc(doc, size, tabWidth) {
  626. assertDoc(doc);
  627. let aligned = doc;
  628. if (size > 0) {
  629. for (let i = 0; i < Math.floor(size / tabWidth); ++i) {
  630. aligned = indent(aligned);
  631. }
  632. aligned = align(size % tabWidth, aligned);
  633. aligned = align(Number.NEGATIVE_INFINITY, aligned);
  634. }
  635. return aligned;
  636. }
  637. function label(label2, contents) {
  638. assertDoc(contents);
  639. return label2 ? { type: DOC_TYPE_LABEL, label: label2, contents } : contents;
  640. }
  641. // scripts/build/shims/string-replace-all.js
  642. var stringReplaceAll = (isOptionalObject, original, pattern, replacement) => {
  643. if (isOptionalObject && (original === void 0 || original === null)) {
  644. return;
  645. }
  646. if (original.replaceAll) {
  647. return original.replaceAll(pattern, replacement);
  648. }
  649. if (pattern.global) {
  650. return original.replace(pattern, replacement);
  651. }
  652. return original.split(pattern).join(replacement);
  653. };
  654. var string_replace_all_default = stringReplaceAll;
  655. // src/common/end-of-line.js
  656. function convertEndOfLineToChars(value) {
  657. switch (value) {
  658. case "cr":
  659. return "\r";
  660. case "crlf":
  661. return "\r\n";
  662. default:
  663. return "\n";
  664. }
  665. }
  666. // node_modules/emoji-regex/index.mjs
  667. var emoji_regex_default = () => {
  668. 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;
  669. };
  670. // node_modules/get-east-asian-width/lookup.js
  671. function isFullWidth(x) {
  672. return x === 12288 || x >= 65281 && x <= 65376 || x >= 65504 && x <= 65510;
  673. }
  674. function isWide(x) {
  675. 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;
  676. }
  677. // node_modules/get-east-asian-width/index.js
  678. var _isNarrowWidth = (codePoint) => !(isFullWidth(codePoint) || isWide(codePoint));
  679. // src/utils/get-string-width.js
  680. var notAsciiRegex = /[^\x20-\x7F]/u;
  681. function getStringWidth(text) {
  682. if (!text) {
  683. return 0;
  684. }
  685. if (!notAsciiRegex.test(text)) {
  686. return text.length;
  687. }
  688. text = text.replace(emoji_regex_default(), " ");
  689. let width = 0;
  690. for (const character of text) {
  691. const codePoint = character.codePointAt(0);
  692. if (codePoint <= 31 || codePoint >= 127 && codePoint <= 159) {
  693. continue;
  694. }
  695. if (codePoint >= 768 && codePoint <= 879) {
  696. continue;
  697. }
  698. width += _isNarrowWidth(codePoint) ? 1 : 2;
  699. }
  700. return width;
  701. }
  702. var get_string_width_default = getStringWidth;
  703. // src/document/printer.js
  704. var MODE_BREAK = Symbol("MODE_BREAK");
  705. var MODE_FLAT = Symbol("MODE_FLAT");
  706. var CURSOR_PLACEHOLDER = Symbol("cursor");
  707. var DOC_FILL_PRINTED_LENGTH = Symbol("DOC_FILL_PRINTED_LENGTH");
  708. function rootIndent() {
  709. return { value: "", length: 0, queue: [] };
  710. }
  711. function makeIndent(ind, options) {
  712. return generateInd(ind, { type: "indent" }, options);
  713. }
  714. function makeAlign(indent2, widthOrDoc, options) {
  715. if (widthOrDoc === Number.NEGATIVE_INFINITY) {
  716. return indent2.root || rootIndent();
  717. }
  718. if (widthOrDoc < 0) {
  719. return generateInd(indent2, { type: "dedent" }, options);
  720. }
  721. if (!widthOrDoc) {
  722. return indent2;
  723. }
  724. if (widthOrDoc.type === "root") {
  725. return { ...indent2, root: indent2 };
  726. }
  727. const alignType = typeof widthOrDoc === "string" ? "stringAlign" : "numberAlign";
  728. return generateInd(indent2, { type: alignType, n: widthOrDoc }, options);
  729. }
  730. function generateInd(ind, newPart, options) {
  731. const queue = newPart.type === "dedent" ? ind.queue.slice(0, -1) : [...ind.queue, newPart];
  732. let value = "";
  733. let length = 0;
  734. let lastTabs = 0;
  735. let lastSpaces = 0;
  736. for (const part of queue) {
  737. switch (part.type) {
  738. case "indent":
  739. flush();
  740. if (options.useTabs) {
  741. addTabs(1);
  742. } else {
  743. addSpaces(options.tabWidth);
  744. }
  745. break;
  746. case "stringAlign":
  747. flush();
  748. value += part.n;
  749. length += part.n.length;
  750. break;
  751. case "numberAlign":
  752. lastTabs += 1;
  753. lastSpaces += part.n;
  754. break;
  755. default:
  756. throw new Error(`Unexpected type '${part.type}'`);
  757. }
  758. }
  759. flushSpaces();
  760. return { ...ind, value, length, queue };
  761. function addTabs(count) {
  762. value += " ".repeat(count);
  763. length += options.tabWidth * count;
  764. }
  765. function addSpaces(count) {
  766. value += " ".repeat(count);
  767. length += count;
  768. }
  769. function flush() {
  770. if (options.useTabs) {
  771. flushTabs();
  772. } else {
  773. flushSpaces();
  774. }
  775. }
  776. function flushTabs() {
  777. if (lastTabs > 0) {
  778. addTabs(lastTabs);
  779. }
  780. resetLast();
  781. }
  782. function flushSpaces() {
  783. if (lastSpaces > 0) {
  784. addSpaces(lastSpaces);
  785. }
  786. resetLast();
  787. }
  788. function resetLast() {
  789. lastTabs = 0;
  790. lastSpaces = 0;
  791. }
  792. }
  793. function trim2(out) {
  794. let trimCount = 0;
  795. let cursorCount = 0;
  796. let outIndex = out.length;
  797. outer: while (outIndex--) {
  798. const last = out[outIndex];
  799. if (last === CURSOR_PLACEHOLDER) {
  800. cursorCount++;
  801. continue;
  802. }
  803. if (false) {
  804. throw new Error(`Unexpected value in trim: '${typeof last}'`);
  805. }
  806. for (let charIndex = last.length - 1; charIndex >= 0; charIndex--) {
  807. const char = last[charIndex];
  808. if (char === " " || char === " ") {
  809. trimCount++;
  810. } else {
  811. out[outIndex] = last.slice(0, charIndex + 1);
  812. break outer;
  813. }
  814. }
  815. }
  816. if (trimCount > 0 || cursorCount > 0) {
  817. out.length = outIndex + 1;
  818. while (cursorCount-- > 0) {
  819. out.push(CURSOR_PLACEHOLDER);
  820. }
  821. }
  822. return trimCount;
  823. }
  824. function fits(next, restCommands, width, hasLineSuffix, groupModeMap, mustBeFlat) {
  825. if (width === Number.POSITIVE_INFINITY) {
  826. return true;
  827. }
  828. let restIdx = restCommands.length;
  829. const cmds = [next];
  830. const out = [];
  831. while (width >= 0) {
  832. if (cmds.length === 0) {
  833. if (restIdx === 0) {
  834. return true;
  835. }
  836. cmds.push(restCommands[--restIdx]);
  837. continue;
  838. }
  839. const { mode, doc } = cmds.pop();
  840. const docType = get_doc_type_default(doc);
  841. switch (docType) {
  842. case DOC_TYPE_STRING:
  843. out.push(doc);
  844. width -= get_string_width_default(doc);
  845. break;
  846. case DOC_TYPE_ARRAY:
  847. case DOC_TYPE_FILL: {
  848. const parts = docType === DOC_TYPE_ARRAY ? doc : doc.parts;
  849. const end = doc[DOC_FILL_PRINTED_LENGTH] ?? 0;
  850. for (let i = parts.length - 1; i >= end; i--) {
  851. cmds.push({ mode, doc: parts[i] });
  852. }
  853. break;
  854. }
  855. case DOC_TYPE_INDENT:
  856. case DOC_TYPE_ALIGN:
  857. case DOC_TYPE_INDENT_IF_BREAK:
  858. case DOC_TYPE_LABEL:
  859. cmds.push({ mode, doc: doc.contents });
  860. break;
  861. case DOC_TYPE_TRIM:
  862. width += trim2(out);
  863. break;
  864. case DOC_TYPE_GROUP: {
  865. if (mustBeFlat && doc.break) {
  866. return false;
  867. }
  868. const groupMode = doc.break ? MODE_BREAK : mode;
  869. const contents = doc.expandedStates && groupMode === MODE_BREAK ? at_default(
  870. /* isOptionalObject */
  871. false,
  872. doc.expandedStates,
  873. -1
  874. ) : doc.contents;
  875. cmds.push({ mode: groupMode, doc: contents });
  876. break;
  877. }
  878. case DOC_TYPE_IF_BREAK: {
  879. const groupMode = doc.groupId ? groupModeMap[doc.groupId] || MODE_FLAT : mode;
  880. const contents = groupMode === MODE_BREAK ? doc.breakContents : doc.flatContents;
  881. if (contents) {
  882. cmds.push({ mode, doc: contents });
  883. }
  884. break;
  885. }
  886. case DOC_TYPE_LINE:
  887. if (mode === MODE_BREAK || doc.hard) {
  888. return true;
  889. }
  890. if (!doc.soft) {
  891. out.push(" ");
  892. width--;
  893. }
  894. break;
  895. case DOC_TYPE_LINE_SUFFIX:
  896. hasLineSuffix = true;
  897. break;
  898. case DOC_TYPE_LINE_SUFFIX_BOUNDARY:
  899. if (hasLineSuffix) {
  900. return false;
  901. }
  902. break;
  903. }
  904. }
  905. return false;
  906. }
  907. function printDocToString(doc, options) {
  908. const groupModeMap = {};
  909. const width = options.printWidth;
  910. const newLine = convertEndOfLineToChars(options.endOfLine);
  911. let pos = 0;
  912. const cmds = [{ ind: rootIndent(), mode: MODE_BREAK, doc }];
  913. const out = [];
  914. let shouldRemeasure = false;
  915. const lineSuffix2 = [];
  916. let printedCursorCount = 0;
  917. propagateBreaks(doc);
  918. while (cmds.length > 0) {
  919. const { ind, mode, doc: doc2 } = cmds.pop();
  920. switch (get_doc_type_default(doc2)) {
  921. case DOC_TYPE_STRING: {
  922. const formatted = newLine !== "\n" ? string_replace_all_default(
  923. /* isOptionalObject */
  924. false,
  925. doc2,
  926. "\n",
  927. newLine
  928. ) : doc2;
  929. out.push(formatted);
  930. if (cmds.length > 0) {
  931. pos += get_string_width_default(formatted);
  932. }
  933. break;
  934. }
  935. case DOC_TYPE_ARRAY:
  936. for (let i = doc2.length - 1; i >= 0; i--) {
  937. cmds.push({ ind, mode, doc: doc2[i] });
  938. }
  939. break;
  940. case DOC_TYPE_CURSOR:
  941. if (printedCursorCount >= 2) {
  942. throw new Error("There are too many 'cursor' in doc.");
  943. }
  944. out.push(CURSOR_PLACEHOLDER);
  945. printedCursorCount++;
  946. break;
  947. case DOC_TYPE_INDENT:
  948. cmds.push({ ind: makeIndent(ind, options), mode, doc: doc2.contents });
  949. break;
  950. case DOC_TYPE_ALIGN:
  951. cmds.push({
  952. ind: makeAlign(ind, doc2.n, options),
  953. mode,
  954. doc: doc2.contents
  955. });
  956. break;
  957. case DOC_TYPE_TRIM:
  958. pos -= trim2(out);
  959. break;
  960. case DOC_TYPE_GROUP:
  961. switch (mode) {
  962. case MODE_FLAT:
  963. if (!shouldRemeasure) {
  964. cmds.push({
  965. ind,
  966. mode: doc2.break ? MODE_BREAK : MODE_FLAT,
  967. doc: doc2.contents
  968. });
  969. break;
  970. }
  971. // fallthrough
  972. case MODE_BREAK: {
  973. shouldRemeasure = false;
  974. const next = { ind, mode: MODE_FLAT, doc: doc2.contents };
  975. const rem = width - pos;
  976. const hasLineSuffix = lineSuffix2.length > 0;
  977. if (!doc2.break && fits(next, cmds, rem, hasLineSuffix, groupModeMap)) {
  978. cmds.push(next);
  979. } else {
  980. if (doc2.expandedStates) {
  981. const mostExpanded = at_default(
  982. /* isOptionalObject */
  983. false,
  984. doc2.expandedStates,
  985. -1
  986. );
  987. if (doc2.break) {
  988. cmds.push({ ind, mode: MODE_BREAK, doc: mostExpanded });
  989. break;
  990. } else {
  991. for (let i = 1; i < doc2.expandedStates.length + 1; i++) {
  992. if (i >= doc2.expandedStates.length) {
  993. cmds.push({ ind, mode: MODE_BREAK, doc: mostExpanded });
  994. break;
  995. } else {
  996. const state = doc2.expandedStates[i];
  997. const cmd = { ind, mode: MODE_FLAT, doc: state };
  998. if (fits(cmd, cmds, rem, hasLineSuffix, groupModeMap)) {
  999. cmds.push(cmd);
  1000. break;
  1001. }
  1002. }
  1003. }
  1004. }
  1005. } else {
  1006. cmds.push({ ind, mode: MODE_BREAK, doc: doc2.contents });
  1007. }
  1008. }
  1009. break;
  1010. }
  1011. }
  1012. if (doc2.id) {
  1013. groupModeMap[doc2.id] = at_default(
  1014. /* isOptionalObject */
  1015. false,
  1016. cmds,
  1017. -1
  1018. ).mode;
  1019. }
  1020. break;
  1021. // Fills each line with as much code as possible before moving to a new
  1022. // line with the same indentation.
  1023. //
  1024. // Expects doc.parts to be an array of alternating content and
  1025. // whitespace. The whitespace contains the linebreaks.
  1026. //
  1027. // For example:
  1028. // ["I", line, "love", line, "monkeys"]
  1029. // or
  1030. // [{ type: group, ... }, softline, { type: group, ... }]
  1031. //
  1032. // It uses this parts structure to handle three main layout cases:
  1033. // * The first two content items fit on the same line without
  1034. // breaking
  1035. // -> output the first content item and the whitespace "flat".
  1036. // * Only the first content item fits on the line without breaking
  1037. // -> output the first content item "flat" and the whitespace with
  1038. // "break".
  1039. // * Neither content item fits on the line without breaking
  1040. // -> output the first content item and the whitespace with "break".
  1041. case DOC_TYPE_FILL: {
  1042. const rem = width - pos;
  1043. const offset = doc2[DOC_FILL_PRINTED_LENGTH] ?? 0;
  1044. const { parts } = doc2;
  1045. const length = parts.length - offset;
  1046. if (length === 0) {
  1047. break;
  1048. }
  1049. const content = parts[offset + 0];
  1050. const whitespace = parts[offset + 1];
  1051. const contentFlatCmd = { ind, mode: MODE_FLAT, doc: content };
  1052. const contentBreakCmd = { ind, mode: MODE_BREAK, doc: content };
  1053. const contentFits = fits(
  1054. contentFlatCmd,
  1055. [],
  1056. rem,
  1057. lineSuffix2.length > 0,
  1058. groupModeMap,
  1059. true
  1060. );
  1061. if (length === 1) {
  1062. if (contentFits) {
  1063. cmds.push(contentFlatCmd);
  1064. } else {
  1065. cmds.push(contentBreakCmd);
  1066. }
  1067. break;
  1068. }
  1069. const whitespaceFlatCmd = { ind, mode: MODE_FLAT, doc: whitespace };
  1070. const whitespaceBreakCmd = { ind, mode: MODE_BREAK, doc: whitespace };
  1071. if (length === 2) {
  1072. if (contentFits) {
  1073. cmds.push(whitespaceFlatCmd, contentFlatCmd);
  1074. } else {
  1075. cmds.push(whitespaceBreakCmd, contentBreakCmd);
  1076. }
  1077. break;
  1078. }
  1079. const secondContent = parts[offset + 2];
  1080. const remainingCmd = {
  1081. ind,
  1082. mode,
  1083. doc: { ...doc2, [DOC_FILL_PRINTED_LENGTH]: offset + 2 }
  1084. };
  1085. const firstAndSecondContentFlatCmd = {
  1086. ind,
  1087. mode: MODE_FLAT,
  1088. doc: [content, whitespace, secondContent]
  1089. };
  1090. const firstAndSecondContentFits = fits(
  1091. firstAndSecondContentFlatCmd,
  1092. [],
  1093. rem,
  1094. lineSuffix2.length > 0,
  1095. groupModeMap,
  1096. true
  1097. );
  1098. if (firstAndSecondContentFits) {
  1099. cmds.push(remainingCmd, whitespaceFlatCmd, contentFlatCmd);
  1100. } else if (contentFits) {
  1101. cmds.push(remainingCmd, whitespaceBreakCmd, contentFlatCmd);
  1102. } else {
  1103. cmds.push(remainingCmd, whitespaceBreakCmd, contentBreakCmd);
  1104. }
  1105. break;
  1106. }
  1107. case DOC_TYPE_IF_BREAK:
  1108. case DOC_TYPE_INDENT_IF_BREAK: {
  1109. const groupMode = doc2.groupId ? groupModeMap[doc2.groupId] : mode;
  1110. if (groupMode === MODE_BREAK) {
  1111. const breakContents = doc2.type === DOC_TYPE_IF_BREAK ? doc2.breakContents : doc2.negate ? doc2.contents : indent(doc2.contents);
  1112. if (breakContents) {
  1113. cmds.push({ ind, mode, doc: breakContents });
  1114. }
  1115. }
  1116. if (groupMode === MODE_FLAT) {
  1117. const flatContents = doc2.type === DOC_TYPE_IF_BREAK ? doc2.flatContents : doc2.negate ? indent(doc2.contents) : doc2.contents;
  1118. if (flatContents) {
  1119. cmds.push({ ind, mode, doc: flatContents });
  1120. }
  1121. }
  1122. break;
  1123. }
  1124. case DOC_TYPE_LINE_SUFFIX:
  1125. lineSuffix2.push({ ind, mode, doc: doc2.contents });
  1126. break;
  1127. case DOC_TYPE_LINE_SUFFIX_BOUNDARY:
  1128. if (lineSuffix2.length > 0) {
  1129. cmds.push({ ind, mode, doc: hardlineWithoutBreakParent });
  1130. }
  1131. break;
  1132. case DOC_TYPE_LINE:
  1133. switch (mode) {
  1134. case MODE_FLAT:
  1135. if (!doc2.hard) {
  1136. if (!doc2.soft) {
  1137. out.push(" ");
  1138. pos += 1;
  1139. }
  1140. break;
  1141. } else {
  1142. shouldRemeasure = true;
  1143. }
  1144. // fallthrough
  1145. case MODE_BREAK:
  1146. if (lineSuffix2.length > 0) {
  1147. cmds.push({ ind, mode, doc: doc2 }, ...lineSuffix2.reverse());
  1148. lineSuffix2.length = 0;
  1149. break;
  1150. }
  1151. if (doc2.literal) {
  1152. if (ind.root) {
  1153. out.push(newLine, ind.root.value);
  1154. pos = ind.root.length;
  1155. } else {
  1156. out.push(newLine);
  1157. pos = 0;
  1158. }
  1159. } else {
  1160. pos -= trim2(out);
  1161. out.push(newLine + ind.value);
  1162. pos = ind.length;
  1163. }
  1164. break;
  1165. }
  1166. break;
  1167. case DOC_TYPE_LABEL:
  1168. cmds.push({ ind, mode, doc: doc2.contents });
  1169. break;
  1170. case DOC_TYPE_BREAK_PARENT:
  1171. break;
  1172. default:
  1173. throw new invalid_doc_error_default(doc2);
  1174. }
  1175. if (cmds.length === 0 && lineSuffix2.length > 0) {
  1176. cmds.push(...lineSuffix2.reverse());
  1177. lineSuffix2.length = 0;
  1178. }
  1179. }
  1180. const cursorPlaceholderIndex = out.indexOf(CURSOR_PLACEHOLDER);
  1181. if (cursorPlaceholderIndex !== -1) {
  1182. const otherCursorPlaceholderIndex = out.indexOf(
  1183. CURSOR_PLACEHOLDER,
  1184. cursorPlaceholderIndex + 1
  1185. );
  1186. if (otherCursorPlaceholderIndex === -1) {
  1187. return {
  1188. formatted: out.filter((char) => char !== CURSOR_PLACEHOLDER).join("")
  1189. };
  1190. }
  1191. const beforeCursor = out.slice(0, cursorPlaceholderIndex).join("");
  1192. const aroundCursor = out.slice(cursorPlaceholderIndex + 1, otherCursorPlaceholderIndex).join("");
  1193. const afterCursor = out.slice(otherCursorPlaceholderIndex + 1).join("");
  1194. return {
  1195. formatted: beforeCursor + aroundCursor + afterCursor,
  1196. cursorNodeStart: beforeCursor.length,
  1197. cursorNodeText: aroundCursor
  1198. };
  1199. }
  1200. return { formatted: out.join("") };
  1201. }
  1202. // src/document/public.js
  1203. var builders = {
  1204. join,
  1205. line,
  1206. softline,
  1207. hardline,
  1208. literalline,
  1209. group,
  1210. conditionalGroup,
  1211. fill,
  1212. lineSuffix,
  1213. lineSuffixBoundary,
  1214. cursor,
  1215. breakParent,
  1216. ifBreak,
  1217. trim,
  1218. indent,
  1219. indentIfBreak,
  1220. align,
  1221. addAlignmentToDoc,
  1222. markAsRoot,
  1223. dedentToRoot,
  1224. dedent,
  1225. hardlineWithoutBreakParent,
  1226. literallineWithoutBreakParent,
  1227. label,
  1228. // TODO: Remove this in v4
  1229. concat: (parts) => parts
  1230. };
  1231. var printer = { printDocToString };
  1232. var utils = {
  1233. willBreak,
  1234. traverseDoc: traverse_doc_default,
  1235. findInDoc,
  1236. mapDoc,
  1237. removeLines,
  1238. stripTrailingHardline,
  1239. replaceEndOfLine,
  1240. canBreak
  1241. };
  1242. return __toCommonJS(public_exports);
  1243. });