feat: nuxt-ts (#4658)

[release]
This commit is contained in:
Pooya Parsa 2019-01-04 23:00:28 +03:30 committed by GitHub
parent 6168c3c9f3
commit ee0096bf59
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 239 additions and 43 deletions

View File

@ -0,0 +1,3 @@
# nuxt-ts
> Nuxt With Runtime Typescript Support

View File

@ -0,0 +1,11 @@
#!/usr/bin/env node
const { register } = require('ts-node')
// globally indicate we are running in ts mode
process.env.NUXT_TS = 'true'
// https://github.com/TypeStrong/ts-node
register()
require('@nuxt/cli').run()

View File

@ -0,0 +1,23 @@
export default {
build: false,
hooks: {
async 'build:done'(pkg) {
const mono = pkg.load('../..')
const nuxt = pkg.load('../nuxt')
await pkg.copyFilesFrom(mono, [
'LICENSE'
])
pkg.copyFieldsFrom(nuxt, [
'license',
'repository',
'contributors',
'keywords',
'collective'
])
await pkg.writePackage()
}
}
}

View File

@ -0,0 +1,70 @@
{
"name": "nuxt-ts",
"version": "2.3.4",
"description": "Nuxt With Runtime Typescript Support",
"keywords": [
"nuxt",
"nuxt.js",
"nuxtjs",
"ssr",
"vue",
"vue isomorphic",
"vue server side",
"vue ssr",
"vue universal",
"vue versatile",
"vue.js",
"vuejs"
],
"homepage": "https://github.com/nuxt/nuxt.js#readme",
"repository": "nuxt/nuxt.js",
"license": "MIT",
"contributors": [
{
"name": "Sebastien Chopin (@Atinux)"
},
{
"name": "Alexandre Chopin (@alexchopin)"
},
{
"name": "Pooya Parsa (@pi0)"
},
{
"name": "Clark Du (@clarkdo)"
},
{
"name": "Jonas Galvez (@galvez)"
},
{
"name": "Alexander Lichter (@manniL)"
}
],
"files": [
"bin"
],
"bin": {
"nuxt-ts": "bin/nuxt-ts.js",
"nuxts": "bin/nuxt-ts.js"
},
"dependencies": {
"@nuxt/builder": "2.3.4",
"@nuxt/cli": "2.3.4",
"@nuxt/core": "2.3.4",
"@nuxt/generator": "2.3.4",
"@nuxt/opencollective": "^0.2.1",
"@nuxt/webpack": "2.3.4",
"fork-ts-checker-webpack-plugin": "^0.5.2",
"ts-loader": "^5.3.2",
"ts-node": "^7.0.1",
"tslint": "^5.12.0",
"typescript": "^3.2.2"
},
"engines": {
"node": ">=6.0.0",
"npm": ">=3.0.0"
},
"collective": {
"url": "https://opencollective.com/nuxtjs",
"logoUrl": "https://opencollective.com/nuxtjs/logo.txt?reverse=true&variant=variant2"
}
}

View File

@ -33,11 +33,13 @@ module.exports = {
],
transform: {
'^.+\\.ts$': 'ts-jest',
'^.+\\.js$': 'babel-jest',
'.*\\.(vue)$': 'vue-jest'
},
moduleFileExtensions: [
'ts',
'js',
'json'
],

View File

@ -75,6 +75,7 @@
"rollup-plugin-node-resolve": "^4.0.0",
"rollup-plugin-replace": "^2.1.0",
"sort-package-json": "^1.17.1",
"ts-jest": "^23.10.5",
"ts-loader": "^5.3.2",
"tslint": "^5.12.0",
"typescript": "^3.2.2",

View File

@ -1,5 +1,7 @@
import { normalizeArg } from '../utils'
const defaultConfigFile = `nuxt.config${process.env.NUXT_TS === 'true' ? '.ts' : '.js'}`
export default {
spa: {
alias: 's',
@ -14,8 +16,8 @@ export default {
'config-file': {
alias: 'c',
type: 'string',
default: 'nuxt.config.js',
description: 'Path to Nuxt.js config file (default: `nuxt.config.js`)'
default: defaultConfigFile,
description: `Path to Nuxt.js config file (default: \`${defaultConfigFile}\`)`
},
modern: {
alias: 'm',

View File

@ -54,7 +54,7 @@ export default () => ({
},
vueStyle: {}
},
useForkTsChecker: false,
useForkTsChecker: process.env.NUXT_TS === 'true',
styleResources: {},
plugins: [],
terser: {},

View File

@ -105,14 +105,18 @@ export default class Resolver {
requireModule(path, { esm, alias, intropDefault } = {}) {
let resolvedPath = path
let requiredModule
const errors = []
let lastError
// Try to resolve path
try {
resolvedPath = this.resolvePath(path, { alias })
} catch (e) {
errors.push(e)
lastError = e
}
// Disable esm for ts files by default
if (esm === undefined && /.ts$/.test(resolvedPath)) {
esm = false
}
// Try to require
@ -123,7 +127,7 @@ export default class Resolver {
requiredModule = this.esm(resolvedPath)
}
} catch (e) {
errors.push(e)
lastError = e
}
// Introp default
@ -132,8 +136,8 @@ export default class Resolver {
}
// Throw error if failed to require
if (requiredModule === undefined && errors.length) {
throw errors
if (requiredModule === undefined && lastError) {
throw lastError
}
return requiredModule

View File

@ -125,9 +125,9 @@ export default class Server {
}
// Add user provided middleware
this.options.serverMiddleware.forEach((m) => {
for (const m of this.options.serverMiddleware) {
this.useMiddleware(m)
})
}
const { fallback } = this.options.render
if (fallback) {
@ -188,11 +188,11 @@ export default class Server {
handler = requiredModuleFromHandlerPath.handler || requiredModuleFromHandlerPath
} catch (err) {
consola.error(err)
// Throw error in production mode
if (!this.options.dev) {
throw err[0]
throw err
}
// Only warn missing file in development
consola.warn(err[0])
}
}

View File

@ -0,0 +1 @@
export default () => {}

View File

@ -1,10 +0,0 @@
import consola from 'consola'
export default {
build: {
useForkTsChecker: {
logger: consola
}
},
plugins: ['~/plugins/plugin']
}

13
test/fixtures/typescript/nuxt.config.ts vendored Normal file
View File

@ -0,0 +1,13 @@
const config: any = {
modules: [
'~/modules/module'
],
plugins: [
'~/plugins/plugin'
],
serverMiddleware: [
'~/server-middleware/test.ts'
]
}
export default config

View File

@ -0,0 +1,7 @@
export default {
path: '/api/test',
handler(_, res) {
const message: String = 'Works!'
res.end(message)
}
}

View File

@ -1,3 +1,5 @@
import { buildFixture } from '../../utils/build'
process.env.NUXT_TS = 'true'
buildFixture('typescript')
delete process.env.NUXT_TS

View File

@ -1,12 +1,17 @@
import { loadFixture, getPort, Nuxt } from '../utils'
let nuxt = null
import { loadFixture, getPort, Nuxt, rp } from '../utils'
describe('typescript', () => {
let nuxt
let port
const url = route => 'http://localhost:' + port + route
beforeAll(async () => {
process.env.NUXT_TS = 'true'
const options = await loadFixture('typescript')
delete process.env.NUXT_TS
nuxt = new Nuxt(options)
const port = await getPort()
await nuxt.ready()
port = await getPort()
await nuxt.server.listen(port, '0.0.0.0')
})
@ -30,6 +35,15 @@ describe('typescript', () => {
expect(html).toContain('<div>Contact Page</div>')
})
test('/api/test', async () => {
const html = await rp(url('/api/test'))
expect(html).toContain('Works!')
})
test('TS module successfully required', () => {
expect(nuxt.moduleContainer.requiredModules).toHaveProperty('~/modules/module')
})
// Close server and ask nuxt to stop listening to file changes
afterAll(async () => {
await nuxt.close()

View File

@ -12,7 +12,7 @@ export * from '../../packages/utils/src/index'
export const loadFixture = async function (fixture, overrides) {
const rootDir = path.resolve(__dirname, '..', 'fixtures', fixture)
const configFile = path.resolve(rootDir, 'nuxt.config.js')
const configFile = path.resolve(rootDir, `nuxt.config${process.env.NUXT_TS === 'true' ? '.ts' : '.js'}`)
let config = fs.existsSync(configFile) ? (await import(`../fixtures/${fixture}/nuxt.config`)).default : {}
if (typeof config === 'function') {

View File

@ -2483,6 +2483,13 @@ browserslist@^4.3.5:
electron-to-chromium "^1.3.86"
node-releases "^1.0.5"
bs-logger@0.x:
version "0.2.6"
resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==
dependencies:
fast-json-stable-stringify "2.x"
bser@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
@ -2490,7 +2497,7 @@ bser@^2.0.0:
dependencies:
node-int64 "^0.4.0"
buffer-from@^1.0.0:
buffer-from@1.x, buffer-from@^1.0.0, buffer-from@^1.1.0:
version "1.1.1"
resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
@ -3893,7 +3900,7 @@ dezalgo@^1.0.0:
asap "^2.0.0"
wrappy "1"
diff@^3.2.0:
diff@^3.1.0, diff@^3.2.0:
version "3.5.0"
resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
@ -4702,7 +4709,7 @@ fast-glob@^2.0.2:
merge2 "^1.2.3"
micromatch "^3.1.10"
fast-json-stable-stringify@^2.0.0:
fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
@ -6622,6 +6629,13 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
json5@2.x, json5@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850"
integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==
dependencies:
minimist "^1.2.0"
json5@^0.5.0, json5@^0.5.1:
version "0.5.1"
resolved "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
@ -6634,13 +6648,6 @@ json5@^1.0.1:
dependencies:
minimist "^1.2.0"
json5@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850"
integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==
dependencies:
minimist "^1.2.0"
jsonfile@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
@ -7113,6 +7120,11 @@ make-dir@^1.0.0:
dependencies:
pify "^3.0.0"
make-error@1.x, make-error@^1.1.1:
version "1.3.5"
resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8"
integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==
make-fetch-happen@^4.0.1:
version "4.0.1"
resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz#141497cb878f243ba93136c83d8aba12c216c083"
@ -7431,7 +7443,7 @@ mixin-deep@^1.2.0:
for-in "^1.0.2"
is-extendable "^1.0.1"
mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
mkdirp@0.5.1, mkdirp@0.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
version "0.5.1"
resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
@ -8245,7 +8257,7 @@ path-key@^2.0.0, path-key@^2.0.1:
resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
path-parse@^1.0.5:
path-parse@^1.0.5, path-parse@^1.0.6:
version "1.0.6"
resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
@ -9831,6 +9843,13 @@ resolve@1.1.7:
resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
resolve@1.x:
version "1.9.0"
resolved "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06"
integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==
dependencies:
path-parse "^1.0.6"
resolve@^1.1.6, resolve@^1.1.7, resolve@^1.2.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1:
version "1.8.1"
resolved "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
@ -10061,7 +10080,7 @@ schema-utils@^1.0.0:
ajv-errors "^1.0.0"
ajv-keywords "^3.1.0"
"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
version "5.6.0"
resolved "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
@ -10992,6 +11011,21 @@ tryer@^1.0.0:
resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
ts-jest@^23.10.5:
version "23.10.5"
resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-23.10.5.tgz#cdb550df4466a30489bf70ba867615799f388dd5"
integrity sha512-MRCs9qnGoyKgFc8adDEntAOP64fWK1vZKnOYU1o2HxaqjdJvGqmkLCPCnVq1/If4zkUmEjKPnCiUisTrlX2p2A==
dependencies:
bs-logger "0.x"
buffer-from "1.x"
fast-json-stable-stringify "2.x"
json5 "2.x"
make-error "1.x"
mkdirp "0.x"
resolve "1.x"
semver "^5.5"
yargs-parser "10.x"
ts-loader@^5.3.2:
version "5.3.2"
resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-5.3.2.tgz#31d10be522bedfac8ee4c20c735e05a9bd772faf"
@ -11003,6 +11037,20 @@ ts-loader@^5.3.2:
micromatch "^3.1.4"
semver "^5.0.1"
ts-node@^7.0.1:
version "7.0.1"
resolved "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf"
integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==
dependencies:
arrify "^1.0.0"
buffer-from "^1.1.0"
diff "^3.1.0"
make-error "^1.1.1"
minimist "^1.2.0"
mkdirp "^0.5.1"
source-map-support "^0.5.6"
yn "^2.0.0"
tsconfig@^7.0.0:
version "7.0.0"
resolved "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7"
@ -11843,7 +11891,7 @@ yallist@^3.0.0, yallist@^3.0.2:
resolved "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=
yargs-parser@^10.1.0:
yargs-parser@10.x, yargs-parser@^10.1.0:
version "10.1.0"
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==
@ -11909,3 +11957,8 @@ yauzl@2.4.1:
integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=
dependencies:
fd-slicer "~1.0.1"
yn@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=