uudev 1.1.5 → 1.1.7
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/apptemplate/office/package-lock.json +982 -3694
- package/apptemplate/office/package.json +7 -8
- package/apptemplate/office/public/menifest.json +1 -1
- package/apptemplate/office/public/readme.html +1 -1
- package/apptemplate/office/src_excel/demo/demo.vue +84 -14
- package/apptemplate/office/src_ppt/demo/demo.vue +10 -3
- package/apptemplate/office/src_word/demo/demo.vue +10 -3
- package/dtstype/base.d.ts +86 -4
- package/dtstype/excel.d.ts +3 -2
- package/dtstype/ppt.d.ts +1 -1
- package/dtstype/word.d.ts +1 -1
- package/main.js +4 -4
- package/package.json +4 -3
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
"format": "prettier --write --experimental-cli src/"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"vue": "3.5.
|
|
23
|
-
"vue-router": "5.0.
|
|
22
|
+
"vue": "3.5.34",
|
|
23
|
+
"vue-router": "5.0.7"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@tsconfig/node24": "^24.0.4",
|
|
27
27
|
"@types/node": "^24.12.0",
|
|
28
|
-
"@vitejs/plugin-vue": "^6.0.
|
|
28
|
+
"@vitejs/plugin-vue": "^6.0.7",
|
|
29
29
|
"@vue/eslint-config-typescript": "^14.7.0",
|
|
30
30
|
"@vue/tsconfig": "^0.9.0",
|
|
31
31
|
"eslint": "^10.0.3",
|
|
@@ -36,13 +36,12 @@
|
|
|
36
36
|
"npm-run-all2": "^8.0.4",
|
|
37
37
|
"oxlint": "~1.51.0",
|
|
38
38
|
"prettier": "3.8.1",
|
|
39
|
-
"typescript": "
|
|
39
|
+
"typescript": "^6.0.3",
|
|
40
40
|
"uudev": "latest",
|
|
41
|
-
"vite": "^
|
|
42
|
-
"
|
|
43
|
-
"vue-tsc": "^3.2.5"
|
|
41
|
+
"vite": "^8.0.13",
|
|
42
|
+
"vue-tsc": "^3.2.9"
|
|
44
43
|
},
|
|
45
44
|
"engines": {
|
|
46
|
-
"node": ">=24.
|
|
45
|
+
"node": ">=24.15.0"
|
|
47
46
|
}
|
|
48
47
|
}
|
|
@@ -1,44 +1,114 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
3
|
<template>
|
|
4
|
-
<h1>欢迎使用uudev
|
|
4
|
+
<h1>欢迎使用uudev开发工具</h1>
|
|
5
5
|
<p>
|
|
6
|
-
uudev是一个基于
|
|
6
|
+
uudev是一个基于Office的web化开发工具集,提供了从开发、调试到部署的一站式解决方案,帮助开发者更高效地构建Office的web化插件应用。
|
|
7
7
|
</p>
|
|
8
|
-
<
|
|
8
|
+
<p style="font-weight: bold;">
|
|
9
|
+
这是一个html页面,点击本页面后,按<span style="border: 2px solid;">F11</span>可以打开调试工具。
|
|
10
|
+
</p>
|
|
11
|
+
<h2>Excel示例</h2>
|
|
12
|
+
<div>
|
|
13
|
+
<a class="demoHref" @click="putCellValue">给单元格赋值</a>(代码:Application.ActiveCell.Value = 'Hello, uudev!')
|
|
14
|
+
</div>
|
|
15
|
+
<div>
|
|
16
|
+
<a class="demoHref" @click="getDocName">取文档名</a>
|
|
17
|
+
<a class="demoHref" @click="clearDocName">清除</a>
|
|
18
|
+
<span style="color: red;">{{ sheetName }}</span>(代码:Application.ActiveWorkbook.Name)
|
|
19
|
+
</div>
|
|
20
|
+
<div>
|
|
21
|
+
<a class="demoHref" @click="newWorksheet">新建工作表</a>
|
|
22
|
+
</div>
|
|
9
23
|
<div>
|
|
10
|
-
|
|
24
|
+
<a class="demoHref" @click="deleteWorksheet">删除当前工作表</a><span style="color: red;">{{ deleteWorkSheetErrInfo }}</span>
|
|
11
25
|
</div>
|
|
26
|
+
<h2>事件通知示例</h2>
|
|
12
27
|
<div>
|
|
13
|
-
<
|
|
14
|
-
|
|
15
|
-
|
|
28
|
+
<label class="demoHref">
|
|
29
|
+
<input type="checkbox" v-model="isSheetSelectionChangeRegister" @change="regSelectionChange" /> 注册工作表选择改变事件
|
|
30
|
+
</label>
|
|
31
|
+
<span style="color: red;">{{ SheetSelectionChangeInfo }}</span>
|
|
32
|
+
</div>
|
|
33
|
+
<div>
|
|
34
|
+
<label class="demoHref">
|
|
35
|
+
<input type="checkbox" v-model="isNewSheetEventRegister" @change="regNewSheetEvent" /> 注册新建工作表事件
|
|
36
|
+
</label>
|
|
37
|
+
<span style="color: red;">{{ NewSheetEventInfo }}</span>
|
|
38
|
+
</div>
|
|
39
|
+
<div>
|
|
40
|
+
<span>更多其他事件类型,请查看帮助文档</span>
|
|
16
41
|
</div>
|
|
17
42
|
</template>
|
|
18
43
|
|
|
19
44
|
<script setup lang="ts">
|
|
20
45
|
import { ref } from 'vue';
|
|
46
|
+
|
|
47
|
+
var sheetName = ref('');
|
|
48
|
+
var deleteWorkSheetErrInfo = ref('');
|
|
49
|
+
var isSheetSelectionChangeRegister = ref(false);
|
|
50
|
+
var SheetSelectionChangeInfo = ref('');
|
|
51
|
+
|
|
52
|
+
var isNewSheetEventRegister = ref(false);
|
|
53
|
+
var NewSheetEventInfo = ref('');
|
|
54
|
+
|
|
21
55
|
const putCellValue = () => {
|
|
22
56
|
const activeCell = Application.ActiveCell;
|
|
23
57
|
if (activeCell) {
|
|
24
|
-
activeCell.
|
|
58
|
+
activeCell.Value = 'Hello, uudev!';
|
|
25
59
|
}
|
|
26
60
|
}
|
|
27
61
|
|
|
28
|
-
|
|
29
|
-
const getDocInfo=() => {
|
|
62
|
+
const getDocName=() => {
|
|
30
63
|
const doc = Application.ActiveWorkbook
|
|
31
64
|
if (doc) {
|
|
32
|
-
|
|
65
|
+
sheetName.value = `文档名称: ${doc.Name}`;
|
|
33
66
|
const info = `文档名称: ${doc.Name}\n文档路径: ${doc.FullName}`;
|
|
34
67
|
console.log(info);
|
|
35
68
|
} else {
|
|
36
|
-
|
|
69
|
+
sheetName.value = '';
|
|
37
70
|
alert('没有打开的文档');
|
|
38
71
|
}
|
|
39
72
|
}
|
|
40
|
-
const
|
|
41
|
-
|
|
73
|
+
const clearDocName = () => {
|
|
74
|
+
sheetName.value = '';
|
|
75
|
+
}
|
|
76
|
+
const newWorksheet = () => {
|
|
77
|
+
Application.ActiveWorkbook.Worksheets.Add();
|
|
78
|
+
deleteWorkSheetErrInfo.value = '';
|
|
79
|
+
}
|
|
80
|
+
const deleteWorksheet = () => {
|
|
81
|
+
if (Application.ActiveWorkbook.Worksheets.Count > 1) {
|
|
82
|
+
Application.ActiveWorkbook.ActiveSheet.Delete();
|
|
83
|
+
deleteWorkSheetErrInfo.value = '';
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
else{
|
|
87
|
+
deleteWorkSheetErrInfo.value = '最后一个工作表不能删除';
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const regSelectionChange = () => {
|
|
92
|
+
if (isSheetSelectionChangeRegister.value) {
|
|
93
|
+
Application.MountEvent(XlEventType.exlSheetSelectionChange, (sheet: Worksheet, target: Range) => {
|
|
94
|
+
SheetSelectionChangeInfo.value = `选中了工作表: ${sheet.Name}!${target.Address(false, false, xlA1)}`; //也可以用xlR1C1样式
|
|
95
|
+
});
|
|
96
|
+
} else {
|
|
97
|
+
Application.UnMountEvent(exlSheetSelectionChange); //UnMountEvent不带第2个参数onNewSheet,则exlSheetSelectionChange事件的所有回调都会被反注册
|
|
98
|
+
SheetSelectionChangeInfo.value = '';
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const regNewSheetEvent = () => {
|
|
103
|
+
const onNewSheet = (workbook: Workbook, sheet: any) => {
|
|
104
|
+
NewSheetEventInfo.value = `新建了工作表:${sheet.Name}`;
|
|
105
|
+
};
|
|
106
|
+
if (isNewSheetEventRegister.value) {
|
|
107
|
+
Application.MountEvent(exlWorkbookNewSheet, onNewSheet);
|
|
108
|
+
} else {
|
|
109
|
+
Application.UnMountEvent(exlWorkbookNewSheet, onNewSheet); //UnMountEvent带有第2个参数onNewSheet,则仅反注册onNewSheet
|
|
110
|
+
NewSheetEventInfo.value = '';
|
|
111
|
+
}
|
|
42
112
|
}
|
|
43
113
|
</script>
|
|
44
114
|
<style scoped>
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
3
|
<template>
|
|
4
|
-
<h1>欢迎使用uudev
|
|
4
|
+
<h1>欢迎使用uudev开发工具</h1>
|
|
5
5
|
<p>
|
|
6
|
-
uudev是一个基于
|
|
6
|
+
uudev是一个基于Office的web化开发工具集,提供了从开发、调试到部署的一站式解决方案,帮助开发者更高效地构建Office的web化插件应用。
|
|
7
7
|
</p>
|
|
8
|
-
<
|
|
8
|
+
<p style="font-weight: bold;">
|
|
9
|
+
这是一个html页面,点击本页面后,按<span style="border: 2px solid;">F11</span>可以打开调试工具。
|
|
10
|
+
</p>
|
|
11
|
+
<h3>Ppt示例</h3>
|
|
9
12
|
<div>
|
|
10
13
|
<a class="demoHref" @click="putShapeValue">给形状赋值</a>(代码:Application.ActivePresentation.Slides.Item(1).Shapes.Item(1).TextFrame.TextRange.Text = 'Hello, uudev!')
|
|
11
14
|
</div>
|
|
@@ -14,6 +17,10 @@
|
|
|
14
17
|
<a class="demoHref" @click="clearDocInfo">清除文档信息</a>
|
|
15
18
|
<span>{{ docName }}</span>(代码:Application.ActivePresentation.Name)
|
|
16
19
|
</div>
|
|
20
|
+
<h2>事件通知示例</h2>
|
|
21
|
+
<div>
|
|
22
|
+
<span>事件相关的代码示例,请参考Excel的事件示例</span>
|
|
23
|
+
</div>
|
|
17
24
|
</template>
|
|
18
25
|
|
|
19
26
|
<script setup lang="ts">
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
3
|
<template>
|
|
4
|
-
<h1>欢迎使用uudev
|
|
4
|
+
<h1>欢迎使用uudev开发工具</h1>
|
|
5
5
|
<p>
|
|
6
|
-
uudev是一个基于
|
|
6
|
+
uudev是一个基于Office的web化开发工具集,提供了从开发、调试到部署的一站式解决方案,帮助开发者更高效地构建Office的web化插件应用。
|
|
7
7
|
</p>
|
|
8
|
-
<
|
|
8
|
+
<p style="font-weight: bold;">
|
|
9
|
+
这是一个html页面,点击本页面后,按<span style="border: 2px solid;">F11</span>可以打开调试工具。
|
|
10
|
+
</p>
|
|
11
|
+
<h3>Word示例</h3>
|
|
9
12
|
<div>
|
|
10
13
|
<a class="demoHref" @click="putRangeValue">给文档开头赋值</a>(代码:Application.ActiveDocument.Range(0).Text = "Hello, uudev!')
|
|
11
14
|
</div>
|
|
@@ -14,6 +17,10 @@
|
|
|
14
17
|
<a class="demoHref" @click="clearDocInfo">清除文档信息</a>
|
|
15
18
|
<span>{{ docName }}</span>(代码:Application.ActiveDocument.Name)
|
|
16
19
|
</div>
|
|
20
|
+
<h2>事件通知示例</h2>
|
|
21
|
+
<div>
|
|
22
|
+
<span>事件相关的代码示例,请参考Excel的事件示例</span>
|
|
23
|
+
</div>
|
|
17
24
|
</template>
|
|
18
25
|
|
|
19
26
|
<script setup lang="ts">
|
package/dtstype/base.d.ts
CHANGED
|
@@ -1,5 +1,87 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
declare enum XlEventType {
|
|
2
|
+
exlNewWorkbook = 0,
|
|
3
|
+
exlSheetSelectionChange = 1,
|
|
4
|
+
exlSheetActivate = 2,
|
|
5
|
+
exlSheetChange = 3,
|
|
6
|
+
exlWorkbookOpen = 4,
|
|
7
|
+
exlWorkbookNewSheet = 5,
|
|
8
|
+
exlWindowActivate = 6,
|
|
9
|
+
exlWindowDeActivate = 7,
|
|
10
|
+
exlWorkbookAfterSave = 8,
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
declare const exlNewWorkbook: XlEventType.exlNewWorkbook;
|
|
14
|
+
declare const exlSheetSelectionChange: XlEventType.exlSheetSelectionChange;
|
|
15
|
+
declare const exlSheetActivate: XlEventType.exlSheetActivate;
|
|
16
|
+
declare const exlSheetChange: XlEventType.exlSheetChange;
|
|
17
|
+
declare const exlWorkbookOpen: XlEventType.exlWorkbookOpen;
|
|
18
|
+
declare const exlWorkbookNewSheet: XlEventType.exlWorkbookNewSheet;
|
|
19
|
+
declare const exlWindowActivate: XlEventType.exlWindowActivate;
|
|
20
|
+
declare const exlWindowDeActivate: XlEventType.exlWindowDeActivate;
|
|
21
|
+
declare const exlWorkbookAfterSave: XlEventType.exlWorkbookAfterSave;
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
declare enum WdEventType {
|
|
25
|
+
ewdDocumentOpen = 0,
|
|
26
|
+
ewdNewDocument = 1,
|
|
27
|
+
ewdWindowActivate = 2,
|
|
28
|
+
ewdWindowDeactivate = 3,
|
|
29
|
+
ewdWindowSelectionChange = 4,
|
|
30
|
+
ewdMailMergeAfterMerge = 5,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
declare const ewdDocumentOpen: WdEventType.ewdDocumentOpen;
|
|
34
|
+
declare const ewdNewDocument: WdEventType.ewdNewDocument;
|
|
35
|
+
declare const ewdWindowActivate: WdEventType.ewdWindowActivate;
|
|
36
|
+
declare const ewdWindowDeactivate: WdEventType.ewdWindowDeactivate;
|
|
37
|
+
declare const ewdWindowSelectionChange: WdEventType.ewdWindowSelectionChange;
|
|
38
|
+
declare const ewdMailMergeAfterMerge: WdEventType.ewdMailMergeAfterMerge;
|
|
39
|
+
|
|
40
|
+
declare enum PpEventType {
|
|
41
|
+
eppWindowSelectionChange = 0,
|
|
42
|
+
eppPresentationSave = 1,
|
|
43
|
+
eppPresentationOpen = 2,
|
|
44
|
+
eppNewPresentation = 3,
|
|
45
|
+
eppPresentationNewSlide = 4,
|
|
46
|
+
eppWindowActivate = 5,
|
|
47
|
+
eppWindowDeactivate = 6,
|
|
48
|
+
eppSlideSelectionChanged = 7,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
declare const eppWindowSelectionChange: PpEventType.eppWindowSelectionChange;
|
|
52
|
+
declare const eppPresentationSave: PpEventType.eppPresentationSave;
|
|
53
|
+
declare const eppPresentationOpen: PpEventType.eppPresentationOpen;
|
|
54
|
+
declare const eppNewPresentation: PpEventType.eppNewPresentation;
|
|
55
|
+
declare const eppPresentationNewSlide: PpEventType.eppPresentationNewSlide;
|
|
56
|
+
declare const eppWindowActivate: PpEventType.eppWindowActivate;
|
|
57
|
+
declare const eppWindowDeactivate: PpEventType.eppWindowDeactivate;
|
|
58
|
+
declare const eppSlideSelectionChanged: PpEventType.eppSlideSelectionChanged;
|
|
59
|
+
|
|
60
|
+
declare namespace base {
|
|
61
|
+
interface shell {
|
|
3
62
|
openExternal: (url: string) => void;
|
|
4
|
-
|
|
5
|
-
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
interface fs {
|
|
66
|
+
readFileAsync: (path: string) => Promise<ArrayBuffer>;
|
|
67
|
+
writeFileAsync: (path: string, data: ArrayBuffer) => Promise<any>;
|
|
68
|
+
copyFileAsync: (srcPath: string, dstPath: string) => Promise<boolean>;
|
|
69
|
+
rmFileAsync: (path: string) => Promise<boolean>;
|
|
70
|
+
renameFileAsync: (oldPath: string, newPath: string) => Promise<boolean>;
|
|
71
|
+
appendFileAsync: (path: string, data: ArrayBuffer) => Promise<boolean>;
|
|
72
|
+
statFileAsync: (path: string) => Promise<Record<string, any>>;
|
|
73
|
+
mkDirAsync: (path: string) => Promise<boolean>;
|
|
74
|
+
copyDirAsync: (srcPath: string, dstPath: string) => Promise<boolean>;
|
|
75
|
+
rmDirAsync: (path: string) => Promise<boolean>;
|
|
76
|
+
renameDirAsync: (oldPath: string, newPath: string) => Promise<boolean>;
|
|
77
|
+
readDirAsync: (path: string) => Promise<any>;
|
|
78
|
+
statDirAsync: (path: string) => Promise<Record<string, any>>;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
interface Application {
|
|
82
|
+
readonly shell: shell;
|
|
83
|
+
readonly fs: fs;
|
|
84
|
+
MountEvent(type: XlEventType | WdEventType | PpEventType, handler: Function): void;
|
|
85
|
+
UnMountEvent(type: XlEventType | WdEventType | PpEventType, handler?: Function): void;
|
|
86
|
+
}
|
|
87
|
+
}
|
package/dtstype/excel.d.ts
CHANGED
|
@@ -1313,7 +1313,8 @@ interface Range{
|
|
|
1313
1313
|
UseStandardHeight: any;
|
|
1314
1314
|
UseStandardWidth: any;
|
|
1315
1315
|
readonly Validation: Validation;
|
|
1316
|
-
Value
|
|
1316
|
+
Value: any;
|
|
1317
|
+
_Value(RangeValueDataType?: any, RHS?: any): void;
|
|
1317
1318
|
Value2: any;
|
|
1318
1319
|
VerticalAlignment: any;
|
|
1319
1320
|
readonly Width: any;
|
|
@@ -8355,4 +8356,4 @@ interface Dummy{
|
|
|
8355
8356
|
interface CanvasShapes{
|
|
8356
8357
|
}
|
|
8357
8358
|
|
|
8358
|
-
declare const Application: Application;
|
|
8359
|
+
declare const Application: Application & base.Application;
|
package/dtstype/ppt.d.ts
CHANGED
package/dtstype/word.d.ts
CHANGED
package/main.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{createRequire as
|
|
3
|
-
`,"utf8")}async function
|
|
4
|
-
"types": ${s},`);await c.promises.writeFile(
|
|
5
|
-
`,"utf8")}async function
|
|
2
|
+
import{createRequire as Ie}from"module";import ne from"fs";import I from"path";import{fileURLToPath as Le}from"url";import c from"fs";import p from"path";import B from"readline";import{spawn as V}from"child_process";import{fileURLToPath as ae}from"url";var ce=ae(import.meta.url),q=p.dirname(ce),x=[{key:"1",label:"Excel",value:"Excel",template:"office"},{key:"2",label:"Word",value:"Word",template:"office"},{key:"3",label:"Ppt",value:"Ppt",template:"office"}],H={Excel:"src_excel",Word:"src_word",Ppt:"src_ppt"},pe={Excel:["uudev/types/excel"],Word:["uudev/types/word"],Ppt:["uudev/types/ppt"]};async function le(){try{return(await import("chalk")).default}catch{return null}}async function ue(){try{return(await import("inquirer")).default}catch{return null}}function v(e){if(!e)return;let t=e.trim().toLowerCase(),r=x.find(o=>o.key===t);if(r)return r;let n=x.find(o=>o.label.toLowerCase()===t);if(n)return n}function fe(e){let t=v(e);return t?t.template:String(e||"office").toLowerCase()}function Z(e){return/^\d+\.\d+\.\d+$/.test(String(e||""))}function C(e,t){return new Promise(r=>{e.question(t,n=>r(n.trim()))})}async function me(e={}){let t={...e},r=await le(),n=await ue();if(t.appType){let i=v(t.appType);i&&(t.appType=i.value)}if(t.name&&t.version&&t.appType)return t;let o=B.createInterface({input:process.stdin,output:process.stdout});try{if(!t.name){let i=await C(o,"\u8BF7\u8F93\u5165\u7A0B\u5E8F name: ");t.name=i}if(!t.version)for(;;){let s=await C(o,"\u8BF7\u8F93\u5165 version (\u9ED8\u8BA4 1.0.0): ")||"1.0.0";if(Z(s)){t.version=s;break}let a="\u7248\u672C\u53F7\u683C\u5F0F\u9519\u8BEF\uFF0C\u4EC5\u652F\u6301 x.x.x\uFF0C\u4F8B\u5982 1.0.0\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\u3002";console.log(r?r.red(a):a)}}finally{o.close()}if(!t.appType)if(n){let i=await n.prompt([{type:"list",name:"appTypeSelection",message:"\u8BF7\u9009\u62E9 appType\uFF08\u4E0A\u4E0B\u65B9\u5411\u952E\u79FB\u52A8\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF09",default:x[0].value,choices:x.map(s=>({name:s.label,value:s.value}))}]);t.appType=i.appTypeSelection}else{let i=r?r.cyan("\u8BF7\u9009\u62E9 appType:"):"\u8BF7\u9009\u62E9 appType:";console.log(i);for(let a of x){let u=r?`${r.green(a.key)}. ${r.yellow(a.label)}`:`${a.key}. ${a.label}`;console.log(u)}let s=B.createInterface({input:process.stdin,output:process.stdout});try{let a=await C(s,"\u8BF7\u8F93\u5165\u5E8F\u53F7\u6216\u540D\u79F0 (\u9ED8\u8BA4 1): "),u=v(a||"1");if(!u)throw new Error("appType \u4EC5\u652F\u6301 Excel/Word/Ppt");t.appType=u.value}finally{s.close()}}return t}function de(e){if(!e.name)throw new Error("name \u4E0D\u80FD\u4E3A\u7A7A");if(/[\\/]/.test(e.name))throw new Error("name \u4E0D\u80FD\u5305\u542B\u8DEF\u5F84\u5206\u9694\u7B26");if(!e.appType)throw new Error("appType \u4E0D\u80FD\u4E3A\u7A7A");if(!v(e.appType))throw new Error("appType \u4EC5\u652F\u6301 Excel/Word/Ppt");if(!e.version)throw new Error("version \u4E0D\u80FD\u4E3A\u7A7A");if(!Z(e.version))throw new Error("version \u4EC5\u652F\u6301 x.x.x \u683C\u5F0F\uFF0C\u4F8B\u5982 1.0.0")}async function k(e,t){let r=await c.promises.readdir(e,{withFileTypes:!0}),n=new Set(["node_modules","dist"]);await c.promises.mkdir(t,{recursive:!0});for(let o of r){if(o.isDirectory()&&n.has(o.name))continue;let i=p.join(e,o.name),s=p.join(t,o.name);o.isDirectory()?await k(i,s):await c.promises.copyFile(i,s)}}function we(e){let t=v(e);if(t)return H[t.value]}async function ge(e,t,r){let n=we(r);if(!n)throw new Error(`\u672A\u627E\u5230 appType \u5BF9\u5E94\u6E90\u7801\u76EE\u5F55: ${r}`);let o=await c.promises.readdir(e,{withFileTypes:!0}),i=new Set(Object.values(H));await c.promises.mkdir(t,{recursive:!0});for(let a of o){if(!a.isDirectory()){let f=p.join(e,a.name),w=p.join(t,a.name);await c.promises.copyFile(f,w);continue}if(i.has(a.name))continue;let u=p.join(e,a.name),g=p.join(t,a.name);await k(u,g)}let s=p.join(e,n);if(!c.existsSync(s))throw new Error(`\u6A21\u677F\u76EE\u5F55\u7F3A\u5C11 ${n}`);await k(s,p.join(t,"src"))}async function ye(e,t,r,n){let o=p.join(e,"package.json");if(!c.existsSync(o))return;let i=await c.promises.readFile(o,"utf8"),s=JSON.parse(i);s.name=t,s.version=r,s.appType=n,await c.promises.writeFile(o,`${JSON.stringify(s,null,2)}
|
|
3
|
+
`,"utf8")}async function he(e,t){let r=p.join(e,"tsconfig.app.json");if(!c.existsSync(r))return;let n=v(t);if(!n)return;let o=pe[n.value];if(!o)return;let i=await c.promises.readFile(r,"utf8"),s=JSON.stringify(o);if(/"types"\s*:\s*\[[\s\S]*?\]/.test(i)){let a=i.replace(/"types"\s*:\s*\[[\s\S]*?\]/,`"types": ${s}`);await c.promises.writeFile(r,a,"utf8");return}if(/"compilerOptions"\s*:\s*\{/.test(i)){let a=i.replace(/"compilerOptions"\s*:\s*\{/,`"compilerOptions": {
|
|
4
|
+
"types": ${s},`);await c.promises.writeFile(r,a,"utf8")}}async function ve(e){let t=p.join(e,"package-lock.json");c.existsSync(t)&&await c.promises.unlink(t)}function Pe(e){return new Promise((t,r)=>{let n=process.platform==="win32"?V("cmd.exe",["/d","/s","/c","npm.cmd install"],{cwd:e,stdio:"inherit"}):V("npm",["install"],{cwd:e,stdio:"inherit"});n.on("error",o=>{r(o)}),n.on("close",o=>{if(o===0){t();return}r(new Error(`npm install \u6267\u884C\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${o}`))})})}async function K(e){let t=await me(e||{}),r=v(t.appType||"Excel");r&&(t.appType=r.value),t.version=t.version||"1.0.0",de(t);let n=p.join(process.cwd(),t.name),o=fe(t.appType),s=[p.resolve(q,"..","apptemplate",o),p.resolve(q,"apptemplate",o)].find(a=>c.existsSync(a));if(!s)throw new Error(`\u672A\u627E\u5230 appType \u5BF9\u5E94\u6A21\u677F: ${t.appType}`);if(c.existsSync(n))throw new Error(`\u76EE\u5F55\u5DF2\u5B58\u5728: ${n}`);await c.promises.mkdir(n,{recursive:!0}),o==="office"?await ge(s,n,t.appType):await k(s,n),await ye(n,t.name,t.version,t.appType),await he(n,t.appType),await ve(n),console.log("\u6B63\u5728\u5B89\u88C5\u9879\u76EE\u4F9D\u8D56: npm install"),await Pe(n),console.log(`\u521B\u5EFA\u6210\u529F: ${n}`)}import P from"fs";import b from"path";import{spawn as U}from"child_process";import Se from"archiver";function xe(e){return/^[A-Za-z0-9_./:-]+$/.test(e)?e:`"${String(e).replace(/"/g,'""')}"`}function O(e,t,r){return new Promise((n,o)=>{let i=process.platform==="win32"?U("cmd.exe",["/d","/s","/c",[e,...t].map(xe).join(" ")],{cwd:r,stdio:"inherit"}):U(e,t,{cwd:r,stdio:"inherit"});i.on("error",s=>{o(s)}),i.on("close",s=>{if(s===0){n();return}o(new Error(`\u547D\u4EE4\u6267\u884C\u5931\u8D25: ${e} ${t.join(" ")}`))})})}async function Te(e){let t=b.join(e,"package.json");if(!P.existsSync(t))throw new Error(`\u672A\u627E\u5230 package.json: ${t}`);let r=await P.promises.readFile(t,"utf8"),n=JSON.parse(r);if(!n.name)throw new Error("package.json \u7F3A\u5C11 name \u5B57\u6BB5");if(!n.version)throw new Error("package.json \u7F3A\u5C11 version \u5B57\u6BB5");return n}async function Ee(e,t,r){return new Promise((n,o)=>{let i=P.createWriteStream(t),s=Se("zip",{zlib:{level:9}});i.on("close",()=>n()),i.on("error",a=>o(a)),s.on("error",a=>o(a)),s.pipe(i),s.glob("**/*",{cwd:e,dot:!0,ignore:[r]}),s.finalize()})}async function ke(e,t){let r=b.join(e,"menifest.json");if(!P.existsSync(r))throw new Error(`\u672A\u627E\u5230 menifest.json: ${r}`);let n=await P.promises.readFile(r,"utf8"),o=JSON.parse(n);o.name=t.name,o.version=t.version,t.description&&(o.description=t.description,o.note=t.description),await P.promises.writeFile(r,`${JSON.stringify(o,null,2)}
|
|
5
|
+
`,"utf8")}async function G(){let e=process.cwd(),t=await Te(e),r=b.join(e,"dist"),n=`${t.name}_${t.version}.zip`,o=b.join(r,n),i=process.platform==="win32"?"npm.cmd":"npm";if(console.log("\u5F00\u59CB\u6267\u884C\u6784\u5EFA: npm run build"),await O(i,["run","build"],e),!P.existsSync(r))throw new Error("\u6784\u5EFA\u5B8C\u6210\u540E\u672A\u627E\u5230 dist \u76EE\u5F55");console.log("\u5F00\u59CB\u540C\u6B65 menifest.json \u5B57\u6BB5"),await ke(r,t),console.log(`\u5F00\u59CB\u6253\u5305 dist: ${n}`),await Ee(r,o,n),console.log(`\u53D1\u5E03\u5305\u751F\u6210\u6210\u529F: ${o}`)}import D from"fs";import be from"path";import{spawn as $,spawnSync as $e}from"child_process";var Ae={excel:"{00024500-0000-0000-C000-000000000046}",word:"{000209FF-0000-0000-C000-000000000046}",ppt:"{91493441-5A91-11CF-8700-00AA0060263B}"},T=null,j=null,E=new Set,Y=!1;function _(e){let t=String(e||"").trim().toLowerCase();if(t==="excel")return"excel";if(t==="word")return"word";if(t==="ppt"||t==="powerpoint")return"ppt";throw new Error(`\u4E0D\u652F\u6301\u7684 appType: ${e||"(\u7A7A)"}\uFF0C\u4EC5\u652F\u6301 Excel/Word/Ppt`)}async function F(e){let t=be.join(e,"package.json");if(!D.existsSync(t))throw new Error(`\u672A\u627E\u5230 package.json: ${t}`);let r=await D.promises.readFile(t,"utf8"),n=JSON.parse(r);if(!n.appType)throw new Error("package.json \u7F3A\u5C11 appType \u5B57\u6BB5");return n}function Me(e){let t=["inherit","pipe","pipe"];return process.platform==="win32"?$("cmd.exe",["/c","npx","vite"],{cwd:e,stdio:t}):$("npx",["vite"],{cwd:e,stdio:t})}function W(e){let t=e.pid;if(t){if(process.platform==="win32"){$("taskkill",["/pid",String(t),"/t","/f"],{stdio:"ignore",windowsHide:!0});return}e.kill("SIGTERM")}}function Ce(e){return e.replace(/\x1B\[[0-?]*[ -/]*[@-~]/g,"")}function Oe(e){let t=Ce(e).match(/https?:\/\/(?:127\.0\.0\.1|localhost):(\d+)/i)?.[1];if(!t)return null;let r=Number.parseInt(t,10);return!Number.isInteger(r)||r<=0||r>65535?null:r}async function je(e,t=3e4){return new Promise((r,n)=>{let o=!1,i=l=>f(()=>n(l)),s=l=>{f(()=>n(new Error(`\u672A\u89E3\u6790\u5230\u672C\u5730\u670D\u52A1\u7AEF\u53E3\uFF0Cuudev debug\u5DF2\u9000\u51FA\uFF0C\u9000\u51FA\u7801: ${l}`)))},a=l=>w(l,process.stdout),u=l=>w(l,process.stderr),g=()=>{e.off("error",i),e.off("close",s),e.stdout?.off("data",a),e.stderr?.off("data",u)},f=l=>{o||(o=!0,clearTimeout(y),g(),l())},w=(l,A)=>{A.write(l);let S=Oe(l.toString("utf8"));S!==null&&f(()=>r(S))};e.on("error",i),e.on("close",s),e.stdout?.on("data",a),e.stderr?.on("data",u);let y=setTimeout(()=>{f(()=>n(new Error(`\u7B49\u5F85\u672C\u5730\u670D\u52A1\u7AEF\u53E3\u8D85\u65F6\uFF08${t}ms\uFF09`)))},t)})}function De(e){let t=$e("reg",["query",e,"/ve"],{encoding:"utf8"});if(t.status!==0)return null;let n=`${t.stdout||""}`.split(/\r?\n/).find(i=>/REG_SZ|REG_EXPAND_SZ/i.test(i));if(!n)return null;let o=n.match(/REG_(?:SZ|EXPAND_SZ)\s+(.+)$/i);return!o||!o[1]?null:o[1].trim()}function _e(e){return e.replace(/%([^%]+)%/g,(t,r)=>process.env[r]||`%${r}%`)}function Fe(e){let t=_e(e.trim());if(t.startsWith('"')){let n=t.indexOf('"',1);if(n>1)return t.slice(1,n)}let r=t.match(/^(.+?\.exe)/i);return r&&r[1]?r[1].trim():t}function X(e){return String(e).padStart(2,"0")}function R(e,t=new Date){let r=String(e||"").trim(),n=X(t.getMonth()+1),o=X(t.getDate());return`uudev_smmName_${r}_${n}-${o}`}async function We(){return T||(j||(j=import("share-memory-win").then(e=>{let t=e.default??e;return T=t,t})),j)}function Re(){Y||(Y=!0,process.once("exit",()=>{if(T){for(let e of E)T.DeleteShareMemory(e);E.clear()}}))}async function Je(e,t){Re();let r=await We(),n=Buffer.concat([Buffer.from(t,"utf8"),Buffer.from([0])]),o=Math.max(1024,n.length);if(E.has(e)&&(r.DeleteShareMemory(e),E.delete(e)),!r.CreateShareMemory(e,o))throw new Error(`\u5171\u4EAB\u5185\u5B58\u521B\u5EFA\u5931\u8D25: ${e}`);if(!r.WriteShareMemory(e,n))throw r.DeleteShareMemory(e),new Error(`\u5171\u4EAB\u5185\u5B58\u5199\u5165\u5931\u8D25: ${e}`);E.add(e)}function J(e){let t=Ae[e],r=[`HKCR\\CLSID\\${t}\\LocalServer32`,`HKLM\\SOFTWARE\\Classes\\CLSID\\${t}\\LocalServer32`,`HKLM\\SOFTWARE\\WOW6432Node\\Classes\\CLSID\\${t}\\LocalServer32`];for(let n of r){let o=De(n);if(!o)continue;let i=Fe(o);if(i&&D.existsSync(i))return i}throw new Error(`\u65E0\u6CD5\u901A\u8FC7 CLSID \u5B9A\u4F4D ${e} \u5B89\u88C5\u8DEF\u5F84\uFF0C\u8BF7\u68C0\u67E5 Office \u662F\u5426\u5DF2\u5B89\u88C5`)}async function N(e,t,r){return await Je(t,r),$(e,{stdio:"ignore",windowsHide:!1})}async function Q(){if(process.platform!=="win32")throw new Error("debug \u547D\u4EE4\u5F53\u524D\u4EC5\u652F\u6301 Windows");let e=process.cwd(),t=Me(e);await new Promise((f,w)=>{t.once("error",y=>w(y)),t.once("spawn",()=>f())}),console.log("\u8C03\u8BD5\u670D\u52A1\u5DF2\u542F\u52A8\uFF0C\u6B63\u5728\u8BFB\u53D6 appType \u5E76\u542F\u52A8 Office...");let r=await F(e),n=_(r.appType),o=J(n),s=`http://127.0.0.1:${await je(t)}`,a=R(r.appType);console.log(`\u5DF2\u8BC6\u522B appType: ${r.appType}`),console.log(`\u542F\u52A8 Office: ${o}`);let u=await N(o,a,s),g=!1;u.once("close",()=>{g=!0,console.log("Office \u5BA2\u6237\u7AEF\u5DF2\u9000\u51FA\uFF0C\u6B63\u5728\u5173\u95ED uudev debug..."),W(t)}),await new Promise((f,w)=>{t.on("close",y=>{if(g){f();return}if(y===0||y===null){f();return}w(new Error(`uudev debug\u9000\u51FA\uFF0C\u9000\u51FA\u7801: ${y}`))})})}import ee from"fs";import te from"path";import{spawn as Ne}from"child_process";async function re(){if(process.platform!=="win32")throw new Error("preview \u547D\u4EE4\u5F53\u524D\u4EC5\u652F\u6301 Windows");let e=process.cwd(),t=te.join(e,"dist"),r=!1;if(ee.existsSync(t)?(await ee.promises.readdir(t)).length===0&&(r=!0):r=!0,r){let d=process.platform==="win32"?"npm.cmd":"npm";await O(d,["run","build"],e)}let n=te.resolve(e),o=process.platform==="win32"?`npx.cmd vite preview --host=127.0.0.1 --outDir="${n}"`:`npx vite preview --host=127.0.0.1 --outDir="${n}"`,i=Ne(o,{cwd:e,stdio:["ignore","pipe","pipe"],shell:!0});function s(d){return d.replace(/\x1B\[[0-?]*[ -/]*[@-~]/g,"")}function a(d){let h=s(d).match(/https?:\/\/(?:127\.0\.0\.1|localhost):(\d+)/i)?.[1];if(!h)return null;let m=Number.parseInt(h,10);return!Number.isInteger(m)||m<=0||m>65535?null:m}let u=await new Promise((d,h)=>{let m=!1,L=M=>{let se=M.toString("utf8"),z=a(se);z&&!m&&(m=!0,d(z))};i.stdout?.on("data",L),i.stderr?.on("data",L),i.on("error",h),i.on("close",M=>{m||h(new Error(`uudev preview \u9000\u51FA\uFF0C\u9000\u51FA\u7801: ${M}`))}),setTimeout(()=>{m||h(new Error("\u7B49\u5F85 uudev preview \u7AEF\u53E3\u8D85\u65F6"))},2e4)}),g=await F(e),f=_(g.appType),w=J(f),y=`http://127.0.0.1:${u}/dist/index.html`,l=R(g.appType),A=await N(w,l,y),S=!1;A.once("close",()=>{S=!0,console.log("Office \u5BA2\u6237\u7AEF\u5DF2\u9000\u51FA\uFF0C\u6B63\u5728\u5173\u95ED uudev preview..."),W(i)}),await new Promise((d,h)=>{i.on("close",m=>{if(S){d(void 0);return}m===0||m===null?d(void 0):h(new Error(`uudev preview\u9000\u51FA\uFF0C\u9000\u51FA\u7801: ${m}`))})})}var Tt=Ie(import.meta.url);function ze(){let e=I.dirname(Le(import.meta.url)),t=[I.resolve(e,"package.json"),I.resolve(e,"../package.json")];for(let r of t)if(ne.existsSync(r))try{let n=JSON.parse(ne.readFileSync(r,"utf8"));if(n?.version)return n.version}catch{}return"0.0.0"}var ie=ze();async function Be(){try{return(await import("chalk")).default}catch{return null}}function oe(){console.log(`uudev v${ie}`),console.log(""),console.log("uudev <command> [options]"),console.log(""),console.log("Commands:"),console.log(" create"),console.log(" \u521B\u5EFAuuapp\u9879\u76EE, \u4F1A\u8FDB\u5165\u4EA4\u4E92\u5F0F\u5411\u5BFC\uFF0C\u5E2E\u52A9\u4F60\u5B8C\u6210\u9879\u76EE\u521B\u5EFA"),console.log(" debug"),console.log(" \u5728\u5F53\u524D\u9879\u76EE\u4E2D\u6267\u884C npm run debug\uFF0C\u5E76\u6309 appType \u542F\u52A8 Office"),console.log(" preview"),console.log(" \u6784\u5EFA\u5E76 vite preview \u5F53\u524D\u9879\u76EE\uFF0C\u81EA\u52A8\u542F\u52A8 Office \u5E76\u4F20\u9012\u8C03\u8BD5\u53C2\u6570"),console.log(" makezip"),console.log(" \u5728\u5F53\u524D\u9879\u76EE\u4E2D\u6267\u884C npm run makezip\uFF0C\u5E76\u5C06 dist \u76EE\u5F55\u5185\u5BB9\u6253\u5305\u4E3A appName_version.zip"),console.log(" --help, -h"),console.log(" \u663E\u793A\u5E2E\u52A9\u4FE1\u606F"),console.log(" --version, -v"),console.log(" \u663E\u793A\u7248\u672C\u4FE1\u606F"),console.log(""),console.log("AppType options: Excel | Word | Ppt"),console.log("Version format : x.x.x (\u4F8B\u5982 1.0.0)")}function Ve(){console.log(`uudev v${ie}`)}async function qe(){let e=process.argv[2],t=await Be();if(!e||e==="--help"||e==="-h"||e==="help"){oe();return}if(e==="--version"||e==="-v"||e==="version"){Ve();return}if(e==="create"){if(process.argv.length>3){let r="create \u547D\u4EE4\u4F1A\u5FFD\u7565\u9644\u5E26\u53C2\u6570\uFF0C\u5DF2\u8FDB\u5165\u521B\u5EFA\u5411\u5BFC\u3002";console.log(t?t.yellow(r):r)}await K();return}if(e==="makezip"){await G();return}if(e==="debug"){await Q();return}if(e==="preview"){await re();return}oe()}qe().catch(e=>{console.error(`\u6267\u884C\u5931\u8D25: ${e.message}`),process.exit(1)});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uudev",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.7",
|
|
4
4
|
"description": "uudev dev tool",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"uudev"
|
|
@@ -24,12 +24,13 @@
|
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"engines": {
|
|
27
|
-
"node": ">=24.
|
|
27
|
+
"node": ">=24.15.0"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"archiver": "^7.0.1",
|
|
31
31
|
"chalk": "^5.6.2",
|
|
32
|
-
"inquirer": "^12.10.0"
|
|
32
|
+
"inquirer": "^12.10.0",
|
|
33
|
+
"share-memory-win": "^1.2.1"
|
|
33
34
|
},
|
|
34
35
|
"files": [
|
|
35
36
|
"main.js",
|