Skip to content

Commit ccba20b

Browse files
committed
non-standalone mode (#9)
1 parent 541c3a6 commit ccba20b

File tree

2 files changed

+55
-17
lines changed

2 files changed

+55
-17
lines changed

src/generators/dom/index.js

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -302,15 +302,26 @@ export default function dom ( parsed, source, options, names ) {
302302
builders.main.addBlock( `${name}.prototype = template.methods;` );
303303
}
304304

305-
builders.main.addBlock( deindent`
306-
${name}.prototype.get = ${shared.get};
305+
const standalone = options.standalone !== false;
306+
307+
builders.main.addBlock( standalone ?
308+
deindent`
309+
${name}.prototype.get = ${shared.get};
307310
308-
${name}.prototype.fire = ${shared.fire};
311+
${name}.prototype.fire = ${shared.fire};
309312
310-
${name}.prototype.observe = ${shared.observe};
313+
${name}.prototype.observe = ${shared.observe};
311314
312-
${name}.prototype.on = ${shared.on};
315+
${name}.prototype.on = ${shared.on};
316+
` :
317+
deindent`
318+
${name}.prototype.get = get;
319+
${name}.prototype.fire = fire;
320+
${name}.prototype.observe = observe;
321+
${name}.prototype.on = on;
322+
` );
313323

324+
builders.main.addBlock( deindent`
314325
${name}.prototype.set = function set ( newState ) {
315326
${builders.set}
316327
};
@@ -325,12 +336,23 @@ export default function dom ( parsed, source, options, names ) {
325336
};
326337
` );
327338

328-
builders.main.addBlock( shared.dispatchObservers.toString() );
339+
if ( standalone ) {
340+
builders.main.addBlock( shared.dispatchObservers.toString() );
329341

330-
Object.keys( generator.uses ).forEach( key => {
331-
const fn = shared[ key ]; // eslint-disable-line import/namespace
332-
builders.main.addBlock( fn.toString() );
333-
});
342+
Object.keys( generator.uses ).forEach( key => {
343+
const fn = shared[ key ]; // eslint-disable-line import/namespace
344+
builders.main.addBlock( fn.toString() );
345+
});
346+
} else {
347+
if ( format !== 'es' ) {
348+
throw new Error( `Non-standalone components must be compiled to ES2015 modules (format: 'es')` );
349+
}
350+
351+
const names = [ 'get', 'fire', 'observe', 'on', 'dispatchObservers' ].concat( Object.keys( generator.uses ) );
352+
builders.main.addLineAtStart(
353+
`import { ${names.join( ', ' )} } from 'svelte/shared.js'`
354+
);
355+
}
334356

335357
return generator.generate( builders.main.toString(), options, { name, format } );
336358
}

test/generate.js

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,16 @@ import * as acorn from 'acorn';
66

77
import { svelte, env, setupHtmlEqual } from './helpers.js';
88

9-
const cache = {};
10-
119
let showCompiledCode = false;
1210
let compileOptions = null;
1311

1412
require.extensions[ '.html' ] = function ( module, filename ) {
1513
const options = Object.assign({ filename }, compileOptions );
16-
const code = cache[ filename ] || ( cache[ filename ] = svelte.compile( fs.readFileSync( filename, 'utf-8' ), options ).code );
14+
const { code } = svelte.compile( fs.readFileSync( filename, 'utf-8' ), options );
15+
1716
if ( showCompiledCode ) console.log( addLineNumbers( code ) ); // eslint-disable-line no-console
1817

19-
return module._compile( code, filename );
18+
return module._compile( code.replace( 'svelte/shared.js', path.resolve( 'shared.js' ) ), filename );
2019
};
2120

2221
function addLineNumbers ( code ) {
@@ -30,7 +29,9 @@ function addLineNumbers ( code ) {
3029

3130
function loadConfig ( dir ) {
3231
try {
33-
return require( `./generator/${dir}/_config.js` ).default;
32+
const resolved = require.resolve( `./generator/${dir}/_config.js` );
33+
delete require.cache[ resolved ];
34+
return require( resolved ).default;
3435
} catch ( err ) {
3536
if ( err.code === 'E_NOT_FOUND' ) {
3637
return {};
@@ -43,7 +44,7 @@ function loadConfig ( dir ) {
4344
describe( 'generate', () => {
4445
before( setupHtmlEqual );
4546

46-
fs.readdirSync( 'test/generator' ).forEach( dir => {
47+
function runTest ( dir, standalone ) {
4748
if ( dir[0] === '.' ) return;
4849

4950
const config = loadConfig( dir );
@@ -53,6 +54,7 @@ describe( 'generate', () => {
5354

5455
showCompiledCode = config.show;
5556
compileOptions = config.compileOptions || {};
57+
compileOptions.standalone = standalone;
5658

5759
try {
5860
const source = fs.readFileSync( `test/generator/${dir}/main.html`, 'utf-8' );
@@ -78,7 +80,9 @@ describe( 'generate', () => {
7880
throw err;
7981
}
8082

81-
cache[ path.resolve( `test/generator/${dir}/main.html` ) ] = code;
83+
Object.keys( require.cache ).filter( x => x.endsWith( '.html' ) ).forEach( file => {
84+
delete require.cache[ file ];
85+
});
8286

8387
let SvelteComponent;
8488

@@ -117,5 +121,17 @@ describe( 'generate', () => {
117121
throw err;
118122
});
119123
});
124+
}
125+
126+
describe( 'standalone', () => {
127+
fs.readdirSync( 'test/generator' ).forEach( dir => {
128+
runTest( dir, true );
129+
});
130+
});
131+
132+
describe( 'non-standalone', () => {
133+
fs.readdirSync( 'test/generator' ).forEach( dir => {
134+
runTest( dir, false );
135+
});
120136
});
121137
});

0 commit comments

Comments
 (0)