diff --git a/packages/cna-template/template/_package.json b/packages/cna-template/template/_package.json index dadfc68ab..1f38e1829 100644 --- a/packages/cna-template/template/_package.json +++ b/packages/cna-template/template/_package.json @@ -1,191 +1,5 @@ { "name": "<%= name %>", "version": "1.0.0", - "private": true, - "scripts": { - <%_ if (server === 'none') { _%> - <%_ if (tsRuntime) { _%> - "dev": "nuxt-ts", - "build": "nuxt-ts build", - "generate": "nuxt-ts generate", - "start": "nuxt-ts start", - <%_ } else { _%> - "dev": "nuxt", - "build": "nuxt build", - "start": "nuxt start", - "generate": "nuxt generate", - <%_ } _%> - <%_ } else if (server === 'adonis') { _%> - "serve:dev": "<%= pmRun %> dev", - "dev": "nodemon --watch app --watch bootstrap --watch config --watch .env -x node server.js", - "build": "cross-env NODE_ENV=production node ./ace nuxtbuild", - "start": "cross-env NODE_ENV=production node server.js", - <%_ } else { _%> - "dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server", - "build": "nuxt build", - "start": "cross-env NODE_ENV=production node server/index.js", - "generate": "nuxt generate", - <%_ } _%> - <%_ if (ui === 'framevuerk') { _%> - "build:framevuerk": "framevuerk-builder -c ./framevuerk-config.js", - "prepublish": "<%= pmRun %> build:framevuerk", - <%_ } _%> - <%_ if (eslint) { _%> - "lint": "eslint --ext .js,.vue --ignore-path .gitignore .", - <%_ } _%> - <%_ if (test === 'ava') { _%> - "test": "<%= test %>", - "test:unit": "cross-env TEST=unit ava ./test/specs/**/*", - "test:e2e": "cross-env TEST=e2e ava ./test/e2e/**/*", - <%_ } else if (test !== 'none') { _%> - "test": "<%= test %>", - <%_ } _%> - "": "" - }, - <%_ if (lintStaged) { _%> - "lint-staged": { - <%_ if (eslint) { _%> - "*.{js,vue}": "<%= pmRun %> lint"<%= stylelint ? "," : "" %> - <%_ } _%> - <%_ if (stylelint) { _%> - "*.{css,vue}": "stylelint" - <%_ } _%> - }, - "husky": { - "hooks": { - "pre-commit": "lint-staged" - } - }, - <%_ } _%> - "dependencies": { - <%_ if (edge) { _%> - "nuxt-edge": "latest", - <%_ } else { _%> - "nuxt": "^2.0.0", - <%_ } _%> - <%_ if (tsRuntime) { _%> - "@nuxt/typescript-runtime": "^0.4.0", - <%_ } _%> - <%_ if (server !== 'none') { _%> - "cross-env": "^5.2.0", - <%_ } _%> - <%_ if (server === 'express') { _%> - "express": "^4.16.4", - <%_ } else if (server === 'koa') { _%> - "koa": "^2.6.2", - <%_ } else if (server === 'hapi') { _%> - "@hapi/hapi": "^18.3.1", - "@nuxtjs/hapi": "^2.2.1", - <%_ } else if (server === 'micro') { _%> - "micro": "^9.3.3", - "micro-route": "^2.5.0", - <%_ } else if (server === 'fastify') { _%> - "fastify": "^2.13.0", - <%_ } else if (server === 'feathers') { _%> - "@feathersjs/feathers": "^3.3.1", - "@feathersjs/express": "^1.3.1", - "@feathersjs/configuration": "^2.0.6", - <%_ } else if (server === 'adonis') { _%> - "@adonisjs/ace": "^4.0.7", - "@adonisjs/auth": "^2.0.10", - "@adonisjs/bodyparser": "^1.0.8", - "@adonisjs/cors": "^1.0.2", - "@adonisjs/fold": "^4.0.5", - "@adonisjs/framework": "^4.0.27", - "@adonisjs/ignitor": "^1.0.14", - "@adonisjs/lucid": "^4.0.22", - "@adonisjs/session": "^1.0.19", - "@adonisjs/shield": "^1.0.4", - <%_ } _%> - <%_ if (ui === 'bootstrap') { _%> - "bootstrap-vue": "^2.0.0", - "bootstrap": "^4.1.3", - <%_ } else if (ui === 'bulma') { _%> - "@nuxtjs/bulma": "^1.2.1", - <%_ } else if (ui === 'element-ui') { _%> - "element-ui": "^2.4.11", - <%_ } else if (ui === 'ant-design-vue') { _%> - "ant-design-vue": "^1.1.10", - <%_ } else if (ui === 'buefy') { _%> - "nuxt-buefy": "^0.3.2", - <%_ } else if (ui === 'iview') { _%> - "iview": "^3.1.5", - <%_ } else if (ui === 'framevuerk') { _%> - "framevuerk": "^2.2.5", - <%_ } else if (ui === 'vuesax') { _%> - "vuesax": "^4.0.1-alpha.8", - <%_ } _%> - <%_ if (axios) { _%> - "@nuxtjs/axios": "^5.3.6", - <%_ } _%> - <%_ if (pwa) { _%> - "@nuxtjs/pwa": "^3.0.0-0", - <%_ } _%> - <%_ if (dotenv) { _%> - "@nuxtjs/dotenv": "^1.4.0", - <%_ } _%> - <%_ if (ui === 'tachyons') { _%> - "tachyons": "^4.11.1", - <%_ } _%> - "": "" - }, - "devDependencies": { - <%_ if (server !== 'none') { _%> - "nodemon": "^1.18.9", - <%_ } _%> - <%_ if (typescript) { _%> - "@nuxt/typescript-build": "^0.6.0", - <%_ } _%> - <%_ if (ui === 'tailwind') { _%> - "@nuxtjs/tailwindcss": "^1.0.0", - <%_ } else if (ui === 'vuetify') { _%> - "@nuxtjs/vuetify": "^1.0.0", - <%_ } else if (ui === 'framevuerk') { _%> - "framevuerk-builder": "^2.0.2", - <%_ } _%> - <%_ if (eslint) { _%> - <%_ if (typescript) { _%> - "@nuxtjs/eslint-config-typescript": "^1.0.0", - <%_ } else { _%> - "@nuxtjs/eslint-config": "^2.0.0", - <%_ } _%> - "@nuxtjs/eslint-module": "^1.0.0", - "babel-eslint": "^10.0.1", - "eslint": "^6.1.0", - "eslint-plugin-nuxt": ">=0.4.2", - <%_ } _%> - <%_ if (prettier) { _%> - "eslint-config-prettier": "^6.10.0", - "eslint-plugin-prettier": "^3.1.2", - "prettier": "^1.19.1", - <%_ } _%> - <%_ if (lintStaged) { _%> - "husky": "^4.0.0", - "lint-staged": "^10.0.0", - <%_ } _%> - <%_ if (stylelint) { _%> - "@nuxtjs/stylelint-module": "^3.1.0", - "stylelint": "^10.1.0", - <%_ } _%> - <%_ if (test !== 'none') { _%> - "@vue/test-utils": "^1.0.0-beta.27", - <%_ } _%> - <%_ if (test === 'jest') { _%> - "babel-jest": "^24.1.0", - "jest": "^24.1.0", - "vue-jest": "^4.0.0-0", - <%_ if (typescript) { _%> - "ts-jest": "^25.0.0", - <%_ } _%> - <%_ } else if (test === 'ava') { _%> - "ava": "^3.0.0", - "@ava/babel": "^1.0.0", - "babel-plugin-module-resolver": "^3.2.0", - "browser-env": "^3.2.5", - "require-extension-hooks": "^0.3.3", - "require-extension-hooks-babel": "^1.0.0", - "require-extension-hooks-vue": "^2.0.0", - <%_ } _%> - "": "" - } + "private": true } diff --git a/packages/cna-template/template/frameworks/adonis/package.json b/packages/cna-template/template/frameworks/adonis/package.json new file mode 100644 index 000000000..dfa65cf26 --- /dev/null +++ b/packages/cna-template/template/frameworks/adonis/package.json @@ -0,0 +1,24 @@ +{ + "scripts": { + "serve:dev": "<%= pmRun %> dev", + "dev": "nodemon --watch app --watch bootstrap --watch config --watch .env -x node server.js", + "build": "cross-env NODE_ENV=production node ./ace nuxtbuild", + "start": "cross-env NODE_ENV=production node server.js" + }, + "dependencies": { + "cross-env": "^5.2.0", + "@adonisjs/ace": "^4.0.7", + "@adonisjs/auth": "^2.0.10", + "@adonisjs/bodyparser": "^1.0.8", + "@adonisjs/cors": "^1.0.2", + "@adonisjs/fold": "^4.0.5", + "@adonisjs/framework": "^4.0.27", + "@adonisjs/ignitor": "^1.0.14", + "@adonisjs/lucid": "^4.0.22", + "@adonisjs/session": "^1.0.19", + "@adonisjs/shield": "^1.0.4" + }, + "devDependencies": { + "nodemon": "^1.18.9" + } +} diff --git a/packages/cna-template/template/frameworks/ant-design-vue/package.json b/packages/cna-template/template/frameworks/ant-design-vue/package.json new file mode 100644 index 000000000..994ee5e2a --- /dev/null +++ b/packages/cna-template/template/frameworks/ant-design-vue/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "ant-design-vue": "^1.1.10" + } +} diff --git a/packages/cna-template/template/frameworks/ava/package.json b/packages/cna-template/template/frameworks/ava/package.json new file mode 100644 index 000000000..b636cec50 --- /dev/null +++ b/packages/cna-template/template/frameworks/ava/package.json @@ -0,0 +1,18 @@ +{ + "scripts": { + "test": "ava", + "test:unit": "cross-env TEST=unit ava ./test/specs/**/*", + "test:e2e": "cross-env TEST=e2e ava ./test/e2e/**/*" + }, + "devDependencies": { + "@vue/test-utils": "^1.0.0-beta.27", + "ava": "^3.0.0", + "@ava/babel": "^1.0.0", + "babel-plugin-module-resolver": "^3.2.0", + "browser-env": "^3.2.5", + "cross-env": "^5.2.0", + "require-extension-hooks": "^0.3.3", + "require-extension-hooks-babel": "^1.0.0", + "require-extension-hooks-vue": "^2.0.0" + } +} diff --git a/packages/cna-template/template/frameworks/bootstrap/package.json b/packages/cna-template/template/frameworks/bootstrap/package.json new file mode 100644 index 000000000..602e4ff42 --- /dev/null +++ b/packages/cna-template/template/frameworks/bootstrap/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "bootstrap-vue": "^2.0.0", + "bootstrap": "^4.1.3" + } +} diff --git a/packages/cna-template/template/frameworks/buefy/package.json b/packages/cna-template/template/frameworks/buefy/package.json new file mode 100644 index 000000000..8da651045 --- /dev/null +++ b/packages/cna-template/template/frameworks/buefy/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "nuxt-buefy": "^0.3.2" + } +} diff --git a/packages/cna-template/template/frameworks/bulma/package.json b/packages/cna-template/template/frameworks/bulma/package.json new file mode 100644 index 000000000..e26181f59 --- /dev/null +++ b/packages/cna-template/template/frameworks/bulma/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@nuxtjs/bulma": "^1.2.1" + } +} diff --git a/packages/cna-template/template/frameworks/element-ui/package.json b/packages/cna-template/template/frameworks/element-ui/package.json new file mode 100644 index 000000000..aeab5351e --- /dev/null +++ b/packages/cna-template/template/frameworks/element-ui/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "element-ui": "^2.4.11" + } +} diff --git a/packages/cna-template/template/frameworks/express/package.json b/packages/cna-template/template/frameworks/express/package.json new file mode 100644 index 000000000..bf30559f5 --- /dev/null +++ b/packages/cna-template/template/frameworks/express/package.json @@ -0,0 +1,15 @@ +{ + "scripts": { + "dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server", + "build": "nuxt build", + "start": "cross-env NODE_ENV=production node server/index.js", + "generate": "nuxt generate" + }, + "dependencies": { + "cross-env": "^5.2.0", + "express": "^4.16.4" + }, + "devDependencies": { + "nodemon": "^1.18.9" + } +} diff --git a/packages/cna-template/template/frameworks/fastify/package.json b/packages/cna-template/template/frameworks/fastify/package.json new file mode 100644 index 000000000..e31523bb3 --- /dev/null +++ b/packages/cna-template/template/frameworks/fastify/package.json @@ -0,0 +1,15 @@ +{ + "scripts": { + "dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server", + "build": "nuxt build", + "start": "cross-env NODE_ENV=production node server/index.js", + "generate": "nuxt generate" + }, + "dependencies": { + "cross-env": "^5.2.0", + "fastify": "^2.13.0" + }, + "devDependencies": { + "nodemon": "^1.18.9" + } +} diff --git a/packages/cna-template/template/frameworks/feathers/package.json b/packages/cna-template/template/frameworks/feathers/package.json new file mode 100644 index 000000000..1f48b25f3 --- /dev/null +++ b/packages/cna-template/template/frameworks/feathers/package.json @@ -0,0 +1,17 @@ +{ + "scripts": { + "dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server", + "build": "nuxt build", + "start": "cross-env NODE_ENV=production node server/index.js", + "generate": "nuxt generate" + }, + "dependencies": { + "cross-env": "^5.2.0", + "@feathersjs/feathers": "^3.3.1", + "@feathersjs/express": "^1.3.1", + "@feathersjs/configuration": "^2.0.6" + }, + "devDependencies": { + "nodemon": "^1.18.9" + } +} diff --git a/packages/cna-template/template/frameworks/framevuerk/package.json b/packages/cna-template/template/frameworks/framevuerk/package.json new file mode 100644 index 000000000..14fbb2e74 --- /dev/null +++ b/packages/cna-template/template/frameworks/framevuerk/package.json @@ -0,0 +1,12 @@ +{ + "scripts": { + "build:framevuerk": "framevuerk-builder -c ./framevuerk-config.js", + "prepublish": "<%= pmRun %> build:framevuerk" + }, + "dependencies": { + "framevuerk": "^2.2.5" + }, + "devDependencies": { + "framevuerk-builder": "^2.0.2" + } +} diff --git a/packages/cna-template/template/frameworks/hapi/package.json b/packages/cna-template/template/frameworks/hapi/package.json new file mode 100644 index 000000000..f95a61776 --- /dev/null +++ b/packages/cna-template/template/frameworks/hapi/package.json @@ -0,0 +1,16 @@ +{ + "scripts": { + "dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server", + "build": "nuxt build", + "start": "cross-env NODE_ENV=production node server/index.js", + "generate": "nuxt generate" + }, + "dependencies": { + "cross-env": "^5.2.0", + "@hapi/hapi": "^18.3.1", + "@nuxtjs/hapi": "^2.2.1" + }, + "devDependencies": { + "nodemon": "^1.18.9" + } +} diff --git a/packages/cna-template/template/frameworks/iview/package.json b/packages/cna-template/template/frameworks/iview/package.json new file mode 100644 index 000000000..e70aad4e1 --- /dev/null +++ b/packages/cna-template/template/frameworks/iview/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "iview": "^3.1.5" + } +} diff --git a/packages/cna-template/template/frameworks/jest/package.js b/packages/cna-template/template/frameworks/jest/package.js new file mode 100644 index 000000000..8b9d4c900 --- /dev/null +++ b/packages/cna-template/template/frameworks/jest/package.js @@ -0,0 +1,10 @@ +module.exports = { + apply (pkg, generator) { + const { language = [] } = generator.answers + const typescript = language.includes('ts') + if (!typescript) { + delete pkg.devDependencies['ts-jest'] + } + return pkg + } +} diff --git a/packages/cna-template/template/frameworks/jest/package.json b/packages/cna-template/template/frameworks/jest/package.json new file mode 100644 index 000000000..b36d3df3f --- /dev/null +++ b/packages/cna-template/template/frameworks/jest/package.json @@ -0,0 +1,12 @@ +{ + "scripts": { + "test": "jest" + }, + "devDependencies": { + "@vue/test-utils": "^1.0.0-beta.27", + "babel-jest": "^24.1.0", + "jest": "^24.1.0", + "ts-jest": "^25.0.0", + "vue-jest": "^4.0.0-0" + } +} diff --git a/packages/cna-template/template/frameworks/koa/package.json b/packages/cna-template/template/frameworks/koa/package.json new file mode 100644 index 000000000..0c647a8ef --- /dev/null +++ b/packages/cna-template/template/frameworks/koa/package.json @@ -0,0 +1,15 @@ +{ + "scripts": { + "dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server", + "build": "nuxt build", + "start": "cross-env NODE_ENV=production node server/index.js", + "generate": "nuxt generate" + }, + "dependencies": { + "cross-env": "^5.2.0", + "koa": "^2.6.2" + }, + "devDependencies": { + "nodemon": "^1.18.9" + } +} diff --git a/packages/cna-template/template/frameworks/micro/package.json b/packages/cna-template/template/frameworks/micro/package.json new file mode 100644 index 000000000..c18cc72eb --- /dev/null +++ b/packages/cna-template/template/frameworks/micro/package.json @@ -0,0 +1,16 @@ +{ + "scripts": { + "dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server", + "build": "nuxt build", + "start": "cross-env NODE_ENV=production node server/index.js", + "generate": "nuxt generate" + }, + "dependencies": { + "cross-env": "^5.2.0", + "micro": "^9.3.3", + "micro-route": "^2.5.0" + }, + "devDependencies": { + "nodemon": "^1.18.9" + } +} diff --git a/packages/cna-template/template/frameworks/tachyons/package.json b/packages/cna-template/template/frameworks/tachyons/package.json new file mode 100644 index 000000000..020f21b76 --- /dev/null +++ b/packages/cna-template/template/frameworks/tachyons/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "tachyons": "^4.11.1" + } +} diff --git a/packages/cna-template/template/frameworks/tailwind/package.json b/packages/cna-template/template/frameworks/tailwind/package.json new file mode 100644 index 000000000..bf3dce7a0 --- /dev/null +++ b/packages/cna-template/template/frameworks/tailwind/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "@nuxtjs/tailwindcss": "^1.0.0" + } +} diff --git a/packages/cna-template/template/frameworks/vuesax/package.json b/packages/cna-template/template/frameworks/vuesax/package.json new file mode 100644 index 000000000..0acd5804a --- /dev/null +++ b/packages/cna-template/template/frameworks/vuesax/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "vuesax": "^4.0.1-alpha.8" + } +} diff --git a/packages/cna-template/template/frameworks/vuetify/package.json b/packages/cna-template/template/frameworks/vuetify/package.json new file mode 100644 index 000000000..a269892f7 --- /dev/null +++ b/packages/cna-template/template/frameworks/vuetify/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "@nuxtjs/vuetify": "^1.0.0" + } +} diff --git a/packages/cna-template/template/nuxt/package.js b/packages/cna-template/template/nuxt/package.js new file mode 100644 index 000000000..a2afa666c --- /dev/null +++ b/packages/cna-template/template/nuxt/package.js @@ -0,0 +1,75 @@ +module.exports = { + apply (pkg, generator) { + // edge + const { cliOptions = {} } = generator.sao.opts + const edge = cliOptions.edge ? '-edge' : '' + if (edge) { + delete pkg.dependencies.nuxt + pkg.dependencies['nuxt-edge'] = 'latest' + } + + const { scripts } = pkg + const { features, language = [], linter = [], runtime = [] } = generator.answers + + // Linter + const eslint = linter.includes('eslint') + const lintStaged = eslint && linter.includes('lintStaged') + const stylelint = linter.includes('stylelint') + const prettier = linter.includes('prettier') + + if (!eslint) { + delete pkg.scripts.lint + delete pkg.devDependencies['@nuxtjs/eslint-config'] + delete pkg.devDependencies['@nuxtjs/eslint-module'] + delete pkg.devDependencies['babel-eslint'] + delete pkg.devDependencies.eslint + delete pkg.devDependencies['eslint-plugin-nuxt'] + } + if (!lintStaged) { + delete pkg.husky + delete pkg['lint-staged'] + delete pkg.devDependencies.husky + delete pkg.devDependencies['lint-staged'] + } + if (!stylelint) { + lintStaged && delete pkg['lint-staged']['*.{css,vue'] + delete pkg.devDependencies['@nuxtjs/stylelint-module'] + delete pkg.devDependencies.stylelint + } + if (!prettier) { + delete pkg.devDependencies['eslint-config-prettier'] + delete pkg.devDependencies['eslint-plugin-prettier'] + delete pkg.devDependencies.prettier + } + + // Modules + if (!features.includes('axios')) { + delete pkg.dependencies['@nuxtjs/axios'] + } + if (!features.includes('pwa')) { + delete pkg.dependencies['@nuxtjs/pwa'] + } + if (!features.includes('dotenv')) { + delete pkg.dependencies['@nuxtjs/dotenv'] + } + + // TS + const typescript = language.includes('ts') + const tsRuntime = runtime.includes('ts-runtime') + + if (!typescript) { + delete pkg.devDependencies['@nuxt/typescript-build'] + } + if (!typescript || !eslint) { + delete pkg.devDependencies['@nuxtjs/eslint-config-typescript'] + } + if (tsRuntime) { + for (const key of Object.keys(scripts)) { + scripts[key] = scripts[key].replace(/^nuxt /, 'nuxt-ts ') + } + } else { + delete pkg.dependencies['@nuxt/typescript-runtime'] + } + return pkg + } +} diff --git a/packages/cna-template/template/nuxt/package.json b/packages/cna-template/template/nuxt/package.json new file mode 100644 index 000000000..59b81f616 --- /dev/null +++ b/packages/cna-template/template/nuxt/package.json @@ -0,0 +1,41 @@ +{ + "scripts": { + "dev": "nuxt", + "build": "nuxt build", + "start": "nuxt start", + "generate": "nuxt generate", + "lint": "eslint --ext .js,.vue --ignore-path .gitignore ." + }, + "lint-staged": { + "*.{js,vue}": "<%= pmRun %> lint", + "*.{css,vue}": "stylelint" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "dependencies": { + "@nuxt/typescript-runtime": "^0.4.0", + "@nuxtjs/axios": "^5.3.6", + "@nuxtjs/pwa": "^3.0.0-0", + "@nuxtjs/dotenv": "^1.4.0", + "nuxt": "^2.0.0" + }, + "devDependencies": { + "@nuxt/typescript-build": "^0.6.0", + "@nuxtjs/eslint-config-typescript": "^1.0.0", + "@nuxtjs/eslint-config": "^2.0.0", + "@nuxtjs/eslint-module": "^1.0.0", + "babel-eslint": "^10.0.1", + "eslint": "^6.1.0", + "eslint-plugin-nuxt": ">=0.4.2", + "eslint-config-prettier": "^6.10.0", + "eslint-plugin-prettier": "^3.1.2", + "prettier": "^1.19.1", + "husky": "^4.0.0", + "lint-staged": "^10.0.0", + "@nuxtjs/stylelint-module": "^3.1.0", + "stylelint": "^10.1.0" + } +} diff --git a/packages/create-nuxt-app/lib/package.js b/packages/create-nuxt-app/lib/package.js new file mode 100644 index 000000000..01a71037a --- /dev/null +++ b/packages/create-nuxt-app/lib/package.js @@ -0,0 +1,33 @@ +const { merge, sortByKey } = require('./util') + +module.exports = { + requireFile (filename) { + try { + return require(filename) + } catch (error) { + return {} + } + }, + requireJSON (filename) { + return JSON.parse(JSON.stringify(this.requireFile(filename))) + }, + loadPackage (name, generator) { + if (!name || name === 'none') { + return {} + } + const prefix = name === 'nuxt' ? 'nuxt' : `frameworks/${name}` + const pkg = this.requireJSON(`cna-template/template/${prefix}/package.json`) + const pkgHandler = this.requireFile(`cna-template/template/${prefix}/package.js`) + return pkgHandler.apply ? pkgHandler.apply(pkg, generator) : pkg + }, + load (generator) { + const nuxtPkg = this.loadPackage('nuxt', generator) + const uiPkg = this.loadPackage(generator.answers.ui, generator) + const serverPkg = this.loadPackage(generator.answers.server, generator) + const testPkg = this.loadPackage(generator.answers.test, generator) + const pkg = merge(nuxtPkg, uiPkg, serverPkg, testPkg) + pkg.dependencies = sortByKey(pkg.dependencies) + pkg.devDependencies = sortByKey(pkg.devDependencies) + return pkg + } +} diff --git a/packages/create-nuxt-app/lib/saofile.js b/packages/create-nuxt-app/lib/saofile.js index 86db03b12..2c6f0ae4a 100644 --- a/packages/create-nuxt-app/lib/saofile.js +++ b/packages/create-nuxt-app/lib/saofile.js @@ -2,6 +2,7 @@ const { dirname, join, relative } = require('path') const glob = require('glob') const spawn = require('cross-spawn') const validate = require('validate-npm-package-name') +const pkg = require('./package') const cnaTemplateDir = join(dirname(require.resolve('cna-template/package.json'))) const templateDir = join(cnaTemplateDir, 'template') @@ -86,6 +87,8 @@ module.exports = { files[file] = `resources/${file}` } } + delete files['package.js'] + delete files['package.json'] files['nuxt.config.js'] = 'config/nuxt.js' actions.push({ @@ -129,17 +132,27 @@ module.exports = { } }) + const generator = this actions.push({ type: 'modify', files: 'package.json', handler (data) { - delete data.scripts[''] - delete data.dependencies[''] - delete data.devDependencies[''] - return data + return { ...data, ...pkg.load(generator) } } }) + // For compiling package.json + actions.push({ + type: 'add', + files: 'package.json', + templateDir: this.outDir + }) + + actions.push({ + type: 'remove', + files: 'package.js' + }) + return actions }, async completed () { diff --git a/packages/create-nuxt-app/lib/util.js b/packages/create-nuxt-app/lib/util.js new file mode 100644 index 000000000..367686cb4 --- /dev/null +++ b/packages/create-nuxt-app/lib/util.js @@ -0,0 +1,35 @@ +const isObject = (value) => { + return !!value && + typeof value === 'object' && + typeof value.getMonth !== 'function' && + !Array.isArray(value) +} + +const merge = (...sources) => { + const [target, ...rest] = sources + + for (const object of rest) { + for (const key in object) { + const targetValue = target[key] + const sourceValue = object[key] + const isMergable = isObject(targetValue) && isObject(sourceValue) + target[key] = isMergable ? merge({}, targetValue, sourceValue) : sourceValue + } + } + + return target +} + +const sortByKey = (unsortedObject) => { + const sortedObject = {} + Object.keys(unsortedObject).sort().forEach((key) => { + sortedObject[key] = unsortedObject[key] + }) + return sortedObject +} + +module.exports = { + isObject, + merge, + sortByKey +} diff --git a/packages/create-nuxt-app/test/snapshots/index.test.js.md b/packages/create-nuxt-app/test/snapshots/index.test.js.md index da6235be6..5a5150f61 100644 --- a/packages/create-nuxt-app/test/snapshots/index.test.js.md +++ b/packages/create-nuxt-app/test/snapshots/index.test.js.md @@ -1846,6 +1846,7 @@ Generated by [AVA](https://avajs.dev). scripts: { build: 'cross-env NODE_ENV=production node ./ace nuxtbuild', dev: 'nodemon --watch app --watch bootstrap --watch config --watch .env -x node server.js', + generate: 'nuxt generate', 'serve:dev': 'yarn dev', start: 'cross-env NODE_ENV=production node server.js', }, @@ -2659,6 +2660,7 @@ Generated by [AVA](https://avajs.dev). ava: '^3.0.0', 'babel-plugin-module-resolver': '^3.2.0', 'browser-env': '^3.2.5', + 'cross-env': '^5.2.0', 'require-extension-hooks': '^0.3.3', 'require-extension-hooks-babel': '^1.0.0', 'require-extension-hooks-vue': '^2.0.0', diff --git a/packages/create-nuxt-app/test/snapshots/index.test.js.snap b/packages/create-nuxt-app/test/snapshots/index.test.js.snap index 404d33718..58862b734 100644 Binary files a/packages/create-nuxt-app/test/snapshots/index.test.js.snap and b/packages/create-nuxt-app/test/snapshots/index.test.js.snap differ