@qse/edu-scripts 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/CHANGELOG.md +333 -0
  2. package/README.md +105 -0
  3. package/app.d.ts +68 -0
  4. package/docs/changelog.md +5 -0
  5. package/docs/deploy.md +53 -0
  6. package/docs/feat.md +74 -0
  7. package/docs/grayscale.md +31 -0
  8. package/docs/index.md +5 -0
  9. package/docs/mode.md +42 -0
  10. package/docs/override.md +165 -0
  11. package/docs/refactor-react-16.md +40 -0
  12. package/docs/refactor.md +139 -0
  13. package/jest.config.js +195 -0
  14. package/lib/asset/dll/libcommon3-manifest.json +181 -0
  15. package/lib/asset/template/edu-app-env.d.ts.tpl +15 -0
  16. package/lib/asset/template/edu-scripts.override.js.tpl +14 -0
  17. package/lib/asset/template/page/index.class.js.tpl +24 -0
  18. package/lib/asset/template/page/index.class.tsx.tpl +10 -0
  19. package/lib/asset/template/page/index.fc.js.tpl +16 -0
  20. package/lib/asset/template/page/index.fc.tsx.tpl +9 -0
  21. package/lib/asset/template/page/index.less.tpl +3 -0
  22. package/lib/asset/template/page/logic.js.tpl +4 -0
  23. package/lib/asset/template/page/route.js.tpl +12 -0
  24. package/lib/asset/template/tailwind.config.js.tpl +11 -0
  25. package/lib/asset/template/tsconfig.json.tpl +24 -0
  26. package/lib/auto-refactor.js +175 -0
  27. package/lib/build.js +87 -0
  28. package/lib/cli.js +63 -0
  29. package/lib/commit-dist.js +117 -0
  30. package/lib/config/babel.dependencies.js +56 -0
  31. package/lib/config/babel.js +82 -0
  32. package/lib/config/paths.js +44 -0
  33. package/lib/config/plugins/postcss-safe-area.js +22 -0
  34. package/lib/config/webpackConfig.js +384 -0
  35. package/lib/config/webpackDevServerConfig.js +47 -0
  36. package/lib/deploy.js +186 -0
  37. package/lib/generator.js +155 -0
  38. package/lib/index.d.ts +1 -0
  39. package/lib/index.js +13 -0
  40. package/lib/start.js +51 -0
  41. package/lib/utils/FileSizeReporter.js +131 -0
  42. package/lib/utils/appConfig.js +44 -0
  43. package/lib/utils/beforeStart.js +73 -0
  44. package/lib/utils/changeDeployVersion.js +125 -0
  45. package/lib/utils/defineConfig.d.ts +59 -0
  46. package/lib/utils/defineConfig.js +10 -0
  47. package/lib/utils/exec.js +13 -0
  48. package/lib/utils/getConfig.js +30 -0
  49. package/lib/utils/getOverride.js +33 -0
  50. package/package.json +102 -0
  51. package/src/asset/dll/libcommon3-manifest.json +181 -0
  52. package/src/asset/template/edu-app-env.d.ts.tpl +15 -0
  53. package/src/asset/template/edu-scripts.override.js.tpl +14 -0
  54. package/src/asset/template/page/index.class.js.tpl +24 -0
  55. package/src/asset/template/page/index.class.tsx.tpl +10 -0
  56. package/src/asset/template/page/index.fc.js.tpl +16 -0
  57. package/src/asset/template/page/index.fc.tsx.tpl +9 -0
  58. package/src/asset/template/page/index.less.tpl +3 -0
  59. package/src/asset/template/page/logic.js.tpl +4 -0
  60. package/src/asset/template/page/route.js.tpl +12 -0
  61. package/src/asset/template/tailwind.config.js.tpl +11 -0
  62. package/src/asset/template/tsconfig.json.tpl +24 -0
  63. package/src/auto-refactor.js +172 -0
  64. package/src/build.js +74 -0
  65. package/src/cli.js +91 -0
  66. package/src/commit-dist.js +103 -0
  67. package/src/config/babel.dependencies.js +65 -0
  68. package/src/config/babel.js +88 -0
  69. package/src/config/paths.js +37 -0
  70. package/src/config/plugins/postcss-safe-area.js +21 -0
  71. package/src/config/webpackConfig.js +410 -0
  72. package/src/config/webpackDevServerConfig.js +44 -0
  73. package/src/deploy.js +158 -0
  74. package/src/generator.js +138 -0
  75. package/src/index.ts +1 -0
  76. package/src/start.js +46 -0
  77. package/src/utils/FileSizeReporter.js +144 -0
  78. package/src/utils/appConfig.js +35 -0
  79. package/src/utils/beforeStart.js +66 -0
  80. package/src/utils/changeDeployVersion.js +115 -0
  81. package/src/utils/defineConfig.ts +63 -0
  82. package/src/utils/exec.js +7 -0
  83. package/src/utils/getConfig.js +26 -0
  84. package/src/utils/getOverride.js +32 -0
  85. package/tsconfig.json +31 -0
package/lib/cli.js ADDED
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ const pkg = require('../package.json'); // 检查运行条件
5
+
6
+
7
+ require('./utils/beforeStart'); // eslint-disable-next-line no-unused-expressions
8
+
9
+
10
+ require('yargs').usage(`教育工程化 webpack5 基础框架\n文档: ${pkg.homepage}`).command('start', '开发', yargs => yargs.option('port', {
11
+ alias: 'p',
12
+ desc: '指定端口'
13
+ }).option('open', {
14
+ desc: '启动后打开页面'
15
+ }), args => require('./start')(args)).command('build', '打包', yargs => yargs.option('analyze', {
16
+ alias: 'a',
17
+ desc: '分析代码',
18
+ default: false,
19
+ boolean: true
20
+ }).option('output-html', {
21
+ alias: 'o',
22
+ desc: '输出 html 文件',
23
+ default: false,
24
+ boolean: true
25
+ }), args => require('./build')(args)).command('deploy', '自动部署 dist 到 v1 服务器', yargs => yargs.option('school', {
26
+ alias: 's',
27
+ desc: '上传到校端',
28
+ default: false,
29
+ boolean: true
30
+ }).option('bureau', {
31
+ alias: 'b',
32
+ desc: '上传到局端',
33
+ default: false,
34
+ boolean: true
35
+ }).option('documentshelves', {
36
+ alias: 'd',
37
+ desc: '上传到公文',
38
+ default: false,
39
+ boolean: true
40
+ }), args => require('./deploy')(args)).command(['generator', 'g'], '自动生成代码', yargs => yargs.command('page', '生成 page 模版, 默认根据环境生成 js/ts 与 less 文件', yargs => yargs.option('name', {
41
+ desc: '模块名称',
42
+ string: true
43
+ }).demandOption('name', '必须输入模块名称').option('ts', {
44
+ alias: 't',
45
+ desc: '生成 ts 文件',
46
+ boolean: true,
47
+ default: true
48
+ }).option('route', {
49
+ alias: 'r',
50
+ desc: '生成 index.js 路由文件',
51
+ boolean: true,
52
+ default: true
53
+ }).option('fc', {
54
+ alias: 'f',
55
+ desc: '生成 Function Component 文件',
56
+ boolean: true
57
+ }), args => require('./generator').page(args)).command('override', '创建 override 文件', {}, args => require('./generator').override(args)).command('tailwind', '创建 tailwind 文件', {}, args => require('./generator').tailwind(args)).command('ts', '创建 tsconfig 文件', {}, args => require('./generator').ts(args)).showHelpOnFail(true).demandCommand(1, '')).command('auto-refactor', '自动改造项目', {}, () => require('./auto-refactor')()).command('commit-dist', '提交 dist 目录到 dist 分支', yargs => yargs.option('rm-local', {
58
+ desc: '提交完后删除本地 dist',
59
+ type: 'boolean'
60
+ }), args => require('./commit-dist')(args)).showHelpOnFail(true).demandCommand(1, '').alias({
61
+ v: 'version',
62
+ h: 'help'
63
+ }).argv;
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+
3
+ const chalk = require('chalk');
4
+
5
+ const paths = require('./config/paths');
6
+
7
+ const fs = require('fs-extra');
8
+
9
+ const exec = (cmd, opts) => require('child_process').execSync(cmd, {
10
+ encoding: 'utf-8',
11
+ stdio: 'pipe',
12
+ ...opts
13
+ });
14
+
15
+ const tmp = require('tmp');
16
+
17
+ const glob = require('globby');
18
+
19
+ function validateSVNRoot(root) {
20
+ const ls = exec(`svn ls ${root}`);
21
+ return ['trunk', 'branches'].every(s => ls.includes(s));
22
+ }
23
+
24
+ function getWorkingCopyInfo() {
25
+ exec(`svn up`);
26
+ const url = exec(`svn info --show-item url`).trim();
27
+ const revision = exec(`svn info --show-item last-changed-revision`).trim();
28
+ const author = exec(`svn info --show-item last-changed-author`).trim();
29
+ let branch = 'trunk';
30
+ let root = url.replace(/\/trunk$/, '');
31
+
32
+ if (url.includes('/branches/')) {
33
+ branch = url.split('/').pop();
34
+ root = url.replace(/\/branches\/[^/]+$/, '');
35
+ }
36
+
37
+ let distBranchURL = root + '/branches/dist';
38
+ let distBranchDirURL = distBranchURL + '/' + branch;
39
+
40
+ if (!validateSVNRoot(root)) {
41
+ console.log(chalk.red('SVN目录不符合规则,必须包含 trunk branches'));
42
+ process.exit(1);
43
+ }
44
+
45
+ return {
46
+ url,
47
+ branch,
48
+ revision,
49
+ author,
50
+ distBranchURL,
51
+ distBranchDirURL,
52
+ root
53
+ };
54
+ }
55
+
56
+ function copyDistToRepo(info) {
57
+ const tmpdir = tmp.dirSync().name;
58
+
59
+ try {
60
+ exec(`svn ls ${info.distBranchDirURL} --depth empty`);
61
+ } catch (error) {
62
+ if (error.message.includes('non-existent')) {
63
+ exec(`svn mkdir ${info.distBranchDirURL} --parents -m "[edu-scripts] create ${info.branch} dist"`);
64
+ } else {
65
+ throw error;
66
+ }
67
+ }
68
+
69
+ exec(`svn co ${info.distBranchDirURL} ${tmpdir}`);
70
+ let files = glob.sync('**/*', {
71
+ cwd: tmpdir
72
+ });
73
+ exec(`svn rm "${files.join('" "')}"`, {
74
+ cwd: tmpdir
75
+ });
76
+ fs.copySync(paths.dist, tmpdir);
77
+ files = glob.sync('**/*', {
78
+ cwd: tmpdir
79
+ });
80
+ exec(`svn add "${files.join('" "')}"`, {
81
+ cwd: tmpdir
82
+ });
83
+ const msg = `[edu-scripts] commit ${info.branch} dist #${info.revision} @${info.author}`;
84
+ exec(`svn ci -m "${msg}"`, {
85
+ cwd: tmpdir
86
+ });
87
+ fs.removeSync(tmpdir);
88
+ }
89
+ /**
90
+ * svn commit dist folder to dish branches
91
+ *
92
+ * @param {Object} args
93
+ * @param {boolean} args.rmLocal
94
+ */
95
+
96
+
97
+ module.exports = async function commitDist(args) {
98
+ if (!fs.existsSync(paths.dist)) {
99
+ console.log(chalk.red('未找到 dist 文件夹,请先 edu-scpirts build'));
100
+ process.exit(1);
101
+ }
102
+
103
+ if (exec('svn st').trim().length) {
104
+ console.log(chalk.red('似乎存在未提交的代码,请提交后重试。运行 svn st 查看具体信息'));
105
+ process.exit(1);
106
+ }
107
+
108
+ const info = getWorkingCopyInfo();
109
+ console.log(chalk.green([`分支: ${info.branch}`, `版本: ${info.revision}`, `作者: ${info.author}`, `地址: ${info.distBranchDirURL}`].join('\n')));
110
+ copyDistToRepo(info);
111
+
112
+ if (args.rmLocal) {
113
+ fs.removeSync(paths.dist);
114
+ }
115
+
116
+ console.log(chalk.green('提交完成'));
117
+ };
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ const getOverride = require('../utils/getOverride');
4
+ /**
5
+ * @typedef {Object} Opts
6
+ * @property {string} [modules]
7
+ *
8
+ * @param {Opts} [opts]
9
+ * @return {*}
10
+ */
11
+
12
+
13
+ module.exports = function getBabelConfig(opts = {}) {
14
+ const isDev = process.env.NODE_ENV === 'development';
15
+ let config = {
16
+ cacheDirectory: true,
17
+ cacheCompression: false,
18
+ babelrc: false,
19
+ configFile: false,
20
+ sourceType: 'unambiguous',
21
+ compact: false,
22
+ sourceMaps: isDev,
23
+ inputSourceMap: isDev,
24
+ presets: [['@babel/preset-env', {
25
+ modules: opts.modules,
26
+ useBuiltIns: 'entry',
27
+ corejs: 3,
28
+ // Exclude transforms that make all code slower
29
+ exclude: ['transform-typeof-symbol']
30
+ }]].filter(Boolean),
31
+ plugins: [['@babel/plugin-transform-runtime', {
32
+ corejs: false,
33
+ helpers: true,
34
+ // By default, babel assumes babel/runtime version 7.0.0-beta.0,
35
+ // explicitly resolving to match the provided helper functions.
36
+ // https://github.com/babel/babel/issues/10261
37
+ version: require('@babel/runtime/package.json').version,
38
+ regenerator: true // // https://babeljs.io/docs/en/babel-plugin-transform-runtime#useesmodules
39
+ // // We should turn this on once the lowest version of Node LTS
40
+ // // supports ES Modules.
41
+ // useESModules: true,
42
+
43
+ }], ['import', {
44
+ libraryName: 'lodash',
45
+ libraryDirectory: '',
46
+ camel2DashComponentName: false
47
+ }, 'lodash']].filter(Boolean)
48
+ };
49
+ const override = getOverride();
50
+
51
+ if (override.babel) {
52
+ config = override.babel(config, 'node_modules') || config;
53
+ }
54
+
55
+ return config;
56
+ };
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+
3
+ const fs = require('fs');
4
+
5
+ const paths = require('./paths');
6
+
7
+ const appConfig = require('../utils/appConfig');
8
+
9
+ const getOverride = require('../utils/getOverride');
10
+
11
+ const hasJsxRuntime = (() => {
12
+ try {
13
+ require.resolve('react/jsx-runtime');
14
+
15
+ return true && appConfig.single;
16
+ } catch (error) {
17
+ return false;
18
+ }
19
+ })();
20
+ /**
21
+ * @typedef {Object} Opts
22
+ * @property {string} [modules]
23
+ *
24
+ * @param {Opts} [opts]
25
+ * @return {*}
26
+ */
27
+
28
+
29
+ module.exports = function getBabelConfig(opts = {}) {
30
+ const isTypeScriptEnabled = fs.existsSync(paths.tsconfig);
31
+ const isDev = process.env.NODE_ENV === 'development';
32
+ let config = {
33
+ cacheDirectory: true,
34
+ cacheCompression: false,
35
+ compact: !isDev,
36
+ babelrc: false,
37
+ configFile: false,
38
+ presets: [['@babel/preset-env', {
39
+ modules: opts.modules,
40
+ useBuiltIns: 'entry',
41
+ corejs: 3,
42
+ // Exclude transforms that make all code slower
43
+ exclude: ['transform-typeof-symbol']
44
+ }], ['@babel/preset-react', {
45
+ development: isDev,
46
+ runtime: hasJsxRuntime ? 'automatic' : 'classic',
47
+ useBuiltIns: !hasJsxRuntime
48
+ }], isTypeScriptEnabled && '@babel/preset-typescript'].filter(Boolean),
49
+ plugins: [['@babel/plugin-transform-runtime', {
50
+ corejs: false,
51
+ helpers: true,
52
+ // By default, babel assumes babel/runtime version 7.0.0-beta.0,
53
+ // explicitly resolving to match the provided helper functions.
54
+ // https://github.com/babel/babel/issues/10261
55
+ version: require('@babel/runtime/package.json').version,
56
+ regenerator: true // // https://babeljs.io/docs/en/babel-plugin-transform-runtime#useesmodules
57
+ // // We should turn this on once the lowest version of Node LTS
58
+ // // supports ES Modules.
59
+ // useESModules: true,
60
+
61
+ }], ['@babel/plugin-proposal-decorators', {
62
+ legacy: true
63
+ }], ['@babel/plugin-proposal-class-properties', {
64
+ loose: true
65
+ }], ['@babel/plugin-proposal-private-methods', {
66
+ loose: true
67
+ }], ['@babel/plugin-proposal-private-property-in-object', {
68
+ loose: true
69
+ }], ['import', {
70
+ libraryName: 'lodash',
71
+ libraryDirectory: '',
72
+ camel2DashComponentName: false
73
+ }, 'lodash'], isDev && 'react-refresh/babel'].filter(Boolean)
74
+ };
75
+ const override = getOverride();
76
+
77
+ if (override.babel) {
78
+ config = override.babel(config, 'src') || config;
79
+ }
80
+
81
+ return config;
82
+ };
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ const path = require('path');
4
+
5
+ const fs = require('fs');
6
+
7
+ const glob = require('globby');
8
+
9
+ function resolveApp(...filePath) {
10
+ return path.resolve(process.cwd(), ...filePath);
11
+ }
12
+
13
+ function getExistPath(...paths) {
14
+ for (const path of paths) {
15
+ if (fs.existsSync(path)) {
16
+ return path;
17
+ }
18
+ }
19
+
20
+ return paths[0];
21
+ }
22
+
23
+ const paths = {
24
+ resolveApp,
25
+ eduAppEnv: resolveApp('src', 'edu-app-env.d.ts'),
26
+ dist: resolveApp('dist'),
27
+ sshSftp: resolveApp('.sftprc.json'),
28
+ nodeModules: resolveApp('node_modules'),
29
+ tsconfig: resolveApp('tsconfig.json'),
30
+ jsconfig: resolveApp('jsconfig.json'),
31
+ package: resolveApp('package.json'),
32
+ tailwind: resolveApp('tailwind.config.js'),
33
+ indexJS: resolveApp('src', 'index.js'),
34
+ pages: resolveApp('src', 'pages'),
35
+ override: resolveApp('edu-scripts.override.js'),
36
+ indexHTML: glob.sync('./public/*.html', {
37
+ absolute: true
38
+ }),
39
+ src: resolveApp('src'),
40
+ public: resolveApp('public'),
41
+ static: resolveApp('public', 'static'),
42
+ theme: getExistPath(resolveApp('theme.json'), resolveApp('theme.js'))
43
+ };
44
+ module.exports = paths;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ const vars = ['safe-area-inset-top', 'safe-area-inset-bottom', 'safe-area-inset-left', 'safe-area-inset-right'];
4
+ const expr = new RegExp(`env\\(\\s*(${vars.join('|')})\\s*,?\\s*([^)]+)?\\s*\\)`, 'g');
5
+ /** @type {import('postcss').PluginCreator} */
6
+
7
+ module.exports = () => {
8
+ return {
9
+ postcssPlugin: 'postcss-safe-area',
10
+
11
+ Declaration(decl) {
12
+ const fallback = decl.value.replace(expr, (match, param, defaultValue) => defaultValue || '0');
13
+
14
+ if (fallback !== decl.value) {
15
+ decl.cloneBefore({
16
+ value: fallback
17
+ });
18
+ }
19
+ }
20
+
21
+ };
22
+ };