Skip to content

Commit c0524ea

Browse files
add preprocessor nesting
This allows for developers to ensure that certain `markup` functions are run *after* other `script` or `style` functions have run.
1 parent c4479d9 commit c0524ea

File tree

2 files changed

+77
-15
lines changed

2 files changed

+77
-15
lines changed

site/content/docs/04-compile-time.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,51 @@ const { code } = await svelte.preprocess(source, [
312312
});
313313
```
314314

315+
An additional level of nesting allows more control over the timing of subsequent `markup` functions.
316+
317+
```js
318+
const svelte = require('svelte/compiler');
319+
320+
const { code } = await svelte.preprocess(source, [
321+
[
322+
{
323+
markup: () => {
324+
console.log('this runs first');
325+
},
326+
script: () => {
327+
console.log('this runs third');
328+
},
329+
style: () => {
330+
console.log('this runs fifth');
331+
}
332+
},
333+
{
334+
markup: () => {
335+
console.log('this runs second');
336+
},
337+
script: () => {
338+
console.log('this runs fourth');
339+
},
340+
style: () => {
341+
console.log('this runs sixth');
342+
}
343+
}
344+
],
345+
{
346+
markup: () => {
347+
console.log('this runs seventh');
348+
},
349+
script: () => {
350+
console.log('this runs eighth');
351+
},
352+
style: () => {
353+
console.log('this runs ninth');
354+
}
355+
}
356+
], {
357+
filename: 'App.svelte'
358+
});
359+
```
315360

316361
### `svelte.walk`
317362

src/compiler/preprocess/index.ts

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -195,27 +195,26 @@ async function process_markup(filename: string, process: MarkupPreprocessor, sou
195195
}
196196
}
197197

198-
export default async function preprocess(
199-
source: string,
200-
preprocessor: PreprocessorGroup | PreprocessorGroup[],
201-
options?: { filename?: string }
202-
): Promise<Processed> {
203-
// @ts-ignore todo: doublecheck
204-
const filename = (options && options.filename) || preprocessor.filename; // legacy
205-
206-
const preprocessors = preprocessor ? (Array.isArray(preprocessor) ? preprocessor : [preprocessor]) : [];
198+
function ensureArray<T>(x: T): T extends readonly any[] ? T : T[] {
199+
// @ts-ignore
200+
return Array.isArray(x)? x : [x];
201+
}
207202

208-
const markup = preprocessors.map(p => p.markup).filter(Boolean);
209-
const script = preprocessors.map(p => p.script).filter(Boolean);
210-
const style = preprocessors.map(p => p.style).filter(Boolean);
211-
212-
const result = new PreprocessResult(source, filename);
203+
async function preprocessGrouped<T extends PreprocessResult>(
204+
result: T,
205+
preprocessorGroup: PreprocessorGroup[]|PreprocessorGroup
206+
): Promise<void> {
207+
const preprocessors = ensureArray(preprocessorGroup);
208+
209+
const markup = preprocessors.map((p) => p.markup).filter(Boolean);
210+
const script = preprocessors.map((p) => p.script).filter(Boolean);
211+
const style = preprocessors.map((p) => p.style).filter(Boolean);
213212

214213
// TODO keep track: what preprocessor generated what sourcemap?
215214
// to make debugging easier = detect low-resolution sourcemaps in fn combine_mappings
216215

217216
for (const process of markup) {
218-
result.update_source(await process_markup(filename, process, result));
217+
result.update_source(await process_markup(result.filename, process, result));
219218
}
220219

221220
for (const process of script) {
@@ -226,5 +225,23 @@ export default async function preprocess(
226225
result.update_source(await process_tag('style', preprocess, result));
227226
}
228227

228+
return;
229+
}
230+
231+
export default async function preprocess(
232+
source: string,
233+
preprocessor: PreprocessorGroup | Array<PreprocessorGroup | PreprocessorGroup[]> = [],
234+
options?: { filename?: string }
235+
): Promise<Processed> {
236+
// @ts-ignore todo: doublecheck
237+
const filename = (options && options.filename) || preprocessor.filename; // legacy
238+
const result = new PreprocessResult(source, filename);
239+
240+
const preprocessors = ensureArray(preprocessor);
241+
242+
for (const preprocessorGrouping of preprocessors) {
243+
await preprocessGrouped(result, preprocessorGrouping);
244+
}
245+
229246
return result.to_processed();
230247
}

0 commit comments

Comments
 (0)