Merge branch 'dev' into 2.x

This commit is contained in:
Sébastien Chopin 2018-11-16 09:34:15 -05:00
commit 5af0901c83
333 changed files with 20921 additions and 12204 deletions

View File

@ -1,14 +0,0 @@
{
"env": {
"test": {
"presets": [
["@babel/env", {
"targets": {
"node": "current"
}
}]
],
"plugins": ["dynamic-import-node"]
}
}
}

View File

@ -1,11 +1,16 @@
version: 2 version: 2
defaults: &defaults defaults: &defaults
working_directory: ~/project/nuxt working_directory: ~/project
docker: docker:
- image: banian/node-headless-chrome - image: banian/node-headless-chrome
environment:
- NODE_ENV: test
jobs: jobs:
# --------------------------------------------------------------------------
# Phase 1: Setup
# --------------------------------------------------------------------------
setup: setup:
<<: *defaults <<: *defaults
steps: steps:
@ -19,23 +24,32 @@ jobs:
# Install dependencies # Install dependencies
- run: - run:
name: Install Dependencies name: Install Dependencies
command: NODE_ENV=dev yarn command: yarn --frozen-lockfile --non-interactive
# Keep cache # Save cache
- save_cache: - save_cache:
key: yarn-{{ checksum "yarn.lock" }} key: yarn-{{ checksum "yarn.lock" }}
paths: paths:
- "node_modules" - node_modules
- packages/*/node_modules
- distributions/*/node_modules
# Persist files # Persist workspace
- persist_to_workspace: - persist_to_workspace:
root: ~/project root: ~/project
paths: paths:
- nuxt - node_modules
- packages/*/node_modules
- distributions/*/node_modules
- packages/*/dist
# --------------------------------------------------------------------------
# Phase 2: Lint + Audit + Build Nuxt and fixtures
# --------------------------------------------------------------------------
lint: lint:
<<: *defaults <<: *defaults
steps: steps:
- checkout
- attach_workspace: - attach_workspace:
at: ~/project at: ~/project
- run: - run:
@ -45,6 +59,7 @@ jobs:
audit: audit:
<<: *defaults <<: *defaults
steps: steps:
- checkout
- attach_workspace: - attach_workspace:
at: ~/project at: ~/project
- run: - run:
@ -54,44 +69,47 @@ jobs:
build: build:
<<: *defaults <<: *defaults
steps: steps:
- checkout
- attach_workspace: - attach_workspace:
at: ~/project at: ~/project
- run: - run:
name: Build Fixtures name: Build Fixtures
command: yarn build && yarn test:fixtures -w=4 --coverage && yarn coverage command: yarn test:fixtures -w=4 --coverage && yarn coverage
- persist_to_workspace: - persist_to_workspace:
root: ~/project root: ~/project
paths: paths:
- nuxt/test/fixtures - test/fixtures
- nuxt/dist
environment:
- NODE_ENV: "test"
# --------------------------------------------------------------------------
# Phase 3: Unit and E2E tests
# --------------------------------------------------------------------------
test-unit: test-unit:
<<: *defaults <<: *defaults
steps: steps:
- checkout
- attach_workspace: - attach_workspace:
at: ~/project at: ~/project
- run: - run:
name: Unit Test name: Unit Tests
command: yarn test:unit -w=4 --coverage && yarn coverage command: yarn test:unit -w=4 --coverage && yarn coverage
environment:
- NODE_ENV: "test"
test-e2e: test-e2e:
<<: *defaults <<: *defaults
steps: steps:
- checkout
- attach_workspace: - attach_workspace:
at: ~/project at: ~/project
- run: - run:
name: E2E Test name: E2E Tests
command: yarn test:e2e && yarn coverage command: yarn test:e2e && yarn coverage
environment:
- NODE_ENV: "test"
# --------------------------------------------------------------------------
# Phase 4: Release (dev branch only)
# --------------------------------------------------------------------------
release: release:
<<: *defaults <<: *defaults
steps: steps:
- checkout
- attach_workspace: - attach_workspace:
at: ~/project at: ~/project
- run: - run:
@ -99,19 +117,14 @@ jobs:
command: | command: |
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc
echo "//registry.yarnpkg.com/:_authToken=$NPM_TOKEN" >> ~/.npmrc echo "//registry.yarnpkg.com/:_authToken=$NPM_TOKEN" >> ~/.npmrc
BUILD_SUFFIX=edge yarn build yarn lerna version
npm publish PACKAGE_SUFFIX=edge yarn build
for p in packages/*; do ./scripts/workspace-run npm publish
if [ -f "$p/package.json" ]; then
cd $p
npm publish
cd -
fi
done
# Workflow definition
workflows: workflows:
version: 2 version: 2
setup-and-parallel-test: setup-and-test:
jobs: jobs:
- setup - setup

View File

@ -1,7 +1,16 @@
app # Common
!app/store.js
node_modules node_modules
dist dist
.nuxt .nuxt
coverage
# Examples
## cofeescript
examples/coffeescript/pages/index.vue examples/coffeescript/pages/index.vue
!examples/storybook/.storybook
# Packages
# vue-app
packages/vue-app/template
!packages/vue-app/template/store.js

View File

@ -4,81 +4,34 @@ module.exports = {
parser: 'babel-eslint', parser: 'babel-eslint',
sourceType: 'module' sourceType: 'module'
}, },
env: {
browser: true,
node: true,
'jest/globals': true
},
extends: [ extends: [
'standard', '@nuxtjs'
'plugin:import/errors',
'plugin:import/warnings',
'plugin:vue/recommended'
], ],
plugins: [ overrides: [{
'vue', files: [ 'test/fixtures/*/.nuxt*/**' ],
'jest'
],
settings: {
'import/resolver': {
node: { extensions: ['.js', '.mjs'] }
}
},
rules: { rules: {
// Enforce import order 'vue/name-property-casing': ['error', 'kebab-case']
'import/order': 2, }
}, {
// Imports should come first files: [ 'test/fixtures/*/.nuxt*/**/+(App|index).js' ],
'import/first': 2, rules: {
'import/order': 'ignore'
// Other import rules }
'import/no-mutable-exports': 2, }, {
files: [ 'test/fixtures/*/.nuxt*/**/client.js' ],
// Allow unresolved imports rules: {
'import/no-unresolved': 0, 'no-console': ['error', { allow: ['error'] }]
}
// Allow paren-less arrow functions only when there's no braces }, {
'arrow-parens': [2, 'as-needed', { requireForBlockBody: true }], files: [ 'test/fixtures/*/.nuxt*/**/router.js' ],
rules: {
// Allow async-await 'no-console': ['error', { allow: ['warn'] }]
'generator-star-spacing': 0, }
}, {
// Allow debugger during development files: [ 'test/fixtures/*/.nuxt*/**/*.html' ],
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, rules: {
'semi': ['error', 'always', { 'omitLastInOneLineBlock': true }],
// Prefer const over let 'no-var': 'warn'
'prefer-const': [2, { }
'destructuring': 'any', }]
'ignoreReadBeforeAssign': false
}],
// No single if in an "else" block
'no-lonely-if': 2,
// Force curly braces for control flow
curly: 2,
// No async function without await
'require-await': 2,
// Force dot notation when possible
'dot-notation': 2,
'no-var': 2,
// Do not allow console.logs etc...
'no-console': 2,
'space-before-function-paren': [2, {
anonymous: 'always',
named: 'never'
}],
'vue/no-parsing-error': [2, {
'x-invalid-end-tag': false
}],
'vue/max-attributes-per-line': [2, {
'singleline': 5,
}]
},
globals: {}
} }

View File

@ -3,9 +3,9 @@
Please use the following link to create a new issue: Please use the following link to create a new issue:
- 🚨 Bug report - http://bug.nuxt.xyz/ - 🚨 Bug report - https://bug.nuxtjs.org/
- 🙋 Feature request - http://feature.nuxt.xyz/ - 🙋 Feature request - https://feature.nuxtjs.org/
- ❗️ All other issues - http://cmty.nuxt.xyz/ - ❗️ All other issues - https://cmty.nuxtjs.org/
If your issue was not created using the app above, **it will be closed immediately**. If your issue was not created using the app above, **it will be closed immediately**.
--> -->

8
.github/lock.yml vendored Normal file
View File

@ -0,0 +1,8 @@
# Configuration for lock-threads - https://github.com/dessant/lock-threads
daysUntilLock: 30
exemptLabels: []
lockLabel: false
lockComment: >
This thread has been automatically locked since there has not been
any recent activity after it was closed. Please open a new issue for
related bugs.

9
.github/stale.yml vendored Normal file
View File

@ -0,0 +1,9 @@
# Configuration for probot-stale - https://github.com/probot/stale
daysUntilStale: 21
daysUntilClose: 7
staleLabel: stale
exemptLabels:
- "cmty:feature-request"
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs.

26
.gitignore vendored
View File

@ -1,28 +1,33 @@
# Dependencies # Dependencies
node_modules node_modules
examples/**/*/yarn.lock
jspm_packages jspm_packages
# Only keep yarn.lock in the root
package-lock.json package-lock.json
*/**/yarn.lock
# Logs # Logs
*.log *.log
npm-debug.log*
yarn-error.log* # Packages
packages/*/LICENSE
# Distributions
distributions/*/LICENSE
# Other # Other
.nuxt* .nuxt*
.cache .cache
# Dist folder # Dist folders
dist dist
# Dist example generation # Coverage reports
examples/**/dist
# Coverage support
coverage coverage
*.lcov *.lcov
.nyc_output .nyc_output
# VSCode
.vscode .vscode
# Intellij idea # Intellij idea
@ -30,7 +35,7 @@ coverage
.idea .idea
# OSX # OSX
*.DS_Store .DS_Store
.AppleDouble .AppleDouble
.LSOverride .LSOverride
@ -49,3 +54,6 @@ coverage
Network Trash Folder Network Trash Folder
Temporary Items Temporary Items
.apdisk .apdisk
# Junit report from jest-junit
*junit.xml

View File

@ -1,106 +0,0 @@
# Contributing to Nuxt.js
First of all, thank you for considering to contribute to Nuxt.js! :heart:
## Reporting Issues
A great way to contribute to the project is to send a detailed report when you encounter an issue.
To make things easier for contributors and maintainers, we use [CMTY](http://cmty.nuxt.xyz).
Please make sure to include a reproduction repository or [CodeSandBox](http://template.nuxt.xyz)
so that bugs can be reproduced without great efforts. The better a bug can be reproduced, the faster we can start fixing it!
## Pull Requests
We'd love to see your pull requests, even if it's just to fix a typo!
However, any significant improvement should be associated to an existing
[feature request](http://feature.nuxt.xyz/)
or [bug report](http://bug.nuxt.xyz/).
### Getting started
1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device.
2. Run `npm install` or `yarn install` to install the dependencies.
> _Note that both **npm** and **yarn** have been seen to miss installing dependencies. To remedy that, you can either delete the `node_modules` folder in your example app and install again or do a local install of the missing dependencies._
> If you are adding a dependency, please use `yarn add`. The `yarn.lock` file is the source of truth for all Nuxt dependencies.
### Test structure
A great PR, whether it includes a bug fix or a new feature, will often include tests.
To write great tests, let us explain our test structure:
#### Fixtures
The fixtures (found under `tests/fixtures`) contain several Nuxt applications. To keep build time as short as possible,
we don't build an own Nuxt application per test. Instead, the fixtures are built (`yarn test:fixtures`) before running
the actual unit tests.
Please make sure to **alter** or **add a new fixture** when submitting a PR to reflect the changes properly (if applicable).
Also, don't forget to **rebuild** a fixture after changing it by running the corresponding test
with `jest test/fixtures/my-fixture/my-fixture.test.js`!
#### Unit tests
The unit tests can be found in `tests/unit` and will be executed after building the fixtures. A fresh Nuxt server will be used
per test so that no shared state (except the initial state from the build step) is present.
After adding your unit tests, you can run them directly:
```sh
jest test/unit/test.js
```
Or you can run the whole unit test suite:
```sh
yarn test:unit
```
Again, please be aware that you might have to rebuild your fixtures before!
### Testing your changes
While working on your PR you will likely want to check if your fixture is set up correctly or debug your current changes.
To do so you can use the Nuxt script itself to launch for example your fixture or an example app:
```sh
bin/nuxt examples/your-app
bin/nuxt test/fixtures/your-fixture-app
```
> `npm link` could also (and does, to some extent) work for this, but it has been known to exhibit some issues. That is why we recommend calling `bin/nuxt` directly to run examples.
### Examples
If you are working on a larger feature, please set up an example app in `examples/`.
This will help greatly in understanding changes and also help Nuxt users to understand the feature you've built in-depth.
### Linting
As you might have noticed already, we are using ESLint to enforce a code standard. Please run `yarn lint` before committing
your changes to verify that the code style is correct. If not, you can use `yarn lint --fix` or `npm run lint -- --fix` (no typo!) to fix most of the
style changes. If there are still errors left, you must correct them manually.
### Documentation
If you are adding a new feature, do a refactoring or change the behavior of Nuxt in any other manner, you'll likely
want to document the changes. Please do so with a PR to the [docs](https://github.com/nuxt/docs/pulls) repository.
You don't have to write documentation up immediately (but please do so as soon as your pull request is mature enough).
### Final checklist
When submitting your PR, there is a simple template that you have to fill out.
Please tick all appropriate "answers" in the checklists.
### Troubleshooting
#### Debugging tests on macOS
Searching for `getPort()` will reveal it's used to start new Nuxt processes during tests. It's been seen to stop working on macOS at times and may require you to manually set a port for testing.
Another common issue is Nuxt processes that may hang in memory when running fixture tests. A ghost process will often prevent subsequent tests from working. Run `ps aux | grep -i node` to inspect any hanging test processes if you suspect this is happening.

View File

@ -1,18 +1,18 @@
<p align="center"><img align="center" src="http://imgur.com/V4LtoII.png"/></p> <p align="center"><img align="center" src="http://imgur.com/V4LtoII.png"/></p>
<p align="center"> <p align="center">
<a href="https://circleci.com/gh/nuxt/nuxt.js"><img src="https://badgen.net/circleci/github/nuxt/nuxt.js/dev" alt="Build Status"></a> <a href="https://circleci.com/gh/nuxt/nuxt.js"><img src="https://badgen.net/circleci/github/nuxt/nuxt.js/dev" alt="Build Status"></a>
<a href="https://ci.appveyor.com/project/nuxt/nuxt-js"><img src="https://badgen.net/appveyor/ci/nuxt/nuxt-js/dev" alt="Windows Build Status"></a> <a href="https://dev.azure.com/nuxt/nuxt.js/_build/latest?definitionId=1"><img src="https://dev.azure.com/nuxt/nuxt.js/_apis/build/status/nuxt.js" alt="Azure Build Status"></a>
 <a href="https://codecov.io/gh/nuxt/nuxt.js"><img src="https://badgen.net/codecov/c/github/nuxt/nuxt.js/dev" alt="Coverage Status"></a>  <a href="https://codecov.io/gh/nuxt/nuxt.js"><img src="https://badgen.net/codecov/c/github/nuxt/nuxt.js/dev" alt="Coverage Status"></a>
<a href="https://www.npmjs.com/package/nuxt"><img src="https://badgen.net/npm/dm/nuxt" alt="Downloads"></a> <a href="https://www.npmjs.com/package/nuxt"><img src="https://badgen.net/npm/dm/nuxt" alt="Downloads"></a>
<a href="https://www.npmjs.com/package/nuxt"><img src="https://badgen.net/npm/v/nuxt" alt="Version"></a> <a href="https://www.npmjs.com/package/nuxt"><img src="https://badgen.net/npm/v/nuxt" alt="Version"></a>
<a href="https://www.npmjs.com/package/nuxt"><img src="https://badgen.net/npm/license/nuxt" alt="License"></a> <a href="https://www.npmjs.com/package/nuxt"><img src="https://badgen.net/npm/license/nuxt" alt="License"></a>
<a href="http://discord.nuxt.xyz"><img src="https://badgen.net/badge/Discord/join-us/7289DA" alt="Discord"></a> <a href="https://discord.nuxtjs.org/"><img src="https://badgen.net/badge/Discord/join-us/7289DA" alt="Discord"></a>
</p> </p>
<p align="center"> <p align="center">
<a href="#partners" alt="Partner on Open Collective"><img src="https://opencollective.com/nuxtjs/tiers/partner/badge.svg" /></a> <a href="#partners" alt="Partner on Open Collective"><img src="https://opencollective.com/nuxtjs/tiers/partner/badge.svg" /></a>
<a href="#sponsors" alt="Sponsors on Open Collective"><img src="https://opencollective.com/nuxtjs/tiers/sponsors/badge.svg" /></a> <a href="#sponsors" alt="Sponsors on Open Collective"><img src="https://opencollective.com/nuxtjs/tiers/sponsors/badge.svg" /></a>
<a href="#backers" alt="Backers on Open Collective"><img src="https://opencollective.com/nuxtjs/tiers/backers/badge.svg" /></a> <a href="#backers" alt="Backers on Open Collective"><img src="https://opencollective.com/nuxtjs/tiers/backers/badge.svg" /></a>
<a href="http://oc.nuxt.xyz/"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a> <a href="https://oc.nuxtjs.org/"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a>
</p> </p>
@ -23,10 +23,10 @@
- 📘 Documentation: [https://nuxtjs.org](https://nuxtjs.org) - 📘 Documentation: [https://nuxtjs.org](https://nuxtjs.org)
- 👥 Community: [cmty.app/nuxt](https://cmty.app/nuxt) - 👥 Community: [cmty.app/nuxt](https://cmty.app/nuxt)
- 🎬 Video: [1 minute demo](https://www.youtube.com/watch?v=kmf-p-pTi40) - 🎬 Video: [1 minute demo](https://www.youtube.com/watch?v=kmf-p-pTi40)
- 🐦 Twitter: [@nuxt_js](http://twitter.nuxt.xyz) - 🐦 Twitter: [@nuxt_js](https://twitter.nuxtjs.org/)
- 💬 Chat: [Discord](http://discord.nuxt.xyz) - 💬 Chat: [Discord](https://discord.nuxtjs.org/)
- 📦 [Nuxt.js Modules](https://github.com/nuxt-community/modules) - 📦 [Nuxt.js Modules](https://github.com/nuxt-community/modules)
- 👉 [Play with Nuxt.js online](http://template.nuxt.xyz) - 👉 [Play with Nuxt.js online](https://template.nuxtjs.org)
## Features ## Features
@ -219,7 +219,7 @@ Thank you to all our [contributors](https://github.com/nuxt/nuxt.js/graphs/contr
## Contributing ## Contributing
Please see our [CONTRIBUTING.md](./CONTRIBUTING.md) Please refer to our [Contribution Guide](https://nuxtjs.org/guide/contribution-guide#codefund_ad)
## Cross-browser testing ## Cross-browser testing

View File

@ -1,37 +0,0 @@
# Test against the latest version of this Node.js version
environment:
nodejs_version: "Current"
# environment:
# matrix:
# - nodejs_version: "Current"
cache:
- 'node_modules -> yarn.lock'
- '%LOCALAPPDATA%\\Yarn -> yarn.lock'
image: Visual Studio 2017
shallow_clone: true
# Install scripts. (runs after repo cloning)
install:
# Get the latest stable version of Node.js or io.js
- ps: Install-Product node $env:nodejs_version
# install modules
- yarn install
# Post-install test scripts.
test_script:
# Output useful info for debugging.
- node --version
# - npm --version
- yarn --version
# run tests
- yarn test:fixtures -w=2
- yarn test:unit -w=2
# Don't actually build.
build: off
# Do not build feature branch with open Pull Requests
skip_branch_with_pr: true

34
azure-pipelines.yml Normal file
View File

@ -0,0 +1,34 @@
# Node.js
# Build a general Node.js project with npm.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript
pool:
vmImage: 'vs2017-win2016'
trigger:
- dev
steps:
- task: NodeTool@0
inputs:
versionSpec: '^10.10.0'
displayName: 'Install Node.js'
- script: |
yarn
displayName: 'Install dependencies'
- script: |
set JEST_JUNIT_OUTPUT=test-fixtures-junit.xml&& yarn test:fixtures -w=2
displayName: 'Test: Build Fixtures'
- script: |
set JEST_JUNIT_OUTPUT=test-unit-junit.xml&& yarn test:unit -w=2
displayName: 'Test: Run unit tests'
- task: PublishTestResults@2
inputs:
testResultsFormat: 'JUnit'
testResultsFiles: 'test-*.xml'
displayName: 'Publish test results to Azure Pipelines'

19
babel.config.js Normal file
View File

@ -0,0 +1,19 @@
function isBabelLoader(caller) {
return caller && caller.name === 'babel-loader'
}
module.exports = function (api) {
if (api.env('test') && !api.caller(isBabelLoader)) {
return {
presets: [
['@babel/env', {
targets: {
node: 'current'
}
}]
],
plugins: ['dynamic-import-node']
}
}
return {}
}

View File

@ -1,73 +0,0 @@
const { resolve } = require('path')
const { existsSync } = require('fs')
const consola = require('consola')
const esm = require('esm')(module, {
cache: false,
cjs: {
cache: true,
vars: true,
namedExports: true
}
})
const getRootDir = argv => resolve(argv._[0] || '.')
const getNuxtConfigFile = argv => resolve(getRootDir(argv), argv['config-file'])
const getLatestHost = (argv) => {
const port =
argv.port ||
process.env.NUXT_PORT ||
process.env.PORT ||
process.env.npm_package_config_nuxt_port
const host =
argv.hostname ||
process.env.NUXT_HOST ||
process.env.HOST ||
process.env.npm_package_config_nuxt_host
const socket =
argv['unix-socket'] ||
process.env.UNIX_SOCKET ||
process.env.npm_package_config_unix_socket
return { port, host, socket }
}
exports.nuxtConfigFile = getNuxtConfigFile
exports.loadNuxtConfig = (argv) => {
const rootDir = getRootDir(argv)
const nuxtConfigFile = getNuxtConfigFile(argv)
let options = {}
if (existsSync(nuxtConfigFile)) {
delete require.cache[nuxtConfigFile]
options = esm(nuxtConfigFile)
if (!options) {
options = {}
}
if (options.default) {
options = options.default
}
} else if (argv['config-file'] !== 'nuxt.config.js') {
consola.fatal('Could not load config file: ' + argv['config-file'])
}
if (typeof options.rootDir !== 'string') {
options.rootDir = rootDir
}
// Nuxt Mode
options.mode =
(argv.spa && 'spa') || (argv.universal && 'universal') || options.mode
// Server options
if (!options.server) {
options.server = {}
}
const { port, host, socket } = getLatestHost(argv)
options.server.port = port || options.server.port || 3000
options.server.host = host || options.server.host || 'localhost'
options.server.socket = socket || options.server.socket
return options
}

View File

@ -1,32 +0,0 @@
#!/usr/bin/env node
const { join } = require('path')
const consola = require('consola')
// Global error handler
process.on('unhandledRejection', err => consola.error(err))
// Exit process on fatal errors
consola.add({
log(logObj) {
if (logObj.type === 'fatal') {
process.stderr.write('Nuxt Fatal Error :(\n')
process.exit(1)
}
}
})
const defaultCommand = 'dev'
const commands = new Set([defaultCommand, 'init', 'build', 'start', 'generate'])
let cmd = process.argv[2]
if (commands.has(cmd)) {
process.argv.splice(2, 1)
} else {
cmd = defaultCommand
}
const bin = join(__dirname, 'nuxt-' + cmd)
require(bin)

View File

@ -1,88 +0,0 @@
#!/usr/bin/env node
process.env.NODE_ENV = process.env.NODE_ENV || 'production'
const parseArgs = require('minimist')
const consola = require('consola')
const { Nuxt, Builder, Generator } = require('..')
const { loadNuxtConfig } = require('./common/utils')
const argv = parseArgs(process.argv.slice(2), {
alias: {
h: 'help',
c: 'config-file',
a: 'analyze',
s: 'spa',
u: 'universal',
q: 'quiet'
},
boolean: ['h', 'a', 's', 'u', 'q'],
string: ['c'],
default: {
c: 'nuxt.config.js'
}
})
if (argv.help) {
process.stderr.write(`
Description
Compiles the application for production deployment
Usage
$ nuxt build <dir>
Options
--analyze, -a Launch webpack-bundle-analyzer to optimize your bundles.
--spa, -s Launch in SPA mode
--universal, -u Launch in Universal mode (default)
--no-generate Don't generate static version for SPA mode (useful for nuxt start)
--config-file, -c Path to Nuxt.js config file (default: nuxt.config.js)
--quiet, -q Disable output except for errors
--help, -h Displays this message
`)
process.exit(0)
}
const options = loadNuxtConfig(argv)
// Create production build when calling `nuxt build`
options.dev = false
// Analyze option
options.build = options.build || {}
if (argv.analyze && typeof options.build.analyze !== 'object') {
options.build.analyze = true
}
// Silence output when using --quiet
if (argv.quiet) {
options.build.quiet = !!argv.quiet
}
const nuxt = new Nuxt(options)
const builder = new Builder(nuxt)
// Setup hooks
nuxt.hook('error', err => consola.fatal(err))
// Close function
const close = () => {
// In analyze mode wait for plugin
// emitting assets and opening browser
if (options.build.analyze === true || typeof options.build.analyze === 'object') {
return
}
process.exit(0)
}
if (options.mode !== 'spa' || argv.generate === false) {
// Build only
builder
.build()
.then(close)
.catch(err => consola.fatal(err))
} else {
// Build + Generate for static deployment
new Generator(nuxt, builder)
.generate({ build: true })
.then(close)
.catch(err => consola.fatal(err))
}

View File

@ -1,100 +0,0 @@
#!/usr/bin/env node
process.env.NODE_ENV = process.env.NODE_ENV || 'development'
const parseArgs = require('minimist')
const consola = require('consola')
const { version } = require('../package.json')
const { Nuxt, Builder } = require('..')
const { loadNuxtConfig } = require('./common/utils')
const argv = parseArgs(process.argv.slice(2), {
alias: {
h: 'help',
H: 'hostname',
p: 'port',
c: 'config-file',
s: 'spa',
u: 'universal',
v: 'version'
},
boolean: ['h', 's', 'u', 'v'],
string: ['H', 'c'],
default: {
c: 'nuxt.config.js'
}
})
if (argv.version) {
process.stderr.write(version + '\n')
process.exit(0)
}
if (argv.hostname === '') {
consola.fatal('Provided hostname argument has no value')
}
if (argv.help) {
process.stderr.write(`
Description
Starts the application in development mode (hot-code reloading, error
reporting, etc)
Usage
$ nuxt dev <dir> -p <port number> -H <hostname>
Options
--port, -p A port number on which to start the application
--hostname, -H Hostname on which to start the application
--spa Launch in SPA mode
--universal Launch in Universal mode (default)
--config-file, -c Path to Nuxt.js config file (default: nuxt.config.js)
--help, -h Displays this message
`)
process.exit(0)
}
const config = () => {
// Force development mode for add hot reloading and watching changes
return Object.assign(loadNuxtConfig(argv), { dev: true })
}
const errorHandler = (err, instance) => {
instance && instance.builder.watchServer()
consola.error(err)
}
// Start dev
(function startDev(oldInstance) {
let nuxt, builder
try {
nuxt = new Nuxt(config())
builder = new Builder(nuxt)
nuxt.hook('watch:fileChanged', (builder, fname) => {
consola.debug(`[${fname}] changed, Rebuilding the app...`)
startDev({ nuxt: builder.nuxt, builder })
})
} catch (err) {
return errorHandler(err, oldInstance)
}
return (
Promise.resolve()
.then(() => oldInstance && oldInstance.nuxt.clearHook('watch:fileChanged'))
.then(() => oldInstance && oldInstance.builder.unwatch())
// Start build
.then(() => builder.build())
// Close old nuxt no mater if build successfully
.catch((err) => {
oldInstance && oldInstance.nuxt.close()
// Jump to eventHandler
throw err
})
.then(() => oldInstance && oldInstance.nuxt.close())
// Start listening
.then(() => nuxt.listen())
// Show ready message first time, others will be shown through WebpackBar
.then(() => !oldInstance && nuxt.showReady(false))
.then(() => builder.watchServer())
// Handle errors
.catch(err => errorHandler(err, { builder, nuxt }))
)
})()

View File

@ -1,58 +0,0 @@
#!/usr/bin/env node
process.env.NODE_ENV = process.env.NODE_ENV || 'production'
const parseArgs = require('minimist')
const consola = require('consola')
const { Nuxt, Builder, Generator } = require('..')
const { loadNuxtConfig } = require('./common/utils')
const argv = parseArgs(process.argv.slice(2), {
alias: {
h: 'help',
c: 'config-file',
s: 'spa',
u: 'universal'
},
boolean: ['h', 's', 'u', 'build'],
string: ['c'],
default: {
c: 'nuxt.config.js',
build: true
}
})
if (argv.help) {
process.stderr.write(`
Description
Generate a static web application (server-rendered)
Usage
$ nuxt generate <dir>
Options
--spa Launch in SPA mode
--universal Launch in Universal mode (default)
--config-file, -c Path to Nuxt.js config file (default: nuxt.config.js)
--help, -h Displays this message
--no-build Just run generate for faster builds when just dynamic routes changed. Nuxt build is needed before this command.
`)
process.exit(0)
}
const options = loadNuxtConfig(argv)
options.dev = false // Force production mode (no webpack middleware called)
const nuxt = new Nuxt(options)
const builder = new Builder(nuxt)
const generator = new Generator(nuxt, builder)
const generateOptions = {
init: true,
build: argv.build
}
generator
.generate(generateOptions)
.then(() => {
process.exit(0)
})
.catch(err => consola.fatal(err))

View File

@ -1,86 +0,0 @@
#!/usr/bin/env node
process.env.NODE_ENV = process.env.NODE_ENV || 'production'
const fs = require('fs')
const { resolve } = require('path')
const parseArgs = require('minimist')
const consola = require('consola')
const { Nuxt } = require('../dist/nuxt-start')
const { loadNuxtConfig } = require('./common/utils')
const argv = parseArgs(process.argv.slice(2), {
alias: {
h: 'help',
H: 'hostname',
p: 'port',
n: 'unix-socket',
c: 'config-file',
s: 'spa',
u: 'universal'
},
boolean: ['h', 's', 'u'],
string: ['H', 'c', 'n'],
default: {
c: 'nuxt.config.js'
}
})
if (argv.hostname === '') {
consola.fatal('Provided hostname argument has no value')
}
if (argv.help) {
process.stderr.write(`
Description
Starts the application in production mode.
The application should be compiled with \`nuxt build\` first.
Usage
$ nuxt start <dir> -p <port number> -H <hostname>
Options
--port, -p A port number on which to start the application
--hostname, -H Hostname on which to start the application
--unix-socket, -n Path to a UNIX socket
--spa Launch in SPA mode
--universal Launch in Universal mode (default)
--config-file, -c Path to Nuxt.js config file (default: nuxt.config.js)
--help, -h Displays this message
`)
process.exit(0)
}
const options = loadNuxtConfig(argv)
// Force production mode (no webpack middleware called)
options.dev = false
const nuxt = new Nuxt(options)
// Setup hooks
nuxt.hook('error', err => consola.fatal(err))
// Check if project is built for production
const distDir = resolve(
nuxt.options.rootDir,
nuxt.options.buildDir || '.nuxt',
'dist',
'server'
)
if (!fs.existsSync(distDir)) {
consola.fatal(
'No build files found, please run `nuxt build` before launching `nuxt start`'
)
}
// Check if SSR Bundle is required
if (nuxt.options.render.ssr === true) {
const ssrBundlePath = resolve(distDir, 'server-bundle.json')
if (!fs.existsSync(ssrBundlePath)) {
consola.fatal(
'No SSR build! Please start with `nuxt start --spa` or build using `nuxt build --universal`'
)
}
}
nuxt.listen().then(() => {
nuxt.showReady(false)
})

View File

@ -0,0 +1,50 @@
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## 2.3.1 (2018-11-16)
### Bug Fixes
* **deps:** update all non-major dependencies ([#4253](https://github.com/nuxt/nuxt.js/issues/4253)) ([f10f860](https://github.com/nuxt/nuxt.js/commit/f10f860))
* **deps:** update all non-major dependencies ([#4270](https://github.com/nuxt/nuxt.js/issues/4270)) ([1a154e8](https://github.com/nuxt/nuxt.js/commit/1a154e8))
* **deps:** update all non-major dependencies ([#4271](https://github.com/nuxt/nuxt.js/issues/4271)) ([dd114ff](https://github.com/nuxt/nuxt.js/commit/dd114ff))
* **deps:** update all non-major dependencies ([#4310](https://github.com/nuxt/nuxt.js/issues/4310)) ([bfb6d6a](https://github.com/nuxt/nuxt.js/commit/bfb6d6a))
* **deps:** update dependency consola to ^2.2.0 ([#4269](https://github.com/nuxt/nuxt.js/issues/4269)) ([47f67cc](https://github.com/nuxt/nuxt.js/commit/47f67cc))
* **distributions:** add bin to all distributions ([#4336](https://github.com/nuxt/nuxt.js/issues/4336)) ([c9459e7](https://github.com/nuxt/nuxt.js/commit/c9459e7))
* **pkg:** stick [@nuxt](https://github.com/nuxt) dependency versions ([#4339](https://github.com/nuxt/nuxt.js/issues/4339)) ([ca5d538](https://github.com/nuxt/nuxt.js/commit/ca5d538))
### Features
* dx improvements ([#4259](https://github.com/nuxt/nuxt.js/issues/4259)) ([7c4e77f](https://github.com/nuxt/nuxt.js/commit/7c4e77f))
* migrate nuxt into monorepo ([#4051](https://github.com/nuxt/nuxt.js/issues/4051)) ([9c1e0d1](https://github.com/nuxt/nuxt.js/commit/9c1e0d1))
* split builder into more refined modules ([#4171](https://github.com/nuxt/nuxt.js/issues/4171)) ([9df5f49](https://github.com/nuxt/nuxt.js/commit/9df5f49))
* update to consola 2 ([#4247](https://github.com/nuxt/nuxt.js/issues/4247)) ([1dd32d0](https://github.com/nuxt/nuxt.js/commit/1dd32d0))
# 2.3.0 (2018-11-16)
### Bug Fixes
* **deps:** update all non-major dependencies ([#4253](https://github.com/nuxt/nuxt.js/issues/4253)) ([f10f860](https://github.com/nuxt/nuxt.js/commit/f10f860))
* **deps:** update all non-major dependencies ([#4270](https://github.com/nuxt/nuxt.js/issues/4270)) ([1a154e8](https://github.com/nuxt/nuxt.js/commit/1a154e8))
* **deps:** update all non-major dependencies ([#4271](https://github.com/nuxt/nuxt.js/issues/4271)) ([dd114ff](https://github.com/nuxt/nuxt.js/commit/dd114ff))
* **deps:** update all non-major dependencies ([#4310](https://github.com/nuxt/nuxt.js/issues/4310)) ([bfb6d6a](https://github.com/nuxt/nuxt.js/commit/bfb6d6a))
* **deps:** update dependency consola to ^2.2.0 ([#4269](https://github.com/nuxt/nuxt.js/issues/4269)) ([47f67cc](https://github.com/nuxt/nuxt.js/commit/47f67cc))
* **distributions:** add bin to all distributions ([#4336](https://github.com/nuxt/nuxt.js/issues/4336)) ([c9459e7](https://github.com/nuxt/nuxt.js/commit/c9459e7))
* **pkg:** stick [@nuxt](https://github.com/nuxt) dependency versions ([#4339](https://github.com/nuxt/nuxt.js/issues/4339)) ([ca5d538](https://github.com/nuxt/nuxt.js/commit/ca5d538))
### Features
* dx improvements ([#4259](https://github.com/nuxt/nuxt.js/issues/4259)) ([7c4e77f](https://github.com/nuxt/nuxt.js/commit/7c4e77f))
* migrate nuxt into monorepo ([#4051](https://github.com/nuxt/nuxt.js/issues/4051)) ([9c1e0d1](https://github.com/nuxt/nuxt.js/commit/9c1e0d1))
* split builder into more refined modules ([#4171](https://github.com/nuxt/nuxt.js/issues/4171)) ([9df5f49](https://github.com/nuxt/nuxt.js/commit/9df5f49))
* update to consola 2 ([#4247](https://github.com/nuxt/nuxt.js/issues/4247)) ([1dd32d0](https://github.com/nuxt/nuxt.js/commit/1dd32d0))

View File

@ -0,0 +1,27 @@
#!/usr/bin/env node
const register = require('@babel/register')
require('@babel/polyfill')
register({
presets: [
[ '@babel/env', { targets: { node: 'current' } } ]
],
ignore: [
(path) => {
// Transpile known packages
if (/(@nuxt|@nuxtjs)[\\/]/.test(path)) {
return false
}
// Ignore everything else inside node_modules
if (/node_modules/.test(path)) {
return true
}
// Transpile project files
return false
}
]
})
require('@nuxt/cli').run()

View File

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

View File

@ -0,0 +1,66 @@
{
"name": "nuxt-legacy",
"version": "2.3.1",
"description": "Legacy build of Nuxt.js for Node.js < 8.0.0",
"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": "bin/nuxt-legacy.js",
"dependencies": {
"@babel/core": "^7.1.6",
"@babel/polyfill": "^7.0.0",
"@babel/preset-env": "^7.1.6",
"@babel/register": "^7.0.0",
"@nuxt/builder": "^2.3.1",
"@nuxt/cli": "^2.3.1",
"@nuxt/common": "^2.3.1",
"@nuxt/core": "^2.3.1",
"@nuxt/generator": "^2.3.1",
"@nuxt/webpack": "^2.3.1"
},
"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

@ -0,0 +1,44 @@
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## 2.3.1 (2018-11-16)
### Bug Fixes
* **deps:** update all non-major dependencies ([#4253](https://github.com/nuxt/nuxt.js/issues/4253)) ([f10f860](https://github.com/nuxt/nuxt.js/commit/f10f860))
* **deps:** update all non-major dependencies ([#4270](https://github.com/nuxt/nuxt.js/issues/4270)) ([1a154e8](https://github.com/nuxt/nuxt.js/commit/1a154e8))
* **deps:** update dependency consola to ^2.2.0 ([#4269](https://github.com/nuxt/nuxt.js/issues/4269)) ([47f67cc](https://github.com/nuxt/nuxt.js/commit/47f67cc))
* **distributions:** add bin to all distributions ([#4336](https://github.com/nuxt/nuxt.js/issues/4336)) ([c9459e7](https://github.com/nuxt/nuxt.js/commit/c9459e7))
* **pkg:** stick [@nuxt](https://github.com/nuxt) dependency versions ([#4339](https://github.com/nuxt/nuxt.js/issues/4339)) ([ca5d538](https://github.com/nuxt/nuxt.js/commit/ca5d538))
### Features
* dx improvements ([#4259](https://github.com/nuxt/nuxt.js/issues/4259)) ([7c4e77f](https://github.com/nuxt/nuxt.js/commit/7c4e77f))
* migrate nuxt into monorepo ([#4051](https://github.com/nuxt/nuxt.js/issues/4051)) ([9c1e0d1](https://github.com/nuxt/nuxt.js/commit/9c1e0d1))
* update to consola 2 ([#4247](https://github.com/nuxt/nuxt.js/issues/4247)) ([1dd32d0](https://github.com/nuxt/nuxt.js/commit/1dd32d0))
# 2.3.0 (2018-11-16)
### Bug Fixes
* **deps:** update all non-major dependencies ([#4253](https://github.com/nuxt/nuxt.js/issues/4253)) ([f10f860](https://github.com/nuxt/nuxt.js/commit/f10f860))
* **deps:** update all non-major dependencies ([#4270](https://github.com/nuxt/nuxt.js/issues/4270)) ([1a154e8](https://github.com/nuxt/nuxt.js/commit/1a154e8))
* **deps:** update dependency consola to ^2.2.0 ([#4269](https://github.com/nuxt/nuxt.js/issues/4269)) ([47f67cc](https://github.com/nuxt/nuxt.js/commit/47f67cc))
* **distributions:** add bin to all distributions ([#4336](https://github.com/nuxt/nuxt.js/issues/4336)) ([c9459e7](https://github.com/nuxt/nuxt.js/commit/c9459e7))
* **pkg:** stick [@nuxt](https://github.com/nuxt) dependency versions ([#4339](https://github.com/nuxt/nuxt.js/issues/4339)) ([ca5d538](https://github.com/nuxt/nuxt.js/commit/ca5d538))
### Features
* dx improvements ([#4259](https://github.com/nuxt/nuxt.js/issues/4259)) ([7c4e77f](https://github.com/nuxt/nuxt.js/commit/7c4e77f))
* migrate nuxt into monorepo ([#4051](https://github.com/nuxt/nuxt.js/issues/4051)) ([9c1e0d1](https://github.com/nuxt/nuxt.js/commit/9c1e0d1))
* update to consola 2 ([#4247](https://github.com/nuxt/nuxt.js/issues/4247)) ([1dd32d0](https://github.com/nuxt/nuxt.js/commit/1dd32d0))

View File

@ -32,7 +32,7 @@ const { Nuxt } = require('nuxt-start')
// Require nuxt config // Require nuxt config
const config = require('./nuxt.config.js') const config = require('./nuxt.config.js')
// Create a new nuxt instance // Create a new nuxt instance (config needs dev: false)
const nuxt = new Nuxt(config) const nuxt = new Nuxt(config)
// Start nuxt.js server // Start nuxt.js server

View File

@ -0,0 +1,5 @@
#!/usr/bin/env node
const { name } = require('../package.json')
const isEdge = name.indexOf('-edge') !== -1
const cli = require(isEdge ? '@nuxt/cli-edge' : '@nuxt/cli')
cli.run()

View File

@ -0,0 +1,23 @@
export default {
build: true,
extend(pkg, { load }) {
pkg.on('build:done', () => {
const mono = load('../..')
const nuxt = load('../nuxt')
pkg.copyFilesFrom(mono, [
'LICENSE'
])
pkg.copyFieldsFrom(nuxt, [
'license',
'repository',
'contributors',
'keywords',
'engines'
])
pkg.writePackage()
})
}
}

View File

@ -0,0 +1,57 @@
{
"name": "nuxt-start",
"version": "2.3.1",
"description": "Starts Nuxt.js Application in production mode",
"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",
"dist"
],
"main": "dist/nuxt-start.js",
"bin": "bin/nuxt-start.js",
"dependencies": {
"@nuxt/cli": "^2.3.1",
"@nuxt/common": "^2.3.1",
"@nuxt/core": "^2.3.1"
},
"engines": {
"node": ">=8.0.0",
"npm": ">=5.0.0"
}
}

View File

@ -0,0 +1 @@
export * from '@nuxt/core'

View File

@ -0,0 +1,46 @@
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## 2.3.1 (2018-11-16)
### Bug Fixes
* **deps:** update all non-major dependencies ([#4253](https://github.com/nuxt/nuxt.js/issues/4253)) ([f10f860](https://github.com/nuxt/nuxt.js/commit/f10f860))
* **deps:** update all non-major dependencies ([#4270](https://github.com/nuxt/nuxt.js/issues/4270)) ([1a154e8](https://github.com/nuxt/nuxt.js/commit/1a154e8))
* **deps:** update dependency consola to ^2.2.0 ([#4269](https://github.com/nuxt/nuxt.js/issues/4269)) ([47f67cc](https://github.com/nuxt/nuxt.js/commit/47f67cc))
* **distributions:** add bin to all distributions ([#4336](https://github.com/nuxt/nuxt.js/issues/4336)) ([c9459e7](https://github.com/nuxt/nuxt.js/commit/c9459e7))
* **pkg:** stick [@nuxt](https://github.com/nuxt) dependency versions ([#4339](https://github.com/nuxt/nuxt.js/issues/4339)) ([ca5d538](https://github.com/nuxt/nuxt.js/commit/ca5d538))
### Features
* dx improvements ([#4259](https://github.com/nuxt/nuxt.js/issues/4259)) ([7c4e77f](https://github.com/nuxt/nuxt.js/commit/7c4e77f))
* migrate nuxt into monorepo ([#4051](https://github.com/nuxt/nuxt.js/issues/4051)) ([9c1e0d1](https://github.com/nuxt/nuxt.js/commit/9c1e0d1))
* split builder into more refined modules ([#4171](https://github.com/nuxt/nuxt.js/issues/4171)) ([9df5f49](https://github.com/nuxt/nuxt.js/commit/9df5f49))
* update to consola 2 ([#4247](https://github.com/nuxt/nuxt.js/issues/4247)) ([1dd32d0](https://github.com/nuxt/nuxt.js/commit/1dd32d0))
# 2.3.0 (2018-11-16)
### Bug Fixes
* **deps:** update all non-major dependencies ([#4253](https://github.com/nuxt/nuxt.js/issues/4253)) ([f10f860](https://github.com/nuxt/nuxt.js/commit/f10f860))
* **deps:** update all non-major dependencies ([#4270](https://github.com/nuxt/nuxt.js/issues/4270)) ([1a154e8](https://github.com/nuxt/nuxt.js/commit/1a154e8))
* **deps:** update dependency consola to ^2.2.0 ([#4269](https://github.com/nuxt/nuxt.js/issues/4269)) ([47f67cc](https://github.com/nuxt/nuxt.js/commit/47f67cc))
* **distributions:** add bin to all distributions ([#4336](https://github.com/nuxt/nuxt.js/issues/4336)) ([c9459e7](https://github.com/nuxt/nuxt.js/commit/c9459e7))
* **pkg:** stick [@nuxt](https://github.com/nuxt) dependency versions ([#4339](https://github.com/nuxt/nuxt.js/issues/4339)) ([ca5d538](https://github.com/nuxt/nuxt.js/commit/ca5d538))
### Features
* dx improvements ([#4259](https://github.com/nuxt/nuxt.js/issues/4259)) ([7c4e77f](https://github.com/nuxt/nuxt.js/commit/7c4e77f))
* migrate nuxt into monorepo ([#4051](https://github.com/nuxt/nuxt.js/issues/4051)) ([9c1e0d1](https://github.com/nuxt/nuxt.js/commit/9c1e0d1))
* split builder into more refined modules ([#4171](https://github.com/nuxt/nuxt.js/issues/4171)) ([9df5f49](https://github.com/nuxt/nuxt.js/commit/9df5f49))
* update to consola 2 ([#4247](https://github.com/nuxt/nuxt.js/issues/4247)) ([1dd32d0](https://github.com/nuxt/nuxt.js/commit/1dd32d0))

View File

@ -0,0 +1,232 @@
<p align="center"><img align="center" src="http://imgur.com/V4LtoII.png"/></p>
<p align="center">
<a href="https://circleci.com/gh/nuxt/nuxt.js"><img src="https://badgen.net/circleci/github/nuxt/nuxt.js/dev" alt="Build Status"></a>
<a href="https://dev.azure.com/nuxt/nuxt.js/_build/latest?definitionId=1"><img src="https://dev.azure.com/nuxt/nuxt.js/_apis/build/status/nuxt.js" alt="Azure Build Status"></a>
 <a href="https://codecov.io/gh/nuxt/nuxt.js"><img src="https://badgen.net/codecov/c/github/nuxt/nuxt.js/dev" alt="Coverage Status"></a>
<a href="https://www.npmjs.com/package/nuxt"><img src="https://badgen.net/npm/dm/nuxt" alt="Downloads"></a>
<a href="https://www.npmjs.com/package/nuxt"><img src="https://badgen.net/npm/v/nuxt" alt="Version"></a>
<a href="https://www.npmjs.com/package/nuxt"><img src="https://badgen.net/npm/license/nuxt" alt="License"></a>
<a href="https://discord.nuxtjs.org/"><img src="https://badgen.net/badge/Discord/join-us/7289DA" alt="Discord"></a>
</p>
<p align="center">
<a href="#partners" alt="Partner on Open Collective"><img src="https://opencollective.com/nuxtjs/tiers/partner/badge.svg" /></a>
<a href="#sponsors" alt="Sponsors on Open Collective"><img src="https://opencollective.com/nuxtjs/tiers/sponsors/badge.svg" /></a>
<a href="#backers" alt="Backers on Open Collective"><img src="https://opencollective.com/nuxtjs/tiers/backers/badge.svg" /></a>
<a href="https://oc.nuxtjs.org/"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a>
</p>
> Vue.js Meta Framework to create complex, fast & universal web applications *quickly*.
## Links
- 📘 Documentation: [https://nuxtjs.org](https://nuxtjs.org)
- 👥 Community: [cmty.app/nuxt](https://cmty.app/nuxt)
- 🎬 Video: [1 minute demo](https://www.youtube.com/watch?v=kmf-p-pTi40)
- 🐦 Twitter: [@nuxt_js](https://twitter.nuxtjs.org/)
- 💬 Chat: [Discord](https://discord.nuxtjs.org/)
- 📦 [Nuxt.js Modules](https://github.com/nuxt-community/modules)
- 👉 [Play with Nuxt.js online](https://template.nuxtjs.org)
## Features
- Automatic transpilation and bundling (with webpack and babel)
- Hot code reloading
- Server-side rendering OR Single Page App OR Static Generated, you choose :fire:
- Static file serving. `./static/` is mapped to `/`
- Configurable with a `nuxt.config.js` file
- Custom layouts with the `layouts/` directory
- Middleware
- Code splitting for every `pages/`
Learn more at [nuxtjs.org](https://nuxtjs.org).
## Professional support with TideLift
Professionally supported Nuxt.js is now available!
Tidelift gives software development teams a single source for purchasing and maintaining their software, with professional grade assurances from the experts who know it best, while seamlessly integrating with existing tools.
[Get supported Nuxt with the Tidelift Subscription](https://tidelift.com/subscription/pkg/npm-nuxt?utm_source=npm-nuxt&utm_medium=readme).
## Partners
Become a partner and get your logo on our README on GitHub and every page of https://nuxtjs.org website with a link to your site. [[Become a partner](https://opencollective.com/nuxtjs#partner)]
<a href="https://opencollective.com/nuxtjs#contributors"><img src="https://opencollective.com/nuxtjs/tiers/partner.svg?avatarHeight=96&width=890&button=false" /></a>
## Sponsors
Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/nuxtjs#sponsor)]
<a href="https://opencollective.com/nuxtjs#contributors"><img src="https://opencollective.com/nuxtjs/tiers/sponsors.svg?avatarHeight=72&width=890&button=false" /></a>
## Backers
Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/nuxtjs#backer)]
<a href="https://opencollective.com/nuxtjs#contributors"><img src="https://opencollective.com/nuxtjs/tiers/backers.svg?width=890&button=false" /></a>
## Getting started
```
$ npm install nuxt
```
Add a script to your package.json like this:
```json
{
"scripts": {
"start": "nuxt"
}
}
```
After that, the file-system is the main API. Every .vue file becomes a route that gets automatically processed and rendered.
Populate `./pages/index.vue` inside your project:
```html
<template>
<h1>Hello {{ name }}!</h1>
</template>
<script>
export default {
data: () => {
return { name: 'world' }
}
}
</script>
```
And then run:
```bash
npm start
```
Go to [http://localhost:3000](http://localhost:3000)
## Templates
:point_right: We recommend to start directly with our cli [create-nuxt-app](https://github.com/nuxt-community/create-nuxt-app) for the latest updates.
Or you can start by using one of our starter templates:
- [starter](https://github.com/nuxt-community/starter-template): Basic Nuxt.js project template
- [express](https://github.com/nuxt-community/express-template): Nuxt.js + Express
- [koa](https://github.com/nuxt-community/koa-template): Nuxt.js + Koa
- [adonuxt](https://github.com/nuxt-community/adonuxt-template): Nuxt.js + AdonisJS
- [micro](https://github.com/nuxt-community/micro-template): Nuxt.js + Micro
- [nuxtent](https://github.com/nuxt-community/nuxtent-template): Nuxt.js + Nuxtent module for content heavy sites
## Using nuxt.js programmatically
```js
const { Nuxt, Builder } = require('nuxt')
// Import and set nuxt.js options
let config = require('./nuxt.config.js')
config.dev = (process.env.NODE_ENV !== 'production')
let nuxt = new Nuxt(config)
// Start build process (only in development)
if (config.dev) {
new Builder(nuxt).build()
}
// You can use nuxt.render(req, res) or nuxt.renderRoute(route, context)
```
Learn more: https://nuxtjs.org/api/nuxt
## Using nuxt.js as a middleware
You might want to use your own server with your configurations, your API and everything awesome your created with. That's why you can use nuxt.js as a middleware. It's recommended to use it at the end of your middleware since it will handle the rendering of your web application and won't call next().
```js
app.use(nuxt.render)
```
Learn more: https://nuxtjs.org/api/nuxt-render
## Render a specific route
This is mostly used for `nuxt generate` and test purposes but you might find another utility!
```js
nuxt.renderRoute('/about', context)
.then(function ({ html, error }) {
// You can check error to know if your app displayed the error page for this route
// Useful to set the correct status code if an error appended:
if (error) {
return res.status(error.statusCode || 500).send(html)
}
res.send(html)
})
.catch(function (error) {
// And error appended while rendering the route
})
```
Learn more: https://nuxtjs.org/api/nuxt-render-route
## Examples
Please take a look at https://nuxtjs.org/examples or directly in https://github.com/nuxt/nuxt.js/tree/dev/examples.
## Production deployment
To deploy, instead of running nuxt, you probably want to build ahead of time. Therefore, building and starting are separate commands:
```bash
nuxt build
nuxt start
```
For example, to deploy with [`now`](https://zeit.co/now) a `package.json` like follows is recommended:
```json
{
"name": "my-app",
"dependencies": {
"nuxt": "latest"
},
"scripts": {
"dev": "nuxt",
"build": "nuxt build",
"start": "nuxt start"
}
}
```
Then run `now` and enjoy!
Note: we recommend putting `.nuxt` in `.npmignore` or `.gitignore`.
## Core team
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore -->
| [<img src="https://avatars2.githubusercontent.com/u/904724?v=4" width="150px;"/><br /><sub><b>Sébastien Chopin</b></sub>](https://github.com/atinux)<br />[📝](#blog-Atinux "Blogposts") [🐛](https://github.com/Atinux/Nuxt.js/issues?q=author%3AAtinux "Bug reports") [💻](https://github.com/Atinux/Nuxt.js/commits?author=Atinux "Code") [🎨](#design-Atinux "Design") [📖](https://github.com/Atinux/Nuxt.js/commits?author=Atinux "Documentation") [💬](#question-Atinux "Answering Questions") [👀](#review-Atinux "Reviewed Pull Requests") [📢](#talk-Atinux "Talks") | [<img src="https://avatars2.githubusercontent.com/u/4084277?v=4" width="150px;"/><br /><sub><b>Alexandre Chopin</b></sub>](https://github.com/alexchopin)<br />[🎨](#design-alexchopin "Design") [📖](https://github.com/Atinux/Nuxt.js/commits?author=alexchopin "Documentation") [📋](#eventOrganizing-alexchopin "Event Organizing") [📦](#platform-alexchopin "Packaging/porting to new platform") [💬](#question-alexchopin "Answering Questions") [📢](#talk-alexchopin "Talks") | [<img src="https://avatars0.githubusercontent.com/u/5158436?v=4" width="150px;"/><br /><sub><b>Pooya Parsa</b></sub>](https://github.com/pi0)<br />[🐛](https://github.com/Atinux/Nuxt.js/issues?q=author%3Api0 "Bug reports") [💻](https://github.com/Atinux/Nuxt.js/commits?author=pi0 "Code") [🔌](#plugin-pi0 "Plugin/utility libraries") [💬](#question-pi0 "Answering Questions") [👀](#review-pi0 "Reviewed Pull Requests") [🔧](#tool-pi0 "Tools") | [<img src="https://avatars3.githubusercontent.com/u/4312154?v=4" width="150px;"/><br /><sub><b>Clark Du</b></sub>](https://github.com/clarkdo)<br />[🐛](https://github.com/Atinux/Nuxt.js/issues?q=author%3Aclarkdo "Bug reports") [💻](https://github.com/Atinux/Nuxt.js/commits?author=clarkdo "Code") [💡](#example-clarkdo "Examples") [👀](#review-clarkdo "Reviewed Pull Requests") [⚠️](https://github.com/Atinux/Nuxt.js/commits?author=clarkdo "Tests") [🔧](#tool-clarkdo "Tools") | [<img src="https://avatars0.githubusercontent.com/u/640208?s=460&v=4" width="150px;"/><br /><sub><b>Alexander Lichter</b></sub>](https://github.com/manniL)<br />[💬](#question-manniL "Answering Questions") [🐛](https://github.com/Atinux/Nuxt.js/issues?q=author%3AmanniL "Bug reports") [💻](https://github.com/Atinux/Nuxt.js/commits?author=manniL "Code") [💡](#example-manniL "Examples") [👀](#review-manniL "Reviewed Pull Requests") [⚠️](https://github.com/Atinux/Nuxt.js/commits?author=manniL "Tests") | [<img src="https://avatars1.githubusercontent.com/u/12291?s=460&v=4" width="150px;"/><br /><sub><b>Jonas Galvez</b></sub>](https://github.com/galvez)<br />[💬](#question-galvez "Answering Questions") [🐛](https://github.com/Atinux/Nuxt.js/issues?q=author%3Agalvez "Bug reports") [💻](https://github.com/Atinux/Nuxt.js/commits?author=galvez "Code") [💡](#example-galvez "Examples") [👀](#review-galvez "Reviewed Pull Requests") [⚠️](https://github.com/Atinux/Nuxt.js/commits?author=galvez "Tests") |
| :---: | :---: | :---: | :---: | :---: | :---: |
<!-- ALL-CONTRIBUTORS-LIST:END -->
## Contributors
Thank you to all our [contributors](https://github.com/nuxt/nuxt.js/graphs/contributors)!
<a href="https://github.com/nuxt/nuxt.js/graphs/contributors"><img src="https://opencollective.com/nuxtjs/contributors.svg?width=890&button=false" /></a>
## Contributing
Please refer to our [Contribution Guide](https://nuxtjs.org/guide/contribution-guide#codefund_ad)
## Cross-browser testing
Thanks to BrowserStack!
<a href="http://browserstack.com"><img height="70" src="https://p3.zdusercontent.com/attachment/1015988/PWfFdN71Aung2evRkIVQuKJpE?token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..aUrNFb8clSXsFwgw5BUTcg.IJr5piuCen7PmSSBHSrOnqM9K5YZfxX3lvbp-5LCqoKOi4CjjgdA419iqjofs0nLtm26FMURvZ8JRTuKB4iHer6lGu5f8dXHtIkYAHjP5fXDWkl044Yg2mSdrhF6uPy62GdlBYoYxwvgkNrac8nN_In8GY-qOC7bYmlZyJT7tsTZUTYbNMQiXS86YA5LgdCEWzWreMvc3C6cvZtVXIrcVgpkroIhvsTQPm4vQA-Uq6iCbTPA4oX5cpEtMtrlg4jYBnnAE4BTw5UwU_dY83ep5g.7wpc1IKv0rSRGsvqCG_q3g" alt="BrowserStack"></a>
## License
[MIT](https://github.com/nuxt/nuxt.js/blob/dev/LICENSE)

5
distributions/nuxt/bin/nuxt.js Executable file
View File

@ -0,0 +1,5 @@
#!/usr/bin/env node
const { name } = require('../package.json')
const isEdge = name.indexOf('-edge') !== -1
const cli = require(isEdge ? '@nuxt/cli-edge' : '@nuxt/cli')
cli.run()

View File

@ -0,0 +1,12 @@
export default {
build: true,
extend(pkg, { load }) {
pkg.on('build:done', () => {
const mono = load('../..')
pkg.copyFilesFrom(mono, [
'LICENSE'
])
})
}
}

View File

@ -0,0 +1,66 @@
{
"name": "nuxt",
"version": "2.3.1",
"description": "A minimalistic framework for server-rendered Vue.js applications (inspired by Next.js)",
"keywords": [
"nuxt",
"nuxt.js",
"nuxtjs",
"ssr",
"vue",
"vue isomorphic",
"vue server side",
"vue ssr",
"vue universal",
"vue versatile",
"vue.js",
"vuejs"
],
"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",
"dist"
],
"main": "dist/nuxt.js",
"bin": "bin/nuxt.js",
"scripts": {
"postinstall": "opencollective || exit 0"
},
"dependencies": {
"@nuxt/builder": "^2.3.1",
"@nuxt/cli": "^2.3.1",
"@nuxt/common": "^2.3.1",
"@nuxt/core": "^2.3.1",
"@nuxt/generator": "^2.3.1",
"@nuxt/webpack": "^2.3.1"
},
"engines": {
"node": ">=8.0.0",
"npm": ">=5.0.0"
},
"collective": {
"url": "https://opencollective.com/nuxtjs",
"logoUrl": "https://opencollective.com/nuxtjs/logo.txt?reverse=true&variant=variant2"
}
}

View File

@ -0,0 +1,3 @@
export * from '@nuxt/core'
export * from '@nuxt/builder'
export * from '@nuxt/generator'

View File

@ -0,0 +1,39 @@
# Example how to test Nuxt.js app with Jest and Puppeteer
# Install deps
```
npm install
```
# Run tests
```
npm run test
```
## It will
- Build app
- Run server
- Run tests
### Output
```
PASS test/index.spec.js
Index page
√ test index title (53ms)
√ test navigate to about page (2ms)
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 2 passed, 2 total
Time: 0.992s, estimated 1s
Ran all test suites.
```
## Check configuration files:
- `jest.config.js`
- `jest-puppeteer.config.js`
## Documentation
- [jest-puppeteer](https://github.com/smooth-code/jest-puppeteer)
- [jest]()
- [puppeteer](https://pptr.dev/)

View File

@ -0,0 +1,10 @@
module.exports = {
launch: {
headless: process.env.HEADLESS !== 'false'
},
server: {
command: 'npm run testServer',
port: 3000,
launchTimeout: 50000
}
}

View File

@ -0,0 +1,4 @@
module.exports = {
verbose: true,
preset: 'jest-puppeteer'
}

View File

@ -0,0 +1,18 @@
{
"name": "example-jest-puppeteer",
"dependencies": {
"nuxt": "latest"
},
"scripts": {
"dev": "nuxt",
"build": "nuxt build",
"start": "nuxt start",
"test": "jest -w=4",
"testServer": "nuxt build & nuxt start"
},
"devDependencies": {
"jest": "latest",
"jest-puppeteer": "latest",
"puppeteer": "latest"
}
}

View File

@ -0,0 +1,19 @@
<template>
<div>
<p id="hello-msg">Hi from {{ name }}</p>
<nuxt-link to="/">Home page</nuxt-link>
</div>
</template>
<script>
export default {
asyncData() {
return {
name: process.static ? 'static' : (process.server ? 'server' : 'client')
}
},
head: {
title: 'About page'
}
}
</script>

View File

@ -0,0 +1,14 @@
<template>
<div>
<h1>Welcome!</h1>
<nuxt-link id="about-link" to="/about">About page</nuxt-link>
</div>
</template>
<script>
export default {
head: {
title: 'Home page'
}
}
</script>

View File

@ -0,0 +1,5 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Index page test index title: index.title 1`] = `"Home page"`;
exports[`Index page test navigation to about page: about.msg 1`] = `"Hi from client"`;

View File

@ -0,0 +1,32 @@
const devices = require('puppeteer/DeviceDescriptors')
const iPhone = devices['iPhone 6']
const BASE_URL = 'http://127.0.0.1:3000'
describe('Index page', () => {
let page
beforeAll(async () => {
// eslint-disable-next-line no-undef
page = await browser.newPage()
await page.emulate(iPhone)
await page.goto(BASE_URL)
})
afterAll(async () => {
await page.close()
})
it('test index title', async () => {
expect.assertions(1)
const title = await page.evaluate(() => document.title)
expect(title).toMatchSnapshot('index.title')
})
it('test navigation to about page', async () => {
expect.assertions(1)
await page.click('a#about-link')
await page.waitForSelector('p#hello-msg')
const msg = await page.$eval('p#hello-msg', e => e.textContent)
expect(msg).toMatchSnapshot('about.msg')
})
})

View File

@ -0,0 +1 @@
*.spec.js.snap

14
examples/jest-vtu-example/.gitignore vendored Normal file
View File

@ -0,0 +1,14 @@
# dependencies
node_modules
# logs
npm-debug.log
# Nuxt build
.nuxt
# Nuxt generate
dist
# coverage report
coverage/

View File

@ -0,0 +1,9 @@
# Jest + Vue Test Utils example
```sh
# Install dependencies
npm i # or yarn
# Run tests
npm test
```

View File

@ -0,0 +1,7 @@
module.exports = {
env: {
test: {
presets: ['@babel/preset-env']
}
}
}

View File

@ -0,0 +1,36 @@
import { shallowMount } from '@vue/test-utils'
import Btn from './Btn'
const factory = () => shallowMount(Btn, {
propsData: {
label: 'click me!'
}
})
describe('Btn', () => {
test('mounts properly', () => {
const wrapper = factory()
expect(wrapper.isVueInstance()).toBeTruthy()
})
test('renders properly', () => {
const wrapper = factory()
expect(wrapper.html()).toMatchSnapshot()
})
test('calls handleClick on click', () => {
const wrapper = factory()
const handleClickMock = jest.fn()
wrapper.setMethods({
handleClick: handleClickMock
})
wrapper.find('button').trigger('click')
expect(handleClickMock).toHaveBeenCalled()
})
test('clicked is true after click', () => {
const wrapper = factory()
wrapper.find('button').trigger('click')
expect(wrapper.vm.clicked).toBe(true)
})
})

View File

@ -0,0 +1,25 @@
<template>
<button @click="handleClick">
{{ label }}
</button>
</template>
<script>
export default {
name: 'Button',
props: {
label: {
type: String,
required: true
}
},
data: () => ({
clicked: false
}),
methods: {
handleClick() {
this.clicked = true
}
}
}
</script>

View File

@ -0,0 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Btn renders properly 1`] = `
<button>
click me!
</button>
`;

View File

@ -0,0 +1,5 @@
<template>
<div>
<nuxt />
</div>
</template>

View File

@ -0,0 +1,3 @@
export default {
mode: 'universal'
}

View File

@ -0,0 +1,46 @@
{
"name": "example-jest-vtu",
"scripts": {
"dev": "nuxt",
"build": "nuxt build",
"start": "nuxt start",
"generate": "nuxt generate",
"test": "jest ."
},
"dependencies": {
"nuxt-edge": "latest"
},
"devDependencies": {
"@babel/core": "^7.1.2",
"@vue/test-utils": "^1.0.0-beta.25",
"babel-core": "^7.0.0-bridge.0",
"babel-jest": "^23.6.0",
"jest": "^23.6.0",
"jest-serializer-vue": "^2.0.2",
"vue-jest": "^2.6.0"
},
"jest": {
"moduleFileExtensions": [
"js",
"json",
"vue"
],
"watchman": false,
"moduleNameMapper": {
"^~/(.*)$": "<rootDir>/$1",
"^~~/(.*)$": "<rootDir>/$1"
},
"transform": {
"^.+\\.js$": "<rootDir>/node_modules/babel-jest",
".*\\.(vue)$": "<rootDir>/node_modules/vue-jest"
},
"snapshotSerializers": [
"<rootDir>/node_modules/jest-serializer-vue"
],
"collectCoverage": true,
"collectCoverageFrom": [
"<rootDir>/components/**/*.vue",
"<rootDir>/pages/*.vue"
]
}
}

View File

@ -0,0 +1,12 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`index renders properly 1`] = `
<section class="container">
<div>
<h1 class="title">
jest-vtu-example
</h1>
<btn-stub label="click me!"></btn-stub>
</div>
</section>
`;

View File

@ -0,0 +1,14 @@
import { shallowMount } from '@vue/test-utils'
import index from './index'
describe('index', () => {
test('mounts properly', () => {
const wrapper = shallowMount(index)
expect(wrapper.isVueInstance()).toBeTruthy()
})
test('renders properly', () => {
const wrapper = shallowMount(index)
expect(wrapper.html()).toMatchSnapshot()
})
})

View File

@ -0,0 +1,20 @@
<template>
<section class="container">
<div>
<h1 class="title">
jest-vtu-example
</h1>
<Btn label="click me!" />
</div>
</section>
</template>
<script>
import Btn from '~/components/Btn/Btn.vue'
export default {
components: {
Btn
}
}
</script>

View File

@ -6,7 +6,7 @@
meta: { meta: {
theme: 'dark' theme: 'dark'
} }
}</pre> }</pre> <!-- eslint-disable-line --> <!-- TODO remove disable lint after https://github.com/vuejs/eslint-plugin-vue/pull/659 -->
</div> </div>
</template> </template>

View File

@ -43,7 +43,8 @@
<v-card-text class="px-0"><slot /></v-card-text> <v-card-text class="px-0"><slot /></v-card-text>
</v-card> </v-card>
</v-flex> </v-flex>
</v-layout></v-container> </v-layout>
</v-container>
<v-container fluid fill-height> <v-container fluid fill-height>
<v-layout justify-center align-center> <v-layout justify-center align-center>

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,5 @@
node_modules
.nuxt
dist
*.log
.DS_Store

View File

@ -0,0 +1,23 @@
# Nuxt Tailwind CSS + Purgecss
> Demo of using Nuxt with Tailwind CSS and Purgecss to drastically reduce CSS size.
## Demo
[https://nuxt-tailwindcss-purgecss.surge.sh/](https://nuxt-tailwindcss-purgecss.surge.sh/)
![demo](.github/demo.png)
### Before and after stats
The before CSS bundle came out to `299kb`, where as after running it through Purgecss, it dropped to `3kb` (granted I'm only using around a dozen classes).
![tailwind default](.github/tailwind-default.png)
![tailwind purgecss](.github/tailwind-purgecss.png)
### Performance
And since the CSS remains inline (due to using Purgecss as a postcss plugin) it scores perfect on Google Page Speed Insights! (This is after running `nuxt generate` and deploying the `dist` folder)
![pagespeed mobile](.github/pagespeed-mobile.png)
![pagespeed desktop](.github/pagespeed-desktop.png)

View File

@ -0,0 +1,63 @@
/**
* This injects Tailwind's base styles, which is a combination of
* Normalize.css and some additional base styles.
*
* You can see the styles here:
* https://github.com/tailwindcss/tailwindcss/blob/master/css/preflight.css
*
* If using `postcss-import`, use this import instead:
*
* @import "tailwindcss/preflight";
*/
@tailwind preflight;
/**
* This injects any component classes registered by plugins.
*
* If using `postcss-import`, use this import instead:
*
* @import "tailwindcss/components";
*/
@tailwind components;
/**
* Here you would add any of your custom component classes; stuff that you'd
* want loaded *before* the utilities so that the utilities could still
* override them.
*
* Example:
*
* .btn { ... }
* .form-input { ... }
*
* Or if using a preprocessor or `postcss-import`:
*
* @import "components/buttons";
* @import "components/forms";
*/
/**
* This injects all of Tailwind's utility classes, generated based on your
* config file.
*
* If using `postcss-import`, use this import instead:
*
* @import "tailwindcss/utilities";
*/
@tailwind utilities;
/**
* Here you would add any custom utilities you need that don't come out of the
* box with Tailwind.
*
* Example :
*
* .bg-pattern-graph-paper { ... }
* .skew-45 { ... }
*
* Or if using a preprocessor or `postcss-import`:
*
* @import "utilities/background-patterns";
* @import "utilities/skew-transforms";
*/

View File

@ -0,0 +1,5 @@
<template>
<div>
<button class="bg-blue hover:bg-blue-dark text-white font-bold py-2 px-4 rounded">My Component Button</button>
</div>
</template>

View File

@ -0,0 +1,6 @@
<template>
<div class="p-10">
<h1 class="mb-6">Nuxt Tailwind CSS + Purgecss</h1>
<nuxt />
</div>
</template>

View File

@ -0,0 +1,16 @@
export default {
head: {
title: 'Nuxt Tailwind CSS + Purgecss',
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{
hid: 'description',
name: 'description',
content: 'A static site powered by Nuxt.js'
}
]
},
css: ['~/assets/css/tailwind.css']
}

View File

@ -0,0 +1,26 @@
{
"name": "tailwindcss-purgecss",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"dev": "nuxt",
"build": "nuxt build",
"start": "nuxt start",
"generate": "nuxt generate",
"deploy": "surge -p dist/ -d https://nuxt-tailwindcss-purgecss.surge.sh"
},
"dependencies": {
"nuxt": "^2.2.0"
},
"devDependencies": {
"@fullhuman/postcss-purgecss": "^1.1.0",
"autoprefixer": "^9.3.1",
"tailwindcss": "^0.6.6"
},
"prettier": {
"semi": false,
"singleQuote": true,
"trailingComma": "none"
}
}

View File

@ -0,0 +1,17 @@
<template>
<div>
<h2 class="mb-4 text-blue">Homepage</h2>
<p class="mb-4 bg-grey-light p-4 text-sm rounded leading-normal">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ut dolor placerat enim suscipit porttitor et sodales orci. In eget lorem a odio rhoncus finibus vel quis ex. Donec varius nisl ligula, vel finibus velit dignissim in.</p>
<my-component />
</div>
</template>
<script>
import MyComponent from '~/components/MyComponent'
export default {
components: {
MyComponent
}
}
</script>

View File

@ -0,0 +1,31 @@
const path = require('path')
const purgecss = require('@fullhuman/postcss-purgecss')
const tailwindConfig = path.join(__dirname, 'tailwind.js')
class TailwindExtractor {
static extract(content) {
return content.match(/[A-Za-z0-9-_:\/]+/g) || [] // eslint-disable-line no-useless-escape
}
}
module.exports = {
plugins: [
require('tailwindcss')(tailwindConfig),
require('autoprefixer'),
purgecss({
content: [
path.join(__dirname, './pages/**/*.vue'),
path.join(__dirname, './layouts/**/*.vue'),
path.join(__dirname, './components/**/*.vue')
],
extractors: [
{
extractor: TailwindExtractor,
extensions: ['vue', 'js', 'html']
}
],
whitelist: ['html', 'body', 'nuxt-progress']
})
]
}

View File

@ -0,0 +1,921 @@
/*
Tailwind - The Utility-First CSS Framework
A project by Adam Wathan (@adamwathan), Jonathan Reinink (@reinink),
David Hemphill (@davidhemphill) and Steve Schoger (@steveschoger).
Welcome to the Tailwind config file. This is where you can customize
Tailwind specifically for your project. Don't be intimidated by the
length of this file. It's really just a big JavaScript object and
we've done our very best to explain each section.
View the full documentation at https://tailwindcss.com.
|-------------------------------------------------------------------------------
| The default config
|-------------------------------------------------------------------------------
|
| This variable contains the default Tailwind config. You don't have
| to use it, but it can sometimes be helpful to have available. For
| example, you may choose to merge your custom configuration
| values with some of the Tailwind defaults.
|
*/
// let defaultConfig = require('tailwindcss/defaultConfig')()
/*
|-------------------------------------------------------------------------------
| Colors https://tailwindcss.com/docs/colors
|-------------------------------------------------------------------------------
|
| Here you can specify the colors used in your project. To get you started,
| we've provided a generous palette of great looking colors that are perfect
| for prototyping, but don't hesitate to change them for your project. You
| own these colors, nothing will break if you change everything about them.
|
| We've used literal color names ("red", "blue", etc.) for the default
| palette, but if you'd rather use functional names like "primary" and
| "secondary", or even a numeric scale like "100" and "200", go for it.
|
*/
const colors = {
'transparent': 'transparent',
'black': '#22292f',
'grey-darkest': '#3d4852',
'grey-darker': '#606f7b',
'grey-dark': '#8795a1',
'grey': '#b8c2cc',
'grey-light': '#dae1e7',
'grey-lighter': '#f1f5f8',
'grey-lightest': '#f8fafc',
'white': '#ffffff',
'red-darkest': '#3b0d0c',
'red-darker': '#621b18',
'red-dark': '#cc1f1a',
'red': '#e3342f',
'red-light': '#ef5753',
'red-lighter': '#f9acaa',
'red-lightest': '#fcebea',
'orange-darkest': '#462a16',
'orange-darker': '#613b1f',
'orange-dark': '#de751f',
'orange': '#f6993f',
'orange-light': '#faad63',
'orange-lighter': '#fcd9b6',
'orange-lightest': '#fff5eb',
'yellow-darkest': '#453411',
'yellow-darker': '#684f1d',
'yellow-dark': '#f2d024',
'yellow': '#ffed4a',
'yellow-light': '#fff382',
'yellow-lighter': '#fff9c2',
'yellow-lightest': '#fcfbeb',
'green-darkest': '#0f2f21',
'green-darker': '#1a4731',
'green-dark': '#1f9d55',
'green': '#38c172',
'green-light': '#51d88a',
'green-lighter': '#a2f5bf',
'green-lightest': '#e3fcec',
'teal-darkest': '#0d3331',
'teal-darker': '#20504f',
'teal-dark': '#38a89d',
'teal': '#4dc0b5',
'teal-light': '#64d5ca',
'teal-lighter': '#a0f0ed',
'teal-lightest': '#e8fffe',
'blue-darkest': '#12283a',
'blue-darker': '#1c3d5a',
'blue-dark': '#2779bd',
'blue': '#3490dc',
'blue-light': '#6cb2eb',
'blue-lighter': '#bcdefa',
'blue-lightest': '#eff8ff',
'indigo-darkest': '#191e38',
'indigo-darker': '#2f365f',
'indigo-dark': '#5661b3',
'indigo': '#6574cd',
'indigo-light': '#7886d7',
'indigo-lighter': '#b2b7ff',
'indigo-lightest': '#e6e8ff',
'purple-darkest': '#21183c',
'purple-darker': '#382b5f',
'purple-dark': '#794acf',
'purple': '#9561e2',
'purple-light': '#a779e9',
'purple-lighter': '#d6bbfc',
'purple-lightest': '#f3ebff',
'pink-darkest': '#451225',
'pink-darker': '#6f213f',
'pink-dark': '#eb5286',
'pink': '#f66d9b',
'pink-light': '#fa7ea8',
'pink-lighter': '#ffbbca',
'pink-lightest': '#ffebef'
}
module.exports = {
/*
|-----------------------------------------------------------------------------
| Colors https://tailwindcss.com/docs/colors
|-----------------------------------------------------------------------------
|
| The color palette defined above is also assigned to the "colors" key of
| your Tailwind config. This makes it easy to access them in your CSS
| using Tailwind's config helper. For example:
|
| .error { color: config('colors.red') }
|
*/
colors: colors,
/*
|-----------------------------------------------------------------------------
| Screens https://tailwindcss.com/docs/responsive-design
|-----------------------------------------------------------------------------
|
| Screens in Tailwind are translated to CSS media queries. They define the
| responsive breakpoints for your project. By default Tailwind takes a
| "mobile first" approach, where each screen size represents a minimum
| viewport width. Feel free to have as few or as many screens as you
| want, naming them in whatever way you'd prefer for your project.
|
| Tailwind also allows for more complex screen definitions, which can be
| useful in certain situations. Be sure to see the full responsive
| documentation for a complete list of options.
|
| Class name: .{screen}:{utility}
|
*/
screens: {
'sm': '576px',
'md': '768px',
'lg': '992px',
'xl': '1200px'
},
/*
|-----------------------------------------------------------------------------
| Fonts https://tailwindcss.com/docs/fonts
|-----------------------------------------------------------------------------
|
| Here is where you define your project's font stack, or font families.
| Keep in mind that Tailwind doesn't actually load any fonts for you.
| If you're using custom fonts you'll need to import them prior to
| defining them here.
|
| By default we provide a native font stack that works remarkably well on
| any device or OS you're using, since it just uses the default fonts
| provided by the platform.
|
| Class name: .font-{name}
|
*/
fonts: {
'sans': [
'system-ui',
'BlinkMacSystemFont',
'-apple-system',
'Segoe UI',
'Roboto',
'Oxygen',
'Ubuntu',
'Cantarell',
'Fira Sans',
'Droid Sans',
'Helvetica Neue',
'sans-serif'
],
'serif': [
'Constantia',
'Lucida Bright',
'Lucidabright',
'Lucida Serif',
'Lucida',
'DejaVu Serif',
'Bitstream Vera Serif',
'Liberation Serif',
'Georgia',
'serif'
],
'mono': [
'Menlo',
'Monaco',
'Consolas',
'Liberation Mono',
'Courier New',
'monospace'
]
},
/*
|-----------------------------------------------------------------------------
| Text sizes https://tailwindcss.com/docs/text-sizing
|-----------------------------------------------------------------------------
|
| Here is where you define your text sizes. Name these in whatever way
| makes the most sense to you. We use size names by default, but
| you're welcome to use a numeric scale or even something else
| entirely.
|
| By default Tailwind uses the "rem" unit type for most measurements.
| This allows you to set a root font size which all other sizes are
| then based on. That said, you are free to use whatever units you
| prefer, be it rems, ems, pixels or other.
|
| Class name: .text-{size}
|
*/
textSizes: {
'xs': '.75rem', // 12px
'sm': '.875rem', // 14px
'base': '1rem', // 16px
'lg': '1.125rem', // 18px
'xl': '1.25rem', // 20px
'2xl': '1.5rem', // 24px
'3xl': '1.875rem', // 30px
'4xl': '2.25rem', // 36px
'5xl': '3rem' // 48px
},
/*
|-----------------------------------------------------------------------------
| Font weights https://tailwindcss.com/docs/font-weight
|-----------------------------------------------------------------------------
|
| Here is where you define your font weights. We've provided a list of
| common font weight names with their respective numeric scale values
| to get you started. It's unlikely that your project will require
| all of these, so we recommend removing those you don't need.
|
| Class name: .font-{weight}
|
*/
fontWeights: {
'hairline': 100,
'thin': 200,
'light': 300,
'normal': 400,
'medium': 500,
'semibold': 600,
'bold': 700,
'extrabold': 800,
'black': 900
},
/*
|-----------------------------------------------------------------------------
| Leading (line height) https://tailwindcss.com/docs/line-height
|-----------------------------------------------------------------------------
|
| Here is where you define your line height values, or as we call
| them in Tailwind, leadings.
|
| Class name: .leading-{size}
|
*/
leading: {
'none': 1,
'tight': 1.25,
'normal': 1.5,
'loose': 2
},
/*
|-----------------------------------------------------------------------------
| Tracking (letter spacing) https://tailwindcss.com/docs/letter-spacing
|-----------------------------------------------------------------------------
|
| Here is where you define your letter spacing values, or as we call
| them in Tailwind, tracking.
|
| Class name: .tracking-{size}
|
*/
tracking: {
'tight': '-0.05em',
'normal': '0',
'wide': '0.05em'
},
/*
|-----------------------------------------------------------------------------
| Text colors https://tailwindcss.com/docs/text-color
|-----------------------------------------------------------------------------
|
| Here is where you define your text colors. By default these use the
| color palette we defined above, however you're welcome to set these
| independently if that makes sense for your project.
|
| Class name: .text-{color}
|
*/
textColors: colors,
/*
|-----------------------------------------------------------------------------
| Background colors https://tailwindcss.com/docs/background-color
|-----------------------------------------------------------------------------
|
| Here is where you define your background colors. By default these use
| the color palette we defined above, however you're welcome to set
| these independently if that makes sense for your project.
|
| Class name: .bg-{color}
|
*/
backgroundColors: colors,
/*
|-----------------------------------------------------------------------------
| Background sizes https://tailwindcss.com/docs/background-size
|-----------------------------------------------------------------------------
|
| Here is where you define your background sizes. We provide some common
| values that are useful in most projects, but feel free to add other sizes
| that are specific to your project here as well.
|
| Class name: .bg-{size}
|
*/
backgroundSize: {
'auto': 'auto',
'cover': 'cover',
'contain': 'contain'
},
/*
|-----------------------------------------------------------------------------
| Border widths https://tailwindcss.com/docs/border-width
|-----------------------------------------------------------------------------
|
| Here is where you define your border widths. Take note that border
| widths require a special "default" value set as well. This is the
| width that will be used when you do not specify a border width.
|
| Class name: .border{-side?}{-width?}
|
*/
borderWidths: {
default: '1px',
'0': '0',
'2': '2px',
'4': '4px',
'8': '8px'
},
/*
|-----------------------------------------------------------------------------
| Border colors https://tailwindcss.com/docs/border-color
|-----------------------------------------------------------------------------
|
| Here is where you define your border colors. By default these use the
| color palette we defined above, however you're welcome to set these
| independently if that makes sense for your project.
|
| Take note that border colors require a special "default" value set
| as well. This is the color that will be used when you do not
| specify a border color.
|
| Class name: .border-{color}
|
*/
borderColors: global.Object.assign({ default: colors['grey-light'] }, colors),
/*
|-----------------------------------------------------------------------------
| Border radius https://tailwindcss.com/docs/border-radius
|-----------------------------------------------------------------------------
|
| Here is where you define your border radius values. If a `default` radius
| is provided, it will be made available as the non-suffixed `.rounded`
| utility.
|
| If your scale includes a `0` value to reset already rounded corners, it's
| a good idea to put it first so other values are able to override it.
|
| Class name: .rounded{-side?}{-size?}
|
*/
borderRadius: {
'none': '0',
'sm': '.125rem',
default: '.25rem',
'lg': '.5rem',
'full': '9999px'
},
/*
|-----------------------------------------------------------------------------
| Width https://tailwindcss.com/docs/width
|-----------------------------------------------------------------------------
|
| Here is where you define your width utility sizes. These can be
| percentage based, pixels, rems, or any other units. By default
| we provide a sensible rem based numeric scale, a percentage
| based fraction scale, plus some other common use-cases. You
| can, of course, modify these values as needed.
|
|
| It's also worth mentioning that Tailwind automatically escapes
| invalid CSS class name characters, which allows you to have
| awesome classes like .w-2/3.
|
| Class name: .w-{size}
|
*/
width: {
'auto': 'auto',
'px': '1px',
'1': '0.25rem',
'2': '0.5rem',
'3': '0.75rem',
'4': '1rem',
'5': '1.25rem',
'6': '1.5rem',
'8': '2rem',
'10': '2.5rem',
'12': '3rem',
'16': '4rem',
'24': '6rem',
'32': '8rem',
'48': '12rem',
'64': '16rem',
'1/2': '50%',
'1/3': '33.33333%',
'2/3': '66.66667%',
'1/4': '25%',
'3/4': '75%',
'1/5': '20%',
'2/5': '40%',
'3/5': '60%',
'4/5': '80%',
'1/6': '16.66667%',
'5/6': '83.33333%',
'full': '100%',
'screen': '100vw'
},
/*
|-----------------------------------------------------------------------------
| Height https://tailwindcss.com/docs/height
|-----------------------------------------------------------------------------
|
| Here is where you define your height utility sizes. These can be
| percentage based, pixels, rems, or any other units. By default
| we provide a sensible rem based numeric scale plus some other
| common use-cases. You can, of course, modify these values as
| needed.
|
| Class name: .h-{size}
|
*/
height: {
'auto': 'auto',
'px': '1px',
'1': '0.25rem',
'2': '0.5rem',
'3': '0.75rem',
'4': '1rem',
'5': '1.25rem',
'6': '1.5rem',
'8': '2rem',
'10': '2.5rem',
'12': '3rem',
'16': '4rem',
'24': '6rem',
'32': '8rem',
'48': '12rem',
'64': '16rem',
'full': '100%',
'screen': '100vh'
},
/*
|-----------------------------------------------------------------------------
| Minimum width https://tailwindcss.com/docs/min-width
|-----------------------------------------------------------------------------
|
| Here is where you define your minimum width utility sizes. These can
| be percentage based, pixels, rems, or any other units. We provide a
| couple common use-cases by default. You can, of course, modify
| these values as needed.
|
| Class name: .min-w-{size}
|
*/
minWidth: {
'0': '0',
'full': '100%'
},
/*
|-----------------------------------------------------------------------------
| Minimum height https://tailwindcss.com/docs/min-height
|-----------------------------------------------------------------------------
|
| Here is where you define your minimum height utility sizes. These can
| be percentage based, pixels, rems, or any other units. We provide a
| few common use-cases by default. You can, of course, modify these
| values as needed.
|
| Class name: .min-h-{size}
|
*/
minHeight: {
'0': '0',
'full': '100%',
'screen': '100vh'
},
/*
|-----------------------------------------------------------------------------
| Maximum width https://tailwindcss.com/docs/max-width
|-----------------------------------------------------------------------------
|
| Here is where you define your maximum width utility sizes. These can
| be percentage based, pixels, rems, or any other units. By default
| we provide a sensible rem based scale and a "full width" size,
| which is basically a reset utility. You can, of course,
| modify these values as needed.
|
| Class name: .max-w-{size}
|
*/
maxWidth: {
'xs': '20rem',
'sm': '30rem',
'md': '40rem',
'lg': '50rem',
'xl': '60rem',
'2xl': '70rem',
'3xl': '80rem',
'4xl': '90rem',
'5xl': '100rem',
'full': '100%'
},
/*
|-----------------------------------------------------------------------------
| Maximum height https://tailwindcss.com/docs/max-height
|-----------------------------------------------------------------------------
|
| Here is where you define your maximum height utility sizes. These can
| be percentage based, pixels, rems, or any other units. We provide a
| couple common use-cases by default. You can, of course, modify
| these values as needed.
|
| Class name: .max-h-{size}
|
*/
maxHeight: {
'full': '100%',
'screen': '100vh'
},
/*
|-----------------------------------------------------------------------------
| Padding https://tailwindcss.com/docs/padding
|-----------------------------------------------------------------------------
|
| Here is where you define your padding utility sizes. These can be
| percentage based, pixels, rems, or any other units. By default we
| provide a sensible rem based numeric scale plus a couple other
| common use-cases like "1px". You can, of course, modify these
| values as needed.
|
| Class name: .p{side?}-{size}
|
*/
padding: {
'px': '1px',
'0': '0',
'1': '0.25rem',
'2': '0.5rem',
'3': '0.75rem',
'4': '1rem',
'5': '1.25rem',
'6': '1.5rem',
'8': '2rem',
'10': '2.5rem',
'12': '3rem',
'16': '4rem',
'20': '5rem',
'24': '6rem',
'32': '8rem'
},
/*
|-----------------------------------------------------------------------------
| Margin https://tailwindcss.com/docs/margin
|-----------------------------------------------------------------------------
|
| Here is where you define your margin utility sizes. These can be
| percentage based, pixels, rems, or any other units. By default we
| provide a sensible rem based numeric scale plus a couple other
| common use-cases like "1px". You can, of course, modify these
| values as needed.
|
| Class name: .m{side?}-{size}
|
*/
margin: {
'auto': 'auto',
'px': '1px',
'0': '0',
'1': '0.25rem',
'2': '0.5rem',
'3': '0.75rem',
'4': '1rem',
'5': '1.25rem',
'6': '1.5rem',
'8': '2rem',
'10': '2.5rem',
'12': '3rem',
'16': '4rem',
'20': '5rem',
'24': '6rem',
'32': '8rem'
},
/*
|-----------------------------------------------------------------------------
| Negative margin https://tailwindcss.com/docs/negative-margin
|-----------------------------------------------------------------------------
|
| Here is where you define your negative margin utility sizes. These can
| be percentage based, pixels, rems, or any other units. By default we
| provide matching values to the padding scale since these utilities
| generally get used together. You can, of course, modify these
| values as needed.
|
| Class name: .-m{side?}-{size}
|
*/
negativeMargin: {
'px': '1px',
'0': '0',
'1': '0.25rem',
'2': '0.5rem',
'3': '0.75rem',
'4': '1rem',
'5': '1.25rem',
'6': '1.5rem',
'8': '2rem',
'10': '2.5rem',
'12': '3rem',
'16': '4rem',
'20': '5rem',
'24': '6rem',
'32': '8rem'
},
/*
|-----------------------------------------------------------------------------
| Shadows https://tailwindcss.com/docs/shadows
|-----------------------------------------------------------------------------
|
| Here is where you define your shadow utilities. As you can see from
| the defaults we provide, it's possible to apply multiple shadows
| per utility using comma separation.
|
| If a `default` shadow is provided, it will be made available as the non-
| suffixed `.shadow` utility.
|
| Class name: .shadow-{size?}
|
*/
shadows: {
default: '0 2px 4px 0 rgba(0,0,0,0.10)',
'md': '0 4px 8px 0 rgba(0,0,0,0.12), 0 2px 4px 0 rgba(0,0,0,0.08)',
'lg': '0 15px 30px 0 rgba(0,0,0,0.11), 0 5px 15px 0 rgba(0,0,0,0.08)',
'inner': 'inset 0 2px 4px 0 rgba(0,0,0,0.06)',
'outline': '0 0 0 3px rgba(52,144,220,0.5)',
'none': 'none'
},
/*
|-----------------------------------------------------------------------------
| Z-index https://tailwindcss.com/docs/z-index
|-----------------------------------------------------------------------------
|
| Here is where you define your z-index utility values. By default we
| provide a sensible numeric scale. You can, of course, modify these
| values as needed.
|
| Class name: .z-{index}
|
*/
zIndex: {
'auto': 'auto',
'0': 0,
'10': 10,
'20': 20,
'30': 30,
'40': 40,
'50': 50
},
/*
|-----------------------------------------------------------------------------
| Opacity https://tailwindcss.com/docs/opacity
|-----------------------------------------------------------------------------
|
| Here is where you define your opacity utility values. By default we
| provide a sensible numeric scale. You can, of course, modify these
| values as needed.
|
| Class name: .opacity-{name}
|
*/
opacity: {
'0': '0',
'25': '.25',
'50': '.5',
'75': '.75',
'100': '1'
},
/*
|-----------------------------------------------------------------------------
| SVG fill https://tailwindcss.com/docs/svg
|-----------------------------------------------------------------------------
|
| Here is where you define your SVG fill colors. By default we just provide
| `fill-current` which sets the fill to the current text color. This lets you
| specify a fill color using existing text color utilities and helps keep the
| generated CSS file size down.
|
| Class name: .fill-{name}
|
*/
svgFill: {
'current': 'currentColor'
},
/*
|-----------------------------------------------------------------------------
| SVG stroke https://tailwindcss.com/docs/svg
|-----------------------------------------------------------------------------
|
| Here is where you define your SVG stroke colors. By default we just provide
| `stroke-current` which sets the stroke to the current text color. This lets
| you specify a stroke color using existing text color utilities and helps
| keep the generated CSS file size down.
|
| Class name: .stroke-{name}
|
*/
svgStroke: {
'current': 'currentColor'
},
/*
|-----------------------------------------------------------------------------
| Modules https://tailwindcss.com/docs/configuration#modules
|-----------------------------------------------------------------------------
|
| Here is where you control which modules are generated and what variants are
| generated for each of those modules.
|
| Currently supported variants:
| - responsive
| - hover
| - focus
| - active
| - group-hover
|
| To disable a module completely, use `false` instead of an array.
|
*/
modules: {
appearance: ['responsive'],
backgroundAttachment: ['responsive'],
backgroundColors: ['responsive', 'hover', 'focus'],
backgroundPosition: ['responsive'],
backgroundRepeat: ['responsive'],
backgroundSize: ['responsive'],
borderCollapse: [],
borderColors: ['responsive', 'hover', 'focus'],
borderRadius: ['responsive'],
borderStyle: ['responsive'],
borderWidths: ['responsive'],
cursor: ['responsive'],
display: ['responsive'],
flexbox: ['responsive'],
float: ['responsive'],
fonts: ['responsive'],
fontWeights: ['responsive', 'hover', 'focus'],
height: ['responsive'],
leading: ['responsive'],
lists: ['responsive'],
margin: ['responsive'],
maxHeight: ['responsive'],
maxWidth: ['responsive'],
minHeight: ['responsive'],
minWidth: ['responsive'],
negativeMargin: ['responsive'],
opacity: ['responsive'],
outline: ['focus'],
overflow: ['responsive'],
padding: ['responsive'],
pointerEvents: ['responsive'],
position: ['responsive'],
resize: ['responsive'],
shadows: ['responsive', 'hover', 'focus'],
svgFill: [],
svgStroke: [],
tableLayout: ['responsive'],
textAlign: ['responsive'],
textColors: ['responsive', 'hover', 'focus'],
textSizes: ['responsive'],
textStyle: ['responsive', 'hover', 'focus'],
tracking: ['responsive'],
userSelect: ['responsive'],
verticalAlign: ['responsive'],
visibility: ['responsive'],
whitespace: ['responsive'],
width: ['responsive'],
zIndex: ['responsive']
},
/*
|-----------------------------------------------------------------------------
| Plugins https://tailwindcss.com/docs/plugins
|-----------------------------------------------------------------------------
|
| Here is where you can register any plugins you'd like to use in your
| project. Tailwind's built-in `container` plugin is enabled by default to
| give you a Bootstrap-style responsive container component out of the box.
|
| Be sure to view the complete plugin documentation to learn more about how
| the plugin system works.
|
*/
plugins: [
require('tailwindcss/plugins/container')({
// center: true,
// padding: '1rem',
})
],
/*
|-----------------------------------------------------------------------------
| Advanced Options https://tailwindcss.com/docs/configuration#options
|-----------------------------------------------------------------------------
|
| Here is where you can tweak advanced configuration options. We recommend
| leaving these options alone unless you absolutely need to change them.
|
*/
options: {
prefix: '',
important: false,
separator: ':'
}
}

View File

@ -15,20 +15,20 @@ test.before(async () => {
} }
nuxt = new Nuxt(config) nuxt = new Nuxt(config)
await new Builder(nuxt).build() await new Builder(nuxt).build()
await nuxt.listen(4000, 'localhost') await nuxt.server.listen(4000, 'localhost')
}, 30000) }, 30000)
// Example of testing only generated html // Example of testing only generated html
test('Route / exits and render HTML', async (t) => { test('Route / exits and render HTML', async (t) => {
const context = {} const context = {}
const { html } = await nuxt.renderRoute('/', context) const { html } = await nuxt.server.renderRoute('/', context)
t.true(html.includes('<h1 class="red">Hello world!</h1>')) t.true(html.includes('<h1 class="red">Hello world!</h1>'))
}) })
// Example of testing via dom checking // Example of testing via dom checking
test('Route / exits and render HTML with CSS applied', async (t) => { test('Route / exits and render HTML with CSS applied', async (t) => {
const context = {} const context = {}
const { html } = await nuxt.renderRoute('/', context) const { html } = await nuxt.server.renderRoute('/', context)
const { window } = new JSDOM(html).window const { window } = new JSDOM(html).window
const element = window.document.querySelector('.red') const element = window.document.querySelector('.red')
t.not(element, null) t.not(element, null)

View File

@ -5,8 +5,8 @@ const server = http.createServer(this.nuxt.renderer.app)
const io = socketIO(server) const io = socketIO(server)
export default function () { export default function () {
// overwrite nuxt.listen() // overwrite nuxt.server.listen()
this.nuxt.listen = (port, host) => new Promise(resolve => server.listen(port || 3000, host || 'localhost', resolve)) this.nuxt.server.listen = (port, host) => new Promise(resolve => server.listen(port || 3000, host || 'localhost', resolve))
// close this server on 'close' event // close this server on 'close' event
this.nuxt.hook('close', () => new Promise(server.close)) this.nuxt.hook('close', () => new Promise(server.close))

View File

@ -1,3 +1,5 @@
import VuetifyLoaderPlugin from 'vuetify-loader/lib/plugin'
export default { export default {
/* /*
** Head elements ** Head elements
@ -14,7 +16,9 @@ export default {
}, },
build: { build: {
extractCSS: true plugins: [new VuetifyLoaderPlugin()],
extractCSS: true,
transpile: ['vuetify/lib']
}, },
/* /*
** Load Vuetify into the app ** Load Vuetify into the app

View File

@ -2,7 +2,8 @@
"name": "example-with-vuetify", "name": "example-with-vuetify",
"dependencies": { "dependencies": {
"nuxt-edge": "latest", "nuxt-edge": "latest",
"vuetify": "latest" "vuetify": "latest",
"vuetify-loader": "latest"
}, },
"scripts": { "scripts": {
"dev": "nuxt", "dev": "nuxt",

View File

@ -1,5 +1,5 @@
import Vue from 'vue' import Vue from 'vue'
import Vuetify from 'vuetify' import Vuetify from 'vuetify/lib'
import colors from 'vuetify/es5/util/colors' import colors from 'vuetify/es5/util/colors'
// You can also specify those components you are going to use for "a la carte" build: // You can also specify those components you are going to use for "a la carte" build:

View File

@ -1,18 +0,0 @@
/*!
* Nuxt.js
* (c) 2016-2018 Chopin Brothers
* Core maintainers: Pooya Parsa (@pi0) - Clark Du (@clarkdo)
* Released under the MIT License.
*/
const fs = require('fs')
const path = require('path')
if (fs.existsSync(path.resolve(__dirname, '.babelrc'))) {
// Use esm version when using linked repository to prevent builds
const requireModule = require('esm')(module, {})
module.exports = requireModule('./lib/index.js').default
} else {
// Use production bundle by default
module.exports = require('./dist/nuxt.js')
}

View File

@ -1,17 +1,48 @@
module.exports = { module.exports = {
testEnvironment: 'node', testEnvironment: 'node',
coverageDirectory: './coverage/',
collectCoverageFrom: [
'lib/!(app)/**',
'!lib/builder/webpack/plugins/vue/**'
],
setupTestFrameworkScriptFile: './test/utils/setup',
testPathIgnorePatterns: ['test/fixtures/.*/.*?/'],
transformIgnorePatterns: ['<rootDir>/node_modules/'],
moduleFileExtensions: ['js', 'mjs', 'json'],
expand: true, expand: true,
forceExit: true
forceExit: true,
// https://github.com/facebook/jest/pull/6747 fix warning here // https://github.com/facebook/jest/pull/6747 fix warning here
// But its performance overhead is pretty bad (30+%). // But its performance overhead is pretty bad (30+%).
// detectOpenHandles: true // detectOpenHandles: true
setupTestFrameworkScriptFile: './test/utils/setup',
coverageDirectory: './coverage',
collectCoverageFrom: [
'**/packages/*/src/**/*.js'
],
coveragePathIgnorePatterns: [
'node_modules/(?!(@nuxt|nuxt))',
'packages/webpack/src/config/plugins/vue'
],
testPathIgnorePatterns: [
'node_modules/(?!(@nuxt|nuxt))',
'test/fixtures/.*/.*?/',
'examples/.*'
],
transformIgnorePatterns: [
'node_modules/(?!(@nuxt|nuxt))'
],
transform: {
'^.+\\.js$': 'babel-jest',
'.*\\.(vue)$': 'vue-jest'
},
moduleFileExtensions: [
'js',
'json'
],
reporters: [
'default'
].concat(process.env.JEST_JUNIT_OUTPUT ? ['jest-junit'] : [])
} }

27
lerna.json Normal file
View File

@ -0,0 +1,27 @@
{
"version": "independent",
"npmClient": "yarn",
"useWorkspaces": true,
"conventionalCommits": true,
"yes": true,
"noPush": true,
"gitTagVersion": false,
"packages": [
"packages/*",
"distributions/*"
],
"command": {
"publish": {
"npmClient": "npm"
}
},
"changelog": {
"labels": {
"feat": "New Feature",
"fix": "Bug Fix",
"docs": "Documentation",
"perf": "Performance",
"refactor": "Code Refactoring"
}
}
}

View File

@ -1,112 +0,0 @@
<template>
<div class="nuxt-progress" :style="{
'width': percent + '%',
'height': height,
'background-color': canSuccess ? color : failedColor,
'opacity': show ? 1 : 0
}"></div>
</template>
<script>
import Vue from 'vue'
export default {
name: 'nuxt-loading',
data () {
return {
percent: 0,
show: false,
canSuccess: true,
throttle: <%= loading.throttle %>,
duration: <%= loading.duration %>,
height: '<%= loading.height %>',
color: '<%= loading.color %>',
failedColor: '<%= loading.failedColor %>',
}
},
methods: {
start () {
this.canSuccess = true
if (this._throttle) {
clearTimeout(this._throttle)
}
if (this._timer) {
clearInterval(this._timer)
this._timer = null
this.percent = 0
}
this._throttle = setTimeout(() => {
this.show = true
this._cut = 10000 / Math.floor(this.duration)
this._timer = setInterval(() => {
this.increase(this._cut * Math.random())
if (this.percent > 95) {
this.finish()
}
}, 100)
}, this.throttle)
return this
},
set (num) {
this.show = true
this.canSuccess = true
this.percent = Math.floor(num)
return this
},
get () {
return Math.floor(this.percent)
},
increase (num) {
this.percent = this.percent + Math.floor(num)
return this
},
decrease (num) {
this.percent = this.percent - Math.floor(num)
return this
},
finish () {
this.percent = 100
this.hide()
return this
},
pause () {
clearInterval(this._timer)
return this
},
hide () {
clearInterval(this._timer)
this._timer = null
clearTimeout(this._throttle)
this._throttle = null
setTimeout(() => {
this.show = false
Vue.nextTick(() => {
setTimeout(() => {
this.percent = 0
}, 200)
})
}, 500)
return this
},
fail () {
this.canSuccess = false
return this
}
}
}
</script>
<style>
.nuxt-progress {
position: fixed;
top: 0px;
left: <%= loading.rtl === true ? 'auto' : '0px' %>;
right: 0px;
height: 2px;
width: 0%;
transition: width 0.2s, opacity 0.4s;
opacity: 1;
background-color: #efc14e;
z-index: 999999;
}
</style>

View File

@ -1,7 +0,0 @@
import Builder from './builder'
import Generator from './generator'
export default {
Builder,
Generator
}

View File

@ -1,16 +0,0 @@
export default class StatsPlugin {
constructor(statsOptions) {
this.statsOptions = statsOptions
}
apply(compiler) {
compiler.hooks.done.tap('stats-plugin', (stats) => {
process.stdout.write(
'\n' +
stats.toString(this.statsOptions) +
'\n'
)
})
}
}

View File

@ -1 +0,0 @@
Temporary fork until vuejs/vue#7839 arrives.

View File

@ -1,60 +0,0 @@
import path from 'path'
import { warmup } from 'thread-loader'
// https://github.com/webpack-contrib/thread-loader
// https://github.com/webpack-contrib/cache-loader
export default class PerfLoader {
constructor(options) {
this.options = options
this.warmup = warmup
this.workerPools = {
js: {
name: 'js',
poolTimeout: this.options.dev ? Infinity : 2000
},
css: {
name: 'css',
poolTimeout: this.options.dev ? Infinity : 2000
}
}
}
warmupAll() {
this.warmup(this.workerPools.js, ['babel-loader', '@babel/preset-env'])
this.warmup(this.workerPools.css, ['css-loader'])
}
pool(poolName, _loaders) {
const loaders = [].concat(_loaders)
if (this.options.build.parallel) {
const pool = this.workerPools[poolName]
if (pool) {
loaders.unshift({
loader: 'thread-loader',
options: pool
})
}
}
if (this.options.build.cache) {
loaders.unshift({
loader: 'cache-loader',
options: {
cacheDirectory: path.resolve('node_modules/.cache/cache-loader')
}
})
}
return loaders
}
poolOneOf(poolName, oneOfRules) {
return oneOfRules.map(rule => Object.assign({}, rule, {
use: this.pool(poolName, rule.use)
}))
}
}

View File

@ -1,281 +0,0 @@
import path from 'path'
import fs from 'fs'
import _ from 'lodash'
import env from 'std-env'
const nuxtDir = fs.existsSync(path.resolve(__dirname, '..', 'package.json'))
? path.resolve(__dirname, '..') // dist
: path.resolve(__dirname, '..', '..') // src
export default {
// Information about running environment
dev: Boolean(env.dev),
debug: undefined, // = dev
// Mode
mode: 'universal',
// Global name
globalName: `nuxt`,
globals: {
id: globalName => `__${globalName}`,
nuxt: globalName => `$${globalName}`,
context: globalName => `__${globalName.toUpperCase()}__`,
pluginPrefix: globalName => globalName,
readyCallback: globalName => `on${_.capitalize(globalName)}Ready`,
loadedCallback: globalName => `_on${_.capitalize(globalName)}Loaded`
},
// Server options
server: {
https: false,
port: process.env.NUXT_PORT ||
process.env.PORT ||
process.env.npm_package_config_nuxt_port,
host: process.env.NUXT_HOST ||
process.env.HOST ||
process.env.npm_package_config_nuxt_host
},
// Dirs
srcDir: undefined,
buildDir: '.nuxt',
nuxtDir,
nuxtAppDir: path.resolve(nuxtDir, 'lib', 'app'),
modulesDir: ['node_modules'], // ~> relative to options.rootDir
// Ignore
ignorePrefix: '-',
ignore: [
'**/*.test.*',
'**/*.spec.*'
],
extensions: [],
build: {
quiet: Boolean(env.ci || env.test),
analyze: false,
profile: process.argv.includes('--profile'),
extractCSS: false,
cssSourceMap: undefined,
ssr: undefined,
parallel: false,
cache: false,
publicPath: '/_nuxt/',
filenames: {
// { isDev, isClient, isServer }
app: ({ isDev }) => isDev ? '[name].js' : '[chunkhash].js',
chunk: ({ isDev }) => isDev ? '[name].js' : '[chunkhash].js',
css: ({ isDev }) => isDev ? '[name].css' : '[contenthash].css',
img: ({ isDev }) => isDev ? '[path][name].[ext]' : 'img/[hash:7].[ext]',
font: ({ isDev }) => isDev ? '[path][name].[ext]' : 'fonts/[hash:7].[ext]',
video: ({ isDev }) => isDev ? '[path][name].[ext]' : 'videos/[hash:7].[ext]'
},
loaders: {
file: {},
fontUrl: { limit: 1000 },
imgUrl: { limit: 1000 },
pugPlain: {},
vue: {
transformAssetUrls: {
video: 'src',
source: 'src',
object: 'src',
embed: 'src'
}
},
css: {},
cssModules: {
localIdentName: '[local]_[hash:base64:5]'
},
less: {},
sass: {
indentedSyntax: true
},
scss: {},
stylus: {},
vueStyle: {}
},
styleResources: {},
plugins: [],
terser: {},
optimizeCSS: undefined,
optimization: {
runtimeChunk: 'single',
minimize: undefined,
minimizer: undefined,
splitChunks: {
chunks: 'all',
automaticNameDelimiter: '.',
name: undefined,
cacheGroups: {}
}
},
splitChunks: {
layouts: false,
pages: true,
commons: true
},
babel: {
babelrc: false,
cacheDirectory: undefined
},
transpile: [], // Name of NPM packages to be transpiled
postcss: {
preset: {
// https://cssdb.org/#staging-process
stage: 2
}
},
html: {
minify: {
collapseBooleanAttributes: true,
decodeEntities: true,
minifyCSS: true,
minifyJS: true,
processConditionalComments: true,
removeEmptyAttributes: true,
removeRedundantAttributes: true,
trimCustomFragments: true,
useShortDoctype: true
}
},
templates: [],
watch: [],
devMiddleware: {},
hotMiddleware: {},
stats: {
chunks: false,
children: false,
modules: false,
colors: true,
warnings: true,
errors: true,
excludeAssets: [
/.map$/,
/index\..+\.html$/,
/vue-ssr-client-manifest.json/
]
}
},
generate: {
dir: 'dist',
routes: [],
concurrency: 500,
interval: 0,
subFolders: true,
fallback: '200.html'
},
env: {},
head: {
meta: [],
link: [],
style: [],
script: []
},
plugins: [],
css: [],
modules: [],
layouts: {},
serverMiddleware: [],
ErrorPage: null,
loading: {
color: 'black',
failedColor: 'red',
height: '2px',
throttle: 200,
duration: 5000,
rtl: false
},
loadingIndicator: 'default',
transition: {
name: 'page',
mode: 'out-in',
appear: false,
appearClass: 'appear',
appearActiveClass: 'appear-active',
appearToClass: 'appear-to'
},
layoutTransition: {
name: 'layout',
mode: 'out-in'
},
dir: {
assets: 'assets',
layouts: 'layouts',
middleware: 'middleware',
pages: 'pages',
static: 'static',
store: 'store'
},
vue: {
config: {
silent: undefined, // = !dev
performance: undefined // = dev
}
},
router: {
mode: 'history',
base: '/',
routes: [],
middleware: [],
linkActiveClass: 'nuxt-link-active',
linkExactActiveClass: 'nuxt-link-exact-active',
extendRoutes: null,
scrollBehavior: null,
parseQuery: false,
stringifyQuery: false,
fallback: false
},
render: {
bundleRenderer: {
shouldPrefetch: () => false
},
resourceHints: true,
ssr: undefined,
http2: {
push: false,
shouldPush: null
},
static: {
prefix: true
},
compressor: {
threshold: 0
},
etag: {
weak: false
},
csp: false,
dist: {
// Don't serve index.html template
index: false,
// 1 year in production
maxAge: '1y'
}
},
// User-defined changes
watch: [],
watchers: {
webpack: {},
chokidar: {
ignoreInitial: true
}
},
editor: undefined,
hooks: null,
messages: {
loading: 'Loading...',
error_404: 'This page could not be found',
server_error: 'Server error',
nuxtjs: 'Nuxt.js',
back_to_home: 'Back to the home page',
server_error_details:
'An error occurred in the application and your page could not be served. If you are the application owner, check your logs for details.',
client_error: 'Error',
client_error_details:
'An error occurred while rendering the page. Check developer tools console for details.'
}
}

View File

@ -1,9 +0,0 @@
import Module from './module'
import Nuxt from './nuxt'
import Renderer from './renderer'
export default {
Nuxt,
Module,
Renderer
}

View File

@ -1,298 +0,0 @@
import Module from 'module'
import { resolve, join } from 'path'
import https from 'https'
import enableDestroy from 'server-destroy'
import _ from 'lodash'
import fs from 'fs-extra'
import consola from 'consola'
import chalk from 'chalk'
import esm from 'esm'
import ip from 'ip'
import Options from '../common/options'
import { sequence, startsWithRootAlias, startsWithSrcAlias } from '../common/utils'
import packageJSON from '../../package.json'
import ModuleContainer from './module'
import Renderer from './renderer'
export default class Nuxt {
constructor(options = {}) {
this.options = Options.from(options)
this.readyMessage = null
this.initialized = false
// Hooks
this._hooks = {}
this.hook = this.hook.bind(this)
// Create instance of core components
this.moduleContainer = new ModuleContainer(this)
this.renderer = new Renderer(this)
// Backward compatibility
this.render = this.renderer.app
this.renderRoute = this.renderer.renderRoute.bind(this.renderer)
this.renderAndGetWindow = this.renderer.renderAndGetWindow.bind(
this.renderer
)
this.resolvePath = this.resolvePath.bind(this)
this.resolveAlias = this.resolveAlias.bind(this)
// ESM Loader
this.esm = esm(module, {})
this._ready = this.ready().catch((err) => {
consola.fatal(err)
})
}
static get version() {
return packageJSON.version
}
async ready() {
if (this._ready) {
return this._ready
}
// Add hooks
if (_.isPlainObject(this.options.hooks)) {
this.addHooks(this.options.hooks)
} else if (typeof this.options.hooks === 'function') {
this.options.hooks(this.hook)
}
// Await for modules
await this.moduleContainer.ready()
// Await for renderer to be ready
await this.renderer.ready()
this.initialized = true
// Call ready hook
await this.callHook('ready', this)
return this
}
hook(name, fn) {
if (!name || typeof fn !== 'function') {
return
}
if (name === 'render:context') {
name = 'render:routeContext'
consola.warn('render:context hook has been deprecated, please use render:routeContext')
}
this._hooks[name] = this._hooks[name] || []
this._hooks[name].push(fn)
}
async callHook(name, ...args) {
if (!this._hooks[name]) {
return
}
consola.debug(`Call ${name} hooks (${this._hooks[name].length})`)
try {
await sequence(this._hooks[name], fn => fn(...args))
} catch (err) {
consola.error(err)
this.callHook('error', err)
}
}
clearHook(name) {
if (name) {
delete this._hooks[name]
}
}
flatHooks(configHooks, hooks = {}, parentName) {
Object.keys(configHooks).forEach((key) => {
const subHook = configHooks[key]
const name = parentName ? `${parentName}:${key}` : key
if (typeof subHook === 'object' && subHook !== null) {
this.flatHooks(subHook, hooks, name)
} else {
hooks[name] = subHook
}
})
return hooks
}
addHooks(configHooks) {
const hooks = this.flatHooks(configHooks)
Object.keys(hooks).filter(Boolean).forEach((key) => {
[].concat(hooks[key]).forEach(h => this.hook(key, h))
})
}
showReady(clear = true) {
if (!this.readyMessage) {
return
}
consola.ready({
message: this.readyMessage,
badge: true,
clear
})
this.readyMessage = null
}
listen(port, host, socket) {
return this.ready().then(() => new Promise((resolve, reject) => {
if (!socket && typeof this.options.server.socket === 'string') {
socket = this.options.server.socket
}
const args = { exclusive: false }
if (socket) {
args.path = socket
} else {
args.port = port || this.options.server.port
args.host = host || this.options.server.host
}
let appServer
const isHttps = Boolean(this.options.server.https)
if (isHttps) {
let httpsOptions
if (this.options.server.https === true) {
httpsOptions = {}
} else {
httpsOptions = this.options.server.https
}
appServer = https.createServer(httpsOptions, this.renderer.app)
} else {
appServer = this.renderer.app
}
const server = appServer.listen(
args,
(err) => {
/* istanbul ignore if */
if (err) {
return reject(err)
}
let listenURL
if (!socket) {
({ address: host, port } = server.address())
if (host === '127.0.0.1') {
host = 'localhost'
} else if (host === '0.0.0.0') {
host = ip.address()
}
listenURL = chalk.underline.blue(`http${isHttps ? 's' : ''}://${host}:${port}`)
this.readyMessage = `Listening on ${listenURL}`
} else {
listenURL = chalk.underline.blue(`unix+http://${socket}`)
this.readyMessage = `Listening on ${listenURL}`
}
// Close server on nuxt close
this.hook(
'close',
() =>
new Promise((resolve, reject) => {
// Destroy server by forcing every connection to be closed
server.listening && server.destroy((err) => {
consola.debug('server closed')
/* istanbul ignore if */
if (err) {
return reject(err)
}
resolve()
})
})
)
if (socket) {
this.callHook('listen', server, { path: socket }).then(resolve)
} else {
this.callHook('listen', server, { port, host }).then(resolve)
}
}
)
// Add server.destroy(cb) method
enableDestroy(server)
}))
}
resolveModule(path) {
try {
const resolvedPath = Module._resolveFilename(path, {
paths: this.options.modulesDir
})
return resolvedPath
} catch (error) {
if (error.code === 'MODULE_NOT_FOUND') {
return null
} else {
throw error
}
}
}
resolveAlias(path) {
const modulePath = this.resolveModule(path)
// Try to resolve it as if it were a regular node_module
// Package first. Fixes issue with @<org> scoped packages
if (modulePath != null) {
return modulePath
}
if (startsWithRootAlias(path)) {
return join(this.options.rootDir, path.substr(2))
}
if (startsWithSrcAlias(path)) {
return join(this.options.srcDir, path.substr(1))
}
return resolve(this.options.srcDir, path)
}
resolvePath(path) {
const _path = this.resolveAlias(path)
if (fs.existsSync(_path)) {
return _path
}
for (const ext of this.options.extensions) {
if (fs.existsSync(_path + '.' + ext)) {
return _path + '.' + ext
}
}
throw new Error(`Cannot resolve "${path}" from "${_path}"`)
}
requireModule(_path, opts = {}) {
const _resolvedPath = this.resolvePath(_path)
const m = opts.esm === false ? require(_resolvedPath) : this.esm(_resolvedPath)
return (m && m.default) || m
}
async close(callback) {
await this.callHook('close', this)
/* istanbul ignore if */
if (typeof callback === 'function') {
await callback()
}
}
}

View File

@ -1,482 +0,0 @@
import path from 'path'
import crypto from 'crypto'
import devalue from '@nuxtjs/devalue'
import serveStatic from 'serve-static'
import _ from 'lodash'
import fs from 'fs-extra'
import { createBundleRenderer } from 'vue-server-renderer'
import connect from 'connect'
import launchMiddleware from 'launch-editor-middleware'
import consola from 'consola'
import { isUrl, timeout, waitFor, determineGlobals } from '../common/utils'
import defaults from '../common/nuxt.config'
import MetaRenderer from './meta'
import errorMiddleware from './middleware/error'
import nuxtMiddleware from './middleware/nuxt'
let jsdom = null
export default class Renderer {
constructor(nuxt) {
this.nuxt = nuxt
this.options = nuxt.options
this.globals = determineGlobals(nuxt.options.globalName, nuxt.options.globals)
// Will be set by createRenderer
this.bundleRenderer = null
this.metaRenderer = null
// Will be available on dev
this.webpackDevMiddleware = null
this.webpackHotMiddleware = null
// Create new connect instance
this.app = connect()
// Renderer runtime resources
this.resources = {
clientManifest: null,
serverBundle: null,
ssrTemplate: null,
spaTemplate: null,
errorTemplate: parseTemplate('Nuxt.js Internal Server Error')
}
}
async ready() {
await this.nuxt.callHook('render:before', this, this.options.render)
// Setup nuxt middleware
await this.setupMiddleware()
// Production: Load SSR resources from fs
if (!this.options.dev) {
await this.loadResources()
}
// Call done hook
await this.nuxt.callHook('render:done', this)
}
async loadResources(_fs = fs) {
const distPath = path.resolve(this.options.buildDir, 'dist', 'server')
const updated = []
resourceMap.forEach(({ key, fileName, transform }) => {
const rawKey = '$$' + key
const _path = path.join(distPath, fileName)
if (!_fs.existsSync(_path)) {
return // Resource not exists
}
const rawData = _fs.readFileSync(_path, 'utf8')
if (!rawData || rawData === this.resources[rawKey]) {
return // No changes
}
this.resources[rawKey] = rawData
const data = transform(rawData)
/* istanbul ignore if */
if (!data) {
return // Invalid data ?
}
this.resources[key] = data
updated.push(key)
})
// Reload error template
const errorTemplatePath = path.resolve(this.options.buildDir, 'views/error.html')
if (fs.existsSync(errorTemplatePath)) {
this.resources.errorTemplate = parseTemplate(
fs.readFileSync(errorTemplatePath, 'utf8')
)
}
// Load loading template
const loadingHTMLPath = path.resolve(this.options.buildDir, 'loading.html')
if (fs.existsSync(loadingHTMLPath)) {
this.resources.loadingHTML = fs.readFileSync(loadingHTMLPath, 'utf8')
this.resources.loadingHTML = this.resources.loadingHTML
.replace(/\r|\n|[\t\s]{3,}/g, '')
} else {
this.resources.loadingHTML = ''
}
// Call resourcesLoaded plugin
await this.nuxt.callHook('render:resourcesLoaded', this.resources)
if (updated.length > 0) {
this.createRenderer()
}
}
get noSSR() {
return this.options.render.ssr === false
}
get isReady() {
if (this.noSSR) {
return Boolean(this.resources.spaTemplate)
}
return Boolean(this.bundleRenderer && this.resources.ssrTemplate)
}
get isResourcesAvailable() {
// Required for both
/* istanbul ignore if */
if (!this.resources.clientManifest) {
return false
}
// Required for SPA rendering
if (this.noSSR) {
return Boolean(this.resources.spaTemplate)
}
// Required for bundle renderer
return Boolean(this.resources.ssrTemplate && this.resources.serverBundle)
}
createRenderer() {
// Ensure resources are available
if (!this.isResourcesAvailable) {
return
}
// Create Meta Renderer
this.metaRenderer = new MetaRenderer(this.nuxt, this)
// Skip following steps if noSSR mode
if (this.noSSR) {
return
}
const hasModules = fs.existsSync(path.resolve(this.options.rootDir, 'node_modules'))
// Create bundle renderer for SSR
this.bundleRenderer = createBundleRenderer(
this.resources.serverBundle,
Object.assign(
{
clientManifest: this.resources.clientManifest,
runInNewContext: false,
// for globally installed nuxt command, search dependencies in global dir
basedir: hasModules ? this.options.rootDir : __dirname
},
this.options.render.bundleRenderer
)
)
}
useMiddleware(m) {
// Resolve
const $m = m
if (typeof m === 'string') {
m = this.nuxt.requireModule(m)
}
if (typeof m.handler === 'string') {
m.handler = this.nuxt.requireModule(m.handler)
}
const handler = m.handler || m
const path = (
(m.prefix !== false ? this.options.router.base : '') +
(typeof m.path === 'string' ? m.path : '')
).replace(/\/\//g, '/')
handler.$m = $m
// Use middleware
this.app.use(path, handler)
}
get publicPath() {
return isUrl(this.options.build.publicPath)
? defaults.build.publicPath
: this.options.build.publicPath
}
async setupMiddleware() {
// Apply setupMiddleware from modules first
await this.nuxt.callHook('render:setupMiddleware', this.app)
// Compression middleware for production
if (!this.options.dev) {
const compressor = this.options.render.compressor
if (typeof compressor === 'object') {
// If only setting for `compression` are provided, require the module and insert
// Prefer require instead of requireModule to keep dependency in nuxt-start
const compression = require('compression')
this.useMiddleware(compression(compressor))
} else {
// Else, require own compression middleware
this.useMiddleware(compressor)
}
}
// Add webpack middleware only for development
if (this.options.dev) {
this.useMiddleware(async (req, res, next) => {
if (this.webpackDevMiddleware) {
await this.webpackDevMiddleware(req, res)
}
if (this.webpackHotMiddleware) {
await this.webpackHotMiddleware(req, res)
}
next()
})
}
// open in editor for debug mode only
if (this.options.debug && this.options.dev) {
this.useMiddleware({
path: '__open-in-editor',
handler: launchMiddleware(this.options.editor)
})
}
// For serving static/ files to /
const staticMiddleware = serveStatic(
path.resolve(this.options.srcDir, this.options.dir.static),
this.options.render.static
)
staticMiddleware.prefix = this.options.render.static.prefix
this.useMiddleware(staticMiddleware)
// Serve .nuxt/dist/ files only for production
// For dev they will be served with devMiddleware
if (!this.options.dev) {
const distDir = path.resolve(this.options.buildDir, 'dist', 'client')
this.useMiddleware({
path: this.publicPath,
handler: serveStatic(
distDir,
this.options.render.dist
)
})
}
// Add User provided middleware
this.options.serverMiddleware.forEach((m) => {
this.useMiddleware(m)
})
// Finally use nuxtMiddleware
this.useMiddleware(nuxtMiddleware.bind(this))
// Error middleware for errors that occurred in middleware that declared above
// Middleware should exactly take 4 arguments
// https://github.com/senchalabs/connect#error-middleware
// Apply errorMiddleware from modules first
await this.nuxt.callHook('render:errorMiddleware', this.app)
// Apply errorMiddleware from Nuxt
this.useMiddleware(errorMiddleware.bind(this))
}
renderTemplate(ssr, opts) {
// Fix problem with HTMLPlugin's minify option (#3392)
opts.html_attrs = opts.HTML_ATTRS
opts.body_attrs = opts.BODY_ATTRS
const fn = ssr ? this.resources.ssrTemplate : this.resources.spaTemplate
return fn(opts)
}
async renderRoute(url, context = {}) {
/* istanbul ignore if */
if (!this.isReady) {
await waitFor(1000)
return this.renderRoute(url, context)
}
// Log rendered url
consola.debug(`Rendering url ${url}`)
// Add url and isSever to the context
context.url = url
// Basic response if SSR is disabled or spa data provided
const spa = context.spa || (context.res && context.res.spa)
const ENV = this.options.env
if (this.noSSR || spa) {
const {
HTML_ATTRS,
BODY_ATTRS,
HEAD,
BODY_SCRIPTS,
getPreloadFiles
} = await this.metaRenderer.render(context)
const APP =
`<div id="${this.globals.id}">${this.resources.loadingHTML}</div>` + BODY_SCRIPTS
// Detect 404 errors
if (
url.includes(this.options.build.publicPath) ||
url.includes('__webpack')
) {
const err = {
statusCode: 404,
message: this.options.messages.error_404,
name: 'ResourceNotFound'
}
throw err
}
const html = this.renderTemplate(false, {
HTML_ATTRS,
BODY_ATTRS,
HEAD,
APP,
ENV
})
return { html, getPreloadFiles }
}
// Call renderToString from the bundleRenderer and generate the HTML (will update the context as well)
let APP = await this.bundleRenderer.renderToString(context)
if (!context.nuxt.serverRendered) {
APP = `<div id="${this.globals.id}"></div>`
}
const m = context.meta.inject()
let HEAD =
m.title.text() +
m.meta.text() +
m.link.text() +
m.style.text() +
m.script.text() +
m.noscript.text()
if (this.options._routerBaseSpecified) {
HEAD += `<base href="${this.options.router.base}">`
}
if (this.options.render.resourceHints) {
HEAD += context.renderResourceHints()
}
await this.nuxt.callHook('render:routeContext', context.nuxt)
const serializedSession = `window.${this.globals.context}=${devalue(context.nuxt)};`
const cspScriptSrcHashSet = new Set()
if (this.options.render.csp) {
const { hashAlgorithm } = this.options.render.csp
const hash = crypto.createHash(hashAlgorithm)
hash.update(serializedSession)
cspScriptSrcHashSet.add(`'${hashAlgorithm}-${hash.digest('base64')}'`)
}
APP += `<script>${serializedSession}</script>`
APP += context.renderScripts()
APP += m.script.text({ body: true })
APP += m.noscript.text({ body: true })
HEAD += context.renderStyles()
const html = this.renderTemplate(true, {
HTML_ATTRS: 'data-n-head-ssr ' + m.htmlAttrs.text(),
BODY_ATTRS: m.bodyAttrs.text(),
HEAD,
APP,
ENV
})
return {
html,
cspScriptSrcHashSet,
getPreloadFiles: context.getPreloadFiles,
error: context.nuxt.error,
redirected: context.redirected
}
}
async renderAndGetWindow(url, opts = {}) {
/* istanbul ignore if */
if (!jsdom) {
try {
jsdom = require('jsdom')
} catch (e) /* istanbul ignore next */ {
consola.error(`
Fail when calling nuxt.renderAndGetWindow(url)
jsdom module is not installed
Please install jsdom with: npm install --save-dev jsdom
`)
throw e
}
}
const options = Object.assign({
resources: 'usable', // load subresources (https://github.com/tmpvar/jsdom#loading-subresources)
runScripts: 'dangerously',
virtualConsole: true,
beforeParse(window) {
// Mock window.scrollTo
window.scrollTo = () => {}
}
}, opts)
const jsdomErrHandler = (err) => { throw err }
if (options.virtualConsole) {
if (options.virtualConsole === true) {
options.virtualConsole = new jsdom.VirtualConsole().sendTo(consola)
}
// throw error when window creation failed
options.virtualConsole.on('jsdomError', jsdomErrHandler)
}
url = url || 'http://localhost:3000'
const { window } = await jsdom.JSDOM.fromURL(url, options)
// If Nuxt could not be loaded (error from the server-side)
const nuxtExists = window.document.body.innerHTML.includes(
this.options.render.ssr ? `window.${this.globals.context}` : `<div id="${this.globals.id}">`
)
/* istanbul ignore if */
if (!nuxtExists) {
const error = new Error('Could not load the nuxt app')
error.body = window.document.body.innerHTML
throw error
}
// Used by nuxt.js to say when the components are loaded and the app ready
const onNuxtLoaded = this.globals.loadedCallback
await timeout(new Promise((resolve) => {
window[onNuxtLoaded] = () => resolve(window)
}), 20000, 'Components loading in renderAndGetWindow was not completed in 20s')
if (options.virtualConsole) {
// after window initialized successfully
options.virtualConsole.removeListener('jsdomError', jsdomErrHandler)
}
// Send back window object
return window
}
}
const parseTemplate = templateStr =>
_.template(templateStr, {
interpolate: /{{([\s\S]+?)}}/g
})
export const resourceMap = [
{
key: 'clientManifest',
fileName: 'vue-ssr-client-manifest.json',
transform: JSON.parse
},
{
key: 'serverBundle',
fileName: 'server-bundle.json',
transform: JSON.parse
},
{
key: 'ssrTemplate',
fileName: 'index.ssr.html',
transform: parseTemplate
},
{
key: 'spaTemplate',
fileName: 'index.spa.html',
transform: parseTemplate
}
]

View File

@ -1,6 +0,0 @@
import core from './core'
import builder from './builder'
import * as Utils from './common/utils'
import Options from './common/options'
export default Object.assign({ Utils, Options }, core, builder)

View File

@ -1,4 +0,0 @@
export default (pkg) => {
pkg.sortDependencies()
pkg.writePackage()
}

View File

@ -1,179 +1,81 @@
{ {
"name": "nuxt", "private": true,
"version": "2.2.0", "workspaces": [
"description": "A minimalistic framework for server-rendered Vue.js applications (inspired by Next.js)", "packages/*",
"contributors": [ "distributions/*"
{
"name": "Sebastien Chopin (@Atinux)"
},
{
"name": "Alexandre Chopin (@alexchopin)"
},
{
"name": "Pooya Parsa (@pi0)"
},
{
"name": "Clark Du (@clarkdo)"
},
{
"name": "Jonas Galvez (@galvez)"
},
{
"name": "Alexander Lichter (@manniL}"
}
], ],
"main": "index.js",
"module": "./lib/nuxt.js",
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/nuxt/nuxt.js"
},
"files": [
"bin",
"lib",
"dist",
"index.js"
],
"keywords": [
"nuxt",
"nuxt.js",
"nuxtjs",
"vue",
"vue.js",
"vuejs",
"vue universal",
"vue ssr",
"vue server side",
"ssr",
"vue isomorphic",
"vue versatile"
],
"homepage": "https://github.com/nuxt/nuxt.js#readme",
"bin": {
"nuxt": "./bin/nuxt"
},
"scripts": { "scripts": {
"build": "node -r esm ./packages/nuxt-pack/build.js", "build": "yarn clean && node -r esm ./scripts/package",
"clean": "yarn clean:build && yarn clean:examples && yarn clean:test",
"clean:build": "rimraf distributions/*/dist packages/*/dist",
"clean:examples": "rimraf examples/*/dist examples/*/.nuxt",
"clean:test": "rimraf test/fixtures/*/dist test/fixtures/*/.nuxt*",
"dev": "node -r esm ./scripts/dev",
"coverage": "codecov", "coverage": "codecov",
"lint": "eslint --ext .js,.mjs,.vue bin/** benchmarks examples lib packages test", "lint": "eslint --ext .js,.mjs,.vue .",
"postinstall": "opencollective || exit 0", "lint:app": "eslint-multiplexer eslint --ignore-path packages/app/template/.eslintignore 'test/fixtures/!(missing-plugin)/.nuxt!(-dev)/**' | eslint-multiplexer -b",
"nuxt": "node -r esm ./packages/cli/bin/nuxt.js",
"test": "yarn test:fixtures && yarn test:unit", "test": "yarn test:fixtures && yarn test:unit",
"test:fixtures": "jest test/fixtures", "test:fixtures": "jest test/fixtures",
"test:e2e": "jest -i test/e2e", "test:e2e": "jest -i test/e2e",
"test:lint": "yarn lint", "test:lint": "yarn lint",
"test:unit": "jest test/unit" "test:unit": "jest test/unit",
}, "postinstall": "lerna link && yarn dev"
"engines": {
"node": ">=8.0.0",
"npm": ">=5.0.0"
},
"dependencies": {
"@babel/core": "^7.1.2",
"@babel/polyfill": "^7.0.0",
"@nuxtjs/babel-preset-app": "^0.7.0",
"@nuxtjs/devalue": "^1.0.0",
"@nuxtjs/friendly-errors-webpack-plugin": "^2.0.2",
"@nuxtjs/opencollective": "^0.1.0",
"@nuxtjs/youch": "^4.2.3",
"babel-loader": "^8.0.4",
"cache-loader": "^1.2.2",
"caniuse-lite": "^1.0.30000890",
"chalk": "^2.4.1",
"chokidar": "^2.0.4",
"compression": "^1.7.3",
"connect": "^3.6.6",
"consola": "^1.4.4",
"css-loader": "^1.0.0",
"cssnano": "^4.1.4",
"debug": "^4.1.0",
"esm": "^3.0.84",
"etag": "^1.8.1",
"file-loader": "^2.0.0",
"fresh": "^0.5.2",
"fs-extra": "^7.0.0",
"glob": "^7.1.3",
"hash-sum": "^1.0.2",
"html-minifier": "^3.5.20",
"html-webpack-plugin": "^3.2.0",
"ip": "^1.1.5",
"launch-editor-middleware": "^2.2.1",
"lodash": "^4.17.11",
"lru-cache": "^4.1.3",
"memory-fs": "^0.4.1",
"mini-css-extract-plugin": "^0.4.4",
"minimist": "^1.2.0",
"optimize-css-assets-webpack-plugin": "^5.0.1",
"pify": "^4.0.0",
"postcss": "^7.0.5",
"postcss-import": "^12.0.0",
"postcss-import-resolver": "^1.1.0",
"postcss-loader": "^3.0.0",
"postcss-preset-env": "^6.1.1",
"postcss-url": "^8.0.0",
"semver": "^5.6.0",
"serialize-javascript": "^1.5.0",
"serve-static": "^1.13.2",
"server-destroy": "^1.0.1",
"std-env": "^2.0.2",
"style-resources-loader": "^1.2.1",
"terser-webpack-plugin": "^1.1.0",
"thread-loader": "^1.2.0",
"time-fix-plugin": "^2.0.3",
"upath": "^1.1.0",
"url-loader": "^1.1.2",
"vue": "^2.5.17",
"vue-loader": "^15.4.2",
"vue-meta": "^1.5.5",
"vue-no-ssr": "^1.0.0",
"vue-router": "^3.0.1",
"vue-server-renderer": "^2.5.17",
"vue-template-compiler": "^2.5.17",
"vuex": "^3.0.1",
"webpack": "^4.20.2",
"webpack-bundle-analyzer": "^3.0.2",
"webpack-dev-middleware": "^3.4.0",
"webpack-hot-middleware": "^2.24.3",
"webpack-node-externals": "^1.7.2",
"webpackbar": "^2.6.3"
}, },
"devDependencies": { "devDependencies": {
"@babel/preset-env": "^7.1.0", "@babel/core": "^7.1.6",
"@babel/preset-env": "^7.1.6",
"@nuxtjs/eslint-config": "^0.0.1",
"babel-core": "^7.0.0-bridge", "babel-core": "^7.0.0-bridge",
"babel-eslint": "^10.0.1", "babel-eslint": "^10.0.1",
"babel-jest": "^23.6.0", "babel-jest": "^23.6.0",
"babel-plugin-dynamic-import-node": "^2.2.0", "babel-plugin-dynamic-import-node": "^2.2.0",
"cheerio": "^1.0.0-rc.2",
"codecov": "^3.1.0", "codecov": "^3.1.0",
"consola": "^2.2.6",
"cross-env": "^5.2.0", "cross-env": "^5.2.0",
"cross-spawn": "^6.0.5", "cross-spawn": "^6.0.5",
"eslint": "^5.7.0", "eslint": "^5.9.0",
"eslint-config-standard": "^12.0.0", "eslint-config-standard": "^12.0.0",
"eslint-multiplexer": "^1.0.2",
"eslint-plugin-import": "^2.14.0", "eslint-plugin-import": "^2.14.0",
"eslint-plugin-jest": "^21.24.1", "eslint-plugin-jest": "^22.0.0",
"eslint-plugin-node": "^7.0.1", "eslint-plugin-node": "^8.0.0",
"eslint-plugin-promise": "^4.0.1", "eslint-plugin-promise": "^4.0.1",
"eslint-plugin-standard": "^4.0.0", "eslint-plugin-standard": "^4.0.0",
"eslint-plugin-vue": "^5.0.0-beta.3", "eslint-plugin-vue": "^5.0.0-beta.4",
"esm": "^3.0.84",
"express": "^4.16.4", "express": "^4.16.4",
"finalhandler": "^1.1.1", "finalhandler": "^1.1.1",
"fs-extra": "^7.0.1",
"get-port": "^4.0.0", "get-port": "^4.0.0",
"glob": "^7.1.3",
"jest": "^23.6.0", "jest": "^23.6.0",
"jsdom": "^12.2.0", "jest-junit": "^5.2.0",
"jsdom": "^13.0.0",
"klaw-sync": "^6.0.0", "klaw-sync": "^6.0.0",
"lerna": "^3.4.3",
"lodash": "^4.17.11",
"node-fetch": "^2.3.0",
"pug": "^2.0.3", "pug": "^2.0.3",
"pug-plain-loader": "^1.0.0", "pug-plain-loader": "^1.0.0",
"puppeteer": "^1.9.0", "puppeteer": "^1.10.0",
"request": "^2.88.0", "request": "^2.88.0",
"request-promise-native": "^1.0.5", "request-promise-native": "^1.0.5",
"rimraf": "^2.6.2", "rimraf": "^2.6.2",
"rollup": "^0.66.6", "rollup": "^0.67.1",
"rollup-plugin-alias": "^1.4.0",
"rollup-plugin-babel": "^4.0.3", "rollup-plugin-babel": "^4.0.3",
"rollup-plugin-commonjs": "^9.2.0", "rollup-plugin-commonjs": "^9.2.0",
"rollup-plugin-json": "^3.1.0", "rollup-plugin-json": "^3.1.0",
"rollup-plugin-license": "^0.7.0" "rollup-plugin-license": "^0.7.0",
"rollup-plugin-node-resolve": "^3.4.0",
"rollup-plugin-replace": "^2.1.0",
"sort-package-json": "^1.16.0",
"vue-jest": "^3.0.0"
}, },
"collective": { "repository": {
"url": "https://opencollective.com/nuxtjs", "type": "git",
"logoUrl": "https://opencollective.com/nuxtjs/logo.txt?reverse=true&variant=variant2" "url": "git+https://github.com/nuxt/nuxt.js.git"
} }
} }

View File

@ -0,0 +1,38 @@
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## 2.3.1 (2018-11-16)
### Bug Fixes
* **deps:** update all non-major dependencies ([#4200](https://github.com/nuxt/nuxt.js/issues/4200)) ([930f8b2](https://github.com/nuxt/nuxt.js/commit/930f8b2))
* **deps:** update all non-major dependencies ([#4271](https://github.com/nuxt/nuxt.js/issues/4271)) ([dd114ff](https://github.com/nuxt/nuxt.js/commit/dd114ff))
* **deps:** update all non-major dependencies ([#4310](https://github.com/nuxt/nuxt.js/issues/4310)) ([bfb6d6a](https://github.com/nuxt/nuxt.js/commit/bfb6d6a))
### Features
* add --modern to nuxt start ([#4254](https://github.com/nuxt/nuxt.js/issues/4254)) ([12151d8](https://github.com/nuxt/nuxt.js/commit/12151d8))
* move [@nuxtjs](https://github.com/nuxtjs)/babel-preset-app into nuxt mono-repo ([#4205](https://github.com/nuxt/nuxt.js/issues/4205)) ([ae9de93](https://github.com/nuxt/nuxt.js/commit/ae9de93))
# 2.3.0 (2018-11-16)
### Bug Fixes
* **deps:** update all non-major dependencies ([#4200](https://github.com/nuxt/nuxt.js/issues/4200)) ([930f8b2](https://github.com/nuxt/nuxt.js/commit/930f8b2))
* **deps:** update all non-major dependencies ([#4271](https://github.com/nuxt/nuxt.js/issues/4271)) ([dd114ff](https://github.com/nuxt/nuxt.js/commit/dd114ff))
* **deps:** update all non-major dependencies ([#4310](https://github.com/nuxt/nuxt.js/issues/4310)) ([bfb6d6a](https://github.com/nuxt/nuxt.js/commit/bfb6d6a))
### Features
* add --modern to nuxt start ([#4254](https://github.com/nuxt/nuxt.js/issues/4254)) ([12151d8](https://github.com/nuxt/nuxt.js/commit/12151d8))
* move [@nuxtjs](https://github.com/nuxtjs)/babel-preset-app into nuxt mono-repo ([#4205](https://github.com/nuxt/nuxt.js/issues/4205)) ([ae9de93](https://github.com/nuxt/nuxt.js/commit/ae9de93))

View File

@ -0,0 +1,27 @@
{
"name": "@nuxt/babel-preset-app",
"version": "2.3.1",
"description": "babel-preset-app for nuxt.js",
"repository": "nuxt/nuxt.js",
"license": "MIT",
"author": "Evan You",
"contributors": [
"Clark Du"
],
"main": "src/index.js",
"dependencies": {
"@babel/core": "^7.1.6",
"@babel/plugin-proposal-class-properties": "^7.1.0",
"@babel/plugin-proposal-decorators": "^7.1.6",
"@babel/plugin-syntax-dynamic-import": "^7.0.0",
"@babel/plugin-syntax-jsx": "^7.0.0",
"@babel/plugin-transform-runtime": "^7.1.0",
"@babel/preset-env": "^7.1.6",
"@babel/runtime": "^7.1.5",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-plugin-transform-vue-jsx": "^4.0.1"
},
"publishConfig": {
"access": "public"
}
}

View File

@ -0,0 +1,97 @@
const defaultPolyfills = [
// Promise polyfill alone doesn't work in IE,
// Needs this as well. see: #1642
'es6.array.iterator',
// This is required for webpack code splitting, vuex etc.
'es6.promise',
// #2012 es6.promise replaces native Promise in FF and causes missing finally
'es7.promise.finally'
]
function getPolyfills(targets, includes, { ignoreBrowserslistConfig, configPath }) {
const { isPluginRequired } = require('@babel/preset-env')
const builtInsList = require('@babel/preset-env/data/built-ins.json')
const getTargets = require('@babel/preset-env/lib/targets-parser').default
const builtInTargets = getTargets(targets, {
ignoreBrowserslistConfig,
configPath
})
return includes.filter(item => isPluginRequired(builtInTargets, builtInsList[item]))
}
module.exports = (context, options = {}) => {
const presets = []
const plugins = []
// JSX
if (options.jsx !== false) {
plugins.push(
require('@babel/plugin-syntax-jsx'),
require('babel-plugin-transform-vue-jsx')
// require('babel-plugin-jsx-event-modifiers'),
// require('babel-plugin-jsx-v-model')
)
}
const modern = !!options.modern
const {
buildTarget,
loose = false,
useBuiltIns = (modern ? false : 'usage'),
modules = false,
polyfills: userPolyfills,
ignoreBrowserslistConfig = modern,
configPath,
forceAllTransforms,
decoratorsLegacy
} = options
let targets = options.targets
if (modern === true) {
targets = { esmodules: true }
} else if (targets === undefined) {
targets = buildTarget === 'server' ? { node: 'current' } : { ie: 9 }
}
let polyfills
if (modern === false && useBuiltIns === 'usage' && buildTarget === 'client') {
polyfills = getPolyfills(targets, userPolyfills || defaultPolyfills, {
ignoreBrowserslistConfig,
configPath
})
plugins.push([require('./polyfills-plugin'), { polyfills }])
} else {
polyfills = []
}
// Pass options along to babel-preset-env
presets.push([
require('@babel/preset-env'), {
loose,
modules,
targets,
useBuiltIns,
forceAllTransforms,
ignoreBrowserslistConfig,
exclude: polyfills
}
])
plugins.push(
require('@babel/plugin-syntax-dynamic-import'),
[require('@babel/plugin-proposal-decorators'), { legacy: decoratorsLegacy !== false }],
[require('@babel/plugin-proposal-class-properties'), { loose }]
)
// Transform runtime, but only for helpers
plugins.push([require('@babel/plugin-transform-runtime'), {
regenerator: useBuiltIns !== 'usage'
}])
return {
presets,
plugins
}
}

View File

@ -0,0 +1,24 @@
// Add polyfill imports to the first file encountered.
module.exports = ({ types }) => {
let entryFile
return {
name: 'inject-polyfills',
visitor: {
Program(path, state) {
if (!entryFile) {
entryFile = state.filename
} else if (state.filename !== entryFile) {
return
}
const { polyfills } = state.opts
const { createImport } = require('@babel/preset-env/lib/utils')
// Imports are injected in reverse order
polyfills.slice().reverse().forEach((p) => {
createImport(path, p)
})
}
}
}
}

View File

@ -0,0 +1,74 @@
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## 2.3.1 (2018-11-16)
### Bug Fixes
* **app:** lint all templates ([#4175](https://github.com/nuxt/nuxt.js/issues/4175)) ([96bdcab](https://github.com/nuxt/nuxt.js/commit/96bdcab))
* **builder:** use require.resolve to get the path of babel-loader ([#4150](https://github.com/nuxt/nuxt.js/issues/4150)) ([60dbc6d](https://github.com/nuxt/nuxt.js/commit/60dbc6d))
* **deps:** update all non-major dependencies ([#4156](https://github.com/nuxt/nuxt.js/issues/4156)) ([ff6385f](https://github.com/nuxt/nuxt.js/commit/ff6385f))
* **deps:** update all non-major dependencies ([#4172](https://github.com/nuxt/nuxt.js/issues/4172)) ([1cb7ce5](https://github.com/nuxt/nuxt.js/commit/1cb7ce5))
* **deps:** update all non-major dependencies ([#4253](https://github.com/nuxt/nuxt.js/issues/4253)) ([f10f860](https://github.com/nuxt/nuxt.js/commit/f10f860))
* **deps:** update all non-major dependencies ([#4270](https://github.com/nuxt/nuxt.js/issues/4270)) ([1a154e8](https://github.com/nuxt/nuxt.js/commit/1a154e8))
* **deps:** update all non-major dependencies ([#4271](https://github.com/nuxt/nuxt.js/issues/4271)) ([dd114ff](https://github.com/nuxt/nuxt.js/commit/dd114ff))
* **deps:** update all non-major dependencies ([#4310](https://github.com/nuxt/nuxt.js/issues/4310)) ([bfb6d6a](https://github.com/nuxt/nuxt.js/commit/bfb6d6a))
* **deps:** update dependency consola to ^2.2.0 ([#4269](https://github.com/nuxt/nuxt.js/issues/4269)) ([47f67cc](https://github.com/nuxt/nuxt.js/commit/47f67cc))
* **deps:** update dependency consola to ^2.2.3 ([#4293](https://github.com/nuxt/nuxt.js/issues/4293)) ([b290c07](https://github.com/nuxt/nuxt.js/commit/b290c07))
* **pkg:** stick [@nuxt](https://github.com/nuxt) dependency versions ([#4339](https://github.com/nuxt/nuxt.js/issues/4339)) ([ca5d538](https://github.com/nuxt/nuxt.js/commit/ca5d538))
* **publish:** set each package's publishConfig to public ([28b246d](https://github.com/nuxt/nuxt.js/commit/28b246d)), closes [lerna/lerna#178](https://github.com/lerna/lerna/issues/178)
* check styleResources for existence ([#4155](https://github.com/nuxt/nuxt.js/issues/4155)) ([a3ba6e9](https://github.com/nuxt/nuxt.js/commit/a3ba6e9))
* Duplicate declaration plugin when add/remove file in dev mode ([#4278](https://github.com/nuxt/nuxt.js/issues/4278)) ([3f2b10e](https://github.com/nuxt/nuxt.js/commit/3f2b10e))
### Features
* dx improvements ([#4259](https://github.com/nuxt/nuxt.js/issues/4259)) ([7c4e77f](https://github.com/nuxt/nuxt.js/commit/7c4e77f))
* migrate nuxt into monorepo ([#4051](https://github.com/nuxt/nuxt.js/issues/4051)) ([9c1e0d1](https://github.com/nuxt/nuxt.js/commit/9c1e0d1))
* split builder into more refined modules ([#4171](https://github.com/nuxt/nuxt.js/issues/4171)) ([9df5f49](https://github.com/nuxt/nuxt.js/commit/9df5f49))
* update to consola 2 ([#4247](https://github.com/nuxt/nuxt.js/issues/4247)) ([1dd32d0](https://github.com/nuxt/nuxt.js/commit/1dd32d0))
### Performance Improvements
* cherry-pick only used lodash imports ([#4099](https://github.com/nuxt/nuxt.js/issues/4099)) ([ab5af54](https://github.com/nuxt/nuxt.js/commit/ab5af54))
# 2.3.0 (2018-11-16)
### Bug Fixes
* **app:** lint all templates ([#4175](https://github.com/nuxt/nuxt.js/issues/4175)) ([96bdcab](https://github.com/nuxt/nuxt.js/commit/96bdcab))
* **builder:** use require.resolve to get the path of babel-loader ([#4150](https://github.com/nuxt/nuxt.js/issues/4150)) ([60dbc6d](https://github.com/nuxt/nuxt.js/commit/60dbc6d))
* **deps:** update all non-major dependencies ([#4156](https://github.com/nuxt/nuxt.js/issues/4156)) ([ff6385f](https://github.com/nuxt/nuxt.js/commit/ff6385f))
* **deps:** update all non-major dependencies ([#4172](https://github.com/nuxt/nuxt.js/issues/4172)) ([1cb7ce5](https://github.com/nuxt/nuxt.js/commit/1cb7ce5))
* **deps:** update all non-major dependencies ([#4253](https://github.com/nuxt/nuxt.js/issues/4253)) ([f10f860](https://github.com/nuxt/nuxt.js/commit/f10f860))
* **deps:** update all non-major dependencies ([#4270](https://github.com/nuxt/nuxt.js/issues/4270)) ([1a154e8](https://github.com/nuxt/nuxt.js/commit/1a154e8))
* **deps:** update all non-major dependencies ([#4271](https://github.com/nuxt/nuxt.js/issues/4271)) ([dd114ff](https://github.com/nuxt/nuxt.js/commit/dd114ff))
* **deps:** update all non-major dependencies ([#4310](https://github.com/nuxt/nuxt.js/issues/4310)) ([bfb6d6a](https://github.com/nuxt/nuxt.js/commit/bfb6d6a))
* **deps:** update dependency consola to ^2.2.0 ([#4269](https://github.com/nuxt/nuxt.js/issues/4269)) ([47f67cc](https://github.com/nuxt/nuxt.js/commit/47f67cc))
* **deps:** update dependency consola to ^2.2.3 ([#4293](https://github.com/nuxt/nuxt.js/issues/4293)) ([b290c07](https://github.com/nuxt/nuxt.js/commit/b290c07))
* **pkg:** stick [@nuxt](https://github.com/nuxt) dependency versions ([#4339](https://github.com/nuxt/nuxt.js/issues/4339)) ([ca5d538](https://github.com/nuxt/nuxt.js/commit/ca5d538))
* **publish:** set each package's publishConfig to public ([28b246d](https://github.com/nuxt/nuxt.js/commit/28b246d)), closes [lerna/lerna#178](https://github.com/lerna/lerna/issues/178)
* check styleResources for existence ([#4155](https://github.com/nuxt/nuxt.js/issues/4155)) ([a3ba6e9](https://github.com/nuxt/nuxt.js/commit/a3ba6e9))
* Duplicate declaration plugin when add/remove file in dev mode ([#4278](https://github.com/nuxt/nuxt.js/issues/4278)) ([3f2b10e](https://github.com/nuxt/nuxt.js/commit/3f2b10e))
### Features
* dx improvements ([#4259](https://github.com/nuxt/nuxt.js/issues/4259)) ([7c4e77f](https://github.com/nuxt/nuxt.js/commit/7c4e77f))
* migrate nuxt into monorepo ([#4051](https://github.com/nuxt/nuxt.js/issues/4051)) ([9c1e0d1](https://github.com/nuxt/nuxt.js/commit/9c1e0d1))
* split builder into more refined modules ([#4171](https://github.com/nuxt/nuxt.js/issues/4171)) ([9df5f49](https://github.com/nuxt/nuxt.js/commit/9df5f49))
* update to consola 2 ([#4247](https://github.com/nuxt/nuxt.js/issues/4247)) ([1dd32d0](https://github.com/nuxt/nuxt.js/commit/1dd32d0))
### Performance Improvements
* cherry-pick only used lodash imports ([#4099](https://github.com/nuxt/nuxt.js/issues/4099)) ([ab5af54](https://github.com/nuxt/nuxt.js/commit/ab5af54))

View File

@ -0,0 +1,3 @@
export default {
build: true
}

Some files were not shown because too many files have changed in this diff Show More