From bcf5841ddecc64d0bdbd56ce1463eb8ebf01bb9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Tue, 28 Mar 2023 10:43:51 +0800 Subject: [PATCH] feat(compiler-sfc): add defineOptions macro (#5738) --- .../__snapshots__/compileScript.spec.ts.snap | 13 ++++ .../__tests__/compileScript.spec.ts | 65 ++++++++++++++++- packages/compiler-sfc/src/compileScript.ts | 73 ++++++++++++++++++- packages/runtime-core/src/apiSetupHelpers.ts | 33 +++++++++ packages/runtime-core/src/index.ts | 1 + .../types/scriptSetupHelpers.d.ts | 2 + 6 files changed, 182 insertions(+), 5 deletions(-) diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap index 649b92d17f0..2813a0be788 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap @@ -634,6 +634,19 @@ return { } }" `; +exports[`SFC compile + `) + assertCode(content) + // should remove defineOptions import and call + expect(content).not.toMatch('defineOptions') + // should include context options in default export + expect(content).toMatch( + `export default /*#__PURE__*/Object.assign({ name: 'FooApp' }, ` + ) + }) + + it('should emit an error with two defineProps', () => { + expect(() => + compile(` + + `) + ).toThrowError('[@vue/compiler-sfc] duplicate defineOptions() call') + }) + + it('should emit an error with props or emits property', () => { + expect(() => + compile(` + + `) + ).toThrowError( + '[@vue/compiler-sfc] defineOptions() cannot be used to declare props. Use defineProps() instead.' + ) + + expect(() => + compile(` + + `) + ).toThrowError( + '[@vue/compiler-sfc] defineOptions() cannot be used to declare emits. Use defineEmits() instead.' + ) + }) + + it('should emit an error with type generic', () => { + expect(() => + compile(` + + `) + ).toThrowError( + '[@vue/compiler-sfc] defineOptions() cannot accept type arguments' + ) + }) + }) + test('defineExpose()', () => { const { content } = compile(`