@pkhex-everywhere/engine 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/_framework/{PKHeX.Core.AutoMod.x2uzxduw6t.wasm → PKHeX.Core.AutoMod.44lldivml7.wasm} +0 -0
  3. package/_framework/{PKHeX.Core.6as4mqwu45.wasm → PKHeX.Core.urdgp3znlm.wasm} +0 -0
  4. package/_framework/{PKHeX.Everywhere.Engine.Host.xv25q7a107.wasm → PKHeX.Everywhere.Engine.Host.q5e6fz2g5n.wasm} +0 -0
  5. package/_framework/{PKHeX.Everywhere.Engine.PlugIns.zgak1u0lbr.wasm → PKHeX.Everywhere.Engine.PlugIns.lf7a4tq2bw.wasm} +0 -0
  6. package/_framework/PKHeX.Everywhere.Engine.cc2idg69ya.wasm +0 -0
  7. package/_framework/{PKHeX.Everywhere.PlugIns.wywqtjlojy.wasm → PKHeX.Everywhere.PlugIns.hd06p9as7o.wasm} +0 -0
  8. package/_framework/{PKHeX.Everywhere.RomHacks.xwhkv6stl7.wasm → PKHeX.Everywhere.RomHacks.tdsq48t0or.wasm} +0 -0
  9. package/_framework/PKHeX.Facade.fi86cj1rew.wasm +0 -0
  10. package/_framework/{System.Collections.jidutvlmc0.wasm → System.Collections.9eyardblf5.wasm} +0 -0
  11. package/_framework/{System.Private.CoreLib.phe29nymlz.wasm → System.Private.CoreLib.xzy0ufsqkn.wasm} +0 -0
  12. package/_framework/dotnet.js +23 -23
  13. package/dist/binary.d.ts +1 -1
  14. package/dist/generated/client.d.ts +23 -3
  15. package/dist/generated/errors.d.ts +1 -1
  16. package/dist/generated/topics.d.ts +1 -1
  17. package/dist/generated/types.d.ts +102 -0
  18. package/dist/index.js +3 -1
  19. package/dist/internal.js +1 -1
  20. package/dist/{topics-BD2tUWCQ.js → topics-CcK62uu9.js} +27 -5
  21. package/package.json +1 -1
  22. package/_framework/PKHeX.Everywhere.Engine.z5zg1tyuzh.wasm +0 -0
  23. package/_framework/PKHeX.Facade.60xdpoycab.wasm +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @pkhex-everywhere/engine
2
2
 
3
+ ## 0.9.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 92d747a: Trades now follow the receiving game's rules. `trade.preview()` and `trade.commit()` apply trade evolutions, reset friendship to 70 on Generation 2 to 4 link trades, and revert Giratina, Shaymin and Rotom forms leaving Platinum. Platinum refuses with `bagFull` when its bag can't take back the Griseous Orb. New change reasons: `received`, `tradeEvolution`, `itemUsed` and `formReverted`. `TradeSaveChange` now has `save` and `label` instead of `species`, and new kinds `itemReturned` and `eventVar`.
8
+
9
+ ## 0.8.1
10
+
11
+ ### Patch Changes
12
+
13
+ - 45aa5c8: New `trade` calls move Pokémon between the loaded save and a partner save, the way link trades, the Time Capsule, Pal Park and Poké Transfer do. `trade.open()` loads the partner and reports the routes and empty box slots, `trade.preview()` shows what each Pokémon arrives as and refuses what the games refuse, and `trade.commit()` moves them and returns both saves. New `useTrade()` hook and `trade` topic.
14
+
3
15
  ## 0.8.0
4
16
 
5
17
  ### Minor Changes
@@ -4,7 +4,7 @@
4
4
  var e=!1;const t=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,6,64,25,11,11])),o=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,15,1,13,0,65,1,253,15,65,2,253,15,253,128,2,11])),n=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11])),r=Symbol.for("wasm promise_control");function i(e,t){let o=null;const n=new Promise((function(n,r){o={isDone:!1,promise:null,resolve:t=>{o.isDone||(o.isDone=!0,n(t),e&&e())},reject:e=>{o.isDone||(o.isDone=!0,r(e),t&&t())}}}));o.promise=n;const i=n;return i[r]=o,{promise:i,promise_control:o}}function s(e){return e[r]}function a(e){e&&function(e){return void 0!==e[r]}(e)||Be(!1,"Promise is not controllable")}const l="__mono_message__",c=["debug","log","trace","warn","info","error"],d="MONO_WASM: ";let u,f,m,g,p,h;function w(e){g=e}function b(e){if(Pe.diagnosticTracing){const t="function"==typeof e?e():e;console.debug(d+t)}}function y(e,...t){console.info(d+e,...t)}function v(e,...t){console.info(e,...t)}function E(e,...t){console.warn(d+e,...t)}function _(e,...t){if(t&&t.length>0&&t[0]&&"object"==typeof t[0]){if(t[0].silent)return;if(t[0].toString)return void console.error(d+e,t[0].toString())}console.error(d+e,...t)}function x(e,t,o){return function(...n){try{let r=n[0];if(void 0===r)r="undefined";else if(null===r)r="null";else if("function"==typeof r)r=r.toString();else if("string"!=typeof r)try{r=JSON.stringify(r)}catch(e){r=r.toString()}t(o?JSON.stringify({method:e,payload:r,arguments:n.slice(1)}):[e+r,...n.slice(1)])}catch(e){m.error(`proxyConsole failed: ${e}`)}}}function j(e,t,o){f=t,g=e,m={...t};const n=`${o}/console`.replace("https://","wss://").replace("http://","ws://");u=new WebSocket(n),u.addEventListener("error",A),u.addEventListener("close",S),function(){for(const e of c)f[e]=x(`console.${e}`,T,!0)}()}function R(e){let t=30;const o=()=>{u?0==u.bufferedAmount||0==t?(e&&v(e),function(){for(const e of c)f[e]=x(`console.${e}`,m.log,!1)}(),u.removeEventListener("error",A),u.removeEventListener("close",S),u.close(1e3,e),u=void 0):(t--,globalThis.setTimeout(o,100)):e&&m&&m.log(e)};o()}function T(e){u&&u.readyState===WebSocket.OPEN?u.send(e):m.log(e)}function A(e){m.error(`[${g}] proxy console websocket error: ${e}`,e)}function S(e){m.debug(`[${g}] proxy console websocket closed: ${e}`,e)}function D(){Pe.preferredIcuAsset=O(Pe.config);let e="invariant"==Pe.config.globalizationMode;if(!e)if(Pe.preferredIcuAsset)Pe.diagnosticTracing&&b("ICU data archive(s) available, disabling invariant mode");else{if("custom"===Pe.config.globalizationMode||"all"===Pe.config.globalizationMode||"sharded"===Pe.config.globalizationMode){const e="invariant globalization mode is inactive and no ICU data archives are available";throw _(`ERROR: ${e}`),new Error(e)}Pe.diagnosticTracing&&b("ICU data archive(s) not available, using invariant globalization mode"),e=!0,Pe.preferredIcuAsset=null}const t="DOTNET_SYSTEM_GLOBALIZATION_INVARIANT",o=Pe.config.environmentVariables;if(void 0===o[t]&&e&&(o[t]="1"),void 0===o.TZ)try{const e=Intl.DateTimeFormat().resolvedOptions().timeZone||null;e&&(o.TZ=e)}catch(e){y("failed to detect timezone, will fallback to UTC")}}function O(e){var t;if((null===(t=e.resources)||void 0===t?void 0:t.icu)&&"invariant"!=e.globalizationMode){const t=e.applicationCulture||(ke?globalThis.navigator&&globalThis.navigator.languages&&globalThis.navigator.languages[0]:Intl.DateTimeFormat().resolvedOptions().locale),o=e.resources.icu;let n=null;if("custom"===e.globalizationMode){if(o.length>=1)return o[0].name}else t&&"all"!==e.globalizationMode?"sharded"===e.globalizationMode&&(n=function(e){const t=e.split("-")[0];return"en"===t||["fr","fr-FR","it","it-IT","de","de-DE","es","es-ES"].includes(e)?"icudt_EFIGS.dat":["zh","ko","ja"].includes(t)?"icudt_CJK.dat":"icudt_no_CJK.dat"}(t)):n="icudt.dat";if(n)for(let e=0;e<o.length;e++){const t=o[e];if(t.virtualPath===n)return t.name}}return e.globalizationMode="invariant",null}(new Date).valueOf();const C=class{constructor(e){this.url=e}toString(){return this.url}};async function k(e,t){try{const o="function"==typeof globalThis.fetch;if(Se){const n=e.startsWith("file://");if(!n&&o)return globalThis.fetch(e,t||{credentials:"same-origin"});p||(h=Ne.require("url"),p=Ne.require("fs")),n&&(e=h.fileURLToPath(e));const r=await p.promises.readFile(e);return{ok:!0,headers:{length:0,get:()=>null},url:e,arrayBuffer:()=>r,json:()=>JSON.parse(r),text:()=>{throw new Error("NotImplementedException")}}}if(o)return globalThis.fetch(e,t||{credentials:"same-origin"});if("function"==typeof read)return{ok:!0,url:e,headers:{length:0,get:()=>null},arrayBuffer:()=>new Uint8Array(read(e,"binary")),json:()=>JSON.parse(read(e,"utf8")),text:()=>read(e,"utf8")}}catch(t){return{ok:!1,url:e,status:500,headers:{length:0,get:()=>null},statusText:"ERR28: "+t,arrayBuffer:()=>{throw t},json:()=>{throw t},text:()=>{throw t}}}throw new Error("No fetch implementation available")}function I(e){return"string"!=typeof e&&Be(!1,"url must be a string"),!M(e)&&0!==e.indexOf("./")&&0!==e.indexOf("../")&&globalThis.URL&&globalThis.document&&globalThis.document.baseURI&&(e=new URL(e,globalThis.document.baseURI).toString()),e}const U=/^[a-zA-Z][a-zA-Z\d+\-.]*?:\/\//,P=/[a-zA-Z]:[\\/]/;function M(e){return Se||Ie?e.startsWith("/")||e.startsWith("\\")||-1!==e.indexOf("///")||P.test(e):U.test(e)}let L,N=0;const $=[],z=[],W=new Map,F={"js-module-threads":!0,"js-module-runtime":!0,"js-module-dotnet":!0,"js-module-native":!0,"js-module-diagnostics":!0},B={...F,"js-module-library-initializer":!0},V={...F,dotnetwasm:!0,heap:!0,manifest:!0},q={...B,manifest:!0},H={...B,dotnetwasm:!0},J={dotnetwasm:!0,symbols:!0},Z={...B,dotnetwasm:!0,symbols:!0},Q={symbols:!0};function G(e){return!("icu"==e.behavior&&e.name!=Pe.preferredIcuAsset)}function K(e,t,o){null!=t||(t=[]),Be(1==t.length,`Expect to have one ${o} asset in resources`);const n=t[0];return n.behavior=o,X(n),e.push(n),n}function X(e){V[e.behavior]&&W.set(e.behavior,e)}function Y(e){Be(V[e],`Unknown single asset behavior ${e}`);const t=W.get(e);if(t&&!t.resolvedUrl)if(t.resolvedUrl=Pe.locateFile(t.name),F[t.behavior]){const e=ge(t);e?("string"!=typeof e&&Be(!1,"loadBootResource response for 'dotnetjs' type should be a URL string"),t.resolvedUrl=e):t.resolvedUrl=ce(t.resolvedUrl,t.behavior)}else if("dotnetwasm"!==t.behavior)throw new Error(`Unknown single asset behavior ${e}`);return t}function ee(e){const t=Y(e);return Be(t,`Single asset for ${e} not found`),t}let te=!1;async function oe(){if(!te){te=!0,Pe.diagnosticTracing&&b("mono_download_assets");try{const e=[],t=[],o=(e,t)=>{!Z[e.behavior]&&G(e)&&Pe.expected_instantiated_assets_count++,!H[e.behavior]&&G(e)&&(Pe.expected_downloaded_assets_count++,t.push(se(e)))};for(const t of $)o(t,e);for(const e of z)o(e,t);Pe.allDownloadsQueued.promise_control.resolve(),Promise.all([...e,...t]).then((()=>{Pe.allDownloadsFinished.promise_control.resolve()})).catch((e=>{throw Pe.err("Error in mono_download_assets: "+e),Xe(1,e),e})),await Pe.runtimeModuleLoaded.promise;const n=async e=>{const t=await e;if(t.buffer){if(!Z[t.behavior]){t.buffer&&"object"==typeof t.buffer||Be(!1,"asset buffer must be array-like or buffer-like or promise of these"),"string"!=typeof t.resolvedUrl&&Be(!1,"resolvedUrl must be string");const e=t.resolvedUrl,o=await t.buffer,n=new Uint8Array(o);pe(t),await Ue.beforeOnRuntimeInitialized.promise,Ue.instantiate_asset(t,e,n)}}else J[t.behavior]?("symbols"===t.behavior&&(await Ue.instantiate_symbols_asset(t),pe(t)),J[t.behavior]&&++Pe.actual_downloaded_assets_count):(t.isOptional||Be(!1,"Expected asset to have the downloaded buffer"),!H[t.behavior]&&G(t)&&Pe.expected_downloaded_assets_count--,!Z[t.behavior]&&G(t)&&Pe.expected_instantiated_assets_count--)},r=[],i=[];for(const t of e)r.push(n(t));for(const e of t)i.push(n(e));Promise.all(r).then((()=>{Ce||Ue.coreAssetsInMemory.promise_control.resolve()})).catch((e=>{throw Pe.err("Error in mono_download_assets: "+e),Xe(1,e),e})),Promise.all(i).then((async()=>{Ce||(await Ue.coreAssetsInMemory.promise,Ue.allAssetsInMemory.promise_control.resolve())})).catch((e=>{throw Pe.err("Error in mono_download_assets: "+e),Xe(1,e),e}))}catch(e){throw Pe.err("Error in mono_download_assets: "+e),e}}}let ne=!1;function re(){if(ne)return;ne=!0;const e=Pe.config,t=[];if(e.assets)for(const t of e.assets)"object"!=typeof t&&Be(!1,`asset must be object, it was ${typeof t} : ${t}`),"string"!=typeof t.behavior&&Be(!1,"asset behavior must be known string"),"string"!=typeof t.name&&Be(!1,"asset name must be string"),t.resolvedUrl&&"string"!=typeof t.resolvedUrl&&Be(!1,"asset resolvedUrl could be string"),t.hash&&"string"!=typeof t.hash&&Be(!1,"asset resolvedUrl could be string"),t.pendingDownload&&"object"!=typeof t.pendingDownload&&Be(!1,"asset pendingDownload could be object"),t.isCore?$.push(t):z.push(t),X(t);else if(e.resources){const o=e.resources;o.wasmNative||Be(!1,"resources.wasmNative must be defined"),o.jsModuleNative||Be(!1,"resources.jsModuleNative must be defined"),o.jsModuleRuntime||Be(!1,"resources.jsModuleRuntime must be defined"),K(z,o.wasmNative,"dotnetwasm"),K(t,o.jsModuleNative,"js-module-native"),K(t,o.jsModuleRuntime,"js-module-runtime"),o.jsModuleDiagnostics&&K(t,o.jsModuleDiagnostics,"js-module-diagnostics");const n=(e,t,o)=>{const n=e;n.behavior=t,o?(n.isCore=!0,$.push(n)):z.push(n)};if(o.coreAssembly)for(let e=0;e<o.coreAssembly.length;e++)n(o.coreAssembly[e],"assembly",!0);if(o.assembly)for(let e=0;e<o.assembly.length;e++)n(o.assembly[e],"assembly",!o.coreAssembly);if(0!=e.debugLevel&&Pe.isDebuggingSupported()){if(o.corePdb)for(let e=0;e<o.corePdb.length;e++)n(o.corePdb[e],"pdb",!0);if(o.pdb)for(let e=0;e<o.pdb.length;e++)n(o.pdb[e],"pdb",!o.corePdb)}if(e.loadAllSatelliteResources&&o.satelliteResources)for(const e in o.satelliteResources)for(let t=0;t<o.satelliteResources[e].length;t++){const r=o.satelliteResources[e][t];r.culture=e,n(r,"resource",!o.coreAssembly)}if(o.coreVfs)for(let e=0;e<o.coreVfs.length;e++)n(o.coreVfs[e],"vfs",!0);if(o.vfs)for(let e=0;e<o.vfs.length;e++)n(o.vfs[e],"vfs",!o.coreVfs);const r=O(e);if(r&&o.icu)for(let e=0;e<o.icu.length;e++){const t=o.icu[e];t.name===r&&n(t,"icu",!1)}if(o.wasmSymbols)for(let e=0;e<o.wasmSymbols.length;e++)n(o.wasmSymbols[e],"symbols",!1)}if(e.appsettings)for(let t=0;t<e.appsettings.length;t++){const o=e.appsettings[t],n=he(o);"appsettings.json"!==n&&n!==`appsettings.${e.applicationEnvironment}.json`||z.push({name:o,behavior:"vfs",cache:"no-cache",useCredentials:!0})}e.assets=[...$,...z,...t]}async function ie(e){const t=await se(e);return await t.pendingDownloadInternal.response,t.buffer}async function se(e){try{return await ae(e)}catch(t){if(!Pe.enableDownloadRetry)throw t;if(Ie||Se)throw t;if(e.pendingDownload&&e.pendingDownloadInternal==e.pendingDownload)throw t;if(e.resolvedUrl&&-1!=e.resolvedUrl.indexOf("file://"))throw t;if(t&&404==t.status)throw t;e.pendingDownloadInternal=void 0,await Pe.allDownloadsQueued.promise;try{return Pe.diagnosticTracing&&b(`Retrying download '${e.name}'`),await ae(e)}catch(t){return e.pendingDownloadInternal=void 0,await new Promise((e=>globalThis.setTimeout(e,100))),Pe.diagnosticTracing&&b(`Retrying download (2) '${e.name}' after delay`),await ae(e)}}}async function ae(e){for(;L;)await L.promise;try{++N,N==Pe.maxParallelDownloads&&(Pe.diagnosticTracing&&b("Throttling further parallel downloads"),L=i());const t=await async function(e){if(e.pendingDownload&&(e.pendingDownloadInternal=e.pendingDownload),e.pendingDownloadInternal&&e.pendingDownloadInternal.response)return e.pendingDownloadInternal.response;if(e.buffer){const t=await e.buffer;return e.resolvedUrl||(e.resolvedUrl="undefined://"+e.name),e.pendingDownloadInternal={url:e.resolvedUrl,name:e.name,response:Promise.resolve({ok:!0,arrayBuffer:()=>t,json:()=>JSON.parse(new TextDecoder("utf-8").decode(t)),text:()=>{throw new Error("NotImplementedException")},headers:{get:()=>{}}})},e.pendingDownloadInternal.response}const t=e.loadRemote&&Pe.config.remoteSources?Pe.config.remoteSources:[""];let o;for(let n of t){n=n.trim(),"./"===n&&(n="");const t=le(e,n);e.name===t?Pe.diagnosticTracing&&b(`Attempting to download '${t}'`):Pe.diagnosticTracing&&b(`Attempting to download '${t}' for ${e.name}`);try{e.resolvedUrl=t;const n=fe(e);if(e.pendingDownloadInternal=n,o=await n.response,!o||!o.ok)continue;return o}catch(e){o||(o={ok:!1,url:t,status:0,statusText:""+e});continue}}const n=e.isOptional||e.name.match(/\.pdb$/)&&Pe.config.ignorePdbLoadErrors;if(o||Be(!1,`Response undefined ${e.name}`),!n){const t=new Error(`download '${o.url}' for ${e.name} failed ${o.status} ${o.statusText}`);throw t.status=o.status,t}y(`optional download '${o.url}' for ${e.name} failed ${o.status} ${o.statusText}`)}(e);return t?(J[e.behavior]||(e.buffer=await t.arrayBuffer(),++Pe.actual_downloaded_assets_count),e):e}finally{if(--N,L&&N==Pe.maxParallelDownloads-1){Pe.diagnosticTracing&&b("Resuming more parallel downloads");const e=L;L=void 0,e.promise_control.resolve()}}}function le(e,t){let o;return null==t&&Be(!1,`sourcePrefix must be provided for ${e.name}`),e.resolvedUrl?o=e.resolvedUrl:(o=""===t?"assembly"===e.behavior||"pdb"===e.behavior?e.name:"resource"===e.behavior&&e.culture&&""!==e.culture?`${e.culture}/${e.name}`:e.name:t+e.name,o=ce(Pe.locateFile(o),e.behavior)),o&&"string"==typeof o||Be(!1,"attemptUrl need to be path or url string"),o}function ce(e,t){return Pe.modulesUniqueQuery&&q[t]&&(e+=Pe.modulesUniqueQuery),e}let de=0;const ue=new Set;function fe(e){try{e.resolvedUrl||Be(!1,"Request's resolvedUrl must be set");const t=function(e){let t=e.resolvedUrl;if(Pe.loadBootResource){const o=ge(e);if(o instanceof Promise)return o;"string"==typeof o&&(t=o)}const o={};return e.cache?o.cache=e.cache:Pe.config.disableNoCacheFetch||(o.cache="no-cache"),e.useCredentials?o.credentials="include":!Pe.config.disableIntegrityCheck&&e.hash&&(o.integrity=e.hash),Pe.fetch_like(t,o)}(e),o={name:e.name,url:e.resolvedUrl,response:t};return ue.add(e.name),o.response.then((()=>{"assembly"==e.behavior&&Pe.loadedAssemblies.push(e.name),de++,Pe.onDownloadResourceProgress&&Pe.onDownloadResourceProgress(de,ue.size)})),o}catch(t){const o={ok:!1,url:e.resolvedUrl,status:500,statusText:"ERR29: "+t,arrayBuffer:()=>{throw t},json:()=>{throw t}};return{name:e.name,url:e.resolvedUrl,response:Promise.resolve(o)}}}const me={resource:"assembly",assembly:"assembly",pdb:"pdb",icu:"globalization",vfs:"configuration",manifest:"manifest",dotnetwasm:"dotnetwasm","js-module-dotnet":"dotnetjs","js-module-native":"dotnetjs","js-module-runtime":"dotnetjs","js-module-threads":"dotnetjs"};function ge(e){var t;if(Pe.loadBootResource){const o=null!==(t=e.hash)&&void 0!==t?t:"",n=e.resolvedUrl,r=me[e.behavior];if(r){const t=Pe.loadBootResource(r,e.name,n,o,e.behavior);return"string"==typeof t?I(t):t}}}function pe(e){e.pendingDownloadInternal=null,e.pendingDownload=null,e.buffer=null,e.moduleExports=null}function he(e){let t=e.lastIndexOf("/");return t>=0&&t++,e.substring(t)}async function we(e){e&&await Promise.all((null!=e?e:[]).map((e=>async function(e){try{const t=e.name;if(!e.moduleExports){const o=ce(Pe.locateFile(t),"js-module-library-initializer");Pe.diagnosticTracing&&b(`Attempting to import '${o}' for ${e}`),e.moduleExports=await import(/*! webpackIgnore: true */o)}Pe.libraryInitializers.push({scriptName:t,exports:e.moduleExports})}catch(t){E(`Failed to import library initializer '${e}': ${t}`)}}(e))))}async function be(e,t){if(!Pe.libraryInitializers)return;const o=[];for(let n=0;n<Pe.libraryInitializers.length;n++){const r=Pe.libraryInitializers[n];r.exports[e]&&o.push(ye(r.scriptName,e,(()=>r.exports[e](...t))))}await Promise.all(o)}async function ye(e,t,o){try{await o()}catch(o){throw E(`Failed to invoke '${t}' on library initializer '${e}': ${o}`),Xe(1,o),o}}function ve(e,t){if(e===t)return e;const o={...t};return void 0!==o.assets&&o.assets!==e.assets&&(o.assets=[...e.assets||[],...o.assets||[]]),void 0!==o.resources&&(o.resources=_e(e.resources||{assembly:[],jsModuleNative:[],jsModuleRuntime:[],wasmNative:[]},o.resources)),void 0!==o.environmentVariables&&(o.environmentVariables={...e.environmentVariables||{},...o.environmentVariables||{}}),void 0!==o.runtimeOptions&&o.runtimeOptions!==e.runtimeOptions&&(o.runtimeOptions=[...e.runtimeOptions||[],...o.runtimeOptions||[]]),Object.assign(e,o)}function Ee(e,t){if(e===t)return e;const o={...t};return o.config&&(e.config||(e.config={}),o.config=ve(e.config,o.config)),Object.assign(e,o)}function _e(e,t){if(e===t)return e;const o={...t};return void 0!==o.coreAssembly&&(o.coreAssembly=[...e.coreAssembly||[],...o.coreAssembly||[]]),void 0!==o.assembly&&(o.assembly=[...e.assembly||[],...o.assembly||[]]),void 0!==o.lazyAssembly&&(o.lazyAssembly=[...e.lazyAssembly||[],...o.lazyAssembly||[]]),void 0!==o.corePdb&&(o.corePdb=[...e.corePdb||[],...o.corePdb||[]]),void 0!==o.pdb&&(o.pdb=[...e.pdb||[],...o.pdb||[]]),void 0!==o.jsModuleWorker&&(o.jsModuleWorker=[...e.jsModuleWorker||[],...o.jsModuleWorker||[]]),void 0!==o.jsModuleNative&&(o.jsModuleNative=[...e.jsModuleNative||[],...o.jsModuleNative||[]]),void 0!==o.jsModuleDiagnostics&&(o.jsModuleDiagnostics=[...e.jsModuleDiagnostics||[],...o.jsModuleDiagnostics||[]]),void 0!==o.jsModuleRuntime&&(o.jsModuleRuntime=[...e.jsModuleRuntime||[],...o.jsModuleRuntime||[]]),void 0!==o.wasmSymbols&&(o.wasmSymbols=[...e.wasmSymbols||[],...o.wasmSymbols||[]]),void 0!==o.wasmNative&&(o.wasmNative=[...e.wasmNative||[],...o.wasmNative||[]]),void 0!==o.icu&&(o.icu=[...e.icu||[],...o.icu||[]]),void 0!==o.satelliteResources&&(o.satelliteResources=function(e,t){if(e===t)return e;for(const o in t)e[o]=[...e[o]||[],...t[o]||[]];return e}(e.satelliteResources||{},o.satelliteResources||{})),void 0!==o.modulesAfterConfigLoaded&&(o.modulesAfterConfigLoaded=[...e.modulesAfterConfigLoaded||[],...o.modulesAfterConfigLoaded||[]]),void 0!==o.modulesAfterRuntimeReady&&(o.modulesAfterRuntimeReady=[...e.modulesAfterRuntimeReady||[],...o.modulesAfterRuntimeReady||[]]),void 0!==o.extensions&&(o.extensions={...e.extensions||{},...o.extensions||{}}),void 0!==o.vfs&&(o.vfs=[...e.vfs||[],...o.vfs||[]]),Object.assign(e,o)}function xe(){const e=Pe.config;if(e.environmentVariables=e.environmentVariables||{},e.runtimeOptions=e.runtimeOptions||[],e.resources=e.resources||{assembly:[],jsModuleNative:[],jsModuleWorker:[],jsModuleRuntime:[],wasmNative:[],vfs:[],satelliteResources:{}},e.assets){Pe.diagnosticTracing&&b("config.assets is deprecated, use config.resources instead");for(const t of e.assets){const o={};switch(t.behavior){case"assembly":o.assembly=[t];break;case"pdb":o.pdb=[t];break;case"resource":o.satelliteResources={},o.satelliteResources[t.culture]=[t];break;case"icu":o.icu=[t];break;case"symbols":o.wasmSymbols=[t];break;case"vfs":o.vfs=[t];break;case"dotnetwasm":o.wasmNative=[t];break;case"js-module-threads":o.jsModuleWorker=[t];break;case"js-module-runtime":o.jsModuleRuntime=[t];break;case"js-module-native":o.jsModuleNative=[t];break;case"js-module-diagnostics":o.jsModuleDiagnostics=[t];break;case"js-module-dotnet":break;default:throw new Error(`Unexpected behavior ${t.behavior} of asset ${t.name}`)}_e(e.resources,o)}}e.debugLevel,e.applicationEnvironment||(e.applicationEnvironment="Production"),e.applicationCulture&&(e.environmentVariables.LANG=`${e.applicationCulture}.UTF-8`),Ue.diagnosticTracing=Pe.diagnosticTracing=!!e.diagnosticTracing,Ue.waitForDebugger=e.waitForDebugger,Pe.maxParallelDownloads=e.maxParallelDownloads||Pe.maxParallelDownloads,Pe.enableDownloadRetry=void 0!==e.enableDownloadRetry?e.enableDownloadRetry:Pe.enableDownloadRetry}let je=!1;async function Re(e){var t;if(je)return void await Pe.afterConfigLoaded.promise;let o;try{if(e.configSrc||Pe.config&&0!==Object.keys(Pe.config).length&&(Pe.config.assets||Pe.config.resources)||(e.configSrc="dotnet.boot.js"),o=e.configSrc,je=!0,o&&(Pe.diagnosticTracing&&b("mono_wasm_load_config"),await async function(e){const t=e.configSrc,o=Pe.locateFile(t);let n=null;void 0!==Pe.loadBootResource&&(n=Pe.loadBootResource("manifest",t,o,"","manifest"));let r,i=null;if(n)if("string"==typeof n)n.includes(".json")?(i=await s(I(n)),r=await Ae(i)):r=(await import(I(n))).config;else{const e=await n;"function"==typeof e.json?(i=e,r=await Ae(i)):r=e.config}else o.includes(".json")?(i=await s(ce(o,"manifest")),r=await Ae(i)):r=(await import(ce(o,"manifest"))).config;function s(e){return Pe.fetch_like(e,{method:"GET",credentials:"include",cache:"no-cache"})}Pe.config.applicationEnvironment&&(r.applicationEnvironment=Pe.config.applicationEnvironment),ve(Pe.config,r)}(e)),xe(),await we(null===(t=Pe.config.resources)||void 0===t?void 0:t.modulesAfterConfigLoaded),await be("onRuntimeConfigLoaded",[Pe.config]),e.onConfigLoaded)try{await e.onConfigLoaded(Pe.config,Le),xe()}catch(e){throw _("onConfigLoaded() failed",e),e}xe(),Pe.afterConfigLoaded.promise_control.resolve(Pe.config)}catch(t){const n=`Failed to load config file ${o} ${t} ${null==t?void 0:t.stack}`;throw Pe.config=e.config=Object.assign(Pe.config,{message:n,error:t,isError:!0}),Xe(1,new Error(n)),t}}function Te(){return!!globalThis.navigator&&(Pe.isChromium||Pe.isFirefox)}async function Ae(e){const t=Pe.config,o=await e.json();t.applicationEnvironment||o.applicationEnvironment||(o.applicationEnvironment=e.headers.get("Blazor-Environment")||e.headers.get("DotNet-Environment")||void 0),o.environmentVariables||(o.environmentVariables={});const n=e.headers.get("DOTNET-MODIFIABLE-ASSEMBLIES");n&&(o.environmentVariables.DOTNET_MODIFIABLE_ASSEMBLIES=n);const r=e.headers.get("ASPNETCORE-BROWSER-TOOLS");return r&&(o.environmentVariables.__ASPNETCORE_BROWSER_TOOLS=r),o}"function"!=typeof importScripts||globalThis.onmessage||(globalThis.dotnetSidecar=!0);const Se="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,De="function"==typeof importScripts,Oe=De&&"undefined"!=typeof dotnetSidecar,Ce=De&&!Oe,ke="object"==typeof window||De&&!Se,Ie=!ke&&!Se;let Ue={},Pe={},Me={},Le={},Ne={},$e=!1;const ze={},We={config:ze},Fe={mono:{},binding:{},internal:Ne,module:We,loaderHelpers:Pe,runtimeHelpers:Ue,diagnosticHelpers:Me,api:Le};function Be(e,t){if(e)return;const o="Assert failed: "+("function"==typeof t?t():t),n=new Error(o);_(o,n),Ue.nativeAbort(n)}function Ve(){return void 0!==Pe.exitCode}function qe(){return Ue.runtimeReady&&!Ve()}function He(){Ve()&&Be(!1,`.NET runtime already exited with ${Pe.exitCode} ${Pe.exitReason}. You can use runtime.runMain() which doesn't exit the runtime.`),Ue.runtimeReady||Be(!1,".NET runtime didn't start yet. Please call dotnet.create() first.")}function Je(){ke&&(globalThis.addEventListener("unhandledrejection",et),globalThis.addEventListener("error",tt))}let Ze,Qe;function Ge(e){Qe&&Qe(e),Xe(e,Pe.exitReason)}function Ke(e){Ze&&Ze(e||Pe.exitReason),Xe(1,e||Pe.exitReason)}function Xe(t,o){var n,r;const i=o&&"object"==typeof o;t=i&&"number"==typeof o.status?o.status:void 0===t?-1:t;const s=i&&"string"==typeof o.message?o.message:""+o;(o=i?o:Ue.ExitStatus?function(e,t){const o=new Ue.ExitStatus(e);return o.message=t,o.toString=()=>t,o}(t,s):new Error("Exit with code "+t+" "+s)).status=t,o.message||(o.message=s);const a=""+(o.stack||(new Error).stack);try{Object.defineProperty(o,"stack",{get:()=>a})}catch(e){}const l=!!o.silent;if(o.silent=!0,Ve())Pe.diagnosticTracing&&b("mono_exit called after exit");else{try{We.onAbort==Ke&&(We.onAbort=Ze),We.onExit==Ge&&(We.onExit=Qe),ke&&(globalThis.removeEventListener("unhandledrejection",et),globalThis.removeEventListener("error",tt)),Ue.runtimeReady?(Ue.jiterpreter_dump_stats&&Ue.jiterpreter_dump_stats(!1),0===t&&(null===(n=Pe.config)||void 0===n?void 0:n.interopCleanupOnExit)&&Ue.forceDisposeProxies(!0,!0),e&&0!==t&&(null===(r=Pe.config)||void 0===r||r.dumpThreadsOnNonZeroExit)):(Pe.diagnosticTracing&&b(`abort_startup, reason: ${o}`),function(e){Pe.allDownloadsQueued.promise_control.reject(e),Pe.allDownloadsFinished.promise_control.reject(e),Pe.afterConfigLoaded.promise_control.reject(e),Pe.wasmCompilePromise.promise_control.reject(e),Pe.runtimeModuleLoaded.promise_control.reject(e),Ue.dotnetReady&&(Ue.dotnetReady.promise_control.reject(e),Ue.afterInstantiateWasm.promise_control.reject(e),Ue.beforePreInit.promise_control.reject(e),Ue.afterPreInit.promise_control.reject(e),Ue.afterPreRun.promise_control.reject(e),Ue.beforeOnRuntimeInitialized.promise_control.reject(e),Ue.afterOnRuntimeInitialized.promise_control.reject(e),Ue.afterPostRun.promise_control.reject(e))}(o))}catch(e){E("mono_exit A failed",e)}try{l||(function(e,t){if(0!==e&&t){const e=Ue.ExitStatus&&t instanceof Ue.ExitStatus?b:_;"string"==typeof t?e(t):(void 0===t.stack&&(t.stack=(new Error).stack+""),t.message?e(Ue.stringify_as_error_with_stack?Ue.stringify_as_error_with_stack(t.message+"\n"+t.stack):t.message+"\n"+t.stack):e(JSON.stringify(t)))}!Ce&&Pe.config&&(Pe.config.logExitCode?Pe.config.forwardConsoleLogsToWS?R("WASM EXIT "+e):v("WASM EXIT "+e):Pe.config.forwardConsoleLogsToWS&&R())}(t,o),function(e){if(ke&&!Ce&&Pe.config&&Pe.config.appendElementOnExit&&document){const t=document.createElement("label");t.id="tests_done",0!==e&&(t.style.background="red"),t.innerHTML=""+e,document.body.appendChild(t)}}(t))}catch(e){E("mono_exit B failed",e)}Pe.exitCode=t,Pe.exitReason||(Pe.exitReason=o),!Ce&&Ue.runtimeReady&&We.runtimeKeepalivePop()}if(Pe.config&&Pe.config.asyncFlushOnExit&&0===t)throw(async()=>{try{await async function(){try{const e=await import(/*! webpackIgnore: true */"process"),t=e=>new Promise(((t,o)=>{e.on("error",o),e.end("","utf8",t)})),o=t(e.stderr),n=t(e.stdout);let r;const i=new Promise((e=>{r=setTimeout((()=>e("timeout")),1e3)}));await Promise.race([Promise.all([n,o]),i]),clearTimeout(r)}catch(e){_(`flushing std* streams failed: ${e}`)}}()}finally{Ye(t,o)}})(),o;Ye(t,o)}function Ye(e,t){if(Ue.runtimeReady&&Ue.nativeExit)try{Ue.nativeExit(e)}catch(e){!Ue.ExitStatus||e instanceof Ue.ExitStatus||E("set_exit_code_and_quit_now failed: "+e.toString())}if(0!==e||!ke)throw Se&&Ne.process?Ne.process.exit(e):Ue.quit&&Ue.quit(e,t),t}function et(e){ot(e,e.reason,"rejection")}function tt(e){ot(e,e.error,"error")}function ot(e,t,o){e.preventDefault();try{t||(t=new Error("Unhandled "+o)),void 0===t.stack&&(t.stack=(new Error).stack),t.stack=t.stack+"",t.silent||(_("Unhandled error:",t),Xe(1,t))}catch(e){}}!function(e){if($e)throw new Error("Loader module already loaded");$e=!0,Ue=e.runtimeHelpers,Pe=e.loaderHelpers,Me=e.diagnosticHelpers,Le=e.api,Ne=e.internal,Object.assign(Le,{INTERNAL:Ne,invokeLibraryInitializers:be}),Object.assign(e.module,{config:ve(ze,{environmentVariables:{}})});const r={mono_wasm_bindings_is_ready:!1,config:e.module.config,diagnosticTracing:!1,nativeAbort:e=>{throw e||new Error("abort")},nativeExit:e=>{throw new Error("exit:"+e)}},l={gitHash:"95017c711e6afc1085133d440e42b4bd78155701",config:e.module.config,diagnosticTracing:!1,maxParallelDownloads:16,enableDownloadRetry:!0,_loaded_files:[],loadedFiles:[],loadedAssemblies:[],libraryInitializers:[],workerNextNumber:1,actual_downloaded_assets_count:0,actual_instantiated_assets_count:0,expected_downloaded_assets_count:0,expected_instantiated_assets_count:0,afterConfigLoaded:i(),allDownloadsQueued:i(),allDownloadsFinished:i(),wasmCompilePromise:i(),runtimeModuleLoaded:i(),loadingWorkers:i(),is_exited:Ve,is_runtime_running:qe,assert_runtime_running:He,mono_exit:Xe,createPromiseController:i,getPromiseController:s,assertIsControllablePromise:a,mono_download_assets:oe,resolve_single_asset_path:ee,setup_proxy_console:j,set_thread_prefix:w,installUnhandledErrorHandler:Je,retrieve_asset_download:ie,invokeLibraryInitializers:be,isDebuggingSupported:Te,exceptions:t,simd:n,relaxedSimd:o};Object.assign(Ue,r),Object.assign(Pe,l)}(Fe);let nt,rt,it,st=!1,at=!1;async function lt(e){if(!at){if(at=!0,ke&&Pe.config.forwardConsoleLogsToWS&&void 0!==globalThis.WebSocket&&j("main",globalThis.console,globalThis.location.origin),We||Be(!1,"Null moduleConfig"),Pe.config||Be(!1,"Null moduleConfig.config"),"function"==typeof e){const t=e(Fe.api);if(t.ready)throw new Error("Module.ready couldn't be redefined.");Object.assign(We,t),Ee(We,t)}else{if("object"!=typeof e)throw new Error("Can't use moduleFactory callback of createDotnetRuntime function.");Ee(We,e)}await async function(e){if(Se){const e=await import(/*! webpackIgnore: true */"process"),t=14;if(e.versions.node.split(".")[0]<t)throw new Error(`NodeJS at '${e.execPath}' has too low version '${e.versions.node}', please use at least ${t}. See also https://aka.ms/dotnet-wasm-features`)}const t=/*! webpackIgnore: true */import.meta.url,o=t.indexOf("?");var n;if(o>0&&(Pe.modulesUniqueQuery=t.substring(o)),Pe.scriptUrl=t.replace(/\\/g,"/").replace(/[?#].*/,""),Pe.scriptDirectory=(n=Pe.scriptUrl).slice(0,n.lastIndexOf("/"))+"/",Pe.locateFile=e=>"URL"in globalThis&&globalThis.URL!==C?new URL(e,Pe.scriptDirectory).toString():M(e)?e:Pe.scriptDirectory+e,Pe.fetch_like=k,Pe.out=console.log,Pe.err=console.error,Pe.onDownloadResourceProgress=e.onDownloadResourceProgress,ke&&globalThis.navigator){const e=globalThis.navigator,t=e.userAgentData&&e.userAgentData.brands;t&&t.length>0?Pe.isChromium=t.some((e=>"Google Chrome"===e.brand||"Microsoft Edge"===e.brand||"Chromium"===e.brand)):e.userAgent&&(Pe.isChromium=e.userAgent.includes("Chrome"),Pe.isFirefox=e.userAgent.includes("Firefox"))}Ne.require=Se?await import(/*! webpackIgnore: true */"module").then((e=>e.createRequire(/*! webpackIgnore: true */import.meta.url))):Promise.resolve((()=>{throw new Error("require not supported")})),void 0===globalThis.URL&&(globalThis.URL=C)}(We)}}async function ct(e){return await lt(e),Ze=We.onAbort,Qe=We.onExit,We.onAbort=Ke,We.onExit=Ge,We.ENVIRONMENT_IS_PTHREAD?async function(){(function(){const e=new MessageChannel,t=e.port1,o=e.port2;t.addEventListener("message",(e=>{var n,r;n=JSON.parse(e.data.config),r=JSON.parse(e.data.monoThreadInfo),st?Pe.diagnosticTracing&&b("mono config already received"):(ve(Pe.config,n),Ue.monoThreadInfo=r,xe(),Pe.diagnosticTracing&&b("mono config received"),st=!0,Pe.afterConfigLoaded.promise_control.resolve(Pe.config),ke&&n.forwardConsoleLogsToWS&&void 0!==globalThis.WebSocket&&Pe.setup_proxy_console("worker-idle",console,globalThis.location.origin)),t.close(),o.close()}),{once:!0}),t.start(),self.postMessage({[l]:{monoCmd:"preload",port:o}},[o])})(),await Pe.afterConfigLoaded.promise,function(){const e=Pe.config;e.assets||Be(!1,"config.assets must be defined");for(const t of e.assets)X(t),Q[t.behavior]&&z.push(t)}(),setTimeout((async()=>{try{await oe()}catch(e){Xe(1,e)}}),0);const e=dt(),t=await Promise.all(e);return await ut(t),We}():async function(){var e;await Re(We),re();const t=dt();(async function(){try{const e=ee("dotnetwasm");await se(e),e&&e.pendingDownloadInternal&&e.pendingDownloadInternal.response||Be(!1,"Can't load dotnet.native.wasm");const t=await e.pendingDownloadInternal.response,o=t.headers&&t.headers.get?t.headers.get("Content-Type"):void 0;let n;if("function"==typeof WebAssembly.compileStreaming&&"application/wasm"===o)n=await WebAssembly.compileStreaming(t);else{ke&&"application/wasm"!==o&&E('WebAssembly resource does not have the expected content type "application/wasm", so falling back to slower ArrayBuffer instantiation.');const e=await t.arrayBuffer();Pe.diagnosticTracing&&b("instantiate_wasm_module buffered"),n=Ie?await Promise.resolve(new WebAssembly.Module(e)):await WebAssembly.compile(e)}e.pendingDownloadInternal=null,e.pendingDownload=null,e.buffer=null,e.moduleExports=null,Pe.wasmCompilePromise.promise_control.resolve(n)}catch(e){Pe.wasmCompilePromise.promise_control.reject(e)}})(),setTimeout((async()=>{try{D(),await oe()}catch(e){Xe(1,e)}}),0);const o=await Promise.all(t);return await ut(o),await Ue.dotnetReady.promise,await we(null===(e=Pe.config.resources)||void 0===e?void 0:e.modulesAfterRuntimeReady),await be("onRuntimeReady",[Fe.api]),Le}()}function dt(){const e=ee("js-module-runtime"),t=ee("js-module-native");if(nt&&rt)return[nt,rt,it];"object"==typeof e.moduleExports?nt=e.moduleExports:(Pe.diagnosticTracing&&b(`Attempting to import '${e.resolvedUrl}' for ${e.name}`),nt=import(/*! webpackIgnore: true */e.resolvedUrl)),"object"==typeof t.moduleExports?rt=t.moduleExports:(Pe.diagnosticTracing&&b(`Attempting to import '${t.resolvedUrl}' for ${t.name}`),rt=import(/*! webpackIgnore: true */t.resolvedUrl));const o=Y("js-module-diagnostics");return o&&("object"==typeof o.moduleExports?it=o.moduleExports:(Pe.diagnosticTracing&&b(`Attempting to import '${o.resolvedUrl}' for ${o.name}`),it=import(/*! webpackIgnore: true */o.resolvedUrl))),[nt,rt,it]}async function ut(e){const{initializeExports:t,initializeReplacements:o,configureRuntimeStartup:n,configureEmscriptenStartup:r,configureWorkerStartup:i,setRuntimeGlobals:s,passEmscriptenInternals:a}=e[0],{default:l}=e[1],c=e[2];s(Fe),t(Fe),c&&c.setRuntimeGlobals(Fe),await n(We),Pe.runtimeModuleLoaded.promise_control.resolve(),l((e=>(Object.assign(We,{ready:e.ready,__dotnet_runtime:{initializeReplacements:o,configureEmscriptenStartup:r,configureWorkerStartup:i,passEmscriptenInternals:a}}),We))).catch((e=>{if(e.message&&e.message.toLowerCase().includes("out of memory"))throw new Error(".NET runtime has failed to start, because too much memory was requested. Please decrease the memory by adjusting EmccMaximumHeapSize. See also https://aka.ms/dotnet-wasm-features");throw e}))}const ft=new class{withModuleConfig(e){try{return Ee(We,e),this}catch(e){throw Xe(1,e),e}}withOnConfigLoaded(e){try{return Ee(We,{onConfigLoaded:e}),this}catch(e){throw Xe(1,e),e}}withConsoleForwarding(){try{return ve(ze,{forwardConsoleLogsToWS:!0}),this}catch(e){throw Xe(1,e),e}}withExitOnUnhandledError(){try{return ve(ze,{exitOnUnhandledError:!0}),Je(),this}catch(e){throw Xe(1,e),e}}withAsyncFlushOnExit(){try{return ve(ze,{asyncFlushOnExit:!0}),this}catch(e){throw Xe(1,e),e}}withExitCodeLogging(){try{return ve(ze,{logExitCode:!0}),this}catch(e){throw Xe(1,e),e}}withElementOnExit(){try{return ve(ze,{appendElementOnExit:!0}),this}catch(e){throw Xe(1,e),e}}withInteropCleanupOnExit(){try{return ve(ze,{interopCleanupOnExit:!0}),this}catch(e){throw Xe(1,e),e}}withDumpThreadsOnNonZeroExit(){try{return ve(ze,{dumpThreadsOnNonZeroExit:!0}),this}catch(e){throw Xe(1,e),e}}withWaitingForDebugger(e){try{return ve(ze,{waitForDebugger:e}),this}catch(e){throw Xe(1,e),e}}withInterpreterPgo(e,t){try{return ve(ze,{interpreterPgo:e,interpreterPgoSaveDelay:t}),ze.runtimeOptions?ze.runtimeOptions.push("--interp-pgo-recording"):ze.runtimeOptions=["--interp-pgo-recording"],this}catch(e){throw Xe(1,e),e}}withConfig(e){try{return ve(ze,e),this}catch(e){throw Xe(1,e),e}}withConfigSrc(e){try{return e&&"string"==typeof e||Be(!1,"must be file path or URL"),Ee(We,{configSrc:e}),this}catch(e){throw Xe(1,e),e}}withVirtualWorkingDirectory(e){try{return e&&"string"==typeof e||Be(!1,"must be directory path"),ve(ze,{virtualWorkingDirectory:e}),this}catch(e){throw Xe(1,e),e}}withEnvironmentVariable(e,t){try{const o={};return o[e]=t,ve(ze,{environmentVariables:o}),this}catch(e){throw Xe(1,e),e}}withEnvironmentVariables(e){try{return e&&"object"==typeof e||Be(!1,"must be dictionary object"),ve(ze,{environmentVariables:e}),this}catch(e){throw Xe(1,e),e}}withDiagnosticTracing(e){try{return"boolean"!=typeof e&&Be(!1,"must be boolean"),ve(ze,{diagnosticTracing:e}),this}catch(e){throw Xe(1,e),e}}withDebugging(e){try{return null!=e&&"number"==typeof e||Be(!1,"must be number"),ve(ze,{debugLevel:e}),this}catch(e){throw Xe(1,e),e}}withApplicationArguments(...e){try{return e&&Array.isArray(e)||Be(!1,"must be array of strings"),ve(ze,{applicationArguments:e}),this}catch(e){throw Xe(1,e),e}}withRuntimeOptions(e){try{return e&&Array.isArray(e)||Be(!1,"must be array of strings"),ze.runtimeOptions?ze.runtimeOptions.push(...e):ze.runtimeOptions=e,this}catch(e){throw Xe(1,e),e}}withMainAssembly(e){try{return ve(ze,{mainAssemblyName:e}),this}catch(e){throw Xe(1,e),e}}withApplicationArgumentsFromQuery(){try{if(!globalThis.window)throw new Error("Missing window to the query parameters from");if(void 0===globalThis.URLSearchParams)throw new Error("URLSearchParams is supported");const e=new URLSearchParams(globalThis.window.location.search).getAll("arg");return this.withApplicationArguments(...e)}catch(e){throw Xe(1,e),e}}withApplicationEnvironment(e){try{return ve(ze,{applicationEnvironment:e}),this}catch(e){throw Xe(1,e),e}}withApplicationCulture(e){try{return ve(ze,{applicationCulture:e}),this}catch(e){throw Xe(1,e),e}}withResourceLoader(e){try{return Pe.loadBootResource=e,this}catch(e){throw Xe(1,e),e}}async download(){try{await async function(){lt(We),await Re(We),re(),D(),oe(),await Pe.allDownloadsFinished.promise}()}catch(e){throw Xe(1,e),e}}async create(){try{return this.instance||(this.instance=await async function(){return await ct(We),Fe.api}()),this.instance}catch(e){throw Xe(1,e),e}}async run(){try{return We.config||Be(!1,"Null moduleConfig.config"),this.instance||await this.create(),this.instance.runMainAndExit()}catch(e){throw Xe(1,e),e}}},mt=Xe,gt=ct;Ie||"function"==typeof globalThis.URL||Be(!1,"This browser/engine doesn't support URL API. Please use a modern version. See also https://aka.ms/dotnet-wasm-features"),"function"!=typeof globalThis.BigInt64Array&&Be(!1,"This browser/engine doesn't support BigInt64Array API. Please use a modern version. See also https://aka.ms/dotnet-wasm-features"),ft.withConfig(/*json-start*/{
5
5
  "mainAssemblyName": "PKHeX.Everywhere.Engine.Host",
6
6
  "resources": {
7
- "hash": "sha256-HMlEuzrbUtEpqtCmAGBqLG2FsMO7vm/gr7LBBpHVgFo=",
7
+ "hash": "sha256-bKbjuxg62lAVFD4yKWRMNrZ+5xCA9ffm6s2XAdQCy0s=",
8
8
  "jsModuleNative": [
9
9
  {
10
10
  "name": "dotnet.native.b6l13xorvf.js"
@@ -45,8 +45,8 @@ var e=!1;const t=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,
45
45
  "coreAssembly": [
46
46
  {
47
47
  "virtualPath": "System.Private.CoreLib.wasm",
48
- "name": "System.Private.CoreLib.phe29nymlz.wasm",
49
- "hash": "sha256-3bp33SNxHRJkV4wQ0JqFwNtw4zLeLb5fR8HfFOSq4lg=",
48
+ "name": "System.Private.CoreLib.xzy0ufsqkn.wasm",
49
+ "hash": "sha256-05SGrtBvLiKEj6wqlEsl/EkeCHBRxNNTJTncYqV7P7E=",
50
50
  "cache": "force-cache"
51
51
  },
52
52
  {
@@ -70,51 +70,51 @@ var e=!1;const t=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,
70
70
  "cache": "force-cache"
71
71
  },
72
72
  {
73
- "virtualPath": "PKHeX.Core.wasm",
74
- "name": "PKHeX.Core.6as4mqwu45.wasm",
75
- "hash": "sha256-0pmO7np8gS7QBkKTTp1PsrNqo+0yLm04Oejo1MDekmc=",
73
+ "virtualPath": "PKHeX.Core.AutoMod.wasm",
74
+ "name": "PKHeX.Core.AutoMod.44lldivml7.wasm",
75
+ "hash": "sha256-JINZsqrUXDpkDvFWz+1gys+NFodHhRfTUqz2jjrq2iE=",
76
76
  "cache": "force-cache"
77
77
  },
78
78
  {
79
- "virtualPath": "PKHeX.Core.AutoMod.wasm",
80
- "name": "PKHeX.Core.AutoMod.x2uzxduw6t.wasm",
81
- "hash": "sha256-CXj3eOlHyApqxWqxkBGOkRTKZ8/ZwHfm/OUxK3qeEAw=",
79
+ "virtualPath": "PKHeX.Core.wasm",
80
+ "name": "PKHeX.Core.urdgp3znlm.wasm",
81
+ "hash": "sha256-uj7gODdkv6QeITWfUmw2nT99IB6obcX2OvxufeNJi1I=",
82
82
  "cache": "force-cache"
83
83
  },
84
84
  {
85
85
  "virtualPath": "PKHeX.Everywhere.Engine.Host.wasm",
86
- "name": "PKHeX.Everywhere.Engine.Host.xv25q7a107.wasm",
87
- "hash": "sha256-I6zmJjuSeF2J9jzh8abrHKuSCkHH3z9ETrfe+EUhsR8=",
86
+ "name": "PKHeX.Everywhere.Engine.Host.q5e6fz2g5n.wasm",
87
+ "hash": "sha256-0nfTDF7eMaCk20ipck+Du02/isvdtHgv47SV2I0qkRI=",
88
88
  "cache": "force-cache"
89
89
  },
90
90
  {
91
91
  "virtualPath": "PKHeX.Everywhere.Engine.PlugIns.wasm",
92
- "name": "PKHeX.Everywhere.Engine.PlugIns.zgak1u0lbr.wasm",
93
- "hash": "sha256-/XSGEKdWxHObCJMX70w8eyUIYqasNvF48u+agRmULxg=",
92
+ "name": "PKHeX.Everywhere.Engine.PlugIns.lf7a4tq2bw.wasm",
93
+ "hash": "sha256-34Ou8FWct7/WLsnm7XHaz6eUkX18Y8/8c83gAWvZ3VY=",
94
94
  "cache": "force-cache"
95
95
  },
96
96
  {
97
97
  "virtualPath": "PKHeX.Everywhere.Engine.wasm",
98
- "name": "PKHeX.Everywhere.Engine.z5zg1tyuzh.wasm",
99
- "hash": "sha256-+RTz7qVa5TWDwGYY4MFpB8Dhi/vbHbMmBMm2US37mMk=",
98
+ "name": "PKHeX.Everywhere.Engine.cc2idg69ya.wasm",
99
+ "hash": "sha256-pBbnioXqvFTWlKsh5KCzD2rUzqsPBhIDoQ4QwCc3sSA=",
100
100
  "cache": "force-cache"
101
101
  },
102
102
  {
103
103
  "virtualPath": "PKHeX.Everywhere.PlugIns.wasm",
104
- "name": "PKHeX.Everywhere.PlugIns.wywqtjlojy.wasm",
105
- "hash": "sha256-mB1uQ/uTA4zJAa+n0m/59l/1v3O6/LnS/NPWfnLg2bU=",
104
+ "name": "PKHeX.Everywhere.PlugIns.hd06p9as7o.wasm",
105
+ "hash": "sha256-m5ueDYYRYQvAbruxfGqbLVVQWfrm4756FtCVo8pj17U=",
106
106
  "cache": "force-cache"
107
107
  },
108
108
  {
109
109
  "virtualPath": "PKHeX.Everywhere.RomHacks.wasm",
110
- "name": "PKHeX.Everywhere.RomHacks.xwhkv6stl7.wasm",
111
- "hash": "sha256-TxGDLALEKLaWQrhw82Ne91xSYW98ExZtZY6Me83YSWU=",
110
+ "name": "PKHeX.Everywhere.RomHacks.tdsq48t0or.wasm",
111
+ "hash": "sha256-z3nIywKNlebe6Bprr6I9R9zf3PDOD6j8u2dhg66BRK8=",
112
112
  "cache": "force-cache"
113
113
  },
114
114
  {
115
115
  "virtualPath": "PKHeX.Facade.wasm",
116
- "name": "PKHeX.Facade.60xdpoycab.wasm",
117
- "hash": "sha256-ViE7bBTHnpgBmy1ufioGprTLP8JyubSBgkknJONCn6k=",
116
+ "name": "PKHeX.Facade.fi86cj1rew.wasm",
117
+ "hash": "sha256-l/jvg5pjuAAwghYaaNnRDS6zrzrEZcohGVJk6V0SKbw=",
118
118
  "cache": "force-cache"
119
119
  },
120
120
  {
@@ -131,8 +131,8 @@ var e=!1;const t=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,
131
131
  },
132
132
  {
133
133
  "virtualPath": "System.Collections.wasm",
134
- "name": "System.Collections.jidutvlmc0.wasm",
135
- "hash": "sha256-FXcncyLlLMLSTEtJ+a3kdEwkwdpQrx1D+XCz1JgwmrA=",
134
+ "name": "System.Collections.9eyardblf5.wasm",
135
+ "hash": "sha256-oQuaQsKfQY4yjUbiNdZwQlccuZPtwNgdaPwzU716F1Q=",
136
136
  "cache": "force-cache"
137
137
  },
138
138
  {
package/dist/binary.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  import type { Binary } from './generated/types';
2
2
  export declare function toBase64(data: Binary): Promise<string>;
3
3
  export declare function fileNameOf(data: Binary): string | null;
4
- export declare function withBytes<T>(value: T, keys: readonly (keyof NonNullable<T>)[]): T;
4
+ export declare function withBytes<T>(value: T, paths: readonly string[]): T;
@@ -1,7 +1,7 @@
1
- import type { ActionPlacement, AddedPokemon, Badge, Binary, BoxEntry, CatalogNames, CatalogNamesRequest, Choice, DeclaredPage, EditablePokemon, EncounterRow, EncounterVersions, ExportedPokemon, ExportedSave, FormatEntry, GameProgress, InstalledPlugIn, ItemHandle, LoadedSave, PlugInAction, PlugInDetails, PlugInFailure, PlugInOutcome, PlugInSetting, PlugInState, PokemonHandle, PokemonId, PokemonOptions, PokemonPatch, PokemonSummary, Pouch, PublishedVersion, SaveEvents, SaveSummary, SaveVersion, SpeciesEntry, TrainerCard, TrainerGender, VersionEntry } from './types';
1
+ import type { ActionPlacement, AddedPokemon, Badge, Binary, BoxEntry, CatalogNames, CatalogNamesRequest, Choice, DeclaredPage, EditablePokemon, EncounterRow, EncounterVersions, ExportedPokemon, ExportedSave, FormatEntry, GameProgress, InstalledPlugIn, ItemHandle, LoadedSave, PlugInAction, PlugInDetails, PlugInFailure, PlugInOutcome, PlugInSetting, PlugInState, PokemonHandle, PokemonId, PokemonOptions, PokemonPatch, PokemonSummary, Pouch, PublishedVersion, SaveEvents, SaveSummary, SaveVersion, SpeciesEntry, TradeOffer, TradePreview, TradeResult, TradeSummary, TrainerCard, TrainerGender, VersionEntry } from './types';
2
2
  export type Invoke = <T>(call: CallName, args: unknown[]) => Promise<T>;
3
- export declare const queries: readonly ['box.get', 'box.list', 'box.showdown', 'catalog.names', 'encounters.search', 'encounters.versions', 'events.flag', 'events.get', 'game.balls', 'game.blankVersions', 'game.formats', 'game.get', 'game.heldItems', 'game.languages', 'game.moves', 'game.natures', 'game.originGames', 'game.progress', 'game.types', 'game.version', 'inventory.get', 'party.get', 'party.showdown', 'plugins.actions', 'plugins.details', 'plugins.failures', 'plugins.installed', 'plugins.isSupported', 'plugins.pageModule', 'plugins.pages', 'plugins.setting', 'plugins.state', 'pokemon.details', 'pokemon.export', 'pokemon.get', 'pokemon.options', 'pokemon.showdown', 'species.list', 'trainer.badges', 'trainer.get'];
4
- export declare const commands: readonly ['box.addEncounter', 'box.addFromFile', 'events.giveTickets', 'events.setFlag', 'events.setWork', 'game.close', 'game.enableFormat', 'game.export', 'game.file', 'game.load', 'game.loadBlank', 'inventory.setItem', 'plugins.dismissFailure', 'plugins.newestCompatible', 'plugins.register', 'plugins.run', 'plugins.setEnabled', 'plugins.setHookEnabled', 'plugins.unregister', 'plugins.updateSetting', 'pokemon.addToBox', 'pokemon.clone', 'pokemon.commit', 'pokemon.edit', 'pokemon.setLevel', 'pokemon.update', 'trainer.setBadges', 'trainer.setBattlePoints', 'trainer.setGender', 'trainer.setMoney', 'trainer.setName'];
3
+ export declare const queries: readonly ['box.get', 'box.list', 'box.showdown', 'catalog.names', 'encounters.search', 'encounters.versions', 'events.flag', 'events.get', 'game.balls', 'game.blankVersions', 'game.formats', 'game.get', 'game.heldItems', 'game.languages', 'game.moves', 'game.natures', 'game.originGames', 'game.progress', 'game.types', 'game.version', 'inventory.get', 'party.get', 'party.showdown', 'plugins.actions', 'plugins.details', 'plugins.failures', 'plugins.installed', 'plugins.isSupported', 'plugins.pageModule', 'plugins.pages', 'plugins.setting', 'plugins.state', 'pokemon.details', 'pokemon.export', 'pokemon.get', 'pokemon.options', 'pokemon.showdown', 'species.list', 'trade.get', 'trade.partnerBoxes', 'trade.preview', 'trainer.badges', 'trainer.get'];
4
+ export declare const commands: readonly ['box.addEncounter', 'box.addFromFile', 'events.giveTickets', 'events.setFlag', 'events.setWork', 'game.close', 'game.enableFormat', 'game.export', 'game.file', 'game.load', 'game.loadBlank', 'inventory.setItem', 'plugins.dismissFailure', 'plugins.newestCompatible', 'plugins.register', 'plugins.run', 'plugins.setEnabled', 'plugins.setHookEnabled', 'plugins.unregister', 'plugins.updateSetting', 'pokemon.addToBox', 'pokemon.clone', 'pokemon.commit', 'pokemon.edit', 'pokemon.setLevel', 'pokemon.update', 'trade.close', 'trade.commit', 'trade.open', 'trainer.setBadges', 'trainer.setBattlePoints', 'trainer.setGender', 'trainer.setMoney', 'trainer.setName'];
5
5
  export type QueryName = (typeof queries)[number];
6
6
  export type CommandName = (typeof commands)[number];
7
7
  export type CallName = QueryName | CommandName;
@@ -140,6 +140,26 @@ export interface EngineClient {
140
140
  /** Requires a loaded save; throws `no-save` otherwise. */
141
141
  list(): Promise<SpeciesEntry[]>;
142
142
  };
143
+ trade: {
144
+ /** Closes the open trade, dropping the partner save. Closing with no trade open does nothing. */
145
+ close(): Promise<void>;
146
+ /** Moves the offered Pokémon: each leaves its slot and lands in the first empty box slots of the other save. Fails with `trade-refused`, writing nothing, when `trade.preview()` refuses any of them. Requires a loaded save; throws `no-save` otherwise. */
147
+ commit(offer: TradeOffer): Promise<TradeResult>;
148
+ /** Reads the open trade's partner, routes and room, or null when no trade is open or no save is loaded. */
149
+ get(): Promise<TradeSummary | null>;
150
+ /**
151
+ * Opens a partner save next to the loaded one, to move Pokémon between them. It replaces the partner opened before, and stays open until `trade.close()`, even when another save is loaded. Requires a loaded save; throws `no-save` otherwise.
152
+ *
153
+ * @param data The partner save file's bytes.
154
+ * @param fileName The file name to export the partner with. Defaults to the name of a `File`, or `partner.sav`.
155
+ * @param formatId The id of a save format from `game.formats()` to load the partner with, as in `game.load()`.
156
+ */
157
+ open(data: Binary, fileName?: string | null, formatId?: string | null): Promise<TradeSummary>;
158
+ /** Lists the partner's party, then its boxed Pokémon in box and slot order. Handles point into the partner save. */
159
+ partnerBoxes(): Promise<PokemonSummary[]>;
160
+ /** Shows what moving the offered Pokémon would change, and which ones can't move. Nothing is written. A handle without a Pokémon fails with `not-found`, and the draft with `draft-not-allowed`. Requires a loaded save; throws `no-save` otherwise. */
161
+ preview(offer: TradeOffer): Promise<TradePreview>;
162
+ };
143
163
  trainer: {
144
164
  /** Lists the gym badges in game order. Gold, Silver and Crystal list the Johto badges, then the Kanto ones. Returns null outside Generations 1 to 3 and for ROM hacks. Requires a loaded save; throws `no-save` otherwise. */
145
165
  badges(): Promise<Badge[] | null>;
@@ -1,2 +1,2 @@
1
- export declare const errorCodes: readonly ['no-save', 'invalid-save', 'format-choice-required', 'not-found', 'out-of-range', 'pouch-full', 'box-full', 'unparseable', 'conversion-failed', 'not-in-game', 'unknown-species', 'invalid-patch', 'draft-not-allowed', 'no-slot', 'no-draft', 'unknown-call', 'bad-arguments', 'plugin-failed', 'not-supported', 'unexpected'];
1
+ export declare const errorCodes: readonly ['no-save', 'invalid-save', 'format-choice-required', 'not-found', 'out-of-range', 'pouch-full', 'box-full', 'unparseable', 'conversion-failed', 'not-in-game', 'unknown-species', 'invalid-patch', 'draft-not-allowed', 'no-slot', 'no-draft', 'unknown-call', 'bad-arguments', 'plugin-failed', 'not-supported', 'no-trade', 'trade-refused', 'unexpected'];
2
2
  export type ErrorCode = (typeof errorCodes)[number];
@@ -1,4 +1,4 @@
1
1
  import type { QueryName } from './client';
2
- export declare const topics: readonly ['*', 'game', 'party', 'box', 'inventory', 'events', 'trainer', 'draft', 'plugins'];
2
+ export declare const topics: readonly ['*', 'game', 'party', 'box', 'inventory', 'events', 'trainer', 'draft', 'plugins', 'trade'];
3
3
  export type Topic = (typeof topics)[number] | `${(typeof topics)[number]}/${string}`;
4
4
  export declare const queryTopics: Record<QueryName, readonly Topic[]>;
@@ -350,6 +350,20 @@ export interface MoveSlot {
350
350
  /** The slot holds a move PKHeX has no id for, such as a ROM hack's own move, named like `Unknown move #90`. Its `id` can only stay in this slot, and the slot can be set to another move or to 0. */
351
351
  isUnknown: boolean;
352
352
  }
353
+ /** A Pokémon in the offer that can be traded, and what moving it changes. */
354
+ export interface OfferedPokemon {
355
+ direction: TradeDirection;
356
+ /** The Pokémon as it is now. Its handle points to the save it leaves. */
357
+ from: PokemonSummary;
358
+ /** The Pokémon as it will be in the other save. Its handle is the box slot it will land in. */
359
+ arrives: PokemonSummary;
360
+ /** The fields the move changes, in the order of `TradeField`. A move can show up once per move removed. */
361
+ changes: TradeChange[];
362
+ /** What the move changes in either save. */
363
+ saveChanges: TradeSaveChange[];
364
+ /** PKHeX's legality check of the Pokémon as it arrives, judged in the destination game. */
365
+ legality: Legality;
366
+ }
353
367
  /** An item the trainer holds in a pouch. */
354
368
  export interface OwnedItem {
355
369
  /** The item's id in the save's own item list. From Generation 4 on, and in ROM hack saves, these are PKHeX.Core item ids; other Generation 1 to 3 saves use their game's own numbering. An unknown item gets an id of its own, which only means something to this save. */
@@ -673,6 +687,13 @@ export interface PublishedVersion {
673
687
  /** The plug-in SDK the version is built against: `1` for the older PKHeX.Web plug-ins, `2` and later for PKHeX.Everywhere plug-ins. The engine runs SDK 3 only. */
674
688
  sdk: number;
675
689
  }
690
+ /** A Pokémon in the offer that can't be traded. */
691
+ export interface RefusedPokemon {
692
+ direction: TradeDirection;
693
+ /** Where it is, in the save it would leave. */
694
+ at: PokemonHandle;
695
+ reason: TradeRefusal;
696
+ }
676
697
  /** A feature that relies on PKHeX knowing the save's game: the legality check in `pokemon.details()`, AutoLegality, the `encounters` calls, Showdown export, the `events` calls and plug-ins. Without `plugIns`, hooks don't run, `plugins.actions()` and `plugins.pages()` are empty, and `plugins.run()` and `plugins.pageModule()` fail with `not-supported`. */
677
698
  export type SaveCapability = 'legality' | 'autoLegality' | 'encounters' | 'showdown' | 'events' | 'plugIns';
678
699
  /** The save's event flags and work, returned by `events.get`, which returns null for saves without them. */
@@ -770,6 +791,87 @@ export interface TicketsAndIslands {
770
791
  /** Flags for ferry access and the event islands. Empty outside Emerald. */
771
792
  islands: EventFlag[];
772
793
  }
794
+ /** A field a trade changes. */
795
+ export interface TradeChange {
796
+ field: TradeField;
797
+ /** The value as the source game names it. Null when there was none, such as a move the Pokémon learns. */
798
+ before: string | null;
799
+ /** The value as the destination game names it. Null when there is none, such as a removed move or item. */
800
+ after: string | null;
801
+ reason: TradeChangeReason;
802
+ }
803
+ /** Why a trade changes a field. */
804
+ export type TradeChangeReason = 'hmRemoved' | 'itemRemapped' | 'itemRemoved' | 'link' | 'timeCapsule' | 'palPark' | 'pokeTransfer' | 'received' | 'tradeEvolution' | 'itemUsed' | 'formReverted';
805
+ /** Which way a Pokémon moves: `send` from the loaded save to the partner, `receive` from the partner to the loaded save. */
806
+ export type TradeDirection = 'send' | 'receive';
807
+ /** A field of a Pokémon that a trade can change. */
808
+ export type TradeField = 'species' | 'form' | 'heldItem' | 'moves' | 'metLocation' | 'metLevel' | 'ball' | 'friendship' | 'nickname' | 'ability';
809
+ /** The Pokémon to move. Each handle points to a party or box slot: in the loaded save for `send`, and in the partner for `receive`. */
810
+ export interface TradeOffer {
811
+ /** Pokémon to move from the loaded save to the partner. */
812
+ send: PokemonHandle[];
813
+ /** Pokémon to move from the partner to the loaded save. */
814
+ receive: PokemonHandle[];
815
+ }
816
+ /** What `trade.commit` would do with an offer, returned by `trade.preview`. */
817
+ export interface TradePreview {
818
+ /** The Pokémon that can be traded, sent ones first. */
819
+ offers: OfferedPokemon[];
820
+ /** The Pokémon that can't. `trade.commit` fails while any are left. */
821
+ refused: RefusedPokemon[];
822
+ }
823
+ /** Why a Pokémon can't be traded. */
824
+ export type TradeRefusal = 'noRoute' | 'slotLocked' | 'eggAcrossGenerations' | 'languageMismatch' | 'speciesNotInGame' | 'lastPartyMember' | 'noRoom' | 'bagFull';
825
+ /** Both saves after `trade.commit`, ready to write back. */
826
+ export interface TradeResult {
827
+ /** The loaded save. */
828
+ save: ExportedSave;
829
+ /** The partner save. */
830
+ partner: ExportedSave;
831
+ /** Where each Pokémon landed, sent ones first. */
832
+ arrived: TradedPokemon[];
833
+ }
834
+ /** How many empty box slots each save has for Pokémon to arrive in. */
835
+ export interface TradeRoom {
836
+ /** Empty box slots in the loaded save. */
837
+ mine: number;
838
+ /** Empty box slots in the partner save. */
839
+ partner: number;
840
+ }
841
+ /** How a Pokémon gets from one save to the other, as the games move it. */
842
+ export type TradeRoute = 'link' | 'timeCapsule' | 'palPark' | 'pokeTransfer';
843
+ /** The routes of an open trade. A null route means the games can't move Pokémon that way, and every Pokémon offered that way is refused with `noRoute`. Saves loaded with a ROM hack format and Let's Go saves have none. */
844
+ export interface TradeRoutes {
845
+ /** From the loaded save to the partner. */
846
+ send: TradeRoute | null;
847
+ /** From the partner to the loaded save. */
848
+ receive: TradeRoute | null;
849
+ }
850
+ /** A change a trade makes to a save. */
851
+ export interface TradeSaveChange {
852
+ kind: TradeSaveChangeKind;
853
+ /** The save that changes. */
854
+ save: TradeSide;
855
+ /** What changes, for display: the species caught, the item returned, or the event and its new value. */
856
+ label: string;
857
+ }
858
+ /** What a trade changes in a save besides the Pokémon itself. */
859
+ export type TradeSaveChangeKind = 'pokedexCaught' | 'itemReturned' | 'eventVar';
860
+ /** A save in a trade: `sender` is the one the Pokémon leaves, `receiver` the one it arrives in. */
861
+ export type TradeSide = 'sender' | 'receiver';
862
+ /** The trade `trade.open` opened: the partner save, the routes between the saves and the room in each. */
863
+ export interface TradeSummary {
864
+ partner: SaveSummary;
865
+ routes: TradeRoutes;
866
+ room: TradeRoom;
867
+ }
868
+ /** A Pokémon a trade moved. */
869
+ export interface TradedPokemon {
870
+ direction: TradeDirection;
871
+ id: PokemonId;
872
+ /** The box slot it landed in: in the partner for `send`, in the loaded save for `receive`. */
873
+ at: PokemonHandle;
874
+ }
773
875
  /** The trainer's identity and currencies, returned by `trainer.get`. */
774
876
  export interface TrainerCard {
775
877
  /** The trainer ID and secret ID as `TID/SID`, in the format the game displays them. */
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { a as createEngine, n as topics, o as wasmHost, r as EngineError } from "./topics-BD2tUWCQ.js";
1
+ import { a as createEngine, n as topics, o as wasmHost, r as EngineError } from "./topics-CcK62uu9.js";
2
2
  //#region src/generated/errors.ts
3
3
  var errorCodes = [
4
4
  "no-save",
@@ -20,6 +20,8 @@ var errorCodes = [
20
20
  "bad-arguments",
21
21
  "plugin-failed",
22
22
  "not-supported",
23
+ "no-trade",
24
+ "trade-refused",
23
25
  "unexpected"
24
26
  ];
25
27
  //#endregion
package/dist/internal.js CHANGED
@@ -1,2 +1,2 @@
1
- import { i as call, s as affects, t as queryTopics } from "./topics-BD2tUWCQ.js";
1
+ import { i as call, s as affects, t as queryTopics } from "./topics-CcK62uu9.js";
2
2
  export { affects, call, queryTopics };
@@ -11,12 +11,14 @@ async function toBase64(data) {
11
11
  function fileNameOf(data) {
12
12
  return typeof File !== "undefined" && data instanceof File ? data.name : null;
13
13
  }
14
- function withBytes(value, keys) {
14
+ function withBytes(value, paths) {
15
15
  if (value == null) return value;
16
16
  const converted = { ...value };
17
- for (const key of keys) {
17
+ for (const path of paths) {
18
+ const [key, ...rest] = path.split(".");
18
19
  const encoded = converted[key];
19
- if (typeof encoded === "string") converted[key] = Uint8Array.from(atob(encoded), (char) => char.charCodeAt(0));
20
+ if (rest.length > 0) converted[key] = withBytes(encoded, [rest.join(".")]);
21
+ else if (typeof encoded === "string") converted[key] = Uint8Array.from(atob(encoded), (char) => char.charCodeAt(0));
20
22
  }
21
23
  return converted;
22
24
  }
@@ -112,6 +114,18 @@ function createClient(invoke) {
112
114
  update: (at, patch) => invoke("pokemon.update", [at, patch])
113
115
  },
114
116
  species: { list: () => invoke("species.list", []) },
117
+ trade: {
118
+ close: () => invoke("trade.close", []),
119
+ commit: async (offer) => withBytes(await invoke("trade.commit", [offer]), ["save.bytes", "partner.bytes"]),
120
+ get: () => invoke("trade.get", []),
121
+ open: async (data, fileName, formatId) => invoke("trade.open", [
122
+ await toBase64(data),
123
+ fileName ?? fileNameOf(data),
124
+ formatId
125
+ ]),
126
+ partnerBoxes: () => invoke("trade.partnerBoxes", []),
127
+ preview: (offer) => invoke("trade.preview", [offer])
128
+ },
115
129
  trainer: {
116
130
  badges: () => invoke("trainer.badges", []),
117
131
  get: () => invoke("trainer.get", []),
@@ -130,7 +144,7 @@ var overlaps = (a, b) => covers(a, b) || covers(b, a);
130
144
  var affects = (changed, read) => changed.some((c) => read.some((r) => overlaps(c, r)));
131
145
  //#endregion
132
146
  //#region package.json
133
- var version = "0.8.0";
147
+ var version = "0.9.0";
134
148
  //#endregion
135
149
  //#region src/crypto.ts
136
150
  var modes = {
@@ -373,7 +387,8 @@ var topics = [
373
387
  "events",
374
388
  "trainer",
375
389
  "draft",
376
- "plugins"
390
+ "plugins",
391
+ "trade"
377
392
  ];
378
393
  var queryTopics = {
379
394
  "box.get": ["box"],
@@ -439,6 +454,13 @@ var queryTopics = {
439
454
  "draft"
440
455
  ],
441
456
  "species.list": ["game"],
457
+ "trade.get": ["trade", "box"],
458
+ "trade.partnerBoxes": ["trade"],
459
+ "trade.preview": [
460
+ "trade",
461
+ "party",
462
+ "box"
463
+ ],
442
464
  "trainer.badges": ["trainer", "events"],
443
465
  "trainer.get": ["trainer"]
444
466
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pkhex-everywhere/engine",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "PKHeX in the browser: load, read and edit Pokémon save files.",
5
5
  "license": "GPL-3.0-or-later",
6
6
  "homepage": "https://docs.pkhex-everywhere.fyi/docs/",