UNPKG

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