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 = 0
let 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 = 30
const 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 = 0
for(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 = 0
for(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 = 0
for(let i = 0; i < N; i++) {
cout += p.coutElec * Math.pow(1 + p.inflationElec / 100, i) * consoMoyenneFoyer(i)
$: coutElecAuto_ = coutElecAuto()
$: coutElecAuto = () => {
let cout = 0
for(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 = 0
let 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 = 0
let 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/0
let mina = 1/0
let margin = 1
function traceArray(f: (_: number) => number, n:number){
let c = ''
let ai = 0
maxa = -1/0
mina = 1/0
for (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/0
let mina = 1/0
let margin = 1
function traceArray(f: (_: number) => number, n:number){
let c = ''
let ai = 0
maxa = -1/0
mina = 1/0
for (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 = 0
let resultat:string=''
for (let i = 0; i < N; i += 1 ){
if (sum(j,i+1) > 0){
d=i
break;
}
}
if (d <= 0) {
resultat = 'À la saint glinglin'
} else if (d > 0){
let resu = ''
let y = d % 12
let 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 = 0
let lastNeg = 0
for (let i = 0; i < N; i += 1 ){
sum += resultatNet(i)
if(sum < 0)
lastNeg = i
}
lastNeg += 1
if (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 data
if(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 pid
if (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 data
if (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 pid
if (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"
}