Skip to content

Commit 4ff48e7

Browse files
authored
fix: return result for all nodes + disable batch processing (#15)
1 parent 3a8666c commit 4ff48e7

File tree

2 files changed

+69
-46
lines changed

2 files changed

+69
-46
lines changed

src/utils/template.ts

+55-44
Original file line numberDiff line numberDiff line change
@@ -268,61 +268,72 @@ const vSlotSnippetHandler: SnippetHandler = {
268268
},
269269
}
270270

271-
async function transformJsSnippets(codes: Expression[], transform: (code: string) => Promise<string>): Promise<WeakMap<Expression, string>> {
272-
const keyMap = new WeakMap<Expression, string>()
273-
const transformMap = new Map<string, { id: number, node: Expression, handler: SnippetHandler }>()
274-
const snippetHandlers = [vSlotSnippetHandler, defaultSnippetHandler]
275-
let id = 0
276-
for (const code of codes) {
277-
for (const handler of snippetHandlers) {
278-
const key = handler.key(code)
279-
if (!key) {
280-
continue
281-
}
271+
const snippetHandlers = [vSlotSnippetHandler, defaultSnippetHandler]
272+
function getKey(expression: Expression) {
273+
for (const handler of snippetHandlers) {
274+
const key = handler.key(expression)
275+
if (key) {
276+
return { key, handler }
277+
}
278+
}
279+
}
282280

283-
keyMap.set(code, key)
284-
if (transformMap.has(key)) {
285-
break
286-
}
281+
async function transformJsSnippets(expressions: Expression[], transform: (code: string) => Promise<string>): Promise<WeakMap<Expression, string>> {
282+
const transformMap = new Map<string, { id: number, nodes: [Expression, ...Expression[]], handler: SnippetHandler }>()
287283

288-
transformMap.set(key, { id, node: code, handler })
289-
id += 1
290-
break
284+
let id = 0
285+
for (const expression of expressions) {
286+
const res = getKey(expression)
287+
if (!res) {
288+
continue
289+
}
290+
if (transformMap.has(res.key)) {
291+
const item = transformMap.get(res.key)!
292+
item.nodes.push(expression)
293+
continue
291294
}
295+
296+
transformMap.set(res.key, { id, nodes: [expression], handler: res.handler })
297+
id += 1
292298
}
293299

294-
const batchOrder = Array.from(transformMap.entries())
300+
const resultMap = new Map<Expression, string>()
301+
for (const item of transformMap.values()) {
302+
// TODO: reenable batch processing after fixing issue with esbuild renaming variables
303+
const batch = [item]
295304

296-
// transform all snippets in a single file
297-
const batchInputSplitter = `\nsplitter(${Math.random()});\n`
298-
const batchInput = batchOrder
299-
.map(([_, { node, handler }]) => handler.prepare(node, id))
300-
.join(batchInputSplitter)
305+
// transform all snippets in a single file
306+
const batchInputSplitter = `\nsplitter(${Math.random()});\n`
307+
const batchInput = batch
308+
.map(({ nodes, handler }) => handler.prepare(nodes[0], id))
309+
.join(batchInputSplitter)
301310

302-
try {
303-
const batchOutput = await transform(batchInput)
304-
const lines = batchOutput.split(batchInputSplitter).map(l => l.trim()).filter(l => !!l)
311+
try {
312+
const batchOutput = await transform(batchInput)
313+
const lines = batchOutput.split(batchInputSplitter).map(l => l.trim()).filter(l => !!l)
305314

306-
if (lines.length !== batchOrder.length) {
307-
throw new Error('[vue-sfc-transform] Syntax Error')
308-
}
315+
if (lines.length !== batch.length) {
316+
throw new Error('[vue-sfc-transform] Syntax Error')
317+
}
309318

310-
const resultMap = new Map<Expression, string>()
311-
for (let i = 0; i < batchOrder.length; i++) {
312-
const line = lines[i]!
313-
const [_, { id, handler, node }] = batchOrder[i]!
319+
for (let i = 0; i < batch.length; i++) {
320+
const line = lines[i]!
321+
const { id, handler, nodes } = batch[i]!
314322

315-
const res = handler.parse(line, id)
316-
if (!res) {
317-
continue
318-
}
323+
const res = handler.parse(line, id)
324+
if (!res) {
325+
continue
326+
}
319327

320-
resultMap.set(node, res)
328+
for (const node of nodes) {
329+
resultMap.set(node, res)
330+
}
331+
}
332+
}
333+
catch (error) {
334+
throw new Error('[vue-sfc-transform] Error parsing TypeScript expression in template', { cause: error })
321335
}
322-
323-
return resultMap
324-
}
325-
catch (error) {
326-
throw new Error('[vue-sfc-transform] Error parsing TypeScript expression in template', { cause: error })
327336
}
337+
338+
return resultMap
328339
}

test/template.test.ts

+14-2
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,20 @@ describe('transform typescript template', () => {
144144

145145
it('equals', async () => {
146146
expect(
147-
await fixture(`<MyComponent #template="{ item, index, level = 0 as 0 | 1 }" />`),
148-
).toMatchInlineSnapshot(`"<MyComponent #template="{ item, index, level = 0 }" />"`)
147+
await fixture(`
148+
<div>
149+
<MyComponent #template="{ item, index, level = 0 as 0 | 1 }" />
150+
<MyComponent #template="{ item, index, level = 0 as 0 | 1 }" />
151+
<MyComponent #template="{ item, index = 3 as 3 | 4, level }" />
152+
</div>`),
153+
).toMatchInlineSnapshot(`
154+
"
155+
<div>
156+
<MyComponent #template="{ item, index, level = 0 }" />
157+
<MyComponent #template="{ item, index, level = 0 }" />
158+
<MyComponent #template="{ item, index = 3, level }" />
159+
</div>"
160+
`)
149161
})
150162

151163
async function fixture(src: string) {

0 commit comments

Comments
 (0)