UNPKG

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