diff --git a/src/generators/dom/Block.ts b/src/generators/dom/Block.ts index d4ad5608f7..c23a80977c 100644 --- a/src/generators/dom/Block.ts +++ b/src/generators/dom/Block.ts @@ -1,5 +1,5 @@ import CodeBuilder from '../../utils/CodeBuilder'; -import deindent from '../../utils/deindent.js'; +import deindent from '../../utils/deindent'; import { DomGenerator } from './index'; import { Node } from '../../interfaces'; diff --git a/src/generators/dom/index.ts b/src/generators/dom/index.ts index 78258bac2b..096fe30307 100644 --- a/src/generators/dom/index.ts +++ b/src/generators/dom/index.ts @@ -3,7 +3,7 @@ import { parseExpressionAt } from 'acorn'; import annotateWithScopes from '../../utils/annotateWithScopes'; import isReference from '../../utils/isReference'; import { walk } from 'estree-walker'; -import deindent from '../../utils/deindent.js'; +import deindent from '../../utils/deindent'; import CodeBuilder from '../../utils/CodeBuilder'; import visit from './visit'; import shared from './shared'; diff --git a/src/generators/dom/visitors/Component/Binding.ts b/src/generators/dom/visitors/Component/Binding.ts index 8de5379202..fa7d539a42 100644 --- a/src/generators/dom/visitors/Component/Binding.ts +++ b/src/generators/dom/visitors/Component/Binding.ts @@ -1,4 +1,4 @@ -import deindent from '../../../../utils/deindent.js'; +import deindent from '../../../../utils/deindent'; import flattenReference from '../../../../utils/flattenReference'; import getSetter from '../shared/binding/getSetter'; import { DomGenerator } from '../../index'; diff --git a/src/generators/dom/visitors/Component/Component.ts b/src/generators/dom/visitors/Component/Component.ts index e107371a50..60c58602fe 100644 --- a/src/generators/dom/visitors/Component/Component.ts +++ b/src/generators/dom/visitors/Component/Component.ts @@ -1,4 +1,4 @@ -import deindent from '../../../../utils/deindent.js'; +import deindent from '../../../../utils/deindent'; import CodeBuilder from '../../../../utils/CodeBuilder'; import visit from '../../visit'; import visitAttribute from './Attribute'; diff --git a/src/generators/dom/visitors/Component/EventHandler.ts b/src/generators/dom/visitors/Component/EventHandler.ts index ddc37da085..2db9549389 100644 --- a/src/generators/dom/visitors/Component/EventHandler.ts +++ b/src/generators/dom/visitors/Component/EventHandler.ts @@ -1,4 +1,4 @@ -import deindent from '../../../../utils/deindent.js'; +import deindent from '../../../../utils/deindent'; import { DomGenerator } from '../../index'; import Block from '../../Block'; import { Node } from '../../../../interfaces'; diff --git a/src/generators/dom/visitors/Component/Ref.ts b/src/generators/dom/visitors/Component/Ref.ts index b966e81c71..3b9a929ed1 100644 --- a/src/generators/dom/visitors/Component/Ref.ts +++ b/src/generators/dom/visitors/Component/Ref.ts @@ -1,4 +1,4 @@ -import deindent from '../../../../utils/deindent.js'; +import deindent from '../../../../utils/deindent'; import { DomGenerator } from '../../index'; import Block from '../../Block'; import { Node } from '../../../../interfaces'; diff --git a/src/generators/dom/visitors/EachBlock.ts b/src/generators/dom/visitors/EachBlock.ts index 27e639a0d1..25642b1865 100644 --- a/src/generators/dom/visitors/EachBlock.ts +++ b/src/generators/dom/visitors/EachBlock.ts @@ -1,4 +1,4 @@ -import deindent from '../../../utils/deindent.js'; +import deindent from '../../../utils/deindent'; import visit from '../visit'; import { DomGenerator } from '../index'; import Block from '../Block'; diff --git a/src/generators/dom/visitors/Element/Attribute.ts b/src/generators/dom/visitors/Element/Attribute.ts index 8270852e11..7fbb73394b 100644 --- a/src/generators/dom/visitors/Element/Attribute.ts +++ b/src/generators/dom/visitors/Element/Attribute.ts @@ -1,5 +1,5 @@ import attributeLookup from './lookup'; -import deindent from '../../../../utils/deindent.js'; +import deindent from '../../../../utils/deindent'; import getStaticAttributeValue from './getStaticAttributeValue'; import { DomGenerator } from '../../index'; import Block from '../../Block'; diff --git a/src/generators/dom/visitors/Element/Binding.ts b/src/generators/dom/visitors/Element/Binding.ts index a7c8d1aa1e..fdac104a87 100644 --- a/src/generators/dom/visitors/Element/Binding.ts +++ b/src/generators/dom/visitors/Element/Binding.ts @@ -1,4 +1,4 @@ -import deindent from '../../../../utils/deindent.js'; +import deindent from '../../../../utils/deindent'; import flattenReference from '../../../../utils/flattenReference'; import getSetter from '../shared/binding/getSetter'; import getStaticAttributeValue from './getStaticAttributeValue'; diff --git a/src/generators/dom/visitors/Element/Element.ts b/src/generators/dom/visitors/Element/Element.ts index d5cb5c5bf1..a35177c073 100644 --- a/src/generators/dom/visitors/Element/Element.ts +++ b/src/generators/dom/visitors/Element/Element.ts @@ -1,4 +1,4 @@ -import deindent from '../../../../utils/deindent.js'; +import deindent from '../../../../utils/deindent'; import visit from '../../visit'; import visitComponent from '../Component/Component'; import visitWindow from './meta/Window'; diff --git a/src/generators/dom/visitors/Element/EventHandler.ts b/src/generators/dom/visitors/Element/EventHandler.ts index aff7fb4ac0..660e64e395 100644 --- a/src/generators/dom/visitors/Element/EventHandler.ts +++ b/src/generators/dom/visitors/Element/EventHandler.ts @@ -1,4 +1,4 @@ -import deindent from '../../../../utils/deindent.js'; +import deindent from '../../../../utils/deindent'; import flattenReference from '../../../../utils/flattenReference'; import { DomGenerator } from '../../index'; import Block from '../../Block'; diff --git a/src/generators/dom/visitors/Element/Ref.ts b/src/generators/dom/visitors/Element/Ref.ts index 6577114e6e..524c168e2b 100644 --- a/src/generators/dom/visitors/Element/Ref.ts +++ b/src/generators/dom/visitors/Element/Ref.ts @@ -1,4 +1,4 @@ -import deindent from '../../../../utils/deindent.js'; +import deindent from '../../../../utils/deindent'; import { DomGenerator } from '../../index'; import Block from '../../Block'; import { Node } from '../../../../interfaces'; diff --git a/src/generators/dom/visitors/Element/addTransitions.ts b/src/generators/dom/visitors/Element/addTransitions.ts index 66d4a83cb9..358c6d7d6c 100644 --- a/src/generators/dom/visitors/Element/addTransitions.ts +++ b/src/generators/dom/visitors/Element/addTransitions.ts @@ -1,4 +1,4 @@ -import deindent from '../../../../utils/deindent.js'; +import deindent from '../../../../utils/deindent'; import { DomGenerator } from '../../index'; import Block from '../../Block'; import { Node } from '../../../../interfaces'; diff --git a/src/generators/dom/visitors/Element/meta/Window.ts b/src/generators/dom/visitors/Element/meta/Window.ts index 22127bd9f3..b1ddaa7709 100644 --- a/src/generators/dom/visitors/Element/meta/Window.ts +++ b/src/generators/dom/visitors/Element/meta/Window.ts @@ -1,5 +1,5 @@ import flattenReference from '../../../../../utils/flattenReference'; -import deindent from '../../../../../utils/deindent.js'; +import deindent from '../../../../../utils/deindent'; import { DomGenerator } from '../../../index'; import Block from '../../../Block'; import { Node } from '../../../../../interfaces'; diff --git a/src/generators/dom/visitors/IfBlock.ts b/src/generators/dom/visitors/IfBlock.ts index 8f3700d4ef..7e294bc89f 100644 --- a/src/generators/dom/visitors/IfBlock.ts +++ b/src/generators/dom/visitors/IfBlock.ts @@ -1,4 +1,4 @@ -import deindent from '../../../utils/deindent.js'; +import deindent from '../../../utils/deindent'; import visit from '../visit'; import { DomGenerator } from '../index'; import Block from '../Block'; diff --git a/src/generators/dom/visitors/MustacheTag.ts b/src/generators/dom/visitors/MustacheTag.ts index 21604778f5..febdb452e9 100644 --- a/src/generators/dom/visitors/MustacheTag.ts +++ b/src/generators/dom/visitors/MustacheTag.ts @@ -1,4 +1,4 @@ -import deindent from '../../../utils/deindent.js'; +import deindent from '../../../utils/deindent'; import { DomGenerator } from '../index'; import Block from '../Block'; import { Node } from '../../../interfaces'; diff --git a/src/generators/dom/visitors/RawMustacheTag.ts b/src/generators/dom/visitors/RawMustacheTag.ts index 04c3c835d2..93c4aabace 100644 --- a/src/generators/dom/visitors/RawMustacheTag.ts +++ b/src/generators/dom/visitors/RawMustacheTag.ts @@ -1,4 +1,4 @@ -import deindent from '../../../utils/deindent.js'; +import deindent from '../../../utils/deindent'; import { DomGenerator } from '../index'; import Block from '../Block'; import { Node } from '../../../interfaces'; diff --git a/src/generators/dom/visitors/shared/binding/getSetter.ts b/src/generators/dom/visitors/shared/binding/getSetter.ts index 6aa027e5f9..5cb4cc4c62 100644 --- a/src/generators/dom/visitors/shared/binding/getSetter.ts +++ b/src/generators/dom/visitors/shared/binding/getSetter.ts @@ -1,4 +1,4 @@ -import deindent from '../../../../../utils/deindent.js'; +import deindent from '../../../../../utils/deindent'; export default function getSetter({ block, diff --git a/src/generators/server-side-rendering/Block.ts b/src/generators/server-side-rendering/Block.ts index a8ebc029f5..1ad36fff5a 100644 --- a/src/generators/server-side-rendering/Block.ts +++ b/src/generators/server-side-rendering/Block.ts @@ -1,4 +1,4 @@ -import deindent from '../../utils/deindent.js'; +import deindent from '../../utils/deindent'; import flattenReference from '../../utils/flattenReference'; import { SsrGenerator } from './index'; import { Node } from '../../interfaces'; diff --git a/src/generators/server-side-rendering/index.ts b/src/generators/server-side-rendering/index.ts index d5b83f022b..32a4c6635e 100644 --- a/src/generators/server-side-rendering/index.ts +++ b/src/generators/server-side-rendering/index.ts @@ -1,4 +1,4 @@ -import deindent from '../../utils/deindent.js'; +import deindent from '../../utils/deindent'; import Generator from '../Generator'; import Block from './Block'; import visit from './visit'; diff --git a/src/generators/shared/utils/getIntro.ts b/src/generators/shared/utils/getIntro.ts index aea5f47062..7427f69a0b 100644 --- a/src/generators/shared/utils/getIntro.ts +++ b/src/generators/shared/utils/getIntro.ts @@ -1,4 +1,4 @@ -import deindent from '../../../utils/deindent.js'; +import deindent from '../../../utils/deindent'; import getGlobals, { Globals } from './getGlobals'; export type ModuleFormat = 'es' | 'amd' | 'cjs' | 'iife' | 'umd' | 'eval'; diff --git a/src/parse/read/directives.ts b/src/parse/read/directives.ts index ad563df8c1..6064a61fcb 100644 --- a/src/parse/read/directives.ts +++ b/src/parse/read/directives.ts @@ -1,5 +1,5 @@ import { parseExpressionAt } from 'acorn'; -import spaces from '../../utils/spaces.js'; +import spaces from '../../utils/spaces'; import { Parser } from '../index'; function readExpression(parser: Parser, start: number, quoteMark) { diff --git a/src/parse/read/script.ts b/src/parse/read/script.ts index c5a5f10b76..4d4a8559a1 100644 --- a/src/parse/read/script.ts +++ b/src/parse/read/script.ts @@ -1,5 +1,5 @@ import { parse } from 'acorn'; -import spaces from '../../utils/spaces.js'; +import spaces from '../../utils/spaces'; import { Parser } from '../index'; const scriptClosingTag = ''; diff --git a/src/utils/__test__.ts b/src/utils/__test__.ts index 9f1cc87768..c1681dd8d6 100644 --- a/src/utils/__test__.ts +++ b/src/utils/__test__.ts @@ -1,5 +1,5 @@ import * as assert from 'assert'; -import deindent from './deindent.js'; +import deindent from './deindent'; import CodeBuilder from './CodeBuilder'; describe('deindent', () => { diff --git a/src/utils/deindent.js b/src/utils/deindent.ts similarity index 89% rename from src/utils/deindent.js rename to src/utils/deindent.ts index 6c335ca6f0..13278b26b1 100644 --- a/src/utils/deindent.js +++ b/src/utils/deindent.ts @@ -1,6 +1,6 @@ const start = /\n(\t+)/; -export default function deindent(strings, ...values) { +export default function deindent(strings: string[], ...values: any[]) { const indentation = start.exec(strings[0])[1]; const pattern = new RegExp(`^${indentation}`, 'gm'); @@ -34,7 +34,7 @@ export default function deindent(strings, ...values) { return result.trim().replace(/\t+$/gm, ''); } -function getTrailingIndentation(str) { +function getTrailingIndentation(str: string) { let i = str.length; while (str[i - 1] === ' ' || str[i - 1] === '\t') i -= 1; return str.slice(i, str.length); diff --git a/src/utils/getCodeFrame.ts b/src/utils/getCodeFrame.ts index eb237841ae..39c54c7d60 100644 --- a/src/utils/getCodeFrame.ts +++ b/src/utils/getCodeFrame.ts @@ -1,4 +1,4 @@ -import spaces from './spaces.js'; +import spaces from './spaces'; function tabsToSpaces(str: string) { return str.replace(/^\t+/, match => match.split('\t').join(' ')); diff --git a/src/utils/spaces.js b/src/utils/spaces.ts similarity index 59% rename from src/utils/spaces.js rename to src/utils/spaces.ts index b1c7a47498..657c9c3884 100644 --- a/src/utils/spaces.js +++ b/src/utils/spaces.ts @@ -1,4 +1,4 @@ -export default function spaces(i) { +export default function spaces(i: number) { let result = ''; while (i--) result += ' '; return result; diff --git a/test/create/index.js b/test/create/index.js index 9d5f5d1c02..3c2387d737 100644 --- a/test/create/index.js +++ b/test/create/index.js @@ -1,6 +1,5 @@ -import deindent from "../../src/utils/deindent.js"; import assert from "assert"; -import { svelte } from "../helpers.js"; +import { svelte, deindent } from "../helpers.js"; describe("create", () => { it("should return a component constructor", () => { diff --git a/test/formats/index.js b/test/formats/index.js index cef98af74c..9d62bb712f 100644 --- a/test/formats/index.js +++ b/test/formats/index.js @@ -1,6 +1,5 @@ -import deindent from "../../src/utils/deindent.js"; import assert from "assert"; -import { svelte, env, setupHtmlEqual } from "../helpers.js"; +import { svelte, deindent, env, setupHtmlEqual } from "../helpers.js"; function testAmd(code, expectedId, dependencies, html) { const fn = new Function("define", code); diff --git a/test/helpers.js b/test/helpers.js index 0ca921240e..d1601aa1e6 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -158,3 +158,50 @@ export function addLineNumbers(code) { }) .join("\n"); } + +const start = /\n(\t+)/; +export function deindent(strings, ...values) { + const indentation = start.exec(strings[0])[1]; + const pattern = new RegExp(`^${indentation}`, 'gm'); + + let result = strings[0].replace(start, '').replace(pattern, ''); + + let trailingIndentation = getTrailingIndentation(result); + + for (let i = 1; i < strings.length; i += 1) { + let expression = values[i - 1]; + const string = strings[i].replace(pattern, ''); + + if (Array.isArray(expression)) { + expression = expression.length ? expression.join('\n') : null; + } + + if (expression || expression === '') { + const value = String(expression).replace( + /\n/g, + `\n${trailingIndentation}` + ); + result += value + string; + } else { + let c = result.length; + while (/\s/.test(result[c - 1])) c -= 1; + result = result.slice(0, c) + string; + } + + trailingIndentation = getTrailingIndentation(result); + } + + return result.trim().replace(/\t+$/gm, ''); +} + +function getTrailingIndentation(str) { + let i = str.length; + while (str[i - 1] === ' ' || str[i - 1] === '\t') i -= 1; + return str.slice(i, str.length); +} + +export function spaces(i) { + let result = ''; + while (i--) result += ' '; + return result; +} diff --git a/test/runtime/index.js b/test/runtime/index.js index 71588d6e71..eb33a506df 100644 --- a/test/runtime/index.js +++ b/test/runtime/index.js @@ -1,4 +1,3 @@ -import spaces from "../../src/utils/spaces.js"; import assert from "assert"; import * as path from "path"; import * as fs from "fs"; @@ -11,7 +10,8 @@ import { loadConfig, loadSvelte, env, - setupHtmlEqual + setupHtmlEqual, + spaces } from "../helpers.js"; let svelte;