XTPX4PYLPGJAEK52LYOYHLVRCL7N5FFAEY4E3OL23LOWLYPLCILQC YLOKW6ERT2XEQG4T6GBPSBCQWVIHWAKBESCXJBKMQBSDXV3C2ACQC C56DYYC72SFNR6BSKCOVDY2QW6XNP66EUGGKCBROTCFJVQDB4FUAC WXJSE2H5CZ4NAI5PAWGAZCAB2XCEO2LIJR2QCW3JAK7ZZGIHRJLQC Y62XTAEHAC5MNJELNKACRLEVBUU2MKYKFPHB5M2S5X46B4EI2JJQC 7MCTB5G2W6IB7JQXGO2HCMRHBUYIOKXI4MBODKLAJIK66EMLC5ZQC V3QTRVNR5EVDZ2O2WRK7ZCVKSGGYBSNILH44OWXKOJK2ME5JC7UQC QHVOZBISIQ3E3P5F6GGKWVDSXC4OA23HCIH2OMXEVGXKSF5W4APAC 3DZWNZUZGMHJH3JL3H7KN746C6XVNBRBFHBSVSB5AH7YYUFVYVDAC P7KZ25R4CNS4PZITRWPBVXRFSLY5TKCOFO6U3SDKX45ITNVU773QC KNH5OGCTL3YCOQQPA32M76SGWHGHAPQRIZ7S2CBC5DGIEV32SOYQC TLRGOVFX6KIWQSWRPXS73WW4EHJQ5L5W5NYMO6UM2EF2H3EPAHHQC FERLNXU2QISSKOUBSPABB2ERHOWHQRI2GVKDJ352Y4B2FUXBRGRQC <script lang="ts">import Banque from '../../Banque.svelte'import Simulation from './Simulation.svelte'import { page } from '$app/stores';import { enhance, applyAction } from '$app/forms';import { onMount } from 'svelte';import type { SubmitFunction } from '@sveltejs/kit';import type { Grain } from '../../../helpers'
`<script lang="ts">import Banque from '../../Banque.svelte'import Simulation from './Simulation.svelte'import { page } from '$app/stores';import { enhance, applyAction } from '$app/forms';import { onMount } from 'svelte';import type { SubmitFunction } from '@sveltejs/kit';import type { Grain } from '../../../helpers'import type { Modal, Offcanvas } from 'bootstrap'export let data: {name: string,porteur: string,adresse: string,tel: string,id: string,img?: string,simulation: Grain.SimulationCommunaute,guest?: boolean,prms: string,email?: string,}
export let data: {name: string,porteur: string,adresse: string,tel: string,id: string,img?: string,simulation: Grain.SimulationCommunaute,guest?: boolean,prms: string,email?: string,}
let prodWeekly: number[] = []let maxProd = 0let pvgis_loading = false
onMount(async () => {let modal = document.getElementById('grainSaveModal')console.log("mount modal", modal)if(modal) {document.body.appendChild(modal);}if(!window.bootstrap) {console.log("no window bootstrap, load");window.bootstrap = await import('bootstrap')}menuElt = document.getElementById('menuoff')if(!menuElt) {return}menu = new window.bootstrap.Offcanvas(menuElt)const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')for(let t of popoverTriggerList) {new window.bootstrap.Popover(t)}})
onMount(async () => {let modal = document.getElementById('grainSaveModal')console.log("mount modal", modal)if(modal) {document.body.appendChild(modal);modal.parentNode?.removeChild(modal)}if(!window.bootstrap) {console.log("no window bootstrap, load");window.bootstrap = await import('bootstrap')}const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')for(let t of popoverTriggerList) {new window.bootstrap.Popover(t)}})
let saveModal_: null | Modal = null;let menu: null | Offcanvas = null;let menuElt: null | HTMLElement = null
async function saveModal(_e: Event) {console.log("saveModal", _e)if(!saveModal_) {console.log("no saveModal")saveModal_ = new window.bootstrap.Modal('#grainSaveModal', {focus: true,keyboard: true,})}console.log("show")saveModal_?.show()}
showSaveModalAfterMenuHide()menu?.hide()}
let save: SubmitFunction = async ({ formData }) => {console.log("save called")formData.set('data', JSON.stringify(p))formData.set('prms', JSON.stringify(data.prms))saveModal_?.hide()return async ({ result }) => {await applyAction(result);};}
function showSaveModalAfterMenuHide() {// menuElt?.removeEventListener('hidden.bs.offcanvas', showSaveModalAfterMenuHide)let c = document.getElementsByClassName("offcanvas-backdrop")for(const elt of c) {elt.parentElement?.removeChild(elt)}saveModal_?.show()}
let expert = $page.url.hash == "#expert"
let save: SubmitFunction = async ({ formData }) => {console.log("save called")formData.set('data', JSON.stringify(p))formData.set('prms', JSON.stringify(data.prms))saveModal_?.hide()return async ({ result }) => {console.log(JSON.stringify(result))await applyAction(result);};}
$: compteActive = ($page.url.hash == "#compte") ? "active": ""$: banqueActive = ($page.url.hash == "#banque") ? "active": ""$: expertActive = (expert && $page.url.hash == "#expert") ? "active": ""$: simuActive = ((true || !data.guest) && $page.url.hash == "#simu") ? "active": ""$: syntheseActive = (!compteActive && !banqueActive && !simuActive && !expertActive) ? "active": ""
let expert = $page.url.hash == "#expert"
$: compteShow = compteActive ? "show": ""$: banqueShow = banqueActive ? "show": ""$: simuShow = simuActive ? "show": ""$: syntheseShow = syntheseActive ? "show": ""$: expertShow = expertActive ? "show": ""
$: compteActive = ($page.url.hash == "#compte") ? "active": ""$: banqueActive = ($page.url.hash == "#banque") ? "active": ""$: expertActive = (expert && $page.url.hash == "#expert") ? "active": ""$: simuActive = ((true || !data.guest) && $page.url.hash == "#simu") ? "active": ""$: syntheseActive = (!compteActive && !banqueActive && !simuActive && !expertActive) ? "active": ""
let N = 30const arr = 0
$: compteShow = compteActive ? "show": ""$: banqueShow = banqueActive ? "show": ""$: simuShow = simuActive ? "show": ""$: syntheseShow = syntheseActive ? "show": ""$: expertShow = expertActive ? "show": ""
function tarifSurplus_(puissance: number): number {let resultat = p.tarifCRE.prix[0];for(let i = 0; i < p.tarifCRE.limites.length; i++) {if(puissance < p.tarifCRE.limites[i]) {return resultat} else {resultat = p.tarifCRE.prix[i]}}return resultat}
let an = new Date().getFullYear()
$: investissement = p.puissance ? (p.puissance * 1000 * p.ratio + p.enedis): 0
function tarifSurplus_(puissance: number): number {let resultat = p.tarifCRE.prix[0];for(let i = 0; i < p.tarifCRE.limites.length; i++) {if(puissance < p.tarifCRE.limites[i]) {return resultat} else {resultat = p.tarifCRE.prix[i]}}return resultat}
$: tarifLocal = (i: number) => p.prix * Math.pow(1+p.inflation/100, i)$: tarifAllo = (i: number) => p.coutElec * Math.pow(1+p.inflationElec/100, i)
$: tarifSurplus = (i: number) => tarifSurplus_(p.puissance) * Math.pow(1+p.tarifCRE.inflation/100, i)
$: chiffreAffaires = (i: number) =>((i == 0) ? primeInvestissement : 0) + productionAnnuelle(i) * (autoconso * tarifLocal(i) + (1 - autoconso) * tarifSurplus(i) + p.autoprod * tarifAllo(i)/100)
$: tarifLocal = (i: number) => p.prix * Math.pow(1+p.inflation/100, i)$: tarifAllo = (i: number) => p.coutElec * Math.pow(1+p.inflationElec/100, i)
$: exploitation = (i: number) => p.puissance * p.maintenance * Math.pow(1 + p.inflation / 100, i)
$: chiffreAffaires = (i: number) =>((i == 0) ? primeInvestissement : 0) + productionAnnuelle(i) * (autoconso * tarifLocal(i) + (1 - autoconso) * tarifSurplus(i) + p.autoprod * tarifAllo(i)/100)
$: provisionOnduleurs = (i: number) => p.puissance * 1000 * p.provisionOnduleurs * Math.pow(1 + p.inflation/100, i) / 10
// Déductions fiscales$: amortissement = (i: number) => (i < p.dureeAmortissement) ? investissement / p.dureeAmortissement: 0
let remboursementAnnuel = new Array()let interetsAnnuels = new Array()$: dette = Math.max(0, investissement - apport)
$: provisionOnduleurs = (i: number) => p.puissance * 1000 * p.provisionOnduleurs * Math.pow(1 + p.inflation/100, i) / 10
$: coutElec = () => {let cout = 0for(let i = 0; i < N; i++) {cout += p.coutElec * Math.pow(1 + p.inflationElec / 100, i) * consoMoyenneFoyer(i)
$: {resultatNetData[0] = { id: "", data: new Array(N).fill(0).map((_, i) => { return { x: an + i, y: resultatNet(i) }}) }}
$: coutElecAuto = () => {let cout = 0for(let i = 0; i < N; i++) {cout += tarifLocal(i) * consoMoyenneFoyer(i) * p.autoprod / 100+ p.coutElec * Math.pow(1 + p.inflationElec / 100, i) * consoMoyenneFoyer(i) * (100 - p.autoprod) / 100}return cout}
$: coutElec = () => {let cout = 0for(let i = 0; i < N; i++) {cout += p.coutElec * Math.pow(1 + p.inflationElec / 100, i) * consoMoyenneFoyer(i)
$: coutElecAuto_ = coutElecAuto()
$: coutElecAuto = () => {let cout = 0for(let i = 0; i < N; i++) {cout += tarifLocal(i) * consoMoyenneFoyer(i) * p.autoprod / 100+ p.coutElec * Math.pow(1 + p.inflationElec / 100, i) * consoMoyenneFoyer(i) * (100 - p.autoprod) / 100}return cout}
function sum(x: (_: number) => number, n: number){return new Array(n).fill(0).reduce((a, _, i) => a + x(i), 0)}
$: coutElec_ = coutElec()$: coutElecAuto_ = coutElecAuto()function sum(x: (_: number) => number, n: number){return new Array(n).fill(0).reduce((a, _, i) => a + x(i), 0)}
let f = 0let s = ''if (Math.abs(x) <= 1000){s = ' €'f = x} else if (Math.abs(x) < 1000000) {s = ' k€'f = x/1000} else if(Math.abs(x) < 1000000000) {s = ' M€'f = x/1000000} else {s = ' mds€'f = x/1000000000}return Intl.NumberFormat('fr-FR').format(f).toString()+ s}
let f = 0let s = ''if (Math.abs(x) <= 1000){s = ' €'f = x} else if (Math.abs(x) < 1000000) {s = ' k€'f = x/1000} else if(Math.abs(x) < 1000000000) {s = ' M€'f = x/1000000} else {s = ' mds€'f = x/1000000000}return Intl.NumberFormat('fr-FR').format(f).toString()+ s}
let maxa = -1/0let mina = 1/0let margin = 1function traceArray(f: (_: number) => number, n:number){let c = ''let ai = 0maxa = -1/0mina = 1/0for (let i = 0; i < n; i ++ ){ai += f(i)maxa = Math.max(maxa, ai)mina = Math.min(mina, ai)c += ` ${c ? 'L':'M'} ${i.toFixed(arr)}, ${(-ai.toFixed(arr))}`}margin = Math.max(1, (maxa - mina) / 20)return c}
let maxa = -1/0let mina = 1/0let margin = 1function traceArray(f: (_: number) => number, n:number){let c = ''let ai = 0maxa = -1/0mina = 1/0for (let i = 0; i < n; i ++ ){ai += f(i)maxa = Math.max(maxa, ai)mina = Math.min(mina, ai)c += ` ${c ? 'L':'M'} ${i.toFixed(arr)}, ${(-ai.toFixed(arr))}`}margin = Math.max(1, (maxa - mina) / 20)return c}
$: roiDate = (j: (_: number) => number) => {let d:number = 0let resultat:string=''for (let i = 0; i < N; i += 1 ){if (sum(j,i+1) > 0){d=ibreak;}}if (d <= 0) {resultat = 'À la saint glinglin'} else if (d > 0){let resu = ''let y = d % 12let x = Math.trunc(d/12)if (x > 0){resu += x.toString()+' ans'}if (y > 0){if(resu) {resu += ' '}resu += y.toString()+' mois'}resultat = resu}return resultat}
$: roiDate = () => {let sum = 0let lastNeg = 0for (let i = 0; i < N; i += 1 ){sum += resultatNet(i)if(sum < 0)lastNeg = i}lastNeg += 1if (lastNeg < N) {if(lastNeg <= 1 && sum >= 0) {return `Tout de suite`} else if (lastNeg == 1) {return `1 an`} else {return `${lastNeg} ans`}} else {return "À la saint Glinglin"}}
let totalRembAnnuel_n =remboursementAnnuel.slice(0, n).reduce((a, b) => a + b, 0)let totalInteret_n = sum(interetsDetteSenior, n)let totalRembAnnuel =remboursementAnnuel.reduce((a, b) => a + b, 0)let totalInteret = sum(interetsDetteSenior, n)return (totalRembAnnuel + totalInteret) ?((totalRembAnnuel_n + totalInteret_n) * 100 / (totalRembAnnuel + totalInteret)).toFixed(1) + ' %': 0}
let totalRembAnnuel_n = remboursementAnnuel.slice(0, n).reduce((a, b) => a + b, 0)let totalInteret_n = sum(interetsDetteSenior, n)let totalRembAnnuel =remboursementAnnuel.reduce((a, b) => a + b, 0)let totalInteret = sum(interetsDetteSenior, n)return (totalRembAnnuel + totalInteret) ?((totalRembAnnuel_n + totalInteret_n) * 100 / (totalRembAnnuel + totalInteret)).toFixed(1) + ' %': 0}
{#if true || !data?.guest}<div class="tab-content" id="simuTabContent"><div class="tab-pane fade {simuActive} {simuShow} show p-3" id="simu-tab-pane" role="tabpanel" aria-labelledby="simu-tab" tabindex="0"><h4 class="my-3">Simulation</h4><Simulation active={simuActive} bind:prms={data.prms} puissance={p.puissance} bind:prodWeekly={prodWeekly} bind:maxProd={maxProd} bind:pvgis_loading={pvgis_loading} /></div>
<div class="tab-content" id="simuTabContent"><div class="tab-pane fade {simuActive} {simuShow} show p-3" id="simu-tab-pane" role="tabpanel" aria-labelledby="simu-tab" tabindex="0"><h4 class="my-3">Simulation</h4><Simulation active={simuActive} bind:prms={data.prms} puissance={p.puissance} bind:prodWeekly={prodWeekly} bind:maxProd={maxProd} bind:pvgis_loading={pvgis_loading} />
{#if !data?.guest}<div class="modal-body"><h5 class="modal-title pb-3" id="saveModalLabel">Sauvegarder</h5><form method="POST" id="saveForm" action="?/save" use:enhance={save}><div class="mb-3"><label class="form-label" for="nom">Nom du projet</label><input class="form-control" type="text" id="nom" name="name" bind:value={data.name} required/></div><div class="mb-3"><label class="form-label" for="porteur">Prénom et nom du porteur du projet</label><input class="form-control" type="text" id="porteur" name="porteur" bind:value={data.porteur}/></div><div class="mb-3"><label class="form-label" for="adresse">Adresse</label><input class="form-control" type="text" id="adresse" name="adresse" bind:value={data.adresse}/></div><div class="mb-3"><label class="form-label" for="tel">Téléphone</label><input class="form-control" type="text" id="tel" name="tel" bind:value={data.tel}/></div><div class="mb-3"><label class="form-label" for="photo">Photo</label><input class="form-control" type="file" id="photo" name="photo"/></div></form></div><div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button><button form="saveForm" class="btn btn-primary">Sauvegarder</button></div>{/if}
<div class="modal-body"><h5 class="modal-title pb-3" id="saveModalLabel">Sauvegarder</h5><form method="POST" id="saveForm" action="?/save" use:enhance={save}><div class="mb-3"><label class="form-label" for="nom">Nom du projet</label><input class="form-control" type="text" id="nom" name="name" bind:value={data.name} required/></div><div class="mb-3"><label class="form-label" for="porteur">Prénom et nom du porteur du projet</label><input class="form-control" type="text" id="porteur" name="porteur" bind:value={data.porteur}/></div><div class="mb-3"><label class="form-label" for="adresse">Adresse</label><input class="form-control" type="text" id="adresse" name="adresse" bind:value={data.adresse}/></div><div class="mb-3"><label class="form-label" for="tel">Téléphone</label><input class="form-control" type="text" id="tel" name="tel" bind:value={data.tel}/></div><div class="mb-3"><label class="form-label" for="photo">Photo</label><input class="form-control" type="file" id="photo" name="photo"/></div></form></div><div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button><button form="saveForm" class="btn btn-primary">Sauvegarder</button></div>
import type { PageServerLoad, Actions } from './$types';import { userForm, SimulationCommunaute, Grain } from '../../../helpers'
import type { PageServerLoad, Actions, RouteParams } from './$types';import { userForm, SimulationCommunaute, Grain } from '../../../helpers';
let id_ = platform!.env.USER.jurisdiction('eu').idFromName("faisan")let f = await request.formData()let data_ = f.get('data')let dataif(data_) {console.log("data", data_)data = JSON.parse(data_ as string)if (!SimulationCommunaute(data)) {throw error(400, "Bad request")}} else {throw error(400, "Bad request")
if(!platform) {return null
let name = <string> f.get('name') || ''let porteur = <string> f.get('porteur') || ''let adresse = <string> f.get('adresse') || ''let tel = <string> f.get('tel') || ''let photo = <string | null> f.get('photo')
const id_ = platform.env.USER.jurisdiction('eu').idFromName("grain")return await save(id_, params, request, platform)},del: async ({ params, platform }) => {if(!platform) {return null}const id_ = platform.env.USER.jurisdiction('eu').idFromName("grain")return await del(id_, params, platform)},} satisfies Actions
console.log("params!", params)let pidif (params['id'] == "nouveau") {pid = await userForm(platform!.env, id_, {CreateProjet: {name,porteur,tel,adresse,simulation: data}})} else {pid = params['id']await userForm(platform!.env, id_, {SaveProjet: {id: params['id'],name,porteur,tel,adresse,simulation: data}})
export async function save(id_: DurableObjectId,params: RouteParams,request: Request,platform: Readonly<App.Platform>,) {const f = await request.formData()const data_ = f.get('data')let dataif (data_) {console.log("data", data_)data = JSON.parse(data_ as string)if (!SimulationCommunaute(data)) {throw error(400, "Bad request")
console.log(pid, !!photo)if(photo) {console.log("photo")try {console.log("f")console.log(photo)await platform!.env.projets.put(`photo.${id_.toString()}.${pid}`, photo)console.log("put")} catch(e) {console.log("Error", JSON.stringify(e))
console.log("params!", params)let pidif (params['id'] == "nouveau") {pid = await userForm(platform.env, id_, {CreateProjet: {name,porteur,tel,adresse,simulation: data
}console.log("redirect", `${base}/projet/${pid}`)throw redirect(302, `${base}/projet/${pid}`)},del: async ({ cookies, params, platform }) => {let token = cookies.get('token')if (!token) {throw error(403, 'Forbidden');}let id_ = platform!.env.USER.jurisdiction('eu').idFromName("faisan")await userForm(platform!.env, id_, {DelProjet: {
})} else {pid = params['id']await userForm(platform.env, id_, {SaveProjet: {
throw redirect(302, `${base}`)},} satisfies Actions
console.log(pid, !!photo)if (photo) {console.log("photo")try {console.log("f")console.log(photo)await platform.env.projets.put(`photo.${id_.toString()}.${pid}`, photo)console.log("put")} catch (e) {console.log("Error", JSON.stringify(e))}}console.log("redirect", `${base}/projet/${pid}`)throw redirect(302, `${base}/projet/${pid}`)}export async function del(id_: DurableObjectId,params: RouteParams,platform: Readonly<App.Platform>) {await userForm(platform.env, id_, {DelProjet: {id: params['id'],}})throw redirect(302, `${base}`)}
<h1 class="text-uppercase lh-1" style="font-size:4rem;width:50%">No GRAIN,<br/>No gain.</h1><h2 class="sub">L'outil <span class="text-primary">gratuit</span> de faisabilité d'autoconsommation.</h2>
<h1 class="text-uppercase lh-1" style="font-size:4rem;width:50%">No GRAIN,<br/>No gain.</h1><h2 class="sub">L'outil <span class="text-primary">gratuit</span> de faisabilité d'autoconsommation.</h2>
}},"node_modules/@cloudflare/workerd-darwin-64": {"version": "1.20231030.0","resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20231030.0.tgz","integrity": "sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==","cpu": ["x64"],"dev": true,"optional": true,"os": ["darwin"],"engines": {"node": ">=16"}},"node_modules/@cloudflare/workerd-darwin-arm64": {"version": "1.20231030.0","resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20231030.0.tgz","integrity": "sha512-WSJJjm11Del4hSneiNB7wTXGtBXI4QMCH9l5qf4iT5PAW8cESGcCmdHtWDWDtGAAGcvmLT04KNvmum92vRKKQQ==","cpu": ["arm64"],"dev": true,"optional": true,"os": ["darwin"],"engines": {"node": ">=16"}},"node_modules/@cloudflare/workerd-linux-64": {"version": "1.20231030.0","resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20231030.0.tgz","integrity": "sha512-2HUeRTvoCC17fxE0qdBeR7J9dO8j4A8ZbdcvY8pZxdk+zERU6+N03RTbk/dQMU488PwiDvcC3zZqS4gwLfVT8g==","cpu": ["x64"],"dev": true,"optional": true,"os": ["linux"],"engines": {"node": ">=16"
"node_modules/@cloudflare/workerd-linux-arm64": {"version": "1.20231030.0","resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20231030.0.tgz","integrity": "sha512-4/GK5zHh+9JbUI6Z5xTCM0ZmpKKHk7vu9thmHjUxtz+o8Ne9DoD7DlDvXQWgMF6XGaTubDWyp3ttn+Qv8jDFuQ==","cpu": ["arm64"],"dev": true,"optional": true,"os": ["linux"],"engines": {"node": ">=16"}},"node_modules/@cloudflare/workerd-windows-64": {"version": "1.20231030.0","resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20231030.0.tgz","integrity": "sha512-fb/Jgj8Yqy3PO1jLhk7mTrHMkR8jklpbQFud6rL/aMAn5d6MQbaSrYOCjzkKGp0Zng8D2LIzSl+Fc0C9Sggxjg==","cpu": ["x64"],"dev": true,"optional": true,"os": ["win32"],"engines": {"node": ">=16"}},
"node_modules/acorn-walk": {"version": "8.3.0","resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz","integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==","dev": true,"engines": {"node": ">=0.4.0"}},
"node_modules/as-table": {"version": "1.0.55","resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz","integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==","dev": true,"dependencies": {"printable-characters": "^1.0.42"}},
"node_modules/capnp-ts": {"version": "0.7.0","resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz","integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==","dev": true,"dependencies": {"debug": "^4.3.1","tslib": "^2.2.0"}},
"node_modules/exit-hook": {"version": "2.2.1","resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz","integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==","dev": true,"engines": {"node": ">=6"},"funding": {"url": "https://github.com/sponsors/sindresorhus"}},
"node_modules/get-source": {"version": "2.0.12","resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz","integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==","dev": true,"dependencies": {"data-uri-to-buffer": "^2.0.0","source-map": "^0.6.1"}},
"node_modules/miniflare": {"version": "3.20231030.1","resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20231030.1.tgz","integrity": "sha512-Y+EkgV/aFg/3Y/xfFtImK36sLZGXvNS45avVEz0cUCA2pGpg4hGdPu1Udmz5b06SyeUEFVf/dEDMJwdRYVEgLw==","dev": true,"dependencies": {"acorn": "^8.8.0","acorn-walk": "^8.2.0","capnp-ts": "^0.7.0","exit-hook": "^2.2.1","glob-to-regexp": "^0.4.1","source-map-support": "0.5.21","stoppable": "^1.1.0","undici": "^5.22.1","workerd": "1.20231030.0","ws": "^8.11.0","youch": "^3.2.2","zod": "^3.20.6"},"bin": {"miniflare": "bootstrap.js"},"engines": {"node": ">=16.13"}},
"node_modules/mustache": {"version": "4.2.0","resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz","integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==","dev": true,"bin": {"mustache": "bin/mustache"}},
},"node_modules/printable-characters": {"version": "1.0.42","resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz","integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==","dev": true
}},"node_modules/stacktracey": {"version": "2.1.8","resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz","integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==","dev": true,"dependencies": {"as-table": "^1.0.36","get-source": "^2.0.12"}},"node_modules/stoppable": {"version": "1.1.0","resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz","integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==","dev": true,"engines": {"node": ">=4","npm": ">=6"
"node_modules/workerd": {"version": "1.20231030.0","resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20231030.0.tgz","integrity": "sha512-+FSW+d31f8RrjHanFf/R9A+Z0csf3OtsvzdPmAKuwuZm/5HrBv83cvG9fFeTxl7/nI6irUUXIRF9xcj/NomQzQ==","dev": true,"hasInstallScript": true,"bin": {"workerd": "bin/workerd"},"engines": {"node": ">=16"},"optionalDependencies": {"@cloudflare/workerd-darwin-64": "1.20231030.0","@cloudflare/workerd-darwin-arm64": "1.20231030.0","@cloudflare/workerd-linux-64": "1.20231030.0","@cloudflare/workerd-linux-arm64": "1.20231030.0","@cloudflare/workerd-windows-64": "1.20231030.0"}},
"node_modules/ws": {"version": "8.14.2","resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz","integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==","dev": true,"engines": {"node": ">=10.0.0"},"peerDependencies": {"bufferutil": "^4.0.1","utf-8-validate": ">=5.0.2"},"peerDependenciesMeta": {"bufferutil": {"optional": true},"utf-8-validate": {"optional": true}}},
}},"node_modules/youch": {"version": "3.3.3","resolved": "https://registry.npmjs.org/youch/-/youch-3.3.3.tgz","integrity": "sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==","dev": true,"dependencies": {"cookie": "^0.5.0","mustache": "^4.2.0","stacktracey": "^2.1.8"
},"node_modules/zod": {"version": "3.22.4","resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz","integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==","dev": true,"funding": {"url": "https://github.com/sponsors/colinhacks"}