@ray-js/builder-component 0.3.0-beta.1c347991
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +40 -0
- package/lib/babel/import-replacement/index.d.ts +10 -0
- package/lib/babel/import-replacement/index.js +14 -0
- package/lib/build.d.ts +7 -0
- package/lib/build.js +93 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +8 -0
- package/lib/transform/babelTransform.d.ts +8 -0
- package/lib/transform/babelTransform.js +90 -0
- package/lib/transform/index.d.ts +17 -0
- package/lib/transform/index.js +196 -0
- package/lib/transform/type.d.ts +3 -0
- package/lib/transform/type.js +61 -0
- package/package.json +50 -0
package/README.md
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# @ray-js/builder-component
|
2
|
+
|
3
|
+
组件构建器,将文件按运行时拆分为多文件。
|
4
|
+
|
5
|
+
## Examples
|
6
|
+
|
7
|
+
### 全平台转换
|
8
|
+
|
9
|
+
input:
|
10
|
+
|
11
|
+
```
|
12
|
+
src/index.ts
|
13
|
+
```
|
14
|
+
|
15
|
+
output:
|
16
|
+
|
17
|
+
```
|
18
|
+
index.web.js
|
19
|
+
index.wechat.js
|
20
|
+
index.native.js
|
21
|
+
index.js
|
22
|
+
```
|
23
|
+
|
24
|
+
### 按需平台
|
25
|
+
|
26
|
+
input:
|
27
|
+
|
28
|
+
```
|
29
|
+
src/index.ts
|
30
|
+
src/index.wechat.ts
|
31
|
+
```
|
32
|
+
|
33
|
+
output:
|
34
|
+
|
35
|
+
```
|
36
|
+
index.web.js
|
37
|
+
index.wechat.js # 原文件转换
|
38
|
+
index.native.js
|
39
|
+
index.js
|
40
|
+
```
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import type { NodePath } from '@babel/traverse';
|
2
|
+
import * as t from '@babel/types';
|
3
|
+
declare const _default: (api: object, options: {
|
4
|
+
replace: (source: string) => string;
|
5
|
+
}, dirname: string) => {
|
6
|
+
visitor: {
|
7
|
+
ImportDeclaration(this: import("@babel/core").PluginPass, path: NodePath<t.ImportDeclaration>): void;
|
8
|
+
};
|
9
|
+
};
|
10
|
+
export default _default;
|
@@ -0,0 +1,14 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const helper_plugin_utils_1 = require("@babel/helper-plugin-utils");
|
4
|
+
exports.default = (0, helper_plugin_utils_1.declare)((api, options) => {
|
5
|
+
api.assertVersion(7);
|
6
|
+
const replace = options.replace;
|
7
|
+
return {
|
8
|
+
visitor: {
|
9
|
+
ImportDeclaration(path) {
|
10
|
+
path.node.source.value = replace(path.node.source.value);
|
11
|
+
},
|
12
|
+
},
|
13
|
+
};
|
14
|
+
});
|
package/lib/build.d.ts
ADDED
package/lib/build.js
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9
|
+
});
|
10
|
+
};
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
13
|
+
};
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
15
|
+
const chokidar_1 = __importDefault(require("chokidar"));
|
16
|
+
const colors_1 = __importDefault(require("colors"));
|
17
|
+
const globby_1 = __importDefault(require("globby"));
|
18
|
+
const path_1 = __importDefault(require("path"));
|
19
|
+
const shared_1 = require("@ray-js/shared");
|
20
|
+
const transform_1 = require("./transform");
|
21
|
+
colors_1.default.enable();
|
22
|
+
const LOG_PREFIX = 'builder-component';
|
23
|
+
function build(options) {
|
24
|
+
return __awaiter(this, void 0, void 0, function* () {
|
25
|
+
const { cwd = process.cwd(), source = 'src', output = 'lib', watch = false, transformMode = 'auto', } = options;
|
26
|
+
const sourceDir = path_1.default.join(cwd, source);
|
27
|
+
const outputDir = path_1.default.join(cwd, output);
|
28
|
+
if (watch) {
|
29
|
+
shared_1.log.info(LOG_PREFIX, 'watching...');
|
30
|
+
const watcher = chokidar_1.default.watch(['**/*.*', '!**/demos/**/*.*', '!**/__tests__/**/*.*', '!**/*.md'], {
|
31
|
+
cwd: sourceDir,
|
32
|
+
});
|
33
|
+
watcher.on('all', (event, filePath, _) => __awaiter(this, void 0, void 0, function* () {
|
34
|
+
const file = path_1.default.join(sourceDir, filePath);
|
35
|
+
if (event === 'change' || event === 'add') {
|
36
|
+
shared_1.log.info(`[${event}]`, filePath);
|
37
|
+
yield (0, transform_1.transformPlatformFiles)({
|
38
|
+
file,
|
39
|
+
mode: transformMode,
|
40
|
+
sourceDir,
|
41
|
+
outputDir,
|
42
|
+
}).catch((error) => {
|
43
|
+
console.error(error);
|
44
|
+
});
|
45
|
+
}
|
46
|
+
else {
|
47
|
+
shared_1.log.warn(`[${event}]`, filePath);
|
48
|
+
if (event === 'unlink') {
|
49
|
+
yield (0, transform_1.unlinkPlatformFiles)({
|
50
|
+
outputDir,
|
51
|
+
sourceDir,
|
52
|
+
file,
|
53
|
+
});
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}));
|
57
|
+
}
|
58
|
+
else {
|
59
|
+
const files = globby_1.default.sync(['**/*.*', '!**/demos/**/*.*', '!**/__tests__/**/*.*'], {
|
60
|
+
dot: false,
|
61
|
+
cwd: sourceDir,
|
62
|
+
absolute: true,
|
63
|
+
});
|
64
|
+
if (!files || files.length === 0) {
|
65
|
+
shared_1.log.error(LOG_PREFIX, 'Not exist any files'.red, cwd);
|
66
|
+
process.exit(0);
|
67
|
+
}
|
68
|
+
for (let index = 0; index < files.length; index++) {
|
69
|
+
const file = files[index];
|
70
|
+
yield (0, transform_1.transformPlatformFiles)({
|
71
|
+
file,
|
72
|
+
mode: transformMode,
|
73
|
+
sourceDir,
|
74
|
+
outputDir,
|
75
|
+
}).catch((error) => {
|
76
|
+
console.error(error);
|
77
|
+
});
|
78
|
+
}
|
79
|
+
const dtsStartTime = Date.now();
|
80
|
+
shared_1.log.info(LOG_PREFIX, 'd.ts generating...'.yellow);
|
81
|
+
const typeFiles = yield (0, transform_1.generateDTS)(files.filter((file) => /\.tsx?$/.test(file)));
|
82
|
+
for (let index = 0; index < Object.entries(typeFiles).length; index++) {
|
83
|
+
const [dtsFile, content] = Object.entries(typeFiles)[index];
|
84
|
+
const fileBase = path_1.default.relative(sourceDir, dtsFile);
|
85
|
+
const dtsFilePath = path_1.default.join(outputDir, fileBase);
|
86
|
+
(0, shared_1.writeFileSync)(dtsFilePath, content);
|
87
|
+
shared_1.log.verbose(LOG_PREFIX, fileBase.gray);
|
88
|
+
}
|
89
|
+
shared_1.log.info(LOG_PREFIX, 'd.ts done.'.green, Date.now() - dtsStartTime, 'ms');
|
90
|
+
}
|
91
|
+
});
|
92
|
+
}
|
93
|
+
exports.default = build;
|
package/lib/index.d.ts
ADDED
package/lib/index.js
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.build = void 0;
|
7
|
+
const build_1 = __importDefault(require("./build"));
|
8
|
+
exports.build = build_1.default;
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import type { Modules } from '@ray-js/babel-preset-standard';
|
2
|
+
import { Target } from '@ray-js/types';
|
3
|
+
export declare type BabelTransformOptions = {
|
4
|
+
modules: Modules;
|
5
|
+
target?: Target;
|
6
|
+
pure?: boolean;
|
7
|
+
};
|
8
|
+
export default function babelTransform(file: string, options: BabelTransformOptions): Promise<import("@babel/core").BabelFileResult>;
|
@@ -0,0 +1,90 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9
|
+
});
|
10
|
+
};
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
13
|
+
};
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
15
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
16
|
+
const path_1 = __importDefault(require("path"));
|
17
|
+
const core_1 = require("@babel/core");
|
18
|
+
const env_loader_1 = require("@ray-js/env-loader");
|
19
|
+
function babelTransform(file, options) {
|
20
|
+
return __awaiter(this, void 0, void 0, function* () {
|
21
|
+
options = Object.assign({ modules: 'auto' }, options);
|
22
|
+
let babelPlugin = [];
|
23
|
+
let codeMap;
|
24
|
+
const source = fs_extra_1.default.readFileSync(file).toString();
|
25
|
+
let code = source;
|
26
|
+
if (options.target) {
|
27
|
+
const { target } = options;
|
28
|
+
process.env.PLATFORM = target;
|
29
|
+
process.env.REMAX_PLATFORM = target;
|
30
|
+
babelPlugin = [
|
31
|
+
[
|
32
|
+
require.resolve('../babel/import-replacement'),
|
33
|
+
{
|
34
|
+
replace: function (source) {
|
35
|
+
if (source.endsWith('.mini')) {
|
36
|
+
// .mini.js 是 remax 中对小程序统称的文件后缀
|
37
|
+
return source.replace(/\.mini$/, `.${target}`);
|
38
|
+
}
|
39
|
+
return source;
|
40
|
+
},
|
41
|
+
},
|
42
|
+
],
|
43
|
+
[
|
44
|
+
require.resolve('babel-plugin-import'),
|
45
|
+
{
|
46
|
+
libraryName: '@remax/wechat',
|
47
|
+
transformToDefaultImport: false,
|
48
|
+
camel2DashComponentName: false,
|
49
|
+
customName: (name) => {
|
50
|
+
if (name.endsWith('Props')) {
|
51
|
+
return '@remax/wechat';
|
52
|
+
}
|
53
|
+
return `@remax/wechat/esm/hostComponents/${name}/index`;
|
54
|
+
},
|
55
|
+
},
|
56
|
+
'@remax/wechat',
|
57
|
+
],
|
58
|
+
];
|
59
|
+
const { code: removeEnvCode, map } = yield (0, env_loader_1.traverseImport)({ platform: options.target }, source, {
|
60
|
+
sourceMaps: true,
|
61
|
+
sourceMapTarget: path_1.default.basename(file),
|
62
|
+
sourceFileName: file,
|
63
|
+
});
|
64
|
+
code = removeEnvCode;
|
65
|
+
codeMap = map;
|
66
|
+
}
|
67
|
+
return yield (0, core_1.transformAsync)(code, {
|
68
|
+
babelrc: false,
|
69
|
+
configFile: false,
|
70
|
+
sourceMaps: true,
|
71
|
+
presets: [
|
72
|
+
[
|
73
|
+
require.resolve('@ray-js/babel-preset-standard'),
|
74
|
+
{
|
75
|
+
modules: options.modules,
|
76
|
+
jsx: 'react',
|
77
|
+
platform: options.target,
|
78
|
+
macro: false,
|
79
|
+
// native 不需要 polyfill
|
80
|
+
useBuiltIns: ['native', 'ios', 'android'].includes(options.target) ? false : undefined,
|
81
|
+
},
|
82
|
+
],
|
83
|
+
],
|
84
|
+
plugins: babelPlugin,
|
85
|
+
inputSourceMap: codeMap,
|
86
|
+
filename: file,
|
87
|
+
});
|
88
|
+
});
|
89
|
+
}
|
90
|
+
exports.default = babelTransform;
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { TransformOptions } from '@ray-js/types';
|
2
|
+
export { generateDTS } from './type';
|
3
|
+
export declare function replaceExt(file: string, ext: string): string;
|
4
|
+
/**
|
5
|
+
* 根据原文件,移除对应生成的平台文件
|
6
|
+
* @param options
|
7
|
+
*/
|
8
|
+
export declare function unlinkPlatformFiles(options: {
|
9
|
+
file: string;
|
10
|
+
outputDir: string;
|
11
|
+
sourceDir: string;
|
12
|
+
}): void;
|
13
|
+
/**
|
14
|
+
* 转换器 将文件转成所需要的格式
|
15
|
+
* ts|js 需要生成对应的平台地址
|
16
|
+
*/
|
17
|
+
export declare function transformPlatformFiles(options: TransformOptions): Promise<void>;
|
@@ -0,0 +1,196 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9
|
+
});
|
10
|
+
};
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
13
|
+
};
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
15
|
+
exports.transformPlatformFiles = exports.unlinkPlatformFiles = exports.replaceExt = exports.generateDTS = void 0;
|
16
|
+
const colors_1 = __importDefault(require("colors"));
|
17
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
18
|
+
const path_1 = __importDefault(require("path"));
|
19
|
+
const shared_1 = require("@ray-js/shared");
|
20
|
+
const types_1 = require("@ray-js/types");
|
21
|
+
const babelTransform_1 = __importDefault(require("./babelTransform"));
|
22
|
+
var type_1 = require("./type");
|
23
|
+
Object.defineProperty(exports, "generateDTS", { enumerable: true, get: function () { return type_1.generateDTS; } });
|
24
|
+
colors_1.default.enable();
|
25
|
+
function replaceExt(file, ext) {
|
26
|
+
if (typeof file !== 'string') {
|
27
|
+
return file;
|
28
|
+
}
|
29
|
+
if (file.length === 0) {
|
30
|
+
return file;
|
31
|
+
}
|
32
|
+
const nFileName = path_1.default.basename(file, path_1.default.extname(file)) + ext;
|
33
|
+
return path_1.default.join(path_1.default.dirname(file), nFileName);
|
34
|
+
}
|
35
|
+
exports.replaceExt = replaceExt;
|
36
|
+
const transformTarget = [
|
37
|
+
types_1.PlatformTarget.wechat,
|
38
|
+
types_1.PlatformTarget.web,
|
39
|
+
types_1.PlatformTarget.ios,
|
40
|
+
types_1.PlatformTarget.android,
|
41
|
+
types_1.PlatformTarget.tuya,
|
42
|
+
]; // 构建的目标平台
|
43
|
+
/**
|
44
|
+
* 根据原文件,移除对应生成的平台文件
|
45
|
+
* @param options
|
46
|
+
*/
|
47
|
+
function unlinkPlatformFiles(options) {
|
48
|
+
const { sourceDir, outputDir, file } = options;
|
49
|
+
const fileBase = path_1.default.relative(sourceDir, file);
|
50
|
+
let fileExt;
|
51
|
+
if (fileBase.endsWith('.d.ts')) {
|
52
|
+
fileExt = '.d.ts';
|
53
|
+
}
|
54
|
+
else {
|
55
|
+
fileExt = path_1.default.extname(fileBase);
|
56
|
+
}
|
57
|
+
const likePaths = [];
|
58
|
+
const libFile = path_1.default.join(outputDir, fileBase);
|
59
|
+
if (['.ts', '.tsx', '.js', '.jsx'].includes(fileExt) && fileExt !== '.d.ts') {
|
60
|
+
likePaths.push(replaceExt(libFile, '.js'));
|
61
|
+
transformTarget.forEach((target) => {
|
62
|
+
likePaths.push(replaceExt(libFile, `.${target}.js`));
|
63
|
+
});
|
64
|
+
}
|
65
|
+
else {
|
66
|
+
likePaths.push(libFile);
|
67
|
+
}
|
68
|
+
likePaths.filter(fs_extra_1.default.existsSync).map(fs_extra_1.default.unlinkSync);
|
69
|
+
}
|
70
|
+
exports.unlinkPlatformFiles = unlinkPlatformFiles;
|
71
|
+
const PLATFORM_EXTENSION = [...Object.keys(types_1.PlatformTarget), 'mini', 'native'];
|
72
|
+
// 平台文件后缀
|
73
|
+
// .mini.js 是 remax 定义的小程序文件后缀
|
74
|
+
const REGEXP_PLATFORM_EXTENSION = new RegExp(`\\.(?<target>(${PLATFORM_EXTENSION.join('|')}))\\.(ts|js)x?$`);
|
75
|
+
/**
|
76
|
+
* 是否为平台文件后缀文件
|
77
|
+
*
|
78
|
+
* @param file
|
79
|
+
* @example
|
80
|
+
* .native.js .wechat.js .tuya.js
|
81
|
+
*/
|
82
|
+
function isPlatformExtension(file) {
|
83
|
+
const fileName = path_1.default.basename(file);
|
84
|
+
return REGEXP_PLATFORM_EXTENSION.test(fileName);
|
85
|
+
}
|
86
|
+
function getOtherPlatformFile(file) {
|
87
|
+
const platform = [];
|
88
|
+
const ext = path_1.default.extname(file);
|
89
|
+
PLATFORM_EXTENSION.forEach((target) => {
|
90
|
+
const targetExt = `.${target}${ext}`;
|
91
|
+
const targetFile = replaceExt(file, targetExt);
|
92
|
+
if (fs_extra_1.default.existsSync(targetFile)) {
|
93
|
+
if (target in types_1.PlatformTargetPresets) {
|
94
|
+
platform.push(...types_1.PlatformTargetPresets[target]);
|
95
|
+
}
|
96
|
+
else {
|
97
|
+
platform.push(target);
|
98
|
+
}
|
99
|
+
}
|
100
|
+
});
|
101
|
+
return platform;
|
102
|
+
}
|
103
|
+
/**
|
104
|
+
* 转换器 将文件转成所需要的格式
|
105
|
+
* ts|js 需要生成对应的平台地址
|
106
|
+
*/
|
107
|
+
function transformPlatformFiles(options) {
|
108
|
+
return __awaiter(this, void 0, void 0, function* () {
|
109
|
+
const { file, mode, outputDir, sourceDir } = options;
|
110
|
+
const startTime = Date.now();
|
111
|
+
const fileBase = path_1.default.relative(sourceDir, file);
|
112
|
+
let fileExt;
|
113
|
+
if (file.endsWith('.d.ts')) {
|
114
|
+
fileExt = '.d.ts';
|
115
|
+
}
|
116
|
+
else {
|
117
|
+
fileExt = path_1.default.extname(file);
|
118
|
+
}
|
119
|
+
let transformPure = true;
|
120
|
+
// 生成 JS 文件
|
121
|
+
let babelResult;
|
122
|
+
let outputFile;
|
123
|
+
let transformOutputTargets = [];
|
124
|
+
if (['.ts', '.tsx', '.js', '.jsx'].includes(fileExt) && fileExt !== '.d.ts') {
|
125
|
+
// 智能构建模式, 将 index.js 分成对应的几个端
|
126
|
+
if (mode === 'auto') {
|
127
|
+
if (isPlatformExtension(file)) {
|
128
|
+
transformPure = false;
|
129
|
+
// 自定义构建模式, 根据当前文件后缀
|
130
|
+
// 根据当前文件后缀, 获取目标平台
|
131
|
+
const { groups } = REGEXP_PLATFORM_EXTENSION.exec(fileBase);
|
132
|
+
const { target: targetPreset } = groups;
|
133
|
+
if (targetPreset in types_1.PlatformTargetPresets) {
|
134
|
+
// 预置模式
|
135
|
+
const platformTargetPreset = types_1.PlatformTargetPresets[targetPreset];
|
136
|
+
for (let k = 0; k < platformTargetPreset.length; k++) {
|
137
|
+
const target = platformTargetPreset[k];
|
138
|
+
const ext = `.${target}.js`;
|
139
|
+
babelResult = yield (0, babelTransform_1.default)(file, { target: target, modules: false });
|
140
|
+
transformOutputTargets.push(target);
|
141
|
+
if (babelResult && typeof babelResult.code === 'string') {
|
142
|
+
outputFile = replaceExt(path_1.default.join(outputDir, fileBase.replace(`.${targetPreset}`, '')), ext);
|
143
|
+
yield (0, shared_1.writeFileSync)(outputFile, babelResult.code);
|
144
|
+
}
|
145
|
+
}
|
146
|
+
}
|
147
|
+
else {
|
148
|
+
babelResult = yield (0, babelTransform_1.default)(file, {
|
149
|
+
target: targetPreset,
|
150
|
+
modules: false,
|
151
|
+
});
|
152
|
+
transformOutputTargets.push(targetPreset);
|
153
|
+
if (babelResult && typeof babelResult.code === 'string') {
|
154
|
+
outputFile = replaceExt(path_1.default.join(outputDir, fileBase), '.js');
|
155
|
+
yield (0, shared_1.writeFileSync)(outputFile, babelResult.code);
|
156
|
+
}
|
157
|
+
}
|
158
|
+
}
|
159
|
+
else {
|
160
|
+
const presetPlatform = getOtherPlatformFile(file);
|
161
|
+
for (let k = 0; k < transformTarget.length; k++) {
|
162
|
+
const target = transformTarget[k];
|
163
|
+
// 存在其他平台的预置文件不再生成
|
164
|
+
if (!presetPlatform.includes(target)) {
|
165
|
+
const ext = `.${target}.js`;
|
166
|
+
babelResult = yield (0, babelTransform_1.default)(file, { target, modules: false });
|
167
|
+
transformOutputTargets.push(target);
|
168
|
+
if (babelResult && typeof babelResult.code === 'string') {
|
169
|
+
outputFile = replaceExt(path_1.default.join(outputDir, fileBase), ext);
|
170
|
+
yield (0, shared_1.writeFileSync)(outputFile, babelResult.code);
|
171
|
+
}
|
172
|
+
}
|
173
|
+
}
|
174
|
+
}
|
175
|
+
}
|
176
|
+
if (transformPure) {
|
177
|
+
// 保留原始文件
|
178
|
+
// 纯 js es6=>es5 转换 可用于 browser & 小程序 使用的工具库构建
|
179
|
+
babelResult = yield (0, babelTransform_1.default)(file, { pure: true, modules: false });
|
180
|
+
transformOutputTargets.push('*');
|
181
|
+
if (babelResult && typeof babelResult.code === 'string') {
|
182
|
+
outputFile = replaceExt(path_1.default.join(outputDir, fileBase), '.js');
|
183
|
+
yield (0, shared_1.writeFileSync)(outputFile, babelResult.code);
|
184
|
+
}
|
185
|
+
}
|
186
|
+
}
|
187
|
+
else {
|
188
|
+
// 非 js 等文件,直接拷贝输出
|
189
|
+
const fileContent = fs_extra_1.default.readFileSync(file);
|
190
|
+
const outputFile = path_1.default.join(outputDir, fileBase);
|
191
|
+
yield (0, shared_1.writeFileSync)(outputFile, fileContent);
|
192
|
+
}
|
193
|
+
shared_1.log.info(`transform`, fileBase.cyan, transformOutputTargets, `${Date.now() - startTime}ms`.white);
|
194
|
+
});
|
195
|
+
}
|
196
|
+
exports.transformPlatformFiles = transformPlatformFiles;
|
@@ -0,0 +1,61 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
32
|
+
});
|
33
|
+
};
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
35
|
+
exports.generateDTS = void 0;
|
36
|
+
const ts = __importStar(require("typescript"));
|
37
|
+
function generateDTS(files) {
|
38
|
+
return __awaiter(this, void 0, void 0, function* () {
|
39
|
+
const createdFiles = {};
|
40
|
+
const options = {
|
41
|
+
allowJs: true,
|
42
|
+
declaration: true,
|
43
|
+
emitDeclarationOnly: true,
|
44
|
+
esModuleInterop: true,
|
45
|
+
target: ts.ScriptTarget.ES5,
|
46
|
+
noUnusedParameters: true,
|
47
|
+
noUnusedLocals: true,
|
48
|
+
strictNullChecks: true,
|
49
|
+
jsx: ts.JsxEmit.Preserve,
|
50
|
+
allowSyntheticDefaultImports: true,
|
51
|
+
};
|
52
|
+
const host = ts.createCompilerHost(options);
|
53
|
+
host.writeFile = (fileName, contents) => {
|
54
|
+
createdFiles[fileName] = contents;
|
55
|
+
};
|
56
|
+
const program = ts.createProgram(files, options, host);
|
57
|
+
program.emit();
|
58
|
+
return createdFiles;
|
59
|
+
});
|
60
|
+
}
|
61
|
+
exports.generateDTS = generateDTS;
|
package/package.json
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
{
|
2
|
+
"name": "@ray-js/builder-component",
|
3
|
+
"version": "0.3.0-beta.1c347991",
|
4
|
+
"description": "Ray builder for component",
|
5
|
+
"keywords": [
|
6
|
+
"ray"
|
7
|
+
],
|
8
|
+
"author": "子长 <zichang.nong@tuya.com>",
|
9
|
+
"license": "MIT",
|
10
|
+
"main": "lib/index.js",
|
11
|
+
"files": [
|
12
|
+
"lib"
|
13
|
+
],
|
14
|
+
"publishConfig": {
|
15
|
+
"access": "public",
|
16
|
+
"registry": "https://registry.npmjs.org"
|
17
|
+
},
|
18
|
+
"scripts": {
|
19
|
+
"clean": "rm -rf lib esm dts",
|
20
|
+
"build": "tsc -p ./tsconfig.build.json",
|
21
|
+
"watch": "tsc -p ./tsconfig.build.json --watch"
|
22
|
+
},
|
23
|
+
"dependencies": {
|
24
|
+
"@babel/core": "^7.16.0",
|
25
|
+
"@babel/helper-plugin-utils": "^7.14.5",
|
26
|
+
"@babel/traverse": "^7.16.3",
|
27
|
+
"@babel/types": "^7.16.0",
|
28
|
+
"@ray-js/babel-preset-standard": "^0.3.0-beta.1c347991",
|
29
|
+
"@ray-js/env-loader": "^0.3.0-beta.1c347991",
|
30
|
+
"@ray-js/shared": "^0.3.0-beta.1c347991",
|
31
|
+
"@ray-js/types": "^0.3.0-beta.1c347991",
|
32
|
+
"babel-plugin-import": "^1.13.3",
|
33
|
+
"chokidar": "^3.5.2",
|
34
|
+
"colors": "1.4.0",
|
35
|
+
"fs-extra": "^10.0.0",
|
36
|
+
"globby": "11.x"
|
37
|
+
},
|
38
|
+
"devDependencies": {
|
39
|
+
"@types/fs-extra": "^9.0.12",
|
40
|
+
"typescript": "^4.5.2"
|
41
|
+
},
|
42
|
+
"maintainers": [
|
43
|
+
{
|
44
|
+
"name": "tuyafe",
|
45
|
+
"email": "tuyafe@tuya.com"
|
46
|
+
}
|
47
|
+
],
|
48
|
+
"gitHead": "e0bd013022ddda63380d3c9e20fd8cadb46cd61f",
|
49
|
+
"repository": {}
|
50
|
+
}
|