diff --git a/README.md b/README.md index 47ff430..b424521 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ t.toString(); Properties / Methods: - `t.toString()` returns a string of the original file with all applied transforms + - `t.toString({ placeholders: true })` returns a string of original file, but as valid JS with placeholder markers - also applies transforms if anyone were done. - `t.parseResults` output from `content-tag` , but frozen / read-only - these are used as keys for other methods - `t.map()` - `t.each()` diff --git a/src/transformer.js b/src/transformer.js index b93ecda..b87a469 100644 --- a/src/transformer.js +++ b/src/transformer.js @@ -320,53 +320,20 @@ export class Transformer { * @returns {string} */ toStringWithTemplatePlaceholders() { - let result = this.#originalSource; - let offset = 0; - - /** - * Apply recorded transforms - */ - for (let parseResult of this.#parseResults) { - let transformed = this.#transforms.get(parseResult); - let originalContent = this.#stringUtils.originalContentOf(parseResult); - let originalLength = originalContent.length; - - let content = transformed ? transformed.toString() : originalContent; - - let originalBeforeContent = this.#stringUtils.contentBefore(parseResult); - let originalStart = originalBeforeContent.length; - - // parseResult.type === 'expression' - let openingTag = "TEMPLATE_TEMPLATE(`"; - let closingTag = "`)"; - - if (parseResult.type === "class-member") { - openingTag = "[_TEMPLATE_(`"; - closingTag = "`)] = 0;"; - } - - let originalEnd = - originalStart + openingTag.length + originalLength + closingTag.length; - - result = - result.slice(0, originalStart + offset) + - openingTag + - content + - closingTag + - result.slice(originalEnd + offset, result.length); - - offset += content.length - originalLength; - } - - return result; + return this.toString({ placeholders: true }); } /** * Returns the whole gjs/gts document with the transforms written in to it * + * @typedef {object} ToStringOptions + * @property {boolean} [placeholders] + * + * @param {ToStringOptions} [ options ] * @returns {string} */ - toString() { + toString(options) { + let usePlaceholders = options?.placeholders ?? false; let result = this.#originalSource; let offset = 0; @@ -378,7 +345,9 @@ export class Transformer { let originalContent = this.#stringUtils.originalContentOf(parseResult); let originalLength = originalContent.length; - if (!transformed) { + let content = transformed ? transformed.toString() : originalContent; + + if (!transformed && !usePlaceholders) { continue; } @@ -388,17 +357,32 @@ export class Transformer { let openingTag = this.#stringUtils.openingTag(parseResult); let closingTag = this.#stringUtils.closingTag(parseResult); + if (usePlaceholders) { + switch (parseResult.type) { + case "expression": { + openingTag = "TEMPLATE_TEMPLATE(`"; + closingTag = "`)"; + break; + } + case "class-member": { + openingTag = "[_TEMPLATE_(`"; + closingTag = "`)] = 0;"; + break; + } + } + } + let originalEnd = originalStart + openingTag.length + originalLength + closingTag.length; result = result.slice(0, originalStart + offset) + openingTag + - transformed.toString() + + content + closingTag + result.slice(originalEnd + offset, result.length); - offset += transformed.length - originalLength; + offset += content.length - originalLength; } return result;