Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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()`
Expand Down
70 changes: 27 additions & 43 deletions src/transformer.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
}

Expand All @@ -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;
Expand Down
Loading