mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-14 10:04:05 +00:00
Merge branch 'dev' into 2.x
This commit is contained in:
commit
5af0901c83
14
.babelrc
14
.babelrc
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"env": {
|
|
||||||
"test": {
|
|
||||||
"presets": [
|
|
||||||
["@babel/env", {
|
|
||||||
"targets": {
|
|
||||||
"node": "current"
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
],
|
|
||||||
"plugins": ["dynamic-import-node"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
101
.eslintrc.js
101
.eslintrc.js
@ -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: {}
|
|
||||||
}
|
}
|
||||||
|
6
.github/ISSUE_TEMPLATE.md
vendored
6
.github/ISSUE_TEMPLATE.md
vendored
@ -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
8
.github/lock.yml
vendored
Normal 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
9
.github/stale.yml
vendored
Normal 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
26
.gitignore
vendored
@ -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
|
||||||
|
106
CONTRIBUTING.md
106
CONTRIBUTING.md
@ -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.
|
|
14
README.md
14
README.md
@ -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
|
||||||
|
|
||||||
|
37
appveyor.yml
37
appveyor.yml
@ -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
34
azure-pipelines.yml
Normal 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
19
babel.config.js
Normal 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 {}
|
||||||
|
}
|
@ -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
|
|
||||||
}
|
|
32
bin/nuxt
32
bin/nuxt
@ -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)
|
|
@ -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))
|
|
||||||
}
|
|
100
bin/nuxt-dev
100
bin/nuxt-dev
@ -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 }))
|
|
||||||
)
|
|
||||||
})()
|
|
@ -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))
|
|
@ -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)
|
|
||||||
})
|
|
50
distributions/nuxt-legacy/CHANGELOG.md
Normal file
50
distributions/nuxt-legacy/CHANGELOG.md
Normal 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))
|
27
distributions/nuxt-legacy/bin/nuxt-legacy.js
Executable file
27
distributions/nuxt-legacy/bin/nuxt-legacy.js
Executable 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()
|
23
distributions/nuxt-legacy/package.js
Normal file
23
distributions/nuxt-legacy/package.js
Normal 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()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
66
distributions/nuxt-legacy/package.json
Normal file
66
distributions/nuxt-legacy/package.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
44
distributions/nuxt-start/CHANGELOG.md
Normal file
44
distributions/nuxt-start/CHANGELOG.md
Normal 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))
|
@ -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
|
5
distributions/nuxt-start/bin/nuxt-start.js
Executable file
5
distributions/nuxt-start/bin/nuxt-start.js
Executable 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()
|
23
distributions/nuxt-start/package.js
Normal file
23
distributions/nuxt-start/package.js
Normal 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()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
57
distributions/nuxt-start/package.json
Normal file
57
distributions/nuxt-start/package.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
1
distributions/nuxt-start/src/index.js
Normal file
1
distributions/nuxt-start/src/index.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export * from '@nuxt/core'
|
46
distributions/nuxt/CHANGELOG.md
Normal file
46
distributions/nuxt/CHANGELOG.md
Normal 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))
|
232
distributions/nuxt/README.md
Normal file
232
distributions/nuxt/README.md
Normal 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
5
distributions/nuxt/bin/nuxt.js
Executable 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()
|
12
distributions/nuxt/package.js
Normal file
12
distributions/nuxt/package.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
export default {
|
||||||
|
build: true,
|
||||||
|
extend(pkg, { load }) {
|
||||||
|
pkg.on('build:done', () => {
|
||||||
|
const mono = load('../..')
|
||||||
|
|
||||||
|
pkg.copyFilesFrom(mono, [
|
||||||
|
'LICENSE'
|
||||||
|
])
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
66
distributions/nuxt/package.json
Normal file
66
distributions/nuxt/package.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
3
distributions/nuxt/src/index.js
Normal file
3
distributions/nuxt/src/index.js
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export * from '@nuxt/core'
|
||||||
|
export * from '@nuxt/builder'
|
||||||
|
export * from '@nuxt/generator'
|
39
examples/jest-puppeteer/README.md
Executable file
39
examples/jest-puppeteer/README.md
Executable 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/)
|
10
examples/jest-puppeteer/jest-puppeteer.config.js
Executable file
10
examples/jest-puppeteer/jest-puppeteer.config.js
Executable file
@ -0,0 +1,10 @@
|
|||||||
|
module.exports = {
|
||||||
|
launch: {
|
||||||
|
headless: process.env.HEADLESS !== 'false'
|
||||||
|
},
|
||||||
|
server: {
|
||||||
|
command: 'npm run testServer',
|
||||||
|
port: 3000,
|
||||||
|
launchTimeout: 50000
|
||||||
|
}
|
||||||
|
}
|
4
examples/jest-puppeteer/jest.config.js
Executable file
4
examples/jest-puppeteer/jest.config.js
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
module.exports = {
|
||||||
|
verbose: true,
|
||||||
|
preset: 'jest-puppeteer'
|
||||||
|
}
|
18
examples/jest-puppeteer/package.json
Executable file
18
examples/jest-puppeteer/package.json
Executable 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"
|
||||||
|
}
|
||||||
|
}
|
19
examples/jest-puppeteer/pages/about.vue
Executable file
19
examples/jest-puppeteer/pages/about.vue
Executable 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>
|
14
examples/jest-puppeteer/pages/index.vue
Executable file
14
examples/jest-puppeteer/pages/index.vue
Executable 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>
|
5
examples/jest-puppeteer/test/__snapshots__/index.spec.js.snap
Executable file
5
examples/jest-puppeteer/test/__snapshots__/index.spec.js.snap
Executable 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"`;
|
32
examples/jest-puppeteer/test/index.spec.js
Executable file
32
examples/jest-puppeteer/test/index.spec.js
Executable 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')
|
||||||
|
})
|
||||||
|
})
|
1
examples/jest-vtu-example/.eslintignore
Normal file
1
examples/jest-vtu-example/.eslintignore
Normal file
@ -0,0 +1 @@
|
|||||||
|
*.spec.js.snap
|
14
examples/jest-vtu-example/.gitignore
vendored
Normal file
14
examples/jest-vtu-example/.gitignore
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# dependencies
|
||||||
|
node_modules
|
||||||
|
|
||||||
|
# logs
|
||||||
|
npm-debug.log
|
||||||
|
|
||||||
|
# Nuxt build
|
||||||
|
.nuxt
|
||||||
|
|
||||||
|
# Nuxt generate
|
||||||
|
dist
|
||||||
|
|
||||||
|
# coverage report
|
||||||
|
coverage/
|
9
examples/jest-vtu-example/README.md
Normal file
9
examples/jest-vtu-example/README.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# Jest + Vue Test Utils example
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Install dependencies
|
||||||
|
npm i # or yarn
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
npm test
|
||||||
|
```
|
7
examples/jest-vtu-example/babel.config.js
Normal file
7
examples/jest-vtu-example/babel.config.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
module.exports = {
|
||||||
|
env: {
|
||||||
|
test: {
|
||||||
|
presets: ['@babel/preset-env']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
36
examples/jest-vtu-example/components/Btn/Btn.spec.js
Normal file
36
examples/jest-vtu-example/components/Btn/Btn.spec.js
Normal 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)
|
||||||
|
})
|
||||||
|
})
|
25
examples/jest-vtu-example/components/Btn/Btn.vue
Normal file
25
examples/jest-vtu-example/components/Btn/Btn.vue
Normal 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>
|
@ -0,0 +1,7 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`Btn renders properly 1`] = `
|
||||||
|
<button>
|
||||||
|
click me!
|
||||||
|
</button>
|
||||||
|
`;
|
5
examples/jest-vtu-example/layouts/default.vue
Normal file
5
examples/jest-vtu-example/layouts/default.vue
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<nuxt />
|
||||||
|
</div>
|
||||||
|
</template>
|
3
examples/jest-vtu-example/nuxt.config.js
Normal file
3
examples/jest-vtu-example/nuxt.config.js
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export default {
|
||||||
|
mode: 'universal'
|
||||||
|
}
|
46
examples/jest-vtu-example/package.json
Normal file
46
examples/jest-vtu-example/package.json
Normal 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"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
@ -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>
|
||||||
|
`;
|
14
examples/jest-vtu-example/pages/index.spec.js
Normal file
14
examples/jest-vtu-example/pages/index.spec.js
Normal 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()
|
||||||
|
})
|
||||||
|
})
|
20
examples/jest-vtu-example/pages/index.vue
Normal file
20
examples/jest-vtu-example/pages/index.vue
Normal 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>
|
@ -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>
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
BIN
examples/tailwindcss-purgecss/.github/demo.png
vendored
Normal file
BIN
examples/tailwindcss-purgecss/.github/demo.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 78 KiB |
BIN
examples/tailwindcss-purgecss/.github/pagespeed-desktop.png
vendored
Normal file
BIN
examples/tailwindcss-purgecss/.github/pagespeed-desktop.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 148 KiB |
BIN
examples/tailwindcss-purgecss/.github/pagespeed-mobile.png
vendored
Normal file
BIN
examples/tailwindcss-purgecss/.github/pagespeed-mobile.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 175 KiB |
BIN
examples/tailwindcss-purgecss/.github/tailwind-default.png
vendored
Normal file
BIN
examples/tailwindcss-purgecss/.github/tailwind-default.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
BIN
examples/tailwindcss-purgecss/.github/tailwind-purgecss.png
vendored
Normal file
BIN
examples/tailwindcss-purgecss/.github/tailwind-purgecss.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
5
examples/tailwindcss-purgecss/.gitignore
vendored
Normal file
5
examples/tailwindcss-purgecss/.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
node_modules
|
||||||
|
.nuxt
|
||||||
|
dist
|
||||||
|
*.log
|
||||||
|
.DS_Store
|
23
examples/tailwindcss-purgecss/README.md
Normal file
23
examples/tailwindcss-purgecss/README.md
Normal 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)
|
63
examples/tailwindcss-purgecss/assets/css/tailwind.css
Normal file
63
examples/tailwindcss-purgecss/assets/css/tailwind.css
Normal 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";
|
||||||
|
*/
|
||||||
|
|
5
examples/tailwindcss-purgecss/components/MyComponent.vue
Normal file
5
examples/tailwindcss-purgecss/components/MyComponent.vue
Normal 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>
|
6
examples/tailwindcss-purgecss/layouts/default.vue
Normal file
6
examples/tailwindcss-purgecss/layouts/default.vue
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<template>
|
||||||
|
<div class="p-10">
|
||||||
|
<h1 class="mb-6">Nuxt Tailwind CSS + Purgecss</h1>
|
||||||
|
<nuxt />
|
||||||
|
</div>
|
||||||
|
</template>
|
16
examples/tailwindcss-purgecss/nuxt.config.js
Normal file
16
examples/tailwindcss-purgecss/nuxt.config.js
Normal 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']
|
||||||
|
}
|
26
examples/tailwindcss-purgecss/package.json
Normal file
26
examples/tailwindcss-purgecss/package.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
17
examples/tailwindcss-purgecss/pages/index.vue
Normal file
17
examples/tailwindcss-purgecss/pages/index.vue
Normal 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>
|
31
examples/tailwindcss-purgecss/postcss.config.js
Normal file
31
examples/tailwindcss-purgecss/postcss.config.js
Normal 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']
|
||||||
|
})
|
||||||
|
]
|
||||||
|
}
|
921
examples/tailwindcss-purgecss/tailwind.js
Normal file
921
examples/tailwindcss-purgecss/tailwind.js
Normal 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: ':'
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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)
|
||||||
|
@ -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))
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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",
|
||||||
|
@ -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:
|
||||||
|
18
index.js
18
index.js
@ -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')
|
|
||||||
}
|
|
@ -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
27
lerna.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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>
|
|
@ -1,7 +0,0 @@
|
|||||||
import Builder from './builder'
|
|
||||||
import Generator from './generator'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
Builder,
|
|
||||||
Generator
|
|
||||||
}
|
|
@ -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'
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
Temporary fork until vuejs/vue#7839 arrives.
|
|
@ -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)
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
}
|
|
@ -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.'
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
import Module from './module'
|
|
||||||
import Nuxt from './nuxt'
|
|
||||||
import Renderer from './renderer'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
Nuxt,
|
|
||||||
Module,
|
|
||||||
Renderer
|
|
||||||
}
|
|
298
lib/core/nuxt.js
298
lib/core/nuxt.js
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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
|
|
||||||
}
|
|
||||||
]
|
|
@ -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)
|
|
@ -1,4 +0,0 @@
|
|||||||
export default (pkg) => {
|
|
||||||
pkg.sortDependencies()
|
|
||||||
pkg.writePackage()
|
|
||||||
}
|
|
186
package.json
186
package.json
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
38
packages/babel-preset-app/CHANGELOG.md
Normal file
38
packages/babel-preset-app/CHANGELOG.md
Normal 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))
|
27
packages/babel-preset-app/package.json
Normal file
27
packages/babel-preset-app/package.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
97
packages/babel-preset-app/src/index.js
Normal file
97
packages/babel-preset-app/src/index.js
Normal 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
|
||||||
|
}
|
||||||
|
}
|
24
packages/babel-preset-app/src/polyfills-plugin.js
Normal file
24
packages/babel-preset-app/src/polyfills-plugin.js
Normal 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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
74
packages/builder/CHANGELOG.md
Normal file
74
packages/builder/CHANGELOG.md
Normal 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))
|
3
packages/builder/package.js
Normal file
3
packages/builder/package.js
Normal 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
Loading…
Reference in New Issue
Block a user