Description
Since the update to the latest Svelte version (3.38.3) an error is thrown from Vite when a request comes in.
Logs
$ svelte-kit dev --port 8000
SvelteKit v1.0.0-next.116
local: http://localhost:8000
network: not exposed
Use --host to expose server to other devices on this network
offset is longer than source length!
Error: offset is longer than source length!
at numberToPos (/<path/to/the/project>/node_modules/vite/dist/node/chunks/dep-0ed4fbc0.js:4234:15)
at formatError (/<path/to/the/project>/node_modules/vite/dist/node/chunks/dep-0ed4fbc0.js:44611:24)
at TransformContext.error (/<path/to/the/project>/node_modules/vite/dist/node/chunks/dep-0ed4fbc0.js:44591:19)
at Object.transform (/<path/to/the/project>/node_modules/vite/dist/node/chunks/dep-0ed4fbc0.js:44799:25)
at async transformRequest (/<path/to/the/project>/node_modules/vite/dist/node/chunks/dep-0ed4fbc0.js:60267:29)
at async instantiateModule (/<path/to/the/project>/node_modules/vite/dist/node/chunks/dep-0ed4fbc0.js:69930:10)
I traced it to an error in one of my style blocks not displaying because the offset/source length is incorrect:
ERR:: CompileError [ValidationError]: :global(...) must contain a single selector
at error (file:///<path/to/the/project>/node_modules/svelte/compiler.mjs:16752:19)
at Component.error (file:///<path/to/the/project>/node_modules/svelte/compiler.mjs:29036:9)
at Selector$1.validate (file:///<path/to/the/project>t/node_modules/svelte/compiler.mjs:27872:35)
at file:///<path/to/the/project>/node_modules/svelte/compiler.mjs:28369:22
at Array.forEach (<anonymous>)
at Rule$1.validate (file:///<path/to/the/project>/node_modules/svelte/compiler.mjs:28368:24)
at file:///<path/to/the/project>/node_modules/svelte/compiler.mjs:28650:19
at Array.forEach (<anonymous>)
at Stylesheet.validate (file:///<path/to/the/project>/node_modules/svelte/compiler.mjs:28649:23)
at new Component (file:///<path/to/the/project>/node_modules/svelte/compiler.mjs:28828:25) {
code: 'css-invalid-global-selector',
start: { line: 89, column: 10, character: 2845 },
end: { line: 89, column: 58, character: 2893 },
pos: 2845,
...
frame: '87: }\n' +
'88: \n' +
'89: .slider :global(.noUi-handle:after, .noUi-handle:before) {\n' +
' ^\n' +
'90: left: 10px !important;\n' +
'91: top: 4px !important;',
...
The offset is 2845 (offset/pos) but the source length is 2417 in that case.
https://github.com/vitejs/vite/blob/460d1cda317e4c4d03434f2b3d8de9152620005b/packages/vite/src/node/utils.ts#L252
export function numberToPos(
source: string,
offset: number | { line: number; column: number }
): { line: number; column: number } {
if (typeof offset !== 'number') return offset
if (offset > source.length) {
throw new Error('offset is longer than source length!')
}
const lines = source.split(splitRE)
Information about your SvelteKit Installation:
System:
OS: macOS 10.15.4
CPU: (4) x64 Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
Memory: 367.08 MB / 16.00 GB
Shell: 5.7.1 - /bin/zsh
Binaries:
Node: 16.0.0 - ~/.nvm/versions/node/v16.0.0/bin/node
Yarn: 1.22.10 - /usr/local/bin/yarn
npm: 7.10.0 - ~/.nvm/versions/node/v16.0.0/bin/npm
Browsers:
Brave Browser: 76.0.68.132
Chrome: 91.0.4472.114
Chrome Canary: 93.0.4551.0
Edge: 91.0.864.54
Firefox: 72.0.2
Firefox Developer Edition: 89.0
Safari: 13.1
npmPackages:
@sveltejs/adapter-node: ^1.0.0-next.27 => 1.0.0-next.27
@sveltejs/adapter-static: ^1.0.0-next.13 => 1.0.0-next.13
@sveltejs/kit: ^1.0.0-next.116 => 1.0.0-next.116
svelte: 3.38.3 => 3.38.3
Let me know if this info is sufficient and reproducible with any SvelteKit app with the latest Svelte version + multiple selectors in a single :global
like :global(.foo, .bar)
or a repro is needed.
PS: Not sure if the bug report is correct here or should be created in the svelte or vite-plugin-svelte repo.