From de9ac1240abcb68121f1ccf91f9f40779a03efc6 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Tue, 5 Dec 2017 12:28:11 -0800 Subject: [PATCH 1/5] WIP: pass options object to preprocess hooks So that file id (& eventually other options?) can be passed to each of the preprocess hooks --- src/index.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index 081660d3d81b..fb774a2fb798 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, + options }); 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, + options + }); 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 { From 9748e90e863a330a04ad3a022a40b166ca522844 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Tue, 5 Dec 2017 12:28:43 -0800 Subject: [PATCH 2/5] WIP: interface --- src/interfaces.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/interfaces.ts b/src/interfaces.ts index 0d884f847212..51b45983aeea 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, options: PreprocessOptions}) => { code: string, map?: SourceMap | string }; style?: Preprocessor; script?: Preprocessor; + id?: string } -export type Preprocessor = (options: {content: string, attributes: Record}) => { code: string, map?: SourceMap | string }; +export type Preprocessor = (options: {content: string, attributes: Record, options: PreprocessOptions}) => { code: string, map?: SourceMap | string }; From b4a80c552631c6d304f8a59d99951b42d8d717a6 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Thu, 7 Dec 2017 10:32:39 -0800 Subject: [PATCH 3/5] WIP: pass just filename param --- src/index.ts | 4 ++-- src/interfaces.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/index.ts b/src/index.ts index fb774a2fb798..1caf5b5abc10 100644 --- a/src/index.ts +++ b/src/index.ts @@ -60,7 +60,7 @@ async function replaceTagContents(source, type: 'script' | 'style', preprocessor const processed: { code: string, map?: SourceMap | string } = await preprocessor({ content, attributes, - options + filename : options.filename }); if (processed && processed.code) { @@ -80,7 +80,7 @@ export async function preprocess(source: string, options: PreprocessOptions) { if (!!markup) { const processed: { code: string, map?: SourceMap | string } = await markup({ content: source, - options + filename: options.filename }); source = processed.code; } diff --git a/src/interfaces.ts b/src/interfaces.ts index 51b45983aeea..f2923c078804 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -86,7 +86,7 @@ export interface PreprocessOptions { markup?: (options: {content: string, options: PreprocessOptions}) => { code: string, map?: SourceMap | string }; style?: Preprocessor; script?: Preprocessor; - id?: string + filename?: string } -export type Preprocessor = (options: {content: string, attributes: Record, options: PreprocessOptions}) => { code: string, map?: SourceMap | string }; +export type Preprocessor = (options: {content: string, attributes: Record, filename?: string}) => { code: string, map?: SourceMap | string }; From 92dfabe3dc647fae9b59d9069f577a9a7e9601e0 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Thu, 7 Dec 2017 10:49:09 -0800 Subject: [PATCH 4/5] WIP: fix args to markup hook --- src/interfaces.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interfaces.ts b/src/interfaces.ts index f2923c078804..9773d330d394 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -83,7 +83,7 @@ export interface CustomElementOptions { } export interface PreprocessOptions { - markup?: (options: {content: string, options: PreprocessOptions}) => { code: string, map?: SourceMap | string }; + markup?: (options: {content: string, filename: string}) => { code: string, map?: SourceMap | string }; style?: Preprocessor; script?: Preprocessor; filename?: string From 304bd7464a484252fe55d3b01dff3096e870de0f Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Thu, 7 Dec 2017 10:49:28 -0800 Subject: [PATCH 5/5] test: filename passed to hooks --- test/preprocess/index.js | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/test/preprocess/index.js b/test/preprocess/index.js index 29eaff67f1d2..6ed452f672a4 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 = `