-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathbuild.js
103 lines (84 loc) · 3.74 KB
/
build.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
const fs = require('fs');
const loadFile = path => fs.readFileSync(path, 'utf8');
const loadJSON = path => JSON.parse(loadFile(path));
const loadModule = path => loadFile(`./src/${path}.js`);
const loadExternalModule = path => loadFile(`./node_modules/${path}.js`);
const convertModuleExportsToDefine = (script, path) => {
const moduleExportsRegExp = /module\.exports = (.+?);/;
const match = script.match(moduleExportsRegExp);
if (match) {
const normalized =
script.replace(match[0], `loader.define('${path}', ${match[1]});`);
return normalized;
}
throw new Error(`No module.exports statement found in: ${path}`);
};
const normalizeModule = path => {
const script = loadModule(path);
return convertModuleExportsToDefine(script, path);
};
const copyrightHeader = `/*
Copyright 2017-2020 Opera Software AS
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
`;
const merge = (...contents) => contents.join('\n\n');
const packageJson = loadJSON('./package.json');
const Loader = loadExternalModule('lazy-module-loader/loader');
const Browser = normalizeModule('core/browser');
const Nodes = normalizeModule('core/nodes');
const Description = normalizeModule('core/description');
const Diff = normalizeModule('core/diff');
const Dispatcher = normalizeModule('core/dispatcher');
const Lifecycle = normalizeModule('core/lifecycle');
const Patch = normalizeModule('core/patch');
const Plugins = normalizeModule('core/plugins');
const Reconciler = normalizeModule('core/reconciler');
const Reducers = normalizeModule('core/reducers');
const Renderer = normalizeModule('core/renderer');
const Sandbox = normalizeModule('core/sandbox');
const Service = normalizeModule('core/service');
const Template = normalizeModule('core/template');
const VirtualDOM = normalizeModule('core/virtual-dom');
const utils = normalizeModule('core/utils');
const Toolkit = normalizeModule('core/toolkit');
const Release = loadModule('release');
let release = merge(
Loader, Browser, Dispatcher, Nodes, Diff, Lifecycle, Patch,
Description, Plugins, Reconciler, Renderer, Sandbox,
Service, Reducers, Template, VirtualDOM, utils,
Toolkit, Release,
).replace(/\n\n\n/g, '\n\n');
while (release.includes(copyrightHeader)) {
release = release.replace(copyrightHeader, '');
}
release = `${copyrightHeader}${release}`;
const targetDir = './dist';
if (!fs.existsSync(targetDir)) {
fs.mkdirSync(targetDir);
}
const targetPath = `${targetDir}/toolkit-${packageJson.version}.js`;
fs.writeFileSync(targetPath, release, 'utf8');
const formatNumber = number => String(number).replace(/(\d{3})$/g, ',$1');
const size = formatNumber(release.length);
const lines = formatNumber(release.split('\n').length);
/* eslint-disable no-console */
console.log();
console.log('-------------------------------------------------------');
console.log(' Finished bundling release version of Opera Toolkit');
console.log('-------------------------------------------------------');
console.log(` => Target file: ${targetPath}`);
console.log(` => Version: ${packageJson.version}`);
console.log(` => Lines: ${lines}`);
console.log(` => Size: ${size} bytes`);
console.log('-------------------------------------------------------');
console.log();
/* eslint-enable no-console */