Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add decoratorMetadata flag if enabled by tsconfig #32914

Merged
merged 12 commits into from Feb 6, 2022
2 changes: 2 additions & 0 deletions package.json
Expand Up @@ -145,6 +145,7 @@
"react-dom": "17.0.2",
"react-dom-18": "npm:react-dom@18.0.0-rc.0",
"react-ssr-prepass": "1.0.8",
"reflect-metadata": "0.1.13",
"release": "6.3.0",
"request-promise-core": "1.1.2",
"resolve-from": "5.0.0",
Expand All @@ -157,6 +158,7 @@
"tailwindcss": "1.1.3",
"taskr": "1.1.0",
"tree-kill": "1.2.2",
"tsyringe": "4.6.0",
"turbo": "1.0.24",
"typescript": "4.4.3",
"wait-port": "0.2.2",
Expand Down
4 changes: 4 additions & 0 deletions packages/next/build/swc/options.js
Expand Up @@ -21,6 +21,9 @@ function getBaseSWCOptions({
const enableDecorators = Boolean(
jsConfig?.compilerOptions?.experimentalDecorators
)
const emitDecoratorMetadata = Boolean(
jsConfig?.compilerOptions?.emitDecoratorMetadata
)
return {
jsc: {
...(resolvedBaseUrl && paths
Expand All @@ -39,6 +42,7 @@ function getBaseSWCOptions({

transform: {
legacyDecorator: enableDecorators,
decoratorMetadata: emitDecoratorMetadata,
react: {
importSource: jsConfig?.compilerOptions?.jsxImportSource || 'react',
runtime: 'automatic',
Expand Down
40 changes: 40 additions & 0 deletions test/development/basic/emit-decorator-metadata.test.ts
@@ -0,0 +1,40 @@
import { join } from 'path'
import webdriver from 'next-webdriver'
import { createNext, FileRef } from 'e2e-utils'
import { NextInstance } from 'test/lib/next-modes/base'
import { BrowserInterface } from 'test/lib/browsers/base'

describe('emitDecoratorMetadata SWC option', () => {
let next: NextInstance

beforeAll(async () => {
next = await createNext({
files: {
'jsconfig.json': new FileRef(
join(__dirname, 'emit-decorator-metadata/jsconfig.json')
),
pages: new FileRef(join(__dirname, 'emit-decorator-metadata/pages')),
},
dependencies: {
'reflect-metadata': '0.1.13',
tsyringe: '4.6.0',
},
})
})

afterAll(() => next.destroy())

it('should compile with emitDecoratorMetadata enabled', async () => {
let browser: BrowserInterface
try {
browser = await webdriver(next.appPort, '/')
const message = await browser.elementByCss('#message').text()

expect(message).toBe('Hello, world!')
} finally {
if (browser) {
await browser.close()
}
}
})
})
6 changes: 6 additions & 0 deletions test/development/basic/emit-decorator-metadata/jsconfig.json
@@ -0,0 +1,6 @@
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
18 changes: 18 additions & 0 deletions test/development/basic/emit-decorator-metadata/pages/index.js
@@ -0,0 +1,18 @@
import React from 'react'
import 'reflect-metadata'
import { container, singleton } from 'tsyringe'

@singleton()
class HelloService {
getHello() {
return 'Hello, world!'
}
}

const helloService = container.resolve(HelloService)

export default function Home() {
const message = helloService.getHello()

return <p id="message">{message}</p>
}
17 changes: 17 additions & 0 deletions yarn.lock
Expand Up @@ -17230,6 +17230,11 @@ reduce-css-calc@^2.1.5, reduce-css-calc@^2.1.6:
css-unit-converter "^1.1.1"
postcss-value-parser "^3.3.0"

reflect-metadata@0.1.13:
version "0.1.13"
resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==

regenerate-unicode-properties@^8.2.0:
version "8.2.0"
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
Expand Down Expand Up @@ -19531,6 +19536,11 @@ tslib@2.0.1:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e"
integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==

tslib@^1.9.3:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==

tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
Expand Down Expand Up @@ -19559,6 +19569,13 @@ tsutils@^3.21.0:
dependencies:
tslib "^1.8.1"

tsyringe@4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/tsyringe/-/tsyringe-4.6.0.tgz#14915d3d7f0db35e1cf7269bdbf7c440713c8d07"
integrity sha512-BMQAZamSfEmIQzH8WJeRu1yZGQbPSDuI9g+yEiKZFIcO46GPZuMOC2d0b52cVBdw1d++06JnDSIIZvEnogMdAw==
dependencies:
tslib "^1.9.3"

tty-browserify@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
Expand Down