feat: docker compose maybe
This commit is contained in:
18
node_modules/svelte-hmr/lib/css-only.js
generated
vendored
Normal file
18
node_modules/svelte-hmr/lib/css-only.js
generated
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Injects a `{}*` CSS rule to force Svelte compiler to scope every elements.
|
||||
*/
|
||||
export const injectScopeEverythingCssRule = (parse, code) => {
|
||||
const { css } = parse(code)
|
||||
if (!css) return code
|
||||
const {
|
||||
content: { end },
|
||||
} = css
|
||||
return code.slice(0, end) + '*{}' + code.slice(end)
|
||||
}
|
||||
|
||||
export const normalizeJsCode = code => {
|
||||
// Svelte now adds locations in dev mode, code locations can change when
|
||||
// CSS change, but we're unaffected (not real behaviour changes)
|
||||
code = code.replace(/\badd_location\s*\([^)]*\)\s*;?/g, '')
|
||||
return code
|
||||
}
|
497
node_modules/svelte-hmr/lib/make-hot.js
generated
vendored
Normal file
497
node_modules/svelte-hmr/lib/make-hot.js
generated
vendored
Normal file
@ -0,0 +1,497 @@
|
||||
const globalName = '___SVELTE_HMR_HOT_API'
|
||||
const globalAdapterName = '___SVELTE_HMR_HOT_API_PROXY_ADAPTER'
|
||||
|
||||
const defaultHotOptions = {
|
||||
// preserve all local state
|
||||
preserveLocalState: false,
|
||||
|
||||
// escape hatchs from preservation of local state
|
||||
//
|
||||
// disable preservation of state for this component
|
||||
noPreserveStateKey: ['@hmr:reset', '@!hmr'],
|
||||
// enable preservation of state for all variables in this component
|
||||
preserveAllLocalStateKey: '@hmr:keep-all',
|
||||
// enable preservation of state for a given variable (must be inline or
|
||||
// above the target variable or variables; can be repeated)
|
||||
preserveLocalStateKey: '@hmr:keep',
|
||||
|
||||
// don't reload on fatal error
|
||||
noReload: false,
|
||||
// try to recover after runtime errors during component init
|
||||
// defaults to false because some runtime errors are fatal and require a full reload
|
||||
optimistic: false,
|
||||
// auto accept modules of components that have named exports (i.e. exports
|
||||
// from context="module")
|
||||
acceptNamedExports: true,
|
||||
// auto accept modules of components have accessors (either accessors compile
|
||||
// option, or <svelte:option accessors={true} />) -- this means that if you
|
||||
// set accessors compile option globally, you must also set this option to
|
||||
// true, or no component will be hot reloaded (but there are a lot of edge
|
||||
// cases that HMR can't support correctly with accessors)
|
||||
acceptAccessors: true,
|
||||
// only inject CSS instead of recreating components when only CSS changes
|
||||
injectCss: false,
|
||||
// to mitigate FOUC between dispose (remove stylesheet) and accept
|
||||
cssEjectDelay: 100,
|
||||
|
||||
// Svelte Native mode
|
||||
native: false,
|
||||
// name of the adapter import binding
|
||||
importAdapterName: globalAdapterName,
|
||||
|
||||
// disable runtime error overlay
|
||||
noOverlay: false,
|
||||
|
||||
// set to true on systems that supports them, to avoid useless caught /
|
||||
// managed (but still...) exceptions, by using Svelte's current_component
|
||||
// instead of get_current_component
|
||||
allowLiveBinding: false,
|
||||
|
||||
// use acceptExports instead of accept, to fix support of context:module
|
||||
partialAccept: false,
|
||||
}
|
||||
|
||||
const defaultHotApi = 'hot-api-esm.js'
|
||||
|
||||
const json = JSON.stringify
|
||||
|
||||
const posixify = file => file.replace(/[/\\]/g, '/')
|
||||
|
||||
const renderApplyHmr = ({
|
||||
id,
|
||||
cssId,
|
||||
nonCssHash,
|
||||
hotOptions: {
|
||||
injectCss,
|
||||
partialAccept,
|
||||
_accept = partialAccept ? "acceptExports(['default'])" : 'accept()',
|
||||
},
|
||||
hotOptionsJson,
|
||||
hotApiImport,
|
||||
adapterImport,
|
||||
importAdapterName,
|
||||
meta,
|
||||
acceptable,
|
||||
preserveLocalState,
|
||||
emitCss,
|
||||
imports = [
|
||||
`import * as ${globalName} from ${JSON.stringify(hotApiImport)}`,
|
||||
`import { adapter as ${importAdapterName} } from ${JSON.stringify(adapterImport)}`,
|
||||
],
|
||||
}) =>
|
||||
// this silly formatting keeps all original characters in their position,
|
||||
// thus saving us from having to provide a sourcemap
|
||||
//
|
||||
// NOTE the `if (false) accept()` line is for tools that wants to see the
|
||||
// accept call in the actual accepted module to enable HMR (Vite and, I
|
||||
// believe, Snowpack 3)
|
||||
//
|
||||
`${imports.join(';')};${`
|
||||
if (${meta} && ${meta}.hot) {
|
||||
${acceptable ? `if (false) ${meta}.hot.${_accept};` : ''};
|
||||
$2 = ${globalName}.applyHmr({
|
||||
m: ${meta},
|
||||
id: ${json(id)},
|
||||
hotOptions: ${hotOptionsJson},
|
||||
Component: $2,
|
||||
ProxyAdapter: ${importAdapterName},
|
||||
acceptable: ${json(acceptable)},
|
||||
preserveLocalState: ${json(preserveLocalState)},
|
||||
${cssId ? `cssId: ${json(cssId)},` : ''}
|
||||
${nonCssHash ? `nonCssHash: ${json(nonCssHash)},` : ''}
|
||||
emitCss: ${json(emitCss)},
|
||||
});
|
||||
}
|
||||
`
|
||||
.split('\n')
|
||||
.map(x => x.trim())
|
||||
.filter(Boolean)
|
||||
.join(' ')}
|
||||
export default $2;
|
||||
${
|
||||
// NOTE when doing CSS only voodoo, we have to inject the stylesheet as soon
|
||||
// as the component is loaded because Svelte normally do that when a component
|
||||
// is instantiated, but we might already have instances in the large when a
|
||||
// component is loaded with HMR
|
||||
cssId && injectCss && !emitCss
|
||||
? `
|
||||
if (typeof add_css !== 'undefined' && !document.getElementById(${json(
|
||||
cssId
|
||||
)})) add_css();`
|
||||
: ``
|
||||
}
|
||||
`
|
||||
|
||||
// replace from last occurrence of the splitter
|
||||
const replaceLast = (string, splitter, regex, replacer) => {
|
||||
const lastIndex = string.lastIndexOf(splitter)
|
||||
return (
|
||||
string.slice(0, lastIndex) +
|
||||
string.slice(lastIndex).replace(regex, replacer)
|
||||
)
|
||||
}
|
||||
|
||||
// https://github.com/darkskyapp/string-hash/blob/master/index.js
|
||||
// (via https://github.com/sveltejs/svelte/blob/91d758e35b2b2154512ddd11e6b6d9d65708a99e/src/compiler/compile/utils/hash.ts#L2)
|
||||
const stringHashcode = str => {
|
||||
let hash = 5381
|
||||
let i = str.length
|
||||
while (i--) hash = ((hash << 5) - hash) ^ str.charCodeAt(i)
|
||||
return (hash >>> 0).toString(36)
|
||||
}
|
||||
|
||||
const normalizeJsCode = (code, cssHash) =>
|
||||
code
|
||||
// ignore css hashes in the code (that have changed, necessarily)
|
||||
.replace(new RegExp('\\b' + cssHash + '\\b', 'g'), '')
|
||||
// Svelte now adds locations in dev mode, code locations can change when
|
||||
// CSS change, but we're unaffected (not real behaviour changes)
|
||||
.replace(/\badd_location\s*\([^)]*\)\s*;?/g, '')
|
||||
|
||||
const parseCssId = (code, compileOptions = {}, parseHash, originalCode) => {
|
||||
// the regex matching is very pretty conservative 'cause I don't want to
|
||||
// match something else by error... I'm probably make it more lax if I have
|
||||
// to fix it 3 times in a single week ¯\_(ツ)_/¯
|
||||
let match = /^function add_css\(\) \{[\s\S]*?^}/m.exec(code)
|
||||
|
||||
if (!match) {
|
||||
// guard: injectCss is off, no need to compute hashes
|
||||
if (!parseHash) return {}
|
||||
// guard: compile.css is true, so we should have found the add_css function,
|
||||
// something unexpected is unraveling here, fall back to caution
|
||||
if (compileOptions.css) return {}
|
||||
// trying to get CSS id the same way as Svelte does it
|
||||
match = /<style[^>]*>([\s\S]*)<\/\s*style\s*>/.exec(originalCode)
|
||||
const cssHash = match && match[1] ? stringHashcode(match[1]) : null
|
||||
if (!cssHash) return {}
|
||||
return {
|
||||
cssId: `svelte-${cssHash}-style`,
|
||||
nonCssHash: stringHashcode(normalizeJsCode(code, cssHash)),
|
||||
}
|
||||
}
|
||||
|
||||
const codeExceptCSS =
|
||||
code.slice(0, match.index) + code.slice(match.index + match[0].length)
|
||||
|
||||
match = /\bstyle\.id\s*=\s*(['"])([^'"]*)\1/.exec(match[0])
|
||||
const cssId = match ? match[2] : null
|
||||
|
||||
if (!parseHash || !cssId) return { cssId }
|
||||
|
||||
const cssHash = cssId.split('-')[1]
|
||||
const nonCssHash = stringHashcode(normalizeJsCode(codeExceptCSS, cssHash))
|
||||
|
||||
return { cssId, nonCssHash }
|
||||
}
|
||||
|
||||
const isNamedExport = v => v.export_name && v.module
|
||||
|
||||
const isProp = v => v.export_name && !v.module
|
||||
|
||||
const resolvePackageImport = (name = 'svelte-hmr', version = '') => {
|
||||
const versionSpec = version ? '@' + version : ''
|
||||
return target => `${name}${versionSpec}/${target}`
|
||||
}
|
||||
|
||||
const createMakeHot = ({ resolveAbsoluteImport, pkg = {} }) => ({
|
||||
// NOTE hotOptions can be customized by end user through plugin options, while
|
||||
// options passed to this function can only customized by the plugin implementer
|
||||
//
|
||||
// meta can be 'import.meta' or 'module'
|
||||
// const createMakeHot = (hotApi = defaultHotApi, options) => {
|
||||
walk,
|
||||
meta = 'import.meta',
|
||||
|
||||
hotApi: customHotApi = '',
|
||||
adapter: customAdapter = '',
|
||||
// use absolute file paths to import runtime deps of svelte-hmr
|
||||
// - pnpm needs absolute paths because svelte-hmr, being a transitive dep via
|
||||
// the bundler plugin, is not directly importable from user's project
|
||||
// (see https://github.com/rixo/svelte-hmr/issues/11)
|
||||
// - Snowpack source=remote needs a version number, otherwise it will try to
|
||||
// load import, resulting in a possible version mismatch between the code
|
||||
// transform and the runtime
|
||||
// (see: https://github.com/rixo/svelte-hmr/issues/27#issuecomment-800142127)
|
||||
absoluteImports = true,
|
||||
versionNonAbsoluteImports = true,
|
||||
|
||||
hotOptions: hotOptionsArg = {},
|
||||
}) => {
|
||||
const hotOptions = { ...defaultHotOptions, ...hotOptionsArg }
|
||||
|
||||
const hotOptionsJson = JSON.stringify(hotOptions)
|
||||
|
||||
// NOTE Native adapter cannot be required in code (as opposed to this
|
||||
// generated code) because it requires modules from NativeScript's code that
|
||||
// are not resolvable for non-native users (and those missing modules would
|
||||
// prevent webpack from building).
|
||||
//
|
||||
// careful with relative paths
|
||||
// (see https://github.com/rixo/svelte-hmr/issues/11)
|
||||
const defaultAdapter = hotOptions.native
|
||||
? 'svelte-native/proxy-adapter-native.js'
|
||||
: 'proxy-adapter-dom.js'
|
||||
|
||||
const resolveImport = absoluteImports
|
||||
? resolveAbsoluteImport
|
||||
: resolvePackageImport(pkg.name, versionNonAbsoluteImports && pkg.version)
|
||||
|
||||
const adapterImport = posixify(
|
||||
customAdapter || resolveImport('runtime/' + defaultAdapter)
|
||||
)
|
||||
|
||||
const hotApiImport = posixify(
|
||||
customHotApi || resolveImport('runtime/' + defaultHotApi)
|
||||
)
|
||||
|
||||
const resolvePreserveLocalStateKey = ({
|
||||
preserveLocalStateKey,
|
||||
compiled,
|
||||
}) => {
|
||||
const containsKey = comments =>
|
||||
comments &&
|
||||
comments.some(({ value }) => value.includes(preserveLocalStateKey))
|
||||
|
||||
const variables = new Set()
|
||||
|
||||
const addReference = node => {
|
||||
if (!node.name) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.warn('Incorrect identifier for preserveLocalStateKey')
|
||||
}
|
||||
variables.add(node.name)
|
||||
}
|
||||
|
||||
const processNodes = targets => targets.forEach(processNode)
|
||||
|
||||
const processNode = node => {
|
||||
switch (node.type) {
|
||||
case 'Identifier':
|
||||
variables.add(node.name)
|
||||
return true
|
||||
case 'UpdateExpression':
|
||||
addReference(node.argument)
|
||||
return true
|
||||
case 'VariableDeclarator':
|
||||
addReference(node.id)
|
||||
return true
|
||||
case 'AssignmentExpression':
|
||||
processNode(node.left)
|
||||
return true
|
||||
case 'ExpressionStatement':
|
||||
processNode(node.expression)
|
||||
return true
|
||||
|
||||
case 'VariableDeclaration':
|
||||
processNodes(node.declarations)
|
||||
return true
|
||||
case 'SequenceExpression': // ++, --
|
||||
processNodes(node.expressions)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
const stack = []
|
||||
|
||||
if (compiled.ast.instance) {
|
||||
walk(compiled.ast.instance, {
|
||||
leave() {
|
||||
stack.shift()
|
||||
},
|
||||
enter(node) {
|
||||
stack.unshift(node)
|
||||
if (
|
||||
containsKey(node.leadingComments) ||
|
||||
containsKey(node.trailingComments)
|
||||
) {
|
||||
stack
|
||||
.slice(0, 3)
|
||||
.reverse()
|
||||
.some(processNode)
|
||||
}
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
return [...variables]
|
||||
}
|
||||
|
||||
const resolvePreserveLocalState = ({
|
||||
hotOptions,
|
||||
originalCode,
|
||||
compiled,
|
||||
}) => {
|
||||
const {
|
||||
preserveLocalState,
|
||||
noPreserveStateKey,
|
||||
preserveLocalStateKey,
|
||||
preserveAllLocalStateKey,
|
||||
} = hotOptions
|
||||
if (originalCode) {
|
||||
const hasKey = key => {
|
||||
const test = k => originalCode.indexOf(k) !== -1
|
||||
return Array.isArray(key) ? key.some(test) : test(key)
|
||||
}
|
||||
// noPreserveStateKey
|
||||
if (noPreserveStateKey && hasKey(noPreserveStateKey)) {
|
||||
return false
|
||||
}
|
||||
// preserveAllLocalStateKey
|
||||
if (preserveAllLocalStateKey && hasKey(preserveAllLocalStateKey)) {
|
||||
return true
|
||||
}
|
||||
// preserveLocalStateKey
|
||||
if (preserveLocalStateKey && hasKey(preserveLocalStateKey)) {
|
||||
// returns an array of variable names to preserve
|
||||
return resolvePreserveLocalStateKey({ preserveLocalStateKey, compiled })
|
||||
}
|
||||
}
|
||||
// preserveLocalState
|
||||
if (preserveLocalState) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
const hasAccessorsOption = compiled => {
|
||||
if (!compiled.ast || !compiled.ast.html) return
|
||||
let accessors = false
|
||||
walk(compiled.ast.html, {
|
||||
enter(node) {
|
||||
if (accessors) return
|
||||
if (node.type !== 'Options') return
|
||||
if (!node.attributes) return
|
||||
accessors = node.attributes.some(
|
||||
({ name, value }) => name === 'accessors' && value
|
||||
)
|
||||
},
|
||||
})
|
||||
return accessors
|
||||
}
|
||||
|
||||
const isAcceptable = (hotOptions, compileOptions, compiled) => {
|
||||
if (!compiled || !compileOptions) {
|
||||
// this should never happen, since it's the bundler plugins that control
|
||||
// what version of svelte-hmr they embark, and they should be kept up to
|
||||
// date with our API
|
||||
//
|
||||
// eslint-disable-next-line no-console
|
||||
console.warn(
|
||||
'WARNING Your bundler plugin is outdated for this version of svelte-hmr'
|
||||
)
|
||||
return true
|
||||
}
|
||||
|
||||
const { vars } = compiled
|
||||
|
||||
// if the module has named exports (in context="module"), then we can't
|
||||
// auto accept the component, since all the consumers need to be aware of
|
||||
// the change (e.g. rerender with the new exports value)
|
||||
if (!hotOptions.acceptNamedExports && vars.some(isNamedExport)) {
|
||||
return false
|
||||
}
|
||||
|
||||
// ...same for accessors: if accessible props change, then we need to
|
||||
// rerender/rerun all the consumers to reflect the change
|
||||
//
|
||||
// NOTE we can still accept components with no props, since they won't
|
||||
// have accessors... this is actually all we can safely accept in this case
|
||||
//
|
||||
if (
|
||||
!hotOptions.acceptAccessors &&
|
||||
// we test is we have props first, because searching for the
|
||||
// <svelte:options /> tag in the AST is probably the most expensive here
|
||||
vars.some(isProp) &&
|
||||
(compileOptions.accessors || hasAccessorsOption(compiled))
|
||||
) {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
const parseMakeHotArgs = args => {
|
||||
// case: named args (object)
|
||||
if (args.length === 1) return args[0]
|
||||
// case: legacy (positional)
|
||||
const [
|
||||
id,
|
||||
compiledCode,
|
||||
hotOptions,
|
||||
compiled,
|
||||
originalCode,
|
||||
compileOptions,
|
||||
] = args
|
||||
return {
|
||||
id,
|
||||
compiledCode,
|
||||
hotOptions,
|
||||
compiled,
|
||||
originalCode,
|
||||
compileOptions,
|
||||
}
|
||||
}
|
||||
|
||||
function makeHot(...args) {
|
||||
const {
|
||||
id,
|
||||
compiledCode,
|
||||
compiled,
|
||||
originalCode,
|
||||
compileOptions,
|
||||
} = parseMakeHotArgs(args)
|
||||
|
||||
const { importAdapterName, injectCss } = hotOptions
|
||||
|
||||
const emitCss =
|
||||
compileOptions &&
|
||||
(compileOptions.css === false || compileOptions.css === 'external')
|
||||
|
||||
const preserveLocalState = resolvePreserveLocalState({
|
||||
hotOptions,
|
||||
originalCode,
|
||||
compiled,
|
||||
})
|
||||
|
||||
const replacement = renderApplyHmr({
|
||||
id,
|
||||
// adds cssId & nonCssHash
|
||||
...((injectCss || !emitCss) &&
|
||||
parseCssId(compiledCode, compileOptions, injectCss, originalCode)),
|
||||
hotOptions,
|
||||
hotOptionsJson,
|
||||
preserveLocalState,
|
||||
hotApiImport,
|
||||
adapterImport,
|
||||
importAdapterName,
|
||||
meta,
|
||||
acceptable: isAcceptable(hotOptions, compileOptions, compiled),
|
||||
// CSS is handled outside of Svelte: don't tamper with it!
|
||||
emitCss,
|
||||
})
|
||||
|
||||
// NOTE export default can appear in strings in use code
|
||||
// see: https://github.com/rixo/svelte-hmr/issues/34
|
||||
return replaceLast(
|
||||
compiledCode,
|
||||
'export default',
|
||||
/(\n?export default ([^;]*);)/,
|
||||
(match, $1, $2) => replacement.replace(/\$2/g, () => $2)
|
||||
)
|
||||
}
|
||||
|
||||
// rollup-plugin-svelte-hot needs hotApi path (for tests)
|
||||
// makeHot.hotApi = hotApi
|
||||
Object.defineProperty(makeHot, 'hotApi', {
|
||||
get() {
|
||||
// TODO makeHot.hotApi has been lost in 0.12 => 0.13... still needed?
|
||||
debugger // eslint-disable-line no-debugger
|
||||
return undefined
|
||||
},
|
||||
})
|
||||
|
||||
return makeHot
|
||||
}
|
||||
|
||||
module.exports = createMakeHot
|
Reference in New Issue
Block a user