@pixui-dev/pxw 0.1.16
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.
- package/bin/pxw.js +217 -0
- package/bin/wpbuild.js +10 -0
- package/config/default.conf +21 -0
- package/config/devops.js +358 -0
- package/config/h5es.js +10 -0
- package/config/index.html +181 -0
- package/config/pfbs.js +207 -0
- package/config/testhelp.js +0 -0
- package/config/util.js +140 -0
- package/config/webpack.js +291 -0
- package/lib/assets/border.png +0 -0
- package/lib/assets/check.html +62 -0
- package/lib/assets/pixui.png +0 -0
- package/lib/assets/preact.js +4354 -0
- package/lib/assets/preact.png +0 -0
- package/lib/check/main.less +63 -0
- package/lib/check/main.tsx +41 -0
- package/lib/check/tool.js +3 -0
- package/lib/check/util.tsx +110 -0
- package/lib/grpc-web/dist/ChunkParser.js +117 -0
- package/lib/grpc-web/dist/ChunkParser.js.map +1 -0
- package/lib/grpc-web/dist/Code.js +58 -0
- package/lib/grpc-web/dist/Code.js.map +1 -0
- package/lib/grpc-web/dist/client.js +299 -0
- package/lib/grpc-web/dist/client.js.map +1 -0
- package/lib/grpc-web/dist/debug.js +16 -0
- package/lib/grpc-web/dist/debug.js.map +1 -0
- package/lib/grpc-web/dist/detach.js +7 -0
- package/lib/grpc-web/dist/detach.js.map +1 -0
- package/lib/grpc-web/dist/index.js +29 -0
- package/lib/grpc-web/dist/index.js.map +1 -0
- package/lib/grpc-web/dist/invoke.js +32 -0
- package/lib/grpc-web/dist/invoke.js.map +1 -0
- package/lib/grpc-web/dist/message.js +3 -0
- package/lib/grpc-web/dist/message.js.map +1 -0
- package/lib/grpc-web/dist/metadata.js +5 -0
- package/lib/grpc-web/dist/metadata.js.map +1 -0
- package/lib/grpc-web/dist/service.js +3 -0
- package/lib/grpc-web/dist/service.js.map +1 -0
- package/lib/grpc-web/dist/transports/Transport.js +15 -0
- package/lib/grpc-web/dist/transports/Transport.js.map +1 -0
- package/lib/grpc-web/dist/transports/http/fetch.js +117 -0
- package/lib/grpc-web/dist/transports/http/fetch.js.map +1 -0
- package/lib/grpc-web/dist/transports/http/http.js +15 -0
- package/lib/grpc-web/dist/transports/http/http.js.map +1 -0
- package/lib/grpc-web/dist/transports/http/xhr.js +136 -0
- package/lib/grpc-web/dist/transports/http/xhr.js.map +1 -0
- package/lib/grpc-web/dist/transports/http/xhrUtil.js +36 -0
- package/lib/grpc-web/dist/transports/http/xhrUtil.js.map +1 -0
- package/lib/grpc-web/dist/transports/websocket/websocket.js +95 -0
- package/lib/grpc-web/dist/transports/websocket/websocket.js.map +1 -0
- package/lib/grpc-web/dist/typings/ChunkParser.d.ts +17 -0
- package/lib/grpc-web/dist/typings/Code.d.ts +20 -0
- package/lib/grpc-web/dist/typings/client.d.ts +25 -0
- package/lib/grpc-web/dist/typings/debug.d.ts +1 -0
- package/lib/grpc-web/dist/typings/detach.d.ts +1 -0
- package/lib/grpc-web/dist/typings/index.d.ts +45 -0
- package/lib/grpc-web/dist/typings/invoke.d.ts +20 -0
- package/lib/grpc-web/dist/typings/message.d.ts +8 -0
- package/lib/grpc-web/dist/typings/metadata.d.ts +2 -0
- package/lib/grpc-web/dist/typings/service.d.ts +16 -0
- package/lib/grpc-web/dist/typings/transports/Transport.d.ts +22 -0
- package/lib/grpc-web/dist/typings/transports/http/fetch.d.ts +6 -0
- package/lib/grpc-web/dist/typings/transports/http/http.d.ts +5 -0
- package/lib/grpc-web/dist/typings/transports/http/xhr.d.ts +27 -0
- package/lib/grpc-web/dist/typings/transports/http/xhrUtil.d.ts +3 -0
- package/lib/grpc-web/dist/typings/transports/websocket/websocket.d.ts +2 -0
- package/lib/grpc-web/dist/typings/unary.d.ts +23 -0
- package/lib/grpc-web/dist/typings/util.d.ts +2 -0
- package/lib/grpc-web/dist/unary.js +44 -0
- package/lib/grpc-web/dist/unary.js.map +1 -0
- package/lib/grpc-web/dist/util.js +11 -0
- package/lib/grpc-web/dist/util.js.map +1 -0
- package/lib/grpcTransport/PixHttp2Transport.ts +107 -0
- package/lib/grpcTransport/PixLuaTransport.ts +82 -0
- package/lib/h5es-types/v1.9.2/h5es.d.ts +1698 -0
- package/lib/h5es-types/v3.5.0/h5es.d.ts +1788 -0
- package/lib/pi_component/tinyList/tinyList.js +483 -0
- package/lib/pi_component/tinyList/tinyList.tsx +517 -0
- package/lib/pika-svelte/compiler.js +29829 -0
- package/lib/pika-svelte/easing/index.js +158 -0
- package/lib/pika-svelte/index.js +72 -0
- package/lib/pika-svelte/internal/index.js +1926 -0
- package/lib/pika-svelte/motion/index.js +210 -0
- package/lib/pika-svelte/package.json +145 -0
- package/lib/pika-svelte/register.js +57 -0
- package/lib/pika-svelte/rollup.config.js +126 -0
- package/lib/pika-svelte/store/index.js +123 -0
- package/lib/pika-svelte/transition/index.js +185 -0
- package/lib/preact-router.js +395 -0
- package/lib/preact.js +4355 -0
- package/lib/preact.tq.js +4385 -0
- package/lib/react-window/src/FixedSizeGrid.js +172 -0
- package/lib/react-window/src/FixedSizeList.js +91 -0
- package/lib/react-window/src/VariableSizeGrid.js +329 -0
- package/lib/react-window/src/VariableSizeList.js +231 -0
- package/lib/react-window/src/__tests__/FixedSizeGrid.js +942 -0
- package/lib/react-window/src/__tests__/FixedSizeList.js +749 -0
- package/lib/react-window/src/__tests__/VariableSizeGrid.js +598 -0
- package/lib/react-window/src/__tests__/VariableSizeList.js +345 -0
- package/lib/react-window/src/__tests__/__snapshots__/FixedSizeGrid.js.snap +912 -0
- package/lib/react-window/src/__tests__/__snapshots__/FixedSizeList.js.snap +568 -0
- package/lib/react-window/src/__tests__/__snapshots__/VariableSizeGrid.js.snap +542 -0
- package/lib/react-window/src/__tests__/__snapshots__/VariableSizeList.js.snap +331 -0
- package/lib/react-window/src/__tests__/areEqual.js +28 -0
- package/lib/react-window/src/__tests__/shouldComponentUpdate.js +32 -0
- package/lib/react-window/src/areEqual.js +13 -0
- package/lib/react-window/src/createGridComponent.js +657 -0
- package/lib/react-window/src/createListComponent.js +574 -0
- package/lib/react-window/src/domHelpers.js +69 -0
- package/lib/react-window/src/index.js +9 -0
- package/lib/react-window/src/shallowDiffers.js +17 -0
- package/lib/react-window/src/shouldComponentUpdate.js +11 -0
- package/lib/react-window/src/test.js.flow +382 -0
- package/lib/react-window/src/timer.js +36 -0
- package/lib/svelte-tab/Tab.svelte +31 -0
- package/lib/svelte-tab/TabList.svelte +10 -0
- package/lib/svelte-tab/TabPanel.svelte +13 -0
- package/lib/svelte-tab/Tabs.svelte +68 -0
- package/lib/svelte-tab/tabs.js +4 -0
- package/lib/types/css.d.ts +7476 -0
- package/lib/types/dom.ts +17 -0
- package/lib/types/ext.d.ts +81 -0
- package/lib/types/internal.d.ts +94 -0
- package/lib/types/jsx.d.ts +309 -0
- package/lib/types/preact.d.ts +340 -0
- package/package.json +111 -0
- package/tsconfig.json +30 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
<html>
|
|
2
|
+
<head>
|
|
3
|
+
<title>pxw开发测试控制台</title>
|
|
4
|
+
<style>
|
|
5
|
+
div {
|
|
6
|
+
display: flex;
|
|
7
|
+
flex-direction: column;
|
|
8
|
+
}
|
|
9
|
+
.custom-dd {
|
|
10
|
+
position: relative;
|
|
11
|
+
margin: 40px 0;
|
|
12
|
+
width: 280px;
|
|
13
|
+
}
|
|
14
|
+
.dd-header {
|
|
15
|
+
background: #f8f9fa;
|
|
16
|
+
border: 2px solid #dee2e6;
|
|
17
|
+
padding: 12px 20px;
|
|
18
|
+
cursor: pointer;
|
|
19
|
+
border-radius: 8px;
|
|
20
|
+
}
|
|
21
|
+
.dd-list {
|
|
22
|
+
display: none;
|
|
23
|
+
position: absolute;
|
|
24
|
+
top: 100%;
|
|
25
|
+
left: 0;
|
|
26
|
+
right: 0;
|
|
27
|
+
background: #fff;
|
|
28
|
+
border: 1px solid #ced4da;
|
|
29
|
+
border-radius: 6px;
|
|
30
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
31
|
+
z-index: 1000;
|
|
32
|
+
}
|
|
33
|
+
.dd-item {
|
|
34
|
+
padding: 10px 20px;
|
|
35
|
+
transition: background 0.2s;
|
|
36
|
+
}
|
|
37
|
+
.dd-item:hover {
|
|
38
|
+
background: #e9ecef;
|
|
39
|
+
}
|
|
40
|
+
.show {
|
|
41
|
+
display: block;
|
|
42
|
+
}
|
|
43
|
+
</style>
|
|
44
|
+
<script></script>
|
|
45
|
+
<script>
|
|
46
|
+
let ddVisible = false;
|
|
47
|
+
let toggleDD = () => {
|
|
48
|
+
ddVisible = !ddVisible;
|
|
49
|
+
document.getElementById('ddList').style.display = ddVisible ? 'block' : 'none';
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
function updateConfig(path) {
|
|
53
|
+
var xhr = new XMLHttpRequest();
|
|
54
|
+
xhr.open('POST', 'api/update-tsconfig');
|
|
55
|
+
xhr.setRequestHeader('Content-Type', 'application/json');
|
|
56
|
+
|
|
57
|
+
xhr.onload = function () {
|
|
58
|
+
if (xhr.status === 200) {
|
|
59
|
+
var response = JSON.parse(xhr.responseText);
|
|
60
|
+
console.log('更新成功:', response);
|
|
61
|
+
if(response.success){
|
|
62
|
+
document.getElementById('ddHeader').textContent = '▼ 选择声明文件对应版本: ' + response.newConfig;
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
console.error('请求失败:', xhr.statusText);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
var data = JSON.stringify({ typeRoots: path });
|
|
69
|
+
xhr.send(data);
|
|
70
|
+
toggleDD();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// const handleVersionSelect = async (path) => {
|
|
74
|
+
// try {
|
|
75
|
+
// const isCustom = path === 'custom';
|
|
76
|
+
// const finalPath = isCustom
|
|
77
|
+
// ? prompt('请输入类型声明路径(多个用逗号分隔)')
|
|
78
|
+
// .split(',')
|
|
79
|
+
// .map((p) => p.trim())
|
|
80
|
+
// : path;
|
|
81
|
+
// console.log('finalPath', finalPath);
|
|
82
|
+
// const response = await fetch('/api/update-tsconfig', {
|
|
83
|
+
// method: 'POST',
|
|
84
|
+
// headers: { 'Content-Type': 'application/json' },
|
|
85
|
+
// body: JSON.stringify({ typeRoots: path }),
|
|
86
|
+
// });
|
|
87
|
+
// const data = await response.json();
|
|
88
|
+
// if(data.success){
|
|
89
|
+
// document.getElementById('ddHeader').textContent = '▼ 选择声明文件对应版本: ' + data.newConfig;
|
|
90
|
+
// }
|
|
91
|
+
|
|
92
|
+
// } catch (error) {
|
|
93
|
+
// console.log(`配置更新失败: \${error.message}`);
|
|
94
|
+
// } finally {
|
|
95
|
+
// toggleDD();
|
|
96
|
+
// }
|
|
97
|
+
// };
|
|
98
|
+
|
|
99
|
+
document.addEventListener('click', (e) => {
|
|
100
|
+
if (!e.target.closest('.custom-dd') && ddVisible) toggleDD();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
function xhrGet(){
|
|
104
|
+
return new Promise((resolve, reject) => {
|
|
105
|
+
var xhr = new XMLHttpRequest();
|
|
106
|
+
xhr.open('GET', '/api/get-project-config');
|
|
107
|
+
xhr.onload = () => {
|
|
108
|
+
if (xhr.status === 200) {
|
|
109
|
+
try {
|
|
110
|
+
resolve(JSON.parse(xhr.responseText));
|
|
111
|
+
} catch (e) {
|
|
112
|
+
reject(e);
|
|
113
|
+
}
|
|
114
|
+
} else {
|
|
115
|
+
reject(new Error(`HTTP ${xhr.status}`));
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
xhr.onerror = () => reject(new Error('Network Error'));
|
|
119
|
+
xhr.send();
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async function init() {
|
|
124
|
+
// fetch暂不支持
|
|
125
|
+
// let res = await fetch('/api/get-project-config');
|
|
126
|
+
// let data = await res.json();
|
|
127
|
+
xhrGet().then((data=>{
|
|
128
|
+
{
|
|
129
|
+
console.log("data: ", data);
|
|
130
|
+
let ediv = document.getElementById('pageEntry');
|
|
131
|
+
let temp = ediv.children[0];
|
|
132
|
+
ediv.removeChild(temp);
|
|
133
|
+
data.pages.forEach((item) => {
|
|
134
|
+
let entry = temp.cloneNode(true);
|
|
135
|
+
entry.textContent = item.name;
|
|
136
|
+
entry.setAttribute('href', `/${item.name}`)
|
|
137
|
+
ediv.appendChild(entry);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
{
|
|
141
|
+
let ddlist = document.getElementById('ddList');
|
|
142
|
+
let temp = ddlist.children[0];
|
|
143
|
+
ddlist.removeChild(temp);
|
|
144
|
+
let ddHeader = document.getElementById('ddHeader');
|
|
145
|
+
ddHeader.textContent = '▼ 选择声明文件对应版本: ' + data.defaultH5esType;
|
|
146
|
+
data.h5esVersions.forEach((item) => {
|
|
147
|
+
let el = temp.cloneNode(true);
|
|
148
|
+
el.textContent = item.name;
|
|
149
|
+
el.onclick = () => {
|
|
150
|
+
updateConfig(item.path);
|
|
151
|
+
};
|
|
152
|
+
ddlist.appendChild(el);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}))
|
|
156
|
+
}
|
|
157
|
+
</script>
|
|
158
|
+
</head>
|
|
159
|
+
<body onload="init()">
|
|
160
|
+
<div>
|
|
161
|
+
<div style="font-size: 36">页面入口:</div>
|
|
162
|
+
<div id="pageEntry" style="margin-left: 20px; align-items: start">
|
|
163
|
+
<a style="font-size: 36px">home</a>
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
<div style="height: 20px"></div>
|
|
167
|
+
<div>
|
|
168
|
+
<div style="font-size: 36">测试:</div>
|
|
169
|
+
<div id="entry" style="margin-left: 20px; align-items: start">
|
|
170
|
+
<a style="font-size: 36px" href="/pxtest/auto">pxtest</a>
|
|
171
|
+
<a style="font-size: 36px" href="/pxtest/devops.html">devops</a>
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
<div class="custom-dd">
|
|
175
|
+
<div class="dd-header" onclick="toggleDD()" id="ddHeader">▼ 选择声明文件对应版本</div>
|
|
176
|
+
<div class="dd-list" id="ddList">
|
|
177
|
+
<div class="dd-item">v1.9.2</div>
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
</body>
|
|
181
|
+
</html>
|
package/config/pfbs.js
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
let fs = require('fs');
|
|
2
|
+
let path = require('path');
|
|
3
|
+
let cp = require('child_process');
|
|
4
|
+
const { isHeritageClause } = require('typescript');
|
|
5
|
+
|
|
6
|
+
function isBufferHeaderMatch(buffer, pattern, n = pattern.length) {
|
|
7
|
+
// 确保输入是 Buffer 类型
|
|
8
|
+
if (!Buffer.isBuffer(buffer) || !Buffer.isBuffer(pattern)) {
|
|
9
|
+
throw new TypeError('Both buffer and pattern must be of type Buffer');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// 如果 n 超过 buffer 或 pattern 的长度,返回 false
|
|
13
|
+
if (n > buffer.length || n > pattern.length) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// 比较前 n 个字节
|
|
18
|
+
for (let i = 0; i < n; i++) {
|
|
19
|
+
if (buffer[i] !== pattern[i]) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let suffix = '';
|
|
28
|
+
if (process.platform == 'win32') suffix = '.exe';
|
|
29
|
+
if (process.platform == 'linux') suffix = '-ubuntu';
|
|
30
|
+
let pfbsLatest = path.resolve(process.cwd(), `.cache/pfbs${suffix}`);
|
|
31
|
+
let pfbsConvert = async (ver, isJS, input, fn) => {
|
|
32
|
+
let pfbs = pfbsLatest;
|
|
33
|
+
if (ver[0] == '0') pfbs = pfbsLatest.replace('pfbs', 'pfbs-0.4');
|
|
34
|
+
console.log('use pfbs', pfbs);
|
|
35
|
+
if (!fs.existsSync(pfbs)) {
|
|
36
|
+
let url = process.env.PFBS_DOWNLOAD_SITE || 'http://9.134.150.252:8090/dev/tools/pfbs/';
|
|
37
|
+
url += path.basename(pfbs);
|
|
38
|
+
try {
|
|
39
|
+
let res = await fetch(url);
|
|
40
|
+
let buffer = await res.arrayBuffer();
|
|
41
|
+
fs.writeFileSync(pfbs, new Uint8Array(buffer));
|
|
42
|
+
fs.chmodSync(pfbs, '755');
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
console.log(e);
|
|
46
|
+
fn(input);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
let buffers = [];
|
|
51
|
+
let addBuffer = (chunk, encoding) => {
|
|
52
|
+
if (chunk === undefined) return;
|
|
53
|
+
if (typeof chunk === 'string') {
|
|
54
|
+
chunk = Buffer.from(chunk, encoding);
|
|
55
|
+
}
|
|
56
|
+
buffers.push(chunk);
|
|
57
|
+
};
|
|
58
|
+
let opts = isJS ? ['--js'] : [];
|
|
59
|
+
let child = cp.spawn(pfbs, ['--src', 'stdin', ...opts], {
|
|
60
|
+
windowsHide: true,
|
|
61
|
+
});
|
|
62
|
+
child.stdout.on('data', (data) => {
|
|
63
|
+
// console.log('get data from fbs', data.byteLength);
|
|
64
|
+
addBuffer(data);
|
|
65
|
+
});
|
|
66
|
+
child.stdout.on('close', () => {
|
|
67
|
+
let output = Buffer.concat(buffers);
|
|
68
|
+
// console.log('get data from fbs finish!!', output.length);
|
|
69
|
+
fn(output);
|
|
70
|
+
});
|
|
71
|
+
child.stderr.on('data', (data) => {
|
|
72
|
+
console.log('get err from pfbs', data.toString());
|
|
73
|
+
});
|
|
74
|
+
child.stdin.write(input);
|
|
75
|
+
child.stdin.end();
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
module.exports.getMiddleware = () => {
|
|
79
|
+
let log = () => {};
|
|
80
|
+
log = console.log;
|
|
81
|
+
//拦截输出,当agent为PixUI且输出类型为html时,转换为fbs二进制数据再返回
|
|
82
|
+
return (req, res, next) => {
|
|
83
|
+
//去掉缓存标记,因为很可能源文件没变,但转换后的表示变了
|
|
84
|
+
delete req.headers['if-none-match'];
|
|
85
|
+
let ua = req.get('User-Agent');
|
|
86
|
+
let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
|
|
87
|
+
let disablePFBS = req.headers['x-disable-http-pfbs'] == 'true';
|
|
88
|
+
log('req', req.url, ua, ip, `disablePFBS:${disablePFBS}`);
|
|
89
|
+
// log( JSON.stringify(req.headers));
|
|
90
|
+
|
|
91
|
+
let _write = res.write;
|
|
92
|
+
let _end = res.end;
|
|
93
|
+
let _send = res.send;
|
|
94
|
+
|
|
95
|
+
let buffers = [];
|
|
96
|
+
let addBuffer = (chunk, encoding) => {
|
|
97
|
+
if (chunk === undefined) return;
|
|
98
|
+
if (typeof chunk === 'string') {
|
|
99
|
+
chunk = Buffer.from(chunk, encoding);
|
|
100
|
+
}
|
|
101
|
+
buffers.push(chunk);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
let guessMime = (url) => {
|
|
105
|
+
if (url.endsWith('.js')) return 'text/javascript';
|
|
106
|
+
if (url.endsWith('.html')) return 'text/html';
|
|
107
|
+
return 'text/plain';
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
let mime = '';
|
|
111
|
+
let _setHeader = res.setHeader;
|
|
112
|
+
res.setHeader = function (k, v) {
|
|
113
|
+
console.log('hook set', k, v);
|
|
114
|
+
if (k == 'Content-Length') return; //不要显式设置长度,pfbs转换后可能会变小,导致客户端空等
|
|
115
|
+
if (k == 'Content-Type') mime = v;
|
|
116
|
+
_setHeader.call(res, k, v);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
//处理直接裸写的情况,一般见于发送静态文件
|
|
120
|
+
res.writeLog = 0;
|
|
121
|
+
res.write = function (chunk, encoding) {
|
|
122
|
+
let type = res.get('Content-Type');
|
|
123
|
+
if (++res.writeLog <= 10) {
|
|
124
|
+
log('hook write...', type, chunk.length);
|
|
125
|
+
if (res.writeLog == 10) {
|
|
126
|
+
log('hook write is too many, ignore next log');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
addBuffer(chunk, encoding);
|
|
130
|
+
};
|
|
131
|
+
const pattern1 = Buffer.from([0x50, 0x49, 0x58, 0x32, 0x43, 0x42, 0x4a, 0x51]);
|
|
132
|
+
const pattern2 = Buffer.from([0x10, 0, 0, 0, 0x50, 0x49, 0x58, 0x30]);
|
|
133
|
+
res.end = function (chunk, encoding) {
|
|
134
|
+
res.write = _write;
|
|
135
|
+
res.end = _end;
|
|
136
|
+
let type = res.get('Content-Type') || mime;
|
|
137
|
+
if (chunk) addBuffer(chunk, encoding);
|
|
138
|
+
let data = Buffer.concat(buffers);
|
|
139
|
+
|
|
140
|
+
let isAlreadyPfbs = isBufferHeaderMatch(data, pattern1) || isBufferHeaderMatch(data, pattern2);
|
|
141
|
+
|
|
142
|
+
log('hook end...', type, data.length, req.url, 'isAlreadyPfbs', isAlreadyPfbs);
|
|
143
|
+
|
|
144
|
+
let isPixUI = /PixUI/.test(ua);
|
|
145
|
+
let isHTML = type.indexOf('text/html') >= 0;
|
|
146
|
+
let isJS = type.indexOf('javascript') >= 0;
|
|
147
|
+
let isCSS = type.indexOf('text/css') >= 0;
|
|
148
|
+
if (isHTML && !isAlreadyPfbs) {
|
|
149
|
+
let c1 = data.toString('utf-8');
|
|
150
|
+
let c2 = c1.replace(
|
|
151
|
+
'</body>',
|
|
152
|
+
`<script>
|
|
153
|
+
(function() {
|
|
154
|
+
var ws = new WebSocket('ws://' + window.location.host+ '/notify?reloadMode=RELOAD_ON_SAVE&referrer=' + encodeURIComponent(window.location.pathname))
|
|
155
|
+
ws.onmessage = function (msg) {
|
|
156
|
+
if (msg.data === 'reload') {
|
|
157
|
+
window.location.reload();
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
})();
|
|
161
|
+
</script></body>`,
|
|
162
|
+
);
|
|
163
|
+
console.log('insert hotreload to html', data.length, c1.length, c2.length);
|
|
164
|
+
// console.log(c1);
|
|
165
|
+
data = c2;
|
|
166
|
+
}
|
|
167
|
+
if (isPixUI && !isAlreadyPfbs && !disablePFBS && (isHTML || isJS)) {
|
|
168
|
+
let ver = /(\d)\.(\d)\.(\d+)/.exec(ua); // 0.2.*以上
|
|
169
|
+
pfbsConvert(ver.splice(1), isJS, data, (out) => {
|
|
170
|
+
console.log('pfbsconvert>>', req.url, data.length, out.length);
|
|
171
|
+
res.write = _write;
|
|
172
|
+
res.end = _end;
|
|
173
|
+
_end.call(this, out);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
console.log('directly call end...', data.length, type, _end);
|
|
178
|
+
_end.call(this, data);
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
// 处理通过send发送的情况,如webpack合成的html
|
|
183
|
+
res.send = function (c) {
|
|
184
|
+
let isPixUI = /PixUI/.test(ua);
|
|
185
|
+
let type = res.get('Content-Type') || 'text/plain';
|
|
186
|
+
let isHTML = type.indexOf('text/html') >= 0;
|
|
187
|
+
let isJS = type.indexOf('javascript') >= 0;
|
|
188
|
+
let isCSS = type.indexOf('text/css') >= 0;
|
|
189
|
+
if (isPixUI && !disablePFBS && (isHTML || isJS)) {
|
|
190
|
+
log('hook send...', c.length, type);
|
|
191
|
+
let ver = /(\d)\.(\d)\.(\d+)/.exec(ua); // 0.2.*以上
|
|
192
|
+
pfbsConvert(ver.splice(1), isJS, c, (out) => {
|
|
193
|
+
res.send = _send;
|
|
194
|
+
res.end = _end;
|
|
195
|
+
res.setHeader = _setHeader;
|
|
196
|
+
res.setHeader('Content-Type', 'application/octet-stream');
|
|
197
|
+
_send.call(res, out);
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
console.log('directly call send...', c.length, type, _send);
|
|
202
|
+
_send.call(this, c);
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
next();
|
|
206
|
+
};
|
|
207
|
+
};
|
|
File without changes
|
package/config/util.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
let fs = require('fs');
|
|
2
|
+
let cp = require('child_process');
|
|
3
|
+
let path = require('path');
|
|
4
|
+
let pfbs = require('./pfbs');
|
|
5
|
+
|
|
6
|
+
module.exports.getLocalIP = function () {
|
|
7
|
+
let os = require('os');
|
|
8
|
+
let ifaces = os.networkInterfaces();
|
|
9
|
+
|
|
10
|
+
let ipList = [];
|
|
11
|
+
Object.keys(ifaces).forEach(function (ifname) {
|
|
12
|
+
let alias = 0;
|
|
13
|
+
|
|
14
|
+
ifaces[ifname].forEach(function (iface) {
|
|
15
|
+
// console.log(iface);
|
|
16
|
+
if ('IPv4' !== iface.family || iface.internal !== false) {
|
|
17
|
+
// skip over internal (i.e. 127.0.0.1) and non-ipv4 addresses
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (iface.address.indexOf('255') >= 0) return;
|
|
21
|
+
if (iface.address.indexOf('169.254') >= 0) return;
|
|
22
|
+
ipList.push(iface.address);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
console.log('iplist', ipList);
|
|
26
|
+
return ipList;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
module.exports.readRegKey = function (path, key) {
|
|
30
|
+
const powerShellScript = `
|
|
31
|
+
$ErrorActionPreference = 'Stop'
|
|
32
|
+
$keyPath = "HKLM:\\${path}"
|
|
33
|
+
$key = "${key}"
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
$value = Get-ItemProperty -Path $keyPath -Name $key
|
|
37
|
+
if ($value -ne $null) {
|
|
38
|
+
Write-Output $value.$key
|
|
39
|
+
} else {
|
|
40
|
+
Write-Error "Registry value not found."
|
|
41
|
+
}
|
|
42
|
+
} catch {
|
|
43
|
+
Write-Error "Error accessing the registry: $_"
|
|
44
|
+
}
|
|
45
|
+
`;
|
|
46
|
+
try {
|
|
47
|
+
let out = cp.execSync(powerShellScript, {
|
|
48
|
+
shell: 'powershell.exe',
|
|
49
|
+
windowsHide: true,
|
|
50
|
+
});
|
|
51
|
+
return out.toString();
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.error('Error executing PowerShell script:', error.message);
|
|
55
|
+
return '';
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
module.exports.isInParalles = function () {
|
|
60
|
+
if (process.platform != 'win32') return false;
|
|
61
|
+
let v = module.exports.readRegKey('SYSTEM\\CurrentControlSet\\Control\\SystemInformation', 'SystemProductName');
|
|
62
|
+
return /Parallels/.test(v);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
let projectConfig;
|
|
66
|
+
module.exports.loadProjectConfig = function () {
|
|
67
|
+
if (projectConfig) return projectConfig;
|
|
68
|
+
let pienv = {};
|
|
69
|
+
try {
|
|
70
|
+
let cwd = process.cwd();
|
|
71
|
+
let ep = cwd + '/entry';
|
|
72
|
+
console.log('read entry.js', ep);
|
|
73
|
+
projectConfig = require(ep);
|
|
74
|
+
// projectConfig.pages.forEach((p) => {
|
|
75
|
+
// p.entry = `${cwd}/${p.entry}`;
|
|
76
|
+
// p.template = `${cwd}/${p.template}`;
|
|
77
|
+
// appDef.push(p);
|
|
78
|
+
// });
|
|
79
|
+
|
|
80
|
+
let env = projectConfig.env;
|
|
81
|
+
|
|
82
|
+
Object.entries(env || {}).forEach(([k, v]) => {
|
|
83
|
+
pienv['process.env.' + k] = JSON.stringify(v);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
console.warn('read entry.js failed');
|
|
88
|
+
if (!/Cannot find module/.test(e.message)) {
|
|
89
|
+
console.error(e);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
}
|
|
94
|
+
return projectConfig;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
module.exports.getOrSetH5esType = function (newType) {
|
|
98
|
+
const UpdateH5esType = (isDefault) =>{
|
|
99
|
+
const tsconfigPath = path.resolve(process.cwd(), 'tsconfig.json');
|
|
100
|
+
const fileContent = fs.readFileSync(tsconfigPath, 'utf8');
|
|
101
|
+
const tsconfig = JSON.parse(fileContent);
|
|
102
|
+
tsconfig.compilerOptions = tsconfig.compilerOptions || {};
|
|
103
|
+
const existingTypeRoots = tsconfig.compilerOptions.typeRoots || [];
|
|
104
|
+
console.log(existingTypeRoots);
|
|
105
|
+
const updatedTypeRoots = existingTypeRoots.map((root) => {
|
|
106
|
+
if (root.includes('h5es-types')) {
|
|
107
|
+
let type = isDefault ? root : newType;
|
|
108
|
+
let slashIndex = type.lastIndexOf('/');
|
|
109
|
+
if (slashIndex !== -1) {
|
|
110
|
+
h5esType = type.substring(slashIndex + 1);
|
|
111
|
+
}
|
|
112
|
+
return type;
|
|
113
|
+
}
|
|
114
|
+
return root;
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
if(!isDefault && !updatedTypeRoots.includes(newType)){
|
|
118
|
+
updatedTypeRoots.push(newType);
|
|
119
|
+
let slashIndex = newType.lastIndexOf('/');
|
|
120
|
+
if (slashIndex !== -1) {
|
|
121
|
+
h5esType = newType.substring(slashIndex + 1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if(isDefault && !updatedTypeRoots.some(root=>root.includes('h5es-types'))){
|
|
125
|
+
updatedTypeRoots.push('node_modules/@wellbye/pxw/lib/h5es-types/v1.9.2')
|
|
126
|
+
h5esType = 'v1.9.2'
|
|
127
|
+
}
|
|
128
|
+
tsconfig.compilerOptions.typeRoots = updatedTypeRoots;
|
|
129
|
+
fs.writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 2));
|
|
130
|
+
return h5esType;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
let h5esType;
|
|
134
|
+
if(newType == undefined) {
|
|
135
|
+
h5esType = UpdateH5esType(true);
|
|
136
|
+
} else {
|
|
137
|
+
h5esType = UpdateH5esType(false);
|
|
138
|
+
}
|
|
139
|
+
return h5esType;
|
|
140
|
+
}
|