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 const end = doc[DOC_FILL_PRINTED_LENGTH] ?? 0;
808 for (let i = parts.length - 1; i >= end; i--) {
809 cmds.push({ mode, doc: parts[i] });
810 }
811 break;
812 }
813 case DOC_TYPE_INDENT:
814 case DOC_TYPE_ALIGN:
815 case DOC_TYPE_INDENT_IF_BREAK:
816 case DOC_TYPE_LABEL:
817 cmds.push({ mode, doc: doc.contents });
818 break;
819 case DOC_TYPE_TRIM:
820 width += trim2(out);
821 break;
822 case DOC_TYPE_GROUP: {
823 if (mustBeFlat && doc.break) {
824 return false;
825 }
826 const groupMode = doc.break ? MODE_BREAK : mode;
827 const contents = doc.expandedStates && groupMode === MODE_BREAK ? at_default(
828 /* isOptionalObject */
829 false,
830 doc.expandedStates,
831 -1
832 ) : doc.contents;
833 cmds.push({ mode: groupMode, doc: contents });
834 break;
835 }
836 case DOC_TYPE_IF_BREAK: {
837 const groupMode = doc.groupId ? groupModeMap[doc.groupId] || MODE_FLAT : mode;
838 const contents = groupMode === MODE_BREAK ? doc.breakContents : doc.flatContents;
839 if (contents) {
840 cmds.push({ mode, doc: contents });
841 }
842 break;
843 }
844 case DOC_TYPE_LINE:
845 if (mode === MODE_BREAK || doc.hard) {
846 return true;
847 }
848 if (!doc.soft) {
849 out.push(" ");
850 width--;
851 }
852 break;
853 case DOC_TYPE_LINE_SUFFIX:
854 hasLineSuffix = true;
855 break;
856 case DOC_TYPE_LINE_SUFFIX_BOUNDARY:
857 if (hasLineSuffix) {
858 return false;
859 }
860 break;
861 }
862 }
863 return false;
864}
865function printDocToString(doc, options) {
866 const groupModeMap = {};
867 const width = options.printWidth;
868 const newLine = convertEndOfLineToChars(options.endOfLine);
869 let pos = 0;
870 const cmds = [{ ind: rootIndent(), mode: MODE_BREAK, doc }];
871 const out = [];
872 let shouldRemeasure = false;
873 const lineSuffix2 = [];
874 let printedCursorCount = 0;
875 propagateBreaks(doc);
876 while (cmds.length > 0) {
877 const { ind, mode, doc: doc2 } = cmds.pop();
878 switch (get_doc_type_default(doc2)) {
879 case DOC_TYPE_STRING: {
880 const formatted = newLine !== "\n" ? string_replace_all_default(
881 /* isOptionalObject */
882 false,
883 doc2,
884 "\n",
885 newLine
886 ) : doc2;
887 out.push(formatted);
888 if (cmds.length > 0) {
889 pos += get_string_width_default(formatted);
890 }
891 break;
892 }
893 case DOC_TYPE_ARRAY:
894 for (let i = doc2.length - 1; i >= 0; i--) {
895 cmds.push({ ind, mode, doc: doc2[i] });
896 }
897 break;
898 case DOC_TYPE_CURSOR:
899 if (printedCursorCount >= 2) {
900 throw new Error("There are too many 'cursor' in doc.");
901 }
902 out.push(CURSOR_PLACEHOLDER);
903 printedCursorCount++;
904 break;
905 case DOC_TYPE_INDENT:
906 cmds.push({ ind: makeIndent(ind, options), mode, doc: doc2.contents });
907 break;
908 case DOC_TYPE_ALIGN:
909 cmds.push({
910 ind: makeAlign(ind, doc2.n, options),
911 mode,
912 doc: doc2.contents
913 });
914 break;
915 case DOC_TYPE_TRIM:
916 pos -= trim2(out);
917 break;
918 case DOC_TYPE_GROUP:
919 switch (mode) {
920 case MODE_FLAT:
921 if (!shouldRemeasure) {
922 cmds.push({
923 ind,
924 mode: doc2.break ? MODE_BREAK : MODE_FLAT,
925 doc: doc2.contents
926 });
927 break;
928 }
929 // fallthrough
930 case MODE_BREAK: {
931 shouldRemeasure = false;
932 const next = { ind, mode: MODE_FLAT, doc: doc2.contents };
933 const rem = width - pos;
934 const hasLineSuffix = lineSuffix2.length > 0;
935 if (!doc2.break && fits(next, cmds, rem, hasLineSuffix, groupModeMap)) {
936 cmds.push(next);
937 } else {
938 if (doc2.expandedStates) {
939 const mostExpanded = at_default(
940 /* isOptionalObject */
941 false,
942 doc2.expandedStates,
943 -1
944 );
945 if (doc2.break) {
946 cmds.push({ ind, mode: MODE_BREAK, doc: mostExpanded });
947 break;
948 } else {
949 for (let i = 1; i < doc2.expandedStates.length + 1; i++) {
950 if (i >= doc2.expandedStates.length) {
951 cmds.push({ ind, mode: MODE_BREAK, doc: mostExpanded });
952 break;
953 } else {
954 const state = doc2.expandedStates[i];
955 const cmd = { ind, mode: MODE_FLAT, doc: state };
956 if (fits(cmd, cmds, rem, hasLineSuffix, groupModeMap)) {
957 cmds.push(cmd);
958 break;
959 }
960 }
961 }
962 }
963 } else {
964 cmds.push({ ind, mode: MODE_BREAK, doc: doc2.contents });
965 }
966 }
967 break;
968 }
969 }
970 if (doc2.id) {
971 groupModeMap[doc2.id] = at_default(
972 /* isOptionalObject */
973 false,
974 cmds,
975 -1
976 ).mode;
977 }
978 break;
979 // Fills each line with as much code as possible before moving to a new
980 // line with the same indentation.
981 //
982 // Expects doc.parts to be an array of alternating content and
983 // whitespace. The whitespace contains the linebreaks.
984 //
985 // For example:
986 // ["I", line, "love", line, "monkeys"]
987 // or
988 // [{ type: group, ... }, softline, { type: group, ... }]
989 //
990 // It uses this parts structure to handle three main layout cases:
991 // * The first two content items fit on the same line without
992 // breaking
993 // -> output the first content item and the whitespace "flat".
994 // * Only the first content item fits on the line without breaking
995 // -> output the first content item "flat" and the whitespace with
996 // "break".
997 // * Neither content item fits on the line without breaking
998 // -> output the first content item and the whitespace with "break".
999 case DOC_TYPE_FILL: {
1000 const rem = width - pos;
1001 const offset = doc2[DOC_FILL_PRINTED_LENGTH] ?? 0;
1002 const { parts } = doc2;
1003 const length = parts.length - offset;
1004 if (length === 0) {
1005 break;
1006 }
1007 const content = parts[offset + 0];
1008 const whitespace = parts[offset + 1];
1009 const contentFlatCmd = { ind, mode: MODE_FLAT, doc: content };
1010 const contentBreakCmd = { ind, mode: MODE_BREAK, doc: content };
1011 const contentFits = fits(
1012 contentFlatCmd,
1013 [],
1014 rem,
1015 lineSuffix2.length > 0,
1016 groupModeMap,
1017 true
1018 );
1019 if (length === 1) {
1020 if (contentFits) {
1021 cmds.push(contentFlatCmd);
1022 } else {
1023 cmds.push(contentBreakCmd);
1024 }
1025 break;
1026 }
1027 const whitespaceFlatCmd = { ind, mode: MODE_FLAT, doc: whitespace };
1028 const whitespaceBreakCmd = { ind, mode: MODE_BREAK, doc: whitespace };
1029 if (length === 2) {
1030 if (contentFits) {
1031 cmds.push(whitespaceFlatCmd, contentFlatCmd);
1032 } else {
1033 cmds.push(whitespaceBreakCmd, contentBreakCmd);
1034 }
1035 break;
1036 }
1037 const secondContent = parts[offset + 2];
1038 const remainingCmd = {
1039 ind,
1040 mode,
1041 doc: { ...doc2, [DOC_FILL_PRINTED_LENGTH]: offset + 2 }
1042 };
1043 const firstAndSecondContentFlatCmd = {
1044 ind,
1045 mode: MODE_FLAT,
1046 doc: [content, whitespace, secondContent]
1047 };
1048 const firstAndSecondContentFits = fits(
1049 firstAndSecondContentFlatCmd,
1050 [],
1051 rem,
1052 lineSuffix2.length > 0,
1053 groupModeMap,
1054 true
1055 );
1056 if (firstAndSecondContentFits) {
1057 cmds.push(remainingCmd, whitespaceFlatCmd, contentFlatCmd);
1058 } else if (contentFits) {
1059 cmds.push(remainingCmd, whitespaceBreakCmd, contentFlatCmd);
1060 } else {
1061 cmds.push(remainingCmd, whitespaceBreakCmd, contentBreakCmd);
1062 }
1063 break;
1064 }
1065 case DOC_TYPE_IF_BREAK:
1066 case DOC_TYPE_INDENT_IF_BREAK: {
1067 const groupMode = doc2.groupId ? groupModeMap[doc2.groupId] : mode;
1068 if (groupMode === MODE_BREAK) {
1069 const breakContents = doc2.type === DOC_TYPE_IF_BREAK ? doc2.breakContents : doc2.negate ? doc2.contents : indent(doc2.contents);
1070 if (breakContents) {
1071 cmds.push({ ind, mode, doc: breakContents });
1072 }
1073 }
1074 if (groupMode === MODE_FLAT) {
1075 const flatContents = doc2.type === DOC_TYPE_IF_BREAK ? doc2.flatContents : doc2.negate ? indent(doc2.contents) : doc2.contents;
1076 if (flatContents) {
1077 cmds.push({ ind, mode, doc: flatContents });
1078 }
1079 }
1080 break;
1081 }
1082 case DOC_TYPE_LINE_SUFFIX:
1083 lineSuffix2.push({ ind, mode, doc: doc2.contents });
1084 break;
1085 case DOC_TYPE_LINE_SUFFIX_BOUNDARY:
1086 if (lineSuffix2.length > 0) {
1087 cmds.push({ ind, mode, doc: hardlineWithoutBreakParent });
1088 }
1089 break;
1090 case DOC_TYPE_LINE:
1091 switch (mode) {
1092 case MODE_FLAT:
1093 if (!doc2.hard) {
1094 if (!doc2.soft) {
1095 out.push(" ");
1096 pos += 1;
1097 }
1098 break;
1099 } else {
1100 shouldRemeasure = true;
1101 }
1102 // fallthrough
1103 case MODE_BREAK:
1104 if (lineSuffix2.length > 0) {
1105 cmds.push({ ind, mode, doc: doc2 }, ...lineSuffix2.reverse());
1106 lineSuffix2.length = 0;
1107 break;
1108 }
1109 if (doc2.literal) {
1110 if (ind.root) {
1111 out.push(newLine, ind.root.value);
1112 pos = ind.root.length;
1113 } else {
1114 out.push(newLine);
1115 pos = 0;
1116 }
1117 } else {
1118 pos -= trim2(out);
1119 out.push(newLine + ind.value);
1120 pos = ind.length;
1121 }
1122 break;
1123 }
1124 break;
1125 case DOC_TYPE_LABEL:
1126 cmds.push({ ind, mode, doc: doc2.contents });
1127 break;
1128 case DOC_TYPE_BREAK_PARENT:
1129 break;
1130 default:
1131 throw new invalid_doc_error_default(doc2);
1132 }
1133 if (cmds.length === 0 && lineSuffix2.length > 0) {
1134 cmds.push(...lineSuffix2.reverse());
1135 lineSuffix2.length = 0;
1136 }
1137 }
1138 const cursorPlaceholderIndex = out.indexOf(CURSOR_PLACEHOLDER);
1139 if (cursorPlaceholderIndex !== -1) {
1140 const otherCursorPlaceholderIndex = out.indexOf(
1141 CURSOR_PLACEHOLDER,
1142 cursorPlaceholderIndex + 1
1143 );
1144 if (otherCursorPlaceholderIndex === -1) {
1145 return {
1146 formatted: out.filter((char) => char !== CURSOR_PLACEHOLDER).join("")
1147 };
1148 }
1149 const beforeCursor = out.slice(0, cursorPlaceholderIndex).join("");
1150 const aroundCursor = out.slice(cursorPlaceholderIndex + 1, otherCursorPlaceholderIndex).join("");
1151 const afterCursor = out.slice(otherCursorPlaceholderIndex + 1).join("");
1152 return {
1153 formatted: beforeCursor + aroundCursor + afterCursor,
1154 cursorNodeStart: beforeCursor.length,
1155 cursorNodeText: aroundCursor
1156 };
1157 }
1158 return { formatted: out.join("") };
1159}
1160
1161// src/document/public.js
1162var builders = {
1163 join,
1164 line,
1165 softline,
1166 hardline,
1167 literalline,
1168 group,
1169 conditionalGroup,
1170 fill,
1171 lineSuffix,
1172 lineSuffixBoundary,
1173 cursor,
1174 breakParent,
1175 ifBreak,
1176 trim,
1177 indent,
1178 indentIfBreak,
1179 align,
1180 addAlignmentToDoc,
1181 markAsRoot,
1182 dedentToRoot,
1183 dedent,
1184 hardlineWithoutBreakParent,
1185 literallineWithoutBreakParent,
1186 label,
1187 // TODO: Remove this in v4
1188 concat: (parts) => parts
1189};
1190var printer = { printDocToString };
1191var utils = {
1192 willBreak,
1193 traverseDoc: traverse_doc_default,
1194 findInDoc,
1195 mapDoc,
1196 removeLines,
1197 stripTrailingHardline,
1198 replaceEndOfLine,
1199 canBreak
1200};
1201
1202// with-default-export:src/document/public.js
1203var public_default = public_exports;
1204export {
1205 builders,
1206 public_default as default,
1207 printer,
1208 utils
1209};