Skip to content

Commit d1eed36

Browse files
committed
refactor(ssr): move escapeHtml to shared
1 parent 327670a commit d1eed36

File tree

10 files changed

+37
-24
lines changed

10 files changed

+37
-24
lines changed

packages/compiler-ssr/__tests__/transforms/ssrTransformElement.spec.ts renamed to packages/compiler-ssr/__tests__/ssrCompile.spec.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { compile } from '../../src'
1+
import { compile } from '../src'
22

33
function getElementString(src: string): string {
44
return compile(src).code.match(/_push\((.*)\)/)![1]
55
}
66

7-
describe('ssr transform element', () => {
7+
describe('ssr compile integration test', () => {
88
test('basic elements', () => {
99
expect(getElementString(`<div></div>`)).toMatchInlineSnapshot(
1010
`"\`<div></div>\`"`
@@ -22,4 +22,12 @@ describe('ssr transform element', () => {
2222
getElementString(`<div><span></span><span></span></div>`)
2323
).toMatchInlineSnapshot(`"\`<div><span></span><span></span></div>\`"`)
2424
})
25+
26+
test('nested elements with static text', () => {
27+
expect(
28+
getElementString(`<div><span>hello</span>&gt;<span>bye</span></div>`)
29+
).toMatchInlineSnapshot(
30+
`"\`<div><span>hello</span>&gt;<span>bye</span></div>\`"`
31+
)
32+
})
2533
})

packages/compiler-ssr/src/ssrCodegenTransform.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
ElementTypes,
1111
createBlockStatement
1212
} from '@vue/compiler-dom'
13-
import { isString } from '@vue/shared'
13+
import { isString, escapeHtml } from '@vue/shared'
1414

1515
// Because SSR codegen output is completely different from client-side output
1616
// (e.g. multiple elements can be concatenated into a single template literal
@@ -85,7 +85,7 @@ function processChildren(
8585
// TODO
8686
}
8787
} else if (child.type === NodeTypes.TEXT) {
88-
// TODO
88+
context.pushStringPart(escapeHtml(child.content))
8989
} else if (child.type === NodeTypes.IF) {
9090
// TODO
9191
} else if (child.type === NodeTypes.FOR) {

packages/compiler-ssr/src/transforms/ssrTransformElement.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
TemplateLiteral,
66
createTemplateLiteral
77
} from '@vue/compiler-dom'
8-
import { escapeHtml } from '@vue/server-renderer'
8+
import { escapeHtml } from '@vue/shared'
99

1010
/*
1111
## Simple Element

packages/server-renderer/__tests__/ssrUtils.spec.ts renamed to packages/server-renderer/__tests__/interpolate.spec.ts

-10
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,5 @@
11
import { escapeHtml, interpolate } from '../src'
22

3-
test('ssr: escapeHTML', () => {
4-
expect(escapeHtml(`foo`)).toBe(`foo`)
5-
expect(escapeHtml(true)).toBe(`true`)
6-
expect(escapeHtml(false)).toBe(`false`)
7-
expect(escapeHtml(`a && b`)).toBe(`a &amp;&amp; b`)
8-
expect(escapeHtml(`"foo"`)).toBe(`&quot;foo&quot;`)
9-
expect(escapeHtml(`'bar'`)).toBe(`&#39;bar&#39;`)
10-
expect(escapeHtml(`<div>`)).toBe(`&lt;div&gt;`)
11-
})
12-
133
test('ssr: interpolate', () => {
144
expect(interpolate(0)).toBe(`0`)
155
expect(interpolate(`foo`)).toBe(`foo`)

packages/server-renderer/src/index.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,13 @@ export { renderToString } from './renderToString'
44
// internal
55
export { renderComponent, renderSlot } from './renderToString'
66
export { renderClass, renderStyle, renderProps } from './renderProps'
7-
export { escapeHtml, interpolate } from './ssrUtils'
7+
8+
// utils
9+
import { escapeHtml as _escapeHtml, toDisplayString } from '@vue/shared'
10+
11+
// cast type to avoid dts dependency on @vue/shared (which is inlined)
12+
export const escapeHtml = _escapeHtml as (raw: string) => string
13+
14+
export function interpolate(value: unknown): string {
15+
return escapeHtml(toDisplayString(value))
16+
}

packages/server-renderer/src/renderProps.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { escapeHtml } from './ssrUtils'
1+
import { escapeHtml } from '@vue/shared'
22
import {
33
normalizeClass,
44
normalizeStyle,

packages/server-renderer/src/renderToString.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {
2222
isVoidTag
2323
} from '@vue/shared'
2424
import { renderProps } from './renderProps'
25-
import { escapeHtml } from './ssrUtils'
25+
import { escapeHtml } from '@vue/shared'
2626

2727
const {
2828
isVNode,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { escapeHtml } from '../src'
2+
3+
test('ssr: escapeHTML', () => {
4+
expect(escapeHtml(`foo`)).toBe(`foo`)
5+
expect(escapeHtml(true)).toBe(`true`)
6+
expect(escapeHtml(false)).toBe(`false`)
7+
expect(escapeHtml(`a && b`)).toBe(`a &amp;&amp; b`)
8+
expect(escapeHtml(`"foo"`)).toBe(`&quot;foo&quot;`)
9+
expect(escapeHtml(`'bar'`)).toBe(`&#39;bar&#39;`)
10+
expect(escapeHtml(`<div>`)).toBe(`&lt;div&gt;`)
11+
})

packages/server-renderer/src/ssrUtils.ts renamed to packages/shared/src/escapeHtml.ts

-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { toDisplayString } from '@vue/shared'
2-
31
const escapeRE = /["'&<>]/
42

53
export function escapeHtml(string: unknown) {
@@ -45,7 +43,3 @@ export function escapeHtml(string: unknown) {
4543

4644
return lastIndex !== index ? html + str.substring(lastIndex, index) : html
4745
}
48-
49-
export function interpolate(value: unknown) {
50-
return escapeHtml(toDisplayString(value))
51-
}

packages/shared/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export * from './mockWarn'
88
export * from './normalizeProp'
99
export * from './domTagConfig'
1010
export * from './domAttrConfig'
11+
export * from './escapeHtml'
1112

1213
export const EMPTY_OBJ: { readonly [key: string]: any } = __DEV__
1314
? Object.freeze({})

0 commit comments

Comments
 (0)