Merge pull request 'seow' (#40) from seow into main

Reviewed-on: #40
main
Subhodip Ghosh 2025-06-26 14:55:12 +00:00
commit 1b4cb0382d
42 changed files with 1829 additions and 181 deletions

2
.gitignore vendored
View File

@ -25,3 +25,5 @@ pnpm-debug.log*
.idea/ .idea/
.vscode/ .vscode/
.env

View File

@ -4,13 +4,13 @@ import tailwind from '@astrojs/tailwind';
import react from '@astrojs/react'; import react from '@astrojs/react';
export default defineConfig({ export default defineConfig({
site: 'https://siliconpin.cs1.hz.siliconpin.com', site: 'https://sp-dev-h1-astgsbchdykdvtf.siliconpin.com',
integrations: [tailwind(), react()], integrations: [tailwind(), react()],
// Vite-specific settings (including proxy) // Vite-specific settings (including proxy)
vite: { vite: {
server: { server: {
allowedHosts: ['siliconpin.cs1.hz.siliconpin.com'], allowedHosts: ['sp-dev-h1-astgsbchdykdvtf.siliconpin.com'],
proxy: { proxy: {
'/api': { '/api': {
target: 'http://localhost:8080', // Your backend server target: 'http://localhost:8080', // Your backend server
@ -21,7 +21,7 @@ export default defineConfig({
} }
}, },
preview: { preview: {
allowedHosts: ['siliconpin.cs1.hz.siliconpin.com'], allowedHosts: ['sp-dev-h1-astgsbchdykdvtf.siliconpin.com'],
} }
}, },

25
edit.js Normal file

File diff suppressed because one or more lines are too long

24
env_sample.txt Normal file
View File

@ -0,0 +1,24 @@
PUBLIC_USER_API_URL=https://host-api-sxashuasysagibx.siliconpin.com/v1/users/
PUBLIC_SERVICE_API_URL=https://host-api-sxashuasysagibx.siliconpin.com/v1/services/
PUBLIC_INVOICE_API_URL=https://host-api-sxashuasysagibx.siliconpin.com/v1/invoice/
PUBLIC_MINIO_UPLOAD_URL=https://hostapi2.cs1.hz.siliconpin.com/api/storage/upload
PUBLIC_HOST_API2_USERS=https://hostapi2.cs1.hz.siliconpin.com/api/users
PUBLIC_TOPIC_API_URL=https://host-api-sxashuasysagibx.siliconpin.com/v1/topics/
PUBLIC_TICKET_API_URL=https://host-api-sxashuasysagibx.siliconpin.com/v1/ticket/index.php
PUBLIC_HETZNER_API_KEY=uMSBR9nxdtbuvazsVM8YMMDd0PvuynpgJbmzFIO47HblMlh7tlHT8wV05sQ28Squ
PUBLIC_UTHO_API_KEY=IoNXhkRJsQPyOEqFMceSfzuKaDLrpxUCATgZjiVdvYlBHbwWmGtn
PUBLIC_DIGITALOCEAN_API_KEY=dop_v1_b6a075ece5786faf7c58d21761dbf95d47af372da062d68a870ce2a0bae51adf
PUBLIC_POCKETBASE_URL=https://tst-pb.s38.siliconpin.com
ENV_TYPE=DEV

View File

@ -0,0 +1,59 @@
const fs = require('fs');
const path = require('path');
const buildDir = path.join(__dirname, 'dist');
// Basic HTML entity decode
function decodeHtmlEntities(str) {
return str
.replace(/&#(\d+);/g, (_, dec) => String.fromCharCode(dec))
.replace(/"/g, '"')
.replace(/'/g, "'")
.replace(/&/g, '&')
.replace(/&lt;/g, '<')
.replace(/&gt;/g, '>');
}
// Decode both URI and HTML entities inside <?php ... ?>
function decodePhpBlocks(content) {
return content.replace(/<\?php([\s\S]*?)\?>/g, (match, code) => {
try {
let decoded = decodeURIComponent(code); // %XX to characters
decoded = decodeHtmlEntities(decoded); // &#39; to '
return `<?php${decoded}?>`;
} catch (e) {
console.warn('⚠️ Decode failed for block:', code.trim().slice(0, 50), '...');
return match;
}
});
}
function fixPhpTagsInFile(filePath) {
let content = fs.readFileSync(filePath, 'utf-8');
// Step 1: Replace escaped tags
content = content
.replace(/&lt;\?php/g, '<?php')
.replace(/\?&gt;/g, '?>');
// Step 2: Decode content inside <?php ... ?>
content = decodePhpBlocks(content);
fs.writeFileSync(filePath, content, 'utf-8');
console.log(`✅ Processed: ${filePath}`);
}
function walkDir(dir) {
const entries = fs.readdirSync(dir, { withFileTypes: true });
for (const entry of entries) {
const fullPath = path.join(dir, entry.name);
if (entry.isDirectory()) {
walkDir(fullPath);
} else if (fullPath.endsWith('.html') || fullPath.endsWith('.php')) {
fixPhpTagsInFile(fullPath);
}
}
}
walkDir(buildDir);
console.log('🎉 All PHP tag fixes, URL decodes, and HTML entity decodes complete.');

673
package-lock.json generated
View File

@ -41,6 +41,7 @@
"react-simplemde-editor": "^5.2.0", "react-simplemde-editor": "^5.2.0",
"react-to-print": "^3.0.5", "react-to-print": "^3.0.5",
"rehype-rewrite": "^4.0.2", "rehype-rewrite": "^4.0.2",
"serve": "^14.2.4",
"shadcn": "^2.5.0", "shadcn": "^2.5.0",
"simplemde": "^1.11.2", "simplemde": "^1.11.2",
"tailwind-merge": "^3.0.2", "tailwind-merge": "^3.0.2",
@ -4502,6 +4503,12 @@
"vite": "^4.2.0 || ^5.0.0 || ^6.0.0" "vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
} }
}, },
"node_modules/@zeit/schemas": {
"version": "2.36.0",
"resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz",
"integrity": "sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==",
"license": "MIT"
},
"node_modules/@zxing/text-encoding": { "node_modules/@zxing/text-encoding": {
"version": "0.9.0", "version": "0.9.0",
"resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz",
@ -4515,6 +4522,19 @@
"integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==", "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/accepts": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
"license": "MIT",
"dependencies": {
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/acorn": { "node_modules/acorn": {
"version": "8.14.1", "version": "8.14.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
@ -4551,6 +4571,22 @@
"node": ">= 14" "node": ">= 14"
} }
}, },
"node_modules/ajv": {
"version": "8.12.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/ansi-align": { "node_modules/ansi-align": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
@ -4683,6 +4719,26 @@
"url": "https://github.com/sponsors/jonschlinkert" "url": "https://github.com/sponsors/jonschlinkert"
} }
}, },
"node_modules/arch": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
"integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/arg": { "node_modules/arg": {
"version": "5.0.2", "version": "5.0.2",
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
@ -5209,6 +5265,15 @@
"node": ">=8.0.0" "node": ">=8.0.0"
} }
}, },
"node_modules/bytes": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
"integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/cacheable-lookup": { "node_modules/cacheable-lookup": {
"version": "5.0.4", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
@ -5386,6 +5451,52 @@
"url": "https://github.com/chalk/chalk?sponsor=1" "url": "https://github.com/chalk/chalk?sponsor=1"
} }
}, },
"node_modules/chalk-template": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz",
"integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==",
"license": "MIT",
"dependencies": {
"chalk": "^4.1.2"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/chalk-template?sponsor=1"
}
},
"node_modules/chalk-template/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/chalk-template/node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/character-entities-html4": { "node_modules/character-entities-html4": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
@ -5527,6 +5638,139 @@
"node": ">= 12" "node": ">= 12"
} }
}, },
"node_modules/clipboardy": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz",
"integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==",
"license": "MIT",
"dependencies": {
"arch": "^2.2.0",
"execa": "^5.1.1",
"is-wsl": "^2.2.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/clipboardy/node_modules/execa": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
"integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
"license": "MIT",
"dependencies": {
"cross-spawn": "^7.0.3",
"get-stream": "^6.0.0",
"human-signals": "^2.1.0",
"is-stream": "^2.0.0",
"merge-stream": "^2.0.0",
"npm-run-path": "^4.0.1",
"onetime": "^5.1.2",
"signal-exit": "^3.0.3",
"strip-final-newline": "^2.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
"node_modules/clipboardy/node_modules/human-signals": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
"integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
"license": "Apache-2.0",
"engines": {
"node": ">=10.17.0"
}
},
"node_modules/clipboardy/node_modules/is-docker": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
"license": "MIT",
"bin": {
"is-docker": "cli.js"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/clipboardy/node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"license": "MIT",
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/clipboardy/node_modules/is-wsl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
"license": "MIT",
"dependencies": {
"is-docker": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/clipboardy/node_modules/mimic-fn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/clipboardy/node_modules/npm-run-path": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
"integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
"license": "MIT",
"dependencies": {
"path-key": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/clipboardy/node_modules/onetime": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
"license": "MIT",
"dependencies": {
"mimic-fn": "^2.1.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/clipboardy/node_modules/strip-final-newline": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
"integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/cliui": { "node_modules/cliui": {
"version": "8.0.1", "version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
@ -5742,6 +5986,72 @@
"integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==",
"license": "ISC" "license": "ISC"
}, },
"node_modules/compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
"integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
"license": "MIT",
"dependencies": {
"mime-db": ">= 1.43.0 < 2"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/compression": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
"integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
"license": "MIT",
"dependencies": {
"accepts": "~1.3.5",
"bytes": "3.0.0",
"compressible": "~2.0.16",
"debug": "2.6.9",
"on-headers": "~1.0.2",
"safe-buffer": "5.1.2",
"vary": "~1.1.2"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/compression/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/compression/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"license": "MIT"
},
"node_modules/compression/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"license": "MIT"
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"license": "MIT"
},
"node_modules/content-disposition": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
"integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/convert-source-map": { "node_modules/convert-source-map": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@ -5961,6 +6271,15 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"license": "MIT",
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/deepmerge": { "node_modules/deepmerge": {
"version": "4.3.1", "version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
@ -7081,6 +7400,15 @@
"uncrypto": "^0.1.3" "uncrypto": "^0.1.3"
} }
}, },
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/has-property-descriptors": { "node_modules/has-property-descriptors": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
@ -7808,6 +8136,12 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC" "license": "ISC"
}, },
"node_modules/ini": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"license": "ISC"
},
"node_modules/inline-style-parser": { "node_modules/inline-style-parser": {
"version": "0.2.4", "version": "0.2.4",
"resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz",
@ -8092,6 +8426,18 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/is-port-reachable": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz",
"integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==",
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-regex": { "node_modules/is-regex": {
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
@ -8273,6 +8619,12 @@
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"license": "MIT"
},
"node_modules/json-stringify-safe": { "node_modules/json-stringify-safe": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
@ -13069,6 +13421,15 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
} }
}, },
"node_modules/negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/neotraverse": { "node_modules/neotraverse": {
"version": "0.6.18", "version": "0.6.18",
"resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz",
@ -13270,6 +13631,15 @@
"ufo": "^1.5.4" "ufo": "^1.5.4"
} }
}, },
"node_modules/on-headers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/once": { "node_modules/once": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@ -13509,6 +13879,12 @@
"integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/path-is-inside": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
"integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==",
"license": "(WTFPL OR MIT)"
},
"node_modules/path-key": { "node_modules/path-key": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@ -13940,6 +14316,30 @@
"integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/range-parser": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
"integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
"dependencies": {
"deep-extend": "^0.6.0",
"ini": "~1.3.0",
"minimist": "^1.2.0",
"strip-json-comments": "~2.0.1"
},
"bin": {
"rc": "cli.js"
}
},
"node_modules/react": { "node_modules/react": {
"version": "19.0.0", "version": "19.0.0",
"resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz",
@ -14360,6 +14760,28 @@
"integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/registry-auth-token": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
"integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
"license": "MIT",
"dependencies": {
"rc": "^1.1.6",
"safe-buffer": "^5.0.1"
}
},
"node_modules/registry-url": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
"integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==",
"license": "MIT",
"dependencies": {
"rc": "^1.0.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/rehype": { "node_modules/rehype": {
"version": "12.0.1", "version": "12.0.1",
"resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.1.tgz", "resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.1.tgz",
@ -16309,6 +16731,208 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/serve": {
"version": "14.2.4",
"resolved": "https://registry.npmjs.org/serve/-/serve-14.2.4.tgz",
"integrity": "sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==",
"license": "MIT",
"dependencies": {
"@zeit/schemas": "2.36.0",
"ajv": "8.12.0",
"arg": "5.0.2",
"boxen": "7.0.0",
"chalk": "5.0.1",
"chalk-template": "0.4.0",
"clipboardy": "3.0.0",
"compression": "1.7.4",
"is-port-reachable": "4.0.0",
"serve-handler": "6.1.6",
"update-check": "1.5.4"
},
"bin": {
"serve": "build/main.js"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/serve-handler": {
"version": "6.1.6",
"resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz",
"integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==",
"license": "MIT",
"dependencies": {
"bytes": "3.0.0",
"content-disposition": "0.5.2",
"mime-types": "2.1.18",
"minimatch": "3.1.2",
"path-is-inside": "1.0.2",
"path-to-regexp": "3.3.0",
"range-parser": "1.2.0"
}
},
"node_modules/serve-handler/node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/serve-handler/node_modules/mime-db": {
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
"integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/serve-handler/node_modules/mime-types": {
"version": "2.1.18",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
"integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
"license": "MIT",
"dependencies": {
"mime-db": "~1.33.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/serve-handler/node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/serve-handler/node_modules/path-to-regexp": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz",
"integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==",
"license": "MIT"
},
"node_modules/serve/node_modules/boxen": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz",
"integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==",
"license": "MIT",
"dependencies": {
"ansi-align": "^3.0.1",
"camelcase": "^7.0.0",
"chalk": "^5.0.1",
"cli-boxes": "^3.0.0",
"string-width": "^5.1.2",
"type-fest": "^2.13.0",
"widest-line": "^4.0.1",
"wrap-ansi": "^8.0.1"
},
"engines": {
"node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/serve/node_modules/camelcase": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz",
"integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==",
"license": "MIT",
"engines": {
"node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/serve/node_modules/chalk": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz",
"integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==",
"license": "MIT",
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/serve/node_modules/emoji-regex": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"license": "MIT"
},
"node_modules/serve/node_modules/string-width": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
"license": "MIT",
"dependencies": {
"eastasianwidth": "^0.2.0",
"emoji-regex": "^9.2.2",
"strip-ansi": "^7.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/serve/node_modules/type-fest": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
"integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=12.20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/serve/node_modules/widest-line": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz",
"integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==",
"license": "MIT",
"dependencies": {
"string-width": "^5.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/serve/node_modules/wrap-ansi": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^6.1.0",
"string-width": "^5.0.1",
"strip-ansi": "^7.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/set-cookie-parser": { "node_modules/set-cookie-parser": {
"version": "2.7.1", "version": "2.7.1",
"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
@ -16768,6 +17392,15 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/strnum": { "node_modules/strnum": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz",
@ -16842,6 +17475,18 @@
"node": ">= 8.0" "node": ">= 8.0"
} }
}, },
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/supports-preserve-symlinks-flag": { "node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
@ -17621,6 +18266,25 @@
"browserslist": ">= 4.21.0" "browserslist": ">= 4.21.0"
} }
}, },
"node_modules/update-check": {
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz",
"integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==",
"license": "MIT",
"dependencies": {
"registry-auth-token": "3.3.2",
"registry-url": "3.1.0"
}
},
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"license": "BSD-2-Clause",
"dependencies": {
"punycode": "^2.1.0"
}
},
"node_modules/url-parse": { "node_modules/url-parse": {
"version": "1.5.10", "version": "1.5.10",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
@ -17711,6 +18375,15 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/vfile": { "node_modules/vfile": {
"version": "6.0.3", "version": "6.0.3",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",

View File

@ -7,7 +7,7 @@
"build": "astro build", "build": "astro build",
"preview": "astro preview --port 4000", "preview": "astro preview --port 4000",
"astro": "astro", "astro": "astro",
"push-prod": "rsync -rv --exclude .hta_config/conf.php dist/ u2@siliconpin.com:~/web/siliconpin.com/public_html/", "push-prod": "rsync -rv --exclude .hta_config/conf.php dist/ sp@siliconpin.com:~/web/siliconpin.com/public_html/",
"proxy": "http://localhost:8080" "proxy": "http://localhost:8080"
}, },
"dependencies": { "dependencies": {
@ -44,6 +44,7 @@
"react-simplemde-editor": "^5.2.0", "react-simplemde-editor": "^5.2.0",
"react-to-print": "^3.0.5", "react-to-print": "^3.0.5",
"rehype-rewrite": "^4.0.2", "rehype-rewrite": "^4.0.2",
"serve": "^14.2.4",
"shadcn": "^2.5.0", "shadcn": "^2.5.0",
"simplemde": "^1.11.2", "simplemde": "^1.11.2",
"tailwind-merge": "^3.0.2", "tailwind-merge": "^3.0.2",

View File

@ -5,8 +5,9 @@ import { Label } from "./ui/label";
import { X } from "lucide-react"; import { X } from "lucide-react";
import PocketBase from 'pocketbase'; import PocketBase from 'pocketbase';
const pb = new PocketBase('https://tst-pb.s38.siliconpin.com'); const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
const INVOICE_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/users/'; const PUBLIC_POCKETBASE_URL = import.meta.env.PUBLIC_POCKETBASE_URL;
const pb = new PocketBase(PUBLIC_POCKETBASE_URL);
export function AvatarUpload({ userId }: { userId: string }) { export function AvatarUpload({ userId }: { userId: string }) {
const [selectedFile, setSelectedFile] = useState<File | null>(null); const [selectedFile, setSelectedFile] = useState<File | null>(null);
@ -45,7 +46,7 @@ export function AvatarUpload({ userId }: { userId: string }) {
}); });
// 2. Update PHP backend session // 2. Update PHP backend session
const response = await fetch(`${INVOICE_API_URL}?query=login`, { const response = await fetch(`${PUBLIC_USER_API_URL}?query=login`, {
method: 'POST', method: 'POST',
credentials: 'include', // Important for sessions to work credentials: 'include', // Important for sessions to work
headers: { headers: {

View File

@ -8,6 +8,7 @@ import { Button } from "./ui/button";
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "./ui/dialog"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "./ui/dialog";
import * as XLSX from 'xlsx'; import * as XLSX from 'xlsx';
export default function UserBillingList() { export default function UserBillingList() {
const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
const { isLoggedIn, loading, error, sessionData } = useIsLoggedIn(); const { isLoggedIn, loading, error, sessionData } = useIsLoggedIn();
const [billingData, setBillingData] = useState([]); const [billingData, setBillingData] = useState([]);
const [dataLoading, setDataLoading] = useState(true); const [dataLoading, setDataLoading] = useState(true);
@ -27,7 +28,6 @@ export default function UserBillingList() {
const [currentPage, setCurrentPage] = useState(1); const [currentPage, setCurrentPage] = useState(1);
const [itemsPerPage] = useState(20); const [itemsPerPage] = useState(20);
const INVOICE_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/users/';
useEffect(() => { useEffect(() => {
if (isLoggedIn) { if (isLoggedIn) {
@ -38,7 +38,7 @@ export default function UserBillingList() {
const fetchBillingData = async () => { const fetchBillingData = async () => {
try { try {
const res = await fetch(`${INVOICE_API_URL}?query=invoice-info`, { const res = await fetch(`${PUBLIC_USER_API_URL}?query=invoice-info`, {
method: 'GET', method: 'GET',
credentials: 'include', credentials: 'include',
headers: { headers: {

View File

@ -3,11 +3,9 @@ import { Button } from '../ui/button';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card";
import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from "../ui/select"; import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from "../ui/select";
import { Loader2 } from "lucide-react"; import { Loader2 } from "lucide-react";
const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
export default function BuyVPN() { export default function BuyVPN() {
// API URL - make sure to set this correctly
const USER_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/users/';
// State for VPN configuration // State for VPN configuration
const [vpnContinent, setVpnContinent] = useState(""); const [vpnContinent, setVpnContinent] = useState("");
const [selectedCycle, setSelectedCycle] = useState(""); const [selectedCycle, setSelectedCycle] = useState("");
@ -51,7 +49,7 @@ export default function BuyVPN() {
formData.append('amount', selectedPrice.toString()); formData.append('amount', selectedPrice.toString());
formData.append('vpn_continent', vpnContinent); formData.append('vpn_continent', vpnContinent);
formData.append('service_type', 'vpn'); formData.append('service_type', 'vpn');
const response = await fetch(`${USER_API_URL}?query=initiate_payment`, { const response = await fetch(`${PUBLIC_USER_API_URL}?query=initiate_payment`, {
method: 'POST', method: 'POST',
body: formData, // Using FormData instead of JSON body: formData, // Using FormData instead of JSON
credentials: 'include' credentials: 'include'

View File

@ -8,6 +8,7 @@ import { Loader2 } from "lucide-react";
import { useToast } from "../ui/toast"; import { useToast } from "../ui/toast";
export default function NewDroplet() { export default function NewDroplet() {
const PUBLIC_DIGITALOCEAN_API_KEY = import.meta.env.PUBLIC_DIGITALOCEAN_API_KEY;
const { showToast } = useToast(); const { showToast } = useToast();
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const [formData, setFormData] = useState({ const [formData, setFormData] = useState({
@ -63,7 +64,7 @@ export default function NewDroplet() {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"Authorization": "Bearer dop_v1_b6a075ece5786faf7c58d21761dbf95d47af372da062d68a870ce2a0bae51adf" "Authorization": `Bearer ${PUBLIC_DIGITALOCEAN_API_KEY}`
}, },
body: JSON.stringify({ body: JSON.stringify({
...formData, ...formData,

View File

@ -19,7 +19,7 @@ export default function NewHetznerInstance() {
const [images, setImages] = useState([]); const [images, setImages] = useState([]);
const [sshKeys, setSshKeys] = useState([]); const [sshKeys, setSshKeys] = useState([]);
const [showAddSshKey, setShowAddSshKey] = useState(false); const [showAddSshKey, setShowAddSshKey] = useState(false);
const HETZNER_API_KEY = "uMSBR9nxdtbuvazsVM8YMMDd0PvuynpgJbmzFIO47HblMlh7tlHT8wV05sQ28Squ"; // Replace with your actual API key const PUBLIC_HETZNER_API_KEY = import.meta.env.PUBLIC_HETZNER_API_KEY;
const [formData, setFormData] = useState({ const [formData, setFormData] = useState({
name: "", name: "",
@ -38,16 +38,16 @@ export default function NewHetznerInstance() {
// Fetch all required data in parallel // Fetch all required data in parallel
const [serverTypesResponse, locationsResponse, imagesResponse, sshKeysResponse] = await Promise.all([ const [serverTypesResponse, locationsResponse, imagesResponse, sshKeysResponse] = await Promise.all([
fetch("https://api.hetzner.cloud/v1/server_types", { fetch("https://api.hetzner.cloud/v1/server_types", {
headers: { "Authorization": `Bearer ${HETZNER_API_KEY}` } headers: { "Authorization": `Bearer ${PUBLIC_HETZNER_API_KEY}` }
}), }),
fetch("https://api.hetzner.cloud/v1/locations", { fetch("https://api.hetzner.cloud/v1/locations", {
headers: { "Authorization": `Bearer ${HETZNER_API_KEY}` } headers: { "Authorization": `Bearer ${PUBLIC_HETZNER_API_KEY}` }
}), }),
fetch("https://api.hetzner.cloud/v1/images", { fetch("https://api.hetzner.cloud/v1/images", {
headers: { "Authorization": `Bearer ${HETZNER_API_KEY}` } headers: { "Authorization": `Bearer ${PUBLIC_HETZNER_API_KEY}` }
}), }),
fetch("https://api.hetzner.cloud/v1/ssh_keys", { fetch("https://api.hetzner.cloud/v1/ssh_keys", {
headers: { "Authorization": `Bearer ${HETZNER_API_KEY}` } headers: { "Authorization": `Bearer ${PUBLIC_HETZNER_API_KEY}` }
}) })
]); ]);
@ -97,7 +97,7 @@ export default function NewHetznerInstance() {
const response = await fetch("https://api.hetzner.cloud/v1/servers", { const response = await fetch("https://api.hetzner.cloud/v1/servers", {
method: "POST", method: "POST",
headers: { headers: {
"Authorization": `Bearer ${HETZNER_API_KEY}`, "Authorization": `Bearer ${PUBLIC_HETZNER_API_KEY}`,
"Content-Type": "application/json" "Content-Type": "application/json"
}, },
body: JSON.stringify(payload) body: JSON.stringify(payload)
@ -149,7 +149,7 @@ export default function NewHetznerInstance() {
const response = await fetch('https://api.hetzner.cloud/v1/ssh_keys', { const response = await fetch('https://api.hetzner.cloud/v1/ssh_keys', {
method: "POST", method: "POST",
headers: { headers: {
"Authorization": `Bearer ${HETZNER_API_KEY}`, "Authorization": `Bearer ${PUBLIC_HETZNER_API_KEY}`,
"Content-Type": "application/json" "Content-Type": "application/json"
}, },
body: JSON.stringify({ body: JSON.stringify({
@ -163,7 +163,7 @@ export default function NewHetznerInstance() {
if (data.ssh_key) { if (data.ssh_key) {
// Refresh SSH keys list // Refresh SSH keys list
const sshResponse = await fetch("https://api.hetzner.cloud/v1/ssh_keys", { const sshResponse = await fetch("https://api.hetzner.cloud/v1/ssh_keys", {
headers: { "Authorization": `Bearer ${HETZNER_API_KEY}` } headers: { "Authorization": `Bearer ${PUBLIC_HETZNER_API_KEY}` }
}); });
const sshData = await sshResponse.json(); const sshData = await sshResponse.json();
setSshKeys(sshData.ssh_keys || []); setSshKeys(sshData.ssh_keys || []);

View File

@ -15,7 +15,7 @@ export default function NewKubernetesService() {
const [plans, setPlans] = useState([]); const [plans, setPlans] = useState([]);
const [vpcs, setVpcs] = useState([]); const [vpcs, setVpcs] = useState([]);
const [subnets, setSubnets] = useState([]); const [subnets, setSubnets] = useState([]);
const UTHO_API_KEY = "Bearer IoNXhkRJsQPyOEqFMceSfzuKaDLrpxUCATgZjiVdvYlBHbwWmGtn"; const PUBLIC_UTHO_API_KEY = import.meta.env.PUBLIC_UTHO_API_KEY;
const [formData, setFormData] = useState({ const [formData, setFormData] = useState({
dcslug: "innoida", dcslug: "innoida",
@ -41,13 +41,13 @@ export default function NewKubernetesService() {
const [plansResponse, vpcsResponse] = await Promise.all([ const [plansResponse, vpcsResponse] = await Promise.all([
fetch("https://api.utho.com/v2/plans", { fetch("https://api.utho.com/v2/plans", {
headers: { headers: {
"Authorization": UTHO_API_KEY, "Authorization": `Bearer ${PUBLIC_UTHO_API_KEY}`,
"Content-Type": "application/json" "Content-Type": "application/json"
} }
}), }),
fetch("https://api.utho.com/v2/vpc", { fetch("https://api.utho.com/v2/vpc", {
headers: { headers: {
"Authorization": UTHO_API_KEY, "Authorization": `Bearer ${PUBLIC_UTHO_API_KEY}`,
"Content-Type": "application/json" "Content-Type": "application/json"
} }
}) })
@ -100,7 +100,7 @@ export default function NewKubernetesService() {
// If no subnets in VPC data, try the subnets endpoint // If no subnets in VPC data, try the subnets endpoint
const response = await fetch(`https://api.utho.com/v2/vpc/${vpcId}/subnets`, { const response = await fetch(`https://api.utho.com/v2/vpc/${vpcId}/subnets`, {
headers: { headers: {
"Authorization": UTHO_API_KEY, "Authorization": `Bearer ${PUBLIC_UTHO_API_KEY}`,
"Content-Type": "application/json" "Content-Type": "application/json"
} }
}); });
@ -161,7 +161,7 @@ export default function NewKubernetesService() {
const response = await fetch("https://api.utho.com/v2/kubernetes/deploy", { const response = await fetch("https://api.utho.com/v2/kubernetes/deploy", {
method: "POST", method: "POST",
headers: { headers: {
"Authorization": UTHO_API_KEY, "Authorization": `Bearer ${PUBLIC_UTHO_API_KEY}`,
"Content-Type": "application/json" "Content-Type": "application/json"
}, },
body: JSON.stringify(payload) body: JSON.stringify(payload)

View File

@ -11,13 +11,13 @@ import { Textarea } from "../ui/textarea";
import { Switch } from "../ui/switch"; import { Switch } from "../ui/switch";
export default function NewCloudInstance() { export default function NewCloudInstance() {
const PUBLIC_UTHO_API_KEY = import.meta.env.PUBLIC_UTHO_API_KEY;
const { showToast } = useToast(); const { showToast } = useToast();
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const [isFetchingData, setIsFetchingData] = useState(true); const [isFetchingData, setIsFetchingData] = useState(true);
const [plans, setPlans] = useState([]); const [plans, setPlans] = useState([]);
const [sshKeys, setSshKeys] = useState([]); const [sshKeys, setSshKeys] = useState([]);
const [showAddSshKey, setShowAddSshKey] = useState(false); const [showAddSshKey, setShowAddSshKey] = useState(false);
const UTHO_API_KEY = "Bearer IoNXhkRJsQPyOEqFMceSfzuKaDLrpxUCATgZjiVdvYlBHbwWmGtn";
const [formData, setFormData] = useState({ const [formData, setFormData] = useState({
dcslug: "inmumbaizone2", dcslug: "inmumbaizone2",
@ -39,10 +39,10 @@ export default function NewCloudInstance() {
// Fetch plans and SSH keys in parallel // Fetch plans and SSH keys in parallel
const [plansResponse, sshResponse] = await Promise.all([ const [plansResponse, sshResponse] = await Promise.all([
fetch("https://api.utho.com/v2/plans", { fetch("https://api.utho.com/v2/plans", {
headers: { "Authorization": UTHO_API_KEY } headers: { "Authorization": `Bearer ${PUBLIC_UTHO_API_KEY}` }
}), }),
fetch("https://api.utho.com/v2/key", { fetch("https://api.utho.com/v2/key", {
headers: { "Authorization": UTHO_API_KEY } headers: { "Authorization": `Bearer ${PUBLIC_UTHO_API_KEY}` }
}) })
]); ]);
@ -92,7 +92,7 @@ export default function NewCloudInstance() {
const response = await fetch("https://api.utho.com/v2/cloud/deploy", { const response = await fetch("https://api.utho.com/v2/cloud/deploy", {
method: "POST", method: "POST",
headers: { headers: {
"Authorization": UTHO_API_KEY, "Authorization": `Bearer ${PUBLIC_UTHO_API_KEY}`,
"Content-Type": "application/json" "Content-Type": "application/json"
}, },
body: JSON.stringify(payload) body: JSON.stringify(payload)
@ -139,7 +139,7 @@ export default function NewCloudInstance() {
const response = await fetch('https://api.utho.com/v2/key/import', { const response = await fetch('https://api.utho.com/v2/key/import', {
method: "POST", method: "POST",
headers: { headers: {
"Authorization": UTHO_API_KEY, "Authorization": `Bearer ${PUBLIC_UTHO_API_KEY}`,
"Content-Type": "application/json" "Content-Type": "application/json"
}, },
body: JSON.stringify({ body: JSON.stringify({
@ -153,7 +153,7 @@ export default function NewCloudInstance() {
if (data.status === 'success') { if (data.status === 'success') {
// Refresh SSH keys list // Refresh SSH keys list
const sshResponse = await fetch("https://api.utho.com/v2/key", { const sshResponse = await fetch("https://api.utho.com/v2/key", {
headers: { "Authorization": UTHO_API_KEY } headers: { "Authorization": `Bearer ${PUBLIC_UTHO_API_KEY}` }
}); });
const sshData = await sshResponse.json(); const sshData = await sshResponse.json();
setSshKeys(sshData.key || []); setSshKeys(sshData.key || []);

View File

@ -10,7 +10,7 @@ const PRICE_CONFIG = [
{purchaseType: 'bulk', price: 1000, minute: 10000} {purchaseType: 'bulk', price: 1000, minute: 10000}
]; ];
export default function STTStreaming(){ export default function STTStreaming(){
const USER_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/users/'; const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
const [purchaseType, setPurchaseType] = useState(); const [purchaseType, setPurchaseType] = useState();
const [amount, setAmount] = useState(); const [amount, setAmount] = useState();
const [dataError, setDataError] = useState(); const [dataError, setDataError] = useState();
@ -38,7 +38,7 @@ export default function STTStreaming(){
formData.append('cycle', 'monthly'); formData.append('cycle', 'monthly');
formData.append('amount', amount.toString()); formData.append('amount', amount.toString());
formData.append('service_type', 'streaming_api'); formData.append('service_type', 'streaming_api');
const response = await fetch(`${USER_API_URL}?query=initiate_payment`, { const response = await fetch(`${PUBLIC_USER_API_URL}?query=initiate_payment`, {
method: 'POST', method: 'POST',
body: formData, // Using FormData instead of JSON body: formData, // Using FormData instead of JSON
credentials: 'include' credentials: 'include'

View File

@ -1,14 +1,14 @@
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import MDEditor, { commands } from '@uiw/react-md-editor'; import MDEditor, { commands } from '@uiw/react-md-editor';
import { Card } from "./ui/card"; import { Card } from "./ui/card";
import { Label } from "./ui/label"; import { Label } from "./ui/label";
import { Button } from "./ui/button"; import { Button } from "./ui/button";
import { Dialog, DialogContent, DialogHeader, DialogTitle } from "./ui/dialog"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "./ui/dialog";
import { Input } from "./ui/input"; import { Input } from "./ui/input";
import { useIsLoggedIn } from '../lib/isLoggedIn'; import { useIsLoggedIn } from '../lib/isLoggedIn';
const COMMENTS_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/comments/'; const COMMENTS_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/comments/';
const MINIO_UPLOAD_URL = 'https://hostapi2.cs1.hz.siliconpin.com/api/storage/upload'; const PUBLIC_MINIO_UPLOAD_URL = import.meta.env.PUBLIC_MINIO_UPLOAD_URL;
export default function Comment(props) { export default function Comment(props) {
const [comments, setComments] = useState([]); const [comments, setComments] = useState([]);
@ -88,7 +88,7 @@ export default function Comment(props) {
formData.append('api_key', 'wweifwehfwfhwhtuyegbvijvbfvegfreyf'); formData.append('api_key', 'wweifwehfwfhwhtuyegbvijvbfvegfreyf');
try { try {
const response = await fetch(MINIO_UPLOAD_URL, { const response = await fetch(PUBLIC_MINIO_UPLOAD_URL, {
method: 'POST', method: 'POST',
body: formData, body: formData,
credentials: 'include' credentials: 'include'

View File

@ -7,7 +7,8 @@ import { Button } from './ui/button';
export function ContactForm() { export function ContactForm() {
const [formState, setFormState] = useState({ name: '', email: '', company: '', service: '', message: '' }); const [formState, setFormState] = useState({ name: '', email: '', company: '', service: '', message: '' });
const [formStatus, setFormStatus] = useState('idle'); const [formStatus, setFormStatus] = useState('idle');
const USER_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/users/';
const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
const handleInputChange = (e) => { const handleInputChange = (e) => {
const { name, value } = e.target; const { name, value } = e.target;
@ -32,7 +33,7 @@ export function ContactForm() {
message: formState.message message: formState.message
}; };
const response = await fetch(`${USER_API_URL}?query=contact-form`, { const response = await fetch(`${PUBLIC_USER_API_URL}?query=contact-form`, {
method: "POST", method: "POST",
credentials: "include", credentials: "include",
headers: { headers: {

View File

@ -5,8 +5,9 @@ import { Button } from './ui/button';
export const DomainSetupForm = ({ defaultSubdomain }) => { export const DomainSetupForm = ({ defaultSubdomain }) => {
// API URLs // API URLs
const API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/users/';
const SERVICES_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/services/'; const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
const PUBLIC_SERVICE_API_URL = import.meta.env.PUBLIC_SERVICE_API_URL;
// State for deployment options // State for deployment options
const [deploymentType, setDeploymentType] = useState('app'); const [deploymentType, setDeploymentType] = useState('app');
@ -113,7 +114,7 @@ export const DomainSetupForm = ({ defaultSubdomain }) => {
formData.append('cycle', selectedCycle); formData.append('cycle', selectedCycle);
formData.append('amount', selectedPrice.toString()); formData.append('amount', selectedPrice.toString());
const response = await fetch(`${API_URL}?query=initiate_payment`, { const response = await fetch(`${PUBLIC_USER_API_URL}?query=initiate_payment`, {
method: 'POST', method: 'POST',
body: formData, body: formData,
credentials: 'include' credentials: 'include'
@ -166,7 +167,7 @@ export const DomainSetupForm = ({ defaultSubdomain }) => {
setShowDnsConfig(false); setShowDnsConfig(false);
try { try {
const response = await fetch(`${SERVICES_API_URL}?query=validate-domain`, { const response = await fetch(`${PUBLIC_SERVICE_API_URL}?query=validate-domain`, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ domain }) body: JSON.stringify({ domain })
@ -208,7 +209,7 @@ export const DomainSetupForm = ({ defaultSubdomain }) => {
const checkSubDomainCname = useCallback(() => { const checkSubDomainCname = useCallback(() => {
const domainToCheck = customDomain || customSubdomain; const domainToCheck = customDomain || customSubdomain;
fetch(`${SERVICES_API_URL}?query=check-c-name`, { fetch(`${PUBLIC_SERVICE_API_URL}?query=check-c-name`, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: `domain=${encodeURIComponent(domainToCheck)}` body: `domain=${encodeURIComponent(domainToCheck)}`

View File

@ -38,9 +38,8 @@ export const DomainSetupForm = ({ defaultSubdomain }) => {
const [vpnContinent, setVpnContinent] = useState(''); const [vpnContinent, setVpnContinent] = useState('');
const API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/users/'; const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
const SERVICES_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/services/'; const PUBLIC_SERVICE_API_URL = import.meta.env.PUBLIC_SERVICE_API_URL;
// const BILLING_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/users/index.php';
const [selectedcycle, setSelectedcycle] = useState(''); const [selectedcycle, setSelectedcycle] = useState('');
const [selectedPrice, setSelectedPrice] = useState(0); const [selectedPrice, setSelectedPrice] = useState(0);
@ -70,7 +69,7 @@ export const DomainSetupForm = ({ defaultSubdomain }) => {
formData.append('cycle', selectedcycle); formData.append('cycle', selectedcycle);
formData.append('amount', selectedPrice); //selectedPrice formData.append('amount', selectedPrice); //selectedPrice
fetch(`${API_URL}?query=initiate_payment`, { fetch(`${PUBLIC_USER_API_URL}?query=initiate_payment`, {
method: 'POST', method: 'POST',
body: formData, body: formData,
credentials: 'include' credentials: 'include'
@ -105,7 +104,7 @@ export const DomainSetupForm = ({ defaultSubdomain }) => {
formData.append('serviceId', 'vpnservices'); formData.append('serviceId', 'vpnservices');
formData.append('cycle', selectedcycle); formData.append('cycle', selectedcycle);
formData.append('amount', selectedPrice); formData.append('amount', selectedPrice);
fetch(`${API_URL}?query=initiate_payment`, { fetch(`${PUBLIC_USER_API_URL}?query=initiate_payment`, {
method: 'POST', method: 'POST',
body: formData, body: formData,
credentials: 'include' credentials: 'include'
@ -295,7 +294,7 @@ export const DomainSetupForm = ({ defaultSubdomain }) => {
try { try {
// Make API call to validate domain // Make API call to validate domain
const response = await fetch(`${SERVICES_API_URL}?query=validate-domain`, { const response = await fetch(`${PUBLIC_SERVICE_API_URL}?query=validate-domain`, {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
@ -331,7 +330,7 @@ export const DomainSetupForm = ({ defaultSubdomain }) => {
const checkSubDomainCname = () => { const checkSubDomainCname = () => {
const domainToCheck = customDomain || customSubdomain; const domainToCheck = customDomain || customSubdomain;
fetch(`${SERVICES_API_URL}?query=check-c-name`, { fetch(`${PUBLIC_SERVICE_API_URL}?query=check-c-name`, {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',

View File

@ -34,7 +34,11 @@ const LoginPage = () => {
const [status, setStatus] = useState<AuthStatus>({ message: '', isError: false }); const [status, setStatus] = useState<AuthStatus>({ message: '', isError: false });
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const pb = new PocketBase("https://tst-pb.s38.siliconpin.com"); const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
const PUBLIC_HOST_API2_USERS = import.meta.env.PUBLIC_HOST_API2_USERS;
const PUBLIC_POCKETBASE_URL = import.meta.env.PUBLIC_POCKETBASE_URL;
const pb = new PocketBase(PUBLIC_POCKETBASE_URL);
interface AuthResponse { interface AuthResponse {
token: string; token: string;
@ -133,7 +137,7 @@ const LoginPage = () => {
const handleCreateUserInMongo = async (siliconId: string) => { const handleCreateUserInMongo = async (siliconId: string) => {
try { try {
const response = await fetch(`https://hostapi2.cs1.hz.siliconpin.com/api/users`, { const response = await fetch(`${PUBLIC_HOST_API2_USERS}`, {
method: 'POST', method: 'POST',
credentials: 'include', credentials: 'include',
headers: { headers: {
@ -165,7 +169,7 @@ const LoginPage = () => {
const syncSessionWithBackend = async (authData: AuthResponse, avatarUrl: string) => { const syncSessionWithBackend = async (authData: AuthResponse, avatarUrl: string) => {
try { try {
// Step 1: Sync with SiliconPin backend // Step 1: Sync with SiliconPin backend
const response = await fetch('https://host-api-sxashuasysagibx.siliconpin.com/v1/users/?query=login', { const response = await fetch(`${PUBLIC_USER_API_URL}?query=login`, {
method: 'POST', method: 'POST',
credentials: 'include', credentials: 'include',
headers: { headers: {

View File

@ -7,7 +7,9 @@ import { Toast } from './Toast';
import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "./ui/card"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "./ui/card";
import { FileX, Copy, CheckCircle2, AlertCircle, X } from "lucide-react"; import { FileX, Copy, CheckCircle2, AlertCircle, X } from "lucide-react";
import Loader from "./ui/loader"; import Loader from "./ui/loader";
const API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/users/';
const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
export default function MakePayment(){ export default function MakePayment(){
const [initialOrderData, setInitialOrderData] = useState(null); const [initialOrderData, setInitialOrderData] = useState(null);
const [isLoading, setIsLoading] = useState(true); const [isLoading, setIsLoading] = useState(true);
@ -36,7 +38,7 @@ export default function MakePayment(){
const formData = new FormData(); const formData = new FormData();
formData.append('order_id', orderId); formData.append('order_id', orderId);
fetch(`${API_URL}?query=get-initiated_payment`, { fetch(`${PUBLIC_USER_API_URL}?query=get-initiated_payment`, {
method: 'POST', method: 'POST',
body: formData, body: formData,
credentials: 'include' credentials: 'include'
@ -154,7 +156,7 @@ export default function MakePayment(){
const handleSaveUPIPayment = async () => { const handleSaveUPIPayment = async () => {
try { try {
const response = await fetch(`${API_URL}?query=save-upi-payment`, { const response = await fetch(`${PUBLIC_USER_API_URL}?query=save-upi-payment`, {
method: 'POST', method: 'POST',
credentials: 'include', credentials: 'include',
headers: { headers: {

View File

@ -5,7 +5,7 @@ import { ChevronUp, ChevronDown, Eye, Pencil, Trash2, Download, CircleArrowRight
import { Button } from "../../components/ui/button"; import { Button } from "../../components/ui/button";
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "../ui/dialog"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "../ui/dialog";
export default function AllCustomerList() { export default function AllCustomerList() {
const API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/users/'; const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
const { isLoggedIn, loading, error, sessionData } = useIsLoggedIn(); const { isLoggedIn, loading, error, sessionData } = useIsLoggedIn();
const [usersData, setUsersData] = useState([]); const [usersData, setUsersData] = useState([]);
const [dataLoading, setDataLoading] = useState(true); const [dataLoading, setDataLoading] = useState(true);
@ -28,7 +28,7 @@ export default function AllCustomerList() {
const fetchUsersData = async () => { const fetchUsersData = async () => {
setDataLoading(true); setDataLoading(true);
try { try {
const res = await fetch(`${API_URL}?query=get-all-users`, { const res = await fetch(`${PUBLIC_USER_API_URL}?query=get-all-users`, {
method: 'GET', method: 'GET',
credentials: 'include', credentials: 'include',
headers: { headers: {
@ -76,7 +76,7 @@ export default function AllCustomerList() {
const confirmDelete = async () => { const confirmDelete = async () => {
try { try {
const res = await fetch(`${API_URL}${currentUser.id}`, { const res = await fetch(`${PUBLIC_USER_API_URL}${currentUser.id}`, {
method: 'DELETE', method: 'DELETE',
credentials: 'include', credentials: 'include',
headers: { headers: {
@ -96,7 +96,7 @@ export default function AllCustomerList() {
const saveUserChanges = async (updatedUser) => { const saveUserChanges = async (updatedUser) => {
try { try {
const res = await fetch(`${API_URL}${updatedUser.id}`, { const res = await fetch(`${PUBLIC_USER_API_URL}${updatedUser.id}`, {
method: 'PUT', method: 'PUT',
credentials: 'include', credentials: 'include',
headers: { headers: {

View File

@ -37,7 +37,7 @@ export default function AllSellingList() {
const [currentPage, setCurrentPage] = useState(1); const [currentPage, setCurrentPage] = useState(1);
const [itemsPerPage] = useState(10); const [itemsPerPage] = useState(10);
const INVOICE_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/users/'; const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
useEffect(() => { useEffect(() => {
if (isLoggedIn && sessionData?.user_type === 'admin') { if (isLoggedIn && sessionData?.user_type === 'admin') {
@ -49,7 +49,7 @@ export default function AllSellingList() {
const fetchBillingData = async () => { const fetchBillingData = async () => {
try { try {
setDataLoading(true); setDataLoading(true);
const res = await fetch(`${INVOICE_API_URL}?query=all-selling-list`, { const res = await fetch(`${PUBLIC_USER_API_URL}?query=all-selling-list`, {
method: 'GET', method: 'GET',
credentials: 'include', credentials: 'include',
headers: { headers: {
@ -69,7 +69,7 @@ export default function AllSellingList() {
const fetchUsersData = async () => { const fetchUsersData = async () => {
try { try {
const res = await fetch(`${INVOICE_API_URL}?query=get-all-users`, { const res = await fetch(`${PUBLIC_USER_API_URL}?query=get-all-users`, {
method: 'GET', method: 'GET',
credentials: 'include', credentials: 'include',
headers: { headers: {
@ -122,7 +122,7 @@ export default function AllSellingList() {
if (!window.confirm('Are you sure you want to delete this billing record?')) return; if (!window.confirm('Are you sure you want to delete this billing record?')) return;
try { try {
const res = await fetch(`${INVOICE_API_URL}?query=delete-billing&billingId=${billingId}&serviceType=${serviceType}`, { const res = await fetch(`${PUBLIC_USER_API_URL}?query=delete-billing&billingId=${billingId}&serviceType=${serviceType}`, {
method: 'DELETE', method: 'DELETE',
credentials: 'include', credentials: 'include',
headers: { headers: {
@ -150,7 +150,7 @@ export default function AllSellingList() {
const handleSubmit = async (e) => { const handleSubmit = async (e) => {
e.preventDefault(); e.preventDefault();
try { try {
const url = selectedItem ? `${INVOICE_API_URL}?query=update-billing&id=${selectedItem.id}` : `${INVOICE_API_URL}?query=create-billing`; const url = selectedItem ? `${PUBLIC_USER_API_URL}?query=update-billing&id=${selectedItem.id}` : `${PUBLIC_USER_API_URL}?query=create-billing`;
const method = selectedItem ? 'PUT' : 'POST'; const method = selectedItem ? 'PUT' : 'POST';

View File

@ -11,13 +11,13 @@ export default function HetznerServicesList() {
const { showToast } = useToast(); const { showToast } = useToast();
const [isLoading, setIsLoading] = useState(true); const [isLoading, setIsLoading] = useState(true);
const [servers, setServers] = useState([]); const [servers, setServers] = useState([]);
const HETZNER_API_KEY = "uMSBR9nxdtbuvazsVM8YMMDd0PvuynpgJbmzFIO47HblMlh7tlHT8wV05sQ28Squ"; // Replace with your actual API key const PUBLIC_HETZNER_API_KEY = import.meta.env.PUBLIC_HETZNER_API_KEY;
// Define fetchServers outside useEffect so it can be reused // Define fetchServers outside useEffect so it can be reused
const fetchServers = async () => { const fetchServers = async () => {
try { try {
const response = await fetch("https://api.hetzner.cloud/v1/servers", { const response = await fetch("https://api.hetzner.cloud/v1/servers", {
headers: { "Authorization": `Bearer ${HETZNER_API_KEY}` } headers: { "Authorization": `Bearer ${PUBLIC_HETZNER_API_KEY}` }
}); });
const data = await response.json(); const data = await response.json();
setServers(data.servers || []); setServers(data.servers || []);
@ -42,7 +42,7 @@ export default function HetznerServicesList() {
const response = await fetch(`https://api.hetzner.cloud/v1/servers/${serverId}/actions/${action}`, { const response = await fetch(`https://api.hetzner.cloud/v1/servers/${serverId}/actions/${action}`, {
method: "POST", method: "POST",
headers: { headers: {
"Authorization": `Bearer ${HETZNER_API_KEY}`, "Authorization": `Bearer ${PUBLIC_HETZNER_API_KEY}`,
"Content-Type": "application/json" "Content-Type": "application/json"
} }
}); });
@ -77,7 +77,7 @@ export default function HetznerServicesList() {
const response = await fetch(`https://api.hetzner.cloud/v1/servers/${serverId}`, { const response = await fetch(`https://api.hetzner.cloud/v1/servers/${serverId}`, {
method: "DELETE", method: "DELETE",
headers: { headers: {
"Authorization": `Bearer ${HETZNER_API_KEY}`, "Authorization": `Bearer ${PUBLIC_HETZNER_API_KEY}`,
"Content-Type": "application/json" "Content-Type": "application/json"
} }
}); });

View File

@ -19,9 +19,8 @@ export default function ViewAsUser() {
const [dataError, setDataError] = useState(null); const [dataError, setDataError] = useState(null);
const [dialogOpen, setDialogOpen] = useState(false); const [dialogOpen, setDialogOpen] = useState(false);
const [selectedInvoice, setSelectedInvoice] = useState(null); const [selectedInvoice, setSelectedInvoice] = useState(null);
const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
const USER_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/users/';
useEffect(() => { useEffect(() => {
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
const id = urlParams.get('siliconId'); const id = urlParams.get('siliconId');
@ -36,7 +35,7 @@ export default function ViewAsUser() {
try { try {
const response = await fetch( const response = await fetch(
`${USER_API_URL}?query=login-from-admin&siliconId=${id}`, `${PUBLIC_USER_API_URL}?query=login-from-admin&siliconId=${id}`,
{ {
method: 'GET', method: 'GET',
credentials: 'include', credentials: 'include',

View File

@ -5,6 +5,7 @@ import Loader from "./ui/loader";
const topicPageDesc = 'Cutting-edge discussions on tech, digital services, news, and digital freedom. Stay informed on AI, cybersecurity, privacy, and the future of innovation.'; const topicPageDesc = 'Cutting-edge discussions on tech, digital services, news, and digital freedom. Stay informed on AI, cybersecurity, privacy, and the future of innovation.';
export default function TopicCreation(props) { export default function TopicCreation(props) {
const PUBLIC_TOPIC_API_URL = import.meta.env.PUBLIC_TOPIC_API_URL;
const { isLoggedIn, loading: authLoading, error: authError } = useIsLoggedIn(); const { isLoggedIn, loading: authLoading, error: authError } = useIsLoggedIn();
const [topics, setTopics] = useState([]); const [topics, setTopics] = useState([]);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
@ -13,7 +14,7 @@ export default function TopicCreation(props) {
useEffect(() => { useEffect(() => {
const fetchTopics = async () => { const fetchTopics = async () => {
try { try {
const res = await fetch('https://host-api-sxashuasysagibx.siliconpin.com/v1/topics/?query=my-topics', { const res = await fetch(`${PUBLIC_TOPIC_API_URL}?query=my-topics`, {
method: 'GET', method: 'GET',
credentials: 'include', credentials: 'include',
headers: { headers: {

View File

@ -8,8 +8,8 @@ import { Separator } from './ui/separator';
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from './ui/dialog'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from './ui/dialog';
import { CustomTabs } from './ui/tabs'; import { CustomTabs } from './ui/tabs';
const TOPIC_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/topics/'; const PUBLIC_MINIO_UPLOAD_URL = import.meta.env.PUBLIC_MINIO_UPLOAD_URL;
const MINIO_UPLOAD_URL = 'https://hostapi2.cs1.hz.siliconpin.com/api/storage/upload'; const PUBLIC_TOPIC_API_URL = import.meta.env.PUBLIC_TOPIC_API_URL;
const NewTopic = () => { const NewTopic = () => {
@ -34,7 +34,7 @@ const NewTopic = () => {
formData.append('api_key', 'wweifwehfwfhwhtuyegbvijvbfvegfreyf'); formData.append('api_key', 'wweifwehfwfhwhtuyegbvijvbfvegfreyf');
try { try {
const response = await fetch(MINIO_UPLOAD_URL, { const response = await fetch(PUBLIC_MINIO_UPLOAD_URL, {
method: 'POST', method: 'POST',
body: formData, body: formData,
credentials: 'include', credentials: 'include',
@ -185,7 +185,7 @@ const NewTopic = () => {
}; };
// Submit to API // Submit to API
const response = await fetch(`${TOPIC_API_URL}?query=create-new-topic`, { const response = await fetch(`${PUBLIC_TOPIC_API_URL}?query=create-new-topic`, {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',

View File

@ -7,8 +7,9 @@ import { Button } from './ui/button';
import { Separator } from './ui/separator'; import { Separator } from './ui/separator';
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from './ui/dialog'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from './ui/dialog';
import { CustomTabs } from './ui/tabs'; import { CustomTabs } from './ui/tabs';
const TOPIC_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/topics/';
const MINIO_UPLOAD_URL = 'https://hostapi2.cs1.hz.siliconpin.com/api/storage/upload'; const PUBLIC_MINIO_UPLOAD_URL = import.meta.env.PUBLIC_MINIO_UPLOAD_URL;
const PUBLIC_TOPIC_API_URL = import.meta.env.PUBLIC_TOPIC_API_URL;
const NewTopic = () => { const NewTopic = () => {
@ -33,7 +34,7 @@ const NewTopic = () => {
formData.append('api_key', 'wweifwehfwfhwhtuyegbvijvbfvegfreyf'); formData.append('api_key', 'wweifwehfwfhwhtuyegbvijvbfvegfreyf');
try { try {
const response = await fetch(MINIO_UPLOAD_URL, { const response = await fetch(PUBLIC_MINIO_UPLOAD_URL, {
method: 'POST', method: 'POST',
body: formData, body: formData,
credentials: 'include' credentials: 'include'
@ -185,7 +186,7 @@ const NewTopic = () => {
}; };
// Submit to API // Submit to API
const response = await fetch(`${TOPIC_API_URL}?query=create-new-topic`, { const response = await fetch(`${PUBLIC_TOPIC_API_URL}?query=create-new-topic`, {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',

View File

@ -6,7 +6,8 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "./ui/
import { Eye, EyeOff, Loader2 } from "lucide-react"; import { Eye, EyeOff, Loader2 } from "lucide-react";
import { Label } from "./ui/label"; import { Label } from "./ui/label";
// import type { RecordModel } from 'pocketbase'; // import type { RecordModel } from 'pocketbase';
const pb = new PocketBase('https://tst-pb.s38.siliconpin.com'); const PUBLIC_POCKETBASE_URL = import.meta.env.PUBLIC_POCKETBASE_URL;
const pb = new PocketBase(PUBLIC_POCKETBASE_URL);
interface RecordModel { interface RecordModel {
id: string; id: string;

View File

@ -12,9 +12,8 @@ export default function HestiaCredentialsFetcher() {
const [serviceName, setServiceName] = useState(null); const [serviceName, setServiceName] = useState(null);
const [serviceOrderId, setServiceOrderId] = useState(null); const [serviceOrderId, setServiceOrderId] = useState(null);
const [userSiliconId, setUserSiliconId] = useState(); const [userSiliconId, setUserSiliconId] = useState();
const PUBLIC_SERVICE_API_URL = import.meta.env.PUBLIC_SERVICE_API_URL;
const SERVICES_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/services/'; const PUBLIC_HOST_API2_USERS = import.meta.env.PUBLIC_HOST_API2_USERS;
useEffect(() => { useEffect(() => {
const fetchData = async () => { const fetchData = async () => {
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
@ -48,7 +47,7 @@ export default function HestiaCredentialsFetcher() {
status: "active" status: "active"
} }
// console.log('serviceDataPayload', serviceDataPayload) // console.log('serviceDataPayload', serviceDataPayload)
const response = await fetch(`https://hostapi2.cs1.hz.siliconpin.com/api/users/${siliconId}/${query}`, { const response = await fetch(`${PUBLIC_HOST_API2_USERS}/${siliconId}/${query}`, {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
@ -74,7 +73,7 @@ export default function HestiaCredentialsFetcher() {
// Use the passed orderIdParam or fall back to state // Use the passed orderIdParam or fall back to state
const effectiveOrderId = orderIdParam || serviceOrderId; const effectiveOrderId = orderIdParam || serviceOrderId;
const query = serviceToCall === 'vpn' ? 'get-vpn-cred' : 'get-hestia-cred'; const query = serviceToCall === 'vpn' ? 'get-vpn-cred' : 'get-hestia-cred';
const response = await fetch(`${SERVICES_API_URL}?query=${query}&orderId=${effectiveOrderId}`, { const response = await fetch(`${PUBLIC_SERVICE_API_URL}?query=${query}&orderId=${effectiveOrderId}`, {
method: 'GET', method: 'GET',
credentials: 'include', credentials: 'include',
}); });

View File

@ -38,8 +38,10 @@ const SignupPage = () => {
const [confirmPasswordVisible, setConfirmPasswordVisible] = useState(false); const [confirmPasswordVisible, setConfirmPasswordVisible] = useState(false);
const [status, setStatus] = useState<AuthStatus>({ message: '', isError: false }); const [status, setStatus] = useState<AuthStatus>({ message: '', isError: false });
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
const PUBLIC_POCKETBASE_URL = import.meta.env.PUBLIC_POCKETBASE_URL;
const pb = new PocketBase("https://tst-pb.s38.siliconpin.com"); const pb = new PocketBase(PUBLIC_POCKETBASE_URL);
const handleSubmit = async (e: FormEvent) => { const handleSubmit = async (e: FormEvent) => {
e.preventDefault(); e.preventDefault();
@ -135,7 +137,7 @@ const SignupPage = () => {
const syncSessionWithBackend = async (authData: AuthResponse, avatarUrl: string) => { const syncSessionWithBackend = async (authData: AuthResponse, avatarUrl: string) => {
try { try {
const response = await fetch('https://host-api-sxashuasysagibx.siliconpin.com/v1/users/?query=login', { const response = await fetch(`${PUBLIC_USER_API_URL}?query=login`, {
method: 'POST', method: 'POST',
credentials: 'include', credentials: 'include',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },

View File

@ -27,7 +27,7 @@ interface Message {
user_type: string; user_type: string;
} }
const API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/ticket/index.php'; const PUBLIC_TICKET_API_URL = import.meta.env.PUBLIC_TICKET_API_URL;
function Ticketing() { function Ticketing() {
const [tickets, setTickets] = useState<Ticket[]>([]); const [tickets, setTickets] = useState<Ticket[]>([]);
@ -47,7 +47,7 @@ function Ticketing() {
const fetchTickets = async () => { const fetchTickets = async () => {
try { try {
const response = await fetch(`${API_URL}?action=get_tickets&status=${activeTab}`); const response = await fetch(`${PUBLIC_TICKET_API_URL}?action=get_tickets&status=${activeTab}`);
const data = await response.json(); const data = await response.json();
if (data.success) { if (data.success) {
setTickets(data.tickets); setTickets(data.tickets);
@ -59,7 +59,7 @@ function Ticketing() {
const fetchMessages = async (ticketId: number) => { const fetchMessages = async (ticketId: number) => {
try { try {
const response = await fetch(`${API_URL}?action=get_messages&ticket_id=${ticketId}`); const response = await fetch(`${PUBLIC_TICKET_API_URL}?action=get_messages&ticket_id=${ticketId}`);
const data = await response.json(); const data = await response.json();
console.log('Messages response:', data); // Debug log console.log('Messages response:', data); // Debug log
if (data.success) { if (data.success) {
@ -78,7 +78,7 @@ function Ticketing() {
const handleSubmit = async (e: React.FormEvent) => { const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault(); e.preventDefault();
try { try {
const response = await fetch(API_URL, { const response = await fetch(PUBLIC_TICKET_API_URL, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ body: JSON.stringify({
@ -99,7 +99,7 @@ function Ticketing() {
const handleStatusChange = async (ticketId: number, newStatus: 'open' | 'in-progress' | 'resolved' | 'closed') => { const handleStatusChange = async (ticketId: number, newStatus: 'open' | 'in-progress' | 'resolved' | 'closed') => {
try { try {
const response = await fetch(API_URL, { const response = await fetch(PUBLIC_TICKET_API_URL, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ body: JSON.stringify({
@ -124,7 +124,7 @@ function Ticketing() {
if (!selectedTicket || !newMessage.trim()) return; if (!selectedTicket || !newMessage.trim()) return;
try { try {
const response = await fetch(API_URL, { const response = await fetch(PUBLIC_TICKET_API_URL, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ body: JSON.stringify({
@ -146,7 +146,7 @@ function Ticketing() {
const handleDeleteTicket = async (ticketId: number) => { const handleDeleteTicket = async (ticketId: number) => {
try { try {
const response = await fetch(API_URL, { const response = await fetch(PUBLIC_TICKET_API_URL, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ body: JSON.stringify({

View File

@ -1,25 +1,26 @@
import { useState, useRef } from 'react'; import { useState, useRef, useEffect, useCallback, useMemo } from 'react';
import { Button } from '../ui/button'; import { Button } from '../ui/button';
const API_OPTIONS = [ const API_OPTIONS = [
{ {
id: 'whisper', id: 'whisper',
name: 'Whisper CPP', name: 'Whisper (GPU)',
endpoint: 'https://stt-41.siliconpin.com/stt', endpoint: 'https://stt-41.siliconpin.com/stt',
description: 'Fast lightweight speech recognition' description: '2 Req / Min, 10 / Day is free'
}, },
{ {
id: 'vosk', id: 'vosk',
name: 'Vosk CPP', name: 'Vosk (CPU)',
endpoint: 'https://api.vosk.ai/stt', endpoint: 'https://api.vosk.ai/stt',
description: 'Offline speech recognition' description: '10 Req / Min, 100 / Day is free'
}, },
]; ];
const MAX_FILE_SIZE_MB = 5; // 1MB limit const MAX_FILE_SIZE_MB = 5;
const MAX_FILE_SIZE_BYTES = MAX_FILE_SIZE_MB * 1024 * 1024; const MAX_FILE_SIZE_BYTES = MAX_FILE_SIZE_MB * 1024 * 1024;
export default function AudioUploader() { export default function AudioUploader() {
// State management
const [file, setFile] = useState(null); const [file, setFile] = useState(null);
const [status, setStatus] = useState('No file uploaded yet'); const [status, setStatus] = useState('No file uploaded yet');
const [response, setResponse] = useState(null); const [response, setResponse] = useState(null);
@ -27,23 +28,87 @@ export default function AudioUploader() {
const [error, setError] = useState(null); const [error, setError] = useState(null);
const [selectedApi, setSelectedApi] = useState('whisper'); const [selectedApi, setSelectedApi] = useState('whisper');
const [copied, setCopied] = useState(false); const [copied, setCopied] = useState(false);
const fileInputRef = useRef(null); const [debugLogs, setDebugLogs] = useState([]);
const [recordingTime, setRecordingTime] = useState(0);
const [isRecording, setIsRecording] = useState(false);
const [audioBlob, setAudioBlob] = useState(null);
const [audioUrl, setAudioUrl] = useState(null);
const [showDebug, setShowDebug] = useState(false);
const handleFileChange = (e) => { // Refs
const fileInputRef = useRef(null);
const mediaRecorderRef = useRef(null);
const audioChunksRef = useRef([]);
const timerRef = useRef(null);
const audioContextRef = useRef(null);
const analyserRef = useRef(null);
const canvasRef = useRef(null);
const animationRef = useRef(null);
const streamRef = useRef(null);
// Debug logging with useCallback to prevent infinite loops
const addDebugLog = useCallback((message) => {
const timestamp = new Date().toISOString().split('T')[1].split('.')[0];
const logMessage = `${timestamp}: ${message}`;
setDebugLogs(prev => [...prev.slice(-100), logMessage]);
console.debug(logMessage);
}, []);
// Timer effect
useEffect(() => {
if (isRecording) {
timerRef.current = setInterval(() => {
setRecordingTime(prev => prev + 1);
}, 1000);
return () => clearInterval(timerRef.current);
}
}, [isRecording]);
// Clean up on unmount
useEffect(() => {
return () => {
addDebugLog('Component unmounting - cleaning up resources');
stopRecording();
if (animationRef.current) {
cancelAnimationFrame(animationRef.current);
}
if (audioContextRef.current?.state !== 'closed') {
audioContextRef.current?.close().catch(err => {
addDebugLog(`Error closing AudioContext: ${err.message}`);
});
}
clearInterval(timerRef.current);
};
}, [addDebugLog]);
// Handle file change - completely stable implementation
const handleFileChange = useCallback((e) => {
const selectedFile = e.target.files[0]; const selectedFile = e.target.files[0];
if (!selectedFile) { if (!selectedFile) {
setFile(null); setFile(null);
setStatus('No file selected'); setStatus('No file selected');
addDebugLog('No file selected');
return;
}
if (!['audio/wav', 'audio/mpeg', 'audio/ogg', 'audio/webm'].includes(selectedFile.type) &&
!selectedFile.name.match(/\.(wav|mp3|ogg|webm)$/i)) {
const errorMsg = 'Unsupported file format. Please use WAV, MP3, or OGG';
setError(errorMsg);
setStatus('Invalid file type');
setFile(null);
e.target.value = '';
addDebugLog(errorMsg);
return; return;
} }
// Check file size
if (selectedFile.size > MAX_FILE_SIZE_BYTES) { if (selectedFile.size > MAX_FILE_SIZE_BYTES) {
setError(`File size exceeds ${MAX_FILE_SIZE_MB}MB limit`); const errorMsg = `File size exceeds ${MAX_FILE_SIZE_MB}MB limit`;
setError(errorMsg);
setStatus('File too large'); setStatus('File too large');
setFile(null); setFile(null);
// Clear the file input
e.target.value = ''; e.target.value = '';
addDebugLog(errorMsg);
return; return;
} }
@ -51,29 +116,98 @@ export default function AudioUploader() {
setStatus(`File selected: ${selectedFile.name}`); setStatus(`File selected: ${selectedFile.name}`);
setResponse(null); setResponse(null);
setError(null); setError(null);
}; setAudioBlob(null);
setAudioUrl(null);
const handleSubmit = async () => { addDebugLog(`File selected: ${selectedFile.name} (${(selectedFile.size / (1024 * 1024)).toFixed(2)} MB)`);
if (!file) return; }, [addDebugLog]);
// Double check file size before submitting
if (file.size > MAX_FILE_SIZE_BYTES) {
setError(`File size exceeds ${MAX_FILE_SIZE_MB}MB limit`);
setStatus('File too large');
return;
}
setIsLoading(true);
setStatus(`Processing with ${API_OPTIONS.find(api => api.id === selectedApi)?.name}...`);
setError(null);
// Create WAV blob - stable implementation
const createWavBlob = useCallback(async (audioBlob) => {
try { try {
addDebugLog('Starting WAV blob creation');
const arrayBuffer = await audioBlob.arrayBuffer();
const audioContext = new (window.AudioContext || window.webkitAudioContext)({
sampleRate: 16000
});
const decodedData = await audioContext.decodeAudioData(arrayBuffer);
addDebugLog(`Decoded audio data: ${decodedData.length} samples, ${decodedData.numberOfChannels} channels`);
let audioData;
if (decodedData.numberOfChannels > 1) {
audioData = new Float32Array(decodedData.length);
for (let i = 0; i < decodedData.length; i++) {
audioData[i] = (decodedData.getChannelData(0)[i] + decodedData.getChannelData(1)[i]) / 2;
}
addDebugLog('Converted stereo to mono');
} else {
audioData = decodedData.getChannelData(0);
}
const pcmData = new Int16Array(audioData.length);
for (let i = 0; i < audioData.length; i++) {
const s = Math.max(-1, Math.min(1, audioData[i]));
pcmData[i] = s < 0 ? s * 0x8000 : s * 0x7FFF;
}
addDebugLog(`Converted to 16-bit PCM: ${pcmData.length} samples`);
const wavHeader = createWaveHeader(pcmData.length * 2, {
sampleRate: 16000,
numChannels: 1,
bitDepth: 16
});
const wavBlob = new Blob([wavHeader, pcmData], { type: 'audio/wav' });
addDebugLog(`Created WAV blob: ${(wavBlob.size / 1024).toFixed(2)} KB`);
return wavBlob;
} catch (err) {
const errorMsg = `Error creating WAV blob: ${err.message}`;
addDebugLog(errorMsg);
throw new Error('Failed to process audio recording');
}
}, [addDebugLog]);
// Handle submit - stable implementation
const handleSubmit = useCallback(async () => {
let fileToSubmit;
try {
setIsLoading(true);
const apiName = API_OPTIONS.find(api => api.id === selectedApi)?.name;
setStatus(`Processing with ${apiName}...`);
setError(null);
addDebugLog(`Starting submission with ${apiName}`);
if (audioBlob) {
addDebugLog('Processing recorded audio blob');
fileToSubmit = await createWavBlob(audioBlob);
} else if (file) {
addDebugLog('Processing uploaded file');
fileToSubmit = file;
} else {
const errorMsg = 'No audio file selected';
addDebugLog(errorMsg);
throw new Error(errorMsg);
}
if (fileToSubmit.size > MAX_FILE_SIZE_BYTES) {
const errorMsg = `File size exceeds ${MAX_FILE_SIZE_MB}MB limit`;
addDebugLog(errorMsg);
throw new Error(errorMsg);
}
const formData = new FormData(); const formData = new FormData();
formData.append('audio', file); formData.append('audio', fileToSubmit, 'audio.wav');
addDebugLog(`Created FormData with ${(fileToSubmit.size / 1024).toFixed(2)} KB file`);
const apiConfig = API_OPTIONS.find(api => api.id === selectedApi); const apiConfig = API_OPTIONS.find(api => api.id === selectedApi);
if (!apiConfig) throw new Error('Selected API not found'); if (!apiConfig) {
const errorMsg = 'Selected API not found';
addDebugLog(errorMsg);
throw new Error(errorMsg);
}
addDebugLog(`Sending request to ${apiConfig.endpoint}`);
const apiResponse = await fetch(apiConfig.endpoint, { const apiResponse = await fetch(apiConfig.endpoint, {
method: 'POST', method: 'POST',
body: formData, body: formData,
@ -84,41 +218,84 @@ export default function AudioUploader() {
try { try {
const errorData = await apiResponse.json(); const errorData = await apiResponse.json();
errorMessage = errorData.message || errorData.error || errorMessage; errorMessage = errorData.message || errorData.error || errorMessage;
} catch (e) {} } catch (e) {
addDebugLog('Failed to parse error response');
}
addDebugLog(`API error: ${errorMessage}`);
throw new Error(errorMessage); throw new Error(errorMessage);
} }
const result = await apiResponse.json(); const result = await apiResponse.json();
addDebugLog('Received successful response from API');
setResponse({ setResponse({
api: selectedApi, api: selectedApi,
data: result data: result
}); });
setStatus('Processing complete'); setStatus('Processing complete');
} catch (err) { } catch (err) {
setError(err.message.includes('Failed to fetch') const errorMsg = err.message.includes('Failed to fetch')
? 'Network error: Could not connect to the API server' ? 'Network error: Could not connect to the API server'
: err.message); : err.message;
addDebugLog(`Error during submission: ${errorMsg}`);
setError(errorMsg);
setStatus('Processing failed'); setStatus('Processing failed');
setResponse(null); setResponse(null);
} finally { } finally {
setIsLoading(false); setIsLoading(false);
addDebugLog('Submission process completed');
} }
}; }, [selectedApi, audioBlob, file, createWavBlob, addDebugLog]);
const copyToClipboard = (text) => { // Helper functions
const createWaveHeader = useCallback((dataLength, config) => {
const byteRate = config.sampleRate * config.numChannels * (config.bitDepth / 8);
const blockAlign = config.numChannels * (config.bitDepth / 8);
const buffer = new ArrayBuffer(44);
const view = new DataView(buffer);
writeString(view, 0, 'RIFF');
view.setUint32(4, 36 + dataLength, true);
writeString(view, 8, 'WAVE');
writeString(view, 12, 'fmt ');
view.setUint32(16, 16, true);
view.setUint16(20, 1, true);
view.setUint16(22, config.numChannels, true);
view.setUint32(24, config.sampleRate, true);
view.setUint32(28, byteRate, true);
view.setUint16(32, blockAlign, true);
view.setUint16(34, config.bitDepth, true);
writeString(view, 36, 'data');
view.setUint32(40, dataLength, true);
return new Uint8Array(buffer);
}, []);
const writeString = useCallback((view, offset, string) => {
for (let i = 0; i < string.length; i++) {
view.setUint8(offset + i, string.charCodeAt(i));
}
}, []);
const copyToClipboard = useCallback((text) => {
navigator.clipboard.writeText(text).then(() => { navigator.clipboard.writeText(text).then(() => {
setCopied(true); setCopied(true);
setTimeout(() => setCopied(false), 2000); setTimeout(() => setCopied(false), 2000);
addDebugLog('Text copied to clipboard');
}).catch(err => { }).catch(err => {
console.error('Copy failed:', err); const errorMsg = 'Failed to copy text to clipboard';
setError('Failed to copy text to clipboard'); addDebugLog(`${errorMsg}: ${err.message}`);
setError(errorMsg);
}); });
}; }, [addDebugLog]);
const getDisplayText = () => { // Fixed getDisplayText to prevent infinite loops
if (!response?.data) return null; const displayText = useMemo(() => {
if (!response?.data) {
addDebugLog('No response data to display');
return null;
}
// Handle various API response formats
if (typeof response.data === 'string') { if (typeof response.data === 'string') {
return response.data; return response.data;
} }
@ -133,15 +310,259 @@ export default function AudioUploader() {
} }
return "Received response but couldn't extract text. View full response for details."; return "Received response but couldn't extract text. View full response for details.";
}; }, [response, addDebugLog]);
const displayText = getDisplayText(); // Recording functions
const startRecording = useCallback(async () => {
try {
addDebugLog('Attempting to start recording');
setStatus("Requesting microphone access...");
if (audioBlob) {
addDebugLog('Clearing previous recording');
setAudioBlob(null);
setAudioUrl(null);
}
// Initialize audio context
audioContextRef.current = new (window.AudioContext || window.webkitAudioContext)({
sampleRate: 16000
});
addDebugLog(`AudioContext created with sample rate: ${audioContextRef.current.sampleRate}`);
// Get user media
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
streamRef.current = stream;
addDebugLog('Microphone access granted, stream created');
// Setup visualization
setupVisualizer(stream);
// Initialize MediaRecorder
mediaRecorderRef.current = new MediaRecorder(stream);
audioChunksRef.current = [];
mediaRecorderRef.current.ondataavailable = (e) => {
audioChunksRef.current.push(e.data);
};
mediaRecorderRef.current.onstop = () => {
const audioBlob = new Blob(audioChunksRef.current, { type: 'audio/webm' });
setAudioBlob(audioBlob);
setAudioUrl(URL.createObjectURL(audioBlob));
setStatus("Recording stopped. Ready to process.");
};
mediaRecorderRef.current.start(100); // Collect data every 100ms
setIsRecording(true);
setStatus("Recording (16kHz, 16-bit mono)...");
addDebugLog('Recording started');
} catch (err) {
const errorMsg = `Error starting recording: ${err.message}`;
addDebugLog(errorMsg);
setError(errorMsg);
setStatus("Recording failed");
setIsRecording(false);
}
}, [audioBlob, addDebugLog]);
const stopRecording = useCallback(() => {
addDebugLog('Stop recording initiated');
if (!isRecording) {
addDebugLog('Not currently recording, ignoring stop request');
return;
}
try {
setIsRecording(false);
addDebugLog('Recording state updated to false');
if (mediaRecorderRef.current?.state === 'recording') {
mediaRecorderRef.current.stop();
}
if (streamRef.current) {
streamRef.current.getTracks().forEach(track => {
track.stop();
addDebugLog(`Stopped track: ${track.kind}`);
});
}
if (animationRef.current) {
cancelAnimationFrame(animationRef.current);
animationRef.current = null;
addDebugLog('Visualization animation stopped');
}
addDebugLog('Recording successfully stopped');
} catch (err) {
const errorMsg = `Error stopping recording: ${err.message}`;
addDebugLog(errorMsg);
setError(errorMsg);
setStatus("Recording stop failed");
}
}, [isRecording, addDebugLog]);
const playRecording = useCallback(() => {
if (audioUrl) {
addDebugLog('Playing recording');
const audio = new Audio(audioUrl);
audio.play();
setStatus("Playing recording...");
audio.onended = () => {
addDebugLog('Playback finished');
setStatus("Playback finished");
};
} else {
addDebugLog('No audio URL available for playback');
}
}, [audioUrl, addDebugLog]);
const setupVisualizer = useCallback((stream) => {
if (!audioContextRef.current) {
addDebugLog('AudioContext not available for visualization');
return;
}
try {
const source = audioContextRef.current.createMediaStreamSource(stream);
analyserRef.current = audioContextRef.current.createAnalyser();
analyserRef.current.fftSize = 64;
source.connect(analyserRef.current);
addDebugLog('Visualizer audio nodes connected');
const bufferLength = analyserRef.current.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);
const draw = () => {
animationRef.current = requestAnimationFrame(draw);
analyserRef.current.getByteFrequencyData(dataArray);
const canvas = canvasRef.current;
if (!canvas) return;
const ctx = canvas.getContext('2d');
if (!ctx) return;
ctx.clearRect(0, 0, canvas.width, canvas.height);
const barWidth = (canvas.width / bufferLength) * 2.5;
let x = 0;
for (let i = 0; i < bufferLength; i++) {
const barHeight = dataArray[i] / 2;
ctx.fillStyle = `rgb(${barHeight + 100}, 50, 50)`;
ctx.fillRect(x, canvas.height - barHeight, barWidth, barHeight);
x += barWidth + 1;
}
};
draw();
addDebugLog('Visualizer animation started');
} catch (err) {
addDebugLog(`Error setting up visualizer: ${err.message}`);
}
}, [addDebugLog]);
// Helper functions
const formatTime = useCallback((seconds) => {
const mins = Math.floor(seconds / 60).toString().padStart(2, '0');
const secs = (seconds % 60).toString().padStart(2, '0');
return `${mins}:${secs}`;
}, []);
const clearDebugLogs = useCallback(() => {
setDebugLogs([]);
addDebugLog('Debug logs cleared');
}, [addDebugLog]);
const toggleDebug = useCallback(() => {
setShowDebug(!showDebug);
addDebugLog(`Debug panel ${showDebug ? 'hidden' : 'shown'}`);
}, [showDebug, addDebugLog]);
return ( return (
<div className="container mx-auto px-4 max-w-4xl my-6"> <div className="container mx-auto px-4 max-w-4xl my-6">
<div className="bg-white rounded-lg shadow-md p-6"> <div className="bg-white rounded-lg shadow-md p-6">
<h1 className="text-2xl font-bold mb-6 text-gray-800">Audio File to Text Converter</h1> <div className="flex justify-between items-center mb-6">
<h1 className="text-2xl font-bold text-gray-800">Speech to Text Converter</h1>
<Button
onClick={toggleDebug}
variant="outline"
size="sm"
>
{showDebug ? 'Hide Debug' : 'Show Debug'}
</Button>
</div>
{/* Recording Section */}
<div className="mb-8 p-4 border border-dashed border-[#6d9e37] rounded-lg bg-gray-50">
<h2 className="text-lg font-semibold mb-3 text-gray-700">Record Audio (16kHz, 16-bit mono)</h2>
<canvas
ref={canvasRef}
className="w-full h-20 bg-gray-200 rounded mb-3"
style={{ display: isRecording ? 'block' : 'none' }}
/>
<div className="flex flex-wrap gap-2 mb-3">
<Button
onClick={startRecording}
disabled={isRecording || isLoading}
variant="outline"
className="px-4 py-2"
>
Start Recording
</Button>
<Button
onClick={stopRecording}
disabled={!isRecording || isLoading}
variant="outline"
className="px-4 py-2"
>
Stop Recording
</Button>
<Button
onClick={playRecording}
disabled={!audioUrl || isRecording || isLoading}
variant="outline"
className="px-4 py-2"
>
Play Recording
</Button>
</div>
{isRecording && (
<div className="text-center text-[#6d9e37] font-medium">
Recording: {formatTime(recordingTime)}
</div>
)}
{audioUrl && !isRecording && (
<div className="flex items-center justify-between bg-white p-3 rounded border mt-2">
<div className="flex items-center">
<svg className="w-5 h-5 text-[#6d9e37] mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
<span className="text-sm font-medium text-[#6d9e37]">recording.wav</span>
</div>
<span className="text-xs text-[#6d9e37]">
{(audioBlob?.size / (1024 * 1024)).toFixed(2)} MB
</span>
</div>
)}
</div>
<div className="flex items-center justify-center w-full mb-3 -mt-2">
<span className="flex-grow border-b-2 border-[#6d9e37]"></span>
<h2 className="mx-2 text-[#6d9e37] font-bold">OR</h2>
<span className="flex-grow border-b-2 border-[#6d9e37]"></span>
</div>
{/* File Upload Section */} {/* File Upload Section */}
<div className="mb-8 p-4 border border-dashed border-[#6d9e37] rounded-lg bg-gray-50"> <div className="mb-8 p-4 border border-dashed border-[#6d9e37] rounded-lg bg-gray-50">
<div className="flex items-center justify-between mb-4"> <div className="flex items-center justify-between mb-4">
@ -155,7 +576,7 @@ export default function AudioUploader() {
onClick={() => fileInputRef.current?.click()} onClick={() => fileInputRef.current?.click()}
variant="outline" variant="outline"
className="px-4 py-2" className="px-4 py-2"
disabled={isLoading} disabled={isLoading || isRecording}
> >
Select File Select File
</Button> </Button>
@ -165,7 +586,7 @@ export default function AudioUploader() {
accept="audio/*,.wav,.mp3,.ogg" accept="audio/*,.wav,.mp3,.ogg"
onChange={handleFileChange} onChange={handleFileChange}
className="hidden" className="hidden"
disabled={isLoading} disabled={isLoading || isRecording}
/> />
</div> </div>
@ -191,12 +612,12 @@ export default function AudioUploader() {
{API_OPTIONS.map(api => ( {API_OPTIONS.map(api => (
<div <div
key={api.id} key={api.id}
onClick={() => !isLoading && setSelectedApi(api.id)} onClick={() => !isLoading && !isRecording && setSelectedApi(api.id)}
className={`p-4 border-[1.5px] rounded-lg cursor-pointer transition-all ${ className={`p-4 border-[1.5px] rounded-lg cursor-pointer transition-all ${
selectedApi === api.id selectedApi === api.id
? 'border-[1.5px] border-[#6d9e37] bg-[#6d9e3720]' ? 'border-[1.5px] border-[#6d9e37] bg-[#6d9e3720]'
: 'border-gray-200 hover:border-gray-300' : 'border-gray-200 hover:border-gray-300'
} ${isLoading ? 'opacity-50 cursor-not-allowed' : ''}`} } ${isLoading || isRecording ? 'opacity-50 cursor-not-allowed' : ''}`}
> >
<div className="flex items-center"> <div className="flex items-center">
<input <input
@ -204,7 +625,7 @@ export default function AudioUploader() {
checked={selectedApi === api.id} checked={selectedApi === api.id}
onChange={() => {}} onChange={() => {}}
className="mr-2 h-4 w-4 accent-[#6d9e37]" className="mr-2 h-4 w-4 accent-[#6d9e37]"
disabled={isLoading} disabled={isLoading || isRecording}
/> />
<div> <div>
<h3 className="font-bold text-[#6d9e37]">{api.name}</h3> <h3 className="font-bold text-[#6d9e37]">{api.name}</h3>
@ -220,7 +641,8 @@ export default function AudioUploader() {
<div className="flex justify-center mb-8"> <div className="flex justify-center mb-8">
<Button <Button
onClick={handleSubmit} onClick={handleSubmit}
disabled={!file || isLoading || (file && file.size > MAX_FILE_SIZE_BYTES)} disabled={(!file && !audioBlob) || isLoading || isRecording ||
(file && file.size > MAX_FILE_SIZE_BYTES)}
className="px-6 py-3 text-lg w-full md:w-auto" className="px-6 py-3 text-lg w-full md:w-auto"
> >
{isLoading ? ( {isLoading ? (
@ -242,6 +664,7 @@ export default function AudioUploader() {
<p className={`text-sm ${ <p className={`text-sm ${
error ? 'text-red-600' : error ? 'text-red-600' :
isLoading ? 'text-[#6d9e37]' : isLoading ? 'text-[#6d9e37]' :
isRecording ? 'text-[#6d9e37]' :
'text-gray-600' 'text-gray-600'
}`}> }`}>
{status} {status}
@ -260,7 +683,7 @@ export default function AudioUploader() {
<p className="mt-2 text-sm text-red-600">{error}</p> <p className="mt-2 text-sm text-red-600">{error}</p>
{error.includes(`${MAX_FILE_SIZE_MB}MB`) && ( {error.includes(`${MAX_FILE_SIZE_MB}MB`) && (
<p className="mt-1 text-xs text-red-500"> <p className="mt-1 text-xs text-red-500">
Please select a smaller audio file Please select a smaller audio file or record a shorter audio
</p> </p>
)} )}
</div> </div>
@ -298,6 +721,52 @@ export default function AudioUploader() {
</div> </div>
</div> </div>
)} )}
{/* Debug Section */}
{showDebug && (
<div className="mt-8 border rounded-lg overflow-hidden">
<div className="bg-gray-50 px-4 py-3 border-b flex justify-between items-center">
<h3 className="font-medium text-gray-700">Debug Logs</h3>
<div className="flex gap-2">
<Button
size="sm"
variant="outline"
onClick={clearDebugLogs}
className="text-sm">
Clear Logs
</Button>
<Button
size="sm"
variant="outline"
onClick={() => {
const blob = new Blob([debugLogs.join('\n')], { type: 'text/plain' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `audio-recorder-debug-${new Date().toISOString()}.log`;
a.click();
URL.revokeObjectURL(url);
}}
className="text-sm">
Export Logs
</Button>
</div>
</div>
<div className="p-4 bg-white max-h-60 overflow-y-auto">
{debugLogs.length > 0 ? (
<div className="space-y-1">
{debugLogs.map((log, index) => (
<div key={index} className="text-xs font-mono text-gray-600 border-b border-gray-100 pb-1">
{log}
</div>
))}
</div>
) : (
<p className="text-sm text-gray-500">No debug logs yet. Interactions will appear here.</p>
)}
</div>
</div>
)}
</div> </div>
</div> </div>
); );

View File

@ -8,9 +8,8 @@ import { Separator } from './ui/separator';
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from './ui/dialog'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from './ui/dialog';
import { CustomTabs } from './ui/tabs'; import { CustomTabs } from './ui/tabs';
import Loader from "./ui/loader"; import Loader from "./ui/loader";
const PUBLIC_TOPIC_API_URL = import.meta.env.PUBLIC_TOPIC_API_URL;
const TOPIC_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/topics/'; const PUBLIC_MINIO_UPLOAD_URL = import.meta.env.PUBLIC_MINIO_UPLOAD_URL;
const MINIO_UPLOAD_URL = 'https://your-minio-api-endpoint/upload';
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
const slug = urlParams.get('slug'); const slug = urlParams.get('slug');
// console.log('find slug from url', slug); // console.log('find slug from url', slug);
@ -36,7 +35,7 @@ export default function EditTopic (){
useEffect(() => { useEffect(() => {
const fetchTopic = async () => { const fetchTopic = async () => {
try { try {
const response = await fetch(`${TOPIC_API_URL}?query=get-single-topic&slug=${slug}`, { const response = await fetch(`${PUBLIC_TOPIC_API_URL}?query=get-single-topic&slug=${slug}`, {
credentials: 'include' credentials: 'include'
}); });
@ -73,7 +72,7 @@ export default function EditTopic (){
formData.append('folder', 'topic-images'); formData.append('folder', 'topic-images');
try { try {
const response = await fetch(MINIO_UPLOAD_URL, { const response = await fetch(PUBLIC_MINIO_UPLOAD_URL, {
method: 'POST', method: 'POST',
body: formData, body: formData,
credentials: 'include', credentials: 'include',
@ -221,7 +220,7 @@ export default function EditTopic (){
}; };
// Submit to API (PUT request for update) // Submit to API (PUT request for update)
const response = await fetch(`${TOPIC_API_URL}?query=update-topic&slug=${formData.slug}`, { const response = await fetch(`${PUBLIC_TOPIC_API_URL}?query=update-topic&slug=${formData.slug}`, {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',

View File

@ -6,6 +6,7 @@ import Loader from "./ui/loader";
const topicPageDesc = 'Cutting-edge discussions on tech, digital services, news, and digital freedom. Stay informed on AI, cybersecurity, privacy, and the future of innovation.'; const topicPageDesc = 'Cutting-edge discussions on tech, digital services, news, and digital freedom. Stay informed on AI, cybersecurity, privacy, and the future of innovation.';
export default function TopicCreation() { export default function TopicCreation() {
const PUBLIC_TOPIC_API_URL = import.meta.env.PUBLIC_TOPIC_API_URL;
const { isLoggedIn, loading: authLoading, error: authError } = useIsLoggedIn(); const { isLoggedIn, loading: authLoading, error: authError } = useIsLoggedIn();
const [topics, setTopics] = useState([]); const [topics, setTopics] = useState([]);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
@ -16,7 +17,7 @@ export default function TopicCreation() {
last_page: 1, last_page: 1,
per_page: 10, per_page: 10,
total: 0 total: 0
}); });
// Get current page from URL or default to 1 // Get current page from URL or default to 1
const getCurrentPage = () => { const getCurrentPage = () => {
@ -28,8 +29,8 @@ export default function TopicCreation() {
// Fetch topics data // Fetch topics data
const fetchTopics = async (page, search = '') => { const fetchTopics = async (page, search = '') => {
setLoading(true); setLoading(true);
try { try {
let url = `https://host-api-sxashuasysagibx.siliconpin.com/v1/topics/?query=get-all-topics&page=${page}`; let url = `${PUBLIC_TOPIC_API_URL}?query=get-all-topics&page=${page}`;
if (search) { if (search) {
url += `&search=${encodeURIComponent(search)}`; url += `&search=${encodeURIComponent(search)}`;

View File

@ -52,13 +52,14 @@ export default function ProfilePage() {
const [toast, setToast] = useState<ToastState>({ visible: false, message: '' }); const [toast, setToast] = useState<ToastState>({ visible: false, message: '' });
const [txnId, setTxnId] = useState<string>(''); const [txnId, setTxnId] = useState<string>('');
const [userEmail, setUserEmail] = useState<string>(''); const [userEmail, setUserEmail] = useState<string>('');
const USER_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/users/';
const INVOICE_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/invoice/'; const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
const PUBLIC_INVOICE_API_URL = import.meta.env.PUBLIC_INVOICE_API_URL;
useEffect(() => { useEffect(() => {
const fetchSessionData = async () => { const fetchSessionData = async () => {
try { try {
const response = await fetch(`${USER_API_URL}?query=get-user`, { const response = await fetch(`${PUBLIC_USER_API_URL}?query=get-user`, {
credentials: 'include', // Crucial for cookies credentials: 'include', // Crucial for cookies
headers: { 'Accept': 'application/json' } headers: { 'Accept': 'application/json' }
} }
@ -77,7 +78,7 @@ export default function ProfilePage() {
}; };
const getInvoiceListData = async () => { const getInvoiceListData = async () => {
try { try {
const response = await fetch(`${USER_API_URL}?query=invoice-info`, { const response = await fetch(`${PUBLIC_USER_API_URL}?query=invoice-info`, {
method: 'GET', method: 'GET',
credentials: 'include', // Crucial for cookies credentials: 'include', // Crucial for cookies
headers: { 'Accept': 'application/json' } headers: { 'Accept': 'application/json' }
@ -127,7 +128,7 @@ export default function ProfilePage() {
}; };
const sessionLogOut = () => { const sessionLogOut = () => {
fetch(`${USER_API_URL}?query=logout`, { fetch(`${PUBLIC_USER_API_URL}?query=logout`, {
method: 'GET', method: 'GET',
credentials: 'include' credentials: 'include'
}) })
@ -187,7 +188,7 @@ export default function ProfilePage() {
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2"> <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
<div className="space-y-2"> <div className="space-y-2">
<Label htmlFor="firstName">Full Name</Label> <Label htmlFor="firstName">Full Name</Label>
<Input id="firstName" defaultValue={userData.session_data?.user_name || 'Jhon'} /> <Input id="firstName" defaultValue={userData.session_data?.user_name || ''} />
</div> </div>
<div className="space-y-2"> <div className="space-y-2">
<Label htmlFor="phone">Phone</Label> <Label htmlFor="phone">Phone</Label>

View File

@ -1,7 +1,6 @@
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
const USER_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/users/index.php'; const PUBLIC_USER_API_URL = import.meta.env.PUBLIC_USER_API_URL;
export const useIsLoggedIn = () => { export const useIsLoggedIn = () => {
const [isLoggedIn, setIsLoggedIn] = useState(null); // null means "unknown" const [isLoggedIn, setIsLoggedIn] = useState(null); // null means "unknown"
const [sessionData, setSessionData] = useState(null); const [sessionData, setSessionData] = useState(null);
@ -11,7 +10,7 @@ export const useIsLoggedIn = () => {
useEffect(() => { useEffect(() => {
const checkLoginStatus = async () => { const checkLoginStatus = async () => {
try { try {
const response = await fetch(`${USER_API_URL}?query=isLoggedIn`, { const response = await fetch(`${PUBLIC_USER_API_URL}?query=isLoggedIn`, {
credentials: 'include' credentials: 'include'
}); });
const data = await response.json(); const data = await response.json();

View File

@ -171,7 +171,7 @@
</div> </div>
<script is:inline type="module"> <script is:inline type="module">
import PocketBase from 'https://cdn.jsdelivr.net/npm/pocketbase@0.19.0/+esm'; import PocketBase from 'https://cdn.jsdelivr.net/npm/pocketbase@0.19.0/+esm';
const pb = new PocketBase("https://tst-pb.s38.siliconpin.com"); const pb = new PocketBase("https://tst-pb.s38.siliconpin.com");
let isAuthenticated = false; let isAuthenticated = false;

View File

@ -2,6 +2,8 @@
// Astro script block // Astro script block
import Layout from '../../layouts/Layout.astro'; import Layout from '../../layouts/Layout.astro';
import { ServiceCard } from '../../components/ServiceCard'; import { ServiceCard } from '../../components/ServiceCard';
const PUBLIC_SERVICE_API_URL = import.meta.env.PUBLIC_SERVICE_API_URL;
// console.log(PUBLIC_SERVICE_API_URL)
const services = [ const services = [
{ {
imageUrl: '/assets/images/services/wiregurd-thumb.jpg', imageUrl: '/assets/images/services/wiregurd-thumb.jpg',
@ -69,10 +71,9 @@ const services = [
buyButtonUrl: '' buyButtonUrl: ''
} }
]; ];
const SERVICE_API_URL = 'https://host-api-sxashuasysagibx.siliconpin.com/v1/services/?query=all-services-list';
let data = []; let data = [];
try { try {
const response = await fetch(SERVICE_API_URL); const response = await fetch(`${PUBLIC_SERVICE_API_URL}?query=all-services-list`);
const json = await response.json(); const json = await response.json();
if (json.success) { if (json.success) {
// data = [...json.data, ...services]; // data = [...json.data, ...services];

9
src/pages/test.astro Normal file
View File

@ -0,0 +1,9 @@
---
import Layout from "../layouts/Layout.astro";
---
<Layout title="">
<div class="text-center text-2xl font-bold my-4">Test to Include PHP under Astro file</div>
<div set:html="<?php echo 'Hello! I am from PHP'; ?>"></div>
</Layout>

View File

@ -3,8 +3,7 @@ import Layout from "../../layouts/Layout.astro";
import AudioToText from "../../components/Tools/AudioToText" import AudioToText from "../../components/Tools/AudioToText"
--- ---
<Layout title=""> <Layout title="Whisper CPP Light">
<AudioToText client:load /> <AudioToText client:load />
</Layout> </Layout>
<!-- <div class="container mx-auto px-4" id="stt-container"> <!-- <div class="container mx-auto px-4" id="stt-container">

396
yarn.lock
View File

@ -1340,6 +1340,11 @@
"@types/babel__core" "^7.20.5" "@types/babel__core" "^7.20.5"
react-refresh "^0.14.2" react-refresh "^0.14.2"
"@zeit/schemas@2.36.0":
version "2.36.0"
resolved "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz"
integrity sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==
"@zxing/text-encoding@0.9.0": "@zxing/text-encoding@0.9.0":
version "0.9.0" version "0.9.0"
resolved "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz" resolved "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz"
@ -1350,6 +1355,14 @@ abs-svg-path@^0.1.1:
resolved "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz" resolved "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz"
integrity sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA== integrity sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==
accepts@~1.3.5:
version "1.3.8"
resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz"
integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
dependencies:
mime-types "~2.1.34"
negotiator "0.6.3"
acorn@^8.14.1: acorn@^8.14.1:
version "8.14.1" version "8.14.1"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz" resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz"
@ -1370,6 +1383,16 @@ agent-base@^7.0.2:
resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz"
integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==
ajv@8.12.0:
version "8.12.0"
resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz"
integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==
dependencies:
fast-deep-equal "^3.1.1"
json-schema-traverse "^1.0.0"
require-from-string "^2.0.2"
uri-js "^4.2.2"
ansi-align@^3.0.1: ansi-align@^3.0.1:
version "3.0.1" version "3.0.1"
resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz"
@ -1401,6 +1424,13 @@ ansi-styles@^4.0.0:
dependencies: dependencies:
color-convert "^2.0.1" color-convert "^2.0.1"
ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
dependencies:
color-convert "^2.0.1"
ansi-styles@^6.1.0, ansi-styles@^6.2.1: ansi-styles@^6.1.0, ansi-styles@^6.2.1:
version "6.2.1" version "6.2.1"
resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz"
@ -1419,7 +1449,12 @@ anymatch@^3.1.3, anymatch@~3.1.2:
normalize-path "^3.0.0" normalize-path "^3.0.0"
picomatch "^2.0.4" picomatch "^2.0.4"
arg@^5.0.2: arch@^2.2.0:
version "2.2.0"
resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz"
integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==
arg@^5.0.2, arg@5.0.2:
version "5.0.2" version "5.0.2"
resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz"
integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
@ -1616,6 +1651,20 @@ boolean@^3.0.1:
resolved "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz" resolved "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz"
integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==
boxen@7.0.0:
version "7.0.0"
resolved "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz"
integrity sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==
dependencies:
ansi-align "^3.0.1"
camelcase "^7.0.0"
chalk "^5.0.1"
cli-boxes "^3.0.0"
string-width "^5.1.2"
type-fest "^2.13.0"
widest-line "^4.0.1"
wrap-ansi "^8.0.1"
boxen@8.0.1: boxen@8.0.1:
version "8.0.1" version "8.0.1"
resolved "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz" resolved "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz"
@ -1630,6 +1679,14 @@ boxen@8.0.1:
widest-line "^5.0.0" widest-line "^5.0.0"
wrap-ansi "^9.0.0" wrap-ansi "^9.0.0"
brace-expansion@^1.1.7:
version "1.1.12"
resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz"
integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
brace-expansion@^2.0.1: brace-expansion@^2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz"
@ -1691,6 +1748,11 @@ buffer@^6.0.3:
base64-js "^1.3.1" base64-js "^1.3.1"
ieee754 "^1.2.1" ieee754 "^1.2.1"
bytes@3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz"
integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==
cacheable-lookup@^5.0.3: cacheable-lookup@^5.0.3:
version "5.0.4" version "5.0.4"
resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz" resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz"
@ -1745,6 +1807,11 @@ camelcase-css@^2.0.1:
resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz"
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
camelcase@^7.0.0:
version "7.0.1"
resolved "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz"
integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==
camelcase@^8.0.0: camelcase@^8.0.0:
version "8.0.0" version "8.0.0"
resolved "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz" resolved "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz"
@ -1768,11 +1835,31 @@ cfb@~1.2.1:
adler-32 "~1.3.0" adler-32 "~1.3.0"
crc-32 "~1.2.0" crc-32 "~1.2.0"
chalk-template@0.4.0:
version "0.4.0"
resolved "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz"
integrity sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==
dependencies:
chalk "^4.1.2"
chalk@^4.1.2:
version "4.1.2"
resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
chalk@^5.0.0, chalk@5.2.0: chalk@^5.0.0, chalk@5.2.0:
version "5.2.0" version "5.2.0"
resolved "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz" resolved "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz"
integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==
chalk@^5.0.1, chalk@5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz"
integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==
chalk@^5.3.0: chalk@^5.3.0:
version "5.4.1" version "5.4.1"
resolved "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz" resolved "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz"
@ -1854,6 +1941,15 @@ cli-width@^4.1.0:
resolved "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz" resolved "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz"
integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==
clipboardy@3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz"
integrity sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==
dependencies:
arch "^2.2.0"
execa "^5.1.1"
is-wsl "^2.2.0"
cliui@^8.0.1: cliui@^8.0.1:
version "8.0.1" version "8.0.1"
resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz"
@ -1955,6 +2051,36 @@ common-ancestor-path@^1.0.1:
resolved "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz" resolved "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz"
integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==
compressible@~2.0.16:
version "2.0.18"
resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz"
integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
dependencies:
mime-db ">= 1.43.0 < 2"
compression@1.7.4:
version "1.7.4"
resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz"
integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
dependencies:
accepts "~1.3.5"
bytes "3.0.0"
compressible "~2.0.16"
debug "2.6.9"
on-headers "~1.0.2"
safe-buffer "5.1.2"
vary "~1.1.2"
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
content-disposition@0.5.2:
version "0.5.2"
resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz"
integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==
convert-source-map@^2.0.0: convert-source-map@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"
@ -2048,6 +2174,13 @@ debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.7, debug@^4.4
dependencies: dependencies:
ms "^2.1.3" ms "^2.1.3"
debug@2.6.9:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
decode-named-character-reference@^1.0.0: decode-named-character-reference@^1.0.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz" resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz"
@ -2067,6 +2200,11 @@ decompress-response@^6.0.0:
dependencies: dependencies:
mimic-response "^3.1.0" mimic-response "^3.1.0"
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
deepmerge@^4.3.1: deepmerge@^4.3.1:
version "4.3.1" version "4.3.1"
resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz"
@ -2374,6 +2512,21 @@ events@^3.3.0:
resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
execa@^5.1.1:
version "5.1.1"
resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz"
integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
dependencies:
cross-spawn "^7.0.3"
get-stream "^6.0.0"
human-signals "^2.1.0"
is-stream "^2.0.0"
merge-stream "^2.0.0"
npm-run-path "^4.0.1"
onetime "^5.1.2"
signal-exit "^3.0.3"
strip-final-newline "^2.0.0"
execa@^7.0.0: execa@^7.0.0:
version "7.2.0" version "7.2.0"
resolved "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz" resolved "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz"
@ -2405,7 +2558,7 @@ extract-zip@^2.0.1:
optionalDependencies: optionalDependencies:
"@types/yauzl" "^2.9.1" "@types/yauzl" "^2.9.1"
fast-deep-equal@^3.1.3: fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3" version "3.1.3"
resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
@ -2607,7 +2760,7 @@ get-stream@^5.1.0:
dependencies: dependencies:
pump "^3.0.0" pump "^3.0.0"
get-stream@^6.0.1: get-stream@^6.0.0, get-stream@^6.0.1:
version "6.0.1" version "6.0.1"
resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz"
integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
@ -2722,6 +2875,11 @@ h3@^1.15.0:
ufo "^1.5.4" ufo "^1.5.4"
uncrypto "^0.1.3" uncrypto "^0.1.3"
has-flag@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz"
@ -3130,6 +3288,11 @@ https-proxy-agent@^6.2.0:
agent-base "^7.0.2" agent-base "^7.0.2"
debug "4" debug "4"
human-signals@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
human-signals@^4.3.0: human-signals@^4.3.0:
version "4.3.1" version "4.3.1"
resolved "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz" resolved "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz"
@ -3168,6 +3331,11 @@ inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
ini@~1.3.0:
version "1.3.8"
resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
inline-style-parser@0.1.1: inline-style-parser@0.1.1:
version "0.1.1" version "0.1.1"
resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz"
@ -3248,6 +3416,11 @@ is-decimal@^2.0.0:
resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz" resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz"
integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==
is-docker@^2.0.0:
version "2.2.1"
resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz"
integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
is-docker@^3.0.0: is-docker@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz" resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz"
@ -3317,6 +3490,11 @@ is-plain-obj@^4.0.0:
resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz" resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz"
integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==
is-port-reachable@4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz"
integrity sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==
is-regex@^1.2.1: is-regex@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz"
@ -3332,6 +3510,11 @@ is-regexp@^3.1.0:
resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz" resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz"
integrity sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA== integrity sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==
is-stream@^2.0.0:
version "2.0.1"
resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz"
integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
is-stream@^3.0.0: is-stream@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz"
@ -3354,6 +3537,13 @@ is-url@^1.2.4:
resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz" resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz"
integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
is-wsl@^2.2.0:
version "2.2.0"
resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz"
integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
dependencies:
is-docker "^2.0.0"
is-wsl@^3.1.0: is-wsl@^3.1.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz" resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz"
@ -3419,6 +3609,11 @@ json-parse-even-better-errors@^2.3.0:
resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
json-schema-traverse@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz"
integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
json-stringify-safe@^5.0.1: json-stringify-safe@^5.0.1:
version "5.0.1" version "5.0.1"
resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
@ -4487,18 +4682,30 @@ micromatch@^4.0.8:
braces "^3.0.3" braces "^3.0.3"
picomatch "^2.3.1" picomatch "^2.3.1"
mime-db@1.52.0: "mime-db@>= 1.43.0 < 2", mime-db@1.52.0:
version "1.52.0" version "1.52.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.35: mime-db@~1.33.0:
version "1.33.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz"
integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==
mime-types@^2.1.35, mime-types@~2.1.34:
version "2.1.35" version "2.1.35"
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies: dependencies:
mime-db "1.52.0" mime-db "1.52.0"
mime-types@2.1.18:
version "2.1.18"
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz"
integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==
dependencies:
mime-db "~1.33.0"
mimic-fn@^2.1.0: mimic-fn@^2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
@ -4533,7 +4740,14 @@ minimatch@^9.0.4:
dependencies: dependencies:
brace-expansion "^2.0.1" brace-expansion "^2.0.1"
minimist@^1.2.6: minimatch@3.1.2:
version "3.1.2"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
minimist@^1.2.0, minimist@^1.2.6:
version "1.2.8" version "1.2.8"
resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
@ -4595,6 +4809,11 @@ ms@^2.1.3:
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
msw@^2.7.1: msw@^2.7.1:
version "2.7.6" version "2.7.6"
resolved "https://registry.npmjs.org/msw/-/msw-2.7.6.tgz" resolved "https://registry.npmjs.org/msw/-/msw-2.7.6.tgz"
@ -4638,6 +4857,11 @@ nanoid@^3.3.8:
resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.10.tgz" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.10.tgz"
integrity sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg== integrity sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==
negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
neotraverse@^0.6.18: neotraverse@^0.6.18:
version "0.6.18" version "0.6.18"
resolved "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz" resolved "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz"
@ -4706,6 +4930,13 @@ not@^0.1.0:
resolved "https://registry.npmjs.org/not/-/not-0.1.0.tgz" resolved "https://registry.npmjs.org/not/-/not-0.1.0.tgz"
integrity sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA== integrity sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==
npm-run-path@^4.0.1:
version "4.0.1"
resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz"
integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
dependencies:
path-key "^3.0.0"
npm-run-path@^5.1.0: npm-run-path@^5.1.0:
version "5.3.0" version "5.3.0"
resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz" resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz"
@ -4744,6 +4975,11 @@ ofetch@^1.4.1:
node-fetch-native "^1.6.4" node-fetch-native "^1.6.4"
ufo "^1.5.4" ufo "^1.5.4"
on-headers@~1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz"
integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
once@^1.3.1, once@^1.4.0: once@^1.3.1, once@^1.4.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
@ -4758,6 +4994,13 @@ onetime@^5.1.0:
dependencies: dependencies:
mimic-fn "^2.1.0" mimic-fn "^2.1.0"
onetime@^5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz"
integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
dependencies:
mimic-fn "^2.1.0"
onetime@^6.0.0: onetime@^6.0.0:
version "6.0.0" version "6.0.0"
resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz"
@ -4908,7 +5151,12 @@ path-browserify@^1.0.1:
resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz"
integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
path-key@^3.1.0: path-is-inside@1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz"
integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==
path-key@^3.0.0, path-key@^3.1.0:
version "3.1.1" version "3.1.1"
resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
@ -4936,6 +5184,11 @@ path-to-regexp@^6.3.0:
resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz"
integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==
path-to-regexp@3.3.0:
version "3.3.0"
resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz"
integrity sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==
path-type@^4.0.0: path-type@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
@ -5096,7 +5349,7 @@ pump@^3.0.0:
end-of-stream "^1.1.0" end-of-stream "^1.1.0"
once "^1.3.1" once "^1.3.1"
punycode@^2.1.1, punycode@^2.3.1: punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1:
version "2.3.1" version "2.3.1"
resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz"
integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
@ -5143,6 +5396,21 @@ radix3@^1.1.2:
resolved "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz" resolved "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz"
integrity sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA== integrity sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==
range-parser@1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz"
integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==
rc@^1.0.1, rc@^1.1.6:
version "1.2.8"
resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
dependencies:
deep-extend "^0.6.0"
ini "~1.3.0"
minimist "^1.2.0"
strip-json-comments "~2.0.1"
"react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^17.0.2 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@>=16.8.0, react-dom@>=16.8.2, react-dom@>=18: "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^17.0.2 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@>=16.8.0, react-dom@>=16.8.2, react-dom@>=18:
version "19.0.0" version "19.0.0"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz"
@ -5350,6 +5618,21 @@ regex@^5.1.1:
dependencies: dependencies:
regex-utilities "^2.3.0" regex-utilities "^2.3.0"
registry-auth-token@3.3.2:
version "3.3.2"
resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz"
integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==
dependencies:
rc "^1.1.6"
safe-buffer "^5.0.1"
registry-url@3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz"
integrity sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==
dependencies:
rc "^1.0.1"
rehype-attr@~2.1.0: rehype-attr@~2.1.0:
version "2.1.4" version "2.1.4"
resolved "https://registry.npmjs.org/rehype-attr/-/rehype-attr-2.1.4.tgz" resolved "https://registry.npmjs.org/rehype-attr/-/rehype-attr-2.1.4.tgz"
@ -5729,11 +6012,16 @@ sade@^1.7.3:
dependencies: dependencies:
mri "^1.1.0" mri "^1.1.0"
safe-buffer@~5.2.0: safe-buffer@^5.0.1, safe-buffer@~5.2.0:
version "5.2.1" version "5.2.1"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
safe-buffer@5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-regex-test@^1.1.0: safe-regex-test@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz"
@ -5790,6 +6078,36 @@ serialize-error@^7.0.1:
dependencies: dependencies:
type-fest "^0.13.1" type-fest "^0.13.1"
serve-handler@6.1.6:
version "6.1.6"
resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz"
integrity sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==
dependencies:
bytes "3.0.0"
content-disposition "0.5.2"
mime-types "2.1.18"
minimatch "3.1.2"
path-is-inside "1.0.2"
path-to-regexp "3.3.0"
range-parser "1.2.0"
serve@^14.2.4:
version "14.2.4"
resolved "https://registry.npmjs.org/serve/-/serve-14.2.4.tgz"
integrity sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==
dependencies:
"@zeit/schemas" "2.36.0"
ajv "8.12.0"
arg "5.0.2"
boxen "7.0.0"
chalk "5.0.1"
chalk-template "0.4.0"
clipboardy "3.0.0"
compression "1.7.4"
is-port-reachable "4.0.0"
serve-handler "6.1.6"
update-check "1.5.4"
set-cookie-parser@^2.6.0: set-cookie-parser@^2.6.0:
version "2.7.1" version "2.7.1"
resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz" resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz"
@ -5891,7 +6209,7 @@ shiki@^1.29.2:
"@shikijs/vscode-textmate" "^10.0.1" "@shikijs/vscode-textmate" "^10.0.1"
"@types/hast" "^3.0.4" "@types/hast" "^3.0.4"
signal-exit@^3.0.2, signal-exit@^3.0.7: signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
version "3.0.7" version "3.0.7"
resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
@ -6093,11 +6411,21 @@ strip-bom@^3.0.0:
resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz"
integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
strip-final-newline@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz"
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
strip-final-newline@^3.0.0: strip-final-newline@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz"
integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz"
integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
strnum@^1.1.1: strnum@^1.1.1:
version "1.1.2" version "1.1.2"
resolved "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz" resolved "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz"
@ -6144,6 +6472,13 @@ sumchecker@^3.0.1:
dependencies: dependencies:
debug "^4.1.0" debug "^4.1.0"
supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
dependencies:
has-flag "^4.0.0"
supports-preserve-symlinks-flag@^1.0.0: supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
@ -6310,6 +6645,11 @@ type-fest@^0.21.3:
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz"
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
type-fest@^2.13.0:
version "2.19.0"
resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz"
integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==
type-fest@^4.21.0, type-fest@^4.26.1: type-fest@^4.21.0, type-fest@^4.26.1:
version "4.37.0" version "4.37.0"
resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz" resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz"
@ -6566,6 +6906,21 @@ update-browserslist-db@^1.1.1:
escalade "^3.2.0" escalade "^3.2.0"
picocolors "^1.1.1" picocolors "^1.1.1"
update-check@1.5.4:
version "1.5.4"
resolved "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz"
integrity sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==
dependencies:
registry-auth-token "3.3.2"
registry-url "3.1.0"
uri-js@^4.2.2:
version "4.4.1"
resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
dependencies:
punycode "^2.1.0"
url-parse@^1.5.3: url-parse@^1.5.3:
version "1.5.10" version "1.5.10"
resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz"
@ -6615,6 +6970,11 @@ uvu@^0.5.0:
kleur "^4.0.3" kleur "^4.0.3"
sade "^1.7.3" sade "^1.7.3"
vary@~1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
vfile-location@^4.0.0: vfile-location@^4.0.0:
version "4.1.0" version "4.1.0"
resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz" resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz"
@ -6741,6 +7101,13 @@ which@^2.0.1:
dependencies: dependencies:
isexe "^2.0.0" isexe "^2.0.0"
widest-line@^4.0.1:
version "4.0.1"
resolved "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz"
integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==
dependencies:
string-width "^5.0.1"
widest-line@^5.0.0: widest-line@^5.0.0:
version "5.0.0" version "5.0.0"
resolved "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz" resolved "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz"
@ -6785,6 +7152,15 @@ wrap-ansi@^7.0.0:
string-width "^4.1.0" string-width "^4.1.0"
strip-ansi "^6.0.0" strip-ansi "^6.0.0"
wrap-ansi@^8.0.1:
version "8.1.0"
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz"
integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
dependencies:
ansi-styles "^6.1.0"
string-width "^5.0.1"
strip-ansi "^7.0.1"
wrap-ansi@^8.1.0: wrap-ansi@^8.1.0:
version "8.1.0" version "8.1.0"
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz"