Skip to content
This repository was archived by the owner on Apr 6, 2023. It is now read-only.
Merged
Changes from 1 commit
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
ec8967b
fix(nuxt): use parser for treeshake module
huang-julien Nov 15, 2022
a62d688
test(nuxt): ensure scoped style does not break
huang-julien Nov 15, 2022
ee02bed
style: lint
huang-julien Nov 15, 2022
27c9205
refactor(nuxt): improve regex and change jsdoc
huang-julien Nov 15, 2022
fecea00
fix(nuxt): treeshake client only components in setup
huang-julien Nov 15, 2022
6357b28
fix(nuxt): fix refactor + change component to components
huang-julien Nov 15, 2022
d8397c1
chore: remove `ultrahtml` dependency
danielroe Nov 6, 2022
13aa7f8
Update packages/nuxt/src/components/tree-shake.ts
huang-julien Nov 6, 2022
3bb188b
Update packages/nuxt/src/components/tree-shake.ts
huang-julien Nov 6, 2022
34107a2
refactor(nuxt): use escapeStringRegexp()
huang-julien Nov 6, 2022
3cb007a
fix(nuxt): set back treeshake for all clientonly components
huang-julien Nov 6, 2022
4ec2fa9
fix(nuxt): avoid removing placeholder slot
huang-julien Nov 6, 2022
334d68f
fix(nuxt): fix regexpMap
huang-julien Nov 7, 2022
210da41
test(nuxt): ensure .client components are treeshaken
huang-julien Nov 7, 2022
9dd27d5
style: lint
huang-julien Nov 8, 2022
24f85fe
fix(nuxt): add new regex to match component exact var name using ^$
huang-julien Nov 8, 2022
ddc0e70
fix: treeshake direct import of .client components
huang-julien Nov 9, 2022
ac4cdb2
fix: treeshake lazy client
huang-julien Nov 11, 2022
f27f94d
fix(nuxt): treeshake all slots on .client components
huang-julien Nov 15, 2022
9ee2e49
Apply suggestions from code review
huang-julien Nov 15, 2022
1a86be5
fix(nuxt): treeshake call expressions with ssrRenderComponent
huang-julien Nov 16, 2022
8923aec
Merge branch 'fix/treeshakeCLientOnlyStyle' of https://github.com/hua…
huang-julien Nov 16, 2022
3ac6cd1
Merge branch 'main' into fix/treeshakeCLientOnlyStyle
huang-julien Nov 16, 2022
cac7cc2
chore: fix lock
huang-julien Nov 16, 2022
121e1f3
Merge branch 'main' into fix/treeshakeCLientOnlyStyle
danielroe Dec 19, 2022
205293e
Merge remote-tracking branch 'origin/main' into fix/treeshakeCLientOn…
danielroe Jan 14, 2023
b08125f
test(nuxt): unit test treeshake client plugin
huang-julien Jan 22, 2023
0fe07f6
fix(nuxt): remove whole line of component declaration instead of remo…
huang-julien Jan 22, 2023
521f883
refactor(nuxt): move some logic into a function
huang-julien Jan 22, 2023
c40c649
chore: remove unecessary comment
huang-julien Jan 22, 2023
646e69f
test(nuxt): add snapshots for treeshake client only
huang-julien Jan 22, 2023
939bc3d
test: fix snapshot
huang-julien Jan 22, 2023
139c615
fix: update snapshot
huang-julien Jan 22, 2023
392b401
test: directly mock node:crypto
huang-julien Jan 22, 2023
eabbff9
Merge remote-tracking branch 'origin/main' into fix/treeshakeCLientOn…
danielroe Feb 7, 2023
73da1fe
test(nuxt): mock path relative due to os differences
huang-julien Feb 7, 2023
cbfe602
test: set correct mock
huang-julien Feb 7, 2023
7fc8681
test: fix max callstack
huang-julien Feb 7, 2023
e5271a7
lint + fix
huang-julien Feb 7, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
refactor(nuxt): move some logic into a function
  • Loading branch information
huang-julien committed Jan 22, 2023
commit 521f883b38d25a49c01bd2799896e21fb48376e7
42 changes: 24 additions & 18 deletions packages/nuxt/src/components/tree-shake.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { pathToFileURL } from 'node:url'
import { parseURL } from 'ufo'
import MagicString from 'magic-string'
import { walk } from 'estree-walker'
import type { CallExpression, Property, Identifier, ImportDeclaration, MemberExpression, Literal, ReturnStatement, VariableDeclaration, ObjectExpression } from 'estree'
import type { CallExpression, Property, Identifier, ImportDeclaration, MemberExpression, Literal, ReturnStatement, VariableDeclaration, ObjectExpression, Node } from 'estree'
import { createUnplugin } from 'unplugin'
import escapeStringRegexp from 'escape-string-regexp'
import type { Component } from '@nuxt/schema'
Expand Down Expand Up @@ -46,7 +46,7 @@ export const TreeShakeTemplatePlugin = createUnplugin((options: TreeShakeTemplat
const [COMPONENTS_RE, COMPONENTS_IDENTIFIERS_RE] = regexpMap.get(components)!
if (!COMPONENTS_RE.test(code)) { return }

walk(this.parse(code, { sourceType: 'module', ecmaVersion: 'latest' }), {
walk(this.parse(code, { sourceType: 'module', ecmaVersion: 'latest' }) as Node, {
enter: (_node) => {
const node = _node as AcornNode<CallExpression | ImportDeclaration>
if (node.type === 'ImportDeclaration') {
Expand All @@ -69,7 +69,7 @@ export const TreeShakeTemplatePlugin = createUnplugin((options: TreeShakeTemplat
s.remove(slot.start, slot.end + 1)
const removedCode = `({${code.slice(slot.start, slot.end + 1)}})`
const currentCode = s.toString()
walk(this.parse(removedCode, { sourceType: 'module', ecmaVersion: 'latest' }), {
walk(this.parse(removedCode, { sourceType: 'module', ecmaVersion: 'latest' }) as Node, {
enter: (_node) => {
const node = _node as AcornNode<CallExpression>
if (node.type === 'CallExpression' && node.callee.type === 'Identifier' && SSR_RENDER_RE.test(node.callee.name)) {
Expand All @@ -86,21 +86,9 @@ export const TreeShakeTemplatePlugin = createUnplugin((options: TreeShakeTemplat
if (!isRenderedInCode(currentCode, removedCode.slice(start, end))) {
componentsSet.add(((componentNode as MemberExpression).property as Literal).value as string)
// remove the component from the return statement of `setup()`
walk(this.parse(code, { sourceType: 'module', ecmaVersion: 'latest' }), {
enter: (_node) => {
const node = _node as Property
if (node.type === 'Property' && node.key.type === 'Identifier' && node.key.name === 'setup' && node.value.type === 'FunctionExpression') {
const returnStatement = node.value.body.body.find(n => n.type === 'ReturnStatement') as ReturnStatement | undefined
if (returnStatement?.argument?.type === 'Identifier') {
const returnIdentifier = returnStatement.argument.name
const returnedDeclaration = node.value.body.body.find(n => n.type === 'VariableDeclaration' && (n.declarations[0].id as Identifier).name === returnIdentifier) as AcornNode<VariableDeclaration>
const componentProperty = (returnedDeclaration?.declarations[0].init as ObjectExpression)?.properties.find(p => ((p as Property).key as Identifier).name === ((componentNode as MemberExpression).property as Literal).value) as AcornNode<Property>
if (componentProperty) { s.remove(componentProperty.start, componentProperty.end + 1) }
} else if (returnStatement?.argument?.type === 'ObjectExpression') {
const componentProperty = returnStatement.argument?.properties.find(p => ((p as Property).key as Identifier).name === ((componentNode as MemberExpression).property as Literal).value) as AcornNode<Property>
if (componentProperty) { s.remove(componentProperty.start, componentProperty.end + 1) }
}
}
walk(this.parse(code, { sourceType: 'module', ecmaVersion: 'latest' }) as Node, {
enter: (node) => {
removeFromSetupReturnStatement(s, node as Property, ((componentNode as MemberExpression).property as Literal).value as string)
}
})
}
Expand Down Expand Up @@ -191,3 +179,21 @@ function getComponentName (ssrRenderNode: AcornNode<CallExpression>): string {
}
return (componentCall.arguments[0] as Identifier).name
}

/**
* remove a key from the return statement of the setup function
*/
function removeFromSetupReturnStatement (s: MagicString, node: Property, name: string) {
if (node.type === 'Property' && node.key.type === 'Identifier' && node.key.name === 'setup' && node.value.type === 'FunctionExpression') {
const returnStatement = node.value.body.body.find(n => n.type === 'ReturnStatement') as ReturnStatement | undefined
if (returnStatement?.argument?.type === 'Identifier') {
const returnIdentifier = returnStatement.argument.name
const returnedDeclaration = node.value.body.body.find(n => n.type === 'VariableDeclaration' && (n.declarations[0].id as Identifier).name === returnIdentifier) as AcornNode<VariableDeclaration>
const componentProperty = (returnedDeclaration?.declarations[0].init as ObjectExpression)?.properties.find(p => ((p as Property).key as Identifier).name === name) as AcornNode<Property>
if (componentProperty) { s.remove(componentProperty.start, componentProperty.end + 1) }
} else if (returnStatement?.argument?.type === 'ObjectExpression') {
const componentProperty = returnStatement.argument?.properties.find(p => ((p as Property).key as Identifier).name === name) as AcornNode<Property>
if (componentProperty) { s.remove(componentProperty.start, componentProperty.end + 1) }
}
}
}