source: node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js@ 3d60932

Last change on this file since 3d60932 was 57e58a3, checked in by ste08 <sjovanoska@…>, 4 months ago

Initial commit

  • Property mode set to 100644
File size: 19.9 KB
Line 
1/**
2* @vue/compiler-dom v3.5.13
3* (c) 2018-present Yuxi (Evan) You and Vue contributors
4* @license MIT
5**/
6import { registerRuntimeHelpers, createSimpleExpression, createCompilerError, createObjectProperty, getConstantType, createCallExpression, TO_DISPLAY_STRING, transformModel as transformModel$1, findProp, hasDynamicKeyVBind, findDir, isStaticArgOf, transformOn as transformOn$1, isStaticExp, createCompoundExpression, checkCompatEnabled, noopDirectiveTransform, baseCompile, baseParse } from '@vue/compiler-core';
7export * from '@vue/compiler-core';
8import { isVoidTag, isHTMLTag, isSVGTag, isMathMLTag, parseStringStyle, capitalize, makeMap, extend } from '@vue/shared';
9
10const V_MODEL_RADIO = Symbol(!!(process.env.NODE_ENV !== "production") ? `vModelRadio` : ``);
11const V_MODEL_CHECKBOX = Symbol(
12 !!(process.env.NODE_ENV !== "production") ? `vModelCheckbox` : ``
13);
14const V_MODEL_TEXT = Symbol(!!(process.env.NODE_ENV !== "production") ? `vModelText` : ``);
15const V_MODEL_SELECT = Symbol(
16 !!(process.env.NODE_ENV !== "production") ? `vModelSelect` : ``
17);
18const V_MODEL_DYNAMIC = Symbol(
19 !!(process.env.NODE_ENV !== "production") ? `vModelDynamic` : ``
20);
21const V_ON_WITH_MODIFIERS = Symbol(
22 !!(process.env.NODE_ENV !== "production") ? `vOnModifiersGuard` : ``
23);
24const V_ON_WITH_KEYS = Symbol(
25 !!(process.env.NODE_ENV !== "production") ? `vOnKeysGuard` : ``
26);
27const V_SHOW = Symbol(!!(process.env.NODE_ENV !== "production") ? `vShow` : ``);
28const TRANSITION = Symbol(!!(process.env.NODE_ENV !== "production") ? `Transition` : ``);
29const TRANSITION_GROUP = Symbol(
30 !!(process.env.NODE_ENV !== "production") ? `TransitionGroup` : ``
31);
32registerRuntimeHelpers({
33 [V_MODEL_RADIO]: `vModelRadio`,
34 [V_MODEL_CHECKBOX]: `vModelCheckbox`,
35 [V_MODEL_TEXT]: `vModelText`,
36 [V_MODEL_SELECT]: `vModelSelect`,
37 [V_MODEL_DYNAMIC]: `vModelDynamic`,
38 [V_ON_WITH_MODIFIERS]: `withModifiers`,
39 [V_ON_WITH_KEYS]: `withKeys`,
40 [V_SHOW]: `vShow`,
41 [TRANSITION]: `Transition`,
42 [TRANSITION_GROUP]: `TransitionGroup`
43});
44
45let decoder;
46function decodeHtmlBrowser(raw, asAttr = false) {
47 if (!decoder) {
48 decoder = document.createElement("div");
49 }
50 if (asAttr) {
51 decoder.innerHTML = `<div foo="${raw.replace(/"/g, "&quot;")}">`;
52 return decoder.children[0].getAttribute("foo");
53 } else {
54 decoder.innerHTML = raw;
55 return decoder.textContent;
56 }
57}
58
59const parserOptions = {
60 parseMode: "html",
61 isVoidTag,
62 isNativeTag: (tag) => isHTMLTag(tag) || isSVGTag(tag) || isMathMLTag(tag),
63 isPreTag: (tag) => tag === "pre",
64 isIgnoreNewlineTag: (tag) => tag === "pre" || tag === "textarea",
65 decodeEntities: decodeHtmlBrowser ,
66 isBuiltInComponent: (tag) => {
67 if (tag === "Transition" || tag === "transition") {
68 return TRANSITION;
69 } else if (tag === "TransitionGroup" || tag === "transition-group") {
70 return TRANSITION_GROUP;
71 }
72 },
73 // https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher
74 getNamespace(tag, parent, rootNamespace) {
75 let ns = parent ? parent.ns : rootNamespace;
76 if (parent && ns === 2) {
77 if (parent.tag === "annotation-xml") {
78 if (tag === "svg") {
79 return 1;
80 }
81 if (parent.props.some(
82 (a) => a.type === 6 && a.name === "encoding" && a.value != null && (a.value.content === "text/html" || a.value.content === "application/xhtml+xml")
83 )) {
84 ns = 0;
85 }
86 } else if (/^m(?:[ions]|text)$/.test(parent.tag) && tag !== "mglyph" && tag !== "malignmark") {
87 ns = 0;
88 }
89 } else if (parent && ns === 1) {
90 if (parent.tag === "foreignObject" || parent.tag === "desc" || parent.tag === "title") {
91 ns = 0;
92 }
93 }
94 if (ns === 0) {
95 if (tag === "svg") {
96 return 1;
97 }
98 if (tag === "math") {
99 return 2;
100 }
101 }
102 return ns;
103 }
104};
105
106const transformStyle = (node) => {
107 if (node.type === 1) {
108 node.props.forEach((p, i) => {
109 if (p.type === 6 && p.name === "style" && p.value) {
110 node.props[i] = {
111 type: 7,
112 name: `bind`,
113 arg: createSimpleExpression(`style`, true, p.loc),
114 exp: parseInlineCSS(p.value.content, p.loc),
115 modifiers: [],
116 loc: p.loc
117 };
118 }
119 });
120 }
121};
122const parseInlineCSS = (cssText, loc) => {
123 const normalized = parseStringStyle(cssText);
124 return createSimpleExpression(
125 JSON.stringify(normalized),
126 false,
127 loc,
128 3
129 );
130};
131
132function createDOMCompilerError(code, loc) {
133 return createCompilerError(
134 code,
135 loc,
136 !!(process.env.NODE_ENV !== "production") || false ? DOMErrorMessages : void 0
137 );
138}
139const DOMErrorCodes = {
140 "X_V_HTML_NO_EXPRESSION": 53,
141 "53": "X_V_HTML_NO_EXPRESSION",
142 "X_V_HTML_WITH_CHILDREN": 54,
143 "54": "X_V_HTML_WITH_CHILDREN",
144 "X_V_TEXT_NO_EXPRESSION": 55,
145 "55": "X_V_TEXT_NO_EXPRESSION",
146 "X_V_TEXT_WITH_CHILDREN": 56,
147 "56": "X_V_TEXT_WITH_CHILDREN",
148 "X_V_MODEL_ON_INVALID_ELEMENT": 57,
149 "57": "X_V_MODEL_ON_INVALID_ELEMENT",
150 "X_V_MODEL_ARG_ON_ELEMENT": 58,
151 "58": "X_V_MODEL_ARG_ON_ELEMENT",
152 "X_V_MODEL_ON_FILE_INPUT_ELEMENT": 59,
153 "59": "X_V_MODEL_ON_FILE_INPUT_ELEMENT",
154 "X_V_MODEL_UNNECESSARY_VALUE": 60,
155 "60": "X_V_MODEL_UNNECESSARY_VALUE",
156 "X_V_SHOW_NO_EXPRESSION": 61,
157 "61": "X_V_SHOW_NO_EXPRESSION",
158 "X_TRANSITION_INVALID_CHILDREN": 62,
159 "62": "X_TRANSITION_INVALID_CHILDREN",
160 "X_IGNORED_SIDE_EFFECT_TAG": 63,
161 "63": "X_IGNORED_SIDE_EFFECT_TAG",
162 "__EXTEND_POINT__": 64,
163 "64": "__EXTEND_POINT__"
164};
165const DOMErrorMessages = {
166 [53]: `v-html is missing expression.`,
167 [54]: `v-html will override element children.`,
168 [55]: `v-text is missing expression.`,
169 [56]: `v-text will override element children.`,
170 [57]: `v-model can only be used on <input>, <textarea> and <select> elements.`,
171 [58]: `v-model argument is not supported on plain elements.`,
172 [59]: `v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.`,
173 [60]: `Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.`,
174 [61]: `v-show is missing expression.`,
175 [62]: `<Transition> expects exactly one child element or component.`,
176 [63]: `Tags with side effect (<script> and <style>) are ignored in client component templates.`
177};
178
179const transformVHtml = (dir, node, context) => {
180 const { exp, loc } = dir;
181 if (!exp) {
182 context.onError(
183 createDOMCompilerError(53, loc)
184 );
185 }
186 if (node.children.length) {
187 context.onError(
188 createDOMCompilerError(54, loc)
189 );
190 node.children.length = 0;
191 }
192 return {
193 props: [
194 createObjectProperty(
195 createSimpleExpression(`innerHTML`, true, loc),
196 exp || createSimpleExpression("", true)
197 )
198 ]
199 };
200};
201
202const transformVText = (dir, node, context) => {
203 const { exp, loc } = dir;
204 if (!exp) {
205 context.onError(
206 createDOMCompilerError(55, loc)
207 );
208 }
209 if (node.children.length) {
210 context.onError(
211 createDOMCompilerError(56, loc)
212 );
213 node.children.length = 0;
214 }
215 return {
216 props: [
217 createObjectProperty(
218 createSimpleExpression(`textContent`, true),
219 exp ? getConstantType(exp, context) > 0 ? exp : createCallExpression(
220 context.helperString(TO_DISPLAY_STRING),
221 [exp],
222 loc
223 ) : createSimpleExpression("", true)
224 )
225 ]
226 };
227};
228
229const transformModel = (dir, node, context) => {
230 const baseResult = transformModel$1(dir, node, context);
231 if (!baseResult.props.length || node.tagType === 1) {
232 return baseResult;
233 }
234 if (dir.arg) {
235 context.onError(
236 createDOMCompilerError(
237 58,
238 dir.arg.loc
239 )
240 );
241 }
242 function checkDuplicatedValue() {
243 const value = findDir(node, "bind");
244 if (value && isStaticArgOf(value.arg, "value")) {
245 context.onError(
246 createDOMCompilerError(
247 60,
248 value.loc
249 )
250 );
251 }
252 }
253 const { tag } = node;
254 const isCustomElement = context.isCustomElement(tag);
255 if (tag === "input" || tag === "textarea" || tag === "select" || isCustomElement) {
256 let directiveToUse = V_MODEL_TEXT;
257 let isInvalidType = false;
258 if (tag === "input" || isCustomElement) {
259 const type = findProp(node, `type`);
260 if (type) {
261 if (type.type === 7) {
262 directiveToUse = V_MODEL_DYNAMIC;
263 } else if (type.value) {
264 switch (type.value.content) {
265 case "radio":
266 directiveToUse = V_MODEL_RADIO;
267 break;
268 case "checkbox":
269 directiveToUse = V_MODEL_CHECKBOX;
270 break;
271 case "file":
272 isInvalidType = true;
273 context.onError(
274 createDOMCompilerError(
275 59,
276 dir.loc
277 )
278 );
279 break;
280 default:
281 !!(process.env.NODE_ENV !== "production") && checkDuplicatedValue();
282 break;
283 }
284 }
285 } else if (hasDynamicKeyVBind(node)) {
286 directiveToUse = V_MODEL_DYNAMIC;
287 } else {
288 !!(process.env.NODE_ENV !== "production") && checkDuplicatedValue();
289 }
290 } else if (tag === "select") {
291 directiveToUse = V_MODEL_SELECT;
292 } else {
293 !!(process.env.NODE_ENV !== "production") && checkDuplicatedValue();
294 }
295 if (!isInvalidType) {
296 baseResult.needRuntime = context.helper(directiveToUse);
297 }
298 } else {
299 context.onError(
300 createDOMCompilerError(
301 57,
302 dir.loc
303 )
304 );
305 }
306 baseResult.props = baseResult.props.filter(
307 (p) => !(p.key.type === 4 && p.key.content === "modelValue")
308 );
309 return baseResult;
310};
311
312const isEventOptionModifier = /* @__PURE__ */ makeMap(`passive,once,capture`);
313const isNonKeyModifier = /* @__PURE__ */ makeMap(
314 // event propagation management
315 `stop,prevent,self,ctrl,shift,alt,meta,exact,middle`
316);
317const maybeKeyModifier = /* @__PURE__ */ makeMap("left,right");
318const isKeyboardEvent = /* @__PURE__ */ makeMap(`onkeyup,onkeydown,onkeypress`);
319const resolveModifiers = (key, modifiers, context, loc) => {
320 const keyModifiers = [];
321 const nonKeyModifiers = [];
322 const eventOptionModifiers = [];
323 for (let i = 0; i < modifiers.length; i++) {
324 const modifier = modifiers[i].content;
325 if (modifier === "native" && checkCompatEnabled(
326 "COMPILER_V_ON_NATIVE",
327 context,
328 loc
329 )) {
330 eventOptionModifiers.push(modifier);
331 } else if (isEventOptionModifier(modifier)) {
332 eventOptionModifiers.push(modifier);
333 } else {
334 if (maybeKeyModifier(modifier)) {
335 if (isStaticExp(key)) {
336 if (isKeyboardEvent(key.content.toLowerCase())) {
337 keyModifiers.push(modifier);
338 } else {
339 nonKeyModifiers.push(modifier);
340 }
341 } else {
342 keyModifiers.push(modifier);
343 nonKeyModifiers.push(modifier);
344 }
345 } else {
346 if (isNonKeyModifier(modifier)) {
347 nonKeyModifiers.push(modifier);
348 } else {
349 keyModifiers.push(modifier);
350 }
351 }
352 }
353 }
354 return {
355 keyModifiers,
356 nonKeyModifiers,
357 eventOptionModifiers
358 };
359};
360const transformClick = (key, event) => {
361 const isStaticClick = isStaticExp(key) && key.content.toLowerCase() === "onclick";
362 return isStaticClick ? createSimpleExpression(event, true) : key.type !== 4 ? createCompoundExpression([
363 `(`,
364 key,
365 `) === "onClick" ? "${event}" : (`,
366 key,
367 `)`
368 ]) : key;
369};
370const transformOn = (dir, node, context) => {
371 return transformOn$1(dir, node, context, (baseResult) => {
372 const { modifiers } = dir;
373 if (!modifiers.length) return baseResult;
374 let { key, value: handlerExp } = baseResult.props[0];
375 const { keyModifiers, nonKeyModifiers, eventOptionModifiers } = resolveModifiers(key, modifiers, context, dir.loc);
376 if (nonKeyModifiers.includes("right")) {
377 key = transformClick(key, `onContextmenu`);
378 }
379 if (nonKeyModifiers.includes("middle")) {
380 key = transformClick(key, `onMouseup`);
381 }
382 if (nonKeyModifiers.length) {
383 handlerExp = createCallExpression(context.helper(V_ON_WITH_MODIFIERS), [
384 handlerExp,
385 JSON.stringify(nonKeyModifiers)
386 ]);
387 }
388 if (keyModifiers.length && // if event name is dynamic, always wrap with keys guard
389 (!isStaticExp(key) || isKeyboardEvent(key.content.toLowerCase()))) {
390 handlerExp = createCallExpression(context.helper(V_ON_WITH_KEYS), [
391 handlerExp,
392 JSON.stringify(keyModifiers)
393 ]);
394 }
395 if (eventOptionModifiers.length) {
396 const modifierPostfix = eventOptionModifiers.map(capitalize).join("");
397 key = isStaticExp(key) ? createSimpleExpression(`${key.content}${modifierPostfix}`, true) : createCompoundExpression([`(`, key, `) + "${modifierPostfix}"`]);
398 }
399 return {
400 props: [createObjectProperty(key, handlerExp)]
401 };
402 });
403};
404
405const transformShow = (dir, node, context) => {
406 const { exp, loc } = dir;
407 if (!exp) {
408 context.onError(
409 createDOMCompilerError(61, loc)
410 );
411 }
412 return {
413 props: [],
414 needRuntime: context.helper(V_SHOW)
415 };
416};
417
418const transformTransition = (node, context) => {
419 if (node.type === 1 && node.tagType === 1) {
420 const component = context.isBuiltInComponent(node.tag);
421 if (component === TRANSITION) {
422 return () => {
423 if (!node.children.length) {
424 return;
425 }
426 if (hasMultipleChildren(node)) {
427 context.onError(
428 createDOMCompilerError(
429 62,
430 {
431 start: node.children[0].loc.start,
432 end: node.children[node.children.length - 1].loc.end,
433 source: ""
434 }
435 )
436 );
437 }
438 const child = node.children[0];
439 if (child.type === 1) {
440 for (const p of child.props) {
441 if (p.type === 7 && p.name === "show") {
442 node.props.push({
443 type: 6,
444 name: "persisted",
445 nameLoc: node.loc,
446 value: void 0,
447 loc: node.loc
448 });
449 }
450 }
451 }
452 };
453 }
454 }
455};
456function hasMultipleChildren(node) {
457 const children = node.children = node.children.filter(
458 (c) => c.type !== 3 && !(c.type === 2 && !c.content.trim())
459 );
460 const child = children[0];
461 return children.length !== 1 || child.type === 11 || child.type === 9 && child.branches.some(hasMultipleChildren);
462}
463
464const ignoreSideEffectTags = (node, context) => {
465 if (node.type === 1 && node.tagType === 0 && (node.tag === "script" || node.tag === "style")) {
466 !!(process.env.NODE_ENV !== "production") && context.onError(
467 createDOMCompilerError(
468 63,
469 node.loc
470 )
471 );
472 context.removeNode();
473 }
474};
475
476function isValidHTMLNesting(parent, child) {
477 if (parent in onlyValidChildren) {
478 return onlyValidChildren[parent].has(child);
479 }
480 if (child in onlyValidParents) {
481 return onlyValidParents[child].has(parent);
482 }
483 if (parent in knownInvalidChildren) {
484 if (knownInvalidChildren[parent].has(child)) return false;
485 }
486 if (child in knownInvalidParents) {
487 if (knownInvalidParents[child].has(parent)) return false;
488 }
489 return true;
490}
491const headings = /* @__PURE__ */ new Set(["h1", "h2", "h3", "h4", "h5", "h6"]);
492const emptySet = /* @__PURE__ */ new Set([]);
493const onlyValidChildren = {
494 head: /* @__PURE__ */ new Set([
495 "base",
496 "basefront",
497 "bgsound",
498 "link",
499 "meta",
500 "title",
501 "noscript",
502 "noframes",
503 "style",
504 "script",
505 "template"
506 ]),
507 optgroup: /* @__PURE__ */ new Set(["option"]),
508 select: /* @__PURE__ */ new Set(["optgroup", "option", "hr"]),
509 // table
510 table: /* @__PURE__ */ new Set(["caption", "colgroup", "tbody", "tfoot", "thead"]),
511 tr: /* @__PURE__ */ new Set(["td", "th"]),
512 colgroup: /* @__PURE__ */ new Set(["col"]),
513 tbody: /* @__PURE__ */ new Set(["tr"]),
514 thead: /* @__PURE__ */ new Set(["tr"]),
515 tfoot: /* @__PURE__ */ new Set(["tr"]),
516 // these elements can not have any children elements
517 script: emptySet,
518 iframe: emptySet,
519 option: emptySet,
520 textarea: emptySet,
521 style: emptySet,
522 title: emptySet
523};
524const onlyValidParents = {
525 // sections
526 html: emptySet,
527 body: /* @__PURE__ */ new Set(["html"]),
528 head: /* @__PURE__ */ new Set(["html"]),
529 // table
530 td: /* @__PURE__ */ new Set(["tr"]),
531 colgroup: /* @__PURE__ */ new Set(["table"]),
532 caption: /* @__PURE__ */ new Set(["table"]),
533 tbody: /* @__PURE__ */ new Set(["table"]),
534 tfoot: /* @__PURE__ */ new Set(["table"]),
535 col: /* @__PURE__ */ new Set(["colgroup"]),
536 th: /* @__PURE__ */ new Set(["tr"]),
537 thead: /* @__PURE__ */ new Set(["table"]),
538 tr: /* @__PURE__ */ new Set(["tbody", "thead", "tfoot"]),
539 // data list
540 dd: /* @__PURE__ */ new Set(["dl", "div"]),
541 dt: /* @__PURE__ */ new Set(["dl", "div"]),
542 // other
543 figcaption: /* @__PURE__ */ new Set(["figure"]),
544 // li: new Set(["ul", "ol"]),
545 summary: /* @__PURE__ */ new Set(["details"]),
546 area: /* @__PURE__ */ new Set(["map"])
547};
548const knownInvalidChildren = {
549 p: /* @__PURE__ */ new Set([
550 "address",
551 "article",
552 "aside",
553 "blockquote",
554 "center",
555 "details",
556 "dialog",
557 "dir",
558 "div",
559 "dl",
560 "fieldset",
561 "figure",
562 "footer",
563 "form",
564 "h1",
565 "h2",
566 "h3",
567 "h4",
568 "h5",
569 "h6",
570 "header",
571 "hgroup",
572 "hr",
573 "li",
574 "main",
575 "nav",
576 "menu",
577 "ol",
578 "p",
579 "pre",
580 "section",
581 "table",
582 "ul"
583 ]),
584 svg: /* @__PURE__ */ new Set([
585 "b",
586 "blockquote",
587 "br",
588 "code",
589 "dd",
590 "div",
591 "dl",
592 "dt",
593 "em",
594 "embed",
595 "h1",
596 "h2",
597 "h3",
598 "h4",
599 "h5",
600 "h6",
601 "hr",
602 "i",
603 "img",
604 "li",
605 "menu",
606 "meta",
607 "ol",
608 "p",
609 "pre",
610 "ruby",
611 "s",
612 "small",
613 "span",
614 "strong",
615 "sub",
616 "sup",
617 "table",
618 "u",
619 "ul",
620 "var"
621 ])
622};
623const knownInvalidParents = {
624 a: /* @__PURE__ */ new Set(["a"]),
625 button: /* @__PURE__ */ new Set(["button"]),
626 dd: /* @__PURE__ */ new Set(["dd", "dt"]),
627 dt: /* @__PURE__ */ new Set(["dd", "dt"]),
628 form: /* @__PURE__ */ new Set(["form"]),
629 li: /* @__PURE__ */ new Set(["li"]),
630 h1: headings,
631 h2: headings,
632 h3: headings,
633 h4: headings,
634 h5: headings,
635 h6: headings
636};
637
638const validateHtmlNesting = (node, context) => {
639 if (node.type === 1 && node.tagType === 0 && context.parent && context.parent.type === 1 && context.parent.tagType === 0 && !isValidHTMLNesting(context.parent.tag, node.tag)) {
640 const error = new SyntaxError(
641 `<${node.tag}> cannot be child of <${context.parent.tag}>, according to HTML specifications. This can cause hydration errors or potentially disrupt future functionality.`
642 );
643 error.loc = node.loc;
644 context.onWarn(error);
645 }
646};
647
648const DOMNodeTransforms = [
649 transformStyle,
650 ...!!(process.env.NODE_ENV !== "production") ? [transformTransition, validateHtmlNesting] : []
651];
652const DOMDirectiveTransforms = {
653 cloak: noopDirectiveTransform,
654 html: transformVHtml,
655 text: transformVText,
656 model: transformModel,
657 // override compiler-core
658 on: transformOn,
659 // override compiler-core
660 show: transformShow
661};
662function compile(src, options = {}) {
663 return baseCompile(
664 src,
665 extend({}, parserOptions, options, {
666 nodeTransforms: [
667 // ignore <script> and <tag>
668 // this is not put inside DOMNodeTransforms because that list is used
669 // by compiler-ssr to generate vnode fallback branches
670 ignoreSideEffectTags,
671 ...DOMNodeTransforms,
672 ...options.nodeTransforms || []
673 ],
674 directiveTransforms: extend(
675 {},
676 DOMDirectiveTransforms,
677 options.directiveTransforms || {}
678 ),
679 transformHoist: null
680 })
681 );
682}
683function parse(template, options = {}) {
684 return baseParse(template, extend({}, parserOptions, options));
685}
686
687export { DOMDirectiveTransforms, DOMErrorCodes, DOMErrorMessages, DOMNodeTransforms, TRANSITION, TRANSITION_GROUP, V_MODEL_CHECKBOX, V_MODEL_DYNAMIC, V_MODEL_RADIO, V_MODEL_SELECT, V_MODEL_TEXT, V_ON_WITH_KEYS, V_ON_WITH_MODIFIERS, V_SHOW, compile, createDOMCompilerError, parse, parserOptions, transformStyle };
Note: See TracBrowser for help on using the repository browser.