diff --git a/CHANGELOG.md b/CHANGELOG.md index 048b070a1e..2f2826ec20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,21 @@ # Svelte changelog +## 1.46.0 + +* Pass `filename` through to preprocessors ([#983](https://github.com/sveltejs/svelte/issues/983)) + +## 1.45.0 + +* Dynamic components ([#971](https://github.com/sveltejs/svelte/pull/971)) + +## 1.44.2 + +* Fix `await` blocks with siblings ([#974](https://github.com/sveltejs/svelte/issues/974)) +* Fix `await` blocks inside `if` blocks ([#975](https://github.com/sveltejs/svelte/issues/975)) + ## 1.44.1 -* Fix bidirectional transitions that reference state ([#962](https://github.com/sveltejs/svelte/issues962)) +* Fix bidirectional transitions that reference state ([#962](https://github.com/sveltejs/svelte/issues/962)) ## 1.44.0 diff --git a/package.json b/package.json index b033530acc..30983ad30a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte", - "version": "1.44.1", + "version": "1.46.0", "description": "The magical disappearing UI framework", "main": "compiler/svelte.js", "files": [ diff --git a/src/index.ts b/src/index.ts index 081660d3d8..1caf5b5abc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -50,7 +50,7 @@ function parseAttributes(str: string) { return attrs; } -async function replaceTagContents(source, type: 'script' | 'style', preprocessor: Preprocessor) { +async function replaceTagContents(source, type: 'script' | 'style', preprocessor: Preprocessor, options: PreprocessOptions) { const exp = new RegExp(`<${type}([\\S\\s]*?)>([\\S\\s]*?)<\\/${type}>`, 'ig'); const match = exp.exec(source); @@ -59,7 +59,8 @@ async function replaceTagContents(source, type: 'script' | 'style', preprocessor const content: string = match[2]; const processed: { code: string, map?: SourceMap | string } = await preprocessor({ content, - attributes + attributes, + filename : options.filename }); if (processed && processed.code) { @@ -77,16 +78,19 @@ async function replaceTagContents(source, type: 'script' | 'style', preprocessor export async function preprocess(source: string, options: PreprocessOptions) { const { markup, style, script } = options; if (!!markup) { - const processed: { code: string, map?: SourceMap | string } = await markup({ content: source }); + const processed: { code: string, map?: SourceMap | string } = await markup({ + content: source, + filename: options.filename + }); source = processed.code; } if (!!style) { - source = await replaceTagContents(source, 'style', style); + source = await replaceTagContents(source, 'style', style, options); } if (!!script) { - source = await replaceTagContents(source, 'script', script); + source = await replaceTagContents(source, 'script', script, options); } return { diff --git a/src/interfaces.ts b/src/interfaces.ts index 0d884f8472..9773d330d3 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -83,9 +83,10 @@ export interface CustomElementOptions { } export interface PreprocessOptions { - markup?: (options: {content: string}) => { code: string, map?: SourceMap | string }; + markup?: (options: {content: string, filename: string}) => { code: string, map?: SourceMap | string }; style?: Preprocessor; script?: Preprocessor; + filename?: string } -export type Preprocessor = (options: {content: string, attributes: Record}) => { code: string, map?: SourceMap | string }; +export type Preprocessor = (options: {content: string, attributes: Record, filename?: string}) => { code: string, map?: SourceMap | string }; diff --git a/test/preprocess/index.js b/test/preprocess/index.js index 29eaff67f1..6ed452f672 100644 --- a/test/preprocess/index.js +++ b/test/preprocess/index.js @@ -126,6 +126,41 @@ describe('preprocess', () => { }); }); + it('provides filename to processing hooks', () => { + const source = ` +

Hello __MARKUP_FILENAME__!

+ + + `; + + const expected = ` +

Hello file.html!

+ + + `; + + return svelte.preprocess(source, { + filename: 'file.html', + markup: ({ content, filename }) => { + return { + code: content.replace('__MARKUP_FILENAME__', filename) + }; + }, + style: ({ content, filename }) => { + return { + code: content.replace('__STYLE_FILENAME__', filename) + }; + }, + script: ({ content, filename }) => { + return { + code: content.replace('__SCRIPT_FILENAME__', filename) + }; + } + }).then(processed => { + assert.equal(processed.toString(), expected); + }); + }); + it('ignores null/undefined returned from preprocessor', () => { const source = `