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