magic-string-ast
Version:
magic-string with Babel AST shortcut.
72 lines (69 loc) • 2.23 kB
JavaScript
import MagicString from "magic-string";
export * from "magic-string"
//#region src/index.ts
var MagicStringAST = class MagicStringAST {
s;
constructor(str, options, prototype = typeof str === "string" ? MagicString : str.constructor) {
this.prototype = prototype;
this.s = typeof str === "string" ? new prototype(str, options) : str;
return new Proxy(this.s, { get: (target, p, receiver) => {
if (Reflect.has(this, p)) return Reflect.get(this, p, receiver);
let parent = Reflect.get(target, p, receiver);
if (typeof parent === "function") parent = parent.bind(target);
return parent;
} });
}
getNodePos(nodes, offset = 0) {
if (Array.isArray(nodes)) return [offset + nodes[0].start, offset + nodes.at(-1).end];
else return [offset + nodes.start, offset + nodes.end];
}
removeNode(node, { offset } = {}) {
if (isEmptyNodes(node)) return this;
this.s.remove(...this.getNodePos(node, offset));
return this;
}
moveNode(node, index, { offset } = {}) {
if (isEmptyNodes(node)) return this;
this.s.move(...this.getNodePos(node, offset), index);
return this;
}
sliceNode(node, { offset } = {}) {
if (isEmptyNodes(node)) return "";
return this.s.slice(...this.getNodePos(node, offset));
}
overwriteNode(node, content, { offset,...options } = {}) {
if (isEmptyNodes(node)) return this;
const _content = typeof content === "string" ? content : this.sliceNode(content);
this.s.overwrite(...this.getNodePos(node, offset), _content, options);
return this;
}
snipNode(node, { offset } = {}) {
let newS;
if (isEmptyNodes(node)) newS = this.s.snip(0, 0);
else newS = this.s.snip(...this.getNodePos(node, offset));
return new MagicStringAST(newS, undefined, this.prototype);
}
clone() {
return new MagicStringAST(this.s.clone(), undefined, this.prototype);
}
toString() {
return this.s.toString();
}
};
function isEmptyNodes(nodes) {
return Array.isArray(nodes) && nodes.length === 0;
}
function generateTransform(s, id) {
if (s?.hasChanged()) return {
code: s.toString(),
get map() {
return s.generateMap({
source: id,
includeContent: true,
hires: "boundary"
});
}
};
}
//#endregion
export { MagicString, MagicStringAST, generateTransform };