@oiyo/cli 0.2.1 → 0.3.0-beta.2

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/LICENSE CHANGED
@@ -80,13 +80,21 @@ Unless expressly permitted by law or in writing by the Licensor, the Licensee ma
80
80
 
81
81
  5. 试用与商用 / EVALUATION AND COMMERCIAL USE
82
82
 
83
- 被许可方可以基于官方安装包、文档和示例进行试用与技术评估。
83
+ 被许可方可以基于 oiyo 的官方发布版本、文档和示例进行试用、评估、测试及内部验证。
84
84
 
85
- 除另有书面约定外,项目级接入支持、迁移服务、兼容性排查、远程诊断、优先修复、企业群支持、定制开发及其他增值服务,不包含在基础许可中。
85
+ 在遵守本协议的前提下,被许可方可以在其自有项目中将 oiyo 用于商业开发、集成、构建、部署和运营,包括个人开发者、团队及企业客户的商业项目。
86
86
 
87
- The Licensee may evaluate oiyo based on official packages, documentation, and examples.
87
+ 前述商用仅限于将 oiyo 作为被许可方自有项目的一部分进行使用,不包括将 oiyo 自身或其相关材料作为独立产品、模板包、SDK、平台能力、可再分发组件或其他可单独提供的交付物对外提供、转让、出售、授权或再销售,除非许可方另行书面同意。
88
88
 
89
- Unless otherwise agreed in writing, project onboarding, migration services, compatibility diagnosis, remote troubleshooting, priority fixes, enterprise support channels, custom development, and other value-added services are not included in the base license.
89
+ 除另有书面约定外,项目级协助接入、迁移服务、兼容性排查、远程诊断、优先修复、企业群支持、定制开发及其他增值服务,不包含在基础许可中。
90
+
91
+ The Licensee may use oiyo for trial, evaluation, testing, and internal validation based on its officially distributed versions, documentation, and examples.
92
+
93
+ Subject to this Agreement, the Licensee may use oiyo in the commercial development, integration, building, deployment, and operation of the Licensee's own projects, including commercial projects of individual developers, teams, and enterprises.
94
+
95
+ Such commercial use is limited to using oiyo as part of the Licensee's own projects and does not include providing, transferring, selling, licensing, or reselling oiyo itself or related materials as a standalone product, template package, SDK, platform capability, redistributable component, or other separately deliverable offering, unless otherwise approved in writing by the Licensor.
96
+
97
+ Unless otherwise agreed in writing, project onboarding and integration assistance, migration services, compatibility diagnosis, remote troubleshooting, priority fixes, enterprise support channels, custom development, and other value-added services are not included in the base license.
90
98
 
91
99
  6. 支持边界 / SUPPORT BOUNDARY
92
100
 
@@ -97,7 +105,7 @@ Unless otherwise agreed in writing, project onboarding, migration services, comp
97
105
 
98
106
  以下事项属于商业支持范围:
99
107
 
100
- 1) 项目接入问题;
108
+ 1) 项目协助接入;
101
109
  2) 历史项目迁移;
102
110
  3) uni、vite 或 node 版本兼容问题;
103
111
  4) HMR、构建、转换异常排查;
@@ -111,7 +119,7 @@ Free channels are generally limited to:
111
119
 
112
120
  The following are commercial support matters:
113
121
 
114
- 1) project onboarding issues;
122
+ 1) project onboarding and integration assistance;
115
123
  2) migration of existing projects;
116
124
  3) uni, vite, or node compatibility analysis;
117
125
  4) HMR, build, and transformation issue diagnosis;
package/README.md CHANGED
@@ -16,11 +16,11 @@ oiyo 是以融合AI协作,提升开发体验,降低心智成本为三大理
16
16
 
17
17
  ## 支持说明
18
18
 
19
- oiyo 采用由 oiyo 团队维护的商业发布模式
19
+ oiyo 采用由 oiyo 团队维护的商业发布模式。文档、示例和安装方式公开,oiyo 自有实现源码不公开。
20
20
 
21
- 文档、示例和安装方式公开,oiyo 自有实现源码不公开;项目级接入、迁移、兼容性排查和企业支持由 oiyo 团队提供
21
+ oiyo 允许个人开发者、团队及企业在其自有项目中商业使用,可用于项目的开发、集成、构建、部署和运营。但不包括将 oiyo 自身或其相关材料作为独立产品、模板包、SDK、平台能力或可再分发组件再次对外提供、转让、授权或销售。
22
22
 
23
- 免费渠道仅处理可复现的框架级问题;项目级接入、环境兼容、历史项目改造和定制需求属于商业支持范围
23
+ 免费渠道仅处理可复现的框架级问题;项目接入、迁移、兼容性排查和定制需求属于商业支持范围。
24
24
 
25
25
  ## 第三方依赖与许可
26
26
 
@@ -39,8 +39,8 @@ oiyo 所依赖、调用或集成的第三方组件与服务,包括但不限于
39
39
  ### 授权范围
40
40
 
41
41
  - 允许安装和运行官方发布版本
42
- - 允许在自身项目中进行内部开发和集成
43
42
  - 允许基于公开文档和示例进行评估
43
+ - 允许个人、团队及企业在自有项目中商业使用
44
44
 
45
45
  ### 不授予的权利
46
46
 
@@ -62,7 +62,7 @@ oiyo 所依赖、调用或集成的第三方组件与服务,包括但不限于
62
62
  ### 支持边界
63
63
 
64
64
  - 免费渠道:文档说明、标准用法、最小复现下的框架级缺陷反馈
65
- - 商业支持:项目接入、历史迁移、兼容性排查、HMR/构建/转换异常、权限与中间件接入、定制需求
65
+ - 商业支持:项目协助接入、历史迁移、兼容性排查、HMR/构建/转换异常、权限与中间件接入、定制需求
66
66
 
67
67
  ### 免责声明与责任限制
68
68
 
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
- * @oiyo/cli v0.2.1-beta.1
2
+ * @oiyo/cli v0.3.0-beta.2
3
3
  * Copyright (c) 2026 skiyee. All rights reserved.
4
4
  * Commercial software. See LICENSE for terms.
5
5
  * Official site: https://oiyo.js.org
6
6
  */
7
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`citty`),l=require(`node:process`);l=s(l,1);let u=require(`@clack/prompts`);u=s(u,1);let d=require(`node:fs`),f=require(`node:fs/promises`),p=require(`@oiyo/config`),m=require(`@oiyo/core`),h=require(`ansis`),g=require(`c12`),_=require(`node:module`),v=require(`pathe`),y=require(`execa`),b=require(`node:buffer`),x=require(`node:child_process`),S=require(`node:os`);S=s(S,1);const C={h5:`H5`,"mp-weixin":`微信小程序`,"mp-alipay":`支付宝小程序`,"mp-toutiao":`抖音小程序`,"mp-xhs":`小红书小程序`,"mp-harmony":`鸿蒙小程序`,"mp-jd":`京东小程序`,"mp-kuaishou":`快手小程序`,"mp-lark":`飞书小程序`,"mp-baidu":`百度小程序`,"mp-qq":`QQ 小程序`,"quickapp-webview":`快应用 WebView`,"quickapp-webview-huawei":`华为快应用 WebView`,"quickapp-webview-union":`联盟快应用 WebView`,app:`App`,"app-android":`App Android`,"app-ios":`App iOS`,"app-harmony":`App Harmony`},w=Object.keys(C);async function T(){let e=await u.select({message:`请选择开发目标平台`,options:w.map(e=>({label:C[e],value:e,hint:e}))});return u.isCancel(e)?(u.cancel(`已取消平台选择`),null):e}function E(e){return(0,v.normalize)((0,_.createRequire)(require(`url`).pathToFileURL(__filename).href).resolve(e))}const D={logLevel:{type:`enum`,description:`日志级别: silent | info | verbose`,options:[`silent`,`info`,`verbose`]}};let O=!1;async function k(){let e=`未知`,t=`未知`,n=`未知`,r=E(`@oiyo/framework/package.json`);if((0,d.existsSync)(r)){let i=JSON.parse(await(0,f.readFile)(r,`utf8`));e=i.version,t=i.dependencies[`@dcloudio/uni-app`],n=i.dependencies.vue}console.log(`${(0,h.blue)(`oiyo v${e}`)} powered by ${(0,h.hex)(`#2B9939`)`uni-app(v${t})`} ${(0,h.hex)(`#42b983`)`vue(v${n})`}`)}function A(){return{name:`oiyo:context`,async setup(e){O||=(await k(),!0);let t=e.args.logLevel,{config:n}=await(0,g.loadConfig)({name:`oiyo`}),r=(0,p.resolveOiyoConfig)(n);e.data={logger:(0,m.createLogger)(t),config:r}}}}const j=(0,c.defineCommand)({meta:{name:`prepare`,description:`执行 Oiyo 准备阶段`},plugins:[A],args:{...D},async run({data:e}){let{logger:t,config:n}=e,r=t.withScope(`PREPARE`);try{let e=E(`@dcloudio/vite-plugin-uni/dist/utils/plugin.js`);if(!(0,d.existsSync)(e))return;let t=(0,d.readFileSync)(e,`utf-8`),{dir:n}=(0,v.parse)((0,v.dirname)(E(`@oiyo/framework`)));(0,d.writeFileSync)(e,M(t,n))}catch(e){r.error(`初始化失败,请移除 node_modules 并重新安装依赖!\n\n${e.message}`)}let i=new m.OiyoState(n),a=new m.OiyoModComponent(n,{logger:t,oiyoState:i}),o=new m.OiyoModApi(n,{logger:t,oiyoState:i}),s=new m.OiyoModRoot(n,{logger:t,oiyoAutoApi:o}),c=new m.OiyoModLayout(n,{logger:t,oiyoState:i}),l=new m.OiyoModRoute(n,{logger:t.withScope(`ROUTE`),oiyoState:i,oiyoRoot:s,oiyoLayout:c});await Promise.all([l.loadPagesConfig(),a.collectComponents(),o.collectApis(),c.registerLayouts()]),a.writeDeclaration(),o.writeDeclaration(),c.writeDeclaration(),await l.registerPages(),l.writePagesJson(),i.writeDeclarationEntry(),i.markGenerated()}});function M(e,t){let n=`const isOiyoPluginEnabled = process.env.OIYO_PLUGIN || true;\nconst oiyoRoot = "${t}";\nif(isOiyoPluginEnabled && oiyoRoot){\ncliRoot = oiyoRoot\n}\nconst pkg = require(path_1.default.join(cliRoot, "package.json"));`;return e.replace(`const pkg = require(path_1.default.join(cliRoot, 'package.json'));`,n)}async function N(e,t){t.info(`正在调起微信开发者工具`);let n=await P(e.ide?.path?.[`mp-weixin`]);if(!n){t.warn(`未找到微信开发者工具路径,请在 oiyo.config.ts 中配置 ide.path["mp-weixin"]`);return}let r=(0,v.join)(e.rootDir||l.default.cwd(),`dist`,`dev`,`mp-weixin`);await I(r);let i=await(0,y.execa)(n,[`open`,`--project`,r],{reject:!1,windowsHide:!0});t.info(`微信开发者工具已准备就绪`),i.exitCode!==0&&t.warn(`微信开发者工具打开失败,请检查开发者工具服务端口是否已开启`)}async function P(e){if(e)return await B(e)?e:null;let t=L();if(t&&await B(t))return t;let n=R();if(n&&await B(n))return n;let r=F(l.default.platform,l.default.env,S.default.homedir());for(let e of r)if(await B(e))return e;return null}function F(e,t,n){return e===`win32`?[v.win32.join(t[`ProgramFiles(x86)`]||``,`Tencent`,`微信web开发者工具`,`cli.bat`),v.win32.join(t.ProgramFiles||``,`Tencent`,`微信web开发者工具`,`cli.bat`),v.win32.join(t.ProgramW6432||``,`Tencent`,`微信web开发者工具`,`cli.bat`),v.win32.join(t.LOCALAPPDATA||``,`Tencent`,`微信web开发者工具`,`cli.bat`)].filter(Boolean):e===`darwin`?[v.posix.join(`/Applications`,`wechatwebdevtools.app`,`Contents`,`MacOS`,`cli`),v.posix.join(`/Applications`,`微信开发者工具.app`,`Contents`,`MacOS`,`cli`),v.posix.join(n,`Applications`,`wechatwebdevtools.app`,`Contents`,`MacOS`,`cli`),v.posix.join(n,`Applications`,`微信开发者工具.app`,`Contents`,`MacOS`,`cli`)]:[]}async function I(e){let t=(0,v.join)(e,`project.config.json`);await B(t)||(await(0,f.mkdir)(e,{recursive:!0}),await(0,f.writeFile)(t,`${JSON.stringify({appid:`touristappid`,projectname:`oiyo`},null,2)}\n`,`utf8`))}function L(){if(l.default.platform!==`win32`)return null;let e=[`$paths = @('HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*', 'HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*')`,`$target = '*微信开发者工具*'`,`foreach ($path in $paths) {`,` Get-ItemProperty $path -ErrorAction SilentlyContinue |`,` Where-Object { $_.DisplayName -like $target } |`,` ForEach-Object {`,` if ($_.InstallLocation) {`,` $value = Join-Path $_.InstallLocation 'cli.bat'`,` $bytes = [System.Text.Encoding]::UTF8.GetBytes($value)`,` Write-Output ([Convert]::ToBase64String($bytes))`,` exit`,` }`,` if ($_.DisplayIcon) {`,` $value = Join-Path (Split-Path $_.DisplayIcon -Parent) 'cli.bat'`,` $bytes = [System.Text.Encoding]::UTF8.GetBytes($value)`,` Write-Output ([Convert]::ToBase64String($bytes))`,` exit`,` }`,` }`,`}`].join(`; `);try{return z(e)||null}catch{return null}}function R(){if(l.default.platform!==`win32`)return null;let e=[`$path = 'HKCU:\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Compatibility Assistant\\Store'`,`$items = Get-ItemProperty $path -ErrorAction SilentlyContinue`,`if ($items) {`,` $match = $items.PSObject.Properties | Where-Object { $_.Name -like '*微信开发者工具.exe' } | Select-Object -First 1`,` if ($match) {`,` $value = Join-Path (Split-Path $match.Name -Parent) 'cli.bat'`,` $bytes = [System.Text.Encoding]::UTF8.GetBytes($value)`,` Write-Output ([Convert]::ToBase64String($bytes))`,` }`,`}`].join(`; `);try{return z(e)}catch{return null}}function z(e){try{let t=(0,x.execFileSync)(`powershell`,[`-NoProfile`,`-ExecutionPolicy`,`Bypass`,`-EncodedCommand`,b.Buffer.from(e,`utf16le`).toString(`base64`)],{stdio:[`ignore`,`pipe`,`ignore`],windowsHide:!0}).toString(`utf8`).trim();return t&&b.Buffer.from(t,`base64`).toString(`utf8`).trim()||null}catch{return null}}async function B(e){if(!e)return!1;try{return await(0,f.access)(e,d.constants.F_OK),!0}catch{return!1}}async function V(e,t,n){let r=n.withScope(`IDE`);switch(e){case`mp-weixin`:await N(t,r);break;default:r.info(`请手动打开开发者工具,导入 ${(0,h.blue)(e)} 产物运行`);break}}const H=(0,c.defineCommand)({args:{mode:{type:`positional`,description:`运行模式`,required:!0},platform:{type:`string`,description:`通过参数显式指定平台`,required:!0}},async run({args:e,data:t}){let{config:n,logger:r}=t,i={...l.default.env,OIYO_UNI_CALLED:`1`},a=U([e.mode,`-p`,e.platform],{env:i});for await(let t of a)if(!t.startsWith(`请注意运行模式下`)&&!t.startsWith(`uni-app 有新版本发布`)){if(e.platform.startsWith(`mp`)&&n.ide?.open&&t.startsWith(`运行方式`)){await V(e.platform,n,r);continue}l.default.stdout.write(`${t}\n`)}}});function U(e,t){let n=W();return(0,y.execa)(l.default.execPath,[n,...e],{stdout:[`pipe`],stderr:[`pipe`,`inherit`],reject:!1,env:t?.env})}function W(){try{return E(`@dcloudio/vite-plugin-uni/bin/uni.js`)}catch(e){throw Error(`[oiyo] 未找到真实的 UNIAPP CLI,请移除 node_modules 重新安装依赖`,{cause:e})}}const G=(0,c.defineCommand)({meta:{name:`build`,description:`启动 Oiyo 构建流程`},plugins:[A],args:{target:{type:`positional`,description:`目标平台,如 h5、mp-weixin、app`,required:!1},platform:{type:`string`,description:`通过参数显式指定平台`,alias:[`p`]},...D},async run({args:e,data:t}){let{logger:n,config:r}=t,i=e.target??e.platform??e.p??await T();i||l.default.exit(0);let a=n.withScope(`CLI`);w.includes(i)||(a.error(`不支持的平台:${i}\n可选平台:${w.join(`, `)}`),l.default.exit(0)),await(0,c.runCommand)(j,{rawArgs:e.logLevel?[`--logLevel`,e.logLevel]:[]}),await(0,c.runCommand)(H,{rawArgs:[`build`,`--platform`,i],data:{logger:n,config:r}})}}),K=(0,c.defineCommand)({meta:{name:`dev`,description:`启动 Oiyo 开发流程`},plugins:[A],args:{target:{type:`positional`,description:`目标平台,如 h5、mp-weixin、app`,required:!1},platform:{type:`string`,description:`通过参数显式指定平台`,alias:[`p`]},...D},async run({args:e,data:t}){let{logger:n,config:r}=t,i=e.target??e.platform??e.p??await T();i||l.default.exit(0);let a=n.withScope(`CLI`);w.includes(i)||(a.error(`不支持的平台:${i}\n可选平台:${w.join(`, `)}`),l.default.exit(0)),await(0,c.runCommand)(j,{rawArgs:e.logLevel?[`--logLevel`,e.logLevel]:[]}),await(0,c.runCommand)(H,{rawArgs:[`dev`,`--platform`,i],data:{logger:n,config:r}})}});(0,c.runMain)((0,c.defineCommand)({meta:{name:`oiyo`,version:`1.0.0`,description:`Oiyo CLI - 增强型工程框架`},subCommands:{prepare:j,dev:K,build:G}}));
7
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`citty`),l=require(`node:process`);l=s(l,1);let u=require(`@clack/prompts`);u=s(u,1);let d=require(`node:fs`),f=require(`node:fs/promises`),p=require(`@oiyo/config`),m=require(`@oiyo/core`),h=require(`ansis`),g=require(`c12`),_=require(`node:module`),v=require(`pathe`),y=require(`execa`),b=require(`node:buffer`),x=require(`node:child_process`),S=require(`node:os`);S=s(S,1);const C={h5:`H5`,"mp-weixin":`微信小程序`,"mp-alipay":`支付宝小程序`,"mp-toutiao":`抖音小程序`,"mp-xhs":`小红书小程序`,"mp-harmony":`鸿蒙小程序`,"mp-jd":`京东小程序`,"mp-kuaishou":`快手小程序`,"mp-lark":`飞书小程序`,"mp-baidu":`百度小程序`,"mp-qq":`QQ 小程序`,"quickapp-webview":`快应用 WebView`,"quickapp-webview-huawei":`华为快应用 WebView`,"quickapp-webview-union":`联盟快应用 WebView`,app:`App`,"app-android":`App Android`,"app-ios":`App iOS`,"app-harmony":`App Harmony`},w=Object.keys(C);async function T(){let e=await u.select({message:`请选择开发目标平台`,options:w.map(e=>({label:C[e],value:e,hint:e}))});return u.isCancel(e)?(u.cancel(`已取消平台选择`),null):e}function E(e){return(0,v.normalize)((0,_.createRequire)(require(`url`).pathToFileURL(__filename).href).resolve(e))}const D={logLevel:{type:`enum`,description:`日志级别: silent | info | verbose`,options:[`silent`,`info`,`verbose`]}};let O=!1;async function k(){let e=`未知`,t=`未知`,n=`未知`,r=E(`@oiyo/framework/package.json`);if((0,d.existsSync)(r)){let i=JSON.parse(await(0,f.readFile)(r,`utf8`));e=i.version,t=i.dependencies[`@dcloudio/uni-app`],n=i.dependencies.vue}console.log(`${(0,h.blue)(`oiyo v${e}`)} powered by ${(0,h.hex)(`#2B9939`)`uni-app(v${t})`} ${(0,h.hex)(`#42b983`)`vue(v${n})`}`)}function A(){return{name:`oiyo:context`,async setup(e){O||=(await k(),!0);let t=e.args.logLevel,{config:n}=await(0,g.loadConfig)({name:`oiyo`}),r=(0,p.resolveOiyoConfig)(n);e.data={logger:(0,m.createLogger)(t),config:r}}}}const j=(0,c.defineCommand)({meta:{name:`prepare`,description:`执行 Oiyo 准备阶段`},plugins:[A],args:{...D},async run({data:e}){let{logger:t,config:n}=e,r=t.withScope(`PREPARE`);try{let e=E(`@dcloudio/vite-plugin-uni/dist/utils/plugin.js`);if(!(0,d.existsSync)(e))return;let t=(0,d.readFileSync)(e,`utf-8`),{dir:n}=(0,v.parse)((0,v.dirname)(E(`@oiyo/framework`)));(0,d.writeFileSync)(e,M(t,n))}catch(e){r.error(`初始化失败,请移除 node_modules 并重新安装依赖!\n\n${e.message}`)}let i=new m.OiyoState(n),a=new m.OiyoModApi(n,{logger:t,oiyoState:i}),o=new m.OiyoModComponent(n,{logger:t,oiyoState:i,oiyoApi:a}),s=new m.OiyoModRoot(n,{logger:t}),c=new m.OiyoModLayout(n,{logger:t,oiyoState:i}),l=new m.OiyoModRoute(n,{logger:t,oiyoState:i,oiyoRoot:s,oiyoLayout:c});await Promise.all([a.scanApis(),o.scanComponents(),l.scanPages(),c.scanLayouts()]),a.writeDeclaration(),o.writeDeclaration(),l.writePagesJson()&&l.writeDeclaration(),c.writeDeclaration(),i.writeDeclarationEntry(),i.markGenerated()}});function M(e,t){let n=`const isOiyoPluginEnabled = process.env.OIYO_PLUGIN || true;\nconst oiyoRoot = "${t}";\nif(isOiyoPluginEnabled && oiyoRoot){\ncliRoot = oiyoRoot\n}\nconst pkg = require(path_1.default.join(cliRoot, "package.json"));`;return e.replace(`const pkg = require(path_1.default.join(cliRoot, 'package.json'));`,n)}async function N(e,t){t.info(`正在调起微信开发者工具`);let n=await P(e.ide?.path?.[`mp-weixin`]);if(!n){t.warn(`未找到微信开发者工具路径,请在 oiyo.config.ts 中配置 ide.path["mp-weixin"]`);return}let r=(0,v.join)(e.rootDir||l.default.cwd(),`dist`,`dev`,`mp-weixin`);await I(r);let i=await(0,y.execa)(n,[`open`,`--project`,r],{reject:!1,windowsHide:!0});t.info(`微信开发者工具已准备就绪`),i.exitCode!==0&&t.warn(`微信开发者工具打开失败,请检查开发者工具服务端口是否已开启`)}async function P(e){if(e)return await B(e)?e:null;let t=L();if(t&&await B(t))return t;let n=R();if(n&&await B(n))return n;let r=F(l.default.platform,l.default.env,S.default.homedir());for(let e of r)if(await B(e))return e;return null}function F(e,t,n){return e===`win32`?[v.win32.join(t[`ProgramFiles(x86)`]||``,`Tencent`,`微信web开发者工具`,`cli.bat`),v.win32.join(t.ProgramFiles||``,`Tencent`,`微信web开发者工具`,`cli.bat`),v.win32.join(t.ProgramW6432||``,`Tencent`,`微信web开发者工具`,`cli.bat`),v.win32.join(t.LOCALAPPDATA||``,`Tencent`,`微信web开发者工具`,`cli.bat`)].filter(Boolean):e===`darwin`?[v.posix.join(`/Applications`,`wechatwebdevtools.app`,`Contents`,`MacOS`,`cli`),v.posix.join(`/Applications`,`微信开发者工具.app`,`Contents`,`MacOS`,`cli`),v.posix.join(n,`Applications`,`wechatwebdevtools.app`,`Contents`,`MacOS`,`cli`),v.posix.join(n,`Applications`,`微信开发者工具.app`,`Contents`,`MacOS`,`cli`)]:[]}async function I(e){let t=(0,v.join)(e,`project.config.json`);await B(t)||(await(0,f.mkdir)(e,{recursive:!0}),await(0,f.writeFile)(t,`${JSON.stringify({appid:`touristappid`,projectname:`oiyo`},null,2)}\n`,`utf8`))}function L(){if(l.default.platform!==`win32`)return null;let e=[`$paths = @('HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*', 'HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*')`,`$target = '*微信开发者工具*'`,`foreach ($path in $paths) {`,` Get-ItemProperty $path -ErrorAction SilentlyContinue |`,` Where-Object { $_.DisplayName -like $target } |`,` ForEach-Object {`,` if ($_.InstallLocation) {`,` $value = Join-Path $_.InstallLocation 'cli.bat'`,` $bytes = [System.Text.Encoding]::UTF8.GetBytes($value)`,` Write-Output ([Convert]::ToBase64String($bytes))`,` exit`,` }`,` if ($_.DisplayIcon) {`,` $value = Join-Path (Split-Path $_.DisplayIcon -Parent) 'cli.bat'`,` $bytes = [System.Text.Encoding]::UTF8.GetBytes($value)`,` Write-Output ([Convert]::ToBase64String($bytes))`,` exit`,` }`,` }`,`}`].join(`; `);try{return z(e)||null}catch{return null}}function R(){if(l.default.platform!==`win32`)return null;let e=[`$path = 'HKCU:\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Compatibility Assistant\\Store'`,`$items = Get-ItemProperty $path -ErrorAction SilentlyContinue`,`if ($items) {`,` $match = $items.PSObject.Properties | Where-Object { $_.Name -like '*微信开发者工具.exe' } | Select-Object -First 1`,` if ($match) {`,` $value = Join-Path (Split-Path $match.Name -Parent) 'cli.bat'`,` $bytes = [System.Text.Encoding]::UTF8.GetBytes($value)`,` Write-Output ([Convert]::ToBase64String($bytes))`,` }`,`}`].join(`; `);try{return z(e)}catch{return null}}function z(e){try{let t=(0,x.execFileSync)(`powershell`,[`-NoProfile`,`-ExecutionPolicy`,`Bypass`,`-EncodedCommand`,b.Buffer.from(e,`utf16le`).toString(`base64`)],{stdio:[`ignore`,`pipe`,`ignore`],windowsHide:!0}).toString(`utf8`).trim();return t&&b.Buffer.from(t,`base64`).toString(`utf8`).trim()||null}catch{return null}}async function B(e){if(!e)return!1;try{return await(0,f.access)(e,d.constants.F_OK),!0}catch{return!1}}async function V(e,t,n){let r=n.withScope(`IDE`);switch(e){case`mp-weixin`:await N(t,r);break;default:r.info(`请手动打开开发者工具,导入 ${(0,h.blue)(e)} 产物运行`);break}}const H=(0,c.defineCommand)({args:{mode:{type:`positional`,description:`运行模式`,required:!0},platform:{type:`string`,description:`通过参数显式指定平台`,required:!0}},async run({args:e,data:t}){let{config:n,logger:r}=t,i={...l.default.env,OIYO_UNI_CALLED:`1`},a=U([e.mode,`-p`,e.platform],{env:i});for await(let t of a)if(!t.startsWith(`请注意运行模式下`)&&!t.startsWith(`uni-app 有新版本发布`)){if(e.platform.startsWith(`mp`)&&n.ide?.open&&t.startsWith(`运行方式`)){await V(e.platform,n,r);continue}l.default.stdout.write(`${t}\n`)}}});function U(e,t){let n=W();return(0,y.execa)(l.default.execPath,[n,...e],{stdout:[`pipe`],stderr:[`pipe`,`inherit`],reject:!1,env:t?.env})}function W(){try{return E(`@dcloudio/vite-plugin-uni/bin/uni.js`)}catch(e){throw Error(`[oiyo] 未找到真实的 UNIAPP CLI,请移除 node_modules 重新安装依赖`,{cause:e})}}const G=(0,c.defineCommand)({meta:{name:`build`,description:`启动 Oiyo 构建流程`},plugins:[A],args:{target:{type:`positional`,description:`目标平台,如 h5、mp-weixin、app`,required:!1},platform:{type:`string`,description:`通过参数显式指定平台`,alias:[`p`]},...D},async run({args:e,data:t}){let{logger:n,config:r}=t,i=e.target??e.platform??e.p??await T();i||l.default.exit(0);let a=n.withScope(`CLI`);w.includes(i)||(a.error(`不支持的平台:${i}\n可选平台:${w.join(`, `)}`),l.default.exit(0)),await(0,c.runCommand)(j,{rawArgs:e.logLevel?[`--logLevel`,e.logLevel]:[]}),await(0,c.runCommand)(H,{rawArgs:[`build`,`--platform`,i],data:{logger:n,config:r}})}}),K=(0,c.defineCommand)({meta:{name:`dev`,description:`启动 Oiyo 开发流程`},plugins:[A],args:{target:{type:`positional`,description:`目标平台,如 h5、mp-weixin、app`,required:!1},platform:{type:`string`,description:`通过参数显式指定平台`,alias:[`p`]},...D},async run({args:e,data:t}){let{logger:n,config:r}=t,i=e.target??e.platform??e.p??await T();i||l.default.exit(0);let a=n.withScope(`CLI`);w.includes(i)||(a.error(`不支持的平台:${i}\n可选平台:${w.join(`, `)}`),l.default.exit(0)),await(0,c.runCommand)(j,{rawArgs:e.logLevel?[`--logLevel`,e.logLevel]:[]}),await(0,c.runCommand)(H,{rawArgs:[`dev`,`--platform`,i],data:{logger:n,config:r}})}});(0,c.runMain)((0,c.defineCommand)({meta:{name:`oiyo`,version:`1.0.0`,description:`Oiyo CLI - 增强型工程框架`},subCommands:{prepare:j,dev:K,build:G}}));
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @oiyo/cli v0.2.1-beta.1
2
+ * @oiyo/cli v0.3.0-beta.2
3
3
  * Copyright (c) 2026 skiyee. All rights reserved.
4
4
  * Commercial software. See LICENSE for terms.
5
5
  * Official site: https://oiyo.js.org
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @oiyo/cli v0.2.1-beta.1
2
+ * @oiyo/cli v0.3.0-beta.2
3
3
  * Copyright (c) 2026 skiyee. All rights reserved.
4
4
  * Commercial software. See LICENSE for terms.
5
5
  * Official site: https://oiyo.js.org
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
- * @oiyo/cli v0.2.1-beta.1
2
+ * @oiyo/cli v0.3.0-beta.2
3
3
  * Copyright (c) 2026 skiyee. All rights reserved.
4
4
  * Commercial software. See LICENSE for terms.
5
5
  * Official site: https://oiyo.js.org
6
6
  */
7
- import{createRequire as e}from"node:module";import{defineCommand as t,runCommand as n,runMain as r}from"citty";import i from"node:process";import*as a from"@clack/prompts";import{constants as o,existsSync as s,readFileSync as c,writeFileSync as l}from"node:fs";import{access as u,mkdir as d,readFile as f,writeFile as p}from"node:fs/promises";import{resolveOiyoConfig as m}from"@oiyo/config";import{OiyoModApi as h,OiyoModComponent as g,OiyoModLayout as _,OiyoModRoot as v,OiyoModRoute as y,OiyoState as b,createLogger as x}from"@oiyo/core";import{blue as S,hex as C}from"ansis";import{loadConfig as w}from"c12";import{dirname as T,join as E,normalize as D,parse as ee,posix as O,win32 as k}from"pathe";import{execa as A}from"execa";import{Buffer as j}from"node:buffer";import{execFileSync as M}from"node:child_process";import N from"node:os";const P={h5:`H5`,"mp-weixin":`微信小程序`,"mp-alipay":`支付宝小程序`,"mp-toutiao":`抖音小程序`,"mp-xhs":`小红书小程序`,"mp-harmony":`鸿蒙小程序`,"mp-jd":`京东小程序`,"mp-kuaishou":`快手小程序`,"mp-lark":`飞书小程序`,"mp-baidu":`百度小程序`,"mp-qq":`QQ 小程序`,"quickapp-webview":`快应用 WebView`,"quickapp-webview-huawei":`华为快应用 WebView`,"quickapp-webview-union":`联盟快应用 WebView`,app:`App`,"app-android":`App Android`,"app-ios":`App iOS`,"app-harmony":`App Harmony`},F=Object.keys(P);async function I(){let e=await a.select({message:`请选择开发目标平台`,options:F.map(e=>({label:P[e],value:e,hint:e}))});return a.isCancel(e)?(a.cancel(`已取消平台选择`),null):e}function L(t){return D(e(import.meta.url).resolve(t))}const R={logLevel:{type:`enum`,description:`日志级别: silent | info | verbose`,options:[`silent`,`info`,`verbose`]}};let z=!1;async function B(){let e=`未知`,t=`未知`,n=`未知`,r=L(`@oiyo/framework/package.json`);if(s(r)){let i=JSON.parse(await f(r,`utf8`));e=i.version,t=i.dependencies[`@dcloudio/uni-app`],n=i.dependencies.vue}console.log(`${S(`oiyo v${e}`)} powered by ${C(`#2B9939`)`uni-app(v${t})`} ${C(`#42b983`)`vue(v${n})`}`)}function V(){return{name:`oiyo:context`,async setup(e){z||=(await B(),!0);let t=e.args.logLevel,{config:n}=await w({name:`oiyo`}),r=m(n);e.data={logger:x(t),config:r}}}}const H=t({meta:{name:`prepare`,description:`执行 Oiyo 准备阶段`},plugins:[V],args:{...R},async run({data:e}){let{logger:t,config:n}=e,r=t.withScope(`PREPARE`);try{let e=L(`@dcloudio/vite-plugin-uni/dist/utils/plugin.js`);if(!s(e))return;let t=c(e,`utf-8`),{dir:n}=ee(T(L(`@oiyo/framework`)));l(e,U(t,n))}catch(e){r.error(`初始化失败,请移除 node_modules 并重新安装依赖!\n\n${e.message}`)}let i=new b(n),a=new g(n,{logger:t,oiyoState:i}),o=new h(n,{logger:t,oiyoState:i}),u=new v(n,{logger:t,oiyoAutoApi:o}),d=new _(n,{logger:t,oiyoState:i}),f=new y(n,{logger:t.withScope(`ROUTE`),oiyoState:i,oiyoRoot:u,oiyoLayout:d});await Promise.all([f.loadPagesConfig(),a.collectComponents(),o.collectApis(),d.registerLayouts()]),a.writeDeclaration(),o.writeDeclaration(),d.writeDeclaration(),await f.registerPages(),f.writePagesJson(),i.writeDeclarationEntry(),i.markGenerated()}});function U(e,t){let n=`const isOiyoPluginEnabled = process.env.OIYO_PLUGIN || true;\nconst oiyoRoot = "${t}";\nif(isOiyoPluginEnabled && oiyoRoot){\ncliRoot = oiyoRoot\n}\nconst pkg = require(path_1.default.join(cliRoot, "package.json"));`;return e.replace(`const pkg = require(path_1.default.join(cliRoot, 'package.json'));`,n)}async function W(e,t){t.info(`正在调起微信开发者工具`);let n=await G(e.ide?.path?.[`mp-weixin`]);if(!n){t.warn(`未找到微信开发者工具路径,请在 oiyo.config.ts 中配置 ide.path["mp-weixin"]`);return}let r=E(e.rootDir||i.cwd(),`dist`,`dev`,`mp-weixin`);await q(r);let a=await A(n,[`open`,`--project`,r],{reject:!1,windowsHide:!0});t.info(`微信开发者工具已准备就绪`),a.exitCode!==0&&t.warn(`微信开发者工具打开失败,请检查开发者工具服务端口是否已开启`)}async function G(e){if(e)return await Z(e)?e:null;let t=J();if(t&&await Z(t))return t;let n=Y();if(n&&await Z(n))return n;let r=K(i.platform,i.env,N.homedir());for(let e of r)if(await Z(e))return e;return null}function K(e,t,n){return e===`win32`?[k.join(t[`ProgramFiles(x86)`]||``,`Tencent`,`微信web开发者工具`,`cli.bat`),k.join(t.ProgramFiles||``,`Tencent`,`微信web开发者工具`,`cli.bat`),k.join(t.ProgramW6432||``,`Tencent`,`微信web开发者工具`,`cli.bat`),k.join(t.LOCALAPPDATA||``,`Tencent`,`微信web开发者工具`,`cli.bat`)].filter(Boolean):e===`darwin`?[O.join(`/Applications`,`wechatwebdevtools.app`,`Contents`,`MacOS`,`cli`),O.join(`/Applications`,`微信开发者工具.app`,`Contents`,`MacOS`,`cli`),O.join(n,`Applications`,`wechatwebdevtools.app`,`Contents`,`MacOS`,`cli`),O.join(n,`Applications`,`微信开发者工具.app`,`Contents`,`MacOS`,`cli`)]:[]}async function q(e){let t=E(e,`project.config.json`);await Z(t)||(await d(e,{recursive:!0}),await p(t,`${JSON.stringify({appid:`touristappid`,projectname:`oiyo`},null,2)}\n`,`utf8`))}function J(){if(i.platform!==`win32`)return null;let e=[`$paths = @('HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*', 'HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*')`,`$target = '*微信开发者工具*'`,`foreach ($path in $paths) {`,` Get-ItemProperty $path -ErrorAction SilentlyContinue |`,` Where-Object { $_.DisplayName -like $target } |`,` ForEach-Object {`,` if ($_.InstallLocation) {`,` $value = Join-Path $_.InstallLocation 'cli.bat'`,` $bytes = [System.Text.Encoding]::UTF8.GetBytes($value)`,` Write-Output ([Convert]::ToBase64String($bytes))`,` exit`,` }`,` if ($_.DisplayIcon) {`,` $value = Join-Path (Split-Path $_.DisplayIcon -Parent) 'cli.bat'`,` $bytes = [System.Text.Encoding]::UTF8.GetBytes($value)`,` Write-Output ([Convert]::ToBase64String($bytes))`,` exit`,` }`,` }`,`}`].join(`; `);try{return X(e)||null}catch{return null}}function Y(){if(i.platform!==`win32`)return null;let e=[`$path = 'HKCU:\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Compatibility Assistant\\Store'`,`$items = Get-ItemProperty $path -ErrorAction SilentlyContinue`,`if ($items) {`,` $match = $items.PSObject.Properties | Where-Object { $_.Name -like '*微信开发者工具.exe' } | Select-Object -First 1`,` if ($match) {`,` $value = Join-Path (Split-Path $match.Name -Parent) 'cli.bat'`,` $bytes = [System.Text.Encoding]::UTF8.GetBytes($value)`,` Write-Output ([Convert]::ToBase64String($bytes))`,` }`,`}`].join(`; `);try{return X(e)}catch{return null}}function X(e){try{let t=M(`powershell`,[`-NoProfile`,`-ExecutionPolicy`,`Bypass`,`-EncodedCommand`,j.from(e,`utf16le`).toString(`base64`)],{stdio:[`ignore`,`pipe`,`ignore`],windowsHide:!0}).toString(`utf8`).trim();return t&&j.from(t,`base64`).toString(`utf8`).trim()||null}catch{return null}}async function Z(e){if(!e)return!1;try{return await u(e,o.F_OK),!0}catch{return!1}}async function Q(e,t,n){let r=n.withScope(`IDE`);switch(e){case`mp-weixin`:await W(t,r);break;default:r.info(`请手动打开开发者工具,导入 ${S(e)} 产物运行`);break}}const $=t({args:{mode:{type:`positional`,description:`运行模式`,required:!0},platform:{type:`string`,description:`通过参数显式指定平台`,required:!0}},async run({args:e,data:t}){let{config:n,logger:r}=t,a={...i.env,OIYO_UNI_CALLED:`1`},o=te([e.mode,`-p`,e.platform],{env:a});for await(let t of o)if(!t.startsWith(`请注意运行模式下`)&&!t.startsWith(`uni-app 有新版本发布`)){if(e.platform.startsWith(`mp`)&&n.ide?.open&&t.startsWith(`运行方式`)){await Q(e.platform,n,r);continue}i.stdout.write(`${t}\n`)}}});function te(e,t){let n=ne();return A(i.execPath,[n,...e],{stdout:[`pipe`],stderr:[`pipe`,`inherit`],reject:!1,env:t?.env})}function ne(){try{return L(`@dcloudio/vite-plugin-uni/bin/uni.js`)}catch(e){throw Error(`[oiyo] 未找到真实的 UNIAPP CLI,请移除 node_modules 重新安装依赖`,{cause:e})}}const re=t({meta:{name:`build`,description:`启动 Oiyo 构建流程`},plugins:[V],args:{target:{type:`positional`,description:`目标平台,如 h5、mp-weixin、app`,required:!1},platform:{type:`string`,description:`通过参数显式指定平台`,alias:[`p`]},...R},async run({args:e,data:t}){let{logger:r,config:a}=t,o=e.target??e.platform??e.p??await I();o||i.exit(0);let s=r.withScope(`CLI`);F.includes(o)||(s.error(`不支持的平台:${o}\n可选平台:${F.join(`, `)}`),i.exit(0)),await n(H,{rawArgs:e.logLevel?[`--logLevel`,e.logLevel]:[]}),await n($,{rawArgs:[`build`,`--platform`,o],data:{logger:r,config:a}})}});r(t({meta:{name:`oiyo`,version:`1.0.0`,description:`Oiyo CLI - 增强型工程框架`},subCommands:{prepare:H,dev:t({meta:{name:`dev`,description:`启动 Oiyo 开发流程`},plugins:[V],args:{target:{type:`positional`,description:`目标平台,如 h5、mp-weixin、app`,required:!1},platform:{type:`string`,description:`通过参数显式指定平台`,alias:[`p`]},...R},async run({args:e,data:t}){let{logger:r,config:a}=t,o=e.target??e.platform??e.p??await I();o||i.exit(0);let s=r.withScope(`CLI`);F.includes(o)||(s.error(`不支持的平台:${o}\n可选平台:${F.join(`, `)}`),i.exit(0)),await n(H,{rawArgs:e.logLevel?[`--logLevel`,e.logLevel]:[]}),await n($,{rawArgs:[`dev`,`--platform`,o],data:{logger:r,config:a}})}}),build:re}}));export{};
7
+ import{createRequire as e}from"node:module";import{defineCommand as t,runCommand as n,runMain as r}from"citty";import i from"node:process";import*as a from"@clack/prompts";import{constants as o,existsSync as s,readFileSync as c,writeFileSync as l}from"node:fs";import{access as u,mkdir as d,readFile as f,writeFile as p}from"node:fs/promises";import{resolveOiyoConfig as m}from"@oiyo/config";import{OiyoModApi as h,OiyoModComponent as g,OiyoModLayout as _,OiyoModRoot as v,OiyoModRoute as y,OiyoState as b,createLogger as x}from"@oiyo/core";import{blue as S,hex as C}from"ansis";import{loadConfig as w}from"c12";import{dirname as T,join as E,normalize as D,parse as ee,posix as O,win32 as k}from"pathe";import{execa as A}from"execa";import{Buffer as j}from"node:buffer";import{execFileSync as M}from"node:child_process";import N from"node:os";const P={h5:`H5`,"mp-weixin":`微信小程序`,"mp-alipay":`支付宝小程序`,"mp-toutiao":`抖音小程序`,"mp-xhs":`小红书小程序`,"mp-harmony":`鸿蒙小程序`,"mp-jd":`京东小程序`,"mp-kuaishou":`快手小程序`,"mp-lark":`飞书小程序`,"mp-baidu":`百度小程序`,"mp-qq":`QQ 小程序`,"quickapp-webview":`快应用 WebView`,"quickapp-webview-huawei":`华为快应用 WebView`,"quickapp-webview-union":`联盟快应用 WebView`,app:`App`,"app-android":`App Android`,"app-ios":`App iOS`,"app-harmony":`App Harmony`},F=Object.keys(P);async function I(){let e=await a.select({message:`请选择开发目标平台`,options:F.map(e=>({label:P[e],value:e,hint:e}))});return a.isCancel(e)?(a.cancel(`已取消平台选择`),null):e}function L(t){return D(e(import.meta.url).resolve(t))}const R={logLevel:{type:`enum`,description:`日志级别: silent | info | verbose`,options:[`silent`,`info`,`verbose`]}};let z=!1;async function B(){let e=`未知`,t=`未知`,n=`未知`,r=L(`@oiyo/framework/package.json`);if(s(r)){let i=JSON.parse(await f(r,`utf8`));e=i.version,t=i.dependencies[`@dcloudio/uni-app`],n=i.dependencies.vue}console.log(`${S(`oiyo v${e}`)} powered by ${C(`#2B9939`)`uni-app(v${t})`} ${C(`#42b983`)`vue(v${n})`}`)}function V(){return{name:`oiyo:context`,async setup(e){z||=(await B(),!0);let t=e.args.logLevel,{config:n}=await w({name:`oiyo`}),r=m(n);e.data={logger:x(t),config:r}}}}const H=t({meta:{name:`prepare`,description:`执行 Oiyo 准备阶段`},plugins:[V],args:{...R},async run({data:e}){let{logger:t,config:n}=e,r=t.withScope(`PREPARE`);try{let e=L(`@dcloudio/vite-plugin-uni/dist/utils/plugin.js`);if(!s(e))return;let t=c(e,`utf-8`),{dir:n}=ee(T(L(`@oiyo/framework`)));l(e,U(t,n))}catch(e){r.error(`初始化失败,请移除 node_modules 并重新安装依赖!\n\n${e.message}`)}let i=new b(n),a=new h(n,{logger:t,oiyoState:i}),o=new g(n,{logger:t,oiyoState:i,oiyoApi:a}),u=new v(n,{logger:t}),d=new _(n,{logger:t,oiyoState:i}),f=new y(n,{logger:t,oiyoState:i,oiyoRoot:u,oiyoLayout:d});await Promise.all([a.scanApis(),o.scanComponents(),f.scanPages(),d.scanLayouts()]),a.writeDeclaration(),o.writeDeclaration(),f.writePagesJson()&&f.writeDeclaration(),d.writeDeclaration(),i.writeDeclarationEntry(),i.markGenerated()}});function U(e,t){let n=`const isOiyoPluginEnabled = process.env.OIYO_PLUGIN || true;\nconst oiyoRoot = "${t}";\nif(isOiyoPluginEnabled && oiyoRoot){\ncliRoot = oiyoRoot\n}\nconst pkg = require(path_1.default.join(cliRoot, "package.json"));`;return e.replace(`const pkg = require(path_1.default.join(cliRoot, 'package.json'));`,n)}async function W(e,t){t.info(`正在调起微信开发者工具`);let n=await G(e.ide?.path?.[`mp-weixin`]);if(!n){t.warn(`未找到微信开发者工具路径,请在 oiyo.config.ts 中配置 ide.path["mp-weixin"]`);return}let r=E(e.rootDir||i.cwd(),`dist`,`dev`,`mp-weixin`);await q(r);let a=await A(n,[`open`,`--project`,r],{reject:!1,windowsHide:!0});t.info(`微信开发者工具已准备就绪`),a.exitCode!==0&&t.warn(`微信开发者工具打开失败,请检查开发者工具服务端口是否已开启`)}async function G(e){if(e)return await Z(e)?e:null;let t=J();if(t&&await Z(t))return t;let n=Y();if(n&&await Z(n))return n;let r=K(i.platform,i.env,N.homedir());for(let e of r)if(await Z(e))return e;return null}function K(e,t,n){return e===`win32`?[k.join(t[`ProgramFiles(x86)`]||``,`Tencent`,`微信web开发者工具`,`cli.bat`),k.join(t.ProgramFiles||``,`Tencent`,`微信web开发者工具`,`cli.bat`),k.join(t.ProgramW6432||``,`Tencent`,`微信web开发者工具`,`cli.bat`),k.join(t.LOCALAPPDATA||``,`Tencent`,`微信web开发者工具`,`cli.bat`)].filter(Boolean):e===`darwin`?[O.join(`/Applications`,`wechatwebdevtools.app`,`Contents`,`MacOS`,`cli`),O.join(`/Applications`,`微信开发者工具.app`,`Contents`,`MacOS`,`cli`),O.join(n,`Applications`,`wechatwebdevtools.app`,`Contents`,`MacOS`,`cli`),O.join(n,`Applications`,`微信开发者工具.app`,`Contents`,`MacOS`,`cli`)]:[]}async function q(e){let t=E(e,`project.config.json`);await Z(t)||(await d(e,{recursive:!0}),await p(t,`${JSON.stringify({appid:`touristappid`,projectname:`oiyo`},null,2)}\n`,`utf8`))}function J(){if(i.platform!==`win32`)return null;let e=[`$paths = @('HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*', 'HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*')`,`$target = '*微信开发者工具*'`,`foreach ($path in $paths) {`,` Get-ItemProperty $path -ErrorAction SilentlyContinue |`,` Where-Object { $_.DisplayName -like $target } |`,` ForEach-Object {`,` if ($_.InstallLocation) {`,` $value = Join-Path $_.InstallLocation 'cli.bat'`,` $bytes = [System.Text.Encoding]::UTF8.GetBytes($value)`,` Write-Output ([Convert]::ToBase64String($bytes))`,` exit`,` }`,` if ($_.DisplayIcon) {`,` $value = Join-Path (Split-Path $_.DisplayIcon -Parent) 'cli.bat'`,` $bytes = [System.Text.Encoding]::UTF8.GetBytes($value)`,` Write-Output ([Convert]::ToBase64String($bytes))`,` exit`,` }`,` }`,`}`].join(`; `);try{return X(e)||null}catch{return null}}function Y(){if(i.platform!==`win32`)return null;let e=[`$path = 'HKCU:\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Compatibility Assistant\\Store'`,`$items = Get-ItemProperty $path -ErrorAction SilentlyContinue`,`if ($items) {`,` $match = $items.PSObject.Properties | Where-Object { $_.Name -like '*微信开发者工具.exe' } | Select-Object -First 1`,` if ($match) {`,` $value = Join-Path (Split-Path $match.Name -Parent) 'cli.bat'`,` $bytes = [System.Text.Encoding]::UTF8.GetBytes($value)`,` Write-Output ([Convert]::ToBase64String($bytes))`,` }`,`}`].join(`; `);try{return X(e)}catch{return null}}function X(e){try{let t=M(`powershell`,[`-NoProfile`,`-ExecutionPolicy`,`Bypass`,`-EncodedCommand`,j.from(e,`utf16le`).toString(`base64`)],{stdio:[`ignore`,`pipe`,`ignore`],windowsHide:!0}).toString(`utf8`).trim();return t&&j.from(t,`base64`).toString(`utf8`).trim()||null}catch{return null}}async function Z(e){if(!e)return!1;try{return await u(e,o.F_OK),!0}catch{return!1}}async function Q(e,t,n){let r=n.withScope(`IDE`);switch(e){case`mp-weixin`:await W(t,r);break;default:r.info(`请手动打开开发者工具,导入 ${S(e)} 产物运行`);break}}const $=t({args:{mode:{type:`positional`,description:`运行模式`,required:!0},platform:{type:`string`,description:`通过参数显式指定平台`,required:!0}},async run({args:e,data:t}){let{config:n,logger:r}=t,a={...i.env,OIYO_UNI_CALLED:`1`},o=te([e.mode,`-p`,e.platform],{env:a});for await(let t of o)if(!t.startsWith(`请注意运行模式下`)&&!t.startsWith(`uni-app 有新版本发布`)){if(e.platform.startsWith(`mp`)&&n.ide?.open&&t.startsWith(`运行方式`)){await Q(e.platform,n,r);continue}i.stdout.write(`${t}\n`)}}});function te(e,t){let n=ne();return A(i.execPath,[n,...e],{stdout:[`pipe`],stderr:[`pipe`,`inherit`],reject:!1,env:t?.env})}function ne(){try{return L(`@dcloudio/vite-plugin-uni/bin/uni.js`)}catch(e){throw Error(`[oiyo] 未找到真实的 UNIAPP CLI,请移除 node_modules 重新安装依赖`,{cause:e})}}const re=t({meta:{name:`build`,description:`启动 Oiyo 构建流程`},plugins:[V],args:{target:{type:`positional`,description:`目标平台,如 h5、mp-weixin、app`,required:!1},platform:{type:`string`,description:`通过参数显式指定平台`,alias:[`p`]},...R},async run({args:e,data:t}){let{logger:r,config:a}=t,o=e.target??e.platform??e.p??await I();o||i.exit(0);let s=r.withScope(`CLI`);F.includes(o)||(s.error(`不支持的平台:${o}\n可选平台:${F.join(`, `)}`),i.exit(0)),await n(H,{rawArgs:e.logLevel?[`--logLevel`,e.logLevel]:[]}),await n($,{rawArgs:[`build`,`--platform`,o],data:{logger:r,config:a}})}});r(t({meta:{name:`oiyo`,version:`1.0.0`,description:`Oiyo CLI - 增强型工程框架`},subCommands:{prepare:H,dev:t({meta:{name:`dev`,description:`启动 Oiyo 开发流程`},plugins:[V],args:{target:{type:`positional`,description:`目标平台,如 h5、mp-weixin、app`,required:!1},platform:{type:`string`,description:`通过参数显式指定平台`,alias:[`p`]},...R},async run({args:e,data:t}){let{logger:r,config:a}=t,o=e.target??e.platform??e.p??await I();o||i.exit(0);let s=r.withScope(`CLI`);F.includes(o)||(s.error(`不支持的平台:${o}\n可选平台:${F.join(`, `)}`),i.exit(0)),await n(H,{rawArgs:e.logLevel?[`--logLevel`,e.logLevel]:[]}),await n($,{rawArgs:[`dev`,`--platform`,o],data:{logger:r,config:a}})}}),build:re}}));export{};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oiyo/cli",
3
3
  "type": "module",
4
- "version": "0.2.1",
4
+ "version": "0.3.0-beta.2",
5
5
  "author": {
6
6
  "name": "skiyee",
7
7
  "email": "319619193@qq.com",
@@ -48,8 +48,8 @@
48
48
  "consola": "^3.4.2",
49
49
  "execa": "^9.5.2",
50
50
  "pathe": "^2.0.3",
51
- "@oiyo/config": "0.2.1",
52
- "@oiyo/core": "0.2.1"
51
+ "@oiyo/config": "0.3.0-beta.2",
52
+ "@oiyo/core": "0.3.0-beta.2"
53
53
  },
54
54
  "scripts": {
55
55
  "build": "tsdown",