From fa13212779aa2920ac9696d25dc090aaeb4b661a Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Sat, 17 Sep 2022 11:46:55 +0100 Subject: [PATCH 1/4] fix(vite, webpack): avoid generating keys where a key is already provided --- packages/vite/src/plugins/composable-keys.ts | 30 ++++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/packages/vite/src/plugins/composable-keys.ts b/packages/vite/src/plugins/composable-keys.ts index 6aa6eb38879..0f6eb2559b9 100644 --- a/packages/vite/src/plugins/composable-keys.ts +++ b/packages/vite/src/plugins/composable-keys.ts @@ -16,6 +16,7 @@ const keyedFunctions = [ 'useState', 'useFetch', 'useAsyncData', 'useLazyAsyncData', 'useLazyFetch' ] const KEYED_FUNCTIONS_RE = new RegExp(`(${keyedFunctions.join('|')})`) +const stringTypes = ['Literal', 'TemplateLiteral'] export const composableKeysPlugin = createUnplugin((options: ComposableKeysOptions) => { return { @@ -37,13 +38,30 @@ export const composableKeysPlugin = createUnplugin((options: ComposableKeysOptio enter (_node) { if (_node.type !== 'CallExpression' || (_node as CallExpression).callee.type !== 'Identifier') { return } const node: CallExpression = _node as CallExpression - if (keyedFunctions.includes((node.callee as any).name) && node.arguments.length < 4) { - const end = (node as any).end - s.appendLeft( - codeIndex + end - 1, - (node.arguments.length ? ', ' : '') + "'$" + hash(`${relativeID}-${++count}`) + "'" - ) + const name = 'name' in node.callee && node.callee.name + if (!name || !keyedFunctions.includes(name) || node.arguments.length >= 4) { return } + + switch (name) { + case 'useState': + if (node.arguments.length >= 2 || stringTypes.includes(node.arguments[0].type)) { return } + break + + case 'useFetch': + case 'useLazyFetch': + if (node.arguments.length >= 2) { return } + break + + case 'useAsyncData': + case 'useLazyAsyncData': + if (node.arguments.length >= 3 || stringTypes.includes(node.arguments[0].type) || stringTypes.includes(node.arguments[node.arguments.length - 1].type)) { return } + break } + + const end = (node as any).end + s.appendLeft( + codeIndex + end - 1, + (node.arguments.length ? ', ' : '') + "'$" + hash(`${relativeID}-${++count}`) + "'" + ) } }) if (s.hasChanged()) { From 48d4b2e127fa64c82e0bf16a7671a7414daddc9b Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Sat, 17 Sep 2022 11:51:06 +0100 Subject: [PATCH 2/4] perf: extract transform filter and exclude nuxt composables --- packages/vite/src/plugins/composable-keys.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/plugins/composable-keys.ts b/packages/vite/src/plugins/composable-keys.ts index 0f6eb2559b9..ff81bfbbeed 100644 --- a/packages/vite/src/plugins/composable-keys.ts +++ b/packages/vite/src/plugins/composable-keys.ts @@ -22,9 +22,11 @@ export const composableKeysPlugin = createUnplugin((options: ComposableKeysOptio return { name: 'nuxt:composable-keys', enforce: 'post', - transform (code, id) { + transformInclude (id) { const { pathname, search } = parseURL(decodeURIComponent(pathToFileURL(id).href)) - if (!pathname.match(/\.(m?[jt]sx?|vue)/) || parseQuery(search).type === 'style') { return } + return pathname.match(/node_modules\/nuxt3?\//) && pathname.match(/\.(m?[jt]sx?|vue)/) && parseQuery(search).type !== 'style' + }, + transform (code, id) { if (!KEYED_FUNCTIONS_RE.test(code)) { return } const { 0: script = code, index: codeIndex = 0 } = code.match(/(?<=]*>)[\S\s.]*?(?=<\/script>)/) || [] const s = new MagicString(code) From 0bf93f05b81eddbdb346c1726d1535c56d8aa915 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Sat, 17 Sep 2022 11:58:15 +0100 Subject: [PATCH 3/4] fix: oops! --- packages/vite/src/plugins/composable-keys.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/plugins/composable-keys.ts b/packages/vite/src/plugins/composable-keys.ts index ff81bfbbeed..55a3eedef9f 100644 --- a/packages/vite/src/plugins/composable-keys.ts +++ b/packages/vite/src/plugins/composable-keys.ts @@ -24,7 +24,7 @@ export const composableKeysPlugin = createUnplugin((options: ComposableKeysOptio enforce: 'post', transformInclude (id) { const { pathname, search } = parseURL(decodeURIComponent(pathToFileURL(id).href)) - return pathname.match(/node_modules\/nuxt3?\//) && pathname.match(/\.(m?[jt]sx?|vue)/) && parseQuery(search).type !== 'style' + return !pathname.match(/node_modules\/nuxt3?\//) && pathname.match(/\.(m?[jt]sx?|vue)/) && parseQuery(search).type !== 'style' }, transform (code, id) { if (!KEYED_FUNCTIONS_RE.test(code)) { return } From b304b670256b88a996f0bc618a47fbb363069481 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Sat, 17 Sep 2022 12:10:52 +0100 Subject: [PATCH 4/4] fix: handle useFetch properly --- packages/vite/src/plugins/composable-keys.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/plugins/composable-keys.ts b/packages/vite/src/plugins/composable-keys.ts index 55a3eedef9f..df0f6aa311a 100644 --- a/packages/vite/src/plugins/composable-keys.ts +++ b/packages/vite/src/plugins/composable-keys.ts @@ -50,7 +50,7 @@ export const composableKeysPlugin = createUnplugin((options: ComposableKeysOptio case 'useFetch': case 'useLazyFetch': - if (node.arguments.length >= 2) { return } + if (node.arguments.length >= 3 || stringTypes.includes(node.arguments[1]?.type)) { return } break case 'useAsyncData': @@ -59,9 +59,8 @@ export const composableKeysPlugin = createUnplugin((options: ComposableKeysOptio break } - const end = (node as any).end s.appendLeft( - codeIndex + end - 1, + codeIndex + (node as any).end - 1, (node.arguments.length ? ', ' : '') + "'$" + hash(`${relativeID}-${++count}`) + "'" ) }