From e24dded990b73fc976ec761aacdd5cf6adf59e0b Mon Sep 17 00:00:00 2001 From: "DESKTOP-5RP3AKU\\Jisol" <2858626794@qq.com> Date: Mon, 6 Nov 2023 02:25:02 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E7=BD=AE=E9=85=8D=E7=BD=AE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataTables/Datas/Battle/Role/角色表.xlsx | Bin 10372 -> 0 bytes DataTables/Datas/__enums__.xlsx | Bin 9326 -> 9326 bytes DataTables/Datas/__tables__.xlsx | Bin 9412 -> 9599 bytes DataTables/Datas/战斗/地图.xlsx | Bin 0 -> 9963 bytes DataTables/Datas/战斗/角色/角色战斗素材.xlsx | Bin 0 -> 10119 bytes DataTables/Datas/战斗/角色/角色技能.xlsx | Bin 0 -> 9895 bytes DataTables/Datas/战斗/角色/角色攻击.xlsx | Bin 0 -> 9695 bytes DataTables/Datas/战斗/角色/角色表.xlsx | Bin 0 -> 10173 bytes .../assets/resources/config/data.meta | 9 + .../assets/resources/config/data/schema.ts | 377 +- .../TableGMap.ts.meta => data/schema.ts.meta} | 2 +- .../assets/resources/config/game.meta | 12 - .../assets/resources/config/game/GMap.json | 1 - .../assets/resources/config/game/GRole.json | 1 - .../resources/config/game/GRoleAttack.json | 1 - .../config/game/GRoleAttackBullet.json | 1 - .../config/game/GRoleAttackEffect.json | 1 - .../config/game/GRoleAttackEffect.json.meta | 11 - .../resources/config/game/GRoleSkill.json | 1 - .../config/game/GRoleSkill.json.meta | 11 - .../config/game/GRoleSkillEffect.json | 1 - .../config/game/GRoleSkillEffect.json.meta | 11 - .../config/game/GRoleSkillSpine.json | 1 - .../config/game/GRoleSkillSpine.json.meta | 11 - .../assets/resources/config/json.meta | 9 + .../assets/resources/config/json/tbgmap.json | 12 + .../GRole.json.meta => json/tbgmap.json.meta} | 2 +- .../assets/resources/config/json/tbgrole.json | 60 +- .../tbgrole.json.meta} | 2 +- .../resources/config/json/tbgroleattack.json | 29 + .../tbgroleattack.json.meta} | 2 +- .../config/json/tbgrolebattleres.json | 32 + .../tbgrolebattleres.json.meta} | 2 +- .../resources/config/json/tbgroleskill.json | 22 + .../config/json/tbgroleskill.json.meta | 11 + .../assets/resources/config/ts.meta | 12 - .../assets/resources/config/ts/TableGMap.ts | 55 - .../assets/resources/config/ts/TableGRole.ts | 43 - .../resources/config/ts/TableGRole.ts.meta | 9 - .../resources/config/ts/TableGRoleAttack.ts | 35 - .../config/ts/TableGRoleAttack.ts.meta | 9 - .../config/ts/TableGRoleAttackBullet.ts | 35 - .../config/ts/TableGRoleAttackBullet.ts.meta | 9 - .../config/ts/TableGRoleAttackEffect.ts | 39 - .../config/ts/TableGRoleAttackEffect.ts.meta | 9 - .../resources/config/ts/TableGRoleSkill.ts | 43 - .../config/ts/TableGRoleSkill.ts.meta | 9 - .../config/ts/TableGRoleSkillEffect.ts | 35 - .../config/ts/TableGRoleSkillEffect.ts.meta | 9 - .../config/ts/TableGRoleSkillSpine.ts | 35 - .../config/ts/TableGRoleSkillSpine.ts.meta | 9 - JisolGameCocos/assets/script/App.ts | 100 +- JisolGameCocos/assets/script/Main.ts | 5 +- .../script/battle/base/attack/GAttack.ts | 8 +- .../battle/base/attack/GAttackNormal.ts | 4 +- .../base/attack/GAttackParabolicBangRemote.ts | 15 +- .../script/battle/base/common/map/GMapLoop.ts | 2 - .../script/battle/base/role/GRoleBase.ts | 10 +- .../script/battle/base/role/GRoleDefault.ts | 11 +- .../assets/script/battle/entity/GRole.ts | 13 +- .../assets/script/battle/modes/GOnHookMode.ts | 13 +- .../assets/script/battle/modes/GPVPMode.ts | 6 +- .../assets/script/battle/skill/GSkill.ts | 5 +- .../script/battle/skill/GSkillAngerBase.ts | 5 +- .../script/battle/skill/GSkillCDBase.ts | 4 +- .../妙蛙种子/GSkillBulbasaurDoubleHit.ts | 6 +- .../RoleSkill/疯狂松鼠/GSkillCrazySquirrel.ts | 12 +- JisolGameCocos/config/GRoleAttack.xlsx | Bin 11284 -> 11297 bytes JisolGameCocos/config/GRoleSkill.xlsx | Bin 11522 -> 11530 bytes JisolGameCocos/config/GRoleSkillEffect.xlsx | Bin 11317 -> 11331 bytes .../oops-plugin-excel-to-json/.gitignore | 2 - .../@types/editor.d.ts | 1201 -- .../@types/electron.d.ts | 16092 ---------------- .../@types/extension.d.ts | 57 - .../@types/index.d.ts | 2 - .../@types/message.d.ts | 27 - .../alipay-mini-game/@types/index.d.ts | 19 - .../@types/packages/android/@types/index.d.ts | 73 - .../packages/asset-db/@types/message.d.ts | 179 - .../packages/asset-db/@types/public.d.ts | 115 - .../@types/packages/assets/@types/public.d.ts | 25 - .../baidu-mini-game/@types/index.d.ts | 18 - .../@types/packages/builder/@types/index.d.ts | 2 - .../builder/@types/public/build-plugin.d.ts | 88 - .../builder/@types/public/build-result.d.ts | 190 - .../builder/@types/public/global.d.ts | 7 - .../packages/builder/@types/public/index.d.ts | 100 - .../builder/@types/public/message.d.ts | 40 - .../builder/@types/public/options.d.ts | 134 - .../@types/public/texture-compress.d.ts | 70 - .../bytedance-mini-game/@types/index.d.ts | 25 - .../packages/cocos-play/@types/index.d.ts | 30 - .../packages/console/@types/pritate.d.ts | 25 - .../packages/engine-extends/@types/glTF.d.ts | 684 - .../engine-extends/@types/gltf-validator.d.ts | 109 - .../@types/i18n-well-defined.d.ts | 811 - .../engine-extends/@types/third-parts.d.ts | 156 - .../packages/engine/@types/message.d.ts | 16 - .../packages/huawei-agc/@types/index.d.ts | 49 - .../huawei-quick-game/@types/index.d.ts | 34 - .../packages/ios-app-clip/@types/index.d.ts | 24 - .../@types/packages/ios/@types/index.d.ts | 39 - .../packages/link-sure/@types/index.d.ts | 30 - .../@types/packages/linux/@types/index.d.ts | 3 - .../@types/packages/mac/@types/index.d.ts | 26 - .../@types/packages/ohos/@types/index.d.ts | 36 - .../packages/open-harmonyos/@types/index.d.ts | 38 - .../packages/oppo-mini-game/@types/index.d.ts | 33 - .../packages/package-asset/@types/public.d.ts | 60 - .../@types/packages/preview/@types/index.d.ts | 1 - .../packages/programming/@types/message.d.ts | 19 - .../@types/packages/qtt/@types/index.d.ts | 41 - .../packages/scene/@types/engine-view.d.ts | 73 - .../@types/packages/scene/@types/message.d.ts | 68 - .../@types/packages/scene/@types/public.d.ts | 408 - .../scene/@types/scene-facade-interface.d.ts | 827 - .../packages/server/@types/package.d.ts | 27 - .../packages/shortcuts/@types/shortcut.d.ts | 19 - .../packages/vivo-mini-game/@types/index.d.ts | 33 - .../packages/web-desktop/@types/index.d.ts | 76 - .../packages/web-mobile/@types/index.d.ts | 20 - .../packages/wechatgame/@types/index.d.ts | 81 - .../@types/packages/windows/@types/index.d.ts | 24 - .../xiaomi-quick-game/@types/index.d.ts | 38 - .../oops-plugin-excel-to-json/LICENSE | 21 - .../oops-plugin-excel-to-json/README.md | 22 - .../dist/ExcelToJson.js | 312 - .../dist/JsonToTs.js | 62 - .../oops-plugin-excel-to-json/dist/main.js | 38 - .../oops-plugin-excel-to-json/i18n/en.js | 7 - .../oops-plugin-excel-to-json/i18n/zh.js | 7 - .../package-lock.json | 1911 -- .../oops-plugin-excel-to-json/package.json | 55 - .../src/ExcelToJson.ts | 305 - .../oops-plugin-excel-to-json/src/JsonToTs.ts | 61 - .../oops-plugin-excel-to-json/src/main.ts | 41 - .../oops-plugin-excel-to-json/tsconfig.json | 14 - .../main/java/cfg/TB/Battle/Role/GRole.java | 61 - .../Main/src/main/java/cfg/TB/TbGMap.java | 85 + .../Main/src/main/java/cfg/TB/TbGRole.java | 67 + .../src/main/java/cfg/TB/TbGRoleAttack.java | 55 + .../main/java/cfg/TB/TbGRoleBattleRes.java | 61 + .../src/main/java/cfg/TB/TbGRoleSkill.java | 67 + .../Main/src/main/java/cfg/Tables.java | 12 + .../Main/src/main/java/cfg/TbGMap.java | 37 + .../Main/src/main/java/cfg/TbGRole.java | 18 +- .../Main/src/main/java/cfg/TbGRoleAttack.java | 37 + .../src/main/java/cfg/TbGRoleBattleRes.java | 37 + .../Main/src/main/java/cfg/TbGRoleSkill.java | 37 + .../Main/src/main/resources/json/tbgmap.json | 12 + .../Main/src/main/resources/json/tbgrole.json | 60 +- .../main/resources/json/tbgroleattack.json | 29 + .../main/resources/json/tbgrolebattleres.json | 32 + .../src/main/resources/json/tbgroleskill.json | 22 + 154 files changed, 1214 insertions(+), 26044 deletions(-) delete mode 100644 DataTables/Datas/Battle/Role/角色表.xlsx create mode 100644 DataTables/Datas/战斗/地图.xlsx create mode 100644 DataTables/Datas/战斗/角色/角色战斗素材.xlsx create mode 100644 DataTables/Datas/战斗/角色/角色技能.xlsx create mode 100644 DataTables/Datas/战斗/角色/角色攻击.xlsx create mode 100644 DataTables/Datas/战斗/角色/角色表.xlsx create mode 100644 JisolGameCocos/assets/resources/config/data.meta rename JisolGameCocos/assets/resources/config/{ts/TableGMap.ts.meta => data/schema.ts.meta} (70%) delete mode 100644 JisolGameCocos/assets/resources/config/game.meta delete mode 100644 JisolGameCocos/assets/resources/config/game/GMap.json delete mode 100644 JisolGameCocos/assets/resources/config/game/GRole.json delete mode 100644 JisolGameCocos/assets/resources/config/game/GRoleAttack.json delete mode 100644 JisolGameCocos/assets/resources/config/game/GRoleAttackBullet.json delete mode 100644 JisolGameCocos/assets/resources/config/game/GRoleAttackEffect.json delete mode 100644 JisolGameCocos/assets/resources/config/game/GRoleAttackEffect.json.meta delete mode 100644 JisolGameCocos/assets/resources/config/game/GRoleSkill.json delete mode 100644 JisolGameCocos/assets/resources/config/game/GRoleSkill.json.meta delete mode 100644 JisolGameCocos/assets/resources/config/game/GRoleSkillEffect.json delete mode 100644 JisolGameCocos/assets/resources/config/game/GRoleSkillEffect.json.meta delete mode 100644 JisolGameCocos/assets/resources/config/game/GRoleSkillSpine.json delete mode 100644 JisolGameCocos/assets/resources/config/game/GRoleSkillSpine.json.meta create mode 100644 JisolGameCocos/assets/resources/config/json.meta create mode 100644 JisolGameCocos/assets/resources/config/json/tbgmap.json rename JisolGameCocos/assets/resources/config/{game/GRole.json.meta => json/tbgmap.json.meta} (72%) rename JisolGameCocos/assets/resources/config/{game/GRoleAttackBullet.json.meta => json/tbgrole.json.meta} (72%) create mode 100644 JisolGameCocos/assets/resources/config/json/tbgroleattack.json rename JisolGameCocos/assets/resources/config/{game/GRoleAttack.json.meta => json/tbgroleattack.json.meta} (72%) create mode 100644 JisolGameCocos/assets/resources/config/json/tbgrolebattleres.json rename JisolGameCocos/assets/resources/config/{game/GMap.json.meta => json/tbgrolebattleres.json.meta} (72%) create mode 100644 JisolGameCocos/assets/resources/config/json/tbgroleskill.json create mode 100644 JisolGameCocos/assets/resources/config/json/tbgroleskill.json.meta delete mode 100644 JisolGameCocos/assets/resources/config/ts.meta delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGMap.ts delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGRole.ts delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGRole.ts.meta delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGRoleAttack.ts delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGRoleAttack.ts.meta delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGRoleAttackBullet.ts delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGRoleAttackBullet.ts.meta delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGRoleAttackEffect.ts delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGRoleAttackEffect.ts.meta delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGRoleSkill.ts delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGRoleSkill.ts.meta delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGRoleSkillEffect.ts delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGRoleSkillEffect.ts.meta delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGRoleSkillSpine.ts delete mode 100644 JisolGameCocos/assets/resources/config/ts/TableGRoleSkillSpine.ts.meta delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/.gitignore delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/editor.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/electron.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/extension.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/message.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/alipay-mini-game/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/android/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/asset-db/@types/message.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/asset-db/@types/public.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/assets/@types/public.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/baidu-mini-game/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/builder/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/builder/@types/public/build-plugin.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/builder/@types/public/build-result.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/builder/@types/public/global.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/builder/@types/public/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/builder/@types/public/message.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/builder/@types/public/options.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/builder/@types/public/texture-compress.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/bytedance-mini-game/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/cocos-play/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/console/@types/pritate.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/engine-extends/@types/glTF.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/engine-extends/@types/gltf-validator.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/engine-extends/@types/i18n-well-defined.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/engine-extends/@types/third-parts.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/engine/@types/message.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/huawei-agc/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/huawei-quick-game/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/ios-app-clip/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/ios/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/link-sure/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/linux/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/mac/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/ohos/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/open-harmonyos/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/oppo-mini-game/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/package-asset/@types/public.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/preview/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/programming/@types/message.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/qtt/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/scene/@types/engine-view.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/scene/@types/message.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/scene/@types/public.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/scene/@types/scene-facade-interface.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/server/@types/package.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/shortcuts/@types/shortcut.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/vivo-mini-game/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/web-desktop/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/web-mobile/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/wechatgame/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/windows/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/packages/xiaomi-quick-game/@types/index.d.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/LICENSE delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/README.md delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/dist/ExcelToJson.js delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/dist/JsonToTs.js delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/dist/main.js delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/i18n/en.js delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/i18n/zh.js delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/package-lock.json delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/package.json delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/src/ExcelToJson.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/src/JsonToTs.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/src/main.ts delete mode 100644 JisolGameCocos/extensions/oops-plugin-excel-to-json/tsconfig.json delete mode 100644 JisolGameServer/Main/src/main/java/cfg/TB/Battle/Role/GRole.java create mode 100644 JisolGameServer/Main/src/main/java/cfg/TB/TbGMap.java create mode 100644 JisolGameServer/Main/src/main/java/cfg/TB/TbGRole.java create mode 100644 JisolGameServer/Main/src/main/java/cfg/TB/TbGRoleAttack.java create mode 100644 JisolGameServer/Main/src/main/java/cfg/TB/TbGRoleBattleRes.java create mode 100644 JisolGameServer/Main/src/main/java/cfg/TB/TbGRoleSkill.java create mode 100644 JisolGameServer/Main/src/main/java/cfg/TbGMap.java create mode 100644 JisolGameServer/Main/src/main/java/cfg/TbGRoleAttack.java create mode 100644 JisolGameServer/Main/src/main/java/cfg/TbGRoleBattleRes.java create mode 100644 JisolGameServer/Main/src/main/java/cfg/TbGRoleSkill.java create mode 100644 JisolGameServer/Main/src/main/resources/json/tbgmap.json create mode 100644 JisolGameServer/Main/src/main/resources/json/tbgroleattack.json create mode 100644 JisolGameServer/Main/src/main/resources/json/tbgrolebattleres.json create mode 100644 JisolGameServer/Main/src/main/resources/json/tbgroleskill.json diff --git a/DataTables/Datas/Battle/Role/角色表.xlsx b/DataTables/Datas/Battle/Role/角色表.xlsx deleted file mode 100644 index 04b24ad5bd4329842304a1e075e74b90f4a987ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10372 zcma)C1y~%*vR>TX0)(K!-Q9yj@ZfI278VWe?i$=(g1bX-4GXM$zY4(qnq!I56VuUZ~O_;+1CO#URy>DFWsRL}e# zajI)0eYL`JsF{Raw(#a9RBH+}k%Bx-EQpowXv|#*a>5y0%kpNUls(KxWQFD+XiB5! zb}kwRCW`QA;xbpR?JbDL&lTm}#0Z=tb%nR3dKlL}DWkZmF*xQ6`A~_iW|D50rGMuD zY^8~HblA6?(rMq`HeW;j9p34|lsBr6@ajCmi}6=@je#K3Cwx8Qx@CHqpA9_Xs|Y%b zt6O-V^Sx_G0Tosq8%TQ9fU{6XF=ZpU(iOk#fwm&)i8}3EMie%%`7puM=|PcdeKP6} zZSzSq5@R1@(-$*PZq_oQGCoB}G_zVqIui%6-vSO+etkM#DnSmL0Jnu&WC1&3M{1Z^ zDQaqdKF-j(j{s!rR+*#IMDI9Wp}mL0*xa;3*9Ac;mhQh5ryWI?t=}MCCn+;UHUgJ1 z3!q^(iSe(2oqq9ANEeBh%lk!fyaLByh=+o5rpk2V6X_97#!Q)OElG%OC;MH@7NBHU~gVA-n+S9dw5>CdPji|Cvz-M zg5W+mFqX3jQE;uDlBMKulQ^!%=e&kRAYyUrhi@)B5aiWw<{-RUUez~3zfQQ$&w>t6 z8oo9Rb_Mj+UmSUdbVB^y1*8)uVN{PUKz(!p*56#<j(O z#-bT3iEJbntVv!x=XPOw+k%st&;HFZ*C#E!N{9gI7y!Q@m=H? zbbnz>!&HSsHgKD6?=$Gnvn?g=d8V)mpZrX{+~aK}*aoMZKEb}ov4KS$M?nfG=ay1i zm>ig=s=!y<_ux5*eY>C_W!smZ?;K*}5!`2zp=5X2DAopj_PB^`DX#tUji;bkd=dlsj1`d zVJK8NfFU0i06@S80G|Du>`xVzCr>46YP;l0p?j@3oC~?S5@T~HIpjKoWScm!v0QNZ zJ>$vifecN#JJXgI!P8~tjSmKYy;E~qYH9g6eW;)2v@snWPqK*0AqISl;{81^+~7uV z=EVWk%C#1`^wNHhZm_m@@!cub{>|=Tr-F;&ExG2E*E|4a!KAq26Fcu)PAuRSa8VqM z+#88)gn7A%#v@`SO&a^=fDCKCJZ)e7dsDN$e?<_1!urY-24k}Cj&{yP^-&`YZRlNn zn%~_JZAhHx!rXe}DT9# z_AIp3M!%3?E-;%La%b7kDdv83kpcNw?1gbgRPUKe zmDC$Cn`|6om$mUD{|hz5LdP>_vj)6M5tv(`HKfvnmhpyHPDyjqGOSte$a-uUdw_s) zVa7<8Lon-r8?Y1pGKm3dLZ{Cs@uGZc3}#gmzV1w+Q_S1_V|S{xfa~_UJN(-TWX-U;AszJ&cLzv=7XbB<7is@}C?9^no@ls?l(}=Q&hT*Exh^XPJvWUvz z_p11kw8mPd&&!bE@R!QN0&jM>0UXqOS`oKmV87Lu-E@9)&_MWc_+`vCa&9Wu*I?gO z@@^`>321%z4or5^lt4nte0d|On7$aqF8N{{P39`khirqG_74V#64l%9(KI}|wxO^D znYW-&QM>e#0vA-`J)4MsH}W zGo%v@t2)>#a;o|_NeZZpU8A73a)-uO%ei#W+bBYU9VMCyrwIMn{2HMT;l~k{u{=mF zrNE)9Y~6T%AE4!H14x}}6iK8p#W-E3x-@U#Uitq3O+71b&caDBnqncY3WF%+_doM) z&Bm6Y^f1suzSRo#Pf+f#&rS#O5;4N-VYZRE%7cSeBUTx@`TQLGE})6w1u;FyF6F?1 zt8^mM^oHYLO4Md+FhS*7V4Zau zPPp~e-Z`9I3p@}N1d6t(Rj{UsFZcbTTvTdLM*qyx&OWLBiH0-)sbyRU2717)C(&?7F@m2{A6~$d8MMMsLUN;+i z_R+p})+n|qQQ-iQ(Q~h61QTBcG&?vfv(zB*V9EJT`4UQ@J{G7sm$0MA%1>-fejfR}j6fU@(@`)Q7 zP7Q5#$@>_R^z<1o%T&!jp0)OWRWMWw&rR6DWBOs*+G35T*>4zy@_dcE&2lR$&ra`h z$+nSe5)M3f=&~S5@1atS8PIWGH#F8|9iLACuqUoS5Pk#eLzWB&09MHWXx*=w2RQ9Q z6*vG_IQWE!(Ag{VSOAg-UO+Jdl;X8|v4rqqxh0t$1-Wp}2)U07%S*^|VCb9rHUTG1 zs2bms@c9oIW&$R(xG_<+kdDW*4g+s-i3ToOFHxC5D|d8UUT6){#`{bn#|z2u@X6mTqqOnp_>WYt|h=8 zAcShtiGW;B9Wng{McIBz%rssuyy;?ym__0N>OW7DPwVi`-Dh2A z#G^2kY}9k7Q6yn-qnXr3d*ut*FG;>ngSNRQ=iRJS&lmrQb{T_P&7^n0)f>&$3miOa zzhP1d8V`+0Fki~{D#9g+3*^t$Ttvx?3eH+WiBaVaXWqd728%@Ie*>501wuP43&@A| z^`yM8=aNbozHo6if$!B=UgH^BT}lYYrgOzUQlJ3CT*`kPx2^a*FU>LrnXrbvD4447 zR%%kC6&W>Y91i&f+siZI!9J;0%Ba9@iP{#4!N4CZzT+(4VVPg|G4*d2AfopwcZb_5 zvI%vMcefL@=@YQjfBalSn40yel0C$%)l327b*VIAq*cj%SEl{V|ys zLyD6+PX0_FzYdr zG8s*oQ;K#&MTi1LyYMPNseZ?G>`%kH0fjNifzc%S^Pyv3*&O>)fU};U12RKxgKbhF z%29+3mQ1?zYn>?j;U7L(Mv0eFQMhDv_E04x(=3M1QOL*&CbnaJ&a|Yx0efq&Z}7GA z8I`GdPpN zNV6sC<#2O=doKR@^=DVk*AuR)i)`PWJd5c2#Ej|*K5&%TH<1@ZE?Is!P)Ky|<>Yi( zd!mki@i;|Hq~^SpPk4!^d{!+N=0i9|Gec4k2H$5fk8*lk#$GjQ z5wfPf0wZ#1FythxF31jwapW2@;eDA?Gi@8WD}@)G4GvUyT_HG0^RIuICDtM-?dVHs z&6sIGU2WD{3H3|~f!Jy96+1cN3Mn0__Uww5F|Fy`J-UTu@v{N?*LGi(tXY^=C5GvE zw@bo&&r~b%AuR**tpnmUxHR~R6}T!|B)Sc)=GqsfB*!tw)FvENU%AM4hVih`FLY_q z13zyvsE?qFwbt=@kS=|XThO#zn&-*c!$b$udSzC+2L>4^Y0GabPDgN=YFIh*?43t# zK{DkyCsG=gcv*dOX0TO@1}nh%bM4(4H0sqev+HKk$>)y=(f@d$0S_UeM++!gSqErC@P<~AV4vz1vO&y*#KeIYE(F+fwMC7t+ZQELg&-p&WAY%-t+Vq_3B6at*A%c35|`gc^$K8LCOP!D1L?36h-;qUz|>;ykYx%`Lg0}S#oqQ zl(pFbm9^8s09c$6{hB^xaIcVcgP5=TZKu6)b$oyMJx>+8TlIOfKDm&Jw?3c{)6~Vi zYzIXnjsvDfZrmD(vXXSrpi5FK!#Z=MGm#9rN@0?ciC=f)?E0~+=&-}>K2Fc+%XzTy zmZBopAdk%E?r;Yi*aK99IWN_?N&JJ$bOh42EKHO_-DupJ#^A_uEK&*?x>}B36?H_*H`jj?<^&wP!*&Y0uql9&~pIwqQ zTp;~%uUrxnt4O@dP7Xwg^b{)T?MAIb%9XAqaC)GC^GxF&x6{zSj#U6y>)7T9%l+060&BxyDx5~j{nE0`kuuS^s_ zpH?z86NeE*x^@40U!yOT`b~A{xD0>08EHQ)_D=Lu#1Fiso{J%1LXL7sabGhEmwZgtg{@z* zlvEj{r(7zIb{CZmTCg8h<;4npDl*@8(jz0cJb~2Y$xLptC^XN-f@=V}WGD&cIDpK> zZ}nxmT{Z{9m0qS@uQrb)Iixk!qFS9Us{;`Ci?{qV`uM(8wjQEmZkfI#h zSL2-UCBw_GE0=3Mw;A;}ZD)K%y%(!>FL1wcdw-GTHTAa+=RU~sM68wXsaE+VaYfA-gAro)2dWo_2}77FUF0S1`TaCrl=G zCbbk_MF91c}_1qEv%B7=w-iIMFp zi-?JWCB^aqLWX)LE>|3ZifEZ2n;sZwtOs%lGPR^LEK_AIS8DE7FHtno13_hc%H5O@ zED#N4(_5~D%L~{zZWIUiec^pnS@CDBOl&;trXE?i$Uax5dwigj^!PtM)8Fqzb!6u+ zvLn84?YlD%AD;_QZ@8^_zJ_6H4n_i7>}S}9Y$Q#QUh&|1M7yuQa-~4I3Z+^!_eYnB z_exO^&uLa~DIi5b(;>D>-=`;!w7V81m}c&|!jIsa%E!6|y~OQG4%g^%M@AJ`c}J*z zTjPwsIrtIg&O;vi?Ugb0`mHYK{99a&ItNWxc_Hc5SF-YUf}=do6)^)B6mda-YGH03~&S<}0&G=T%kI&2ct|ip#^Y-S7H=mFv6Q`7f zy&Qnjz!#zxbGpcz=;6G5h**J&_+B81e1n!k@*OuF*VXRn?S@c4rXvV16uwu;^BBP= zZPC3)o1Bh%P)BVrdNMts&c+cI8z0+@0aGTGE^!Bb^aKeK6XB&3G@7-MYbi4@7F~w` zmpG$R3>+|&+TrSbOJWG8X((#wLxTjtO$NH=ukK+J#iF!yJ5PRN9*v2Si8U#MP%bCf z%yo6Lan!pKO}v=par%yI)dv%(1;k&U>6g@69JGVDXat}8)}(ChDi7&OWkkK#0TK2aBs-)_T+58BQTGidG@^1| zTyc(zR)q1|cL%eDikV_&4*o+&(nICEo|!I;QgdCofp?V@C};t`DkPicma6XwGHY96 zYD<(1EnTPto#FSqewu!9C^0Hl%f)>3hFHWm{Osvsv_vYKr2T^RP zgg8x|Zw0RNF-?S8_84|5@f307Q;0gHGxz=N5$zTQQJ0_hK)nOgM0ym_JXiyZY!41J z=Ox6xzO{bVqPxUg#@9-ymRDcfYLyaJSm%YBLdq1==2cFR?0%PLq&^CM6$eK5vD6`M z0mn%RfjA+(!!xXgcV*$TvOfTRfW7y`P2abzf^HuEo>QSQ?0{E!%%_CH0{~CC#K+SL z2Ma@xsfmgs=&h~!&(-Rf`UG&A8M}l0NJ#u3r67=nG@%JD{{Wbk3)bah7Q<3&1t3C!@h4*aosrPta)JF` zZIIa?buADysM#@U ztL?+^p6^{h^r#cNIdmVP?+CcX&S@IDoNSH#vsjeU?8s*9q>xq3e2fv>AaslPuCEUB zy9md+AZT@)1gBh?k|N_k(TpkP$+d4T4}xf=MYW_z8j&Vdgq_!?4;k^rC-i$R6Z7N- zi?&q$6TG~)R}5b6xp_kdbj$8oE}c=W`mBq2)5RyG%lCrImT0fx^6-eyLW=MB=Ygh^ zR3Gy4)L*zPe?s6f+(OTcXbn%XqOg$*&19Qn)Z;oWbk`le=a|X$Po6R~tInM%*RgeN zi*NhBwU9RPvVEy|B_(-E#x2^(7R7-`X8CZ8A#S2VxxL@DlcP~Wu(2>XhS0*}{nvh# zPEfO2dmp$-h}ZHZAKHo4*zRqV1RT}WbcA7TzDMe)y1qQK%DqgN{@*(x=}24v^G6m5s}nxumyCcwtEb&kWbBASFEje93#nUw4);BF&*F+yRZ*W^ST)Gu`M&u6QvDiT z<@-$OT;-(l?QeN}bKl3lTAT-x(wZYZi)J;jprc9@zy{x+J2nDvw%Aex$knaPy!QTeZZMEhY`@W)Q*(;UbX0)49x z9}JsX)Nurx_Dm)VAutug#gC2iJOV(vbdfh}WRz{*7(tF%9Lx+xZV9wG^ai2@R!8&i zA&{uNy_Hi7N2HUWn7pGGVQ5>dE)W-7_g!9EB_>whDYA0FY=*y*c!An(t{O}kTX6-- zbmG4co+1<}7i3*1^VlE7kKfQ;j6)ypl~KZM04-uMPSEC*=^E(n;uTG63V!Ee6jHed z{O9A!$9x<>A7pC%d$P`*+qv!G@!iT}1VH*jhVeYb`x4|MC^vC&O{|2BWZJR?P{u7~m@YcL;8{M)H-s*1u{d>pTec!Z3} z{W;rh6>W!)CHk{oD9ZDHT&4|iZ-uqz4s5#u0!zP-uL`8(iA}K4ZK}p*I9bQwMEHB; zed$C$dj$*2GXZiE965B62`;ZNV?cSO6Zl>wY;jAc)1E$MKu3W%>}B@YmGJcRPEU92 zly=>S6mP)G-0u$*tOI?UN$&(X^rb+@3}r6=8O#4Y`u!(3x4^m2_8(zvd4!YT@%k7{ ze~JCIH~$M=%U)*W{zLzE|0z%VPmwGV8G8NMa~19YV>)jOBRE;@w8pH#9L;RUWF6$J zfX+jzk%gt^!x=P6OJin56CP@0#%snbNlWfBmdi9iZ20)r{DA;eREN4lt3boKa6WK(%#qUh;-kte?)=JKoh39Xm6oc(! zHXquJ)#_1Ka&Hb;z=`nkk@CAjJVUM&{hYIdu((@tAtL(0?{sj21{Cxh3g4erT#lt4 z(ew52c*eQ$hHE2#OhqnwA2maAJZeu9Yc0!*_pJTWe(SgM@!}&b2lK~)j`Da${&YUB zEe5o8G_`fqSAAz^>Y)2H;42bF6d+l!gDxmLdh@l}RO}2R3=P&yODNW%X3o3VPm?nJ zz~`AX29P4Y5oyxA`&XS0x9!LhbXH+6#b=gh%k|GRAQapRmdeeD>2TchQMN_EQQPMDvg^ZT;(wGE z;Joe9)o>7*8>%J3g3Hp5D9hP&40`S3zg#H^YCN}> zebnbLZMWK?cufBP{PN33lIdC&-Xmy}muiB-fFKVPFGa4F6Lg);{4w&3WlFH3R4_ps zFld?{9wfY?ywq^1%L=s3!FZ0O4CU1Xt*osm#)hvzG84Fla^a%Xl3BOZOI$I3e$SSG zBSMa`1j_`o3^zc(>WOHJ6ud`P54vapf@3H^g0cpOL5P347PK^f9%z$6Q|5M4xi@Wf zhit*Suy3zT-WTh-4(hnoaQ-2_onKtFPxW)v%!&g_6TvChz-+10>^i}NWiz^h89R4V zUgRK7H|f{g)935U$NO`Fe}@i3)tYxa5T0|Po%t@giOA(g+3YkWR#JZk})OZ zuDN^feB;(_$gRQu#MloV^e78Y=qRGmkhlY+t@r+aNWTHI1_QJK4q#R(Aa(-)02vAZ z02lz1J|r5m;sj6ue;I*_{^%Sqg#GVKsw+ zW*qvp1B|spFZ9pPAm0(ELG1)6n`Pifs>mZwr?nG|wbRJ&e}9nZtoDJi_BoydzGl6A z7;RyFe;A(ko8QqAfhz3|qfMu&KeDO_I*RsD6PvU5AsG?q%eX0_)jKu(pIcydS&K@E zd@|;&@}L2Lvna7@Ptirx1AQjSdZoqm~|2T zHsYp>7_<@de=cI!M%;E0r)|W-AVB%eYR}q;JBv`?iz4XWH9WY6$2~&;WH*dMnnR2$ z^Kr&4!qzZ#4Kvqp;~M6!;np=Qtl^!DbBBvAV$??5cM*{zpNB5Q*|x_n;(gm%ghJy{ zO>We*siy56W*YDg(~%?H>jMx+yHf*!|3)*BBi`A8e<+T6Z!E;_>D)Ekx`u@{>?L-n zyE_1R=g#Q&0L0P!!vTmR1vm>0l~BIf5_4>s4wDnU*2kOh61FXXrwBSpV>Ku00!~zY zo&?PcIE_lYCf_h$(?WO|S%GWlLkH*PIMZ{4Zu_)>D-?lGH1wgm6=Tvq zK#?l$Dl?JW(kpRE_%r;}kAS`i>N%l5xo~mFko;!R9)OT4ZynoBRWlAsiaB fatIO`1diF`hqH(wngR)6Rw*EM0{{RSlPe@cMy1cF delta 957 zcmV;u148`nNbX3mlmP_T6&W{^m;o(+Lq}*kP}#|WV29!@B;U4Tla?gf?dThL(wpz$ z`>4-h+HQ42@tFMo`Q?|7B$Kr)y+_cds8ou=fFKVPuSB7iDVpa~e~dh1nG&q56r^Ya z22HZ#qlDL#R~oK#RfDz#7|)TEp}bDf%G#P@Z1@T!Gl6R;7cMF-nRQFO#5Lo8_iPC` zBIE>1uuL$^a0~S7frz$9!3Sjhpvw**IEE4=C~I&Sg!rdxK}+-JfiBr=%EE4H_ol7x zK3niU9NKGB48^8tf+p@XoPUUKXP4LAQ~g44*^aJc#?IW7 z7X^s3P4@Nn^!fVo@&26P-=RZ8b>=+}gy&pnZ@x=z;`57qin54Ap-;v>8RaCVWK0RU zYwtcd-@5f1a%=EEG4?|T9pw?BB%<-@9&rcAI`6~(kbMKQ1_QJK4z?g?Lv{lI02>Mb z02lz1J|r5m;sj6ue~U&Sqdz){nnQ}9$+17T`Q}VoJEOMgNiPq9w;q1_8=%R(sY)+*ySBUKBz1uHnHoJnk6+AiH54(i~!3 znU6DW5w?b@YnZu)8`m&*4Y#ggVGZwGoI6}}5u-NZzKe()`8;$X&bB>v5%1g9A`}{r zYI38dO*L)rFw=l{n2sFjULSxs+MOB*{5P739P!Q$e?)QAdt)JXPv@@T)-^1wVK1>m z-Q5AmJ9kFE2Oy5-9}YkqDZpuHsD$#(mY8G9beNp*wLaj4m#}RCJVnq+8ml=|7jUNP z^CW0qz-d(CHTj15nij&#$O>FTA38WU$C;i>R%$D>^CgpTdfTTBT%rhkqM;Aftr(N` z0g6;{DxZnmmR^ZV!k_71xU+$77^iSu(zm1-m5fV{sZ^(&2{zYJ)FPW}-Q*vWAsiaB fatIO`1lScBH?xQ#ngR*7AZJ5%0{{RUlPe@cn`p=% diff --git a/DataTables/Datas/__tables__.xlsx b/DataTables/Datas/__tables__.xlsx index e3a9799374be23be52124fe6aa69267fb59c585f..5dff1ecc235c3b5570e267926ade291bca8d2e1f 100644 GIT binary patch delta 2274 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 literal 0 HcmV?d00001 diff --git a/JisolGameCocos/assets/resources/config/data.meta b/JisolGameCocos/assets/resources/config/data.meta new file mode 100644 index 00000000..16541102 --- /dev/null +++ b/JisolGameCocos/assets/resources/config/data.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.2.0", + "importer": "directory", + "imported": true, + "uuid": "273309e9-d062-41df-9f3c-dc7671bdbc72", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/resources/config/data/schema.ts b/JisolGameCocos/assets/resources/config/data/schema.ts index 6640820d..737d4e14 100644 --- a/JisolGameCocos/assets/resources/config/data/schema.ts +++ b/JisolGameCocos/assets/resources/config/data/schema.ts @@ -12,64 +12,379 @@ -export namespace TB {export namespace Battle {export namespace Role { -export class GRole { +export namespace TB { +export class TbGRole { constructor(_json_: any) { if (_json_.id === undefined) { throw new Error() } this.id = _json_.id - if (_json_.name === undefined) { throw new Error() } - this.name = _json_.name - if (_json_.price === undefined) { throw new Error() } - this.price = _json_.price - if(_json_.expire_time != undefined) { this.expireTime = _json_.expire_time } else { this.expireTime = undefined } + if (_json_.roleName === undefined) { throw new Error() } + this.roleName = _json_.roleName + if (_json_.spine === undefined) { throw new Error() } + this.spine = _json_.spine + if (_json_.roleSkillIds === undefined) { throw new Error() } + { this.roleSkillIds = []; for(let _ele of _json_.roleSkillIds) { let _e; _e = _ele; this.roleSkillIds.push(_e);}} + if (_json_.roleAttackRange === undefined) { throw new Error() } + this.roleAttackRange = _json_.roleAttackRange } /** - * 这是id + * id */ readonly id: number /** - * 名字 + * 角色名称 */ - readonly name: string + readonly roleName: string /** - * 价格 + * 描述 */ - readonly price: number + readonly spine: string /** - * 过期时间 + * 角色技能Id列表 */ - readonly expireTime: number|undefined + readonly roleSkillIds: number[] + /** + * 角色攻击范围 + */ + readonly roleAttackRange: number resolve(tables:Tables) { } } -}}} +} + + +export namespace TB { +export class TbGMap { + + constructor(_json_: any) { + if (_json_.id === undefined) { throw new Error() } + this.id = _json_.id + if (_json_.mapName === undefined) { throw new Error() } + this.mapName = _json_.mapName + if (_json_.map1 === undefined) { throw new Error() } + this.map1 = _json_.map1 + if (_json_.map2 === undefined) { throw new Error() } + this.map2 = _json_.map2 + if (_json_.map3 === undefined) { throw new Error() } + this.map3 = _json_.map3 + if (_json_.map1OffsetY === undefined) { throw new Error() } + this.map1OffsetY = _json_.map1OffsetY + if (_json_.map2OffsetY === undefined) { throw new Error() } + this.map2OffsetY = _json_.map2OffsetY + if (_json_.map3OffsetY === undefined) { throw new Error() } + this.map3OffsetY = _json_.map3OffsetY + } + + /** + * id + */ + readonly id: number + /** + * 地图名称 + */ + readonly mapName: string + /** + * 地图1(前) + */ + readonly map1: string + /** + * 地图2(后) + */ + readonly map2: string + /** + * 地图3(天空) + */ + readonly map3: string + /** + * 地图1(前) 偏移量Y + */ + readonly map1OffsetY: number + /** + * 地图2(后) 偏移量Y + */ + readonly map2OffsetY: number + /** + * 地图2(后) 偏移量Y + */ + readonly map3OffsetY: number + + resolve(tables:Tables) + { + } +} + +} + + +export namespace TB { +export class TbGRoleAttack { + + constructor(_json_: any) { + if (_json_.id === undefined) { throw new Error() } + this.id = _json_.id + if (_json_.attackWay === undefined) { throw new Error() } + this.attackWay = _json_.attackWay + if (_json_.attackArgs === undefined) { throw new Error() } + { this.attackArgs = []; for(let _ele of _json_.attackArgs) { let _e; _e = _ele; this.attackArgs.push(_e);}} + } + + /** + * 角色Id + */ + readonly id: number + /** + * 攻击方式 + */ + readonly attackWay: string + /** + * 攻击参数 + */ + readonly attackArgs: string[] + + resolve(tables:Tables) + { + } +} + +} + + +export namespace TB { +export class TbGRoleBattleRes { + + constructor(_json_: any) { + if (_json_.id === undefined) { throw new Error() } + this.id = _json_.id + if (_json_.resName === undefined) { throw new Error() } + this.resName = _json_.resName + if (_json_.resType === undefined) { throw new Error() } + this.resType = _json_.resType + if (_json_.resSrc === undefined) { throw new Error() } + this.resSrc = _json_.resSrc + } + + /** + * id + */ + readonly id: number + /** + * 资源名称 + */ + readonly resName: string + /** + * 资源类型 + */ + readonly resType: string + /** + * 资源地址 + */ + readonly resSrc: string + + resolve(tables:Tables) + { + } +} + +} + + +export namespace TB { +export class TbGRoleSkill { + + constructor(_json_: any) { + if (_json_.id === undefined) { throw new Error() } + this.id = _json_.id + if (_json_.skillName === undefined) { throw new Error() } + this.skillName = _json_.skillName + if (_json_.skillController === undefined) { throw new Error() } + this.skillController = _json_.skillController + if (_json_.skillArgs === undefined) { throw new Error() } + { this.skillArgs = []; for(let _ele of _json_.skillArgs) { let _e; _e = _ele; this.skillArgs.push(_e);}} + if (_json_.skillText === undefined) { throw new Error() } + this.skillText = _json_.skillText + } + + /** + * 角色Id + */ + readonly id: number + /** + * 技能名称 + */ + readonly skillName: string + /** + * 技能控制器 + */ + readonly skillController: string + /** + * 技能参数 + */ + readonly skillArgs: string[] + /** + * 技能介绍 + */ + readonly skillText: string + + resolve(tables:Tables) + { + } +} + +} export class TbGRole{ - private _dataMap: Map - private _dataList: TB.Battle.Role.GRole[] + private _dataMap: Map + private _dataList: TB.TbGRole[] constructor(_json_: any) { - this._dataMap = new Map() + this._dataMap = new Map() this._dataList = [] for(var _json2_ of _json_) { - let _v: TB.Battle.Role.GRole - _v = new TB.Battle.Role.GRole(_json2_) + let _v: TB.TbGRole + _v = new TB.TbGRole(_json2_) this._dataList.push(_v) this._dataMap.set(_v.id, _v) } } - getDataMap(): Map { return this._dataMap; } - getDataList(): TB.Battle.Role.GRole[] { return this._dataList; } + getDataMap(): Map { return this._dataMap; } + getDataList(): TB.TbGRole[] { return this._dataList; } - get(key: number): TB.Battle.Role.GRole | undefined { return this._dataMap.get(key); } + get(key: number): TB.TbGRole | undefined { return this._dataMap.get(key); } + + resolve(tables:Tables) + { + for(let data of this._dataList) + { + data.resolve(tables) + } + } + +} + + + + +export class TbGMap{ + private _dataMap: Map + private _dataList: TB.TbGMap[] + constructor(_json_: any) { + this._dataMap = new Map() + this._dataList = [] + for(var _json2_ of _json_) { + let _v: TB.TbGMap + _v = new TB.TbGMap(_json2_) + this._dataList.push(_v) + this._dataMap.set(_v.id, _v) + } + } + + getDataMap(): Map { return this._dataMap; } + getDataList(): TB.TbGMap[] { return this._dataList; } + + get(key: number): TB.TbGMap | undefined { return this._dataMap.get(key); } + + resolve(tables:Tables) + { + for(let data of this._dataList) + { + data.resolve(tables) + } + } + +} + + + + +export class TbGRoleAttack{ + private _dataMap: Map + private _dataList: TB.TbGRoleAttack[] + constructor(_json_: any) { + this._dataMap = new Map() + this._dataList = [] + for(var _json2_ of _json_) { + let _v: TB.TbGRoleAttack + _v = new TB.TbGRoleAttack(_json2_) + this._dataList.push(_v) + this._dataMap.set(_v.id, _v) + } + } + + getDataMap(): Map { return this._dataMap; } + getDataList(): TB.TbGRoleAttack[] { return this._dataList; } + + get(key: number): TB.TbGRoleAttack | undefined { return this._dataMap.get(key); } + + resolve(tables:Tables) + { + for(let data of this._dataList) + { + data.resolve(tables) + } + } + +} + + + + +export class TbGRoleBattleRes{ + private _dataMap: Map + private _dataList: TB.TbGRoleBattleRes[] + constructor(_json_: any) { + this._dataMap = new Map() + this._dataList = [] + for(var _json2_ of _json_) { + let _v: TB.TbGRoleBattleRes + _v = new TB.TbGRoleBattleRes(_json2_) + this._dataList.push(_v) + this._dataMap.set(_v.id, _v) + } + } + + getDataMap(): Map { return this._dataMap; } + getDataList(): TB.TbGRoleBattleRes[] { return this._dataList; } + + get(key: number): TB.TbGRoleBattleRes | undefined { return this._dataMap.get(key); } + + resolve(tables:Tables) + { + for(let data of this._dataList) + { + data.resolve(tables) + } + } + +} + + + + +export class TbGRoleSkill{ + private _dataMap: Map + private _dataList: TB.TbGRoleSkill[] + constructor(_json_: any) { + this._dataMap = new Map() + this._dataList = [] + for(var _json2_ of _json_) { + let _v: TB.TbGRoleSkill + _v = new TB.TbGRoleSkill(_json2_) + this._dataList.push(_v) + this._dataMap.set(_v.id, _v) + } + } + + getDataMap(): Map { return this._dataMap; } + getDataList(): TB.TbGRoleSkill[] { return this._dataList; } + + get(key: number): TB.TbGRoleSkill | undefined { return this._dataMap.get(key); } resolve(tables:Tables) { @@ -89,10 +404,26 @@ type JsonLoader = (file: string) => any export class Tables { private _TbGRole: TbGRole get TbGRole(): TbGRole { return this._TbGRole;} + private _TbGMap: TbGMap + get TbGMap(): TbGMap { return this._TbGMap;} + private _TbGRoleAttack: TbGRoleAttack + get TbGRoleAttack(): TbGRoleAttack { return this._TbGRoleAttack;} + private _TbGRoleBattleRes: TbGRoleBattleRes + get TbGRoleBattleRes(): TbGRoleBattleRes { return this._TbGRoleBattleRes;} + private _TbGRoleSkill: TbGRoleSkill + get TbGRoleSkill(): TbGRoleSkill { return this._TbGRoleSkill;} constructor(loader: JsonLoader) { this._TbGRole = new TbGRole(loader('tbgrole')) + this._TbGMap = new TbGMap(loader('tbgmap')) + this._TbGRoleAttack = new TbGRoleAttack(loader('tbgroleattack')) + this._TbGRoleBattleRes = new TbGRoleBattleRes(loader('tbgrolebattleres')) + this._TbGRoleSkill = new TbGRoleSkill(loader('tbgroleskill')) this._TbGRole.resolve(this) + this._TbGMap.resolve(this) + this._TbGRoleAttack.resolve(this) + this._TbGRoleBattleRes.resolve(this) + this._TbGRoleSkill.resolve(this) } } diff --git a/JisolGameCocos/assets/resources/config/ts/TableGMap.ts.meta b/JisolGameCocos/assets/resources/config/data/schema.ts.meta similarity index 70% rename from JisolGameCocos/assets/resources/config/ts/TableGMap.ts.meta rename to JisolGameCocos/assets/resources/config/data/schema.ts.meta index 2642a69a..9e42284f 100644 --- a/JisolGameCocos/assets/resources/config/ts/TableGMap.ts.meta +++ b/JisolGameCocos/assets/resources/config/data/schema.ts.meta @@ -2,7 +2,7 @@ "ver": "4.0.23", "importer": "typescript", "imported": true, - "uuid": "57cb0026-1494-41ca-948c-346b43746aa7", + "uuid": "1c41fdd4-f2b5-4bbf-b81e-2245a40e519e", "files": [], "subMetas": {}, "userData": {} diff --git a/JisolGameCocos/assets/resources/config/game.meta b/JisolGameCocos/assets/resources/config/game.meta deleted file mode 100644 index 745782d9..00000000 --- a/JisolGameCocos/assets/resources/config/game.meta +++ /dev/null @@ -1,12 +0,0 @@ -{ - "ver": "1.2.0", - "importer": "directory", - "imported": true, - "uuid": "372dfc13-f415-4871-98be-49856636b095", - "files": [], - "subMetas": {}, - "userData": { - "compressionType": {}, - "isRemoteBundle": {} - } -} diff --git a/JisolGameCocos/assets/resources/config/game/GMap.json b/JisolGameCocos/assets/resources/config/game/GMap.json deleted file mode 100644 index a0ca9626..00000000 --- a/JisolGameCocos/assets/resources/config/game/GMap.json +++ /dev/null @@ -1 +0,0 @@ -{"60001":{"id":60001,"mapName":"天空城","map1":"map/MAP6/MAP6_1/spriteFrame","map2":"map/MAP6/MAP6_2/spriteFrame","map3":"map/MAP6/MAP6_3/spriteFrame","map1OffsetY":100,"map2OffsetY":400,"map3OffsetY":400}} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/game/GRole.json b/JisolGameCocos/assets/resources/config/game/GRole.json deleted file mode 100644 index 5b08c8fd..00000000 --- a/JisolGameCocos/assets/resources/config/game/GRole.json +++ /dev/null @@ -1 +0,0 @@ -{"10001":{"id":10001,"roleName":"小石头","spine":"spine/召唤与合成819个Spine/小石头/guaiA1a/spine/guaiA1a","roleSkillIds":[],"roleAttackRange":100},"10002":{"id":10002,"roleName":"坚强小石","spine":"spine/召唤与合成819个Spine/坚强小石/guaiA1a_1/spine/guaiA1a","roleSkillIds":[],"roleAttackRange":100},"10003":{"id":10003,"roleName":"疯狂松鼠","spine":"spine/召唤与合成819个Spine/疯狂松鼠/guaiA4e_2/spine/guaiA4e","roleSkillIds":[40001],"roleAttackRange":500},"10004":{"id":10004,"roleName":"妙蛙种子","spine":"spine/神奇宝贝/001妙蛙种子/spine/001妙蛙种子","roleSkillIds":[40002],"roleAttackRange":350}} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/game/GRoleAttack.json b/JisolGameCocos/assets/resources/config/game/GRoleAttack.json deleted file mode 100644 index 8e7c2bd6..00000000 --- a/JisolGameCocos/assets/resources/config/game/GRoleAttack.json +++ /dev/null @@ -1 +0,0 @@ -{"10001":{"roleId":10001,"attackWay":"Normal","attackArgs":[]},"10002":{"roleId":10002,"attackWay":"Normal","attackArgs":[]},"10003":{"roleId":10003,"attackWay":"ParabolicBangRemote","attackArgs":["20001","30001","timo5 007","0.6","100","100"]},"10004":{"roleId":10004,"attackWay":"Normal","attackArgs":[]}} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/game/GRoleAttackBullet.json b/JisolGameCocos/assets/resources/config/game/GRoleAttackBullet.json deleted file mode 100644 index 323febd2..00000000 --- a/JisolGameCocos/assets/resources/config/game/GRoleAttackBullet.json +++ /dev/null @@ -1 +0,0 @@ -{"20001":{"id":20001,"bulletName":"炸弹","bulletSrc":"bullets/疯狂松鼠/attack/spriteFrame"}} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/game/GRoleAttackEffect.json b/JisolGameCocos/assets/resources/config/game/GRoleAttackEffect.json deleted file mode 100644 index a9559c27..00000000 --- a/JisolGameCocos/assets/resources/config/game/GRoleAttackEffect.json +++ /dev/null @@ -1 +0,0 @@ -{"30001":{"id":30001,"effectName":"爆炸","spine":"effect/爆炸效果/shouji_01/spine/shouji_01","animation":"animation"}} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/game/GRoleAttackEffect.json.meta b/JisolGameCocos/assets/resources/config/game/GRoleAttackEffect.json.meta deleted file mode 100644 index 33601967..00000000 --- a/JisolGameCocos/assets/resources/config/game/GRoleAttackEffect.json.meta +++ /dev/null @@ -1,11 +0,0 @@ -{ - "ver": "2.0.1", - "importer": "json", - "imported": true, - "uuid": "2b1b909f-c98c-40be-8840-601980d86769", - "files": [ - ".json" - ], - "subMetas": {}, - "userData": {} -} diff --git a/JisolGameCocos/assets/resources/config/game/GRoleSkill.json b/JisolGameCocos/assets/resources/config/game/GRoleSkill.json deleted file mode 100644 index 5bb72942..00000000 --- a/JisolGameCocos/assets/resources/config/game/GRoleSkill.json +++ /dev/null @@ -1 +0,0 @@ -{"40001":{"id":40001,"skillName":"疯狂松鼠","skillController":"GSkillCrazySquirrel","skillArgs":["5","250","250"],"skillText":"疯狂松鼠的技能 丢出巨大炸弹 轰炸全部玩家"},"40002":{"id":40002,"skillName":"妙蛙种子连击","skillController":"GSkillBulbasaurDoubleHit","skillArgs":["8"],"skillText":"妙蛙种子攻击8次 触发一次射叶子技能"}} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/game/GRoleSkill.json.meta b/JisolGameCocos/assets/resources/config/game/GRoleSkill.json.meta deleted file mode 100644 index 86b5c3f8..00000000 --- a/JisolGameCocos/assets/resources/config/game/GRoleSkill.json.meta +++ /dev/null @@ -1,11 +0,0 @@ -{ - "ver": "2.0.1", - "importer": "json", - "imported": true, - "uuid": "59d1c66b-278d-4af3-8bb9-864840cfbc5f", - "files": [ - ".json" - ], - "subMetas": {}, - "userData": {} -} diff --git a/JisolGameCocos/assets/resources/config/game/GRoleSkillEffect.json b/JisolGameCocos/assets/resources/config/game/GRoleSkillEffect.json deleted file mode 100644 index 6f5f8899..00000000 --- a/JisolGameCocos/assets/resources/config/game/GRoleSkillEffect.json +++ /dev/null @@ -1 +0,0 @@ -{"50001":{"id":50001,"text":"疯狂松鼠的技能开始 松鼠向天上丢出炸弹","spine":"spine/召唤与合成819个Spine/疯狂松鼠/guaiA4es_2/spine/guaiA4es"},"50002":{"id":50002,"text":"火球","spine":"effect/子弹效果/base_fly_fire/spine/buff_fire"},"50003":{"id":50003,"text":"火球爆炸","spine":"effect/爆炸效果/zhouyu_skill2_2/spine/zhouyu_skill2_2"}} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/game/GRoleSkillEffect.json.meta b/JisolGameCocos/assets/resources/config/game/GRoleSkillEffect.json.meta deleted file mode 100644 index ae2ec727..00000000 --- a/JisolGameCocos/assets/resources/config/game/GRoleSkillEffect.json.meta +++ /dev/null @@ -1,11 +0,0 @@ -{ - "ver": "2.0.1", - "importer": "json", - "imported": true, - "uuid": "fc22edae-4f33-449d-9525-61c07e4ad229", - "files": [ - ".json" - ], - "subMetas": {}, - "userData": {} -} diff --git a/JisolGameCocos/assets/resources/config/game/GRoleSkillSpine.json b/JisolGameCocos/assets/resources/config/game/GRoleSkillSpine.json deleted file mode 100644 index 9a73f7d4..00000000 --- a/JisolGameCocos/assets/resources/config/game/GRoleSkillSpine.json +++ /dev/null @@ -1 +0,0 @@ -{"50001":{"id":50001,"text":"疯狂松鼠的技能开始 松鼠向天上丢出炸弹","spine":"spine/召唤与合成819个Spine/疯狂松鼠/guaiA4es_2/spine/guaiA4es"}} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/game/GRoleSkillSpine.json.meta b/JisolGameCocos/assets/resources/config/game/GRoleSkillSpine.json.meta deleted file mode 100644 index 60dc1e0f..00000000 --- a/JisolGameCocos/assets/resources/config/game/GRoleSkillSpine.json.meta +++ /dev/null @@ -1,11 +0,0 @@ -{ - "ver": "2.0.1", - "importer": "json", - "imported": true, - "uuid": "2b4d0d66-c8ee-4b18-996a-bdbd33d4f503", - "files": [ - ".json" - ], - "subMetas": {}, - "userData": {} -} diff --git a/JisolGameCocos/assets/resources/config/json.meta b/JisolGameCocos/assets/resources/config/json.meta new file mode 100644 index 00000000..3a6ba1b2 --- /dev/null +++ b/JisolGameCocos/assets/resources/config/json.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.2.0", + "importer": "directory", + "imported": true, + "uuid": "fb208ba4-2f35-427c-bb3a-4090397c970d", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/resources/config/json/tbgmap.json b/JisolGameCocos/assets/resources/config/json/tbgmap.json new file mode 100644 index 00000000..bc23d3ff --- /dev/null +++ b/JisolGameCocos/assets/resources/config/json/tbgmap.json @@ -0,0 +1,12 @@ +[ + { + "id": 60001, + "mapName": "天空城", + "map1": "map/MAP6/MAP6_1/spriteFrame", + "map2": "map/MAP6/MAP6_2/spriteFrame", + "map3": "map/MAP6/MAP6_3/spriteFrame", + "map1OffsetY": 100, + "map2OffsetY": 400, + "map3OffsetY": 400 + } +] \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/game/GRole.json.meta b/JisolGameCocos/assets/resources/config/json/tbgmap.json.meta similarity index 72% rename from JisolGameCocos/assets/resources/config/game/GRole.json.meta rename to JisolGameCocos/assets/resources/config/json/tbgmap.json.meta index f8acfa47..ef2bf7be 100644 --- a/JisolGameCocos/assets/resources/config/game/GRole.json.meta +++ b/JisolGameCocos/assets/resources/config/json/tbgmap.json.meta @@ -2,7 +2,7 @@ "ver": "2.0.1", "importer": "json", "imported": true, - "uuid": "90a5e164-9bf8-4bcb-b155-444e7ff5e0bc", + "uuid": "ca081965-20e1-401b-a6d9-1cec3e644dbb", "files": [ ".json" ], diff --git a/JisolGameCocos/assets/resources/config/json/tbgrole.json b/JisolGameCocos/assets/resources/config/json/tbgrole.json index 8c065409..c73cdc00 100644 --- a/JisolGameCocos/assets/resources/config/json/tbgrole.json +++ b/JisolGameCocos/assets/resources/config/json/tbgrole.json @@ -1,54 +1,34 @@ [ - { - "id": 10000, - "name": "发型", - "price": 100 - }, { "id": 10001, - "name": "外套", - "price": 100 + "roleName": "小石头", + "spine": "spine/召唤与合成819个Spine/小石头/guaiA1a/spine/guaiA1a", + "roleSkillIds": [], + "roleAttackRange": 100 }, { "id": 10002, - "name": "上衣", - "price": 100 + "roleName": "坚强小石", + "spine": "spine/召唤与合成819个Spine/坚强小石/guaiA1a_1/spine/guaiA1a", + "roleSkillIds": [], + "roleAttackRange": 100 }, { "id": 10003, - "name": "裙子", - "price": 100 + "roleName": "疯狂松鼠", + "spine": "spine/召唤与合成819个Spine/疯狂松鼠/guaiA4e_2/spine/guaiA4e", + "roleSkillIds": [ + 40001 + ], + "roleAttackRange": 500 }, { "id": 10004, - "name": "袜子", - "price": 100 - }, - { - "id": 10005, - "name": "鞋子", - "price": 100 - }, - { - "id": 10006, - "name": "发饰", - "price": 100 - }, - { - "id": 10007, - "name": "中秋节发饰", - "price": 200, - "expire_time": 1633881599 - }, - { - "id": 10008, - "name": "中秋节鞋子", - "price": 300, - "expire_time": 1633967999 - }, - { - "id": 10009, - "name": "礼包", - "price": 100 + "roleName": "妙蛙种子", + "spine": "spine/神奇宝贝/001妙蛙种子/spine/001妙蛙种子", + "roleSkillIds": [ + 40002 + ], + "roleAttackRange": 350 } ] \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/game/GRoleAttackBullet.json.meta b/JisolGameCocos/assets/resources/config/json/tbgrole.json.meta similarity index 72% rename from JisolGameCocos/assets/resources/config/game/GRoleAttackBullet.json.meta rename to JisolGameCocos/assets/resources/config/json/tbgrole.json.meta index 525f9ced..1bf191e9 100644 --- a/JisolGameCocos/assets/resources/config/game/GRoleAttackBullet.json.meta +++ b/JisolGameCocos/assets/resources/config/json/tbgrole.json.meta @@ -2,7 +2,7 @@ "ver": "2.0.1", "importer": "json", "imported": true, - "uuid": "9e1a69f7-e3db-4165-abc2-aa96ed577b2d", + "uuid": "8783acf4-8ffd-44d0-ac6c-61e76b1867ee", "files": [ ".json" ], diff --git a/JisolGameCocos/assets/resources/config/json/tbgroleattack.json b/JisolGameCocos/assets/resources/config/json/tbgroleattack.json new file mode 100644 index 00000000..7aa47576 --- /dev/null +++ b/JisolGameCocos/assets/resources/config/json/tbgroleattack.json @@ -0,0 +1,29 @@ +[ + { + "id": 10001, + "attackWay": "Normal", + "attackArgs": [] + }, + { + "id": 10002, + "attackWay": "Normal", + "attackArgs": [] + }, + { + "id": 10003, + "attackWay": "ParabolicBangRemote", + "attackArgs": [ + "30002", + "30001", + "timo5 007", + "0.6", + "100", + "100" + ] + }, + { + "id": 10004, + "attackWay": "Normal", + "attackArgs": [] + } +] \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/game/GRoleAttack.json.meta b/JisolGameCocos/assets/resources/config/json/tbgroleattack.json.meta similarity index 72% rename from JisolGameCocos/assets/resources/config/game/GRoleAttack.json.meta rename to JisolGameCocos/assets/resources/config/json/tbgroleattack.json.meta index ebf16f84..3e622e13 100644 --- a/JisolGameCocos/assets/resources/config/game/GRoleAttack.json.meta +++ b/JisolGameCocos/assets/resources/config/json/tbgroleattack.json.meta @@ -2,7 +2,7 @@ "ver": "2.0.1", "importer": "json", "imported": true, - "uuid": "75a65c75-47c9-4167-ba79-55548af8cc79", + "uuid": "c579484c-c7d1-4fd7-ba57-f93003d57a38", "files": [ ".json" ], diff --git a/JisolGameCocos/assets/resources/config/json/tbgrolebattleres.json b/JisolGameCocos/assets/resources/config/json/tbgrolebattleres.json new file mode 100644 index 00000000..84bfaa2e --- /dev/null +++ b/JisolGameCocos/assets/resources/config/json/tbgrolebattleres.json @@ -0,0 +1,32 @@ +[ + { + "id": 30001, + "resName": "爆炸", + "resType": "Spine", + "resSrc": "effect/爆炸效果/shouji_01/spine/shouji_01" + }, + { + "id": 30002, + "resName": "炸弹", + "resType": "Sprite", + "resSrc": "bullets/疯狂松鼠/attack/spriteFrame" + }, + { + "id": 30003, + "resName": "疯狂松鼠的技能开始 松鼠向天上丢出炸弹", + "resType": "Spine", + "resSrc": "spine/召唤与合成819个Spine/疯狂松鼠/guaiA4es_2/spine/guaiA4es" + }, + { + "id": 30004, + "resName": "火球", + "resType": "Spine", + "resSrc": "effect/子弹效果/base_fly_fire/spine/buff_fire" + }, + { + "id": 30005, + "resName": "火球爆炸", + "resType": "Spine", + "resSrc": "effect/爆炸效果/zhouyu_skill2_2/spine/zhouyu_skill2_2" + } +] \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/game/GMap.json.meta b/JisolGameCocos/assets/resources/config/json/tbgrolebattleres.json.meta similarity index 72% rename from JisolGameCocos/assets/resources/config/game/GMap.json.meta rename to JisolGameCocos/assets/resources/config/json/tbgrolebattleres.json.meta index a6f5ae5f..258fa613 100644 --- a/JisolGameCocos/assets/resources/config/game/GMap.json.meta +++ b/JisolGameCocos/assets/resources/config/json/tbgrolebattleres.json.meta @@ -2,7 +2,7 @@ "ver": "2.0.1", "importer": "json", "imported": true, - "uuid": "d0ea1d51-329d-4f0e-83cf-33182eaa13f0", + "uuid": "95a40bf9-994f-4f8c-bd5e-f8bc347becf3", "files": [ ".json" ], diff --git a/JisolGameCocos/assets/resources/config/json/tbgroleskill.json b/JisolGameCocos/assets/resources/config/json/tbgroleskill.json new file mode 100644 index 00000000..a83c7506 --- /dev/null +++ b/JisolGameCocos/assets/resources/config/json/tbgroleskill.json @@ -0,0 +1,22 @@ +[ + { + "id": 40001, + "skillName": "疯狂松鼠", + "skillController": "GSkillCrazySquirrel", + "skillArgs": [ + "5", + "250", + "250" + ], + "skillText": "疯狂松鼠的技能 丢出巨大炸弹 轰炸全部玩家" + }, + { + "id": 40002, + "skillName": "妙蛙种子连击", + "skillController": "GSkillBulbasaurDoubleHit", + "skillArgs": [ + "8" + ], + "skillText": "妙蛙种子攻击8次 触发一次射叶子技能" + } +] \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/json/tbgroleskill.json.meta b/JisolGameCocos/assets/resources/config/json/tbgroleskill.json.meta new file mode 100644 index 00000000..e7e666d7 --- /dev/null +++ b/JisolGameCocos/assets/resources/config/json/tbgroleskill.json.meta @@ -0,0 +1,11 @@ +{ + "ver": "2.0.1", + "importer": "json", + "imported": true, + "uuid": "1c448338-21ce-44ac-90b9-bd0b911896bc", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": {} +} diff --git a/JisolGameCocos/assets/resources/config/ts.meta b/JisolGameCocos/assets/resources/config/ts.meta deleted file mode 100644 index 8c88e47d..00000000 --- a/JisolGameCocos/assets/resources/config/ts.meta +++ /dev/null @@ -1,12 +0,0 @@ -{ - "ver": "1.2.0", - "importer": "directory", - "imported": true, - "uuid": "7dcc424e-cdd8-4b28-ae0a-1a7994590b3a", - "files": [], - "subMetas": {}, - "userData": { - "compressionType": {}, - "isRemoteBundle": {} - } -} diff --git a/JisolGameCocos/assets/resources/config/ts/TableGMap.ts b/JisolGameCocos/assets/resources/config/ts/TableGMap.ts deleted file mode 100644 index 2bc2d2c5..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGMap.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { JsonUtil } from "../../../../extensions/ngame/assets/ngame/util/JsonUtil"; - -export class TableGMap { - static TableName: string = "GMap"; - - static getAllConfig(): { [id: string]: TableGMap } { - return JsonUtil.get(TableGMap.TableName); - } - - static getConfig(id: number | string) { - return TableGMap.getAllConfig()[id] as TableGMap; - } - - private data: any; - - init(id: number) { - var table = JsonUtil.get(TableGMap.TableName); - this.data = table[id]; - this._id = id; - } - /** id */ private _id: number = 0; - - /** id */ - get id(): number { - return this.data.id; - } - /** 地图名称 */ - get mapName(): string { - return this.data.mapName; - } - /** 地图1(前) */ - get map1(): string { - return this.data.map1; - } - /** 地图2(后) */ - get map2(): string { - return this.data.map2; - } - /** 地图3(天空) */ - get map3(): string { - return this.data.map3; - } - /** 地图1(前) 偏移量Y */ - get map1OffsetY(): number { - return this.data.map1OffsetY; - } - /** 地图2(后) 偏移量Y */ - get map2OffsetY(): number { - return this.data.map2OffsetY; - } - /** 地图2(后) 偏移量Y */ - get map3OffsetY(): number { - return this.data.map3OffsetY; - } -} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/ts/TableGRole.ts b/JisolGameCocos/assets/resources/config/ts/TableGRole.ts deleted file mode 100644 index a567d5f2..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGRole.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { JsonUtil } from "../../../../extensions/ngame/assets/ngame/util/JsonUtil"; - -export class TableGRole { - static TableName: string = "GRole"; - - static getAllConfig(): { [id: string]: TableGRole } { - return JsonUtil.get(TableGRole.TableName); - } - - static getConfig(id: number | string) { - return TableGRole.getAllConfig()[id] as TableGRole; - } - - private data: any; - - init(id: number) { - var table = JsonUtil.get(TableGRole.TableName); - this.data = table[id]; - this._id = id; - } - /** id */ private _id: number = 0; - - /** id */ - get id(): number { - return this.data.id; - } - /** 角色名称 */ - get roleName(): string { - return this.data.roleName; - } - /** Spine地址 */ - get spine(): string { - return this.data.spine; - } - /** 角色技能Id列表 */ - get roleSkillIds(): number[] { - return this.data.roleSkillIds; - } - /** 角色攻击范围 */ - get roleAttackRange(): number { - return this.data.roleAttackRange; - } -} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/ts/TableGRole.ts.meta b/JisolGameCocos/assets/resources/config/ts/TableGRole.ts.meta deleted file mode 100644 index e929ac5c..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGRole.ts.meta +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ver": "4.0.23", - "importer": "typescript", - "imported": true, - "uuid": "9038eb60-394b-4c67-a5cc-ebd05040f85c", - "files": [], - "subMetas": {}, - "userData": {} -} diff --git a/JisolGameCocos/assets/resources/config/ts/TableGRoleAttack.ts b/JisolGameCocos/assets/resources/config/ts/TableGRoleAttack.ts deleted file mode 100644 index 07c7719a..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGRoleAttack.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { JsonUtil } from "../../../../extensions/ngame/assets/ngame/util/JsonUtil"; - -export class TableGRoleAttack { - static TableName: string = "GRoleAttack"; - - static getAllConfig(): { [id: string]: TableGRoleAttack } { - return JsonUtil.get(TableGRoleAttack.TableName); - } - - static getConfig(id: number | string) { - return TableGRoleAttack.getAllConfig()[id] as TableGRoleAttack; - } - - private data: any; - - init(roleId: number) { - var table = JsonUtil.get(TableGRoleAttack.TableName); - this.data = table[roleId]; - this._roleId = roleId; - } - /** 角色Id */ private _roleId: number = 0; - - /** 角色Id */ - get roleId(): number { - return this.data.roleId; - } - /** 攻击方式 */ - get attackWay(): string { - return this.data.attackWay; - } - /** 攻击参数 */ - get attackArgs(): string[] { - return this.data.attackArgs; - } -} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/ts/TableGRoleAttack.ts.meta b/JisolGameCocos/assets/resources/config/ts/TableGRoleAttack.ts.meta deleted file mode 100644 index 26f8faa2..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGRoleAttack.ts.meta +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ver": "4.0.23", - "importer": "typescript", - "imported": true, - "uuid": "4879e3d4-3b08-4e70-af99-add884d50af3", - "files": [], - "subMetas": {}, - "userData": {} -} diff --git a/JisolGameCocos/assets/resources/config/ts/TableGRoleAttackBullet.ts b/JisolGameCocos/assets/resources/config/ts/TableGRoleAttackBullet.ts deleted file mode 100644 index df12ad30..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGRoleAttackBullet.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { JsonUtil } from "../../../../extensions/ngame/assets/ngame/util/JsonUtil"; - -export class TableGRoleAttackBullet { - static TableName: string = "GRoleAttackBullet"; - - static getAllConfig(): { [id: string]: TableGRoleAttackBullet } { - return JsonUtil.get(TableGRoleAttackBullet.TableName); - } - - static getConfig(id: number | string) { - return TableGRoleAttackBullet.getAllConfig()[id] as TableGRoleAttackBullet; - } - - private data: any; - - init(id: number) { - var table = JsonUtil.get(TableGRoleAttackBullet.TableName); - this.data = table[id]; - this._id = id; - } - /** Id */ private _id: number = 0; - - /** Id */ - get id(): number { - return this.data.id; - } - /** 子弹名称 */ - get bulletName(): string { - return this.data.bulletName; - } - /** 子弹地址 */ - get bulletSrc(): string { - return this.data.bulletSrc; - } -} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/ts/TableGRoleAttackBullet.ts.meta b/JisolGameCocos/assets/resources/config/ts/TableGRoleAttackBullet.ts.meta deleted file mode 100644 index 73df0854..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGRoleAttackBullet.ts.meta +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ver": "4.0.23", - "importer": "typescript", - "imported": true, - "uuid": "0c4a411b-9551-4944-9662-79468f748d6e", - "files": [], - "subMetas": {}, - "userData": {} -} diff --git a/JisolGameCocos/assets/resources/config/ts/TableGRoleAttackEffect.ts b/JisolGameCocos/assets/resources/config/ts/TableGRoleAttackEffect.ts deleted file mode 100644 index b45bcf07..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGRoleAttackEffect.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { JsonUtil } from "../../../../extensions/ngame/assets/ngame/util/JsonUtil"; - -export class TableGRoleAttackEffect { - static TableName: string = "GRoleAttackEffect"; - - static getAllConfig(): { [id: string]: TableGRoleAttackEffect } { - return JsonUtil.get(TableGRoleAttackEffect.TableName); - } - - static getConfig(id: number | string) { - return TableGRoleAttackEffect.getAllConfig()[id] as TableGRoleAttackEffect; - } - - private data: any; - - init(id: number) { - var table = JsonUtil.get(TableGRoleAttackEffect.TableName); - this.data = table[id]; - this._id = id; - } - /** Id */ private _id: number = 0; - - /** Id */ - get id(): number { - return this.data.id; - } - /** 效果名称 */ - get effectName(): string { - return this.data.effectName; - } - /** spine路径 */ - get spine(): string { - return this.data.spine; - } - /** 动画名称 */ - get animation(): string { - return this.data.animation; - } -} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/ts/TableGRoleAttackEffect.ts.meta b/JisolGameCocos/assets/resources/config/ts/TableGRoleAttackEffect.ts.meta deleted file mode 100644 index 32a9d8d6..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGRoleAttackEffect.ts.meta +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ver": "4.0.23", - "importer": "typescript", - "imported": true, - "uuid": "b03efae0-b212-4eb7-8462-2292e6884b51", - "files": [], - "subMetas": {}, - "userData": {} -} diff --git a/JisolGameCocos/assets/resources/config/ts/TableGRoleSkill.ts b/JisolGameCocos/assets/resources/config/ts/TableGRoleSkill.ts deleted file mode 100644 index 3577857b..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGRoleSkill.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { JsonUtil } from "../../../../extensions/ngame/assets/ngame/util/JsonUtil"; - -export class TableGRoleSkill { - static TableName: string = "GRoleSkill"; - - static getAllConfig(): { [id: string]: TableGRoleSkill } { - return JsonUtil.get(TableGRoleSkill.TableName); - } - - static getConfig(id: number | string) { - return TableGRoleSkill.getAllConfig()[id] as TableGRoleSkill; - } - - private data: any; - - init(id: number) { - var table = JsonUtil.get(TableGRoleSkill.TableName); - this.data = table[id]; - this._id = id; - } - /** 技能Id */ private _id: number = 0; - - /** 技能Id */ - get id(): number { - return this.data.id; - } - /** 技能名称 */ - get skillName(): string { - return this.data.skillName; - } - /** 技能控制器 */ - get skillController(): string { - return this.data.skillController; - } - /** 技能参数 */ - get skillArgs(): string[] { - return this.data.skillArgs; - } - /** 技能介绍 */ - get skillText(): string { - return this.data.skillText; - } -} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/ts/TableGRoleSkill.ts.meta b/JisolGameCocos/assets/resources/config/ts/TableGRoleSkill.ts.meta deleted file mode 100644 index 8af31724..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGRoleSkill.ts.meta +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ver": "4.0.23", - "importer": "typescript", - "imported": true, - "uuid": "44fbcae1-8514-43b3-8a90-3e68b3f84497", - "files": [], - "subMetas": {}, - "userData": {} -} diff --git a/JisolGameCocos/assets/resources/config/ts/TableGRoleSkillEffect.ts b/JisolGameCocos/assets/resources/config/ts/TableGRoleSkillEffect.ts deleted file mode 100644 index 40832da1..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGRoleSkillEffect.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { JsonUtil } from "../../../../extensions/ngame/assets/ngame/util/JsonUtil"; - -export class TableGRoleSkillEffect { - static TableName: string = "GRoleSkillEffect"; - - static getAllConfig(): { [id: string]: TableGRoleSkillEffect } { - return JsonUtil.get(TableGRoleSkillEffect.TableName); - } - - static getConfig(id: number | string) { - return TableGRoleSkillEffect.getAllConfig()[id] as TableGRoleSkillEffect; - } - - private data: any; - - init(id: number) { - var table = JsonUtil.get(TableGRoleSkillEffect.TableName); - this.data = table[id]; - this._id = id; - } - /** 技能SpineId */ private _id: number = 0; - - /** 技能SpineId */ - get id(): number { - return this.data.id; - } - /** 说明 */ - get text(): string { - return this.data.text; - } - /** spine路径 */ - get spine(): string { - return this.data.spine; - } -} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/ts/TableGRoleSkillEffect.ts.meta b/JisolGameCocos/assets/resources/config/ts/TableGRoleSkillEffect.ts.meta deleted file mode 100644 index 3f5f6cc5..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGRoleSkillEffect.ts.meta +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ver": "4.0.23", - "importer": "typescript", - "imported": true, - "uuid": "2b4ecb72-b2fb-43c5-8712-3eb6b4c4abe9", - "files": [], - "subMetas": {}, - "userData": {} -} diff --git a/JisolGameCocos/assets/resources/config/ts/TableGRoleSkillSpine.ts b/JisolGameCocos/assets/resources/config/ts/TableGRoleSkillSpine.ts deleted file mode 100644 index 7856ef89..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGRoleSkillSpine.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { JsonUtil } from "../../../../extensions/ngame/assets/ngame/util/JsonUtil"; - -export class TableGRoleSkillSpine { - static TableName: string = "GRoleSkillSpine"; - - static getAllConfig(): { [id: string]: TableGRoleSkillSpine } { - return JsonUtil.get(TableGRoleSkillSpine.TableName); - } - - static getConfig(id: number | string) { - return TableGRoleSkillSpine.getAllConfig()[id] as TableGRoleSkillSpine; - } - - private data: any; - - init(id: number) { - var table = JsonUtil.get(TableGRoleSkillSpine.TableName); - this.data = table[id]; - this._id = id; - } - /** 技能SpineId */ private _id: number = 0; - - /** 技能SpineId */ - get id(): number { - return this.data.id; - } - /** 说明 */ - get text(): string { - return this.data.text; - } - /** spine路径 */ - get spine(): string { - return this.data.spine; - } -} \ No newline at end of file diff --git a/JisolGameCocos/assets/resources/config/ts/TableGRoleSkillSpine.ts.meta b/JisolGameCocos/assets/resources/config/ts/TableGRoleSkillSpine.ts.meta deleted file mode 100644 index 2eb1fd45..00000000 --- a/JisolGameCocos/assets/resources/config/ts/TableGRoleSkillSpine.ts.meta +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ver": "4.0.23", - "importer": "typescript", - "imported": true, - "uuid": "19c80511-21b9-4037-b717-48720ff61578", - "files": [], - "subMetas": {}, - "userData": {} -} diff --git a/JisolGameCocos/assets/script/App.ts b/JisolGameCocos/assets/script/App.ts index 337d801f..26dd4400 100644 --- a/JisolGameCocos/assets/script/App.ts +++ b/JisolGameCocos/assets/script/App.ts @@ -16,16 +16,11 @@ import axios from "../../extensions/ngame/assets/plugins/axios.js"; import GBattleModeManager from "./battle/GBattleModeManager"; import { GLayer, UIConfig } from "./ui/UIConfig"; import JLoaderSystem from "../../extensions/ngame/assets/ngame/system/JLoaderSystem"; -import { TableGRole } from "../resources/config/ts/TableGRole"; import { sp } from "cc"; -import { TableGRoleAttack } from "../resources/config/ts/TableGRoleAttack"; import { SpriteFrame } from "cc"; -import { TableGRoleAttackBullet } from "../resources/config/ts/TableGRoleAttackBullet"; -import { TableGRoleAttackEffect } from "../resources/config/ts/TableGRoleAttackEffect"; -import { TableGRoleSkill } from "../resources/config/ts/TableGRoleSkill"; -import { TableGRoleSkillEffect } from "../resources/config/ts/TableGRoleSkillEffect"; -import { TableGMap } from "../resources/config/ts/TableGMap"; import Loading from "../../extensions/ngame/assets/ngame/util/Loading"; +import { TB, Tables } from "../resources/config/data/schema"; +import { JsonAsset } from "cc"; let IP = "kyu.jisol.cn"; @@ -104,37 +99,33 @@ export abstract class JNGSyncProtoBase extends JNSyncFrameProtoComponent{ } +export var TD:Tables = null; //读写config export class JNGConfig extends SystemBase{ static loading = "JNGConfig"; - - //配置JSON加载 - jsons:JsonLoad[] = [ - {name:TableGRole.TableName}, //角色 - {name:TableGRoleAttack.TableName}, //角色攻击 - {name:TableGRoleAttackBullet.TableName}, //角色攻击子弹 - {name:TableGRoleAttackEffect.TableName}, //角色攻击特效 - {name:TableGRoleSkill.TableName}, //角色技能 - {name:TableGRoleSkillEffect.TableName}, //角色技能特效 - {name:TableGMap.TableName}, //游戏地图 - ].map((table) => { - return { - name:table.name, - bundle:"resources", - path:"config/game/" - } - }); async onInit(): Promise { app.loading.setCurrent(JNGConfig.loading); - for (const key in this.jsons) { - const load = this.jsons[key]; + let json2 = resources.getDirWithPath("config/json/",JsonAsset).map((info) => { + let args = info.path.split("/"); + return { + name:args[args.length - 1], + bundle:"resources", + path:"config/json/" + } + }) + + for (const key in json2) { + const load = json2[key]; await JsonUtil.load(load); } + TD = new Tables((file) => JsonUtil.get(file)) + console.log(TD); + app.loading.ok(JNGConfig.loading); } @@ -146,10 +137,11 @@ export class JLoaderBattle extends JLoaderSystem{ static loading = "JLoaderBattle"; static loadingInit = "JLoaderBattle_Init"; - skData:{[id:number]:sp.SkeletonData} = {}; //角色Spine - bullets:{[id:number]:SpriteFrame} = {}; //子弹 - effects:{[id:number]:sp.SkeletonData} = {}; //Spine特效 - maps:{[id:number]:SpriteFrame[]} = {}; //地图 + roleSpine:{[id:number]:sp.SkeletonData} = {}; //角色Spine + roleResImage:{[id:number]:SpriteFrame} = {}; //角色战斗素材图片 + roleResSpine:{[id:number]:sp.SkeletonData} = {}; //角色战斗素材Spine + effects:{[id:number]:sp.SkeletonData} = {}; //Spine特效 + maps:{[id:number]:SpriteFrame[]} = {}; //地图 async onInit(): Promise { @@ -162,43 +154,33 @@ export class JLoaderBattle extends JLoaderSystem{ app.loading.setCurrent(JLoaderBattle.loadingInit); //将配置表的角色都读取出来 - for (const info of Object.values(TableGRole.getAllConfig())) { - this.skData[info.id] = await (new Promise(r => { + for (const info of TD.TbGRole.getDataMap().values()) { + this.roleSpine[info.id] = await (new Promise(r => { this.bundle.load(info.spine,sp.SkeletonData,(err,data) => { r(data); }) })) } - //将所有子弹读取出来 - for (const info of Object.values(TableGRoleAttackBullet.getAllConfig())) { - this.bullets[info.id] = await (new Promise(r => { - this.bundle.load(info.bulletSrc,SpriteFrame,(err,data) => { - r(data); - }) - })) - } - - //攻击特效读取 - for (const info of Object.values(TableGRoleAttackEffect.getAllConfig())) { - this.effects[info.id] = await (new Promise(r => { - this.bundle.load(info.spine,sp.SkeletonData,(err,data) => { - r(data); - }) - })) - } - - //技能特效读取 - for (const info of Object.values(TableGRoleSkillEffect.getAllConfig())) { - this.effects[info.id] = await (new Promise(r => { - this.bundle.load(info.spine,sp.SkeletonData,(err,data) => { - r(data); - }) - })) + //读取角色战斗素材 + for(const info of TD.TbGRoleBattleRes.getDataMap().values()){ + if(info.resType == "Spine"){ + this.roleResSpine[info.id] = await (new Promise(r => { + this.bundle.load(info.resSrc,sp.SkeletonData,(err,data) => { + r(data); + }) + })) + }else{ + this.roleResImage[info.id] = await (new Promise(r => { + this.bundle.load(info.resSrc,SpriteFrame,(err,data) => { + r(data); + }) + })) + } } //读取地图 - for (const info of Object.values(TableGMap.getAllConfig())) { + for (const info of TD.TbGMap.getDataMap().values()) { this.maps[info.id] = await (Promise.all(["1","2","3"].map(index => `map${index}`).map(key => { return new Promise(r => { @@ -234,5 +216,5 @@ export const app = { [JNGConfig.loading]:{title:"加载配置文件"}, [JLoaderBattle.loading]:{title:"加载战斗资源"}, [JLoaderBattle.loadingInit]:{title:"初始化战斗资源"}, - }) + }), } \ No newline at end of file diff --git a/JisolGameCocos/assets/script/Main.ts b/JisolGameCocos/assets/script/Main.ts index 693e6820..92fd8e1f 100644 --- a/JisolGameCocos/assets/script/Main.ts +++ b/JisolGameCocos/assets/script/Main.ts @@ -2,7 +2,6 @@ import { _decorator, Component, director, instantiate, Node, Prefab } from 'cc'; import { app } from './App'; import { JNGame } from '../../extensions/ngame/assets/ngame/JNGame'; import { JNSyncAction } from '../../extensions/ngame/assets/ngame/sync/JNSyncAction'; -import { TableGRole } from '../resources/config/ts/TableGRole'; const { ccclass, property } = _decorator; @ccclass('Main') @@ -24,13 +23,11 @@ export class Main extends Component { {path:"proto/GDemo"} ]); - console.log("TableGRole",TableGRole.getAllConfig()) - //发生帧同步开始 app.socket.Send(JNSyncAction.NSyncFrameStart); // 创建世界 - // director.getScene().addChild(instantiate(this.WorldPrefab)); + director.getScene().addChild(instantiate(this.WorldPrefab)); } diff --git a/JisolGameCocos/assets/script/battle/base/attack/GAttack.ts b/JisolGameCocos/assets/script/battle/base/attack/GAttack.ts index 494b3c3a..cdf88a28 100644 --- a/JisolGameCocos/assets/script/battle/base/attack/GAttack.ts +++ b/JisolGameCocos/assets/script/battle/base/attack/GAttack.ts @@ -1,14 +1,10 @@ -import { Node } from "cc"; -import { TableGRoleAttack } from "../../../../resources/config/ts/TableGRoleAttack"; -import GRoleBase from "../role/GRoleBase"; import GAttackNormal from "./GAttackNormal"; import GAttackParabolicBangRemote from "./GAttackParabolicBangRemote"; import { UITransform } from "cc"; import GButtleBase from "../bullet/GButtleBase"; -import { GFSMAnimBase } from "../fsm/GFSMAnimBase"; -import GFSMBase from "../fsm/GFSMBase"; import GRoleDefault from "../role/GRoleDefault"; import GNode from "../common/GNode"; +import { TB } from "../../../../resources/config/data/schema"; //攻击子弹类 export class GAttackBullet{ @@ -26,7 +22,7 @@ export class GAttackBullet{ //攻击方式基类 export interface GAttackBase{ - attack(role:GRoleDefault,info:TableGRoleAttack); + attack(role:GRoleDefault,info:TB.TbGRoleAttack); } //攻击方式 diff --git a/JisolGameCocos/assets/script/battle/base/attack/GAttackNormal.ts b/JisolGameCocos/assets/script/battle/base/attack/GAttackNormal.ts index e4363b11..d3367a80 100644 --- a/JisolGameCocos/assets/script/battle/base/attack/GAttackNormal.ts +++ b/JisolGameCocos/assets/script/battle/base/attack/GAttackNormal.ts @@ -1,4 +1,4 @@ -import { TableGRoleAttack } from "../../../../resources/config/ts/TableGRoleAttack"; +import { TB } from "../../../../resources/config/data/schema"; import GRoleDefault from "../role/GRoleDefault"; import { GAttackBase } from "./GAttack"; @@ -6,7 +6,7 @@ import { GAttackBase } from "./GAttack"; //普通攻击 export default class GAttackNormal implements GAttackBase{ - attack(role: GRoleDefault, info: TableGRoleAttack) { + attack(role: GRoleDefault, info: TB.TbGRoleAttack) { role.fsm.enemy.onHit(); } diff --git a/JisolGameCocos/assets/script/battle/base/attack/GAttackParabolicBangRemote.ts b/JisolGameCocos/assets/script/battle/base/attack/GAttackParabolicBangRemote.ts index 8490d93f..081fcb57 100644 --- a/JisolGameCocos/assets/script/battle/base/attack/GAttackParabolicBangRemote.ts +++ b/JisolGameCocos/assets/script/battle/base/attack/GAttackParabolicBangRemote.ts @@ -1,6 +1,5 @@ import { SpriteFrame } from "cc"; -import { TableGRoleAttack } from "../../../../resources/config/ts/TableGRoleAttack"; -import { app } from "../../../App"; +import { TD, app } from "../../../App"; import GRoleBase from "../role/GRoleBase"; import { GAttackBase, GAttackBullet } from "./GAttack"; import GButtleDefault from "../bullet/GButtleDefault"; @@ -9,10 +8,10 @@ import { bezier } from "cc"; import { v2 } from "cc"; import { Vec2 } from "cc"; import GEffectUtil from "../common/GEffectUtil"; -import { TableGRoleAttackEffect } from "../../../../resources/config/ts/TableGRoleAttackEffect"; import GDetection from "../common/GDetection"; import { rect } from "cc"; import GRoleDefault from "../role/GRoleDefault"; +import { TB } from "../../../../resources/config/data/schema"; /** * 抛物线 爆炸普攻 @@ -20,15 +19,15 @@ import GRoleDefault from "../role/GRoleDefault"; */ export default class GAttackParabolicRemote implements GAttackBase{ - attack(role: GRoleDefault, info: TableGRoleAttack): void { + attack(role: GRoleDefault, info: TB.TbGRoleAttack): void { let enemy = role.fsm.enemy; if(!enemy) return; - let image:SpriteFrame = app.battleRes.bullets[info.attackArgs[0]]; + let image:SpriteFrame = app.battleRes.roleResImage[info.attackArgs[0]]; let bang = { - ske: app.battleRes.effects[info.attackArgs[1]], - info: TableGRoleAttackEffect.getConfig(info.attackArgs[1]) + ske: app.battleRes.roleResSpine[info.attackArgs[1]], + info: TD.TbGRoleBattleRes.get(parseInt(info.attackArgs[1])) }; let bone = role.spine.findBone(info.attackArgs[2]); let scale:number = parseFloat(info.attackArgs[3]); @@ -73,7 +72,7 @@ export default class GAttackParabolicRemote implements GAttackBase{ let effect = GEffectUtil.createOne(bang.ske); role.mode.addGNode(effect.node,bullet.node.worldPosition); //获取默认动画 - effect.setAnimation(0,bang.info.animation,false); + effect.setAnimation(0,"animation",false); //销毁 bullet.node.destroy(); diff --git a/JisolGameCocos/assets/script/battle/base/common/map/GMapLoop.ts b/JisolGameCocos/assets/script/battle/base/common/map/GMapLoop.ts index d8885500..2cba8fdb 100644 --- a/JisolGameCocos/assets/script/battle/base/common/map/GMapLoop.ts +++ b/JisolGameCocos/assets/script/battle/base/common/map/GMapLoop.ts @@ -1,11 +1,9 @@ import { _decorator, Component, Node } from 'cc'; import { app, JNGSyncBase } from '../../../../App'; import { SpriteFrame } from 'cc'; -import { TableGMap } from '../../../../../resources/config/ts/TableGMap'; import { Sprite } from 'cc'; import { UITransform } from 'cc'; import { v3 } from 'cc'; -import { Vec2 } from 'cc'; import { size } from 'cc'; import GNode from '../GNode'; const { ccclass, property } = _decorator; diff --git a/JisolGameCocos/assets/script/battle/base/role/GRoleBase.ts b/JisolGameCocos/assets/script/battle/base/role/GRoleBase.ts index 75cf6d90..4e08f01b 100644 --- a/JisolGameCocos/assets/script/battle/base/role/GRoleBase.ts +++ b/JisolGameCocos/assets/script/battle/base/role/GRoleBase.ts @@ -3,13 +3,11 @@ import GObject, { GTowards } from "../GObject"; import { JNFrameInfo } from "../../../../../extensions/ngame/assets/ngame/sync/frame/JNSyncFrame"; import { Vec2 } from "cc"; import { v3 } from "cc"; -import { TableGRole } from "../../../../resources/config/ts/TableGRole"; -import { TableGRoleSkill } from "../../../../resources/config/ts/TableGRoleSkill"; -import { GSkill, GSkillBase, GSkillState } from "../../skill/GSkill"; import JNSkeleton from "../../../../../extensions/ngame/assets/ngame/sync/frame/game/spine/JNFrameSkeleton"; import { GFSMAnimBase } from "../fsm/GFSMAnimBase"; import GFSMBase from "../fsm/GFSMBase"; import { app } from "../../../App"; +import { TB } from "../../../../resources/config/data/schema"; const { ccclass, property } = _decorator; export enum GRoleAnimEvent{ @@ -23,7 +21,7 @@ export default abstract class GRoleBase extends GObject{ spine:JNSkeleton; //角色 - role:TableGRole; + role:TB.TbGRole; //状态机 fsm:GFSMBase; @@ -80,9 +78,9 @@ export default abstract class GRoleBase extends GObject{ } //初始化 - protected init(role:TableGRole){ + protected init(role:TB.TbGRole){ if(this.spine) - this.spine.skeletonData = app.battleRes.skData[role.id]; + this.spine.skeletonData = app.battleRes.roleSpine[role.id]; } //创建一个状态机 diff --git a/JisolGameCocos/assets/script/battle/base/role/GRoleDefault.ts b/JisolGameCocos/assets/script/battle/base/role/GRoleDefault.ts index f3e28763..fc70dc0b 100644 --- a/JisolGameCocos/assets/script/battle/base/role/GRoleDefault.ts +++ b/JisolGameCocos/assets/script/battle/base/role/GRoleDefault.ts @@ -2,19 +2,18 @@ import { _decorator } from "cc"; import GRoleBase, { GRoleAnimEvent } from "./GRoleBase"; import { ProgressBar } from "cc"; import { JNFrameInfo } from "../../../../../extensions/ngame/assets/ngame/sync/frame/JNSyncFrame"; -import { TableGRole } from "../../../../resources/config/ts/TableGRole"; import { GFSMAnimBase, GFSMBattleAminEnum } from "../fsm/GFSMAnimBase"; import { GFSMDefaultAnim } from "../fsm/Default/GFSMDefaultAnim"; import GFSMDefault from "../fsm/Default/GFSMDefault"; import { JEasing } from "../../../../../extensions/ngame/assets/ngame/sync/frame/game/tween/JNFrameTween"; -import { TableGRoleAttack } from "../../../../resources/config/ts/TableGRoleAttack"; import { GAttack } from "../attack/GAttack"; import { v2 } from "cc"; import { GTactical } from "../../entity/GTactical"; import { Vec2 } from "cc"; import { GSkill, GSkillBase, GSkillState } from "../../skill/GSkill"; -import { TableGRoleSkill } from "../../../../resources/config/ts/TableGRoleSkill"; import JNFrameTime from "../../../../../extensions/ngame/assets/ngame/sync/frame/game/time/JNFrameTime"; +import { TB } from "../../../../resources/config/data/schema"; +import { TD } from "../../../App"; const { property,ccclass } = _decorator; //默认角色类 @@ -77,7 +76,7 @@ export default class GRoleDefault extends GRoleBase<{}>{ } //初始化 - onInit(type:number,role:TableGRole,tactical:GTactical,tacticalIndex:number){ + onInit(type:number,role:TB.TbGRole,tactical:GTactical,tacticalIndex:number){ super.init(role); this.type = type; @@ -89,7 +88,7 @@ export default class GRoleDefault extends GRoleBase<{}>{ // 设置技能 this.skills = role.roleSkillIds.map(skillId => { - let info = TableGRoleSkill.getConfig(skillId); + let info = TD.TbGRoleSkill.get(skillId); return (new GSkill[info.skillController]()).bind(this,info); }) @@ -123,7 +122,7 @@ export default class GRoleDefault extends GRoleBase<{}>{ if(!this.fsm.enemy) return; console.log(`播放动画[${this.nId}] onAttack`,this.fsm.enemy.nId) //敌人扣血 - let info = TableGRoleAttack.getConfig(this.role.id); + let info = TD.TbGRoleAttack.get(this.role.id); (new GAttack[info.attackWay]()).attack(this,info); this.attackCallbacks.forEach(fun => fun()); } diff --git a/JisolGameCocos/assets/script/battle/entity/GRole.ts b/JisolGameCocos/assets/script/battle/entity/GRole.ts index 62d43c43..189ff3f5 100644 --- a/JisolGameCocos/assets/script/battle/entity/GRole.ts +++ b/JisolGameCocos/assets/script/battle/entity/GRole.ts @@ -1,6 +1,5 @@ -import { TableGRole } from "../../../resources/config/ts/TableGRole"; -import { GFSMAnimBase } from "../base/fsm/GFSMAnimBase"; -import GFSMBase from "../base/fsm/GFSMBase"; +import { TB } from "../../../resources/config/data/schema"; +import { TD } from "../../App"; import GRoleBase from "../base/role/GRoleBase"; //角色工具类 @@ -17,13 +16,13 @@ export class GRoleUtil{ } //通过Id 获取 GRole - static getGRole(id:number):TableGRole{ - let info:TableGRole; - if(!(info = TableGRole.getConfig(id))) return null; + static getGRole(id:number):TB.TbGRole{ + let info:TB.TbGRole; + if(!(info = TD.TbGRole.get(id))) return null; return info } - static getGRoles(ids:number[]):TableGRole[]{ + static getGRoles(ids:number[]):TB.TbGRole[]{ return ids.map(id => GRoleUtil.getGRole(id)); } diff --git a/JisolGameCocos/assets/script/battle/modes/GOnHookMode.ts b/JisolGameCocos/assets/script/battle/modes/GOnHookMode.ts index a07a4d95..fcc0aad9 100644 --- a/JisolGameCocos/assets/script/battle/modes/GOnHookMode.ts +++ b/JisolGameCocos/assets/script/battle/modes/GOnHookMode.ts @@ -1,5 +1,4 @@ import { Vec2 } from "cc"; -import { TableGRole } from "../../../resources/config/ts/TableGRole"; import GBaseMode from "../GBaseMode"; import { GRoleUtil } from "../entity/GRole"; import { GTactical } from "../entity/GTactical"; @@ -12,11 +11,11 @@ import { JNFrameInfo } from "../../../../extensions/ngame/assets/ngame/sync/fram import { GMapLoop } from "../base/common/map/GMapLoop"; import { Node } from "cc"; import JNFrameTime from "../../../../extensions/ngame/assets/ngame/sync/frame/game/time/JNFrameTime"; -import { TableGMap } from "../../../resources/config/ts/TableGMap"; -import { app } from "../../App"; +import { TD, app } from "../../App"; import { v3 } from "cc"; import { v2 } from "cc"; import GFSMOnHookMode from "./OnHook/GFSMOnHookMode"; +import { TB } from "../../../resources/config/data/schema"; const { ccclass, property } = _decorator; //挂机模式状态 @@ -37,7 +36,7 @@ export interface GOnHookInfo{ //阵法 tactical: GTactical; //宠物列表 - roles: TableGRole[]; + roles: TB.TbGRole[]; } /** @@ -80,7 +79,7 @@ export default class GOnHookMode extends GBaseMode<{}>{ enemyRoles: GRoleDefault[] = []; //地图信息 - mapInfo:TableGMap; + mapInfo:TB.TbGMap; //每一波怪的距离 everyX:number = 600; @@ -113,7 +112,7 @@ export default class GOnHookMode extends GBaseMode<{}>{ this.fsm = new GFSMOnHookMode(this); //初始化地图 - this.mapInfo = TableGMap.getConfig(60001); + this.mapInfo = TD.TbGMap.get(60001); this.map1.init(app.battleRes.maps[60001][0],1); this.map2.init(app.battleRes.maps[60001][1],1); this.map3.init(app.battleRes.maps[60001][2],1,app.battleRes.maps[60001][1].width,app.battleRes.maps[60001][1].height); @@ -169,7 +168,7 @@ export default class GOnHookMode extends GBaseMode<{}>{ } //生成宠物 - onGenRole(type: GOnHookModePlayerEnum,index:number,info:TableGRole) { + onGenRole(type: GOnHookModePlayerEnum,index:number,info:TB.TbGRole) { let tactical = this.getInfo(type).tactical; let pos:Vec2 = this.getInfo(type).tactical.getPosition(index); diff --git a/JisolGameCocos/assets/script/battle/modes/GPVPMode.ts b/JisolGameCocos/assets/script/battle/modes/GPVPMode.ts index 0aaad6fb..8aea6f1e 100644 --- a/JisolGameCocos/assets/script/battle/modes/GPVPMode.ts +++ b/JisolGameCocos/assets/script/battle/modes/GPVPMode.ts @@ -5,9 +5,9 @@ import { Prefab } from "cc"; import { instantiate } from "cc"; import { Vec2 } from "cc"; import { GRoleUtil } from "../entity/GRole"; -import { TableGRole } from "../../../resources/config/ts/TableGRole"; import GRoleDefault from "../base/role/GRoleDefault"; import { v3 } from "cc"; +import { TB } from "../../../resources/config/data/schema"; const { ccclass, property } = _decorator; //PVP 角色 @@ -21,7 +21,7 @@ export interface GPVPModePlayerInfo{ //阵法 tactical: GTactical; //宠物列表 - roles: TableGRole[]; + roles: TB.TbGRole[]; } /** @@ -79,7 +79,7 @@ export default class GPVPMode extends GBaseMode<{}>{ } //生成角色 - onGenRole(type: GPVPModePlayerEnum,index:number,info:TableGRole) { + onGenRole(type: GPVPModePlayerEnum,index:number,info:TB.TbGRole) { let tactical = this.getInfo(type).tactical; let pos:Vec2 = this.getInfo(type).tactical.getPosition(index); diff --git a/JisolGameCocos/assets/script/battle/skill/GSkill.ts b/JisolGameCocos/assets/script/battle/skill/GSkill.ts index e2184324..ae1c8971 100644 --- a/JisolGameCocos/assets/script/battle/skill/GSkill.ts +++ b/JisolGameCocos/assets/script/battle/skill/GSkill.ts @@ -1,8 +1,7 @@ -import { TableGRoleSkill } from "../../../resources/config/ts/TableGRoleSkill"; -import GRoleBase from "../base/role/GRoleBase"; import GSkillCrazySquirrel from "./RoleSkill/疯狂松鼠/GSkillCrazySquirrel"; import GSkillBulbasaurDoubleHit from "./RoleSkill/妙蛙种子/GSkillBulbasaurDoubleHit"; import GRoleDefault from "../base/role/GRoleDefault"; +import { TB } from "../../../resources/config/data/schema"; //技能状态 export enum GSkillState{ @@ -15,7 +14,7 @@ export enum GSkillState{ export interface GSkillBase { //设置 - bind(role:GRoleDefault,info:TableGRoleSkill):GSkillBase; + bind(role:GRoleDefault,info:TB.TbGRoleSkill):GSkillBase; //是否允许释放 isRelease():boolean; diff --git a/JisolGameCocos/assets/script/battle/skill/GSkillAngerBase.ts b/JisolGameCocos/assets/script/battle/skill/GSkillAngerBase.ts index 7d414b0a..594c230f 100644 --- a/JisolGameCocos/assets/script/battle/skill/GSkillAngerBase.ts +++ b/JisolGameCocos/assets/script/battle/skill/GSkillAngerBase.ts @@ -1,5 +1,4 @@ -import { TableGRoleSkill } from "../../../resources/config/ts/TableGRoleSkill"; -import GRoleBase from "../base/role/GRoleBase"; +import { TB } from "../../../resources/config/data/schema"; import GRoleDefault from "../base/role/GRoleDefault"; import { GSkillBase, GSkillState } from "./GSkill"; @@ -12,7 +11,7 @@ export default abstract class GSkillAngerBase implements GSkillBase { //怒气最大值 angerMax:number = 0; - bind(role: GRoleDefault, info: TableGRoleSkill): GSkillBase { + bind(role: GRoleDefault, info: TB.TbGRoleSkill): GSkillBase { throw new Error("Method not implemented."); } isRelease(): boolean { diff --git a/JisolGameCocos/assets/script/battle/skill/GSkillCDBase.ts b/JisolGameCocos/assets/script/battle/skill/GSkillCDBase.ts index 52153b4f..43095266 100644 --- a/JisolGameCocos/assets/script/battle/skill/GSkillCDBase.ts +++ b/JisolGameCocos/assets/script/battle/skill/GSkillCDBase.ts @@ -1,4 +1,4 @@ -import { TableGRoleSkill } from "../../../resources/config/ts/TableGRoleSkill"; +import { TB } from "../../../resources/config/data/schema"; import GRoleBase from "../base/role/GRoleBase"; import GRoleDefault from "../base/role/GRoleDefault"; import { GSkillBase, GSkillState } from "./GSkill"; @@ -12,7 +12,7 @@ export default abstract class GSkillCDBase implements GSkillBase { //冷却时间 cdTime:number = 0; - bind(role:GRoleDefault,info: TableGRoleSkill):GSkillCDBase { + bind(role:GRoleDefault,info: TB.TbGRoleSkill):GSkillCDBase { return this; } diff --git a/JisolGameCocos/assets/script/battle/skill/RoleSkill/妙蛙种子/GSkillBulbasaurDoubleHit.ts b/JisolGameCocos/assets/script/battle/skill/RoleSkill/妙蛙种子/GSkillBulbasaurDoubleHit.ts index 96034247..d413ed7b 100644 --- a/JisolGameCocos/assets/script/battle/skill/RoleSkill/妙蛙种子/GSkillBulbasaurDoubleHit.ts +++ b/JisolGameCocos/assets/script/battle/skill/RoleSkill/妙蛙种子/GSkillBulbasaurDoubleHit.ts @@ -1,4 +1,4 @@ -import { TableGRoleSkill } from "../../../../../resources/config/ts/TableGRoleSkill"; +import { TB } from "../../../../../resources/config/data/schema"; import GRoleBase from "../../../base/role/GRoleBase"; import GRoleDefault from "../../../base/role/GRoleDefault"; import GSkillAngerBase from "../../GSkillAngerBase"; @@ -6,9 +6,9 @@ import GSkillAngerBase from "../../GSkillAngerBase"; export default class GSkillBulbasaurDoubleHit extends GSkillAngerBase{ role:GRoleDefault; - info: TableGRoleSkill; + info: TB.TbGRoleSkill; - bind(role:GRoleDefault,info: TableGRoleSkill):GSkillBulbasaurDoubleHit { + bind(role:GRoleDefault,info: TB.TbGRoleSkill):GSkillBulbasaurDoubleHit { //技能冷却 this.role = role; this.info = info; diff --git a/JisolGameCocos/assets/script/battle/skill/RoleSkill/疯狂松鼠/GSkillCrazySquirrel.ts b/JisolGameCocos/assets/script/battle/skill/RoleSkill/疯狂松鼠/GSkillCrazySquirrel.ts index e0062b71..b7c963a8 100644 --- a/JisolGameCocos/assets/script/battle/skill/RoleSkill/疯狂松鼠/GSkillCrazySquirrel.ts +++ b/JisolGameCocos/assets/script/battle/skill/RoleSkill/疯狂松鼠/GSkillCrazySquirrel.ts @@ -1,6 +1,5 @@ import { v2 } from "cc"; import { JTween } from "../../../../../../extensions/ngame/assets/ngame/sync/frame/game/tween/JNFrameTween"; -import { TableGRoleSkill } from "../../../../../resources/config/ts/TableGRoleSkill"; import { app } from "../../../../App"; import GSpine from "../../../base/common/GSpine"; import GRoleBase from "../../../base/role/GRoleBase"; @@ -10,6 +9,7 @@ import GBaseMode from "../../../GBaseMode"; import GDetection from "../../../base/common/GDetection"; import { rect } from "cc"; import GRoleDefault from "../../../base/role/GRoleDefault"; +import { TB } from "../../../../../resources/config/data/schema"; /** * 疯狂松鼠技能 @@ -18,9 +18,9 @@ import GRoleDefault from "../../../base/role/GRoleDefault"; export default class GSkillCrazySquirrel extends GSkillCDBase{ role:GRoleDefault; - info: TableGRoleSkill; + info: TB.TbGRoleSkill; - bind(role:GRoleDefault,info: TableGRoleSkill):GSkillCrazySquirrel { + bind(role:GRoleDefault,info: TB.TbGRoleSkill):GSkillCrazySquirrel { //技能冷却 this.cdTatal = parseInt(info.skillArgs[0]); this.role = role; @@ -40,14 +40,14 @@ export default class GSkillCrazySquirrel extends GSkillCDBase{ let ah = parseInt(this.info.skillArgs[2]); //出现松鼠丢炸弹 - GSpine.onPlayAnotherSpine(this.role,app.battleRes.effects[50001],"skill",{ + GSpine.onPlayAnotherSpine(this.role,app.battleRes.roleResSpine[30003],"skill",{ end:() => { //从天而降 let pos = enemy.v2World.add(v2(0,1000)); let end = enemy.v2World; //生成火球 - let spine = GSpine.onCreateSpine(app.battleRes.effects[50002]); + let spine = GSpine.onCreateSpine(app.battleRes.roleResSpine[30004]); this.role.mode.addGNode(spine.node,pos); spine.setAnimation(0,"animation",true); spine.node.angle = 90; @@ -59,7 +59,7 @@ export default class GSkillCrazySquirrel extends GSkillCDBase{ .onComplete(() => { let world = spine.node.worldPosition; spine.node.destroy(); - GSpine.onPlaySceneSpine(scene,v2(world.x,world.y),app.battleRes.effects[50003],"animation"); + GSpine.onPlaySceneSpine(scene,v2(world.x,world.y),app.battleRes.roleResSpine[30005],"animation"); console.log(GDetection.testAABBRole(rect(world.x,world.y,aw,ah)).length) GDetection.testAABBRole(rect(world.x,world.y,aw,ah)).forEach(role =>{ role.onHit(); diff --git a/JisolGameCocos/config/GRoleAttack.xlsx b/JisolGameCocos/config/GRoleAttack.xlsx index edb1e555dc8b584dfc3086e68b613213446a5621..3b44eaf7acc48d985599cba3f8897f55f13ade6e 100644 GIT binary patch delta 2133 zcmV-b2&(s#SfN<3p8o*c~2bo2a1)X5};00LZS%7X4zlch{TC(L)wvrnF++g3E%+S2g)^Yk~X9Q zG1~9z$B#cb7%tMpxdo-;OooVfK5{_vOvG{)qVvhf9Uw;=CIx>>G6^ACf=0t=cPHRE z<(Yz0mF1vJ4BD|IsVUDxG&d%v7;8RG6d11i;j9;lL5GmXtMw{KeOw%LN$Vbfmd zxG5Gz;T7FV!}@;{d^tWjtDfq{vYZtM6a|7)u7H_LMXR^_uh-`Qx3k?8C_i1lHd!$9&0HVr!`%gsQP)oBD1G51Nc7bte0|o#9v>cN$ z4HS4ZTx?O5Y1H(boqf*SvTVitKrU`w^b(K&-N+k znwDid8B~?QJPemXl@+zG7_M3h2jB0DoZa#KSg~3tl9rX30R7#eXu5&zWk=%Mwb=>g zI_NPZ-l;p9FG?o*sv>WB$M<5E^D0o%rn5|gbTrQ@pAcCVtIFDM$L0eNH!!)!qAY*J ztDNp2h>0`L>2#W%nr@cYy$WN2qE*1e_Sgwt-DM*4Z?5GId})K5>sh+FTqY`^h8 zMOSxGxboqS#Qa^bQ)m44ME3Z=N|p<@1GD%Zn&6T1ZwUMyhC*O(vYL4>4-E*GnAiSi z?0bSYpV?k)Sy^uU+r;;>Toljj3q*fx{6{W8;@9HoAf)94jO|<3~{zHT%q-SqUT?KgQ%aFCl*u{OeT( z)~WAR*^9iM##uV?TEdb@#Tq{E;c)HY^W_XAX>c!NP~2x!xnSR9F1Yr=>v)C}B1OX{ z%V@av(Qz_cuc+aGli_gf!=v>qB4=Or;cy+Yr*!SBJ~~>)>$Co0KlSv{8)|=~L$Jth zu3LWcpaG$aHa@Jo+GphwIXr*a_zuhr*yt*TBFZuNla2Efqxmgj5}^rN%mqoXqVMk&F@BDPo}!BdK7;pOC7fwbZ3fqohs|t1)6b zMXWVqBo%z)-s!pCX@KG0%RP?5FnqI%*em6IPis!?`JhlJ`LO=Xd}n`8s1+FQ|8G91 zEO)*{&ktaud~eM$+&|}w-dKHWfxKCzI}7AIvC+0bX}e{gw*_D$*>4l+CE(L8;)k;ohwXHtFThcl^gGm|kg&ZOGH z4`)*0W+r1~oJr>}p2vT>En{)^Z5eQKm9g`iEi}4V?FNA=XZd6w6I?7`gFw}%g#b#x zZES-;m5PPnVr3Wv%K8=p+e?jY5%E73{oBoW4Zz%_DGW9Bb{FPQ1QY_qSryE|iX?)e z1||x?VI+dV+7p7oAU(}H`^9{CTmY}M?A9C^t+srXqIC=)>)(HB=4$D++b_sF2gPc+ z-x;Kq_?G*w(*5x98s!bG%1adF(t9OVpny=#Ogwv zwKx)Dbs^49K&-CBRb2_Ox)5hqKZ zwTU&|py&6kl;}RhS!Jihc_YqFKy+W~a$id9ZiurhAlf%|b+?pgU&PrJ5bc|~?3)t1 z8{+H=i2hGq{)g{Tv?d^dRt-@|^pXTRD2P=Qg|0G+LZTrh(4m58$tZMr5)W8NJyin7 zD%2T-`oe#l9Rp9Ftoq4gq?TYAH4Wp_8F0M*-=R=_x@0fRigKIssCXW-2xTd6S(gKmmG_ z-YPr+m6IDQAscpqacKhv006Wc000;O0000000031AOHXW!IM`jMFIMgohwBFCX?eU LD+YKc00000PEYs; delta 2141 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 delta 2517 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 U5OD<1K7s<2l>~V1pnr+~3$YiQ*#H0l diff --git a/JisolGameCocos/extensions/oops-plugin-excel-to-json/.gitignore b/JisolGameCocos/extensions/oops-plugin-excel-to-json/.gitignore deleted file mode 100644 index e0fe5a7c..00000000 --- a/JisolGameCocos/extensions/oops-plugin-excel-to-json/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -excel/ -excel diff --git a/JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/editor.d.ts b/JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/editor.d.ts deleted file mode 100644 index a93588cf..00000000 --- a/JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/editor.d.ts +++ /dev/null @@ -1,1201 +0,0 @@ -/// - -/// -/// - -import * as NodeJSPath from 'path'; -import { EventEmitter } from 'events'; -import { FileFilter, BrowserWindow, OpenDialogReturnValue, SaveDialogReturnValue, MessageBoxReturnValue } from 'electron'; - -declare global { - export module Editor { - export module App { - export const userAgent: string; - /** - * 是否是开发模式 - * Development mode - */ - export const dev: boolean; - /** - * 编辑器版本号 - * Editor version - */ - export const version: string; - /** - * 主目录 - * Home directory - */ - export const home: string; - /** - * 编辑器程序文件夹 - * Program folder - */ - export const path: string; - /** - * 获取当前编辑器的临时缓存目录 - * Temporary cache directory - */ - export const temp: string; - /** - * 获取当前编辑器 icon 地址 - * Gets the icon address of the current editor - */ - export const icon: string; - /** - * 获取当前编辑器使用的 url 地址 - * Gets the URL used by the current editor - */ - export const urls: { - manual: string; - api: string; - forum: string; - }; - /** - * 退出程序 - * Exit the program - */ - export function quit(): void; - } - export module Clipboard { - export type ICopyType = 'image' | 'text' | 'files' | string; - /** - * 获取剪贴板内容 - * @param type - */ - export function read(type: ICopyType): any; - /** - * 写入剪贴板内容 - * @param type - * @param value - */ - export function write(type: 'image', value: string): boolean; - export function write(type: 'text', value: string): boolean; - export function write(type: 'files', value: FileList): boolean; - export function write(type: string, value: any): boolean; - - /** - * 判断当前剪贴板内是否是指定类型 - * @param type - */ - export function has(type: ICopyType): boolean; - /** - * 清空剪贴板 - */ - export function clear(): void; - } - export module Dialog { - export interface SelectDialogOptions { - title?: string; - path?: string; - type?: 'directory' | 'file'; - button?: string; - multi?: boolean; - filters?: FileFilter[]; - extensions?: string; - } - export interface MessageDialogOptions { - title?: string; - detail?: string; - default?: number; - cancel?: number; - checkboxLabel?: string; - checkboxChecked?: boolean; - buttons?: string[]; - } - - /** - * 选择文件弹窗 - * Select the file popover - * - * @param options 选择弹窗参数 Select popover parameters - * @param window 依附于哪个窗口(插件主进程才可使用) Which window it is attached to (only available to the plugin's main process) - */ - export function select(options?: SelectDialogOptions, window?: BrowserWindow): Promise; - /** - * 保存文件弹窗 - * Save the file popup - * - * @param options 保存文件窗口参数 Save the file window parameters - * @param window 依附于哪个窗口(插件主进程才可使用) Which window it is attached to (only available to the plugin's main process) - */ - export function save(options?: SelectDialogOptions, window?: BrowserWindow): Promise; - /** - * 信息弹窗 - * Information popup window - * - * @param message 显示的消息 Displayed message - * @param options 信息弹窗可选参数 Information popup optional parameter - * @param window 依附于哪个窗口(插件主进程才可使用) Which window it is attached to (only available to the plugin's main process) - */ - export function info(message: string, options?: MessageDialogOptions, window?: BrowserWindow): Promise; - /** - * 警告弹窗 - * Warning popup - * - * @param message 警告信息 Warning message - * @param options 警告弹窗可选参数 Warning popover optional parameter - * @param window 依附于哪个窗口(插件主进程才可使用) Which window it is attached to (only available to the plugin's main process) - */ - export function warn(message: string, options?: MessageDialogOptions, window?: BrowserWindow): Promise; - /** - * 错误弹窗 - * Error popup window - * - * @param message 错误信息 The error message - * @param options 错误弹窗可选参数 Error popover optional parameter - * @param window 依附于哪个窗口(插件主进程才可使用) Which window it is attached to (only available to the plugin's main process) - */ - export function error(message: string, options?: MessageDialogOptions, window?: BrowserWindow): Promise; - } - export module EditMode { - /** - * 标记编辑器进入了一种编辑模式 - * The tag editor goes into an edit mode - * - * @param mode 编辑模式的名字 The name of the edit mode - */ - export function enter(mode: string); - /** - * 当前所处的编辑模式 - * The current editing mode - * - */ - export function getMode(): string; - } - export module I18n { - export type I18nMap = { - [key: string]: I18nMap | string; - }; - /** - * 获取当前的语言 zh | en - * Get the current language - */ - export function getLanguage(): string; - /** - * 传入 key,翻译成当前语言 - * Passing in the key translates into the current language - * 允许翻译变量 {a},传入的第二个参数 obj 内定义 a - * The translation variable {a} is allowed, and a is defined in the second argument passed in obj - * - * @param key 用于翻译的 key 值 The key value for translation - * @param obj 翻译字段内如果有 {key} 等可以在这里传入替换字段 If you have {key} in the translation field, you can pass in the replacement field here - */ - export function t(key: string, obj?: { - [key: string]: string; - }): any; - - /** - * 选择一种翻译语言 - * Choose a translation language - * - * @param language 选择当前使用的语言 Select the language currently in use - */ - export function select(language: string): any; - } - export module Layout { - /** - * 应用布局信息 - * Application layout information - * - * @param json 布局文件内容 Layout file content - */ - export function apply(json: any) - /** - * 初始化布局系统 - * Initialize the layout system - */ - export function init() - } - export module Logger { - /** - * 清空所有的日志 - * Clear all logs - */ - export function clear(regexp?: string | RegExp): any; - /** - * 查询所有日志 - * Query all logs - */ - export function query(): any; - } - export module Menu { - export interface BaseMenuItem { - template?: string; - type?: string; - label?: string; - subLabel?: string; - checked?: boolean; - enabled?: boolean; - icon?: string; - accelerator?: string; - order?: number; - group?: string; - message?: string; - target?: string; - params?: any[]; - click?: Function | null; - role?: string; - submenu?: MenuTemplateItem[]; - } - export interface MainMenuItem extends BaseMenuItem { - path: string; - } - export interface ContextMenuItem extends BaseMenuItem { - accelerator?: string; - } - export interface MenuTemplateItem extends BaseMenuItem { - } - export interface PopupOptions { - x?: number; - y?: number; - menu: ContextMenuItem[]; - } - /** - * 右键弹窗 - * Right-click pop-up - * 只有面板进程可以使用 - * Only panel processes can be used - * - * @param json - */ - export function popup(json: PopupOptions): any; - } - export module Message { - export interface MessageInfo { - methods: string[]; - public?: boolean; - description?: string; - doc?: string; - sync?: boolean; - } - - export interface TableBase { - [x: string]: any; - params: any[]; - } - /** - * 发送一个消息,并等待返回 - * Send a message and wait for it to return - * - * @param name 目标插件的名字 The name of the target plug-in - * @param message 触发消息的名字 The name of the trigger message - * @param args 消息需要的参数 The parameters required for the message - */ - export function request(name: J, message: K, ...args: EditorMessageMaps[J][K]['params']): Promise; - /** - * 发送一个消息,没有返回 - * Send a message, no return - * - * @param name 目标插件的名字 The name of the target plug-in - * @param message 触发消息的名字 The name of the trigger message - * @param args 消息需要的参数 The parameters required for the message - */ - export function send(name: M, message: N, ...args: EditorMessageMaps[M][N]['params']): void; - /** - * 广播一个消息 - * Broadcast a message - * - * @param message 消息的名字 Name of message - * @param args 消息附加的参数 Parameter attached to the message - */ - export function broadcast(message: string, ...args: any[]): void; - /** - * 新增一个广播消息监听器 - * Add a new broadcast message listener - * 不监听的时候,需要主动取消监听 - * When not listening, you need to take the initiative to cancel listening - * - * @param message 消息名 Message name - * @param func 处理函数 The processing function - */ - export function addBroadcastListener(message: string, func: Function): any; - /** - * 新增一个广播消息监听器 - * Removes a broadcast message listener - * - * @param message 消息名 Message name - * @param func 处理函数 The processing function - */ - export function removeBroadcastListener(message: string, func: Function): any; - } - export module Network { - /** - * 查询当前电脑的 ip 列表 - * Query the IP list of the current computer - */ - export function queryIPList(): string[]; - /** - * 测试是否可以联通 passport.cocos.com 服务器 - * Test whether you can connect to the passport.cocos.com server - */ - export function testConnectServer(): Promise; - /** - * 检查一个端口是否被占用 - * Checks if a port is used - * - * @param port - */ - export function portIsOccupied(port: number): Promise; - /** - * 测试是否可以联通某一台主机 - * Test whether a host can be connected - * - * @param ip - */ - export function testHost(ip: string): Promise; - /** - * Get 方式请求某个服务器数据 - * GET requests data from a server - * - * @param url - * @param data - */ - export function get(url: string, data?: { - [index: string]: string | string[]; - }): Promise; - /** - * Post 方式请求某个服务器数据 - * POST requests data from a server - * - * @param url - * @param data - */ - export function post(url: string, data?: { - [index: string]: string | number | string[]; - }): Promise; - } - export module Package { - // export module VERSION: string; - export interface GetPackageOptions { - name?: string; - debug?: boolean; - path?: string; - enable?: boolean; - invalid?: boolean; - } - export interface PackageJson { - author?: string; - debug?: boolean; - description?: string; - main?: string; - menu?: any; - name: string; - version: string; - windows: string; - editor?: string; - panel?: any; - } - export type PathType = 'home' | 'data' | 'temp'; - /** - * 查询插件列表 - * Query Plug-in List - * - * @param options - */ - export function getPackages(options?: GetPackageOptions): Editor.Interface.PackageInfo[]; - /** - * 注册一个插件 - * Register a plug-in - * 谨慎使用,之后会被移除 - * Use with caution and it will be removed later - * - * @param path - */ - export function register(path: string): any; - /** - * 反注册一个插件 - * Unregister a plug-in - * 谨慎使用,之后会被移除 - * Use with caution and it will be removed later - * - * @param path - */ - export function unregister(path: string): any; - /** - * 启动一个插件 - * Enable a plug-in - * - * @param path - */ - export function enable(path: string): any; - /** - * 关闭一个插件 - * Disable a plug-in - * - * @param path - */ - export function disable(path: string, options: any): any; - /** - * 获取一个插件的几个预制目录地址 - * Gets several prefab directory addresses for a plug-in - * - * @param extensionName 扩展的名字 Name of the extension - * @param type 地址类型(temp 临时目录,data 需要同步的数据目录,不传则返回现在打开的插件路径) Address type (temp temporary directory, data need to synchronize data directory, do not pass to return the current open plug-in path) - */ - export function getPath(extensionName: string, type?: PathType): any; - } - export module Panel { - export const _kitControl: any; - /** - * 打开一个面板 - * Open up a panel - * - * @param name - * @param args - */ - export function open(name: string, ...args: any[]): any; - /** - * 关闭一个面板 - * Close a panel - * - * @param name - */ - export function close(name: string): any; - /** - * 将焦点传递给一个面板 - * Pass focus to a panel - * - * @param name - */ - export function focus(name: string): any; - /** - * 检查面板是否已经打开 - * Check that the panel is open - * - * @param name - */ - export function has(name: string): Promise; - /** - * 查询当前窗口里某个面板里的元素列表 - * @param name - * @param selector - */ - export function querySelector(name: string, selector: string): Promise; - - export type Selector<$> = { $: Record } - - export type Options void> = { - /** - * @en Listening to panel events - * @zh 监听面板事件 - */ - listeners?: { - /** - * @en Hooks triggered when the panel is displayed - * @zh 面板显示的时候触发的钩子 - */ - show?: () => any; - /** - * @en Hooks triggered when the panel is hidden - * @zh 面板隐藏的时候触发的钩子 - */ - hide?: () => any; - }; - - /** - * @en Template of the panel - * @zh 面板的内容 - */ - template: string; - /** - * @en Style of the panel - * @zh 面板上的样式 - * */ - style?: string; - /** - * @en Selector of the panel - * @zh 快捷选择器 - */ - $?: S; - /** - * @en Panel built-in function methods that can be called in Messages, Listeners, lifecycle functions - * @zh panel 内置的函数方法,可以在 messages、listeners、生命周期函数内调用 - */ - methods?: M; - /** - * @en Hooks triggered when the panel is update - * @zh 面板数据更新后触发的钩子函数 - */ - update?: (...args: Parameters) => void; - /** - * @en Hooks triggered when the panel is ready - * @zh 面板启动后触发的钩子函数 - */ - ready?: () => void; - /** - * @en The function that will be triggered when the panel is ready to close, and will terminate the closing of the panel if it - * returns false - * @zh 面板准备关闭的时候会触发的函数,return false 的话,会终止关闭面板 - * 生命周期函数,在 panel 准备关闭的时候触发 - * 如果 return false,则会中断关闭流程,请谨慎使用,错误的判断会导致编辑器无法关闭。 - */ - beforeClose?: () => Promise | boolean | void; - /** - * @en Hook functions after panel closure - * @zh 面板关闭后的钩子函数 - */ - close?: () => void; - - } & ThisType & M> // merge them together - - export function define void, Selector = Record, M = Record>(options: Options): any; - } - export module Profile { - export type preferencesProtocol = 'default' | 'global' | 'local'; - export type projectProtocol = 'default' | 'project'; - export type tempProtocol = 'temp'; - export interface ProfileGetOptions { - type: 'deep' | 'current' | 'inherit'; - } - export interface ProfileObj { - get: (key?: string, options?: ProfileGetOptions) => any; - set: (key?: string, value?: any) => any; - remove: (key: string) => void; - save: () => void; - clear: () => void; - reset: () => void; - } - /** - * 读取插件配置 - * Read the plug-in configuration - * - * @param name 插件名 The plugin name - * @param key 配置路径 Configure path - * @param type 配置的类型,选填 Type of configuration, optional(global,local,default) - */ - export function getConfig(name: string, key?: string, type?: preferencesProtocol): Promise; - /** - * 设置插件配置 - * Set the plug-in configuration - * - * @param name 插件名 The plugin name - * @param key 配置路径 Configure path - * @param value 配置的值 The value of the configuration - * @param type 配置的类型,选填 Type of configuration, optional(global,local,default) - */ - export function setConfig(name: string, key: string, value: any, type?: preferencesProtocol): Promise; - /** - * 删除某个插件配置 - * Delete a plug-in configuration - * - * @param name 插件名 The plugin name - * @param key 配置路径 Configure path - * @param type 配置的类型,选填 Type of configuration, optional(global,local,default) - */ - export function removeConfig(name: string, key: string, type?: preferencesProtocol): Promise; - /** - * 读取插件内的项目配置 - * Read the project configuration within the plug-in - * - * @param name 插件名 The plugin name - * @param key 配置路径 Configure path - * @param type 配置的类型,选填 Type of configuration, optional(project,default) - */ - export function getProject(name: string, key?: string, type?: projectProtocol): Promise; - /** - * 设置插件内的项目配置 - * Set the project configuration within the plug-in - * - * @param name 插件名 The plugin name - * @param key 配置路径 Configure path - * @param value 配置的值 The value of the configuration - * @param type 配置的类型,选填 Type of configuration, optional(project,default) - */ - export function setProject(name: string, key: string, value: any, type?: projectProtocol): Promise; - /** - * 删除插件内的项目配置 - * Delete the project configuration within the plug-in - * - * @param name 插件名 The plugin name - * @param key 配置路径 Configure path - * @param type 配置的类型,选填 Type of configuration, optional(project,default) - */ - export function removeProject(name: string, key: string, type?: projectProtocol): Promise; - /** - * 读取插件配置 - * Read the plug-in configuration - * - * @param name 插件名 The plugin name - * @param key 配置路径 Configure path - */ - export function getTemp(name: string, key?: string): Promise; - /** - * 设置插件配置 - * Set the plug-in configuration - * - * @param name 插件名 The plugin name - * @param key 配置路径 Configure path - * @param value 配置的值 The value of the configuration - */ - export function setTemp(name: string, key: string, value: any): Promise; - /** - * 删除某个插件配置 - * Delete a plug-in configuration - * - * @param name 插件名 The plugin name - * @param key 配置路径 Configure path - */ - export function removeTemp(name: string, key: string): Promise; - /** - * 迁移插件某个版本的本地配置数据到编辑器最新版本 - * Migrate the local configuration data of a certain version of the plugin to the latest version of the editor - * - * @param pkgName - * @param profileVersion - * @param profileData - */ - export function migrateLocal(pkgName: string, profileVersion: string, profileData: any): any; - /** - * 迁移插件某个版本的全局配置数据到编辑器最新版本 - * Migrate the global configuration data of a certain version of the plugin to the latest version of the editor - * - * @param pkgName - * @param profileVersion - * @param profileData - */ - export function migrateGlobal(pkgName: string, profileVersion: string, profileData: any): any; - /** - * 迁移插件某个版本的项目配置数据到编辑器最新版本 - * Migrate the project configuration data of a certain version of the plugin to the latest version of the editor - * - * @param pkgName - * @param profileVersion - * @param profileData - */ - export function migrateProject(pkgName: string, profileVersion: string, profileData: any): any; - } - export module Project { - /** - * 创建一个项目 - * Creating a project - * 谨慎使用,之后会被移除 - * Use with caution and it will be removed later - */ - export function create(): any; - /** - * 打开一个项目 - * Open a project - * 谨慎使用,之后会被移除 - * Use with caution and it will be removed later - * - * @param path - */ - export function open(path?: string): Promise; - /** - * 添加一个项目 - * Add a project - * 谨慎使用,之后会被移除 - * Use with caution and it will be removed later - * - * @param path - */ - export function add(path: string): any; - /** - * 当前项目路径 - * Current project path - */ - export const path: string; - /** - * 当前项目 uuid - * The current project UUID - */ - export const uuid: string; - /** - * 当前项目名称(取自 package.json) - * The current project name - */ - export const name: string; - /** - * 当前项目临时文件夹 - * Temporary folder for current project - */ - export const tmpDir: string; - /** - * 当前项目类型 - * 谨慎使用,之后会被移除 - * Use with caution and it will be removed later - */ - export const type: '2d' | '3d'; - } - export module Selection { - /** - * 选中一个或者一组元素 - * Select one or a group of elements - * - * @param type - * @param uuid - */ - export function select(type: string, uuid: string | string[]): any; - /** - * 取消一个或者一组元素的选中状态 - * To deselect one or a group of elements - * - * @param type - * @param uuid - */ - export function unselect(type: string, uuid: string | string[]): any; - /** - * 清空一个类型的所有选中元素 - * Clears all selected elements of a type - * - * @param type - */ - export function clear(type: string): any; - /** - * 更新当前选中的类型数据 - * Updates the currently selected type data - * - * @param type - * @param uuids - */ - export function update(type: string, uuids: string[]): any; - /** - * 悬停触碰了某个元素 - * Hover touches an element - * 会发出 selection:hover 的广播消息 - * A broadcast message for selection:hover is issued - * - * @param type - * @param uuid - */ - export function hover(type: string, uuid?: string): any; - /** - * 获取最后选中的元素的类型 - * Gets the type of the last selected element - */ - export function getLastSelectedType(): string; - /** - * 获取某个类型内,最后选中的元素 - * Gets the last selected element of a type - * - * @param type - */ - export function getLastSelected(type: string): string; - /** - * 获取一个类型选中的所有元素数组 - * Gets an array of all elements selected for a type - * - * @param type - */ - export function getSelected(type: string): string[]; - } - export module Task { - export interface NoticeOptions { - title: string; - message?: string; - type?: 'error' | 'warn' | 'log' | 'success'; - source?: string; - timeout?: number; - } - /** - * 添加一个同步任务 - * Add a synchronous task - * 会在主窗口显示一个遮罩层 - * A mask layer is displayed in the main window - * - * @param title 任务名字 The task name - * @param describe 任务描述 Task description - * @param message 任务内容 Content of the task - */ - export function addSyncTask(title: string, describe?: string, message?: string): any; - /** - * 更新某一个同步任务显示的数据 - * Update the data displayed by a synchronous task - * - * @param title 任务名字 The task name - * @param describe 任务描述 Task description - * @param message 任务内容 Content of the task - */ - export function updateSyncTask(title: string, describe?: string, message?: string): any; - /** - * 删除一个同步任务 - * Delete a synchronous task - * - * @param title 任务的名字 The name of the task - */ - export function removeSyncTask(title: string): any; - /** - * 添加一个通知 - * Add a notification - * - * @param options 消息配置 Message configuration - */ - export function addNotice(options: NoticeOptions): any; - /** - * 删除一个通知 - * Delete a notification - * - * @param id 通知 id Notification ID - */ - export function removeNotice(id: number): any; - /** - * 修改 notice 自动移除的时间 - * Modify notice automatic removal time - * - * @param id 通知 id Notification ID - * @param time 超时时间 timeout - */ - export function changeNoticeTimeout(id: number, time: number): any; - /** - * 查询所有通知 - * Query all notifications - */ - export function queryNotices(): any; - /** - * 页面进程立即同步一次主进程数据 - * The page process synchronizes the master process data immediately - * 谨慎使用,之后会被移除 - * Use with caution and it will be removed later - */ - export function sync(): any; - } - export module Theme { - /** - * 获取所有主题的名字 - * Gets the names of all topics - */ - export function getList(): any; - /** - * 使用某个皮肤 - * Use a certain skin - * - * @param name - */ - export function use(name?: string): any; - } - export module UI { - /** - * 在当前页面上注册一个自定义节点 - * Registers a custom node on the current page - * 谨慎使用,之后会被移除 - * Use with caution and it will be removed later - * - * @param tagName 元素名字 - * @param element 元素的定义函数 - */ - export function register(tagName: string, element: any): void; - export const Base: any; - export const Button: any; - export const Input: any; - export const NumInput: any; - export const Loading: any; - export const Checkbox: any; - export const Section: any; - export const Select: any; - export const Bit: any; - export const Slider: any; - export const ColorPicker: any; - export const Color: any; - export const DragItem: any; - export const DragArea: any; - export const DragObject: any; - export const Prop: any; - export const Tooltip: any; - export const TextArea: any; - export const Progress: any; - export const Label: any; - export const Code: any; - export const Tab: any; - export const Gradient: any; - export const GradientPicker: any; - export const Icon: any; - export const File: any; - export const Link: any; - export const Image: any; - export const QRCode: any; - export const Markdown: any; - export const Curve: any; - export const CurveEditor: any; - export const NodeGraph: any; - } - export module User { - export interface UserData { - session_id: string; - session_key: string; - cocos_uid: string; - email: string; - nickname: string; - } - /** - * 跳过 User - * Skip the User - * 谨慎使用,之后会被移除 - * Use with caution and it will be removed later - */ - export function skip(): any; - /** - * 获取 user 数据 - * Get user data - */ - export function getData(): Promise; - /** - * 检查用户是否登陆 - * Check if the user is logged in - */ - export function isLoggedIn(): Promise; - /** - * 用户登陆 - * The user login - * 失败会抛出异常 - * Failure throws an exception - * - * @param username - * @param password - */ - export function login(username: string, password: string): Promise; - /** - * 退出登陆 - * Logged out - * 失败会抛出异常 - * Failure throws an exception - */ - export function logout(): void; - /** - * 获取用户 token - * Get user token - * 失败会抛出异常 - * Failure throws an exception - */ - export function getUserToken(): Promise; - /** - * 根据插件 id 返回 session code - * Returns the session code based on the plug-in ID - * - * @param extensionId - */ - export function getSessionCode(extensionId: number): Promise; - /** - * 显示用户登陆遮罩层 - * Shows user login mask layer - * 谨慎使用,之后会被移除 - * Use with caution and it will be removed later - */ - export function showMask(): void; - /** - * 隐藏用户登陆遮罩层 - * Hide user login mask layer - * 谨慎使用,之后会被移除 - * Use with caution and it will be removed later - */ - export function hideMask(): void; - /** - * 监听事件 - * Listen for an event - * 谨慎使用,之后会被移除 - * Use with caution and it will be removed later - * @param action - * @param handle - */ - export function on(action: string, handle: Function): any; - /** - * 监听一次事件 - * Listening for one event - * 谨慎使用,之后会被移除 - * Use with caution and it will be removed later - * @param action - * @param handle - */ - export function once(action: string, handle: Function): any; - /** - * 取消已经监听的事件 - * Cancels the event you are listening for - * 谨慎使用,之后会被移除 - * Use with caution and it will be removed later - * @param action - * @param handle - */ - export function removeListener(action: string, handle: Function): any; - } - export module Utils { - export module File { - /** - * 初始化一个可用的文件名 - * Initializes a available filename - * 返回可用名称的文件路径 - * Returns the file path with the available name - * - * @param file 初始文件路径 Initial file path - */ - export function getName(file: string): string; - interface UnzipOptions { - peel?: boolean; - } - /** - * 解压文件夹 - * Unzip folder - * - * @param zip - * @param target - * @param options - */ - export function unzip(zip: string, target: string, options?: UnzipOptions): Promise; - /** - * 复制一个文件到另一个位置 - * Copy a file to another location - * - * @param source - * @param target - */ - export function copy(source: string, target: string): void; - } - export module Path { - - /** - * 返回一个不含扩展名的文件名 - * @param path - */ - export function basenameNoExt(path: string): string; - /** - * 将 \ 统一换成 / - * @param path - */ - export function slash(path: string): string; - /** - * 去除路径最后的斜杆,返回一个不带斜杆的路径 - * @param path - */ - export function stripSep(path: string): string; - /** - * 删除一个路径的扩展名 - * @param path - */ - export function stripExt(path: string): string; - /** - * 判断路径 pathA 是否包含 pathB - * pathA = foo/bar, pathB = foo/bar/foobar, return true - * pathA = foo/bar, pathB = foo/bar, return true - * pathA = foo/bar/foobar, pathB = foo/bar, return false - * pathA = foo/bar/foobar, pathB = foobar/bar/foo, return false - * @param pathA - * @param pathB - */ - export function contains(pathA: string, pathB: string): boolean; - /** - * 格式化路径 - * 如果是 Windows 平台,需要将盘符转成小写进行判断 - * @param path - */ - export function normalize(path: string): string; - export const join: typeof NodeJSPath.join; - export const resolve: typeof NodeJSPath.resolve; - export const isAbsolute: typeof NodeJSPath.isAbsolute; - export const relative: typeof NodeJSPath.relative; - export const dirname: typeof NodeJSPath.dirname; - export const basename: typeof NodeJSPath.basename; - export const extname: typeof NodeJSPath.extname; - export const sep: '\\' | '/'; - export const delimiter: ';' | ':'; - export const parse: typeof NodeJSPath.parse; - export const format: typeof NodeJSPath.format; - - - } - export module Math { - /** - * 取给定边界范围的值 - * Take the value of the given boundary range - * @param {number} val - * @param {number} min - * @param {number} max - */ - export function clamp(val: number, min: number, max: number): any; - /** - * @function clamp01 - * @param {number} val - * @returns {number} - * - * Clamps a value between 0 and 1. - */ - export function clamp01(val: number): number; - /** - * 加法函数 - * 入参:函数内部转化时会先转字符串再转数值,因而传入字符串或 number 均可 - * 返回值:arg1 加上 arg2 的精确结果 - * @param {number|string} arg1 - * @param {number|string} arg2 - */ - export function add(arg1: number | string, arg2: number | string): number; - /** - * 减法函数 - * 入参:函数内部转化时会先转字符串再转数值,因而传入字符串或number均可 - * 返回值:arg1 减 arg2的精确结果 - * @param {number|string} arg1 - * @param {number|string} arg2 - */ - export function sub(arg1: number | string, arg2: number | string): number; - /** - * 保留小数点 - * @param val - * @param num - */ - export function toFixed(val: number, num: number): number; - } - export module Parse { - interface WhenParam { - PanelName?: string; - EditMode?: string; - ProjectType?: string; - } - /** - * 解析 when 参数 - * when 的格式: - * PanelName === '' && EditMode === '' - * 整理后的数据格式: - * { - * PanelName: '', - * EditMode: '', - * } - */ - export function when(when: string): WhenParam; - /** - * 判断一个 when 数据是否符合当前条件 - * @param when - */ - export function checkWhen(when: string): boolean; - } - export module Url { - /** - * 快捷获取文档路径 - * @param relativeUrl - * @param type - */ - export function getDocUrl(relativeUrl: string, type?: 'manual' | 'api'): string; - } - - export module UUID { - /** - * 压缩 UUID - * compress UUID - * @param uuid - * @param min - */ - export function compressUUID(uuid: string, min: boolean): string; - /** - * 解压 UUID - * decompress the UUID - * @param str - */ - export function decompressUUID(str: string): string; - /** - * 检查输入字符串是否是 UUID - * Check whether the input string is a UUID - * @param str - */ - export function isUUID(str: string): string; - /** - * 生成一个新的 uuid - */ - export function generate(): string; - } - } - export module Module { - /** - * 导入一个项目模块。 - * @param url 项目模块的 Database URL。 - * @experimental 实验性质。 - */ - export function importProjectModule(url: string): Promise; - } - } -} - diff --git a/JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/electron.d.ts b/JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/electron.d.ts deleted file mode 100644 index e84cbb90..00000000 --- a/JisolGameCocos/extensions/oops-plugin-excel-to-json/@types/electron.d.ts +++ /dev/null @@ -1,16092 +0,0 @@ -// Type definitions for Electron 13.1.4 -// Project: http://electronjs.org/ -// Definitions by: The Electron Team -// Definitions: https://github.com/electron/electron-typescript-definitions - -/// - -type GlobalEvent = Event & { returnValue: any }; - -declare namespace Electron { - const NodeEventEmitter: typeof import('events').EventEmitter; - - class Accelerator extends String { - - } - interface App extends NodeJS.EventEmitter { - - // Docs: https://electronjs.org/docs/api/app - - /** - * Emitted when Chrome's accessibility support changes. This event fires when - * assistive technologies, such as screen readers, are enabled or disabled. See - * https://www.chromium.org/developers/design-documents/accessibility for more - * details. - * - * @platform darwin,win32 - */ - on(event: 'accessibility-support-changed', listener: (event: Event, - /** - * `true` when Chrome's accessibility support is enabled, `false` otherwise. - */ - accessibilitySupportEnabled: boolean) => void): this; - once(event: 'accessibility-support-changed', listener: (event: Event, - /** - * `true` when Chrome's accessibility support is enabled, `false` otherwise. - */ - accessibilitySupportEnabled: boolean) => void): this; - addListener(event: 'accessibility-support-changed', listener: (event: Event, - /** - * `true` when Chrome's accessibility support is enabled, `false` otherwise. - */ - accessibilitySupportEnabled: boolean) => void): this; - removeListener(event: 'accessibility-support-changed', listener: (event: Event, - /** - * `true` when Chrome's accessibility support is enabled, `false` otherwise. - */ - accessibilitySupportEnabled: boolean) => void): this; - /** - * Emitted when the application is activated. Various actions can trigger this - * event, such as launching the application for the first time, attempting to - * re-launch the application when it's already running, or clicking on the - * application's dock or taskbar icon. - * - * @platform darwin - */ - on(event: 'activate', listener: (event: Event, - hasVisibleWindows: boolean) => void): this; - once(event: 'activate', listener: (event: Event, - hasVisibleWindows: boolean) => void): this; - addListener(event: 'activate', listener: (event: Event, - hasVisibleWindows: boolean) => void): this; - removeListener(event: 'activate', listener: (event: Event, - hasVisibleWindows: boolean) => void): this; - /** - * Emitted during Handoff after an activity from this device was successfully - * resumed on another one. - * - * @platform darwin - */ - on(event: 'activity-was-continued', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: unknown) => void): this; - once(event: 'activity-was-continued', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: unknown) => void): this; - addListener(event: 'activity-was-continued', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: unknown) => void): this; - removeListener(event: 'activity-was-continued', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: unknown) => void): this; - /** - * Emitted before the application starts closing its windows. Calling - * `event.preventDefault()` will prevent the default behavior, which is terminating - * the application. - * - * **Note:** If application quit was initiated by `autoUpdater.quitAndInstall()`, - * then `before-quit` is emitted *after* emitting `close` event on all windows and - * closing them. - * - * **Note:** On Windows, this event will not be emitted if the app is closed due to - * a shutdown/restart of the system or a user logout. - */ - on(event: 'before-quit', listener: (event: Event) => void): this; - once(event: 'before-quit', listener: (event: Event) => void): this; - addListener(event: 'before-quit', listener: (event: Event) => void): this; - removeListener(event: 'before-quit', listener: (event: Event) => void): this; - /** - * Emitted when a browserWindow gets blurred. - */ - on(event: 'browser-window-blur', listener: (event: Event, - window: BrowserWindow) => void): this; - once(event: 'browser-window-blur', listener: (event: Event, - window: BrowserWindow) => void): this; - addListener(event: 'browser-window-blur', listener: (event: Event, - window: BrowserWindow) => void): this; - removeListener(event: 'browser-window-blur', listener: (event: Event, - window: BrowserWindow) => void): this; - /** - * Emitted when a new browserWindow is created. - */ - on(event: 'browser-window-created', listener: (event: Event, - window: BrowserWindow) => void): this; - once(event: 'browser-window-created', listener: (event: Event, - window: BrowserWindow) => void): this; - addListener(event: 'browser-window-created', listener: (event: Event, - window: BrowserWindow) => void): this; - removeListener(event: 'browser-window-created', listener: (event: Event, - window: BrowserWindow) => void): this; - /** - * Emitted when a browserWindow gets focused. - */ - on(event: 'browser-window-focus', listener: (event: Event, - window: BrowserWindow) => void): this; - once(event: 'browser-window-focus', listener: (event: Event, - window: BrowserWindow) => void): this; - addListener(event: 'browser-window-focus', listener: (event: Event, - window: BrowserWindow) => void): this; - removeListener(event: 'browser-window-focus', listener: (event: Event, - window: BrowserWindow) => void): this; - /** - * Emitted when failed to verify the `certificate` for `url`, to trust the - * certificate you should prevent the default behavior with - * `event.preventDefault()` and call `callback(true)`. - */ - on(event: 'certificate-error', listener: (event: Event, - webContents: WebContents, - url: string, - /** - * The error code - */ - error: string, - certificate: Certificate, - callback: (isTrusted: boolean) => void) => void): this; - once(event: 'certificate-error', listener: (event: Event, - webContents: WebContents, - url: string, - /** - * The error code - */ - error: string, - certificate: Certificate, - callback: (isTrusted: boolean) => void) => void): this; - addListener(event: 'certificate-error', listener: (event: Event, - webContents: WebContents, - url: string, - /** - * The error code - */ - error: string, - certificate: Certificate, - callback: (isTrusted: boolean) => void) => void): this; - removeListener(event: 'certificate-error', listener: (event: Event, - webContents: WebContents, - url: string, - /** - * The error code - */ - error: string, - certificate: Certificate, - callback: (isTrusted: boolean) => void) => void): this; - /** - * Emitted when the child process unexpectedly disappears. This is normally because - * it was crashed or killed. It does not include renderer processes. - */ - on(event: 'child-process-gone', listener: (event: Event, - details: Details) => void): this; - once(event: 'child-process-gone', listener: (event: Event, - details: Details) => void): this; - addListener(event: 'child-process-gone', listener: (event: Event, - details: Details) => void): this; - removeListener(event: 'child-process-gone', listener: (event: Event, - details: Details) => void): this; - /** - * Emitted during Handoff when an activity from a different device wants to be - * resumed. You should call `event.preventDefault()` if you want to handle this - * event. - * - * A user activity can be continued only in an app that has the same developer Team - * ID as the activity's source app and that supports the activity's type. Supported - * activity types are specified in the app's `Info.plist` under the - * `NSUserActivityTypes` key. - * - * @platform darwin - */ - on(event: 'continue-activity', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * Contains app-specific state stored by the activity on another device. - */ - userInfo: unknown) => void): this; - once(event: 'continue-activity', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * Contains app-specific state stored by the activity on another device. - */ - userInfo: unknown) => void): this; - addListener(event: 'continue-activity', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * Contains app-specific state stored by the activity on another device. - */ - userInfo: unknown) => void): this; - removeListener(event: 'continue-activity', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * Contains app-specific state stored by the activity on another device. - */ - userInfo: unknown) => void): this; - /** - * Emitted during Handoff when an activity from a different device fails to be - * resumed. - * - * @platform darwin - */ - on(event: 'continue-activity-error', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * A string with the error's localized description. - */ - error: string) => void): this; - once(event: 'continue-activity-error', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * A string with the error's localized description. - */ - error: string) => void): this; - addListener(event: 'continue-activity-error', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * A string with the error's localized description. - */ - error: string) => void): this; - removeListener(event: 'continue-activity-error', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * A string with the error's localized description. - */ - error: string) => void): this; - /** - * Emitted when `desktopCapturer.getSources()` is called in the renderer process of - * `webContents`. Calling `event.preventDefault()` will make it return empty - * sources. - */ - on(event: 'desktop-capturer-get-sources', listener: (event: Event, - webContents: WebContents) => void): this; - once(event: 'desktop-capturer-get-sources', listener: (event: Event, - webContents: WebContents) => void): this; - addListener(event: 'desktop-capturer-get-sources', listener: (event: Event, - webContents: WebContents) => void): this; - removeListener(event: 'desktop-capturer-get-sources', listener: (event: Event, - webContents: WebContents) => void): this; - /** - * Emitted when mac application become active. Difference from `activate` event is - * that `did-become-active` is emitted every time the app becomes active, not only - * when Dock icon is clicked or application is re-launched. - * - * @platform darwin - */ - on(event: 'did-become-active', listener: (event: Event) => void): this; - once(event: 'did-become-active', listener: (event: Event) => void): this; - addListener(event: 'did-become-active', listener: (event: Event) => void): this; - removeListener(event: 'did-become-active', listener: (event: Event) => void): this; - /** - * Emitted whenever there is a GPU info update. - */ - on(event: 'gpu-info-update', listener: Function): this; - once(event: 'gpu-info-update', listener: Function): this; - addListener(event: 'gpu-info-update', listener: Function): this; - removeListener(event: 'gpu-info-update', listener: Function): this; - /** - * Emitted when the GPU process crashes or is killed. - * - * **Deprecated:** This event is superceded by the `child-process-gone` event which - * contains more information about why the child process disappeared. It isn't - * always because it crashed. The `killed` boolean can be replaced by checking - * `reason === 'killed'` when you switch to that event. - * - * @deprecated - */ - on(event: 'gpu-process-crashed', listener: (event: Event, - killed: boolean) => void): this; - once(event: 'gpu-process-crashed', listener: (event: Event, - killed: boolean) => void): this; - addListener(event: 'gpu-process-crashed', listener: (event: Event, - killed: boolean) => void): this; - removeListener(event: 'gpu-process-crashed', listener: (event: Event, - killed: boolean) => void): this; - /** - * Emitted when `webContents` wants to do basic auth. - * - * The default behavior is to cancel all authentications. To override this you - * should prevent the default behavior with `event.preventDefault()` and call - * `callback(username, password)` with the credentials. - * - * If `callback` is called without a username or password, the authentication - * request will be cancelled and the authentication error will be returned to the - * page. - */ - on(event: 'login', listener: (event: Event, - webContents: WebContents, - authenticationResponseDetails: AuthenticationResponseDetails, - authInfo: AuthInfo, - callback: (username?: string, password?: string) => void) => void): this; - once(event: 'login', listener: (event: Event, - webContents: WebContents, - authenticationResponseDetails: AuthenticationResponseDetails, - authInfo: AuthInfo, - callback: (username?: string, password?: string) => void) => void): this; - addListener(event: 'login', listener: (event: Event, - webContents: WebContents, - authenticationResponseDetails: AuthenticationResponseDetails, - authInfo: AuthInfo, - callback: (username?: string, password?: string) => void) => void): this; - removeListener(event: 'login', listener: (event: Event, - webContents: WebContents, - authenticationResponseDetails: AuthenticationResponseDetails, - authInfo: AuthInfo, - callback: (username?: string, password?: string) => void) => void): this; - /** - * Emitted when the user clicks the native macOS new tab button. The new tab button - * is only visible if the current `BrowserWindow` has a `tabbingIdentifier` - * - * @platform darwin - */ - on(event: 'new-window-for-tab', listener: (event: Event) => void): this; - once(event: 'new-window-for-tab', listener: (event: Event) => void): this; - addListener(event: 'new-window-for-tab', listener: (event: Event) => void): this; - removeListener(event: 'new-window-for-tab', listener: (event: Event) => void): this; - /** - * Emitted when the user wants to open a file with the application. The `open-file` - * event is usually emitted when the application is already open and the OS wants - * to reuse the application to open the file. `open-file` is also emitted when a - * file is dropped onto the dock and the application is not yet running. Make sure - * to listen for the `open-file` event very early in your application startup to - * handle this case (even before the `ready` event is emitted). - * - * You should call `event.preventDefault()` if you want to handle this event. - * - * On Windows, you have to parse `process.argv` (in the main process) to get the - * filepath. - * - * @platform darwin - */ - on(event: 'open-file', listener: (event: Event, - path: string) => void): this; - once(event: 'open-file', listener: (event: Event, - path: string) => void): this; - addListener(event: 'open-file', listener: (event: Event, - path: string) => void): this; - removeListener(event: 'open-file', listener: (event: Event, - path: string) => void): this; - /** - * Emitted when the user wants to open a URL with the application. Your - * application's `Info.plist` file must define the URL scheme within the - * `CFBundleURLTypes` key, and set `NSPrincipalClass` to `AtomApplication`. - * -You should call `event.preventDefault()` if you want to handle this event. - * - * @platform darwin - */ - on(event: 'open-url', listener: (event: Event, - url: string) => void): this; - once(event: 'open-url', listener: (event: Event, - url: string) => void): this; - addListener(event: 'open-url', listener: (event: Event, - url: string) => void): this; - removeListener(event: 'open-url', listener: (event: Event, - url: string) => void): this; - /** - * Emitted when the application is quitting. - * - * **Note:** On Windows, this event will not be emitted if the app is closed due to - * a shutdown/restart of the system or a user logout. - */ - on(event: 'quit', listener: (event: Event, - exitCode: number) => void): this; - once(event: 'quit', listener: (event: Event, - exitCode: number) => void): this; - addListener(event: 'quit', listener: (event: Event, - exitCode: number) => void): this; - removeListener(event: 'quit', listener: (event: Event, - exitCode: number) => void): this; - /** - * Emitted once, when Electron has finished initializing. On macOS, `launchInfo` - * holds the `userInfo` of the `NSUserNotification` or information from - * `UNNotificationResponse` that was used to open the application, if it was - * launched from Notification Center. You can also call `app.isReady()` to check if - * this event has already fired and `app.whenReady()` to get a Promise that is - * fulfilled when Electron is initialized. - */ - on(event: 'ready', listener: (event: Event, - launchInfo: (Record) | (NotificationResponse)) => void): this; - once(event: 'ready', listener: (event: Event, - launchInfo: (Record) | (NotificationResponse)) => void): this; - addListener(event: 'ready', listener: (event: Event, - launchInfo: (Record) | (NotificationResponse)) => void): this; - removeListener(event: 'ready', listener: (event: Event, - launchInfo: (Record) | (NotificationResponse)) => void): this; - /** - * Emitted when `remote.getBuiltin()` is called in the renderer process of - * `webContents`. Calling `event.preventDefault()` will prevent the module from - * being returned. Custom value can be returned by setting `event.returnValue`. - * - * @deprecated - */ - on(event: 'remote-get-builtin', listener: (event: Event, - webContents: WebContents, - moduleName: string) => void): this; - once(event: 'remote-get-builtin', listener: (event: Event, - webContents: WebContents, - moduleName: string) => void): this; - addListener(event: 'remote-get-builtin', listener: (event: Event, - webContents: WebContents, - moduleName: string) => void): this; - removeListener(event: 'remote-get-builtin', listener: (event: Event, - webContents: WebContents, - moduleName: string) => void): this; - /** - * Emitted when `remote.getCurrentWebContents()` is called in the renderer process - * of `webContents`. Calling `event.preventDefault()` will prevent the object from - * being returned. Custom value can be returned by setting `event.returnValue`. - * - * @deprecated - */ - on(event: 'remote-get-current-web-contents', listener: (event: Event, - webContents: WebContents) => void): this; - once(event: 'remote-get-current-web-contents', listener: (event: Event, - webContents: WebContents) => void): this; - addListener(event: 'remote-get-current-web-contents', listener: (event: Event, - webContents: WebContents) => void): this; - removeListener(event: 'remote-get-current-web-contents', listener: (event: Event, - webContents: WebContents) => void): this; - /** - * Emitted when `remote.getCurrentWindow()` is called in the renderer process of - * `webContents`. Calling `event.preventDefault()` will prevent the object from - * being returned. Custom value can be returned by setting `event.returnValue`. - * - * @deprecated - */ - on(event: 'remote-get-current-window', listener: (event: Event, - webContents: WebContents) => void): this; - once(event: 'remote-get-current-window', listener: (event: Event, - webContents: WebContents) => void): this; - addListener(event: 'remote-get-current-window', listener: (event: Event, - webContents: WebContents) => void): this; - removeListener(event: 'remote-get-current-window', listener: (event: Event, - webContents: WebContents) => void): this; - /** - * Emitted when `remote.getGlobal()` is called in the renderer process of - * `webContents`. Calling `event.preventDefault()` will prevent the global from - * being returned. Custom value can be returned by setting `event.returnValue`. - * - * @deprecated - */ - on(event: 'remote-get-global', listener: (event: Event, - webContents: WebContents, - globalName: string) => void): this; - once(event: 'remote-get-global', listener: (event: Event, - webContents: WebContents, - globalName: string) => void): this; - addListener(event: 'remote-get-global', listener: (event: Event, - webContents: WebContents, - globalName: string) => void): this; - removeListener(event: 'remote-get-global', listener: (event: Event, - webContents: WebContents, - globalName: string) => void): this; - /** - * Emitted when `remote.require()` is called in the renderer process of - * `webContents`. Calling `event.preventDefault()` will prevent the module from - * being returned. Custom value can be returned by setting `event.returnValue`. - * - * @deprecated - */ - on(event: 'remote-require', listener: (event: Event, - webContents: WebContents, - moduleName: string) => void): this; - once(event: 'remote-require', listener: (event: Event, - webContents: WebContents, - moduleName: string) => void): this; - addListener(event: 'remote-require', listener: (event: Event, - webContents: WebContents, - moduleName: string) => void): this; - removeListener(event: 'remote-require', listener: (event: Event, - webContents: WebContents, - moduleName: string) => void): this; - /** - * Emitted when the renderer process unexpectedly disappears. This is normally - * because it was crashed or killed. - */ - on(event: 'render-process-gone', listener: (event: Event, - webContents: WebContents, - details: RenderProcessGoneDetails) => void): this; - once(event: 'render-process-gone', listener: (event: Event, - webContents: WebContents, - details: RenderProcessGoneDetails) => void): this; - addListener(event: 'render-process-gone', listener: (event: Event, - webContents: WebContents, - details: RenderProcessGoneDetails) => void): this; - removeListener(event: 'render-process-gone', listener: (event: Event, - webContents: WebContents, - details: RenderProcessGoneDetails) => void): this; - /** - * Emitted when the renderer process of `webContents` crashes or is killed. - * - * **Deprecated:** This event is superceded by the `render-process-gone` event - * which contains more information about why the render process disappeared. It - * isn't always because it crashed. The `killed` boolean can be replaced by - * checking `reason === 'killed'` when you switch to that event. - * - * @deprecated - */ - on(event: 'renderer-process-crashed', listener: (event: Event, - webContents: WebContents, - killed: boolean) => void): this; - once(event: 'renderer-process-crashed', listener: (event: Event, - webContents: WebContents, - killed: boolean) => void): this; - addListener(event: 'renderer-process-crashed', listener: (event: Event, - webContents: WebContents, - killed: boolean) => void): this; - removeListener(event: 'renderer-process-crashed', listener: (event: Event, - webContents: WebContents, - killed: boolean) => void): this; - /** - * This event will be emitted inside the primary instance of your application when - * a second instance has been executed and calls `app.requestSingleInstanceLock()`. - * - * `argv` is an Array of the second instance's command line arguments, and - * `workingDirectory` is its current working directory. Usually applications - * respond to this by making their primary window focused and non-minimized. - * - * **Note:** If the second instance is started by a different user than the first, - * the `argv` array will not include the arguments. - * - * This event is guaranteed to be emitted after the `ready` event of `app` gets - * emitted. - * - * **Note:** Extra command line arguments might be added by Chromium, such as - * `--original-process-start-time`. - */ - on(event: 'second-instance', listener: (event: Event, - /** - * An array of the second instance's command line arguments - */ - argv: string[], - /** - * The second instance's working directory - */ - workingDirectory: string) => void): this; - once(event: 'second-instance', listener: (event: Event, - /** - * An array of the second instance's command line arguments - */ - argv: string[], - /** - * The second instance's working directory - */ - workingDirectory: string) => void): this; - addListener(event: 'second-instance', listener: (event: Event, - /** - * An array of the second instance's command line arguments - */ - argv: string[], - /** - * The second instance's working directory - */ - workingDirectory: string) => void): this; - removeListener(event: 'second-instance', listener: (event: Event, - /** - * An array of the second instance's command line arguments - */ - argv: string[], - /** - * The second instance's working directory - */ - workingDirectory: string) => void): this; - /** - * Emitted when a client certificate is requested. - * - * The `url` corresponds to the navigation entry requesting the client certificate - * and `callback` can be called with an entry filtered from the list. Using - * `event.preventDefault()` prevents the application from using the first - * certificate from the store. - */ - on(event: 'select-client-certificate', listener: (event: Event, - webContents: WebContents, - url: string, - certificateList: Certificate[], - callback: (certificate?: Certificate) => void) => void): this; - once(event: 'select-client-certificate', listener: (event: Event, - webContents: WebContents, - url: string, - certificateList: Certificate[], - callback: (certificate?: Certificate) => void) => void): this; - addListener(event: 'select-client-certificate', listener: (event: Event, - webContents: WebContents, - url: string, - certificateList: Certificate[], - callback: (certificate?: Certificate) => void) => void): this; - removeListener(event: 'select-client-certificate', listener: (event: Event, - webContents: WebContents, - url: string, - certificateList: Certificate[], - callback: (certificate?: Certificate) => void) => void): this; - /** - * Emitted when Electron has created a new `session`. - */ - on(event: 'session-created', listener: (session: Session) => void): this; - once(event: 'session-created', listener: (session: Session) => void): this; - addListener(event: 'session-created', listener: (session: Session) => void): this; - removeListener(event: 'session-created', listener: (session: Session) => void): this; - /** - * Emitted when Handoff is about to be resumed on another device. If you need to - * update the state to be transferred, you should call `event.preventDefault()` - * immediately, construct a new `userInfo` dictionary and call - * `app.updateCurrentActivity()` in a timely manner. Otherwise, the operation will - * fail and `continue-activity-error` will be called. - * - * @platform darwin - */ - on(event: 'update-activity-state', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: unknown) => void): this; - once(event: 'update-activity-state', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: unknown) => void): this; - addListener(event: 'update-activity-state', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: unknown) => void): this; - removeListener(event: 'update-activity-state', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: unknown) => void): this; - /** - * Emitted when a new webContents is created. - */ - on(event: 'web-contents-created', listener: (event: Event, - webContents: WebContents) => void): this; - once(event: 'web-contents-created', listener: (event: Event, - webContents: WebContents) => void): this; - addListener(event: 'web-contents-created', listener: (event: Event, - webContents: WebContents) => void): this; - removeListener(event: 'web-contents-created', listener: (event: Event, - webContents: WebContents) => void): this; - /** - * Emitted during Handoff before an activity from a different device wants to be - * resumed. You should call `event.preventDefault()` if you want to handle this - * event. - * - * @platform darwin - */ - on(event: 'will-continue-activity', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string) => void): this; - once(event: 'will-continue-activity', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string) => void): this; - addListener(event: 'will-continue-activity', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string) => void): this; - removeListener(event: 'will-continue-activity', listener: (event: Event, - /** - * A string identifying the activity. Maps to `NSUserActivity.activityType`. - */ - type: string) => void): this; - /** - * Emitted when the application has finished basic startup. On Windows and Linux, - * the `will-finish-launching` event is the same as the `ready` event; on macOS, - * this event represents the `applicationWillFinishLaunching` notification of - * `NSApplication`. You would usually set up listeners for the `open-file` and - * `open-url` events here, and start the crash reporter and auto updater. - * -In most cases, you should do everything in the `ready` event handler. - */ - on(event: 'will-finish-launching', listener: Function): this; - once(event: 'will-finish-launching', listener: Function): this; - addListener(event: 'will-finish-launching', listener: Function): this; - removeListener(event: 'will-finish-launching', listener: Function): this; - /** - * Emitted when all windows have been closed and the application will quit. Calling - * `event.preventDefault()` will prevent the default behavior, which is terminating - * the application. - * - * See the description of the `window-all-closed` event for the differences between - * the `will-quit` and `window-all-closed` events. - * - * **Note:** On Windows, this event will not be emitted if the app is closed due to - * a shutdown/restart of the system or a user logout. - */ - on(event: 'will-quit', listener: (event: Event) => void): this; - once(event: 'will-quit', listener: (event: Event) => void): this; - addListener(event: 'will-quit', listener: (event: Event) => void): this; - removeListener(event: 'will-quit', listener: (event: Event) => void): this; - /** - * Emitted when all windows have been closed. - * - * If you do not subscribe to this event and all windows are closed, the default - * behavior is to quit the app; however, if you subscribe, you control whether the - * app quits or not. If the user pressed `Cmd + Q`, or the developer called - * `app.quit()`, Electron will first try to close all the windows and then emit the - * `will-quit` event, and in this case the `window-all-closed` event would not be - * emitted. - */ - on(event: 'window-all-closed', listener: Function): this; - once(event: 'window-all-closed', listener: Function): this; - addListener(event: 'window-all-closed', listener: Function): this; - removeListener(event: 'window-all-closed', listener: Function): this; - /** - * Adds `path` to the recent documents list. - * - * This list is managed by the OS. On Windows, you can visit the list from the task - * bar, and on macOS, you can visit it from dock menu. - * - * @platform darwin,win32 - */ - addRecentDocument(path: string): void; - /** - * Clears the recent documents list. - * - * @platform darwin,win32 - */ - clearRecentDocuments(): void; - /** - * By default, Chromium disables 3D APIs (e.g. WebGL) until restart on a per domain - * basis if the GPU processes crashes too frequently. This function disables that - * behavior. - -This method can only be called before app is ready. - */ - disableDomainBlockingFor3DAPIs(): void; - /** - * Disables hardware acceleration for current app. - * -This method can only be called before app is ready. - */ - disableHardwareAcceleration(): void; - /** - * Enables full sandbox mode on the app. This means that all renderers will be - * launched sandboxed, regardless of the value of the `sandbox` flag in - * WebPreferences. - -This method can only be called before app is ready. - */ - enableSandbox(): void; - /** - * Exits immediately with `exitCode`. `exitCode` defaults to 0. - * - * All windows will be closed immediately without asking the user, and the - * `before-quit` and `will-quit` events will not be emitted. - */ - exit(exitCode?: number): void; - /** - * On Linux, focuses on the first visible window. On macOS, makes the application - * the active app. On Windows, focuses on the application's first window. - * -You should seek to use the `steal` option as sparingly as possible. - */ - focus(options?: FocusOptions): void; - /** - * Resolve with an object containing the following: - * - * * `icon` NativeImage - the display icon of the app handling the protocol. - * * `path` String - installation path of the app handling the protocol. - * * `name` String - display name of the app handling the protocol. - * - * This method returns a promise that contains the application name, icon and path - * of the default handler for the protocol (aka URI scheme) of a URL. - * - * @platform darwin,win32 - */ - getApplicationInfoForProtocol(url: string): Promise; - /** - * Name of the application handling the protocol, or an empty string if there is no - * handler. For instance, if Electron is the default handler of the URL, this could - * be `Electron` on Windows and Mac. However, don't rely on the precise format - * which is not guaranteed to remain unchanged. Expect a different format on Linux, - * possibly with a `.desktop` suffix. - * - * This method returns the application name of the default handler for the protocol - * (aka URI scheme) of a URL. - */ - getApplicationNameForProtocol(url: string): string; - /** - * Array of `ProcessMetric` objects that correspond to memory and CPU usage - * statistics of all the processes associated with the app. - */ - getAppMetrics(): ProcessMetric[]; - /** - * The current application directory. - */ - getAppPath(): string; - /** - * The current value displayed in the counter badge. - * - * @platform linux,darwin - */ - getBadgeCount(): number; - /** - * The type of the currently running activity. - * - * @platform darwin - */ - getCurrentActivityType(): string; - /** - * fulfilled with the app's icon, which is a NativeImage. - * - * Fetches a path's associated icon. - * - * On _Windows_, there a 2 kinds of icons: - * - * * Icons associated with certain file extensions, like `.mp3`, `.png`, etc. - * * Icons inside the file itself, like `.exe`, `.dll`, `.ico`. - * - * On _Linux_ and _macOS_, icons depend on the application associated with file - * mime type. - */ - getFileIcon(path: string, options?: FileIconOptions): Promise; - /** - * The Graphics Feature Status from `chrome://gpu/`. - * - * **Note:** This information is only usable after the `gpu-info-update` event is - * emitted. - */ - getGPUFeatureStatus(): GPUFeatureStatus; - /** - * For `infoType` equal to `complete`: Promise is fulfilled with `Object` - * containing all the GPU Information as in chromium's GPUInfo object. This - * includes the version and driver information that's shown on `chrome://gpu` page. - * - * For `infoType` equal to `basic`: Promise is fulfilled with `Object` containing - * fewer attributes than when requested with `complete`. Here's an example of basic - * response: - * - * Using `basic` should be preferred if only basic information like `vendorId` or - * `driverId` is needed. - */ - getGPUInfo(infoType: 'basic' | 'complete'): Promise; - /** - * * `minItems` Integer - The minimum number of items that will be shown in the - * Jump List (for a more detailed description of this value see the MSDN docs). - * * `removedItems` JumpListItem[] - Array of `JumpListItem` objects that - * correspond to items that the user has explicitly removed from custom categories - * in the Jump List. These items must not be re-added to the Jump List in the - * **next** call to `app.setJumpList()`, Windows will not display any custom - * category that contains any of the removed items. - * - * @platform win32 - */ - getJumpListSettings(): JumpListSettings; - /** - * The current application locale, fetched using Chromium's `l10n_util` library. - * Possible return values are documented here. - * - * To set the locale, you'll want to use a command line switch at app startup, - * which may be found here. - * - * **Note:** When distributing your packaged app, you have to also ship the - * `locales` folder. - * - * **Note:** On Windows, you have to call it after the `ready` events gets emitted. - */ - getLocale(): string; - /** - * User operating system's locale two-letter ISO 3166 country code. The value is - * taken from native OS APIs. - * -**Note:** When unable to detect locale country code, it returns empty string. - */ - getLocaleCountryCode(): string; - /** - * If you provided `path` and `args` options to `app.setLoginItemSettings`, then - * you need to pass the same arguments here for `openAtLogin` to be set correctly. - * - * - * * `openAtLogin` Boolean - `true` if the app is set to open at login. - * * `openAsHidden` Boolean _macOS_ - `true` if the app is set to open as hidden at - * login. This setting is not available on MAS builds. - * * `wasOpenedAtLogin` Boolean _macOS_ - `true` if the app was opened at login - * automatically. This setting is not available on MAS builds. - * * `wasOpenedAsHidden` Boolean _macOS_ - `true` if the app was opened as a hidden - * login item. This indicates that the app should not open any windows at startup. - * This setting is not available on MAS builds. - * * `restoreState` Boolean _macOS_ - `true` if the app was opened as a login item - * that should restore the state from the previous session. This indicates that the - * app should restore the windows that were open the last time the app was closed. - * This setting is not available on MAS builds. - * * `executableWillLaunchAtLogin` Boolean _Windows_ - `true` if app is set to open - * at login and its run key is not deactivated. This differs from `openAtLogin` as - * it ignores the `args` option, this property will be true if the given executable - * would be launched at login with **any** arguments. - * * `launchItems` Object[] _Windows_ - * * `name` String _Windows_ - name value of a registry entry. - * * `path` String _Windows_ - The executable to an app that corresponds to a - * registry entry. - * * `args` String[] _Windows_ - the command-line arguments to pass to the - * executable. - * * `scope` String _Windows_ - one of `user` or `machine`. Indicates whether the - * registry entry is under `HKEY_CURRENT USER` or `HKEY_LOCAL_MACHINE`. - * * `enabled` Boolean _Windows_ - `true` if the app registry key is startup - * approved and therefore shows as `enabled` in Task Manager and Windows settings. - * - * @platform darwin,win32 - */ - getLoginItemSettings(options?: LoginItemSettingsOptions): LoginItemSettings; - /** - * The current application's name, which is the name in the application's - * `package.json` file. - * - * Usually the `name` field of `package.json` is a short lowercase name, according - * to the npm modules spec. You should usually also specify a `productName` field, - * which is your application's full capitalized name, and which will be preferred - * over `name` by Electron. - */ - getName(): string; - /** - * A path to a special directory or file associated with `name`. On failure, an - * `Error` is thrown. - * - * If `app.getPath('logs')` is called without called `app.setAppLogsPath()` being - * called first, a default log directory will be created equivalent to calling - * `app.setAppLogsPath()` without a `path` parameter. - */ - getPath(name: 'home' | 'appData' | 'userData' | 'cache' | 'temp' | 'exe' | 'module' | 'desktop' | 'documents' | 'downloads' | 'music' | 'pictures' | 'videos' | 'recent' | 'logs' | 'crashDumps'): string; - /** - * The version of the loaded application. If no version is found in the - * application's `package.json` file, the version of the current bundle or - * executable is returned. - */ - getVersion(): string; - /** - * This method returns whether or not this instance of your app is currently - * holding the single instance lock. You can request the lock with - * `app.requestSingleInstanceLock()` and release with - * `app.releaseSingleInstanceLock()` - */ - hasSingleInstanceLock(): boolean; - /** - * Hides all application windows without minimizing them. - * - * @platform darwin - */ - hide(): void; - /** - * Imports the certificate in pkcs12 format into the platform certificate store. - * `callback` is called with the `result` of import operation, a value of `0` - * indicates success while any other value indicates failure according to Chromium - * net_error_list. - * - * @platform linux - */ - importCertificate(options: ImportCertificateOptions, callback: (result: number) => void): void; - /** - * Invalidates the current Handoff user activity. - * - * @platform darwin - */ - invalidateCurrentActivity(): void; - /** - * `true` if Chrome's accessibility support is enabled, `false` otherwise. This API - * will return `true` if the use of assistive technologies, such as screen readers, - * has been detected. See - * https://www.chromium.org/developers/design-documents/accessibility for more - * details. - * - * @platform darwin,win32 - */ - isAccessibilitySupportEnabled(): boolean; - /** - * Whether the current executable is the default handler for a protocol (aka URI - * scheme). - * - * **Note:** On macOS, you can use this method to check if the app has been - * registered as the default protocol handler for a protocol. You can also verify - * this by checking `~/Library/Preferences/com.apple.LaunchServices.plist` on the - * macOS machine. Please refer to Apple's documentation for details. - * - * The API uses the Windows Registry and `LSCopyDefaultHandlerForURLScheme` - * internally. - */ - isDefaultProtocolClient(protocol: string, path?: string, args?: string[]): boolean; - /** - * whether or not the current OS version allows for native emoji pickers. - */ - isEmojiPanelSupported(): boolean; - /** - * Whether the application is currently running from the systems Application - * folder. Use in combination with `app.moveToApplicationsFolder()` - * - * @platform darwin - */ - isInApplicationsFolder(): boolean; - /** - * `true` if Electron has finished initializing, `false` otherwise. See also - * `app.whenReady()`. - */ - isReady(): boolean; - /** - * whether `Secure Keyboard Entry` is enabled. - * -By default this API will return `false`. - * - * @platform darwin - */ - isSecureKeyboardEntryEnabled(): boolean; - /** - * Whether the current desktop environment is Unity launcher. - * - * @platform linux - */ - isUnityRunning(): boolean; - /** - * Whether the move was successful. Please note that if the move is successful, - * your application will quit and relaunch. - * - * No confirmation dialog will be presented by default. If you wish to allow the - * user to confirm the operation, you may do so using the `dialog` API. - * - * **NOTE:** This method throws errors if anything other than the user causes the - * move to fail. For instance if the user cancels the authorization dialog, this - * method returns false. If we fail to perform the copy, then this method will - * throw an error. The message in the error should be informative and tell you - * exactly what went wrong. - * - * By default, if an app of the same name as the one being moved exists in the - * Applications directory and is _not_ running, the existing app will be trashed - * and the active app moved into its place. If it _is_ running, the pre-existing - * running app will assume focus and the previously active app will quit itself. - * This behavior can be changed by providing the optional conflict handler, where - * the boolean returned by the handler determines whether or not the move conflict - * is resolved with default behavior. i.e. returning `false` will ensure no - * further action is taken, returning `true` will result in the default behavior - * and the method continuing. - * - * For example: - * - * Would mean that if an app already exists in the user directory, if the user - * chooses to 'Continue Move' then the function would continue with its default - * behavior and the existing app will be trashed and the active app moved into its - * place. - * - * @platform darwin - */ - moveToApplicationsFolder(options?: MoveToApplicationsFolderOptions): boolean; - /** - * Try to close all windows. The `before-quit` event will be emitted first. If all - * windows are successfully closed, the `will-quit` event will be emitted and by - * default the application will terminate. - * - * This method guarantees that all `beforeunload` and `unload` event handlers are - * correctly executed. It is possible that a window cancels the quitting by - * returning `false` in the `beforeunload` event handler. - */ - quit(): void; - /** - * Relaunches the app when current instance exits. - * - * By default, the new instance will use the same working directory and command - * line arguments with current instance. When `args` is specified, the `args` will - * be passed as command line arguments instead. When `execPath` is specified, the - * `execPath` will be executed for relaunch instead of current app. - * - * Note that this method does not quit the app when executed, you have to call - * `app.quit` or `app.exit` after calling `app.relaunch` to make the app restart. - * - * When `app.relaunch` is called for multiple times, multiple instances will be - * started after current instance exited. - * - * An example of restarting current instance immediately and adding a new command - * line argument to the new instance: - */ - relaunch(options?: RelaunchOptions): void; - /** - * Releases all locks that were created by `requestSingleInstanceLock`. This will - * allow multiple instances of the application to once again run side by side. - */ - releaseSingleInstanceLock(): void; - /** - * Whether the call succeeded. - * - * This method checks if the current executable as the default handler for a - * protocol (aka URI scheme). If so, it will remove the app as the default handler. - * - * @platform darwin,win32 - */ - removeAsDefaultProtocolClient(protocol: string, path?: string, args?: string[]): boolean; - /** - * The return value of this method indicates whether or not this instance of your - * application successfully obtained the lock. If it failed to obtain the lock, - * you can assume that another instance of your application is already running with - * the lock and exit immediately. - * - * I.e. This method returns `true` if your process is the primary instance of your - * application and your app should continue loading. It returns `false` if your - * process should immediately quit as it has sent its parameters to another - * instance that has already acquired the lock. - * - * On macOS, the system enforces single instance automatically when users try to - * open a second instance of your app in Finder, and the `open-file` and `open-url` - * events will be emitted for that. However when users start your app in command - * line, the system's single instance mechanism will be bypassed, and you have to - * use this method to ensure single instance. - * - * An example of activating the window of primary instance when a second instance - * starts: - */ - requestSingleInstanceLock(): boolean; - /** - * Marks the current Handoff user activity as inactive without invalidating it. - * - * @platform darwin - */ - resignCurrentActivity(): void; - /** - * Set the about panel options. This will override the values defined in the app's - * `.plist` file on macOS. See the Apple docs for more details. On Linux, values - * must be set in order to be shown; there are no defaults. - * - * If you do not set `credits` but still wish to surface them in your app, AppKit - * will look for a file named "Credits.html", "Credits.rtf", and "Credits.rtfd", in - * that order, in the bundle returned by the NSBundle class method main. The first - * file found is used, and if none is found, the info area is left blank. See Apple - * documentation for more information. - */ - setAboutPanelOptions(options: AboutPanelOptionsOptions): void; - /** - * Manually enables Chrome's accessibility support, allowing to expose - * accessibility switch to users in application settings. See Chromium's - * accessibility docs for more details. Disabled by default. - * - * This API must be called after the `ready` event is emitted. - * - * **Note:** Rendering accessibility tree can significantly affect the performance - * of your app. It should not be enabled by default. - * - * @platform darwin,win32 - */ - setAccessibilitySupportEnabled(enabled: boolean): void; - /** - * Sets the activation policy for a given app. - * - * Activation policy types: - * - * * 'regular' - The application is an ordinary app that appears in the Dock and - * may have a user interface. - * * 'accessory' - The application doesn’t appear in the Dock and doesn’t have a - * menu bar, but it may be activated programmatically or by clicking on one of its - * windows. - * * 'prohibited' - The application doesn’t appear in the Dock and may not create - * windows or be activated. - * - * @platform darwin - */ - setActivationPolicy(policy: 'regular' | 'accessory' | 'prohibited'): void; - /** - * Sets or creates a directory your app's logs which can then be manipulated with - * `app.getPath()` or `app.setPath(pathName, newPath)`. - * - * Calling `app.setAppLogsPath()` without a `path` parameter will result in this - * directory being set to `~/Library/Logs/YourAppName` on _macOS_, and inside the - * `userData` directory on _Linux_ and _Windows_. - */ - setAppLogsPath(path?: string): void; - /** - * Changes the Application User Model ID to `id`. - * - * @platform win32 - */ - setAppUserModelId(id: string): void; - /** - * Whether the call succeeded. - * - * Sets the current executable as the default handler for a protocol (aka URI - * scheme). It allows you to integrate your app deeper into the operating system. - * Once registered, all links with `your-protocol://` will be opened with the - * current executable. The whole link, including protocol, will be passed to your - * application as a parameter. - * - * **Note:** On macOS, you can only register protocols that have been added to your - * app's `info.plist`, which cannot be modified at runtime. However, you can change - * the file during build time via Electron Forge, Electron Packager, or by editing - * `info.plist` with a text editor. Please refer to Apple's documentation for - * details. - * - * **Note:** In a Windows Store environment (when packaged as an `appx`) this API - * will return `true` for all calls but the registry key it sets won't be - * accessible by other applications. In order to register your Windows Store - * application as a default protocol handler you must declare the protocol in your - * manifest. - * - * The API uses the Windows Registry and `LSSetDefaultHandlerForURLScheme` - * internally. - */ - setAsDefaultProtocolClient(protocol: string, path?: string, args?: string[]): boolean; - /** - * Whether the call succeeded. - * - * Sets the counter badge for current app. Setting the count to `0` will hide the - * badge. - * - * On macOS, it shows on the dock icon. On Linux, it only works for Unity launcher. - * - * **Note:** Unity launcher requires the existence of a `.desktop` file to work, - * for more information please read Desktop Environment Integration. - * - * @platform linux,darwin - */ - setBadgeCount(count?: number): boolean; - /** - * Sets or removes a custom Jump List for the application, and returns one of the - * following strings: - * - * * `ok` - Nothing went wrong. - * * `error` - One or more errors occurred, enable runtime logging to figure out - * the likely cause. - * * `invalidSeparatorError` - An attempt was made to add a separator to a custom - * category in the Jump List. Separators are only allowed in the standard `Tasks` - * category. - * * `fileTypeRegistrationError` - An attempt was made to add a file link to the - * Jump List for a file type the app isn't registered to handle. - * * `customCategoryAccessDeniedError` - Custom categories can't be added to the - * Jump List due to user privacy or group policy settings. - * - * If `categories` is `null` the previously set custom Jump List (if any) will be - * replaced by the standard Jump List for the app (managed by Windows). - * - * **Note:** If a `JumpListCategory` object has neither the `type` nor the `name` - * property set then its `type` is assumed to be `tasks`. If the `name` property is - * set but the `type` property is omitted then the `type` is assumed to be - * `custom`. - * - * **Note:** Users can remove items from custom categories, and Windows will not - * allow a removed item to be added back into a custom category until **after** the - * next successful call to `app.setJumpList(categories)`. Any attempt to re-add a - * removed item to a custom category earlier than that will result in the entire - * custom category being omitted from the Jump List. The list of removed items can - * be obtained using `app.getJumpListSettings()`. - * - * **Note:** The maximum length of a Jump List item's `description` property is 260 - * characters. Beyond this limit, the item will not be added to the Jump List, nor - * will it be displayed. - * -Here's a very simple example of creating a custom Jump List: - * - * @platform win32 - */ - setJumpList(categories: (JumpListCategory[]) | (null)): void; - /** - * To work with Electron's `autoUpdater` on Windows, which uses Squirrel, you'll - * want to set the launch path to Update.exe, and pass arguments that specify your - * application name. For example: - * - * @platform darwin,win32 - */ - setLoginItemSettings(settings: Settings): void; - /** - * Overrides the current application's name. - * - * **Note:** This function overrides the name used internally by Electron; it does - * not affect the name that the OS uses. - */ - setName(name: string): void; - /** - * Overrides the `path` to a special directory or file associated with `name`. If - * the path specifies a directory that does not exist, an `Error` is thrown. In - * that case, the directory should be created with `fs.mkdirSync` or similar. - * - * You can only override paths of a `name` defined in `app.getPath`. - * - * By default, web pages' cookies and caches will be stored under the `userData` - * directory. If you want to change this location, you have to override the - * `userData` path before the `ready` event of the `app` module is emitted. - */ - setPath(name: string, path: string): void; - /** - * Set the `Secure Keyboard Entry` is enabled in your application. - * - * By using this API, important information such as password and other sensitive - * information can be prevented from being intercepted by other processes. - * - * See Apple's documentation for more details. - * - * **Note:** Enable `Secure Keyboard Entry` only when it is needed and disable it - * when it is no longer needed. - * - * @platform darwin - */ - setSecureKeyboardEntryEnabled(enabled: boolean): void; - /** - * Creates an `NSUserActivity` and sets it as the current activity. The activity is - * eligible for Handoff to another device afterward. - * - * @platform darwin - */ - setUserActivity(type: string, userInfo: any, webpageURL?: string): void; - /** - * Adds `tasks` to the Tasks category of the Jump List on Windows. - * - * `tasks` is an array of `Task` objects. - * - * Whether the call succeeded. - * - * **Note:** If you'd like to customize the Jump List even more use - * `app.setJumpList(categories)` instead. - * - * @platform win32 - */ - setUserTasks(tasks: Task[]): boolean; - /** - * Shows application windows after they were hidden. Does not automatically focus - * them. - * - * @platform darwin - */ - show(): void; - /** - * Show the app's about panel options. These options can be overridden with - * `app.setAboutPanelOptions(options)`. - */ - showAboutPanel(): void; - /** - * Show the platform's native emoji picker. - * - * @platform darwin,win32 - */ - showEmojiPanel(): void; - /** - * This function **must** be called once you have finished accessing the security - * scoped file. If you do not remember to stop accessing the bookmark, kernel - * resources will be leaked and your app will lose its ability to reach outside the - * sandbox completely, until your app is restarted. - * - * Start accessing a security scoped resource. With this method Electron - * applications that are packaged for the Mac App Store may reach outside their - * sandbox to access files chosen by the user. See Apple's documentation for a - * description of how this system works. - * - * @platform mas - */ - startAccessingSecurityScopedResource(bookmarkData: string): Function; - /** - * Updates the current activity if its type matches `type`, merging the entries - * from `userInfo` into its current `userInfo` dictionary. - * - * @platform darwin - */ - updateCurrentActivity(type: string, userInfo: any): void; - /** - * fulfilled when Electron is initialized. May be used as a convenient alternative - * to checking `app.isReady()` and subscribing to the `ready` event if the app is - * not ready yet. - */ - whenReady(): Promise; - /** - * A `Boolean` property that's `true` if Chrome's accessibility support is enabled, - * `false` otherwise. This property will be `true` if the use of assistive - * technologies, such as screen readers, has been detected. Setting this property - * to `true` manually enables Chrome's accessibility support, allowing developers - * to expose accessibility switch to users in application settings. - * - * See Chromium's accessibility docs for more details. Disabled by default. - * - * This API must be called after the `ready` event is emitted. - * - * **Note:** Rendering accessibility tree can significantly affect the performance - * of your app. It should not be enabled by default. - * - * @platform darwin,win32 - */ - accessibilitySupportEnabled: boolean; - /** - * A `Boolean` which when `true` disables the overrides that Electron has in place - * to ensure renderer processes are restarted on every navigation. The current - * default value for this property is `true`. - * - * The intention is for these overrides to become disabled by default and then at - * some point in the future this property will be removed. This property impacts - * which native modules you can use in the renderer process. For more information - * on the direction Electron is going with renderer process restarts and usage of - * native modules in the renderer process please check out this Tracking Issue. - */ - allowRendererProcessReuse: boolean; - /** - * A `Menu | null` property that returns `Menu` if one has been set and `null` - * otherwise. Users can pass a Menu to set this property. - */ - applicationMenu: (Menu) | (null); - /** - * An `Integer` property that returns the badge count for current app. Setting the - * count to `0` will hide the badge. - * - * On macOS, setting this with any nonzero integer shows on the dock icon. On - * Linux, this property only works for Unity launcher. - * - * **Note:** Unity launcher requires the existence of a `.desktop` file to work, - * for more information please read Desktop Environment Integration. - * - * **Note:** On macOS, you need to ensure that your application has the permission - * to display notifications for this property to take effect. - * - * @platform linux,darwin - */ - badgeCount: number; - /** - * A `CommandLine` object that allows you to read and manipulate the command line - * arguments that Chromium uses. - * - */ - readonly commandLine: CommandLine; - /** - * A `Dock` `| undefined` object that allows you to perform actions on your app - * icon in the user's dock on macOS. - * - * @platform darwin - */ - readonly dock: Dock; - /** - * A `Boolean` property that returns `true` if the app is packaged, `false` - * otherwise. For many apps, this property can be used to distinguish development - * and production environments. - * - */ - readonly isPackaged: boolean; - /** - * A `String` property that indicates the current application's name, which is the - * name in the application's `package.json` file. - * - * Usually the `name` field of `package.json` is a short lowercase name, according - * to the npm modules spec. You should usually also specify a `productName` field, - * which is your application's full capitalized name, and which will be preferred - * over `name` by Electron. - */ - name: string; - /** - * A `Boolean` which when `true` indicates that the app is currently running under - * the Rosetta Translator Environment. - * - * You can use this property to prompt users to download the arm64 version of your - * application when they are running the x64 version under Rosetta incorrectly. - * - * @platform darwin - */ - readonly runningUnderRosettaTranslation: boolean; - /** - * A `String` which is the user agent string Electron will use as a global - * fallback. - * - * This is the user agent that will be used when no user agent is set at the - * `webContents` or `session` level. It is useful for ensuring that your entire - * app has the same user agent. Set to a custom value as early as possible in your - * app's initialization to ensure that your overridden value is used. - */ - userAgentFallback: string; - } - - interface AutoUpdater extends NodeJS.EventEmitter { - - // Docs: https://electronjs.org/docs/api/auto-updater - - /** - * This event is emitted after a user calls `quitAndInstall()`. - * - * When this API is called, the `before-quit` event is not emitted before all - * windows are closed. As a result you should listen to this event if you wish to - * perform actions before the windows are closed while a process is quitting, as - * well as listening to `before-quit`. - */ - on(event: 'before-quit-for-update', listener: Function): this; - once(event: 'before-quit-for-update', listener: Function): this; - addListener(event: 'before-quit-for-update', listener: Function): this; - removeListener(event: 'before-quit-for-update', listener: Function): this; - /** - * Emitted when checking if an update has started. - */ - on(event: 'checking-for-update', listener: Function): this; - once(event: 'checking-for-update', listener: Function): this; - addListener(event: 'checking-for-update', listener: Function): this; - removeListener(event: 'checking-for-update', listener: Function): this; - /** - * Emitted when there is an error while updating. - */ - on(event: 'error', listener: (error: Error) => void): this; - once(event: 'error', listener: (error: Error) => void): this; - addListener(event: 'error', listener: (error: Error) => void): this; - removeListener(event: 'error', listener: (error: Error) => void): this; - /** - * Emitted when there is an available update. The update is downloaded - * automatically. - */ - on(event: 'update-available', listener: Function): this; - once(event: 'update-available', listener: Function): this; - addListener(event: 'update-available', listener: Function): this; - removeListener(event: 'update-available', listener: Function): this; - /** - * Emitted when an update has been downloaded. - * - * On Windows only `releaseName` is available. - * - * **Note:** It is not strictly necessary to handle this event. A successfully - * downloaded update will still be applied the next time the application starts. - */ - on(event: 'update-downloaded', listener: (event: Event, - releaseNotes: string, - releaseName: string, - releaseDate: Date, - updateURL: string) => void): this; - once(event: 'update-downloaded', listener: (event: Event, - releaseNotes: string, - releaseName: string, - releaseDate: Date, - updateURL: string) => void): this; - addListener(event: 'update-downloaded', listener: (event: Event, - releaseNotes: string, - releaseName: string, - releaseDate: Date, - updateURL: string) => void): this; - removeListener(event: 'update-downloaded', listener: (event: Event, - releaseNotes: string, - releaseName: string, - releaseDate: Date, - updateURL: string) => void): this; - /** - * Emitted when there is no available update. - */ - on(event: 'update-not-available', listener: Function): this; - once(event: 'update-not-available', listener: Function): this; - addListener(event: 'update-not-available', listener: Function): this; - removeListener(event: 'update-not-available', listener: Function): this; - /** - * Asks the server whether there is an update. You must call `setFeedURL` before - * using this API. - */ - checkForUpdates(): void; - /** - * The current update feed URL. - */ - getFeedURL(): string; - /** - * Restarts the app and installs the update after it has been downloaded. It should - * only be called after `update-downloaded` has been emitted. - * - * Under the hood calling `autoUpdater.quitAndInstall()` will close all application - * windows first, and automatically call `app.quit()` after all windows have been - * closed. - * - * **Note:** It is not strictly necessary to call this function to apply an update, - * as a successfully downloaded update will always be applied the next time the - * application starts. - */ - quitAndInstall(): void; - /** - * Sets the `url` and initialize the auto updater. - */ - setFeedURL(options: FeedURLOptions): void; - } - - interface BluetoothDevice { - - // Docs: https://electronjs.org/docs/api/structures/bluetooth-device - - deviceId: string; - deviceName: string; - } - - class BrowserView { - - // Docs: https://electronjs.org/docs/api/browser-view - - /** - * BrowserView - */ - constructor(options?: BrowserViewConstructorOptions); - /** - * The `bounds` of this BrowserView instance as `Object`. - * - * @experimental - */ - getBounds(): Rectangle; - setAutoResize(options: AutoResizeOptions): void; - setBackgroundColor(color: string): void; - /** - * Resizes and moves the view to the supplied bounds relative to the window. - * - * @experimental - */ - setBounds(bounds: Rectangle): void; - webContents: WebContents; - } - - class BrowserWindow extends NodeEventEmitter { - - // Docs: https://electronjs.org/docs/api/browser-window - - /** - * Emitted when the window is set or unset to show always on top of other windows. - */ - on(event: 'always-on-top-changed', listener: (event: Event, - isAlwaysOnTop: boolean) => void): this; - once(event: 'always-on-top-changed', listener: (event: Event, - isAlwaysOnTop: boolean) => void): this; - addListener(event: 'always-on-top-changed', listener: (event: Event, - isAlwaysOnTop: boolean) => void): this; - removeListener(event: 'always-on-top-changed', listener: (event: Event, - isAlwaysOnTop: boolean) => void): this; - /** - * Emitted when an App Command is invoked. These are typically related to keyboard - * media keys or browser commands, as well as the "Back" button built into some - * mice on Windows. - * - * Commands are lowercased, underscores are replaced with hyphens, and the - * `APPCOMMAND_` prefix is stripped off. e.g. `APPCOMMAND_BROWSER_BACKWARD` is - * emitted as `browser-backward`. - * - * The following app commands are explicitly supported on Linux: - * -* `browser-backward` -* `browser-forward` - * - * @platform win32,linux - */ - on(event: 'app-command', listener: (event: Event, - command: string) => void): this; - once(event: 'app-command', listener: (event: Event, - command: string) => void): this; - addListener(event: 'app-command', listener: (event: Event, - command: string) => void): this; - removeListener(event: 'app-command', listener: (event: Event, - command: string) => void): this; - /** - * Emitted when the window loses focus. - */ - on(event: 'blur', listener: Function): this; - once(event: 'blur', listener: Function): this; - addListener(event: 'blur', listener: Function): this; - removeListener(event: 'blur', listener: Function): this; - /** - * Emitted when the window is going to be closed. It's emitted before the - * `beforeunload` and `unload` event of the DOM. Calling `event.preventDefault()` - * will cancel the close. - * - * Usually you would want to use the `beforeunload` handler to decide whether the - * window should be closed, which will also be called when the window is reloaded. - * In Electron, returning any value other than `undefined` would cancel the close. - * For example: - * - * _**Note**: There is a subtle difference between the behaviors of - * `window.onbeforeunload = handler` and `window.addEventListener('beforeunload', - * handler)`. It is recommended to always set the `event.returnValue` explicitly, - * instead of only returning a value, as the former works more consistently within - * Electron._ - */ - on(event: 'close', listener: (event: Event) => void): this; - once(event: 'close', listener: (event: Event) => void): this; - addListener(event: 'close', listener: (event: Event) => void): this; - removeListener(event: 'close', listener: (event: Event) => void): this; - /** - * Emitted when the window is closed. After you have received this event you should - * remove the reference to the window and avoid using it any more. - */ - on(event: 'closed', listener: Function): this; - once(event: 'closed', listener: Function): this; - addListener(event: 'closed', listener: Function): this; - removeListener(event: 'closed', listener: Function): this; - /** - * Emitted when the window enters a full-screen state. - */ - on(event: 'enter-full-screen', listener: Function): this; - once(event: 'enter-full-screen', listener: Function): this; - addListener(event: 'enter-full-screen', listener: Function): this; - removeListener(event: 'enter-full-screen', listener: Function): this; - /** - * Emitted when the window enters a full-screen state triggered by HTML API. - */ - on(event: 'enter-html-full-screen', listener: Function): this; - once(event: 'enter-html-full-screen', listener: Function): this; - addListener(event: 'enter-html-full-screen', listener: Function): this; - removeListener(event: 'enter-html-full-screen', listener: Function): this; - /** - * Emitted when the window gains focus. - */ - on(event: 'focus', listener: Function): this; - once(event: 'focus', listener: Function): this; - addListener(event: 'focus', listener: Function): this; - removeListener(event: 'focus', listener: Function): this; - /** - * Emitted when the window is hidden. - */ - on(event: 'hide', listener: Function): this; - once(event: 'hide', listener: Function): this; - addListener(event: 'hide', listener: Function): this; - removeListener(event: 'hide', listener: Function): this; - /** - * Emitted when the window leaves a full-screen state. - */ - on(event: 'leave-full-screen', listener: Function): this; - once(event: 'leave-full-screen', listener: Function): this; - addListener(event: 'leave-full-screen', listener: Function): this; - removeListener(event: 'leave-full-screen', listener: Function): this; - /** - * Emitted when the window leaves a full-screen state triggered by HTML API. - */ - on(event: 'leave-html-full-screen', listener: Function): this; - once(event: 'leave-html-full-screen', listener: Function): this; - addListener(event: 'leave-html-full-screen', listener: Function): this; - removeListener(event: 'leave-html-full-screen', listener: Function): this; - /** - * Emitted when window is maximized. - */ - on(event: 'maximize', listener: Function): this; - once(event: 'maximize', listener: Function): this; - addListener(event: 'maximize', listener: Function): this; - removeListener(event: 'maximize', listener: Function): this; - /** - * Emitted when the window is minimized. - */ - on(event: 'minimize', listener: Function): this; - once(event: 'minimize', listener: Function): this; - addListener(event: 'minimize', listener: Function): this; - removeListener(event: 'minimize', listener: Function): this; - /** - * Emitted when the window is being moved to a new position. - */ - on(event: 'move', listener: Function): this; - once(event: 'move', listener: Function): this; - addListener(event: 'move', listener: Function): this; - removeListener(event: 'move', listener: Function): this; - /** - * Emitted once when the window is moved to a new position. - * -__Note__: On macOS this event is an alias of `move`. - * - * @platform darwin,win32 - */ - on(event: 'moved', listener: Function): this; - once(event: 'moved', listener: Function): this; - addListener(event: 'moved', listener: Function): this; - removeListener(event: 'moved', listener: Function): this; - /** - * Emitted when the native new tab button is clicked. - * - * @platform darwin - */ - on(event: 'new-window-for-tab', listener: Function): this; - once(event: 'new-window-for-tab', listener: Function): this; - addListener(event: 'new-window-for-tab', listener: Function): this; - removeListener(event: 'new-window-for-tab', listener: Function): this; - /** - * Emitted when the document changed its title, calling `event.preventDefault()` - * will prevent the native window's title from changing. `explicitSet` is false - * when title is synthesized from file URL. - */ - on(event: 'page-title-updated', listener: (event: Event, - title: string, - explicitSet: boolean) => void): this; - once(event: 'page-title-updated', listener: (event: Event, - title: string, - explicitSet: boolean) => void): this; - addListener(event: 'page-title-updated', listener: (event: Event, - title: string, - explicitSet: boolean) => void): this; - removeListener(event: 'page-title-updated', listener: (event: Event, - title: string, - explicitSet: boolean) => void): this; - /** - * Emitted when the web page has been rendered (while not being shown) and window - * can be displayed without a visual flash. - * - * Please note that using this event implies that the renderer will be considered - * "visible" and paint even though `show` is false. This event will never fire if - * you use `paintWhenInitiallyHidden: false` - */ - on(event: 'ready-to-show', listener: Function): this; - once(event: 'ready-to-show', listener: Function): this; - addListener(event: 'ready-to-show', listener: Function): this; - removeListener(event: 'ready-to-show', listener: Function): this; - /** - * Emitted after the window has been resized. - */ - on(event: 'resize', listener: Function): this; - once(event: 'resize', listener: Function): this; - addListener(event: 'resize', listener: Function): this; - removeListener(event: 'resize', listener: Function): this; - /** - * Emitted once when the window has finished being resized. - * - * This is usually emitted when the window has been resized manually. On macOS, - * resizing the window with `setBounds`/`setSize` and setting the `animate` - * parameter to `true` will also emit this event once resizing has finished. - * - * @platform darwin,win32 - */ - on(event: 'resized', listener: Function): this; - once(event: 'resized', listener: Function): this; - addListener(event: 'resized', listener: Function): this; - removeListener(event: 'resized', listener: Function): this; - /** - * Emitted when the unresponsive web page becomes responsive again. - */ - on(event: 'responsive', listener: Function): this; - once(event: 'responsive', listener: Function): this; - addListener(event: 'responsive', listener: Function): this; - removeListener(event: 'responsive', listener: Function): this; - /** - * Emitted when the window is restored from a minimized state. - */ - on(event: 'restore', listener: Function): this; - once(event: 'restore', listener: Function): this; - addListener(event: 'restore', listener: Function): this; - removeListener(event: 'restore', listener: Function): this; - /** - * Emitted on trackpad rotation gesture. Continually emitted until rotation gesture - * is ended. The `rotation` value on each emission is the angle in degrees rotated - * since the last emission. The last emitted event upon a rotation gesture will - * always be of value `0`. Counter-clockwise rotation values are positive, while - * clockwise ones are negative. - * - * @platform darwin - */ - on(event: 'rotate-gesture', listener: (event: Event, - rotation: number) => void): this; - once(event: 'rotate-gesture', listener: (event: Event, - rotation: number) => void): this; - addListener(event: 'rotate-gesture', listener: (event: Event, - rotation: number) => void): this; - removeListener(event: 'rotate-gesture', listener: (event: Event, - rotation: number) => void): this; - /** - * Emitted when scroll wheel event phase has begun. - * - * @platform darwin - */ - on(event: 'scroll-touch-begin', listener: Function): this; - once(event: 'scroll-touch-begin', listener: Function): this; - addListener(event: 'scroll-touch-begin', listener: Function): this; - removeListener(event: 'scroll-touch-begin', listener: Function): this; - /** - * Emitted when scroll wheel event phase filed upon reaching the edge of element. - * - * @platform darwin - */ - on(event: 'scroll-touch-edge', listener: Function): this; - once(event: 'scroll-touch-edge', listener: Function): this; - addListener(event: 'scroll-touch-edge', listener: Function): this; - removeListener(event: 'scroll-touch-edge', listener: Function): this; - /** - * Emitted when scroll wheel event phase has ended. - * - * @platform darwin - */ - on(event: 'scroll-touch-end', listener: Function): this; - once(event: 'scroll-touch-end', listener: Function): this; - addListener(event: 'scroll-touch-end', listener: Function): this; - removeListener(event: 'scroll-touch-end', listener: Function): this; - /** - * Emitted when window session is going to end due to force shutdown or machine - * restart or session log off. - * - * @platform win32 - */ - on(event: 'session-end', listener: Function): this; - once(event: 'session-end', listener: Function): this; - addListener(event: 'session-end', listener: Function): this; - removeListener(event: 'session-end', listener: Function): this; - /** - * Emitted when the window opens a sheet. - * - * @platform darwin - */ - on(event: 'sheet-begin', listener: Function): this; - once(event: 'sheet-begin', listener: Function): this; - addListener(event: 'sheet-begin', listener: Function): this; - removeListener(event: 'sheet-begin', listener: Function): this; - /** - * Emitted when the window has closed a sheet. - * - * @platform darwin - */ - on(event: 'sheet-end', listener: Function): this; - once(event: 'sheet-end', listener: Function): this; - addListener(event: 'sheet-end', listener: Function): this; - removeListener(event: 'sheet-end', listener: Function): this; - /** - * Emitted when the window is shown. - */ - on(event: 'show', listener: Function): this; - once(event: 'show', listener: Function): this; - addListener(event: 'show', listener: Function): this; - removeListener(event: 'show', listener: Function): this; - /** - * Emitted on 3-finger swipe. Possible directions are `up`, `right`, `down`, - * `left`. - * - * The method underlying this event is built to handle older macOS-style trackpad - * swiping, where the content on the screen doesn't move with the swipe. Most macOS - * trackpads are not configured to allow this kind of swiping anymore, so in order - * for it to emit properly the 'Swipe between pages' preference in `System - * Preferences > Trackpad > More Gestures` must be set to 'Swipe with two or three - * fingers'. - * - * @platform darwin - */ - on(event: 'swipe', listener: (event: Event, - direction: string) => void): this; - once(event: 'swipe', listener: (event: Event, - direction: string) => void): this; - addListener(event: 'swipe', listener: (event: Event, - direction: string) => void): this; - removeListener(event: 'swipe', listener: (event: Event, - direction: string) => void): this; - /** - * Emitted when the system context menu is triggered on the window, this is - * normally only triggered when the user right clicks on the non-client area of - * your window. This is the window titlebar or any area you have declared as - * `-webkit-app-region: drag` in a frameless window. - * -Calling `event.preventDefault()` will prevent the menu from being displayed. - * - * @platform win32 - */ - on(event: 'system-context-menu', listener: (event: Event, - /** - * The screen coordinates the context menu was triggered at - */ - point: Point) => void): this; - once(event: 'system-context-menu', listener: (event: Event, - /** - * The screen coordinates the context menu was triggered at - */ - point: Point) => void): this; - addListener(event: 'system-context-menu', listener: (event: Event, - /** - * The screen coordinates the context menu was triggered at - */ - point: Point) => void): this; - removeListener(event: 'system-context-menu', listener: (event: Event, - /** - * The screen coordinates the context menu was triggered at - */ - point: Point) => void): this; - /** - * Emitted when the window exits from a maximized state. - */ - on(event: 'unmaximize', listener: Function): this; - once(event: 'unmaximize', listener: Function): this; - addListener(event: 'unmaximize', listener: Function): this; - removeListener(event: 'unmaximize', listener: Function): this; - /** - * Emitted when the web page becomes unresponsive. - */ - on(event: 'unresponsive', listener: Function): this; - once(event: 'unresponsive', listener: Function): this; - addListener(event: 'unresponsive', listener: Function): this; - removeListener(event: 'unresponsive', listener: Function): this; - /** - * Emitted before the window is moved. On Windows, calling `event.preventDefault()` - * will prevent the window from being moved. - * - * Note that this is only emitted when the window is being resized manually. - * Resizing the window with `setBounds`/`setSize` will not emit this event. - * - * @platform darwin,win32 - */ - on(event: 'will-move', listener: (event: Event, - /** - * Location the window is being moved to. - */ - newBounds: Rectangle) => void): this; - once(event: 'will-move', listener: (event: Event, - /** - * Location the window is being moved to. - */ - newBounds: Rectangle) => void): this; - addListener(event: 'will-move', listener: (event: Event, - /** - * Location the window is being moved to. - */ - newBounds: Rectangle) => void): this; - removeListener(event: 'will-move', listener: (event: Event, - /** - * Location the window is being moved to. - */ - newBounds: Rectangle) => void): this; - /** - * Emitted before the window is resized. Calling `event.preventDefault()` will - * prevent the window from being resized. - * - * Note that this is only emitted when the window is being resized manually. - * Resizing the window with `setBounds`/`setSize` will not emit this event. - * - * @platform darwin,win32 - */ - on(event: 'will-resize', listener: (event: Event, - /** - * Size the window is being resized to. - */ - newBounds: Rectangle) => void): this; - once(event: 'will-resize', listener: (event: Event, - /** - * Size the window is being resized to. - */ - newBounds: Rectangle) => void): this; - addListener(event: 'will-resize', listener: (event: Event, - /** - * Size the window is being resized to. - */ - newBounds: Rectangle) => void): this; - removeListener(event: 'will-resize', listener: (event: Event, - /** - * Size the window is being resized to. - */ - newBounds: Rectangle) => void): this; - /** - * BrowserWindow - */ - constructor(options?: BrowserWindowConstructorOptions); - /** - * The window that owns the given `browserView`. If the given view is not attached - * to any window, returns `null`. - */ - static fromBrowserView(browserView: BrowserView): (BrowserWindow) | (null); - /** - * The window with the given `id`. - */ - static fromId(id: number): (BrowserWindow) | (null); - /** - * The window that owns the given `webContents` or `null` if the contents are not - * owned by a window. - */ - static fromWebContents(webContents: WebContents): (BrowserWindow) | (null); - /** - * An array of all opened browser windows. - */ - static getAllWindows(): BrowserWindow[]; - /** - * The window that is focused in this application, otherwise returns `null`. - */ - static getFocusedWindow(): (BrowserWindow) | (null); - /** - * Replacement API for setBrowserView supporting work with multi browser views. - * - * @experimental - */ - addBrowserView(browserView: BrowserView): void; - /** - * Adds a window as a tab on this window, after the tab for the window instance. - * - * @platform darwin - */ - addTabbedWindow(browserWindow: BrowserWindow): void; - /** - * Removes focus from the window. - */ - blur(): void; - blurWebView(): void; - /** - * Resolves with a NativeImage - * - * Captures a snapshot of the page within `rect`. Omitting `rect` will capture the - * whole visible page. If the page is not visible, `rect` may be empty. - */ - capturePage(rect?: Rectangle): Promise; - /** - * Moves window to the center of the screen. - */ - center(): void; - /** - * Try to close the window. This has the same effect as a user manually clicking - * the close button of the window. The web page may cancel the close though. See - * the close event. - */ - close(): void; - /** - * Closes the currently open Quick Look panel. - * - * @platform darwin - */ - closeFilePreview(): void; - /** - * Force closing the window, the `unload` and `beforeunload` event won't be emitted - * for the web page, and `close` event will also not be emitted for this window, - * but it guarantees the `closed` event will be emitted. - */ - destroy(): void; - /** - * Starts or stops flashing the window to attract user's attention. - */ - flashFrame(flag: boolean): void; - /** - * Focuses on the window. - */ - focus(): void; - focusOnWebView(): void; - /** - * Gets the background color of the window. See Setting `backgroundColor`. - */ - getBackgroundColor(): string; - /** - * The `bounds` of the window as `Object`. - */ - getBounds(): Rectangle; - /** - * The `BrowserView` attached to `win`. Returns `null` if one is not attached. - * Throws an error if multiple `BrowserView`s are attached. - * - * @experimental - */ - getBrowserView(): (BrowserView) | (null); - /** - * an array of all BrowserViews that have been attached with `addBrowserView` or - * `setBrowserView`. - * - * **Note:** The BrowserView API is currently experimental and may change or be - * removed in future Electron releases. - * - * @experimental - */ - getBrowserViews(): BrowserView[]; - /** - * All child windows. - */ - getChildWindows(): BrowserWindow[]; - /** - * The `bounds` of the window's client area as `Object`. - */ - getContentBounds(): Rectangle; - /** - * Contains the window's client area's width and height. - */ - getContentSize(): number[]; - /** - * Contains the window's maximum width and height. - */ - getMaximumSize(): number[]; - /** - * Window id in the format of DesktopCapturerSource's id. For example - * "window:1324:0". - * - * More precisely the format is `window:id:other_id` where `id` is `HWND` on - * Windows, `CGWindowID` (`uint64_t`) on macOS and `Window` (`unsigned long`) on - * Linux. `other_id` is used to identify web contents (tabs) so within the same top - * level window. - */ - getMediaSourceId(): string; - /** - * Contains the window's minimum width and height. - */ - getMinimumSize(): number[]; - /** - * The platform-specific handle of the window. - * - * The native type of the handle is `HWND` on Windows, `NSView*` on macOS, and - * `Window` (`unsigned long`) on Linux. - */ - getNativeWindowHandle(): Buffer; - /** - * Contains the window bounds of the normal state - * - * **Note:** whatever the current state of the window : maximized, minimized or in - * fullscreen, this function always returns the position and size of the window in - * normal state. In normal state, getBounds and getNormalBounds returns the same - * `Rectangle`. - */ - getNormalBounds(): Rectangle; - /** - * between 0.0 (fully transparent) and 1.0 (fully opaque). On Linux, always returns - * 1. - */ - getOpacity(): number; - /** - * The parent window. - */ - getParentWindow(): BrowserWindow; - /** - * Contains the window's current position. - */ - getPosition(): number[]; - /** - * The pathname of the file the window represents. - * - * @platform darwin - */ - getRepresentedFilename(): string; - /** - * Contains the window's width and height. - */ - getSize(): number[]; - /** - * The title of the native window. - * - * **Note:** The title of the web page can be different from the title of the - * native window. - */ - getTitle(): string; - /** - * The custom position for the traffic light buttons in frameless window. - * - * @platform darwin - */ - getTrafficLightPosition(): Point; - /** - * Whether the window has a shadow. - */ - hasShadow(): boolean; - /** - * Hides the window. - */ - hide(): void; - /** - * Hooks a windows message. The `callback` is called when the message is received - * in the WndProc. - * - * @platform win32 - */ - hookWindowMessage(message: number, callback: (wParam: any, lParam: any) => void): void; - /** - * Whether the window is always on top of other windows. - */ - isAlwaysOnTop(): boolean; - /** - * Whether the window can be manually closed by user. - * -On Linux always returns `true`. - * - * @platform darwin,win32 - */ - isClosable(): boolean; - /** - * Whether the window is destroyed. - */ - isDestroyed(): boolean; - /** - * Whether the window's document has been edited. - * - * @platform darwin - */ - isDocumentEdited(): boolean; - /** - * whether the window is enabled. - */ - isEnabled(): boolean; - /** - * Whether the window is focused. - */ - isFocused(): boolean; - /** - * Whether the window is in fullscreen mode. - */ - isFullScreen(): boolean; - /** - * Whether the maximize/zoom window button toggles fullscreen mode or maximizes the - * window. - */ - isFullScreenable(): boolean; - /** - * Whether the window is in kiosk mode. - */ - isKiosk(): boolean; - /** - * Whether the window can be manually maximized by user. - * -On Linux always returns `true`. - * - * @platform darwin,win32 - */ - isMaximizable(): boolean; - /** - * Whether the window is maximized. - */ - isMaximized(): boolean; - /** - * Whether menu bar automatically hides itself. - */ - isMenuBarAutoHide(): boolean; - /** - * Whether the menu bar is visible. - */ - isMenuBarVisible(): boolean; - /** - * Whether the window can be manually minimized by the user. - * -On Linux always returns `true`. - * - * @platform darwin,win32 - */ - isMinimizable(): boolean; - /** - * Whether the window is minimized. - */ - isMinimized(): boolean; - /** - * Whether current window is a modal window. - */ - isModal(): boolean; - /** - * Whether the window can be moved by user. - -On Linux always returns `true`. - * - * @platform darwin,win32 - */ - isMovable(): boolean; - /** - * Whether the window is in normal state (not maximized, not minimized, not in - * fullscreen mode). - */ - isNormal(): boolean; - /** - * Whether the window can be manually resized by the user. - */ - isResizable(): boolean; - /** - * Whether the window is in simple (pre-Lion) fullscreen mode. - * - * @platform darwin - */ - isSimpleFullScreen(): boolean; - /** - * Whether the window is in Windows 10 tablet mode. - * - * Since Windows 10 users can use their PC as tablet, under this mode apps can - * choose to optimize their UI for tablets, such as enlarging the titlebar and - * hiding titlebar buttons. - * - * This API returns whether the window is in tablet mode, and the `resize` event - * can be be used to listen to changes to tablet mode. - * - * @platform win32 - */ - isTabletMode(): boolean; - /** - * Whether the window is visible to the user. - */ - isVisible(): boolean; - /** - * Whether the window is visible on all workspaces. - * -**Note:** This API always returns false on Windows. - */ - isVisibleOnAllWorkspaces(): boolean; - /** - * `true` or `false` depending on whether the message is hooked. - * - * @platform win32 - */ - isWindowMessageHooked(message: number): boolean; - /** - * the promise will resolve when the page has finished loading (see - * `did-finish-load`), and rejects if the page fails to load (see `did-fail-load`). - * - * Same as `webContents.loadFile`, `filePath` should be a path to an HTML file - * relative to the root of your application. See the `webContents` docs for more - * information. - */ - loadFile(filePath: string, options?: LoadFileOptions): Promise; - /** - * the promise will resolve when the page has finished loading (see - * `did-finish-load`), and rejects if the page fails to load (see `did-fail-load`). - * - * Same as `webContents.loadURL(url[, options])`. - * - * The `url` can be a remote address (e.g. `http://`) or a path to a local HTML - * file using the `file://` protocol. - * - * To ensure that file URLs are properly formatted, it is recommended to use Node's - * `url.format` method: - * - * You can load a URL using a `POST` request with URL-encoded data by doing the - * following: - */ - loadURL(url: string, options?: LoadURLOptions): Promise; - /** - * Maximizes the window. This will also show (but not focus) the window if it isn't - * being displayed already. - */ - maximize(): void; - /** - * Merges all windows into one window with multiple tabs when native tabs are - * enabled and there is more than one open window. - * - * @platform darwin - */ - mergeAllWindows(): void; - /** - * Minimizes the window. On some platforms the minimized window will be shown in - * the Dock. - */ - minimize(): void; - /** - * Moves window above the source window in the sense of z-order. If the - * `mediaSourceId` is not of type window or if the window does not exist then this - * method throws an error. - */ - moveAbove(mediaSourceId: string): void; - /** - * Moves the current tab into a new window if native tabs are enabled and there is - * more than one tab in the current window. - * - * @platform darwin - */ - moveTabToNewWindow(): void; - /** - * Moves window to top(z-order) regardless of focus - */ - moveTop(): void; - /** - * Uses Quick Look to preview a file at a given path. - * - * @platform darwin - */ - previewFile(path: string, displayName?: string): void; - /** - * Same as `webContents.reload`. - */ - reload(): void; - removeBrowserView(browserView: BrowserView): void; - /** - * Remove the window's menu bar. - * - * @platform linux,win32 - */ - removeMenu(): void; - /** - * Restores the window from minimized state to its previous state. - */ - restore(): void; - /** - * Selects the next tab when native tabs are enabled and there are other tabs in - * the window. - * - * @platform darwin - */ - selectNextTab(): void; - /** - * Selects the previous tab when native tabs are enabled and there are other tabs - * in the window. - * - * @platform darwin - */ - selectPreviousTab(): void; - /** - * Sets whether the window should show always on top of other windows. After - * setting this, the window is still a normal window, not a toolbox window which - * can not be focused on. - */ - setAlwaysOnTop(flag: boolean, level?: 'normal' | 'floating' | 'torn-off-menu' | 'modal-panel' | 'main-menu' | 'status' | 'pop-up-menu' | 'screen-saver', relativeLevel?: number): void; - /** - * Sets the properties for the window's taskbar button. - * - * **Note:** `relaunchCommand` and `relaunchDisplayName` must always be set - * together. If one of those properties is not set, then neither will be used. - * - * @platform win32 - */ - setAppDetails(options: AppDetailsOptions): void; - /** - * This will make a window maintain an aspect ratio. The extra size allows a - * developer to have space, specified in pixels, not included within the aspect - * ratio calculations. This API already takes into account the difference between a - * window's size and its content size. - * - * Consider a normal window with an HD video player and associated controls. - * Perhaps there are 15 pixels of controls on the left edge, 25 pixels of controls - * on the right edge and 50 pixels of controls below the player. In order to - * maintain a 16:9 aspect ratio (standard aspect ratio for HD @1920x1080) within - * the player itself we would call this function with arguments of 16/9 and { - * width: 40, height: 50 }. The second argument doesn't care where the extra width - * and height are within the content view--only that they exist. Sum any extra - * width and height areas you have within the overall content view. - * - * The aspect ratio is not respected when window is resized programmingly with APIs - * like `win.setSize`. - */ - setAspectRatio(aspectRatio: number, extraSize?: Size): void; - /** - * Controls whether to hide cursor when typing. - * - * @platform darwin - */ - setAutoHideCursor(autoHide: boolean): void; - /** - * Sets whether the window menu bar should hide itself automatically. Once set the - * menu bar will only show when users press the single `Alt` key. - * - * If the menu bar is already visible, calling `setAutoHideMenuBar(true)` won't - * hide it immediately. - */ - setAutoHideMenuBar(hide: boolean): void; - /** - * Sets the background color of the window. See Setting `backgroundColor`. - */ - setBackgroundColor(backgroundColor: string): void; - /** - * Resizes and moves the window to the supplied bounds. Any properties that are not - * supplied will default to their current values. - */ - setBounds(bounds: Partial, animate?: boolean): void; - setBrowserView(browserView: (BrowserView) | (null)): void; - /** - * Sets whether the window can be manually closed by user. On Linux does nothing. - * - * @platform darwin,win32 - */ - setClosable(closable: boolean): void; - /** - * Resizes and moves the window's client area (e.g. the web page) to the supplied - * bounds. - */ - setContentBounds(bounds: Rectangle, animate?: boolean): void; - /** - * Prevents the window contents from being captured by other apps. - * - * On macOS it sets the NSWindow's sharingType to NSWindowSharingNone. On Windows - * it calls SetWindowDisplayAffinity with `WDA_EXCLUDEFROMCAPTURE`. For Windows 10 - * version 2004 and up the window will be removed from capture entirely, older - * Windows versions behave as if `WDA_MONITOR` is applied capturing a black window. - * - * @platform darwin,win32 - */ - setContentProtection(enable: boolean): void; - /** - * Resizes the window's client area (e.g. the web page) to `width` and `height`. - */ - setContentSize(width: number, height: number, animate?: boolean): void; - /** - * Specifies whether the window’s document has been edited, and the icon in title - * bar will become gray when set to `true`. - * - * @platform darwin - */ - setDocumentEdited(edited: boolean): void; - /** - * Disable or enable the window. - */ - setEnabled(enable: boolean): void; - /** - * Changes whether the window can be focused. - * -On macOS it does not remove the focus from the window. - * - * @platform darwin,win32 - */ - setFocusable(focusable: boolean): void; - /** - * Sets whether the window should be in fullscreen mode. - */ - setFullScreen(flag: boolean): void; - /** - * Sets whether the maximize/zoom window button toggles fullscreen mode or - * maximizes the window. - */ - setFullScreenable(fullscreenable: boolean): void; - /** - * Sets whether the window should have a shadow. - */ - setHasShadow(hasShadow: boolean): void; - /** - * Changes window icon. - * - * @platform win32,linux - */ - setIcon(icon: (NativeImage) | (string)): void; - /** - * Makes the window ignore all mouse events. - * - * All mouse events happened in this window will be passed to the window below this - * window, but if this window has focus, it will still receive keyboard events. - */ - setIgnoreMouseEvents(ignore: boolean, options?: IgnoreMouseEventsOptions): void; - /** - * Enters or leaves kiosk mode. - */ - setKiosk(flag: boolean): void; - /** - * Sets whether the window can be manually maximized by user. On Linux does - * nothing. - * - * @platform darwin,win32 - */ - setMaximizable(maximizable: boolean): void; - /** - * Sets the maximum size of window to `width` and `height`. - */ - setMaximumSize(width: number, height: number): void; - /** - * Sets the `menu` as the window's menu bar. - * - * @platform linux,win32 - */ - setMenu(menu: (Menu) | (null)): void; - /** - * Sets whether the menu bar should be visible. If the menu bar is auto-hide, users - * can still bring up the menu bar by pressing the single `Alt` key. - * - * @platform win32,linux - */ - setMenuBarVisibility(visible: boolean): void; - /** - * Sets whether the window can be manually minimized by user. On Linux does - * nothing. - * - * @platform darwin,win32 - */ - setMinimizable(minimizable: boolean): void; - /** - * Sets the minimum size of window to `width` and `height`. - */ - setMinimumSize(width: number, height: number): void; - /** - * Sets whether the window can be moved by user. On Linux does nothing. - * - * @platform darwin,win32 - */ - setMovable(movable: boolean): void; - /** - * Sets the opacity of the window. On Linux, does nothing. Out of bound number - * values are clamped to the [0, 1] range. - * - * @platform win32,darwin - */ - setOpacity(opacity: number): void; - /** - * Sets a 16 x 16 pixel overlay onto the current taskbar icon, usually used to - * convey some sort of application status or to passively notify the user. - * - * @platform win32 - */ - setOverlayIcon(overlay: (NativeImage) | (null), description: string): void; - /** - * Sets `parent` as current window's parent window, passing `null` will turn - * current window into a top-level window. - */ - setParentWindow(parent: (BrowserWindow) | (null)): void; - /** - * Moves window to `x` and `y`. - */ - setPosition(x: number, y: number, animate?: boolean): void; - /** - * Sets progress value in progress bar. Valid range is [0, 1.0]. - * - * Remove progress bar when progress < 0; Change to indeterminate mode when - * progress > 1. - * - * On Linux platform, only supports Unity desktop environment, you need to specify - * the `*.desktop` file name to `desktopName` field in `package.json`. By default, - * it will assume `{app.name}.desktop`. - * - * On Windows, a mode can be passed. Accepted values are `none`, `normal`, - * `indeterminate`, `error`, and `paused`. If you call `setProgressBar` without a - * mode set (but with a value within the valid range), `normal` will be assumed. - */ - setProgressBar(progress: number, options?: ProgressBarOptions): void; - /** - * Sets the pathname of the file the window represents, and the icon of the file - * will show in window's title bar. - * - * @platform darwin - */ - setRepresentedFilename(filename: string): void; - /** - * Sets whether the window can be manually resized by the user. - */ - setResizable(resizable: boolean): void; - /** - * Setting a window shape determines the area within the window where the system - * permits drawing and user interaction. Outside of the given region, no pixels - * will be drawn and no mouse events will be registered. Mouse events outside of - * the region will not be received by that window, but will fall through to - * whatever is behind the window. - * - * @experimental - * @platform win32,linux - */ - setShape(rects: Rectangle[]): void; - /** - * Changes the attachment point for sheets on macOS. By default, sheets are - * attached just below the window frame, but you may want to display them beneath a - * HTML-rendered toolbar. For example: - * - * @platform darwin - */ - setSheetOffset(offsetY: number, offsetX?: number): void; - /** - * Enters or leaves simple fullscreen mode. - * - * Simple fullscreen mode emulates the native fullscreen behavior found in versions - * of macOS prior to Lion (10.7). - * - * @platform darwin - */ - setSimpleFullScreen(flag: boolean): void; - /** - * Resizes the window to `width` and `height`. If `width` or `height` are below any - * set minimum size constraints the window will snap to its minimum size. - */ - setSize(width: number, height: number, animate?: boolean): void; - /** - * Makes the window not show in the taskbar. - */ - setSkipTaskbar(skip: boolean): void; - /** - * Whether the buttons were added successfully - * - * Add a thumbnail toolbar with a specified set of buttons to the thumbnail image - * of a window in a taskbar button layout. Returns a `Boolean` object indicates - * whether the thumbnail has been added successfully. - * - * The number of buttons in thumbnail toolbar should be no greater than 7 due to - * the limited room. Once you setup the thumbnail toolbar, the toolbar cannot be - * removed due to the platform's limitation. But you can call the API with an empty - * array to clean the buttons. - * - * The `buttons` is an array of `Button` objects: - * - * * `Button` Object - * * `icon` NativeImage - The icon showing in thumbnail toolbar. - * * `click` Function - * * `tooltip` String (optional) - The text of the button's tooltip. - * * `flags` String[] (optional) - Control specific states and behaviors of the - * button. By default, it is `['enabled']`. - * - * The `flags` is an array that can include following `String`s: - * - * * `enabled` - The button is active and available to the user. - * * `disabled` - The button is disabled. It is present, but has a visual state - * indicating it will not respond to user action. - * * `dismissonclick` - When the button is clicked, the thumbnail window closes - * immediately. - * * `nobackground` - Do not draw a button border, use only the image. - * * `hidden` - The button is not shown to the user. - * * `noninteractive` - The button is enabled but not interactive; no pressed - * button state is drawn. This value is intended for instances where the button is - * used in a notification. - * - * @platform win32 - */ - setThumbarButtons(buttons: ThumbarButton[]): boolean; - /** - * Sets the region of the window to show as the thumbnail image displayed when - * hovering over the window in the taskbar. You can reset the thumbnail to be the - * entire window by specifying an empty region: `{ x: 0, y: 0, width: 0, height: 0 - * }`. - * - * @platform win32 - */ - setThumbnailClip(region: Rectangle): void; - /** - * Sets the toolTip that is displayed when hovering over the window thumbnail in - * the taskbar. - * - * @platform win32 - */ - setThumbnailToolTip(toolTip: string): void; - /** - * Changes the title of native window to `title`. - */ - setTitle(title: string): void; - /** - * Raises `browserView` above other `BrowserView`s attached to `win`. Throws an - * error if `browserView` is not attached to `win`. - * - * @experimental - */ - setTopBrowserView(browserView: BrowserView): void; - /** - * Sets the touchBar layout for the current window. Specifying `null` or - * `undefined` clears the touch bar. This method only has an effect if the machine - * has a touch bar and is running on macOS 10.12.1+. - * - * **Note:** The TouchBar API is currently experimental and may change or be - * removed in future Electron releases. - * - * @platform darwin - */ - setTouchBar(touchBar: (TouchBar) | (null)): void; - /** - * Set a custom position for the traffic light buttons in frameless window. - * - * @platform darwin - */ - setTrafficLightPosition(position: Point): void; - /** - * Adds a vibrancy effect to the browser window. Passing `null` or an empty string - * will remove the vibrancy effect on the window. - * - * Note that `appearance-based`, `light`, `dark`, `medium-light`, and `ultra-dark` - * have been deprecated and will be removed in an upcoming version of macOS. - * - * @platform darwin - */ - setVibrancy(type: (('appearance-based' | 'light' | 'dark' | 'titlebar' | 'selection' | 'menu' | 'popover' | 'sidebar' | 'medium-light' | 'ultra-dark' | 'header' | 'sheet' | 'window' | 'hud' | 'fullscreen-ui' | 'tooltip' | 'content' | 'under-window' | 'under-page')) | (null)): void; - /** - * Sets whether the window should be visible on all workspaces. - * -**Note:** This API does nothing on Windows. - */ - setVisibleOnAllWorkspaces(visible: boolean, options?: VisibleOnAllWorkspacesOptions): void; - /** - * Sets whether the window traffic light buttons should be visible. - * - * @platform darwin - */ - setWindowButtonVisibility(visible: boolean): void; - /** - * Shows and gives focus to the window. - */ - show(): void; - /** - * Same as `webContents.showDefinitionForSelection()`. - * - * @platform darwin - */ - showDefinitionForSelection(): void; - /** - * Shows the window but doesn't focus on it. - */ - showInactive(): void; - /** - * Toggles the visibility of the tab bar if native tabs are enabled and there is - * only one tab in the current window. - * - * @platform darwin - */ - toggleTabBar(): void; - /** - * Unhooks all of the window messages. - * - * @platform win32 - */ - unhookAllWindowMessages(): void; - /** - * Unhook the window message. - * - * @platform win32 - */ - unhookWindowMessage(message: number): void; - /** - * Unmaximizes the window. - */ - unmaximize(): void; - accessibleTitle: string; - autoHideMenuBar: boolean; - closable: boolean; - documentEdited: boolean; - excludedFromShownWindowsMenu: boolean; - fullScreen: boolean; - fullScreenable: boolean; - readonly id: number; - kiosk: boolean; - maximizable: boolean; - menuBarVisible: boolean; - minimizable: boolean; - movable: boolean; - representedFilename: string; - resizable: boolean; - shadow: boolean; - simpleFullScreen: boolean; - title: string; - visibleOnAllWorkspaces: boolean; - readonly webContents: WebContents; - } - - class BrowserWindowProxy { - - // Docs: https://electronjs.org/docs/api/browser-window-proxy - - /** - * Removes focus from the child window. - */ - blur(): void; - /** - * Forcefully closes the child window without calling its unload event. - */ - close(): void; - /** - * Evaluates the code in the child window. - */ - eval(code: string): void; - /** - * Focuses the child window (brings the window to front). - */ - focus(): void; - /** - * Sends a message to the child window with the specified origin or `*` for no - * origin preference. - * - * In addition to these methods, the child window implements `window.opener` object - * with no properties and a single method. - */ - postMessage(message: any, targetOrigin: string): void; - /** - * Invokes the print dialog on the child window. - */ - print(): void; - closed: boolean; - } - - interface Certificate { - - // Docs: https://electronjs.org/docs/api/structures/certificate - - /** - * PEM encoded data - */ - data: string; - /** - * Fingerprint of the certificate - */ - fingerprint: string; - /** - * Issuer principal - */ - issuer: CertificatePrincipal; - /** - * Issuer certificate (if not self-signed) - */ - issuerCert: Certificate; - /** - * Issuer's Common Name - */ - issuerName: string; - /** - * Hex value represented string - */ - serialNumber: string; - /** - * Subject principal - */ - subject: CertificatePrincipal; - /** - * Subject's Common Name - */ - subjectName: string; - /** - * End date of the certificate being valid in seconds - */ - validExpiry: number; - /** - * Start date of the certificate being valid in seconds - */ - validStart: number; - } - - interface CertificatePrincipal { - - // Docs: https://electronjs.org/docs/api/structures/certificate-principal - - /** - * Common Name. - */ - commonName: string; - /** - * Country or region. - */ - country: string; - /** - * Locality. - */ - locality: string; - /** - * Organization names. - */ - organizations: string[]; - /** - * Organization Unit names. - */ - organizationUnits: string[]; - /** - * State or province. - */ - state: string; - } - - class ClientRequest extends NodeEventEmitter { - - // Docs: https://electronjs.org/docs/api/client-request - - /** - * Emitted when the `request` is aborted. The `abort` event will not be fired if - * the `request` is already closed. - */ - on(event: 'abort', listener: Function): this; - once(event: 'abort', listener: Function): this; - addListener(event: 'abort', listener: Function): this; - removeListener(event: 'abort', listener: Function): this; - /** - * Emitted as the last event in the HTTP request-response transaction. The `close` - * event indicates that no more events will be emitted on either the `request` or - * `response` objects. - */ - on(event: 'close', listener: Function): this; - once(event: 'close', listener: Function): this; - addListener(event: 'close', listener: Function): this; - removeListener(event: 'close', listener: Function): this; - /** - * Emitted when the `net` module fails to issue a network request. Typically when - * the `request` object emits an `error` event, a `close` event will subsequently - * follow and no response object will be provided. - */ - on(event: 'error', listener: ( - /** - * an error object providing some information about the failure. - */ - error: Error) => void): this; - once(event: 'error', listener: ( - /** - * an error object providing some information about the failure. - */ - error: Error) => void): this; - addListener(event: 'error', listener: ( - /** - * an error object providing some information about the failure. - */ - error: Error) => void): this; - removeListener(event: 'error', listener: ( - /** - * an error object providing some information about the failure. - */ - error: Error) => void): this; - /** - * Emitted just after the last chunk of the `request`'s data has been written into - * the `request` object. - */ - on(event: 'finish', listener: Function): this; - once(event: 'finish', listener: Function): this; - addListener(event: 'finish', listener: Function): this; - removeListener(event: 'finish', listener: Function): this; - /** - * Emitted when an authenticating proxy is asking for user credentials. - * - * The `callback` function is expected to be called back with user credentials: - * - * * `username` String - * * `password` String - * - * Providing empty credentials will cancel the request and report an authentication - * error on the response object: - */ - on(event: 'login', listener: (authInfo: AuthInfo, - callback: (username?: string, password?: string) => void) => void): this; - once(event: 'login', listener: (authInfo: AuthInfo, - callback: (username?: string, password?: string) => void) => void): this; - addListener(event: 'login', listener: (authInfo: AuthInfo, - callback: (username?: string, password?: string) => void) => void): this; - removeListener(event: 'login', listener: (authInfo: AuthInfo, - callback: (username?: string, password?: string) => void) => void): this; - /** - * Emitted when the server returns a redirect response (e.g. 301 Moved - * Permanently). Calling `request.followRedirect` will continue with the - * redirection. If this event is handled, `request.followRedirect` must be called - * **synchronously**, otherwise the request will be cancelled. - */ - on(event: 'redirect', listener: (statusCode: number, - method: string, - redirectUrl: string, - responseHeaders: Record) => void): this; - once(event: 'redirect', listener: (statusCode: number, - method: string, - redirectUrl: string, - responseHeaders: Record) => void): this; - addListener(event: 'redirect', listener: (statusCode: number, - method: string, - redirectUrl: string, - responseHeaders: Record) => void): this; - removeListener(event: 'redirect', listener: (statusCode: number, - method: string, - redirectUrl: string, - responseHeaders: Record) => void): this; - on(event: 'response', listener: ( - /** - * An object representing the HTTP response message. - */ - response: IncomingMessage) => void): this; - once(event: 'response', listener: ( - /** - * An object representing the HTTP response message. - */ - response: IncomingMessage) => void): this; - addListener(event: 'response', listener: ( - /** - * An object representing the HTTP response message. - */ - response: IncomingMessage) => void): this; - removeListener(event: 'response', listener: ( - /** - * An object representing the HTTP response message. - */ - response: IncomingMessage) => void): this; - /** - * ClientRequest - */ - constructor(options: (ClientRequestConstructorOptions) | (string)); - /** - * Cancels an ongoing HTTP transaction. If the request has already emitted the - * `close` event, the abort operation will have no effect. Otherwise an ongoing - * event will emit `abort` and `close` events. Additionally, if there is an ongoing - * response object,it will emit the `aborted` event. - */ - abort(): void; - /** - * Sends the last chunk of the request data. Subsequent write or end operations - * will not be allowed. The `finish` event is emitted just after the end operation. - */ - end(chunk?: (string) | (Buffer), encoding?: string, callback?: () => void): void; - /** - * Continues any pending redirection. Can only be called during a `'redirect'` - * event. - */ - followRedirect(): void; - /** - * The value of a previously set extra header name. - */ - getHeader(name: string): string; - /** - * * `active` Boolean - Whether the request is currently active. If this is false - * no other properties will be set - * * `started` Boolean - Whether the upload has started. If this is false both - * `current` and `total` will be set to 0. - * * `current` Integer - The number of bytes that have been uploaded so far - * * `total` Integer - The number of bytes that will be uploaded this request - * - * You can use this method in conjunction with `POST` requests to get the progress - * of a file upload or other data transfer. - */ - getUploadProgress(): UploadProgress; - /** - * Removes a previously set extra header name. This method can be called only - * before first write. Trying to call it after the first write will throw an error. - */ - removeHeader(name: string): void; - /** - * Adds an extra HTTP header. The header name will be issued as-is without - * lowercasing. It can be called only before first write. Calling this method after - * the first write will throw an error. If the passed value is not a `String`, its - * `toString()` method will be called to obtain the final value. - * - * Certain headers are restricted from being set by apps. These headers are listed - * below. More information on restricted headers can be found in Chromium's header - * utils. - * - * * `Content-Length` - * * `Host` - * * `Trailer` or `Te` - * * `Upgrade` - * * `Cookie2` - * * `Keep-Alive` - * * `Transfer-Encoding` - * - * Additionally, setting the `Connection` header to the value `upgrade` is also - * disallowed. - */ - setHeader(name: string, value: string): void; - /** - * `callback` is essentially a dummy function introduced in the purpose of keeping - * similarity with the Node.js API. It is called asynchronously in the next tick - * after `chunk` content have been delivered to the Chromium networking layer. - * Contrary to the Node.js implementation, it is not guaranteed that `chunk` - * content have been flushed on the wire before `callback` is called. - * - * Adds a chunk of data to the request body. The first write operation may cause - * the request headers to be issued on the wire. After the first write operation, - * it is not allowed to add or remove a custom header. - */ - write(chunk: (string) | (Buffer), encoding?: string, callback?: () => void): void; - chunkedEncoding: boolean; - } - - interface Clipboard { - - // Docs: https://electronjs.org/docs/api/clipboard - - /** - * An array of supported formats for the clipboard `type`. - */ - availableFormats(type?: 'selection' | 'clipboard'): string[]; - /** - * Clears the clipboard content. - */ - clear(type?: 'selection' | 'clipboard'): void; - /** - * Whether the clipboard supports the specified `format`. - * - * @experimental - */ - has(format: string, type?: 'selection' | 'clipboard'): boolean; - /** - * Reads `format` type from the clipboard. - * - * @experimental - */ - read(format: string): string; - /** - * * `title` String - * * `url` String - * - * Returns an Object containing `title` and `url` keys representing the bookmark in - * the clipboard. The `title` and `url` values will be empty strings when the - * bookmark is unavailable. - * - * @platform darwin,win32 - */ - readBookmark(): ReadBookmark; - /** - * Reads `format` type from the clipboard. - * - * @experimental - */ - readBuffer(format: string): Buffer; - /** - * The text on the find pasteboard, which is the pasteboard that holds information - * about the current state of the active application’s find panel. - * - * This method uses synchronous IPC when called from the renderer process. The - * cached value is reread from the find pasteboard whenever the application is - * activated. - * - * @platform darwin - */ - readFindText(): string; - /** - * The content in the clipboard as markup. - */ - readHTML(type?: 'selection' | 'clipboard'): string; - /** - * The image content in the clipboard. - */ - readImage(type?: 'selection' | 'clipboard'): NativeImage; - /** - * The content in the clipboard as RTF. - */ - readRTF(type?: 'selection' | 'clipboard'): string; - /** - * The content in the clipboard as plain text. - */ - readText(type?: 'selection' | 'clipboard'): string; - /** - * Writes `data` to the clipboard. - */ - write(data: Data, type?: 'selection' | 'clipboard'): void; - /** - * Writes the `title` and `url` into the clipboard as a bookmark. - * - * **Note:** Most apps on Windows don't support pasting bookmarks into them so you - * can use `clipboard.write` to write both a bookmark and fallback text to the - * clipboard. - * - * @platform darwin,win32 - */ - writeBookmark(title: string, url: string, type?: 'selection' | 'clipboard'): void; - /** - * Writes the `buffer` into the clipboard as `format`. - * - * @experimental - */ - writeBuffer(format: string, buffer: Buffer, type?: 'selection' | 'clipboard'): void; - /** - * Writes the `text` into the find pasteboard (the pasteboard that holds - * information about the current state of the active application’s find panel) as - * plain text. This method uses synchronous IPC when called from the renderer - * process. - * - * @platform darwin - */ - writeFindText(text: string): void; - /** - * Writes `markup` to the clipboard. - */ - writeHTML(markup: string, type?: 'selection' | 'clipboard'): void; - /** - * Writes `image` to the clipboard. - */ - writeImage(image: NativeImage, type?: 'selection' | 'clipboard'): void; - /** - * Writes the `text` into the clipboard in RTF. - */ - writeRTF(text: string, type?: 'selection' | 'clipboard'): void; - /** - * Writes the `text` into the clipboard as plain text. - */ - writeText(text: string, type?: 'selection' | 'clipboard'): void; - } - - class CommandLine { - - // Docs: https://electronjs.org/docs/api/command-line - - /** - * Append an argument to Chromium's command line. The argument will be quoted - * correctly. Switches will precede arguments regardless of appending order. - * - * If you're appending an argument like `--switch=value`, consider using - * `appendSwitch('switch', 'value')` instead. - * - * **Note:** This will not affect `process.argv`. The intended usage of this - * function is to control Chromium's behavior. - */ - appendArgument(value: string): void; - /** - * Append a switch (with optional `value`) to Chromium's command line. - * - * **Note:** This will not affect `process.argv`. The intended usage of this - * function is to control Chromium's behavior. - */ - appendSwitch(the_switch: string, value?: string): void; - /** - * The command-line switch value. - * - * **Note:** When the switch is not present or has no value, it returns empty - * string. - */ - getSwitchValue(the_switch: string): string; - /** - * Whether the command-line switch is present. - */ - hasSwitch(the_switch: string): boolean; - } - - interface ContentTracing { - - // Docs: https://electronjs.org/docs/api/content-tracing - - /** - * resolves with an array of category groups once all child processes have - * acknowledged the `getCategories` request - * - * Get a set of category groups. The category groups can change as new code paths - * are reached. See also the list of built-in tracing categories. - * - * > **NOTE:** Electron adds a non-default tracing category called `"electron"`. - * This category can be used to capture Electron-specific tracing events. - */ - getCategories(): Promise; - /** - * Resolves with an object containing the `value` and `percentage` of trace buffer - * maximum usage - * - * * `value` Number - * * `percentage` Number - * - * Get the maximum usage across processes of trace buffer as a percentage of the - * full state. - */ - getTraceBufferUsage(): Promise; - /** - * resolved once all child processes have acknowledged the `startRecording` - * request. - * - * Start recording on all processes. - * - * Recording begins immediately locally and asynchronously on child processes as - * soon as they receive the EnableRecording request. - * - * If a recording is already running, the promise will be immediately resolved, as - * only one trace operation can be in progress at a time. - */ - startRecording(options: (TraceConfig) | (TraceCategoriesAndOptions)): Promise; - /** - * resolves with a path to a file that contains the traced data once all child - * processes have acknowledged the `stopRecording` request - * - * Stop recording on all processes. - * - * Child processes typically cache trace data and only rarely flush and send trace - * data back to the main process. This helps to minimize the runtime overhead of - * tracing since sending trace data over IPC can be an expensive operation. So, to - * end tracing, Chromium asynchronously asks all child processes to flush any - * pending trace data. - * - * Trace data will be written into `resultFilePath`. If `resultFilePath` is empty - * or not provided, trace data will be written to a temporary file, and the path - * will be returned in the promise. - */ - stopRecording(resultFilePath?: string): Promise; - } - - interface ContextBridge { - - // Docs: https://electronjs.org/docs/api/context-bridge - - exposeInMainWorld(apiKey: string, api: any): void; - } - - interface Cookie { - - // Docs: https://electronjs.org/docs/api/structures/cookie - - /** - * The domain of the cookie; this will be normalized with a preceding dot so that - * it's also valid for subdomains. - */ - domain?: string; - /** - * The expiration date of the cookie as the number of seconds since the UNIX epoch. - * Not provided for session cookies. - */ - expirationDate?: number; - /** - * Whether the cookie is a host-only cookie; this will only be `true` if no domain - * was passed. - */ - hostOnly?: boolean; - /** - * Whether the cookie is marked as HTTP only. - */ - httpOnly?: boolean; - /** - * The name of the cookie. - */ - name: string; - /** - * The path of the cookie. - */ - path?: string; - /** - * The Same Site policy applied to this cookie. Can be `unspecified`, - * `no_restriction`, `lax` or `strict`. - */ - sameSite: ('unspecified' | 'no_restriction' | 'lax' | 'strict'); - /** - * Whether the cookie is marked as secure. - */ - secure?: boolean; - /** - * Whether the cookie is a session cookie or a persistent cookie with an expiration - * date. - */ - session?: boolean; - /** - * The value of the cookie. - */ - value: string; - } - - class Cookies extends NodeEventEmitter { - - // Docs: https://electronjs.org/docs/api/cookies - - /** - * Emitted when a cookie is changed because it was added, edited, removed, or - * expired. - */ - on(event: 'changed', listener: (event: Event, - /** - * The cookie that was changed. - */ - cookie: Cookie, - /** - * The cause of the change with one of the following values: - */ - cause: ('explicit' | 'overwrite' | 'expired' | 'evicted' | 'expired-overwrite'), - /** - * `true` if the cookie was removed, `false` otherwise. - */ - removed: boolean) => void): this; - once(event: 'changed', listener: (event: Event, - /** - * The cookie that was changed. - */ - cookie: Cookie, - /** - * The cause of the change with one of the following values: - */ - cause: ('explicit' | 'overwrite' | 'expired' | 'evicted' | 'expired-overwrite'), - /** - * `true` if the cookie was removed, `false` otherwise. - */ - removed: boolean) => void): this; - addListener(event: 'changed', listener: (event: Event, - /** - * The cookie that was changed. - */ - cookie: Cookie, - /** - * The cause of the change with one of the following values: - */ - cause: ('explicit' | 'overwrite' | 'expired' | 'evicted' | 'expired-overwrite'), - /** - * `true` if the cookie was removed, `false` otherwise. - */ - removed: boolean) => void): this; - removeListener(event: 'changed', listener: (event: Event, - /** - * The cookie that was changed. - */ - cookie: Cookie, - /** - * The cause of the change with one of the following values: - */ - cause: ('explicit' | 'overwrite' | 'expired' | 'evicted' | 'expired-overwrite'), - /** - * `true` if the cookie was removed, `false` otherwise. - */ - removed: boolean) => void): this; - /** - * A promise which resolves when the cookie store has been flushed - * -Writes any unwritten cookies data to disk. - */ - flushStore(): Promise; - /** - * A promise which resolves an array of cookie objects. - * - * Sends a request to get all cookies matching `filter`, and resolves a promise - * with the response. - */ - get(filter: CookiesGetFilter): Promise; - /** - * A promise which resolves when the cookie has been removed - * -Removes the cookies matching `url` and `name` - */ - remove(url: string, name: string): Promise; - /** - * A promise which resolves when the cookie has been set - * -Sets a cookie with `details`. - */ - set(details: CookiesSetDetails): Promise; - } - - interface CPUUsage { - - // Docs: https://electronjs.org/docs/api/structures/cpu-usage - - /** - * The number of average idle CPU wakeups per second since the last call to - * getCPUUsage. First call returns 0. Will always return 0 on Windows. - */ - idleWakeupsPerSecond: number; - /** - * Percentage of CPU used since the last call to getCPUUsage. First call returns 0. - */ - percentCPUUsage: number; - } - - interface CrashReport { - - // Docs: https://electronjs.org/docs/api/structures/crash-report - - date: Date; - id: string; - } - - interface CrashReporter { - - // Docs: https://electronjs.org/docs/api/crash-reporter - - /** - * Set an extra parameter to be sent with the crash report. The values specified - * here will be sent in addition to any values set via the `extra` option when - * `start` was called. - * - * Parameters added in this fashion (or via the `extra` parameter to - * `crashReporter.start`) are specific to the calling process. Adding extra - * parameters in the main process will not cause those parameters to be sent along - * with crashes from renderer or other child processes. Similarly, adding extra - * parameters in a renderer process will not result in those parameters being sent - * with crashes that occur in other renderer processes or in the main process. - * - * **Note:** Parameters have limits on the length of the keys and values. Key names - * must be no longer than 39 bytes, and values must be no longer than 20320 bytes. - * Keys with names longer than the maximum will be silently ignored. Key values - * longer than the maximum length will be truncated. - * - * **Note:** On linux values that are longer than 127 bytes will be chunked into - * multiple keys, each 127 bytes in length. E.g. `addExtraParameter('foo', - * 'a'.repeat(130))` will result in two chunked keys `foo__1` and `foo__2`, the - * first will contain the first 127 bytes and the second will contain the remaining - * 3 bytes. On your crash reporting backend you should stitch together keys in - * this format. - */ - addExtraParameter(key: string, value: string): void; - /** - * The date and ID of the last crash report. Only crash reports that have been - * uploaded will be returned; even if a crash report is present on disk it will not - * be returned until it is uploaded. In the case that there are no uploaded - * reports, `null` is returned. - * -**Note:** This method is only available in the main process. - */ - getLastCrashReport(): CrashReport; - /** - * The current 'extra' parameters of the crash reporter. - */ - getParameters(): Record; - /** - * Returns all uploaded crash reports. Each report contains the date and uploaded - * ID. - -**Note:** This method is only available in the main process. - */ - getUploadedReports(): CrashReport[]; - /** - * Whether reports should be submitted to the server. Set through the `start` - * method or `setUploadToServer`. - * -**Note:** This method is only available in the main process. - */ - getUploadToServer(): boolean; - /** - * Remove an extra parameter from the current set of parameters. Future crashes - * will not include this parameter. - */ - removeExtraParameter(key: string): void; - /** - * This would normally be controlled by user preferences. This has no effect if - * called before `start` is called. - * -**Note:** This method is only available in the main process. - */ - setUploadToServer(uploadToServer: boolean): void; - /** - * This method must be called before using any other `crashReporter` APIs. Once - * initialized this way, the crashpad handler collects crashes from all - * subsequently created processes. The crash reporter cannot be disabled once - * started. - * - * This method should be called as early as possible in app startup, preferably - * before `app.on('ready')`. If the crash reporter is not initialized at the time a - * renderer process is created, then that renderer process will not be monitored by - * the crash reporter. - * - * **Note:** You can test out the crash reporter by generating a crash using - * `process.crash()`. - * - * **Note:** If you need to send additional/updated `extra` parameters after your - * first call `start` you can call `addExtraParameter`. - * - * **Note:** Parameters passed in `extra`, `globalExtra` or set with - * `addExtraParameter` have limits on the length of the keys and values. Key names - * must be at most 39 bytes long, and values must be no longer than 127 bytes. Keys - * with names longer than the maximum will be silently ignored. Key values longer - * than the maximum length will be truncated. - * -**Note:** This method is only available in the main process. - */ - start(options: CrashReporterStartOptions): void; - } - - interface CustomScheme { - - // Docs: https://electronjs.org/docs/api/structures/custom-scheme - - privileges?: Privileges; - /** - * Custom schemes to be registered with options. - */ - scheme: string; - } - - class Debugger extends NodeEventEmitter { - - // Docs: https://electronjs.org/docs/api/debugger - - /** - * Emitted when the debugging session is terminated. This happens either when - * `webContents` is closed or devtools is invoked for the attached `webContents`. - */ - on(event: 'detach', listener: (event: Event, - /** - * Reason for detaching debugger. - */ - reason: string) => void): this; - once(event: 'detach', listener: (event: Event, - /** - * Reason for detaching debugger. - */ - reason: string) => void): this; - addListener(event: 'detach', listener: (event: Event, - /** - * Reason for detaching debugger. - */ - reason: string) => void): this; - removeListener(event: 'detach', listener: (event: Event, - /** - * Reason for detaching debugger. - */ - reason: string) => void): this; - /** - * Emitted whenever the debugging target issues an instrumentation event. - */ - on(event: 'message', listener: (event: Event, - /** - * Method name. - */ - method: string, - /** - * Event parameters defined by the 'parameters' attribute in the remote debugging - * protocol. - */ - params: any, - /** - * Unique identifier of attached debugging session, will match the value sent from - * `debugger.sendCommand`. - */ - sessionId: string) => void): this; - once(event: 'message', listener: (event: Event, - /** - * Method name. - */ - method: string, - /** - * Event parameters defined by the 'parameters' attribute in the remote debugging - * protocol. - */ - params: any, - /** - * Unique identifier of attached debugging session, will match the value sent from - * `debugger.sendCommand`. - */ - sessionId: string) => void): this; - addListener(event: 'message', listener: (event: Event, - /** - * Method name. - */ - method: string, - /** - * Event parameters defined by the 'parameters' attribute in the remote debugging - * protocol. - */ - params: any, - /** - * Unique identifier of attached debugging session, will match the value sent from - * `debugger.sendCommand`. - */ - sessionId: string) => void): this; - removeListener(event: 'message', listener: (event: Event, - /** - * Method name. - */ - method: string, - /** - * Event parameters defined by the 'parameters' attribute in the remote debugging - * protocol. - */ - params: any, - /** - * Unique identifier of attached debugging session, will match the value sent from - * `debugger.sendCommand`. - */ - sessionId: string) => void): this; - /** - * Attaches the debugger to the `webContents`. - */ - attach(protocolVersion?: string): void; - /** - * Detaches the debugger from the `webContents`. - */ - detach(): void; - /** - * Whether a debugger is attached to the `webContents`. - */ - isAttached(): boolean; - /** - * A promise that resolves with the response defined by the 'returns' attribute of - * the command description in the remote debugging protocol or is rejected - * indicating the failure of the command. - * -Send given command to the debugging target. - */ - sendCommand(method: string, commandParams?: any, sessionId?: string): Promise; - } - - interface DesktopCapturer { - - // Docs: https://electronjs.org/docs/api/desktop-capturer - - /** - * Resolves with an array of `DesktopCapturerSource` objects, each - * `DesktopCapturerSource` represents a screen or an individual window that can be - * captured. - * - * **Note** Capturing the screen contents requires user consent on macOS 10.15 - * Catalina or higher, which can detected by - * `systemPreferences.getMediaAccessStatus`. - */ - getSources(options: SourcesOptions): Promise; - } - - interface DesktopCapturerSource { - - // Docs: https://electronjs.org/docs/api/structures/desktop-capturer-source - - /** - * An icon image of the application that owns the window or null if the source has - * a type screen. The size of the icon is not known in advance and depends on what - * the application provides. - */ - appIcon: NativeImage; - /** - * A unique identifier that will correspond to the `id` of the matching Display - * returned by the Screen API. On some platforms, this is equivalent to the `XX` - * portion of the `id` field above and on others it will differ. It will be an - * empty string if not available. - */ - display_id: string; - /** - * The identifier of a window or screen that can be used as a `chromeMediaSourceId` - * constraint when calling [`navigator.webkitGetUserMedia`]. The format of the - * identifier will be `window:XX:YY` or `screen:ZZ:0`. XX is the windowID/handle. - * YY is 1 for the current process, and 0 for all others. ZZ is a sequential number - * that represents the screen, and it does not equal to the index in the source's - * name. - */ - id: string; - /** - * A screen source will be named either `Entire Screen` or `Screen `, while - * the name of a window source will match the window title. - */ - name: string; - /** - * A thumbnail image. **Note:** There is no guarantee that the size of the - * thumbnail is the same as the `thumbnailSize` specified in the `options` passed - * to `desktopCapturer.getSources`. The actual size depends on the scale of the - * screen or window. - */ - thumbnail: NativeImage; - } - - interface Dialog { - - // Docs: https://electronjs.org/docs/api/dialog - - /** - * resolves when the certificate trust dialog is shown. - * - * On macOS, this displays a modal dialog that shows a message and certificate - * information, and gives the user the option of trusting/importing the - * certificate. If you provide a `browserWindow` argument the dialog will be - * attached to the parent window, making it modal. - * - * On Windows the options are more limited, due to the Win32 APIs used: - * - * * The `message` argument is not used, as the OS provides its own confirmation - * dialog. - * * The `browserWindow` argument is ignored since it is not possible to make this - * confirmation dialog modal. - * - * @platform darwin,win32 - */ - showCertificateTrustDialog(browserWindow: BrowserWindow, options: CertificateTrustDialogOptions): Promise; - /** - * resolves when the certificate trust dialog is shown. - * - * On macOS, this displays a modal dialog that shows a message and certificate - * information, and gives the user the option of trusting/importing the - * certificate. If you provide a `browserWindow` argument the dialog will be - * attached to the parent window, making it modal. - * - * On Windows the options are more limited, due to the Win32 APIs used: - * - * * The `message` argument is not used, as the OS provides its own confirmation - * dialog. - * * The `browserWindow` argument is ignored since it is not possible to make this - * confirmation dialog modal. - * - * @platform darwin,win32 - */ - showCertificateTrustDialog(options: CertificateTrustDialogOptions): Promise; - /** - * Displays a modal dialog that shows an error message. - * - * This API can be called safely before the `ready` event the `app` module emits, - * it is usually used to report errors in early stage of startup. If called before - * the app `ready`event on Linux, the message will be emitted to stderr, and no GUI - * dialog will appear. - */ - showErrorBox(title: string, content: string): void; - /** - * resolves with a promise containing the following properties: - * - * * `response` Number - The index of the clicked button. - * * `checkboxChecked` Boolean - The checked state of the checkbox if - * `checkboxLabel` was set. Otherwise `false`. - * - * Shows a message box. - * - * The `browserWindow` argument allows the dialog to attach itself to a parent - * window, making it modal. - */ - showMessageBox(browserWindow: BrowserWindow, options: MessageBoxOptions): Promise; - /** - * resolves with a promise containing the following properties: - * - * * `response` Number - The index of the clicked button. - * * `checkboxChecked` Boolean - The checked state of the checkbox if - * `checkboxLabel` was set. Otherwise `false`. - * - * Shows a message box. - * - * The `browserWindow` argument allows the dialog to attach itself to a parent - * window, making it modal. - */ - showMessageBox(options: MessageBoxOptions): Promise; - /** - * the index of the clicked button. - * - * Shows a message box, it will block the process until the message box is closed. - * It returns the index of the clicked button. - * - * The `browserWindow` argument allows the dialog to attach itself to a parent - * window, making it modal. If `browserWindow` is not shown dialog will not be - * attached to it. In such case it will be displayed as an independent window. - */ - showMessageBoxSync(browserWindow: BrowserWindow, options: MessageBoxSyncOptions): number; - /** - * the index of the clicked button. - * - * Shows a message box, it will block the process until the message box is closed. - * It returns the index of the clicked button. - * - * The `browserWindow` argument allows the dialog to attach itself to a parent - * window, making it modal. If `browserWindow` is not shown dialog will not be - * attached to it. In such case it will be displayed as an independent window. - */ - showMessageBoxSync(options: MessageBoxSyncOptions): number; - /** - * Resolve with an object containing the following: - * - * * `canceled` Boolean - whether or not the dialog was canceled. - * * `filePaths` String[] - An array of file paths chosen by the user. If the - * dialog is cancelled this will be an empty array. - * * `bookmarks` String[] (optional) _macOS_ _mas_ - An array matching the - * `filePaths` array of base64 encoded strings which contains security scoped - * bookmark data. `securityScopedBookmarks` must be enabled for this to be - * populated. (For return values, see table here.) - * - * The `browserWindow` argument allows the dialog to attach itself to a parent - * window, making it modal. - * - * The `filters` specifies an array of file types that can be displayed or selected - * when you want to limit the user to a specific type. For example: - * - * The `extensions` array should contain extensions without wildcards or dots (e.g. - * `'png'` is good but `'.png'` and `'*.png'` are bad). To show all files, use the - * `'*'` wildcard (no other wildcard is supported). - * - * **Note:** On Windows and Linux an open dialog can not be both a file selector - * and a directory selector, so if you set `properties` to `['openFile', - * 'openDirectory']` on these platforms, a directory selector will be shown. - */ - showOpenDialog(browserWindow: BrowserWindow, options: OpenDialogOptions): Promise; - /** - * Resolve with an object containing the following: - * - * * `canceled` Boolean - whether or not the dialog was canceled. - * * `filePaths` String[] - An array of file paths chosen by the user. If the - * dialog is cancelled this will be an empty array. - * * `bookmarks` String[] (optional) _macOS_ _mas_ - An array matching the - * `filePaths` array of base64 encoded strings which contains security scoped - * bookmark data. `securityScopedBookmarks` must be enabled for this to be - * populated. (For return values, see table here.) - * - * The `browserWindow` argument allows the dialog to attach itself to a parent - * window, making it modal. - * - * The `filters` specifies an array of file types that can be displayed or selected - * when you want to limit the user to a specific type. For example: - * - * The `extensions` array should contain extensions without wildcards or dots (e.g. - * `'png'` is good but `'.png'` and `'*.png'` are bad). To show all files, use the - * `'*'` wildcard (no other wildcard is supported). - * - * **Note:** On Windows and Linux an open dialog can not be both a file selector - * and a directory selector, so if you set `properties` to `['openFile', - * 'openDirectory']` on these platforms, a directory selector will be shown. - */ - showOpenDialog(options: OpenDialogOptions): Promise; - /** - * the file paths chosen by the user; if the dialog is cancelled it returns - * `undefined`. - * - * The `browserWindow` argument allows the dialog to attach itself to a parent - * window, making it modal. - * - * The `filters` specifies an array of file types that can be displayed or selected - * when you want to limit the user to a specific type. For example: - * - * The `extensions` array should contain extensions without wildcards or dots (e.g. - * `'png'` is good but `'.png'` and `'*.png'` are bad). To show all files, use the - * `'*'` wildcard (no other wildcard is supported). - * - * **Note:** On Windows and Linux an open dialog can not be both a file selector - * and a directory selector, so if you set `properties` to `['openFile', - * 'openDirectory']` on these platforms, a directory selector will be shown. - */ - showOpenDialogSync(browserWindow: BrowserWindow, options: OpenDialogSyncOptions): (string[]) | (undefined); - /** - * the file paths chosen by the user; if the dialog is cancelled it returns - * `undefined`. - * - * The `browserWindow` argument allows the dialog to attach itself to a parent - * window, making it modal. - * - * The `filters` specifies an array of file types that can be displayed or selected - * when you want to limit the user to a specific type. For example: - * - * The `extensions` array should contain extensions without wildcards or dots (e.g. - * `'png'` is good but `'.png'` and `'*.png'` are bad). To show all files, use the - * `'*'` wildcard (no other wildcard is supported). - * - * **Note:** On Windows and Linux an open dialog can not be both a file selector - * and a directory selector, so if you set `properties` to `['openFile', - * 'openDirectory']` on these platforms, a directory selector will be shown. - */ - showOpenDialogSync(options: OpenDialogSyncOptions): (string[]) | (undefined); - /** - * Resolve with an object containing the following: - * - * * `canceled` Boolean - whether or not the dialog was canceled. - * * `filePath` String (optional) - If the dialog is canceled, this will be - * `undefined`. - * * `bookmark` String (optional) _macOS_ _mas_ - Base64 encoded string which - * contains the security scoped bookmark data for the saved file. - * `securityScopedBookmarks` must be enabled for this to be present. (For return - * values, see table here.) - * - * The `browserWindow` argument allows the dialog to attach itself to a parent - * window, making it modal. - * - * The `filters` specifies an array of file types that can be displayed, see - * `dialog.showOpenDialog` for an example. - * - * **Note:** On macOS, using the asynchronous version is recommended to avoid - * issues when expanding and collapsing the dialog. - */ - showSaveDialog(browserWindow: BrowserWindow, options: SaveDialogOptions): Promise; - /** - * Resolve with an object containing the following: - * - * * `canceled` Boolean - whether or not the dialog was canceled. - * * `filePath` String (optional) - If the dialog is canceled, this will be - * `undefined`. - * * `bookmark` String (optional) _macOS_ _mas_ - Base64 encoded string which - * contains the security scoped bookmark data for the saved file. - * `securityScopedBookmarks` must be enabled for this to be present. (For return - * values, see table here.) - * - * The `browserWindow` argument allows the dialog to attach itself to a parent - * window, making it modal. - * - * The `filters` specifies an array of file types that can be displayed, see - * `dialog.showOpenDialog` for an example. - * - * **Note:** On macOS, using the asynchronous version is recommended to avoid - * issues when expanding and collapsing the dialog. - */ - showSaveDialog(options: SaveDialogOptions): Promise; - /** - * the path of the file chosen by the user; if the dialog is cancelled it returns - * `undefined`. - * - * The `browserWindow` argument allows the dialog to attach itself to a parent - * window, making it modal. - * - * The `filters` specifies an array of file types that can be displayed, see - * `dialog.showOpenDialog` for an example. - */ - showSaveDialogSync(browserWindow: BrowserWindow, options: SaveDialogSyncOptions): (string) | (undefined); - /** - * the path of the file chosen by the user; if the dialog is cancelled it returns - * `undefined`. - * - * The `browserWindow` argument allows the dialog to attach itself to a parent - * window, making it modal. - * - * The `filters` specifies an array of file types that can be displayed, see - * `dialog.showOpenDialog` for an example. - */ - showSaveDialogSync(options: SaveDialogSyncOptions): (string) | (undefined); - } - - interface Display { - - // Docs: https://electronjs.org/docs/api/structures/display - - /** - * Can be `available`, `unavailable`, `unknown`. - */ - accelerometerSupport: ('available' | 'unavailable' | 'unknown'); - /** - * the bounds of the display in DIP points. - */ - bounds: Rectangle; - /** - * The number of bits per pixel. - */ - colorDepth: number; - /** - * represent a color space (three-dimensional object which contains all realizable - * color combinations) for the purpose of color conversions - */ - colorSpace: string; - /** - * The number of bits per color component. - */ - depthPerComponent: number; - /** - * The display refresh rate. - */ - displayFrequency: number; - /** - * Unique identifier associated with the display. - */ - id: number; - /** - * `true` for an internal display and `false` for an external display - */ - internal: boolean; - /** - * Whether or not the display is a monochrome display. - */ - monochrome: boolean; - /** - * Can be 0, 90, 180, 270, represents screen rotation in clock-wise degrees. - */ - rotation: number; - /** - * Output device's pixel scale factor. - */ - scaleFactor: number; - size: Size; - /** - * Can be `available`, `unavailable`, `unknown`. - */ - touchSupport: ('available' | 'unavailable' | 'unknown'); - /** - * the work area of the display in DIP points. - */ - workArea: Rectangle; - workAreaSize: Size; - } - - class Dock { - - // Docs: https://electronjs.org/docs/api/dock - - /** - * an ID representing the request. - * - * When `critical` is passed, the dock icon will bounce until either the - * application becomes active or the request is canceled. - * - * When `informational` is passed, the dock icon will bounce for one second. - * However, the request remains active until either the application becomes active - * or the request is canceled. - * - * **Nota Bene:** This method can only be used while the app is not focused; when - * the app is focused it will return -1. - * - * @platform darwin - */ - bounce(type?: 'critical' | 'informational'): number; - /** - * Cancel the bounce of `id`. - * - * @platform darwin - */ - cancelBounce(id: number): void; - /** - * Bounces the Downloads stack if the filePath is inside the Downloads folder. - * - * @platform darwin - */ - downloadFinished(filePath: string): void; - /** - * The badge string of the dock. - * - * @platform darwin - */ - getBadge(): string; - /** - * The application's [dock menu][dock-menu]. - * - * @platform darwin - */ - getMenu(): (Menu) | (null); - /** - * Hides the dock icon. - * - * @platform darwin - */ - hide(): void; - /** - * Whether the dock icon is visible. - * - * @platform darwin - */ - isVisible(): boolean; - /** - * Sets the string to be displayed in the dock’s badging area. - * - * @platform darwin - */ - setBadge(text: string): void; - /** - * Sets the `image` associated with this dock icon. - * - * @platform darwin - */ - setIcon(image: (NativeImage) | (string)): void; - /** - * Sets the application's [dock menu][dock-menu]. - * - * @platform darwin - */ - setMenu(menu: Menu): void; - /** - * Resolves when the dock icon is shown. - * - * @platform darwin - */ - show(): Promise; - } - - class DownloadItem extends NodeEventEmitter { - - // Docs: https://electronjs.org/docs/api/download-item - - /** - * Emitted when the download is in a terminal state. This includes a completed - * download, a cancelled download (via `downloadItem.cancel()`), and interrupted - * download that can't be resumed. - * - * The `state` can be one of following: - * - * * `completed` - The download completed successfully. - * * `cancelled` - The download has been cancelled. - * * `interrupted` - The download has interrupted and can not resume. - */ - on(event: 'done', listener: (event: Event, - /** - * Can be `completed`, `cancelled` or `interrupted`. - */ - state: ('completed' | 'cancelled' | 'interrupted')) => void): this; - once(event: 'done', listener: (event: Event, - /** - * Can be `completed`, `cancelled` or `interrupted`. - */ - state: ('completed' | 'cancelled' | 'interrupted')) => void): this; - addListener(event: 'done', listener: (event: Event, - /** - * Can be `completed`, `cancelled` or `interrupted`. - */ - state: ('completed' | 'cancelled' | 'interrupted')) => void): this; - removeListener(event: 'done', listener: (event: Event, - /** - * Can be `completed`, `cancelled` or `interrupted`. - */ - state: ('completed' | 'cancelled' | 'interrupted')) => void): this; - /** - * Emitted when the download has been updated and is not done. - * - * The `state` can be one of following: - * - * * `progressing` - The download is in-progress. - * * `interrupted` - The download has interrupted and can be resumed. - */ - on(event: 'updated', listener: (event: Event, - /** - * Can be `progressing` or `interrupted`. - */ - state: ('progressing' | 'interrupted')) => void): this; - once(event: 'updated', listener: (event: Event, - /** - * Can be `progressing` or `interrupted`. - */ - state: ('progressing' | 'interrupted')) => void): this; - addListener(event: 'updated', listener: (event: Event, - /** - * Can be `progressing` or `interrupted`. - */ - state: ('progressing' | 'interrupted')) => void): this; - removeListener(event: 'updated', listener: (event: Event, - /** - * Can be `progressing` or `interrupted`. - */ - state: ('progressing' | 'interrupted')) => void): this; - /** - * Cancels the download operation. - */ - cancel(): void; - /** - * Whether the download can resume. - */ - canResume(): boolean; - /** - * The Content-Disposition field from the response header. - */ - getContentDisposition(): string; - /** - * ETag header value. - */ - getETag(): string; - /** - * The file name of the download item. - * - * **Note:** The file name is not always the same as the actual one saved in local - * disk. If user changes the file name in a prompted download saving dialog, the - * actual name of saved file will be different. - */ - getFilename(): string; - /** - * Last-Modified header value. - */ - getLastModifiedTime(): string; - /** - * The files mime type. - */ - getMimeType(): string; - /** - * The received bytes of the download item. - */ - getReceivedBytes(): number; - /** - * Returns the object previously set by - * `downloadItem.setSaveDialogOptions(options)`. - */ - getSaveDialogOptions(): SaveDialogOptions; - /** - * The save path of the download item. This will be either the path set via - * `downloadItem.setSavePath(path)` or the path selected from the shown save - * dialog. - */ - getSavePath(): string; - /** - * Number of seconds since the UNIX epoch when the download was started. - */ - getStartTime(): number; - /** - * The current state. Can be `progressing`, `completed`, `cancelled` or - * `interrupted`. - * - * **Note:** The following methods are useful specifically to resume a `cancelled` - * item when session is restarted. - */ - getState(): ('progressing' | 'completed' | 'cancelled' | 'interrupted'); - /** - * The total size in bytes of the download item. - * -If the size is unknown, it returns 0. - */ - getTotalBytes(): number; - /** - * The origin URL where the item is downloaded from. - */ - getURL(): string; - /** - * The complete URL chain of the item including any redirects. - */ - getURLChain(): string[]; - /** - * Whether the download has user gesture. - */ - hasUserGesture(): boolean; - /** - * Whether the download is paused. - */ - isPaused(): boolean; - /** - * Pauses the download. - */ - pause(): void; - /** - * Resumes the download that has been paused. - * - * **Note:** To enable resumable downloads the server you are downloading from must - * support range requests and provide both `Last-Modified` and `ETag` header - * values. Otherwise `resume()` will dismiss previously received bytes and restart - * the download from the beginning. - */ - resume(): void; - /** - * This API allows the user to set custom options for the save dialog that opens - * for the download item by default. The API is only available in session's - * `will-download` callback function. - */ - setSaveDialogOptions(options: SaveDialogOptions): void; - /** - * The API is only available in session's `will-download` callback function. If - * `path` doesn't exist, Electron will try to make the directory recursively. If - * user doesn't set the save path via the API, Electron will use the original - * routine to determine the save path; this usually prompts a save dialog. - */ - setSavePath(path: string): void; - savePath: string; - } - - interface Event extends GlobalEvent { - - // Docs: https://electronjs.org/docs/api/structures/event - - preventDefault: (() => void); - } - - interface Extension { - - // Docs: https://electronjs.org/docs/api/structures/extension - - id: string; - /** - * Copy of the extension's manifest data. - */ - manifest: any; - name: string; - /** - * The extension's file path. - */ - path: string; - /** - * The extension's `chrome-extension://` URL. - */ - url: string; - version: string; - } - - interface ExtensionInfo { - - // Docs: https://electronjs.org/docs/api/structures/extension-info - - name: string; - version: string; - } - - interface FileFilter { - - // Docs: https://electronjs.org/docs/api/structures/file-filter - - extensions: string[]; - name: string; - } - - interface FilePathWithHeaders { - - // Docs: https://electronjs.org/docs/api/structures/file-path-with-headers - - /** - * Additional headers to be sent. - */ - headers?: Record; - /** - * The path to the file to send. - */ - path: string; - } - - interface GlobalShortcut { - - // Docs: https://electronjs.org/docs/api/global-shortcut - - /** - * Whether this application has registered `accelerator`. - * - * When the accelerator is already taken by other applications, this call will - * still return `false`. This behavior is intended by operating systems, since they - * don't want applications to fight for global shortcuts. - */ - isRegistered(accelerator: Accelerator): boolean; - /** - * Whether or not the shortcut was registered successfully. - * - * Registers a global shortcut of `accelerator`. The `callback` is called when the - * registered shortcut is pressed by the user. - * - * When the accelerator is already taken by other applications, this call will - * silently fail. This behavior is intended by operating systems, since they don't - * want applications to fight for global shortcuts. - * - * The following accelerators will not be registered successfully on macOS 10.14 - * Mojave unless the app has been authorized as a trusted accessibility client: - * - * * "Media Play/Pause" - * * "Media Next Track" -* "Media Previous Track" -* "Media Stop" - */ - register(accelerator: Accelerator, callback: () => void): boolean; - /** - * Registers a global shortcut of all `accelerator` items in `accelerators`. The - * `callback` is called when any of the registered shortcuts are pressed by the - * user. - * - * When a given accelerator is already taken by other applications, this call will - * silently fail. This behavior is intended by operating systems, since they don't - * want applications to fight for global shortcuts. - * - * The following accelerators will not be registered successfully on macOS 10.14 - * Mojave unless the app has been authorized as a trusted accessibility client: - * - * * "Media Play/Pause" - * * "Media Next Track" -* "Media Previous Track" -* "Media Stop" - */ - registerAll(accelerators: string[], callback: () => void): void; - /** - * Unregisters the global shortcut of `accelerator`. - */ - unregister(accelerator: Accelerator): void; - /** - * Unregisters all of the global shortcuts. - */ - unregisterAll(): void; - } - - interface GPUFeatureStatus { - - // Docs: https://electronjs.org/docs/api/structures/gpu-feature-status - - /** - * Canvas. - */ - '2d_canvas': string; - /** - * Flash. - */ - flash_3d: string; - /** - * Flash Stage3D. - */ - flash_stage3d: string; - /** - * Flash Stage3D Baseline profile. - */ - flash_stage3d_baseline: string; - /** - * Compositing. - */ - gpu_compositing: string; - /** - * Multiple Raster Threads. - */ - multiple_raster_threads: string; - /** - * Native GpuMemoryBuffers. - */ - native_gpu_memory_buffers: string; - /** - * Rasterization. - */ - rasterization: string; - /** - * Video Decode. - */ - video_decode: string; - /** - * Video Encode. - */ - video_encode: string; - /** - * VPx Video Decode. - */ - vpx_decode: string; - /** - * WebGL. - */ - webgl: string; - /** - * WebGL2. - */ - webgl2: string; - } - - interface InAppPurchase extends NodeJS.EventEmitter { - - // Docs: https://electronjs.org/docs/api/in-app-purchase - - on(event: 'transactions-updated', listener: Function): this; - once(event: 'transactions-updated', listener: Function): this; - addListener(event: 'transactions-updated', listener: Function): this; - removeListener(event: 'transactions-updated', listener: Function): this; - /** - * whether a user can make a payment. - */ - canMakePayments(): boolean; - /** - * Completes all pending transactions. - */ - finishAllTransactions(): void; - /** - * Completes the pending transactions corresponding to the date. - */ - finishTransactionByDate(date: string): void; - /** - * Resolves with an array of `Product` objects. - * -Retrieves the product descriptions. - */ - getProducts(productIDs: string[]): Promise; - /** - * the path to the receipt. - */ - getReceiptURL(): string; - /** - * Returns `true` if the product is valid and added to the payment queue. - * - * You should listen for the `transactions-updated` event as soon as possible and - * certainly before you call `purchaseProduct`. - */ - purchaseProduct(productID: string, quantity?: number): Promise; - /** - * Restores finished transactions. This method can be called either to install - * purchases on additional devices, or to restore purchases for an application that - * the user deleted and reinstalled. - * - * The payment queue delivers a new transaction for each previously completed - * transaction that can be restored. Each transaction includes a copy of the - * original transaction. - */ - restoreCompletedTransactions(): void; - } - - class IncomingMessage extends NodeEventEmitter { - - // Docs: https://electronjs.org/docs/api/incoming-message - - /** - * Emitted when a request has been canceled during an ongoing HTTP transaction. - */ - on(event: 'aborted', listener: Function): this; - once(event: 'aborted', listener: Function): this; - addListener(event: 'aborted', listener: Function): this; - removeListener(event: 'aborted', listener: Function): this; - /** - * The `data` event is the usual method of transferring response data into - * applicative code. - */ - on(event: 'data', listener: ( - /** - * A chunk of response body's data. - */ - chunk: Buffer) => void): this; - once(event: 'data', listener: ( - /** - * A chunk of response body's data. - */ - chunk: Buffer) => void): this; - addListener(event: 'data', listener: ( - /** - * A chunk of response body's data. - */ - chunk: Buffer) => void): this; - removeListener(event: 'data', listener: ( - /** - * A chunk of response body's data. - */ - chunk: Buffer) => void): this; - /** - * Indicates that response body has ended. Must be placed before 'data' event. - */ - on(event: 'end', listener: Function): this; - once(event: 'end', listener: Function): this; - addListener(event: 'end', listener: Function): this; - removeListener(event: 'end', listener: Function): this; - /** - * Returns: - * - * `error` Error - Typically holds an error string identifying failure root cause. - * - * Emitted when an error was encountered while streaming response data events. For - * instance, if the server closes the underlying while the response is still - * streaming, an `error` event will be emitted on the response object and a `close` - * event will subsequently follow on the request object. - */ - on(event: 'error', listener: Function): this; - once(event: 'error', listener: Function): this; - addListener(event: 'error', listener: Function): this; - removeListener(event: 'error', listener: Function): this; - headers: Record; - httpVersion: string; - httpVersionMajor: number; - httpVersionMinor: number; - statusCode: number; - statusMessage: string; - } - - interface InputEvent { - - // Docs: https://electronjs.org/docs/api/structures/input-event - - /** - * An array of modifiers of the event, can be `shift`, `control`, `ctrl`, `alt`, - * `meta`, `command`, `cmd`, `isKeypad`, `isAutoRepeat`, `leftButtonDown`, - * `middleButtonDown`, `rightButtonDown`, `capsLock`, `numLock`, `left`, `right`. - */ - modifiers?: Array<'shift' | 'control' | 'ctrl' | 'alt' | 'meta' | 'command' | 'cmd' | 'isKeypad' | 'isAutoRepeat' | 'leftButtonDown' | 'middleButtonDown' | 'rightButtonDown' | 'capsLock' | 'numLock' | 'left' | 'right'>; - } - - interface IOCounters { - - // Docs: https://electronjs.org/docs/api/structures/io-counters - - /** - * Then number of I/O other operations. - */ - otherOperationCount: number; - /** - * Then number of I/O other transfers. - */ - otherTransferCount: number; - /** - * The number of I/O read operations. - */ - readOperationCount: number; - /** - * The number of I/O read transfers. - */ - readTransferCount: number; - /** - * The number of I/O write operations. - */ - writeOperationCount: number; - /** - * The number of I/O write transfers. - */ - writeTransferCount: number; - } - - interface IpcMain extends NodeJS.EventEmitter { - - // Docs: https://electronjs.org/docs/api/ipc-main - - /** - * Adds a handler for an `invoke`able IPC. This handler will be called whenever a - * renderer calls `ipcRenderer.invoke(channel, ...args)`. - * - * If `listener` returns a Promise, the eventual result of the promise will be - * returned as a reply to the remote caller. Otherwise, the return value of the - * listener will be used as the value of the reply. - * - * The `event` that is passed as the first argument to the handler is the same as - * that passed to a regular event listener. It includes information about which - * WebContents is the source of the invoke request. - * - * Errors thrown through `handle` in the main process are not transparent as they - * are serialized and only the `message` property from the original error is - * provided to the renderer process. Please refer to #24427 for details. - */ - handle(channel: string, listener: (event: IpcMainInvokeEvent, ...args: any[]) => (Promise) | (any)): void; - /** - * Handles a single `invoke`able IPC message, then removes the listener. See - * `ipcMain.handle(channel, listener)`. - */ - handleOnce(channel: string, listener: (event: IpcMainInvokeEvent, ...args: any[]) => (Promise) | (any)): void; - /** - * Listens to `channel`, when a new message arrives `listener` would be called with - * `listener(event, args...)`. - */ - on(channel: string, listener: (event: IpcMainEvent, ...args: any[]) => void): this; - /** - * Adds a one time `listener` function for the event. This `listener` is invoked - * only the next time a message is sent to `channel`, after which it is removed. - */ - once(channel: string, listener: (event: IpcMainEvent, ...args: any[]) => void): this; - /** - * Removes listeners of the specified `channel`. - */ - removeAllListeners(channel?: string): this; - /** - * Removes any handler for `channel`, if present. - */ - removeHandler(channel: string): void; - /** - * Removes the specified `listener` from the listener array for the specified - * `channel`. - */ - removeListener(channel: string, listener: (...args: any[]) => void): this; - } - - interface IpcMainEvent extends Event { - - // Docs: https://electronjs.org/docs/api/structures/ipc-main-event - - /** - * The ID of the renderer frame that sent this message - */ - frameId: number; - /** - * A list of MessagePorts that were transferred with this message - */ - ports: MessagePortMain[]; - /** - * The internal ID of the renderer process that sent this message - */ - processId: number; - /** - * A function that will send an IPC message to the renderer frame that sent the - * original message that you are currently handling. You should use this method to - * "reply" to the sent message in order to guarantee the reply will go to the - * correct process and frame. - */ - reply: Function; - /** - * Set this to the value to be returned in a synchronous message - */ - returnValue: any; - /** - * Returns the `webContents` that sent the message - */ - sender: WebContents; - /** - * The frame that sent this message - * - */ - readonly senderFrame: WebFrameMain; - } - - interface IpcMainInvokeEvent extends Event { - - // Docs: https://electronjs.org/docs/api/structures/ipc-main-invoke-event - - /** - * The ID of the renderer frame that sent this message - */ - frameId: number; - /** - * The internal ID of the renderer process that sent this message - */ - processId: number; - /** - * Returns the `webContents` that sent the message - */ - sender: WebContents; - /** - * The frame that sent this message - * - */ - readonly senderFrame: WebFrameMain; - } - - interface IpcRenderer extends NodeJS.EventEmitter { - - // Docs: https://electronjs.org/docs/api/ipc-renderer - - /** - * Resolves with the response from the main process. - * - * Send a message to the main process via `channel` and expect a result - * asynchronously. Arguments will be serialized with the Structured Clone - * Algorithm, just like `window.postMessage`, so prototype chains will not be - * included. Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will throw - * an exception. - * - * > **NOTE:** Sending non-standard JavaScript types such as DOM objects or special - * Electron objects will throw an exception. - * - * Since the main process does not have support for DOM objects such as - * `ImageBitmap`, `File`, `DOMMatrix` and so on, such objects cannot be sent over - * Electron's IPC to the main process, as the main process would have no way to - * decode them. Attempting to send such objects over IPC will result in an error. - * - * The main process should listen for `channel` with `ipcMain.handle()`. - * - * For example: - * - * If you need to transfer a `MessagePort` to the main process, use - * `ipcRenderer.postMessage`. - * - * If you do not need a response to the message, consider using `ipcRenderer.send`. - */ - invoke(channel: string, ...args: any[]): Promise; - /** - * Listens to `channel`, when a new message arrives `listener` would be called with - * `listener(event, args...)`. - */ - on(channel: string, listener: (event: IpcRendererEvent, ...args: any[]) => void): this; - /** - * Adds a one time `listener` function for the event. This `listener` is invoked - * only the next time a message is sent to `channel`, after which it is removed. - */ - once(channel: string, listener: (event: IpcRendererEvent, ...args: any[]) => void): this; - /** - * Send a message to the main process, optionally transferring ownership of zero or - * more `MessagePort` objects. - * - * The transferred `MessagePort` objects will be available in the main process as - * `MessagePortMain` objects by accessing the `ports` property of the emitted - * event. - * - * For example: - * - * For more information on using `MessagePort` and `MessageChannel`, see the MDN - * documentation. - */ - postMessage(channel: string, message: any, transfer?: MessagePort[]): void; - /** - * Removes all listeners, or those of the specified `channel`. - */ - removeAllListeners(channel: string): this; - /** - * Removes the specified `listener` from the listener array for the specified - * `channel`. - */ - removeListener(channel: string, listener: (...args: any[]) => void): this; - /** - * Send an asynchronous message to the main process via `channel`, along with - * arguments. Arguments will be serialized with the Structured Clone Algorithm, - * just like `window.postMessage`, so prototype chains will not be included. - * Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will throw an - * exception. - * - * > **NOTE:** Sending non-standard JavaScript types such as DOM objects or special - * Electron objects will throw an exception. - * - * Since the main process does not have support for DOM objects such as - * `ImageBitmap`, `File`, `DOMMatrix` and so on, such objects cannot be sent over - * Electron's IPC to the main process, as the main process would have no way to - * decode them. Attempting to send such objects over IPC will result in an error. - * - * The main process handles it by listening for `channel` with the `ipcMain` - * module. - * - * If you need to transfer a `MessagePort` to the main process, use - * `ipcRenderer.postMessage`. - * - * If you want to receive a single response from the main process, like the result - * of a method call, consider using `ipcRenderer.invoke`. - */ - send(channel: string, ...args: any[]): void; - /** - * The value sent back by the `ipcMain` handler. - * - * Send a message to the main process via `channel` and expect a result - * synchronously. Arguments will be serialized with the Structured Clone Algorithm, - * just like `window.postMessage`, so prototype chains will not be included. - * Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will throw an - * exception. - * - * > **NOTE:** Sending non-standard JavaScript types such as DOM objects or special - * Electron objects will throw an exception. - * - * Since the main process does not have support for DOM objects such as - * `ImageBitmap`, `File`, `DOMMatrix` and so on, such objects cannot be sent over - * Electron's IPC to the main process, as the main process would have no way to - * decode them. Attempting to send such objects over IPC will result in an error. - * - * The main process handles it by listening for `channel` with `ipcMain` module, - * and replies by setting `event.returnValue`. - * - * > :warning: **WARNING**: Sending a synchronous message will block the whole - * renderer process until the reply is received, so use this method only as a last - * resort. It's much better to use the asynchronous version, `invoke()`. - */ - sendSync(channel: string, ...args: any[]): any; - /** - * Sends a message to a window with `webContentsId` via `channel`. - */ - sendTo(webContentsId: number, channel: string, ...args: any[]): void; - /** - * Like `ipcRenderer.send` but the event will be sent to the `` element in - * the host page instead of the main process. - */ - sendToHost(channel: string, ...args: any[]): void; - } - - interface IpcRendererEvent extends Event { - - // Docs: https://electronjs.org/docs/api/structures/ipc-renderer-event - - /** - * A list of MessagePorts that were transferred with this message - */ - ports: MessagePort[]; - /** - * The `IpcRenderer` instance that emitted the event originally - */ - sender: IpcRenderer; - /** - * The `webContents.id` that sent the message, you can call - * `event.sender.sendTo(event.senderId, ...)` to reply to the message, see - * ipcRenderer.sendTo for more information. This only applies to messages sent from - * a different renderer. Messages sent directly from the main process set - * `event.senderId` to `0`. - */ - senderId: number; - } - - interface JumpListCategory { - - // Docs: https://electronjs.org/docs/api/structures/jump-list-category - - /** - * Array of `JumpListItem` objects if `type` is `tasks` or `custom`, otherwise it - * should be omitted. - */ - items?: JumpListItem[]; - /** - * Must be set if `type` is `custom`, otherwise it should be omitted. - */ - name?: string; - /** - * One of the following: - */ - type?: ('tasks' | 'frequent' | 'recent' | 'custom'); - } - - interface JumpListItem { - - // Docs: https://electronjs.org/docs/api/structures/jump-list-item - - /** - * The command line arguments when `program` is executed. Should only be set if - * `type` is `task`. - */ - args?: string; - /** - * Description of the task (displayed in a tooltip). Should only be set if `type` - * is `task`. Maximum length 260 characters. - */ - description?: string; - /** - * The index of the icon in the resource file. If a resource file contains multiple - * icons this value can be used to specify the zero-based index of the icon that - * should be displayed for this task. If a resource file contains only one icon, - * this property should be set to zero. - */ - iconIndex?: number; - /** - * The absolute path to an icon to be displayed in a Jump List, which can be an - * arbitrary resource file that contains an icon (e.g. `.ico`, `.exe`, `.dll`). You - * can usually specify `process.execPath` to show the program icon. - */ - iconPath?: string; - /** - * Path of the file to open, should only be set if `type` is `file`. - */ - path?: string; - /** - * Path of the program to execute, usually you should specify `process.execPath` - * which opens the current program. Should only be set if `type` is `task`. - */ - program?: string; - /** - * The text to be displayed for the item in the Jump List. Should only be set if - * `type` is `task`. - */ - title?: string; - /** - * One of the following: - */ - type?: ('task' | 'separator' | 'file'); - /** - * The working directory. Default is empty. - */ - workingDirectory?: string; - } - - interface KeyboardEvent { - - // Docs: https://electronjs.org/docs/api/structures/keyboard-event - - /** - * whether an Alt key was used in an accelerator to trigger the Event - */ - altKey?: boolean; - /** - * whether the Control key was used in an accelerator to trigger the Event - */ - ctrlKey?: boolean; - /** - * whether a meta key was used in an accelerator to trigger the Event - */ - metaKey?: boolean; - /** - * whether a Shift key was used in an accelerator to trigger the Event - */ - shiftKey?: boolean; - /** - * whether an accelerator was used to trigger the event as opposed to another user - * gesture like mouse click - */ - triggeredByAccelerator?: boolean; - } - - interface KeyboardInputEvent extends InputEvent { - - // Docs: https://electronjs.org/docs/api/structures/keyboard-input-event - - /** - * The character that will be sent as the keyboard event. Should only use the valid - * key codes in Accelerator. - */ - keyCode: string; - /** - * The type of the event, can be `keyDown`, `keyUp` or `char`. - */ - type: ('keyDown' | 'keyUp' | 'char'); - } - - interface MemoryInfo { - - // Docs: https://electronjs.org/docs/api/structures/memory-info - - /** - * The maximum amount of memory that has ever been pinned to actual physical RAM. - */ - peakWorkingSetSize: number; - /** - * The amount of memory not shared by other processes, such as JS heap or HTML - * content. - * - * @platform win32 - */ - privateBytes?: number; - /** - * The amount of memory currently pinned to actual physical RAM. - */ - workingSetSize: number; - } - - interface MemoryUsageDetails { - - // Docs: https://electronjs.org/docs/api/structures/memory-usage-details - - count: number; - liveSize: number; - size: number; - } - - class Menu { - - // Docs: https://electronjs.org/docs/api/menu - - /** - * Emitted when a popup is closed either manually or with `menu.closePopup()`. - */ - on(event: 'menu-will-close', listener: (event: Event) => void): this; - once(event: 'menu-will-close', listener: (event: Event) => void): this; - addListener(event: 'menu-will-close', listener: (event: Event) => void): this; - removeListener(event: 'menu-will-close', listener: (event: Event) => void): this; - /** - * Emitted when `menu.popup()` is called. - */ - on(event: 'menu-will-show', listener: (event: Event) => void): this; - once(event: 'menu-will-show', listener: (event: Event) => void): this; - addListener(event: 'menu-will-show', listener: (event: Event) => void): this; - removeListener(event: 'menu-will-show', listener: (event: Event) => void): this; - /** - * Menu - */ - constructor(); - /** - * Generally, the `template` is an array of `options` for constructing a MenuItem. - * The usage can be referenced above. - * - * You can also attach other fields to the element of the `template` and they will - * become properties of the constructed menu items. - */ - static buildFromTemplate(template: Array<(MenuItemConstructorOptions) | (MenuItem)>): Menu; - /** - * The application menu, if set, or `null`, if not set. - * - * **Note:** The returned `Menu` instance doesn't support dynamic addition or - * removal of menu items. Instance properties can still be dynamically modified. - */ - static getApplicationMenu(): (Menu) | (null); - /** - * Sends the `action` to the first responder of application. This is used for - * emulating default macOS menu behaviors. Usually you would use the `role` - * property of a `MenuItem`. - * - * See the macOS Cocoa Event Handling Guide for more information on macOS' native - * actions. - * - * @platform darwin - */ - static sendActionToFirstResponder(action: string): void; - /** - * Sets `menu` as the application menu on macOS. On Windows and Linux, the `menu` - * will be set as each window's top menu. - * - * Also on Windows and Linux, you can use a `&` in the top-level item name to - * indicate which letter should get a generated accelerator. For example, using - * `&File` for the file menu would result in a generated `Alt-F` accelerator that - * opens the associated menu. The indicated character in the button label then gets - * an underline, and the `&` character is not displayed on the button label. - * - * In order to escape the `&` character in an item name, add a proceeding `&`. For - * example, `&&File` would result in `&File` displayed on the button label. - * - * Passing `null` will suppress the default menu. On Windows and Linux, this has - * the additional effect of removing the menu bar from the window. - * - * **Note:** The default menu will be created automatically if the app does not set - * one. It contains standard items such as `File`, `Edit`, `View`, `Window` and - * `Help`. - */ - static setApplicationMenu(menu: (Menu) | (null)): void; - /** - * Appends the `menuItem` to the menu. - */ - append(menuItem: MenuItem): void; - /** - * Closes the context menu in the `browserWindow`. - */ - closePopup(browserWindow?: BrowserWindow): void; - /** - * the item with the specified `id` - */ - getMenuItemById(id: string): (MenuItem) | (null); - /** - * Inserts the `menuItem` to the `pos` position of the menu. - */ - insert(pos: number, menuItem: MenuItem): void; - /** - * Pops up this menu as a context menu in the `BrowserWindow`. - */ - popup(options?: PopupOptions): void; - items: MenuItem[]; - } - - class MenuItem { - - // Docs: https://electronjs.org/docs/api/menu-item - - /** - * MenuItem - */ - constructor(options: MenuItemConstructorOptions); - accelerator?: Accelerator; - checked: boolean; - click: Function; - commandId: number; - enabled: boolean; - icon?: (NativeImage) | (string); - id: string; - label: string; - menu: Menu; - registerAccelerator: boolean; - role?: ('undo' | 'redo' | 'cut' | 'copy' | 'paste' | 'pasteAndMatchStyle' | 'delete' | 'selectAll' | 'reload' | 'forceReload' | 'toggleDevTools' | 'resetZoom' | 'zoomIn' | 'zoomOut' | 'togglefullscreen' | 'window' | 'minimize' | 'close' | 'help' | 'about' | 'services' | 'hide' | 'hideOthers' | 'unhide' | 'quit' | 'startSpeaking' | 'stopSpeaking' | 'zoom' | 'front' | 'appMenu' | 'fileMenu' | 'editMenu' | 'viewMenu' | 'recentDocuments' | 'toggleTabBar' | 'selectNextTab' | 'selectPreviousTab' | 'mergeAllWindows' | 'clearRecentDocuments' | 'moveTabToNewWindow' | 'windowMenu'); - sharingItem: SharingItem; - sublabel: string; - submenu?: Menu; - toolTip: string; - type: ('normal' | 'separator' | 'submenu' | 'checkbox' | 'radio'); - visible: boolean; - } - - class MessageChannelMain extends NodeEventEmitter { - - // Docs: https://electronjs.org/docs/api/message-channel-main - - port1: MessagePortMain; - port2: MessagePortMain; - } - - class MessagePortMain extends NodeEventEmitter { - - // Docs: https://electronjs.org/docs/api/message-port-main - - /** - * Emitted when the remote end of a MessagePortMain object becomes disconnected. - */ - on(event: 'close', listener: Function): this; - once(event: 'close', listener: Function): this; - addListener(event: 'close', listener: Function): this; - removeListener(event: 'close', listener: Function): this; - /** - * Emitted when a MessagePortMain object receives a message. - */ - on(event: 'message', listener: (messageEvent: MessageEvent) => void): this; - once(event: 'message', listener: (messageEvent: MessageEvent) => void): this; - addListener(event: 'message', listener: (messageEvent: MessageEvent) => void): this; - removeListener(event: 'message', listener: (messageEvent: MessageEvent) => void): this; - /** - * Disconnects the port, so it is no longer active. - */ - close(): void; - /** - * Sends a message from the port, and optionally, transfers ownership of objects to - * other browsing contexts. - */ - postMessage(message: any, transfer?: MessagePortMain[]): void; - /** - * Starts the sending of messages queued on the port. Messages will be queued until - * this method is called. - */ - start(): void; - } - - interface MimeTypedBuffer { - - // Docs: https://electronjs.org/docs/api/structures/mime-typed-buffer - - /** - * Charset of the buffer. - */ - charset?: string; - /** - * The actual Buffer content. - */ - data: Buffer; - /** - * MIME type of the buffer. - */ - mimeType?: string; - } - - interface MouseInputEvent extends InputEvent { - - // Docs: https://electronjs.org/docs/api/structures/mouse-input-event - - /** - * The button pressed, can be `left`, `middle`, `right`. - */ - button?: ('left' | 'middle' | 'right'); - clickCount?: number; - globalX?: number; - globalY?: number; - movementX?: number; - movementY?: number; - /** - * The type of the event, can be `mouseDown`, `mouseUp`, `mouseEnter`, - * `mouseLeave`, `contextMenu`, `mouseWheel` or `mouseMove`. - */ - type: ('mouseDown' | 'mouseUp' | 'mouseEnter' | 'mouseLeave' | 'contextMenu' | 'mouseWheel' | 'mouseMove'); - x: number; - y: number; - } - - interface MouseWheelInputEvent extends MouseInputEvent { - - // Docs: https://electronjs.org/docs/api/structures/mouse-wheel-input-event - - accelerationRatioX?: number; - accelerationRatioY?: number; - canScroll?: boolean; - deltaX?: number; - deltaY?: number; - hasPreciseScrollingDeltas?: boolean; - /** - * The type of the event, can be `mouseWheel`. - */ - type: ('mouseWheel'); - wheelTicksX?: number; - wheelTicksY?: number; - } - - class NativeImage { - - // Docs: https://electronjs.org/docs/api/native-image - - /** - * Creates an empty `NativeImage` instance. - */ - static createEmpty(): NativeImage; - /** - * Creates a new `NativeImage` instance from `buffer` that contains the raw bitmap - * pixel data returned by `toBitmap()`. The specific format is platform-dependent. - */ - static createFromBitmap(buffer: Buffer, options: CreateFromBitmapOptions): NativeImage; - /** - * Creates a new `NativeImage` instance from `buffer`. Tries to decode as PNG or - * JPEG first. - */ - static createFromBuffer(buffer: Buffer, options?: CreateFromBufferOptions): NativeImage; - /** - * Creates a new `NativeImage` instance from `dataURL`. - */ - static createFromDataURL(dataURL: string): NativeImage; - /** - * Creates a new `NativeImage` instance from the NSImage that maps to the given - * image name. See `System Icons` for a list of possible values. - * - * The `hslShift` is applied to the image with the following rules: - * - * * `hsl_shift[0]` (hue): The absolute hue value for the image - 0 and 1 map to 0 - * and 360 on the hue color wheel (red). - * * `hsl_shift[1]` (saturation): A saturation shift for the image, with the - * following key values: 0 = remove all color. 0.5 = leave unchanged. 1 = fully - * saturate the image. - * * `hsl_shift[2]` (lightness): A lightness shift for the image, with the - * following key values: 0 = remove all lightness (make all pixels black). 0.5 = - * leave unchanged. 1 = full lightness (make all pixels white). - * - * This means that `[-1, 0, 1]` will make the image completely white and `[-1, 1, - * 0]` will make the image completely black. - * - * In some cases, the `NSImageName` doesn't match its string representation; one - * example of this is `NSFolderImageName`, whose string representation would - * actually be `NSFolder`. Therefore, you'll need to determine the correct string - * representation for your image before passing it in. This can be done with the - * following: - * - * `echo -e '#import \nint main() { NSLog(@"%@", SYSTEM_IMAGE_NAME); - * }' | clang -otest -x objective-c -framework Cocoa - && ./test` - * -where `SYSTEM_IMAGE_NAME` should be replaced with any value from this list. - * - * @platform darwin - */ - static createFromNamedImage(imageName: string, hslShift?: number[]): NativeImage; - /** - * Creates a new `NativeImage` instance from a file located at `path`. This method - * returns an empty image if the `path` does not exist, cannot be read, or is not a - * valid image. - */ - static createFromPath(path: string): NativeImage; - /** - * fulfilled with the file's thumbnail preview image, which is a NativeImage. - * - * @platform darwin,win32 - */ - static createThumbnailFromPath(path: string, maxSize: Size): Promise; - /** - * Add an image representation for a specific scale factor. This can be used to - * explicitly add different scale factor representations to an image. This can be - * called on empty images. - */ - addRepresentation(options: AddRepresentationOptions): void; - /** - * The cropped image. - */ - crop(rect: Rectangle): NativeImage; - /** - * The image's aspect ratio. - * - * If `scaleFactor` is passed, this will return the aspect ratio corresponding to - * the image representation most closely matching the passed value. - */ - getAspectRatio(scaleFactor?: number): number; - /** - * A Buffer that contains the image's raw bitmap pixel data. - * - * The difference between `getBitmap()` and `toBitmap()` is that `getBitmap()` does - * not copy the bitmap data, so you have to use the returned Buffer immediately in - * current event loop tick; otherwise the data might be changed or destroyed. - */ - getBitmap(options?: BitmapOptions): Buffer; - /** - * A Buffer that stores C pointer to underlying native handle of the image. On - * macOS, a pointer to `NSImage` instance would be returned. - * - * Notice that the returned pointer is a weak pointer to the underlying native - * image instead of a copy, so you _must_ ensure that the associated `nativeImage` - * instance is kept around. - * - * @platform darwin - */ - getNativeHandle(): Buffer; - /** - * An array of all scale factors corresponding to representations for a given - * nativeImage. - */ - getScaleFactors(): number[]; - /** - * If `scaleFactor` is passed, this will return the size corresponding to the image - * representation most closely matching the passed value. - */ - getSize(scaleFactor?: number): Size; - /** - * Whether the image is empty. - */ - isEmpty(): boolean; - /** - * Whether the image is a template image. - */ - isTemplateImage(): boolean; - /** - * The resized image. - * - * If only the `height` or the `width` are specified then the current aspect ratio - * will be preserved in the resized image. - */ - resize(options: ResizeOptions): NativeImage; - /** - * Marks the image as a template image. - */ - setTemplateImage(option: boolean): void; - /** - * A Buffer that contains a copy of the image's raw bitmap pixel data. - */ - toBitmap(options?: ToBitmapOptions): Buffer; - /** - * The data URL of the image. - */ - toDataURL(options?: ToDataURLOptions): string; - /** - * A Buffer that contains the image's `JPEG` encoded data. - */ - toJPEG(quality: number): Buffer; - /** - * A Buffer that contains the image's `PNG` encoded data. - */ - toPNG(options?: ToPNGOptions): Buffer; - isMacTemplateImage: boolean; - } - - interface NativeTheme extends NodeJS.EventEmitter { - - // Docs: https://electronjs.org/docs/api/native-theme - - /** - * Emitted when something in the underlying NativeTheme has changed. This normally - * means that either the value of `shouldUseDarkColors`, - * `shouldUseHighContrastColors` or `shouldUseInvertedColorScheme` has changed. You - * will have to check them to determine which one has changed. - */ - on(event: 'updated', listener: Function): this; - once(event: 'updated', listener: Function): this; - addListener(event: 'updated', listener: Function): this; - removeListener(event: 'updated', listener: Function): this; - /** - * A `Boolean` for if the OS / Chromium currently has a dark mode enabled or is - * being instructed to show a dark-style UI. If you want to modify this value you - * should use `themeSource` below. - * - */ - readonly shouldUseDarkColors: boolean; - /** - * A `Boolean` for if the OS / Chromium currently has high-contrast mode enabled or - * is being instructed to show a high-contrast UI. - * - * @platform darwin,win32 - */ - readonly shouldUseHighContrastColors: boolean; - /** - * A `Boolean` for if the OS / Chromium currently has an inverted color scheme or - * is being instructed to use an inverted color scheme. - * - * @platform darwin,win32 - */ - readonly shouldUseInvertedColorScheme: boolean; - /** - * A `String` property that can be `system`, `light` or `dark`. It is used to - * override and supersede the value that Chromium has chosen to use internally. - * - * Setting this property to `system` will remove the override and everything will - * be reset to the OS default. By default `themeSource` is `system`. - * - * Settings this property to `dark` will have the following effects: - * - * * `nativeTheme.shouldUseDarkColors` will be `true` when accessed - * * Any UI Electron renders on Linux and Windows including context menus, - * devtools, etc. will use the dark UI. - * * Any UI the OS renders on macOS including menus, window frames, etc. will use - * the dark UI. - * * The `prefers-color-scheme` CSS query will match `dark` mode. - * * The `updated` event will be emitted - * - * Settings this property to `light` will have the following effects: - * - * * `nativeTheme.shouldUseDarkColors` will be `false` when accessed - * * Any UI Electron renders on Linux and Windows including context menus, - * devtools, etc. will use the light UI. - * * Any UI the OS renders on macOS including menus, window frames, etc. will use - * the light UI. - * * The `prefers-color-scheme` CSS query will match `light` mode. - * * The `updated` event will be emitted - * - * The usage of this property should align with a classic "dark mode" state machine - * in your application where the user has three options. - * - * * `Follow OS` --> `themeSource = 'system'` - * * `Dark Mode` --> `themeSource = 'dark'` - * * `Light Mode` --> `themeSource = 'light'` - * - * Your application should then always use `shouldUseDarkColors` to determine what - * CSS to apply. - */ - themeSource: ('system' | 'light' | 'dark'); - } - - interface Net { - - // Docs: https://electronjs.org/docs/api/net - - /** - * Whether there is currently internet connection. - * - * A return value of `false` is a pretty strong indicator that the user won't be - * able to connect to remote sites. However, a return value of `true` is - * inconclusive; even if some link is up, it is uncertain whether a particular - * connection attempt to a particular remote site will be successful. - */ - isOnline(): boolean; - /** - * Creates a `ClientRequest` instance using the provided `options` which are - * directly forwarded to the `ClientRequest` constructor. The `net.request` method - * would be used to issue both secure and insecure HTTP requests according to the - * specified protocol scheme in the `options` object. - */ - request(options: (ClientRequestConstructorOptions) | (string)): ClientRequest; - /** - * A `Boolean` property. Whether there is currently internet connection. - * - * A return value of `false` is a pretty strong indicator that the user won't be - * able to connect to remote sites. However, a return value of `true` is - * inconclusive; even if some link is up, it is uncertain whether a particular - * connection attempt to a particular remote site will be successful. - * - */ - readonly online: boolean; - } - - interface NetLog { - - // Docs: https://electronjs.org/docs/api/net-log - - /** - * resolves when the net log has begun recording. - * -Starts recording network events to `path`. - */ - startLogging(path: string, options?: StartLoggingOptions): Promise; - /** - * resolves when the net log has been flushed to disk. - * - * Stops recording network events. If not called, net logging will automatically - * end when app quits. - */ - stopLogging(): Promise; - /** - * A `Boolean` property that indicates whether network logs are currently being - * recorded. - * - */ - readonly currentlyLogging: boolean; - } - - interface NewWindowWebContentsEvent extends Event { - - // Docs: https://electronjs.org/docs/api/structures/new-window-web-contents-event - - newGuest?: BrowserWindow; - } - - class Notification extends NodeEventEmitter { - - // Docs: https://electronjs.org/docs/api/notification - - on(event: 'action', listener: (event: Event, - /** - * The index of the action that was activated. - */ - index: number) => void): this; - once(event: 'action', listener: (event: Event, - /** - * The index of the action that was activated. - */ - index: number) => void): this; - addListener(event: 'action', listener: (event: Event, - /** - * The index of the action that was activated. - */ - index: number) => void): this; - removeListener(event: 'action', listener: (event: Event, - /** - * The index of the action that was activated. - */ - index: number) => void): this; - /** - * Emitted when the notification is clicked by the user. - */ - on(event: 'click', listener: (event: Event) => void): this; - once(event: 'click', listener: (event: Event) => void): this; - addListener(event: 'click', listener: (event: Event) => void): this; - removeListener(event: 'click', listener: (event: Event) => void): this; - /** - * Emitted when the notification is closed by manual intervention from the user. - * - * This event is not guaranteed to be emitted in all cases where the notification - * is closed. - */ - on(event: 'close', listener: (event: Event) => void): this; - once(event: 'close', listener: (event: Event) => void): this; - addListener(event: 'close', listener: (event: Event) => void): this; - removeListener(event: 'close', listener: (event: Event) => void): this; - /** - * Emitted when an error is encountered while creating and showing the native - * notification. - * - * @platform win32 - */ - on(event: 'failed', listener: (event: Event, - /** - * The error encountered during execution of the `show()` method. - */ - error: string) => void): this; - once(event: 'failed', listener: (event: Event, - /** - * The error encountered during execution of the `show()` method. - */ - error: string) => void): this; - addListener(event: 'failed', listener: (event: Event, - /** - * The error encountered during execution of the `show()` method. - */ - error: string) => void): this; - removeListener(event: 'failed', listener: (event: Event, - /** - * The error encountered during execution of the `show()` method. - */ - error: string) => void): this; - /** - * Emitted when the user clicks the "Reply" button on a notification with - * `hasReply: true`. - * - * @platform darwin - */ - on(event: 'reply', listener: (event: Event, - /** - * The string the user entered into the inline reply field. - */ - reply: string) => void): this; - once(event: 'reply', listener: (event: Event, - /** - * The string the user entered into the inline reply field. - */ - reply: string) => void): this; - addListener(event: 'reply', listener: (event: Event, - /** - * The string the user entered into the inline reply field. - */ - reply: string) => void): this; - removeListener(event: 'reply', listener: (event: Event, - /** - * The string the user entered into the inline reply field. - */ - reply: string) => void): this; - /** - * Emitted when the notification is shown to the user, note this could be fired - * multiple times as a notification can be shown multiple times through the - * `show()` method. - */ - on(event: 'show', listener: (event: Event) => void): this; - once(event: 'show', listener: (event: Event) => void): this; - addListener(event: 'show', listener: (event: Event) => void): this; - removeListener(event: 'show', listener: (event: Event) => void): this; - /** - * Notification - */ - constructor(options?: NotificationConstructorOptions); - /** - * Whether or not desktop notifications are supported on the current system - */ - static isSupported(): boolean; - /** - * Dismisses the notification. - */ - close(): void; - /** - * Immediately shows the notification to the user, please note this means unlike - * the HTML5 Notification implementation, instantiating a `new Notification` does - * not immediately show it to the user, you need to call this method before the OS - * will display it. - * - * If the notification has been shown before, this method will dismiss the - * previously shown notification and create a new one with identical properties. - */ - show(): void; - actions: NotificationAction[]; - body: string; - closeButtonText: string; - hasReply: boolean; - replyPlaceholder: string; - silent: boolean; - sound: string; - subtitle: string; - timeoutType: ('default' | 'never'); - title: string; - toastXml: string; - urgency: ('normal' | 'critical' | 'low'); - } - - interface NotificationAction { - - // Docs: https://electronjs.org/docs/api/structures/notification-action - - /** - * The label for the given action. - */ - text?: string; - /** - * The type of action, can be `button`. - */ - type: ('button'); - } - - interface NotificationResponse { - - // Docs: https://electronjs.org/docs/api/structures/notification-response - - /** - * The identifier string of the action that the user selected. - */ - actionIdentifier: string; - /** - * The delivery date of the notification. - */ - date: number; - /** - * The unique identifier for this notification request. - */ - identifier: string; - /** - * A dictionary of custom information associated with the notification. - */ - userInfo: Record; - /** - * The text entered or chosen by the user. - */ - userText?: string; - } - - interface Point { - - // Docs: https://electronjs.org/docs/api/structures/point - - x: number; - y: number; - } - - interface PostBody { - - // Docs: https://electronjs.org/docs/api/structures/post-body - - /** - * The boundary used to separate multiple parts of the message. Only valid when - * `contentType` is `multipart/form-data`. - */ - boundary?: string; - /** - * The `content-type` header used for the data. One of - * `application/x-www-form-urlencoded` or `multipart/form-data`. Corresponds to the - * `enctype` attribute of the submitted HTML form. - */ - contentType: string; - /** - * The post data to be sent to the new window. - */ - data: Array<(UploadRawData) | (UploadFile)>; - } - - interface PowerMonitor extends NodeJS.EventEmitter { - - // Docs: https://electronjs.org/docs/api/power-monitor - - /** - * Emitted when the system is about to lock the screen. - * - * @platform darwin,win32 - */ - on(event: 'lock-screen', listener: Function): this; - once(event: 'lock-screen', listener: Function): this; - addListener(event: 'lock-screen', listener: Function): this; - removeListener(event: 'lock-screen', listener: Function): this; - /** - * Emitted when the system changes to AC power. - * - * @platform darwin,win32 - */ - on(event: 'on-ac', listener: Function): this; - once(event: 'on-ac', listener: Function): this; - addListener(event: 'on-ac', listener: Function): this; - removeListener(event: 'on-ac', listener: Function): this; - /** - * Emitted when system changes to battery power. - * - * @platform darwin - */ - on(event: 'on-battery', listener: Function): this; - once(event: 'on-battery', listener: Function): this; - addListener(event: 'on-battery', listener: Function): this; - removeListener(event: 'on-battery', listener: Function): this; - /** - * Emitted when system is resuming. - * - * @platform darwin,win32 - */ - on(event: 'resume', listener: Function): this; - once(event: 'resume', listener: Function): this; - addListener(event: 'resume', listener: Function): this; - removeListener(event: 'resume', listener: Function): this; - /** - * Emitted when the system is about to reboot or shut down. If the event handler - * invokes `e.preventDefault()`, Electron will attempt to delay system shutdown in - * order for the app to exit cleanly. If `e.preventDefault()` is called, the app - * should exit as soon as possible by calling something like `app.quit()`. - * - * @platform linux,darwin - */ - on(event: 'shutdown', listener: Function): this; - once(event: 'shutdown', listener: Function): this; - addListener(event: 'shutdown', listener: Function): this; - removeListener(event: 'shutdown', listener: Function): this; - /** - * Emitted when the system is suspending. - * - * @platform darwin,win32 - */ - on(event: 'suspend', listener: Function): this; - once(event: 'suspend', listener: Function): this; - addListener(event: 'suspend', listener: Function): this; - removeListener(event: 'suspend', listener: Function): this; - /** - * Emitted as soon as the systems screen is unlocked. - * - * @platform darwin,win32 - */ - on(event: 'unlock-screen', listener: Function): this; - once(event: 'unlock-screen', listener: Function): this; - addListener(event: 'unlock-screen', listener: Function): this; - removeListener(event: 'unlock-screen', listener: Function): this; - /** - * Emitted when a login session is activated. See documentation for more - * information. - * - * @platform darwin - */ - on(event: 'user-did-become-active', listener: Function): this; - once(event: 'user-did-become-active', listener: Function): this; - addListener(event: 'user-did-become-active', listener: Function): this; - removeListener(event: 'user-did-become-active', listener: Function): this; - /** - * Emitted when a login session is deactivated. See documentation for more - * information. - * - * @platform darwin - */ - on(event: 'user-did-resign-active', listener: Function): this; - once(event: 'user-did-resign-active', listener: Function): this; - addListener(event: 'user-did-resign-active', listener: Function): this; - removeListener(event: 'user-did-resign-active', listener: Function): this; - /** - * The system's current state. Can be `active`, `idle`, `locked` or `unknown`. - * - * Calculate the system idle state. `idleThreshold` is the amount of time (in - * seconds) before considered idle. `locked` is available on supported systems - * only. - */ - getSystemIdleState(idleThreshold: number): ('active' | 'idle' | 'locked' | 'unknown'); - /** - * Idle time in seconds - -Calculate system idle time in seconds. - */ - getSystemIdleTime(): number; - /** - * Whether the system is on battery power. - * - * To monitor for changes in this property, use the `on-battery` and `on-ac` - * events. - */ - isOnBatteryPower(): boolean; - /** - * A `Boolean` property. True if the system is on battery power. - * -See `powerMonitor.isOnBatteryPower()`. - */ - onBatteryPower: boolean; - } - - interface PowerSaveBlocker { - - // Docs: https://electronjs.org/docs/api/power-save-blocker - - /** - * Whether the corresponding `powerSaveBlocker` has started. - */ - isStarted(id: number): boolean; - /** - * The blocker ID that is assigned to this power blocker. - * - * Starts preventing the system from entering lower-power mode. Returns an integer - * identifying the power save blocker. - * - * **Note:** `prevent-display-sleep` has higher precedence over - * `prevent-app-suspension`. Only the highest precedence type takes effect. In - * other words, `prevent-display-sleep` always takes precedence over - * `prevent-app-suspension`. - * - * For example, an API calling A requests for `prevent-app-suspension`, and another - * calling B requests for `prevent-display-sleep`. `prevent-display-sleep` will be - * used until B stops its request. After that, `prevent-app-suspension` is used. - */ - start(type: 'prevent-app-suspension' | 'prevent-display-sleep'): number; - /** - * Stops the specified power save blocker. - */ - stop(id: number): void; - } - - interface PrinterInfo { - - // Docs: https://electronjs.org/docs/api/structures/printer-info - - /** - * a longer description of the printer's type. - */ - description: string; - /** - * the name of the printer as shown in Print Preview. - */ - displayName: string; - /** - * whether or not a given printer is set as the default printer on the OS. - */ - isDefault: boolean; - /** - * the name of the printer as understood by the OS. - */ - name: string; - /** - * an object containing a variable number of platform-specific printer information. - */ - options: Options; - /** - * the current status of the printer. - */ - status: number; - } - - interface ProcessMemoryInfo { - - // Docs: https://electronjs.org/docs/api/structures/process-memory-info - - /** - * The amount of memory not shared by other processes, such as JS heap or HTML - * content in Kilobytes. - */ - private: number; - /** - * The amount of memory currently pinned to actual physical RAM in Kilobytes. - * - * @platform linux,win32 - */ - residentSet: number; - /** - * The amount of memory shared between processes, typically memory consumed by the - * Electron code itself in Kilobytes. - */ - shared: number; - } - - interface ProcessMetric { - - // Docs: https://electronjs.org/docs/api/structures/process-metric - - /** - * CPU usage of the process. - */ - cpu: CPUUsage; - /** - * Creation time for this process. The time is represented as number of - * milliseconds since epoch. Since the `pid` can be reused after a process dies, it - * is useful to use both the `pid` and the `creationTime` to uniquely identify a - * process. - */ - creationTime: number; - /** - * One of the following values: - * - * @platform win32 - */ - integrityLevel?: ('untrusted' | 'low' | 'medium' | 'high' | 'unknown'); - /** - * Memory information for the process. - */ - memory: MemoryInfo; - /** - * The name of the process. Examples for utility: `Audio Service`, `Content - * Decryption Module Service`, `Network Service`, `Video Capture`, etc. - */ - name?: string; - /** - * Process id of the process. - */ - pid: number; - /** - * Whether the process is sandboxed on OS level. - * - * @platform darwin,win32 - */ - sandboxed?: boolean; - /** - * The non-localized name of the process. - */ - serviceName?: string; - /** - * Process type. One of the following values: - */ - type: ('Browser' | 'Tab' | 'Utility' | 'Zygote' | 'Sandbox helper' | 'GPU' | 'Pepper Plugin' | 'Pepper Plugin Broker' | 'Unknown'); - } - - interface Product { - - // Docs: https://electronjs.org/docs/api/structures/product - - /** - * The total size of the content, in bytes. - */ - contentLengths: number[]; - /** - * A string that identifies the version of the content. - */ - contentVersion: string; - /** - * 3 character code presenting a product's currency based on the ISO 4217 standard. - */ - currencyCode: string; - /** - * The locale formatted price of the product. - */ - formattedPrice: string; - /** - * A Boolean value that indicates whether the App Store has downloadable content - * for this product. `true` if at least one file has been associated with the - * product. - */ - isDownloadable: boolean; - /** - * A description of the product. - */ - localizedDescription: string; - /** - * The name of the product. - */ - localizedTitle: string; - /** - * The cost of the product in the local currency. - */ - price: number; - /** - * The string that identifies the product to the Apple App Store. - */ - productIdentifier: string; - } - - interface Protocol { - - // Docs: https://electronjs.org/docs/api/protocol - - /** - * Whether the protocol was successfully intercepted - * - * Intercepts `scheme` protocol and uses `handler` as the protocol's new handler - * which sends a `Buffer` as a response. - */ - interceptBufferProtocol(scheme: string, handler: (request: ProtocolRequest, callback: (response: (Buffer) | (ProtocolResponse)) => void) => void): boolean; - /** - * Whether the protocol was successfully intercepted - * - * Intercepts `scheme` protocol and uses `handler` as the protocol's new handler - * which sends a file as a response. - */ - interceptFileProtocol(scheme: string, handler: (request: ProtocolRequest, callback: (response: (string) | (ProtocolResponse)) => void) => void): boolean; - /** - * Whether the protocol was successfully intercepted - * - * Intercepts `scheme` protocol and uses `handler` as the protocol's new handler - * which sends a new HTTP request as a response. - */ - interceptHttpProtocol(scheme: string, handler: (request: ProtocolRequest, callback: (response: ProtocolResponse) => void) => void): boolean; - /** - * Whether the protocol was successfully intercepted - * - * Same as `protocol.registerStreamProtocol`, except that it replaces an existing - * protocol handler. - */ - interceptStreamProtocol(scheme: string, handler: (request: ProtocolRequest, callback: (response: (NodeJS.ReadableStream) | (ProtocolResponse)) => void) => void): boolean; - /** - * Whether the protocol was successfully intercepted - * - * Intercepts `scheme` protocol and uses `handler` as the protocol's new handler - * which sends a `String` as a response. - */ - interceptStringProtocol(scheme: string, handler: (request: ProtocolRequest, callback: (response: (string) | (ProtocolResponse)) => void) => void): boolean; - /** - * Whether `scheme` is already intercepted. - */ - isProtocolIntercepted(scheme: string): boolean; - /** - * Whether `scheme` is already registered. - */ - isProtocolRegistered(scheme: string): boolean; - /** - * Whether the protocol was successfully registered - * - * Registers a protocol of `scheme` that will send a `Buffer` as a response. - * - * The usage is the same with `registerFileProtocol`, except that the `callback` - * should be called with either a `Buffer` object or an object that has the `data` - * property. - -Example: - */ - registerBufferProtocol(scheme: string, handler: (request: ProtocolRequest, callback: (response: (Buffer) | (ProtocolResponse)) => void) => void): boolean; - /** - * Whether the protocol was successfully registered - * - * Registers a protocol of `scheme` that will send a file as the response. The - * `handler` will be called with `request` and `callback` where `request` is an - * incoming request for the `scheme`. - * - * To handle the `request`, the `callback` should be called with either the file's - * path or an object that has a `path` property, e.g. `callback(filePath)` or - * `callback({ path: filePath })`. The `filePath` must be an absolute path. - * - * By default the `scheme` is treated like `http:`, which is parsed differently - * from protocols that follow the "generic URI syntax" like `file:`. - */ - registerFileProtocol(scheme: string, handler: (request: ProtocolRequest, callback: (response: (string) | (ProtocolResponse)) => void) => void): boolean; - /** - * Whether the protocol was successfully registered - * - * Registers a protocol of `scheme` that will send an HTTP request as a response. - * - * The usage is the same with `registerFileProtocol`, except that the `callback` - * should be called with an object that has the `url` property. - */ - registerHttpProtocol(scheme: string, handler: (request: ProtocolRequest, callback: (response: ProtocolResponse) => void) => void): boolean; - /** - * **Note:** This method can only be used before the `ready` event of the `app` - * module gets emitted and can be called only once. - * - * Registers the `scheme` as standard, secure, bypasses content security policy for - * resources, allows registering ServiceWorker, supports fetch API, and streaming - * video/audio. Specify a privilege with the value of `true` to enable the - * capability. - * - * An example of registering a privileged scheme, that bypasses Content Security - * Policy: - * - * A standard scheme adheres to what RFC 3986 calls generic URI syntax. For example - * `http` and `https` are standard schemes, while `file` is not. - * - * Registering a scheme as standard allows relative and absolute resources to be - * resolved correctly when served. Otherwise the scheme will behave like the `file` - * protocol, but without the ability to resolve relative URLs. - * - * For example when you load following page with custom protocol without - * registering it as standard scheme, the image will not be loaded because - * non-standard schemes can not recognize relative URLs: - * - * Registering a scheme as standard will allow access to files through the - * FileSystem API. Otherwise the renderer will throw a security error for the - * scheme. - * - * By default web storage apis (localStorage, sessionStorage, webSQL, indexedDB, - * cookies) are disabled for non standard schemes. So in general if you want to - * register a custom protocol to replace the `http` protocol, you have to register - * it as a standard scheme. - * - * Protocols that use streams (http and stream protocols) should set `stream: - * true`. The `