Skip to content

Commit a161a2d

Browse files
committed
merge rollup-plugin-svelte-hmr in this project
1 parent 84a498f commit a161a2d

File tree

7 files changed

+205
-12
lines changed

7 files changed

+205
-12
lines changed

hmr/hot-api/nollup.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { makeApplyHmr } from 'svelte-hmr/runtime';
2+
3+
const g = typeof window !== 'undefined' ? window : global;
4+
5+
if (!g.__ROLLUP_PLUGIN_SVELTE_HMR) {
6+
g.__ROLLUP_PLUGIN_SVELTE_HMR = {};
7+
}
8+
9+
export const applyHmr = makeApplyHmr(args => {
10+
const { m, id, hotOptions, reload } = args;
11+
12+
const globState = g.__ROLLUP_PLUGIN_SVELTE_HMR;
13+
14+
const hotState = (globState[id] = globState[id] || { declined: false });
15+
16+
if (hotState.declined) {
17+
if (!hotOptions.noReload) {
18+
reload();
19+
} else {
20+
// eslint-disable-next-line no-console
21+
console.log('[HMR][Svelte] Full reload required');
22+
}
23+
}
24+
25+
const dispose = handler => {
26+
m.hot.dispose(() => {
27+
if (!hotState.data) {
28+
hotState.data = {};
29+
}
30+
handler(hotState.data);
31+
});
32+
};
33+
34+
// TODO not used anymore... remove?
35+
// eslint-disable-next-line no-unused-vars
36+
const decline = () => {
37+
hotState.declined = true;
38+
};
39+
40+
const accept = handler => {
41+
m.hot.accept(() => {
42+
require(m.id);
43+
if (handler) {
44+
handler();
45+
}
46+
});
47+
};
48+
49+
const hot = {
50+
data: hotState.data,
51+
dispose,
52+
accept,
53+
};
54+
55+
return Object.assign({}, args, { hot });
56+
});

hmr/hot-api/rollup.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { makeApplyHmr } from 'svelte-hmr/runtime';
2+
3+
export const applyHmr = makeApplyHmr(args =>
4+
Object.assign({}, args, {
5+
hot: args.m.hot,
6+
})
7+
);

hmr/index.js

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
const path = require('path');
2+
const { createFilter } = require('rollup-pluginutils');
3+
const { createMakeHot } = require('svelte-hmr');
4+
5+
const hotApiAlias = 'rollup-plugin-svelte-hmr/_/hot-api';
6+
7+
const svelteHmr = (options = {}) => {
8+
const { hot = true, nollup = false, patchSapperDevClient = false } = options;
9+
10+
const filter = createFilter('**/*.svelte', []);
11+
12+
const hotApiPath = `${__dirname}/hot-api/${nollup ? 'nollup' : 'rollup'}.js`;
13+
const hotApi = path.resolve(hotApiPath);
14+
const makeHot = createMakeHot(hotApi, {
15+
meta: nollup ? 'module' : 'import.meta',
16+
});
17+
const aliases = {
18+
[hotApiAlias]: hotApi,
19+
};
20+
21+
function _transform(code, id, compiled) {
22+
if (!hot) return;
23+
if (!filter(id)) return;
24+
25+
this.addWatchFile(hotApi);
26+
27+
const transformed = makeHot(id, code, options, compiled);
28+
29+
return transformed;
30+
}
31+
32+
let fs;
33+
const _setFs = _fs => {
34+
fs = _fs;
35+
};
36+
37+
const resolveId = (target, from) => {
38+
const alias = aliases[target];
39+
if (alias) {
40+
return alias;
41+
}
42+
if (patchSapperDevClient) {
43+
if (/\/sapper-dev-client.js$/.test(target)) {
44+
return path.join(__dirname, 'sapper-dev-client.js');
45+
}
46+
}
47+
if (fs) {
48+
const name = path.join(path.dirname(from), target);
49+
const extensions = ['.js', '.svelte'];
50+
for (const ext of extensions) {
51+
const filename = name + ext;
52+
if (fs.existsSync(filename) && fs.lstatSync(filename).isFile()) {
53+
return filename;
54+
}
55+
}
56+
}
57+
};
58+
59+
function load(id) {
60+
if (!fs) return;
61+
return new Promise((resolve, reject) => {
62+
fs.readFile(id, 'utf8', (err, contents) => {
63+
if (err) reject(err);
64+
else resolve(contents);
65+
});
66+
});
67+
}
68+
69+
// We need to pass _after_ Nollup's HMR plugin, that registers itself last.
70+
const nollupBundleInit = () => `
71+
const init = () => {
72+
if (typeof window === 'undefined') return
73+
if (!window.__hot) return
74+
if (!window.__hot.addErrorHandler) return
75+
window.__hot.addErrorHandler(
76+
err => {
77+
const adapter = window.__SVELTE_HMR_ADAPTER
78+
if (adapter && adapter.renderCompileError) {
79+
adapter.renderCompileError(err)
80+
}
81+
}
82+
)
83+
}
84+
setTimeout(init)
85+
`;
86+
87+
const listeners = {
88+
generateBundle: [],
89+
renderError: [],
90+
};
91+
92+
const addListener = type => listener => {
93+
listeners[type].push(listener);
94+
};
95+
96+
const fire = type => (...args) => {
97+
listeners[type].forEach(listener => listener(...args));
98+
};
99+
100+
const generateBundle = fire('generateBundle');
101+
const renderError = fire('renderError');
102+
103+
const _onBundleGenerated = addListener('generateBundle');
104+
105+
const _onRenderError = addListener('renderError');
106+
107+
return {
108+
name: 'svelte-hmr',
109+
nollupBundleInit,
110+
resolveId,
111+
load,
112+
generateBundle,
113+
renderError,
114+
transform(code, id) {
115+
return _transform.call(this, code, id);
116+
},
117+
// used by rollup-plugin-svelte
118+
_transform,
119+
// used by test driver
120+
_setFs,
121+
_onBundleGenerated,
122+
_onRenderError,
123+
};
124+
};
125+
126+
module.exports = svelteHmr;

hmr/sapper-dev-client.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/**
2+
* FIXME
3+
*
4+
* We need to use a custom sapper dev client currently, because the official
5+
* one does not support our "hot API" (only webpack-style, when it sees rollup,
6+
* it does force reloads).
7+
*/
8+
export function connect() {
9+
// eslint-disable-next-line no-console
10+
console.log('[SAPPER] dev client: bails out in favor of Rollup HMR');
11+
}

index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const path = require('path');
33
const relative = require('require-relative');
44
const { createFilter } = require('rollup-pluginutils');
55
const { encode, decode } = require('sourcemap-codec');
6-
const svelteHmr = require('rollup-plugin-svelte-hmr');
6+
const svelteHmr = require('./hmr');
77

88
const {
99
major_version,

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@
3939
},
4040
"dependencies": {
4141
"require-relative": "^0.8.7",
42-
"rollup-plugin-svelte-hmr": "^0.0.14",
43-
"rollup-pluginutils": "^2.3.3",
44-
"sourcemap-codec": "^1.4.4"
42+
"rollup-pluginutils": "^2.8.2",
43+
"sourcemap-codec": "^1.4.4",
44+
"svelte-hmr": "^0.0.9"
4545
},
4646
"optionalDependencies": {
4747
"nollup": ">=0.7.7"

yarn.lock

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1607,14 +1607,7 @@ rimraf@^2.5.2, rimraf@^2.6.1:
16071607
dependencies:
16081608
glob "^7.1.3"
16091609

1610-
rollup-plugin-svelte-hmr@^0.0.14:
1611-
version "0.0.14"
1612-
resolved "https://registry.yarnpkg.com/rollup-plugin-svelte-hmr/-/rollup-plugin-svelte-hmr-0.0.14.tgz#60afdacc7ad3129b96da03e16c4884a5b138f33d"
1613-
dependencies:
1614-
rollup-pluginutils "^2.8.2"
1615-
svelte-hmr "^0.0.9"
1616-
1617-
rollup-pluginutils@^2.3.3, rollup-pluginutils@^2.8.2:
1610+
rollup-pluginutils@^2.8.2:
16181611
version "2.8.2"
16191612
resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e"
16201613
dependencies:

0 commit comments

Comments
 (0)