From d1ad3f5ca42f51b951608c24716023232d0e92a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Tue, 27 Aug 2019 12:10:33 +0800 Subject: [PATCH 1/2] chore: transfer miniapp-builder to internal --- packages/miniapp-builder/README.md | 28 --- packages/miniapp-builder/bin/cli.js | 111 ------------ packages/miniapp-builder/package.json | 81 --------- packages/miniapp-builder/src/builder/index.js | 58 ------ .../src/builder/tasks/buildApp.js | 38 ---- .../src/builder/tasks/buildConfig.js | 18 -- .../src/builder/tasks/buildIncludeFiles.js | 26 --- .../src/builder/tasks/buildModule.js | 98 ----------- .../src/builder/tasks/buildPlugin.js | 49 ------ .../src/builder/tasks/buildSchema.js | 68 -------- .../src/builder/tasks/buildWeb.js | 44 ----- .../src/builder/tasks/bundle.js | 12 -- .../src/builder/tasks/bundlePlugin.js | 12 -- .../src/builder/tasks/clean.js | 8 - .../src/builder/tasks/collectAssets.js | 19 -- .../src/builder/tasks/ensureDir.js | 8 - .../src/builder/tasks/index.js | 42 ----- .../miniapp-builder/src/config/babelConfig.js | 63 ------- .../src/config/frameworkVersion.js | 1 - .../src/config/getAppConfig.js | 165 ------------------ .../miniapp-builder/src/config/getEntry.js | 39 ----- .../src/config/getFrameworkCDNUrl.js | 30 ---- .../src/config/getFrameworkVersion.js | 30 ---- .../src/config/getMiniProgramConfig.js | 81 --------- .../src/config/getMiniappType.js | 27 --- .../src/config/getPluginWebpackConfig.js | 86 --------- .../src/config/getSFCConfig.js | 103 ----------- .../src/config/getWebpackConfig.js | 38 ---- .../src/config/styleResolver.js | 34 ---- .../src/config/webpackBaseConfig.js | 40 ----- packages/miniapp-builder/src/index.js | 2 - .../src/loaders/LocalAssetLoader.js | 17 -- .../src/plugins/BabelPluginRootImport.js | 152 ---------------- .../src/plugins/PostcssPluginRpx2rem.js | 35 ---- .../src/plugins/PostcssPluginTagPrefix.js | 56 ------ .../src/plugins/WebpackMiniProgramPlugin.js | 75 -------- .../src/plugins/WebpackWrapPlugin.js | 71 -------- .../src/server/controllers/bundle.js | 90 ---------- .../src/server/controllers/master.js | 49 ------ packages/miniapp-builder/src/server/index.js | 112 ------------ .../src/server/middlewares/dev.js | 87 --------- packages/miniapp-builder/src/server/router.js | 17 -- .../src/server/service/registerWatcher.js | 48 ----- .../src/server/views/master.ejs | 151 ---------------- .../miniapp-builder/sync-framework-version.js | 13 -- 45 files changed, 2432 deletions(-) delete mode 100644 packages/miniapp-builder/README.md delete mode 100755 packages/miniapp-builder/bin/cli.js delete mode 100644 packages/miniapp-builder/package.json delete mode 100644 packages/miniapp-builder/src/builder/index.js delete mode 100644 packages/miniapp-builder/src/builder/tasks/buildApp.js delete mode 100644 packages/miniapp-builder/src/builder/tasks/buildConfig.js delete mode 100644 packages/miniapp-builder/src/builder/tasks/buildIncludeFiles.js delete mode 100644 packages/miniapp-builder/src/builder/tasks/buildModule.js delete mode 100644 packages/miniapp-builder/src/builder/tasks/buildPlugin.js delete mode 100644 packages/miniapp-builder/src/builder/tasks/buildSchema.js delete mode 100644 packages/miniapp-builder/src/builder/tasks/buildWeb.js delete mode 100644 packages/miniapp-builder/src/builder/tasks/bundle.js delete mode 100644 packages/miniapp-builder/src/builder/tasks/bundlePlugin.js delete mode 100644 packages/miniapp-builder/src/builder/tasks/clean.js delete mode 100644 packages/miniapp-builder/src/builder/tasks/collectAssets.js delete mode 100644 packages/miniapp-builder/src/builder/tasks/ensureDir.js delete mode 100644 packages/miniapp-builder/src/builder/tasks/index.js delete mode 100644 packages/miniapp-builder/src/config/babelConfig.js delete mode 100644 packages/miniapp-builder/src/config/frameworkVersion.js delete mode 100644 packages/miniapp-builder/src/config/getAppConfig.js delete mode 100644 packages/miniapp-builder/src/config/getEntry.js delete mode 100644 packages/miniapp-builder/src/config/getFrameworkCDNUrl.js delete mode 100644 packages/miniapp-builder/src/config/getFrameworkVersion.js delete mode 100644 packages/miniapp-builder/src/config/getMiniProgramConfig.js delete mode 100644 packages/miniapp-builder/src/config/getMiniappType.js delete mode 100644 packages/miniapp-builder/src/config/getPluginWebpackConfig.js delete mode 100644 packages/miniapp-builder/src/config/getSFCConfig.js delete mode 100644 packages/miniapp-builder/src/config/getWebpackConfig.js delete mode 100644 packages/miniapp-builder/src/config/styleResolver.js delete mode 100644 packages/miniapp-builder/src/config/webpackBaseConfig.js delete mode 100644 packages/miniapp-builder/src/index.js delete mode 100644 packages/miniapp-builder/src/loaders/LocalAssetLoader.js delete mode 100644 packages/miniapp-builder/src/plugins/BabelPluginRootImport.js delete mode 100644 packages/miniapp-builder/src/plugins/PostcssPluginRpx2rem.js delete mode 100644 packages/miniapp-builder/src/plugins/PostcssPluginTagPrefix.js delete mode 100644 packages/miniapp-builder/src/plugins/WebpackMiniProgramPlugin.js delete mode 100644 packages/miniapp-builder/src/plugins/WebpackWrapPlugin.js delete mode 100644 packages/miniapp-builder/src/server/controllers/bundle.js delete mode 100644 packages/miniapp-builder/src/server/controllers/master.js delete mode 100644 packages/miniapp-builder/src/server/index.js delete mode 100644 packages/miniapp-builder/src/server/middlewares/dev.js delete mode 100644 packages/miniapp-builder/src/server/router.js delete mode 100644 packages/miniapp-builder/src/server/service/registerWatcher.js delete mode 100644 packages/miniapp-builder/src/server/views/master.ejs delete mode 100644 packages/miniapp-builder/sync-framework-version.js diff --git a/packages/miniapp-builder/README.md b/packages/miniapp-builder/README.md deleted file mode 100644 index 272714d8e0..0000000000 --- a/packages/miniapp-builder/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# miniapp builder - -Miniapp build cli tool. -Support sfc and mp type - -## Install - -```bash -npm install miniapp-builder -g -``` - -## dev server - -```bash -miniapp start -``` - -## build - -```bash -miniapp build -``` - -## args - -- `-p` port of dev server -- `-d` path of app source directory - diff --git a/packages/miniapp-builder/bin/cli.js b/packages/miniapp-builder/bin/cli.js deleted file mode 100755 index fd5eec2ea2..0000000000 --- a/packages/miniapp-builder/bin/cli.js +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env node - -const program = require('commander'); -const address = require('address'); -const pkgJSON = require('../package.json'); -const { resolve, isAbsolute } = require('path'); -const getMiniappType = require('../src/config/getMiniappType'); - -// print dependencies versions -console.log(`miniapp-cli: ${pkgJSON.version}`); -console.log(`mp-loader: ${require('mp-loader/package.json').version}`); -console.log(`sfc-loader: ${require('sfc-loader/package.json').version}`); - -console.log('---'); - -const cwd = process.cwd(); -const DEFAULT_PORT = 8081; -const DEFAULT_WORKDIR = cwd; -const TYPE_MAP = { - sfc: 'SFC Framework', - mp: 'Mini Program', - plugin: 'Mini Program Plugin', -}; - -program - .arguments(' [env]') - - .version(pkgJSON.version) - .option('-d, --dir ', ' Current work directory, default to CWD') - .option('-p, --port ', ' Dev server listening port, default to 6001') - .option('--renderer-inspect ', ' Enable renderer inspect mode, default to false') - .option('--renderer-inspect-host ', ' Inspect host for renderer, default to local ip') - .option('--renderer-inspect-port ', ' Inspect port for renderer, default to 8080') - .option('--renderer-url ', ' Renderer url for debug') - .action(function(cmd, env) { - const projectDir = program.dir ? resolveDir(program.dir) : DEFAULT_WORKDIR; - const port = program.port || DEFAULT_PORT; - const rendererInspect = !!program.rendererInspect; - const rendererInspectHost = program.rendererInspectHost || address.ip(); - const rendererInspectPort = program.rendererInspectPort || 8080; - const rendererUrl = program.rendererUrl; - - const miniappType = getMiniappType(projectDir); - if (!miniappType) { - console.log('Please Check your current directory is a valid project.'); - process.exit(1); - } else { - console.log(`Detect ${TYPE_MAP[miniappType]} type project.`); - } - - const options = { - projectDir, - port, - rendererInspect, - rendererInspectHost, - rendererInspectPort, - rendererUrl, - miniappType, - }; - const defaultFrameworkVersion = require('../src/config/frameworkVersion'); - const getFrameworkVersion = require('../src/config/getFrameworkVersion'); - const { updateFrameworkVersion } = require('../src/config/getFrameworkCDNUrl'); - getFrameworkVersion() - .then((version) => { - updateFrameworkVersion(version); - console.log('Using latest framework version:', version); - executeCommand(cmd, options); - }) - .catch((err) => { - console.warn('Update FrameworkVersion Failed, fallback to default verison:', defaultFrameworkVersion); - console.log(err); - executeCommand(cmd, options); - }); - }); - -program.parse(process.argv); - -function executeCommand(cmd, options) { - switch (cmd) { - case 'start': { - // Do this before start dev server, so that code reading it knows the right env. - process.env.NODE_ENV = 'development'; - require('../src/server')(options); - break; - } - case 'build': { - process.env.NODE_ENV = 'production'; - require('../src/builder')(options); - break; - } - default: - console.warn('Unknown Command: ' + cmd); - break; - } -} - -/** - * Resolve incoming dir - * @NOTE in windows, user may pass dir like `D:\path\to\project`, - * need to transform to `D:/path/to/project` by path.resolve, - * or webpack will throw error accroding to wrong path. - */ -function resolveDir(dir) { - if (!dir) { - return cwd; - } else if (isAbsolute(dir)) { - return resolve(dir); - } else { - return resolve(cwd, dir); - } -} diff --git a/packages/miniapp-builder/package.json b/packages/miniapp-builder/package.json deleted file mode 100644 index 43f7088526..0000000000 --- a/packages/miniapp-builder/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "miniapp-builder", - "version": "0.2.10-0", - "description": "Miniapp build kit for developers", - "main": "src/index.js", - "bin": { - "miniapp": "bin/cli.js" - }, - "files": [ - "bin/", - "src/" - ], - "engines": { - "node": "> 6" - }, - "repository": { - "type": "git", - "url": "git@github.com:alibaba/rax.git" - }, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.0.1", - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-decorators": "^7.0.0", - "@babel/plugin-proposal-do-expressions": "^7.0.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-export-namespace-from": "^7.0.0", - "@babel/plugin-proposal-function-bind": "^7.0.0", - "@babel/plugin-proposal-function-sent": "^7.0.0", - "@babel/plugin-proposal-json-strings": "^7.0.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-proposal-pipeline-operator": "^7.0.0", - "@babel/plugin-proposal-throw-expressions": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-syntax-import-meta": "^7.0.0", - "@babel/preset-env": "^7.0.0", - "address": "^1.0.3", - "autoprefixer": "^9.3.1", - "axios": "^0.18.0", - "babel-loader": "^8.0.2", - "chokidar": "^2.0.3", - "colors": "^1.3.2", - "commander": "^2.15.1", - "css-loader": "^1.0.1", - "ejs": "^2.6.1", - "fs-extra": "^7.0.1", - "glob": "^7.1.3", - "gulp": "^3.9.1", - "gulp-debug": "^3.x.x", - "gulp-imagemin": "^4.1.0", - "gulp-zip": "^4.2.0", - "gutil": "^1.6.4", - "jszip": "^3.1.5", - "klaw-sync": "^5.0.0", - "koa": "^2.5.1", - "koa-bodyparser": "^4.2.0", - "koa-router": "^7.4.0", - "koa-static": "^4.0.2", - "koa-webpack": "^3.0.2", - "lodash": "^4.17.10", - "mp-loader": "^0.7.15", - "null-loader": "^0.1.1", - "postcss": "^7.0.5", - "postcss-import": "^12.0.1", - "postcss-loader": "^3.0.0", - "postcss-selector-parser": "^5.0.0-rc.4", - "rimraf": "^2.6.2", - "run-sequence": "^2.2.1", - "sfc-loader": "^0.7.2", - "ts-loader": "^5.3.3", - "typescript": "^3.2.4", - "webpack": "^4.19.0", - "webpack-dev-middleware": "^3.2.0", - "webpack-merge": "^4.1.4", - "webpack-sources": "^1.2.0" - } -} diff --git a/packages/miniapp-builder/src/builder/index.js b/packages/miniapp-builder/src/builder/index.js deleted file mode 100644 index 95e6a6a324..0000000000 --- a/packages/miniapp-builder/src/builder/index.js +++ /dev/null @@ -1,58 +0,0 @@ -const gulp = require('gulp'); -const runSequence = require('run-sequence').use(gulp); -const { join } = require('path'); -const { getAppConfig } = require('../config/getAppConfig'); -const getMiniappType = require('../config/getMiniappType'); -const { registerGulpTasks } = require('./tasks'); - -const { BUILD_DEST } = process.env; - -module.exports = function(opts) { - const { projectDir } = opts; - const miniappType = getMiniappType(projectDir); - if (miniappType === 'plugin') { - return buildMiniAppPlugin(projectDir); - } else { - return buildMiniApp(projectDir); - } -}; - -function buildMiniApp(projectDir) { - registerGulpTasks({ - projectDir, - destDir: join(projectDir, BUILD_DEST || 'build'), - appConfig: getAppConfig(projectDir), - }); - - runSequence( - 'clean', - 'ensure-dir', - [ - 'build-config', - 'build-app', - 'build-schema', - 'build-module', - 'collect-assets', - 'build-include-files', - ], - 'bundle', - 'build-web', - ); -} - -function buildMiniAppPlugin(projectDir) { - registerGulpTasks({ - projectDir, - destDir: join(projectDir, BUILD_DEST || 'build'), - }); - - runSequence( - 'clean', - 'ensure-dir', - [ - 'build-plugin', - 'collect-assets', - ], - 'bundle-plugin', - ); -} diff --git a/packages/miniapp-builder/src/builder/tasks/buildApp.js b/packages/miniapp-builder/src/builder/tasks/buildApp.js deleted file mode 100644 index c31de19377..0000000000 --- a/packages/miniapp-builder/src/builder/tasks/buildApp.js +++ /dev/null @@ -1,38 +0,0 @@ -const gutil = require('gutil'); -const webpack = require('webpack'); -const merge = require('webpack-merge'); -const getWebpackConfig = require('../../config/getWebpackConfig'); - -module.exports = function(projectDir, destDir) { - return done => { - const baseConfig = getWebpackConfig(projectDir); - const config = merge(baseConfig, { - mode: 'production', - devtool: false, - output: { path: destDir } - }); - - webpack(config, function(err, stats) { - if (err) { - gutil.log('[Build Err]', err); - process.exit(1); - } else if (stats.toJson().errors.length > 0) { - gutil.log('[Build Err]', stats.toString({ all: true })); - process.exit(1); - } else { - gutil.log( - '[Build Success]', - stats.toString({ - colors: true, - children: false, - modules: false, - chunks: false, - entrypoints: false, - assets: false - }) - ); - done(); - } - }); - }; -}; diff --git a/packages/miniapp-builder/src/builder/tasks/buildConfig.js b/packages/miniapp-builder/src/builder/tasks/buildConfig.js deleted file mode 100644 index 8b30f90411..0000000000 --- a/packages/miniapp-builder/src/builder/tasks/buildConfig.js +++ /dev/null @@ -1,18 +0,0 @@ -const { writeFileSync } = require('fs'); -const { join } = require('path'); - -const CONFIG_FILENAME = 'app.config.json'; - -/** - * build config for miniapp - * @param {*} destDir - * @param {*} appConfig - */ -module.exports = function(destDir, appConfig) { - return done => { - const appConfigJSONPath = join(destDir, CONFIG_FILENAME); - const appConfigJSONContent = JSON.stringify(appConfig, null, 2) + '\n'; - writeFileSync(appConfigJSONPath, appConfigJSONContent, 'utf-8'); - done(); - }; -}; diff --git a/packages/miniapp-builder/src/builder/tasks/buildIncludeFiles.js b/packages/miniapp-builder/src/builder/tasks/buildIncludeFiles.js deleted file mode 100644 index 0c772a0c30..0000000000 --- a/packages/miniapp-builder/src/builder/tasks/buildIncludeFiles.js +++ /dev/null @@ -1,26 +0,0 @@ -const gulp = require('gulp'); -const debug = require('gulp-debug'); - -const INCLUDE_FILES = 'includeFiles'; - -/** - * Add `includeFiles` determated files to package. - */ -module.exports = function(destDir, projectDir, appConfig) { - return () => { - if (appConfig && INCLUDE_FILES in appConfig) { - return gulp - .src(appConfig[INCLUDE_FILES], { - base: projectDir, - nodir: true, - dot: true, - }) - .pipe(debug({ - title: 'Copy include files.' - })) - .pipe(gulp.dest(destDir)); - } else { - return Promise.resolve(); - } - }; -}; diff --git a/packages/miniapp-builder/src/builder/tasks/buildModule.js b/packages/miniapp-builder/src/builder/tasks/buildModule.js deleted file mode 100644 index c3c6540b27..0000000000 --- a/packages/miniapp-builder/src/builder/tasks/buildModule.js +++ /dev/null @@ -1,98 +0,0 @@ -const { join } = require('path'); -const { existsSync, readFileSync, writeFileSync } = require('fs'); -const colors = require('colors'); -const klawSync = require('klaw-sync'); -const getMiniappType = require('../../config/getMiniappType'); - -module.exports = function(destDir, projectDir) { - return done => { - const miniappType = getMiniappType(projectDir); - const assetBuildConfigPath = join(projectDir, 'abc.json'); - - if (miniappType !== 'mp') { - done(); - return; - } - - if (!existsSync(assetBuildConfigPath)) { - console.log(colors.green('[Skip] abc.json not exists, skip building template module.')); - done(); - return; - } - - let appExtraInfo; - let assetBuildConfig; - try { - assetBuildConfig = JSON.parse(readFileSync(assetBuildConfigPath, 'utf8')); - } catch (err) { - console.log(colors.red('[ERR] Reading or parsing abc.json')); - done(); - return; - } - - try { - appExtraInfo = JSON.parse(assetBuildConfig.projectinfo.ext); - } catch (err) { - console.log(colors.red('[ERR] Reading or parsing extra info from abc.json, please check projectinfo.ext field.')); - done(); - return; - } - - if (!appExtraInfo) { - console.log(colors.red('[ERR] App extra info empty, please check projectinfo.ext field in abc.json.')); - done(); - return; - } - - const pageMeta = { - appId: appExtraInfo.appId, - name: appExtraInfo.name, - type: appExtraInfo.type, - pages: {}, - modules: [] - }; - const mods = []; - - const modsDir = join(projectDir, 'mods'); - if (existsSync(modsDir)) { - const dirs = klawSync(modsDir, { nofile: true, depthLimit: 0 }); - for (const { path } of dirs) { - const packageDir = join(path, 'package.json'); - const schemaDir = join(path, 'schema/data.json'); - const mockDir = join(path, 'mock/data.json'); - if ( - existsSync(packageDir) && - existsSync(schemaDir) && - existsSync(mockDir) - ) { - try { - const data = - JSON.parse(readFileSync(packageDir, 'utf8')).blockConfig || {}; - data.schema = JSON.parse(readFileSync(schemaDir, 'utf8') || '{}'); - data.mock = JSON.parse(readFileSync(mockDir, 'utf8') || '{}'); - pageMeta.modules.push(data); - mods.push(data.name); - } catch (e) { - console.log(colors.yellow('[PageMeta] Mod format not valid.')); - } - } - } - - writeFileSync( - join(destDir, 'pageMeta.json'), - JSON.stringify(pageMeta, null, ' '), - 'utf8' - ); - - console.log( - colors.green('[PageMeta] Mod built successfully:', mods.join(', ')) - ); - } else { - console.log( - colors.green('[PageMeta] Skipping build, due to mods dir missing.') - ); - } - - done(); - }; -}; diff --git a/packages/miniapp-builder/src/builder/tasks/buildPlugin.js b/packages/miniapp-builder/src/builder/tasks/buildPlugin.js deleted file mode 100644 index 14c39180f6..0000000000 --- a/packages/miniapp-builder/src/builder/tasks/buildPlugin.js +++ /dev/null @@ -1,49 +0,0 @@ -const gutil = require('gutil'); -const { join } = require('path'); -const { existsSync } = require('fs'); -const webpack = require('webpack'); -const merge = require('webpack-merge'); -const getPluginWebpackConfig = require('../../config/getPluginWebpackConfig'); -const { copySync } = require('fs-extra'); - -const PLUGIN_CONFIG = 'plugin.json'; -const DEMO_PROJECT = 'miniprogram'; - -module.exports = function(projectDir, destDir) { - return done => { - const pluginConfigFile = join(projectDir, PLUGIN_CONFIG); - if (!existsSync(pluginConfigFile)) { - throw new Error(PLUGIN_CONFIG + ' file not exists.'); - } - - const pluginName = require(pluginConfigFile).name; - copySync(pluginConfigFile, join(destDir, PLUGIN_CONFIG)); - webpack(merge(getPluginWebpackConfig(projectDir, { pluginName }), { - output: { - path: destDir, - }, - }), function(err, stats) { - if (err) { - gutil.log('[Build Err]', err); - process.exit(1); - } else if (stats.toJson().errors.length > 0) { - gutil.log('[Build Err]', stats.toString({ all: true })); - process.exit(1); - } else { - gutil.log( - '[Build Success]', - stats.toString({ - colors: true, - children: false, - modules: false, - chunks: false, - entrypoints: false, - assets: false - }) - ); - - done(); - } - }); - }; -}; diff --git a/packages/miniapp-builder/src/builder/tasks/buildSchema.js b/packages/miniapp-builder/src/builder/tasks/buildSchema.js deleted file mode 100644 index 786e03fd9a..0000000000 --- a/packages/miniapp-builder/src/builder/tasks/buildSchema.js +++ /dev/null @@ -1,68 +0,0 @@ -const { join, extname } = require('path'); -const { copySync, mkdirpSync, existsSync, renameSync } = require('fs-extra'); - -const APP_CONFIG = 'app.config.json'; -const DATA_JSON = 'data.json'; -const SCHEMA_CONFIG = 'schema.json'; -const MOCK_DATA = 'mock-data.json'; - -/** - * Build Schema Files for template miniapp - * |---- .schema - * | |----app.config.json // same to miniapp config - * | |----mock-data.json // template mock data, from mock/data.json - * | |----schema.json // template schema, from schema/data.json - */ -module.exports = function(destDir, projectDir) { - const schemaSource = join(projectDir, 'schema'); - const mockSource = join(projectDir, 'mock'); - return (done) => { - const schemaDest = join(destDir, '.schema'); - mkdirpSync(schemaDest); - - /** - * Must ensure .schema/app.config.json exists, - * for server to read. - */ - copySync( - join(destDir, APP_CONFIG), - join(schemaDest, APP_CONFIG) - ); - - /** - * Copy folder: schema => .schema - * Only copy json file. - */ - copyIfExists(schemaSource, schemaDest, { - filter: (src) => { - // Pass folder itself - if (src === schemaSource) return true; - return extname(src) === '.json'; - } - }); - - /** - * Rename .schema/data.json -> .schema/schema.json - */ - const schemaDestData = join(schemaDest, DATA_JSON); - if (existsSync(schemaDestData)) { - renameSync(schemaDestData, join(schemaDest, SCHEMA_CONFIG)); - } - - /** - * Copy mock/data.json -> .schema/mock-data.json - */ - copyIfExists( - join(mockSource, DATA_JSON), - join(schemaDest, MOCK_DATA), - ); - - done(); - }; -}; - -function copyIfExists(from, to, opts) { - if (existsSync(from)) { - copySync(from, to, opts); - } -} diff --git a/packages/miniapp-builder/src/builder/tasks/buildWeb.js b/packages/miniapp-builder/src/builder/tasks/buildWeb.js deleted file mode 100644 index 6b27165923..0000000000 --- a/packages/miniapp-builder/src/builder/tasks/buildWeb.js +++ /dev/null @@ -1,44 +0,0 @@ -const { readFileSync, writeFileSync } = require('fs'); -const { join } = require('path'); -const ejs = require('ejs'); -const axios = require('axios'); -const { - getH5MasterView, - FRAMEWORK_VERSION -} = require('../../config/getFrameworkCDNUrl'); - -/** - * build web version of miniapp - * @param {*} appConfig - */ -module.exports = function buildWeb(destDir, appConfig) { - return done => { - let frameworkVersion; - if (appConfig.frameworkVersion) { - frameworkVersion = appConfig.frameworkVersion; - } else { - frameworkVersion = FRAMEWORK_VERSION; - } - - const frameworkMasterURL = getH5MasterView(frameworkVersion); - - axios(frameworkMasterURL).then(response => { - appConfig.h5Assets = '/build/app.web.js'; - - const webDistFileContent = [ - '__register_pages__(function(require){', - readFileSync(join(destDir, 'app.js'), 'utf-8'), - '});' - ].join('\n'); - const webDistFilePath = join(destDir, 'app.web.js'); - writeFileSync(webDistFilePath, webDistFileContent, 'utf-8'); - - const htmlFileContent = ejs.render(response.data, { - appConfig: JSON.stringify(appConfig) - }); - const htmlFilePath = join(destDir, 'index.html'); - writeFileSync(htmlFilePath, htmlFileContent, 'utf-8'); - done(); - }); - }; -}; diff --git a/packages/miniapp-builder/src/builder/tasks/bundle.js b/packages/miniapp-builder/src/builder/tasks/bundle.js deleted file mode 100644 index 679bd3ce85..0000000000 --- a/packages/miniapp-builder/src/builder/tasks/bundle.js +++ /dev/null @@ -1,12 +0,0 @@ -const gulp = require('gulp'); -const zip = require('gulp-zip'); - -module.exports = function(destDir) { - return () => gulp.src(['**', '!**/app.web.js'], { - cwd: destDir, - dot: true, - nodir: true, - }) - .pipe(zip('bundle.zip')) - .pipe(gulp.dest(destDir)); -}; diff --git a/packages/miniapp-builder/src/builder/tasks/bundlePlugin.js b/packages/miniapp-builder/src/builder/tasks/bundlePlugin.js deleted file mode 100644 index ac2bea214f..0000000000 --- a/packages/miniapp-builder/src/builder/tasks/bundlePlugin.js +++ /dev/null @@ -1,12 +0,0 @@ -const gulp = require('gulp'); -const zip = require('gulp-zip'); - -module.exports = function(destDir) { - return () => gulp.src(['*.js', 'plugin.json'], { - cwd: destDir, - dot: true, - nodir: true, - }) - .pipe(zip('bundle.zip')) - .pipe(gulp.dest(destDir)); -}; diff --git a/packages/miniapp-builder/src/builder/tasks/clean.js b/packages/miniapp-builder/src/builder/tasks/clean.js deleted file mode 100644 index 43cd8bcd81..0000000000 --- a/packages/miniapp-builder/src/builder/tasks/clean.js +++ /dev/null @@ -1,8 +0,0 @@ -const rimraf = require('rimraf'); - -module.exports = function clean(dir) { - return (done) => { - rimraf.sync(dir); - done(); - }; -}; \ No newline at end of file diff --git a/packages/miniapp-builder/src/builder/tasks/collectAssets.js b/packages/miniapp-builder/src/builder/tasks/collectAssets.js deleted file mode 100644 index 0b6c246633..0000000000 --- a/packages/miniapp-builder/src/builder/tasks/collectAssets.js +++ /dev/null @@ -1,19 +0,0 @@ -const gulp = require('gulp'); -const imagemin = require('gulp-imagemin'); -const debug = require('gulp-debug'); - -module.exports = function(destDir, projectDir) { - return () => { - return gulp.src('**/*.{apng,png,jpg,gif,ico,webp,jpeg,svg}', { - cwd: projectDir, - dot: true, - nodir: true, - ignore: ['**/node_modules/**', '**/build/**'], - }) - .pipe(imagemin()) - .pipe(debug({ - title: 'Image Assets Collection' - })) - .pipe(gulp.dest(destDir)); - }; -}; diff --git a/packages/miniapp-builder/src/builder/tasks/ensureDir.js b/packages/miniapp-builder/src/builder/tasks/ensureDir.js deleted file mode 100644 index 28c0fc9b86..0000000000 --- a/packages/miniapp-builder/src/builder/tasks/ensureDir.js +++ /dev/null @@ -1,8 +0,0 @@ -const { mkdirpSync } = require('fs-extra'); - -module.exports = function ensureDir(dir) { - return (done) => { - mkdirpSync(dir); - done(); - }; -}; diff --git a/packages/miniapp-builder/src/builder/tasks/index.js b/packages/miniapp-builder/src/builder/tasks/index.js deleted file mode 100644 index fadf9dd915..0000000000 --- a/packages/miniapp-builder/src/builder/tasks/index.js +++ /dev/null @@ -1,42 +0,0 @@ -const gulp = require('gulp'); - -/** - * Register all gulp tasks - */ -exports.registerGulpTasks = function({ appConfig, projectDir, destDir }) { - // Make sure build folder exists - gulp.task('ensure-dir', require('./ensureDir')(destDir)); - - // Make sure build folder clean - gulp.task('clean', require('./clean')(destDir)); - - // Entry of app build task - gulp.task('build-app', require('./buildApp')(projectDir, destDir)); - - // Entry of plugin build task - gulp.task('build-plugin', require('./buildPlugin')(projectDir, destDir)); - - // Entry of config build task - gulp.task('build-config', require('./buildConfig')(destDir, appConfig)); - - // Entry of web build task - gulp.task('build-web', require('./buildWeb')(destDir, appConfig)); - - // Build schema for template miniapp - gulp.task('build-schema', require('./buildSchema')(destDir, projectDir)); - - // Build module for template miniapp - gulp.task('build-module', require('./buildModule')(destDir, projectDir)); - - // Add `includeFiles` determated files to package. - gulp.task('build-include-files', require('./buildIncludeFiles')(destDir, projectDir, appConfig)); - - // Bundle zip file - gulp.task('bundle', require('./bundle')(destDir)); - - // Bundle plugin zip file - gulp.task('bundle-plugin', require('./bundlePlugin')(destDir)); - - // collect static assets - gulp.task('collect-assets', require('./collectAssets')(destDir, projectDir)); -}; diff --git a/packages/miniapp-builder/src/config/babelConfig.js b/packages/miniapp-builder/src/config/babelConfig.js deleted file mode 100644 index e06fe49bd1..0000000000 --- a/packages/miniapp-builder/src/config/babelConfig.js +++ /dev/null @@ -1,63 +0,0 @@ -module.exports = { - babelrc: false, - sourceMaps: true, - presets: [ - [ - require.resolve('@babel/preset-env'), - { - targets: { - chrome: '49', - ios: '8' - }, - modules: 'commonjs' - } - ] - ], - parserOpts: { - /** - * During loader process, user content JS may contains import statement, - * which may be wrapped at a function scope. - */ - allowImportExportEverywhere: true, - }, - plugins: [ - [ - require.resolve('../plugins/BabelPluginRootImport'), - { - rootPathPrefix: '/', - }, - ], - // Stage 0 - require.resolve('@babel/plugin-proposal-function-bind'), - // Stage 1 - require.resolve('@babel/plugin-proposal-export-default-from'), - require.resolve('@babel/plugin-proposal-logical-assignment-operators'), - [ - require.resolve('@babel/plugin-proposal-optional-chaining'), - { loose: false }, - ], - [ - require.resolve('@babel/plugin-proposal-pipeline-operator'), - { proposal: 'minimal' }, - ], - [ - require.resolve('@babel/plugin-proposal-nullish-coalescing-operator'), - { loose: false }, - ], - require.resolve('@babel/plugin-proposal-do-expressions'), - // Stage 2 - [require.resolve('@babel/plugin-proposal-decorators'), { legacy: true }], - require.resolve('@babel/plugin-proposal-function-sent'), - require.resolve('@babel/plugin-proposal-export-namespace-from'), - require.resolve('@babel/plugin-proposal-numeric-separator'), - require.resolve('@babel/plugin-proposal-throw-expressions'), - // Stage 3 - require.resolve('@babel/plugin-syntax-dynamic-import'), - require.resolve('@babel/plugin-syntax-import-meta'), - [ - require.resolve('@babel/plugin-proposal-class-properties'), - { loose: false }, - ], - require.resolve('@babel/plugin-proposal-json-strings'), - ], -}; diff --git a/packages/miniapp-builder/src/config/frameworkVersion.js b/packages/miniapp-builder/src/config/frameworkVersion.js deleted file mode 100644 index 7e4ee2bd1b..0000000000 --- a/packages/miniapp-builder/src/config/frameworkVersion.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = '0.1.63'; \ No newline at end of file diff --git a/packages/miniapp-builder/src/config/getAppConfig.js b/packages/miniapp-builder/src/config/getAppConfig.js deleted file mode 100644 index 07ec1f4faa..0000000000 --- a/packages/miniapp-builder/src/config/getAppConfig.js +++ /dev/null @@ -1,165 +0,0 @@ -const { join, resolve } = require('path'); -const { readFileSync, existsSync } = require('fs'); -const { getNativeRendererUrl, FRAMEWORK_VERSION } = require('./getFrameworkCDNUrl'); - -const EXTERNAL_PAGE_URL_REG = /^https?:\/\//; -const DEFAULT_CONFIG = { - /** - * Native appType for setting container type - */ - appType: 'webview', - /** - * Native SDK Version means API level - * if not satisfied, will notify upgrade - * for users. must be a typeof string. - */ - sdkVersion: '2', -}; - -/** - * Get configuration for app. - */ -const getAppConfig = exports.getAppConfig = function getAppConfig(projectDir, opts = {}) { - const manifestFilePath = join(projectDir, 'manifest.json'); - const appDotJSONFilePath = join(projectDir, 'app.json'); - const appJSON = Object.assign({}, DEFAULT_CONFIG); - - if (existsSync(manifestFilePath)) { - Object.assign(appJSON, readJSONSync(manifestFilePath)); - } else if (existsSync(appDotJSONFilePath)) { - Object.assign(appJSON, readJSONSync(appDotJSONFilePath)); - } else { - console.error('Cannot find one of following files: app.json | manifest.json'); - return null; - } - - const nativeRendererUrl = getNativeRendererUrl( - appJSON.frameworkVersion || FRAMEWORK_VERSION - ); - - const pages = []; - let homepage = 'index'; // default homepage - if (Array.isArray(appJSON.pages)) { - for (let i = 0; i < appJSON.pages.length; i++) { - const pageName = appJSON.pages[i]; - - if (i === 0) homepage = pageName; - - let pageUrl; - - if (EXTERNAL_PAGE_URL_REG.test(pageName)) { - pageUrl = pageName; - } else if (opts && opts.pageUrl) { - pageUrl = opts.pageUrl; - } else { - pageUrl = nativeRendererUrl; - } - - const pageConfig = { - pageName, - pageUrl - }; - - // Merge page config json to `window` property. - const independentPageConfigPath = resolve(projectDir, pageName + '.json'); - if (existsSync(independentPageConfigPath)) { - const independentPageConfig = JSON.parse(readFileSync(independentPageConfigPath)); - Object.assign(pageConfig, independentPageConfig); - } - - pages.push(pageConfig); - } - } else if (typeof appJSON.pages === 'object') { - const pageKeys = Object.keys(appJSON.pages); - for (let i = 0; i < pageKeys.length; i++) { - const pageName = pageKeys[i]; - const pagePath = appJSON.pages[pageName]; - - if (i === 0) homepage = pageName; - - let pageUrl; - - if (EXTERNAL_PAGE_URL_REG.test(pageName)) { - pageUrl = pageName; - } else if (opts && opts.pageUrl) { - pageUrl = opts.pageUrl; - } else { - pageUrl = nativeRendererUrl; - } - - const pageConfig = { - pageName, - pagePath, - pageUrl, - }; - // Merge page config json - const independentPageConfigPath = resolve(projectDir, pagePath + '.json'); - if (existsSync(independentPageConfigPath)) { - Object.assign(pageConfig, JSON.parse(readFileSync(independentPageConfigPath))); - } - - pages.push(pageConfig); - } - } - - const result = Object.assign({}, appJSON, { - pages, - homepage, - }); - - let tabBar = {}; - if (appJSON.tabBar) { - Object.assign(tabBar, appJSON.tabBar); - } - - if (tabBar.textColor) { - tabBar.color = tabBar.textColor; - delete tabBar.textColor; - } - - if (Array.isArray(tabBar.items)) { - tabBar.list = tabBar.items.map((item) => { - return { - pageName: item.pagePath, - text: item.name, - iconPath: item.icon, - selectedIconPath: item.activeIcon, - }; - }); - delete tabBar.items; - } - - if (appJSON.window) { - result.window = appJSON.window; - } - - // h5Pages 指定 webview 的白名单 - if (appJSON.h5Pages) { - result.h5Pages = appJSON.h5Pages; - } - - result.tabBar = tabBar; - - /** - * Add plugin definition to app config. - */ - if (opts.pluginAssets) { - result.pluginAssets = opts.pluginAssets; - } - - return result; -}; - -/** - * Get JS Object from filename. - */ -function readJSONSync(filename) { - return JSON.parse(readFileSync(filename, 'utf-8')); -} - -/** - * Get list of page names. - */ -exports.getPages = function getPages(projectDir) { - return getAppConfig(projectDir).pages; -}; diff --git a/packages/miniapp-builder/src/config/getEntry.js b/packages/miniapp-builder/src/config/getEntry.js deleted file mode 100644 index bd85b5b2fb..0000000000 --- a/packages/miniapp-builder/src/config/getEntry.js +++ /dev/null @@ -1,39 +0,0 @@ -const { resolve } = require('path'); -const getMiniappType = require('./getMiniappType'); -const { getPages } = require('./getAppConfig'); - -const PLUGIN_REG = /^plugin:\/\//; - -/** - * Get webpack entry - * @param {String} projectDir 项目路径 - */ -module.exports = function getEntry(projectDir) { - const miniappType = getMiniappType(projectDir); - const appPages = getPages(projectDir); - const entry = {}; - - if (miniappType === 'sfc') { - /* app entry */ - entry.$app = resolve(projectDir, 'app.js'); - /* page entry */ - appPages.forEach(({ pagePath, pageName }) => { - if (isPluginPage(pageName)) return; - entry[pageName] = resolve(projectDir, pagePath); - }); - } else if (miniappType === 'mp') { - /* app entry */ - entry.app = resolve(projectDir, 'app.js'); - } - - return entry; -}; - -/** - * Determin which page name is a plugin page. - * @param pageName - * @returns {boolean} - */ -function isPluginPage(pageName) { - return PLUGIN_REG.test(pageName); -} diff --git a/packages/miniapp-builder/src/config/getFrameworkCDNUrl.js b/packages/miniapp-builder/src/config/getFrameworkCDNUrl.js deleted file mode 100644 index 4ec89d86ff..0000000000 --- a/packages/miniapp-builder/src/config/getFrameworkCDNUrl.js +++ /dev/null @@ -1,30 +0,0 @@ -let FRAMEWORK_VERSION = exports.FRAMEWORK_VERSION = require('./frameworkVersion'); - -const FRAMEWORK_CDN_PREFIX = 'https://g.alicdn.com/code/npm/miniapp-framework/'; -const FRAMEWORK_CDN_SUFFIX = '/dist'; - -const FRAMEWORK_WORKER = '/native/worker.js'; -const FRAMEWORK_RENDERER = '/native/renderer.js'; -const FRAMEWORK_RENDERER_VIEW = '/native/renderer.html'; - -const FRAMEWORK_H5_MASTER = '/h5/master.js'; -const FRAMEWORK_H5_VIEW = '/h5/master.html'; - -exports.updateFrameworkVersion = function(version) { - FRAMEWORK_VERSION = exports.FRAMEWORK_VERSION = version; -}; - -const getNativeRendererUrl = exports.getNativeRendererUrl = function(version) { - return FRAMEWORK_CDN_PREFIX + version + FRAMEWORK_CDN_SUFFIX + FRAMEWORK_RENDERER_VIEW; -}; -exports.nativeRendererUrl = getNativeRendererUrl(FRAMEWORK_VERSION); - -const getH5Master = exports.getH5Master = function(version) { - return FRAMEWORK_CDN_PREFIX + version + FRAMEWORK_CDN_SUFFIX + FRAMEWORK_H5_MASTER; -}; -exports.h5Master = getH5Master(FRAMEWORK_VERSION); - -const getH5MasterView = exports.getH5MasterView = function(version) { - return FRAMEWORK_CDN_PREFIX + version + FRAMEWORK_CDN_SUFFIX + FRAMEWORK_H5_VIEW; -}; -exports.h5MasterView = getH5MasterView(FRAMEWORK_VERSION); diff --git a/packages/miniapp-builder/src/config/getFrameworkVersion.js b/packages/miniapp-builder/src/config/getFrameworkVersion.js deleted file mode 100644 index fe32558cd0..0000000000 --- a/packages/miniapp-builder/src/config/getFrameworkVersion.js +++ /dev/null @@ -1,30 +0,0 @@ -const axios = require('axios'); -const defaultFrameworkVersion = require('./frameworkVersion'); - -const NPM_NAME = 'miniapp-framework'; -const DEFAULT_REGISTRIES = [ - 'https://registry.npm.taobao.org', - 'https://r.cnpmjs.org', - 'https://registry.npmjs.com', -]; - -function getFrameworkVersion(tag = 'latest') { - return getRemotePackage(NPM_NAME, tag, process.env.NPM_REGISTRY) - .then((response) => { - return response && response.version || defaultFrameworkVersion; - }); -} - -function getRemotePackage(name, tag, registry) { - const registries = (registry ? [ registry ] : []).concat(DEFAULT_REGISTRIES); - - return (function run(registries, idx) { - if (!registries[idx]) return Promise.resolve(null); - const registryPackageURL = registries[idx] + '/' + name + '/' + tag; - return axios({ url: registryPackageURL, responseType: 'json', timeout: 1000 }) - .then((response) => response.data) - .catch(() => run(registries, idx + 1)); - })(registries, 0); -} - -module.exports = getFrameworkVersion; diff --git a/packages/miniapp-builder/src/config/getMiniProgramConfig.js b/packages/miniapp-builder/src/config/getMiniProgramConfig.js deleted file mode 100644 index 94fce931ce..0000000000 --- a/packages/miniapp-builder/src/config/getMiniProgramConfig.js +++ /dev/null @@ -1,81 +0,0 @@ -const { join } = require('path'); -const babelConfig = require('./babelConfig'); -const styleResolver = require('./styleResolver'); -const WebpackMiniProgramPlugin = require('../plugins/WebpackMiniProgramPlugin'); - -const babelLoaderConfig = { - loader: require.resolve('babel-loader'), - options: babelConfig, -}; - -module.exports = (projectDir, opts) => { - const shouldEnableSourceMap = opts && opts.isDevServer === true; - return { - devtool: shouldEnableSourceMap ? 'eval-source-map' : false, - output: { - path: join(projectDir, 'build'), - // show at devtool console panel - devtoolModuleFilenameTemplate: 'webpack://[namespace]/[resource-path]', - devtoolNamespace: 'miniapp', - }, - module: { - rules: [ - { - test: /\.js$/, - use: [babelLoaderConfig], - }, - /** - * Post babel loader to compile template attribute expression - */ - { - test: /\.axml$/, - enforce: 'post', - use: [babelLoaderConfig], - }, - { - test: /\.acss$/, - use: [ - { - loader: require.resolve('css-loader'), - options: { - /** - * @NOTE This sourceMap option can override webpack's devtool. - */ - sourceMap: shouldEnableSourceMap, - importLoaders: 1 // 0 => no loaders (default); 1 => postcss-loader; 2 => postcss-loader, sass-loader - } - }, - { - loader: require.resolve('postcss-loader'), - options: { - sourceMap: shouldEnableSourceMap, - plugins: [ - require('postcss-import')({ resolve: styleResolver }), - require('../plugins/PostcssPluginRpx2rem'), - require('../plugins/PostcssPluginTagPrefix'), - require('autoprefixer')({ - remove: false, - browsers: ['ios_saf 8'], - }), - ] - } - }, - ] - }, - { - test: /\.(a?png|jpe?g|gif|webp|svg|ico)$/i, - loader: require.resolve('../loaders/LocalAssetLoader'), - }, - { - test: /app\.js$/, - loader: require.resolve('mp-loader'), - }, - ], - }, - plugins: [ - new WebpackMiniProgramPlugin({ - isH5: opts.isDevServer, - }), - ], - }; -}; diff --git a/packages/miniapp-builder/src/config/getMiniappType.js b/packages/miniapp-builder/src/config/getMiniappType.js deleted file mode 100644 index 67eddb08d8..0000000000 --- a/packages/miniapp-builder/src/config/getMiniappType.js +++ /dev/null @@ -1,27 +0,0 @@ -const { join } = require('path'); -const { existsSync } = require('fs'); - -/** - * 判断小程序类型 - * 返回 null 表示两者都不是 - * @param {String} projectDir 项目目录 - */ -module.exports = function getMiniappType(projectDir) { - if (!projectDir) { - return null; - } - - if (existsSync(join(projectDir, 'manifest.json'))) { - return 'sfc'; // 轻应用 sfc dsl - } - - if (existsSync(join(projectDir, 'app.json'))) { - return 'mp'; // 小程序 mini program - } - - if (existsSync(join(projectDir, 'plugin.json'))) { - return 'plugin'; // 小程序 mini program 插件 - } - - return null; -}; diff --git a/packages/miniapp-builder/src/config/getPluginWebpackConfig.js b/packages/miniapp-builder/src/config/getPluginWebpackConfig.js deleted file mode 100644 index f6b0b12e14..0000000000 --- a/packages/miniapp-builder/src/config/getPluginWebpackConfig.js +++ /dev/null @@ -1,86 +0,0 @@ -const { resolve } = require('path'); -const merge = require('webpack-merge'); -const { getAppConfig } = require('./getAppConfig'); -const styleResolver = require('./styleResolver'); -const webpackBaseConfig = require('./webpackBaseConfig'); -const babelConfig = require('./babelConfig'); - -const pluginLoader = require.resolve('mp-loader/src/plugin-loader'); - -const babelLoaderConfig = { - loader: require.resolve('babel-loader'), - options: babelConfig, -}; - -module.exports = function(pluginDir, options) { - const { pluginName } = options; - const pluginConfigPath = resolve(pluginDir, 'plugin.json'); - const pluginConfig = require(pluginConfigPath); - const pluginWebpackConfig = { - entry: { - index: pluginLoader + '?pluginName=' + pluginName + '&pluginConfig=' + encodeURIComponent(pluginConfigPath) + '!' + pluginConfig.main || 'index.js', - }, - mode: process.env.NODE_ENV || 'development', - context: pluginDir, - module: { - rules: [ - { - test: /\.js$/, - use: [babelLoaderConfig], - }, - /** - * Post babel loader to compile template attribute expression - */ - { - test: /\.axml$/, - enforce: 'post', - use: [babelLoaderConfig], - }, - { - test: /\.acss$/, - use: [ - { - loader: require.resolve('css-loader'), - options: { - sourceMap: true, - importLoaders: 1 // 0 => no loaders (default); 1 => postcss-loader; 2 => postcss-loader, sass-loader - } - }, - { - loader: require.resolve('postcss-loader'), - options: { - sourceMap: true, - plugins: [ - require('postcss-import')({ resolve: styleResolver }), - require('../plugins/PostcssPluginRpx2rem'), - require('../plugins/PostcssPluginTagPrefix'), - require('autoprefixer')({ remove: false }), - ] - } - }, - ] - }, - { - test: /\.(a?png|jpe?g|gif|webp|svg|ico)$/i, - loader: require.resolve('../loaders/LocalAssetLoader'), - }, - ], - }, - plugins: [ - new class { - apply(compiler) { - compiler.hooks.compilation.tap('compilation', (compilation) => { - compilation.hooks.optimizeAssets.tap('MiniAppPlugin', () => { - global.AppPluginContent = compilation.assets['index.js'].source(); - }); - }); - } - } - ], - }; - - return merge( - webpackBaseConfig, - pluginWebpackConfig - ); -}; diff --git a/packages/miniapp-builder/src/config/getSFCConfig.js b/packages/miniapp-builder/src/config/getSFCConfig.js deleted file mode 100644 index 05a70fe672..0000000000 --- a/packages/miniapp-builder/src/config/getSFCConfig.js +++ /dev/null @@ -1,103 +0,0 @@ -const { join } = require('path'); -const WebpackWrapPlugin = require('../plugins/WebpackWrapPlugin'); -const WebpackMiniProgramPlugin = require('../plugins/WebpackMiniProgramPlugin'); -const babelConfig = require('./babelConfig'); - -const SFCLoader = require.resolve('sfc-loader'); - -/** - * SFC DSL webpack config - */ -module.exports = (projectDir, opts) => { - const { appConfig, isDevServer } = opts; - const shouldEnableSourceMap = isDevServer === true; - return { - devtool: shouldEnableSourceMap ? 'eval-source-map' : false, - output: { - libraryTarget: 'commonjs2', - path: join(projectDir, 'build/pages'), - filename: '[name].js', - }, - module: { - rules: [ - { - test: /\.(sfc|vue|html)$/, - oneOf: [ - { - resourceQuery: /\?style/, - use: [ - { - loader: require.resolve('css-loader'), - options: { - /** - * @NOTE This sourceMap option can override webpack's devtool. - */ - sourceMap: shouldEnableSourceMap, - importLoaders: 1 // 0 => no loaders (default); 1 => postcss-loader; 2 => postcss-loader, sass-loader - } - }, - { - loader: require.resolve('postcss-loader'), - options: { - sourceMap: shouldEnableSourceMap, - plugins: [ - require('postcss-import')({ resolve: require('./styleResolver') }), - require('../plugins/PostcssPluginRpx2rem'), - require('../plugins/PostcssPluginTagPrefix'), - require('autoprefixer')({ - remove: false, - browsers: ['ios_saf 8'], - }), - ] - } - }, - { - loader: SFCLoader, - options: { - part: 'style', - }, - } - ] - }, - { - loader: SFCLoader, - options: { - builtInRax: true, - module: 'commonjs', - cssInJS: !appConfig.enableCSS, - }, - } - ], - - }, - { - test: /\.jsx?$/, - loader: require.resolve('babel-loader'), - options: babelConfig, - }, - ], - }, - plugins: [ - new WebpackWrapPlugin({ - header: (fileName, entry, chunks) => { - if (fileName === '$app.js') { - // app entry - // 加一个换行 避免注释影响 - return "\nrequire('@core/app').register({type:'app'},function(module,exports,require){"; - } else { - // page entry - const pageName = fileName.replace(/\.js$/, ''); - const pageDesc = JSON.stringify({ - page: pageName, - }); - return `\nrequire('@core/page').register(${pageDesc},function(module,exports,require){`; - } - }, - footer: '});', - }), - new WebpackMiniProgramPlugin({ - isH5: opts.isDevServer, - }), - ], - }; -}; diff --git a/packages/miniapp-builder/src/config/getWebpackConfig.js b/packages/miniapp-builder/src/config/getWebpackConfig.js deleted file mode 100644 index 9a1349296e..0000000000 --- a/packages/miniapp-builder/src/config/getWebpackConfig.js +++ /dev/null @@ -1,38 +0,0 @@ -const merge = require('webpack-merge'); -const webpackBaseConfig = require('./webpackBaseConfig'); -const getEntry = require('./getEntry'); -const { getAppConfig } = require('./getAppConfig'); -const getMiniappType = require('../config/getMiniappType'); - -// devtool: 'eval-source-map', -module.exports = function getWebpackConfig(projectDir, isDevServer) { - const appConfig = getAppConfig(projectDir); - const miniappType = getMiniappType(projectDir); - const mergeConfig = { - entry: getEntry(projectDir), - mode: process.env.NODE_ENV || 'development', - context: projectDir, - }; - - if (miniappType === 'sfc') { - return merge( - webpackBaseConfig, - require('./getSFCConfig')(projectDir, { - isDevServer, - appConfig, - }), - mergeConfig, - ); - } else if (miniappType === 'mp') { - return merge( - webpackBaseConfig, - require('./getMiniProgramConfig')(projectDir, { - isDevServer, - appConfig, - }), - mergeConfig, - ); - } else { - throw new Error('Cannot recognize MiniApp Type!'); - } -}; diff --git a/packages/miniapp-builder/src/config/styleResolver.js b/packages/miniapp-builder/src/config/styleResolver.js deleted file mode 100644 index ba2e543457..0000000000 --- a/packages/miniapp-builder/src/config/styleResolver.js +++ /dev/null @@ -1,34 +0,0 @@ -const { extname, join } = require('path'); - -const ABSOLUTE_REG = /^\//; -const RELATIVE_REG = /^\./; -const STYLE_EXT = '.acss'; - -/** - * Resolve postcss file path - * eg. - * @import "./button.acss"; // relative path - * @import "/button.acss"; // absolute path to project - * @import "third-party/button.acss"; // npm package - */ -module.exports = function styleResolver(id, basedir, importOptions) { - let filePath; - if (ABSOLUTE_REG.test(id)) { - filePath = join(importOptions.root, id); - } else if (RELATIVE_REG.test(id)) { - filePath = join(basedir, id); - } else { - filePath = require.resolve(id, { - paths: [join(importOptions.root, 'node_modules')] - }); - } - - /** - * Allow to ignore extension, default to .acss - */ - if (extname(filePath) !== STYLE_EXT) { - filePath = filePath + STYLE_EXT; - } - - return filePath; -}; diff --git a/packages/miniapp-builder/src/config/webpackBaseConfig.js b/packages/miniapp-builder/src/config/webpackBaseConfig.js deleted file mode 100644 index dd577cbbc6..0000000000 --- a/packages/miniapp-builder/src/config/webpackBaseConfig.js +++ /dev/null @@ -1,40 +0,0 @@ -const webpack = require('webpack'); - -const cwd = process.cwd(); -const tsLoader = require.resolve('ts-loader'); - -module.exports = { - devServer: { - stats: { - children: false, - modules: false, - chunks: false, - }, - host: '0.0.0.0', - }, - resolve: { - modules: ['node_modules', cwd], - extensions: ['.js', '.json', '.ts', '.html', '.sfc'], - }, - module: { - rules: [ - { - test: /\.ts$/, - loader: tsLoader, - }, - ], - }, - externals: [ - function(context, request, callback) { - if (/^@(core|schema)\//.test(request)) { - return callback(null, `commonjs2 ${request}`); - } - callback(); - }, - ], - plugins: [ - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), - }), - ], -}; diff --git a/packages/miniapp-builder/src/index.js b/packages/miniapp-builder/src/index.js deleted file mode 100644 index 4e8fa7ccf6..0000000000 --- a/packages/miniapp-builder/src/index.js +++ /dev/null @@ -1,2 +0,0 @@ -exports.server = require('./server'); -exports.builder = require('./builder'); diff --git a/packages/miniapp-builder/src/loaders/LocalAssetLoader.js b/packages/miniapp-builder/src/loaders/LocalAssetLoader.js deleted file mode 100644 index 035c3720fa..0000000000 --- a/packages/miniapp-builder/src/loaders/LocalAssetLoader.js +++ /dev/null @@ -1,17 +0,0 @@ -const { relative } = require('path'); - -const FILE_SCHEMA_PREFIX = '__file_schema_prefix__'; - -function escapeWindowsSep(str) { - return str.replace(/\\/g, '/'); -} - -module.exports = function() { - const assetPath = `/${relative(this.rootContext, this.resourcePath)}`; - return ` - var prefix = typeof ${FILE_SCHEMA_PREFIX} !== 'undefined' - ? ${FILE_SCHEMA_PREFIX} - : ''; - module.exports = prefix + '${escapeWindowsSep(assetPath)}'; - `; -}; diff --git a/packages/miniapp-builder/src/plugins/BabelPluginRootImport.js b/packages/miniapp-builder/src/plugins/BabelPluginRootImport.js deleted file mode 100644 index fb0a93dd02..0000000000 --- a/packages/miniapp-builder/src/plugins/BabelPluginRootImport.js +++ /dev/null @@ -1,152 +0,0 @@ -const path = require('path'); - -const root = process.cwd(); - -function RootImportPlugin({ types: t }) { - const visitor = { - CallExpression: function CallExpression(path, state) { - if (path.node.callee.name !== 'require') { - return; - } - - let args = path.node.arguments; - if (!args.length) { - return; - } - - let firstArg = traverseExpression(t, args[0]); - - if (firstArg) { - firstArg.value = replacePrefix(firstArg.value, state.opts, state.file.opts.filename); - } - }, - ImportDeclaration: function ImportDeclaration(path, state) { - path.node.source.value = replacePrefix(path.node.source.value, state.opts, state.file.opts.filename); - }, - ExportNamedDeclaration: function ExportNamedDeclaration(path, state) { - if (path.node.source) { - path.node.source.value = replacePrefix(path.node.source.value, state.opts, state.file.opts.filename); - } - }, - ExportAllDeclaration: function ExportAllDeclaration(path, state) { - if (path.node.source) { - path.node.source.value = replacePrefix(path.node.source.value, state.opts, state.file.opts.filename); - } - } - }; - return { - 'visitor': { - Program: function Program(path, state) { - path.traverse(visitor, state); - } - } - }; -} - - -function replacePrefix(path, opts = [], sourceFile) { - const options = [].concat(opts); - - for (let i = 0; i < options.length; i++) { - let rootPathSuffix = ''; - let rootPathPrefix = ''; - let option = options[i]; - - if (option.rootPathSuffix && typeof option.rootPathSuffix === 'string') { - rootPathSuffix = option.rootPathSuffix; - } - if (option.rootPathPrefix && typeof option.rootPathPrefix === 'string') { - rootPathPrefix = option.rootPathPrefix; - } else { - rootPathPrefix = '~'; - } - - if (hasRootPathPrefixInString(path, rootPathPrefix)) { - return transformRelativeToRootPath(path, rootPathSuffix, rootPathPrefix, sourceFile); - } - } - - return path; -} - - -/** - * Recursively traverses binary expressions to find the first `StringLiteral` if any. - * @param {Object} t Babel types - * @param {Node} arg a Babel node - * @return {StringLiteral?} - */ -function traverseExpression(t, arg) { - if (t.isStringLiteral(arg)) { - return arg; - } - - if (t.isBinaryExpression(arg)) { - return traverseExpression(t, arg.left); - } - - return null; -} - -function hasRootPathPrefixInString(importPath, rootPathPrefix = '~') { - let containsRootPathPrefix = false; - if (typeof importPath === 'string') { - if (importPath.substring(0, 1) === rootPathPrefix) { - containsRootPathPrefix = true; - } - let firstTwoCharactersOfString = importPath.substring(0, 2); - if (firstTwoCharactersOfString === rootPathPrefix + '/') { - containsRootPathPrefix = true; - } - } - return containsRootPathPrefix; -} - -function transformRelativeToRootPath(importPath, rootPathSuffix, rootPathPrefix, sourceFile = '') { - sourceFile = slash(sourceFile); - let withoutRootPathPrefix = ''; - if (hasRootPathPrefixInString(importPath, rootPathPrefix)) { - if (importPath.substring(0, 1) === '/') { - withoutRootPathPrefix = importPath.substring(1, importPath.length); - } else { - withoutRootPathPrefix = importPath.substring(2, importPath.length); - } - let absolutePath = path.resolve((rootPathSuffix ? rootPathSuffix : './') + '/' + withoutRootPathPrefix); - let sourcePath = sourceFile.substring(0, sourceFile.lastIndexOf('/')); - // if the path is an absolute path (webpack sends '/Users/foo/bar/baz.js' here) - if (sourcePath.indexOf('/') === 0 || sourcePath.indexOf(':/') === 1 || sourcePath.indexOf(':\\') === 1) { - sourcePath = sourcePath.substring(root.length + 1); - } - sourcePath = path.resolve(sourcePath); - let relativePath = slash(path.relative(sourcePath, absolutePath)); - // if file is located in the same folder - if (relativePath.indexOf('../') !== 0) { - relativePath = './' + relativePath; - } - // if the entry has a slash, keep it - if (importPath[importPath.length - 1] === '/') { - relativePath += '/'; - } - return relativePath; - } - if (typeof importPath === 'string') { - return importPath; - } - throw new Error('ERROR: No path passed'); -} - -/** - * Convert Windows backslash paths to slash paths: `foo\\bar` -> `foo/bar` - */ -function slash(str) { - const isExtendedLengthPath = /^\\\\\?\\/.test(str); - const hasNonAscii = /[^\x00-\x80]+/.test(str); - - if (isExtendedLengthPath || hasNonAscii) { - return str; - } - - return str.replace(/\\/g, '/'); -} - -module.exports = RootImportPlugin; diff --git a/packages/miniapp-builder/src/plugins/PostcssPluginRpx2rem.js b/packages/miniapp-builder/src/plugins/PostcssPluginRpx2rem.js deleted file mode 100644 index ae7223f631..0000000000 --- a/packages/miniapp-builder/src/plugins/PostcssPluginRpx2rem.js +++ /dev/null @@ -1,35 +0,0 @@ -const postcss = require('postcss'); -// !singlequotes|!doublequotes|!url()|pixelunit -const rpxRegex = /"[^"]+"|'[^']+'|url\([^\)]+\)|(\d*\.?\d+)rpx/g; - -const defaults = { - remRatio: 100, // Ref: https://github.com/alibaba/rax/tree/master/packages/rax-server-renderer#config-rem-ratio -}; - -module.exports = postcss.plugin('postcss-rpx2rem', function(options) { - var opts = Object.assign({}, defaults, options); - var remReplace = createRemReplace( - opts.remRatio - ); - - return function(root) { - root.walkDecls(function(decl, i) { - // This should be the fastest test and will remove most declarations - if (decl.value.indexOf('rpx') === -1) return; - decl.value = decl.value.replace(rpxRegex, remReplace); - }); - - root.walkAtRules('media', function(rule) { - if (rule.params.indexOf('rpx') === -1) return; - rule.params = rule.params.replace(rpxRegex, remReplace); - }); - }; -}); - -function createRemReplace(remRatio) { - return function(m, $1) { - if (!$1) return m; - let remVal = parseFloat($1) / remRatio; - return remVal === 0 ? '0' : remVal + 'rem'; - }; -} \ No newline at end of file diff --git a/packages/miniapp-builder/src/plugins/PostcssPluginTagPrefix.js b/packages/miniapp-builder/src/plugins/PostcssPluginTagPrefix.js deleted file mode 100644 index 82ee75d7bc..0000000000 --- a/packages/miniapp-builder/src/plugins/PostcssPluginTagPrefix.js +++ /dev/null @@ -1,56 +0,0 @@ -const postcss = require('postcss'); -const selectorParser = require('postcss-selector-parser'); - -const VALID_TAG_REG = /^[a-z](?:[\-\.0-9_a-z\xB7\xC0-\xD6\xD8-\xF6\xF8-\u037D\u037F-\u1FFF\u200C\u200D\u203F\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|[\uD800-\uDB7F][\uDC00-\uDFFF])*$/; - -module.exports = postcss.plugin('postcss-tag-prefix', function(options) { - const prefix = options && options.prefix || 'a-'; - return function(root) { - // append "a-" prefix - root.walkRules(rule => { - /** - * Keyframes rule should not be prefixed, - * but other atRule should. - * should not prefix: - * @keyframes foo { - * from {} - * to {} - * } - * should prefix: - * @media screen (width < 100px) { - * image {} - * } - */ - if (rule.parent.type === 'atrule' && rule.parent.name === 'keyframes') { - return; - } - rule.selector = selectorParser(function addPrefixToTag(node) { - node.walk(selector => { - if (selector.type !== 'selector') { - return; - } - - selector.nodes.forEach((node) => { - if (node.type !== 'tag') { - return; - } - /** - * Prefix tags - * should be prefixed. eg: - * .foo:not(image) {} - * should not be prefixed. eg: - * .foo:nth-child(3n) {} - */ - if (isValidTag(node.value)) { - node.value = prefix + node.value; - } - }); - }); - }).processSync(rule.selector); - }); - }; -}); - -function isValidTag(tagName) { - return VALID_TAG_REG.test(tagName); -} diff --git a/packages/miniapp-builder/src/plugins/WebpackMiniProgramPlugin.js b/packages/miniapp-builder/src/plugins/WebpackMiniProgramPlugin.js deleted file mode 100644 index 4efb33eca3..0000000000 --- a/packages/miniapp-builder/src/plugins/WebpackMiniProgramPlugin.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * 对于 mp 类型的小程序 - * 合并所有页面文件到 app.js - * 并增加执行的 wrapper - */ -const { readFileSync, existsSync } = require('fs'); -const { join } = require('path'); -const { ConcatSource } = require('webpack-sources'); - -const SCHEMA_VAR = '__SCHEMA_MOCK_DATA__'; - -const webRegisterWrapper = [ - '__register_pages__(function(require){', - '})', -]; -const globalPolyfills = [ - "var __global__ = typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : new Function('return this')();", - "typeof polyfill === 'function' && polyfill(__global__);", -]; - -module.exports = class WebpackMiniProgramPlugin { - constructor(opts) { - if (opts && opts.isH5) { - this.isH5 = true; - } - } - apply(compiler) { - compiler.hooks.compilation.tap('compilation', (compilation) => { - compilation.hooks.optimizeAssets.tap('MiniAppPlugin', () => { - const args = Object.values(compilation.assets); - - // polyfill global context - args.unshift(new ConcatSource(globalPolyfills.join(''))); - args.unshift(ConcatSource); - - const app = new (ConcatSource.bind.apply(ConcatSource, args))(); - - // 删除原 assets - Object.keys(compilation.assets).forEach((key) => { - delete compilation.assets[key]; - }); - - // 增加 app.js - // wrapper for app.js - compilation.assets['app.js'] = app; - global.AppJSContent = app.source(); - - let injectSchemaMockData; - const mockDataPath = join(compiler.context, 'schema/mock-data.json'); - if (existsSync(mockDataPath)) { - try { - const mockData = JSON.parse(readFileSync(mockDataPath)); - // Inject schema data - injectSchemaMockData = ` - try { - ${SCHEMA_VAR} = ${JSON.stringify(mockData)}; - } catch(err) { - console.warn('Inject schema data with error', err); - } - `; - } catch (err) { - throw new Error('Please check schema/mock-data.json is a valid JSON string.'); - } - } - - compilation.assets['app.web.js'] = new ConcatSource( - webRegisterWrapper[0], - app, - injectSchemaMockData ? injectSchemaMockData : '', - webRegisterWrapper[1] - ); - }); - }); - } -}; diff --git a/packages/miniapp-builder/src/plugins/WebpackWrapPlugin.js b/packages/miniapp-builder/src/plugins/WebpackWrapPlugin.js deleted file mode 100644 index a3c0eabc14..0000000000 --- a/packages/miniapp-builder/src/plugins/WebpackWrapPlugin.js +++ /dev/null @@ -1,71 +0,0 @@ -const { ConcatSource } = require('webpack-sources'); -const assert = require('assert'); - -/** - * 对文件进行上下包裹, 实现类似 node.js 中 cjs 模块包裹 - * ['(function(require, module, exports){', '})();'] 的功能 - */ -module.exports = class WebpackWrapPlugin { - /** - * WraperPlugin - * @param {Object} options 选项 - * @param {string|function} options.header 前内容 - * @param {string|function} options.footer 后内容 - * @constructor - */ - constructor(options) { - assert.ok( - Object.prototype.toString.call(options) === '[object Object]', - 'Argument "args" must be an object.', - ); - - this.header = options.hasOwnProperty('header') ? options.header : ''; - this.footer = options.hasOwnProperty('footer') ? options.footer : ''; - } - - apply(compiler) { - const header = this.header; - const footer = this.footer; - const entry = compiler.options.entry; - - const wrapFile = (compilation, fileName) => { - // preparedChunks 在 apply SingleEntryPlugin 后会向 preparedChunks push - // 对应的当前模块, 根据模块的 name 也就是 entryName - // 主要 webpack 源码 Compilation.prototype.addEntry - // @see https://github.com/webpack/webpack/blob/v1.14.0/lib/Compilation.js#L440 - - const headerContent = - typeof header === 'function' - ? header(fileName, entry, compilation.preparedChunks) - : header; - const footerContent = - typeof footer === 'function' - ? footer(fileName, entry, compilation.preparedChunks) - : footer; - - compilation.assets[fileName] = new ConcatSource( - String(headerContent), - compilation.assets[fileName], - String(footerContent), - ); - }; - - const wrapChunks = (compilation, chunks) => { - chunks.forEach((chunk) => { - chunk.files.forEach((fileName) => { - wrapFile(compilation, fileName); - }); - }); - }; - - compiler.hooks.compilation.tap('WrapperPlugin', (compilation) => { - compilation.hooks.optimizeChunkAssets.tapAsync( - 'WrapperPlugin', - (chunks, done) => { - wrapChunks(compilation, chunks, footer, header); - done(); - }, - ); - }); - } -}; diff --git a/packages/miniapp-builder/src/server/controllers/bundle.js b/packages/miniapp-builder/src/server/controllers/bundle.js deleted file mode 100644 index c37edb4e73..0000000000 --- a/packages/miniapp-builder/src/server/controllers/bundle.js +++ /dev/null @@ -1,90 +0,0 @@ -const { join } = require('path'); -const fs = require('fs'); -const Jszip = require('jszip'); -const glob = require('glob'); -const { getAppConfig } = require('../../config/getAppConfig'); -const { getNativeRendererUrl, FRAMEWORK_VERSION } = require('../../config/getFrameworkCDNUrl'); - -/** - * Controller for local debug. - * Output a miniapp bundle.zip, whose structure is similar - * to build output. - * - * bundle.zip - * --- - * - app.js - * - app.config.json - * - .schema - * - app.config.json - * - other image assets - * - ?pluginX.js - */ -module.exports = function bundleCtrl(ctx, next) { - const zip = new Jszip(); - - let pageUrl = getNativeRendererUrl(FRAMEWORK_VERSION); - if (ctx.rendererUrl) { - pageUrl = ctx.rendererUrl; - } - if (ctx.rendererInspect) { - /** - * Inspect url format of Weinre - */ - const remoteInspectUrl = `http://${ctx.rendererInspectHost}:${ctx.rendererInspectPort}/target/target-script-min.js`; - pageUrl += `?remoteInspectUrl=${encodeURIComponent(remoteInspectUrl)}`; - } - - const appJSON = getAppConfig(ctx.projectDir, { - pageUrl, - }); - - /* 指定首页, 兼容外部依赖 */ - appJSON.homepage = ctx.query.wml_path || ctx.query.homepage || appJSON.homepage || appJSON.pages[0].pageName; - - /* 指定渲染类型, 客户端必须指定 */ - appJSON.appType = 'webview'; - - const globOpts = { - cwd: ctx.projectDir, - dot: true, - nodir: true, - ignore: ['node_modules/**', 'build/**'], - }; - - function zipFiles(pattern) { - if (!pattern) return; - if (Array.isArray(pattern)) return pattern.map(zipFiles); - - let fileList = glob.sync(pattern, globOpts); - if (!Array.isArray(fileList)) return; - for (let i = 0, len = fileList.length; i < len; i++) { - zip.file(fileList[i], fs.readFileSync(join(ctx.projectDir, fileList[i]))); - } - } - - // Pack image files - zipFiles('**/*.{png,jpg,gif,ico,webp,jpeg}'); - - // Pack includeFiles - const { includeFiles } = appJSON; - zipFiles(includeFiles); - - // Only support one plugin now. - if (ctx.miniappType === 'plugin' && ctx.pluginName) { - zip.file('plugin.js', global.AppPluginContent); - appJSON.plugins[ctx.pluginName].bundlePath = 'plugin.js'; - } - zip.file('app.config.json', JSON.stringify(appJSON, null, 2)); - zip.file('app.js', global.AppJSContent); - - - // stream mode output - ctx.body = zip.generateNodeStream({ - type: 'nodebuffer', - streamFiles: true, - compression: 'DEFLATE', - compressionOptions: { - level: 9, - }, - }); -}; diff --git a/packages/miniapp-builder/src/server/controllers/master.js b/packages/miniapp-builder/src/server/controllers/master.js deleted file mode 100644 index 48df91347b..0000000000 --- a/packages/miniapp-builder/src/server/controllers/master.js +++ /dev/null @@ -1,49 +0,0 @@ -const path = require('path'); -const address = require('address'); -const ejs = require('ejs'); -const { getAppConfig } = require('../../config/getAppConfig'); -const { getH5Master, FRAMEWORK_VERSION } = require('../../config/getFrameworkCDNUrl'); - -const localIP = address.ip(); -const masterTemplateFilePath = path.resolve(__dirname, '../views/master.ejs'); - -module.exports = function masterRoute(ctx, next) { - /** - * Declear assets to load plugins - * pluginAssets: Array[URL] - * Each url will be loaded asynchronously or synchronously before app.js. - */ - const pluginAssets = []; - if (ctx.miniappType === 'plugin') { - pluginAssets.push(`http://${localIP}:${ctx.port}/build-plugin/index.js`); - } - - const appConfig = getAppConfig(ctx.projectDir, { - pluginAssets, - }); - let h5Master = getH5Master(appConfig.frameworkVersion || FRAMEWORK_VERSION); - - if (ctx.isDebug) { - h5Master = `http://${localIP}:8003/h5/master.js`; - } - - appConfig.homepage = - ctx.query.wml_path || ctx.query.homepage || appConfig.homepage; - appConfig.h5Assets = `http://${address.ip()}:${ctx.port}/build/app.web.js`; - - ejs.renderFile( - masterTemplateFilePath, - { - appConfig: JSON.stringify(appConfig, null, 2), - h5Master, - }, - {}, - (err, str) => { - if (err) { - ctx.body = err; - } else { - ctx.body = str; - } - }, - ); -}; diff --git a/packages/miniapp-builder/src/server/index.js b/packages/miniapp-builder/src/server/index.js deleted file mode 100644 index 15c6f5ee8a..0000000000 --- a/packages/miniapp-builder/src/server/index.js +++ /dev/null @@ -1,112 +0,0 @@ -const { resolve } = require('path'); -const Koa = require('koa'); -const bodyParser = require('koa-bodyparser'); -const serve = require('koa-static'); -const address = require('address'); -const colors = require('colors'); -const webpack = require('webpack'); -const createDevMiddleware = require('./middlewares/dev'); -const registerWatcher = require('./service/registerWatcher'); -const registerRouter = require('./router'); -const { getAppConfig } = require('../config/getAppConfig'); -const getWebpackConfig = require('../config/getWebpackConfig'); -const getPluginWebpackConfig = require('../config/getPluginWebpackConfig'); - -const app = new Koa(); - -/** - * Start MiniApp Dev Server - */ -module.exports = function startDevServer(opts) { - let { projectDir, port, rendererInspect, rendererInspectHost, rendererInspectPort, rendererUrl, miniappType } = opts; - - let pluginWebpackConfig; - let pluginName; - let pluginDir; - if (miniappType === 'plugin') { - pluginDir = projectDir; - projectDir = resolve(projectDir, 'miniprogram'); - pluginName = getDevPluginName(getAppConfig(projectDir).plugins); - pluginWebpackConfig = getPluginWebpackConfig(pluginDir, { - pluginName, - }); - } - - const webpackConfig = getWebpackConfig(projectDir, true); - - const devMiddleware = createDevMiddleware({ - compiler: webpack(webpackConfig), - dev: { - stats: { - colors: true, - children: false, - modules: false, - chunks: false, - entrypoints: false, - assets: false, - }, - publicPath: '/build', - }, - }); - - /** - * inject instance env - */ - app.use(function(ctx, next) { - ctx.projectDir = projectDir; - ctx.port = port; - ctx.rendererInspect = rendererInspect; - ctx.rendererInspectHost = rendererInspectHost; - ctx.rendererInspectPort = rendererInspectPort; - ctx.rendererUrl = rendererUrl; - ctx.miniappType = miniappType; - ctx.pluginName = pluginName; - return next(); - }); - app.use(devMiddleware); - if (miniappType === 'plugin') { - const pluginDevServer = createDevMiddleware({ - compiler: webpack(pluginWebpackConfig), - dev: { - stats: { - colors: true, - children: false, - modules: false, - chunks: false, - entrypoints: false, - assets: false, - }, - publicPath: '/build-plugin', - }, - }); - app.use(pluginDevServer); - } - registerWatcher(devMiddleware, projectDir); - registerRouter(app); - - app.use(bodyParser()); - app.use(serve(projectDir)); - - app.listen(port, err => { - if (err) { - console.log(err); - process.exit(1); - } - - const ip = address.ip(); - console.log(colors.green(`DevServer Running At http://127.0.0.1:${port}/`)); - console.log(`Local bundle Scan QR of http://${ip}:${port}/app/bundle.zip?_wml_debug=true`); - }); -}; - -/** - * Get dev mode plugin name. - */ -function getDevPluginName(plugins = {}) { - for (let key in plugins) { - if (plugins.hasOwnProperty(key) && plugins[key].version === 'dev') { - return key; - } - } - return 'unknown'; -} diff --git a/packages/miniapp-builder/src/server/middlewares/dev.js b/packages/miniapp-builder/src/server/middlewares/dev.js deleted file mode 100644 index 899a9785aa..0000000000 --- a/packages/miniapp-builder/src/server/middlewares/dev.js +++ /dev/null @@ -1,87 +0,0 @@ -'use strict'; - -const path = require('path'); -const devMiddleware = require('webpack-dev-middleware'); - -/** - * The entry point for the Koa middleware. - **/ -module.exports = function createDevMiddleware(opts) { - const defaults = { dev: {} }; - - const options = Object.assign(defaults, opts); - - let { compiler } = options; - - if (!options.dev.publicPath) { - const { publicPath } = compiler.options.output; - - if (!publicPath) { - throw new Error('koa-webpack: publicPath must be set on `dev` options, or in a compiler\'s `output` configuration.'); - } - - options.dev.publicPath = publicPath; - } - - let dev = devMiddleware(compiler, options.dev); - - /** - * @method koaDevware - * @desc Middleware for Koa to proxy webpack-dev-middleware - **/ - function koaDevware(compiler) { - /** - * @method waitMiddleware - * @desc Provides blocking for the Webpack processes to complete. - **/ - function waitMiddleware(context) { - return new Promise((resolve, reject) => { - dev.waitUntilValid(() => { - resolve(true); - }); - - function tapHook(comp) { - comp.hooks.failed.tap('KoaWebpack', (error) => { - reject(error); - }); - } - - if (compiler.compilers) { - for (const child of compiler.compilers) { - tapHook(child); - } - } else { - tapHook(compiler); - } - }); - } - - return (context, next) => { - return Promise.all([ - waitMiddleware(context), - new Promise((resolve) => { - dev(context.req, { - end: (content) => { - context.body = content; // eslint-disable-line no-param-reassign - resolve(); - }, - setHeader: context.set.bind(context), - locals: context.state - }, () => resolve(next())); - }) - ]); - }; - } - - return Object.assign(koaDevware(compiler), { - dev() { - return dev; - }, - close(callback) { - dev.close(callback); - }, - update(_compiler) { - dev = devMiddleware(_compiler, options.dev); - } - }); -}; diff --git a/packages/miniapp-builder/src/server/router.js b/packages/miniapp-builder/src/server/router.js deleted file mode 100644 index fdd81c4eac..0000000000 --- a/packages/miniapp-builder/src/server/router.js +++ /dev/null @@ -1,17 +0,0 @@ -const Router = require('koa-router'); - -const router = new Router(); - -const masterCtrl = require('./controllers/master'); -const bundleCtrl = require('./controllers/bundle'); - -module.exports = function registerRouter(app) { - router.get('/', masterCtrl); - router.get('/app/index.html', masterCtrl); - - router.get('/app/bundle.zip', bundleCtrl); - router.get('/build/bundle.zip', bundleCtrl); - - app.use(router.routes()); - app.use(router.allowedMethods()); -}; \ No newline at end of file diff --git a/packages/miniapp-builder/src/server/service/registerWatcher.js b/packages/miniapp-builder/src/server/service/registerWatcher.js deleted file mode 100644 index f20ce1a156..0000000000 --- a/packages/miniapp-builder/src/server/service/registerWatcher.js +++ /dev/null @@ -1,48 +0,0 @@ -const chokidar = require('chokidar'); -const webpack = require('webpack'); -const colors = require('colors'); -const { join } = require('path'); -const { isEqual } = require('lodash'); -const getWebpackConfig = require('../../config/getWebpackConfig'); -const getMiniappType = require('../../config/getMiniappType'); -const { getPages } = require('../../config/getAppConfig'); - - -let pages = null; -/** - * retrun true if has difference - */ -function compareConfigPages(workDir) { - let newPages = getPages(workDir); - let oldPages = pages; - pages = newPages; - return isEqual(oldPages, newPages); -} - -function updateCompiler(middleware, workDir) { - const webpackConfig = getWebpackConfig(workDir, true); - - middleware.dev().close(() => { - middleware.update(webpack(webpackConfig)); - }); -} - -module.exports = function(middleware, workDir) { - const type = getMiniappType(workDir); - pages = getPages(workDir); - - chokidar - .watch(join(workDir, type === 'sfc' ? 'manifest.json' : 'app.json'), { - ignored: /[\/\\]\./, - ignoreInitial: true, - }) - .on('all', (event, _path) => { - try { - if (!compareConfigPages(workDir)) { - updateCompiler(middleware, workDir); - } - } catch (err) { - console.log(colors.red('Err while update compiler:'), err); - } - }); -}; diff --git a/packages/miniapp-builder/src/server/views/master.ejs b/packages/miniapp-builder/src/server/views/master.ejs deleted file mode 100644 index d95da8c5d7..0000000000 --- a/packages/miniapp-builder/src/server/views/master.ejs +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - - - MiniApp Example in IDE - - - - -
-
- -
- -
-
- - - -
-
-
-
-
-
- -
- - - - - - diff --git a/packages/miniapp-builder/sync-framework-version.js b/packages/miniapp-builder/sync-framework-version.js deleted file mode 100644 index b851321931..0000000000 --- a/packages/miniapp-builder/sync-framework-version.js +++ /dev/null @@ -1,13 +0,0 @@ -const path = require('path'); -const fs = require('fs'); -const axios = require('axios'); - -const REGISTRY_URL = 'http://registry.npmjs.com/miniapp-framework/latest'; -const DIST_FILE = path.join(__dirname, 'src/config/frameworkVersion.js'); - -axios(REGISTRY_URL).then(response => { - const { version } = response.data; - const content = `module.exports = '${version}';`; - fs.writeFileSync(DIST_FILE, content, 'utf-8'); - console.log('Write Framework Version: ' + version); -}); From c3fb5418c6f0cf57b313af7615d99ff0a2665c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Tue, 27 Aug 2019 12:12:18 +0800 Subject: [PATCH 2/2] chore: transfer render-helpers to internal --- packages/render-helpers/README.md | 7 - packages/render-helpers/package.json | 22 -- .../__snapshots__/createElement.js.snap | 42 --- .../__snapshots__/renderList.js.snap | 309 ------------------ .../__snapshots__/renderStyle.js.snap | 8 - .../__tests__/__snapshots__/toString.js.snap | 7 - .../src/__tests__/createElement.js | 66 ---- .../src/__tests__/createEmptyElement.js | 11 - .../src/__tests__/createNotImplWarn.js | 13 - .../src/__tests__/createTextElement.js | 14 - .../src/__tests__/renderList.js | 35 -- .../src/__tests__/renderSlot.js | 30 -- .../src/__tests__/renderStyle.js | 69 ---- .../render-helpers/src/__tests__/toString.js | 36 -- packages/render-helpers/src/createElement.js | 33 -- .../render-helpers/src/createEmptyElement.js | 8 - .../render-helpers/src/createNotImplWarn.js | 19 -- .../render-helpers/src/createTextElement.js | 8 - packages/render-helpers/src/host.js | 3 - packages/render-helpers/src/index.js | 35 -- packages/render-helpers/src/renderList.js | 39 --- packages/render-helpers/src/renderSlot.js | 26 -- packages/render-helpers/src/renderStyle.js | 84 ----- .../render-helpers/src/resolveScopedSlots.js | 18 - packages/render-helpers/src/setRender.js | 5 - packages/render-helpers/src/toString.js | 14 - 26 files changed, 961 deletions(-) delete mode 100644 packages/render-helpers/README.md delete mode 100644 packages/render-helpers/package.json delete mode 100644 packages/render-helpers/src/__tests__/__snapshots__/createElement.js.snap delete mode 100644 packages/render-helpers/src/__tests__/__snapshots__/renderList.js.snap delete mode 100644 packages/render-helpers/src/__tests__/__snapshots__/renderStyle.js.snap delete mode 100644 packages/render-helpers/src/__tests__/__snapshots__/toString.js.snap delete mode 100644 packages/render-helpers/src/__tests__/createElement.js delete mode 100644 packages/render-helpers/src/__tests__/createEmptyElement.js delete mode 100644 packages/render-helpers/src/__tests__/createNotImplWarn.js delete mode 100644 packages/render-helpers/src/__tests__/createTextElement.js delete mode 100644 packages/render-helpers/src/__tests__/renderList.js delete mode 100644 packages/render-helpers/src/__tests__/renderSlot.js delete mode 100644 packages/render-helpers/src/__tests__/renderStyle.js delete mode 100644 packages/render-helpers/src/__tests__/toString.js delete mode 100644 packages/render-helpers/src/createElement.js delete mode 100644 packages/render-helpers/src/createEmptyElement.js delete mode 100644 packages/render-helpers/src/createNotImplWarn.js delete mode 100644 packages/render-helpers/src/createTextElement.js delete mode 100644 packages/render-helpers/src/host.js delete mode 100644 packages/render-helpers/src/index.js delete mode 100644 packages/render-helpers/src/renderList.js delete mode 100644 packages/render-helpers/src/renderSlot.js delete mode 100644 packages/render-helpers/src/renderStyle.js delete mode 100644 packages/render-helpers/src/resolveScopedSlots.js delete mode 100644 packages/render-helpers/src/setRender.js delete mode 100644 packages/render-helpers/src/toString.js diff --git a/packages/render-helpers/README.md b/packages/render-helpers/README.md deleted file mode 100644 index 589c50fdfc..0000000000 --- a/packages/render-helpers/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# render-helpers -> Render helpers for mp and sfc loader - -```js -import renderHelpers from 'render-helpers'; -renderHelpers._r(Rax) // renderHelpers._r(React) -``` \ No newline at end of file diff --git a/packages/render-helpers/package.json b/packages/render-helpers/package.json deleted file mode 100644 index e316ae6472..0000000000 --- a/packages/render-helpers/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "render-helpers", - "version": "0.1.1", - "description": "Render helpers for mp and sfc loader", - "main": "src/index.js", - "keywords": [ - "helpers" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/alibaba/rax.git" - }, - "bugs": { - "url": "https://github.com/alibaba/rax/issues" - }, - "homepage": "https://github.com/alibaba/rax#readme", - "license": "BSD-3-Clause", - "devDependencies": { - "rax": "^0.6.7", - "rax-test-renderer": "^0.6.5" - } -} diff --git a/packages/render-helpers/src/__tests__/__snapshots__/createElement.js.snap b/packages/render-helpers/src/__tests__/__snapshots__/createElement.js.snap deleted file mode 100644 index 0924f7f8d5..0000000000 --- a/packages/render-helpers/src/__tests__/__snapshots__/createElement.js.snap +++ /dev/null @@ -1,42 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`createElement can pass ES Module output object 1`] = ` -Object { - "children": Array [ - "hello world", - ], - "tagName": "VIEW", -} -`; - -exports[`createElement can receive three args 1`] = ` -Object { - "attributes": Object { - "arr": Array [ - 0, - 1, - 2, - ], - "color": "red", - }, - "children": Array [ - "hello world", - ], - "tagName": "VIEW", -} -`; - -exports[`createElement can receive two args 1`] = ` -Object { - "children": Array [ - "hello world", - ], - "tagName": "VIEW", -} -`; - -exports[`createElement supports template for MiniApp 1`] = ` -Object { - "tagName": "VIEW", -} -`; diff --git a/packages/render-helpers/src/__tests__/__snapshots__/renderList.js.snap b/packages/render-helpers/src/__tests__/__snapshots__/renderList.js.snap deleted file mode 100644 index d55805301d..0000000000 --- a/packages/render-helpers/src/__tests__/__snapshots__/renderList.js.snap +++ /dev/null @@ -1,309 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`renderList should render list by array 1`] = ` -Array [ - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - 0, - 0, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - 1, - 1, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - 2, - 2, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - 3, - 3, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - 4, - 4, - ], - }, - "ref": null, - "type": "view", - }, -] -`; - -exports[`renderList should render list by number 1`] = ` -Array [ - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - 1, - 0, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - 2, - 1, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - 3, - 2, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - 4, - 3, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - 5, - 4, - ], - }, - "ref": null, - "type": "view", - }, -] -`; - -exports[`renderList should render list by object 1`] = ` -Array [ - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - 1, - "a", - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - 2, - "b", - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - 3, - "c", - ], - }, - "ref": null, - "type": "view", - }, -] -`; - -exports[`renderList should render list by string 1`] = ` -Array [ - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - "h", - 0, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - "e", - 1, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - "l", - 2, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - "l", - 3, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - "o", - 4, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - " ", - 5, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - "w", - 6, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - "o", - 7, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - "r", - 8, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - "l", - 9, - ], - }, - "ref": null, - "type": "view", - }, - Object { - "_owner": null, - "key": null, - "props": Object { - "children": Array [ - "d", - 10, - ], - }, - "ref": null, - "type": "view", - }, -] -`; diff --git a/packages/render-helpers/src/__tests__/__snapshots__/renderStyle.js.snap b/packages/render-helpers/src/__tests__/__snapshots__/renderStyle.js.snap deleted file mode 100644 index d027083e8e..0000000000 --- a/packages/render-helpers/src/__tests__/__snapshots__/renderStyle.js.snap +++ /dev/null @@ -1,8 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`renderStyle style binding should accept array 1`] = ` -Object { - "background": "yellow", - "color": "red", -} -`; diff --git a/packages/render-helpers/src/__tests__/__snapshots__/toString.js.snap b/packages/render-helpers/src/__tests__/__snapshots__/toString.js.snap deleted file mode 100644 index 24a72a52d4..0000000000 --- a/packages/render-helpers/src/__tests__/__snapshots__/toString.js.snap +++ /dev/null @@ -1,7 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`toString types should accept function 1`] = ` -"function () { - return 'hello world'; - }" -`; diff --git a/packages/render-helpers/src/__tests__/createElement.js b/packages/render-helpers/src/__tests__/createElement.js deleted file mode 100644 index 4f2522fb83..0000000000 --- a/packages/render-helpers/src/__tests__/createElement.js +++ /dev/null @@ -1,66 +0,0 @@ -import * as Rax from 'rax'; -import renderer from 'rax-test-renderer'; -import setRender from '../setRender'; -import createElement from '../createElement'; - -setRender(Rax); -function render(el) { - return renderer.create(el).toJSON(); -} - -describe('createElement', () => { - it('can receive two args', () => { - const el = createElement( - 'view', - ['hello world'] - ); - expect(render(el)).toMatchSnapshot(); - }); - - it('can receive three args', () => { - const arr = [0, 1, 2]; - const el = createElement( - 'view', - { color: 'red', arr }, - ['hello world'] - ); - - // Test case for wrongly shallow copy array props, bug #872 - expect(el.props.arr).toEqual(arr); - expect(render(el)).toMatchSnapshot(); - }); - - it('can pass ES Module output object', () => { - const el = createElement( - { __esModule: true, default: 'view' }, - ['hello world'] - ); - expect(render(el)).toMatchSnapshot(); - }); - - it('generate empty element while template is invalid', () => { - const el = createElement( - '$template', - ['hello world'] - ); - expect(el).toBeNull(); - }); - - it('supports template for MiniApp', () => { - const pageInstance = Symbol('pageInstance'); - const data = Symbol('data'); - const el = createElement( - '$template', - { - is(_data) { - expect(this).toEqual(pageInstance); - expect(_data).toEqual(data); - return createElement('view'); - }, - pageInstance, - data, - } - ); - expect(render(el)).toMatchSnapshot(); - }); -}); diff --git a/packages/render-helpers/src/__tests__/createEmptyElement.js b/packages/render-helpers/src/__tests__/createEmptyElement.js deleted file mode 100644 index 8cac4bc4cb..0000000000 --- a/packages/render-helpers/src/__tests__/createEmptyElement.js +++ /dev/null @@ -1,11 +0,0 @@ -import createEmptyElement from '../createEmptyElement'; - -describe('createEmptyElement', () => { - it('should return null anyway', () => { - const el = createEmptyElement( - 'view', - ['hello world'] - ); - expect(el).toBeNull(); - }); -}); diff --git a/packages/render-helpers/src/__tests__/createNotImplWarn.js b/packages/render-helpers/src/__tests__/createNotImplWarn.js deleted file mode 100644 index 6bbeb38a46..0000000000 --- a/packages/render-helpers/src/__tests__/createNotImplWarn.js +++ /dev/null @@ -1,13 +0,0 @@ -import createNotImplWarn from '../createNotImplWarn'; - -describe('createNotImplWarn', () => { - it('should create impl warn with alias', () => { - const fn = createNotImplWarn('sth', () => 'view'); - expect(fn()).toEqual('view'); - }); - - it('should create empty element without alias', () => { - const fn = createNotImplWarn('sth'); - expect(fn()).toBeNull(); - }); -}); diff --git a/packages/render-helpers/src/__tests__/createTextElement.js b/packages/render-helpers/src/__tests__/createTextElement.js deleted file mode 100644 index 398506810f..0000000000 --- a/packages/render-helpers/src/__tests__/createTextElement.js +++ /dev/null @@ -1,14 +0,0 @@ -import createTextElement from '../createTextElement'; - -describe('createTextElement', () => { - it('should get a string', () => { - expect(createTextElement('hello')) - .toEqual('hello'); - }); - - it('should transform to string', () => { - const arr = [0, 1, 2]; - expect(createTextElement(arr)) - .toEqual(arr.toString()); - }); -}); diff --git a/packages/render-helpers/src/__tests__/renderList.js b/packages/render-helpers/src/__tests__/renderList.js deleted file mode 100644 index b93a463b40..0000000000 --- a/packages/render-helpers/src/__tests__/renderList.js +++ /dev/null @@ -1,35 +0,0 @@ -import * as Rax from 'rax'; -import setRender from '../setRender'; -import renderList from '../renderList'; -import createElement from '../createElement'; - -setRender(Rax); -function render(value, index) { - return createElement('view', [value, index]); -} - -describe('renderList', () => { - it('should render list by number', () => { - const el = renderList(5, render); - expect(el).toMatchSnapshot(); - }); - - it('should render list by string', () => { - const el = renderList('hello world', render); - expect(el).toMatchSnapshot(); - }); - - it('should render list by array', () => { - const el = renderList([0, 1, 2, 3, 4], render); - expect(el).toMatchSnapshot(); - }); - - it('should render list by object', () => { - const el = renderList({ - a: 1, - b: 2, - c: 3, - }, render); - expect(el).toMatchSnapshot(); - }); -}); diff --git a/packages/render-helpers/src/__tests__/renderSlot.js b/packages/render-helpers/src/__tests__/renderSlot.js deleted file mode 100644 index 87adb2bbe0..0000000000 --- a/packages/render-helpers/src/__tests__/renderSlot.js +++ /dev/null @@ -1,30 +0,0 @@ -import renderSlot from '../renderSlot'; - -const viewModel = { - $slots: { - default: Symbol('defaultSlot'), - foo: Symbol('foo'), - }, -}; -describe('renderSlot', () => { - it('should render default slot', () => { - expect(renderSlot(viewModel)).toEqual(viewModel.$slots.default); - }); - - it('should render named slot', () => { - expect(renderSlot(viewModel, 'foo')).toEqual(viewModel.$slots.foo); - }); - - it('should render empty slot', () => { - expect(renderSlot(viewModel, 'notExists')).toBeFalsy(); - }); - - it('should render component default slot', () => { - expect( - renderSlot({ $slots: {} }, 'default', 'defaultSlot') - ).toEqual('defaultSlot'); - expect( - renderSlot({ $slots: { default: 'someValue'} }, 'default', 'defaultSlot') - ).toEqual('someValue'); - }); -}); diff --git a/packages/render-helpers/src/__tests__/renderStyle.js b/packages/render-helpers/src/__tests__/renderStyle.js deleted file mode 100644 index 1eb0474ec2..0000000000 --- a/packages/render-helpers/src/__tests__/renderStyle.js +++ /dev/null @@ -1,69 +0,0 @@ -import renderStyle from '../renderStyle'; - -describe('renderStyle', () => { - describe('style binding', () => { - it('should accept array', () => { - const style = renderStyle([ - { color: 'red' }, - { background: 'yellow' } - ]); - expect(style).toMatchSnapshot(); - }); - - it('should accept string', () => { - const style = renderStyle('color: red;'); - expect(style).toEqual({ color: 'red' }); - }); - - it('should accept object', () => { - const style = renderStyle({ color: 'red' }); - expect(style).toEqual({ color: 'red' }); - }); - }); - - describe('static style', () => { - it('should accept string', () => { - const style = renderStyle('color: red;', 'color: yellow'); - expect(style).toEqual({ color: 'yellow' }); - }); - - it('should accept object', () => { - const style = renderStyle({ color: 'red' }, { color: 'yellow' }); - expect(style).toEqual({ color: 'yellow' }); - }); - }); - - describe('cssInJS mode', () => { - const styleObject = { - group: { - color: 'grey', - width: '100rpx', - height: '200rpx', - }, - item: { - position: 'absolute', - width: '300px', - top: 0, - left: '30px', - margin: '10px', - }, - }; - it('should merge css object in css in js mode', () => { - const style = renderStyle( - { color: 'red' }, - { color: 'yellow' }, - styleObject, - ['item', { group: true }, 5] - ); - expect(style).toEqual({ - position: 'absolute', - top: 0, - left: '30px', - margin: '10px', - color: 'yellow', - width: '100rpx', - height: '200rpx', - }); - }); - }); -}); diff --git a/packages/render-helpers/src/__tests__/toString.js b/packages/render-helpers/src/__tests__/toString.js deleted file mode 100644 index 523b980926..0000000000 --- a/packages/render-helpers/src/__tests__/toString.js +++ /dev/null @@ -1,36 +0,0 @@ -import toString from '../toString'; - -describe('toString', () => { - describe('types', () => { - it('should accept number', () => { - expect(toString(1)).toEqual('1'); - }); - - it('should accept string', () => { - expect(toString('hello')).toEqual('hello'); - }); - - it('should accept undefined', () => { - expect(toString(undefined)).toEqual(''); - }); - - it('should accept null', () => { - expect(toString(null)).toEqual(''); - }); - - it('should accept object', () => { - expect(toString({ a: 1 })).toEqual(JSON.stringify({ a: 1 }, null, 2)); - }); - - it('should accept array', () => { - expect(toString([0, 1, 2])).toEqual(JSON.stringify([0, 1, 2], null, 2)); - }); - - it('should accept function', () => { - expect(toString(function() { - return 'hello world'; - })) - .toMatchSnapshot(); - }); - }); -}); diff --git a/packages/render-helpers/src/createElement.js b/packages/render-helpers/src/createElement.js deleted file mode 100644 index d1fa373f8d..0000000000 --- a/packages/render-helpers/src/createElement.js +++ /dev/null @@ -1,33 +0,0 @@ -import Host from './host'; -import createEmptyElement from './createEmptyElement'; - -/** - * Create MiniApp element. - * @param type {String|Object} element type. - * @param props {Object} element props. - * @param children {Element|Array} child elements. - * @return {Element} element. - */ -export default function(type, props, ...children) { - if (typeof type === 'object' && type.__esModule) { - type = type.default; - } else if (type === '$template') { - if (props.is) { - return props.is.call(props.pageInstance, props.data); - } else { - return createEmptyElement(); - } - } - - // For reduce code size - // eg: _c(View, undefined, ['xxx']) - // vs: _c(View, ['xxx']) - if (Array.isArray(props)) { - children = props; - props = undefined; - } - - return Host.render.createElement(type, props, ...children); -} - - diff --git a/packages/render-helpers/src/createEmptyElement.js b/packages/render-helpers/src/createEmptyElement.js deleted file mode 100644 index 5b7150af52..0000000000 --- a/packages/render-helpers/src/createEmptyElement.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Create an empty element. - * @return {null} - */ -export default function() { - return null; -}; - diff --git a/packages/render-helpers/src/createNotImplWarn.js b/packages/render-helpers/src/createNotImplWarn.js deleted file mode 100644 index 90e5447470..0000000000 --- a/packages/render-helpers/src/createNotImplWarn.js +++ /dev/null @@ -1,19 +0,0 @@ -import createEmptyElement from './createEmptyElement'; - -/** - * Create not impl warn. - * @param text {String} Warning - * @param alias? {Function} Generate an element instead. - * @return {Element} Not impl warn element. - */ -export default function createNotImplWarn(text, alias) { - return function() { - console.warn(`${text} is not implemented.`); - - if (alias) { - return alias.apply(this, arguments); - } else { - return createEmptyElement(); - } - }; -} diff --git a/packages/render-helpers/src/createTextElement.js b/packages/render-helpers/src/createTextElement.js deleted file mode 100644 index c1cae29da1..0000000000 --- a/packages/render-helpers/src/createTextElement.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Create MiniApp text element. - * @param text {String|Number} Value. - * @return {String} - */ -export default function(text) { - return '' + text; -}; diff --git a/packages/render-helpers/src/host.js b/packages/render-helpers/src/host.js deleted file mode 100644 index 725e72ccb6..0000000000 --- a/packages/render-helpers/src/host.js +++ /dev/null @@ -1,3 +0,0 @@ -export default { - render: null -}; \ No newline at end of file diff --git a/packages/render-helpers/src/index.js b/packages/render-helpers/src/index.js deleted file mode 100644 index 472630ff4c..0000000000 --- a/packages/render-helpers/src/index.js +++ /dev/null @@ -1,35 +0,0 @@ -// internal render helpers. -// these are exposed on the instance prototype to reduce generated render -// code size. -import createElement from './createElement'; -import createEmptyElement from './createEmptyElement'; -import createTextElement from './createTextElement'; -import toString from './toString'; -import renderList from './renderList'; -import createNotImplWarn from './createNotImplWarn'; -import renderSlot from './renderSlot'; -import renderStyle from './renderStyle'; -import resolveScopedSlots from './resolveScopedSlots'; -import setRender from './setRender'; - -export default { - _r: setRender, - _c: createElement, - // _o: markOnce, - // _n: toNumber, - _s: toString, - _l: renderList, - _t: renderSlot, - // _q: looseEqual, - // _i: looseIndexOf, - _m: createNotImplWarn('v-once'), // renderStatic, - // _f: resolveFilter, - // _k: checkKeyCodes, - // _b: bindObjectProps, - _v: createTextElement, - _e: createEmptyElement, - _u: resolveScopedSlots, - // _g: bindObjectListeners, - _cx: renderStyle, -}; - diff --git a/packages/render-helpers/src/renderList.js b/packages/render-helpers/src/renderList.js deleted file mode 100644 index a6084c0250..0000000000 --- a/packages/render-helpers/src/renderList.js +++ /dev/null @@ -1,39 +0,0 @@ -const ObjetProtoToString = Object.prototype.toString; - -/** - * Render element list. - * @param val {Array|Number|Object|String} List value. - * @param render {Function} Render function. - * @return {Element[]} Element list. - */ -export default function renderList(val, render) { - let ret, i, l, keys, key; - if (Array.isArray(val) || typeof val === 'string') { - ret = new Array(val.length); - for (i = 0, l = val.length; i < l; i++) { - ret[i] = render.call(this, val[i], i); - } - } else if (typeof val === 'number') { - ret = new Array(val); - for (i = 0; i < val; i++) { - ret[i] = render.call(this, i + 1, i); - } - } else if (isPlainObject(val)) { - keys = Object.keys(val); - ret = new Array(keys.length); - for (i = 0, l = keys.length; i < l; i++) { - key = keys[i]; - ret[i] = render.call(this, val[key], key, i); - } - } - return ret; -} - -/** - * Whether a value is a plain object. - * @param obj {Object} Value. - * @return {boolean} - */ -function isPlainObject(obj) { - return ObjetProtoToString.call(obj) === '[object Object]'; -} diff --git a/packages/render-helpers/src/renderSlot.js b/packages/render-helpers/src/renderSlot.js deleted file mode 100644 index fb8a891511..0000000000 --- a/packages/render-helpers/src/renderSlot.js +++ /dev/null @@ -1,26 +0,0 @@ -const SLOT_KEY = '$slots'; -const SCOPED_SLOT_KEY = '$scopedSlots'; -function hasOwnProperty(object, prop) { - return Object.prototype.hasOwnProperty.call(object, prop); -} -/** - * Render slots. - * @param viewModel {Object} ViewModel that contains slots. - * @param slotName {String} Slot name, default to 'default'. - * @param fallback {?Element[]} Fallback slot element. - * @param props {?Object} Scoped slot property. - * @param bindObject {?Object} Only works in SFC, with bind of properties. - */ -export default function renderSlot(viewModel, slotName = 'default', fallback, props, bindObject) { - const existScopedSlot = hasOwnProperty(viewModel, SCOPED_SLOT_KEY) - && hasOwnProperty(viewModel[SCOPED_SLOT_KEY], slotName); - - if (existScopedSlot) { // scoped slot - const scopedSlotFn = viewModel[SCOPED_SLOT_KEY][slotName]; - props = props || {}; - if (bindObject) props = { ...bindObject, ...props }; - return scopedSlotFn(props) || fallback; - } else { - return hasOwnProperty(viewModel, SLOT_KEY) && viewModel[SLOT_KEY][slotName] || fallback; - } -} diff --git a/packages/render-helpers/src/renderStyle.js b/packages/render-helpers/src/renderStyle.js deleted file mode 100644 index d6397f6fdb..0000000000 --- a/packages/render-helpers/src/renderStyle.js +++ /dev/null @@ -1,84 +0,0 @@ -const hasOwnProperty = Object.prototype.hasOwnProperty; - -function flatClassNames() { - let classes = []; - for (let i = 0; i < arguments.length; i++) { - let arg = arguments[i]; - if (!arg) continue; - let argType = typeof arg; - if (argType === 'string') { - classes = classes.concat(arg.split(' ')); - } else if (argType === 'number') { - classes.push(arg); - } else if (Array.isArray(arg)) { - classes.push(flatClassNames.apply(null, arg)); - } else if (argType === 'object') { - for (let key in arg) { - if (hasOwnProperty.call(arg, key) && arg[key]) { - classes.push(key); - } - } - } - } - return [].concat.apply([], classes); -} - -function transformCSSStyleObject(str) { - const styleObj = {}; - str.split(';').forEach(rule => { - const [key, val] = rule.split(/:(.+)/); - if (key && val) { - styleObj[key.trim()] = val.trim(); - } - }); - return styleObj; -} - -/** - * Style order: - * 1. static inline style - * 2. inline style with binding - * 3. CSS Selector style - * @param styleBinding {Object} - * @param staticStyle - */ -export default function renderStyle(styleBinding, staticStyle) { - const style = {}; - - /** - * cssInJS mode will pass 4 args, the other 2 are: - * @param styleObject {Object} whole style object. - * @param classNames {Array} valid className refs. - */ - if (arguments.length === 4) { - const styleObject = arguments[2]; - const validClassNames = flatClassNames(arguments[3]); - - for (let i = 0, l = validClassNames.length; i < l; i ++) { - const className = validClassNames[i]; - if (hasOwnProperty.call(styleObject, className)) { - Object.assign(style, styleObject[className]); - } - } - } - - /** - * Handle style with Array binding - */ - if (Array.isArray(styleBinding)) { - styleBinding = styleBinding.reduce((iter, curr) => Object.assign(iter, curr), {}); - } - - if (typeof styleBinding === 'string') { - Object.assign(style, transformCSSStyleObject(styleBinding)); - } else if (typeof styleBinding === 'object') { - Object.assign(style, styleBinding); - } - if (typeof staticStyle === 'string') { - Object.assign(style, transformCSSStyleObject(staticStyle)); - } else if (typeof staticStyle === 'object') { - Object.assign(style, staticStyle); - } - - return style; -} diff --git a/packages/render-helpers/src/resolveScopedSlots.js b/packages/render-helpers/src/resolveScopedSlots.js deleted file mode 100644 index 3784621e0c..0000000000 --- a/packages/render-helpers/src/resolveScopedSlots.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Runtime helper for resolving scoped slots. - * @param fns {Object[]|Object} Descriptors of scoped slots. - * @param res {?Object} Iterator result. - * @return {Object} - */ -export default function resolveScopedSlots(fns, res) { - res = res || {}; - for (let i = 0; i < fns.length; i++) { - const slot = fns[i]; - if (Array.isArray(slot)) { - resolveScopedSlots(slot, res); - } else { - res[slot.key] = slot.fn; - } - } - return res; -} diff --git a/packages/render-helpers/src/setRender.js b/packages/render-helpers/src/setRender.js deleted file mode 100644 index 857a6b9b9d..0000000000 --- a/packages/render-helpers/src/setRender.js +++ /dev/null @@ -1,5 +0,0 @@ -import Host from './host'; - -export default function setRender(render) { - Host.render = render; -} diff --git a/packages/render-helpers/src/toString.js b/packages/render-helpers/src/toString.js deleted file mode 100644 index 2ccafecc04..0000000000 --- a/packages/render-helpers/src/toString.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Stringify an value. - * @param val {String|Object|Function|Array} value. - * @return {String} - */ -export default function toString(val) { - if (val === undefined || val === null) { - return ''; - } else { - return typeof val === 'object' - ? JSON.stringify(val, null, 2) - : '' + val; - } -};