Merge pull request #987 from tivac/preprocess-options

feat: Pass filename option to preprocess hooks
pull/1004/head
Rich Harris 8 years ago committed by GitHub
commit 0ae82f3c53
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -50,7 +50,7 @@ function parseAttributes(str: string) {
return attrs; 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 exp = new RegExp(`<${type}([\\S\\s]*?)>([\\S\\s]*?)<\\/${type}>`, 'ig');
const match = exp.exec(source); const match = exp.exec(source);
@ -59,7 +59,8 @@ async function replaceTagContents(source, type: 'script' | 'style', preprocessor
const content: string = match[2]; const content: string = match[2];
const processed: { code: string, map?: SourceMap | string } = await preprocessor({ const processed: { code: string, map?: SourceMap | string } = await preprocessor({
content, content,
attributes attributes,
filename : options.filename
}); });
if (processed && processed.code) { if (processed && processed.code) {
@ -77,16 +78,19 @@ async function replaceTagContents(source, type: 'script' | 'style', preprocessor
export async function preprocess(source: string, options: PreprocessOptions) { export async function preprocess(source: string, options: PreprocessOptions) {
const { markup, style, script } = options; const { markup, style, script } = options;
if (!!markup) { 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; source = processed.code;
} }
if (!!style) { if (!!style) {
source = await replaceTagContents(source, 'style', style); source = await replaceTagContents(source, 'style', style, options);
} }
if (!!script) { if (!!script) {
source = await replaceTagContents(source, 'script', script); source = await replaceTagContents(source, 'script', script, options);
} }
return { return {

@ -83,9 +83,10 @@ export interface CustomElementOptions {
} }
export interface PreprocessOptions { 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; style?: Preprocessor;
script?: Preprocessor; script?: Preprocessor;
filename?: string
} }
export type Preprocessor = (options: {content: string, attributes: Record<string, string | boolean>}) => { code: string, map?: SourceMap | string }; export type Preprocessor = (options: {content: string, attributes: Record<string, string | boolean>, filename?: string}) => { code: string, map?: SourceMap | string };

@ -126,6 +126,41 @@ describe('preprocess', () => {
}); });
}); });
it('provides filename to processing hooks', () => {
const source = `
<h1>Hello __MARKUP_FILENAME__!</h1>
<style>.red { color: __STYLE_FILENAME__; }</style>
<script>console.log('__SCRIPT_FILENAME__');</script>
`;
const expected = `
<h1>Hello file.html!</h1>
<style>.red { color: file.html; }</style>
<script>console.log('file.html');</script>
`;
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', () => { it('ignores null/undefined returned from preprocessor', () => {
const source = ` const source = `
<script> <script>
@ -145,4 +180,4 @@ describe('preprocess', () => {
assert.equal(processed.toString(), expected); assert.equal(processed.toString(), expected);
}); });
}); });
}); });

Loading…
Cancel
Save