From a846a549cd5448be161190a6b406e6d835b51fc9 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Fri, 10 Jul 2026 13:11:55 +0100 Subject: [PATCH 01/34] Changes to pull to include modules --- siteglide-cli-pull.js | 343 +++++++++++++++++++++++++++++++----------- 1 file changed, 251 insertions(+), 92 deletions(-) diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index ed072e7..e032098 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -18,118 +18,277 @@ const program = require('commander'), const pullSpinner = ora({ text: 'Pulling files', stream: process.stdout }); +/** + * Remove empty directories left under a pull root after restructuring. + * + * @param {string} root - Relative directory to scan (e.g. marketplace_builder). + * Side effects: deletes empty child directories under `./${root}`; logs non-ENOTEMPTY errors. + */ +const cleanupEmptyDirs = (root) => { + const list = fs.readdirSync(`./${root}`).filter(folder => fs.statSync(path.join(`./${root}`, folder)).isDirectory()); + for (let i = 0; i < list.length; i++) { + const folder = path.join(`./${root}`, list[i]); + try { + fs.rmdirSync(folder); + } catch (e) { + if (e.code !== 'ENOTEMPTY') { + logger.Error(e); + } + } + } +}; + +/** + * If a pull extract contains a nested `modules/` folder, merge it into `./modules`. + * + * @param {string} fromRoot - Relative directory that may contain `modules/` (e.g. marketplace_builder or .tmp/...). + * Side effects: creates `./modules` if needed; copies module files into it (overwrites); deletes `${fromRoot}/modules`. + * No-op if `${fromRoot}/modules` does not exist. + */ +const moveModulesToRoot = (fromRoot) => { + const modulesPath = `./${fromRoot}/modules`; + if (fs.existsSync(modulesPath)) { + fs.ensureDirSync(`./${dir.MODULES}`); + shell.cp('-R', `${modulesPath}/*`, `./${dir.MODULES}/`); + shell.rm('-r', modulesPath); + } +}; + +/** + * Download the main site backup zip and convert it into local `marketplace_builder/`. + * Calls Siteglide-API `/cli/backup` then `/cli/backupStatus/:id` (no module_name). + * + * @param {Gateway} gateway - Authenticated API client for the current environment. + * Side effects: writes/overwrites `./marketplace_builder`; may merge into `./modules`; + * updates `pullSpinner` text; downloads then deletes a temporary zip. + */ +const pullSiteZip = async (gateway) => { + logger.Info('[pull] Step: downloading main site zip (no module_name)'); + const filename = `${dir.LEGACY_APP}.zip`; + pullSpinner.text = 'Pulling site files'; + const pullTask = await gateway.pullZip(); + logger.Info(`[pull] Site backup started (id: ${pullTask.id})`); + const readyTask = await waitForStatus(() => gateway.pullZipStatus(pullTask.id)); + logger.Info(`[pull] Site backup ready (status: ${readyTask.status}) — downloading zip`); + await downloadFile(readyTask.zip_file.url, filename); + logger.Info(`[pull] Unzipping site into ./${dir.LEGACY_APP} and converting app/ → marketplace_builder`); + await unzip(filename, dir.LEGACY_APP); + shell.cp('-R', `./${dir.LEGACY_APP}/app/*`, `./${dir.LEGACY_APP}`); + shell.rm(`./${filename}`); + moveModulesToRoot(dir.LEGACY_APP); + if (fs.existsSync(`./${dir.LEGACY_APP}/asset_manifest.json`)) { + shell.rm(`./${dir.LEGACY_APP}/asset_manifest.json`); + } + shell.rm('-r', `./${dir.LEGACY_APP}/app`); + cleanupEmptyDirs(dir.LEGACY_APP); + logger.Info('[pull] Site files pull complete'); +}; + +/** + * Download one module's public-files backup and merge it into `./modules//`. + * Calls Siteglide-API `/cli/backup` with `module_name`, then polls `/cli/backupStatus/:id`. + * Does not clear `marketplace_builder`. + * + * @param {Gateway} gateway - Authenticated API client for the current environment. + * @param {string} moduleName - Installed module machine name to pull. + * @param {number} index - 1-based position in the current pull queue (for logs). + * @param {number} total - Total modules in the current pull queue (for logs). + * Side effects: writes/overwrites files under `./modules`; updates `pullSpinner` text; + * uses then deletes a temp zip and `.tmp/pull-` work directory. + */ +const pullModuleZip = async (gateway, moduleName, index, total) => { + logger.Info(`[pull] Step: module ${index}/${total} — "${moduleName}"`); + const filename = `${dir.MODULES}-${moduleName}.zip`; + const workDir = path.join(dir.TMP, `pull-${moduleName}`); + pullSpinner.text = `Pulling module: ${moduleName}`; + const pullTask = await gateway.pullZip({ module_name: moduleName }); + logger.Info(`[pull] Module "${moduleName}" backup started (id: ${pullTask.id})`); + const readyTask = await waitForStatus(() => gateway.pullZipStatus(pullTask.id)); + logger.Info(`[pull] Module "${moduleName}" backup ready (status: ${readyTask.status}) — downloading zip`); + await downloadFile(readyTask.zip_file.url, filename); + fs.removeSync(workDir); + await unzip(filename, workDir); + shell.rm(`./${filename}`); + + if (fs.existsSync(`./${workDir}/app`)) { + shell.cp('-R', `./${workDir}/app/*`, `./${workDir}`); + shell.rm('-r', `./${workDir}/app`); + } + + moveModulesToRoot(workDir); + + // Some module zips nest files as /... instead of modules//... + const directModulePath = `./${workDir}/${moduleName}`; + if (fs.existsSync(directModulePath)) { + logger.Info(`[pull] Module "${moduleName}" zip used direct layout; copying into ./${dir.MODULES}/${moduleName}`); + fs.ensureDirSync(`./${dir.MODULES}/${moduleName}`); + shell.cp('-R', `${directModulePath}/*`, `./${dir.MODULES}/${moduleName}/`); + } + + if (fs.existsSync(`./${workDir}`)) { + shell.rm('-r', `./${workDir}`); + } + if (fs.existsSync(`./${dir.TMP}`) && fs.readdirSync(`./${dir.TMP}`).length === 0) { + shell.rm('-r', `./${dir.TMP}`); + } + logger.Info(`[pull] Module "${moduleName}" pull complete`); +}; + +/** + * Fetch the asset file list from Siteglide-API `/cli/pull` and download matching text/binary assets + * into `marketplace_builder/` by physical_file_path. + * + * @param {Gateway} gateway - Authenticated API client for the current environment. + * Side effects: creates dirs and writes/overwrites asset files under `./marketplace_builder`; + * updates `pullSpinner` text; downloads each asset from its remote_url. + */ +const pullAssets = async (gateway) => { + logger.Info('[pull] Step: downloading assets via /cli/pull'); + pullSpinner.text = 'Pulling assets'; + const response = await gateway.pull(); + const asset_files = []; + const assets = response.asset || []; + logger.Info(`[pull] Asset list returned ${assets.length} file(s); filtering by extension`); + const time = '?updated=' + new Date().getTime(); + await Promise.all(assets.map(async function (file) { + const urlToTest = file.data.remote_url.toLowerCase(); + return new Promise(async function (resolve) { + if ( + (urlToTest.indexOf('.css') > -1) || + (urlToTest.indexOf('.js') > -1) || + (urlToTest.indexOf('.scss') > -1) || + (urlToTest.indexOf('.sass') > -1) || + (urlToTest.indexOf('.less') > -1) || + (urlToTest.indexOf('.txt') > -1) || + (urlToTest.indexOf('.html') > -1) || + (urlToTest.indexOf('.svg') > -1) || + (urlToTest.indexOf('.map') > -1) || + (urlToTest.indexOf('.json') > -1) || + (urlToTest.indexOf('.htm') > -1) + ) { + await getBinary(file.data.remote_url, time).then(body => { + if (body !== 'error_missing_file') { + file.data.body = body; + asset_files.push(file); + } + resolve(); + }); + } else { + resolve(); + } + }); + })); + asset_files.forEach(file => { + let folderPath = file.data.physical_file_path.split('/'); + folderPath = dir.LEGACY_APP + '/' + folderPath.slice(0, folderPath.length - 1).join('/'); + fs.mkdirSync(folderPath, { recursive: true }); + fs.writeFileSync(dir.LEGACY_APP + '/' + file.data.physical_file_path, file.data.body, logger.Error); + }); + logger.Info(`[pull] Wrote ${asset_files.length} asset file(s) into ./${dir.LEGACY_APP}`); +}; + +/** + * Decide which installed modules to pull for this run. + * + * @param {string[]} installedModules - Module names returned by `/cli/list_modules`. + * @param {string|undefined} moduleFilter - Optional `-m` value; when set, only that module is selected. + * @returns {string[]|null} Modules to pull, or `null` if `moduleFilter` is set but not installed. + * Side effects: none. + */ +const selectModules = (installedModules, moduleFilter) => { + if (!moduleFilter) { + return installedModules; + } + if (installedModules.indexOf(moduleFilter) === -1) { + return null; + } + return [moduleFilter]; +}; + program .version(version, '-v, --version') .name('siteglide-cli pull') .usage('') - .description('This will pull down all files from the site in to a folder named marketplace_builder within your current directory. During this process it will also overwrite any local versions of files if they already exist. If you have made any changes locally that you have not synced they WILL be overwritten.') + .description('Pull site files into marketplace_builder and module public files into modules/. Overwrites local files. By default pulls all installed modules; use -m to filter to one module.') .arguments('[environment]', 'Name of environment. Example: staging') .option('-c --config-file ', 'config file path', '.siteglide-config') .option('-i --ignore-assets', 'Do not download assets such as CSS, JS, JSON etc', false) - .option('-m --module ', 'Module name to pull', '') + .option('-m --module ', 'Optional module name filter. Without this flag, all installed modules are pulled.') .action((environment, params) => { process.env.CONFIG_FILE_PATH = params.configFile; const ignoreAssets = params.ignoreAssets; - const module = params.module; + const moduleFilter = params.module; const authData = fetchAuthData(environment, program); const gateway = new Gateway(authData); - const filename = `${dir.LEGACY_APP}.zip`; Confirm('Are you sure you would like to pull? This will overwrite your local files immediately! (Y/n)\n').then(async function (response) { - if(response === 'Y'){ - pullSpinner.start(); - - await gateway.pullZip({ module_name: module }).then(pullTask => { - waitForStatus(() => gateway.pullZipStatus(pullTask.id)) - .then(pullTask => downloadFile(pullTask.zip_file.url, filename)) - .then(() => unzip(filename, dir.LEGACY_APP)) - .then(() => shell.cp('-R', `./${dir.LEGACY_APP}/app/*`, `./${dir.LEGACY_APP}`)) - .then(() => shell.rm(`./${filename}`)) - .then(() => { - if(fs.existsSync(`./${dir.LEGACY_APP}/modules`)){ - shell.cp('-R', `./${dir.LEGACY_APP}/modules`, `./`) - shell.rm('-r', `./${dir.LEGACY_APP}/modules`) - } - }) - .then(() => shell.rm(`./${dir.LEGACY_APP}/asset_manifest.json`)) - .then(() => shell.rm('-r',`./${dir.LEGACY_APP}/app`)) - .then(() => { - var list = fs.readdirSync(`./${dir.LEGACY_APP}`).filter(folder => fs.statSync(path.join(`./${dir.LEGACY_APP}`, folder)).isDirectory()); - for(var i=0; i { - if(ignoreAssets){ - pullSpinner.succeed('Pulled files'); - } - }) - .catch(e => { - logger.Debug(e); - pullSpinner.fail('Pull failed'); + if (response === 'Y') { + try { + pullSpinner.start(); + logger.Info('[pull] Confirmed — starting pull'); + if (moduleFilter) { + logger.Info(`[pull] Module filter (-m): "${moduleFilter}"`); + } else { + logger.Info('[pull] No -m filter — will pull all installed modules'); + } + if (ignoreAssets) { + logger.Info('[pull] --ignore-assets set; asset download step will be skipped'); + } + + pullSpinner.text = 'Fetching installed modules'; + logger.Info('[pull] Step: listing installed modules via /cli/list_modules'); + const modulesResponse = await gateway.listModules(); + const installedModules = (modulesResponse && modulesResponse.data) ? modulesResponse.data : []; + logger.Info(`[pull] list_modules returned ${installedModules.length} module(s)`); + if (installedModules.length > 0) { + installedModules.forEach((name, i) => { + logger.Info(`\t${i + 1}. ${name}`, { hideTimestamp: true }); + }); + } else { + logger.Info('[pull] Raw list_modules response keys: ' + Object.keys(modulesResponse || {}).join(', ')); + } + + const modulesToPull = selectModules(installedModules, moduleFilter); + + if (moduleFilter && modulesToPull === null) { + pullSpinner.fail(`Module "${moduleFilter}" is not installed on this site`); + logger.Error(`[pull] Filter "${moduleFilter}" not found in installed modules list above`); process.exit(1); - }); - }) - .catch(e => { + } + + if (modulesToPull.length === 0) { + logger.Info('[pull] No modules selected to pull'); + } else { + logger.Info(`[pull] Will pull ${modulesToPull.length} module(s): ${modulesToPull.join(', ')}`); + } + + await pullSiteZip(gateway); + + for (let i = 0; i < modulesToPull.length; i++) { + await pullModuleZip(gateway, modulesToPull[i], i + 1, modulesToPull.length); + } + if (modulesToPull.length > 0) { + logger.Info('[pull] All selected modules pulled'); + } + + if (!ignoreAssets) { + await pullAssets(gateway); + } else { + logger.Info('[pull] Skipping assets step'); + } + + logger.Info('[pull] All steps finished'); + pullSpinner.succeed('Pulled files'); + } catch (e) { + logger.Debug(e); pullSpinner.fail('Pull failed'); - logger.Error(e.message); + logger.Error(e.message || e); process.exit(1); - }); - - if(!ignoreAssets){ - await gateway.pull().then(async(response) => { - var asset_files = []; - const assets = response.asset; - var time = '?updated='+new Date().getTime(); - await Promise.all(assets.map(async function(file){ - var urlToTest = file.data.remote_url.toLowerCase(); - return new Promise(async function(resolve) { - if( - (urlToTest.indexOf('.css')>-1)|| - (urlToTest.indexOf('.js')>-1)|| - (urlToTest.indexOf('.scss')>-1)|| - (urlToTest.indexOf('.sass')>-1)|| - (urlToTest.indexOf('.less')>-1)|| - (urlToTest.indexOf('.txt')>-1)|| - (urlToTest.indexOf('.html')>-1)|| - (urlToTest.indexOf('.svg')>-1)|| - (urlToTest.indexOf('.map')>-1)|| - (urlToTest.indexOf('.json')>-1)|| - (urlToTest.indexOf('.htm')>-1) - ){ - await getBinary(file.data.remote_url,time).then(response => { - if(response!=='error_missing_file'){ - file.data.body = response; - asset_files.push(file); - resolve(); - } - }); - }else{ - resolve(); - } - }); - })); - asset_files.forEach(file => { - var folderPath = file.data.physical_file_path.split('/'); - folderPath = dir.LEGACY_APP+'/'+folderPath.slice(0, folderPath.length-1).join('/'); - fs.mkdirSync(folderPath, { recursive: true }); - fs.writeFileSync(dir.LEGACY_APP+'/'+file.data.physical_file_path, file.data.body, logger.Error); - }); - pullSpinner.succeed('Pulled files'); - }); } - - }else{ + } else { logger.Error('[Cancelled] Pull command not executed, your files have been left untouched.'); } }); }); -program.parse(process.argv); \ No newline at end of file +program.parse(process.argv); From 74a11a8421eeacf914df9af733b5b3fd8dfa8dc5 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Fri, 10 Jul 2026 13:33:03 +0100 Subject: [PATCH 02/34] Improved tidy up step. Includes promise to make sure the user knows when it's safe to start work again or commit the pull to git. --- siteglide-cli-pull.js | 168 +++++++++++++++++++++++++++++++----------- 1 file changed, 127 insertions(+), 41 deletions(-) diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index e032098..a249fc1 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -12,24 +12,48 @@ const program = require('commander'), Confirm = require('./lib/confirm'), getBinary = require('./lib/assets/getBinary'), unzip = require('./lib/unzip'), - shell = require('shelljs'), path = require('path'), dir = require('./lib/directories'); const pullSpinner = ora({ text: 'Pulling files', stream: process.stdout }); +/** + * Copy each child of `srcDir` into `destDir` (merge/overwrite). + * Used instead of copying a folder into its parent, which fs-extra cannot do safely. + * + * @param {string} srcDir - Source directory whose children should be copied. + * @param {string} destDir - Destination directory to receive those children. + * Side effects: writes/overwrites files and folders under destDir. + */ +const copyChildren = async (srcDir, destDir) => { + await fs.ensureDir(destDir); + const children = await fs.readdir(srcDir); + for (let i = 0; i < children.length; i++) { + const name = children[i]; + await fs.copy(path.join(srcDir, name), path.join(destDir, name), { overwrite: true }); + } +}; + /** * Remove empty directories left under a pull root after restructuring. * * @param {string} root - Relative directory to scan (e.g. marketplace_builder). * Side effects: deletes empty child directories under `./${root}`; logs non-ENOTEMPTY errors. */ -const cleanupEmptyDirs = (root) => { - const list = fs.readdirSync(`./${root}`).filter(folder => fs.statSync(path.join(`./${root}`, folder)).isDirectory()); - for (let i = 0; i < list.length; i++) { - const folder = path.join(`./${root}`, list[i]); +const cleanupEmptyDirs = async (root) => { + const rootPath = `./${root}`; + if (!(await fs.pathExists(rootPath))) { + return; + } + const entries = await fs.readdir(rootPath); + for (let i = 0; i < entries.length; i++) { + const folder = path.join(rootPath, entries[i]); + const stat = await fs.stat(folder); + if (!stat.isDirectory()) { + continue; + } try { - fs.rmdirSync(folder); + await fs.rmdir(folder); } catch (e) { if (e.code !== 'ENOTEMPTY') { logger.Error(e); @@ -39,19 +63,23 @@ const cleanupEmptyDirs = (root) => { }; /** - * If a pull extract contains a nested `modules/` folder, merge it into `./modules`. + * If a pull extract contains a nested `modules/` folder, merge it into `./modules` + * (project root), then delete the nested copy. Siteglide expects modules at `./modules`, + * not under `marketplace_builder/modules`. * * @param {string} fromRoot - Relative directory that may contain `modules/` (e.g. marketplace_builder or .tmp/...). * Side effects: creates `./modules` if needed; copies module files into it (overwrites); deletes `${fromRoot}/modules`. * No-op if `${fromRoot}/modules` does not exist. */ -const moveModulesToRoot = (fromRoot) => { +const moveModulesToRoot = async (fromRoot) => { const modulesPath = `./${fromRoot}/modules`; - if (fs.existsSync(modulesPath)) { - fs.ensureDirSync(`./${dir.MODULES}`); - shell.cp('-R', `${modulesPath}/*`, `./${dir.MODULES}/`); - shell.rm('-r', modulesPath); + if (!(await fs.pathExists(modulesPath))) { + return; } + logger.Info(`[pull] Moving ./${fromRoot}/modules → ./${dir.MODULES}`); + await fs.ensureDir(`./${dir.MODULES}`); + await fs.copy(modulesPath, `./${dir.MODULES}`, { overwrite: true }); + await fs.remove(modulesPath); }; /** @@ -73,14 +101,14 @@ const pullSiteZip = async (gateway) => { await downloadFile(readyTask.zip_file.url, filename); logger.Info(`[pull] Unzipping site into ./${dir.LEGACY_APP} and converting app/ → marketplace_builder`); await unzip(filename, dir.LEGACY_APP); - shell.cp('-R', `./${dir.LEGACY_APP}/app/*`, `./${dir.LEGACY_APP}`); - shell.rm(`./${filename}`); - moveModulesToRoot(dir.LEGACY_APP); - if (fs.existsSync(`./${dir.LEGACY_APP}/asset_manifest.json`)) { - shell.rm(`./${dir.LEGACY_APP}/asset_manifest.json`); + await copyChildren(`./${dir.LEGACY_APP}/app`, `./${dir.LEGACY_APP}`); + await fs.remove(`./${filename}`); + await moveModulesToRoot(dir.LEGACY_APP); + if (await fs.pathExists(`./${dir.LEGACY_APP}/asset_manifest.json`)) { + await fs.remove(`./${dir.LEGACY_APP}/asset_manifest.json`); } - shell.rm('-r', `./${dir.LEGACY_APP}/app`); - cleanupEmptyDirs(dir.LEGACY_APP); + await fs.remove(`./${dir.LEGACY_APP}/app`); + await cleanupEmptyDirs(dir.LEGACY_APP); logger.Info('[pull] Site files pull complete'); }; @@ -106,40 +134,38 @@ const pullModuleZip = async (gateway, moduleName, index, total) => { const readyTask = await waitForStatus(() => gateway.pullZipStatus(pullTask.id)); logger.Info(`[pull] Module "${moduleName}" backup ready (status: ${readyTask.status}) — downloading zip`); await downloadFile(readyTask.zip_file.url, filename); - fs.removeSync(workDir); + await fs.remove(workDir); await unzip(filename, workDir); - shell.rm(`./${filename}`); + await fs.remove(`./${filename}`); - if (fs.existsSync(`./${workDir}/app`)) { - shell.cp('-R', `./${workDir}/app/*`, `./${workDir}`); - shell.rm('-r', `./${workDir}/app`); + if (await fs.pathExists(`./${workDir}/app`)) { + await copyChildren(`./${workDir}/app`, `./${workDir}`); + await fs.remove(`./${workDir}/app`); } - moveModulesToRoot(workDir); + await moveModulesToRoot(workDir); // Some module zips nest files as /... instead of modules//... const directModulePath = `./${workDir}/${moduleName}`; - if (fs.existsSync(directModulePath)) { + if (await fs.pathExists(directModulePath)) { logger.Info(`[pull] Module "${moduleName}" zip used direct layout; copying into ./${dir.MODULES}/${moduleName}`); - fs.ensureDirSync(`./${dir.MODULES}/${moduleName}`); - shell.cp('-R', `${directModulePath}/*`, `./${dir.MODULES}/${moduleName}/`); + await fs.ensureDir(`./${dir.MODULES}/${moduleName}`); + await fs.copy(directModulePath, `./${dir.MODULES}/${moduleName}`, { overwrite: true }); } - if (fs.existsSync(`./${workDir}`)) { - shell.rm('-r', `./${workDir}`); - } - if (fs.existsSync(`./${dir.TMP}`) && fs.readdirSync(`./${dir.TMP}`).length === 0) { - shell.rm('-r', `./${dir.TMP}`); + if (await fs.pathExists(`./${workDir}`)) { + await fs.remove(`./${workDir}`); } logger.Info(`[pull] Module "${moduleName}" pull complete`); }; /** * Fetch the asset file list from Siteglide-API `/cli/pull` and download matching text/binary assets - * into `marketplace_builder/` by physical_file_path. + * by physical_file_path. Paths under `modules/` are written to `./modules/...`; everything else + * goes under `./marketplace_builder/...` so this step does not recreate `marketplace_builder/modules`. * * @param {Gateway} gateway - Authenticated API client for the current environment. - * Side effects: creates dirs and writes/overwrites asset files under `./marketplace_builder`; + * Side effects: creates dirs and writes/overwrites asset files under `./marketplace_builder` or `./modules`; * updates `pullSpinner` text; downloads each asset from its remote_url. */ const pullAssets = async (gateway) => { @@ -178,13 +204,71 @@ const pullAssets = async (gateway) => { } }); })); + let moduleAssetCount = 0; asset_files.forEach(file => { - let folderPath = file.data.physical_file_path.split('/'); - folderPath = dir.LEGACY_APP + '/' + folderPath.slice(0, folderPath.length - 1).join('/'); - fs.mkdirSync(folderPath, { recursive: true }); - fs.writeFileSync(dir.LEGACY_APP + '/' + file.data.physical_file_path, file.data.body, logger.Error); + const physicalPath = file.data.physical_file_path.replace(/\\/g, '/'); + const isModuleAsset = physicalPath === dir.MODULES || physicalPath.indexOf(dir.MODULES + '/') === 0; + const root = isModuleAsset ? dir.MODULES : dir.LEGACY_APP; + const relativePath = isModuleAsset + ? physicalPath.slice(dir.MODULES.length).replace(/^\//, '') + : physicalPath; + if (isModuleAsset) { + moduleAssetCount++; + } + if (!relativePath) { + return; + } + const fullPath = path.join(root, relativePath); + fs.mkdirSync(path.dirname(fullPath), { recursive: true }); + fs.writeFileSync(fullPath, file.data.body, logger.Error); }); - logger.Info(`[pull] Wrote ${asset_files.length} asset file(s) into ./${dir.LEGACY_APP}`); + logger.Info(`[pull] Wrote ${asset_files.length} asset file(s) (${moduleAssetCount} under ./${dir.MODULES})`); +}; + +/** + * Final local cleanup after site/module/asset pulls have finished. + * + * Side effects: removes leftover pull zips (`marketplace_builder.zip`, `modules-*.zip`), + * removes `./.tmp` if present, moves any leftover `marketplace_builder/modules` into `./modules` + * then deletes that nested folder, removes empty dirs under `marketplace_builder`; + * updates `pullSpinner` text and writes tidying-up logs. + */ +const tidyUpAfterPull = async () => { + logger.Info('[pull] Step: tidying up local files'); + pullSpinner.text = 'Tidying up...'; + + const siteZip = `./${dir.LEGACY_APP}.zip`; + if (await fs.pathExists(siteZip)) { + await fs.remove(siteZip); + logger.Info(`[pull] Removed leftover ${siteZip}`); + } + + const cwdEntries = await fs.readdir('.'); + for (let i = 0; i < cwdEntries.length; i++) { + const name = cwdEntries[i]; + if (name.indexOf(`${dir.MODULES}-`) === 0 && name.slice(-4) === '.zip') { + await fs.remove(`./${name}`); + logger.Info(`[pull] Removed leftover ./${name}`); + } + } + + if (await fs.pathExists(`./${dir.TMP}`)) { + await fs.remove(`./${dir.TMP}`); + logger.Info(`[pull] Removed ./${dir.TMP}`); + } + + // Pull must not leave modules nested under marketplace_builder + const nestedModules = `./${dir.LEGACY_APP}/modules`; + if (await fs.pathExists(nestedModules)) { + await moveModulesToRoot(dir.LEGACY_APP); + } + if (await fs.pathExists(nestedModules)) { + await fs.remove(nestedModules); + logger.Info(`[pull] Removed leftover ${nestedModules}`); + } + + await cleanupEmptyDirs(dir.LEGACY_APP); + logger.Info('[pull] Tidying up complete'); }; /** @@ -221,7 +305,7 @@ program const authData = fetchAuthData(environment, program); const gateway = new Gateway(authData); - Confirm('Are you sure you would like to pull? This will overwrite your local files immediately! (Y/n)\n').then(async function (response) { + return Confirm('Are you sure you would like to pull? This will overwrite your local files immediately! (Y/n)\n').then(async function (response) { if (response === 'Y') { try { pullSpinner.start(); @@ -277,6 +361,8 @@ program logger.Info('[pull] Skipping assets step'); } + await tidyUpAfterPull(); + logger.Info('[pull] All steps finished'); pullSpinner.succeed('Pulled files'); } catch (e) { From e700ede0827d58bcb2b0bcd9500284de06a8bc07 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Wed, 22 Jul 2026 11:29:53 +0100 Subject: [PATCH 03/34] Siteglide pull also pulls agent skills. --- siteglide-cli-pull.js | 306 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 305 insertions(+), 1 deletion(-) diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index a249fc1..50235bf 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -17,6 +17,9 @@ const program = require('commander'), const pullSpinner = ora({ text: 'Pulling files', stream: process.stdout }); +/** Project-root folder that receives merged agent files from modules. */ +const AGENTS_ROOT = '.agents'; + /** * Copy each child of `srcDir` into `destDir` (merge/overwrite). * Used instead of copying a folder into its parent, which fs-extra cannot do safely. @@ -34,6 +37,304 @@ const copyChildren = async (srcDir, destDir) => { } }; +/** + * Clear the read-only / write-protect bit on a file so it can be overwritten on the next pull. + * No-op for missing paths and directories. Failures are logged at Debug and ignored. + * + * @param {string} filePath - Absolute or relative path to a file. + * Side effects: may chmod the file to add owner-write. + */ +const makeWritable = async (filePath) => { + try { + if (!(await fs.pathExists(filePath))) { + return; + } + const stats = await fs.stat(filePath); + if (stats.isDirectory()) { + return; + } + await fs.chmod(filePath, stats.mode | 0o200); + } catch (e) { + logger.Debug(`[pull] Could not clear read-only on ${filePath}: ${e.message}`); + } +}; + +/** + * Mark a file read-only after merge (cross-platform hint that it came from a module). + * Directories are left writable so later pulls can add/replace children. + * Failures are logged at Debug and ignored. + * + * @param {string} filePath - Absolute or relative path to a file. + * Side effects: may chmod the file to remove write bits. + */ +const makeReadOnly = async (filePath) => { + try { + const stats = await fs.stat(filePath); + if (stats.isDirectory()) { + return; + } + await fs.chmod(filePath, stats.mode & ~0o222); + } catch (e) { + logger.Debug(`[pull] Could not set read-only on ${filePath}: ${e.message}`); + } +}; + +/** + * Recursively merge `srcDir` into `destDir`. Existing destination files are made writable, + * overwritten, then marked read-only again so the next pull can still replace them. + * + * @param {string} srcDir - Source `.agents` tree under a module. + * @param {string} destDir - Destination project-root `.agents` directory. + * @param {string} moduleName - Module name (for log messages). + * @returns {Promise} Number of files written. + * Side effects: creates dirs; writes/overwrites files under destDir; may chmod files. + */ +const copyAgentsTree = async (srcDir, destDir, moduleName) => { + await fs.ensureDir(destDir); + const entries = await fs.readdir(srcDir); + let fileCount = 0; + for (let i = 0; i < entries.length; i++) { + const name = entries[i]; + const srcPath = path.join(srcDir, name); + const destPath = path.join(destDir, name); + const stats = await fs.stat(srcPath); + if (stats.isDirectory()) { + logger.Info(`[pull] .agents: merging directory "${name}/" from module "${moduleName}"`); + fileCount += await copyAgentsTree(srcPath, destPath, moduleName); + } else { + await makeWritable(destPath); + await fs.copy(srcPath, destPath, { overwrite: true }); + await makeReadOnly(destPath); + const displayPath = destPath.replace(/\\/g, '/').replace(/^\.\//, ''); + logger.Info(`[pull] .agents: wrote ./${displayPath} (from module "${moduleName}")`); + fileCount++; + } + } + return fileCount; +}; + +/** + * For each pulled module, if `modules//public/assets/.agents/` exists, merge its + * contents into the project-root `./.agents/` directory (overwrite on conflict). + * When at least one `SKILL.md` is present under `./.agents`, also scaffolds IDE discovery + * folders (Cursor, Claude, Windsurf, Copilot) pointing at the shared skills tree. + * + * @param {string[]} moduleNames - Module machine names that were pulled this run. + * @returns {Promise<{modulesWithAgents: number, totalFiles: number, skillCount: number}>} + * Side effects: may create `./.agents` and write/overwrite files under it; may create IDE + * root folders/symlinks; updates pullSpinner text. + */ +const mergeModuleAgentsToRoot = async (moduleNames) => { + logger.Info(`[pull] Step: merging modules/*/public/assets/${AGENTS_ROOT} → ./${AGENTS_ROOT}`); + pullSpinner.text = `Merging ${AGENTS_ROOT} files`; + + const result = { modulesWithAgents: 0, totalFiles: 0, skillCount: 0 }; + + if (!moduleNames || moduleNames.length === 0) { + logger.Info(`[pull] No modules to scan for ${AGENTS_ROOT} — skip`); + return result; + } + + for (let i = 0; i < moduleNames.length; i++) { + const moduleName = moduleNames[i]; + const agentsSrc = path.join('.', dir.MODULES, moduleName, 'public', 'assets', AGENTS_ROOT); + const agentsSrcDisplay = agentsSrc.replace(/\\/g, '/'); + logger.Info(`[pull] Checking for ${agentsSrcDisplay}`); + + if (!(await fs.pathExists(agentsSrc))) { + logger.Info(`[pull] Module "${moduleName}" — no ${AGENTS_ROOT} directory found`); + continue; + } + + const srcStat = await fs.stat(agentsSrc); + if (!srcStat.isDirectory()) { + logger.Info(`[pull] Module "${moduleName}" — ${AGENTS_ROOT} exists but is not a directory; skip`); + continue; + } + + logger.Info(`[pull] Module "${moduleName}" — found ${AGENTS_ROOT}; merging into ./${AGENTS_ROOT}`); + const count = await copyAgentsTree(agentsSrc, `./${AGENTS_ROOT}`, moduleName); + result.modulesWithAgents++; + result.totalFiles += count; + logger.Info(`[pull] Module "${moduleName}" — merged ${count} file(s) into ./${AGENTS_ROOT}`); + } + + logger.Info( + `[pull] ${AGENTS_ROOT} merge complete: ${result.modulesWithAgents} module(s) contributed, ${result.totalFiles} file(s) written to ./${AGENTS_ROOT}` + ); + + result.skillCount = await countSkillMarkdownFiles(`./${AGENTS_ROOT}`); + logger.Info(`[pull] Found ${result.skillCount} SKILL.md file(s) under ./${AGENTS_ROOT}`); + + if (result.skillCount > 0) { + await ensureAgentIdeScaffolding(); + } else { + logger.Info('[pull] No skills found — skipping IDE discovery scaffolding'); + } + + return result; +}; + +/** + * Recursively count `SKILL.md` files under a directory (follows real dirs, not via symlink walk of link targets beyond lstat dirs). + * + * @param {string} rootDir - Directory to scan. + * @returns {Promise} Number of SKILL.md files found. + * Side effects: none. + */ +const countSkillMarkdownFiles = async (rootDir) => { + if (!(await fs.pathExists(rootDir))) { + return 0; + } + let count = 0; + const walk = async (current) => { + const entries = await fs.readdir(current); + for (let i = 0; i < entries.length; i++) { + const fullPath = path.join(current, entries[i]); + const stats = await fs.lstat(fullPath); + if (stats.isDirectory()) { + await walk(fullPath); + } else if (stats.isFile() && entries[i] === 'SKILL.md') { + count++; + } + } + }; + await walk(rootDir); + return count; +}; + +/** + * Ensure `linkPath` is a directory symlink/junction pointing at `targetPath` + * (source of truth under `.agents/skills`). Cross-platform: junction on Windows, dir symlink elsewhere. + * + * @param {string} linkPath - Relative path for the discovery folder (e.g. `.cursor/skills`). + * @param {string} targetPath - Relative path to the shared skills tree (e.g. `.agents/skills`). + * Side effects: may remove an existing link/dir at linkPath; creates parent dirs; creates symlink/junction. + */ +const ensureSkillsDirLink = async (linkPath, targetPath) => { + const linkAbs = path.resolve(linkPath); + const targetAbs = path.resolve(targetPath); + + logger.Info(`[pull] Ensuring skills link: ${linkPath} → ${targetPath}`); + await fs.ensureDir(path.dirname(linkAbs)); + await fs.ensureDir(targetAbs); + + if (await fs.pathExists(linkAbs)) { + const linkStat = await fs.lstat(linkAbs); + if (linkStat.isSymbolicLink()) { + let currentTarget = await fs.readlink(linkAbs); + if (!path.isAbsolute(currentTarget)) { + currentTarget = path.resolve(path.dirname(linkAbs), currentTarget); + } + if (path.resolve(currentTarget) === targetAbs) { + logger.Info(`[pull] Skills link already correct: ${linkPath}`); + return; + } + logger.Info(`[pull] Replacing outdated skills link at ${linkPath}`); + await fs.remove(linkAbs); + } else { + logger.Info(`[pull] Replacing existing path at ${linkPath} with link to shared ${targetPath}`); + await fs.remove(linkAbs); + } + } + + const linkType = process.platform === 'win32' ? 'junction' : 'dir'; + const linkTarget = process.platform === 'win32' + ? targetAbs + : path.relative(path.dirname(linkAbs), targetAbs) || '.'; + await fs.symlink(linkTarget, linkAbs, linkType); + logger.Info(`[pull] Created ${linkType} ${linkPath} → ${targetPath}`); +}; + +/** + * Write a managed text file (overwrite). Used for IDE pointer rules that tell agents + * how to find `./.agents` when native discovery is missing. + * + * @param {string} filePath - Relative path to write. + * @param {string} contents - File body. + * Side effects: creates parent dirs; writes/overwrites the file; may chmod read-only after write. + */ +const writeManagedAgentFile = async (filePath, contents) => { + await fs.ensureDir(path.dirname(filePath)); + await makeWritable(filePath); + await fs.writeFile(filePath, contents, 'utf8'); + await makeReadOnly(filePath); + logger.Info(`[pull] Wrote ${filePath.replace(/\\/g, '/')}`); +}; + +/** Cursor always-on rule — mirrors Siteglide/Siteglide-AI-Skills `.cursor/rules/setup_siteglide_skills.mdc`. */ +const CURSOR_SETUP_RULE = `--- +alwaysApply: true +--- +Check if you have access to Siteglide skills automatically. If not, immediately check the ./.agents directory for skills on startup and add matching skills in your .cursor/skills directory using symlinks. +`; + +/** Claude project instructions — mirrors Siteglide/Siteglide-AI-Skills `.claude/CLAUDE.md`. */ +const CLAUDE_SETUP_MD = `# Setup Siteglide Skills + +Check if you have access to Siteglide skills automatically. If not, immediately check the ./.agents/skills/siteglide/ directory for skills on startup and use a single bash command to copy that to your ./.claude/skills/ directory. Then reload your plugins if needed (to import those new skills). +`; + +/** Windsurf always-on rule pointing at the shared `.agents` tree. */ +const WINDSURF_SETUP_RULE = `--- +trigger: always_on +--- +Check if you have access to Siteglide skills automatically. If not, immediately check the ./.agents directory for skills on startup and add matching skills in your .windsurf/skills directory using symlinks (or rely on ./.windsurf/skills if it already links to ./.agents/skills). +`; + +/** Copilot custom instructions pointing at the shared `.agents` tree. */ +const COPILOT_INSTRUCTIONS_MD = ` +If agent skills are not already available, use the skills under ./.agents/skills/ (also linked from ./.github/skills/). Prefer those over inventing Siteglide/platformOS workflows from memory. +`; + +/** + * When skills exist under `./.agents`, create IDE root folders so Cursor, Claude, Windsurf, + * and GitHub Copilot can discover them. Skills stay in `./.agents/skills` (source of truth); + * platform folders get a symlink/junction to that tree plus a small pointer rule/instructions + * file matching https://github.com/Siteglide/Siteglide-AI-Skills + * + * Side effects: creates `.cursor`, `.claude`, `.windsurf`, `.github` paths; writes managed + * pointer files; creates/replaces skills directory links; updates pullSpinner text. + */ +const ensureAgentIdeScaffolding = async () => { + logger.Info('[pull] Step: scaffolding IDE skill discovery folders (cursor, claude, windsurf, copilot)'); + pullSpinner.text = 'Setting up IDE skill folders'; + + const skillsTarget = path.join(AGENTS_ROOT, 'skills'); + await fs.ensureDir(`./${skillsTarget}`); + + // Cursor — rule (as in Siteglide-AI-Skills) + skills link for native .cursor/skills discovery + logger.Info('[pull] Scaffolding .cursor/'); + await writeManagedAgentFile( + path.join('.cursor', 'rules', 'setup_siteglide_skills.mdc'), + CURSOR_SETUP_RULE + ); + await ensureSkillsDirLink(path.join('.cursor', 'skills'), skillsTarget); + + // Claude — CLAUDE.md pointer + skills link (Claude discovers .claude/skills) + logger.Info('[pull] Scaffolding .claude/'); + await writeManagedAgentFile(path.join('.claude', 'CLAUDE.md'), CLAUDE_SETUP_MD); + await ensureSkillsDirLink(path.join('.claude', 'skills'), skillsTarget); + + // Windsurf — rule + skills link (Cascade discovers .windsurf/skills; also reads .agents/skills) + logger.Info('[pull] Scaffolding .windsurf/'); + await writeManagedAgentFile( + path.join('.windsurf', 'rules', 'setup_siteglide_skills.md'), + WINDSURF_SETUP_RULE + ); + await ensureSkillsDirLink(path.join('.windsurf', 'skills'), skillsTarget); + + // Copilot — instructions under .github + skills link (.github/skills is Copilot's project path) + logger.Info('[pull] Scaffolding .github/ (Copilot)'); + await writeManagedAgentFile( + path.join('.github', 'copilot-instructions.md'), + COPILOT_INSTRUCTIONS_MD + ); + await ensureSkillsDirLink(path.join('.github', 'skills'), skillsTarget); + + logger.Info('[pull] IDE skill discovery scaffolding complete'); +}; + /** * Remove empty directories left under a pull root after restructuring. * @@ -293,7 +594,7 @@ program .version(version, '-v, --version') .name('siteglide-cli pull') .usage('') - .description('Pull site files into marketplace_builder and module public files into modules/. Overwrites local files. By default pulls all installed modules; use -m to filter to one module.') + .description('Pull site files into marketplace_builder and module public files into modules/. Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds .cursor/.claude/.windsurf/.github discovery folders linked to ./.agents/skills. Overwrites local files. By default pulls all installed modules; use -m to filter to one module.') .arguments('[environment]', 'Name of environment. Example: staging') .option('-c --config-file ', 'config file path', '.siteglide-config') .option('-i --ignore-assets', 'Do not download assets such as CSS, JS, JSON etc', false) @@ -361,6 +662,9 @@ program logger.Info('[pull] Skipping assets step'); } + // After module zips (and assets that may land under modules/) are on disk + await mergeModuleAgentsToRoot(modulesToPull); + await tidyUpAfterPull(); logger.Info('[pull] All steps finished'); From 31f1e45db589c1603baa7490be3279b9f069d384 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Wed, 22 Jul 2026 11:41:37 +0100 Subject: [PATCH 04/34] Polling starts by checking after 300ms, then after that incrementally gives the server more time before checking again. This can mean fast processes get done much more quickly, whereas overall the polling will not over-do it. --- lib/data/waitForStatus.js | 42 +++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/lib/data/waitForStatus.js b/lib/data/waitForStatus.js index d0906c4..88ac113 100644 --- a/lib/data/waitForStatus.js +++ b/lib/data/waitForStatus.js @@ -1,13 +1,39 @@ +/** + * Poll `statusCheck` until the remote job leaves a waiting state. + * Uses exponential backoff so short jobs finish sooner than a fixed 1.5s interval, + * while long jobs still settle at the previous 1.5s cadence. + * + * Waiting statuses: `pending`, `ready_for_export` + * Terminal statuses: `done`, `success`, `error` (resolved — callers decide if error is fatal) + * + * @param {() => Promise<{status: string}>} statusCheck - Function that fetches the current job status. + * @returns {Promise} Resolves with the status response object. + * Side effects: none beyond calling `statusCheck` on a timer. + */ const waitForStatus = (statusCheck) => { + const INITIAL_DELAY_MS = 300; + const MAX_DELAY_MS = 1500; + const MAX_ATTEMPTS = 80; + + /** + * Delay before the next poll after `attempt` waiting responses (0-based). + * @param {number} attempt - How many times we have already seen a waiting status. + * @returns {number} Milliseconds to wait. + */ + const delayForAttempt = (attempt) => { + return Math.min(MAX_DELAY_MS, Math.round(INITIAL_DELAY_MS * Math.pow(1.5, attempt))); + }; + return new Promise((resolve, reject) => { - var count = 0; - (getStatus = () => { + let count = 0; + const getStatus = () => { statusCheck().then(response => { if (response.status === 'pending' || response.status === 'ready_for_export') { - if(count<80){ - setTimeout(getStatus, 1500); + if (count < MAX_ATTEMPTS) { + const delayMs = delayForAttempt(count); count++; - }else{ + setTimeout(getStatus, delayMs); + } else { count = 0; reject('error'); } @@ -19,9 +45,9 @@ const waitForStatus = (statusCheck) => { reject('error'); } }); - })(); + }; + getStatus(); }); }; - -module.exports = waitForStatus; \ No newline at end of file +module.exports = waitForStatus; From 2adf262d69db1cf3b406ac4d5176a3998234527a Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Wed, 22 Jul 2026 11:45:47 +0100 Subject: [PATCH 05/34] Download modules in parallel for better performance. --- siteglide-cli-pull.js | 85 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 5 deletions(-) diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index 50235bf..0a61200 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -20,6 +20,9 @@ const pullSpinner = ora({ text: 'Pulling files', stream: process.stdout }); /** Project-root folder that receives merged agent files from modules. */ const AGENTS_ROOT = '.agents'; +/** Default max concurrent module backup/download/extract jobs. */ +const DEFAULT_MODULE_PULL_CONCURRENCY = 3; + /** * Copy each child of `srcDir` into `destDir` (merge/overwrite). * Used instead of copying a folder into its parent, which fs-extra cannot do safely. @@ -429,7 +432,6 @@ const pullModuleZip = async (gateway, moduleName, index, total) => { logger.Info(`[pull] Step: module ${index}/${total} — "${moduleName}"`); const filename = `${dir.MODULES}-${moduleName}.zip`; const workDir = path.join(dir.TMP, `pull-${moduleName}`); - pullSpinner.text = `Pulling module: ${moduleName}`; const pullTask = await gateway.pullZip({ module_name: moduleName }); logger.Info(`[pull] Module "${moduleName}" backup started (id: ${pullTask.id})`); const readyTask = await waitForStatus(() => gateway.pullZipStatus(pullTask.id)); @@ -460,6 +462,66 @@ const pullModuleZip = async (gateway, moduleName, index, total) => { logger.Info(`[pull] Module "${moduleName}" pull complete`); }; +/** + * Run `iterator` over `items` with at most `limit` promises in flight. + * Preserves result order. Fails fast if any iterator rejects. + * + * @template T, R + * @param {T[]} items - Items to process. + * @param {number} limit - Max concurrent iterators. + * @param {(item: T, index: number) => Promise} iterator - Async worker. + * @returns {Promise} Results in the same order as `items`. + * Side effects: whatever `iterator` does. + */ +const mapLimit = async (items, limit, iterator) => { + const results = new Array(items.length); + let nextIndex = 0; + const workerCount = Math.min(Math.max(1, limit), items.length); + + const workers = []; + for (let w = 0; w < workerCount; w++) { + workers.push((async () => { + while (true) { + const i = nextIndex; + nextIndex += 1; + if (i >= items.length) { + return; + } + results[i] = await iterator(items[i], i); + } + })()); + } + + await Promise.all(workers); + return results; +}; + +/** + * Pull every selected module with capped concurrency (unique zip/work paths per module). + * + * @param {Gateway} gateway - Authenticated API client. + * @param {string[]} modulesToPull - Module machine names to pull. + * @param {number} concurrency - Max concurrent module pulls. + * Side effects: same as `pullModuleZip` for each module; updates pullSpinner text. + */ +const pullModulesInParallel = async (gateway, modulesToPull, concurrency) => { + const total = modulesToPull.length; + if (total === 0) { + return; + } + + const limit = Math.max(1, concurrency); + logger.Info(`[pull] Pulling ${total} module(s) with concurrency ${limit}`); + pullSpinner.text = `Pulling modules (up to ${limit} at a time)`; + + let completed = 0; + await mapLimit(modulesToPull, limit, async (moduleName, index) => { + await pullModuleZip(gateway, moduleName, index + 1, total); + completed += 1; + pullSpinner.text = `Pulling modules (${completed}/${total} done, up to ${limit} at a time)`; + }); +}; + /** * Fetch the asset file list from Siteglide-API `/cli/pull` and download matching text/binary assets * by physical_file_path. Paths under `modules/` are written to `./modules/...`; everything else @@ -594,15 +656,29 @@ program .version(version, '-v, --version') .name('siteglide-cli pull') .usage('') - .description('Pull site files into marketplace_builder and module public files into modules/. Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds .cursor/.claude/.windsurf/.github discovery folders linked to ./.agents/skills. Overwrites local files. By default pulls all installed modules; use -m to filter to one module.') + .description('Pull site files into marketplace_builder and module public files into modules/. Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds .cursor/.claude/.windsurf/.github discovery folders linked to ./.agents/skills. Modules pull in parallel (see --concurrency). Overwrites local files. By default pulls all installed modules; use -m to filter to one module.') .arguments('[environment]', 'Name of environment. Example: staging') .option('-c --config-file ', 'config file path', '.siteglide-config') .option('-i --ignore-assets', 'Do not download assets such as CSS, JS, JSON etc', false) .option('-m --module ', 'Optional module name filter. Without this flag, all installed modules are pulled.') + .option( + '--concurrency ', + `Max concurrent module pulls (default: ${DEFAULT_MODULE_PULL_CONCURRENCY}, or CONCURRENCY env)`, + (value) => { + const parsed = parseInt(value, 10); + if (isNaN(parsed) || parsed < 1) { + throw new Error('--concurrency must be a positive integer'); + } + return parsed; + } + ) .action((environment, params) => { process.env.CONFIG_FILE_PATH = params.configFile; const ignoreAssets = params.ignoreAssets; const moduleFilter = params.module; + const envConcurrency = parseInt(process.env.CONCURRENCY, 10); + const modulePullConcurrency = params.concurrency + || (envConcurrency > 0 ? envConcurrency : DEFAULT_MODULE_PULL_CONCURRENCY); const authData = fetchAuthData(environment, program); const gateway = new Gateway(authData); @@ -619,6 +695,7 @@ program if (ignoreAssets) { logger.Info('[pull] --ignore-assets set; asset download step will be skipped'); } + logger.Info(`[pull] Module pull concurrency: ${modulePullConcurrency}`); pullSpinner.text = 'Fetching installed modules'; logger.Info('[pull] Step: listing installed modules via /cli/list_modules'); @@ -649,9 +726,7 @@ program await pullSiteZip(gateway); - for (let i = 0; i < modulesToPull.length; i++) { - await pullModuleZip(gateway, modulesToPull[i], i + 1, modulesToPull.length); - } + await pullModulesInParallel(gateway, modulesToPull, modulePullConcurrency); if (modulesToPull.length > 0) { logger.Info('[pull] All selected modules pulled'); } From 060c9b8d1c2b6cdb78962ed49287eb6b33b4e005 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Wed, 22 Jul 2026 12:22:17 +0100 Subject: [PATCH 06/34] Quiter logs, but still informative. --- siteglide-cli-pull.js | 104 +++++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 57 deletions(-) diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index 0a61200..3d337e4 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -102,14 +102,14 @@ const copyAgentsTree = async (srcDir, destDir, moduleName) => { const destPath = path.join(destDir, name); const stats = await fs.stat(srcPath); if (stats.isDirectory()) { - logger.Info(`[pull] .agents: merging directory "${name}/" from module "${moduleName}"`); + logger.Debug(`[pull] .agents: merging directory "${name}/" from module "${moduleName}"`); fileCount += await copyAgentsTree(srcPath, destPath, moduleName); } else { await makeWritable(destPath); await fs.copy(srcPath, destPath, { overwrite: true }); await makeReadOnly(destPath); const displayPath = destPath.replace(/\\/g, '/').replace(/^\.\//, ''); - logger.Info(`[pull] .agents: wrote ./${displayPath} (from module "${moduleName}")`); + logger.Debug(`[pull] .agents: wrote ./${displayPath} (from module "${moduleName}")`); fileCount++; } } @@ -128,13 +128,13 @@ const copyAgentsTree = async (srcDir, destDir, moduleName) => { * root folders/symlinks; updates pullSpinner text. */ const mergeModuleAgentsToRoot = async (moduleNames) => { - logger.Info(`[pull] Step: merging modules/*/public/assets/${AGENTS_ROOT} → ./${AGENTS_ROOT}`); + logger.Info('[pull] Looking for AI agent skills relevant to your current modules'); pullSpinner.text = `Merging ${AGENTS_ROOT} files`; const result = { modulesWithAgents: 0, totalFiles: 0, skillCount: 0 }; if (!moduleNames || moduleNames.length === 0) { - logger.Info(`[pull] No modules to scan for ${AGENTS_ROOT} — skip`); + logger.Info('[pull] No skills found — skipping IDE folders'); return result; } @@ -142,16 +142,16 @@ const mergeModuleAgentsToRoot = async (moduleNames) => { const moduleName = moduleNames[i]; const agentsSrc = path.join('.', dir.MODULES, moduleName, 'public', 'assets', AGENTS_ROOT); const agentsSrcDisplay = agentsSrc.replace(/\\/g, '/'); - logger.Info(`[pull] Checking for ${agentsSrcDisplay}`); + logger.Debug(`[pull] Checking for ${agentsSrcDisplay}`); if (!(await fs.pathExists(agentsSrc))) { - logger.Info(`[pull] Module "${moduleName}" — no ${AGENTS_ROOT} directory found`); + logger.Debug(`[pull] Module "${moduleName}" — no ${AGENTS_ROOT} directory found`); continue; } const srcStat = await fs.stat(agentsSrc); if (!srcStat.isDirectory()) { - logger.Info(`[pull] Module "${moduleName}" — ${AGENTS_ROOT} exists but is not a directory; skip`); + logger.Debug(`[pull] Module "${moduleName}" — ${AGENTS_ROOT} exists but is not a directory; skip`); continue; } @@ -159,20 +159,23 @@ const mergeModuleAgentsToRoot = async (moduleNames) => { const count = await copyAgentsTree(agentsSrc, `./${AGENTS_ROOT}`, moduleName); result.modulesWithAgents++; result.totalFiles += count; - logger.Info(`[pull] Module "${moduleName}" — merged ${count} file(s) into ./${AGENTS_ROOT}`); + if (count > 0) { + logger.Info(`[pull] Module "${moduleName}" — merged ${count} file(s) into ./${AGENTS_ROOT}`); + } } - logger.Info( - `[pull] ${AGENTS_ROOT} merge complete: ${result.modulesWithAgents} module(s) contributed, ${result.totalFiles} file(s) written to ./${AGENTS_ROOT}` - ); - result.skillCount = await countSkillMarkdownFiles(`./${AGENTS_ROOT}`); - logger.Info(`[pull] Found ${result.skillCount} SKILL.md file(s) under ./${AGENTS_ROOT}`); + + if (result.totalFiles > 0) { + logger.Info( + `[pull] .agents: merged ${result.totalFiles} file(s) from ${result.modulesWithAgents} module(s) (${result.skillCount} skills)` + ); + } if (result.skillCount > 0) { await ensureAgentIdeScaffolding(); } else { - logger.Info('[pull] No skills found — skipping IDE discovery scaffolding'); + logger.Info('[pull] No skills found — skipping IDE folders'); } return result; @@ -218,7 +221,7 @@ const ensureSkillsDirLink = async (linkPath, targetPath) => { const linkAbs = path.resolve(linkPath); const targetAbs = path.resolve(targetPath); - logger.Info(`[pull] Ensuring skills link: ${linkPath} → ${targetPath}`); + logger.Debug(`[pull] Ensuring skills link: ${linkPath} → ${targetPath}`); await fs.ensureDir(path.dirname(linkAbs)); await fs.ensureDir(targetAbs); @@ -230,13 +233,13 @@ const ensureSkillsDirLink = async (linkPath, targetPath) => { currentTarget = path.resolve(path.dirname(linkAbs), currentTarget); } if (path.resolve(currentTarget) === targetAbs) { - logger.Info(`[pull] Skills link already correct: ${linkPath}`); + logger.Debug(`[pull] Skills link already correct: ${linkPath}`); return; } - logger.Info(`[pull] Replacing outdated skills link at ${linkPath}`); + logger.Debug(`[pull] Replacing outdated skills link at ${linkPath}`); await fs.remove(linkAbs); } else { - logger.Info(`[pull] Replacing existing path at ${linkPath} with link to shared ${targetPath}`); + logger.Debug(`[pull] Replacing existing path at ${linkPath} with link to shared ${targetPath}`); await fs.remove(linkAbs); } } @@ -246,7 +249,7 @@ const ensureSkillsDirLink = async (linkPath, targetPath) => { ? targetAbs : path.relative(path.dirname(linkAbs), targetAbs) || '.'; await fs.symlink(linkTarget, linkAbs, linkType); - logger.Info(`[pull] Created ${linkType} ${linkPath} → ${targetPath}`); + logger.Debug(`[pull] Created ${linkType} ${linkPath} → ${targetPath}`); }; /** @@ -262,7 +265,7 @@ const writeManagedAgentFile = async (filePath, contents) => { await makeWritable(filePath); await fs.writeFile(filePath, contents, 'utf8'); await makeReadOnly(filePath); - logger.Info(`[pull] Wrote ${filePath.replace(/\\/g, '/')}`); + logger.Debug(`[pull] Wrote ${filePath.replace(/\\/g, '/')}`); }; /** Cursor always-on rule — mirrors Siteglide/Siteglide-AI-Skills `.cursor/rules/setup_siteglide_skills.mdc`. */ @@ -300,14 +303,12 @@ If agent skills are not already available, use the skills under ./.agents/skills * pointer files; creates/replaces skills directory links; updates pullSpinner text. */ const ensureAgentIdeScaffolding = async () => { - logger.Info('[pull] Step: scaffolding IDE skill discovery folders (cursor, claude, windsurf, copilot)'); pullSpinner.text = 'Setting up IDE skill folders'; const skillsTarget = path.join(AGENTS_ROOT, 'skills'); await fs.ensureDir(`./${skillsTarget}`); // Cursor — rule (as in Siteglide-AI-Skills) + skills link for native .cursor/skills discovery - logger.Info('[pull] Scaffolding .cursor/'); await writeManagedAgentFile( path.join('.cursor', 'rules', 'setup_siteglide_skills.mdc'), CURSOR_SETUP_RULE @@ -315,12 +316,10 @@ const ensureAgentIdeScaffolding = async () => { await ensureSkillsDirLink(path.join('.cursor', 'skills'), skillsTarget); // Claude — CLAUDE.md pointer + skills link (Claude discovers .claude/skills) - logger.Info('[pull] Scaffolding .claude/'); await writeManagedAgentFile(path.join('.claude', 'CLAUDE.md'), CLAUDE_SETUP_MD); await ensureSkillsDirLink(path.join('.claude', 'skills'), skillsTarget); // Windsurf — rule + skills link (Cascade discovers .windsurf/skills; also reads .agents/skills) - logger.Info('[pull] Scaffolding .windsurf/'); await writeManagedAgentFile( path.join('.windsurf', 'rules', 'setup_siteglide_skills.md'), WINDSURF_SETUP_RULE @@ -328,14 +327,13 @@ const ensureAgentIdeScaffolding = async () => { await ensureSkillsDirLink(path.join('.windsurf', 'skills'), skillsTarget); // Copilot — instructions under .github + skills link (.github/skills is Copilot's project path) - logger.Info('[pull] Scaffolding .github/ (Copilot)'); await writeManagedAgentFile( path.join('.github', 'copilot-instructions.md'), COPILOT_INSTRUCTIONS_MD ); await ensureSkillsDirLink(path.join('.github', 'skills'), skillsTarget); - logger.Info('[pull] IDE skill discovery scaffolding complete'); + logger.Info('[pull] IDE folders ready (.cursor, .claude, .windsurf, .github → .agents/skills)'); }; /** @@ -380,7 +378,7 @@ const moveModulesToRoot = async (fromRoot) => { if (!(await fs.pathExists(modulesPath))) { return; } - logger.Info(`[pull] Moving ./${fromRoot}/modules → ./${dir.MODULES}`); + logger.Debug(`[pull] Moving ./${fromRoot}/modules → ./${dir.MODULES}`); await fs.ensureDir(`./${dir.MODULES}`); await fs.copy(modulesPath, `./${dir.MODULES}`, { overwrite: true }); await fs.remove(modulesPath); @@ -395,15 +393,14 @@ const moveModulesToRoot = async (fromRoot) => { * updates `pullSpinner` text; downloads then deletes a temporary zip. */ const pullSiteZip = async (gateway) => { - logger.Info('[pull] Step: downloading main site zip (no module_name)'); + logger.Info('[pull] Step: downloading main site zip'); const filename = `${dir.LEGACY_APP}.zip`; pullSpinner.text = 'Pulling site files'; const pullTask = await gateway.pullZip(); - logger.Info(`[pull] Site backup started (id: ${pullTask.id})`); + logger.Debug(`[pull] Site backup started (id: ${pullTask.id})`); const readyTask = await waitForStatus(() => gateway.pullZipStatus(pullTask.id)); - logger.Info(`[pull] Site backup ready (status: ${readyTask.status}) — downloading zip`); + logger.Debug(`[pull] Site backup ready (status: ${readyTask.status}) — downloading zip`); await downloadFile(readyTask.zip_file.url, filename); - logger.Info(`[pull] Unzipping site into ./${dir.LEGACY_APP} and converting app/ → marketplace_builder`); await unzip(filename, dir.LEGACY_APP); await copyChildren(`./${dir.LEGACY_APP}/app`, `./${dir.LEGACY_APP}`); await fs.remove(`./${filename}`); @@ -413,7 +410,7 @@ const pullSiteZip = async (gateway) => { } await fs.remove(`./${dir.LEGACY_APP}/app`); await cleanupEmptyDirs(dir.LEGACY_APP); - logger.Info('[pull] Site files pull complete'); + logger.Info('[pull] Site files pulled'); }; /** @@ -429,13 +426,13 @@ const pullSiteZip = async (gateway) => { * uses then deletes a temp zip and `.tmp/pull-` work directory. */ const pullModuleZip = async (gateway, moduleName, index, total) => { - logger.Info(`[pull] Step: module ${index}/${total} — "${moduleName}"`); + logger.Info(`[pull] Module ${moduleName} (${index}/${total})`); const filename = `${dir.MODULES}-${moduleName}.zip`; const workDir = path.join(dir.TMP, `pull-${moduleName}`); const pullTask = await gateway.pullZip({ module_name: moduleName }); - logger.Info(`[pull] Module "${moduleName}" backup started (id: ${pullTask.id})`); + logger.Debug(`[pull] Module "${moduleName}" backup started (id: ${pullTask.id})`); const readyTask = await waitForStatus(() => gateway.pullZipStatus(pullTask.id)); - logger.Info(`[pull] Module "${moduleName}" backup ready (status: ${readyTask.status}) — downloading zip`); + logger.Debug(`[pull] Module "${moduleName}" backup ready (status: ${readyTask.status}) — downloading zip`); await downloadFile(readyTask.zip_file.url, filename); await fs.remove(workDir); await unzip(filename, workDir); @@ -451,7 +448,7 @@ const pullModuleZip = async (gateway, moduleName, index, total) => { // Some module zips nest files as /... instead of modules//... const directModulePath = `./${workDir}/${moduleName}`; if (await fs.pathExists(directModulePath)) { - logger.Info(`[pull] Module "${moduleName}" zip used direct layout; copying into ./${dir.MODULES}/${moduleName}`); + logger.Debug(`[pull] Module "${moduleName}" zip used direct layout; copying into ./${dir.MODULES}/${moduleName}`); await fs.ensureDir(`./${dir.MODULES}/${moduleName}`); await fs.copy(directModulePath, `./${dir.MODULES}/${moduleName}`, { overwrite: true }); } @@ -459,7 +456,7 @@ const pullModuleZip = async (gateway, moduleName, index, total) => { if (await fs.pathExists(`./${workDir}`)) { await fs.remove(`./${workDir}`); } - logger.Info(`[pull] Module "${moduleName}" pull complete`); + logger.Info(`[pull] Module "${moduleName}" done`); }; /** @@ -511,7 +508,7 @@ const pullModulesInParallel = async (gateway, modulesToPull, concurrency) => { } const limit = Math.max(1, concurrency); - logger.Info(`[pull] Pulling ${total} module(s) with concurrency ${limit}`); + logger.Info(`[pull] Pulling ${total} module(s) (up to ${limit} at a time)`); pullSpinner.text = `Pulling modules (up to ${limit} at a time)`; let completed = 0; @@ -520,6 +517,8 @@ const pullModulesInParallel = async (gateway, modulesToPull, concurrency) => { completed += 1; pullSpinner.text = `Pulling modules (${completed}/${total} done, up to ${limit} at a time)`; }); + + logger.Info(`[pull] Pulled ${total} module(s)`); }; /** @@ -532,12 +531,11 @@ const pullModulesInParallel = async (gateway, modulesToPull, concurrency) => { * updates `pullSpinner` text; downloads each asset from its remote_url. */ const pullAssets = async (gateway) => { - logger.Info('[pull] Step: downloading assets via /cli/pull'); pullSpinner.text = 'Pulling assets'; const response = await gateway.pull(); const asset_files = []; const assets = response.asset || []; - logger.Info(`[pull] Asset list returned ${assets.length} file(s); filtering by extension`); + logger.Debug(`[pull] Asset list returned ${assets.length} file(s); filtering by extension`); const time = '?updated=' + new Date().getTime(); await Promise.all(assets.map(async function (file) { const urlToTest = file.data.remote_url.toLowerCase(); @@ -585,7 +583,7 @@ const pullAssets = async (gateway) => { fs.mkdirSync(path.dirname(fullPath), { recursive: true }); fs.writeFileSync(fullPath, file.data.body, logger.Error); }); - logger.Info(`[pull] Wrote ${asset_files.length} asset file(s) (${moduleAssetCount} under ./${dir.MODULES})`); + logger.Info(`[pull] Assets: wrote ${asset_files.length} file(s) (${moduleAssetCount} under modules)`); }; /** @@ -603,7 +601,7 @@ const tidyUpAfterPull = async () => { const siteZip = `./${dir.LEGACY_APP}.zip`; if (await fs.pathExists(siteZip)) { await fs.remove(siteZip); - logger.Info(`[pull] Removed leftover ${siteZip}`); + logger.Debug(`[pull] Removed leftover ${siteZip}`); } const cwdEntries = await fs.readdir('.'); @@ -611,13 +609,13 @@ const tidyUpAfterPull = async () => { const name = cwdEntries[i]; if (name.indexOf(`${dir.MODULES}-`) === 0 && name.slice(-4) === '.zip') { await fs.remove(`./${name}`); - logger.Info(`[pull] Removed leftover ./${name}`); + logger.Debug(`[pull] Removed leftover ./${name}`); } } if (await fs.pathExists(`./${dir.TMP}`)) { await fs.remove(`./${dir.TMP}`); - logger.Info(`[pull] Removed ./${dir.TMP}`); + logger.Debug(`[pull] Removed ./${dir.TMP}`); } // Pull must not leave modules nested under marketplace_builder @@ -627,7 +625,7 @@ const tidyUpAfterPull = async () => { } if (await fs.pathExists(nestedModules)) { await fs.remove(nestedModules); - logger.Info(`[pull] Removed leftover ${nestedModules}`); + logger.Debug(`[pull] Removed leftover ${nestedModules}`); } await cleanupEmptyDirs(dir.LEGACY_APP); @@ -686,35 +684,30 @@ program if (response === 'Y') { try { pullSpinner.start(); - logger.Info('[pull] Confirmed — starting pull'); if (moduleFilter) { logger.Info(`[pull] Module filter (-m): "${moduleFilter}"`); - } else { - logger.Info('[pull] No -m filter — will pull all installed modules'); } if (ignoreAssets) { logger.Info('[pull] --ignore-assets set; asset download step will be skipped'); } - logger.Info(`[pull] Module pull concurrency: ${modulePullConcurrency}`); pullSpinner.text = 'Fetching installed modules'; - logger.Info('[pull] Step: listing installed modules via /cli/list_modules'); const modulesResponse = await gateway.listModules(); const installedModules = (modulesResponse && modulesResponse.data) ? modulesResponse.data : []; - logger.Info(`[pull] list_modules returned ${installedModules.length} module(s)`); + logger.Debug(`[pull] list_modules returned ${installedModules.length} module(s)`); if (installedModules.length > 0) { installedModules.forEach((name, i) => { - logger.Info(`\t${i + 1}. ${name}`, { hideTimestamp: true }); + logger.Debug(`\t${i + 1}. ${name}`, { hideTimestamp: true }); }); } else { - logger.Info('[pull] Raw list_modules response keys: ' + Object.keys(modulesResponse || {}).join(', ')); + logger.Debug('[pull] Raw list_modules response keys: ' + Object.keys(modulesResponse || {}).join(', ')); } const modulesToPull = selectModules(installedModules, moduleFilter); if (moduleFilter && modulesToPull === null) { pullSpinner.fail(`Module "${moduleFilter}" is not installed on this site`); - logger.Error(`[pull] Filter "${moduleFilter}" not found in installed modules list above`); + logger.Error(`[pull] Filter "${moduleFilter}" not found in installed modules`); process.exit(1); } @@ -727,9 +720,6 @@ program await pullSiteZip(gateway); await pullModulesInParallel(gateway, modulesToPull, modulePullConcurrency); - if (modulesToPull.length > 0) { - logger.Info('[pull] All selected modules pulled'); - } if (!ignoreAssets) { await pullAssets(gateway); From 1a9ad3f3b371ef418ee7bbbc27b88d4db783d89e Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Wed, 22 Jul 2026 12:28:00 +0100 Subject: [PATCH 07/34] Skip files with empty file paths https://feedback.siteglide.com/p/siteglide-cli-when-pulling-skip-files-with-a-physical-file --- siteglide-cli-pull.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index 3d337e4..b66cfad 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -566,24 +566,35 @@ const pullAssets = async (gateway) => { }); })); let moduleAssetCount = 0; + let wroteCount = 0; + let skippedEmptyPath = 0; asset_files.forEach(file => { const physicalPath = file.data.physical_file_path.replace(/\\/g, '/'); + if (physicalPath.indexOf('//') > -1) { + skippedEmptyPath++; + logger.Info(`[pull] Skipping asset with empty folder in path: ${physicalPath}`); + return; + } const isModuleAsset = physicalPath === dir.MODULES || physicalPath.indexOf(dir.MODULES + '/') === 0; const root = isModuleAsset ? dir.MODULES : dir.LEGACY_APP; const relativePath = isModuleAsset ? physicalPath.slice(dir.MODULES.length).replace(/^\//, '') : physicalPath; - if (isModuleAsset) { - moduleAssetCount++; - } if (!relativePath) { return; } + if (isModuleAsset) { + moduleAssetCount++; + } const fullPath = path.join(root, relativePath); fs.mkdirSync(path.dirname(fullPath), { recursive: true }); fs.writeFileSync(fullPath, file.data.body, logger.Error); + wroteCount++; }); - logger.Info(`[pull] Assets: wrote ${asset_files.length} file(s) (${moduleAssetCount} under modules)`); + if (skippedEmptyPath > 0) { + logger.Info(`[pull] Assets: skipped ${skippedEmptyPath} file(s) with empty folder in path`); + } + logger.Info(`[pull] Assets: wrote ${wroteCount} file(s) (${moduleAssetCount} under modules)`); }; /** From 5a91c86120fee9c9914f66fed2fdeab34f1f76b9 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Wed, 22 Jul 2026 17:25:13 +0100 Subject: [PATCH 08/34] Experimental marketplace_builder to app and AI tools install, points at local Siteglide MCP repo (private) --- .../siteglide_exec_command_940796a4.plan.md | 253 ++++++++++++++++++ lib/ai.js | 153 +++++++++++ lib/migrateAppDirectory.js | 191 +++++++++++++ package.json | 2 + scripts/smoke-mcp-register.js | 29 ++ scripts/smoke-migrate-app.js | 25 ++ siteglide-cli-mcp.js | 45 ++++ siteglide-cli-pull.js | 81 +++--- siteglide-cli.js | 1 + 9 files changed, 748 insertions(+), 32 deletions(-) create mode 100644 .cursor/plans/siteglide_exec_command_940796a4.plan.md create mode 100644 lib/ai.js create mode 100644 lib/migrateAppDirectory.js create mode 100644 scripts/smoke-mcp-register.js create mode 100644 scripts/smoke-migrate-app.js create mode 100644 siteglide-cli-mcp.js diff --git a/.cursor/plans/siteglide_exec_command_940796a4.plan.md b/.cursor/plans/siteglide_exec_command_940796a4.plan.md new file mode 100644 index 0000000..2c1e8aa --- /dev/null +++ b/.cursor/plans/siteglide_exec_command_940796a4.plan.md @@ -0,0 +1,253 @@ +--- +name: siteglide MCP desktop +overview: Scaffold Siteglide-MCP---Experimental (compose platformOS validate_code + Siteglide rules/ops + marketplace_builder path bridge) and wire siteglide-cli ai init + thin mcp/supervisor launchers. Stdio first; HTTP/SSE/Docker deferred. CLI exec intentionally not shipped (ops live in MCP only). +todos: + - id: lib-exec + content: "CANCELLED: siteglide-cli exec — ops live in MCP graphql_exec/liquid_exec instead" + status: cancelled + - id: cli-exec + content: "CANCELLED: siteglide-cli exec bins" + status: cancelled + - id: mcp-repo + content: Scaffold Siteglide-MCP---Experimental (compose upstream supervisor + Siteglide rules + ops tools; stdio entrypoints) + status: completed + - id: layout-bridge + content: "CANCELLED: MCP path bridge — replaced by pull migrate marketplace_builder → app (platformOS advice)" + status: cancelled + - id: pull-app-migrate + content: On pull, git mv or rename marketplace_builder → app; pull site/assets into app/ + status: completed + - id: cli-ai-wrappers + content: "CANCELLED: ai init / dual supervisor — replaced by single mcp + pull-time IDE registration" + status: cancelled + - id: pull-mcp-register + content: On pull, merge-safe register siteglide MCP for cursor/claude/copilot/windsurf if missing + status: completed + - id: rebase-pull-modules + content: Rebase onto Pull-should-pull-all-modules'-public-files- + status: completed + - id: deps-tests + content: Wire package deps; smoke tests; update explain_to_my_boss; document Docker/HTTP as phase-later + status: completed + - id: http-docker-later + content: "DEFERRED: HTTP/SSE + Docker for browser agents" + status: cancelled +isProject: false +--- + +# Siteglide-MCP desktop + CLI wrappers + +## MCP home (locked) + +All Siteglide MCP implementation lives in [`d:\git\Siteglide-MCP---Experimental`](d:\git\Siteglide-MCP---Experimental) — not inside the CLI package tree. + +| Keep in `siteglide-cli` | Put in `Siteglide-MCP---Experimental` | +| --- | --- | +| `ai init` (writes config pointing at MCP bins) | Composed supervisor (`validate_code` + Siteglide rules) | +| Thin wrapper bins that call / spawn the MCP package | Operational MCP tools (`envs_list`, `graphql_exec`, `liquid_exec`, `logs_fetch`) | +| | Modular `rules/` / `guides/` data | +| | **Layout bridge** (`marketplace_builder` ↔ `app` temp overlay) | +| | Future HTTP/SSE + Docker image | + +**Not in scope:** CLI `exec graphql|liquid` — agents use MCP ops tools; humans can use existing GUI evaluators. +**Why separate:** independent versioning, npm-bump of `@platformos/platformos-mcp-supervisor` without a CLI release, reusable by web agents / Docker without installing the whole CLI, cleaner boundary for Siteglide rules. + +**How CLI consumes it:** `siteglide-cli` depends on or invokes this repo’s published package / bins; `siteglide-cli mcp` / `supervisor` are thin launchers; `ai init` registers those commands. + +## Docker / browser later + +**Yes**, if transports stay swappable. + +- **v1:** stdio — Cursor / Claude Code / local agents +- **Later:** HTTP + SSE (or streamable HTTP); browser → Siteglide agent BFF → Docker MCP (no secrets in the browser) + +```mermaid +flowchart LR + browser["Browser AI UI"] --> bff["Siteglide agent backend"] + bff --> httpMcp["Docker MCP HTTP/SSE"] + httpMcp --> tools["Same tool registry"] + tools --> upstream["@platformos/platformos-mcp-supervisor"] + tools --> rules["Siteglide rules"] + tools --> bridge["layout bridge overlay"] + tools --> api["Siteglide-API / Gateway"] +``` + +**Not in v1:** shipping HTTP/Docker — only design so tool registration is transport-agnostic. + +## Scope + +1. **`Siteglide-MCP---Experimental`** — compose upstream check engine + Siteglide rules + ops tools + layout bridge +2. **`siteglide-cli ai init`** — register MCP bins +3. **Thin CLI wrappers** for `mcp` / `supervisor` + +No Siteglide-API changes. Do not fork `platformos-tools`. No CLI `exec` command. + +## Two supervisors (use the new one) + +| Version | Use? | +| --- | --- | +| Legacy `pos-supervisor` | No | +| `@platformos/platformos-mcp-supervisor` (platformos-tools) | **Yes** | + +## Compose, do not fork (update-friendly) + +Upstream embedding API: + +- `startServer({ projectDir })` → `{ server, context, shutdown }` +- `registerValidateCode(server, context)` +- `ValidateCodeResult` types + +In `Siteglide-MCP---Experimental`: + +1. Detect layout; if needed, create **temp overlay bridge** → `bridgedProjectDir` +2. `startServer` / lint against bridged dir (rewrite `file_path` for agents using `marketplace_builder/...`) +3. `registerSiteglideTools(server, …)` on the **same** `McpServer` +4. Ops tools (sibling stdio entry or same process) +5. Bump `@platformos/platformos-mcp-supervisor` for pOS updates — Siteglide rules/bridge unchanged unless public API breaks + +```mermaid +flowchart TB + cliAi["siteglide-cli ai init"] + cliAi --> bins["siteglide-cli-mcp / siteglide-cli-supervisor"] + bins --> pkg["Siteglide-MCP---Experimental"] + pkg --> bridge["layout bridge if needed"] + bridge --> start["startServer upstream"] + pkg --> sg["registerSiteglideTools"] + pkg --> ops["ops tools Gateway"] + npmBump["npm bump platformos-mcp-supervisor"] -.-> start +``` + +### Layout (in MCP repo) + +``` +Siteglide-MCP---Experimental/ + src/supervisor/compose.js # bridge + startServer + registerSiteglideTools + src/layout/ + detect.js # app | marketplace_builder | null + bridge.js # create/destroy temp overlay + rewritePath.js # path rewrite for validate_code + src/siteglide/register.js + src/siteglide/rules/ + src/siteglide/guides/ + src/ops/ # envs-list, graphql-exec, liquid-exec, logs-fetch + src/stdio.js # stdio transport bootstrap + src/http.js # deferred — same registerTools for later Docker +``` + +## Path bridge (locked interim) + +platformOS **already** classifies `marketplace_builder/` files (`getFileType` / `isKnownLiquidFile` in platformos-common). Gaps remain: `getAppPaths` / `DocumentsLocator` search **`app/` only**; some checks hardcode `app/...`. Native LSP support was asked of platformOS; until that ships, Siteglide uses an interim bridge. + +**Do not** create `app` → `marketplace_builder` inside the customer project (git noise, deploy confusion). + +**Do** build a **session temp overlay** before lint: + +``` +/siteglide-mcp-bridge-XXXX/ + app/ → junction/symlink to /marketplace_builder + modules/ → junction/symlink to /modules (if present) + .platformos-check.yml (copy from project if present, else minimal stub) +``` + +```mermaid +flowchart LR + agent["Agent validate_code"] --> wrap["Siteglide wrapper"] + wrap --> rewrite["Rewrite file_path prefixes"] + wrap --> overlay["Temp overlay projectDir"] + overlay --> appLink["app junction"] + appLink --> mb["project/marketplace_builder"] + overlay --> upstream["upstream runLint / validate_code"] +``` + +### When to activate + +| Project state | Bridge? | +| --- | --- | +| Only `marketplace_builder/` (no real `app/`) | **Yes** | +| Real `app/` exists | **No** | +| Both exist | **No** — prefer real `app/`; log once | +| Only `modules/` | **No** | + +Detect real `app/` with `fs.lstat` (don’t nest or delete foreign symlinks/junctions). + +### Cross-platform links + +| OS | Directory link type | Notes | +| --- | --- | --- | +| Windows | `'junction'` | No admin / Developer Mode for directory junctions | +| macOS / Linux | `'dir'` (or default) | Standard symlink | + +Normalize paths to `/` for MCP/agent strings; `path.resolve` absolute targets before linking. + +Lifecycle: create once at MCP start → reuse for all `validate_code` → destroy on `shutdown()` / process exit. + +### file_path rewrite + +When bridge active: map `marketplace_builder/...` (relative or absolute under project) → overlay `app/...`; accept `app/...` relative to overlay. **v1:** diagnostics may still say `app/...` (alias documented via skills); optional reverse-map later. + +### validate_code wiring + +Prefer public lint API from the supervisor package (`runLint` / equivalent) behind `runValidateCodeWithBridge`. If only `startServer` is exported, use documented lower-level registration; avoid monkey-patching. Fallback to check-node only if supervisor exports are insufficient. + +### Bridge tests + +- detect: only-mb → bridge; only-app → no; both → no +- rewritePath: relative + absolute (win32/posix fixtures) +- overlay create/destroy + readable `app/...` through junction +- smoke: lint fixture under `marketplace_builder` via bridged `validate_code` + +### Bridge out of scope + +- Patching `platformos-tools` in our tree +- Persistent in-repo `app` symlinks +- Keeping the bridge forever after upstream native support (remove when they ship and we bump) + +## Decisions (locked) + +### MCP (`Siteglide-MCP---Experimental`) +- Compose upstream check engine + Siteglide rules +- Ops MVP: `envs_list`, `graphql_exec`, `liquid_exec`, `logs_fetch` +- **Layout bridge:** temp overlay when only `marketplace_builder/` (cross-platform junctions/symlinks) +- **v1 transport: stdio only**; transport-agnostic registration for HTTP/Docker later +- Auth for ops: `.siteglide-config` / `MPKIT_*` / explicit params (HTTP auth later) +- Upstream `validate_code` needs **no** Siteglide auth; ops tools do + +### ai init (CLI) +- Registers `siteglide-cli-mcp` + `siteglide-cli-supervisor` (wrappers → MCP repo) + +### Skills vs MCP +- Skills = guidance (temporary `Siteglide-AI-Skills`; later modules/CLI install) +- MCP = callable tools; they coexist +- Rules/skills cannot alone fix `app/` search paths — bridge handles that until pOS does + +### Not shipping +- CLI `exec graphql|liquid` (undone; MCP ops cover agent GraphQL/Liquid) + +## Phases + +### 1 — scaffold `Siteglide-MCP---Experimental` +Compose supervisor + layout bridge + Siteglide guide/rules tool + ops MVP + stdio entries + +### 2 — wire CLI +Depend on / invoke MCP package; `ai init`; thin `mcp` / `supervisor` bins + +### 3 — (later) +HTTP/SSE, Dockerfile, web agent BFF auth; drop bridge when upstream marketplace_builder support is enough + +## Out of scope (this pass) + +- CLI `exec` command +- Implementing Docker/HTTP hosting now +- Forking platformos-mcp-supervisor +- Legacy pos-supervisor / `load_development_guide` +- Full pos-cli mcp-min parity +- Patching upstream pos-cli / platformos-tools +- Persistent customer-repo `app` symlinks + +## Usage (target) + +```bash +siteglide-cli pull staging +siteglide-cli mcp +# Later: docker run … siteglide-mcp --transport http --port 5910 +``` diff --git a/lib/ai.js b/lib/ai.js new file mode 100644 index 0000000..37312c9 --- /dev/null +++ b/lib/ai.js @@ -0,0 +1,153 @@ +const fs = require('fs'), + os = require('os'), + path = require('path'), + logger = require('./logger'); + +/** Single MCP server id registered for all supported IDEs. */ +const SERVER_NAME = 'siteglide'; + +const STDIO_ENTRY = { command: 'siteglide-cli-mcp' }; +const VSCODE_ENTRY = { type: 'stdio', command: 'siteglide-cli-mcp' }; + +/** + * IDE MCP registry targets. Project-local where supported; Windsurf uses its + * user-level config (no reliable project-level MCP file). + * @param {string} [rootPath] + * @param {string} [homedir] - Override home for Windsurf path (tests). + */ +const getRegistryTargets = (rootPath = process.cwd(), homedir = os.homedir()) => [ + { + id: 'cursor', + label: 'Cursor', + configPath: path.join(rootPath, '.cursor', 'mcp.json'), + serversKey: 'mcpServers', + entry: STDIO_ENTRY + }, + { + id: 'claude', + label: 'Claude Code', + configPath: path.join(rootPath, '.mcp.json'), + serversKey: 'mcpServers', + entry: STDIO_ENTRY + }, + { + id: 'copilot', + label: 'GitHub Copilot / VS Code', + configPath: path.join(rootPath, '.vscode', 'mcp.json'), + serversKey: 'servers', + entry: VSCODE_ENTRY + }, + { + id: 'windsurf', + label: 'Windsurf', + configPath: path.join(homedir, '.codeium', 'windsurf', 'mcp_config.json'), + serversKey: 'mcpServers', + entry: STDIO_ENTRY + } +]; + +const readJsonObject = (filePath) => { + if (!fs.existsSync(filePath)) { + return {}; + } + try { + const parsed = JSON.parse(fs.readFileSync(filePath, 'utf8')); + if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) { + return parsed; + } + logger.Warn( + `[pull] MCP config ${filePath} is not a JSON object — leaving it unchanged`, + { exit: false } + ); + return null; + } catch (error) { + logger.Warn( + `[pull] MCP config ${filePath} is invalid JSON (${error.message}) — leaving it unchanged`, + { exit: false } + ); + return null; + } +}; + +/** + * Ensure `siteglide` is present in one registry file without touching other keys. + * @returns {'added'|'skipped'|'unchanged'|'error'} + */ +const ensureServerInConfig = (target) => { + const config = readJsonObject(target.configPath); + if (config === null) { + return 'error'; + } + + if (!config[target.serversKey] || typeof config[target.serversKey] !== 'object' || Array.isArray(config[target.serversKey])) { + config[target.serversKey] = {}; + } + + const servers = config[target.serversKey]; + if (Object.prototype.hasOwnProperty.call(servers, SERVER_NAME)) { + return 'unchanged'; + } + + servers[SERVER_NAME] = Object.assign({}, target.entry); + fs.mkdirSync(path.dirname(target.configPath), { recursive: true }); + fs.writeFileSync(target.configPath, JSON.stringify(config, null, 2) + '\n'); + return 'added'; +}; + +/** + * On pull: register Siteglide MCP in Cursor, Claude, Copilot, and Windsurf if missing. + * Never overwrites other servers or an existing `siteglide` entry. + * + * @param {{ rootPath?: string, homedir?: string }} [opts] + * @returns {{ added: string[], unchanged: string[], errors: string[] }} + */ +const ensureMcpRegistered = (opts = {}) => { + const rootPath = opts.rootPath || process.cwd(); + const targets = getRegistryTargets(rootPath, opts.homedir || os.homedir()); + const added = []; + const unchanged = []; + const errors = []; + + for (let i = 0; i < targets.length; i++) { + const target = targets[i]; + try { + const result = ensureServerInConfig(target); + if (result === 'added') { + added.push(target.label); + } else if (result === 'unchanged') { + unchanged.push(target.label); + } else if (result === 'error') { + errors.push(target.label); + } + } catch (error) { + errors.push(target.label); + logger.Warn(`[pull] Could not update ${target.label} MCP config: ${error.message}`, { + exit: false + }); + } + } + + if (added.length > 0) { + logger.Info(`[pull] Registered Siteglide MCP for: ${added.join(', ')}`); + } + if (unchanged.length > 0) { + logger.Debug(`[pull] Siteglide MCP already present for: ${unchanged.join(', ')}`); + } + if (errors.length > 0) { + logger.Warn(`[pull] Skipped MCP registration (invalid existing config) for: ${errors.join(', ')}`, { + exit: false + }); + } + if (added.length === 0 && unchanged.length > 0 && errors.length === 0) { + logger.Info('[pull] Siteglide MCP already registered for supported IDEs'); + } + + return { added, unchanged, errors }; +}; + +module.exports = { + SERVER_NAME, + STDIO_ENTRY, + ensureMcpRegistered, + getRegistryTargets +}; diff --git a/lib/migrateAppDirectory.js b/lib/migrateAppDirectory.js new file mode 100644 index 0000000..03a82d2 --- /dev/null +++ b/lib/migrateAppDirectory.js @@ -0,0 +1,191 @@ +const fs = require('fs-extra'), + path = require('path'), + { execFileSync } = require('child_process'), + dir = require('./directories'), + logger = require('./logger'); + +const gitEnv = { + ...process.env, + GIT_TERMINAL_PROMPT: '0', + LC_ALL: 'C' +}; + +let cachedGitBin; + +/** + * Prefer git.exe on Windows. Spawning the `git.cmd` shim via execFile can drop + * arguments (leading to `fatal: bad source, source=`). + */ +const resolveGitBin = () => { + if (cachedGitBin) { + return cachedGitBin; + } + if (process.platform !== 'win32') { + cachedGitBin = 'git'; + return cachedGitBin; + } + try { + const out = execFileSync('where.exe', ['git'], { + encoding: 'utf8', + windowsHide: true, + stdio: ['ignore', 'pipe', 'pipe'] + }); + const candidates = String(out) + .split(/\r?\n/) + .map((line) => line.trim()) + .filter(Boolean); + const exe = candidates.find((candidate) => /\.exe$/i.test(candidate)); + cachedGitBin = exe || candidates[0] || 'git.exe'; + } catch (error) { + cachedGitBin = 'git.exe'; + } + return cachedGitBin; +}; + +const runGit = (args, cwd) => { + // execFile — no shell (avoids PowerShell glob/arg mangling). + return execFileSync(resolveGitBin(), args, { + cwd, + env: gitEnv, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'], + windowsHide: true + }); +}; + +const isGitWorkTree = (cwd = process.cwd()) => { + try { + runGit(['rev-parse', '--is-inside-work-tree'], cwd); + return true; + } catch (error) { + return false; + } +}; + +/** True if git has any indexed paths under marketplace_builder. */ +const isLegacyTracked = (cwd) => { + try { + const out = runGit(['ls-files', '--', dir.LEGACY_APP], cwd); + return String(out || '').trim().length > 0; + } catch (error) { + return false; + } +}; + +/** + * After a same-volume directory rename, update the index so git records renames + * (works cross-platform; avoids fragile `git mv` under Windows/Node). + */ +const stageRenameInGit = (cwd) => { + runGit(['add', '-A', '--', dir.APP, dir.LEGACY_APP], cwd); +}; + +const toPosixAbs = (cwd, name) => path.resolve(cwd, name).split(path.sep).join('/'); + +/** + * Try `git mv` with relative then absolute POSIX paths, using git.exe on Windows. + * @returns {boolean} true if git mv succeeded + */ +const tryGitMv = (cwd) => { + const attempts = [ + [dir.LEGACY_APP, dir.APP], + [toPosixAbs(cwd, dir.LEGACY_APP), toPosixAbs(cwd, dir.APP)] + ]; + + let lastDetail = ''; + for (let i = 0; i < attempts.length; i++) { + const [from, to] = attempts[i]; + try { + runGit(['mv', from, to], cwd); + return true; + } catch (error) { + lastDetail = (error.stderr || error.stdout || error.message || String(error)).toString().trim(); + logger.Debug(`[pull] git mv attempt failed (${from} → ${to}): ${lastDetail}`); + } + } + + logger.Warn( + `[pull] git mv failed (${lastDetail || 'unknown error'}); using filesystem rename + git add`, + { exit: false } + ); + return false; +}; + +/** + * Rename marketplace_builder → app. Prefer git mv when tracked; always fall back to + * filesystem rename + index update (reliable on Windows PowerShell/CMD). + * + * @param {string} cwd + * @returns {'renamed-git'|'renamed-fs'} + */ +const renameLegacyToApp = async (cwd) => { + const legacy = path.join(cwd, dir.LEGACY_APP); + const modern = path.join(cwd, dir.APP); + const inGit = isGitWorkTree(cwd); + const tracked = inGit && isLegacyTracked(cwd); + + if (tracked) { + logger.Info(`[pull] Migrating ${dir.LEGACY_APP}/ → ${dir.APP}/ (platformOS layout, git)`); + logger.Debug(`[pull] Using git binary: ${resolveGitBin()}`); + if (tryGitMv(cwd)) { + return 'renamed-git'; + } + } else if (inGit) { + logger.Info( + `[pull] Migrating ${dir.LEGACY_APP}/ → ${dir.APP}/ (filesystem rename; folder not in git index)` + ); + } else { + logger.Info(`[pull] Migrating ${dir.LEGACY_APP}/ → ${dir.APP}/ (platformOS layout)`); + } + + await fs.move(legacy, modern, { overwrite: false }); + + if (inGit) { + try { + stageRenameInGit(cwd); + if (tracked) { + logger.Info('[pull] Staged rename in git index (history preserved via rename detection)'); + } + } catch (error) { + logger.Warn( + `[pull] Renamed on disk but could not update git index: ${error.message}`, + { exit: false } + ); + } + } + + return 'renamed-fs'; +}; + +/** + * platformOS guidance: use `app/` not legacy `marketplace_builder/`. + * If only the legacy folder exists, rename it to `app`. + * + * @param {{ cwd?: string }} [opts] + * @returns {Promise<'renamed-git'|'renamed-fs'|'skipped-both'|'skipped-missing'>} + */ +const migrateMarketplaceBuilderToApp = async (opts = {}) => { + const cwd = opts.cwd || process.cwd(); + const legacy = path.join(cwd, dir.LEGACY_APP); + const modern = path.join(cwd, dir.APP); + + if (!(await fs.pathExists(legacy))) { + return 'skipped-missing'; + } + + if (await fs.pathExists(modern)) { + logger.Warn( + `[pull] Both ${dir.LEGACY_APP}/ and ${dir.APP}/ exist — leaving both. Prefer ${dir.APP}/ (platformOS).`, + { exit: false } + ); + return 'skipped-both'; + } + + return renameLegacyToApp(cwd); +}; + +module.exports = { + migrateMarketplaceBuilderToApp, + isGitWorkTree, + resolveGitBin +}; diff --git a/package.json b/package.json index 9eb719a..9d17e85 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "Siteglide" ], "dependencies": { + "@siteglide/siteglide-mcp": "file:../Siteglide-MCP---Experimental", "archiver": "^5.3.0", "archiver-promise": "^1.0.0", "async": "^3.2.3", @@ -68,6 +69,7 @@ "siteglide-cli-import": "./siteglide-cli-import.js", "siteglide-cli-init": "./siteglide-cli-init.js", "siteglide-cli-logs": "./siteglide-cli-logs.js", + "siteglide-cli-mcp": "./siteglide-cli-mcp.js", "siteglide-cli-migrate": "./siteglide-cli-migrate.js", "siteglide-cli-modules": "./siteglide-cli-modules.js", "siteglide-cli-pull": "./siteglide-cli-pull.js", diff --git a/scripts/smoke-mcp-register.js b/scripts/smoke-mcp-register.js new file mode 100644 index 0000000..32191de --- /dev/null +++ b/scripts/smoke-mcp-register.js @@ -0,0 +1,29 @@ +const assert = require('assert'); +const fs = require('fs'); +const os = require('os'); +const path = require('path'); +const { ensureMcpRegistered, SERVER_NAME } = require('../lib/ai'); + +const root = fs.mkdtempSync(path.join(os.tmpdir(), 'sg-mcp-reg-')); +const fakeHome = fs.mkdtempSync(path.join(os.tmpdir(), 'sg-mcp-home-')); +const cursorPath = path.join(root, '.cursor', 'mcp.json'); +fs.mkdirSync(path.dirname(cursorPath), { recursive: true }); +fs.writeFileSync( + cursorPath, + JSON.stringify({ mcpServers: { other: { command: 'keep-me' } } }, null, 2) +); + +const first = ensureMcpRegistered({ rootPath: root, homedir: fakeHome }); +assert.ok(first.added.includes('Cursor')); +assert.ok(first.added.includes('Windsurf')); +const afterFirst = JSON.parse(fs.readFileSync(cursorPath, 'utf8')); +assert.deepStrictEqual(afterFirst.mcpServers.other, { command: 'keep-me' }); +assert.ok(afterFirst.mcpServers[SERVER_NAME]); + +const second = ensureMcpRegistered({ rootPath: root, homedir: fakeHome }); +assert.ok(second.unchanged.includes('Cursor')); +assert.strictEqual(second.added.includes('Cursor'), false); + +fs.rmSync(root, { recursive: true, force: true }); +fs.rmSync(fakeHome, { recursive: true, force: true }); +console.log('mcp registration smoke ok'); diff --git a/scripts/smoke-migrate-app.js b/scripts/smoke-migrate-app.js new file mode 100644 index 0000000..1211bcc --- /dev/null +++ b/scripts/smoke-migrate-app.js @@ -0,0 +1,25 @@ +const assert = require('assert'); +const fs = require('fs-extra'); +const os = require('os'); +const path = require('path'); +const { migrateMarketplaceBuilderToApp } = require('../lib/migrateAppDirectory'); + +(async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-migrate-')); + await fs.mkdir(path.join(root, 'marketplace_builder')); + await fs.writeFile(path.join(root, 'marketplace_builder', 'x.txt'), 'ok'); + + const result = await migrateMarketplaceBuilderToApp({ cwd: root }); + assert.equal(result, 'renamed-fs'); + assert.equal(await fs.pathExists(path.join(root, 'app', 'x.txt')), true); + assert.equal(await fs.pathExists(path.join(root, 'marketplace_builder')), false); + + const skip = await migrateMarketplaceBuilderToApp({ cwd: root }); + assert.equal(skip, 'skipped-missing'); + + await fs.remove(root); + console.log('migrate app directory smoke ok'); +})().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/siteglide-cli-mcp.js b/siteglide-cli-mcp.js new file mode 100644 index 0000000..9bbb58a --- /dev/null +++ b/siteglide-cli-mcp.js @@ -0,0 +1,45 @@ +#!/usr/bin/env node + +/** + * Thin launcher for Siteglide MCP (stdio). stdout is reserved for MCP JSON-RPC. + */ +const path = require('path'); +const { spawn } = require('child_process'); + +function resolveMcpBin() { + const fs = require('fs'); + try { + const main = require.resolve('@siteglide/siteglide-mcp'); + const candidate = path.join(path.dirname(main), '..', 'bin', 'siteglide-mcp.js'); + if (fs.existsSync(candidate)) { + return candidate; + } + } catch { + /* fall through */ + } + + const sibling = path.resolve(__dirname, '..', 'Siteglide-MCP---Experimental', 'bin', 'siteglide-mcp.js'); + if (fs.existsSync(sibling)) { + return sibling; + } + + console.error( + '[siteglide-cli-mcp] @siteglide/siteglide-mcp is not installed.\n' + + 'From the workspace: npm install in Siteglide-MCP---Experimental, and link it from siteglide-cli.' + ); + process.exit(1); +} + +const bin = resolveMcpBin(); +const child = spawn(process.execPath, [bin, ...process.argv.slice(2)], { + stdio: 'inherit', + env: process.env +}); + +child.on('exit', (code, signal) => { + if (signal) { + process.kill(process.pid, signal); + } else { + process.exit(code ?? 1); + } +}); diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index b66cfad..778b8be 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -13,7 +13,9 @@ const program = require('commander'), getBinary = require('./lib/assets/getBinary'), unzip = require('./lib/unzip'), path = require('path'), - dir = require('./lib/directories'); + dir = require('./lib/directories'), + { ensureMcpRegistered } = require('./lib/ai'), + { migrateMarketplaceBuilderToApp } = require('./lib/migrateAppDirectory'); const pullSpinner = ora({ text: 'Pulling files', stream: process.stdout }); @@ -385,31 +387,31 @@ const moveModulesToRoot = async (fromRoot) => { }; /** - * Download the main site backup zip and convert it into local `marketplace_builder/`. + * Download the main site backup zip and convert it into local `app/`. * Calls Siteglide-API `/cli/backup` then `/cli/backupStatus/:id` (no module_name). * * @param {Gateway} gateway - Authenticated API client for the current environment. - * Side effects: writes/overwrites `./marketplace_builder`; may merge into `./modules`; + * Side effects: writes/overwrites `./app`; may merge into `./modules`; * updates `pullSpinner` text; downloads then deletes a temporary zip. */ const pullSiteZip = async (gateway) => { logger.Info('[pull] Step: downloading main site zip'); - const filename = `${dir.LEGACY_APP}.zip`; + const filename = `${dir.APP}.zip`; pullSpinner.text = 'Pulling site files'; const pullTask = await gateway.pullZip(); logger.Debug(`[pull] Site backup started (id: ${pullTask.id})`); const readyTask = await waitForStatus(() => gateway.pullZipStatus(pullTask.id)); logger.Debug(`[pull] Site backup ready (status: ${readyTask.status}) — downloading zip`); await downloadFile(readyTask.zip_file.url, filename); - await unzip(filename, dir.LEGACY_APP); - await copyChildren(`./${dir.LEGACY_APP}/app`, `./${dir.LEGACY_APP}`); + await unzip(filename, dir.APP); + await copyChildren(`./${dir.APP}/app`, `./${dir.APP}`); await fs.remove(`./${filename}`); - await moveModulesToRoot(dir.LEGACY_APP); - if (await fs.pathExists(`./${dir.LEGACY_APP}/asset_manifest.json`)) { - await fs.remove(`./${dir.LEGACY_APP}/asset_manifest.json`); + await moveModulesToRoot(dir.APP); + if (await fs.pathExists(`./${dir.APP}/asset_manifest.json`)) { + await fs.remove(`./${dir.APP}/asset_manifest.json`); } - await fs.remove(`./${dir.LEGACY_APP}/app`); - await cleanupEmptyDirs(dir.LEGACY_APP); + await fs.remove(`./${dir.APP}/app`); + await cleanupEmptyDirs(dir.APP); logger.Info('[pull] Site files pulled'); }; @@ -524,10 +526,10 @@ const pullModulesInParallel = async (gateway, modulesToPull, concurrency) => { /** * Fetch the asset file list from Siteglide-API `/cli/pull` and download matching text/binary assets * by physical_file_path. Paths under `modules/` are written to `./modules/...`; everything else - * goes under `./marketplace_builder/...` so this step does not recreate `marketplace_builder/modules`. + * goes under `./app/...` so this step does not recreate `app/modules`. * * @param {Gateway} gateway - Authenticated API client for the current environment. - * Side effects: creates dirs and writes/overwrites asset files under `./marketplace_builder` or `./modules`; + * Side effects: creates dirs and writes/overwrites asset files under `./app` or `./modules`; * updates `pullSpinner` text; downloads each asset from its remote_url. */ const pullAssets = async (gateway) => { @@ -576,7 +578,7 @@ const pullAssets = async (gateway) => { return; } const isModuleAsset = physicalPath === dir.MODULES || physicalPath.indexOf(dir.MODULES + '/') === 0; - const root = isModuleAsset ? dir.MODULES : dir.LEGACY_APP; + const root = isModuleAsset ? dir.MODULES : dir.APP; const relativePath = isModuleAsset ? physicalPath.slice(dir.MODULES.length).replace(/^\//, '') : physicalPath; @@ -600,19 +602,22 @@ const pullAssets = async (gateway) => { /** * Final local cleanup after site/module/asset pulls have finished. * - * Side effects: removes leftover pull zips (`marketplace_builder.zip`, `modules-*.zip`), - * removes `./.tmp` if present, moves any leftover `marketplace_builder/modules` into `./modules` - * then deletes that nested folder, removes empty dirs under `marketplace_builder`; + * Side effects: removes leftover pull zips (`app.zip`, `marketplace_builder.zip`, `modules-*.zip`), + * removes `./.tmp` if present, moves any leftover `app/modules` into `./modules` + * then deletes that nested folder, removes empty dirs under `app`; * updates `pullSpinner` text and writes tidying-up logs. */ const tidyUpAfterPull = async () => { logger.Info('[pull] Step: tidying up local files'); pullSpinner.text = 'Tidying up...'; - const siteZip = `./${dir.LEGACY_APP}.zip`; - if (await fs.pathExists(siteZip)) { - await fs.remove(siteZip); - logger.Debug(`[pull] Removed leftover ${siteZip}`); + const siteZips = [`./${dir.APP}.zip`, `./${dir.LEGACY_APP}.zip`]; + for (let i = 0; i < siteZips.length; i++) { + const siteZip = siteZips[i]; + if (await fs.pathExists(siteZip)) { + await fs.remove(siteZip); + logger.Debug(`[pull] Removed leftover ${siteZip}`); + } } const cwdEntries = await fs.readdir('.'); @@ -629,17 +634,22 @@ const tidyUpAfterPull = async () => { logger.Debug(`[pull] Removed ./${dir.TMP}`); } - // Pull must not leave modules nested under marketplace_builder - const nestedModules = `./${dir.LEGACY_APP}/modules`; - if (await fs.pathExists(nestedModules)) { - await moveModulesToRoot(dir.LEGACY_APP); - } - if (await fs.pathExists(nestedModules)) { - await fs.remove(nestedModules); - logger.Debug(`[pull] Removed leftover ${nestedModules}`); + // Pull must not leave modules nested under app (or leftover marketplace_builder) + const appRoots = [dir.APP, dir.LEGACY_APP]; + for (let i = 0; i < appRoots.length; i++) { + const appRoot = appRoots[i]; + const nestedModules = `./${appRoot}/modules`; + if (await fs.pathExists(nestedModules)) { + await moveModulesToRoot(appRoot); + } + if (await fs.pathExists(nestedModules)) { + await fs.remove(nestedModules); + logger.Debug(`[pull] Removed leftover ${nestedModules}`); + } + if (await fs.pathExists(`./${appRoot}`)) { + await cleanupEmptyDirs(appRoot); + } } - - await cleanupEmptyDirs(dir.LEGACY_APP); logger.Info('[pull] Tidying up complete'); }; @@ -665,7 +675,7 @@ program .version(version, '-v, --version') .name('siteglide-cli pull') .usage('') - .description('Pull site files into marketplace_builder and module public files into modules/. Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds .cursor/.claude/.windsurf/.github discovery folders linked to ./.agents/skills. Modules pull in parallel (see --concurrency). Overwrites local files. By default pulls all installed modules; use -m to filter to one module.') + .description('Pull site files into app/ and module public files into modules/. Migrates marketplace_builder/ → app/ when needed (git mv in a git repo). Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds IDE discovery folders linked to ./.agents/skills. Registers Siteglide MCP in IDE configs if missing. Modules pull in parallel (see --concurrency). Overwrites local files. By default pulls all installed modules; use -m to filter to one module.') .arguments('[environment]', 'Name of environment. Example: staging') .option('-c --config-file ', 'config file path', '.siteglide-config') .option('-i --ignore-assets', 'Do not download assets such as CSS, JS, JSON etc', false) @@ -694,6 +704,10 @@ program return Confirm('Are you sure you would like to pull? This will overwrite your local files immediately! (Y/n)\n').then(async function (response) { if (response === 'Y') { try { + // Must run before any unzip/download creates ./app (otherwise both + // marketplace_builder/ and app/ appear and migration is skipped). + await migrateMarketplaceBuilderToApp(); + pullSpinner.start(); if (moduleFilter) { logger.Info(`[pull] Module filter (-m): "${moduleFilter}"`); @@ -741,6 +755,9 @@ program // After module zips (and assets that may land under modules/) are on disk await mergeModuleAgentsToRoot(modulesToPull); + pullSpinner.text = 'Checking IDE MCP registration'; + ensureMcpRegistered(); + await tidyUpAfterPull(); logger.Info('[pull] All steps finished'); diff --git a/siteglide-cli.js b/siteglide-cli.js index 4af7dc6..dca6230 100755 --- a/siteglide-cli.js +++ b/siteglide-cli.js @@ -33,6 +33,7 @@ program .command('export [environment]', 'export the code, assets and data from your site') .command('migrate [environment] --url [url]', 'Static site migration into siteglide') .command('modules [environment]', 'list modules installed on the site') + .command('mcp', 'start Siteglide MCP server (stdio)') // .command('import [environment]', 'import your data.json to bulk upload all data') .parse(process.argv); From bf6879b6b255705dd02f5a87db3efb39228bfe0e Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Wed, 29 Jul 2026 14:07:47 +0100 Subject: [PATCH 09/34] Before adding MCP security - save --- .../siteglide_exec_command_940796a4.plan.md | 37 ++- lib/ai.js | 140 +++++++++-- lib/assets/files.js | 9 +- lib/assets/generateManifest.js | 8 +- lib/assets/packAssets.js | 3 +- lib/directories.js | 24 +- lib/migrateAppDirectory.js | 216 ++++++----------- scripts/build-test-share-zip.js | 218 ++++++++++++++++++ scripts/smoke-exclusive-app-root.js | 39 ++++ scripts/smoke-mcp-register.js | 36 ++- scripts/smoke-migrate-app.js | 4 +- siteglide-cli-archive.js | 22 +- siteglide-cli-deploy.js | 53 +++-- siteglide-cli-pull.js | 66 ++++-- siteglide-cli-watch.js | 96 +++++--- 15 files changed, 718 insertions(+), 253 deletions(-) create mode 100644 scripts/build-test-share-zip.js create mode 100644 scripts/smoke-exclusive-app-root.js diff --git a/.cursor/plans/siteglide_exec_command_940796a4.plan.md b/.cursor/plans/siteglide_exec_command_940796a4.plan.md index 2c1e8aa..b1fc445 100644 --- a/.cursor/plans/siteglide_exec_command_940796a4.plan.md +++ b/.cursor/plans/siteglide_exec_command_940796a4.plan.md @@ -1,6 +1,6 @@ --- name: siteglide MCP desktop -overview: Scaffold Siteglide-MCP---Experimental (compose platformOS validate_code + Siteglide rules/ops + marketplace_builder path bridge) and wire siteglide-cli ai init + thin mcp/supervisor launchers. Stdio first; HTTP/SSE/Docker deferred. CLI exec intentionally not shipped (ops live in MCP only). +overview: Siteglide MCP desktop (stdio) + pull-time MCP registration + marketplace_builder→app migrate (FS rename + staged path rewrite; commit to record renames). test-rename harness removed. todos: - id: lib-exec content: "CANCELLED: siteglide-cli exec — ops live in MCP graphql_exec/liquid_exec instead" @@ -32,6 +32,12 @@ todos: - id: http-docker-later content: "DEFERRED: HTTP/SSE + Docker for browser agents" status: cancelled + - id: win-git-rename-index + content: "Fix migrate+pull git UX: stage exact path rewrite before unzip; then stage app/ content mods (avoid D/A churn)" + status: completed + - id: test-rename-cmd + content: "REMOVED: siteglide-cli test-rename harness (rename works; commit records renames)" + status: cancelled isProject: false --- @@ -234,6 +240,35 @@ Depend on / invoke MCP package; `ai init`; thin `mcp` / `supervisor` bins ### 3 — (later) HTTP/SSE, Dockerfile, web agent BFF auth; drop bridge when upstream marketplace_builder support is enough +## Next — Windows git index after `marketplace_builder` → `app` + +**Symptom:** After pull migrate on Windows, git shows ~10k changed files (mass delete + add) instead of renames. + +### Research takeaways (why “just git mv harder” is the wrong goal) + +Git does **not** store renames. It stores snapshots; `git status` / `git diff` *detect* renames by pairing deletes with adds ([torek / SO](https://stackoverflow.com/questions/60185482/git-mv-did-not-flag-every-file-as-renamed-several-are-deleted-added), [Dynamics blog](https://community.dynamics.com/blogs/post/?postid=24c0d875-2cc4-45d1-996a-a56a753eaca2)): + +- **Exact renames** (identical blob hash): linear, fast, works for thousands of files — `git mv` and `mv` + `git add -A` are equivalent for history. +- **Inexact renames** (path moved *and* content changed): quadratic; skipped when pair count exceeds `diff.renameLimit` / `status.renameLimit` (default historically ~1000). Then status shows raw `D`/`A` for the whole tree — matches the ~10k churn symptom. +- Mixing a directory rename with a full site zip overwrite in one unstaged/staged blob is exactly the inexact-rename trap: hashes no longer match, limit kicks in, UI looks broken. +- Windows `fatal: bad source` on `git mv *` is usually shell globbing ([git-for-windows#3250](https://github.com/git-for-windows/git/issues/3250)); our code already uses `execFile` + `git.exe` without globs. Remaining `git mv` failures are secondary — FS rename is fine if the **index timing** is right ([git-for-windows#1750](https://github.com/git-for-windows/git/issues/1750): Explorer move needs `git add -A` to sync index). + +### Chosen approach (concrete) + +In [`lib/migrateAppDirectory.js`](d:\git\siteglide-cli\lib\migrateAppDirectory.js) + [`siteglide-cli-pull.js`](d:\git\siteglide-cli\siteglide-cli-pull.js): + +1. **Diagnose once on a real Windows site** (migrate-only pause or debug flag): after disk rename + index update, *before* unzip, run `git -c status.renameLimit=0 status --short` / `git diff --cached --name-status -M100%`. Expect mostly `R100%`. If not, fix staging first. +2. **Prefer FS rename + immediate index sync** (keep `git mv` as optional fast path only): `fs.move(marketplace_builder, app)` then `git add -A -- app marketplace_builder` while on-disk content still matches HEAD blobs → stages **exact** renames into the index. +3. **Then** download/unzip into `app/` (existing pull). Do **not** re-run a combined `git add -A` over both old and new roots after content rewrite in a way that re-pairs D/A across the rename; after unzip only stage under `app/` (`git add -A -- app`) so post-pull churn is **modifications** (and new files) under `app/`, with the path rewrite already recorded. +4. **Log clearly** after migrate: rename staged; any large remaining status after pull is site content sync under `app/`, not a failed folder move. +5. **Verify**: migrate-only → `R` lines; full pull → no mass `D marketplace_builder` + `A app` for the same relative paths; Cursor/git status should not look like 10k delete+add of the whole tree. + +Do **not** rely on raising global `renameLimit` as the primary fix (helps display of inexact pairs, does not fix mixing rename+content). Do **not** require a mid-pull commit from the CLI (user commits when ready; commit is when rename detection is clearest in history/UIs). + +### Removed — `siteglide-cli test-rename` + +Harness and Jest migrate fixture removed once rename staging was confirmed; keep FS rename + staged path rewrite in pull only. + ## Out of scope (this pass) - CLI `exec` command diff --git a/lib/ai.js b/lib/ai.js index 37312c9..59a0626 100644 --- a/lib/ai.js +++ b/lib/ai.js @@ -6,8 +6,42 @@ const fs = require('fs'), /** Single MCP server id registered for all supported IDEs. */ const SERVER_NAME = 'siteglide'; -const STDIO_ENTRY = { command: 'siteglide-cli-mcp' }; -const VSCODE_ENTRY = { type: 'stdio', command: 'siteglide-cli-mcp' }; +/** + * Absolute path to this package's MCP launcher script. + * Prefer this over a bare `siteglide-cli-mcp` PATH lookup — Cursor/IDE MCP + * spawns often lack nvm/npm global bin dirs on Windows. + */ +const resolveMcpScriptPath = () => path.resolve(__dirname, '..', 'siteglide-cli-mcp.js'); + +/** + * MCP stdio launch entry using absolute node + script paths (PATH-independent). + * @param {{ type?: string }} [extra] + */ +const buildMcpLaunchEntry = (extra = {}) => { + const entry = { + command: process.execPath, + args: [resolveMcpScriptPath()] + }; + if (extra.type) { + entry.type = extra.type; + } + return entry; +}; + +/** Shared agent guidance (also mirrored into platform-specific rule wrappers). */ +const MCP_AGENT_GUIDANCE = `This is a Siteglide project. Prefer Siteglide MCP tools for Siteglide work: +validate_code, siteglide_rules, siteglide_guide, envs_list, graphql_exec, liquid_exec, logs_fetch. + +NEVER open, read, search, grep, or quote .siteglide-config (or CONFIG_FILE_PATH) — it contains secret tokens. +To list environments/sites, call the MCP tool envs_list only. For GraphQL/Liquid/logs, call the matching MCP ops tool with an environment name; those tools load credentials internally. + +If those Siteglide MCP tools are not in your live tool catalog: +1. Ensure the IDE MCP config has server "siteglide" launched via node with absolute path to siteglide-cli-mcp.js (siteglide-cli pull writes this — do not rely on PATH / bare siteglide-cli-mcp). +2. Do not work around by reading .siteglide-config. +3. Ask the user to enable the Siteglide MCP server in IDE settings (e.g. Cursor Settings → Tools & MCP) and reload the window if tools are still missing. + +Call siteglide_rules early when doing Siteglide work. +`; /** * IDE MCP registry targets. Project-local where supported; Windsurf uses its @@ -21,28 +55,28 @@ const getRegistryTargets = (rootPath = process.cwd(), homedir = os.homedir()) => label: 'Cursor', configPath: path.join(rootPath, '.cursor', 'mcp.json'), serversKey: 'mcpServers', - entry: STDIO_ENTRY + entry: buildMcpLaunchEntry() }, { id: 'claude', label: 'Claude Code', configPath: path.join(rootPath, '.mcp.json'), serversKey: 'mcpServers', - entry: STDIO_ENTRY + entry: buildMcpLaunchEntry() }, { id: 'copilot', label: 'GitHub Copilot / VS Code', configPath: path.join(rootPath, '.vscode', 'mcp.json'), serversKey: 'servers', - entry: VSCODE_ENTRY + entry: buildMcpLaunchEntry({ type: 'stdio' }) }, { id: 'windsurf', label: 'Windsurf', configPath: path.join(homedir, '.codeium', 'windsurf', 'mcp_config.json'), serversKey: 'mcpServers', - entry: STDIO_ENTRY + entry: buildMcpLaunchEntry() } ]; @@ -69,9 +103,18 @@ const readJsonObject = (filePath) => { } }; +const entriesEqual = (a, b) => { + try { + return JSON.stringify(a) === JSON.stringify(b); + } catch (error) { + return false; + } +}; + /** - * Ensure `siteglide` is present in one registry file without touching other keys. - * @returns {'added'|'skipped'|'unchanged'|'error'} + * Ensure `siteglide` is present and uses PATH-independent node + absolute script. + * Updates bare `siteglide-cli-mcp` entries. Never touches other servers. + * @returns {'added'|'updated'|'unchanged'|'error'} */ const ensureServerInConfig = (target) => { const config = readJsonObject(target.configPath); @@ -84,36 +127,45 @@ const ensureServerInConfig = (target) => { } const servers = config[target.serversKey]; - if (Object.prototype.hasOwnProperty.call(servers, SERVER_NAME)) { + const desired = Object.assign({}, target.entry); + const existing = servers[SERVER_NAME]; + + if (existing && entriesEqual(existing, desired)) { return 'unchanged'; } - servers[SERVER_NAME] = Object.assign({}, target.entry); + const hadExisting = Object.prototype.hasOwnProperty.call(servers, SERVER_NAME); + servers[SERVER_NAME] = desired; fs.mkdirSync(path.dirname(target.configPath), { recursive: true }); fs.writeFileSync(target.configPath, JSON.stringify(config, null, 2) + '\n'); - return 'added'; + return hadExisting ? 'updated' : 'added'; }; /** - * On pull: register Siteglide MCP in Cursor, Claude, Copilot, and Windsurf if missing. - * Never overwrites other servers or an existing `siteglide` entry. + * On pull: register/repair Siteglide MCP in Cursor, Claude, Copilot, and Windsurf. + * Launch uses absolute node + siteglide-cli-mcp.js (no PATH dependency). * * @param {{ rootPath?: string, homedir?: string }} [opts] - * @returns {{ added: string[], unchanged: string[], errors: string[] }} + * @returns {{ added: string[], updated: string[], unchanged: string[], errors: string[] }} */ const ensureMcpRegistered = (opts = {}) => { const rootPath = opts.rootPath || process.cwd(); const targets = getRegistryTargets(rootPath, opts.homedir || os.homedir()); const added = []; + const updated = []; const unchanged = []; const errors = []; + logger.Debug(`[pull] MCP launch: ${process.execPath} ${resolveMcpScriptPath()}`); + for (let i = 0; i < targets.length; i++) { const target = targets[i]; try { const result = ensureServerInConfig(target); if (result === 'added') { added.push(target.label); + } else if (result === 'updated') { + updated.push(target.label); } else if (result === 'unchanged') { unchanged.push(target.label); } else if (result === 'error') { @@ -130,6 +182,9 @@ const ensureMcpRegistered = (opts = {}) => { if (added.length > 0) { logger.Info(`[pull] Registered Siteglide MCP for: ${added.join(', ')}`); } + if (updated.length > 0) { + logger.Info(`[pull] Updated Siteglide MCP launch path for: ${updated.join(', ')}`); + } if (unchanged.length > 0) { logger.Debug(`[pull] Siteglide MCP already present for: ${unchanged.join(', ')}`); } @@ -138,16 +193,67 @@ const ensureMcpRegistered = (opts = {}) => { exit: false }); } - if (added.length === 0 && unchanged.length > 0 && errors.length === 0) { + if (added.length === 0 && updated.length === 0 && unchanged.length > 0 && errors.length === 0) { logger.Info('[pull] Siteglide MCP already registered for supported IDEs'); } - return { added, unchanged, errors }; + return { added, updated, unchanged, errors }; +}; + +const writeTextFile = (filePath, contents) => { + fs.mkdirSync(path.dirname(filePath), { recursive: true }); + fs.writeFileSync(filePath, contents, 'utf8'); +}; + +/** + * Write always-on IDE rules so agents prefer Siteglide MCP and never read secrets. + * Complements mcp.json registration (transport) with behavior guidance. + * + * @param {{ rootPath?: string }} [opts] + */ +const ensureMcpIdeRules = (opts = {}) => { + const rootPath = opts.rootPath || process.cwd(); + const written = []; + + try { + writeTextFile( + path.join(rootPath, '.cursor', 'rules', 'setup_siteglide_mcp.mdc'), + `---\nalwaysApply: true\n---\n${MCP_AGENT_GUIDANCE}` + ); + written.push('Cursor'); + + writeTextFile( + path.join(rootPath, '.claude', 'siteglide-mcp.md'), + `# Siteglide MCP\n\n${MCP_AGENT_GUIDANCE}` + ); + written.push('Claude'); + + writeTextFile( + path.join(rootPath, '.windsurf', 'rules', 'setup_siteglide_mcp.md'), + `---\ntrigger: always_on\n---\n${MCP_AGENT_GUIDANCE}` + ); + written.push('Windsurf'); + + writeTextFile( + path.join(rootPath, '.github', 'siteglide-mcp.md'), + `\n${MCP_AGENT_GUIDANCE}` + ); + written.push('Copilot'); + + logger.Info(`[pull] Wrote Siteglide MCP agent rules for: ${written.join(', ')}`); + } catch (error) { + logger.Warn(`[pull] Could not write MCP IDE rules: ${error.message}`, { exit: false }); + } + + return { written }; }; module.exports = { SERVER_NAME, - STDIO_ENTRY, + MCP_AGENT_GUIDANCE, + buildMcpLaunchEntry, + resolveMcpScriptPath, ensureMcpRegistered, + ensureMcpIdeRules, getRegistryTargets }; diff --git a/lib/assets/files.js b/lib/assets/files.js index 7dec42d..9c67cf2 100644 --- a/lib/assets/files.js +++ b/lib/assets/files.js @@ -1,4 +1,4 @@ -const fs = require('fs'); +const fs = require('fs'), glob = require('globby'), path = require('path'), logger = require('../logger'), @@ -12,7 +12,10 @@ const config = { const _paths = customConfig => [customConfig, config.CONFIG, config.LEGACY_CONFIG]; const _getAssets = async () => { - const appAssets = fs.existsSync(`${dir.LEGACY_APP}/assets`) ? await glob(`${dir.LEGACY_APP}/assets/**`) : []; + const siteRoot = dir.currentApp(); + const appAssets = siteRoot && fs.existsSync(`${siteRoot}/assets`) + ? await glob(`${siteRoot}/assets/**`) + : []; return [...appAssets] || []; }; @@ -53,4 +56,4 @@ module.exports = { logger.Debug(`[getConfig] Looking for config in: ${configPath}`); return _readJSON(configPath) || {}; }, -}; \ No newline at end of file +}; diff --git a/lib/assets/generateManifest.js b/lib/assets/generateManifest.js index 4cc8824..a5eb743 100644 --- a/lib/assets/generateManifest.js +++ b/lib/assets/generateManifest.js @@ -1,10 +1,11 @@ const fs = require('fs'), - files = require('../assets/files'); -dir = require('../directories'); + files = require('../assets/files'), + dir = require('../directories'); -const appDirectory = fs.existsSync(dir.APP) ? dir.APP : dir.LEGACY_APP; +const getAppDirectory = () => dir.currentApp() || dir.LEGACY_APP; const serializerManifestEntry = file => { + const appDirectory = getAppDirectory(); const fileUpdatedAt = Math.floor(new Date(fs.statSync(file)['mtime']) / 1000); return { physical_file_path: file.replace(new RegExp(`^${appDirectory}/`), ''), updated_at: fileUpdatedAt }; }; @@ -15,6 +16,7 @@ const manifestGenerate = async () => { }; const manifestGenerateForAssets = (assets) => { + const appDirectory = getAppDirectory(); let manifest = {}; for (const file of assets) { const path = file.replace(new RegExp(`(public|private)/assets/|(${appDirectory})/assets/`), ''); diff --git a/lib/assets/packAssets.js b/lib/assets/packAssets.js index 4a57c0b..b5241ba 100644 --- a/lib/assets/packAssets.js +++ b/lib/assets/packAssets.js @@ -7,7 +7,7 @@ const archiver = require('archiver-promise'), prepareArchive = require('../prepareArchive'), dir = require('../directories'); -const appDirectory = fs.existsSync(dir.APP) ? dir.APP : dir.LEGACY_APP; +const getAppDirectory = () => dir.currentApp() || dir.LEGACY_APP; // const addModulesToArchive = archive => { // if (!fs.existsSync(dir.MODULES)) return true; @@ -40,6 +40,7 @@ const prepareDestination = (path) => { const packAssets = async path => { prepareDestination(path); + const appDirectory = getAppDirectory(); const assetsArchive = prepareArchive(path); archiver(path, { zlib: { level: 6 }}); assetsArchive.glob('**/**', { cwd: `${appDirectory}/assets`}); diff --git a/lib/directories.js b/lib/directories.js index efb5641..cc9d942 100644 --- a/lib/directories.js +++ b/lib/directories.js @@ -1,3 +1,6 @@ +const fs = require('fs'); +const path = require('path'); + const app = { APP: 'app', LEGACY_APP: 'marketplace_builder', @@ -12,4 +15,23 @@ const computed = { ALLOWED: [app.APP, app.LEGACY_APP, app.MODULES] }; -module.exports = Object.assign({}, app, internal, computed); +const existsInCwd = (name, cwd = process.cwd()) => fs.existsSync(path.join(cwd, name)); + +const methods = { + toWatch: (cwd = process.cwd()) => computed.ALLOWED.filter((d) => existsInCwd(d, cwd)), + /** Prefer app/, else marketplace_builder/. Undefined if neither exists. */ + currentApp: (cwd = process.cwd()) => { + if (existsInCwd(app.APP, cwd)) { + return app.APP; + } + if (existsInCwd(app.LEGACY_APP, cwd)) { + return app.LEGACY_APP; + } + return undefined; + }, + bothAppRootsExist: (cwd = process.cwd()) => + existsInCwd(app.APP, cwd) && existsInCwd(app.LEGACY_APP, cwd), + available: (cwd = process.cwd()) => computed.ALLOWED.filter((d) => existsInCwd(d, cwd)) +}; + +module.exports = Object.assign({}, app, internal, computed, methods); diff --git a/lib/migrateAppDirectory.js b/lib/migrateAppDirectory.js index 03a82d2..0cbdf5f 100644 --- a/lib/migrateAppDirectory.js +++ b/lib/migrateAppDirectory.js @@ -1,159 +1,46 @@ const fs = require('fs-extra'), path = require('path'), - { execFileSync } = require('child_process'), dir = require('./directories'), - logger = require('./logger'); - -const gitEnv = { - ...process.env, - GIT_TERMINAL_PROMPT: '0', - LC_ALL: 'C' -}; - -let cachedGitBin; + logger = require('./logger'), + Confirm = require('./confirm'); /** - * Prefer git.exe on Windows. Spawning the `git.cmd` shim via execFile can drop - * arguments (leading to `fatal: bad source, source=`). - */ -const resolveGitBin = () => { - if (cachedGitBin) { - return cachedGitBin; - } - if (process.platform !== 'win32') { - cachedGitBin = 'git'; - return cachedGitBin; - } - try { - const out = execFileSync('where.exe', ['git'], { - encoding: 'utf8', - windowsHide: true, - stdio: ['ignore', 'pipe', 'pipe'] - }); - const candidates = String(out) - .split(/\r?\n/) - .map((line) => line.trim()) - .filter(Boolean); - const exe = candidates.find((candidate) => /\.exe$/i.test(candidate)); - cachedGitBin = exe || candidates[0] || 'git.exe'; - } catch (error) { - cachedGitBin = 'git.exe'; - } - return cachedGitBin; -}; - -const runGit = (args, cwd) => { - // execFile — no shell (avoids PowerShell glob/arg mangling). - return execFileSync(resolveGitBin(), args, { - cwd, - env: gitEnv, - encoding: 'utf8', - stdio: ['ignore', 'pipe', 'pipe'], - windowsHide: true - }); -}; - -const isGitWorkTree = (cwd = process.cwd()) => { - try { - runGit(['rev-parse', '--is-inside-work-tree'], cwd); - return true; - } catch (error) { - return false; - } -}; - -/** True if git has any indexed paths under marketplace_builder. */ -const isLegacyTracked = (cwd) => { - try { - const out = runGit(['ls-files', '--', dir.LEGACY_APP], cwd); - return String(out || '').trim().length > 0; - } catch (error) { - return false; - } -}; - -/** - * After a same-volume directory rename, update the index so git records renames - * (works cross-platform; avoids fragile `git mv` under Windows/Node). - */ -const stageRenameInGit = (cwd) => { - runGit(['add', '-A', '--', dir.APP, dir.LEGACY_APP], cwd); -}; - -const toPosixAbs = (cwd, name) => path.resolve(cwd, name).split(path.sep).join('/'); - -/** - * Try `git mv` with relative then absolute POSIX paths, using git.exe on Windows. - * @returns {boolean} true if git mv succeeded + * TEMPORARY: ask before renaming marketplace_builder → app (remove later). + * Lets you keep legacy layout on production sites while testing a newer CLI. + * + * @returns {Promise} true if user answered Y */ -const tryGitMv = (cwd) => { - const attempts = [ - [dir.LEGACY_APP, dir.APP], - [toPosixAbs(cwd, dir.LEGACY_APP), toPosixAbs(cwd, dir.APP)] - ]; - - let lastDetail = ''; - for (let i = 0; i < attempts.length; i++) { - const [from, to] = attempts[i]; - try { - runGit(['mv', from, to], cwd); - return true; - } catch (error) { - lastDetail = (error.stderr || error.stdout || error.message || String(error)).toString().trim(); - logger.Debug(`[pull] git mv attempt failed (${from} → ${to}): ${lastDetail}`); - } - } - - logger.Warn( - `[pull] git mv failed (${lastDetail || 'unknown error'}); using filesystem rename + git add`, - { exit: false } +const confirmRenameLegacyToApp = async () => { + logger.Info( + `This project still uses ${dir.LEGACY_APP}/. platformOS (and AI tools) prefer ${dir.APP}/ — ` + + 'renaming keeps the layout tidier and helps AI tools recognise the code structure.' + ); + logger.Info( + '(Temporary prompt — say n to leave marketplace_builder/ alone, e.g. for an older CLI on other projects.)' ); - return false; + const answer = await Confirm( + `Rename ${dir.LEGACY_APP}/ → ${dir.APP}/ before pull? (Y/n)\n` + ); + return answer === 'Y'; }; /** - * Rename marketplace_builder → app. Prefer git mv when tracked; always fall back to - * filesystem rename + index update (reliable on Windows PowerShell/CMD). + * Rename marketplace_builder → app on disk only (no git staging — large trees + * can hit ENOBUFS on Windows; users stage/commit themselves if they want). * * @param {string} cwd - * @returns {'renamed-git'|'renamed-fs'} + * @returns {Promise<'renamed-fs'>} */ const renameLegacyToApp = async (cwd) => { const legacy = path.join(cwd, dir.LEGACY_APP); const modern = path.join(cwd, dir.APP); - const inGit = isGitWorkTree(cwd); - const tracked = inGit && isLegacyTracked(cwd); - - if (tracked) { - logger.Info(`[pull] Migrating ${dir.LEGACY_APP}/ → ${dir.APP}/ (platformOS layout, git)`); - logger.Debug(`[pull] Using git binary: ${resolveGitBin()}`); - if (tryGitMv(cwd)) { - return 'renamed-git'; - } - } else if (inGit) { - logger.Info( - `[pull] Migrating ${dir.LEGACY_APP}/ → ${dir.APP}/ (filesystem rename; folder not in git index)` - ); - } else { - logger.Info(`[pull] Migrating ${dir.LEGACY_APP}/ → ${dir.APP}/ (platformOS layout)`); - } + logger.Info(`[pull] Migrating ${dir.LEGACY_APP}/ → ${dir.APP}/ (filesystem rename)`); await fs.move(legacy, modern, { overwrite: false }); - - if (inGit) { - try { - stageRenameInGit(cwd); - if (tracked) { - logger.Info('[pull] Staged rename in git index (history preserved via rename detection)'); - } - } catch (error) { - logger.Warn( - `[pull] Renamed on disk but could not update git index: ${error.message}`, - { exit: false } - ); - } - } - + logger.Info( + `[pull] Renamed ${dir.LEGACY_APP}/ → ${dir.APP}/. ` + + 'Stage and commit in git yourself if you want rename history recorded.' + ); return 'renamed-fs'; }; @@ -161,8 +48,8 @@ const renameLegacyToApp = async (cwd) => { * platformOS guidance: use `app/` not legacy `marketplace_builder/`. * If only the legacy folder exists, rename it to `app`. * - * @param {{ cwd?: string }} [opts] - * @returns {Promise<'renamed-git'|'renamed-fs'|'skipped-both'|'skipped-missing'>} + * @param {{ cwd?: string, skipConfirm?: boolean }} [opts] + * @returns {Promise<'renamed-fs'|'skipped-both'|'skipped-missing'|'skipped-declined'>} */ const migrateMarketplaceBuilderToApp = async (opts = {}) => { const cwd = opts.cwd || process.cwd(); @@ -181,11 +68,56 @@ const migrateMarketplaceBuilderToApp = async (opts = {}) => { return 'skipped-both'; } + // TEMPORARY confirm — remove skipConfirm default / prompt when ready to always migrate. + if (!opts.skipConfirm) { + const ok = await confirmRenameLegacyToApp(); + if (!ok) { + logger.Info( + `[pull] Keeping ${dir.LEGACY_APP}/ (pull will write there). Prefer ${dir.APP}/ when you can.` + ); + return 'skipped-declined'; + } + } + return renameLegacyToApp(cwd); }; +/** + * Which folder pull should write site files into after migrate. + * Prefer app/ when present; otherwise marketplace_builder/ if that was kept. + * + * @param {string} [cwd] + * @returns {Promise} + */ +const resolveSiteAppRoot = async (cwd = process.cwd()) => { + if (await fs.pathExists(path.join(cwd, dir.APP))) { + return dir.APP; + } + if (await fs.pathExists(path.join(cwd, dir.LEGACY_APP))) { + return dir.LEGACY_APP; + } + return dir.APP; +}; + +/** + * Resolve exclusive site root for sync/deploy: `app/` OR `marketplace_builder/`. + * If both exist, warns and exits — source of truth is ambiguous. + * + * @param {string} [cwd] + * @returns {string|null} Folder name, or null if neither exists + */ +const assertExclusiveSiteAppRoot = (cwd = process.cwd()) => { + if (dir.bothAppRootsExist(cwd)) { + logger.Error( + `Both ${dir.APP}/ and ${dir.LEGACY_APP}/ exist. ` + + 'Sort out which is the source of truth (keep one, remove or rename the other) before continuing.' + ); + } + return dir.currentApp(cwd) || null; +}; + module.exports = { migrateMarketplaceBuilderToApp, - isGitWorkTree, - resolveGitBin + resolveSiteAppRoot, + assertExclusiveSiteAppRoot }; diff --git a/scripts/build-test-share-zip.js b/scripts/build-test-share-zip.js new file mode 100644 index 0000000..5321cd1 --- /dev/null +++ b/scripts/build-test-share-zip.js @@ -0,0 +1,218 @@ +#!/usr/bin/env node +/** + * Build a shareable zip: siteglide-cli-test + bundled MCP (no npm publish). + * Output: siteglide-cli-workspace-notes/dist/siteglide-cli-test-*.zip + */ +const fs = require('fs-extra'); +const path = require('path'); +const { execFileSync } = require('child_process'); + +const CLI_ROOT = path.resolve(__dirname, '..'); +const MCP_ROOT = path.resolve(CLI_ROOT, '..', 'Siteglide-MCP---Experimental'); +const OUT_ROOT = path.resolve(CLI_ROOT, '..', 'siteglide-cli-workspace-notes', 'dist'); +const STAGE = path.join(OUT_ROOT, 'siteglide-cli-test-bundle'); +const ZIP_NAME = `siteglide-cli-test-${new Date().toISOString().slice(0, 10)}.zip`; + +const CLI_SKIP = new Set([ + 'node_modules', + '.git', + '.cursor', + 'coverage', + 'dist', + '.tmp', + 'package-lock.json' +]); + +const MCP_SKIP = new Set(['node_modules', '.git', '.cursor', 'package-lock.json']); + +const copyTree = async (src, dest, skip) => { + await fs.ensureDir(dest); + const entries = await fs.readdir(src); + for (const name of entries) { + if (skip.has(name)) { + continue; + } + const from = path.join(src, name); + const to = path.join(dest, name); + const stat = await fs.stat(from); + if (stat.isDirectory()) { + await copyTree(from, to, skip); + } else { + await fs.copy(from, to); + } + } +}; + +const main = async () => { + if (!(await fs.pathExists(MCP_ROOT))) { + throw new Error(`MCP package not found at ${MCP_ROOT}`); + } + + await fs.remove(STAGE); + await fs.ensureDir(STAGE); + + const mcpDest = path.join(STAGE, 'siteglide-mcp'); + const cliDest = path.join(STAGE, 'siteglide-cli-test'); + + console.log('Copying MCP…'); + await copyTree(MCP_ROOT, mcpDest, MCP_SKIP); + + console.log('Copying CLI…'); + await copyTree(CLI_ROOT, cliDest, CLI_SKIP); + + const cliPkgPath = path.join(cliDest, 'package.json'); + const cliPkg = await fs.readJson(cliPkgPath); + cliPkg.name = '@siteglide/siteglide-cli-test'; + cliPkg.description = + 'TEST / preview build of Siteglide CLI + MCP (not the production siteglide-cli package)'; + cliPkg.version = `${cliPkg.version}-test.0`; + cliPkg.dependencies['@siteglide/siteglide-mcp'] = 'file:../siteglide-mcp'; + + const newBin = {}; + for (const [binName, binPath] of Object.entries(cliPkg.bin || {})) { + const testName = binName.replace(/^siteglide-cli/, 'siteglide-cli-test'); + newBin[testName] = binPath; + } + cliPkg.bin = newBin; + delete cliPkg.preferGlobal; + await fs.writeJson(cliPkgPath, cliPkg, { spaces: '\t' }); + + // MCP registration id: siteglide-test (won't clash with production "siteglide") + const aiPath = path.join(cliDest, 'lib', 'ai.js'); + let aiSrc = await fs.readFile(aiPath, 'utf8'); + aiSrc = aiSrc.replace( + /const SERVER_NAME = 'siteglide';/, + "const SERVER_NAME = 'siteglide-test';" + ); + aiSrc = aiSrc.replace(/server "siteglide"/g, 'server "siteglide-test"'); + aiSrc = aiSrc.replace(/Siteglide MCP/g, 'Siteglide test MCP'); + aiSrc = aiSrc.replace(/bare siteglide-cli-mcp/g, 'bare siteglide-cli-test-mcp'); + aiSrc = aiSrc.replace( + /absolute path to siteglide-cli-mcp\.js/g, + 'absolute path to siteglide-cli-mcp.js (via siteglide-cli-test)' + ); + await fs.writeFile(aiPath, aiSrc); + + const mcpLauncher = path.join(cliDest, 'siteglide-cli-mcp.js'); + let mcpLaunchSrc = await fs.readFile(mcpLauncher, 'utf8'); + mcpLaunchSrc = mcpLaunchSrc.replace( + /\[siteglide-cli-mcp\]/g, + '[siteglide-cli-test-mcp]' + ); + await fs.writeFile(mcpLauncher, mcpLaunchSrc); + + const mainCli = path.join(cliDest, 'siteglide-cli.js'); + let mainSrc = await fs.readFile(mainCli, 'utf8'); + mainSrc = mainSrc.replace( + /Siteglide CLI v/, + 'Siteglide CLI TEST v' + ); + await fs.writeFile(mainCli, mainSrc); + + const installMd = `# Siteglide CLI TEST — install (for your boss / AI) + +This zip is a **preview** of Siteglide CLI + MCP. It installs as **\`siteglide-cli-test\`** so it does **not** replace your normal \`siteglide-cli\`. + +## Requirements + +- Node.js 18+ (22 recommended) +- Windows, macOS, or Linux +- npm (comes with Node) + +## Ask an AI to install (recommended) + +Paste this into Cursor / ChatGPT after unzipping: + +\`\`\` +Unzip this archive if needed. From the folder that contains INSTALL.md, run: + + cd siteglide-mcp + npm install + cd ../siteglide-cli-test + npm install + npm install -g . + +Then confirm: + siteglide-cli-test --version + where siteglide-cli-test (Windows) or which siteglide-cli-test (Mac/Linux) + +Do NOT install over or uninstall the normal siteglide-cli package. +\`\`\` + +## Manual install (PowerShell) + +\`\`\`powershell +cd path\\to\\siteglide-cli-test-bundle\\siteglide-mcp +npm install +cd ..\\siteglide-cli-test +npm install +npm install -g . +siteglide-cli-test --version +\`\`\` + +## Try it on a Siteglide site + +\`\`\`powershell +cd path\\to\\your-site +siteglide-cli-test pull staging +\`\`\` + +Then in Cursor: **Settings → Tools & MCP** → enable **siteglide-test** → reload the window. + +Commands use the \`siteglide-cli-test\` prefix, e.g.: + +- \`siteglide-cli-test pull staging\` +- \`siteglide-cli-test mcp\` +- \`siteglide-cli-test-mcp\` (same MCP launcher Cursor uses) + +## Uninstall later + +\`\`\`powershell +npm uninstall -g @siteglide/siteglide-cli-test +\`\`\` + +Your normal \`siteglide-cli\` is unchanged. +`; + + await fs.writeFile(path.join(STAGE, 'INSTALL.md'), installMd); + + const aiPrompt = `Please install this Siteglide CLI TEST preview for me. + +1. Open the folder that contains INSTALL.md (after unzipping if needed). +2. Run: cd siteglide-mcp && npm install +3. Run: cd ../siteglide-cli-test && npm install && npm install -g . +4. Confirm \`siteglide-cli-test --version\` works. +5. Do not remove or overwrite the normal siteglide-cli package. + +This is a test build; commands are siteglide-cli-test (not siteglide-cli). +`; + await fs.writeFile(path.join(STAGE, 'ASK-AI-TO-INSTALL.txt'), aiPrompt); + + const zipPath = path.join(OUT_ROOT, ZIP_NAME); + await fs.remove(zipPath); + + console.log('Creating zip…'); + // Use PowerShell Compress-Archive on Windows for reliability without extra deps + if (process.platform === 'win32') { + execFileSync( + 'powershell.exe', + [ + '-NoProfile', + '-Command', + `Compress-Archive -Path '${STAGE.replace(/'/g, "''")}\\*' -DestinationPath '${zipPath.replace(/'/g, "''")}' -Force` + ], + { stdio: 'inherit' } + ); + } else { + execFileSync('zip', ['-r', zipPath, '.'], { cwd: STAGE, stdio: 'inherit' }); + } + + const stat = await fs.stat(zipPath); + console.log(`Done: ${zipPath}`); + console.log(`Size: ${(stat.size / (1024 * 1024)).toFixed(1)} MB`); +}; + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/scripts/smoke-exclusive-app-root.js b/scripts/smoke-exclusive-app-root.js new file mode 100644 index 0000000..9dfbe6c --- /dev/null +++ b/scripts/smoke-exclusive-app-root.js @@ -0,0 +1,39 @@ +const fs = require('fs-extra'); +const path = require('path'); +const os = require('os'); +const { spawnSync } = require('child_process'); +const { assertExclusiveSiteAppRoot } = require('../lib/migrateAppDirectory'); + +(async () => { + const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-cli-')); + await fs.mkdir(path.join(tmp, 'app')); + if (assertExclusiveSiteAppRoot(tmp) !== 'app') { + throw new Error('expected app'); + } + + await fs.remove(path.join(tmp, 'app')); + await fs.mkdir(path.join(tmp, 'marketplace_builder')); + if (assertExclusiveSiteAppRoot(tmp) !== 'marketplace_builder') { + throw new Error('expected marketplace_builder'); + } + + await fs.mkdir(path.join(tmp, 'app')); + const script = ` + const { assertExclusiveSiteAppRoot } = require(${JSON.stringify(path.join(__dirname, '../lib/migrateAppDirectory'))}); + assertExclusiveSiteAppRoot(${JSON.stringify(tmp)}); + console.log('should-not-reach'); + `; + const r = spawnSync(process.execPath, ['-e', script], { encoding: 'utf8' }); + if (r.status === 0) { + throw new Error('expected exit when both folders exist'); + } + if (!/source of truth/i.test(r.stderr + r.stdout)) { + throw new Error('expected source-of-truth warning, got: ' + (r.stderr + r.stdout)); + } + + await fs.remove(tmp); + console.log('assertExclusiveSiteAppRoot smoke ok'); +})().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/scripts/smoke-mcp-register.js b/scripts/smoke-mcp-register.js index 32191de..f6014e4 100644 --- a/scripts/smoke-mcp-register.js +++ b/scripts/smoke-mcp-register.js @@ -2,7 +2,13 @@ const assert = require('assert'); const fs = require('fs'); const os = require('os'); const path = require('path'); -const { ensureMcpRegistered, SERVER_NAME } = require('../lib/ai'); +const { + ensureMcpRegistered, + ensureMcpIdeRules, + SERVER_NAME, + resolveMcpScriptPath, + buildMcpLaunchEntry +} = require('../lib/ai'); const root = fs.mkdtempSync(path.join(os.tmpdir(), 'sg-mcp-reg-')); const fakeHome = fs.mkdtempSync(path.join(os.tmpdir(), 'sg-mcp-home-')); @@ -10,19 +16,39 @@ const cursorPath = path.join(root, '.cursor', 'mcp.json'); fs.mkdirSync(path.dirname(cursorPath), { recursive: true }); fs.writeFileSync( cursorPath, - JSON.stringify({ mcpServers: { other: { command: 'keep-me' } } }, null, 2) + JSON.stringify({ + mcpServers: { + other: { command: 'keep-me' }, + [SERVER_NAME]: { command: 'siteglide-cli-mcp' } + } + }, null, 2) ); const first = ensureMcpRegistered({ rootPath: root, homedir: fakeHome }); -assert.ok(first.added.includes('Cursor')); +assert.ok(first.updated.includes('Cursor'), 'should repair bare siteglide-cli-mcp'); assert.ok(first.added.includes('Windsurf')); const afterFirst = JSON.parse(fs.readFileSync(cursorPath, 'utf8')); assert.deepStrictEqual(afterFirst.mcpServers.other, { command: 'keep-me' }); -assert.ok(afterFirst.mcpServers[SERVER_NAME]); +assert.strictEqual(afterFirst.mcpServers[SERVER_NAME].command, process.execPath); +assert.deepStrictEqual(afterFirst.mcpServers[SERVER_NAME].args, [resolveMcpScriptPath()]); +assert.ok(!afterFirst.mcpServers[SERVER_NAME].command.includes('siteglide-cli-mcp') || afterFirst.mcpServers[SERVER_NAME].args); const second = ensureMcpRegistered({ rootPath: root, homedir: fakeHome }); assert.ok(second.unchanged.includes('Cursor')); -assert.strictEqual(second.added.includes('Cursor'), false); +assert.strictEqual(second.updated.includes('Cursor'), false); + +const desired = buildMcpLaunchEntry(); +assert.strictEqual(desired.command, process.execPath); +assert.ok(fs.existsSync(desired.args[0])); + +const rules = ensureMcpIdeRules({ rootPath: root }); +assert.ok(rules.written.includes('Cursor')); +assert.ok(fs.existsSync(path.join(root, '.cursor', 'rules', 'setup_siteglide_mcp.mdc'))); +assert.ok(fs.existsSync(path.join(root, '.claude', 'siteglide-mcp.md'))); +const cursorRule = fs.readFileSync(path.join(root, '.cursor', 'rules', 'setup_siteglide_mcp.mdc'), 'utf8'); +assert.ok(cursorRule.indexOf('.siteglide-config') > -1); +assert.ok(cursorRule.indexOf('envs_list') > -1); +assert.ok(cursorRule.indexOf('NEVER') > -1); fs.rmSync(root, { recursive: true, force: true }); fs.rmSync(fakeHome, { recursive: true, force: true }); diff --git a/scripts/smoke-migrate-app.js b/scripts/smoke-migrate-app.js index 1211bcc..1d42da7 100644 --- a/scripts/smoke-migrate-app.js +++ b/scripts/smoke-migrate-app.js @@ -9,12 +9,12 @@ const { migrateMarketplaceBuilderToApp } = require('../lib/migrateAppDirectory') await fs.mkdir(path.join(root, 'marketplace_builder')); await fs.writeFile(path.join(root, 'marketplace_builder', 'x.txt'), 'ok'); - const result = await migrateMarketplaceBuilderToApp({ cwd: root }); + const result = await migrateMarketplaceBuilderToApp({ cwd: root, skipConfirm: true }); assert.equal(result, 'renamed-fs'); assert.equal(await fs.pathExists(path.join(root, 'app', 'x.txt')), true); assert.equal(await fs.pathExists(path.join(root, 'marketplace_builder')), false); - const skip = await migrateMarketplaceBuilderToApp({ cwd: root }); + const skip = await migrateMarketplaceBuilderToApp({ cwd: root, skipConfirm: true }); assert.equal(skip, 'skipped-missing'); await fs.remove(root); diff --git a/siteglide-cli-archive.js b/siteglide-cli-archive.js index 77d5a2b..a3d664e 100755 --- a/siteglide-cli-archive.js +++ b/siteglide-cli-archive.js @@ -13,7 +13,9 @@ const program = require('commander'), files = require('./lib/assets/files'), Gateway = require('./lib/proxy'); -const availableDirectories = () => dir.ALLOWED.filter(fs.existsSync); +const { assertExclusiveSiteAppRoot } = require('./lib/migrateAppDirectory'); + +const availableDirectories = () => dir.available(); const addModulesToArchive = (archive, withImages) => { if (!fs.existsSync(dir.MODULES)) return Promise.resolve(true); @@ -57,13 +59,15 @@ const addModuleToArchive = (module, archive, withImages, pattern = '?(public|pri }); }; -const makeArchive = (path, directory, program) => { +const makeArchive = (archivePath, directory, program) => { if (availableDirectories().length === 0) { logger.Error(`At least one of ${dir.ALLOWED} directories is needed to deploy`, { hideTimestamp: true }); } - const releaseArchive = prepareArchive(path); - releaseArchive.glob('**/*', { cwd: directory, ignore: ['assets/**', '**/node_modules/**']}, { prefix: directory }); + const releaseArchive = prepareArchive(archivePath); + if (directory) { + releaseArchive.glob('**/*', { cwd: directory, ignore: ['assets/**', '**/node_modules/**']}, { prefix: directory }); + } addModulesToArchive(releaseArchive).then(r => { releaseArchive.finalize(); @@ -96,4 +100,12 @@ program .option('--url ', 'site url', process.env.SITEGLIDE_URL) .parse(process.argv); -makeArchive(program.opts().target, dir.LEGACY_APP, program); +const siteRoot = assertExclusiveSiteAppRoot(); +if (!siteRoot && !fs.existsSync(dir.MODULES)) { + logger.Error( + `${dir.APP}/ or ${dir.LEGACY_APP}/ has to exist! Please make sure you have the correct folder structure.`, + { hideTimestamp: true } + ); +} +logger.Info(`[Deploy] Archiving from: ${siteRoot || '(modules only)'}`); +makeArchive(program.opts().target, siteRoot, program); diff --git a/siteglide-cli-deploy.js b/siteglide-cli-deploy.js index 8df17a3..d0ad482 100755 --- a/siteglide-cli-deploy.js +++ b/siteglide-cli-deploy.js @@ -9,7 +9,10 @@ const program = require('commander'), Confirm = require('./lib/confirm'), glob = require('globby'), fs = require('fs'), + path = require('path'), getFile = require('./lib/migration/lib/utils/get-file'), + dir = require('./lib/directories'), + { assertExclusiveSiteAppRoot } = require('./lib/migrateAppDirectory'), version = require('./package.json').version; const filePathUnixified = filePath => filePath.replace(/\\/g, '/'); @@ -63,28 +66,34 @@ const getBody = (filePath, processTemplate) => { const deploy = async (env, authData, params) => { const gateway = new Gateway(authData); - - let files = await glob('marketplace_builder/views/pages/**/*.liquid'); - - try { - for(var i=0;i { - if(file.fileContent.includes('is_homepage: true')){ - let filePath = filePathUnixified(file.filePath); // need path with / separators - - const formData = { - path: filePath, - marketplace_builder_file_body: getBody(filePath, false) - }; - - return gateway.sync(formData); - } - }) - .catch((err) => console.log(err)) + const siteRoot = dir.currentApp() || null; + + if (siteRoot) { + let files = await glob(`${siteRoot}/views/pages/**/*.liquid`); + + try { + for(var i=0;i { + if(file.fileContent.includes('is_homepage: true')){ + let filePath = filePathUnixified(file.filePath); // need path with / separators + // API expects path without app/ or marketplace_builder/ prefix + const apiPath = filePath + .replace(new RegExp(`^${siteRoot}/`), ''); + + const formData = { + path: apiPath, + marketplace_builder_file_body: getBody(file.filePath, false) + }; + + return gateway.sync(formData); + } + }) + .catch((err) => console.log(err)) + } + } catch (error) { + console.log(`Error: ${error}`); } - } catch (error) { - console.log(`Error: ${error}`); } await uploadArchive(env, params.withAssets); @@ -103,6 +112,8 @@ program process.env.WITH_IMAGES = params.withAssets; const authData = fetchAuthData(environment, program); + // Fail fast before confirm when both app/ and marketplace_builder/ exist + assertExclusiveSiteAppRoot(); Confirm(`Are you sure you would like to deploy to ${authData.url}? (Y/n)\n`).then(function (response) { if (response === 'Y') { diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index 778b8be..d2269b6 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -14,8 +14,11 @@ const program = require('commander'), unzip = require('./lib/unzip'), path = require('path'), dir = require('./lib/directories'), - { ensureMcpRegistered } = require('./lib/ai'), - { migrateMarketplaceBuilderToApp } = require('./lib/migrateAppDirectory'); + { ensureMcpRegistered, ensureMcpIdeRules } = require('./lib/ai'), + { + migrateMarketplaceBuilderToApp, + resolveSiteAppRoot + } = require('./lib/migrateAppDirectory'); const pullSpinner = ora({ text: 'Pulling files', stream: process.stdout }); @@ -275,12 +278,17 @@ const CURSOR_SETUP_RULE = `--- alwaysApply: true --- Check if you have access to Siteglide skills automatically. If not, immediately check the ./.agents directory for skills on startup and add matching skills in your .cursor/skills directory using symlinks. +Also follow ./.cursor/rules/setup_siteglide_mcp.mdc for Siteglide MCP (never read .siteglide-config; use envs_list). `; /** Claude project instructions — mirrors Siteglide/Siteglide-AI-Skills `.claude/CLAUDE.md`. */ const CLAUDE_SETUP_MD = `# Setup Siteglide Skills Check if you have access to Siteglide skills automatically. If not, immediately check the ./.agents/skills/siteglide/ directory for skills on startup and use a single bash command to copy that to your ./.claude/skills/ directory. Then reload your plugins if needed (to import those new skills). + +## Siteglide MCP + +See ./.claude/siteglide-mcp.md. Prefer Siteglide MCP tools. NEVER read .siteglide-config — use envs_list for environment names. `; /** Windsurf always-on rule pointing at the shared `.agents` tree. */ @@ -288,11 +296,13 @@ const WINDSURF_SETUP_RULE = `--- trigger: always_on --- Check if you have access to Siteglide skills automatically. If not, immediately check the ./.agents directory for skills on startup and add matching skills in your .windsurf/skills directory using symlinks (or rely on ./.windsurf/skills if it already links to ./.agents/skills). +Also follow ./.windsurf/rules/setup_siteglide_mcp.md for Siteglide MCP (never read .siteglide-config; use envs_list). `; /** Copilot custom instructions pointing at the shared `.agents` tree. */ const COPILOT_INSTRUCTIONS_MD = ` If agent skills are not already available, use the skills under ./.agents/skills/ (also linked from ./.github/skills/). Prefer those over inventing Siteglide/platformOS workflows from memory. +Also see ./.github/siteglide-mcp.md: prefer Siteglide MCP tools; NEVER read .siteglide-config — use envs_list for environment names. `; /** @@ -387,31 +397,33 @@ const moveModulesToRoot = async (fromRoot) => { }; /** - * Download the main site backup zip and convert it into local `app/`. + * Download the main site backup zip and convert it into the local site root (`app/` or + * `marketplace_builder/` if the temporary rename confirm was declined). * Calls Siteglide-API `/cli/backup` then `/cli/backupStatus/:id` (no module_name). * * @param {Gateway} gateway - Authenticated API client for the current environment. - * Side effects: writes/overwrites `./app`; may merge into `./modules`; + * @param {string} [siteRoot] - Relative site folder (`app` or `marketplace_builder`). + * Side effects: writes/overwrites that folder; may merge into `./modules`; * updates `pullSpinner` text; downloads then deletes a temporary zip. */ -const pullSiteZip = async (gateway) => { - logger.Info('[pull] Step: downloading main site zip'); - const filename = `${dir.APP}.zip`; +const pullSiteZip = async (gateway, siteRoot = dir.APP) => { + logger.Info(`[pull] Step: downloading main site zip → ${siteRoot}/`); + const filename = `${siteRoot}.zip`; pullSpinner.text = 'Pulling site files'; const pullTask = await gateway.pullZip(); logger.Debug(`[pull] Site backup started (id: ${pullTask.id})`); const readyTask = await waitForStatus(() => gateway.pullZipStatus(pullTask.id)); logger.Debug(`[pull] Site backup ready (status: ${readyTask.status}) — downloading zip`); await downloadFile(readyTask.zip_file.url, filename); - await unzip(filename, dir.APP); - await copyChildren(`./${dir.APP}/app`, `./${dir.APP}`); + await unzip(filename, siteRoot); + await copyChildren(`./${siteRoot}/app`, `./${siteRoot}`); await fs.remove(`./${filename}`); - await moveModulesToRoot(dir.APP); - if (await fs.pathExists(`./${dir.APP}/asset_manifest.json`)) { - await fs.remove(`./${dir.APP}/asset_manifest.json`); + await moveModulesToRoot(siteRoot); + if (await fs.pathExists(`./${siteRoot}/asset_manifest.json`)) { + await fs.remove(`./${siteRoot}/asset_manifest.json`); } - await fs.remove(`./${dir.APP}/app`); - await cleanupEmptyDirs(dir.APP); + await fs.remove(`./${siteRoot}/app`); + await cleanupEmptyDirs(siteRoot); logger.Info('[pull] Site files pulled'); }; @@ -526,13 +538,14 @@ const pullModulesInParallel = async (gateway, modulesToPull, concurrency) => { /** * Fetch the asset file list from Siteglide-API `/cli/pull` and download matching text/binary assets * by physical_file_path. Paths under `modules/` are written to `./modules/...`; everything else - * goes under `./app/...` so this step does not recreate `app/modules`. + * goes under the site root (`app/` or `marketplace_builder/`) so this step does not recreate nested modules. * * @param {Gateway} gateway - Authenticated API client for the current environment. - * Side effects: creates dirs and writes/overwrites asset files under `./app` or `./modules`; + * @param {string} [siteRoot] - Relative site folder for non-module assets. + * Side effects: creates dirs and writes/overwrites asset files under the site root or `./modules`; * updates `pullSpinner` text; downloads each asset from its remote_url. */ -const pullAssets = async (gateway) => { +const pullAssets = async (gateway, siteRoot = dir.APP) => { pullSpinner.text = 'Pulling assets'; const response = await gateway.pull(); const asset_files = []; @@ -578,7 +591,7 @@ const pullAssets = async (gateway) => { return; } const isModuleAsset = physicalPath === dir.MODULES || physicalPath.indexOf(dir.MODULES + '/') === 0; - const root = isModuleAsset ? dir.MODULES : dir.APP; + const root = isModuleAsset ? dir.MODULES : siteRoot; const relativePath = isModuleAsset ? physicalPath.slice(dir.MODULES.length).replace(/^\//, '') : physicalPath; @@ -675,7 +688,7 @@ program .version(version, '-v, --version') .name('siteglide-cli pull') .usage('') - .description('Pull site files into app/ and module public files into modules/. Migrates marketplace_builder/ → app/ when needed (git mv in a git repo). Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds IDE discovery folders linked to ./.agents/skills. Registers Siteglide MCP in IDE configs if missing. Modules pull in parallel (see --concurrency). Overwrites local files. By default pulls all installed modules; use -m to filter to one module.') + .description('Pull site files into app/ and module public files into modules/. Migrates marketplace_builder/ → app/ when needed (filesystem rename + staged exact path rewrite in a git repo). Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds IDE discovery folders linked to ./.agents/skills. Registers Siteglide MCP in IDE configs if missing. Modules pull in parallel (see --concurrency). Overwrites local files. By default pulls all installed modules; use -m to filter to one module.') .arguments('[environment]', 'Name of environment. Example: staging') .option('-c --config-file ', 'config file path', '.siteglide-config') .option('-i --ignore-assets', 'Do not download assets such as CSS, JS, JSON etc', false) @@ -706,7 +719,10 @@ program try { // Must run before any unzip/download creates ./app (otherwise both // marketplace_builder/ and app/ appear and migration is skipped). - await migrateMarketplaceBuilderToApp(); + // TEMPORARY: prompts before rename — remove confirm later. + const migrateResult = await migrateMarketplaceBuilderToApp(); + const siteRoot = await resolveSiteAppRoot(); + logger.Info(`[pull] Site files root: ${siteRoot}/`); pullSpinner.start(); if (moduleFilter) { @@ -742,12 +758,12 @@ program logger.Info(`[pull] Will pull ${modulesToPull.length} module(s): ${modulesToPull.join(', ')}`); } - await pullSiteZip(gateway); + await pullSiteZip(gateway, siteRoot); await pullModulesInParallel(gateway, modulesToPull, modulePullConcurrency); if (!ignoreAssets) { - await pullAssets(gateway); + await pullAssets(gateway, siteRoot); } else { logger.Info('[pull] Skipping assets step'); } @@ -757,10 +773,16 @@ program pullSpinner.text = 'Checking IDE MCP registration'; ensureMcpRegistered(); + ensureMcpIdeRules(); await tidyUpAfterPull(); logger.Info('[pull] All steps finished'); + if (migrateResult === 'renamed-fs') { + logger.Info( + '[pull] Tip: if you use git, stage/commit the marketplace_builder/ → app/ rename when ready' + ); + } pullSpinner.succeed('Pulled files'); } catch (e) { logger.Debug(e); diff --git a/siteglide-cli-watch.js b/siteglide-cli-watch.js index 85c49bd..ad32fc5 100755 --- a/siteglide-cli-watch.js +++ b/siteglide-cli-watch.js @@ -12,19 +12,24 @@ const program = require('commander'), templates = require('./lib/templates'), settings = require('./lib/settings'), livereload = require('livereload'), - directories = require('./lib/directories'), + dir = require('./lib/directories'), + { assertExclusiveSiteAppRoot } = require('./lib/migrateAppDirectory'), presignDirectory = require('./lib/presignUrl').presignDirectory, manifestGenerateForAssets = require('./lib/assets/generateManifest').manifestGenerateForAssets, uploadFileFormData = require('./lib/s3UploadFile').uploadFileFormData, version = require('./package.json').version, { cloneDeep, debounce } = require('lodash'); -const WATCH_DIRECTORIES = ['marketplace_builder','modules']; -const getWatchDirectories = () => WATCH_DIRECTORIES.filter(fs.existsSync); const ext = filePath => filePath.split('.').pop(); const filename = filePath => filePath.split(path.sep).pop(); -const filePathUnixified = filePath => filePath.replace(/\\/g, '/').replace('marketplace_builder/', ''); +const filePathUnixified = filePath => + filePath + .replace(/\\/g, '/') + .replace(new RegExp(`^${dir.APP}/`), '') + .replace(new RegExp(`^${dir.LEGACY_APP}/`), ''); let counter = 0; +let siteRoot = null; + const isEmpty = filePath => { let isEmpty; try { @@ -46,14 +51,25 @@ const isEmpty = filePath => { const shouldBeSynced = (filePath) => { return extensionAllowed(filePath) && isNotHidden(filePath) && isNotEmptyYML(filePath) && isNotInNodeModules(filePath); }; -const isAssetsPath = (path) => path.startsWith('marketplace_builder/assets') || path.startsWith('marketplace_builder\\assets'); +const isAssetsPath = (filePath) => { + const normalized = filePath.replace(/\\/g, '/'); + return siteRoot && normalized.startsWith(`${siteRoot}/assets`); +}; let manifestFilesToAdd = []; +const displayPath = (filePath) => { + const normalized = filePath.replace(/\\/g, '/'); + if (siteRoot && normalized.startsWith(`${siteRoot}/`)) { + return normalized.slice(siteRoot.length + 1); + } + return normalized; +}; + const extensionAllowed = filePath => { var allowed = watchFilesExtensions.includes(ext(filePath).toLowerCase()); if (!allowed) { if(filename(filePath)!=='.DS_Store'){ - logger.Warn(`[Sync] Ignored: ${filePath.slice(20)} - File extension is not allowed`, { + logger.Warn(`[Sync] Ignored: ${displayPath(filePath)} - File extension is not allowed`, { exit: false }); } @@ -66,7 +82,7 @@ const isNotHidden = filePath => { if (isHidden) { if(filename(filePath)!=='.DS_Store'){ - logger.Warn(`[Sync] Ignored: ${filePath.slice(20)} - Hidden file`); + logger.Warn(`[Sync] Ignored: ${displayPath(filePath)} - Hidden file`); } } return !isHidden; @@ -74,7 +90,7 @@ const isNotHidden = filePath => { const isNotEmptyYML = filePath => { if (ext(filePath) === 'yml' && isEmpty(filePath)) { - logger.Warn(`[Sync] Ignored: ${filePath.slice(20)} - Empty YML file`); + logger.Warn(`[Sync] Ignored: ${displayPath(filePath)} - Empty YML file`); return false; } @@ -174,14 +190,19 @@ const pushFile = (gateway, syncedFilePath) => { }); }; +const isModule19CustomCss = (syncedFilePath) => { + const normalized = syncedFilePath.replace(/\\/g, '/'); + const legacyCustom = + normalized === `${dir.LEGACY_APP}/assets/css/modules/module_19/_custom-variables.scss` || + normalized === `${dir.LEGACY_APP}/assets/css/modules/module_19/_custom.scss`; + const appCustom = + normalized === `${dir.APP}/assets/css/modules/module_19/_custom-variables.scss` || + normalized === `${dir.APP}/assets/css/modules/module_19/_custom.scss`; + return legacyCustom || appCustom; +}; + const pushFileDirectAssets = (gateway, syncedFilePath) => { - if ( - (isAssetsPath(syncedFilePath))&& - ( - (syncedFilePath!=='marketplace_builder/assets/css/modules/module_19/_custom-variables.scss')&& - (syncedFilePath!=='marketplace_builder/assets/css/modules/module_19/_custom.scss') - ) - ){ + if (isAssetsPath(syncedFilePath) && !isModule19CustomCss(syncedFilePath)) { syncedFilePath = syncedFilePath.replace(/\\/g, '/'); sendAsset(gateway, syncedFilePath); return Promise.resolve(true); @@ -206,16 +227,17 @@ const manifestAddAsset = (path) => manifestFilesToAdd.push(path); const sendAsset = async (gateway, filePath) => { try { const data = cloneDeep(directUploadData); - const fileSubdir = filePath.startsWith('marketplace_builder/assets') - ? path.dirname(filePath).replace('marketplace_builder/assets','') - : '/' + path.dirname(filePath).replace('/public/assets', ''); + const normalized = filePath.replace(/\\/g, '/'); + const fileSubdir = normalized.startsWith(`${siteRoot}/assets`) + ? path.dirname(normalized).replace(`${siteRoot}/assets`, '') + : '/' + path.dirname(normalized).replace('/public/assets', ''); const key = data.fields.key.replace('assets/${filename}', `assets${fileSubdir}/\${filename}`); data.fields.key = key; logger.Debug(data); await uploadFileFormData(filePath, data); manifestAddAsset(filePath); manifestSend(gateway); - logger.Success(`[Sync] Uploaded: ${filePath.slice(20)}`); + logger.Success(`[Sync] Uploaded: ${displayPath(filePath)}`); counter = 0; } catch (e) { logger.Debug(e); @@ -229,7 +251,7 @@ const sendAsset = async (gateway, filePath) => { sendAsset(gateway,filePath); }) }else{ - logger.Error(`[Sync] Error: ${filePath.slice(20)} - Failed to sync`); + logger.Error(`[Sync] Error: ${displayPath(filePath)} - Failed to sync`); } } }; @@ -254,14 +276,25 @@ checkParams(program); const gateway = new Gateway(program.opts()); gateway.ping().then(async () => { - await fetchDirectUploadData(gateway); - const directories = getWatchDirectories(); + siteRoot = assertExclusiveSiteAppRoot(); + const watchDirectories = []; + if (siteRoot) { + watchDirectories.push(siteRoot); + } + if (fs.existsSync(dir.MODULES)) { + watchDirectories.push(dir.MODULES); + } - if (directories.length === 0) { - logger.Error('marketplace_builder has to exist! Please make sure you have the correct folder structure.'); + if (watchDirectories.length === 0) { + logger.Error( + `${dir.APP}/ or ${dir.LEGACY_APP}/ has to exist! Please make sure you have the correct folder structure.` + ); } + await fetchDirectUploadData(gateway); + logger.Info(`Enabled sync to: ${program.opts().url}`); + logger.Info(`[Sync] Watching: ${watchDirectories.join(', ')}`); let liveReloadServer; if (program.opts().livereload) { @@ -270,17 +303,20 @@ gateway.ping().then(async () => { delay: 2000 }); - let liveReloadDirectories = []; - liveReloadDirectories.push(process.cwd(), 'marketplace_builder'); - liveReloadDirectories.push(process.cwd(), 'app'); - liveReloadDirectories.push(process.cwd(), 'modules'); + let liveReloadDirectories = [process.cwd()]; + if (siteRoot) { + liveReloadDirectories.push(siteRoot); + } + if (fs.existsSync(dir.MODULES)) { + liveReloadDirectories.push(dir.MODULES); + } liveReloadServer.watch(liveReloadDirectories); logger.Info('LiveReload Enabled'); } - chokidar.watch(directories, { + chokidar.watch(watchDirectories, { awaitWriteFinish: { stabilityThreshold: 100, pollInterval: 25 @@ -291,4 +327,4 @@ gateway.ping().then(async () => { .on('add', fp => shouldBeSynced(fp) && enqueue(fp)) .on('unlink', fp => shouldBeSynced(fp) && enqueueDelete(fp)); -}); \ No newline at end of file +}); From 1709bf66fc23d989303b25beab2debc64d45be64 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Thu, 6 Aug 2026 10:04:20 +0100 Subject: [PATCH 10/34] Adding gui interface. --- .gitignore | 4 +- gui/next/.gitignore | 13 + gui/next/README.md | 127 ++ gui/next/UPSTREAM.md | 15 + gui/next/build/_app/env.js | 1 + .../_app/immutable/assets/0.QmKtTD0U.css | 1 + .../_app/immutable/assets/10.PIDpwlWF.css | 1 + .../_app/immutable/assets/12.EFLSpW2v.css | 1 + .../_app/immutable/assets/13.NkhcTUJj.css | 1 + .../_app/immutable/assets/15.BIXMQND7.css | 1 + .../_app/immutable/assets/2.Cpa7KQFv.css | 1 + .../_app/immutable/assets/4.B9XykGLe.css | 1 + .../_app/immutable/assets/6.CufhmNsu.css | 1 + .../_app/immutable/assets/7.CDkZYgtF.css | 1 + .../_app/immutable/assets/9.O9jYhcLF.css | 1 + .../_app/immutable/assets/Aside.HqXgbmTR.css | 1 + .../assets/CautionBanner.C54xYRep.css | 1 + .../immutable/assets/JSONTree.Do8jmj2M.css | 1 + .../_app/immutable/assets/Number.AfD80Zdm.css | 1 + .../_app/immutable/assets/Toggle.o--CU0Za.css | 1 + .../build/_app/immutable/chunks/BD1m7lx9.js | 1 + .../build/_app/immutable/chunks/BNCRiqmJ.js | 1 + .../build/_app/immutable/chunks/BVVGnpm8.js | 2 + .../build/_app/immutable/chunks/BVq9mvWR.js | 2 + .../build/_app/immutable/chunks/Bg88RIi0.js | 1 + .../build/_app/immutable/chunks/Bh3MJlbi.js | 4 + .../build/_app/immutable/chunks/BkeFH9yg.js | 1 + .../build/_app/immutable/chunks/C5zjxmar.js | 1 + .../build/_app/immutable/chunks/CIy9Z9Qf.js | 54 + .../build/_app/immutable/chunks/CNoDK8-a.js | 57 + .../build/_app/immutable/chunks/CS29TWE_.js | 1 + .../build/_app/immutable/chunks/Cpu2L2kn.js | 1 + .../build/_app/immutable/chunks/D-yR0E5w.js | 1 + .../build/_app/immutable/chunks/DGc7Lmco.js | 1 + .../build/_app/immutable/chunks/DntFPtNo.js | 1 + .../build/_app/immutable/chunks/RFIyOgWr.js | 1 + .../build/_app/immutable/chunks/Ul9VwQ7n.js | 1 + .../build/_app/immutable/chunks/bH_aOImW.js | 1 + .../build/_app/immutable/chunks/odGh2V91.js | 1 + .../build/_app/immutable/chunks/t7b_BBSP.js | 21 + .../build/_app/immutable/chunks/x4PJc0Qf.js | 1 + .../_app/immutable/entry/app.DmHCXHOx.js | 2 + .../_app/immutable/entry/start.D4qHf1BM.js | 1 + .../build/_app/immutable/nodes/0.zwm5ZMAN.js | 1 + .../build/_app/immutable/nodes/1.B0n1BD_0.js | 1 + .../build/_app/immutable/nodes/10.CpYcdA_2.js | 26 + .../build/_app/immutable/nodes/11.C73io08e.js | 1 + .../build/_app/immutable/nodes/12.q7a9ldLT.js | 72 + .../build/_app/immutable/nodes/13.D8FJ5ozT.js | 1 + .../build/_app/immutable/nodes/14.D7NRbAwv.js | 1 + .../build/_app/immutable/nodes/15.WKQetCTJ.js | 1 + .../build/_app/immutable/nodes/2.C3vbTXim.js | 7 + .../build/_app/immutable/nodes/3.Bz4QTVmH.js | 1 + .../build/_app/immutable/nodes/4.Cy2tpkZR.js | 1 + .../build/_app/immutable/nodes/5.Bz4QTVmH.js | 1 + .../build/_app/immutable/nodes/6.BTcDvYil.js | 7 + .../build/_app/immutable/nodes/7.D_-4meMh.js | 5 + .../build/_app/immutable/nodes/8.DxJ3_9M1.js | 1 + .../build/_app/immutable/nodes/9.DQ8eZK33.js | 1 + gui/next/build/_app/version.json | 1 + gui/next/build/favicon.png | Bin 0 -> 1548 bytes gui/next/build/index.html | 35 + gui/next/build/prism.js | 254 +++ gui/next/package-lock.json | 1587 +++++++++++++++++ gui/next/package.json | 25 + gui/next/playwright.config.js | 78 + gui/next/pnpm-lock.yaml | 960 ++++++++++ gui/next/src/app.html | 12 + gui/next/src/lib/api/backgroundJob.js | 125 ++ gui/next/src/lib/api/constant.js | 68 + gui/next/src/lib/api/graphql.js | 38 + gui/next/src/lib/api/logs.js | 47 + gui/next/src/lib/api/record.js | 286 +++ gui/next/src/lib/api/table.js | 50 + gui/next/src/lib/api/user.js | 150 ++ gui/next/src/lib/backgroundJob/Delete.svelte | 61 + gui/next/src/lib/backgroundJob/Retry.svelte | 45 + gui/next/src/lib/database/ContextMenu.svelte | 99 + gui/next/src/lib/database/Create.svelte | 338 ++++ gui/next/src/lib/database/Delete.svelte | 66 + gui/next/src/lib/database/Filters.svelte | 163 ++ gui/next/src/lib/database/Restore.svelte | 51 + gui/next/src/lib/database/Sort.svelte | 110 ++ gui/next/src/lib/database/Table.svelte | 241 +++ gui/next/src/lib/database/Tables.svelte | 277 +++ gui/next/src/lib/diagnostics.js | 33 + .../lib/helpers/buildMutationIngredients.js | 114 ++ gui/next/src/lib/helpers/clickOutside.js | 29 + gui/next/src/lib/helpers/httpStatusCodes.js | 79 + gui/next/src/lib/parseValue.js | 51 + gui/next/src/lib/relativeTime.js | 33 + gui/next/src/lib/state.js | 203 +++ gui/next/src/lib/tryParseJSON.js | 32 + gui/next/src/lib/ui/Aside.svelte | 220 +++ gui/next/src/lib/ui/CautionBanner.svelte | 33 + gui/next/src/lib/ui/Code.svelte | 50 + .../src/lib/ui/ConnectionIndicator.svelte | 93 + gui/next/src/lib/ui/Copy.svelte | 99 + gui/next/src/lib/ui/Diagnostic.svelte | 198 ++ gui/next/src/lib/ui/Header.svelte | 317 ++++ gui/next/src/lib/ui/Icon.svelte | 67 + gui/next/src/lib/ui/JSONTree.svelte | 77 + gui/next/src/lib/ui/Notifications.svelte | 135 ++ gui/next/src/lib/ui/forms/Number.svelte | 167 ++ gui/next/src/lib/ui/forms/Toggle.svelte | 211 +++ gui/next/src/lib/users/ContextMenu.svelte | 82 + gui/next/src/lib/users/Create.svelte | 354 ++++ gui/next/src/lib/users/Delete.svelte | 59 + gui/next/src/routes/+layout.svelte | 24 + gui/next/src/routes/+page.svelte | 502 ++++++ .../src/routes/backgroundJobs/+layout.svelte | 373 ++++ .../src/routes/backgroundJobs/+page.svelte | 0 .../backgroundJobs/[type]/[id]/+page.svelte | 164 ++ gui/next/src/routes/constants/+layout.svelte | 1 + gui/next/src/routes/constants/+page.svelte | 385 ++++ gui/next/src/routes/database/+layout.svelte | 70 + gui/next/src/routes/database/+page.svelte | 15 + .../routes/database/table/[id]/+page.svelte | 245 +++ gui/next/src/routes/logs/+layout.svelte | 1 + gui/next/src/routes/logs/+page.svelte | 434 +++++ gui/next/src/routes/users/+layout.svelte | 441 +++++ gui/next/src/routes/users/+page.svelte | 15 + gui/next/src/routes/users/[id]/+page.svelte | 129 ++ gui/next/src/style/button.css | 146 ++ gui/next/src/style/code.css | 4 + gui/next/src/style/config.css | 196 ++ gui/next/src/style/forms.css | 68 + gui/next/src/style/general.css | 103 ++ gui/next/src/style/reset.css | 75 + gui/next/static/favicon.png | Bin 0 -> 1548 bytes gui/next/static/prism.js | 254 +++ gui/next/svelte.config.js | 12 + gui/next/vite.config.js | 6 + package.json | 3 +- siteglide-cli-gui.js | 12 +- siteglide-cli-server.js | 56 +- siteglide-cli.js | 2 +- 137 files changed, 12076 insertions(+), 24 deletions(-) create mode 100644 gui/next/.gitignore create mode 100644 gui/next/README.md create mode 100644 gui/next/UPSTREAM.md create mode 100644 gui/next/build/_app/env.js create mode 100644 gui/next/build/_app/immutable/assets/0.QmKtTD0U.css create mode 100644 gui/next/build/_app/immutable/assets/10.PIDpwlWF.css create mode 100644 gui/next/build/_app/immutable/assets/12.EFLSpW2v.css create mode 100644 gui/next/build/_app/immutable/assets/13.NkhcTUJj.css create mode 100644 gui/next/build/_app/immutable/assets/15.BIXMQND7.css create mode 100644 gui/next/build/_app/immutable/assets/2.Cpa7KQFv.css create mode 100644 gui/next/build/_app/immutable/assets/4.B9XykGLe.css create mode 100644 gui/next/build/_app/immutable/assets/6.CufhmNsu.css create mode 100644 gui/next/build/_app/immutable/assets/7.CDkZYgtF.css create mode 100644 gui/next/build/_app/immutable/assets/9.O9jYhcLF.css create mode 100644 gui/next/build/_app/immutable/assets/Aside.HqXgbmTR.css create mode 100644 gui/next/build/_app/immutable/assets/CautionBanner.C54xYRep.css create mode 100644 gui/next/build/_app/immutable/assets/JSONTree.Do8jmj2M.css create mode 100644 gui/next/build/_app/immutable/assets/Number.AfD80Zdm.css create mode 100644 gui/next/build/_app/immutable/assets/Toggle.o--CU0Za.css create mode 100644 gui/next/build/_app/immutable/chunks/BD1m7lx9.js create mode 100644 gui/next/build/_app/immutable/chunks/BNCRiqmJ.js create mode 100644 gui/next/build/_app/immutable/chunks/BVVGnpm8.js create mode 100644 gui/next/build/_app/immutable/chunks/BVq9mvWR.js create mode 100644 gui/next/build/_app/immutable/chunks/Bg88RIi0.js create mode 100644 gui/next/build/_app/immutable/chunks/Bh3MJlbi.js create mode 100644 gui/next/build/_app/immutable/chunks/BkeFH9yg.js create mode 100644 gui/next/build/_app/immutable/chunks/C5zjxmar.js create mode 100644 gui/next/build/_app/immutable/chunks/CIy9Z9Qf.js create mode 100644 gui/next/build/_app/immutable/chunks/CNoDK8-a.js create mode 100644 gui/next/build/_app/immutable/chunks/CS29TWE_.js create mode 100644 gui/next/build/_app/immutable/chunks/Cpu2L2kn.js create mode 100644 gui/next/build/_app/immutable/chunks/D-yR0E5w.js create mode 100644 gui/next/build/_app/immutable/chunks/DGc7Lmco.js create mode 100644 gui/next/build/_app/immutable/chunks/DntFPtNo.js create mode 100644 gui/next/build/_app/immutable/chunks/RFIyOgWr.js create mode 100644 gui/next/build/_app/immutable/chunks/Ul9VwQ7n.js create mode 100644 gui/next/build/_app/immutable/chunks/bH_aOImW.js create mode 100644 gui/next/build/_app/immutable/chunks/odGh2V91.js create mode 100644 gui/next/build/_app/immutable/chunks/t7b_BBSP.js create mode 100644 gui/next/build/_app/immutable/chunks/x4PJc0Qf.js create mode 100644 gui/next/build/_app/immutable/entry/app.DmHCXHOx.js create mode 100644 gui/next/build/_app/immutable/entry/start.D4qHf1BM.js create mode 100644 gui/next/build/_app/immutable/nodes/0.zwm5ZMAN.js create mode 100644 gui/next/build/_app/immutable/nodes/1.B0n1BD_0.js create mode 100644 gui/next/build/_app/immutable/nodes/10.CpYcdA_2.js create mode 100644 gui/next/build/_app/immutable/nodes/11.C73io08e.js create mode 100644 gui/next/build/_app/immutable/nodes/12.q7a9ldLT.js create mode 100644 gui/next/build/_app/immutable/nodes/13.D8FJ5ozT.js create mode 100644 gui/next/build/_app/immutable/nodes/14.D7NRbAwv.js create mode 100644 gui/next/build/_app/immutable/nodes/15.WKQetCTJ.js create mode 100644 gui/next/build/_app/immutable/nodes/2.C3vbTXim.js create mode 100644 gui/next/build/_app/immutable/nodes/3.Bz4QTVmH.js create mode 100644 gui/next/build/_app/immutable/nodes/4.Cy2tpkZR.js create mode 100644 gui/next/build/_app/immutable/nodes/5.Bz4QTVmH.js create mode 100644 gui/next/build/_app/immutable/nodes/6.BTcDvYil.js create mode 100644 gui/next/build/_app/immutable/nodes/7.D_-4meMh.js create mode 100644 gui/next/build/_app/immutable/nodes/8.DxJ3_9M1.js create mode 100644 gui/next/build/_app/immutable/nodes/9.DQ8eZK33.js create mode 100644 gui/next/build/_app/version.json create mode 100644 gui/next/build/favicon.png create mode 100644 gui/next/build/index.html create mode 100644 gui/next/build/prism.js create mode 100644 gui/next/package-lock.json create mode 100644 gui/next/package.json create mode 100644 gui/next/playwright.config.js create mode 100644 gui/next/pnpm-lock.yaml create mode 100644 gui/next/src/app.html create mode 100644 gui/next/src/lib/api/backgroundJob.js create mode 100644 gui/next/src/lib/api/constant.js create mode 100644 gui/next/src/lib/api/graphql.js create mode 100644 gui/next/src/lib/api/logs.js create mode 100644 gui/next/src/lib/api/record.js create mode 100644 gui/next/src/lib/api/table.js create mode 100644 gui/next/src/lib/api/user.js create mode 100644 gui/next/src/lib/backgroundJob/Delete.svelte create mode 100644 gui/next/src/lib/backgroundJob/Retry.svelte create mode 100644 gui/next/src/lib/database/ContextMenu.svelte create mode 100644 gui/next/src/lib/database/Create.svelte create mode 100644 gui/next/src/lib/database/Delete.svelte create mode 100644 gui/next/src/lib/database/Filters.svelte create mode 100644 gui/next/src/lib/database/Restore.svelte create mode 100644 gui/next/src/lib/database/Sort.svelte create mode 100644 gui/next/src/lib/database/Table.svelte create mode 100644 gui/next/src/lib/database/Tables.svelte create mode 100644 gui/next/src/lib/diagnostics.js create mode 100644 gui/next/src/lib/helpers/buildMutationIngredients.js create mode 100644 gui/next/src/lib/helpers/clickOutside.js create mode 100644 gui/next/src/lib/helpers/httpStatusCodes.js create mode 100644 gui/next/src/lib/parseValue.js create mode 100644 gui/next/src/lib/relativeTime.js create mode 100644 gui/next/src/lib/state.js create mode 100644 gui/next/src/lib/tryParseJSON.js create mode 100644 gui/next/src/lib/ui/Aside.svelte create mode 100644 gui/next/src/lib/ui/CautionBanner.svelte create mode 100644 gui/next/src/lib/ui/Code.svelte create mode 100644 gui/next/src/lib/ui/ConnectionIndicator.svelte create mode 100644 gui/next/src/lib/ui/Copy.svelte create mode 100644 gui/next/src/lib/ui/Diagnostic.svelte create mode 100644 gui/next/src/lib/ui/Header.svelte create mode 100644 gui/next/src/lib/ui/Icon.svelte create mode 100644 gui/next/src/lib/ui/JSONTree.svelte create mode 100644 gui/next/src/lib/ui/Notifications.svelte create mode 100644 gui/next/src/lib/ui/forms/Number.svelte create mode 100644 gui/next/src/lib/ui/forms/Toggle.svelte create mode 100644 gui/next/src/lib/users/ContextMenu.svelte create mode 100644 gui/next/src/lib/users/Create.svelte create mode 100644 gui/next/src/lib/users/Delete.svelte create mode 100644 gui/next/src/routes/+layout.svelte create mode 100644 gui/next/src/routes/+page.svelte create mode 100644 gui/next/src/routes/backgroundJobs/+layout.svelte create mode 100644 gui/next/src/routes/backgroundJobs/+page.svelte create mode 100644 gui/next/src/routes/backgroundJobs/[type]/[id]/+page.svelte create mode 100644 gui/next/src/routes/constants/+layout.svelte create mode 100644 gui/next/src/routes/constants/+page.svelte create mode 100644 gui/next/src/routes/database/+layout.svelte create mode 100644 gui/next/src/routes/database/+page.svelte create mode 100644 gui/next/src/routes/database/table/[id]/+page.svelte create mode 100644 gui/next/src/routes/logs/+layout.svelte create mode 100644 gui/next/src/routes/logs/+page.svelte create mode 100644 gui/next/src/routes/users/+layout.svelte create mode 100644 gui/next/src/routes/users/+page.svelte create mode 100644 gui/next/src/routes/users/[id]/+page.svelte create mode 100644 gui/next/src/style/button.css create mode 100644 gui/next/src/style/code.css create mode 100644 gui/next/src/style/config.css create mode 100644 gui/next/src/style/forms.css create mode 100644 gui/next/src/style/general.css create mode 100644 gui/next/src/style/reset.css create mode 100644 gui/next/static/favicon.png create mode 100644 gui/next/static/prism.js create mode 100644 gui/next/svelte.config.js create mode 100644 gui/next/vite.config.js diff --git a/.gitignore b/.gitignore index 25cfa93..e23c6c2 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,6 @@ exported.json /tmp data-imported.json /test_zip -.vscode \ No newline at end of file +.vscode +gui/next/.svelte-kit +gui/next/node_modules diff --git a/gui/next/.gitignore b/gui/next/.gitignore new file mode 100644 index 0000000..2435e99 --- /dev/null +++ b/gui/next/.gitignore @@ -0,0 +1,13 @@ +.DS_Store +node_modules +/.svelte-kit +/package +.env +.env.* +!.env.example +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +/test-results/ +/playwright-report/ +/playwright/.cache/ +/playwright/pos-cli-gui-qa/ diff --git a/gui/next/README.md b/gui/next/README.md new file mode 100644 index 0000000..853ba9c --- /dev/null +++ b/gui/next/README.md @@ -0,0 +1,127 @@ +pos-cli gui is an interface built to manage your platformOS instance and related data. + +## Tech stack +- [SvelteKit](https://kit.svelte.dev) as front-end framework +- [Vite](https://vitejs.dev) as a development environment +- [Playwright](https://playwright.dev) for end-to-end testing + +## Development +Prerequisites: [GIT](https://git-scm.com), [Node.js](https://nodejs.org/en), [pos-cli](https://github.com/mdyd-dev/pos-cli) installed and a [platformOS instance](https://documentation.platformos.com/get-started) configured. + +1. Clone the whole pos-cli repository to an empty folder: + + ```bash + git clone https://github.com/mdyd-dev/pos-cli.git + ``` +2. Navigate to the `gui/next` subfolder: + ```bash + cd gui/next + ``` +3. Install the dependencies: + ```bash + npm install + ``` + +### Run the development server +To run the dev server you just need to run the following command from `gui/next` directory +```bash +npm run dev +``` + +By default, it runs the server at [http://localhost:5173](http://localhost:5173) and you should be able to view the GUI under this URL. You need to leave the server running in the terminal. + +To test things out though, you would like to **connect to an instance** to have some test data appearing in the GUI. + +In a new terminal window, run `pos-cli gui serve [instance alias]` from the [authenticated directory](https://documentation.platformos.com/get-started/working-with-the-code-and-files/) where you have your test instance code. The same as you would normally use to run the GUI on daily development. + +### Make your changes +You can edit the source code at `gui/next` and while the development server is running, it will refresh the changes in the browser automatically. + +### Build the final code +Before publishing or testing the changes you will have to build the final package. + +To do that run the following in `gui/next` directory: + +```bash +npm run build +``` + +### Update and run the tests +When making changes and developing new functions, please make sure you will modify or add automated test scenarios placed in the `playwright` directory. + +The one rule to follow here is that each test scenario should be completely independent. You cannot rely on the previous tests to prepare any data as each test can be ran in parallel in a random order. The initial data is seeded using the public repository: https://github.com/Platform-OS/pos-cli-gui-qa + +#### Manually run tests + +To manually run the tests, you would require a test instance that has the testing code deployed and test data seeded. + +1. If not done previously, [install Playwright browsers](https://playwright.dev/docs/browsers) + ```bash + npx playwright install --with-deps + ``` +2. Clone the test repository to an empty folder: + ```bash + git clone https://github.com/Platform-OS/pos-cli-gui-qa.git + ``` +3. [Authenticate the directory](https://documentation.platformos.com/get-started/working-with-the-code-and-files/#authenticate-your-environment) to work with platformOS +4. Navigate to that directory and run the following to deploy the code: + ```bash + pos-cli deploy + ``` +5. If the instance data was previously modified, you would have to clean the data to start fresh + ```bash + pos-cli data clean + ``` +6. Seed the test data to the instance + ```bash + pos-cli data import --path seed/data.zip --zip + ``` +7. Build the production-ready code + ```bash + npm run build + ``` +8. Run the preview server + ```bash + npm run preview + ``` + +Finally, to run Playwright with an interface use the following command from `gui/next` directory: + +```bash +npx playwright test --ui +``` + +This will run the Playwright interface, where you can run previously available test scenarios and see your changes when modifying the `.spec.js` test files. + + +#### Use a script to run tests + +There is a Bash script prepared to run all the steps needed for automated testing. To use the script just run the following command from the `/gui/next` directory: + +```bash +sh sh playwright/run.sh +``` + +Keep in mind that, by default, it uses an shared instance so if more than one person is running the tests, it might fail. You can change the instance it uses by editing the script. + +The output would be a HTML report showing the tests results. + + +### Publish new version +When you are ready to publish the new GUI version: + +1. Merge from `master` to make sure that you have the latest changes to the rest of the code +2. Increase the `pos-cli` version number by running the following from **the parent directory**: + ```bash + npm version + ``` +3. Describe your changes in `CHANGELOG.md` +4. Commit and push your branch to GitHub, pass the review and merge to `master`. +5. Switch to `master` branch + ```bash + git checkout master + ``` +6. Publish the new package to npm (requires you having the permissions): + ```bash + npm publish + ``` diff --git a/gui/next/UPSTREAM.md b/gui/next/UPSTREAM.md new file mode 100644 index 0000000..ef02e67 --- /dev/null +++ b/gui/next/UPSTREAM.md @@ -0,0 +1,15 @@ +# gui/next upstream + +Vendored from `pos-cli` commit `b6c2948` (release 6.3.0). + +Siteglide deltas vs upstream: + +- Logs v1 poll interval: 7500ms (match `siteglide-cli logs`) +- Removed Logs v2 / Network routes and homepage tiles (discontinued upstream offering) +- Homepage and header include Database and Users; those views show a Siteglide Admin compatibility caution banner +- Branding: Siteglide titles, docs, portal, npm update check (`@siteglide/siteglide-cli`) + +Smoke (global test install): + +- Logs: pass +- Constants: pass diff --git a/gui/next/build/_app/env.js b/gui/next/build/_app/env.js new file mode 100644 index 0000000..f5427da --- /dev/null +++ b/gui/next/build/_app/env.js @@ -0,0 +1 @@ +export const env={} \ No newline at end of file diff --git a/gui/next/build/_app/immutable/assets/0.QmKtTD0U.css b/gui/next/build/_app/immutable/assets/0.QmKtTD0U.css new file mode 100644 index 0000000..d55538a --- /dev/null +++ b/gui/next/build/_app/immutable/assets/0.QmKtTD0U.css @@ -0,0 +1 @@ +*:where(:not(html,iframe,canvas,img,svg,video,audio):not(svg *,symbol *)){all:unset;display:revert}*,*:before,*:after{box-sizing:border-box}a,button{cursor:revert}ol,ul,menu{list-style:none}img{max-width:100%}table{border-collapse:collapse}input,textarea{-webkit-user-select:auto}input[type=radio]{all:revert}textarea{white-space:revert}meter{-webkit-appearance:revert;-moz-appearance:revert;appearance:revert}::placeholder{color:unset}:where([hidden]){display:none}:where([contenteditable]:not([contenteditable=false])){-moz-user-modify:read-write;-webkit-user-modify:read-write;overflow-wrap:break-word;-webkit-line-break:after-white-space;-webkit-user-select:auto}:where([draggable=true]){-webkit-user-drag:element}html{font-family:sans-serif}:root,::backdrop{--color-light-rgb-text: 74, 74, 74;--color-light-rgb-text-secondary: 146, 146, 146;--color-light-rgb-text-inverted: 255, 255, 255;--color-light-rgb-interaction: 25, 79, 144;--color-light-rgb-interaction-hover: 58, 141, 222;--color-light-rgb-interaction-active: 50, 130, 210;--color-light-rgb-frame: 221, 221, 221;--color-light-rgb-page: 255, 255, 255;--color-light-rgb-background: 245, 246, 252;--color-light-rgb-middleground: 235, 236, 242;--color-light-rgb-context: 53, 55, 57;--color-light-rgb-confirmation: 30, 142, 73;--color-light-rgb-danger: 199, 46, 46;--color-light-rgb-highlight: 250, 240, 211;--color-light-context-input-background: 87, 90, 92;--color-light-context-button-background: 28, 29, 30;--color-light-context-button-background-hover: 36, 42, 49;--color-light-context-button-text: 255, 255, 255;--color-dark-rgb-text: 208, 212, 218;--color-dark-rgb-text-secondary: 114, 148, 152;--colot-light-rgb-text-inverted: 0, 0, 0;--color-dark-rgb-interaction: 100, 180, 200;--color-dark-rgb-interaction-hover: 130, 210, 230;--color-dark-rgb-interaction-active: 115, 195, 215;--color-dark-rgb-frame: 47, 61, 76;--color-dark-rgb-page: 29, 40, 51;--color-dark-rgb-background: 19, 32, 45;--color-dark-rgb-middleground: 15, 25, 35;--color-dark-rgb-context: 21, 29, 38;--color-dark-rgb-confirmation: 30, 142, 73;--color-dark-rgb-danger: 221, 89, 89;--color-dark-rgb-highlight: 106, 62, 10;--color-dark-context-input-background: 87, 90, 92;--color-dark-context-button-background: 41, 48, 57;--color-dark-context-button-background-hover: 61, 68, 78;--color-dark-context-button-text: 255, 255, 255}:root,::backdrop{--color-rgb-text: var(--color-light-rgb-text);--color-rgb-text-secondary: var(--color-light-rgb-text-secondary);--color-rgb-text-inverted: var(--color-light-rgb-text-inverted);--color-rgb-interaction: var(--color-light-rgb-interaction);--color-rgb-interaction-hover: var(--color-light-rgb-interaction-hover);--color-rgb-interaction-active: var(--color-light-rgb-interaction-active);--color-rgb-frame: var(--color-light-rgb-frame);--color-rgb-page: var(--color-light-rgb-page);--color-rgb-background: var(--color-light-rgb-background);--color-rgb-middleground: var(--color-light-rgb-middleground);--color-rgb-context: var(--color-light-rgb-context);--color-rgb-confirmation: var(--color-light-rgb-confirmation);--color-rgb-danger: var(--color-light-rgb-danger);--color-rgb-highlight: var(--color-light-rgb-highlight);--color-rgb-context-input-background: var(--color-light-context-input-background);--color-rgb-context-button-background: var(--color-light-context-button-background);--color-rgb-context-button-background-hover: var(--color-light-context-button-background-hover);--color-rgb-context-button-text: var(--color-light-context-button-text)}@media (prefers-color-scheme: dark){:root,::backdrop{--color-rgb-text: var(--color-dark-rgb-text);--color-rgb-text-secondary: var(--color-dark-rgb-text-secondary);--color-rgb-text-inverted: var(--color-dark-rgb-text-inverted);--color-rgb-interaction: var(--color-dark-rgb-interaction);--color-rgb-interaction-hover: var(--color-dark-rgb-interaction-hover);--color-rgb-interaction-active: var(--color-dark-rgb-interaction-active);--color-rgb-frame: var(--color-dark-rgb-frame);--color-rgb-page: var(--color-dark-rgb-page);--color-rgb-background: var(--color-dark-rgb-background);--color-rgb-middleground: var(--color-dark-rgb-middleground);--color-rgb-context: var(--color-dark-rgb-context);--color-rgb-confirmation: var(--color-dark-rgb-confirmation);--color-rgb-danger: var(--color-dark-rgb-danger);--color-rgb-highlight: var(--color-dark-rgb-highlight);--color-rgb-context-input-background: var(--color-dark-context-input-background);--color-rgb-context-button-background: var(--color-dark-context-button-background);--color-rgb-context-button-background-hover: var(--color-dark-context-button-background-hover);--color-rgb-context-button-text: var(--color-dark-context-button-text)}}:root{--color-text: rgb(var(--color-rgb-text));--color-text-secondary: rgb(var(--color-rgb-text-secondary));--color-text-inverted: rgb(var(--color-rgb-text-inverted));--color-interaction: rgb(var(--color-rgb-interaction));--color-interaction-hover: rgb(var(--color-rgb-interaction-hover));--color-interaction-active: rgb(var(--color-rgb-interaction-active));--color-frame: rgb(var(--color-rgb-frame));--color-page: rgb(var(--color-rgb-page));--color-background: rgb(var(--color-rgb-background));--color-middleground: rgb(var(--color-rgb-middleground));--color-context: rgb(var(--color-rgb-context));--color-confirmation: rgb(var(--color-rgb-confirmation));--color-danger: rgb(var(--color-rgb-danger));--color-highlight: rgb(var(--color-rgb-highlight));--color-context-input-background: rgb(var(--color-rgb-context-input-background));--color-context-button-background: rgb(var(--color-rgb-context-button-background));--color-context-button-background-hover: rgb(var(--color-rgb-context-button-background-hover));--color-context-button-text: rgb(var(--color-rgb-context-button-text))}:root{--space-page: 2rem;--space-navigation: 1rem;--space-table: 1rem}:root{--font-normal: system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"}:root{--easing-rapid: cubic-bezier(.075, .82, .165, 1)}body{height:100vh;display:grid;grid-template-rows:min-content 1fr;background-color:var(--color-page);text-rendering:optimizeLegibility;font-family:var(--font-normal);color:var(--color-text)}.content-context{background-color:var(--color-context);color:var(--color-text-inverted)}a{transition-property:color,background-color;transition-duration:.1s;transition-timing-function:ease-in-out}kbd{padding:.4em .2em;border-radius:.2em;background-color:var(--color-middleground);text-transform:uppercase;line-height:.6em;font-family:monospace}.definitions{display:grid;grid-template-columns:auto auto}.definitions dt,.definitions dd{padding-block:.7rem;display:flex;align-items:center}.definitions dt:not(:last-of-type),.definitions dd:not(:last-of-type){border-block-end:1px solid var(--color-background)}.definitions dt{padding-inline-end:1em;white-space:nowrap;color:var(--color-text-secondary)}.definitions dd{min-width:0;display:flex;justify-content:end;word-wrap:break-word;text-wrap:balance}.definitions dd>*{width:100%;display:block;word-wrap:break-word;text-align:end}.button{padding:.7rem 1rem;display:inline-flex;align-items:center;gap:.6em;border-radius:.5rem;background-color:var(--color-middleground);leading-trim:both;line-height:1em;color:var(--color-text);transition:all .1s linear}button:not(:disabled):not(.disabled){cursor:pointer}.button:not(.disabled):not(:disabled):hover{background-color:rgba(var(--color-rgb-interaction-hover),.2)}.button:focus-visible{box-shadow:0 0 1px 2px var(--color-interaction-hover)}.button.active{background-color:rgba(var(--color-rgb-interaction-hover),.1)}.content-context .button{background-color:var(--color-context-button-background);color:var(--color-context-button-text)}.content-context .button:hover{background-color:var(--color-context-button-background-hover)}.content-context .button:hover svg{color:currentColor}.button svg{width:18px;height:18px;margin-block:-.04rem;pointer-events:none}.button:not(:disabled):hover svg{color:var(--color-interaction)}.button:has(svg){padding-block:.64rem}.button:disabled svg{color:var(--color-text-secondary)}.button .label,button .label{position:absolute;left:-100vw}.combo{display:flex;gap:1px}.combo .button:first-of-type{border-radius:.5rem 0 0 .5rem}.combo .button:last-of-type{border-radius:0 .5rem .5rem 0}.button.compact{padding:.4rem}.button.danger{color:var(--color-danger)}.button.confirmation{background-color:rgba(var(--color-rgb-confirmation),.2);color:var(--color-confirmation)}.button.confirmation:hover{color:var(--color-confirmation)}.button.confirmation:hover svg{color:inherit}input[type=text],input[type=password],input[type=email],input[type=number],input[type=date],select,textarea{padding:.5rem 1rem;border-radius:.5rem;background-color:var(--color-middleground);transition-property:background-color,box-shadow,color;transition-duration:.1s;transition-timing-function:linear}.content-context select,.content-context input{background-color:var(--color-context-input-background)}textarea{padding:1rem}.content-context textarea{background-color:var(--color-context-input-background)}select{padding-inline-end:2.1em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-position:right .7em center;background-size:.7em}input:focus-visible,select:focus-visible,textarea:focus-visible{box-shadow:0 0 1px 2px var(--color-interaction-hover)}input::placeholder,textarea::placeholder{color:var(--color-text-secondary)}.content-context input:disabled,.content-context select:disabled,.content-context textarea:disabled{color:rgba(var(--color-rgb-context-button-text),.6)}input[type=checkbox]{all:revert}header.svelte-uthxgc.svelte-uthxgc.svelte-uthxgc{max-width:100vw;padding-block:var(--space-navigation);position:sticky;top:0;z-index:100;border-bottom:1px solid var(--color-frame);background-color:var(--color-page)}.wrapper.svelte-uthxgc.svelte-uthxgc.svelte-uthxgc{min-width:0;width:100%;padding-inline:var(--space-page);display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:var(--space-navigation) var(--space-page)}.logo.svelte-uthxgc.svelte-uthxgc.svelte-uthxgc{min-width:0;min-height:2.5625rem;display:flex;align-items:center;gap:1rem}.logo.svelte-uthxgc .label.svelte-uthxgc.svelte-uthxgc{position:absolute;left:-100vw}.logo.svelte-uthxgc .sign.svelte-uthxgc.svelte-uthxgc{width:100%;min-width:2rem;max-width:3.125rem;transition:scale .2s var(--easing-rapid)}.logo.svelte-uthxgc .sign.svelte-uthxgc.svelte-uthxgc:hover,.logo.svelte-uthxgc:has(.logotype:hover) .sign.svelte-uthxgc.svelte-uthxgc{scale:1.1}.logo.svelte-uthxgc h1.svelte-uthxgc.svelte-uthxgc{min-width:2rem;display:flex;flex-direction:column}.logo.svelte-uthxgc .logotype.svelte-uthxgc.svelte-uthxgc{width:100%;max-width:120px;fill:var(--color-text);transition:fill .2s var(--easing-rapid)}.logo.svelte-uthxgc .logotype.svelte-uthxgc.svelte-uthxgc:hover,.logo.svelte-uthxgc:has(.sign:hover) .logotype.svelte-uthxgc.svelte-uthxgc{fill:color-mix(in srgb,var(--color-text),var(--color-text-secondary) 40%)}.logo.svelte-uthxgc .instance.svelte-uthxgc.svelte-uthxgc{max-width:260px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.8rem;color:var(--color-text-secondary);transition:font-size .2s ease-in-out}.logo.svelte-uthxgc .instance.offline.svelte-uthxgc.svelte-uthxgc{font-size:0;color:transparent}.logo.svelte-uthxgc .instance.svelte-uthxgc.svelte-uthxgc:hover{color:var(--color-interaction-hover)}ul.svelte-uthxgc.svelte-uthxgc.svelte-uthxgc{display:flex;gap:1rem}li.svelte-uthxgc a.svelte-uthxgc.svelte-uthxgc{padding:.8rem;display:flex;flex-direction:column;gap:.5rem;justify-items:center;align-items:center;position:relative;border-radius:1rem;background-color:var(--color-background);text-transform:uppercase;font-size:.9rem;color:var(--color-text-secondary);transition-property:background-color,border-radius;transition-duration:.1s,.2s;transition-timing-function:linear,cubic-bezier(.175,.885,.32,1.275)}@media (max-width: 525px){li.svelte-uthxgc a.svelte-uthxgc.svelte-uthxgc{padding:.5rem}}li.svelte-uthxgc a.svelte-uthxgc.svelte-uthxgc:hover{border-radius:1.2rem;background-color:var(--color-middleground)}li.svelte-uthxgc a.active.svelte-uthxgc.svelte-uthxgc{background-color:var(--color-middleground);color:var(--color-text)}nav.svelte-uthxgc .label.svelte-uthxgc.svelte-uthxgc{margin-block-start:.4rem;padding:.2rem .5rem;position:absolute;top:105%;right:0;left:auto;bottom:auto;opacity:0;border-radius:.2rem;background-color:var(--color-text);white-space:nowrap;font-weight:500;color:var(--color-page);transition:opacity .1s ease-in-out}nav.svelte-uthxgc .label.svelte-uthxgc.svelte-uthxgc:before{width:10px;height:6px;position:absolute;top:-6px;right:1.25rem;background-color:var(--color-text);clip-path:polygon(50% 0%,100% 100%,0% 100%);content:""}nav.svelte-uthxgc a.svelte-uthxgc:hover .label.svelte-uthxgc{opacity:1}.connectionIndicator.svelte-1cyr69k{display:flex;align-items:center;gap:1em}.connectionIndicator.svelte-1cyr69k:after{width:.8rem;height:.8rem;margin-inline-end:-.5em;display:block;position:relative;top:1px;border-radius:100%;background-color:var(--color-text-inverted);animation:svelte-1cyr69k-blink .7s ease-in-out;animation-iteration-count:infinite;content:""}@keyframes svelte-1cyr69k-blink{0%{opacity:.2}70%{opacity:1}}.container.svelte-fq192n{padding:1rem;display:flex;flex-direction:column;align-items:flex-start;position:fixed;top:100%;translate:0 var(--height);transition:translate .2s cubic-bezier(.175,.885,.32,1.275)}.notification.svelte-fq192n{margin-block-start:.5rem;padding:.7rem 2rem .8rem 1.5rem;display:flex;gap:1em;align-items:center;position:relative;border-radius:1rem;color:var(--color-text-inverted)}.success.svelte-fq192n{background-color:var(--color-confirmation)}.error.svelte-fq192n{background-color:var(--color-danger)}.info.svelte-fq192n{background-color:var(--color-context)}.disabled.svelte-fq192n{display:none}.notification.svelte-fq192n small{margin-block-start:.25em;display:block;font-size:.85em}.notification.svelte-fq192n code{padding-inline:.2em;border-radius:4px;background-color:var(--color-context);font-family:monospace;font-size:1.2em}button.svelte-fq192n{padding:.6em;margin:-.6em -1.5em -.6em 0;cursor:pointer;line-height:0}button.svelte-fq192n:hover{color:var(--color-highlight)} diff --git a/gui/next/build/_app/immutable/assets/10.PIDpwlWF.css b/gui/next/build/_app/immutable/assets/10.PIDpwlWF.css new file mode 100644 index 0000000..cb4cc71 --- /dev/null +++ b/gui/next/build/_app/immutable/assets/10.PIDpwlWF.css @@ -0,0 +1 @@ +nav.svelte-9flr1b.svelte-9flr1b{width:100%;padding:1rem;display:flex;justify-content:space-between;align-items:center;position:sticky;top:82px;z-index:10;border-bottom:1px solid var(--color-frame);background-color:rgba(var(--color-rgb-background),.8);backdrop-filter:blur(17px);-webkit-backdrop-filter:blur(17px)}nav.svelte-9flr1b input.svelte-9flr1b{padding-inline-end:2rem}.clearFilter.svelte-9flr1b.svelte-9flr1b{padding:.5rem;position:relative;left:-2.3rem;cursor:pointer}.clearFilter.svelte-9flr1b .label.svelte-9flr1b{position:absolute;left:-100vw}.clearFilter.svelte-9flr1b.svelte-9flr1b:hover{color:var(--color-interaction)}.create.svelte-9flr1b.svelte-9flr1b{max-width:1150px;margin-inline:auto;margin-block-start:2rem;padding:1rem 3.6rem 1rem 5.2rem;border-radius:1rem;background-color:var(--color-background)}.create.svelte-9flr1b form.svelte-9flr1b{display:grid;grid-template-columns:.7fr 1fr auto;align-items:center;gap:1rem}.create.svelte-9flr1b input[name=name].svelte-9flr1b{font-family:monospace;font-size:1rem;font-weight:600}.create.svelte-9flr1b fieldset.svelte-9flr1b:last-of-type{margin-inline-start:.5em}.create.svelte-9flr1b label.svelte-9flr1b{margin-block-end:.4em;display:block}.create.svelte-9flr1b input.svelte-9flr1b{width:100%}.create.svelte-9flr1b .button.svelte-9flr1b{margin-inline-end:-1.6rem;align-self:end}ul.svelte-9flr1b.svelte-9flr1b{max-width:1100px;margin-inline:auto;margin-block-start:2rem;padding-inline:2rem}li.svelte-9flr1b.svelte-9flr1b{margin-block-end:1rem;display:grid;grid-template-columns:auto 1fr;align-items:center;gap:.2rem}li.hidden.svelte-9flr1b.svelte-9flr1b{display:none}.delete.svelte-9flr1b.svelte-9flr1b{opacity:0;transition:opacity .1s linear}li.svelte-9flr1b:hover .delete.svelte-9flr1b{opacity:1}.delete.svelte-9flr1b button.svelte-9flr1b{padding:.7rem;cursor:pointer;color:var(--color-danger)}.delete.svelte-9flr1b .label.svelte-9flr1b{position:absolute;left:-100vw}.edit.svelte-9flr1b.svelte-9flr1b{display:grid;grid-template-columns:.7fr 1fr auto;align-items:center;gap:1rem}.edit.svelte-9flr1b label.svelte-9flr1b{overflow:hidden;text-overflow:ellipsis;font-family:monospace;font-size:1rem;font-weight:600}@font-face{font-family:password;font-style:normal;font-weight:400;src:url(https://jsbin-user-assets.s3.amazonaws.com/rafaelcastrocouto/password.ttf);font-display:block}.edit.svelte-9flr1b input.svelte-9flr1b{width:100%;padding-inline-end:3rem;font-family:password;line-height:18px;letter-spacing:1px;color:var(--color-text-secondary)}.edit.svelte-9flr1b input.exposed.svelte-9flr1b{font-family:var(--font-normal);letter-spacing:0;color:var(--color-text)}.edit.svelte-9flr1b fieldset.svelte-9flr1b{position:relative}.edit.svelte-9flr1b .toggleExposition.svelte-9flr1b{display:flex;align-items:center;position:absolute;right:.5em;top:0;bottom:0;cursor:pointer;opacity:0;color:var(--color-text-secondary);transition:all .1s linear}.edit.svelte-9flr1b:hover .toggleExposition.svelte-9flr1b{opacity:1}.edit.svelte-9flr1b .toggleExposition.svelte-9flr1b:hover{color:var(--color-interaction)}.edit.svelte-9flr1b .toggleExposition .label.svelte-9flr1b{position:absolute;left:-100vw}.edit.svelte-9flr1b button[type=submit].svelte-9flr1b{opacity:0;transition:opacity .1s linear}.edit.svelte-9flr1b button.needed.svelte-9flr1b{opacity:1}.highlighted.svelte-9flr1b input.svelte-9flr1b{background-color:var(--color-highlight)} diff --git a/gui/next/build/_app/immutable/assets/12.EFLSpW2v.css b/gui/next/build/_app/immutable/assets/12.EFLSpW2v.css new file mode 100644 index 0000000..34b3eb5 --- /dev/null +++ b/gui/next/build/_app/immutable/assets/12.EFLSpW2v.css @@ -0,0 +1 @@ +fieldset.svelte-y4u12o{display:flex;gap:2px;align-items:center}label.svelte-y4u12o{padding-inline-end:.5em}select[name=name].svelte-y4u12o{max-width:20ch;border-start-end-radius:0;border-end-end-radius:0;text-overflow:ellipsis}select[name=operation].svelte-y4u12o{border-radius:0}input[name=value].svelte-y4u12o{width:20ch;border-radius:0}select[name=value].svelte-y4u12o,select[name=minFilter].svelte-y4u12o,select[name=maxFilter].svelte-y4u12o,input[name=minFilterValue].svelte-y4u12o,input[name=maxFilterValue].svelte-y4u12o{border-radius:0}button[type=submit].svelte-y4u12o{border-start-start-radius:0;border-end-start-radius:0}[type=number].svelte-y4u12o{width:10ch}form.svelte-yzlk61.svelte-yzlk61{display:flex;gap:2px;position:relative}select[name=by].svelte-yzlk61.svelte-yzlk61{max-width:14ch;border-start-end-radius:0;border-end-end-radius:0;white-space:nowrap;text-overflow:ellipsis}select[name=order].svelte-yzlk61.svelte-yzlk61{width:50px;position:absolute;inset-inline-end:0;opacity:0;cursor:pointer;z-index:1;overflow:hidden;white-space:nowrap}label.svelte-yzlk61.svelte-yzlk61{position:relative;border-start-start-radius:0;border-end-start-radius:0}select.svelte-yzlk61:hover+label.svelte-yzlk61{background-color:rgba(var(--color-rgb-interaction-hover),.2)}select.svelte-yzlk61:focus-visible+label.svelte-yzlk61{box-shadow:0 0 1px 2px var(--color-interaction-hover)}i.svelte-ooaugn{color:var(--color-danger)}menu.svelte-1tht2a1.svelte-1tht2a1.svelte-1tht2a1{position:absolute;left:0;top:100%;z-index:20;overflow:hidden;border-radius:0 1rem 1rem;white-space:nowrap}menu.svelte-1tht2a1 li.svelte-1tht2a1+li.svelte-1tht2a1{border-block-start:1px solid var(--color-context-input-background)}menu.svelte-1tht2a1 button{width:100%;padding:.5rem 1rem;display:flex;align-items:center;gap:.5em;line-height:0}menu.svelte-1tht2a1 button:hover{background-color:var(--color-context-button-background-hover)}menu.svelte-1tht2a1 li.svelte-1tht2a1:last-child button{padding-block-end:.6rem}table.svelte-1bwwtph.svelte-1bwwtph{min-width:100%}thead.svelte-1bwwtph.svelte-1bwwtph{position:sticky;top:0;z-index:50}th.svelte-1bwwtph.svelte-1bwwtph{background-color:var(--color-background);white-space:nowrap;font-weight:500}.type.svelte-1bwwtph.svelte-1bwwtph{font-weight:400;color:var(--color-text-secondary)}td.svelte-1bwwtph.svelte-1bwwtph,th.svelte-1bwwtph.svelte-1bwwtph{padding:.6rem;vertical-align:top;border:1px solid var(--color-frame);transition:background-color .2s linear}.collapsed.svelte-1bwwtph td.svelte-1bwwtph{max-width:300px;overflow:hidden;vertical-align:middle;white-space:nowrap;text-overflow:ellipsis}td.svelte-1bwwtph.svelte-1bwwtph:first-child,th.svelte-1bwwtph.svelte-1bwwtph:first-child{width:4rem;position:sticky;left:0;z-index:10;border-inline-start:0;box-shadow:inset -4px 0 0 0 var(--color-frame)}td.svelte-1bwwtph.svelte-1bwwtph:first-child{overflow:visible;background-color:var(--color-page)}th.id.svelte-1bwwtph.svelte-1bwwtph{text-align:end}td.svelte-1bwwtph .id.svelte-1bwwtph{position:relative;display:flex;align-items:center;justify-content:space-between;gap:.7em}.date.svelte-1bwwtph span.svelte-1bwwtph{color:var(--color-text-secondary)}.highlighted.svelte-1bwwtph td.svelte-1bwwtph{background-color:var(--color-highlight)}.hasContextMenu.svelte-1bwwtph.svelte-1bwwtph{position:relative;z-index:20}.value-null.svelte-1bwwtph.svelte-1bwwtph{text-transform:uppercase;font-size:.9em;color:var(--color-text-secondary)}.combo.svelte-1bwwtph.svelte-1bwwtph{background-color:transparent;opacity:0;transition:opacity .1s linear}.combo.svelte-1bwwtph .button.svelte-1bwwtph:first-child{padding-inline:.1rem 0}tr.svelte-1bwwtph:hover .combo.svelte-1bwwtph{opacity:.5}tr.svelte-1bwwtph:hover .combo.svelte-1bwwtph:hover{opacity:1}tr.svelte-1bwwtph:hover .combo .button.svelte-1bwwtph:not(.active):hover{background-color:var(--color-background)}.combo.svelte-1bwwtph .button.active.svelte-1bwwtph{background-color:var(--color-context);color:var(--color-text-inverted)}.combo.svelte-1bwwtph .button.active.svelte-1bwwtph:hover svg{color:var(--color-text-inverted)}tr.svelte-1bwwtph:has(.active) .combo.svelte-1bwwtph{opacity:1}tr.svelte-1bwwtph:has(.active) .combo button.svelte-1bwwtph:first-child{border-end-start-radius:0}.delete.svelte-1bwwtph.svelte-1bwwtph{width:50px}dialog.svelte-1udbufw.svelte-1udbufw{height:100vh;overflow:hidden;display:flex;align-items:center;justify-content:center;position:absolute;top:0;right:0;bottom:0;left:0;z-index:100}dialog.svelte-1udbufw.svelte-1udbufw::backdrop{background-color:rgba(var(--color-rgb-background),.6)}.content.svelte-1udbufw.svelte-1udbufw{width:clamp(300px,800px,80vw);max-height:94vh;overflow:auto;border-radius:1rem}form.svelte-1udbufw.svelte-1udbufw{display:flex;flex-direction:column;gap:1rem;padding:2rem}fieldset.svelte-1udbufw.svelte-1udbufw{display:grid;grid-template-columns:1fr 2fr;gap:1rem}fieldset.svelte-1udbufw+fieldset.svelte-1udbufw{margin-block-start:2rem}label.svelte-1udbufw.svelte-1udbufw{word-break:break-all}.type.svelte-1udbufw.svelte-1udbufw{margin-block-start:.2rem;opacity:.5;font-size:.9em}textarea.svelte-1udbufw.svelte-1udbufw,select.svelte-1udbufw.svelte-1udbufw{width:100%;max-height:40rem}[role=alert].svelte-1udbufw.svelte-1udbufw:not(:empty){margin-block-start:.5em;padding:.5em 1em .6em;position:relative;border-radius:1rem;background-color:var(--color-danger)}[role=alert].svelte-1udbufw.svelte-1udbufw:not(:empty):before{width:1em;height:.5em;position:absolute;top:-6px;right:1rem;clip-path:polygon(50% 0%,0% 100%,100% 100%);background-color:var(--color-danger);content:""}.footer.svelte-1udbufw.svelte-1udbufw{padding:1.5rem 0;position:sticky;bottom:0;gap:1rem;background-color:var(--color-context)}.error.svelte-1udbufw li.svelte-1udbufw{margin-block-end:1rem;padding:1rem;border-radius:1rem;background-color:var(--color-danger);color:var(--color-text-inverted)}.actions.svelte-1udbufw.svelte-1udbufw{display:flex;align-items:center;justify-content:space-between}section.svelte-afbo94.svelte-afbo94{height:calc(100vh - 83px);flex-grow:1;display:flex;flex-direction:column;overflow:auto;position:relative}nav.svelte-afbo94.svelte-afbo94{padding:1rem;display:flex;flex-wrap:wrap;gap:1rem;align-items:center;position:sticky;left:0;background-color:var(--color-background)}nav.svelte-afbo94>*:first-child{margin-inline-end:auto}.refreshing.svelte-afbo94.svelte-afbo94,.refreshing.svelte-afbo94.svelte-afbo94:hover{background-color:var(--color-interaction-active);color:var(--color-text-inverted)!important}.refreshing.svelte-afbo94 svg{color:var(--color-text-inverted)!important}.pagination.svelte-afbo94.svelte-afbo94{margin-block-start:auto;display:flex;align-items:center;gap:1rem;position:sticky;bottom:0;left:0;right:0;z-index:30}#viewOptions.svelte-afbo94.svelte-afbo94{margin-inline-start:auto;display:flex;gap:1rem}.combo.svelte-afbo94 input.svelte-afbo94{position:absolute;inset-inline-start:-100vw} diff --git a/gui/next/build/_app/immutable/assets/13.NkhcTUJj.css b/gui/next/build/_app/immutable/assets/13.NkhcTUJj.css new file mode 100644 index 0000000..93f0b89 --- /dev/null +++ b/gui/next/build/_app/immutable/assets/13.NkhcTUJj.css @@ -0,0 +1 @@ +.diagnostic.svelte-u09j0c.svelte-u09j0c{border-inline-start:3px solid var(--color-frame);padding:.25rem 0 .25rem 1rem;display:flex;flex-direction:column;gap:.6rem}.diagnostic.isError.svelte-u09j0c.svelte-u09j0c{border-inline-start-color:var(--color-danger)}.header.svelte-u09j0c.svelte-u09j0c{display:flex;flex-wrap:wrap;align-items:baseline;gap:.5rem 1rem}.type.svelte-u09j0c.svelte-u09j0c{font-family:monospace;font-weight:600}.isError.svelte-u09j0c .type.svelte-u09j0c{color:var(--color-danger)}.location.svelte-u09j0c.svelte-u09j0c{font-family:monospace;font-size:.9em;color:var(--color-text-secondary);word-break:break-all}.message.svelte-u09j0c.svelte-u09j0c{word-break:break-word}.message.pre.svelte-u09j0c.svelte-u09j0c{white-space:pre-wrap}.longStringInfo.svelte-u09j0c button.svelte-u09j0c{cursor:pointer;font-size:.9em;color:var(--color-text-secondary)}.source.svelte-u09j0c.svelte-u09j0c{margin:0;padding:.5rem .75rem;background-color:rgba(var(--color-rgb-background),.5);border:1px solid var(--color-frame);border-radius:4px;font-family:monospace;font-size:.9em;white-space:pre-wrap;word-break:break-all}.meta.svelte-u09j0c.svelte-u09j0c{font-size:.9em;color:var(--color-text-secondary)}.stack.svelte-u09j0c summary.svelte-u09j0c{cursor:pointer;width:fit-content;list-style:none}.stack.svelte-u09j0c summary.svelte-u09j0c::-webkit-details-marker{display:none}.stack.svelte-u09j0c summary.svelte-u09j0c:hover{color:var(--color-interaction-hover)}.stack.svelte-u09j0c ol.svelte-u09j0c{margin:.35rem 0 0;padding-inline-start:.75rem;list-style:none}.stack.svelte-u09j0c li.svelte-u09j0c{list-style:none;font-family:monospace;word-break:break-all}.context.svelte-u09j0c.svelte-u09j0c{display:flex;flex-direction:column;gap:.15rem}.context.svelte-u09j0c a.svelte-u09j0c:hover{color:var(--color-interaction-hover)}.container.svelte-12glt4h.svelte-12glt4h.svelte-12glt4h{height:100%;overflow:hidden;display:grid;grid-template-columns:1fr min-content}nav.svelte-12glt4h.svelte-12glt4h.svelte-12glt4h{padding:1rem;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--color-frame);background-color:rgba(var(--color-rgb-background),.8);backdrop-filter:blur(17px);-webkit-backdrop-filter:blur(17px)}nav.svelte-12glt4h>div.svelte-12glt4h.svelte-12glt4h{display:flex;align-items:center;gap:.5rem}.logs.svelte-12glt4h nav.svelte-12glt4h.svelte-12glt4h{position:sticky;top:0;left:0;z-index:10}.logs.svelte-12glt4h nav input.svelte-12glt4h.svelte-12glt4h{padding-inline-end:2rem}.clearFilter.svelte-12glt4h.svelte-12glt4h.svelte-12glt4h{padding:.5rem;position:relative;left:-2.3rem;cursor:pointer}.clearFilter.svelte-12glt4h .label.svelte-12glt4h.svelte-12glt4h{position:absolute;left:-100vw}.clearFilter.svelte-12glt4h.svelte-12glt4h.svelte-12glt4h:hover{color:var(--color-interaction)}.logs.svelte-12glt4h.svelte-12glt4h.svelte-12glt4h{height:calc(100vh - 83px);overflow:auto;position:sticky;flex-grow:1}table.svelte-12glt4h.svelte-12glt4h.svelte-12glt4h{width:100%}.fresh.svelte-12glt4h td.svelte-12glt4h.svelte-12glt4h{background-color:var(--color-highlight)}.hidden.svelte-12glt4h.svelte-12glt4h.svelte-12glt4h{display:none}td.svelte-12glt4h.svelte-12glt4h.svelte-12glt4h{padding:1rem;border-block-end:1px solid var(--color-frame)}td.svelte-12glt4h.svelte-12glt4h.svelte-12glt4h:not(:first-child):not(:last-child){padding-inline-start:2rem;padding-inline-end:2rem}.date.svelte-12glt4h.svelte-12glt4h.svelte-12glt4h{width:1px;white-space:nowrap}.date.svelte-12glt4h.svelte-12glt4h.svelte-12glt4h{font-family:monospace;font-size:1rem}.error.svelte-12glt4h time.svelte-12glt4h.svelte-12glt4h{color:var(--color-danger)}.logs.svelte-12glt4h .message.svelte-12glt4h.svelte-12glt4h{word-break:break-all}.actions.svelte-12glt4h.svelte-12glt4h.svelte-12glt4h{width:1px;vertical-align:top}.actions.svelte-12glt4h div.svelte-12glt4h.svelte-12glt4h{display:flex;gap:.5em}.actions.svelte-12glt4h .active.button.svelte-12glt4h.svelte-12glt4h{opacity:1;color:var(--color-interaction)}.actions.svelte-12glt4h .button.svelte-12glt4h.svelte-12glt4h{opacity:0;transition:all .1s linear}tr.svelte-12glt4h:hover .actions button.svelte-12glt4h.svelte-12glt4h{opacity:1}footer.svelte-12glt4h.svelte-12glt4h.svelte-12glt4h{margin-block:4rem;text-align:center;line-height:1.5em;color:var(--color-text-secondary)}.pins.svelte-12glt4h nav.svelte-12glt4h.svelte-12glt4h{justify-content:flex-end}.pins.svelte-12glt4h li.svelte-12glt4h+li.svelte-12glt4h{margin-block-start:2rem;padding-block-start:2rem;border-block-start:1px solid var(--color-frame)}.pins.svelte-12glt4h .date.svelte-12glt4h.svelte-12glt4h{margin-block-end:.6em;display:block}.pins.svelte-12glt4h .info.svelte-12glt4h.svelte-12glt4h{display:flex;justify-content:space-between;gap:1rem;color:var(--color-text-secondary)}.pins.svelte-12glt4h .info button.svelte-12glt4h.svelte-12glt4h{transition:color .1s linear}.pins.svelte-12glt4h .info button.svelte-12glt4h.svelte-12glt4h:hover{background-color:transparent;color:var(--color-danger)} diff --git a/gui/next/build/_app/immutable/assets/15.BIXMQND7.css b/gui/next/build/_app/immutable/assets/15.BIXMQND7.css new file mode 100644 index 0000000..2be5990 --- /dev/null +++ b/gui/next/build/_app/immutable/assets/15.BIXMQND7.css @@ -0,0 +1 @@ +.info.svelte-uhfiox.svelte-uhfiox{display:flex;gap:1.2rem}time.svelte-uhfiox.svelte-uhfiox{color:var(--color-text-secondary)}.tech.svelte-uhfiox.svelte-uhfiox{margin-block:2rem}.tech.svelte-uhfiox dt.svelte-uhfiox{margin-block:.5em .2em;font-weight:500}.tech.svelte-uhfiox dd.svelte-uhfiox{padding:.6em .8em;border-radius:0 1rem 1rem;background-color:var(--color-background);word-wrap:break-word}.personal.svelte-uhfiox.svelte-uhfiox{padding-block-start:1.3rem;border-block-end:2px solid var(--color-background)} diff --git a/gui/next/build/_app/immutable/assets/2.Cpa7KQFv.css b/gui/next/build/_app/immutable/assets/2.Cpa7KQFv.css new file mode 100644 index 0000000..fd62e22 --- /dev/null +++ b/gui/next/build/_app/immutable/assets/2.Cpa7KQFv.css @@ -0,0 +1 @@ +i.svelte-ooaugn{color:var(--color-danger)}.container.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d{height:100%;overflow:hidden;display:grid;grid-template-columns:1fr min-content}.container.svelte-1m1ug4d>div.svelte-1m1ug4d.svelte-1m1ug4d{height:calc(100vh - 83px);display:flex;flex-direction:column;overflow-y:auto;flex-grow:1;position:relative}nav.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d{padding:1rem;display:flex;align-items:center;gap:.5em;background-color:rgba(var(--color-rgb-background),.8);backdrop-filter:blur(17px);-webkit-backdrop-filter:blur(17px)}.filters.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d{border-bottom:1px solid var(--color-frame)}.filters.svelte-1m1ug4d form.svelte-1m1ug4d.svelte-1m1ug4d{display:flex;gap:2rem}.filters.svelte-1m1ug4d fieldset.svelte-1m1ug4d.svelte-1m1ug4d{display:flex;align-items:center;gap:.5em}table.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d{width:100%}thead.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d{position:sticky;top:0;z-index:50}th.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d{background-color:var(--color-background);white-space:nowrap;font-weight:500}td.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d,th.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d{padding:.6rem;vertical-align:middle;border:1px solid var(--color-frame);border-block-start:0;transition:background-color .2s linear}td.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d:first-child,th.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d:first-child{border-inline-start:0}td.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d:last-child,th.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d:last-child{border-inline-end:0}th.id.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d{padding-inline-start:2.6rem}td.id.svelte-1m1ug4d div.svelte-1m1ug4d.svelte-1m1ug4d{position:relative;display:flex;align-items:center;gap:.7em}table.svelte-1m1ug4d a.svelte-1m1ug4d.svelte-1m1ug4d{color:var(--color-interaction)}.more.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d{padding-inline:.1rem;background-color:transparent;opacity:0;transition:opacity .1s linear}tr.svelte-1m1ug4d:hover .more.svelte-1m1ug4d.svelte-1m1ug4d{opacity:.5}tr.svelte-1m1ug4d:hover .more.svelte-1m1ug4d.svelte-1m1ug4d:hover{opacity:1}tr.svelte-1m1ug4d:hover .more.svelte-1m1ug4d.svelte-1m1ug4d:hover{background-color:var(--color-background)}menu.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d{display:none;position:absolute;left:.5rem;top:100%;z-index:20;overflow:hidden;border-radius:1rem;white-space:nowrap}menu.active.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d{display:block}td.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d:first-child:hover{z-index:30}menu.svelte-1m1ug4d li.svelte-1m1ug4d+li.svelte-1m1ug4d{border-block-start:1px solid var(--color-context-input-background)}menu.svelte-1m1ug4d button{width:100%;padding:.5rem 1rem;display:flex;align-items:center;gap:.5em;line-height:0}menu.svelte-1m1ug4d button:hover{background-color:var(--color-context-button-background-hover)}.pagination.svelte-1m1ug4d.svelte-1m1ug4d.svelte-1m1ug4d{margin-block-start:auto;position:sticky;inset-inline:0;inset-block-end:0} diff --git a/gui/next/build/_app/immutable/assets/4.B9XykGLe.css b/gui/next/build/_app/immutable/assets/4.B9XykGLe.css new file mode 100644 index 0000000..dc96358 --- /dev/null +++ b/gui/next/build/_app/immutable/assets/4.B9XykGLe.css @@ -0,0 +1 @@ +aside.svelte-117f3bg.svelte-117f3bg{width:350px;height:calc(100vh - 83px);flex-shrink:0;overflow:auto;border-inline-end:1px solid var(--color-frame)}nav.svelte-117f3bg.svelte-117f3bg{padding-bottom:1rem}a.svelte-117f3bg.svelte-117f3bg{max-width:100%;margin:0 1rem;padding:.5rem 1rem;display:block;overflow:hidden;border-radius:.5rem;text-overflow:ellipsis}a.svelte-117f3bg.svelte-117f3bg:hover,a.svelte-117f3bg.svelte-117f3bg:focus-visible{background-color:var(--color-background);color:var(--color-interaction)}a.active.svelte-117f3bg.svelte-117f3bg{background-color:var(--color-middleground);font-weight:500}.filter-container.svelte-117f3bg.svelte-117f3bg{padding:1rem 1rem 2rem;position:sticky;top:0;background-image:linear-gradient(to bottom,var(--color-page) 80%,rgba(var(--color-rgb-page),0))}.filter.svelte-117f3bg.svelte-117f3bg{width:100%;padding:.5rem .8rem;display:flex;align-items:center;gap:.5rem;background-color:var(--color-background);border-radius:.5rem;transition:background-color .1s linear}.filter.svelte-117f3bg.svelte-117f3bg:has(input:focus-visible){background-color:var(--color-middleground)}.filter.svelte-117f3bg input.svelte-117f3bg{all:unset;max-width:185px}.filter.svelte-117f3bg button.svelte-117f3bg{all:unset;display:flex;cursor:pointer;line-height:.2em}.filter.svelte-117f3bg button.svelte-117f3bg,.filter.svelte-117f3bg i.svelte-117f3bg{margin-inline-end:.2em;flex-shrink:0}.filter.svelte-117f3bg i.svelte-117f3bg{position:relative;top:2px;color:var(--color-text-secondary)}.filter.svelte-117f3bg kbd.svelte-117f3bg:first-of-type{margin-inline-start:auto}.container.svelte-s8xmdg{display:grid;grid-template-columns:350px auto;transition:grid-template-columns .2s ease-in-out}.container.tablesHidden.svelte-s8xmdg{grid-template-columns:0 auto}.tables-container.svelte-s8xmdg{overflow:hidden} diff --git a/gui/next/build/_app/immutable/assets/6.CufhmNsu.css b/gui/next/build/_app/immutable/assets/6.CufhmNsu.css new file mode 100644 index 0000000..a49f670 --- /dev/null +++ b/gui/next/build/_app/immutable/assets/6.CufhmNsu.css @@ -0,0 +1 @@ +i.svelte-ooaugn{color:var(--color-danger)}menu.svelte-8i1sxu.svelte-8i1sxu{position:absolute;left:0;top:100%;z-index:20;overflow:hidden;border-radius:0 1rem 1rem;white-space:nowrap}menu.svelte-8i1sxu button{width:100%;padding:.5rem 1rem;display:flex;align-items:center;gap:.5em;line-height:0}menu.svelte-8i1sxu button:hover{background-color:var(--color-context-button-background-hover)}menu.svelte-8i1sxu li.svelte-8i1sxu:last-child button{padding-block-end:.6rem}dialog.svelte-26svji.svelte-26svji{height:100vh;overflow:hidden;display:flex;align-items:center;justify-content:center;position:absolute;top:0;right:0;bottom:0;left:0;z-index:100}dialog.svelte-26svji.svelte-26svji::backdrop{background-color:rgba(var(--color-rgb-background),.6)}.content.svelte-26svji.svelte-26svji{width:clamp(300px,800px,80vw);max-height:94vh;overflow:auto;border-radius:1rem}form.svelte-26svji.svelte-26svji{display:flex;flex-direction:column;gap:1rem;padding:2rem}fieldset.svelte-26svji.svelte-26svji{display:grid;grid-template-columns:1fr 2fr;gap:1rem}fieldset.svelte-26svji+fieldset.svelte-26svji{margin-block-start:2rem}label.svelte-26svji.svelte-26svji{word-break:break-all}input.svelte-26svji.svelte-26svji,textarea.svelte-26svji.svelte-26svji{width:100%;min-height:53px}[role=alert].svelte-26svji.svelte-26svji:not(:empty){margin-block-start:.5em;padding:.5em 1em .6em;position:relative;border-radius:1rem;background-color:var(--color-danger)}[role=alert].svelte-26svji.svelte-26svji:not(:empty):before{width:1em;height:.5em;position:absolute;top:-6px;right:1rem;clip-path:polygon(50% 0%,0% 100%,100% 100%);background-color:var(--color-danger);content:""}.footer.svelte-26svji.svelte-26svji{padding:1.5rem 0;position:sticky;bottom:0;gap:1rem;background-color:var(--color-context)}.error.svelte-26svji li.svelte-26svji{margin-block-end:1rem;padding:1rem;border-radius:1rem;background-color:var(--color-danger);color:var(--color-text-inverted)}.actions.svelte-26svji.svelte-26svji{display:flex;align-items:center;justify-content:space-between}.type.svelte-26svji.svelte-26svji{margin-block-start:.2rem;opacity:.5;font-size:.9em}.page.svelte-1g093it.svelte-1g093it{max-width:100vw;height:100%;overflow:hidden;display:grid;grid-template-columns:1fr min-content;position:relative}.container.svelte-1g093it.svelte-1g093it{min-height:0;max-width:100vw;overflow-y:auto;display:grid;grid-template-rows:min-content 1fr}.filters.svelte-1g093it.svelte-1g093it{padding:var(--space-navigation);background-color:var(--color-background);border-block-end:1px solid var(--color-frame)}.filters.svelte-1g093it .label.svelte-1g093it{position:absolute;left:-100vw}.filters.svelte-1g093it form.svelte-1g093it{display:flex;gap:var(--space-navigation);align-items:center}.filters.svelte-1g093it input.svelte-1g093it:focus,.filters.svelte-1g093it select.svelte-1g093it:focus{position:relative;z-index:1}.filters.svelte-1g093it #filters_attribute.svelte-1g093it{margin-inline-end:1px;border-start-end-radius:0;border-end-end-radius:0}.filters.svelte-1g093it .search.svelte-1g093it{display:flex;align-items:center}.filters.svelte-1g093it .search input.svelte-1g093it{padding-inline-end:1.8rem;border-radius:0}.filters.svelte-1g093it .clear.svelte-1g093it{margin-inline-start:-.9rem;position:relative;inset-inline-start:-.4rem;z-index:1}.filters.svelte-1g093it .search .button[type=submit].svelte-1g093it{margin-inline-start:1px;padding-block:.63rem;padding-inline:.7em .8em;border-start-start-radius:0;border-end-start-radius:0}.pagination.svelte-1g093it.svelte-1g093it{padding:1rem;display:flex;align-items:center;gap:.5em;position:fixed;bottom:0;width:100%;justify-content:space-between;border-block-start:1px solid var(--color-frame);background-color:rgba(var(--color-rgb-background),.8);backdrop-filter:blur(17px);-webkit-backdrop-filter:blur(17px)}table.svelte-1g093it.svelte-1g093it{min-width:100%;margin-bottom:70px;line-height:1.27em}thead.svelte-1g093it.svelte-1g093it{background-color:var(--color-background)}th.svelte-1g093it.svelte-1g093it,td.svelte-1g093it.svelte-1g093it{border-block-end:1px solid var(--color-frame)}th.svelte-1g093it.svelte-1g093it,td.svelte-1g093it>a.svelte-1g093it,td.svelte-1g093it>span.svelte-1g093it{padding:var(--space-table) calc(var(--space-navigation) * 1.5)}th.svelte-1g093it.svelte-1g093it:first-child,td.svelte-1g093it:first-child>a.svelte-1g093it,td.svelte-1g093it:first-child>span.svelte-1g093it{padding-inline-start:var(--space-navigation)}th.svelte-1g093it.svelte-1g093it:last-child,td.svelte-1g093it:last-child>a.svelte-1g093it,td.svelte-1g093it:last-child>span.svelte-1g093it{padding-inline-end:var(--space-navigation)}td.svelte-1g093it>a.svelte-1g093it,td.svelte-1g093it>span.svelte-1g093it{display:block}tr.svelte-1g093it:last-child td.svelte-1g093it{border:0}tr.svelte-1g093it.svelte-1g093it{position:relative}tr.svelte-1g093it.svelte-1g093it:after{position:absolute;inset:calc(var(--space-table) / 3);z-index:-1;border-radius:calc(1rem - var(--space-table) / 1.5);background:transparent;content:"";transition:background-color .1s linear}tr.svelte-1g093it.svelte-1g093it:hover:after{background-color:var(--color-background)}tr.active.svelte-1g093it.svelte-1g093it:after{background-color:var(--color-middleground)}@supports (font: -apple-system-body) and (-webkit-appearance: none){tr.svelte-1g093it.svelte-1g093it:after{display:none}}.table-id.svelte-1g093it.svelte-1g093it{font-variant-numeric:tabular-nums;width:150px}.menu.svelte-1g093it.svelte-1g093it{position:relative;width:30px}tr.svelte-1g093it .inner-menu.svelte-1g093it{background-color:transparent;opacity:0;transition:opacity .1s linear}tr.svelte-1g093it:hover .inner-menu.svelte-1g093it{opacity:.5}.menu.svelte-1g093it:hover .inner-menu.svelte-1g093it,.context.svelte-1g093it .menu .inner-menu.svelte-1g093it{opacity:1}.menu.svelte-1g093it button.active.svelte-1g093it{border-end-start-radius:0;border-end-end-radius:0} diff --git a/gui/next/build/_app/immutable/assets/7.CDkZYgtF.css b/gui/next/build/_app/immutable/assets/7.CDkZYgtF.css new file mode 100644 index 0000000..26e3cb7 --- /dev/null +++ b/gui/next/build/_app/immutable/assets/7.CDkZYgtF.css @@ -0,0 +1 @@ +nav.svelte-1t1yf9.svelte-1t1yf9.svelte-1t1yf9{width:100%;margin-inline:auto;margin-block-start:2rem;padding-inline:2rem}.applications.svelte-1t1yf9.svelte-1t1yf9.svelte-1t1yf9{display:flex;gap:2rem;flex-wrap:wrap;justify-content:center}.applications.svelte-1t1yf9+.applications.svelte-1t1yf9.svelte-1t1yf9{margin-top:4rem}.application.svelte-1t1yf9.svelte-1t1yf9.svelte-1t1yf9{width:200px;position:relative;display:flex;overflow:hidden;border-radius:1rem;background-color:var(--color-background);transition:width .2s ease-in-out}.application.svelte-1t1yf9>a.svelte-1t1yf9.svelte-1t1yf9{width:200px;padding:2.75rem 1rem 2rem;display:flex;flex-shrink:0;flex-direction:column;align-items:center;justify-content:space-between;gap:1rem}.application.showDescription.svelte-1t1yf9.svelte-1t1yf9.svelte-1t1yf9{width:500px}.icon.svelte-1t1yf9.svelte-1t1yf9.svelte-1t1yf9{width:100px;height:100px;padding:.5rem;display:flex;align-items:center;justify-content:center;border-radius:.5rem;background-color:var(--color-middleground);color:var(--color-interaction);transition:all .2s ease-in-out}.application.svelte-1t1yf9>a:hover .icon.svelte-1t1yf9.svelte-1t1yf9{border-radius:1rem;scale:1.1}h2.svelte-1t1yf9.svelte-1t1yf9.svelte-1t1yf9{text-align:center;font-size:1.1rem;font-weight:500}.description.svelte-1t1yf9.svelte-1t1yf9.svelte-1t1yf9{width:284px;padding:2.75rem 1rem 2rem 0;flex-shrink:0}.description.svelte-1t1yf9 li.svelte-1t1yf9.svelte-1t1yf9{margin-inline-start:1ch;padding-inline-start:.4em;list-style-type:"–"}.description.svelte-1t1yf9 li.svelte-1t1yf9+li.svelte-1t1yf9{margin-block-start:.2em}.actions.svelte-1t1yf9.svelte-1t1yf9.svelte-1t1yf9{display:flex;align-items:center;position:absolute;inset-inline-end:0rem;inset-block-start:0rem;overflow:hidden;opacity:0;border:1px solid var(--color-page);border-width:0 0 1px 1px;border-radius:0 1rem;transition:opacity .2s linear;transition-delay:0s}.application.svelte-1t1yf9:hover .actions.svelte-1t1yf9.svelte-1t1yf9{opacity:1;transition-delay:.5s}.actions.svelte-1t1yf9 li.svelte-1t1yf9+li.svelte-1t1yf9{border-inline-start:1px solid var(--color-page)}.actions.svelte-1t1yf9 button.svelte-1t1yf9.svelte-1t1yf9{padding:.25em .5em;color:var(--color-text-secondary);transition:color .1s linear}.actions.svelte-1t1yf9 button.svelte-1t1yf9.svelte-1t1yf9:hover,.actions.svelte-1t1yf9 button.svelte-1t1yf9.svelte-1t1yf9:focus-visible{color:var(--color-interaction-hover)}footer.svelte-1t1yf9.svelte-1t1yf9.svelte-1t1yf9{margin-block-start:4rem;padding:2rem;display:flex;align-items:center;justify-content:space-between;gap:2rem;border-block-start:1px solid var(--color-frame)}footer.svelte-1t1yf9 ul.svelte-1t1yf9.svelte-1t1yf9{display:flex;gap:2rem}.update.svelte-1t1yf9.svelte-1t1yf9.svelte-1t1yf9{max-width:100px;display:flex;align-items:center;gap:.5em;font-size:.85rem}.update.svelte-1t1yf9 svg{flex-shrink:0} diff --git a/gui/next/build/_app/immutable/assets/9.O9jYhcLF.css b/gui/next/build/_app/immutable/assets/9.O9jYhcLF.css new file mode 100644 index 0000000..b5ef4df --- /dev/null +++ b/gui/next/build/_app/immutable/assets/9.O9jYhcLF.css @@ -0,0 +1 @@ +code[class*=language-],pre[class*=language-]{color:#ccc;background:0 0;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}#code{border-radius:1rem;border-start-start-radius:0}#code[class*=language-]{background-color:var(--color-context)}h2.svelte-7qclwq.svelte-7qclwq{margin-block-start:2rem;margin-block-end:.2em;font-weight:500;font-size:1.2rem}.info.svelte-7qclwq.svelte-7qclwq{margin-block-end:4rem;margin-trim:block}.info.svelte-7qclwq div.svelte-7qclwq{margin-block-end:.2em;display:flex;gap:.5em}dt.svelte-7qclwq.svelte-7qclwq{color:var(--color-text-secondary)}.error.svelte-7qclwq.svelte-7qclwq{color:var(--color-danger)}code.svelte-7qclwq.svelte-7qclwq{padding:1rem 1.5rem;display:block;border-radius:1rem;border-start-start-radius:0;background-color:var(--color-middleground);font-family:monospace;font-size:1rem} diff --git a/gui/next/build/_app/immutable/assets/Aside.HqXgbmTR.css b/gui/next/build/_app/immutable/assets/Aside.HqXgbmTR.css new file mode 100644 index 0000000..b9ac00c --- /dev/null +++ b/gui/next/build/_app/immutable/assets/Aside.HqXgbmTR.css @@ -0,0 +1 @@ +aside.svelte-1lvj124{width:var(--width, 30vw);min-width:300px;max-width:90vw;position:relative;overflow:hidden;display:flex;background-color:var(--color-page);border-inline-start:1px solid var(--color-frame)}@media (max-width: 750px){aside.svelte-1lvj124{width:90vw;min-width:0;max-width:90vw;position:absolute;inset-inline-end:0;inset-block:0;background-color:var(--color-page)}}.container.svelte-1lvj124{width:var(--width, 30vw);min-width:300px;max-width:90vw;padding:1rem;flex-shrink:0;overflow:auto}@media (max-width: 750px){.container.svelte-1lvj124{width:90vw;min-width:0;max-width:90vw}}aside.svelte-1lvj124 nav:first-child{margin-block-start:-1rem;margin-block-end:2rem;margin-inline:-1rem}header.svelte-1lvj124{display:flex;justify-content:space-between;gap:2rem}h2.svelte-1lvj124{margin-block-end:.2em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500;font-size:1.2rem}.close.svelte-1lvj124:hover{color:var(--color-interaction-hover)}.label.svelte-1lvj124{position:absolute;left:-100vw}.resizer.svelte-1lvj124{width:8px;position:absolute;inset:0 auto 0 0;cursor:ew-resize;opacity:0;background-color:var(--color-frame);transition:opacity .2s linear}.resizer.svelte-1lvj124:hover,.resizer.active.svelte-1lvj124{background-color:var(--color-frame);opacity:1}@media (max-width: 750px){.resizer.svelte-1lvj124{display:none}} diff --git a/gui/next/build/_app/immutable/assets/CautionBanner.C54xYRep.css b/gui/next/build/_app/immutable/assets/CautionBanner.C54xYRep.css new file mode 100644 index 0000000..e6d47f8 --- /dev/null +++ b/gui/next/build/_app/immutable/assets/CautionBanner.C54xYRep.css @@ -0,0 +1 @@ +.caution.svelte-w5xay3.svelte-w5xay3{margin:var(--space-page);margin-block-end:0;padding:.85rem 1rem;border:1px solid rgba(var(--color-rgb-danger),.35);border-radius:.5rem;background-color:var(--color-highlight);font-size:.9rem;line-height:1.45;color:var(--color-text)}.caution.svelte-w5xay3 strong.svelte-w5xay3{display:block;margin-block-end:.25rem;font-weight:600} diff --git a/gui/next/build/_app/immutable/assets/JSONTree.Do8jmj2M.css b/gui/next/build/_app/immutable/assets/JSONTree.Do8jmj2M.css new file mode 100644 index 0000000..a6f1cce --- /dev/null +++ b/gui/next/build/_app/immutable/assets/JSONTree.Do8jmj2M.css @@ -0,0 +1 @@ +.container.svelte-1qd6nto{display:inline-block;transform:translate(calc(0px - var(--li-identation)),-50%);position:absolute;top:50%;padding-right:100%}.arrow.svelte-1qd6nto{transform-origin:25% 50%;position:relative;line-height:1.1em;font-size:.75em;margin-left:0;transition:.15s;color:var(--arrow-color);-webkit-user-select:none;user-select:none;font-family:Courier New,Courier,monospace;display:block}.expanded.svelte-1qd6nto{transform:rotate(90deg) translate(-3px)}.root.svelte-19drypg{display:inline-block;position:relative}.indent.svelte-19drypg{padding-left:var(--li-identation)}.label.svelte-19drypg{position:relative}.comma.svelte-150ffaa{margin-left:-.5em;margin-right:.5em}.Date.svelte-l95iub{color:var(--date-color)}.BigInt.svelte-l95iub,.Number.svelte-l95iub{color:var(--number-color)}.Boolean.svelte-l95iub{color:var(--boolean-color)}.Null.svelte-l95iub{color:var(--null-color)}.Undefined.svelte-l95iub{color:var(--undefined-color)}.Symbol.svelte-l95iub{color:var(--symbol-color)}.indent.svelte-1u08yw6{padding-left:var(--li-identation)}span.svelte-1fvwa9c{color:var(--string-color);word-break:break-all;word-wrap:break-word}.i.svelte-1eamqdt{font-style:italic}.fn.svelte-1eamqdt,.i.svelte-1eamqdt{color:var(--function-color)}.regex.svelte-17k1wqt{color:var(--regex-color)}ul.svelte-16cw61f{--string-color:var(--json-tree-string-color, #cb3f41);--symbol-color:var(--json-tree-symbol-color, #cb3f41);--boolean-color:var(--json-tree-boolean-color, #112aa7);--function-color:var(--json-tree-function-color, #112aa7);--number-color:var(--json-tree-number-color, #3029cf);--label-color:var(--json-tree-label-color, #871d8f);--property-color:var(--json-tree-property-color, #000000);--arrow-color:var(--json-tree-arrow-color, #727272);--operator-color:var(--json-tree-operator-color, #727272);--null-color:var(--json-tree-null-color, #8d8d8d);--undefined-color:var(--json-tree-undefined-color, #8d8d8d);--date-color:var(--json-tree-date-color, #8d8d8d);--internal-color:var(--json-tree-internal-color, grey);--regex-color:var(--json-tree-regex-color, var(--string-color));--li-identation:var(--json-tree-li-indentation, 1em);--li-line-height:var(--json-tree-li-line-height, 1.3);font-size:var(--json-tree-font-size, 12px);font-family:var(--json-tree-font-family, "Courier New", Courier, monospace)}ul.svelte-16cw61f li{line-height:var(--li-line-height);display:var(--li-display, list-item);list-style:none}ul.svelte-16cw61f,ul.svelte-16cw61f ul{padding:0;margin:0}ul.svelte-16cw61f{margin-left:var(--li-identation)}ul.svelte-16cw61f{cursor:default}ul.svelte-16cw61f .label{color:var(--label-color)}ul.svelte-16cw61f .property{color:var(--property-color)}ul.svelte-16cw61f .internal{color:var(--internal-color)}ul.svelte-16cw61f .operator{color:var(--operator-color)}div.svelte-1ajfzk1 .root{display:none}div.svelte-1ajfzk1 .arrow{top:2px;cursor:pointer}div.svelte-1ajfzk1 .indent{max-width:600px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}div.showFullLines.svelte-1ajfzk1 .indent{max-width:auto;overflow:visible;white-space:normal;word-wrap:break-word;text-overflow:unset}div.svelte-1ajfzk1 div>ul{margin-left:0}div.svelte-1ajfzk1 div>ul>ul>.indent{padding-left:0} diff --git a/gui/next/build/_app/immutable/assets/Number.AfD80Zdm.css b/gui/next/build/_app/immutable/assets/Number.AfD80Zdm.css new file mode 100644 index 0000000..5f301e0 --- /dev/null +++ b/gui/next/build/_app/immutable/assets/Number.AfD80Zdm.css @@ -0,0 +1 @@ +.number.svelte-142ypws{display:inline-flex;align-items:center}input[type=number].svelte-142ypws{width:calc(var(--max));padding-inline:.5em;padding-block:.45rem .55rem;box-sizing:content-box;-webkit-appearance:none;appearance:none;-moz-appearance:textfield;border-radius:0;text-align:center}input.svelte-142ypws::-webkit-outer-spin-button,input.svelte-142ypws::-webkit-inner-spin-button{-webkit-appearance:none}input.svelte-142ypws:focus-visible{position:relative;z-index:1}button.svelte-142ypws{min-height:2.313rem}button.svelte-142ypws:first-child{padding-inline:.7rem .5rem;border-start-end-radius:0;border-end-end-radius:0}button.svelte-142ypws:last-child{padding-inline:.5rem .7rem;border-start-start-radius:0;border-end-start-radius:0}button.svelte-142ypws:focus-visible{position:relative;z-index:1}button.svelte-142ypws svg{width:.8rem;height:.8rem} diff --git a/gui/next/build/_app/immutable/assets/Toggle.o--CU0Za.css b/gui/next/build/_app/immutable/assets/Toggle.o--CU0Za.css new file mode 100644 index 0000000..cc9f594 --- /dev/null +++ b/gui/next/build/_app/immutable/assets/Toggle.o--CU0Za.css @@ -0,0 +1 @@ +.toggle.svelte-1j5d7bb.svelte-1j5d7bb.svelte-1j5d7bb{display:flex;align-items:center;gap:.5em}.toggle.svelte-1j5d7bb label.svelte-1j5d7bb.svelte-1j5d7bb{cursor:pointer;transition:opacity .1s linear}.toggle.svelte-1j5d7bb input[type=radio].svelte-1j5d7bb.svelte-1j5d7bb,.toggle.svelte-1j5d7bb input[type=checkbox].svelte-1j5d7bb.svelte-1j5d7bb{position:absolute;left:-100vw}.toggle.svelte-1j5d7bb .switcher.svelte-1j5d7bb.svelte-1j5d7bb{width:2rem;height:.8rem;display:inline-block;position:relative;top:2px;border:1px solid var(--color-frame);border-radius:1rem}.toggle.svelte-1j5d7bb .switcher.svelte-1j5d7bb.svelte-1j5d7bb:before{width:1rem;position:absolute;left:1px;top:1px;bottom:1px;border-radius:1rem;background-color:var(--color-frame);content:"";transition:translate .2s cubic-bezier(.075,.82,.165,1)}.toggle.svelte-1j5d7bb input[type=radio]:checked .switcher.svelte-1j5d7bb.svelte-1j5d7bb:before{left:1px}.toggle.svelte-1j5d7bb input[type=radio].svelte-1j5d7bb:not(:checked)+label.svelte-1j5d7bb{opacity:.5}.toggle.svelte-1j5d7bb:has(.switcher+input[type=radio]:checked) .switcher.svelte-1j5d7bb.svelte-1j5d7bb:before{translate:.85em 0}.toggle.svelte-1j5d7bb:has(input[type=radio]:focus-visible) .switcher.svelte-1j5d7bb.svelte-1j5d7bb{border-color:var(--color-interaction-hover)}.toggle.svelte-1j5d7bb:has(input[type=radio]:focus-visible) .switcher.svelte-1j5d7bb.svelte-1j5d7bb:before{background-color:var(--color-interaction-hover)}.toggle.single.svelte-1j5d7bb label.svelte-1j5d7bb.svelte-1j5d7bb{width:100%;position:relative;display:flex;align-items:center;justify-content:space-between;gap:2rem}.toggle.single.svelte-1j5d7bb label.svelte-1j5d7bb.svelte-1j5d7bb:before{width:2rem;height:1.2rem;order:2;flex-shrink:0;position:relative;inset-block-start:1px;border:1px solid var(--color-frame);border-radius:1rem;content:""}.toggle.single.svelte-1j5d7bb label.svelte-1j5d7bb.svelte-1j5d7bb:after{width:1rem;height:calc(1.2rem - 4px);margin-block-start:2px;position:absolute;inset-inline-end:calc(1rem - 2px);flex-shrink:0;border-radius:1rem;background-color:var(--color-frame);content:"";transition:translate .2s cubic-bezier(.075,.82,.165,1)}.toggle.single.svelte-1j5d7bb:has(input:checked) label.svelte-1j5d7bb.svelte-1j5d7bb:after{translate:.75rem 0}.toggle.single.svelte-1j5d7bb i.svelte-1j5d7bb.svelte-1j5d7bb{width:7px;height:7px;margin-block-start:2px;position:absolute;inset-inline-end:6px;z-index:1;color:var(--color-text)}.toggle.single.svelte-1j5d7bb svg{width:100%;height:auto;display:block} diff --git a/gui/next/build/_app/immutable/chunks/BD1m7lx9.js b/gui/next/build/_app/immutable/chunks/BD1m7lx9.js new file mode 100644 index 0000000..d1808cd --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/BD1m7lx9.js @@ -0,0 +1 @@ +const a=t=>{const n=typeof window<"u"&&window.location.port!=="4173"&&window.location.port!=="5173"?`http://localhost:${parseInt(window.location.port)}/api/graph`:"http://localhost:3333/api/graph";return fetch(n,{headers:{"Content-Type":"application/json"},method:"POST",body:JSON.stringify(t)}).then(o=>o.json()).then(o=>o.errors?(o.errors.forEach(r=>{console.log(t.query),console.info(r)}),o):o&&o.data)};export{a as g}; diff --git a/gui/next/build/_app/immutable/chunks/BNCRiqmJ.js b/gui/next/build/_app/immutable/chunks/BNCRiqmJ.js new file mode 100644 index 0000000..1fddac0 --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/BNCRiqmJ.js @@ -0,0 +1 @@ +import{a as z,t as B}from"./Bh3MJlbi.js";import{r as C}from"./Ul9VwQ7n.js";function G(n){return(n==null?void 0:n.length)!==void 0?n:Array.from(n)}function H(n,o){B(n,1,1,()=>{o.delete(n.key)})}function I(n,o,x,D,A,g,f,j,p,k,w,q){let i=n.length,d=g.length,c=i;const a={};for(;c--;)a[n[c].key]=c;const h=[],u=new Map,m=new Map,M=[];for(c=d;c--;){const e=q(A,g,c),s=x(e);let t=f.get(s);t?M.push(()=>t.p(e,o)):(t=k(s,e),t.c()),u.set(s,h[c]=t),s in a&&m.set(s,Math.abs(c-a[s]))}const v=new Set,S=new Set;function y(e){z(e,1),e.m(j,w),f.set(e.key,e),w=e.first,d--}for(;i&&d;){const e=h[d-1],s=n[i-1],t=e.key,l=s.key;e===s?(w=e.first,i--,d--):u.has(l)?!f.has(t)||v.has(t)?y(e):S.has(l)?i--:m.get(t)>m.get(l)?(S.add(t),y(e)):(v.add(l),i--):(p(s,f),i--)}for(;i--;){const e=n[i];u.has(e.key)||p(e,f)}for(;d;)y(h[d-1]);return C(M),h}export{G as e,H as o,I as u}; diff --git a/gui/next/build/_app/immutable/chunks/BVVGnpm8.js b/gui/next/build/_app/immutable/chunks/BVVGnpm8.js new file mode 100644 index 0000000..925e08d --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/BVVGnpm8.js @@ -0,0 +1,2 @@ +import{ah as et,ai as tt,s as L,n as K,d as c,i as d,v as T,k as x,K as H,b as g,D as ne,w as v,c as y,e as N,f as k,h as w,t as b,aj as ze,L as ee,l as Q,u as X,m as Y,o as Z,T as nt,g as G,j as D,I as _e,ak as Ge,z as re,a as O,af as pe,U as me,al as he,A as z}from"./Ul9VwQ7n.js";import{S as F,i as J,t as $,a as m,d as j,g as U,e as q,m as E,c as P,b as A}from"./Bh3MJlbi.js";import{e as te}from"./BNCRiqmJ.js";import{w as ue,r as st}from"./RFIyOgWr.js";function $e(l,t){const s={},e={},n={$$scope:1};let r=l.length;for(;r--;){const a=l[r],i=t[r];if(i){for(const o in a)o in i||(e[o]=1);for(const o in i)n[o]||(s[o]=i[o],n[o]=1);l[r]=i}else for(const o in a)n[o]=1}for(const a in e)a in s||(s[a]=void 0);return s}function de(l){return typeof l=="object"&&l!==null?l:{}}const ge={};function R(l,t){const s=et(ge),e=typeof l=="function"?l(s):l,n={...s,...e};return t!=null&&t.expandable&&(n.isParentExpanded=n.expanded),tt(ge,n),s}function ve(l){let t,s,e="▶",n,r,a;return{c(){t=w("span"),s=w("span"),n=b(e),this.h()},l(i){t=y(i,"SPAN",{class:!0});var o=N(t);s=y(o,"SPAN",{class:!0});var f=N(s);n=k(f,e),f.forEach(c),o.forEach(c),this.h()},h(){v(s,"class","arrow svelte-1qd6nto"),H(s,"expanded",l[2]),v(t,"class","container svelte-1qd6nto")},m(i,o){d(i,t,o),g(t,s),g(s,n),r||(a=ne(t,"click",l[4]),r=!0)},p(i,o){o&4&&H(s,"expanded",i[2])},d(i){i&&c(t),r=!1,a()}}}function rt(l){let t,s=l[1]&&ve(l);return{c(){s&&s.c(),t=T()},l(e){s&&s.l(e),t=T()},m(e,n){s&&s.m(e,n),d(e,t,n)},p(e,[n]){e[1]?s?s.p(e,n):(s=ve(e),s.c(),s.m(t.parentNode,t)):s&&(s.d(1),s=null)},i:K,o:K,d(e){e&&c(t),s&&s.d(e)}}}function lt(l,t,s){let e,n,r=K,a=()=>(r(),r=ze(f,_=>s(2,n=_)),f);l.$$.on_destroy.push(()=>r());const{expanded:i,expandable:o}=R();x(l,o,_=>s(1,e=_));let{expanded:f=i}=t;a();const u=_=>{_.stopPropagation(),ee(f,n=!n,n)};return l.$$set=_=>{"expanded"in _&&a(s(0,f=_.expanded))},[f,e,n,o,u]}class De extends F{constructor(t){super(),J(this,t,lt,rt,L,{expanded:0})}}function at(l){let t;const s=l[1].default,e=Q(s,l,l[0],null);return{c(){e&&e.c()},l(n){e&&e.l(n)},m(n,r){e&&e.m(n,r),t=!0},p(n,[r]){e&&e.p&&(!t||r&1)&&X(e,s,n,n[0],t?Z(s,n[0],r,null):Y(n[0]),null)},i(n){t||(m(e,n),t=!0)},o(n){$(e,n),t=!1},d(n){e&&e.d(n)}}}function ot(l,t,s){let{$$slots:e={},$$scope:n}=t;return R({displayMode:"summary"}),l.$$set=r=>{"$$scope"in r&&s(0,n=r.$$scope)},[n,e]}class it extends F{constructor(t){super(),J(this,t,ot,at,L,{})}}function ft(l){let t;const s=l[3].default,e=Q(s,l,l[2],null);return{c(){e&&e.c()},l(n){e&&e.l(n)},m(n,r){e&&e.m(n,r),t=!0},p(n,[r]){e&&e.p&&(!t||r&4)&&X(e,s,n,n[2],t?Z(s,n[2],r,null):Y(n[2]),null)},i(n){t||(m(e,n),t=!0)},o(n){$(e,n),t=!1},d(n){e&&e.d(n)}}}function ut(l,t,s){let{$$slots:e={},$$scope:n}=t,{expanded:r}=t,{key:a}=t;const i=ue(!1);return R(({keyPath:o,level:f})=>(a!=="[[Entries]]"&&(o=[...o,a],f=f+1),{keyPath:o,level:f,expanded:r,expandable:i})),l.$$set=o=>{"expanded"in o&&s(0,r=o.expanded),"key"in o&&s(1,a=o.key),"$$scope"in o&&s(2,n=o.$$scope)},[r,a,n,e]}class We extends F{constructor(t){super(),J(this,t,ut,ft,L,{expanded:0,key:1})}}function ke(l,t,s){const e=l.slice();return e[19]=t[s],e[21]=s,e}const ct=l=>({key:l&1}),be=l=>({key:l[19],index:l[21]}),_t=l=>({key:l&1}),ye=l=>({key:l[19],index:l[21]}),pt=l=>({}),we=l=>({root:l[6]}),mt=l=>({}),Se=l=>({});function ht(l){let t,s,e,n,r,a,i,o,f=l[6]&&dt(l);e=new it({props:{$$slots:{default:[gt]},$$scope:{ctx:l}}});let u=l[4]&&Ne(l);return{c(){t=w("span"),f&&f.c(),s=D(),A(e.$$.fragment),n=D(),u&&u.c(),r=T(),this.h()},l(_){t=y(_,"SPAN",{class:!0});var p=N(t);f&&f.l(p),s=G(p),P(e.$$.fragment,p),p.forEach(c),n=G(_),u&&u.l(_),r=T(),this.h()},h(){v(t,"class","root svelte-19drypg")},m(_,p){d(_,t,p),f&&f.m(t,null),g(t,s),E(e,t,null),d(_,n,p),u&&u.m(_,p),d(_,r,p),a=!0,i||(o=ne(t,"click",l[9]),i=!0)},p(_,p){_[6]&&f.p(_,p);const h={};p&8192&&(h.$$scope={dirty:p,ctx:_}),e.$set(h),_[4]?u?(u.p(_,p),p&16&&m(u,1)):(u=Ne(_),u.c(),m(u,1),u.m(r.parentNode,r)):u&&(U(),$(u,1,1,()=>{u=null}),q())},i(_){a||(m(f),m(e.$$.fragment,_),m(u),a=!0)},o(_){$(f),$(e.$$.fragment,_),$(u),a=!1},d(_){_&&(c(t),c(n),c(r)),f&&f.d(),j(e),u&&u.d(_),i=!1,o()}}}function $t(l){let t;const s=l[11].summary,e=Q(s,l,l[13],Se);return{c(){e&&e.c()},l(n){e&&e.l(n)},m(n,r){e&&e.m(n,r),t=!0},p(n,r){e&&e.p&&(!t||r&8192)&&X(e,s,n,n[13],t?Z(s,n[13],r,mt):Y(n[13]),Se)},i(n){t||(m(e,n),t=!0)},o(n){$(e,n),t=!1},d(n){e&&e.d(n)}}}function dt(l){let t,s;return t=new De({props:{expanded:l[7]}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p:K,i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function gt(l){let t;const s=l[11].preview,e=Q(s,l,l[13],we);return{c(){e&&e.c()},l(n){e&&e.l(n)},m(n,r){e&&e.m(n,r),t=!0},p(n,r){e&&e.p&&(!t||r&8192)&&X(e,s,n,n[13],t?Z(s,n[13],r,pt):Y(n[13]),we)},i(n){t||(m(e,n),t=!0)},o(n){$(e,n),t=!1},d(n){e&&e.d(n)}}}function Ne(l){let t,s,e,n,r=te(l[0]),a=[];for(let o=0;o$(a[o],1,1,()=>{a[o]=null});return{c(){t=w("ul");for(let o=0;o{};function yt(l,t,s){let e,n,r,{$$slots:a={},$$scope:i}=t,{keys:o}=t,{shouldShowColon:f=void 0}=t,{expandKey:u=M=>M}=t,{defaultExpanded:_=!1}=t;const{isParentExpanded:p,displayMode:h,root:S,expanded:C,expandable:V,keyPath:He,level:Qe,shouldExpandNode:Xe}=R({root:!1},{expandable:!0});if(x(l,C,M=>s(4,n=M)),x(l,V,M=>s(14,r=M)),ee(V,r=!0,r),h!=="summary"){if(!_){const M=Xe({keyPath:He,level:Qe});M!==void 0&&(_=M)}nt(()=>p.subscribe(M=>{M?C.set(_):C.set(!1)}))}function Ye(){ee(C,n=!n,n)}const Ze=M=>e[M].update(xe=>!xe);return l.$$set=M=>{"keys"in M&&s(0,o=M.keys),"shouldShowColon"in M&&s(1,f=M.shouldShowColon),"expandKey"in M&&s(2,u=M.expandKey),"defaultExpanded"in M&&s(10,_=M.defaultExpanded),"$$scope"in M&&s(13,i=M.$$scope)},l.$$.update=()=>{l.$$.dirty&1&&s(3,e=o.map(()=>ue(!1)))},[o,f,u,e,n,h,S,C,V,Ye,_,a,Ze,i]}class B extends F{constructor(t){super(),J(this,t,yt,kt,L,{keys:0,shouldShowColon:1,expandKey:2,defaultExpanded:10})}}function Ae(l,t,s){const e=l.slice();return e[9]=t[s],e[11]=s,e}const wt=l=>({item:l&1}),Pe=l=>({item:l[9],index:l[11]});function Oe(l){let t,s,e,n,r,a=l[3]&&Te(l),i=te(l[0]),o=[];for(let p=0;p$(o[p],1,1,()=>{o[p]=null});let u=l[1]&&Le(),_=l[4]&&Fe(l);return{c(){a&&a.c(),t=D();for(let p=0;p{e=null}),q())},i(n){s||(m(e),s=!0)},o(n){$(e),s=!1},d(n){n&&c(t),e&&e.d(n)}}}function Nt(l,t,s){let{$$slots:e={},$$scope:n}=t,{list:r}=t,{hasMore:a}=t,{label:i=void 0}=t,{prefix:o=void 0}=t,{postfix:f=void 0}=t,{root:u=!1}=t;const{showPreview:_}=R();return l.$$set=p=>{"list"in p&&s(0,r=p.list),"hasMore"in p&&s(1,a=p.hasMore),"label"in p&&s(2,i=p.label),"prefix"in p&&s(3,o=p.prefix),"postfix"in p&&s(4,f=p.postfix),"root"in p&&s(5,u=p.root),"$$scope"in p&&s(7,n=p.$$scope)},[r,a,i,o,f,u,_,n,e]}class se extends F{constructor(t){super(),J(this,t,Nt,St,L,{list:0,hasMore:1,label:2,prefix:3,postfix:4,root:5})}}function jt(l){let t,s=(l[1]??"{…}")+"",e;return{c(){t=w("span"),e=b(s),this.h()},l(n){t=y(n,"SPAN",{class:!0});var r=N(t);e=k(r,s),r.forEach(c),this.h()},h(){v(t,"class","label")},m(n,r){d(n,t,r),g(t,e)},p(n,r){r&2&&s!==(s=(n[1]??"{…}")+"")&&O(e,s)},d(n){n&&c(t)}}}function Et(l){let t,s=l[6]+"",e,n,r=": ",a,i,o;return i=new I({props:{value:l[0][l[6]]}}),{c(){t=w("span"),e=b(s),n=w("span"),a=b(r),A(i.$$.fragment),this.h()},l(f){t=y(f,"SPAN",{class:!0});var u=N(t);e=k(u,s),u.forEach(c),n=y(f,"SPAN",{class:!0});var _=N(n);a=k(_,r),_.forEach(c),P(i.$$.fragment,f),this.h()},h(){v(t,"class","property"),v(n,"class","operator")},m(f,u){d(f,t,u),g(t,e),d(f,n,u),g(n,a),E(i,f,u),o=!0},p(f,u){(!o||u&64)&&s!==(s=f[6]+"")&&O(e,s);const _={};u&65&&(_.value=f[0][f[6]]),i.$set(_)},i(f){o||(m(i.$$.fragment,f),o=!0)},o(f){$(i.$$.fragment,f),o=!1},d(f){f&&(c(t),c(n)),j(i,f)}}}function At(l){let t,s;return t=new se({props:{list:l[3],hasMore:l[3].length({6:e}),({item:e})=>e?64:0]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&8&&(r.list=e[3]),n&12&&(r.hasMore=e[3].length({4:e}),({key:e})=>e?16:0],item_key:[Pt,({key:e})=>({4:e}),({key:e})=>e?16:0],preview:[At,({root:e})=>({5:e}),({root:e})=>e?32:0],summary:[jt]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,[n]){const r={};n&4&&(r.keys=e[2]),n&191&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function Ct(l,t,s){let e,n,{value:r}=t,{summary:a}=t;return l.$$set=i=>{"value"in i&&s(0,r=i.value),"summary"in i&&s(1,a=i.summary)},l.$$.update=()=>{l.$$.dirty&1&&s(2,e=Object.getOwnPropertyNames(r)),l.$$.dirty&4&&s(3,n=e.slice(0,5))},[r,a,e,n]}class ce extends F{constructor(t){super(),J(this,t,Ct,Tt,L,{value:0,summary:1})}}function It(l){let t,s,e=l[0].length+"",n,r;return{c(){t=w("span"),s=b("Array("),n=b(e),r=b(")"),this.h()},l(a){t=y(a,"SPAN",{class:!0});var i=N(t);s=k(i,"Array("),n=k(i,e),r=k(i,")"),i.forEach(c),this.h()},h(){v(t,"class","label")},m(a,i){d(a,t,i),g(t,s),g(t,n),g(t,r)},p(a,i){i&1&&e!==(e=a[0].length+"")&&O(n,e)},d(a){a&&c(t)}}}function Mt(l){let t,s;return t=new I({props:{value:l[5]}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&32&&(r.value=e[5]),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function Lt(l){let t,s;return t=new se({props:{list:l[1],hasMore:l[1].length({5:e}),({item:e})=>e?32:0]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&2&&(r.list=e[1]),n&3&&(r.hasMore=e[1].length({3:e}),({key:e})=>e?8:0],item_key:[Ft,({key:e})=>({3:e}),({key:e})=>e?8:0],preview:[Lt,({root:e})=>({4:e}),({root:e})=>e?16:0],summary:[It]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,[n]){const r={};n&4&&(r.keys=e[2]),n&91&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function Bt(l,t,s){let e,n,{value:r}=t;return l.$$set=a=>{"value"in a&&s(0,r=a.value)},l.$$.update=()=>{l.$$.dirty&1&&s(2,e=Object.getOwnPropertyNames(r)),l.$$.dirty&1&&s(1,n=r.slice(0,5))},[r,n,e]}class Ut extends F{constructor(t){super(),J(this,t,Bt,Kt,L,{value:0})}}function qt(l){let t,s,e,n=l[3].length+"",r,a;return{c(){t=w("span"),s=b(l[1]),e=b("("),r=b(n),a=b(")"),this.h()},l(i){t=y(i,"SPAN",{class:!0});var o=N(t);s=k(o,l[1]),e=k(o,"("),r=k(o,n),a=k(o,")"),o.forEach(c),this.h()},h(){v(t,"class","label")},m(i,o){d(i,t,o),g(t,s),g(t,e),g(t,r),g(t,a)},p(i,o){o&2&&O(s,i[1]),o&8&&n!==(n=i[3].length+"")&&O(r,n)},d(i){i&&c(t)}}}function Rt(l){let t,s;return t=new I({props:{value:l[9]}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&512&&(r.value=e[9]),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function Vt(l){let t,s;return t=new se({props:{list:l[4],hasMore:l[4].length({9:e}),({item:e})=>e?512:0]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&16&&(r.list=e[4]),n&20&&(r.hasMore=e[4].length({7:e}),({key:e})=>e?128:0],item_key:[Wt,({key:e})=>({7:e}),({key:e})=>e?128:0]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&8&&(r.keys=e[3]),n&1156&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function Wt(l){let t,s=l[7]+"",e;return{c(){t=w("span"),e=b(s),this.h()},l(n){t=y(n,"SPAN",{class:!0});var r=N(t);e=k(r,s),r.forEach(c),this.h()},h(){v(t,"class","property")},m(n,r){d(n,t,r),g(t,e)},p(n,r){r&128&&s!==(s=n[7]+"")&&O(e,s)},d(n){n&&c(t)}}}function Ht(l){let t,s;return t=new I({props:{value:l[2][l[7]]}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&132&&(r.value=e[2][e[7]]),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function Qt(l){let t,s,e,n;const r=[Dt,Gt],a=[];function i(o,f){return o[6]===le?0:1}return t=i(l),s=a[t]=r[t](l),{c(){s.c(),e=T()},l(o){s.l(o),e=T()},m(o,f){a[t].m(o,f),d(o,e,f),n=!0},p(o,f){let u=t;t=i(o),t===u?a[t].p(o,f):(U(),$(a[u],1,1,()=>{a[u]=null}),q(),s=a[t],s?s.p(o,f):(s=a[t]=r[t](o),s.c()),m(s,1),s.m(e.parentNode,e))},i(o){n||(m(s),n=!0)},o(o){$(s),n=!1},d(o){o&&c(e),a[t].d(o)}}}function Xt(l){let t,s;return t=new B({props:{keys:[le,"size"],shouldShowColon:l[5],$$slots:{item_value:[Qt,({key:e})=>({6:e}),({key:e})=>e?64:0],item_key:[zt,({key:e})=>({6:e}),({key:e})=>e?64:0],preview:[Vt,({root:e})=>({8:e}),({root:e})=>e?256:0],summary:[qt]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,[n]){const r={};n&1375&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}const le="[[Entries]]";function Yt(l,t,s){let e,{value:n}=t,{nodeType:r}=t,a=[],i=[];const o=f=>f!==le;return l.$$set=f=>{"value"in f&&s(0,n=f.value),"nodeType"in f&&s(1,r=f.nodeType)},l.$$.update=()=>{if(l.$$.dirty&1){let f=[],u=[],_=0;for(const p of n)f.push(_++),u.push(p);s(3,a=f),s(2,i=u)}l.$$.dirty&4&&s(4,e=i.slice(0,5))},[n,r,i,a,e,o]}class Zt extends F{constructor(t){super(),J(this,t,Yt,Xt,L,{value:0,nodeType:1})}}function xt(l){let t,s,e=l[2].length+"",n,r;return{c(){t=w("span"),s=b("Map("),n=b(e),r=b(")"),this.h()},l(a){t=y(a,"SPAN",{color:!0});var i=N(t);s=k(i,"Map("),n=k(i,e),r=k(i,")"),i.forEach(c),this.h()},h(){v(t,"color","label")},m(a,i){d(a,t,i),g(t,s),g(t,n),g(t,r)},p(a,i){i&4&&e!==(e=a[2].length+"")&&O(n,e)},d(a){a&&c(t)}}}function en(l){let t,s,e=" => ",n,r,a;return t=new I({props:{value:l[11]}}),r=new I({props:{value:l[0].get(l[11])}}),{c(){A(t.$$.fragment),s=w("span"),n=b(e),A(r.$$.fragment),this.h()},l(i){P(t.$$.fragment,i),s=y(i,"SPAN",{class:!0});var o=N(s);n=k(o,e),o.forEach(c),P(r.$$.fragment,i),this.h()},h(){v(s,"class","operator")},m(i,o){E(t,i,o),d(i,s,o),g(s,n),E(r,i,o),a=!0},p(i,o){const f={};o&2048&&(f.value=i[11]),t.$set(f);const u={};o&2049&&(u.value=i[0].get(i[11])),r.$set(u)},i(i){a||(m(t.$$.fragment,i),m(r.$$.fragment,i),a=!0)},o(i){$(t.$$.fragment,i),$(r.$$.fragment,i),a=!1},d(i){i&&c(s),j(t,i),j(r,i)}}}function tn(l){let t,s;return t=new se({props:{list:l[4],hasMore:l[4].length({11:e}),({item:e})=>e?2048:0]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&16&&(r.list=e[4]),n&17&&(r.hasMore=e[4].length({8:e}),({key:e})=>e?256:0],item_key:[ln,({key:e})=>({8:e}),({key:e})=>e?256:0]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&2&&(r.keys=e[1]),n&4&&(r.expandKey=e[5]),n&4364&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function ln(l){let t,s=l[8]+"",e;return{c(){t=w("span"),e=b(s),this.h()},l(n){t=y(n,"SPAN",{class:!0});var r=N(t);e=k(r,s),r.forEach(c),this.h()},h(){v(t,"class","property")},m(n,r){d(n,t,r),g(t,e)},p(n,r){r&256&&s!==(s=n[8]+"")&&O(e,s)},d(n){n&&c(t)}}}function an(l){let t,s="{ ",e,n,r,a=" => ",i,o,f,u=" }",_,p;return n=new I({props:{value:l[2][l[8]]}}),o=new I({props:{value:l[3][l[8]]}}),{c(){t=w("span"),e=b(s),A(n.$$.fragment),r=w("span"),i=b(a),A(o.$$.fragment),f=w("span"),_=b(u),this.h()},l(h){t=y(h,"SPAN",{class:!0});var S=N(t);e=k(S,s),S.forEach(c),P(n.$$.fragment,h),r=y(h,"SPAN",{class:!0});var C=N(r);i=k(C,a),C.forEach(c),P(o.$$.fragment,h),f=y(h,"SPAN",{class:!0});var V=N(f);_=k(V,u),V.forEach(c),this.h()},h(){v(t,"class","operator"),v(r,"class","operator"),v(f,"class","operator")},m(h,S){d(h,t,S),g(t,e),E(n,h,S),d(h,r,S),g(r,i),E(o,h,S),d(h,f,S),g(f,_),p=!0},p(h,S){const C={};S&260&&(C.value=h[2][h[8]]),n.$set(C);const V={};S&264&&(V.value=h[3][h[8]]),o.$set(V)},i(h){p||(m(n.$$.fragment,h),m(o.$$.fragment,h),p=!0)},o(h){$(n.$$.fragment,h),$(o.$$.fragment,h),p=!1},d(h){h&&(c(t),c(r),c(f)),j(n,h),j(o,h)}}}function on(l){let t,s=l[9]+"",e;return{c(){t=w("span"),e=b(s),this.h()},l(n){t=y(n,"SPAN",{class:!0});var r=N(t);e=k(r,s),r.forEach(c),this.h()},h(){v(t,"class","property")},m(n,r){d(n,t,r),g(t,e)},p(n,r){r&512&&s!==(s=n[9]+"")&&O(e,s)},d(n){n&&c(t)}}}function fn(l){let t,s;return t=new I({props:{value:l[9]==="key"?l[2][l[8]]:l[3][l[8]]}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&780&&(r.value=e[9]==="key"?e[2][e[8]]:e[3][e[8]]),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function un(l){let t,s;return t=new B({props:{keys:["key","value"],$$slots:{item_value:[fn,({key:e})=>({9:e}),({key:e})=>e?512:0],item_key:[on,({key:e})=>({9:e}),({key:e})=>e?512:0],preview:[an]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&4876&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function cn(l){let t,s,e,n;const r=[rn,sn],a=[];function i(o,f){return o[7]===ae?0:1}return t=i(l),s=a[t]=r[t](l),{c(){s.c(),e=T()},l(o){s.l(o),e=T()},m(o,f){a[t].m(o,f),d(o,e,f),n=!0},p(o,f){let u=t;t=i(o),t===u?a[t].p(o,f):(U(),$(a[u],1,1,()=>{a[u]=null}),q(),s=a[t],s?s.p(o,f):(s=a[t]=r[t](o),s.c()),m(s,1),s.m(e.parentNode,e))},i(o){n||(m(s),n=!0)},o(o){$(s),n=!1},d(o){o&&c(e),a[t].d(o)}}}function _n(l){let t,s;return t=new B({props:{keys:[ae,"size"],shouldShowColon:l[6],$$slots:{item_value:[cn,({key:e})=>({7:e}),({key:e})=>e?128:0],item_key:[nn,({key:e})=>({7:e}),({key:e})=>e?128:0],preview:[tn,({root:e})=>({10:e}),({root:e})=>e?1024:0],summary:[xt]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,[n]){const r={};n&5279&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}const ae="[[Entries]]";function pn(l,t,s){let e,{value:n}=t;R();let r=[],a=[],i=[];const o=u=>a[u],f=u=>u!==ae;return l.$$set=u=>{"value"in u&&s(0,n=u.value)},l.$$.update=()=>{if(l.$$.dirty&1){let u=[],_=[],p=[],h=0;for(const S of n)u.push(h++),_.push(S[0]),p.push(S[1]);s(1,r=u),s(2,a=_),s(3,i=p)}l.$$.dirty&1&&s(4,e=Array.from(n.keys()).slice(0,5))},[n,r,a,i,e,o,f]}class mn extends F{constructor(t){super(),J(this,t,pn,_n,L,{value:0})}}function hn(l){let t,s,e;return{c(){t=w("span"),s=b(l[0]),this.h()},l(n){t=y(n,"SPAN",{class:!0});var r=N(t);s=k(r,l[0]),r.forEach(c),this.h()},h(){v(t,"class",e=pe(l[1])+" svelte-l95iub")},m(n,r){d(n,t,r),g(t,s)},p(n,[r]){r&1&&O(s,n[0]),r&2&&e!==(e=pe(n[1])+" svelte-l95iub")&&v(t,"class",e)},i:K,o:K,d(n){n&&c(t)}}}function $n(l,t,s){let{value:e,nodeType:n}=t;return l.$$set=r=>{"value"in r&&s(0,e=r.value),"nodeType"in r&&s(1,n=r.nodeType)},[e,n]}class W extends F{constructor(t){super(),J(this,t,$n,hn,L,{value:0,nodeType:1})}}function Je(l,t,s){const e=l.slice();e[6]=t[s],e[9]=s;const n=e[9]$(n[a],1,1,()=>{n[a]=null});return{c(){for(let a=0;a0)},m(o,f){d(o,t,f),E(s,t,null),g(t,e),g(e,r),d(o,a,f),i=!0},p(o,f){const u={};f&1&&(u.value=o[6]+(o[7]?"\\n":"")),s.$set(u),(!i||f&1)&&n!==(n=o[7]?" +":"")&&O(r,n)},i(o){i||(m(s.$$.fragment,o),i=!0)},o(o){$(s.$$.fragment,o),i=!1},d(o){o&&(c(t),c(a)),j(s)}}}function vn(l){let t,s,e,n,r,a;const i=[gn,dn],o=[];function f(u,_){return u[1]?0:1}return s=f(l),e=o[s]=i[s](l),{c(){t=w("span"),e.c()},l(u){t=y(u,"SPAN",{});var _=N(t);e.l(_),_.forEach(c)},m(u,_){d(u,t,_),o[s].m(t,null),n=!0,r||(a=ne(t,"click",l[4]),r=!0)},p(u,[_]){let p=s;s=f(u),s===p?o[s].p(u,_):(U(),$(o[p],1,1,()=>{o[p]=null}),q(),e=o[s],e?e.p(u,_):(e=o[s]=i[s](u),e.c()),m(e,1),e.m(t,null))},i(u){n||(m(e),n=!0)},o(u){$(e),n=!1},d(u){u&&c(t),o[s].d(),r=!1,a()}}}function kn(l,t,s){let e,n,{stack:r}=t;const{expanded:a,expandable:i}=R();x(l,a,f=>s(1,n=f)),x(l,i,f=>s(5,e=f)),ee(i,e=!0,e);const o=()=>ee(a,n=!n,n);return l.$$set=f=>{"stack"in f&&s(0,r=f.stack)},[r,n,a,i,o]}class bn extends F{constructor(t){super(),J(this,t,kn,vn,L,{stack:0})}}function yn(l){let t,s,e=String(l[0].message)+"",n;return{c(){t=w("span"),s=b("Error: "),n=b(e),this.h()},l(r){t=y(r,"SPAN",{class:!0});var a=N(t);s=k(a,"Error: "),n=k(a,e),a.forEach(c),this.h()},h(){v(t,"class","label")},m(r,a){d(r,t,a),g(t,s),g(t,n)},p(r,a){a&1&&e!==(e=String(r[0].message)+"")&&O(n,e)},d(r){r&&c(t)}}}function wn(l){let t,s,e=String(l[0].message)+"",n;return{c(){t=w("span"),s=b("Error: "),n=b(e),this.h()},l(r){t=y(r,"SPAN",{class:!0});var a=N(t);s=k(a,"Error: "),n=k(a,e),a.forEach(c),this.h()},h(){v(t,"class","label")},m(r,a){d(r,t,a),g(t,s),g(t,n)},p(r,a){a&1&&e!==(e=String(r[0].message)+"")&&O(n,e)},d(r){r&&c(t)}}}function Sn(l){let t,s=l[2]+"",e;return{c(){t=w("span"),e=b(s),this.h()},l(n){t=y(n,"SPAN",{class:!0});var r=N(t);e=k(r,s),r.forEach(c),this.h()},h(){v(t,"class","property")},m(n,r){d(n,t,r),g(t,e)},p(n,r){r&4&&s!==(s=n[2]+"")&&O(e,s)},d(n){n&&c(t)}}}function Nn(l){let t,s;return t=new I({props:{value:l[0][l[2]]}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&5&&(r.value=e[0][e[2]]),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function jn(l){let t,s;return t=new bn({props:{stack:l[1]}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&2&&(r.stack=e[1]),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function En(l){let t,s,e,n;const r=[jn,Nn],a=[];function i(o,f){return o[2]==="stack"?0:1}return t=i(l),s=a[t]=r[t](l),{c(){s.c(),e=T()},l(o){s.l(o),e=T()},m(o,f){a[t].m(o,f),d(o,e,f),n=!0},p(o,f){let u=t;t=i(o),t===u?a[t].p(o,f):(U(),$(a[u],1,1,()=>{a[u]=null}),q(),s=a[t],s?s.p(o,f):(s=a[t]=r[t](o),s.c()),m(s,1),s.m(e.parentNode,e))},i(o){n||(m(s),n=!0)},o(o){$(s),n=!1},d(o){o&&c(e),a[t].d(o)}}}function An(l){let t,s;return t=new B({props:{keys:["message","stack"],$$slots:{item_value:[En,({key:e})=>({2:e}),({key:e})=>e?4:0],item_key:[Sn,({key:e})=>({2:e}),({key:e})=>e?4:0],preview:[wn],summary:[yn]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,[n]){const r={};n&15&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function Pn(l,t,s){let e,{value:n}=t;return l.$$set=r=>{"value"in r&&s(0,n=r.value)},l.$$.update=()=>{l.$$.dirty&1&&s(1,e=n.stack.split(` +`))},[n,e]}class On extends F{constructor(t){super(),J(this,t,Pn,An,L,{value:0})}}function Tn(l,t){const s=Object.prototype.toString.call(l).slice(8,-1);return s==="Object"?!t&&typeof l[Symbol.iterator]=="function"?"Iterable":l.constructor.name:s}function Cn(l){let t,s,e,n;return{c(){t=w("span"),s=b('"'),e=b(l[0]),n=b('"'),this.h()},l(r){t=y(r,"SPAN",{class:!0});var a=N(t);s=k(a,'"'),e=k(a,l[0]),n=k(a,'"'),a.forEach(c),this.h()},h(){v(t,"class","svelte-1fvwa9c")},m(r,a){d(r,t,a),g(t,s),g(t,e),g(t,n)},p(r,a){a&1&&O(e,r[0])},d(r){r&&c(t)}}}function In(l){let t,s,e=l[0].slice(0,30)+(l[0].length>30?"…":""),n,r;return{c(){t=w("span"),s=b('"'),n=b(e),r=b('"'),this.h()},l(a){t=y(a,"SPAN",{class:!0});var i=N(t);s=k(i,'"'),n=k(i,e),r=k(i,'"'),i.forEach(c),this.h()},h(){v(t,"class","svelte-1fvwa9c")},m(a,i){d(a,t,i),g(t,s),g(t,n),g(t,r)},p(a,i){i&1&&e!==(e=a[0].slice(0,30)+(a[0].length>30?"…":""))&&O(n,e)},d(a){a&&c(t)}}}function Mn(l){let t;function s(r,a){return r[1]==="summary"?In:Cn}let n=s(l)(l);return{c(){n.c(),t=T()},l(r){n.l(r),t=T()},m(r,a){n.m(r,a),d(r,t,a)},p(r,[a]){n.p(r,a)},i:K,o:K,d(r){r&&c(t),n.d(r)}}}function Ln(l,t,s){let e,{value:n}=t;const r={"\n":"\\n"," ":"\\t","\r":"\\r"},{displayMode:a}=R();return l.$$set=i=>{"value"in i&&s(2,n=i.value)},l.$$.update=()=>{l.$$.dirty&4&&s(0,e=n.replace(/[\n\t\r]/g,i=>r[i]))},[e,a,n]}class Fn extends F{constructor(t){super(),J(this,t,Ln,Mn,L,{value:2})}}function Jn(l){let t,s="ƒ";return{c(){t=w("span"),t.textContent=s,this.h()},l(e){t=y(e,"SPAN",{class:!0,"data-svelte-h":!0}),re(t)!=="svelte-migemc"&&(t.textContent=s),this.h()},h(){v(t,"class","i svelte-1eamqdt")},m(e,n){d(e,t,n)},p:K,d(e){e&&c(t)}}}function Be(l){let t,s=qe(l[2])+"",e;return{c(){t=w("span"),e=b(s),this.h()},l(n){t=y(n,"SPAN",{class:!0});var r=N(t);e=k(r,s),r.forEach(c),this.h()},h(){v(t,"class","fn i svelte-1eamqdt")},m(n,r){d(n,t,r),g(t,e)},p(n,r){r&4&&s!==(s=qe(n[2])+"")&&O(e,s)},d(n){n&&c(t)}}}function Ue(l){let t,s=Re(l[2])+"",e;return{c(){t=w("span"),e=b(s),this.h()},l(n){t=y(n,"SPAN",{class:!0});var r=N(t);e=k(r,s),r.forEach(c),this.h()},h(){v(t,"class","i svelte-1eamqdt")},m(n,r){d(n,t,r),g(t,e)},p(n,r){r&4&&s!==(s=Re(n[2])+"")&&O(e,s)},d(n){n&&c(t)}}}function Kn(l){let t,s,e=!l[2].isArrow&&Be(l),n=!l[2].isClass&&Ue(l);return{c(){e&&e.c(),t=T(),n&&n.c(),s=T()},l(r){e&&e.l(r),t=T(),n&&n.l(r),s=T()},m(r,a){e&&e.m(r,a),d(r,t,a),n&&n.m(r,a),d(r,s,a)},p(r,a){r[2].isArrow?e&&(e.d(1),e=null):e?e.p(r,a):(e=Be(r),e.c(),e.m(t.parentNode,t)),r[2].isClass?n&&(n.d(1),n=null):n?n.p(r,a):(n=Ue(r),n.c(),n.m(s.parentNode,s))},d(r){r&&(c(t),c(s)),e&&e.d(r),n&&n.d(r)}}}function Bn(l){let t,s=l[6]+"",e,n;return{c(){t=w("span"),e=b(s),this.h()},l(r){t=y(r,"SPAN",{class:!0});var a=N(t);e=k(a,s),a.forEach(c),this.h()},h(){v(t,"class",n=l[6]===oe||l[6]===ie?"internal":"property")},m(r,a){d(r,t,a),g(t,e)},p(r,a){a&64&&s!==(s=r[6]+"")&&O(e,s),a&64&&n!==(n=r[6]===oe||r[6]===ie?"internal":"property")&&v(t,"class",n)},d(r){r&&c(t)}}}function Un(l){let t,s;return t=new I({props:{value:l[3](l[6])}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&64&&(r.value=e[3](e[6])),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function qn(l){let t,s;return t=new ce({props:{value:l[3](l[6])}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&64&&(r.value=e[3](e[6])),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function Rn(l){let t,s;return{c(){t=w("span"),s=b(l[0]),this.h()},l(e){t=y(e,"SPAN",{class:!0});var n=N(t);s=k(n,l[0]),n.forEach(c),this.h()},h(){v(t,"class","i svelte-1eamqdt")},m(e,n){d(e,t,n),g(t,s)},p(e,n){n&1&&O(s,e[0])},i:K,o:K,d(e){e&&c(t)}}}function Vn(l){let t,s,e,n;const r=[Rn,qn,Un],a=[];function i(o,f){return o[6]===oe?0:o[6]==="prototype"?1:2}return t=i(l),s=a[t]=r[t](l),{c(){s.c(),e=T()},l(o){s.l(o),e=T()},m(o,f){a[t].m(o,f),d(o,e,f),n=!0},p(o,f){let u=t;t=i(o),t===u?a[t].p(o,f):(U(),$(a[u],1,1,()=>{a[u]=null}),q(),s=a[t],s?s.p(o,f):(s=a[t]=r[t](o),s.c()),m(s,1),s.m(e.parentNode,e))},i(o){n||(m(s),n=!0)},o(o){$(s),n=!1},d(o){o&&c(e),a[t].d(o)}}}function zn(l){let t,s;return t=new B({props:{keys:l[1],$$slots:{item_value:[Vn,({key:e})=>({6:e}),({key:e})=>e?64:0],item_key:[Bn,({key:e})=>({6:e}),({key:e})=>e?64:0],preview:[Kn],summary:[Jn]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,[n]){const r={};n&2&&(r.keys=e[1]),n&197&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}const oe="[[Function]]",ie="[[Prototype]]";function Gn(l){const t=l.match(/^(?:(async)\s+)?(?:function)?(\*)?\s*([^(]+)?(\([^)]*\))\s*(=>)?/),s=t==null?void 0:t[1],e=t==null?void 0:t[2],n=t==null?void 0:t[3],r=t==null?void 0:t[4],a=t==null?void 0:t[5],i=l.match(/^class\s+([^\s]+)/),o=i==null?void 0:i[1];return{args:r,isAsync:s,isGenerator:e,fnName:n,isArrow:a,isClass:o}}function qe({isGenerator:l,isAsync:t,isClass:s}){return s?`class ${s}`:(t?"async ":"")+"ƒ"+(l?"*":"")}function Re({isAsync:l,isArrow:t,fnName:s,args:e}){return(t&&l?"async":"")+" "+(s??"")+e+(t?" => …":"")}function Dn(l){try{return l.toString()}catch{switch(l.constructor.name){case"AsyncFunction":return"async function () {}";case"AsyncGeneratorFunction":return"async function * () {}";case"GeneratorFunction:":return"function * () {}";default:return"function () {}"}}}function Wn(l,t,s){let e,n,r,{value:a}=t;function i(f){return f===ie?a.__proto__:a[f]}function o(f){return f===oe?!0:i(f)}return l.$$set=f=>{"value"in f&&s(4,a=f.value)},l.$$.update=()=>{l.$$.dirty&16&&s(0,e=Dn(a)),l.$$.dirty&1&&s(2,n=Gn(e))},s(1,r=["length","name","prototype",oe,ie].filter(o)),[e,r,n,i,a]}class Hn extends F{constructor(t){super(),J(this,t,Wn,zn,L,{value:4})}}function Qn(l){let t,s=l[3]?"writable(":"readable(",e,n,r=")",a,i;return n=new I({props:{value:l[2]}}),{c(){t=w("span"),e=b(s),A(n.$$.fragment),a=b(r),this.h()},l(o){t=y(o,"SPAN",{class:!0});var f=N(t);e=k(f,s),P(n.$$.fragment,f),a=k(f,r),f.forEach(c),this.h()},h(){v(t,"class","label")},m(o,f){d(o,t,f),g(t,e),E(n,t,null),g(t,a),i=!0},p(o,f){(!i||f&8)&&s!==(s=o[3]?"writable(":"readable(")&&O(e,s);const u={};f&4&&(u.value=o[2]),n.$set(u)},i(o){i||(m(n.$$.fragment,o),i=!0)},o(o){$(n.$$.fragment,o),i=!1},d(o){o&&c(t),j(n)}}}function Xn(l){let t,s=l[10]+"",e,n,r=": ",a,i,o;return i=new I({props:{value:l[0][l[10]]}}),{c(){t=w("span"),e=b(s),n=w("span"),a=b(r),A(i.$$.fragment),this.h()},l(f){t=y(f,"SPAN",{class:!0});var u=N(t);e=k(u,s),u.forEach(c),n=y(f,"SPAN",{class:!0});var _=N(n);a=k(_,r),_.forEach(c),P(i.$$.fragment,f),this.h()},h(){v(t,"class","property"),v(n,"class","operator")},m(f,u){d(f,t,u),g(t,e),d(f,n,u),g(n,a),E(i,f,u),o=!0},p(f,u){(!o||u&1024)&&s!==(s=f[10]+"")&&O(e,s);const _={};u&1025&&(_.value=f[0][f[10]]),i.$set(_)},i(f){o||(m(i.$$.fragment,f),o=!0)},o(f){$(i.$$.fragment,f),o=!1},d(f){f&&(c(t),c(n)),j(i,f)}}}function Yn(l){let t,s;return t=new se({props:{list:l[4],hasMore:l[4].length({10:e}),({item:e})=>e?1024:0]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&16&&(r.list=e[4]),n&18&&(r.hasMore=e[4].length({8:e}),({key:e})=>e?256:0],item_key:[Zn,({key:e})=>({8:e}),({key:e})=>e?256:0],preview:[Yn,({root:e})=>({9:e}),({root:e})=>e?512:0],summary:[Qn]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,[n]){const r={};n&32&&(r.keys=e[5]),n&2847&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}const fe="$value";function ts(l,t,s){let e,n,r,a,i,o,f=K,u=()=>(f(),f=ze(_,h=>s(7,o=h)),_);l.$$.on_destroy.push(()=>f());let{value:_}=t;u();function p(h){return h===fe?a:_[h]}return l.$$set=h=>{"value"in h&&u(s(0,_=h.value))},l.$$.update=()=>{l.$$.dirty&1&&s(1,e=Object.getOwnPropertyNames(_)),l.$$.dirty&2&&s(5,n=[fe,...e]),l.$$.dirty&2&&s(4,r=e.slice(0,5)),l.$$.dirty&128&&s(2,a=o),l.$$.dirty&1&&s(3,i=typeof _.set=="function")},[_,e,a,i,r,n,p,o]}class ns extends F{constructor(t){super(),J(this,t,ts,es,L,{value:0})}}function ss(l){let t,s,e,n=l[0].length+"",r,a;return{c(){t=w("span"),s=b(l[1]),e=b("("),r=b(n),a=b(")"),this.h()},l(i){t=y(i,"SPAN",{class:!0});var o=N(t);s=k(o,l[1]),e=k(o,"("),r=k(o,n),a=k(o,")"),o.forEach(c),this.h()},h(){v(t,"class","label")},m(i,o){d(i,t,o),g(t,s),g(t,e),g(t,r),g(t,a)},p(i,o){o&2&&O(s,i[1]),o&1&&n!==(n=i[0].length+"")&&O(r,n)},d(i){i&&c(t)}}}function rs(l){let t,s;return t=new I({props:{value:l[8]}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&256&&(r.value=e[8]),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function ls(l){let t,s;return t=new se({props:{list:l[2],hasMore:l[2].length({8:e}),({item:e})=>e?256:0]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&4&&(r.list=e[2]),n&5&&(r.hasMore=e[2].length({6:e}),({key:e})=>e?64:0],item_key:[as,({key:e})=>({6:e}),({key:e})=>e?64:0],preview:[ls,({root:e})=>({7:e}),({root:e})=>e?128:0],summary:[ss]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,[n]){const r={};n&8&&(r.keys=e[3]),n&711&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}const Ve="Symbol(Symbol.toStringTag)";function fs(l,t,s){let e,n,{value:r}=t,{nodeType:a}=t;const i=["buffer","byteLength","byteOffset","length",Ve];function o(f){return f===Ve?r[Symbol.toStringTag]:r[f]}return l.$$set=f=>{"value"in f&&s(0,r=f.value),"nodeType"in f&&s(1,a=f.nodeType)},l.$$.update=()=>{l.$$.dirty&1&&s(3,e=[...Object.getOwnPropertyNames(r),...i]),l.$$.dirty&1&&s(2,n=r.slice(0,5))},[r,a,n,e,i,o]}class us extends F{constructor(t){super(),J(this,t,fs,is,L,{value:0,nodeType:1})}}function cs(l){let t,s;return{c(){t=w("span"),s=b(l[1]),this.h()},l(e){t=y(e,"SPAN",{class:!0});var n=N(t);s=k(n,l[1]),n.forEach(c),this.h()},h(){v(t,"class","regex svelte-17k1wqt")},m(e,n){d(e,t,n),g(t,s)},p(e,n){n&2&&O(s,e[1])},d(e){e&&c(t)}}}function _s(l){let t,s;return{c(){t=w("span"),s=b(l[1]),this.h()},l(e){t=y(e,"SPAN",{class:!0});var n=N(t);s=k(n,l[1]),n.forEach(c),this.h()},h(){v(t,"class","regex svelte-17k1wqt")},m(e,n){d(e,t,n),g(t,s)},p(e,n){n&2&&O(s,e[1])},d(e){e&&c(t)}}}function ps(l){let t,s=String(l[3])+"",e;return{c(){t=w("span"),e=b(s),this.h()},l(n){t=y(n,"SPAN",{class:!0});var r=N(t);e=k(r,s),r.forEach(c),this.h()},h(){v(t,"class","internal")},m(n,r){d(n,t,r),g(t,e)},p(n,r){r&8&&s!==(s=String(n[3])+"")&&O(e,s)},d(n){n&&c(t)}}}function ms(l){let t,s;return t=new I({props:{value:l[0][l[3]]}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,n){const r={};n&9&&(r.value=e[0][e[3]]),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function hs(l){let t,s;return t=new B({props:{keys:l[2],$$slots:{item_value:[ms,({key:e})=>({3:e}),({key:e})=>e?8:0],item_key:[ps,({key:e})=>({3:e}),({key:e})=>e?8:0],preview:[_s],summary:[cs]},$$scope:{ctx:l}}}),{c(){A(t.$$.fragment)},l(e){P(t.$$.fragment,e)},m(e,n){E(t,e,n),s=!0},p(e,[n]){const r={};n&27&&(r.$$scope={dirty:n,ctx:e}),t.$set(r)},i(e){s||(m(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){j(t,e)}}}function $s(l,t,s){let e,{value:n}=t;const r=["lastIndex","dotAll","flags","global","hasIndices","ignoreCase","multiline","source","sticky","unicode"];return l.$$set=a=>{"value"in a&&s(0,n=a.value)},l.$$.update=()=>{l.$$.dirty&1&&s(1,e=n.toString())},[n,e,r]}class ds extends F{constructor(t){super(),J(this,t,$s,hs,L,{value:0})}}function gs(l){let t,s,e;const n=[{value:l[0]},l[1]];var r=l[2];function a(i,o){let f={};for(let u=0;u{j(f,1)}),q()}r?(t=me(r,a(i,o)),A(t.$$.fragment),m(t.$$.fragment,1),E(t,s.parentNode,s)):t=null}else if(r){const f=o&3?$e(n,[o&1&&{value:i[0]},o&2&&de(i[1])]):{};t.$set(f)}},i(i){e||(t&&m(t.$$.fragment,i),e=!0)},o(i){t&&$(t.$$.fragment,i),e=!1},d(i){i&&c(s),t&&j(t,i)}}}function vs(l,t,s){let e,n,r,{value:a}=t;const i=ue();x(l,i,u=>s(4,r=u));const{shouldTreatIterableAsObject:o}=R();function f(u,_){switch(u){case"Object":return typeof _.subscribe=="function"?[ns]:[ce];case"Error":return[On];case"Array":return[Ut];case"Map":return[mn];case"Iterable":case"Set":return[Zt,{nodeType:u}];case"Number":return[W,{nodeType:u}];case"String":return[Fn];case"Boolean":return[W,{nodeType:u,value:_?"true":"false"}];case"Date":return[W,{nodeType:u,value:_.toISOString()}];case"Null":return[W,{nodeType:u,value:"null"}];case"Undefined":return[W,{nodeType:u,value:"undefined"}];case"Function":case"AsyncFunction":case"AsyncGeneratorFunction":case"GeneratorFunction":return[Hn];case"Symbol":return[W,{nodeType:u,value:_.toString()}];case"BigInt":return[W,{nodeType:u,value:String(_)+"n"}];case"ArrayBuffer":return[W,{nodeType:u,value:`ArrayBuffer(${_.byteLength})`}];case"BigInt64Array":case"BigUint64Array":case"Float32Array":case"Float64Array":case"Int8Array":case"Int16Array":case"Int32Array":case"Uint8Array":case"Uint8ClampedArray":case"Uint16Array":case"Uint32Array":return[us,{nodeType:u}];case"RegExp":return[ds];default:return[ce,{summary:u}]}}return l.$$set=u=>{"value"in u&&s(0,a=u.value)},l.$$.update=()=>{l.$$.dirty&1&&ee(i,r=Tn(a,o),r),l.$$.dirty&17&&s(2,[e,n]=f(r,a),e,(s(1,n),s(4,r),s(0,a)))},[a,n,e,i,r]}class I extends F{constructor(t){super(),J(this,t,vs,gs,L,{value:0})}}function ks({defaultExpandedPaths:l,defaultExpandedLevel:t}){const s=l.map(n=>n.split("."));function e(n){e:for(const r of s){if(n.length>r.length)continue;const a=Math.min(n.length,r.length);for(let i=0;ie(u),level:0,keyPath:[],showPreview:r,shouldTreatIterableAsObject:a}),l.$$set=u=>{"value"in u&&s(0,n=u.value),"shouldShowPreview"in u&&s(2,r=u.shouldShowPreview),"shouldTreatIterableAsObject"in u&&s(3,a=u.shouldTreatIterableAsObject),"defaultExpandedPaths"in u&&s(4,i=u.defaultExpandedPaths),"defaultExpandedLevel"in u&&s(5,o=u.defaultExpandedLevel)},l.$$.update=()=>{l.$$.dirty&48&&(e=ks({defaultExpandedPaths:i,defaultExpandedLevel:o}))},[n,f,r,a,i,o]}class Ss extends F{constructor(t){super(),J(this,t,ws,ys,L,{value:0,shouldShowPreview:2,shouldTreatIterableAsObject:3,defaultExpandedPaths:4,defaultExpandedLevel:5})}}function Ns(l){let t,s,e,n;return s=new Ss({props:{value:l[0],defaultExpandedLevel:l[2]}}),{c(){t=w("div"),e=w("div"),A(s.$$.fragment),this.h()},l(r){t=y(r,"DIV",{class:!0});var a=N(t);e=y(a,"DIV",{style:!0});var i=N(e);P(s.$$.fragment,i),a.forEach(c),this.h()},h(){z(e,"display","contents"),z(e,"--json-tree-font-size","16px"),z(e,"--json-tree-li-line-height","1.7"),z(e,"--json-tree-font-family","monospace"),z(e,"--json-tree-string-color","var(--color-text)"),z(e,"--json-tree-label-color","var(--color-interaction)"),z(e,"--json-tree-property-color","var(--color-interaction)"),z(e,"--json-tree-number-color","var(--color-text-secondary)"),z(e,"--json-tree-boolean-color","var(--color-text-secondary)"),v(t,"class","svelte-1ajfzk1"),H(t,"showFullLines",l[1])},m(r,a){d(r,t,a),g(t,e),E(s,e,null),n=!0},p(r,[a]){const i={};a&1&&(i.value=r[0]),a&4&&(i.defaultExpandedLevel=r[2]),s.$set(i),(!n||a&2)&&H(t,"showFullLines",r[1])},i(r){n||(m(s.$$.fragment,r),n=!0)},o(r){$(s.$$.fragment,r),n=!1},d(r){r&&c(t),j(s)}}}function js(l,t,s){let{value:e}=t,{showFullLines:n=!1}=t,{expandedLines:r=2}=t;return l.$$set=a=>{"value"in a&&s(0,e=a.value),"showFullLines"in a&&s(1,n=a.showFullLines),"expandedLines"in a&&s(2,r=a.expandedLines)},[e,n,r]}class Ts extends F{constructor(t){super(),J(this,t,js,Ns,L,{value:0,showFullLines:1,expandedLines:2})}}export{Ts as J}; diff --git a/gui/next/build/_app/immutable/chunks/BVq9mvWR.js b/gui/next/build/_app/immutable/chunks/BVq9mvWR.js new file mode 100644 index 0000000..b20ffb2 --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/BVq9mvWR.js @@ -0,0 +1,2 @@ +import{s as r,n as a,d as l,i as c,w as i,c as h,z as u,h as m}from"./Ul9VwQ7n.js";import{S as d,i as w}from"./Bh3MJlbi.js";function f(n){let e,s=`Use with caution + This view allows direct changing of database records via the GraphQL layer, which can be useful for projects with custom platformOS features. It may allow changes which are not 100% compatible with the Siteglide Admin, so we recommend using with caution.`;return{c(){e=m("aside"),e.innerHTML=s,this.h()},l(t){e=h(t,"ASIDE",{class:!0,role:!0,"data-svelte-h":!0}),u(e)!=="svelte-1479l1"&&(e.innerHTML=s),this.h()},h(){i(e,"class","caution svelte-w5xay3"),i(e,"role","note")},m(t,o){c(t,e,o)},p:a,i:a,o:a,d(t){t&&l(e)}}}class v extends d{constructor(e){super(),w(this,e,null,f,r,{})}}export{v as C}; diff --git a/gui/next/build/_app/immutable/chunks/Bg88RIi0.js b/gui/next/build/_app/immutable/chunks/Bg88RIi0.js new file mode 100644 index 0000000..5fd2ec8 --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/Bg88RIi0.js @@ -0,0 +1 @@ +import{s as x,d as p,r as $,a as F,w as u,A as G,B as y,C as H,i as ee,b,D as S,E as j,c as D,e as U,f as V,g as O,h as A,t as z,j as R,F as ae,G as J,H as ne}from"./Ul9VwQ7n.js";import{S as te,i as se,d as K,t as M,a as Q,m as W,c as X,b as Y}from"./Bh3MJlbi.js";import{I as Z}from"./D-yR0E5w.js";function ie(n){let l,t,h,d,w,c,g,f,L,s,I,r,_,T,E,m,N,k,o,B,C;return c=new Z({props:{icon:n[6]==="navigation"?"arrowLeft":"minus"}}),m=new Z({props:{icon:n[6]==="navigation"?"arrowRight":"minus"}}),{c(){l=A("div"),t=A("button"),h=A("span"),d=z(n[7]),w=R(),Y(c.$$.fragment),L=R(),s=A("input"),I=R(),r=A("button"),_=A("span"),T=z(n[8]),E=R(),Y(m.$$.fragment),this.h()},l(e){l=D(e,"DIV",{class:!0});var i=U(l);t=D(i,"BUTTON",{form:!0,class:!0,"aria-hidden":!0,"data-action":!0});var a=U(t);h=D(a,"SPAN",{class:!0});var P=U(h);d=V(P,n[7]),P.forEach(p),w=O(a),X(c.$$.fragment,a),a.forEach(p),L=O(i),s=D(i,"INPUT",{form:!0,type:!0,name:!0,id:!0,min:!0,max:!0,step:!0,style:!0,class:!0}),I=O(i),r=D(i,"BUTTON",{form:!0,class:!0,"aria-hidden":!0,"data-action":!0});var v=U(r);_=D(v,"SPAN",{class:!0});var q=U(_);T=V(q,n[8]),q.forEach(p),E=O(v),X(m.$$.fragment,v),v.forEach(p),i.forEach(p),this.h()},h(){var e;u(h,"class","label"),u(t,"form",n[1]),u(t,"class","button svelte-142ypws"),t.disabled=g=n[0]<=n[3],u(t,"aria-hidden",f=n[0]<=n[3]),u(t,"data-action","numberDecrease"),u(s,"form",n[1]),u(s,"type","number"),u(s,"name",n[2]),u(s,"id",n[2]),u(s,"min",n[3]),u(s,"max",n[4]),u(s,"step",n[5]),s.autofocus=n[9],G(s,"--max",(((e=n[4])==null?void 0:e.toString().length)||1)+"ch"),u(s,"class","svelte-142ypws"),u(_,"class","label"),u(r,"form",n[1]),u(r,"class","button svelte-142ypws"),r.disabled=N=n[0]>=n[4],u(r,"aria-hidden",k=n[0]>=n[4]),u(r,"data-action","numberIncrease"),u(l,"class","number svelte-142ypws")},m(e,i){ee(e,l,i),b(l,t),b(t,h),b(h,d),b(t,w),W(c,t,null),b(l,L),b(l,s),H(s,n[0]),b(l,I),b(l,r),b(r,_),b(_,T),b(r,E),W(m,r,null),n[17](r),o=!0,n[9]&&s.focus(),B||(C=[S(t,"click",j(n[12])),S(s,"input",n[13]),S(s,"input",j(n[14])),S(s,"focusin",n[15]),S(s,"focusout",n[16]),S(r,"click",j(n[18]))],B=!0)},p(e,[i]){var v;(!o||i&128)&&F(d,e[7]);const a={};i&64&&(a.icon=e[6]==="navigation"?"arrowLeft":"minus"),c.$set(a),(!o||i&2)&&u(t,"form",e[1]),(!o||i&9&&g!==(g=e[0]<=e[3]))&&(t.disabled=g),(!o||i&9&&f!==(f=e[0]<=e[3]))&&u(t,"aria-hidden",f),(!o||i&2)&&u(s,"form",e[1]),(!o||i&4)&&u(s,"name",e[2]),(!o||i&4)&&u(s,"id",e[2]),(!o||i&8)&&u(s,"min",e[3]),(!o||i&16)&&u(s,"max",e[4]),(!o||i&32)&&u(s,"step",e[5]),(!o||i&512)&&(s.autofocus=e[9]),(!o||i&16)&&G(s,"--max",(((v=e[4])==null?void 0:v.toString().length)||1)+"ch"),i&1&&y(s.value)!==e[0]&&H(s,e[0]),(!o||i&256)&&F(T,e[8]);const P={};i&64&&(P.icon=e[6]==="navigation"?"arrowRight":"minus"),m.$set(P),(!o||i&2)&&u(r,"form",e[1]),(!o||i&17&&N!==(N=e[0]>=e[4]))&&(r.disabled=N),(!o||i&17&&k!==(k=e[0]>=e[4]))&&u(r,"aria-hidden",k)},i(e){o||(Q(c.$$.fragment,e),Q(m.$$.fragment,e),o=!0)},o(e){M(c.$$.fragment,e),M(m.$$.fragment,e),o=!1},d(e){e&&p(l),K(c),K(m),n[17](null),B=!1,$(C)}}}function ue(n,l,t){let{form:h}=l,{name:d}=l,{min:w=1}=l,{max:c}=l,{step:g=1}=l,{value:f=""}=l,{style:L}=l,{decreaseLabel:s=`Decrease ${d} value`}=l,{increaseLabel:I=`Increase ${d} value`}=l,r=!1,_;const T=ae();let E;function m(a){clearTimeout(E),E=setTimeout(()=>{a.submitter=_,T("input",a)},150)}const N=async a=>{t(0,f=parseInt(f)-1),await J(),m(a)};function k(){f=y(this.value),t(0,f)}const o=a=>m(a),B=()=>t(9,r=!0),C=()=>t(9,r=!1);function e(a){ne[a?"unshift":"push"](()=>{_=a,t(10,_)})}const i=async a=>{t(0,f=parseInt(f)+1),await J(),m(a)};return n.$$set=a=>{"form"in a&&t(1,h=a.form),"name"in a&&t(2,d=a.name),"min"in a&&t(3,w=a.min),"max"in a&&t(4,c=a.max),"step"in a&&t(5,g=a.step),"value"in a&&t(0,f=a.value),"style"in a&&t(6,L=a.style),"decreaseLabel"in a&&t(7,s=a.decreaseLabel),"increaseLabel"in a&&t(8,I=a.increaseLabel)},[f,h,d,w,c,g,L,s,I,r,_,m,N,k,o,B,C,e,i]}class fe extends te{constructor(l){super(),se(this,l,ue,ie,x,{form:1,name:2,min:3,max:4,step:5,value:0,style:6,decreaseLabel:7,increaseLabel:8})}}export{fe as N}; diff --git a/gui/next/build/_app/immutable/chunks/Bh3MJlbi.js b/gui/next/build/_app/immutable/chunks/Bh3MJlbi.js new file mode 100644 index 0000000..b09453f --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/Bh3MJlbi.js @@ -0,0 +1,4 @@ +var H=Object.defineProperty;var K=(t,e,n)=>e in t?H(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var z=(t,e,n)=>K(t,typeof e!="symbol"?e+"":e,n);import{n as v,a1 as T,a2 as W,d as D,r as O,X as k,q as F,J as C,a3 as Y,a4 as Z,a5 as tt,a6 as q,e as et,R as nt,Q as B,a7 as it,a8 as st,a9 as rt,aa as at,ab as ot,ac as ft}from"./Ul9VwQ7n.js";const J=typeof window<"u";let L=J?()=>window.performance.now():()=>Date.now(),N=J?t=>requestAnimationFrame(t):v;const x=new Set;function Q(t){x.forEach(e=>{e.c(t)||(x.delete(e),e.f())}),x.size!==0&&N(Q)}function U(t){let e;return x.size===0&&N(Q),{promise:new Promise(n=>{x.add(e={c:t,f:n})}),abort(){x.delete(e)}}}const M=new Map;let P=0;function ut(t){let e=5381,n=t.length;for(;n--;)e=(e<<5)-e^t.charCodeAt(n);return e>>>0}function lt(t,e){const n={stylesheet:W(e),rules:{}};return M.set(t,n),n}function A(t,e,n,i,l,o,u,s=0){const c=16.666/i;let r=`{ +`;for(let _=0;_<=1;_+=c){const g=e+(n-e)*o(_);r+=_*100+`%{${u(g,1-g)}} +`}const $=r+`100% {${u(n,1-n)}} +}`,f=`__svelte_${ut($)}_${s}`,m=T(t),{stylesheet:h,rules:a}=M.get(m)||lt(m,t);a[f]||(a[f]=!0,h.insertRule(`@keyframes ${f} ${$}`,h.cssRules.length));const d=t.style.animation||"";return t.style.animation=`${d?`${d}, `:""}${f} ${i}ms linear ${l}ms 1 both`,P+=1,f}function I(t,e){const n=(t.style.animation||"").split(", "),i=n.filter(e?o=>o.indexOf(e)<0:o=>o.indexOf("__svelte")===-1),l=n.length-i.length;l&&(t.style.animation=i.join(", "),P-=l,P||ct())}function ct(){N(()=>{P||(M.forEach(t=>{const{ownerNode:e}=t.stylesheet;e&&D(e)}),M.clear())})}let E;function V(){return E||(E=Promise.resolve(),E.then(()=>{E=null})),E}function S(t,e,n){t.dispatchEvent(Y(`${e?"intro":"outro"}${n}`))}const j=new Set;let p;function yt(){p={r:0,c:[],p}}function wt(){p.r||O(p.c),p=p.p}function dt(t,e){t&&t.i&&(j.delete(t),t.i(e))}function xt(t,e,n,i){if(t&&t.o){if(j.has(t))return;j.add(t),p.c.push(()=>{j.delete(t),i&&(n&&t.d(1),i())}),t.o(e)}else i&&i()}const X={duration:0};function vt(t,e,n){const i={direction:"in"};let l=e(t,n,i),o=!1,u,s,c=0;function r(){u&&I(t,u)}function $(){const{delay:m=0,duration:h=300,easing:a=F,tick:d=v,css:_}=l||X;_&&(u=A(t,0,1,h,m,a,_,c++)),d(0,1);const g=L()+m,b=g+h;s&&s.abort(),o=!0,C(()=>S(t,!0,"start")),s=U(y=>{if(o){if(y>=b)return d(1,0),S(t,!0,"end"),r(),o=!1;if(y>=g){const w=a((y-g)/h);d(w,1-w)}}return o})}let f=!1;return{start(){f||(f=!0,I(t),k(l)?(l=l(i),V().then($)):$())},invalidate(){f=!1},end(){o&&(r(),o=!1)}}}function bt(t,e,n,i){let o=e(t,n,{direction:"both"}),u=i?0:1,s=null,c=null,r=null,$;function f(){r&&I(t,r)}function m(a,d){const _=a.b-u;return d*=Math.abs(_),{a:u,b:a.b,d:_,duration:d,start:a.start,end:a.start+d,group:a.group}}function h(a){const{delay:d=0,duration:_=300,easing:g=F,tick:b=v,css:y}=o||X,w={start:L()+d,b:a};a||(w.group=p,p.r+=1),"inert"in t&&(a?$!==void 0&&(t.inert=$):($=t.inert,t.inert=!0)),s||c?c=w:(y&&(f(),r=A(t,u,a,_,d,g,y)),a&&b(0,1),s=m(w,_),C(()=>S(t,a,"start")),U(R=>{if(c&&R>c.start&&(s=m(c,_),c=null,S(t,s.b,"start"),y&&(f(),r=A(t,u,s.b,s.duration,0,g,o.css))),s){if(R>=s.end)b(u=s.b,1-u),S(t,s.b,"end"),c||(s.b?f():--s.group.r||O(s.group.c)),s=null;else if(R>=s.start){const G=R-s.start;u=s.a+s.d*g(G/s.duration),b(u,1-u)}}return!!(s||c)}))}return{run(a){k(o)?V().then(()=>{o=o({direction:a?"in":"out"}),h(a)}):h(a)},end(){f(),s=c=null}}}function Et(t,e,n){const i=t.$$.props[e];i!==void 0&&(t.$$.bound[i]=n,n(t.$$.ctx[i]))}function St(t){t&&t.c()}function Ot(t,e){t&&t.l(e)}function _t(t,e,n){const{fragment:i,after_update:l}=t.$$;i&&i.m(e,n),C(()=>{const o=t.$$.on_mount.map(st).filter(k);t.$$.on_destroy?t.$$.on_destroy.push(...o):O(o),t.$$.on_mount=[]}),l.forEach(C)}function $t(t,e){const n=t.$$;n.fragment!==null&&(it(n.after_update),O(n.on_destroy),n.fragment&&n.fragment.d(e),n.on_destroy=n.fragment=null,n.ctx=[])}function ht(t,e){t.$$.dirty[0]===-1&&(ot.push(t),ft(),t.$$.dirty.fill(0)),t.$$.dirty[e/31|0]|=1<{const a=h.length?h[0]:m;return r.ctx&&l(r.ctx[f],r.ctx[f]=a)&&(!r.skip_bound&&r.bound[f]&&r.bound[f](a),$&&ht(t,f)),m}):[],r.update(),$=!0,O(r.before_update),r.fragment=i?i(r.ctx):!1,e.target){if(e.hydrate){rt();const f=et(e.target);r.fragment&&r.fragment.l(f),f.forEach(D)}else r.fragment&&r.fragment.c();e.intro&&dt(t.$$.fragment),_t(t,e.target,e.anchor),at(),nt()}B(c)}class jt{constructor(){z(this,"$$");z(this,"$$set")}$destroy(){$t(this,1),this.$destroy=v}$on(e,n){if(!k(n))return v;const i=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return i.push(n),()=>{const l=i.indexOf(n);l!==-1&&i.splice(l,1)}}$set(e){this.$$set&&!Z(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}const mt="4";typeof window<"u"&&(window.__svelte||(window.__svelte={v:new Set})).v.add(mt);export{jt as S,dt as a,St as b,Ot as c,$t as d,wt as e,bt as f,yt as g,vt as h,Rt as i,Et as j,_t as m,xt as t}; diff --git a/gui/next/build/_app/immutable/chunks/BkeFH9yg.js b/gui/next/build/_app/immutable/chunks/BkeFH9yg.js new file mode 100644 index 0000000..9283bc2 --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/BkeFH9yg.js @@ -0,0 +1 @@ +const p={array:"value_array",boolean:"value_boolean",date:"value",datetime:"value",float:"value_float",integer:"value_int",string:"value",text:"value",upload:"value",json:"value_json"},c={string:"String",integer:"Int",float:"Float",boolean:"Boolean",array:"[String!]",json:"JSONPayload",range:"RangeFilter"},g=l=>{const s=l.entries();let n="",o={},i="",t={};function f(e,r){return r===""?null:e==="integer"?parseInt(r):e==="float"?parseFloat(r):e==="boolean"?r==="true":e==="array"||e==="json"?JSON.parse(r):r}for(const[e,r]of s)if(e.indexOf("[")>=0){let a=e.slice(0,e.indexOf("[")),u=e.slice(e.indexOf("[")+1,e.indexOf("]"));(t[a]??(t[a]={}))[u]=r}for(const e in t)n+=`, $${e}: ${c[t[e].type]||"String"}`,o[e]=f(t[e].type,t[e].value),i+=`{ name: "${e}", ${p[t[e].type]}: $${e} }`;return n.length&&(n=n.slice(2),n=`(${n})`),{variablesDefinition:n,variables:o,properties:i}};export{g as b,c}; diff --git a/gui/next/build/_app/immutable/chunks/C5zjxmar.js b/gui/next/build/_app/immutable/chunks/C5zjxmar.js new file mode 100644 index 0000000..79499db --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/C5zjxmar.js @@ -0,0 +1 @@ +import{s as e}from"./bH_aOImW.js";const r=()=>{const s=e;return{page:{subscribe:s.page.subscribe},navigating:{subscribe:s.navigating.subscribe},updated:s.updated}},b={subscribe(s){return r().page.subscribe(s)}};export{b as p}; diff --git a/gui/next/build/_app/immutable/chunks/CIy9Z9Qf.js b/gui/next/build/_app/immutable/chunks/CIy9Z9Qf.js new file mode 100644 index 0000000..b09dc89 --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/CIy9Z9Qf.js @@ -0,0 +1,54 @@ +import{g as o}from"./BD1m7lx9.js";const _={get:async e=>{let t="";e!=null&&e.id&&(t=`id: { value: "${e.id}" }`);let a="";e!=null&&e.type&&(a=`type: ${e.type}`);const r=` + query { + admin_background_jobs( + per_page: 20, + page: ${(e==null?void 0:e.page)||1} + filter: { + ${t} + ${a} + } + ) { + has_next_page, + has_previous_page, + total_pages, + results { + id + arguments + attempts + created_at + dead_at + error + error_class + error_message + failed_at + form_configuration_name + form_name + id + label + liquid_body + partial_name + locked_at + queue + resource_id + resource_type + retry_at + run_at + source_name + source_type + started_at + updated_at + } + } + }`;return o({query:r}).then(d=>d.admin_background_jobs)},delete:async e=>{const r=` + mutation { + admin_background_job_delete(id: "${Object.fromEntries(e.properties.entries()).id}") { + id + } + } + `;return o({query:r})},retry:async e=>{const r=` + mutation { + admin_background_job_retry(id: "${Object.fromEntries(e.properties.entries()).id}"){ + id + } + } + `;return o({query:r})}};export{_ as b}; diff --git a/gui/next/build/_app/immutable/chunks/CNoDK8-a.js b/gui/next/build/_app/immutable/chunks/CNoDK8-a.js new file mode 100644 index 0000000..8ccecdf --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/CNoDK8-a.js @@ -0,0 +1,57 @@ +import{g as n}from"./BD1m7lx9.js";import{b as s}from"./BkeFH9yg.js";const p={get:async(e={})=>{let r="",a="";e.value&&(e.attribute==="email"?r+=`${e.attribute}: { contains: "${e.value}" }`:r+=`${e.attribute}: { value: "${e.value}" }`,(e==null?void 0:e.attribute)==="id"&&(e!=null&&e.value)&&(a=` + deleted_at + created_at + external_id + jwt_token + temporary_token + name + first_name + middle_name + last_name + slug + language + `));const t=` + query { + users( + page: ${(e==null?void 0:e.page)??1} + per_page: 50 + sort: { id: { order: DESC } } + filter: { + ${r} + } + ) { + current_page + total_pages + results { + id + email + ${a} + properties + } + } + }`;return n({query:t}).then(u=>u.users)},delete:async e=>{const r=` + mutation { + user_delete(id: ${e}){ id } + } + `;return n({query:r})},create:async(e,r,a)=>{const t=s(a),u=` + mutation${t.variablesDefinition} { + user: user_create(user: { email: "${e}", password: "${r}", properties: [${t.properties}] }) { + id + } + } + `;return n({query:u,variables:t.variables})},edit:async(e,r,a)=>{const t=s(a),u=` + mutation${t.variablesDefinition} { + user_update(user: { email: "${r}", properties: [${t.properties}] }, id: ${e}) { + id + } + } + `;return n({query:u,variables:t.variables})},getCustomProperties:async()=>n({query:` + query { + admin_user_schema { + properties { + attribute_type + name + } + } + } + `}).then(r=>r.admin_user_schema.properties)};export{p as u}; diff --git a/gui/next/build/_app/immutable/chunks/CS29TWE_.js b/gui/next/build/_app/immutable/chunks/CS29TWE_.js new file mode 100644 index 0000000..5c7c090 --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/CS29TWE_.js @@ -0,0 +1 @@ +const o=typeof window<"u"?window:typeof globalThis<"u"?globalThis:global;function e(n){return--n*n*n*n*n+1}export{o as g,e as q}; diff --git a/gui/next/build/_app/immutable/chunks/Cpu2L2kn.js b/gui/next/build/_app/immutable/chunks/Cpu2L2kn.js new file mode 100644 index 0000000..50dfa81 --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/Cpu2L2kn.js @@ -0,0 +1 @@ +import{t as G}from"./x4PJc0Qf.js";import{s as Y,d as m,K as H,i as g,w as f,c as j,e as D,h as E,n as M,r as R,a as O,b as C,D as y,g as I,f as q,j as S,t as K,V as Z,J as $}from"./Ul9VwQ7n.js";import{S as x,i as ee,t as A,a as P,g as W,e as X,d as le,h as ae,m as ue,c as te,b as ne}from"./Bh3MJlbi.js";import{f as se}from"./odGh2V91.js";import{I as ie}from"./D-yR0E5w.js";const me=(e,l)=>{const a=n=>{n.composedPath().includes(e)||l(n)};return document.addEventListener("mousedown",a),{destroy(){document.removeEventListener("mousedown",a)}}},pe=(e,l)=>{let a={value:e,type:l};return e==null?(a.value=null,a.type="null",{...a}):(l==="boolean"&&(e===!0?a.value="true":a.value="false"),typeof e=="object"?(a.value=e,a.type="json",{...a}):G(e)?(a.value=G(e),a.type="jsonEscaped",{...a}):{...a,original:{value:e,type:l}})};function oe(e){let l,a=e[2][0].label+"",n,i,o,r,_,v,h,p,t,w,L,s=e[0]===e[2][0].value&&Q();return{c(){l=E("label"),n=K(a),i=S(),s&&s.c(),r=S(),_=E("input"),this.h()},l(c){l=j(c,"LABEL",{for:!0,class:!0});var b=D(l);n=q(b,a),i=I(b),s&&s.l(b),b.forEach(m),r=I(c),_=j(c,"INPUT",{type:!0,name:!0,id:!0,class:!0}),this.h()},h(){f(l,"for",o="toggle-"+e[1]+"-"+e[2][0].value),f(l,"class","svelte-1j5d7bb"),f(_,"type","checkbox"),f(_,"name",e[1]),_.value=v=e[2][0].value,f(_,"id",h="toggle-"+e[1]+"-"+e[2][0].value),_.checked=p=e[0]===e[2][0].value,f(_,"class","svelte-1j5d7bb")},m(c,b){g(c,l,b),C(l,n),C(l,i),s&&s.m(l,null),g(c,r,b),g(c,_,b),t=!0,w||(L=[y(_,"keydown",e[6]),y(_,"change",e[7]),y(_,"change",e[3])],w=!0)},p(c,b){(!t||b&4)&&a!==(a=c[2][0].label+"")&&O(n,a),c[0]===c[2][0].value?s?b&5&&P(s,1):(s=Q(),s.c(),P(s,1),s.m(l,null)):s&&(W(),A(s,1,1,()=>{s=null}),X()),(!t||b&6&&o!==(o="toggle-"+c[1]+"-"+c[2][0].value))&&f(l,"for",o),(!t||b&2)&&f(_,"name",c[1]),(!t||b&4&&v!==(v=c[2][0].value))&&(_.value=v),(!t||b&6&&h!==(h="toggle-"+c[1]+"-"+c[2][0].value))&&f(_,"id",h),(!t||b&5&&p!==(p=c[0]===c[2][0].value))&&(_.checked=p)},i(c){t||(P(s),t=!0)},o(c){A(s),t=!1},d(c){c&&(m(l),m(r),m(_)),s&&s.d(),w=!1,R(L)}}}function fe(e){let l,a,n,i,o,r,_=e[2][0].label+"",v,h,p,t,w,L,s,c,b,B,N,k,T=e[2][1].label+"",U,V,J,z;return{c(){l=E("input"),o=S(),r=E("label"),v=K(_),p=S(),t=E("label"),L=S(),s=E("input"),N=S(),k=E("label"),U=K(T),this.h()},l(u){l=j(u,"INPUT",{type:!0,name:!0,id:!0,class:!0}),o=I(u),r=j(u,"LABEL",{for:!0,class:!0});var d=D(r);v=q(d,_),d.forEach(m),p=I(u),t=j(u,"LABEL",{for:!0,class:!0}),D(t).forEach(m),L=I(u),s=j(u,"INPUT",{type:!0,name:!0,id:!0,class:!0}),N=I(u),k=j(u,"LABEL",{for:!0,class:!0});var F=D(k);U=q(F,T),F.forEach(m),this.h()},h(){f(l,"type","radio"),f(l,"name",e[1]),l.value=a=e[2][0].value,l.checked=n=e[0]===e[2][0].value,f(l,"id",i="toggle-"+e[1]+"-"+e[2][0].value),f(l,"class","svelte-1j5d7bb"),f(r,"for",h="toggle-"+e[1]+"-"+e[2][0].value),f(r,"class","svelte-1j5d7bb"),f(t,"for",w="toggle-"+e[1]+"-"+(e[0]===e[2][0].value?e[2][1].value:e[2][0].value)),f(t,"class","switcher svelte-1j5d7bb"),f(s,"type","radio"),f(s,"name",e[1]),s.value=c=e[2][1].value,s.checked=b=e[0]===e[2][1].value,f(s,"id",B="toggle-"+e[1]+"-"+e[2][1].value),f(s,"class","svelte-1j5d7bb"),f(k,"for",V="toggle-"+e[1]+"-"+e[2][1].value),f(k,"class","svelte-1j5d7bb")},m(u,d){g(u,l,d),g(u,o,d),g(u,r,d),C(r,v),g(u,p,d),g(u,t,d),g(u,L,d),g(u,s,d),g(u,N,d),g(u,k,d),C(k,U),J||(z=[y(l,"keydown",e[4]),y(s,"keydown",e[5])],J=!0)},p(u,d){d&2&&f(l,"name",u[1]),d&4&&a!==(a=u[2][0].value)&&(l.value=a),d&5&&n!==(n=u[0]===u[2][0].value)&&(l.checked=n),d&6&&i!==(i="toggle-"+u[1]+"-"+u[2][0].value)&&f(l,"id",i),d&4&&_!==(_=u[2][0].label+"")&&O(v,_),d&6&&h!==(h="toggle-"+u[1]+"-"+u[2][0].value)&&f(r,"for",h),d&7&&w!==(w="toggle-"+u[1]+"-"+(u[0]===u[2][0].value?u[2][1].value:u[2][0].value))&&f(t,"for",w),d&2&&f(s,"name",u[1]),d&4&&c!==(c=u[2][1].value)&&(s.value=c),d&5&&b!==(b=u[0]===u[2][1].value)&&(s.checked=b),d&6&&B!==(B="toggle-"+u[1]+"-"+u[2][1].value)&&f(s,"id",B),d&4&&T!==(T=u[2][1].label+"")&&O(U,T),d&6&&V!==(V="toggle-"+u[1]+"-"+u[2][1].value)&&f(k,"for",V)},i:M,o:M,d(u){u&&(m(l),m(o),m(r),m(p),m(t),m(L),m(s),m(N),m(k)),J=!1,R(z)}}}function Q(e){let l,a,n,i;return a=new ie({props:{icon:"check"}}),{c(){l=E("i"),ne(a.$$.fragment),this.h()},l(o){l=j(o,"I",{class:!0});var r=D(l);te(a.$$.fragment,r),r.forEach(m),this.h()},h(){f(l,"class","svelte-1j5d7bb")},m(o,r){g(o,l,r),ue(a,l,null),i=!0},i(o){i||(P(a.$$.fragment,o),o&&(n||$(()=>{n=ae(l,se,{delay:50,duration:50}),n.start()})),i=!0)},o(o){A(a.$$.fragment,o),i=!1},d(o){o&&m(l),le(a)}}}function re(e){let l,a,n,i;const o=[fe,oe],r=[];function _(v,h){return v[2].length===2?0:v[2].length===1?1:-1}return~(a=_(e))&&(n=r[a]=o[a](e)),{c(){l=E("div"),n&&n.c(),this.h()},l(v){l=j(v,"DIV",{class:!0});var h=D(l);n&&n.l(h),h.forEach(m),this.h()},h(){f(l,"class","toggle svelte-1j5d7bb"),H(l,"single",e[2].length===1)},m(v,h){g(v,l,h),~a&&r[a].m(l,null),i=!0},p(v,[h]){let p=a;a=_(v),a===p?~a&&r[a].p(v,h):(n&&(W(),A(r[p],1,1,()=>{r[p]=null}),X()),~a?(n=r[a],n?n.p(v,h):(n=r[a]=o[a](v),n.c()),P(n,1),n.m(l,null)):n=null),(!i||h&4)&&H(l,"single",v[2].length===1)},i(v){i||(P(n),i=!0)},o(v){A(n),i=!1},d(v){v&&m(l),~a&&r[a].d()}}}function _e(e,l,a){let{name:n}=l,{options:i=[]}=l,{checked:o=i.length>1?i[0].value.toString():""}=l;function r(t){Z.call(this,e,t)}const _=t=>{t.code==="Space"&&(t.preventDefault(),a(0,o=o===i[0].value?i[1].value:i[0].value))},v=t=>{t.code==="Space"&&(t.preventDefault(),a(0,o=o===i[0].value?i[1].value:i[0].value))},h=t=>{t.code==="Space"&&(t.preventDefault(),a(0,o=o===i[0].value?"":i[0].value))},p=t=>a(0,o=t.target.checked?i[0].value:"");return e.$$set=t=>{"name"in t&&a(1,n=t.name),"options"in t&&a(2,i=t.options),"checked"in t&&a(0,o=t.checked)},[o,n,i,r,_,v,h,p]}class ge extends x{constructor(l){super(),ee(this,l,_e,re,Y,{name:1,options:2,checked:0})}}export{ge as T,me as c,pe as p}; diff --git a/gui/next/build/_app/immutable/chunks/D-yR0E5w.js b/gui/next/build/_app/immutable/chunks/D-yR0E5w.js new file mode 100644 index 0000000..4f0268f --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/D-yR0E5w.js @@ -0,0 +1 @@ +import{s as V,n as M,d as e,i as o,v as i,w as v,b as L,x as t,e as H,y as n}from"./Ul9VwQ7n.js";import{S as C,i as f}from"./Bh3MJlbi.js";function r(s){let h,c;return{c(){h=n("svg"),c=n("path"),this.h()},l(a){h=t(a,"svg",{width:!0,height:!0,viewBox:!0,fill:!0,xmlns:!0});var l=H(h);c=t(l,"path",{d:!0}),H(c).forEach(e),l.forEach(e),this.h()},h(){v(c,"d",s[2]),v(h,"width",s[1]),v(h,"height",s[1]),v(h,"viewBox","0 0 24 24"),v(h,"fill","currentColor"),v(h,"xmlns","http://www.w3.org/2000/svg")},m(a,l){o(a,h,l),L(h,c)},p(a,l){l&4&&v(c,"d",a[2]),l&2&&v(h,"width",a[1]),l&2&&v(h,"height",a[1])},d(a){a&&e(h)}}}function d(s){let h,c=s[0]&&r(s);return{c(){c&&c.c(),h=i()},l(a){c&&c.l(a),h=i()},m(a,l){c&&c.m(a,l),o(a,h,l)},p(a,[l]){a[0]?c?c.p(a,l):(c=r(a),c.c(),c.m(h.parentNode,h)):c&&(c.d(1),c=null)},i:M,o:M,d(a){a&&e(h),c&&c.d(a)}}}function A(s,h,c){let a,{icon:l=!1}=h,{size:m=24}=h;const Z={database:"M12 24c-6.841 0-12-2.257-12-5.25V5.251C0 2.258 5.159.001 12 .001s12 2.257 12 5.25V18.75C24 21.743 18.841 24 12 24zM1.5 18.75c0 1.533 3.739 3.75 10.5 3.75s10.5-2.217 10.5-3.75v-4.137c-2.053 1.622-6.023 2.637-10.5 2.637s-8.446-1.016-10.5-2.637v4.137zm0-6.75c0 1.533 3.739 3.75 10.5 3.75S22.5 13.533 22.5 12V7.863C20.446 9.485 16.477 10.5 12 10.5S3.554 9.485 1.5 7.863V12zM12 1.501c-6.761 0-10.5 2.217-10.5 3.75s3.739 3.75 10.5 3.75 10.5-2.217 10.5-3.75-3.739-3.75-10.5-3.75z",users:"M4.5 9c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3Zm0-4.5C3.67 4.5 3 5.17 3 6s.67 1.5 1.5 1.5S6 6.83 6 6s-.67-1.5-1.5-1.5ZM3 22.5c-.38 0-.7-.28-.74-.66l-.67-5.34H.75c-.41 0-.75-.34-.75-.75V13.5C0 11.02 2.02 9 4.5 9c.41 0 .75.34.75.75s-.34.75-.75.75c-1.65 0-3 1.35-3 3V15h.75c.38 0 .7.28.74.66L3.66 21H6c.41 0 .75.34.75.75s-.34.75-.75.75H3ZM19.5 9c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3Zm0-4.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5S21 6.83 21 6s-.67-1.5-1.5-1.5Zm-1.5 18c-.41 0-.75-.34-.75-.75s.34-.75.75-.75h2.34l.67-5.34c.05-.38.37-.66.74-.66h.75v-1.5c0-1.65-1.35-3-3-3-.41 0-.75-.34-.75-.75s.34-.75.75-.75c2.48 0 4.5 2.02 4.5 4.5v2.25c0 .41-.34.75-.75.75h-.84l-.67 5.34c-.05.38-.37.66-.74.66h-3Zm-6-15c-2.07 0-3.75-1.68-3.75-3.75S9.93 0 12 0s3.75 1.68 3.75 3.75S14.07 7.5 12 7.5Zm0-6c-1.24 0-2.25 1.01-2.25 2.25S10.76 6 12 6s2.25-1.01 2.25-2.25S13.24 1.5 12 1.5ZM9.75 24a.75.75 0 0 1-.75-.67l-.68-6.83H6.75c-.41 0-.75-.34-.75-.75V13.5c0-3.31 2.69-6 6-6s6 2.69 6 6v2.25c0 .41-.34.75-.75.75h-1.57L15 23.33a.75.75 0 0 1-.75.67h-4.5Zm3.82-1.5.68-6.82c.04-.38.36-.68.75-.68h1.5v-1.5c0-2.48-2.02-4.5-4.5-4.5s-4.5 2.02-4.5 4.5V15H9c.39 0 .71.29.75.68l.68 6.82h3.14Z",log:"m5.25,24c-1.24,0-2.25-1.01-2.25-2.25v-3c0-.41.34-.75.75-.75s.75.34.75.75v3c0,.41.34.75.75.75h13.5c.41,0,.75-.34.75-.75v-3c0-.41.34-.75.75-.75s.75.34.75.75v3c0,1.24-1.01,2.25-2.25,2.25H5.25Zm15-10.5c-.41,0-.75-.34-.75-.75v-7.5c0-.41-.34-.75-.75-.75h-2.25v1.5c0,.83-.67,1.5-1.5,1.5h-6c-.83,0-1.5-.67-1.5-1.5v-1.5h-2.25c-.41,0-.75.34-.75.75v7.5c0,.41-.34.75-.75.75s-.75-.34-.75-.75v-7.5c0-1.24,1.01-2.25,2.25-2.25h2.25c0-.83.67-1.5,1.5-1.5h.31c.52-.92,1.5-1.5,2.56-1.5.04,0,.08,0,.12,0,.04,0,.09,0,.13,0,1.07,0,2.05.58,2.56,1.5h.31c.83,0,1.5.67,1.5,1.5h2.25c1.24,0,2.25,1.01,2.25,2.25v7.5c0,.41-.34.75-.75.75Zm-11.25-7.5h6v-3h-.8c-.32,0-.61-.21-.71-.51-.19-.59-.74-.99-1.37-.99-.03,0-.05,0-.08,0,0,0-.04,0-.04,0-.01,0-.09,0-.11,0-.62,0-1.18.4-1.37.99-.1.31-.39.52-.71.52h-.8v3Zm3.04,13.63c-.17,0-.34-.04-.49-.11-.27-.13-.47-.36-.57-.65l-2.08-5.73-1.37,2.73c-.19.38-.58.62-1.01.62H.75c-.41,0-.75-.34-.75-.75s.34-.75.75-.75h5.54l1.65-3.31c.13-.27.37-.47.65-.56.12-.04.24-.06.36-.06.17,0,.35.04.5.12.26.13.46.35.56.62l2.07,5.69,1.93-4.33c.18-.41.59-.67,1.03-.67.16,0,.31.03.46.1.24.11.43.29.55.52l.94,1.88h6.28c.41,0,.75.34.75.75s-.34.75-.75.75h-6.51c-.43,0-.81-.24-1.01-.62l-.69-1.37-1.98,4.45c-.12.28-.36.51-.67.61-.12.04-.24.06-.36.06Z",logFresh:"M5.25 24C4.01 24 3 22.99 3 21.75v-3c0-.41.34-.75.75-.75s.75.34.75.75v3c0 .41.34.75.75.75h13.5c.41 0 .75-.34.75-.75v-3c0-.41.34-.75.75-.75s.75.34.75.75v3c0 1.24-1.01 2.25-2.25 2.25H5.25Zm15-10.5c-.41 0-.75-.34-.75-.75v-7.5c0-.41-.34-.75-.75-.75H16.5V6c0 .83-.67 1.5-1.5 1.5H9c-.83 0-1.5-.67-1.5-1.5V4.5H5.25c-.41 0-.75.34-.75.75v7.5c0 .41-.34.75-.75.75S3 13.16 3 12.75v-7.5C3 4.01 4.01 3 5.25 3H7.5c0-.83.67-1.5 1.5-1.5h.31C9.83.58 10.81 0 11.88 0h.25c1.06 0 2.04.58 2.56 1.5H15c.83 0 1.5.67 1.5 1.5h2.25C19.99 3 21 4.01 21 5.25v7.5c0 .41-.34.75-.75.75ZM9 6h6V3h-.8c-.32 0-.61-.21-.71-.51-.19-.59-.74-.99-1.37-.99H11.89c-.62 0-1.18.4-1.37.99a.75.75 0 0 1-.71.52h-.8v3ZM7.14 20.55c-.1 0-.19-.02-.28-.06-.19-.08-.33-.22-.41-.4s-.08-.39 0-.57c.37-.9.8-1.72 1.27-2.42-.78-1.12-1.09-2.25-.92-3.27.19-1.07.9-1.99 2.06-2.65 1.41-.74 2.99-1.12 4.58-1.12s3.04.36 4.39 1.03c.2.1.35.28.4.51s0 .45-.14.63c-.41.52-.69 1.48-1 2.49-.68 2.26-1.61 5.36-4.93 5.66-.1 0-.2.01-.29.01-1.55 0-2.64-1.12-3.23-1.94-.29.5-.56 1.05-.81 1.65-.12.28-.39.47-.7.47Zm2.43-3.43c.26.44 1.11 1.76 2.3 1.76h.15c2.31-.21 2.95-2.34 3.62-4.6.24-.79.46-1.53.76-2.17-.95-.36-1.95-.55-2.98-.55-1.34 0-2.68.33-3.86.94-.75.43-1.19.96-1.3 1.59-.09.52.06 1.12.42 1.76 1.48-1.59 2.82-1.8 2.97-1.82h.09c.38 0 .7.28.75.66.05.41-.24.78-.65.84s-.55.09-1.29.65c-.34.26-.68.58-1 .95Z",backgroundJob:"M23.6 7.3v.3c0 .1-.1.2-.2.3l-3 3c-.2.1-.4.1-.6.1-.2 0-.4-.1-.5-.2-.1-.1-.2-.3-.2-.5s.1-.4.2-.5L21 8H1.2c-.4 0-.8-.4-.8-.8s.3-.9.8-.9H21l-1.7-1.5c-.1-.1-.2-.3-.2-.5s.1-.4.2-.5c.1-.1.3-.2.5-.2s.4.1.5.2l3 3c.1.1.1.2.2.2.1.1.1.2.1.3zM4 10.4c-.4 0-.7.3-.7.7-.1 1.1 0 2.2.3 3.3 0 .4.3.6.7.6h.2c.4-.1.6-.5.5-.9-.2-.9-.3-1.9-.2-2.8 0-.5-.3-.8-.8-.9.1 0 0 0 0 0zm2.6 5.3c-.3 0-.6.2-.7.6-.1.4.2.8.6.9.8.2 1.6.3 2.4.3h.9c.4 0 .7-.4.7-.8s-.4-.7-.7-.7H9c-.7 0-1.4-.1-2.1-.2-.2-.1-.2-.1-.3-.1zm9.8-2.7c-.2 0-.4.1-.5.2-.1.1-.2.3-.2.5s.1.4.2.5l1.7 1.7h-3.4c-.4 0-.8.3-.8.8 0 .4.3.8.8.8h3.4l-1.7 1.7c-.1.1-.2.3-.2.5s.1.4.2.5c.1.1.3.2.5.2s.4-.1.5-.2l3-3c.1-.1.1-.2.2-.2v-.6c0-.1-.1-.2-.2-.3l-3-3c-.2-.1-.3-.1-.5-.1z",constant:"M3 24C1.76 24 .75 22.99.75 21.75V2.25C.75 1.01 1.76 0 3 0h15.05c.59 0 1.15.23 1.57.64l2.95 2.88c.43.42.68 1.01.68 1.61v16.62c0 1.24-1.01 2.25-2.25 2.25H3ZM3 1.5c-.41 0-.75.34-.75.75v19.5c0 .41.34.75.75.75h18c.41 0 .75-.34.75-.75V5.14c0-.2-.08-.4-.23-.54l-2.95-2.88a.734.734 0 0 0-.52-.21H3Zm6.65 16.56c-1.12 0-2.06-.87-2.15-1.99v-1.31c0-.16-.11-.33-.27-.41l-1.61-.92c-.23-.13-.38-.38-.38-.65s.14-.52.38-.65l1.58-.91c.18-.1.29-.26.29-.45V9.48a2.173 2.173 0 0 1 2.15-1.99h.85a.749.749 0 1 1 0 1.5h-.85a.65.65 0 0 0-.65.58v1.21c-.02.74-.43 1.4-1.07 1.74l-.43.25.45.26c.62.33 1.02.98 1.04 1.7v1.23c.04.33.32.58.66.58h.84c.41 0 .75.34.75.75s-.34.75-.75.75h-.85Zm4.69 0h-.85c-.41 0-.75-.34-.75-.75s.34-.75.75-.75H14.34c.34 0 .62-.25.66-.58v-1.21c.02-.74.43-1.4 1.07-1.74l.43-.25-.45-.26c-.62-.33-1.02-.98-1.04-1.71V9.58a.658.658 0 0 0-.65-.58h-.85c-.41 0-.75-.34-.75-.75s.34-.75.75-.75h.85c1.12 0 2.06.87 2.15 1.99v1.31c0 .16.11.33.27.41l1.6.92c.23.13.38.38.38.65s-.14.52-.38.65l-1.58.91c-.18.1-.29.26-.29.45v1.29a2.165 2.165 0 0 1-2.15 1.99Z",graphql:"M21 14.9V9.1c.9-.2 1.6-1.1 1.6-2.1 0-1.2-1-2.1-2.1-2.1-.6 0-1.2.3-1.5.7l-5-2.9c.1-.2.1-.4.1-.6C14.1 1 13.2 0 12 0S9.9 1 9.9 2.1c0 .2 0 .4.1.6L5 5.6c-.4-.4-.9-.7-1.5-.7-1.2 0-2.1 1-2.1 2.1 0 1 .7 1.8 1.6 2.1v5.7c-.9.2-1.6 1.1-1.6 2.1 0 1.2 1 2.1 2.1 2.1.6 0 1.2-.3 1.5-.7l5 2.9c-.1.2-.1.4-.1.6 0 1.2 1 2.1 2.1 2.1s2.1-1 2.1-2.1c0-.2 0-.4-.1-.6l5-2.9c.4.4.9.7 1.5.7 1.2 0 2.1-1 2.1-2.1.1-1-.6-1.8-1.6-2zm-17 0V9.1C4.9 8.9 5.6 8 5.6 7c0-.2 0-.4-.1-.6l5-2.9.1.1L4 14.9zm9.5 5.5c-.4-.4-.9-.7-1.5-.7s-1.2.3-1.5.7l-5-2.9v-.1h12.9v.1l-4.9 2.9zm5-4h-13c-.1-.4-.3-.8-.6-1l6.5-11.2c.2.1.4.1.6.1s.4 0 .6-.1l6.5 11.2c-.3.3-.5.6-.6 1zm1.5-1.5L13.5 3.7l.1-.1 5 2.9c-.1.2-.1.4-.1.6 0 1 .7 1.8 1.6 2.1v5.7z",liquid:"M12 24c-2.3 0-4.4-.9-6.1-2.5-1.7-1.6-2.6-3.8-2.6-6.1v-.3C3.3 8.6 9.7 0 12 0c2.3 0 8.7 8.6 8.7 15.1.1 4.8-3.8 8.8-8.6 8.9H12zm0-22.3C10.5 3 4.8 10 4.8 15.1v.2c.1 3.4 3.8 7.1 7.2 7.1h.1c3.4-.1 7.2-3.9 7.1-7.3C19.2 10 13.5 3 12 1.7zm-1 18.2c-2.1 0-3.8-1.7-3.8-3.8 0-.7.3-1.2.9-1.2s.7.7.7 1.4 1.1 1.8 1.8 1.8 1.1.4 1.1.8c.1.7 0 1-.7 1z",arrowRight:"M12.75 23.25a.752.752 0 0 1-.53-1.281l9.22-9.22H.75a.749.749 0 1 1 0-1.499h20.689l-9.22-9.22A.746.746 0 0 1 12.22.97c.141-.142.33-.22.53-.22s.389.078.53.22l10.5 10.5a.74.74 0 0 1 .163.245l.01.026a.73.73 0 0 1 0 .517l-.006.016a.755.755 0 0 1-.168.257L13.28 23.03a.743.743 0 0 1-.53.22z",arrowLeft:"M11.25 23.25a.743.743 0 0 1-.53-.22L.22 12.53a.74.74 0 0 1-.163-.245l-.01-.026a.75.75 0 0 1 .009-.541.74.74 0 0 1 .166-.249L10.72.97a.744.744 0 0 1 1.06 0c.142.141.22.33.22.53s-.078.389-.22.53l-9.22 9.22h20.69a.75.75 0 0 1 0 1.5H2.561l9.22 9.22a.75.75 0 0 1-.531 1.28z",arrowDown:"M12 18.999c-.4 0-.776-.156-1.059-.438L.22 7.841A.745.745 0 0 1 0 7.31c0-.2.078-.389.22-.53a.744.744 0 0 1 1.06 0L12 17.499 22.72 6.78a.744.744 0 0 1 1.06 0 .744.744 0 0 1 0 1.06L13.06 18.56a1.487 1.487 0 0 1-1.06.439z",arrowTripleUp:"M19 10.3c-.4 0-.8-.1-1.1-.3l-6.1-3.9L5.7 10c-.3.2-.7.3-1.1.3-.4 0-.7 0-1-.2-.5-.3-.8-.7-.8-1.3V6.4c0-.8.4-1.4 1.1-1.8L10.7.3c.3-.2.7-.3 1.1-.3s.7.1 1.1.3l6.9 4.4c.6.3 1 1 1 1.7v2.4c0 .5-.3 1-.8 1.3-.3.2-.6.2-1 .2ZM4.3 8.8h.6l6.5-4.2c.1 0 .3-.1.4-.1s.3 0 .4.1l6.5 4.2h.6V6.5c0-.2-.1-.4-.3-.5l-7-4.4h-.6L4.6 6c-.2.1-.3.3-.4.5v2.3Zm14.7 10c-.4 0-.8-.1-1.1-.3l-6.1-3.9-6.1 3.9c-.3.2-.7.3-1.1.3s-.7 0-1-.2c-.5-.3-.8-.7-.8-1.3v-1.8c0-.8.4-1.4 1.1-1.8l6.8-4.3c.3-.2.7-.3 1.1-.3s.7.1 1.1.3l6.9 4.4c.6.3 1 1 1 1.7v1.8c0 .5-.3 1-.8 1.2-.3.2-.6.3-1 .3Zm-7.2-5.9c.1 0 .3 0 .4.1l6.5 4.2h.6v-1.7c0-.2-.1-.4-.3-.5l-6.9-4.4h-.6L4.7 15c-.2.1-.3.3-.4.5v1.7h.6l6.5-4.2c.1 0 .3-.1.4-.1ZM4.2 24c-.2 0-.5-.1-.6-.3-.1-.2-.2-.4-.1-.6s.1-.4.3-.5l7.5-5.2c.1 0 .3-.1.4-.1s.3 0 .4.1l7.5 5.2c.2.1.3.3.3.5s0 .4-.1.6c-.1.2-.4.3-.6.3s-.3 0-.4-.1L11.7 19l-7.1 4.9c-.1 0-.3.1-.4.1Z",search:"M23.245 23.996a.743.743 0 0 1-.53-.22L16.2 17.26a9.824 9.824 0 0 1-2.553 1.579 9.766 9.766 0 0 1-7.51.069 9.745 9.745 0 0 1-5.359-5.262c-1.025-2.412-1.05-5.08-.069-7.51S3.558 1.802 5.97.777a9.744 9.744 0 0 1 7.51-.069 9.745 9.745 0 0 1 5.359 5.262 9.748 9.748 0 0 1 .069 7.51 9.807 9.807 0 0 1-1.649 2.718l6.517 6.518a.75.75 0 0 1-.531 1.28zM9.807 1.49a8.259 8.259 0 0 0-3.25.667 8.26 8.26 0 0 0-4.458 4.54 8.26 8.26 0 0 0 .058 6.362 8.26 8.26 0 0 0 4.54 4.458 8.259 8.259 0 0 0 6.362-.059 8.285 8.285 0 0 0 2.594-1.736.365.365 0 0 1 .077-.076 8.245 8.245 0 0 0 1.786-2.728 8.255 8.255 0 0 0-.059-6.362 8.257 8.257 0 0 0-4.54-4.458 8.28 8.28 0 0 0-3.11-.608z",x:"M19.5 20.25a.743.743 0 0 1-.53-.22L12 13.061l-6.97 6.97a.744.744 0 0 1-1.06 0 .752.752 0 0 1 0-1.061L10.94 12 3.97 5.03c-.142-.141-.22-.33-.22-.53s.078-.389.22-.53c.141-.142.33-.22.53-.22s.389.078.53.22L12 10.94l6.97-6.97a.744.744 0 0 1 1.06 0c.142.141.22.33.22.53s-.078.389-.22.53L13.061 12l6.97 6.97a.75.75 0 0 1-.531 1.28z",plus:"M12 24a.75.75 0 0 1-.75-.75v-10.5H.75a.75.75 0 0 1 0-1.5h10.5V.75a.75.75 0 0 1 1.5 0v10.5h10.5a.75.75 0 0 1 0 1.5h-10.5v10.5A.75.75 0 0 1 12 24z",minus:"M.8 12.8c-.5 0-.8-.4-.8-.8s.3-.8.8-.8h22.5c.4 0 .8.3.8.8s-.3.8-.8.8H.8z",check:"M6.347 24.003a2.95 2.95 0 0 1-2.36-1.187L.15 17.7a.748.748 0 0 1 .6-1.2c.235 0 .459.112.6.3l3.839 5.118a1.442 1.442 0 0 0 1.42.562c.381-.068.712-.281.933-.599L22.636.32a.748.748 0 1 1 1.228.86L8.772 22.739a2.93 2.93 0 0 1-1.9 1.217c-.173.031-.35.047-.525.047z",list:"M8.25 4.498a.75.75 0 0 1 0-1.5h15a.75.75 0 0 1 0 1.5h-15zM8.25 13.498a.75.75 0 0 1 0-1.5h15a.75.75 0 0 1 0 1.5h-15zM8.25 22.498a.75.75 0 0 1 0-1.5h15a.75.75 0 0 1 0 1.5h-15zM1.5 5.998c-.827 0-1.5-.673-1.5-1.5v-3c0-.827.673-1.5 1.5-1.5h3c.827 0 1.5.673 1.5 1.5v3c0 .827-.673 1.5-1.5 1.5h-3zm0-1.5h3v-3h-3v3zM1.5 14.998c-.827 0-1.5-.673-1.5-1.5v-3c0-.827.673-1.5 1.5-1.5h3c.827 0 1.5.673 1.5 1.5v3c0 .827-4.5 1.5-4.5 1.5zm0-1.5h3v-3h-3v3zM1.5 23.998c-.827 0-1.5-.673-1.5-1.5v-3c0-.827.673-1.5 1.5-1.5h3c.827 0 1.5.673 1.5 1.5v3c0 .827-.673 1.5-1.5 1.5h-3zm0-1.5h3v-3h-3v3z",tiles:"M2.25 10.497A2.252 2.252 0 0 1 0 8.247v-6a2.252 2.252 0 0 1 2.25-2.25h6a2.252 2.252 0 0 1 2.25 2.25v6a2.252 2.252 0 0 1-2.25 2.25h-6zm0-9a.75.75 0 0 0-.75.75v6c0 .414.336.75.75.75h6a.75.75 0 0 0 .75-.75v-6a.75.75 0 0 0-.75-.75h-6zM2.25 23.997A2.252 2.252 0 0 1 0 21.747v-6a2.252 2.252 0 0 1 2.25-2.25h6a2.252 2.252 0 0 1 2.25 2.25v6a2.252 2.252 0 0 1-2.25 2.25h-6zm0-9a.75.75 0 0 0-.75.75v6c0 .414.336.75.75.75h6a.75.75 0 0 0 .75-.75v-6a.75.75 0 0 0-.75-.75h-6zM15.75 10.497a2.252 2.252 0 0 1-2.25-2.25v-6a2.252 2.252 0 0 1 2.25-2.25h6A2.252 2.252 0 0 1 24 2.247v6a2.252 2.252 0 0 1-2.25 2.25h-6zm0-9a.75.75 0 0 0-.75.75v6c0 .414.336.75.75.75h6a.75.75 0 0 0 .75-.75v-6a.75.75 0 0 0-.75-.75h-6zM15.75 23.997a2.252 2.252 0 0 1-2.25-2.25v-6a2.252 2.252 0 0 1 2.25-2.25h6a2.252 2.252 0 0 1 2.25 2.25v6a2.252 2.252 0 0 1-2.25 2.25h-6zm0-9a.75.75 0 0 0-.75.75v6c0 .414.336.75.75.75h6a.75.75 0 0 0 .75-.75v-6a.75.75 0 0 0-.75-.75h-6z",pencil:"M.748 24a.755.755 0 0 1-.531-.22.754.754 0 0 1-.196-.716l1.77-6.905a.84.84 0 0 1 .045-.121.73.73 0 0 1 .151-.223L16.513 1.289A4.355 4.355 0 0 1 19.611 0c1.178 0 2.277.454 3.106 1.279l.029.029a4.367 4.367 0 0 1 1.251 3.121 4.356 4.356 0 0 1-1.32 3.087L8.183 22.01a.735.735 0 0 1-.231.154.784.784 0 0 1-.111.042L.933 23.978A.773.773 0 0 1 .748 24zm1.041-1.791 4.41-1.131-3.281-3.275-1.129 4.406zm5.868-1.795 13.02-13.02-4.074-4.074L3.58 16.344l4.077 4.07zM21.736 6.332a2.893 2.893 0 0 0-.059-3.972l-.02-.02a2.872 2.872 0 0 0-2.037-.84v-.375l-.001.375a2.873 2.873 0 0 0-1.954.762l4.071 4.07z",expand:"M23.25 7.498a.75.75 0 0 1-.75-.75V2.559l-3.97 3.97a.746.746 0 0 1-1.06-.001c-.142-.141-.22-.33-.22-.53s.078-.389.22-.53l3.97-3.97h-4.19a.75.75 0 0 1 0-1.5h6a.735.735 0 0 1 .293.06.75.75 0 0 1 .4.404l.01.026c.03.082.047.17.047.26v6a.75.75 0 0 1-.75.75zM.75 23.998a.755.755 0 0 1-.26-.047l-.022-.008A.754.754 0 0 1 0 23.248v-6a.75.75 0 0 1 1.5 0v4.189l3.97-3.97a.744.744 0 0 1 1.06 0 .752.752 0 0 1 0 1.061l-3.97 3.97h4.19a.75.75 0 0 1 0 1.5h-6zM.75 7.498a.75.75 0 0 1-.75-.75v-6A.74.74 0 0 1 .048.487L.055.466a.754.754 0 0 1 .41-.411L.49.045a.737.737 0 0 1 .26-.047h6a.75.75 0 0 1 0 1.5H2.561l3.97 3.97c.142.141.22.33.22.53s-.078.389-.22.53a.747.747 0 0 1-1.061 0L1.5 2.559v4.189a.75.75 0 0 1-.75.75zM17.25 23.998a.75.75 0 0 1 0-1.5h4.189l-3.97-3.97a.752.752 0 0 1 .53-1.281c.2 0 .389.078.53.22l3.97 3.97v-4.189a.75.75 0 0 1 1.501 0v6a.767.767 0 0 1-.046.258l-.006.017a.763.763 0 0 1-.412.419l-.026.01a.73.73 0 0 1-.259.047H17.25zM9 16.498c-.827 0-1.5-.673-1.5-1.5v-6c0-.827.673-1.5 1.5-1.5h6c.827 0 1.5.673 1.5 1.5v6c0 .827-.673 1.5-1.5 1.5H9zm0-1.5h6v-6H9v6z",collapse:"M17.25 7.498a.735.735 0 0 1-.261-.048l-.032-.012a.75.75 0 0 1-.4-.404l-.01-.026a.739.739 0 0 1-.047-.26v-6a.75.75 0 0 1 1.5 0v4.189l4.72-4.72a.744.744 0 0 1 1.06 0 .747.747 0 0 1 0 1.061l-4.72 4.72h4.189a.75.75 0 0 1 0 1.5H17.25zM6.75 23.998a.75.75 0 0 1-.75-.75v-4.189l-4.72 4.72a.744.744 0 0 1-1.06 0 .752.752 0 0 1 0-1.061l4.72-4.72H.75a.75.75 0 0 1 0-1.5h6c.088 0 .175.016.26.047l.022.008a.756.756 0 0 1 .468.695v6a.75.75 0 0 1-.75.75zM23.25 23.998a.743.743 0 0 1-.53-.22L18 19.059v4.189a.75.75 0 0 1-1.5 0v-6c0-.087.016-.174.046-.258l.006-.017a.763.763 0 0 1 .412-.419l.026-.01a.733.733 0 0 1 .259-.047h6a.75.75 0 0 1 0 1.5H19.06l4.72 4.72a.752.752 0 0 1-.53 1.281zM.75 7.498a.75.75 0 0 1 0-1.5h4.189l-4.72-4.72A.746.746 0 0 1 .22.218c.141-.142.33-.22.53-.22s.389.078.53.22L6 4.938V.748a.75.75 0 0 1 1.5 0v6a.735.735 0 0 1-.048.261l-.007.021a.76.76 0 0 1-.695.468h-6zM9 16.498c-.827 0-1.5-.673-1.5-1.5v-6c0-.827.673-1.5 1.5-1.5h6c.827 0 1.5.673 1.5 1.5v6c0 .827-.673 1.5-1.5 1.5H9zm0-1.5h6v-6H9v6z",eye:"M11.8 19.5c-4.3 0-8.6-3-11.2-5.9-.8-.9-.8-2.3 0-3.2 2.6-2.8 6.9-5.9 11.2-5.9h.4c4.3 0 8.6 3 11.2 5.9.8.9.8 2.3 0 3.2-2.6 2.8-6.9 5.9-11.2 5.9h-.4zM11.9 6C8 6 4.1 8.8 1.7 11.4c-.3.3-.3.9 0 1.2C4.1 15.2 8 18 11.9 18h.2c3.9 0 7.8-2.8 10.1-5.4.3-.3.3-.9 0-1.2C19.9 8.8 16 6 12.1 6h-.2zm.1 10.5c-1.2 0-2.3-.5-3.2-1.3s-1.3-2-1.3-3.2c0-2.5 2-4.5 4.5-4.5 1.2 0 2.3.5 3.2 1.3.8.9 1.3 2 1.3 3.2 0 1.2-.5 2.3-1.3 3.2-.9.8-2 1.3-3.2 1.3zM12 9c-1.7 0-3 1.3-3 3 0 .8.3 1.6.9 2.1.6.6 1.3.9 2.1.9s1.6-.3 2.1-.9.9-1.3.9-2.1-.3-1.6-.9-2.1c-.5-.6-1.3-.9-2.1-.9z",eyeStriked:"M2.8 21.8c-.2 0-.4-.1-.5-.2-.2-.2-.3-.4-.3-.6 0-.2.1-.4.2-.5L21 2.5c.1-.1.3-.2.5-.2s.4.1.5.2c.1.1.2.3.2.5s-.1.4-.2.5l-18.8 18c0 .2-.2.3-.4.3zm9.2-1.6h-.1c-1 0-2.1-.2-3.1-.5-.4-.1-.6-.5-.5-.9.1-.3.4-.5.7-.5h.2c.9.3 1.8.4 2.7.4h.2c3.9 0 7.8-2.8 10.1-5.4.3-.3.3-.9 0-1.2-.9-1-1.9-1.9-3-2.7-.1 0-.2-.2-.2-.4s0-.4.1-.6c.1-.2.4-.3.6-.3.2 0 .3.1.4.1 1.2.8 2.2 1.8 3.2 2.9.8.9.8 2.3 0 3.2-2.6 2.8-6.9 5.9-11.2 5.9H12zM3.8 17c-.2 0-.3-.1-.5-.2-1-.7-1.9-1.6-2.7-2.5-.8-.9-.8-2.3 0-3.2 2.6-2.8 6.9-5.9 11.2-5.9h.2c.8 0 1.7.1 2.5.3.4.1.6.5.5.9.1.4-.2.6-.6.6h-.2c-.7-.2-1.4-.3-2.1-.3h-.2C8 6.8 4.1 9.5 1.7 12.1c-.3.3-.3.9 0 1.2.8.8 1.6 1.6 2.5 2.3.2.1.3.3.3.5s0 .4-.2.6c-.1.2-.3.3-.5.3zm4.4-3.5c-.4 0-.8-.3-.8-.8 0-1.2.5-2.3 1.3-3.2s2-1.3 3.2-1.3c.2 0 .4.2.4.4v.8c0 .1 0 .2-.1.3s-.1.1-.2.1c-.8 0-1.6.3-2.1.9-.6.5-.9 1.2-.9 2.1 0 .2-.1.4-.2.5-.2.1-.4.2-.6.2zm3.8 3.7c-.2 0-.4-.2-.4-.4V16c0-.1 0-.2.1-.3.1-.1.2-.1.3-.1.8 0 1.6-.3 2.1-.9.6-.6.9-1.3.9-2.1 0-.4.3-.8.8-.8s.8.3.8.8c0 1.2-.5 2.3-1.3 3.2-1 1-2.1 1.4-3.3 1.4z",book:"M12 23.999a.755.755 0 0 1-.548-.238c-.017-.017-2.491-2.398-10.212-2.494A1.26 1.26 0 0 1 0 20.025V4.249c0-.334.137-.659.375-.892.242-.232.557-.358.89-.358 5.718.073 8.778 1.302 10.258 2.199a6.773 6.773 0 0 1 1.572-2.664A8.513 8.513 0 0 1 17.071.055a1.346 1.346 0 0 1 1.1.153c.353.218.57.6.579 1.02v2.053A31.709 31.709 0 0 1 22.727 3 1.259 1.259 0 0 1 24 4.245v15.772a1.265 1.265 0 0 1-1.243 1.25c-7.724.096-10.193 2.478-10.217 2.502l-.031.03a.742.742 0 0 1-.509.2zM1.5 19.771c5.263.097 8.233 1.194 9.75 2.037V6.826c-.72-.546-3.417-2.201-9.75-2.323v15.268zm17.25-2.926a.751.751 0 0 1-.598.734 7.44 7.44 0 0 0-3.967 2.238 5.3 5.3 0 0 0-1.15 1.838c1.58-.81 4.502-1.794 9.464-1.885V4.502a30.64 30.64 0 0 0-3.75.292v12.051zm-6 2.334c.11-.135.225-.266.345-.39a8.92 8.92 0 0 1 4.155-2.533V1.569a7.055 7.055 0 0 0-3.057 1.986 5.343 5.343 0 0 0-1.443 2.997v12.627z",serverSettings:"M5.3 4.1c.6 0 1.1.5 1.1 1.1s-.5 1.2-1.1 1.2-1.2-.5-1.2-1.1.5-1.2 1.2-1.2zm0 9c.6 0 1.1.5 1.1 1.1s-.5 1.1-1.1 1.1-1.1-.5-1.1-1.1.4-1.1 1.1-1.1zm0 6.4c-2.9 0-5.2-2.4-5.2-5.2 0-1.9 1-3.6 2.5-4.5C1 8.8 0 7.1 0 5.3 0 2.4 2.4 0 5.3 0h12c1.4 0 2.7.5 3.7 1.5s1.5 2.3 1.5 3.7c0 1.3-.5 2.5-1.3 3.5-.1.2-.3.3-.6.3-.2 0-.4-.1-.5-.2-.2-.1-.2-.3-.3-.5s.1-.4.2-.5c.7-.8 1-1.6 1-2.6s-.4-1.9-1.1-2.7c-.7-.7-1.6-1.1-2.7-1.1h-12c-2.1 0-3.8 1.7-3.8 3.8S3.2 9 5.3 9h7.4c.4 0 .8.3.8.8s-.3.8-.8.8H5.3c-2.1 0-3.8 1.7-3.8 3.8S3.2 18 5.3 18h3c.4 0 .7.3.7.8s-.3.8-.8.8l-2.9-.1zM10.5 6c-.4 0-.8-.3-.8-.8s.3-.8.8-.8h6.7c.4 0 .8.3.8.8s-.3.8-.7.8h-6.8zm6.8 12.8c-1.2 0-2.2-1-2.2-2.2s1-2.2 2.2-2.2 2.2 1 2.2 2.2-1 2.2-2.2 2.2zm0-3c-.4 0-.8.3-.8.7s.3.8.8.8.8-.3.8-.8-.4-.7-.8-.7zm0 8.2c-.2 0-.4 0-.6-.1-.7-.2-1.2-.7-1.4-1.4l-.4-1.4c0-.1-.1-.2-.2-.2h-.1l-1.5.3c-.2 0-.3.1-.5.1-.4 0-.8-.1-1.1-.3-.5-.3-.8-.8-.9-1.3-.2-.7 0-1.4.5-1.9l1-1.1c.1-.1.1-.2 0-.3l-1-1.1c-.4-.4-.6-.9-.6-1.5s.3-1.1.7-1.5c.4-.4.9-.6 1.4-.6.2 0 .3 0 .5.1l1.5.3h.1c.1 0 .2-.1.2-.2l.4-1.5c.2-.5.5-1 1-1.2.3-.2.6-.2 1-.2.2 0 .4 0 .6.1.7.2 1.2.7 1.4 1.4l.4 1.4c0 .1.1.2.2.2h.1l1.5-.3c.2 0 .3-.1.5-.1.4 0 .8.1 1.1.3.5.3.8.8.9 1.3.2.7 0 1.4-.5 1.9l-1 1.1c-.1.1-.1.2 0 .3l1 1.1c.4.4.6.9.6 1.5s-.3 1.1-.7 1.5c-.4.4-.9.6-1.4.6-.2 0-.3 0-.5-.1l-1.5-.3h-.1c-.1 0-.2.1-.2.2l-.4 1.4c-.2.5-.5 1-1 1.2-.4.2-.7.3-1 .3zm-2.7-4.6c.8 0 1.4.5 1.7 1.2l.4 1.5c.1.2.2.3.4.4h.2c.1 0 .2 0 .3-.1l.3-.3.4-1.5c.2-.7.9-1.2 1.7-1.2h.4l1.5.3h.1c.1 0 .3-.1.4-.2.1-.1.2-.3.2-.4 0-.2-.1-.3-.2-.4l-1-1.1c-.6-.7-.6-1.7 0-2.4l1-1.1c.1-.1.2-.3.1-.5-.1-.3-.3-.5-.6-.5h-.1l-1.5.3h-.4c-.8 0-1.4-.5-1.7-1.2l-.4-1.5c-.1-.2-.2-.3-.4-.4h-.2c-.1 0-.2 0-.3.1l-.3.3-.4 1.5c-.2.7-.9 1.2-1.7 1.2h-.4l-1.5-.3h-.1c-.1 0-.3.1-.4.2-.1.1-.2.3-.2.4 0 .2.1.3.2.4l1 1.1c.6.7.6 1.7 0 2.4l-1 1.1c-.1.2-.1.4-.1.6 0 .2.1.3.3.4.1.1.2.1.3.1h.1l1.5-.3c.1-.1.3-.1.4-.1z",controlls:"M6 22c-1.4 0-2.6-.9-2.9-2.2H.7c-.4 0-.7-.4-.7-.8s.3-.8.8-.8h2.3C3.4 16.9 4.6 16 6 16s2.6.9 2.9 2.2h14.3c.4 0 .8.3.8.8s-.3.8-.8.8H8.9C8.6 21.1 7.4 22 6 22Zm0-4.5c-.8 0-1.5.7-1.5 1.5s.7 1.5 1.5 1.5 1.5-.7 1.5-1.5-.7-1.5-1.5-1.5v-.4.4ZM21 15c-1.4 0-2.6-.9-2.9-2.2H.8c-.4 0-.8-.3-.8-.8s.3-.8.8-.8h17.3C18.4 9.9 19.6 9 21 9s3 1.3 3 3-1.3 3-3 3Zm0-4.5c-.8 0-1.5.7-1.5 1.5s.7 1.5 1.5 1.5 1.5-.7 1.5-1.5-.7-1.5-1.5-1.5ZM8.3 8c-1.4 0-2.6-.9-2.9-2.2H.8C.4 5.8 0 5.5 0 5s.3-.8.8-.8h4.7C5.8 2.9 7 2 8.4 2s2.6.9 2.9 2.2h12c.4 0 .8.3.8.8s-.3.8-.8.8h-12C11 7.1 9.8 8 8.4 8Zm0-4.5c-.8 0-1.5.7-1.5 1.5s.7 1.5 1.5 1.5S9.8 5.8 9.8 5s-.7-1.5-1.5-1.5v-.4.4Z",pin:"M.75 23.999a.743.743 0 0 1-.53-.22c-.142-.141-.22-.33-.22-.53s.078-.389.22-.53l7.474-7.474-3.575-3.575a2.248 2.248 0 0 1-.588-2.16c.151-.582.52-1.07 1.039-1.374a8.266 8.266 0 0 1 5.564-1.002l3.877-6.094c.089-.139.192-.268.308-.383.424-.425.989-.659 1.59-.659s1.166.234 1.591.659L23.343 6.5a2.236 2.236 0 0 1 .605 2.079 2.238 2.238 0 0 1-.988 1.41l-6.092 3.877a8.257 8.257 0 0 1-1 5.562 2.234 2.234 0 0 1-1.942 1.114 2.239 2.239 0 0 1-1.593-.661l-3.576-3.577L1.28 23.78a.746.746 0 0 1-.53.219zM8.72 8.513c-1.186 0-2.36.318-3.394.919a.746.746 0 0 0-.148 1.175l8.214 8.214c.142.142.331.22.532.22a.743.743 0 0 0 .646-.369 6.737 6.737 0 0 0 .728-4.985.75.75 0 0 1 .326-.808l6.529-4.155a.748.748 0 0 0 .128-1.163L16.44 1.718a.745.745 0 0 0-.531-.22.743.743 0 0 0-.633.348l-4.155 6.53a.746.746 0 0 1-.808.326 6.809 6.809 0 0 0-1.593-.189z",pinFilled:"M.8 24c-.2 0-.4-.1-.5-.2-.2-.2-.3-.4-.3-.6s.1-.4.2-.5l7.5-7.5-3.6-3.6c-.1-.1-.3-.3-.4-.5-.3-.5-.4-1.1-.2-1.7.2-.6.5-1.1 1-1.4 1.3-.6 2.8-1 4.2-1 .5 0 .9 0 1.4.1L14 1c.1-.1.2-.3.3-.4.4-.4 1-.7 1.6-.7s1.2.2 1.6.7l5.8 5.8c.1.1.2.2.3.4.4.6.5 1.2.3 1.8-.1.6-.5 1.1-1 1.4l-6.1 3.9c.3 1.9 0 3.9-1 5.6-.1.2-.2.3-.4.5-.4.4-1 .7-1.6.7-.6 0-1.2-.2-1.6-.7l-3.6-3.6-7.5 7.5s-.2.1-.3.1z",trash:"M6.6 23.2c-1.2 0-2.1-.9-2.2-2.1L3.1 5.2H1.5c-.4 0-.8-.3-.8-.8s.3-.8.8-.8h6V3c0-1.2 1-2.2 2.2-2.2h4.5c1.2 0 2.2 1 2.2 2.2v.8h6c.4 0 .8.3.8.8s-.3.8-.8.8h-1.6l-1.3 15.9c-.1 1.2-1.1 2.1-2.2 2.1H6.6zm-.7-2.1c0 .4.4.7.7.7h10.7c.4 0 .7-.3.7-.7l1.3-15.8H4.6l1.3 15.8zM15 3.8V3c0-.4-.3-.8-.8-.8H9.8c-.5 0-.8.4-.8.8v.8h6zM9.8 18c-.5 0-.8-.3-.8-.8V9.8c0-.5.3-.8.8-.8s.8.3.8.8v7.5c-.1.4-.4.7-.8.7zm4.4 0c-.4 0-.8-.3-.8-.8V9.8c0-.4.3-.8.8-.8s.8.3.8.8v7.5c0 .4-.3.7-.8.7z",navigationMenuVertical:"M11.987 24.003c-1.861 0-3.375-1.514-3.375-3.375s1.514-3.375 3.375-3.375 3.375 1.514 3.375 3.375-1.514 3.375-3.375 3.375zm0-5.25c-1.034 0-1.875.841-1.875 1.875s.841 1.875 1.875 1.875 1.875-.841 1.875-1.875-.841-1.875-1.875-1.875zM11.987 6.753c-1.861 0-3.375-1.514-3.375-3.375S10.126.003 11.987.003s3.375 1.514 3.375 3.375-1.514 3.375-3.375 3.375zm0-5.25c-1.034 0-1.875.841-1.875 1.875s.841 1.875 1.875 1.875 1.875-.841 1.875-1.875-.841-1.875-1.875-1.875zM11.987 15.378a3.379 3.379 0 0 1-3.375-3.375c0-1.861 1.514-3.375 3.375-3.375s3.375 1.514 3.375 3.375a3.379 3.379 0 0 1-3.375 3.375zm0-5.25c-1.034 0-1.875.841-1.875 1.875s.841 1.875 1.875 1.875 1.875-.841 1.875-1.875-.841-1.875-1.875-1.875z",copy:"M4.5 24a2.252 2.252 0 0 1-2.25-2.25V8.25A2.252 2.252 0 0 1 4.5 6h2.25V2.25A2.252 2.252 0 0 1 9 0h7.629c.601 0 1.165.234 1.59.658l2.872 2.872c.425.425.659.99.659 1.59v10.63A2.252 2.252 0 0 1 19.5 18h-2.25v3.75A2.252 2.252 0 0 1 15 24H4.5zm0-16.5a.75.75 0 0 0-.75.75v13.5c0 .414.336.75.75.75H15a.75.75 0 0 0 .75-.75V11.121c0-.197-.08-.39-.219-.53l-2.872-2.872a.748.748 0 0 0-.53-.219H4.5zm15 9a.75.75 0 0 0 .75-.75V5.121c0-.197-.08-.39-.219-.53l-2.872-2.872a.748.748 0 0 0-.53-.219H9a.75.75 0 0 0-.75.75V6h3.879c.6 0 1.165.234 1.59.658l2.872 2.872c.425.425.659.99.659 1.59v5.38h2.25z",refresh:"M12.723 22.497c-1.385 0-2.737-.271-4.019-.804a.747.747 0 0 1-.404-.98.748.748 0 0 1 .98-.405 8.924 8.924 0 0 0 3.445.689 8.935 8.935 0 0 0 6.204-2.489 8.91 8.91 0 0 0 2.762-6.283 8.911 8.911 0 0 0-2.482-6.399 8.892 8.892 0 0 0-6.483-2.765 8.921 8.921 0 0 0-6.199 2.485 8.937 8.937 0 0 0-2.746 5.833c-.14 2 .375 3.948 1.462 5.589v-2.72a.75.75 0 0 1 1.5 0v4.5a.75.75 0 0 1-.75.75h-.238a.364.364 0 0 1-.096 0H1.493a.75.75 0 0 1 0-1.5h2.636a10.467 10.467 0 0 1-1.822-6.964l.007-.076.019-.197.006-.045A10.54 10.54 0 0 1 5.497 4.42a10.465 10.465 0 0 1 7.264-2.913c1.385 0 2.738.269 4.019.8a.74.74 0 0 1 .26.18 10.382 10.382 0 0 1 3.253 2.301c3.991 4.171 3.844 10.812-.327 14.803a10.43 10.43 0 0 1-7.241 2.905h-.002z",resizeHorizontal:"M5.2 2.3c0-.4.3-.8.8-.8s.8.3.8.8v19.5c0 .4-.3.8-.8.8s-.8-.3-.8-.8V2.3zm6 0c0-.4.3-.8.8-.8s.8.3.8.8v19.5c0 .4-.3.8-.8.8s-.8-.3-.8-.8V2.3zm6 0c0-.4.3-.8.8-.8s.8.3.8.8v19.5c0 .4-.3.8-.8.8s-.8-.3-.8-.8V2.3z",info:"M14.6 23.5c-2.4 0-4.3-1.9-4.3-4.3v-8.5H8.2c-.6 0-1.1-.5-1.1-1.1s.5-1.1 1.1-1.1h1.6c1.5 0 2.7 1.2 2.7 2.7v8c0 1.2.9 2.1 2.1 2.1h1.6c.6 0 1.1.5 1.1 1.1s-.5 1.1-1.1 1.1h-1.6zm-4-19.2c-1 0-1.9-.9-1.9-1.9S9.6.5 10.6.5s1.9.9 1.9 1.9-.9 1.9-1.9 1.9z",sortAZ:"M8.8 0h-7C.8 0 0 .8 0 1.8v9h1.5v-4H9v3.9h1.5v-9C10.5.8 9.7 0 8.8 0zM1.5 5.4V1.8c0-.1.1-.2.2-.2h7c.2-.1.3 0 .3.2v3.6H1.5zm8.8 17.1V24H1.6c-.4 0-.9-.1-1.1-.4-.3-.3-.5-1 0-1.6l7.2-7.3H0v-1.5h8.5c.4 0 .8.2 1.1.4.5.4.5 1-.1 1.6l-7.2 7.3h8zm8.4-1.3h-.1c-.4 0-.7-.2-.9-.4l-4-4.3c-.1-.1-.2-.3-.2-.5s.1-.4.2-.5c.1-.1.3-.2.5-.2s.4.1.5.2l3.2 3.5V4c0-.4.3-.8.8-.8s.8.3.8.8v14.9l3.2-3.4c.1-.2.3-.2.5-.2s.4.1.5.2c.1.1.2.3.2.5s-.1.4-.2.5l-4 4.3c-.3.3-.6.4-.9.4h-.1z",sortZA:"M8.8 13.2h-7C.8 13.2 0 14 0 15v9h1.5v-3.9H9V24h1.5v-9c0-1-.8-1.8-1.7-1.8zm-7.3 5.4V15c0-.1.1-.2.2-.2h7c.2 0 .3.1.3.2v3.6H1.5zm8.8-9.4v1.5H1.6c-.4 0-.9-.1-1.1-.4-.3-.2-.5-.9 0-1.5l7.2-7.3H0V0h8.5c.4 0 .8.2 1.1.4.5.4.5 1-.1 1.6L2.4 9.2h7.9zm8.4 12h-.1c-.4 0-.7-.2-.9-.4l-4-4.3c-.1-.1-.2-.3-.2-.5s.1-.4.2-.5c.1-.1.3-.2.5-.2s.4.1.5.2l3.2 3.5V4c0-.4.3-.8.8-.8s.8.3.8.8v14.9l3.2-3.4c.1-.2.3-.2.5-.2s.4.1.5.2c.1.1.2.3.2.5s-.1.4-.2.5l-4 4.3c-.3.3-.6.4-.9.4h-.1z",leaf:"M10.257 21.851a8.3 8.3 0 0 1-6.984-3.84l-2.027 1.73a.748.748 0 0 1-1.058-.083.743.743 0 0 1-.177-.546.744.744 0 0 1 .261-.511l2.296-1.959a8.204 8.204 0 0 1-.593-3.072c0-7.309 5.71-7.938 10.748-8.492 3.287-.362 6.685-.736 8.995-2.653.236-.177.495-.265.763-.265.18 0 .354.039.517.117.366.152.647.512.719.931 1.135 6.649-1.167 11.055-3.298 13.581-2.636 3.122-6.53 5.062-10.162 5.062zm-5.831-4.824a6.777 6.777 0 0 0 5.831 3.324c3.203 0 6.657-1.736 9.016-4.532 1.882-2.23 3.908-6.098 3.031-11.947-2.593 1.944-6.059 2.326-9.416 2.696-5.259.579-9.412 1.036-9.412 7.001 0 .694.105 1.375.312 2.031l.386-.329a25.67 25.67 0 0 1 8.897-4.439.752.752 0 0 1 .85 1.094.747.747 0 0 1-.453.352 24.122 24.122 0 0 0-8.35 4.157l-.692.592z",recycle:"M5.6 24c-1.1 0-2-.8-2.2-1.9L0 2.6v-.4C0 1 1 0 2.2 0h19.5c.7 0 1.3.3 1.7.8.5.5.7 1.2.6 1.9l-3.4 19.5c-.2 1.1-1.1 1.9-2.2 1.9L5.6 24zM2.2 1.5c-.4 0-.8.3-.8.7v.1l3.4 19.5c.1.4.4.6.7.6h12.7c.4 0 .7-.3.7-.6l3.4-19.5c0-.2 0-.4-.2-.6-.1-.2-.4-.3-.6-.3l-19.3.1zm10.3 17.3c-.7 0-1.4-.1-2.1-.3-1.4-.5-2.6-1.4-3.3-2.7v1.5c0 .4-.3.8-.8.8s-.8-.3-.8-.8v-3.8c0-.4.3-.8.8-.8H10c.4 0 .8.3.8.8s-.3.8-.8.8H8.1c.5 1.3 1.6 2.3 2.9 2.7.5.2 1 .3 1.6.3.7 0 1.4-.2 2.1-.5 1.2-.6 2-1.6 2.4-2.8.1-.3.4-.5.7-.5h.2c.2.1.3.2.4.4s.1.4 0 .6c-.5 1.6-1.7 2.9-3.2 3.6-.8.4-1.7.7-2.7.7zm2.1-7.5c-.4 0-.8-.3-.8-.8s.3-.8.8-.8h2.1c-.5-1.3-1.6-2.3-2.9-2.7-.5-.2-1-.3-1.6-.3-.7 0-1.4.2-2.1.5-1.1.6-2 1.6-2.4 2.8-.1.3-.4.5-.7.5h-.2c-.4-.1-.6-.6-.5-1C6.8 7.9 8 6.6 9.5 5.9c.9-.4 1.8-.6 2.8-.6.7 0 1.4.1 2.1.3 1.4.5 2.6 1.4 3.3 2.7V6.8c-.1-.5.3-.8.7-.8s.8.3.8.8v3.8c0 .4-.3.8-.8.8h-3.8v-.1z",recycleRefresh:"M2.3 15H2c-.1 0-.2-.1-.2-.2L.3 13.3c-.3-.3-.3-.8 0-1.1.1-.1.3-.2.5-.2s.4.1.5.2l.2.2V12c0-2.3.8-4.6 2.2-6.5 2-2.6 5-4 8.3-4 2.4 0 4.6.8 6.4 2.2.2.1.3.3.3.5s0 .4-.2.6c-.1.2-.3.3-.5.3s-.3-.1-.5-.2C15.9 3.7 14 3 12 3 9.2 3 6.6 4.3 4.9 6.5 3.7 8.1 3 10 3 12v.4l.2-.2c.2-.1.4-.2.6-.2s.4.1.5.2c.1.1.2.3.2.5s-.1.4-.2.5l-1.5 1.5c-.1.1-.2.1-.2.2-.2.1-.3.1-.3.1zm9.7 7.5c-2.4 0-4.6-.8-6.4-2.2-.3-.3-.4-.7-.1-1.1.1-.2.4-.3.6-.3.2 0 .3.1.5.2C8.1 20.4 10 21 12 21c2.8 0 5.4-1.3 7.1-3.5C20.3 16 21 14 21 12v-.4l-.2.2c-.1.1-.3.2-.5.2s-.4-.1-.5-.2c-.1-.1-.2-.3-.2-.5s.1-.4.2-.5l1.5-1.5c.1-.1.2-.1.2-.2h.6c.1 0 .2.1.2.2l1.5 1.5c.1.1.2.3.2.5s-.1.4-.2.5-.3.2-.5.2-.4-.1-.5-.2l-.2-.2v.4c0 2.3-.8 4.6-2.2 6.5-2.1 2.5-5.1 4-8.4 4zM9.5 18c-.4 0-.8-.4-.7-.8 0-.5 0-.9.1-1.3-1.2-.7-2-1.5-2.3-2.5-.3-1-.1-2.2.7-3.3 1.9-2.6 4.8-4.1 8-4.1.2 0 .4.1.6.3 0 .2.1.4.1.6-.1.7 0 1.6.2 2.7.4 2.3.9 5.5-1.9 7.3-.5.3-1.1.5-1.7.5-.9 0-1.7-.3-2.3-.6v.6c-.1.3-.4.6-.8.6zm1-2.9c.3.2 1.2.7 2.1.7.3 0 .7-.1.9-.2 2-1.2 1.6-3.4 1.2-5.7-.1-.8-.3-1.6-.3-2.3-2.3.2-4.5 1.4-5.9 3.4-.5.7-.7 1.3-.5 2 .1.5.6 1 1.2 1.4.6-2.1 1.7-2.9 1.9-3 .1-.1.3-.1.4-.1.3 0 .5.1.6.3.2.3.1.8-.2 1 0 0-.9.7-1.4 2.5z",merge:"M20.62 0a3.382 3.382 0 0 0-2.39 5.77l-5.49 5.49v-4.6c1.5-.34 2.62-1.68 2.62-3.28 0-1.86-1.51-3.38-3.38-3.38S8.6 1.51 8.6 3.38c0 1.6 1.12 2.94 2.62 3.28v4.45L5.79 5.68c.57-.6.93-1.41.93-2.31 0-1.86-1.51-3.38-3.38-3.38S0 1.51 0 3.38s1.51 3.38 3.38 3.38c.41 0 .81-.09 1.17-.22l6.7 6.7v8.21l-1.72-1.72a.75.75 0 1 0-1.06 1.06l3 3c.07.07.15.13.25.17h.02c.09.03.17.05.26.05s.17-.02.26-.05c0 0 .02 0 .03-.01.09-.04.18-.09.25-.16l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72v-8.06l6.82-6.82c.34.11.69.19 1.06.19 1.86 0 3.38-1.51 3.38-3.38S22.51 0 20.64 0ZM1.5 3.38c0-1.03.84-1.88 1.88-1.88s1.88.84 1.88 1.88-.84 1.88-1.88 1.88S1.5 4.42 1.5 3.38Zm8.62 0c0-1.03.84-1.88 1.88-1.88s1.88.84 1.88 1.88-.84 1.88-1.88 1.88-1.88-.84-1.88-1.88Zm10.5 1.87c-1.03 0-1.88-.84-1.88-1.88s.84-1.88 1.88-1.88 1.88.84 1.88 1.88-.84 1.88-1.88 1.88Z",disable:"M12 24a11.922 11.922 0 0 1-8.43-3.468.343.343 0 0 1-.099-.099A11.924 11.924 0 0 1 0 12C0 5.383 5.383 0 12 0a11.92 11.92 0 0 1 8.43 3.468.397.397 0 0 1 .099.099A11.92 11.92 0 0 1 24 12c0 6.617-5.383 12-12 12zm-6.87-4.069A10.448 10.448 0 0 0 12 22.5c5.79 0 10.5-4.71 10.5-10.5 0-2.534-.909-4.958-2.569-6.87L5.13 19.931zM12 1.5C6.21 1.5 1.5 6.21 1.5 12c0 2.534.91 4.958 2.569 6.87L18.87 4.069A10.453 10.453 0 0 0 12 1.5z",globeMessage:"M23.25 24c-.05 0-.11 0-.16-.02l-5.74-1.24c-.76.38-1.58.68-2.42.89-.03 0-.05.02-.08.02-.93.23-1.89.34-2.84.34s-1.84-.11-2.77-.33c-.09 0-.18-.03-.27-.07a12.05 12.05 0 0 1-7.6-6.01C-.12 14.77-.42 11.52.53 8.46s3.03-5.58 5.86-7.07C7.24.94 8.15.59 9.09.36c.01 0 .03 0 .06-.01.91-.23 1.86-.35 2.82-.35s1.88.11 2.8.33c.07 0 .14.02.21.05 3.28.84 6.06 3.04 7.63 6.02.74 1.4 1.2 2.99 1.34 4.59.03.08.05.17.05.26 0 .05 0 .1-.02.15.01.22.02.41.02.6 0 1.91-.47 3.83-1.36 5.55-.01.03-.03.07-.05.1-.22.41-.45.79-.7 1.16l2.04 4.11c.13.26.1.57-.08.79-.15.19-.36.29-.59.29ZM9.74 22.25c.75.17 1.51.25 2.27.25s1.49-.08 2.22-.24c.67-1.06 1.22-2.52 1.61-4.26H8.12c.39 1.73.95 3.18 1.61 4.25Zm7.51-1.05c.05 0 .11 0 .16.02l4.48.97-1.55-3.12c-.13-.25-.1-.56.07-.78.07-.09.14-.19.21-.29h-3.21c-.28 1.34-.66 2.54-1.12 3.59.21-.09.41-.19.61-.3a.73.73 0 0 1 .35-.09ZM3.38 18c1.09 1.56 2.59 2.8 4.33 3.58-.46-1.04-.83-2.24-1.11-3.58H3.39Zm18.1-1.5c.67-1.41 1.02-2.96 1.02-4.5S18 12 18 12c0 1.55-.11 3.06-.33 4.5h3.81Zm-5.34 0c.23-1.45.35-2.96.35-4.5h-9c0 1.54.12 3.05.35 4.5h8.3Zm-9.82 0C6.1 15.06 6 13.55 6 12H1.49c0 1.55.35 3.09 1.02 4.5h3.81Zm16.06-5.99c-.17-1.2-.54-2.34-1.1-3.4-.2-.38-.42-.75-.67-1.1H17.4c.3 1.4.49 2.91.56 4.5h4.42Zm-5.93 0c-.08-1.57-.29-3.11-.6-4.5H8.13c-.32 1.39-.52 2.93-.6 4.5h8.92Zm-10.42 0c.07-1.59.26-3.1.56-4.5H3.37c-.62.89-1.09 1.86-1.41 2.9-.16.52-.28 1.06-.36 1.6h4.43Zm13.31-6c-.89-.87-1.92-1.57-3.06-2.08.28.63.53 1.33.74 2.08h2.31Zm-3.89 0c-.34-1.09-.74-2.01-1.2-2.75a10.5 10.5 0 0 0-4.5-.01c-.46.74-.87 1.66-1.21 2.76h6.91Zm-8.49 0c.22-.75.47-1.45.75-2.09-.21.09-.42.19-.62.3-.91.48-1.73 1.08-2.45 1.79h2.32Z"};return s.$$set=z=>{"icon"in z&&c(0,l=z.icon),"size"in z&&c(1,m=z.size)},s.$$.update=()=>{s.$$.dirty&1&&c(2,a=Z[l]),s.$$.dirty&5&&(a||console.warn(`There is no icon named %c${l} %cavailable. Not rendering anything.`,"font-weight: bold","font-weight: normal"))},[l,m,a]}class u extends C{constructor(h){super(),f(this,h,A,d,V,{icon:0,size:1})}}export{u as I}; diff --git a/gui/next/build/_app/immutable/chunks/DGc7Lmco.js b/gui/next/build/_app/immutable/chunks/DGc7Lmco.js new file mode 100644 index 0000000..9415c32 --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/DGc7Lmco.js @@ -0,0 +1 @@ +import{w as g}from"./RFIyOgWr.js";const p=b();function b(){const o=localStorage.view?JSON.parse(localStorage.view):null,e={};e.header=localStorage.header?JSON.parse(localStorage.header):["database","users","logs"],e.online=void 0,e.logs={},e.logsv2={},e.logv2={},e.networks={},e.network={},e.tables=[],e.table={},e.view={database:o!=null&&o.database?o.database:"table",tableStyle:o!=null&&o.tableStyle?o.tableStyle:"collapsed"},e.records={},e.record=null,e.highlighted={record:null,constant:null},e.filters={page:1,attributes:[{attribute_type:"id",name:"id",operation:"value",value:""}],deleted:"false"},e.sort={by:"created_at",order:"DESC"},e.notifications=[],e.asideWidth=localStorage.asideWidth?localStorage.asideWidth:!1,e.users=[];const{subscribe:s,set:d,update:i}=g(e),c=(a,t)=>{i(r=>(r[a]=t,r))},u=()=>{i(a=>(a.filters={page:1,attributes:[{attribute_type:"id",name:"id",operation:"value",value:""}],deleted:"false"},a.sort={by:"created_at",order:"DESC"},a))};let n;const l=(a,t)=>{i(r=>(r.highlighted[a]=t,r)),clearTimeout(n),n=setTimeout(()=>{l("record",null),l("constant",null)},7e3)};return{subscribe:s,set:d,data:c,clearFilters:u,highlight:l,notification:{create:(a,t)=>{i(r=>(r.notifications.push({id:Date.now(),type:a,message:t}),r))},remove:a=>{i(t=>(t.notifications=t.notifications.filter(r=>r.id!==a),t))}},setView:a=>{i(t=>(t.view={...t.view,...a},localStorage.view=JSON.stringify(t.view),t))}}}export{p as s}; diff --git a/gui/next/build/_app/immutable/chunks/DntFPtNo.js b/gui/next/build/_app/immutable/chunks/DntFPtNo.js new file mode 100644 index 0000000..a3e137a --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/DntFPtNo.js @@ -0,0 +1 @@ +import{s as Y,J as q,l as Z,d as p,r as x,K as y,u as ee,m as te,o as se,w as h,i as L,b as g,D as U,c as E,e as S,z as B,g as A,h as z,j as D,k as le,L as T,M as ae,N as ie}from"./Ul9VwQ7n.js";import{S as ne,i as re,d as J,t as W,f as $,a as w,g as K,e as M,m as V,c as X,b as F}from"./Bh3MJlbi.js";import{g as oe,q as fe}from"./CS29TWE_.js";import{s as N}from"./DGc7Lmco.js";import{I as G}from"./D-yR0E5w.js";const{window:Q}=oe;function O(o){let e,t,l,a=o[1]&&P(o),s=o[0]&&R(o);return{c(){e=z("header"),a&&a.c(),t=D(),s&&s.c(),this.h()},l(i){e=E(i,"HEADER",{class:!0});var n=S(e);a&&a.l(n),t=A(n),s&&s.l(n),n.forEach(p),this.h()},h(){h(e,"class","svelte-1lvj124")},m(i,n){L(i,e,n),a&&a.m(e,null),g(e,t),s&&s.m(e,null),l=!0},p(i,n){i[1]?a?a.p(i,n):(a=P(i),a.c(),a.m(e,t)):a&&(a.d(1),a=null),i[0]?s?(s.p(i,n),n&1&&w(s,1)):(s=R(i),s.c(),w(s,1),s.m(e,null)):s&&(K(),W(s,1,1,()=>{s=null}),M())},i(i){l||(w(s),l=!0)},o(i){W(s),l=!1},d(i){i&&p(e),a&&a.d(),s&&s.d()}}}function P(o){let e,t;return{c(){e=z("h2"),t=new ie(!1),this.h()},l(l){e=E(l,"H2",{class:!0});var a=S(e);t=ae(a,!1),a.forEach(p),this.h()},h(){t.a=null,h(e,"class","svelte-1lvj124")},m(l,a){L(l,e,a),t.m(o[1],e)},p(l,a){a&2&&t.p(l[1])},d(l){l&&p(e)}}}function R(o){let e,t,l="Close details",a,s,i;return s=new G({props:{icon:"x"}}),{c(){e=z("a"),t=z("span"),t.textContent=l,a=D(),F(s.$$.fragment),this.h()},l(n){e=E(n,"A",{href:!0,class:!0});var f=S(e);t=E(f,"SPAN",{class:!0,"data-svelte-h":!0}),B(t)!=="svelte-1gxyewl"&&(t.textContent=l),a=A(f),X(s.$$.fragment,f),f.forEach(p),this.h()},h(){h(t,"class","label svelte-1lvj124"),h(e,"href",o[0]),h(e,"class","close svelte-1lvj124")},m(n,f){L(n,e,f),g(e,t),g(e,a),V(s,e,null),i=!0},p(n,f){(!i||f&1)&&h(e,"href",n[0])},i(n){i||(w(s.$$.fragment,n),i=!0)},o(n){W(s.$$.fragment,n),i=!1},d(n){n&&p(e),J(s)}}}function ue(o){let e,t,l,a="Drag to resize panel",s,i,n,f,b,k,v,_,j,H;q(o[10]),i=new G({props:{icon:"resizeHorizontal",size:"7"}});let u=(o[1]||o[0])&&O(o);const c=o[9].default,d=Z(c,o,o[8],null);return{c(){e=z("aside"),t=z("button"),l=z("span"),l.textContent=a,s=D(),F(i.$$.fragment),n=D(),f=z("div"),u&&u.c(),b=D(),d&&d.c(),this.h()},l(r){e=E(r,"ASIDE",{style:!0,class:!0});var m=S(e);t=E(m,"BUTTON",{class:!0});var C=S(t);l=E(C,"SPAN",{class:!0,"data-svelte-h":!0}),B(l)!=="svelte-ruxerc"&&(l.textContent=a),s=A(C),X(i.$$.fragment,C),C.forEach(p),n=A(m),f=E(m,"DIV",{class:!0});var I=S(f);u&&u.l(I),b=A(I),d&&d.l(I),I.forEach(p),m.forEach(p),this.h()},h(){h(l,"class","label svelte-1lvj124"),h(t,"class","resizer svelte-1lvj124"),y(t,"active",o[3]),h(f,"class","container svelte-1lvj124"),h(e,"style",k=o[4].asideWidth?`--width: ${o[4].asideWidth}`:""),h(e,"class","svelte-1lvj124")},m(r,m){L(r,e,m),g(e,t),g(t,l),g(t,s),V(i,t,null),g(e,n),g(e,f),u&&u.m(f,null),g(f,b),d&&d.m(f,null),_=!0,j||(H=[U(Q,"resize",o[10]),U(t,"mousedown",o[6]),U(t,"click",o[7])],j=!0)},p(r,[m]){(!_||m&8)&&y(t,"active",r[3]),r[1]||r[0]?u?(u.p(r,m),m&3&&w(u,1)):(u=O(r),u.c(),w(u,1),u.m(f,b)):u&&(K(),W(u,1,1,()=>{u=null}),M()),d&&d.p&&(!_||m&256)&&ee(d,c,r,r[8],_?se(c,r[8],m,null):te(r[8]),null),(!_||m&16&&k!==(k=r[4].asideWidth?`--width: ${r[4].asideWidth}`:""))&&h(e,"style",k)},i(r){_||(w(i.$$.fragment,r),w(u),w(d,r),r&&q(()=>{_&&(v||(v=$(e,o[5],{},!0)),v.run(1))}),_=!0)},o(r){W(i.$$.fragment,r),W(u),W(d,r),r&&(v||(v=$(e,o[5],{},!1)),v.run(0)),_=!1},d(r){r&&p(e),J(i),u&&u.d(),d&&d.d(r),r&&v&&v.end(),j=!1,x(H)}}}function ce(o,e,t){let l;le(o,N,c=>t(4,l=c));let{$$slots:a={},$$scope:s}=e,{closeUrl:i}=e,{title:n=""}=e,f,b=!1;const k=function(c,{delay:d=0,duration:r=300}){return{delay:d,duration:r,css:m=>{const C=fe(m);return`min-width: 0; width: calc(${l.asideWidth||"30vw"} * ${C});`}}},v=()=>{window.addEventListener("mousemove",j,!1),window.addEventListener("mouseup",_,!1),t(3,b=!0)},_=()=>{window.removeEventListener("mousemove",j,!1),window.removeEventListener("mouseup",_,!1),t(3,b=!1),localStorage.asideWidth=l.asideWidth},j=c=>{T(N,l.asideWidth=f-c.clientX-6+"px",l)},H=c=>{c.detail===2&&(T(N,l.asideWidth=!1,l),localStorage.removeItem("asideWidth"))};function u(){t(2,f=Q.outerWidth)}return o.$$set=c=>{"closeUrl"in c&&t(0,i=c.closeUrl),"title"in c&&t(1,n=c.title),"$$scope"in c&&t(8,s=c.$$scope)},[i,n,f,b,l,k,v,H,s,a,u]}class pe extends ne{constructor(e){super(),re(this,e,ce,ue,Y,{closeUrl:0,title:1})}}export{pe as A}; diff --git a/gui/next/build/_app/immutable/chunks/RFIyOgWr.js b/gui/next/build/_app/immutable/chunks/RFIyOgWr.js new file mode 100644 index 0000000..85ee66d --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/RFIyOgWr.js @@ -0,0 +1 @@ +import{n as b,s as l}from"./Ul9VwQ7n.js";const n=[];function h(e,o){return{subscribe:p(e,o).subscribe}}function p(e,o=b){let r;const i=new Set;function u(t){if(l(e,t)&&(e=t,r)){const c=!n.length;for(const s of i)s[1](),n.push(s,e);if(c){for(let s=0;s{i.delete(s),i.size===0&&r&&(r(),r=null)}}return{set:u,update:f,subscribe:a}}export{h as r,p as w}; diff --git a/gui/next/build/_app/immutable/chunks/Ul9VwQ7n.js b/gui/next/build/_app/immutable/chunks/Ul9VwQ7n.js new file mode 100644 index 0000000..85cd72b --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/Ul9VwQ7n.js @@ -0,0 +1 @@ +var W=Object.defineProperty;var I=(t,e,n)=>e in t?W(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var f=(t,e,n)=>I(t,typeof e!="symbol"?e+"":e,n);function S(){}const ut=t=>t;function G(t,e){for(const n in e)t[n]=e[n];return t}function ft(t){return!!t&&(typeof t=="object"||typeof t=="function")&&typeof t.then=="function"}function U(t){return t()}function dt(){return Object.create(null)}function F(t){t.forEach(U)}function J(t){return typeof t=="function"}function _t(t,e){return t!=t?e==e:t!==e||t&&typeof t=="object"||typeof t=="function"}let m;function ht(t,e){return t===e?!0:(m||(m=document.createElement("a")),m.href=e,t===m.href)}function pt(t){return Object.keys(t).length===0}function K(t,...e){if(t==null){for(const i of e)i(void 0);return S}const n=t.subscribe(...e);return n.unsubscribe?()=>n.unsubscribe():n}function mt(t,e,n){t.$$.on_destroy.push(K(e,n))}function yt(t,e,n,i){if(t){const s=j(t,e,n,i);return t[0](s)}}function j(t,e,n,i){return t[1]&&i?G(n.ctx.slice(),t[1](i(e))):n.ctx}function bt(t,e,n,i){if(t[2]&&i){const s=t[2](i(n));if(e.dirty===void 0)return s;if(typeof s=="object"){const o=[],r=Math.max(e.dirty.length,s.length);for(let l=0;l32){const e=[],n=t.ctx.length/32;for(let i=0;i>1);n(s)<=i?t=s+1:e=s}return t}function V(t){if(t.hydrate_init)return;t.hydrate_init=!0;let e=t.childNodes;if(t.nodeName==="HEAD"){const c=[];for(let a=0;a0&&e[n[s]].claim_order<=a?s+1:Q(1,s,R=>e[n[R]].claim_order,a))-1;i[c]=n[u]+1;const C=u+1;n[C]=c,s=Math.max(C,s)}const o=[],r=[];let l=e.length-1;for(let c=n[s]+1;c!=0;c=i[c-1]){for(o.push(e[c-1]);l>=c;l--)r.push(e[l]);l--}for(;l>=0;l--)r.push(e[l]);o.reverse(),r.sort((c,a)=>c.claim_order-a.claim_order);for(let c=0,a=0;c=o[a].claim_order;)a++;const u=at.removeEventListener(e,n,i)}function Ht(t){return function(e){return e.preventDefault(),t.call(this,e)}}function Mt(t){return function(e){return e.stopPropagation(),t.call(this,e)}}function St(t,e,n){n==null?t.removeAttribute(e):t.getAttribute(e)!==n&&t.setAttribute(e,n)}function jt(t){return t.dataset.svelteH}function Lt(t){let e;return{p(...n){e=n,e.forEach(i=>t.push(i))},r(){e.forEach(n=>t.splice(t.indexOf(n),1))}}}function Pt(t){return t===""?null:+t}function qt(t){return Array.from(t.childNodes)}function q(t){t.claim_info===void 0&&(t.claim_info={last_index:0,total_claimed:0})}function z(t,e,n,i,s=!1){q(t);const o=(()=>{for(let r=t.claim_info.last_index;r=0;r--){const l=t[r];if(e(l)){const c=n(l);return c===void 0?t.splice(r,1):t[r]=c,s?c===void 0&&t.claim_info.last_index--:t.claim_info.last_index=r,l}}return i()})();return o.claim_order=t.claim_info.total_claimed,t.claim_info.total_claimed+=1,o}function B(t,e,n,i){return z(t,s=>s.nodeName===e,s=>{const o=[];for(let r=0;rs.removeAttribute(r))},()=>i(e))}function zt(t,e,n){return B(t,e,n,w)}function Bt(t,e,n){return B(t,e,n,P)}function et(t,e){return z(t,n=>n.nodeType===3,n=>{const i=""+e;if(n.data.startsWith(i)){if(n.data.length!==i.length)return n.splitText(i.length)}else n.data=i},()=>k(e),!0)}function Ot(t){return et(t," ")}function H(t,e,n){for(let i=n;i{r.source===i.contentWindow&&e()})):(i.src="about:blank",i.onload=()=>{o=D(i.contentWindow,"resize",e),e()}),L(t,i),()=>{(s||o&&i.contentWindow)&&o(),b(i)}}function Kt(t,e,n){t.classList.toggle(e,!!n)}function it(t,e,{bubbles:n=!1,cancelable:i=!1}={}){return new CustomEvent(t,{detail:e,bubbles:n,cancelable:i})}function Qt(t,e){const n=[];let i=0;for(const s of e.childNodes)if(s.nodeType===8){const o=s.textContent.trim();o===`HEAD_${t}_END`?(i-=1,n.push(s)):o===`HEAD_${t}_START`&&(i+=1,n.push(s))}else i>0&&n.push(s);return n}class st{constructor(e=!1){f(this,"is_svg",!1);f(this,"e");f(this,"n");f(this,"t");f(this,"a");this.is_svg=e,this.e=this.n=null}c(e){this.h(e)}m(e,n,i=null){this.e||(this.is_svg?this.e=P(n.nodeName):this.e=w(n.nodeType===11?"TEMPLATE":n.nodeName),this.t=n.tagName!=="TEMPLATE"?n:n.content,this.c(e)),this.i(i)}h(e){this.e.innerHTML=e,this.n=Array.from(this.e.nodeName==="TEMPLATE"?this.e.content.childNodes:this.e.childNodes)}i(e){for(let n=0;n{const s=t.$$.callbacks[e];if(s){const o=it(e,n,{cancelable:i});return s.slice().forEach(r=>{r.call(t,o)}),!o.defaultPrevented}return!0}}function ee(t,e){return d().$$.context.set(t,e),e}function ne(t){return d().$$.context.get(t)}function ie(t,e){const n=t.$$.callbacks[e.type];n&&n.slice().forEach(i=>i.call(this,e))}const p=[],M=[];let h=[];const T=[],O=Promise.resolve();let A=!1;function rt(){A||(A=!0,O.then(ct))}function se(){return rt(),O}function ot(t){h.push(t)}function re(t){T.push(t)}const N=new Set;let _=0;function ct(){if(_!==0)return;const t=g;do{try{for(;_t.indexOf(i)===-1?e.push(i):n.push(i)),n.forEach(i=>i()),h=e}export{Ft as $,Gt as A,Pt as B,It as C,D,Ht as E,te as F,se as G,M as H,kt as I,ot as J,Kt as K,Et as L,Rt as M,E as N,ft as O,d as P,v as Q,ct as R,Zt as S,Yt as T,Vt as U,ie as V,ht as W,J as X,Ut as Y,re as Z,$t as _,Wt as a,Xt as a0,X as a1,At as a2,it as a3,pt as a4,g as a5,dt as a6,oe as a7,U as a8,Nt as a9,Tt as aa,p as ab,rt as ac,vt as ad,Jt as ae,wt as af,Lt as ag,ne as ah,ee as ai,K as aj,Mt as ak,G as al,Z as b,zt as c,b as d,qt as e,et as f,Ot as g,w as h,tt as i,Ct as j,mt as k,yt as l,xt as m,S as n,bt as o,Qt as p,ut as q,F as r,_t as s,k as t,gt as u,Dt as v,St as w,Bt as x,P as y,jt as z}; diff --git a/gui/next/build/_app/immutable/chunks/bH_aOImW.js b/gui/next/build/_app/immutable/chunks/bH_aOImW.js new file mode 100644 index 0000000..f3c1a01 --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/bH_aOImW.js @@ -0,0 +1 @@ +var he=Object.defineProperty;var pe=(t,e,n)=>e in t?he(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var U=(t,e,n)=>pe(t,typeof e!="symbol"?e+"":e,n);import{T as jt,G as Q}from"./Ul9VwQ7n.js";import{w as bt}from"./RFIyOgWr.js";class kt{constructor(e,n){this.status=e,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}}class Et{constructor(e,n){this.status=e,this.location=n}}class St extends Error{constructor(e,n,r){super(r),this.status=e,this.text=n}}new URL("sveltekit-internal://");function ge(t,e){return t==="/"||e==="ignore"?t:e==="never"?t.endsWith("/")?t.slice(0,-1):t:e==="always"&&!t.endsWith("/")?t+"/":t}function me(t){return t.split("%25").map(decodeURI).join("%25")}function _e(t){for(const e in t)t[e]=decodeURIComponent(t[e]);return t}function dt({href:t}){return t.split("#")[0]}function we(...t){let e=5381;for(const n of t)if(typeof n=="string"){let r=n.length;for(;r;)e=e*33^n.charCodeAt(--r)}else if(ArrayBuffer.isView(n)){const r=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let a=r.length;for(;a;)e=e*33^r[--a]}else throw new TypeError("value must be a string or TypedArray");return(e>>>0).toString(36)}new TextEncoder;new TextDecoder;function ve(t){const e=atob(t),n=new Uint8Array(e.length);for(let r=0;r((t instanceof Request?t.method:(e==null?void 0:e.method)||"GET")!=="GET"&&K.delete(Rt(t)),ye(t,e));const K=new Map;function be(t,e){const n=Rt(t,e),r=document.querySelector(n);if(r!=null&&r.textContent){r.remove();let{body:a,...s}=JSON.parse(r.textContent);const o=r.getAttribute("data-ttl");return o&&K.set(n,{body:a,init:s,ttl:1e3*Number(o)}),r.getAttribute("data-b64")!==null&&(a=ve(a)),Promise.resolve(new Response(a,s))}return window.fetch(t,e)}function ke(t,e,n){if(K.size>0){const r=Rt(t,n),a=K.get(r);if(a){if(performance.now(){const a=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(r);if(a)return e.push({name:a[1],matcher:a[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const s=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(r);if(s)return e.push({name:s[1],matcher:s[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!r)return;const o=r.split(/\[(.+?)\](?!\])/);return"/"+o.map((c,l)=>{if(l%2){if(c.startsWith("x+"))return ht(String.fromCharCode(parseInt(c.slice(2),16)));if(c.startsWith("u+"))return ht(String.fromCharCode(...c.slice(2).split("-").map(_=>parseInt(_,16))));const d=Ee.exec(c),[,u,v,f,h]=d;return e.push({name:f,matcher:h,optional:!!u,rest:!!v,chained:v?l===1&&o[0]==="":!1}),v?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return ht(c)}).join("")}).join("")}/?$`),params:e}}function Re(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function xe(t){return t.slice(1).split("/").filter(Re)}function Le(t,e,n){const r={},a=t.slice(1),s=a.filter(i=>i!==void 0);let o=0;for(let i=0;id).join("/"),o=0),l===void 0){c.rest&&(r[c.name]="");continue}if(!c.matcher||n[c.matcher](l)){r[c.name]=l;const d=e[i+1],u=a[i+1];d&&!d.rest&&d.optional&&u&&c.chained&&(o=0),!d&&!u&&Object.keys(r).length===s.length&&(o=0);continue}if(c.optional&&c.chained){o++;continue}return}if(!o)return r}function ht(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Ue({nodes:t,server_loads:e,dictionary:n,matchers:r}){const a=new Set(e);return Object.entries(n).map(([i,[c,l,d]])=>{const{pattern:u,params:v}=Se(i),f={id:i,exec:h=>{const _=u.exec(h);if(_)return Le(_,v,r)},errors:[1,...d||[]].map(h=>t[h]),layouts:[0,...l||[]].map(o),leaf:s(c)};return f.errors.length=f.layouts.length=Math.max(f.errors.length,f.layouts.length),f});function s(i){const c=i<0;return c&&(i=~i),[c,t[i]]}function o(i){return i===void 0?i:[a.has(i),t[i]]}}function Wt(t,e=JSON.parse){try{return e(sessionStorage[t])}catch{}}function Nt(t,e,n=JSON.stringify){const r=n(e);try{sessionStorage[t]=r}catch{}}var Mt;const L=((Mt=globalThis.__sveltekit_1brftwe)==null?void 0:Mt.base)??"";var Ft;const Ae=((Ft=globalThis.__sveltekit_1brftwe)==null?void 0:Ft.assets)??L??"",Te="1785837307558",Yt="sveltekit:snapshot",zt="sveltekit:scroll",Ht="sveltekit:states",$e="sveltekit:pageurl",V="sveltekit:history",M="sveltekit:navigation",P={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},it=location.origin;function xt(t){if(t instanceof URL)return t;let e=document.baseURI;if(!e){const n=document.getElementsByTagName("base");e=n.length?n[0].href:document.URL}return new URL(t,e)}function ct(){return{x:pageXOffset,y:pageYOffset}}function D(t,e){return t.getAttribute(`data-sveltekit-${e}`)}const Dt={...P,"":P.hover};function Jt(t){let e=t.assignedSlot??t.parentNode;return(e==null?void 0:e.nodeType)===11&&(e=e.host),e}function Xt(t,e){for(;t&&t!==e;){if(t.nodeName.toUpperCase()==="A"&&t.hasAttribute("href"))return t;t=Jt(t)}}function mt(t,e,n){let r;try{if(r=new URL(t instanceof SVGAElement?t.href.baseVal:t.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){const i=location.hash.split("#")[1]||"/";r.hash=`#${i}${r.hash}`}}catch{}const a=t instanceof SVGAElement?t.target.baseVal:t.target,s=!r||!!a||lt(r,e,n)||(t.getAttribute("rel")||"").split(/\s+/).includes("external"),o=(r==null?void 0:r.origin)===it&&t.hasAttribute("download");return{url:r,external:s,target:a,download:o}}function Z(t){let e=null,n=null,r=null,a=null,s=null,o=null,i=t;for(;i&&i!==document.documentElement;)r===null&&(r=D(i,"preload-code")),a===null&&(a=D(i,"preload-data")),e===null&&(e=D(i,"keepfocus")),n===null&&(n=D(i,"noscroll")),s===null&&(s=D(i,"reload")),o===null&&(o=D(i,"replacestate")),i=Jt(i);function c(l){switch(l){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:Dt[r??"off"],preload_data:Dt[a??"off"],keepfocus:c(e),noscroll:c(n),reload:c(s),replace_state:c(o)}}function Vt(t){const e=bt(t);let n=!0;function r(){n=!0,e.update(o=>o)}function a(o){n=!1,e.set(o)}function s(o){let i;return e.subscribe(c=>{(i===void 0||n&&c!==i)&&o(i=c)})}return{notify:r,set:a,subscribe:s}}const Qt={v:()=>{}};function Ie(){const{set:t,subscribe:e}=bt(!1);let n;async function r(){clearTimeout(n);try{const a=await fetch(`${Ae}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!a.ok)return!1;const o=(await a.json()).version!==Te;return o&&(t(!0),Qt.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:e,check:r}}function lt(t,e,n){return t.origin!==it||!t.pathname.startsWith(e)?!0:n?t.pathname!==location.pathname:!1}function sn(t){}const Zt=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Zt];const Oe=new Set([...Zt]);[...Oe];function Pe(t){return t.filter(e=>e!=null)}function Lt(t){return t instanceof kt||t instanceof St?t.status:500}function Ce(t){return t instanceof St?t.text:"Internal Error"}let S,F,pt;const je=jt.toString().includes("$$")||/function \w+\(\) \{\}/.test(jt.toString());je?(S={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL("https://example.com")},F={current:null},pt={current:!1}):(S=new class{constructor(){U(this,"data",$state.raw({}));U(this,"form",$state.raw(null));U(this,"error",$state.raw(null));U(this,"params",$state.raw({}));U(this,"route",$state.raw({id:null}));U(this,"state",$state.raw({}));U(this,"status",$state.raw(-1));U(this,"url",$state.raw(new URL("https://example.com")))}},F=new class{constructor(){U(this,"current",$state.raw(null))}},pt=new class{constructor(){U(this,"current",$state.raw(!1))}},Qt.v=()=>pt.current=!0);function Ne(t){Object.assign(S,t)}const De=new Set(["icon","shortcut icon","apple-touch-icon"]),j=Wt(zt)??{},W=Wt(Yt)??{},O={url:Vt({}),page:Vt({}),navigating:bt(null),updated:Ie()};function Ut(t){j[t]=ct()}function Ve(t,e){let n=t+1;for(;j[n];)delete j[n],n+=1;for(n=e+1;W[n];)delete W[n],n+=1}function Y(t,e=!1){return e?location.replace(t.href):location.href=t.href,new Promise(()=>{})}async function te(){if("serviceWorker"in navigator){const t=await navigator.serviceWorker.getRegistration(L||"/");t&&await t.update()}}function qt(){}let At,_t,tt,T,wt,b;const et=[],nt=[];let w=null;function vt(){var t;(t=w==null?void 0:w.fork)==null||t.then(e=>e==null?void 0:e.discard()),w=null}const X=new Map,ee=new Set,qe=new Set,G=new Set;let m={branch:[],error:null,url:null},ne=!1,at=!1,Bt=!0,z=!1,B=!1,ae=!1,Tt=!1,re,E,x,C;const rt=new Set,Kt=new Map;async function un(t,e,n){var s,o,i,c,l;(s=globalThis.__sveltekit_1brftwe)!=null&&s.data&&globalThis.__sveltekit_1brftwe.data,document.URL!==location.href&&(location.href=location.href),b=t,await((i=(o=t.hooks).init)==null?void 0:i.call(o)),At=Ue(t),T=document.documentElement,wt=e,_t=t.nodes[0],tt=t.nodes[1],_t(),tt(),E=(c=history.state)==null?void 0:c[V],x=(l=history.state)==null?void 0:l[M],E||(E=x=Date.now(),history.replaceState({...history.state,[V]:E,[M]:x},""));const r=j[E];function a(){r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y))}n?(a(),await Ze(wt,n)):(await q({type:"enter",url:xt(b.hash?nn(new URL(location.href)):location.href),replace_state:!0}),a()),Qe()}function Be(){et.length=0,Tt=!1}function oe(t){nt.some(e=>e==null?void 0:e.snapshot)&&(W[t]=nt.map(e=>{var n;return(n=e==null?void 0:e.snapshot)==null?void 0:n.capture()}))}function se(t){var e;(e=W[t])==null||e.forEach((n,r)=>{var a,s;(s=(a=nt[r])==null?void 0:a.snapshot)==null||s.restore(n)})}function Gt(){Ut(E),Nt(zt,j),oe(x),Nt(Yt,W)}async function ie(t,e,n,r){let a;e.invalidateAll&&vt(),await q({type:"goto",url:xt(t),keepfocus:e.keepFocus,noscroll:e.noScroll,replace_state:e.replaceState,state:e.state,redirect_count:n,nav_token:r,accept:()=>{e.invalidateAll&&(Tt=!0,a=[...Kt.keys()]),e.invalidate&&e.invalidate.forEach(Xe)}}),e.invalidateAll&&Q().then(Q).then(()=>{Kt.forEach(({resource:s},o)=>{var i;a!=null&&a.includes(o)&&((i=s.refresh)==null||i.call(s))})})}async function Ke(t){if(t.id!==(w==null?void 0:w.id)){vt();const e={};rt.add(e),w={id:t.id,token:e,promise:le({...t,preload:e}).then(n=>(rt.delete(e),n.type==="loaded"&&n.state.error&&vt(),n)),fork:null}}return w.promise}async function gt(t){var n;const e=(n=await ft(t,!1))==null?void 0:n.route;e&&await Promise.all([...e.layouts,e.leaf].map(r=>r==null?void 0:r[1]()))}async function ce(t,e,n){var a;m=t.state;const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(S,t.props.page),re=new b.root({target:e,props:{...t.props,stores:O,components:nt},hydrate:n,sync:!1}),await Promise.resolve(),se(x),n){const s={from:null,to:{params:m.params,route:{id:((a=m.route)==null?void 0:a.id)??null},url:new URL(location.href)},willUnload:!1,type:"enter",complete:Promise.resolve()};G.forEach(o=>o(s))}at=!0}function ot({url:t,params:e,branch:n,status:r,error:a,route:s,form:o}){let i="never";if(L&&(t.pathname===L||t.pathname===L+"/"))i="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(i=f.slash);t.pathname=ge(t.pathname,i),t.search=t.search;const c={type:"loaded",state:{url:t,params:e,branch:n,error:a,route:s},props:{constructors:Pe(n).map(f=>f.node.component),page:Ct(S)}};o!==void 0&&(c.props.form=o);let l={},d=!S,u=0;for(let f=0;fi(new URL(o))))return!0;return!1}function It(t,e){return(t==null?void 0:t.type)==="data"?t:(t==null?void 0:t.type)==="skip"?e??null:null}function Fe(t,e){if(!t)return new Set(e.searchParams.keys());const n=new Set([...t.searchParams.keys(),...e.searchParams.keys()]);for(const r of n){const a=t.searchParams.getAll(r),s=e.searchParams.getAll(r);a.every(o=>s.includes(o))&&s.every(o=>a.includes(o))&&n.delete(r)}return n}function We({error:t,url:e,route:n,params:r}){return{type:"loaded",state:{error:t,url:e,route:n,params:r,branch:[]},props:{page:Ct(S),constructors:[]}}}async function le({id:t,invalidating:e,url:n,params:r,route:a,preload:s}){if((w==null?void 0:w.id)===t)return rt.delete(w.token),w.promise;const{errors:o,layouts:i,leaf:c}=a,l=[...i,c];o.forEach(g=>g==null?void 0:g().catch(()=>{})),l.forEach(g=>g==null?void 0:g[1]().catch(()=>{}));const d=m.url?t!==st(m.url):!1,u=m.route?a.id!==m.route.id:!1,v=Fe(m.url,n);let f=!1;const h=l.map(async(g,p)=>{var $;if(!g)return;const k=m.branch[p];return g[1]===(k==null?void 0:k.loader)&&!Me(f,u,d,v,($=k.universal)==null?void 0:$.uses,r)?k:(f=!0,$t({loader:g[1],url:n,params:r,route:a,parent:async()=>{var J;const A={};for(let y=0;y{});const _=[];for(let g=0;gPromise.resolve({}),server_data_node:It(s)}),i={node:await tt(),loader:tt,universal:null,server:null,data:null};return ot({url:n,params:a,branch:[o,i],status:t,error:e,route:null})}catch(o){if(o instanceof Et)return ie(new URL(o.location,location.href),{},0);throw o}}async function ze(t){const e=t.href;if(X.has(e))return X.get(e);let n;try{const r=(async()=>{let a=await b.hooks.reroute({url:new URL(t),fetch:async(s,o)=>Ge(s,o,t).promise})??t;if(typeof a=="string"){const s=new URL(t);b.hash?s.hash=a:s.pathname=a,a=s}return a})();X.set(e,r),n=await r}catch{X.delete(e);return}return n}async function ft(t,e){if(t&&!lt(t,L,b.hash)){const n=await ze(t);if(!n)return;const r=He(n);for(const a of At){const s=a.exec(r);if(s)return{id:st(t),invalidating:e,route:a,params:_e(s),url:t}}}}function He(t){return me(b.hash?t.hash.replace(/^#/,"").replace(/[?#].+/,""):t.pathname.slice(L.length))||"/"}function st(t){return(b.hash?t.hash.replace(/^#/,""):t.pathname)+t.search}function fe({url:t,type:e,intent:n,delta:r,event:a}){let s=!1;const o=Pt(m,n,t,e);r!==void 0&&(o.navigation.delta=r),a!==void 0&&(o.navigation.event=a);const i={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return z||ee.forEach(c=>c(i)),s?null:o}async function q({type:t,url:e,popped:n,keepfocus:r,noscroll:a,replace_state:s,state:o={},redirect_count:i=0,nav_token:c={},accept:l=qt,block:d=qt,event:u}){const v=C;C=c;const f=await ft(e,!1),h=t==="enter"?Pt(m,f,e,t):fe({url:e,type:t,delta:n==null?void 0:n.delta,intent:f,event:u});if(!h){d(),C===c&&(C=v);return}const _=E,g=x;l(),z=!0,at&&h.navigation.type!=="enter"&&O.navigating.set(F.current=h.navigation);let p=f&&await le(f);if(!p){if(lt(e,L,b.hash))return await Y(e,s);p=await ue(e,{id:null},await H(new St(404,"Not Found",`Not found: ${e.pathname}`),{url:e,params:{},route:{id:null}}),404,s)}if(e=(f==null?void 0:f.url)||e,C!==c)return h.reject(new Error("navigation aborted")),!1;if(p.type==="redirect"){if(i<20){await q({type:t,url:new URL(p.location,e),popped:n,keepfocus:r,noscroll:a,replace_state:s,state:o,redirect_count:i+1,nav_token:c}),h.fulfil(void 0);return}p=await Ot({status:500,error:await H(new Error("Redirect loop"),{url:e,params:{},route:{id:null}}),url:e,route:{id:null}})}else p.props.page.status>=400&&await O.updated.check()&&(await te(),await Y(e,s));if(Be(),Ut(_),oe(g),p.props.page.url.pathname!==e.pathname&&(e.pathname=p.props.page.url.pathname),o=n?n.state:o,!n){const y=s?0:1,N={[V]:E+=y,[M]:x+=y,[Ht]:o};(s?history.replaceState:history.pushState).call(history,N,"",e),s||Ve(E,x)}const k=f&&(w==null?void 0:w.id)===f.id?w.fork:null;w=null,p.props.page.state=o;let R;if(at){const y=(await Promise.all(Array.from(qe,I=>I(h.navigation)))).filter(I=>typeof I=="function");if(y.length>0){let I=function(){y.forEach(ut=>{G.delete(ut)})};y.push(I),y.forEach(ut=>{G.add(ut)})}m=p.state,p.props.page&&(p.props.page.url=e);const N=k&&await k;N?R=N.commit():(re.$set(p.props),Ne(p.props.page),R=void 0),ae=!0}else await ce(p,wt,!1);const{activeElement:$}=document;await R,await Q(),await Q();let A=n?n.scroll:a?ct():null;if(Bt){const y=e.hash&&document.getElementById(de(e));if(A)scrollTo(A.x,A.y);else if(y){y.scrollIntoView();const{top:N,left:I}=y.getBoundingClientRect();A={x:pageXOffset+I,y:pageYOffset+N}}else scrollTo(0,0)}const J=document.activeElement!==$&&document.activeElement!==document.body;!r&&!J&&en(e,A),Bt=!0,p.props.page&&Object.assign(S,p.props.page),z=!1,t==="popstate"&&se(x),h.fulfil(void 0),G.forEach(y=>y(h.navigation)),O.navigating.set(F.current=null)}async function ue(t,e,n,r,a){return t.origin===it&&t.pathname===location.pathname&&!ne?await Ot({status:r,error:n,url:t,route:e}):await Y(t,a)}function Je(){let t,e,n;T.addEventListener("mousemove",i=>{const c=i.target;clearTimeout(t),t=setTimeout(()=>{s(c,P.hover)},20)});function r(i){i.defaultPrevented||s(i.composedPath()[0],P.tap)}T.addEventListener("mousedown",r),T.addEventListener("touchstart",r,{passive:!0});const a=new IntersectionObserver(i=>{for(const c of i)c.isIntersecting&&(gt(new URL(c.target.href)),a.unobserve(c.target))},{threshold:0});async function s(i,c){const l=Xt(i,T),d=l===e&&c>=n;if(!l||d)return;const{url:u,external:v,download:f}=mt(l,L,b.hash);if(v||f)return;const h=Z(l),_=u&&st(m.url)===st(u);if(!(h.reload||_))if(c<=h.preload_data){e=l,n=P.tap;const g=await ft(u,!1);if(!g)return;Ke(g)}else c<=h.preload_code&&(e=l,n=c,gt(u))}function o(){a.disconnect();for(const i of T.querySelectorAll("a")){const{url:c,external:l,download:d}=mt(i,L,b.hash);if(l||d)continue;const u=Z(i);u.reload||(u.preload_code===P.viewport&&a.observe(i),u.preload_code===P.eager&>(c))}}G.add(o),o()}function H(t,e){if(t instanceof kt)return t.body;const n=Lt(t),r=Ce(t);return b.hooks.handleError({error:t,event:e,status:n,message:r})??{message:r}}function dn(t,e={}){return t=new URL(xt(t)),t.origin!==it?Promise.reject(new Error("goto: invalid URL")):ie(t,e,0)}function Xe(t){if(typeof t=="function")et.push(t);else{const{href:e}=new URL(t,location.href);et.push(n=>n.href===e)}}function Qe(){var e;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let r=!1;if(Gt(),!z){const a=Pt(m,void 0,null,"leave"),s={...a.navigation,cancel:()=>{r=!0,a.reject(new Error("navigation cancelled"))}};ee.forEach(o=>o(s))}r?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&Gt()}),(e=navigator.connection)!=null&&e.saveData||Je(),T.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const r=Xt(n.composedPath()[0],T);if(!r)return;const{url:a,external:s,target:o,download:i}=mt(r,L,b.hash);if(!a)return;if(o==="_parent"||o==="_top"){if(window.parent!==window)return}else if(o&&o!=="_self")return;const c=Z(r);if(!(r instanceof SVGAElement)&&a.protocol!==location.protocol&&!(a.protocol==="https:"||a.protocol==="http:")||i)return;const[d,u]=(b.hash?a.hash.replace(/^#/,""):a.href).split("#"),v=d===dt(location);if(s||c.reload&&(!v||!u)){fe({url:a,type:"link",event:n})?z=!0:n.preventDefault();return}if(u!==void 0&&v){const[,f]=m.url.href.split("#");if(f===u){if(n.preventDefault(),u===""||u==="top"&&r.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const h=r.ownerDocument.getElementById(decodeURIComponent(u));h&&(h.scrollIntoView(),h.focus())}return}if(B=!0,Ut(E),t(a),!c.replace_state)return;B=!1}n.preventDefault(),await new Promise(f=>{requestAnimationFrame(()=>{setTimeout(f,0)}),setTimeout(f,100)}),await q({type:"link",url:a,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??a.href===location.href,event:n})}),T.addEventListener("submit",n=>{if(n.defaultPrevented)return;const r=HTMLFormElement.prototype.cloneNode.call(n.target),a=n.submitter;if(((a==null?void 0:a.formTarget)||r.target)==="_blank"||((a==null?void 0:a.formMethod)||r.method)!=="get")return;const i=new URL((a==null?void 0:a.hasAttribute("formaction"))&&(a==null?void 0:a.formAction)||r.action);if(lt(i,L,!1))return;const c=n.target,l=Z(c);if(l.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(c,a);i.search=new URLSearchParams(d).toString(),q({type:"form",url:i,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??i.href===location.href,event:n})}),addEventListener("popstate",async n=>{var r;if(!yt){if((r=n.state)!=null&&r[V]){const a=n.state[V];if(C={},a===E)return;const s=j[a],o=n.state[Ht]??{},i=new URL(n.state[$e]??location.href),c=n.state[M],l=m.url?dt(location)===dt(m.url):!1;if(c===x&&(ae||l)){o!==S.state&&(S.state=o),t(i),j[E]=ct(),s&&scrollTo(s.x,s.y),E=a;return}const u=a-E;await q({type:"popstate",url:i,popped:{state:o,scroll:s,delta:u},accept:()=>{E=a,x=c},block:()=>{history.go(-u)},nav_token:C,event:n})}else if(!B){const a=new URL(location.href);t(a),b.hash&&location.reload()}}}),addEventListener("hashchange",()=>{B&&(B=!1,history.replaceState({...history.state,[V]:++E,[M]:x},"",location.href))});for(const n of document.querySelectorAll("link"))De.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&O.navigating.set(F.current=null)});function t(n){m.url=S.url=n,O.page.set(Ct(S)),O.page.notify()}}async function Ze(t,{status:e=200,error:n,node_ids:r,params:a,route:s,server_route:o,data:i,form:c}){ne=!0;const l=new URL(location.href);let d;({params:a={},route:s={id:null}}=await ft(l,!1)||{}),d=At.find(({id:f})=>f===s.id);let u,v=!0;try{const f=r.map(async(_,g)=>{const p=i[g];return p!=null&&p.uses&&(p.uses=tn(p.uses)),$t({loader:b.nodes[_],url:l,params:a,route:s,parent:async()=>{const k={};for(let R=0;R{const i=history.state;yt=!0,location.replace(`#${r}`),b.hash&&location.replace(t.hash),history.replaceState(i,"",t.hash),scrollTo(s,o),yt=!1})}else{const s=document.body,o=s.getAttribute("tabindex");s.tabIndex=-1,s.focus({preventScroll:!0,focusVisible:!1}),o!==null?s.setAttribute("tabindex",o):s.removeAttribute("tabindex")}const a=getSelection();if(a&&a.type!=="None"){const s=[];for(let o=0;o{if(a.rangeCount===s.length){for(let o=0;o{a=d,s=u});return o.catch(()=>{}),{navigation:{from:{params:t.params,route:{id:((c=t.route)==null?void 0:c.id)??null},url:t.url},to:n&&{params:(e==null?void 0:e.params)??null,route:{id:((l=e==null?void 0:e.route)==null?void 0:l.id)??null},url:n},willUnload:!e,type:r,complete:o},fulfil:a,reject:s}}function Ct(t){return{data:t.data,error:t.error,form:t.form,params:t.params,route:t.route,state:t.state,status:t.status,url:t.url}}function nn(t){const e=new URL(t);return e.hash=decodeURIComponent(t.hash),e}function de(t){let e;if(b.hash){const[,,n]=t.hash.split("#",3);e=n??""}else e=t.hash.slice(1);return decodeURIComponent(e)}export{un as a,dn as g,sn as l,O as s}; diff --git a/gui/next/build/_app/immutable/chunks/odGh2V91.js b/gui/next/build/_app/immutable/chunks/odGh2V91.js new file mode 100644 index 0000000..98b67fd --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/odGh2V91.js @@ -0,0 +1 @@ +import{q as n}from"./Ul9VwQ7n.js";function r(t,{delay:o=0,duration:e=400,easing:i=n}={}){const a=+getComputedStyle(t).opacity;return{delay:o,duration:e,easing:i,css:c=>`opacity: ${c*a}`}}export{r as f}; diff --git a/gui/next/build/_app/immutable/chunks/t7b_BBSP.js b/gui/next/build/_app/immutable/chunks/t7b_BBSP.js new file mode 100644 index 0000000..3afdb0c --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/t7b_BBSP.js @@ -0,0 +1,21 @@ +import{g as t}from"./BD1m7lx9.js";const i={get:e=>t({query:` + query( + $per_page: Int + $id: ID + ) { + admin_tables( + per_page: $per_page + filter: { + id: { value: $id } + } + ) { + results { + id + name + properties { + name + attribute_type + } + } + } + }`,variables:{per_page:100,id:e}}).then(r=>r.admin_tables.results)};export{i as t}; diff --git a/gui/next/build/_app/immutable/chunks/x4PJc0Qf.js b/gui/next/build/_app/immutable/chunks/x4PJc0Qf.js new file mode 100644 index 0000000..b926de0 --- /dev/null +++ b/gui/next/build/_app/immutable/chunks/x4PJc0Qf.js @@ -0,0 +1 @@ +const o=t=>{if(t&&typeof t=="object")return t;try{const e=JSON.parse(t);if(e&&typeof e=="object")return e}catch{}return!1};export{o as t}; diff --git a/gui/next/build/_app/immutable/entry/app.DmHCXHOx.js b/gui/next/build/_app/immutable/entry/app.DmHCXHOx.js new file mode 100644 index 0000000..89465fa --- /dev/null +++ b/gui/next/build/_app/immutable/entry/app.DmHCXHOx.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.zwm5ZMAN.js","../chunks/Ul9VwQ7n.js","../chunks/Bh3MJlbi.js","../chunks/C5zjxmar.js","../chunks/bH_aOImW.js","../chunks/RFIyOgWr.js","../chunks/t7b_BBSP.js","../chunks/BD1m7lx9.js","../chunks/DGc7Lmco.js","../chunks/D-yR0E5w.js","../chunks/BNCRiqmJ.js","../chunks/odGh2V91.js","../assets/0.QmKtTD0U.css","../nodes/1.B0n1BD_0.js","../nodes/2.C3vbTXim.js","../chunks/CIy9Z9Qf.js","../chunks/Bg88RIi0.js","../assets/Number.AfD80Zdm.css","../assets/2.Cpa7KQFv.css","../nodes/3.Bz4QTVmH.js","../nodes/4.Cy2tpkZR.js","../chunks/BVq9mvWR.js","../assets/CautionBanner.C54xYRep.css","../assets/4.B9XykGLe.css","../nodes/5.Bz4QTVmH.js","../nodes/6.BTcDvYil.js","../chunks/CS29TWE_.js","../chunks/CNoDK8-a.js","../chunks/BkeFH9yg.js","../chunks/Cpu2L2kn.js","../chunks/x4PJc0Qf.js","../assets/Toggle.o--CU0Za.css","../assets/6.CufhmNsu.css","../nodes/7.D_-4meMh.js","../assets/7.CDkZYgtF.css","../nodes/8.DxJ3_9M1.js","../nodes/9.DQ8eZK33.js","../chunks/DntFPtNo.js","../assets/Aside.HqXgbmTR.css","../chunks/BVVGnpm8.js","../assets/JSONTree.Do8jmj2M.css","../assets/9.O9jYhcLF.css","../nodes/10.CpYcdA_2.js","../assets/10.PIDpwlWF.css","../nodes/11.C73io08e.js","../nodes/12.q7a9ldLT.js","../assets/12.EFLSpW2v.css","../nodes/13.D8FJ5ozT.js","../assets/13.NkhcTUJj.css","../nodes/14.D7NRbAwv.js","../nodes/15.WKQetCTJ.js","../assets/15.BIXMQND7.css"])))=>i.map(i=>d[i]); +import{s as B,d as w,i as b,g as J,v as p,j as G,S as H,T as W,G as z,U as E,w as S,A as R,c as F,e as K,h as Q,H as I,a as X,f as Y,t as Z}from"../chunks/Ul9VwQ7n.js";import{S as M,i as x,t as d,a as h,g as A,e as T,d as k,b as v,m as P,c as V}from"../chunks/Bh3MJlbi.js";const ee="modulepreload",te=function(a,e){return new URL(a,e).href},y={},u=function(e,n,o){let s=Promise.resolve();if(n&&n.length>0){const t=document.getElementsByTagName("link"),r=document.querySelector("meta[property=csp-nonce]"),i=(r==null?void 0:r.nonce)||(r==null?void 0:r.getAttribute("nonce"));s=Promise.allSettled(n.map(l=>{if(l=te(l,o),l in y)return;y[l]=!0;const f=l.endsWith(".css"),m=f?'[rel="stylesheet"]':"";if(!!o)for(let L=t.length-1;L>=0;L--){const D=t[L];if(D.href===l&&(!f||D.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${l}"]${m}`))return;const g=document.createElement("link");if(g.rel=f?"stylesheet":ee,f||(g.as="script"),g.crossOrigin="",g.href=l,i&&g.setAttribute("nonce",i),document.head.appendChild(g),f)return new Promise((L,D)=>{g.addEventListener("load",L),g.addEventListener("error",()=>D(new Error(`Unable to preload CSS for ${l}`)))})}))}function c(t){const r=new Event("vite:preloadError",{cancelable:!0});if(r.payload=t,window.dispatchEvent(r),!r.defaultPrevented)throw t}return s.then(t=>{for(const r of t||[])r.status==="rejected"&&c(r.reason);return e().catch(c)})},me={};function ne(a){let e,n,o;var s=a[2][0];function c(t,r){return{props:{data:t[4],form:t[3],params:t[1].params}}}return s&&(e=E(s,c(a)),a[15](e)),{c(){e&&v(e.$$.fragment),n=p()},l(t){e&&V(e.$$.fragment,t),n=p()},m(t,r){e&&P(e,t,r),b(t,n,r),o=!0},p(t,r){if(r&4&&s!==(s=t[2][0])){if(e){A();const i=e;d(i.$$.fragment,1,0,()=>{k(i,1)}),T()}s?(e=E(s,c(t)),t[15](e),v(e.$$.fragment),h(e.$$.fragment,1),P(e,n.parentNode,n)):e=null}else if(s){const i={};r&16&&(i.data=t[4]),r&8&&(i.form=t[3]),r&2&&(i.params=t[1].params),e.$set(i)}},i(t){o||(e&&h(e.$$.fragment,t),o=!0)},o(t){e&&d(e.$$.fragment,t),o=!1},d(t){t&&w(n),a[15](null),e&&k(e,t)}}}function re(a){let e,n,o;var s=a[2][0];function c(t,r){return{props:{data:t[4],params:t[1].params,$$slots:{default:[ae]},$$scope:{ctx:t}}}}return s&&(e=E(s,c(a)),a[14](e)),{c(){e&&v(e.$$.fragment),n=p()},l(t){e&&V(e.$$.fragment,t),n=p()},m(t,r){e&&P(e,t,r),b(t,n,r),o=!0},p(t,r){if(r&4&&s!==(s=t[2][0])){if(e){A();const i=e;d(i.$$.fragment,1,0,()=>{k(i,1)}),T()}s?(e=E(s,c(t)),t[14](e),v(e.$$.fragment),h(e.$$.fragment,1),P(e,n.parentNode,n)):e=null}else if(s){const i={};r&16&&(i.data=t[4]),r&2&&(i.params=t[1].params),r&65647&&(i.$$scope={dirty:r,ctx:t}),e.$set(i)}},i(t){o||(e&&h(e.$$.fragment,t),o=!0)},o(t){e&&d(e.$$.fragment,t),o=!1},d(t){t&&w(n),a[14](null),e&&k(e,t)}}}function ie(a){let e,n,o;var s=a[2][1];function c(t,r){return{props:{data:t[5],form:t[3],params:t[1].params}}}return s&&(e=E(s,c(a)),a[13](e)),{c(){e&&v(e.$$.fragment),n=p()},l(t){e&&V(e.$$.fragment,t),n=p()},m(t,r){e&&P(e,t,r),b(t,n,r),o=!0},p(t,r){if(r&4&&s!==(s=t[2][1])){if(e){A();const i=e;d(i.$$.fragment,1,0,()=>{k(i,1)}),T()}s?(e=E(s,c(t)),t[13](e),v(e.$$.fragment),h(e.$$.fragment,1),P(e,n.parentNode,n)):e=null}else if(s){const i={};r&32&&(i.data=t[5]),r&8&&(i.form=t[3]),r&2&&(i.params=t[1].params),e.$set(i)}},i(t){o||(e&&h(e.$$.fragment,t),o=!0)},o(t){e&&d(e.$$.fragment,t),o=!1},d(t){t&&w(n),a[13](null),e&&k(e,t)}}}function se(a){let e,n,o;var s=a[2][1];function c(t,r){return{props:{data:t[5],params:t[1].params,$$slots:{default:[oe]},$$scope:{ctx:t}}}}return s&&(e=E(s,c(a)),a[12](e)),{c(){e&&v(e.$$.fragment),n=p()},l(t){e&&V(e.$$.fragment,t),n=p()},m(t,r){e&&P(e,t,r),b(t,n,r),o=!0},p(t,r){if(r&4&&s!==(s=t[2][1])){if(e){A();const i=e;d(i.$$.fragment,1,0,()=>{k(i,1)}),T()}s?(e=E(s,c(t)),t[12](e),v(e.$$.fragment),h(e.$$.fragment,1),P(e,n.parentNode,n)):e=null}else if(s){const i={};r&32&&(i.data=t[5]),r&2&&(i.params=t[1].params),r&65615&&(i.$$scope={dirty:r,ctx:t}),e.$set(i)}},i(t){o||(e&&h(e.$$.fragment,t),o=!0)},o(t){e&&d(e.$$.fragment,t),o=!1},d(t){t&&w(n),a[12](null),e&&k(e,t)}}}function oe(a){let e,n,o;var s=a[2][2];function c(t,r){return{props:{data:t[6],form:t[3],params:t[1].params}}}return s&&(e=E(s,c(a)),a[11](e)),{c(){e&&v(e.$$.fragment),n=p()},l(t){e&&V(e.$$.fragment,t),n=p()},m(t,r){e&&P(e,t,r),b(t,n,r),o=!0},p(t,r){if(r&4&&s!==(s=t[2][2])){if(e){A();const i=e;d(i.$$.fragment,1,0,()=>{k(i,1)}),T()}s?(e=E(s,c(t)),t[11](e),v(e.$$.fragment),h(e.$$.fragment,1),P(e,n.parentNode,n)):e=null}else if(s){const i={};r&64&&(i.data=t[6]),r&8&&(i.form=t[3]),r&2&&(i.params=t[1].params),e.$set(i)}},i(t){o||(e&&h(e.$$.fragment,t),o=!0)},o(t){e&&d(e.$$.fragment,t),o=!1},d(t){t&&w(n),a[11](null),e&&k(e,t)}}}function ae(a){let e,n,o,s;const c=[se,ie],t=[];function r(i,l){return i[2][2]?0:1}return e=r(a),n=t[e]=c[e](a),{c(){n.c(),o=p()},l(i){n.l(i),o=p()},m(i,l){t[e].m(i,l),b(i,o,l),s=!0},p(i,l){let f=e;e=r(i),e===f?t[e].p(i,l):(A(),d(t[f],1,1,()=>{t[f]=null}),T(),n=t[e],n?n.p(i,l):(n=t[e]=c[e](i),n.c()),h(n,1),n.m(o.parentNode,o))},i(i){s||(h(n),s=!0)},o(i){d(n),s=!1},d(i){i&&w(o),t[e].d(i)}}}function $(a){let e,n=a[8]&&N(a);return{c(){e=Q("div"),n&&n.c(),this.h()},l(o){e=F(o,"DIV",{id:!0,"aria-live":!0,"aria-atomic":!0,style:!0});var s=K(e);n&&n.l(s),s.forEach(w),this.h()},h(){S(e,"id","svelte-announcer"),S(e,"aria-live","assertive"),S(e,"aria-atomic","true"),R(e,"position","absolute"),R(e,"left","0"),R(e,"top","0"),R(e,"clip","rect(0 0 0 0)"),R(e,"clip-path","inset(50%)"),R(e,"overflow","hidden"),R(e,"white-space","nowrap"),R(e,"width","1px"),R(e,"height","1px")},m(o,s){b(o,e,s),n&&n.m(e,null)},p(o,s){o[8]?n?n.p(o,s):(n=N(o),n.c(),n.m(e,null)):n&&(n.d(1),n=null)},d(o){o&&w(e),n&&n.d()}}}function N(a){let e;return{c(){e=Z(a[9])},l(n){e=Y(n,a[9])},m(n,o){b(n,e,o)},p(n,o){o&512&&X(e,n[9])},d(n){n&&w(e)}}}function fe(a){let e,n,o,s,c;const t=[re,ne],r=[];function i(f,m){return f[2][1]?0:1}e=i(a),n=r[e]=t[e](a);let l=a[7]&&$(a);return{c(){n.c(),o=G(),l&&l.c(),s=p()},l(f){n.l(f),o=J(f),l&&l.l(f),s=p()},m(f,m){r[e].m(f,m),b(f,o,m),l&&l.m(f,m),b(f,s,m),c=!0},p(f,[m]){let O=e;e=i(f),e===O?r[e].p(f,m):(A(),d(r[O],1,1,()=>{r[O]=null}),T(),n=r[e],n?n.p(f,m):(n=r[e]=t[e](f),n.c()),h(n,1),n.m(o.parentNode,o)),f[7]?l?l.p(f,m):(l=$(f),l.c(),l.m(s.parentNode,s)):l&&(l.d(1),l=null)},i(f){c||(h(n),c=!0)},o(f){d(n),c=!1},d(f){f&&(w(o),w(s)),r[e].d(f),l&&l.d(f)}}}function le(a,e,n){let{stores:o}=e,{page:s}=e,{constructors:c}=e,{components:t=[]}=e,{form:r}=e,{data_0:i=null}=e,{data_1:l=null}=e,{data_2:f=null}=e;H(o.page.notify);let m=!1,O=!1,g=null;W(()=>{const _=o.page.subscribe(()=>{m&&(n(8,O=!0),z().then(()=>{n(9,g=document.title||"untitled page")}))});return n(7,m=!0),_});function L(_){I[_?"unshift":"push"](()=>{t[2]=_,n(0,t)})}function D(_){I[_?"unshift":"push"](()=>{t[1]=_,n(0,t)})}function C(_){I[_?"unshift":"push"](()=>{t[1]=_,n(0,t)})}function U(_){I[_?"unshift":"push"](()=>{t[0]=_,n(0,t)})}function q(_){I[_?"unshift":"push"](()=>{t[0]=_,n(0,t)})}return a.$$set=_=>{"stores"in _&&n(10,o=_.stores),"page"in _&&n(1,s=_.page),"constructors"in _&&n(2,c=_.constructors),"components"in _&&n(0,t=_.components),"form"in _&&n(3,r=_.form),"data_0"in _&&n(4,i=_.data_0),"data_1"in _&&n(5,l=_.data_1),"data_2"in _&&n(6,f=_.data_2)},a.$$.update=()=>{a.$$.dirty&1026&&o.page.set(s)},[t,s,c,r,i,l,f,m,O,g,o,L,D,C,U,q]}class pe extends M{constructor(e){super(),x(this,e,le,fe,B,{stores:10,page:1,constructors:2,components:0,form:3,data_0:4,data_1:5,data_2:6})}}const de=[()=>u(()=>import("../nodes/0.zwm5ZMAN.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]),import.meta.url),()=>u(()=>import("../nodes/1.B0n1BD_0.js"),__vite__mapDeps([13,1,2,3,4,5]),import.meta.url),()=>u(()=>import("../nodes/2.C3vbTXim.js"),__vite__mapDeps([14,1,2,10,4,5,3,15,7,8,9,16,17,18]),import.meta.url),()=>u(()=>import("../nodes/3.Bz4QTVmH.js"),__vite__mapDeps([19,1,2]),import.meta.url),()=>u(()=>import("../nodes/4.Cy2tpkZR.js"),__vite__mapDeps([20,1,2,10,11,3,4,5,8,6,7,9,21,22,23]),import.meta.url),()=>u(()=>import("../nodes/5.Bz4QTVmH.js"),__vite__mapDeps([24,1,2]),import.meta.url),()=>u(()=>import("../nodes/6.BTcDvYil.js"),__vite__mapDeps([25,1,2,26,10,4,5,8,3,27,7,28,29,30,11,9,31,16,17,21,22,32]),import.meta.url),()=>u(()=>import("../nodes/7.D_-4meMh.js"),__vite__mapDeps([33,1,2,11,8,5,6,7,9,34]),import.meta.url),()=>u(()=>import("../nodes/8.DxJ3_9M1.js"),__vite__mapDeps([35,1,2]),import.meta.url),()=>u(()=>import("../nodes/9.DQ8eZK33.js"),__vite__mapDeps([36,1,2,3,4,5,15,7,37,26,8,9,38,39,10,40,41]),import.meta.url),()=>u(()=>import("../nodes/10.CpYcdA_2.js"),__vite__mapDeps([42,1,2,10,11,7,8,5,9,43]),import.meta.url),()=>u(()=>import("../nodes/11.C73io08e.js"),__vite__mapDeps([44,1,2,8,5]),import.meta.url),()=>u(()=>import("../nodes/12.q7a9ldLT.js"),__vite__mapDeps([45,1,2,26,3,4,5,8,7,28,9,10,29,30,11,31,39,40,16,17,46]),import.meta.url),()=>u(()=>import("../nodes/13.D8FJ5ozT.js"),__vite__mapDeps([47,1,2,26,10,11,8,5,9,37,38,30,39,40,48]),import.meta.url),()=>u(()=>import("../nodes/14.D7NRbAwv.js"),__vite__mapDeps([49,1,2,8,5]),import.meta.url),()=>u(()=>import("../nodes/15.WKQetCTJ.js"),__vite__mapDeps([50,1,2,10,3,4,5,27,7,28,8,30,37,26,9,38,39,40,51]),import.meta.url)],he=[],ge={"/":[7],"/backgroundJobs":[8,[2]],"/backgroundJobs/[type]/[id]":[9,[2]],"/constants":[10,[3]],"/database":[11,[4]],"/database/table/[id]":[12,[4]],"/logs":[13,[5]],"/users":[14,[6]],"/users/[id]":[15,[6]]},j={handleError:({error:a})=>{console.error(a)},reroute:()=>{},transport:{}},_e=Object.fromEntries(Object.entries(j.transport).map(([a,e])=>[a,e.decode])),we=Object.fromEntries(Object.entries(j.transport).map(([a,e])=>[a,e.encode])),be=!1,Ee=(a,e)=>_e[a](e);export{Ee as decode,_e as decoders,ge as dictionary,we as encoders,be as hash,j as hooks,me as matchers,de as nodes,pe as root,he as server_loads}; diff --git a/gui/next/build/_app/immutable/entry/start.D4qHf1BM.js b/gui/next/build/_app/immutable/entry/start.D4qHf1BM.js new file mode 100644 index 0000000..76eff31 --- /dev/null +++ b/gui/next/build/_app/immutable/entry/start.D4qHf1BM.js @@ -0,0 +1 @@ +import{l as o,a as r}from"../chunks/bH_aOImW.js";export{o as load_css,r as start}; diff --git a/gui/next/build/_app/immutable/nodes/0.zwm5ZMAN.js b/gui/next/build/_app/immutable/nodes/0.zwm5ZMAN.js new file mode 100644 index 0000000..4e6b922 --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/0.zwm5ZMAN.js @@ -0,0 +1 @@ +import{s as ce,d as m,K as L,i as T,b as d,w as p,c as g,e as w,z as O,g as q,h as $,j as y,k as ie,r as Je,D as be,n as F,L as ze,f as we,t as Me,a as We,v as Ee,T as Oe,J as ke,A as Ie,ae as Ke,S as Re,M as Be,N as je,l as Fe,u as Ge,m as Qe,o as Xe}from"../chunks/Ul9VwQ7n.js";import{S as fe,i as he,t as k,a as b,g as K,e as R,d as P,m as U,c as D,b as J,f as re}from"../chunks/Bh3MJlbi.js";import{p as Ye}from"../chunks/C5zjxmar.js";import{t as Ze}from"../chunks/t7b_BBSP.js";import{s as B}from"../chunks/DGc7Lmco.js";import{I as j}from"../chunks/D-yR0E5w.js";import{e as Ae,u as et,o as tt}from"../chunks/BNCRiqmJ.js";import{f as oe}from"../chunks/odGh2V91.js";function ge(r){const t=r.slice(),e=typeof window<"u"&&window.location.port!=="4173"&&window.location.port!=="5173"?`http://localhost:${parseInt(window.location.port)}`:"http://localhost:3333";return t[3]=e,t}function $e(r){const t=r.slice(),e=typeof window<"u"&&window.location.port!=="4173"&&window.location.port!=="5173"?`http://localhost:${parseInt(window.location.port)}`:"http://localhost:3333";return t[3]=e,t}function st(r){var n;let t,e=((n=r[0].online)==null?void 0:n.MPKIT_URL.replace("https://",""))+"",s,i;return{c(){t=$("a"),s=Me(e),this.h()},l(c){t=g(c,"A",{href:!0});var a=w(t);s=we(a,e),a.forEach(m),this.h()},h(){var c;p(t,"href",i=(c=r[0].online)==null?void 0:c.MPKIT_URL)},m(c,a){T(c,t,a),d(t,s)},p(c,a){var l,o;a&1&&e!==(e=((l=c[0].online)==null?void 0:l.MPKIT_URL.replace("https://",""))+"")&&We(s,e),a&1&&i!==(i=(o=c[0].online)==null?void 0:o.MPKIT_URL)&&p(t,"href",i)},d(c){c&&m(t)}}}function lt(r){let t;return{c(){t=Me("disconnected")},l(e){t=we(e,"disconnected")},m(e,s){T(e,t,s)},p:F,d(e){e&&m(t)}}}function at(r){let t;return{c(){t=Me("connecting…")},l(e){t=we(e,"connecting…")},m(e,s){T(e,t,s)},p:F,d(e){e&&m(t)}}}function xe(r){let t,e,s,i,n,c="Database",a,l,o;return s=new j({props:{icon:"database"}}),{c(){t=$("li"),e=$("a"),J(s.$$.fragment),i=y(),n=$("span"),n.textContent=c,this.h()},l(f){t=g(f,"LI",{class:!0});var M=w(t);e=g(M,"A",{href:!0,class:!0});var _=w(e);D(s.$$.fragment,_),i=q(_),n=g(_,"SPAN",{class:!0,"data-svelte-h":!0}),O(n)!=="svelte-xe6gx4"&&(n.textContent=c),_.forEach(m),M.forEach(m),this.h()},h(){p(n,"class","label svelte-uthxgc"),p(e,"href","/database"),p(e,"class","svelte-uthxgc"),L(e,"active",r[1].url.pathname.startsWith("/database")),p(t,"class","svelte-uthxgc")},m(f,M){T(f,t,M),d(t,e),U(s,e,null),d(e,i),d(e,n),a=!0,l||(o=[be(e,"focus",r[2],{once:!0}),be(e,"mouseover",r[2],{once:!0})],l=!0)},p(f,M){(!a||M&2)&&L(e,"active",f[1].url.pathname.startsWith("/database"))},i(f){a||(b(s.$$.fragment,f),a=!0)},o(f){k(s.$$.fragment,f),a=!1},d(f){f&&m(t),P(s),l=!1,Je(o)}}}function He(r){let t,e,s,i,n,c="Users",a;return s=new j({props:{icon:"users"}}),{c(){t=$("li"),e=$("a"),J(s.$$.fragment),i=y(),n=$("span"),n.textContent=c,this.h()},l(l){t=g(l,"LI",{class:!0});var o=w(t);e=g(o,"A",{href:!0,class:!0});var f=w(e);D(s.$$.fragment,f),i=q(f),n=g(f,"SPAN",{class:!0,"data-svelte-h":!0}),O(n)!=="svelte-o38ms3"&&(n.textContent=c),f.forEach(m),o.forEach(m),this.h()},h(){p(n,"class","label svelte-uthxgc"),p(e,"href","/users"),p(e,"class","svelte-uthxgc"),L(e,"active",r[1].url.pathname.startsWith("/users")),p(t,"class","svelte-uthxgc")},m(l,o){T(l,t,o),d(t,e),U(s,e,null),d(e,i),d(e,n),a=!0},p(l,o){(!a||o&2)&&L(e,"active",l[1].url.pathname.startsWith("/users"))},i(l){a||(b(s.$$.fragment,l),a=!0)},o(l){k(s.$$.fragment,l),a=!1},d(l){l&&m(t),P(s)}}}function qe(r){let t,e,s,i,n,c="Logs",a;return s=new j({props:{icon:"log"}}),{c(){t=$("li"),e=$("a"),J(s.$$.fragment),i=y(),n=$("span"),n.textContent=c,this.h()},l(l){t=g(l,"LI",{class:!0});var o=w(t);e=g(o,"A",{href:!0,class:!0});var f=w(e);D(s.$$.fragment,f),i=q(f),n=g(f,"SPAN",{class:!0,"data-svelte-h":!0}),O(n)!=="svelte-17j55om"&&(n.textContent=c),f.forEach(m),o.forEach(m),this.h()},h(){p(n,"class","label svelte-uthxgc"),p(e,"href","/logs"),p(e,"class","svelte-uthxgc"),L(e,"active",r[1].url.pathname==="/logs"),p(t,"class","svelte-uthxgc")},m(l,o){T(l,t,o),d(t,e),U(s,e,null),d(e,i),d(e,n),a=!0},p(l,o){(!a||o&2)&&L(e,"active",l[1].url.pathname==="/logs")},i(l){a||(b(s.$$.fragment,l),a=!0)},o(l){k(s.$$.fragment,l),a=!1},d(l){l&&m(t),P(s)}}}function ye(r){let t,e,s,i,n,c="Background Jobs",a;return s=new j({props:{icon:"backgroundJob"}}),{c(){t=$("li"),e=$("a"),J(s.$$.fragment),i=y(),n=$("span"),n.textContent=c,this.h()},l(l){t=g(l,"LI",{class:!0});var o=w(t);e=g(o,"A",{href:!0,class:!0});var f=w(e);D(s.$$.fragment,f),i=q(f),n=g(f,"SPAN",{class:!0,"data-svelte-h":!0}),O(n)!=="svelte-fuvc8n"&&(n.textContent=c),f.forEach(m),o.forEach(m),this.h()},h(){p(n,"class","label svelte-uthxgc"),p(e,"href","/backgroundJobs"),p(e,"class","svelte-uthxgc"),L(e,"active",r[1].url.pathname.startsWith("/backgroundJobs")),p(t,"class","svelte-uthxgc")},m(l,o){T(l,t,o),d(t,e),U(s,e,null),d(e,i),d(e,n),a=!0},p(l,o){(!a||o&2)&&L(e,"active",l[1].url.pathname.startsWith("/backgroundJobs"))},i(l){a||(b(s.$$.fragment,l),a=!0)},o(l){k(s.$$.fragment,l),a=!1},d(l){l&&m(t),P(s)}}}function Te(r){let t,e,s,i,n,c="Constants",a;return s=new j({props:{icon:"constant"}}),{c(){t=$("li"),e=$("a"),J(s.$$.fragment),i=y(),n=$("span"),n.textContent=c,this.h()},l(l){t=g(l,"LI",{class:!0});var o=w(t);e=g(o,"A",{href:!0,class:!0});var f=w(e);D(s.$$.fragment,f),i=q(f),n=g(f,"SPAN",{class:!0,"data-svelte-h":!0}),O(n)!=="svelte-s4kqu"&&(n.textContent=c),f.forEach(m),o.forEach(m),this.h()},h(){p(n,"class","label svelte-uthxgc"),p(e,"href","/constants"),p(e,"class","svelte-uthxgc"),L(e,"active",r[1].url.pathname.startsWith("/constants")),p(t,"class","svelte-uthxgc")},m(l,o){T(l,t,o),d(t,e),U(s,e,null),d(e,i),d(e,n),a=!0},p(l,o){(!a||o&2)&&L(e,"active",l[1].url.pathname.startsWith("/constants"))},i(l){a||(b(s.$$.fragment,l),a=!0)},o(l){k(s.$$.fragment,l),a=!1},d(l){l&&m(t),P(s)}}}function Se(r){let t,e,s,i,n,c="Liquid Evaluator",a;return s=new j({props:{icon:"liquid"}}),{c(){t=$("li"),e=$("a"),J(s.$$.fragment),i=y(),n=$("span"),n.textContent=c,this.h()},l(l){t=g(l,"LI",{class:!0});var o=w(t);e=g(o,"A",{href:!0,class:!0});var f=w(e);D(s.$$.fragment,f),i=q(f),n=g(f,"SPAN",{class:!0,"data-svelte-h":!0}),O(n)!=="svelte-1k272bg"&&(n.textContent=c),f.forEach(m),o.forEach(m),this.h()},h(){p(n,"class","label svelte-uthxgc"),p(e,"href",r[3]+"/gui/liquid"),p(e,"class","svelte-uthxgc"),p(t,"class","svelte-uthxgc")},m(l,o){T(l,t,o),d(t,e),U(s,e,null),d(e,i),d(e,n),a=!0},p:F,i(l){a||(b(s.$$.fragment,l),a=!0)},o(l){k(s.$$.fragment,l),a=!1},d(l){l&&m(t),P(s)}}}function Ne(r){let t,e,s,i,n,c="GraphiQL",a;return s=new j({props:{icon:"graphql"}}),{c(){t=$("li"),e=$("a"),J(s.$$.fragment),i=y(),n=$("span"),n.textContent=c,this.h()},l(l){t=g(l,"LI",{class:!0});var o=w(t);e=g(o,"A",{href:!0,class:!0});var f=w(e);D(s.$$.fragment,f),i=q(f),n=g(f,"SPAN",{class:!0,"data-svelte-h":!0}),O(n)!=="svelte-pzl6ct"&&(n.textContent=c),f.forEach(m),o.forEach(m),this.h()},h(){p(n,"class","label svelte-uthxgc"),p(e,"href",r[3]+"/gui/graphql"),p(e,"class","svelte-uthxgc"),p(t,"class","svelte-uthxgc")},m(l,o){T(l,t,o),d(t,e),U(s,e,null),d(e,i),d(e,n),a=!0},p:F,i(l){a||(b(s.$$.fragment,l),a=!0)},o(l){k(s.$$.fragment,l),a=!1},d(l){l&&m(t),P(s)}}}function nt(r){let t,e,s,i,n='',c,a,l,o=' Siteglide development tools',f,M,_,h,u,W=r[0].header.includes("database"),Q,ue=r[0].header.includes("users"),X,pe=r[0].header.includes("logs"),Y,de=r[0].header.includes("backgroundJobs"),Z,me=r[0].header.includes("constants"),ee,_e=r[0].header.includes("liquid"),te,ve=r[0].header.includes("graphiql"),G;function Le(v,z){return v[0].online===void 0?at:v[0].online===!1?lt:st}let se=Le(r),N=se(r),C=W&&xe(r),V=ue&&He(r),E=pe&&qe(r),I=de&&ye(r),A=me&&Te(r),x=_e&&Se($e(r)),H=ve&&Ne(ge(r));return{c(){t=$("header"),e=$("div"),s=$("div"),i=$("a"),i.innerHTML=n,c=y(),a=$("h1"),l=$("a"),l.innerHTML=o,f=y(),M=$("span"),N.c(),_=y(),h=$("nav"),u=$("ul"),C&&C.c(),Q=y(),V&&V.c(),X=y(),E&&E.c(),Y=y(),I&&I.c(),Z=y(),A&&A.c(),ee=y(),x&&x.c(),te=y(),H&&H.c(),this.h()},l(v){t=g(v,"HEADER",{class:!0});var z=w(t);e=g(z,"DIV",{class:!0});var le=w(e);s=g(le,"DIV",{class:!0});var ae=w(s);i=g(ae,"A",{href:!0,"data-svelte-h":!0}),O(i)!=="svelte-1nhlu7c"&&(i.innerHTML=n),c=q(ae),a=g(ae,"H1",{class:!0});var ne=w(a);l=g(ne,"A",{href:!0,class:!0,"data-svelte-h":!0}),O(l)!=="svelte-sq17kk"&&(l.innerHTML=o),f=q(ne),M=g(ne,"SPAN",{class:!0});var Ce=w(M);N.l(Ce),Ce.forEach(m),ne.forEach(m),ae.forEach(m),_=q(le),h=g(le,"NAV",{class:!0});var Ve=w(h);u=g(Ve,"UL",{class:!0});var S=w(u);C&&C.l(S),Q=q(S),V&&V.l(S),X=q(S),E&&E.l(S),Y=q(S),I&&I.l(S),Z=q(S),A&&A.l(S),ee=q(S),x&&x.l(S),te=q(S),H&&H.l(S),S.forEach(m),Ve.forEach(m),le.forEach(m),z.forEach(m),this.h()},h(){p(i,"href","/"),p(l,"href","/"),p(l,"class","svelte-uthxgc"),p(M,"class","instance svelte-uthxgc"),L(M,"offline",!r[0].online),p(a,"class","svelte-uthxgc"),p(s,"class","logo svelte-uthxgc"),p(u,"class","svelte-uthxgc"),p(h,"class","svelte-uthxgc"),p(e,"class","wrapper svelte-uthxgc"),p(t,"class","svelte-uthxgc")},m(v,z){T(v,t,z),d(t,e),d(e,s),d(s,i),d(s,c),d(s,a),d(a,l),d(a,f),d(a,M),N.m(M,null),d(e,_),d(e,h),d(h,u),C&&C.m(u,null),d(u,Q),V&&V.m(u,null),d(u,X),E&&E.m(u,null),d(u,Y),I&&I.m(u,null),d(u,Z),A&&A.m(u,null),d(u,ee),x&&x.m(u,null),d(u,te),H&&H.m(u,null),G=!0},p(v,[z]){se===(se=Le(v))&&N?N.p(v,z):(N.d(1),N=se(v),N&&(N.c(),N.m(M,null))),(!G||z&1)&&L(M,"offline",!v[0].online),z&1&&(W=v[0].header.includes("database")),W?C?(C.p(v,z),z&1&&b(C,1)):(C=xe(v),C.c(),b(C,1),C.m(u,Q)):C&&(K(),k(C,1,1,()=>{C=null}),R()),z&1&&(ue=v[0].header.includes("users")),ue?V?(V.p(v,z),z&1&&b(V,1)):(V=He(v),V.c(),b(V,1),V.m(u,X)):V&&(K(),k(V,1,1,()=>{V=null}),R()),z&1&&(pe=v[0].header.includes("logs")),pe?E?(E.p(v,z),z&1&&b(E,1)):(E=qe(v),E.c(),b(E,1),E.m(u,Y)):E&&(K(),k(E,1,1,()=>{E=null}),R()),z&1&&(de=v[0].header.includes("backgroundJobs")),de?I?(I.p(v,z),z&1&&b(I,1)):(I=ye(v),I.c(),b(I,1),I.m(u,Z)):I&&(K(),k(I,1,1,()=>{I=null}),R()),z&1&&(me=v[0].header.includes("constants")),me?A?(A.p(v,z),z&1&&b(A,1)):(A=Te(v),A.c(),b(A,1),A.m(u,ee)):A&&(K(),k(A,1,1,()=>{A=null}),R()),z&1&&(_e=v[0].header.includes("liquid")),_e?x?(x.p($e(v),z),z&1&&b(x,1)):(x=Se($e(v)),x.c(),b(x,1),x.m(u,te)):x&&(K(),k(x,1,1,()=>{x=null}),R()),z&1&&(ve=v[0].header.includes("graphiql")),ve?H?(H.p(ge(v),z),z&1&&b(H,1)):(H=Ne(ge(v)),H.c(),b(H,1),H.m(u,null)):H&&(K(),k(H,1,1,()=>{H=null}),R())},i(v){G||(b(C),b(V),b(E),b(I),b(A),b(x),b(H),G=!0)},o(v){k(C),k(V),k(E),k(I),k(A),k(x),k(H),G=!1},d(v){v&&m(t),N.d(),C&&C.d(),V&&V.d(),E&&E.d(),I&&I.d(),A&&A.d(),x&&x.d(),H&&H.d()}}}function it(r,t,e){let s,i;return ie(r,B,c=>e(0,s=c)),ie(r,Ye,c=>e(1,i=c)),[s,i,async()=>{s.tables.length||ze(B,s.tables=await Ze.get(),s)}]}class rt extends fe{constructor(t){super(),he(this,t,it,nt,ce,{})}}function Pe(r){let t,e="Disconnected from the instance";return{c(){t=$("div"),t.textContent=e,this.h()},l(s){t=g(s,"DIV",{class:!0,"data-svelte-h":!0}),O(t)!=="svelte-1k8ucix"&&(t.textContent=e),this.h()},h(){p(t,"class","connectionIndicator svelte-1cyr69k"),L(t,"offline",r[0].online===!1)},m(s,i){T(s,t,i)},p(s,i){i&1&&L(t,"offline",s[0].online===!1)},d(s){s&&m(t)}}}function ot(r){let t,e=r[0].online===!1&&Pe(r);return{c(){e&&e.c(),t=Ee()},l(s){e&&e.l(s),t=Ee()},m(s,i){e&&e.m(s,i),T(s,t,i)},p(s,[i]){s[0].online===!1?e?e.p(s,i):(e=Pe(s),e.c(),e.m(t.parentNode,t)):e&&(e.d(1),e=null)},i:F,o:F,d(s){s&&m(t),e&&e.d(s)}}}let ct=7e3;function ft(r,t,e){let s;ie(r,B,c=>e(0,s=c));let i;Oe(async()=>(n(),i=setInterval(n,ct),()=>clearInterval(i)));const n=async()=>{if(document.visibilityState!=="hidden"){const c=typeof window<"u"&&window.location.port!=="4173"&&window.location.port!=="5173"?`http://localhost:${parseInt(window.location.port)}`:"http://localhost:3333";fetch(`${c}/info`).then(a=>a.json()).then(a=>{a&&ze(B,s.online=a,s)}).catch(a=>{ze(B,s.online=!1,s)})}};return[s]}class ht extends fe{constructor(t){super(),he(this,t,ft,ot,ce,{})}}function Ue(r,t,e){const s=r.slice();return s[4]=t[e],s}function De(r,t){let e,s,i=t[4].message+"",n,c,a,l,o,f,M;a=new j({props:{icon:"x",size:"10"}});function _(){return t[2](t[4])}return{key:r,first:null,c(){e=$("div"),s=new je(!1),n=y(),c=$("button"),J(a.$$.fragment),this.h()},l(h){e=g(h,"DIV",{class:!0});var u=w(e);s=Be(u,!1),n=q(u),c=g(u,"BUTTON",{class:!0});var W=w(c);D(a.$$.fragment,W),W.forEach(m),u.forEach(m),this.h()},h(){s.a=n,p(c,"class","svelte-fq192n"),p(e,"class","notification svelte-fq192n"),L(e,"success",t[4].type==="success"),L(e,"error",t[4].type==="error"),L(e,"info",t[4].type==="info"),this.first=e},m(h,u){T(h,e,u),s.m(i,e),d(e,n),d(e,c),U(a,c,null),o=!0,f||(M=be(c,"click",_),f=!0)},p(h,u){t=h,(!o||u&2)&&i!==(i=t[4].message+"")&&s.p(i),(!o||u&2)&&L(e,"success",t[4].type==="success"),(!o||u&2)&&L(e,"error",t[4].type==="error"),(!o||u&2)&&L(e,"info",t[4].type==="info")},i(h){o||(b(a.$$.fragment,h),h&&ke(()=>{o&&(l||(l=re(e,oe,{duration:100},!0)),l.run(1))}),o=!0)},o(h){k(a.$$.fragment,h),h&&(l||(l=re(e,oe,{duration:100},!1)),l.run(0)),o=!1},d(h){h&&m(e),P(a),h&&l&&l.end(),f=!1,M()}}}function ut(r){let t,e=[],s=new Map,i,n,c,a,l,o,f=Ae(r[1].notifications);const M=_=>_[4].id;for(let _=0;_r[3].call(t))},m(_,h){T(_,t,h);for(let u=0;u{o&&(a||(a=re(n,oe,{duration:100},!0)),a.run(1))}),o=!0}},o(_){for(let h=0;he(1,s=a));let i=0;Re(()=>{s.notifications.forEach(a=>{a.timeout||(a.type==="success"||a.type==="info")&&(a.timeout=setTimeout(()=>B.notification.remove(a.id),7e3))})});const n=a=>B.notification.remove(a.id);function c(){i=this.clientHeight,e(0,i)}return[i,s,n,c]}class dt extends fe{constructor(t){super(),he(this,t,pt,ut,ce,{})}}function mt(r){let t,e,s,i,n;t=new rt({});const c=r[1].default,a=Fe(c,r,r[0],null);return i=new dt({}),{c(){J(t.$$.fragment),e=y(),a&&a.c(),s=y(),J(i.$$.fragment)},l(l){D(t.$$.fragment,l),e=q(l),a&&a.l(l),s=q(l),D(i.$$.fragment,l)},m(l,o){U(t,l,o),T(l,e,o),a&&a.m(l,o),T(l,s,o),U(i,l,o),n=!0},p(l,[o]){a&&a.p&&(!n||o&1)&&Ge(a,c,l,l[0],n?Xe(c,l[0],o,null):Qe(l[0]),null)},i(l){n||(b(t.$$.fragment,l),b(a,l),b(i.$$.fragment,l),n=!0)},o(l){k(t.$$.fragment,l),k(a,l),k(i.$$.fragment,l),n=!1},d(l){l&&(m(e),m(s)),P(t,l),a&&a.d(l),P(i,l)}}}function _t(r,t,e){let{$$slots:s={},$$scope:i}=t;return r.$$set=n=>{"$$scope"in n&&e(0,i=n.$$scope)},[i,s]}class Lt extends fe{constructor(t){super(),he(this,t,_t,mt,ce,{})}}export{Lt as component}; diff --git a/gui/next/build/_app/immutable/nodes/1.B0n1BD_0.js b/gui/next/build/_app/immutable/nodes/1.B0n1BD_0.js new file mode 100644 index 0000000..73da495 --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/1.B0n1BD_0.js @@ -0,0 +1 @@ +import{s as x,n as u,d as m,a as h,i as _,b as d,c as v,e as g,f as b,g as S,h as E,t as $,j,k}from"../chunks/Ul9VwQ7n.js";import{S as q,i as y}from"../chunks/Bh3MJlbi.js";import{p as C}from"../chunks/C5zjxmar.js";function H(i){var f;let a,s=i[0].status+"",r,o,n,p=((f=i[0].error)==null?void 0:f.message)+"",c;return{c(){a=E("h1"),r=$(s),o=j(),n=E("p"),c=$(p)},l(e){a=v(e,"H1",{});var t=g(a);r=b(t,s),t.forEach(m),o=S(e),n=v(e,"P",{});var l=g(n);c=b(l,p),l.forEach(m)},m(e,t){_(e,a,t),d(a,r),_(e,o,t),_(e,n,t),d(n,c)},p(e,[t]){var l;t&1&&s!==(s=e[0].status+"")&&h(r,s),t&1&&p!==(p=((l=e[0].error)==null?void 0:l.message)+"")&&h(c,p)},i:u,o:u,d(e){e&&(m(a),m(o),m(n))}}}function P(i,a,s){let r;return k(i,C,o=>s(0,r=o)),[r]}class B extends q{constructor(a){super(),y(this,a,P,H,x,{})}}export{B as component}; diff --git a/gui/next/build/_app/immutable/nodes/10.CpYcdA_2.js b/gui/next/build/_app/immutable/nodes/10.CpYcdA_2.js new file mode 100644 index 0000000..416ac5f --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/10.CpYcdA_2.js @@ -0,0 +1,26 @@ +import{s as De,d as N,I as Me,r as Fe,C as Ce,i as ce,b as n,D as te,E as be,w as l,p as Pe,g as I,c as m,e as O,z as se,f as ge,j as S,h as _,t as Ee,k as Ae,n as Re,J as qe,a as Te,K as Q}from"../chunks/Ul9VwQ7n.js";import{S as Be,i as He,d as de,t as X,a as V,e as Le,m as me,c as _e,b as he,h as Ke,g as Ne}from"../chunks/Bh3MJlbi.js";import{e as ke}from"../chunks/BNCRiqmJ.js";import{f as Ve}from"../chunks/odGh2V91.js";import{g as ve}from"../chunks/BD1m7lx9.js";import{s as j}from"../chunks/DGc7Lmco.js";import{I as pe}from"../chunks/D-yR0E5w.js";const ne={get:()=>ve({query:` + query { + constants( + per_page: 100 + ) { + results { + name, + value, + updated_at + } + } + }`}).then(t=>t.constants.results),edit:e=>{e=Object.fromEntries(e.entries());const t=` + mutation { + constant_set(name: "${e.name}", value: "${e.value}"){ + name, + value + } + }`;return ve({query:t})},delete:e=>{e=Object.fromEntries(e.entries());const t=` + mutation { + constant_unset(name: "${e.name}"){ + name + } + } + `;return ve({query:t})}};function ye(e,t,a){const o=e.slice();return o[13]=t[a],o[14]=t,o[15]=a,o}function Ie(e){let t,a,o="Clear filter",E,i,h,y,R;return i=new pe({props:{icon:"x",size:"12"}}),{c(){t=_("button"),a=_("span"),a.textContent=o,E=S(),he(i.$$.fragment),this.h()},l(f){t=m(f,"BUTTON",{class:!0});var k=O(t);a=m(k,"SPAN",{class:!0,"data-svelte-h":!0}),se(a)!=="svelte-1bu6mgu"&&(a.textContent=o),E=I(k),_e(i.$$.fragment,k),k.forEach(N),this.h()},h(){l(a,"class","label svelte-9flr1b"),l(t,"class","clearFilter svelte-9flr1b")},m(f,k){ce(f,t,k),n(t,a),n(t,E),me(i,t,null),h=!0,y||(R=te(t,"click",e[8]),y=!0)},p:Re,i(f){h||(V(i.$$.fragment,f),h=!0)},o(f){X(i.$$.fragment,f),h=!1},d(f){f&&N(t),de(i),y=!1,R()}}}function Se(e){let t,a,o,E,i,h,y,R="Delete constant",f,k,z,C,T,D=e[13].name+"",J,r,c,v,W,B,q,g,Y,M,K,Z,U,d,P=e[13].exposed?"Hide value":"Show value",u,ae,H,s,w,p,L="Save",A,le,b,x,re;k=new pe({props:{icon:"x",size:"14"}});function oe(){return e[10](e[13],e[14],e[15])}H=new pe({props:{icon:e[13].exposed?"eyeStriked":"eye"}});function Oe(){return e[11](e[13],e[14],e[15])}function Ue(...F){return e[12](e[15],...F)}return{c(){t=_("li"),a=_("form"),o=_("input"),i=S(),h=_("button"),y=_("span"),y.textContent=R,f=S(),he(k.$$.fragment),z=S(),C=_("form"),T=_("label"),J=Ee(D),c=S(),v=_("input"),B=S(),q=_("fieldset"),g=_("input"),Z=S(),U=_("button"),d=_("span"),u=Ee(P),ae=S(),he(H.$$.fragment),w=S(),p=_("button"),p.textContent=L,A=S(),this.h()},l(F){t=m(F,"LI",{class:!0});var $=O(t);a=m($,"FORM",{class:!0});var ee=O(a);o=m(ee,"INPUT",{type:!0,name:!0,class:!0}),i=I(ee),h=m(ee,"BUTTON",{type:!0,title:!0,class:!0});var ie=O(h);y=m(ie,"SPAN",{class:!0,"data-svelte-h":!0}),se(y)!=="svelte-1p7u8ms"&&(y.textContent=R),f=I(ie),_e(k.$$.fragment,ie),ie.forEach(N),ee.forEach(N),z=I($),C=m($,"FORM",{class:!0});var G=O(C);T=m(G,"LABEL",{for:!0,class:!0});var we=O(T);J=ge(we,D),we.forEach(N),c=I(G),v=m(G,"INPUT",{type:!0,name:!0,class:!0}),B=I(G),q=m(G,"FIELDSET",{class:!0});var ue=O(q);g=m(ue,"INPUT",{name:!0,id:!0,class:!0}),Z=I(ue),U=m(ue,"BUTTON",{type:!0,class:!0,title:!0});var fe=O(U);d=m(fe,"SPAN",{class:!0});var $e=O(d);u=ge($e,P),$e.forEach(N),ae=I(fe),_e(H.$$.fragment,fe),fe.forEach(N),ue.forEach(N),w=I(G),p=m(G,"BUTTON",{type:!0,class:!0,"data-svelte-h":!0}),se(p)!=="svelte-1g3xn8h"&&(p.textContent=L),G.forEach(N),A=I($),$.forEach(N),this.h()},h(){l(o,"type","hidden"),l(o,"name","name"),o.value=E=e[13].name,l(o,"class","svelte-9flr1b"),l(y,"class","label svelte-9flr1b"),l(h,"type","submit"),l(h,"title","Delete constant"),l(h,"class","svelte-9flr1b"),l(a,"class","delete svelte-9flr1b"),l(T,"for",r=e[13].name),l(T,"class","svelte-9flr1b"),l(v,"type","hidden"),l(v,"name","name"),v.value=W=e[13].name,l(v,"class","svelte-9flr1b"),g.disabled=Y=!e[13].exposed,l(g,"name","value"),g.value=M=e[13].value,l(g,"id",K=e[13].name),l(g,"class","svelte-9flr1b"),Q(g,"exposed",e[13].exposed),l(d,"class","label svelte-9flr1b"),l(U,"type","button"),l(U,"class","toggleExposition svelte-9flr1b"),l(U,"title",s=e[13].exposed?"Hide value":"Show value"),l(q,"class","svelte-9flr1b"),l(p,"type","submit"),l(p,"class","button svelte-9flr1b"),Q(p,"needed",e[1][e[15]].changed),l(C,"class","edit svelte-9flr1b"),l(t,"class","svelte-9flr1b"),Q(t,"hidden",e[0]&&e[3](e[13])),Q(t,"highlighted",e[2].highlighted.constant===e[13].name)},m(F,$){ce(F,t,$),n(t,a),n(a,o),n(a,i),n(a,h),n(h,y),n(h,f),me(k,h,null),n(t,z),n(t,C),n(C,T),n(T,J),n(C,c),n(C,v),n(C,B),n(C,q),n(q,g),n(q,Z),n(q,U),n(U,d),n(d,u),n(U,ae),me(H,U,null),n(C,w),n(C,p),n(t,A),b=!0,x||(re=[te(a,"submit",be(e[9])),te(g,"input",oe),te(U,"click",Oe),te(C,"submit",be(Ue))],x=!0)},p(F,$){e=F,(!b||$&2&&E!==(E=e[13].name))&&(o.value=E),(!b||$&2)&&D!==(D=e[13].name+"")&&Te(J,D),(!b||$&2&&r!==(r=e[13].name))&&l(T,"for",r),(!b||$&2&&W!==(W=e[13].name))&&(v.value=W),(!b||$&2&&Y!==(Y=!e[13].exposed))&&(g.disabled=Y),(!b||$&2&&M!==(M=e[13].value)&&g.value!==M)&&(g.value=M),(!b||$&2&&K!==(K=e[13].name))&&l(g,"id",K),(!b||$&2)&&Q(g,"exposed",e[13].exposed),(!b||$&2)&&P!==(P=e[13].exposed?"Hide value":"Show value")&&Te(u,P);const ee={};$&2&&(ee.icon=e[13].exposed?"eyeStriked":"eye"),H.$set(ee),(!b||$&2&&s!==(s=e[13].exposed?"Hide value":"Show value"))&&l(U,"title",s),(!b||$&2)&&Q(p,"needed",e[1][e[15]].changed),(!b||$&11)&&Q(t,"hidden",e[0]&&e[3](e[13])),(!b||$&6)&&Q(t,"highlighted",e[2].highlighted.constant===e[13].name)},i(F){b||(V(k.$$.fragment,F),V(H.$$.fragment,F),F&&(le||qe(()=>{le=Ke(t,Ve,{duration:100,delay:10*e[15]}),le.start()})),b=!0)},o(F){X(k.$$.fragment,F),X(H.$$.fragment,F),b=!1},d(F){F&&N(t),de(k),de(H),x=!1,Fe(re)}}}function je(e){var H;let t,a,o,E,i,h,y="Find:",R,f,k,z,C,T,D,J=' ',r,c,v=' ',W,B,q,g,Y,M,K,Z,U;document.title=t="Constants"+((H=e[2].online)!=null&&H.MPKIT_URL?": "+e[2].online.MPKIT_URL.replace("https://",""):"");let d=e[0]&&Ie(e);g=new pe({props:{icon:"arrowRight"}});let P=ke(e[1]),u=[];for(let s=0;sX(u[s],1,1,()=>{u[s]=null});return{c(){a=S(),o=_("div"),E=_("nav"),i=_("form"),h=_("label"),h.textContent=y,R=S(),f=_("input"),k=S(),d&&d.c(),z=S(),C=_("section"),T=_("form"),D=_("fieldset"),D.innerHTML=J,r=S(),c=_("fieldset"),c.innerHTML=v,W=S(),B=_("button"),q=Ee(`Add\r + `),he(g.$$.fragment),Y=S(),M=_("ul");for(let s=0;s{d=null}),Le()),w&63){P=ke(s[1]);let L;for(L=0;La(2,o=r));let E="",i=[];(async()=>await ne.get())().then(r=>{a(1,i=r)});const h=r=>r.name.toLowerCase().indexOf(E.toLowerCase())===-1&&r.value.toLowerCase().indexOf(E.toLowerCase())===-1,y=async(r,c)=>{r.preventDefault();const v=await ne.edit(new FormData(r.target));v.errors?j.notification.create("error",`Failed to update ${v.constant_set.name} constant`):(a(1,i[c].changed=!1,i),j.highlight("constant",v.constant_set.name),j.notification.create("success",`Constant ${v.constant_set.name} updated`))},R=async r=>{if(r.preventDefault(),confirm("Are you sure you want to delete this constant?")){const c=await ne.delete(new FormData(r.target));c.errors?j.notification.create("success",`Failed to delete ${c.constant_unset.name} constant`):(j.notification.create("success",`Constant ${c.constant_unset.name} deleted`),await ne.get().then(v=>{a(1,i=v)}))}},f=async r=>{r.preventDefault();const c=await ne.edit(new FormData(r.target));c.errors?j.notification.create("error",`Failed to create ${c.constant_set.name} constant`):(r.target.reset(),j.notification.create("success",`Constant ${c.constant_set.name} created`),await ne.get().then(v=>{a(1,i=v),j.highlight("constant",c.constant_set.name)}))};function k(){E=this.value,a(0,E)}return[E,i,o,h,y,R,f,k,()=>a(0,E=""),r=>R(r),(r,c,v)=>a(1,c[v].changed=!0,i),(r,c,v)=>a(1,c[v].exposed=!r.exposed,i),(r,c)=>y(c,r)]}class xe extends Be{constructor(t){super(),He(this,t,ze,je,De,{})}}export{xe as component}; diff --git a/gui/next/build/_app/immutable/nodes/11.C73io08e.js b/gui/next/build/_app/immutable/nodes/11.C73io08e.js new file mode 100644 index 0000000..1629fd8 --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/11.C73io08e.js @@ -0,0 +1 @@ +import{s as i,n as o,p as l,d as c,k as p}from"../chunks/Ul9VwQ7n.js";import{S as d,i as m}from"../chunks/Bh3MJlbi.js";import{s as u}from"../chunks/DGc7Lmco.js";function _(n){var s;let e;return document.title=e="Database"+((s=n[0].online)!=null&&s.MPKIT_URL?": "+n[0].online.MPKIT_URL.replace("https://",""):""),{c:o,l(t){l("svelte-1bpefxl",document.head).forEach(c)},m:o,p(t,[a]){var r;a&1&&e!==(e="Database"+((r=t[0].online)!=null&&r.MPKIT_URL?": "+t[0].online.MPKIT_URL.replace("https://",""):""))&&(document.title=e)},i:o,o,d:o}}function f(n,e,s){let t;return p(n,u,a=>s(0,t=a)),[t]}class I extends d{constructor(e){super(),m(this,e,f,_,i,{})}}export{I as component}; diff --git a/gui/next/build/_app/immutable/nodes/12.q7a9ldLT.js b/gui/next/build/_app/immutable/nodes/12.q7a9ldLT.js new file mode 100644 index 0000000..e7311a7 --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/12.q7a9ldLT.js @@ -0,0 +1,72 @@ +import{s as Ze,d as h,i as A,D as le,E as _t,c as g,e as I,h as $,k as Pe,I as Ke,v as Ae,L as Fe,$ as gt,H as rt,r as st,Y as Ye,C as re,b as c,w as _,J as dt,z as ne,g as L,j as F,a as _e,f as W,t as X,n as je,F as Tt,ad as hl,af as At,K as ye,T as bl,G as gl,ag as $l,Z as wl,p as kl,X as yl}from"../chunks/Ul9VwQ7n.js";import{S as Ge,i as Qe,t as R,a as D,g as ge,e as $e,d as se,m as ie,c as oe,b as ue,f as Rt,j as El}from"../chunks/Bh3MJlbi.js";import{q as Tl,g as Cl}from"../chunks/CS29TWE_.js";import{p as wt}from"../chunks/C5zjxmar.js";import{s as H}from"../chunks/DGc7Lmco.js";import{g as ut}from"../chunks/BD1m7lx9.js";import{b as jt,c as Nl}from"../chunks/BkeFH9yg.js";import{I as Se}from"../chunks/D-yR0E5w.js";import{e as Ee,u as Sl,o as Ol}from"../chunks/BNCRiqmJ.js";import{c as Il,p as vl,T as Dl}from"../chunks/Cpu2L2kn.js";import{J as Ll}from"../chunks/BVVGnpm8.js";import{t as Fl}from"../chunks/x4PJc0Qf.js";import{N as Pl}from"../chunks/Bg88RIi0.js";const Al=(r=[])=>{let e="",l={},t="";const n={int:["value_int","not_value_int"],float:["not_value_float","value_float"],bool:["exists","not_value_boolean","value_boolean"],range:["range"],array:["value_array","not_value_array","value_in","not_value_in","array_overlaps","not_array_overlaps"]};for(const a of r){if(!a.minFilterValue&&!a.maxFilterValue&&!a.value)break;let s="",o="";n.int.includes(a.operation)?(s="integer",o=parseInt(a.value)):n.float.includes(a.operation)?(s="float",o=parseFloat(a.value)):n.bool.includes(a.operation)?(s="boolean",o=a.value==="true"):n.range.includes(a.operation)?(s="range",o={},o[a.minFilter]=a.minFilterValue,o[a.maxFilter]=a.maxFilterValue):n.array.includes(a.operation)?(s="array",o=JSON.parse(a.value)):(s="string",o=a.value),a.name!=="id"&&(e+=`, $${a.name}: ${Nl[s]||"String"}`,l[a.name]=o,t+=`{ + name: "${a.name}", + ${a.operation}: $${a.name} + }`)}return e.length&&(e=e.slice(2),e=`(${e})`),t=` + properties: [${t}] + `,{variablesDefinition:e,variables:l,propertiesFilter:t}},Ne={get:r=>{var d,f,v;const l={...{deleted:!1,filters:{page:1}},...r},t=l.table?`table_id: { value: ${l.table} }`:"",n=(f=(d=l.filters)==null?void 0:d.attributes)==null?void 0:f.findIndex(b=>b.name==="id");let a="";n>=0&&l.filters.attributes[n].value&&(a=`id: { ${l.filters.attributes[n].operation}: ${l.filters.attributes[n].value} }`);let s="";l.sort?l.sort.by==="id"||l.sort.by==="created_at"||l.sort.by==="updated_at"?s=`${l.sort.by}: { order: ${l.sort.order} }`:s=`properties: { name: "${l.sort.by}", order: ${l.sort.order} }`:s="created_at: { order: DESC }";const o=l.deleted==="true"?"deleted_at: { exists: true }":"",i=Al((v=l.filters)==null?void 0:v.attributes),u=` + query${i.variablesDefinition} { + records( + page: ${l.filters.page} + per_page: 20, + sort: { ${s} }, + filter: { + ${t} + ${a} + ${o} + ${i.propertiesFilter} + } + ) { + current_page + total_pages + results { + id + created_at + updated_at + deleted_at + properties + } + } + }`;return ut({query:u,variables:i.variables}).then(b=>{H.data("records",b.records)})},create:r=>{const l=Object.fromEntries(r.properties.entries()).tableName,t=jt(r.properties),n=` + mutation${t.variablesDefinition} { + record_create(record: { + table: "${l}", + properties: [${t.properties}] + }) { + id + } + }`;return ut({query:n,variables:t.variables})},edit:r=>{let e=Object.fromEntries(r.properties.entries());const l=e.tableName,t=e.recordId,n=jt(r.properties),a=` + mutation${n.variablesDefinition} { + record_update( + id: ${t}, + record: { + table: "${l}" + properties: [${n.properties}] + } + ) { + id + } + }`;return ut({query:a,variables:n.variables})},delete:r=>{let e=Object.fromEntries(r.properties.entries());const l=e.tableName,t=e.recordId,n=` + mutation { + record_delete(table: "${l}", id: ${t}) { + id + } + }`;return ut({query:n})},restore:r=>{let e=Object.fromEntries(r.properties.entries());const l=e.tableName,n=` + mutation { + record_update( + id: ${e.recordId}, + record: { + table: "${l}", + deleted_at: null + } + ) { + id + } + }`;return ut({query:n})}};function Ut(r,e,l){const t=r.slice();return t[10]=e[l],t[11]=e,t[12]=l,t}function Vt(r,e,l){const t=r.slice();return t[13]=e[l],t}function zt(r,e,l){const t=r.slice();return t[16]=e[l],t}function Bt(r){let e,l,t=Ee(r[1].filters.attributes),n=[];for(let s=0;sR(n[s],1,1,()=>{n[s]=null});return{c(){for(let s=0;s{S[O]=null}),$e(),v=S[f],v?v.p(r,w):(v=S[f]=q[f](r),v.c()),D(v,1),v.m(e,b))},i(N){C||(D(v),C=!0)},o(N){R(v),C=!1},d(N){N&&h(e),Ke(p,N),S[f].d(),E=!1,st(m)}}}function Bl(r){var s;let e,l,t,n,a=((s=r[1].table)==null?void 0:s.properties)&&Bt(r);return{c(){e=$("form"),a&&a.c()},l(o){e=g(o,"FORM",{});var i=I(e);a&&a.l(i),i.forEach(h)},m(o,i){A(o,e,i),a&&a.m(e,null),r[9](e),l=!0,t||(n=le(e,"submit",_t(r[3])),t=!0)},p(o,[i]){var u;(u=o[1].table)!=null&&u.properties?a?(a.p(o,i),i&2&&D(a,1)):(a=Bt(o),a.c(),D(a,1),a.m(e,null)):a&&(ge(),R(a,1,1,()=>{a=null}),$e())},i(o){l||(D(a),l=!0)},o(o){R(a),l=!1},d(o){o&&h(e),a&&a.d(),r[9](null),t=!1,n()}}}function Ml(r,e,l){let t;Pe(r,H,b=>l(1,t=b));let n;const a={id:["value"],string:["value","exists","contains","ends_with","not_contains","not_ends_with","not_starts_with","not_value","starts_with"],text:["value","exists","not_value"],array:["array_contains","value_array","value_in","exists","array_overlaps","not_array_contains","not_array_overlaps","not_value_array","not_value_in"],boolean:["value_boolean","exists","not_value_boolean"],integer:["value_int","exists","not_value_int","range"],float:["value_float","exists","not_value_float","range"],upload:["value","exists","not_value"],datetime:["value","exists","contains","ends_with","not_contains","not_ends_with","not_starts_with","not_value","starts_with"],date:["value","exists","contains","ends_with","not_contains","not_ends_with","not_starts_with","not_value","starts_with"]},s=()=>{Fe(H,t.filters={page:1,attributes:[Object.fromEntries(new FormData(n).entries())],deleted:t.filters.deleted},t),Ne.get({table:t.table.id,filters:t.filters,sort:t.sort,deleted:t.filters.deleted})};function o(b,C){b[C].name=gt(this),H.set(t)}const i=(b,C,E)=>{var m;Fe(H,C[E].attribute_type=((m=t.table.properties.find(y=>y.name===b.name))==null?void 0:m.attribute_type)||"id",t)};function u(b,C){b[C].attribute_type=this.value,H.set(t)}function d(b,C){b[C].operation=gt(this),H.set(t)}function f(b,C){b[C].value=this.value,H.set(t)}function v(b){rt[b?"unshift":"push"](()=>{n=b,l(0,n)})}return[n,t,a,s,o,i,u,d,f,v]}class ql extends Ge{constructor(e){super(),Qe(this,e,Ml,Bl,Ze,{})}}function Jt(r,e,l){const t=r.slice();return t[8]=e[l],t}function Wt(r){let e,l,t="created at",n,a="updated at",s,o="id",i,u,d,f="DESC [Z→A]",v,b="ASC [A→Z]",C,E,m,y,p,k,T,z=Ee(r[1].table.properties),q=[];for(let w=0;wr[3].call(e)),d.__value="DESC",re(d,d.__value),v.__value="ASC",re(v,v.__value),_(u,"name","order"),_(u,"id","sort_order"),_(u,"class","svelte-yzlk61"),r[1].sort.order===void 0&&dt(()=>r[5].call(u)),_(E,"for","sort_order"),_(E,"class","button svelte-yzlk61")},m(w,O){A(w,e,O),c(e,l),c(e,n),c(e,s);for(let P=0;P{V[P]=null}),$e(),y=V[m],y||(y=V[m]=S[m](w),y.c()),D(y,1),y.m(E,null))},i(w){p||(D(y),p=!0)},o(w){R(y),p=!1},d(w){w&&(h(e),h(i),h(u),h(C),h(E)),Ke(q,w),V[m].d(),k=!1,st(T)}}}function Xt(r){let e,l=r[8].name+"",t,n,a;return{c(){e=$("option"),t=X(l),n=F(),this.h()},l(s){e=g(s,"OPTION",{});var o=I(e);t=W(o,l),n=L(o),o.forEach(h),this.h()},h(){e.__value=a=r[8].name,re(e,e.__value)},m(s,o){A(s,e,o),c(e,t),c(e,n)},p(s,o){o&2&&l!==(l=s[8].name+"")&&_e(t,l),o&2&&a!==(a=s[8].name)&&(e.__value=a,re(e,e.__value))},d(s){s&&h(e)}}}function Hl(r){let e,l;return e=new Se({props:{icon:"sortAZ"}}),{c(){ue(e.$$.fragment)},l(t){oe(e.$$.fragment,t)},m(t,n){ie(e,t,n),l=!0},i(t){l||(D(e.$$.fragment,t),l=!0)},o(t){R(e.$$.fragment,t),l=!1},d(t){se(e,t)}}}function Jl(r){let e,l;return e=new Se({props:{icon:"sortZA"}}),{c(){ue(e.$$.fragment)},l(t){oe(e.$$.fragment,t)},m(t,n){ie(e,t,n),l=!0},i(t){l||(D(e.$$.fragment,t),l=!0)},o(t){R(e.$$.fragment,t),l=!1},d(t){se(e,t)}}}function Wl(r){var s;let e,l,t,n,a=((s=r[1].table)==null?void 0:s.properties)&&Wt(r);return{c(){e=$("form"),a&&a.c(),this.h()},l(o){e=g(o,"FORM",{class:!0});var i=I(e);a&&a.l(i),i.forEach(h),this.h()},h(){_(e,"class","svelte-yzlk61")},m(o,i){A(o,e,i),a&&a.m(e,null),r[7](e),l=!0,t||(n=le(e,"submit",_t(r[2])),t=!0)},p(o,[i]){var u;(u=o[1].table)!=null&&u.properties?a?(a.p(o,i),i&2&&D(a,1)):(a=Wt(o),a.c(),D(a,1),a.m(e,null)):a&&(ge(),R(a,1,1,()=>{a=null}),$e())},i(o){l||(D(a),l=!0)},o(o){R(a),l=!1},d(o){o&&h(e),a&&a.d(),r[7](null),t=!1,n()}}}function Xl(r,e,l){let t;Pe(r,H,f=>l(1,t=f));let n;const a=()=>{Fe(H,t.filters.page=1,t),Ne.get({table:t.table.id,filters:t.filters,sort:Object.fromEntries(new FormData(n).entries()),deleted:t.filters.deleted})};function s(){t.sort.by=gt(this),H.set(t)}const o=()=>n.requestSubmit();function i(){t.sort.order=gt(this),H.set(t)}const u=()=>n.requestSubmit();function d(f){rt[f?"unshift":"push"](()=>{n=f,l(0,n)})}return[n,t,a,s,o,i,u,d]}class Yl extends Ge{constructor(e){super(),Qe(this,e,Xl,Wl,Ze,{})}}function Kl(r){let e,l,t,n,a,s,o,i,u,d,f,v,b;return u=new Se({props:{icon:"x",size:"22"}}),{c(){e=$("form"),l=$("input"),n=F(),a=$("input"),s=F(),o=$("button"),i=$("i"),ue(u.$$.fragment),d=X(`\r + Delete record`),this.h()},l(C){e=g(C,"FORM",{});var E=I(e);l=g(E,"INPUT",{type:!0,name:!0}),n=L(E),a=g(E,"INPUT",{type:!0,name:!0}),s=L(E),o=g(E,"BUTTON",{class:!0});var m=I(o);i=g(m,"I",{class:!0});var y=I(i);oe(u.$$.fragment,y),y.forEach(h),d=W(m,`\r + Delete record`),m.forEach(h),E.forEach(h),this.h()},h(){_(l,"type","hidden"),_(l,"name","tableName"),l.value=t=r[0].name,_(a,"type","hidden"),_(a,"name","recordId"),a.value=r[1],_(i,"class","svelte-ooaugn"),_(o,"class","danger")},m(C,E){A(C,e,E),c(e,l),c(e,n),c(e,a),c(e,s),c(e,o),c(o,i),ie(u,i,null),c(o,d),r[4](e),f=!0,v||(b=le(e,"submit",r[3]),v=!0)},p(C,[E]){(!f||E&1&&t!==(t=C[0].name))&&(l.value=t),(!f||E&2)&&(a.value=C[1])},i(C){f||(D(u.$$.fragment,C),f=!0)},o(C){R(u.$$.fragment,C),f=!1},d(C){C&&h(e),se(u),r[4](null),v=!1,b()}}}function Zl(r,e,l){let t,n;Pe(r,H,f=>l(5,t=f)),Pe(r,wt,f=>l(6,n=f));let{table:a}=e,{id:s}=e,o,i=Tt();const u=async f=>{if(f.preventDefault(),confirm("Are you sure you want to delete this record?")){i("success");const v=await Ne.delete({table:a.name,properties:new FormData(o)});v.errors?H.notification.create("error",`Record ${v.record_delete.id} could not be deleted`):(Ne.get({table:n.params.id,filters:t.filters,sort:t.sort,deleted:t.filters.deleted}),H.notification.create("success",`Record ${v.record_delete.id} deleted`))}};function d(f){rt[f?"unshift":"push"](()=>{o=f,l(2,o)})}return r.$$set=f=>{"table"in f&&l(0,a=f.table),"id"in f&&l(1,s=f.id)},[a,s,o,u,d]}class Gl extends Ge{constructor(e){super(),Qe(this,e,Zl,Kl,Ze,{table:0,id:1})}}function Ql(r){let e,l,t,n,a,s,o,i,u,d,f,v,b;return u=new Se({props:{icon:"recycleRefresh"}}),{c(){e=$("form"),l=$("input"),n=F(),a=$("input"),s=F(),o=$("button"),i=$("i"),ue(u.$$.fragment),d=X(`\r + Restore record`),this.h()},l(C){e=g(C,"FORM",{});var E=I(e);l=g(E,"INPUT",{type:!0,name:!0}),n=L(E),a=g(E,"INPUT",{type:!0,name:!0}),s=L(E),o=g(E,"BUTTON",{});var m=I(o);i=g(m,"I",{});var y=I(i);oe(u.$$.fragment,y),y.forEach(h),d=W(m,`\r + Restore record`),m.forEach(h),E.forEach(h),this.h()},h(){_(l,"type","hidden"),_(l,"name","tableName"),l.value=t=r[0].name,_(a,"type","hidden"),_(a,"name","recordId"),a.value=r[1]},m(C,E){A(C,e,E),c(e,l),c(e,n),c(e,a),c(e,s),c(e,o),c(o,i),ie(u,i,null),c(o,d),r[4](e),f=!0,v||(b=le(e,"submit",r[3]),v=!0)},p(C,[E]){(!f||E&1&&t!==(t=C[0].name))&&(l.value=t),(!f||E&2)&&(a.value=C[1])},i(C){f||(D(u.$$.fragment,C),f=!0)},o(C){R(u.$$.fragment,C),f=!1},d(C){C&&h(e),se(u),r[4](null),v=!1,b()}}}function xl(r,e,l){let t,n;Pe(r,H,f=>l(5,t=f)),Pe(r,wt,f=>l(6,n=f));let{table:a}=e,{id:s}=e,o,i=Tt();const u=async f=>{f.preventDefault(),i("success");const v=await Ne.restore({table:a.name,properties:new FormData(o)});v.errors?H.notification.create("error",`Record ${v.record_update.id} could not be restored`):(Ne.get({table:n.params.id,filters:t.filters,sort:t.sort,deleted:t.filters.deleted}),H.notification.create("success",`Record ${v.record_update.id} restored`))};function d(f){rt[f?"unshift":"push"](()=>{o=f,l(2,o)})}return r.$$set=f=>{"table"in f&&l(0,a=f.table),"id"in f&&l(1,s=f.id)},[a,s,o,u,d]}class er extends Ge{constructor(e){super(),Qe(this,e,xl,Ql,Ze,{table:0,id:1})}}function tr(r){let e,l;return e=new Gl({props:{table:r[1].table,id:r[0].id}}),e.$on("success",r[6]),{c(){ue(e.$$.fragment)},l(t){oe(e.$$.fragment,t)},m(t,n){ie(e,t,n),l=!0},p(t,n){const a={};n&2&&(a.table=t[1].table),n&1&&(a.id=t[0].id),e.$set(a)},i(t){l||(D(e.$$.fragment,t),l=!0)},o(t){R(e.$$.fragment,t),l=!1},d(t){se(e,t)}}}function lr(r){let e,l;return e=new er({props:{table:r[1].table,id:r[0].id}}),e.$on("success",r[5]),{c(){ue(e.$$.fragment)},l(t){oe(e.$$.fragment,t)},m(t,n){ie(e,t,n),l=!0},p(t,n){const a={};n&2&&(a.table=t[1].table),n&1&&(a.id=t[0].id),e.$set(a)},i(t){l||(D(e.$$.fragment,t),l=!0)},o(t){R(e.$$.fragment,t),l=!1},d(t){se(e,t)}}}function rr(r){let e,l,t,n,a,s,o,i,u,d,f,v,b;a=new Se({props:{icon:"copy",size:"22"}});const C=[lr,tr],E=[];function m(y,p){return y[1].filters.deleted==="true"?0:1}return u=m(r),d=E[u]=C[u](r),{c(){e=$("menu"),l=$("ul"),t=$("li"),n=$("button"),ue(a.$$.fragment),s=X(`\r + Copy record`),o=F(),i=$("li"),d.c(),this.h()},l(y){e=g(y,"MENU",{class:!0});var p=I(e);l=g(p,"UL",{});var k=I(l);t=g(k,"LI",{class:!0});var T=I(t);n=g(T,"BUTTON",{type:!0});var z=I(n);oe(a.$$.fragment,z),s=W(z,`\r + Copy record`),z.forEach(h),T.forEach(h),o=L(k),i=g(k,"LI",{class:!0});var q=I(i);d.l(q),q.forEach(h),k.forEach(h),p.forEach(h),this.h()},h(){_(n,"type","button"),_(t,"class","svelte-1tht2a1"),_(i,"class","svelte-1tht2a1"),_(e,"class","content-context svelte-1tht2a1")},m(y,p){A(y,e,p),c(e,l),c(l,t),c(t,n),ie(a,n,null),c(n,s),c(l,o),c(l,i),E[u].m(i,null),f=!0,v||(b=[le(window,"keyup",r[3]),le(n,"click",r[4]),hl(Il.call(null,e,r[7]))],v=!0)},p(y,[p]){let k=u;u=m(y),u===k?E[u].p(y,p):(ge(),R(E[k],1,1,()=>{E[k]=null}),$e(),d=E[u],d?d.p(y,p):(d=E[u]=C[u](y),d.c()),D(d,1),d.m(i,null))},i(y){f||(D(a.$$.fragment,y),D(d),f=!0)},o(y){R(a.$$.fragment,y),R(d),f=!1},d(y){y&&h(e),se(a),E[u].d(),v=!1,st(b)}}}function nr(r,e,l){let t;Pe(r,H,f=>l(1,t=f));let{record:n}=e;const a=Tt(),s=f=>{f.key==="Escape"&&a("close")},o=()=>{a("close"),Fe(H,t.record={...n},t),Fe(H,t.record.id=null,t)},i=()=>a("close"),u=()=>a("close"),d=()=>a("close");return r.$$set=f=>{"record"in f&&l(0,n=f.record)},[n,t,a,s,o,i,u,d]}class ar extends Ge{constructor(e){super(),Qe(this,e,nr,rr,Ze,{record:0})}}function Yt(r,e,l){const t=r.slice();return t[5]=e[l],t}function Kt(r,e,l){const t=r.slice();t[8]=e[l];const n=vl(t[5].properties[t[8].name],t[8].attribute_type);return t[9]=n,t}function Zt(r,e,l){const t=r.slice();return t[8]=e[l],t}function Gt(r){var z,q;let e,l,t,n,a="id",s,o,i,u="created at",d,f,v="updated at",b,C,E,m,y=Ee(r[1].table.properties),p=[];for(let S=0;S{T=null}),$e()),(!m||V&2&&E!==(E=At(S[1].view.tableStyle)+" svelte-1bwwtph"))&&_(e,"class",E)},i(S){m||(D(T),m=!0)},o(S){R(T),m=!1},d(S){S&&h(e),Ke(p,S),k&&k.d(),T&&T.d()}}}function Qt(r){let e,l=r[8].name+"",t,n,a,s,o=r[8].attribute_type+"",i,u;return{c(){e=$("th"),t=X(l),n=F(),a=$("small"),s=X("("),i=X(o),u=X(")"),this.h()},l(d){e=g(d,"TH",{class:!0});var f=I(e);t=W(f,l),n=L(f),a=g(f,"SMALL",{class:!0});var v=I(a);s=W(v,"("),i=W(v,o),u=W(v,")"),v.forEach(h),f.forEach(h),this.h()},h(){_(a,"class","type svelte-1bwwtph"),_(e,"class","svelte-1bwwtph")},m(d,f){A(d,e,f),c(e,t),c(e,n),c(e,a),c(a,s),c(a,i),c(a,u)},p(d,f){f&2&&l!==(l=d[8].name+"")&&_e(t,l),f&2&&o!==(o=d[8].attribute_type+"")&&_e(i,o)},d(d){d&&h(e)}}}function xt(r){let e,l="deleted at";return{c(){e=$("th"),e.textContent=l,this.h()},l(t){e=g(t,"TH",{class:!0,"data-svelte-h":!0}),ne(e)!=="svelte-1jwm27o"&&(e.textContent=l),this.h()},h(){_(e,"class","svelte-1bwwtph")},m(t,n){A(t,e,n)},d(t){t&&h(e)}}}function el(r){var o;let e=[],l=new Map,t,n,a=Ee((o=r[1].records)==null?void 0:o.results);const s=i=>i[5].id;for(let i=0;i{s[d]=null}),$e(),l=s[e],l?l.p(i,u):(l=s[e]=a[e](i),l.c()),D(l,1),l.m(t.parentNode,t))},i(i){n||(D(l),n=!0)},o(i){R(l),n=!1},d(i){i&&h(t),s[e].d(i)}}}function sr(r){let e=r[9].value+"",l;return{c(){l=X(e)},l(t){l=W(t,e)},m(t,n){A(t,l,n)},p(t,n){n&2&&e!==(e=t[9].value+"")&&_e(l,e)},i:je,o:je,d(t){t&&h(l)}}}function ir(r){let e,l,t,n;const a=[ur,or],s=[];function o(i,u){return i[1].view.tableStyle==="expanded"?0:1}return e=o(r),l=s[e]=a[e](r),{c(){l.c(),t=Ae()},l(i){l.l(i),t=Ae()},m(i,u){s[e].m(i,u),A(i,t,u),n=!0},p(i,u){let d=e;e=o(i),e===d?s[e].p(i,u):(ge(),R(s[d],1,1,()=>{s[d]=null}),$e(),l=s[e],l?l.p(i,u):(l=s[e]=a[e](i),l.c()),D(l,1),l.m(t.parentNode,t))},i(i){n||(D(l),n=!0)},o(i){R(l),n=!1},d(i){i&&h(t),s[e].d(i)}}}function or(r){let e=JSON.stringify(r[9].value)+"",l;return{c(){l=X(e)},l(t){l=W(t,e)},m(t,n){A(t,l,n)},p(t,n){n&2&&e!==(e=JSON.stringify(t[9].value)+"")&&_e(l,e)},i:je,o:je,d(t){t&&h(l)}}}function ur(r){let e,l;return e=new Ll({props:{value:r[9].value}}),{c(){ue(e.$$.fragment)},l(t){oe(e.$$.fragment,t)},m(t,n){ie(e,t,n),l=!0},p(t,n){const a={};n&2&&(a.value=t[9].value),e.$set(a)},i(t){l||(D(e.$$.fragment,t),l=!0)},o(t){R(e.$$.fragment,t),l=!1},d(t){se(e,t)}}}function rl(r){let e,l,t=r[9].value!==void 0&&ll(r);return{c(){e=$("td"),t&&t.c(),this.h()},l(n){e=g(n,"TD",{class:!0});var a=I(e);t&&t.l(a),a.forEach(h),this.h()},h(){_(e,"class","svelte-1bwwtph"),ye(e,"value-null",r[9].type==="null")},m(n,a){A(n,e,a),t&&t.m(e,null),l=!0},p(n,a){n[9].value!==void 0?t?(t.p(n,a),a&2&&D(t,1)):(t=ll(n),t.c(),D(t,1),t.m(e,null)):t&&(ge(),R(t,1,1,()=>{t=null}),$e()),(!l||a&2)&&ye(e,"value-null",n[9].type==="null")},i(n){l||(D(t),l=!0)},o(n){R(t),l=!1},d(n){n&&h(e),t&&t.d()}}}function nl(r){var i,u;let e,l=new Date((i=r[5])==null?void 0:i.deleted_at).toLocaleDateString(void 0,{})+"",t,n,a,s=new Date((u=r[5])==null?void 0:u.deleted_at).toLocaleTimeString(void 0,{})+"",o;return{c(){e=$("td"),t=X(l),n=F(),a=$("span"),o=X(s),this.h()},l(d){e=g(d,"TD",{class:!0});var f=I(e);t=W(f,l),n=L(f),a=g(f,"SPAN",{class:!0});var v=I(a);o=W(v,s),v.forEach(h),f.forEach(h),this.h()},h(){_(a,"class","svelte-1bwwtph"),_(e,"class","date svelte-1bwwtph")},m(d,f){A(d,e,f),c(e,t),c(e,n),c(e,a),c(a,o)},p(d,f){var v,b;f&2&&l!==(l=new Date((v=d[5])==null?void 0:v.deleted_at).toLocaleDateString(void 0,{})+"")&&_e(t,l),f&2&&s!==(s=new Date((b=d[5])==null?void 0:b.deleted_at).toLocaleTimeString(void 0,{})+"")&&_e(o,s)},d(d){d&&h(e)}}}function al(r,e){var nt,ke,ze,at;let l,t,n,a,s,o,i="More options",u,d,f,v,b,C="Edit record",E,m,y,p,k=e[5].id+"",T,z,q,S,V=new Date((nt=e[5])==null?void 0:nt.created_at).toLocaleDateString(void 0,{})+"",N,w,O,P=new Date((ke=e[5])==null?void 0:ke.created_at).toLocaleTimeString(void 0,{})+"",M,Z,G,j=new Date((ze=e[5])==null?void 0:ze.updated_at).toLocaleDateString(void 0,{})+"",K,B,ae,Ce=new Date((at=e[5])==null?void 0:at.updated_at).toLocaleTimeString(void 0,{})+"",ve,ee,Oe,fe,we,Ue;d=new Se({props:{icon:"navigationMenuVertical",size:"16"}});function it(){return e[2](e[5])}m=new Se({props:{icon:"pencil",size:"16"}});function Ve(){return e[3](e[5])}let ce=e[0].id===e[5].id&&tl(e),De=Ee(e[1].table.properties),Q=[];for(let Y=0;YR(Q[Y],1,1,()=>{Q[Y]=null});let pe=e[1].filters.deleted==="true"&&nl(e);return{key:r,first:null,c(){l=$("tr"),t=$("td"),n=$("div"),a=$("div"),s=$("button"),o=$("span"),o.textContent=i,u=F(),ue(d.$$.fragment),f=F(),v=$("button"),b=$("span"),b.textContent=C,E=F(),ue(m.$$.fragment),y=F(),ce&&ce.c(),p=F(),T=X(k),z=F();for(let Y=0;Y{ce=null}),$e()),(!fe||J&2)&&k!==(k=e[5].id+"")&&_e(T,k),J&2){De=Ee(e[1].table.properties);let de;for(de=0;de{t=null}),$e())},i(a){l||(D(t),l=!0)},o(a){R(t),l=!1},d(a){a&&h(e),t&&t.d(a)}}}function cr(r,e,l){let t;Pe(r,H,i=>l(1,t=i));let n={id:null};return[n,t,i=>l(0,n.id=i.id,n),i=>{Fe(H,t.record=i,t)},()=>l(0,n.id=null,n)]}class dr extends Ge{constructor(e){super(),Qe(this,e,cr,fr,Ze,{})}}var ct=new Map;function _r(r){var e=ct.get(r);e&&e.destroy()}function pr(r){var e=ct.get(r);e&&e.update()}var ft=null;typeof window>"u"?((ft=function(r){return r}).destroy=function(r){return r},ft.update=function(r){return r}):((ft=function(r,e){return r&&Array.prototype.forEach.call(r.length?r:[r],function(l){return function(t){if(t&&t.nodeName&&t.nodeName==="TEXTAREA"&&!ct.has(t)){var n,a=null,s=window.getComputedStyle(t),o=(n=t.value,function(){u({testForHeightReduction:n===""||!t.value.startsWith(n),restoreTextAlign:null}),n=t.value}),i=(function(f){t.removeEventListener("autosize:destroy",i),t.removeEventListener("autosize:update",d),t.removeEventListener("input",o),window.removeEventListener("resize",d),Object.keys(f).forEach(function(v){return t.style[v]=f[v]}),ct.delete(t)}).bind(t,{height:t.style.height,resize:t.style.resize,textAlign:t.style.textAlign,overflowY:t.style.overflowY,overflowX:t.style.overflowX,wordWrap:t.style.wordWrap});t.addEventListener("autosize:destroy",i),t.addEventListener("autosize:update",d),t.addEventListener("input",o),window.addEventListener("resize",d),t.style.overflowX="hidden",t.style.wordWrap="break-word",ct.set(t,{destroy:i,update:d}),d()}function u(f){var v,b,C=f.restoreTextAlign,E=C===void 0?null:C,m=f.testForHeightReduction,y=m===void 0||m,p=s.overflowY;if(t.scrollHeight!==0&&(s.resize==="vertical"?t.style.resize="none":s.resize==="both"&&(t.style.resize="horizontal"),y&&(v=function(T){for(var z=[];T&&T.parentNode&&T.parentNode instanceof Element;)T.parentNode.scrollTop&&z.push([T.parentNode,T.parentNode.scrollTop]),T=T.parentNode;return function(){return z.forEach(function(q){var S=q[0],V=q[1];S.style.scrollBehavior="auto",S.scrollTop=V,S.style.scrollBehavior=null})}}(t),t.style.height=""),b=s.boxSizing==="content-box"?t.scrollHeight-(parseFloat(s.paddingTop)+parseFloat(s.paddingBottom)):t.scrollHeight+parseFloat(s.borderTopWidth)+parseFloat(s.borderBottomWidth),s.maxHeight!=="none"&&b>parseFloat(s.maxHeight)?(s.overflowY==="hidden"&&(t.style.overflow="scroll"),b=parseFloat(s.maxHeight)):s.overflowY!=="hidden"&&(t.style.overflow="hidden"),t.style.height=b+"px",E&&(t.style.textAlign=E),v&&v(),a!==b&&(t.dispatchEvent(new Event("autosize:resized",{bubbles:!0})),a=b),p!==s.overflow&&!E)){var k=s.textAlign;s.overflow==="hidden"&&(t.style.textAlign=k==="start"?"end":"start"),u({restoreTextAlign:k,testForHeightReduction:!0})}}function d(){u({testForHeightReduction:!0,restoreTextAlign:null})}}(l)}),r}).destroy=function(r){return r&&Array.prototype.forEach.call(r.length?r:[r],_r),r},ft.update=function(r){return r&&Array.prototype.forEach.call(r.length?r:[r],pr),r});var $t=ft;const Ct=r=>($t(r),{destroy(){$t.destroy(r)}});Ct.update=$t.update;Ct.destroy=$t.destroy;function sl(r,e,l){const t=r.slice();return t[13]=e[l],t}function il(r,e,l){const t=r.slice();t[16]=e[l];const n=t[1].properties?vl(t[1].properties[t[16].name],t[16].attribute_type):{type:t[16].attribute_type,value:""};return t[17]=n,t}function ol(r){let e,l;return{c(){e=$("input"),this.h()},l(t){e=g(t,"INPUT",{type:!0,name:!0}),this.h()},h(){_(e,"type","hidden"),_(e,"name","recordId"),e.value=l=r[1].id},m(t,n){A(t,e,n)},p(t,n){n&2&&l!==(l=t[1].id)&&(e.value=l)},d(t){t&&h(e)}}}function hr(r){let e=r[16].attribute_type+"",l,t,n,a,s;return{c(){l=X(e),t=F(),n=$("input"),this.h()},l(o){l=W(o,e),t=L(o),n=g(o,"INPUT",{type:!0,name:!0}),this.h()},h(){_(n,"type","hidden"),_(n,"name",a=r[16].name+"[type]"),n.value=s=r[16].attribute_type},m(o,i){A(o,l,i),A(o,t,i),A(o,n,i)},p(o,i){i&1&&e!==(e=o[16].attribute_type+"")&&_e(l,e),i&1&&a!==(a=o[16].name+"[type]")&&_(n,"name",a),i&1&&s!==(s=o[16].attribute_type)&&(n.value=s)},i:je,o:je,d(o){o&&(h(l),h(t),h(n))}}}function vr(r){let e,l;return e=new Dl({props:{name:r[16].name+"[type]",options:[{value:"string",label:"string"},{value:"json",label:"json"}],checked:r[17].type==="json"?"json":"string"}}),{c(){ue(e.$$.fragment)},l(t){oe(e.$$.fragment,t)},m(t,n){ie(e,t,n),l=!0},p(t,n){const a={};n&1&&(a.name=t[16].name+"[type]"),n&3&&(a.checked=t[17].type==="json"?"json":"string"),e.$set(a)},i(t){l||(D(e.$$.fragment,t),l=!0)},o(t){R(e.$$.fragment,t),l=!1},d(t){se(e,t)}}}function ul(r){let e;return{c(){e=X("(non editable)")},l(l){e=W(l,"(non editable)")},m(l,t){A(l,e,t)},d(l){l&&h(e)}}}function mr(r){let e,l,t,n,a,s,o;return{c(){e=$("textarea"),this.h()},l(i){e=g(i,"TEXTAREA",{rows:!0,name:!0,id:!0,class:!0}),I(e).forEach(h),this.h()},h(){_(e,"rows","1"),_(e,"name",l=r[16].name+"[value]"),_(e,"id",t="edit_"+r[16].name),e.disabled=n=r[16].attribute_type==="upload",e.value=a=r[17].type==="json"||r[17].type==="jsonEscaped"?JSON.stringify(r[17].value,void 0,2):r[17].value,_(e,"class","svelte-1udbufw")},m(i,u){A(i,e,u),s||(o=hl(Ct.call(null,e)),s=!0)},p(i,u){u&1&&l!==(l=i[16].name+"[value]")&&_(e,"name",l),u&1&&t!==(t="edit_"+i[16].name)&&_(e,"id",t),u&1&&n!==(n=i[16].attribute_type==="upload")&&(e.disabled=n),u&3&&a!==(a=i[17].type==="json"||i[17].type==="jsonEscaped"?JSON.stringify(i[17].value,void 0,2):i[17].value)&&(e.value=a)},d(i){i&&h(e),s=!1,o()}}}function br(r){let e,l,t,n,a,s,o,i,u,d;return{c(){e=$("select"),l=$("option"),t=$("option"),n=X("true"),s=$("option"),o=X("false"),this.h()},l(f){e=g(f,"SELECT",{name:!0,id:!0,class:!0});var v=I(e);l=g(v,"OPTION",{class:!0}),I(l).forEach(h),t=g(v,"OPTION",{});var b=I(t);n=W(b,"true"),b.forEach(h),s=g(v,"OPTION",{});var C=I(s);o=W(C,"false"),C.forEach(h),v.forEach(h),this.h()},h(){l.__value="",re(l,l.__value),_(l,"class","value-null"),t.__value="true",re(t,t.__value),t.selected=a=r[17].value==="true",s.__value="false",re(s,s.__value),s.selected=i=r[17].value==="false",_(e,"name",u=r[16].name+"[value]"),_(e,"id",d="edit_"+r[16].name),_(e,"class","svelte-1udbufw")},m(f,v){A(f,e,v),c(e,l),c(e,t),c(t,n),c(e,s),c(s,o)},p(f,v){v&3&&a!==(a=f[17].value==="true")&&(t.selected=a),v&3&&i!==(i=f[17].value==="false")&&(s.selected=i),v&1&&u!==(u=f[16].name+"[value]")&&_(e,"name",u),v&1&&d!==(d="edit_"+f[16].name)&&_(e,"id",d)},d(f){f&&h(e)}}}function fl(r){let e=r[5][r[16].name].message+"",l;return{c(){l=X(e)},l(t){l=W(t,e)},m(t,n){A(t,l,n)},p(t,n){n&33&&e!==(e=t[5][t[16].name].message+"")&&_e(l,e)},d(t){t&&h(l)}}}function cl(r){let e,l,t,n=r[16].name+"",a,s,o,i,u,d,f,v,b,C,E,m,y;const p=[vr,hr],k=[];function T(w,O){return w[16].attribute_type==="string"?0:1}u=T(r),d=k[u]=p[u](r);let z=r[16].attribute_type==="upload"&&ul();function q(w,O){return w[16].attribute_type==="boolean"?br:mr}let S=q(r),V=S(r),N=r[5][r[16].name]&&fl(r);return{c(){e=$("fieldset"),l=$("dir"),t=$("label"),a=X(n),s=$("br"),o=F(),i=$("div"),d.c(),f=F(),z&&z.c(),b=F(),C=$("div"),V.c(),E=F(),m=$("div"),N&&N.c(),this.h()},l(w){e=g(w,"FIELDSET",{class:!0});var O=I(e);l=g(O,"DIR",{});var P=I(l);t=g(P,"LABEL",{for:!0,class:!0});var M=I(t);a=W(M,n),s=g(M,"BR",{}),o=L(M),i=g(M,"DIV",{class:!0});var Z=I(i);d.l(Z),f=L(Z),z&&z.l(Z),Z.forEach(h),M.forEach(h),P.forEach(h),b=L(O),C=g(O,"DIV",{});var G=I(C);V.l(G),E=L(G),m=g(G,"DIV",{role:!0,class:!0});var j=I(m);N&&N.l(j),j.forEach(h),G.forEach(h),O.forEach(h),this.h()},h(){_(i,"class","type svelte-1udbufw"),_(t,"for",v="edit_"+r[16].name),_(t,"class","svelte-1udbufw"),_(m,"role","alert"),_(m,"class","svelte-1udbufw"),_(e,"class","svelte-1udbufw")},m(w,O){A(w,e,O),c(e,l),c(l,t),c(t,a),c(t,s),c(t,o),c(t,i),k[u].m(i,null),c(i,f),z&&z.m(i,null),c(e,b),c(e,C),V.m(C,null),c(C,E),c(C,m),N&&N.m(m,null),y=!0},p(w,O){(!y||O&1)&&n!==(n=w[16].name+"")&&_e(a,n);let P=u;u=T(w),u===P?k[u].p(w,O):(ge(),R(k[P],1,1,()=>{k[P]=null}),$e(),d=k[u],d?d.p(w,O):(d=k[u]=p[u](w),d.c()),D(d,1),d.m(i,f)),w[16].attribute_type==="upload"?z||(z=ul(),z.c(),z.m(i,null)):z&&(z.d(1),z=null),(!y||O&1&&v!==(v="edit_"+w[16].name))&&_(t,"for",v),S===(S=q(w))&&V?V.p(w,O):(V.d(1),V=S(w),V&&(V.c(),V.m(C,E))),w[5][w[16].name]?N?N.p(w,O):(N=fl(w),N.c(),N.m(m,null)):N&&(N.d(1),N=null)},i(w){y||(D(d),y=!0)},o(w){R(d),y=!1},d(w){w&&h(e),k[u].d(),z&&z.d(),V.d(),N&&N.d()}}}function dl(r){let e,l=JSON.stringify(r[13])+"",t,n;return{c(){e=$("li"),t=X(l),n=F(),this.h()},l(a){e=g(a,"LI",{class:!0});var s=I(e);t=W(s,l),n=L(s),s.forEach(h),this.h()},h(){_(e,"class","svelte-1udbufw")},m(a,s){A(a,e,s),c(e,t),c(e,n)},p(a,s){s&16&&l!==(l=JSON.stringify(a[13])+"")&&_e(t,l)},d(a){a&&h(e)}}}function gr(r){let e;return{c(){e=X("Create record")},l(l){e=W(l,"Create record")},m(l,t){A(l,e,t)},d(l){l&&h(e)}}}function $r(r){let e;return{c(){e=X("Edit record")},l(l){e=W(l,"Edit record")},m(l,t){A(l,e,t)},d(l){l&&h(e)}}}function wr(r){let e,l,t,n,a,s,o,i,u,d,f,v,b,C="Cancel",E,m,y,p,k,T,z,q,S=r[1].id&&ol(r),V=Ee(r[0]),N=[];for(let j=0;jR(N[j],1,1,()=>{N[j]=null});let O=Ee(r[4]),P=[];for(let j=0;j{T&&(k||(k=Rt(e,r[7],{},!0)),k.run(1))}),T=!0}},o(j){N=N.filter(Boolean);for(let K=0;Kl(6,t=m)),Pe(r,wt,m=>l(12,n=m));let{properties:a}=e,{editing:s}=e,o,i,u=[],d={};const f=function(m,{delay:y=0,duration:p=150}){return{delay:y,duration:p,css:k=>{const T=Tl(k);return`opacity: ${T}; transform: scale(${T});`}}};bl(()=>{setTimeout(()=>{o.showModal()},10)}),document.addEventListener("keydown",m=>{m.key==="Escape"&&(m.preventDefault(),Fe(H,t.record=null,t))},{once:!0});const v=async m=>{m.preventDefault();const y=new FormData(i);l(5,d={});for(const p of y.entries())if(p[0].endsWith("[type]")&&(p[1]==="json"||p[1]==="array")){const k=p[0].replace("[type]",""),T=y.get(k+"[value]");T!==""&&!Fl(T)&&l(5,d[k]={property:k,message:`Not a valid ${p[1]}`},d)}if(Object.keys(d).length)await gl(),document.querySelector('[role="alert"]:not(:empty)').scrollIntoView({behavior:"smooth",block:"center"});else if(t.record.id){const p=await Ne.edit({table:t.table.name,id:t.record.id,properties:y});p.errors?l(4,u=p.errors):(Ne.get({table:n.params.id,filters:t.filters,sort:t.sort,deleted:t.filters.deleted}),H.highlight("record",p.record_update.id),H.notification.create("success",`Record ${p.record_update.id} updated`),Fe(H,t.record=null,t))}else{const p=await Ne.create({table:t.table.name,properties:y});p.errors?l(4,u=p.errors):(H.clearFilters(),Ne.get({table:n.params.id,filters:t.filters,sort:t.sort,deleted:t.filters.deleted}),H.highlight("record",p.record_create.id),H.notification.create("success",`Record ${p.record_create.id} created`),Fe(H,t.record=null,t))}},b=()=>Fe(H,t.record=null,t);function C(m){rt[m?"unshift":"push"](()=>{i=m,l(3,i)})}function E(m){rt[m?"unshift":"push"](()=>{o=m,l(2,o)})}return r.$$set=m=>{"properties"in m&&l(0,a=m.properties),"editing"in m&&l(1,s=m.editing)},[a,s,o,i,u,d,t,f,v,b,C,E]}class yr extends Ge{constructor(e){super(),Qe(this,e,kr,wr,Ze,{properties:0,editing:1})}}const{document:Et}=Cl;function Er(r){let e;return{c(){e=X("Work in progress :)")},l(l){e=W(l,"Work in progress :)")},m(l,t){A(l,e,t)},i:je,o:je,d(l){l&&h(e)}}}function Tr(r){let e,l;return e=new dr({}),{c(){ue(e.$$.fragment)},l(t){oe(e.$$.fragment,t)},m(t,n){ie(e,t,n),l=!0},i(t){l||(D(e.$$.fragment,t),l=!0)},o(t){R(e.$$.fragment,t),l=!1},d(t){se(e,t)}}}function _l(r){let e,l,t,n,a,s,o;const i=[Nr,Cr],u=[];function d(f,v){return f[0].view.tableStyle==="collapsed"?0:1}return l=d(r),t=u[l]=i[l](r),{c(){e=$("button"),t.c(),this.h()},l(f){e=g(f,"BUTTON",{class:!0,title:!0});var v=I(e);t.l(v),v.forEach(h),this.h()},h(){_(e,"class","button"),_(e,"title",n=r[0].view.tableStyle==="expanded"?"Collapse values":"Expand values")},m(f,v){A(f,e,v),u[l].m(e,null),a=!0,s||(o=le(e,"click",_t(function(){yl(r[0].view.tableStyle==="collapsed"?H.setView({tableStyle:"expanded"}):H.setView({tableStyle:"collapsed"}))&&(r[0].view.tableStyle==="collapsed"?H.setView({tableStyle:"expanded"}):H.setView({tableStyle:"collapsed"})).apply(this,arguments)})),s=!0)},p(f,v){r=f;let b=l;l=d(r),l!==b&&(ge(),R(u[b],1,1,()=>{u[b]=null}),$e(),t=u[l],t||(t=u[l]=i[l](r),t.c()),D(t,1),t.m(e,null)),(!a||v&1&&n!==(n=r[0].view.tableStyle==="expanded"?"Collapse values":"Expand values"))&&_(e,"title",n)},i(f){a||(D(t),a=!0)},o(f){R(t),a=!1},d(f){f&&h(e),u[l].d(),s=!1,o()}}}function Cr(r){let e,l="Collapse values",t,n,a;return n=new Se({props:{icon:"collapse"}}),{c(){e=$("span"),e.textContent=l,t=F(),ue(n.$$.fragment),this.h()},l(s){e=g(s,"SPAN",{class:!0,"data-svelte-h":!0}),ne(e)!=="svelte-jserey"&&(e.textContent=l),t=L(s),oe(n.$$.fragment,s),this.h()},h(){_(e,"class","label")},m(s,o){A(s,e,o),A(s,t,o),ie(n,s,o),a=!0},i(s){a||(D(n.$$.fragment,s),a=!0)},o(s){R(n.$$.fragment,s),a=!1},d(s){s&&(h(e),h(t)),se(n,s)}}}function Nr(r){let e,l="Expand values",t,n,a;return n=new Se({props:{icon:"expand"}}),{c(){e=$("span"),e.textContent=l,t=F(),ue(n.$$.fragment),this.h()},l(s){e=g(s,"SPAN",{class:!0,"data-svelte-h":!0}),ne(e)!=="svelte-1tvmrgx"&&(e.textContent=l),t=L(s),oe(n.$$.fragment,s),this.h()},h(){_(e,"class","label")},m(s,o){A(s,e,o),A(s,t,o),ie(n,s,o),a=!0},i(s){a||(D(n.$$.fragment,s),a=!0)},o(s){R(n.$$.fragment,s),a=!1},d(s){s&&(h(e),h(t)),se(n,s)}}}function pl(r){let e,l;return e=new yr({props:{properties:r[0].table.properties,editing:r[0].record}}),{c(){ue(e.$$.fragment)},l(t){oe(e.$$.fragment,t)},m(t,n){ie(e,t,n),l=!0},p(t,n){const a={};n&1&&(a.properties=t[0].table.properties),n&1&&(a.editing=t[0].record),e.$set(a)},i(t){l||(D(e.$$.fragment,t),l=!0)},o(t){R(e.$$.fragment,t),l=!1},d(t){se(e,t)}}}function Sr(r){var Dt,Lt,Ft,Pt;let e,l,t,n,a,s,o,i,u,d,f="Refresh current view",v,b,C,E,m,y,p,k,T,z="Page:",q,S,V,N,w=(((Dt=r[0].records)==null?void 0:Dt.total_pages)||1)+"",O,P,M,Z,G,j,K,B="Create new record",ae,Ce,ve,ee,Oe,fe,we,Ue,it,Ve,ce,De=r[0].filters.deleted==="false"?"ing":"",Q,ot,pe,nt,ke,ze,at,Y,J,Te=r[0].filters.deleted==="true"?"ing":"",Ie,Re,Le,de,te,xe,qe,He,he,kt,yt,Nt;Et.title=e=(((Lt=r[0].table)==null?void 0:Lt.name)||"Loading…")+((Ft=r[0].online)!=null&&Ft.MPKIT_URL?": "+r[0].online.MPKIT_URL.replace("https://",""):""),a=new ql({}),o=new Yl({}),b=new Se({props:{icon:"refresh"}});const St=[Tr,Er],et=[];function Ot(U,x){return U[0].view.database!=="tiles"?0:1}E=Ot(r),m=et[E]=St[E](r);function ml(U){r[5](U)}let It={name:"page",min:1,max:(Pt=r[0].records)==null?void 0:Pt.total_pages,step:1,decreaseLabel:"Previous page",increaseLabel:"Next page",style:"navigation"};r[0].filters.page!==void 0&&(It.value=r[0].filters.page),S=new Pl({props:It}),rt.push(()=>El(S,"value",ml)),S.$on("input",r[6]),G=new Se({props:{icon:"plus"}});let me=r[0].view.database!=="tiles"&&_l(r);Ue=new Se({props:{icon:"leaf"}}),ze=new Se({props:{icon:"recycle"}});let be=r[0].record!==null&&pl(r);return kt=$l(r[9][0]),{c(){l=F(),t=$("section"),n=$("nav"),ue(a.$$.fragment),s=F(),ue(o.$$.fragment),i=F(),u=$("button"),d=$("span"),d.textContent=f,v=F(),ue(b.$$.fragment),C=F(),m.c(),y=F(),p=$("nav"),k=$("div"),T=$("label"),T.textContent=z,q=F(),ue(S.$$.fragment),N=X(`\r + of `),O=X(w),P=F(),M=$("div"),Z=$("button"),ue(G.$$.fragment),j=F(),K=$("span"),K.textContent=B,ae=F(),me&&me.c(),Ce=F(),ve=$("div"),ee=$("input"),fe=F(),we=$("label"),ue(Ue.$$.fragment),it=F(),Ve=$("span"),ce=X("Show"),Q=X(De),ot=X(" current database state"),nt=F(),ke=$("label"),ue(ze.$$.fragment),at=F(),Y=$("span"),J=X("Show"),Ie=X(Te),Re=X(" deleted records"),de=F(),te=$("input"),qe=F(),be&&be.c(),He=Ae(),this.h()},l(U){kl("svelte-1ke6alb",Et.head).forEach(h),l=L(U),t=g(U,"SECTION",{class:!0});var Be=I(t);n=g(Be,"NAV",{class:!0});var Me=I(n);oe(a.$$.fragment,Me),s=L(Me),oe(o.$$.fragment,Me),i=L(Me),u=g(Me,"BUTTON",{class:!0,title:!0});var tt=I(u);d=g(tt,"SPAN",{class:!0,"data-svelte-h":!0}),ne(d)!=="svelte-iqo23s"&&(d.textContent=f),v=L(tt),oe(b.$$.fragment,tt),tt.forEach(h),Me.forEach(h),C=L(Be),m.l(Be),y=L(Be),p=g(Be,"NAV",{class:!0});var lt=I(p);k=g(lt,"DIV",{});var Je=I(k);T=g(Je,"LABEL",{for:!0,"data-svelte-h":!0}),ne(T)!=="svelte-1r8oyu6"&&(T.textContent=z),q=L(Je),oe(S.$$.fragment,Je),N=W(Je,`\r + of `),O=W(Je,w),Je.forEach(h),P=L(lt),M=g(lt,"DIV",{id:!0,class:!0});var We=I(M);Z=g(We,"BUTTON",{class:!0,title:!0});var pt=I(Z);oe(G.$$.fragment,pt),j=L(pt),K=g(pt,"SPAN",{class:!0,"data-svelte-h":!0}),ne(K)!=="svelte-19x6y3e"&&(K.textContent=B),pt.forEach(h),ae=L(We),me&&me.l(We),Ce=L(We),ve=g(We,"DIV",{class:!0});var Xe=I(ve);ee=g(Xe,"INPUT",{type:!0,name:!0,id:!0,class:!0}),fe=L(Xe),we=g(Xe,"LABEL",{for:!0,class:!0,title:!0});var ht=I(we);oe(Ue.$$.fragment,ht),it=L(ht),Ve=g(ht,"SPAN",{class:!0});var vt=I(Ve);ce=W(vt,"Show"),Q=W(vt,De),ot=W(vt," current database state"),vt.forEach(h),ht.forEach(h),nt=L(Xe),ke=g(Xe,"LABEL",{for:!0,class:!0,title:!0});var mt=I(ke);oe(ze.$$.fragment,mt),at=L(mt),Y=g(mt,"SPAN",{class:!0});var bt=I(Y);J=W(bt,"Show"),Ie=W(bt,Te),Re=W(bt," deleted records"),bt.forEach(h),mt.forEach(h),de=L(Xe),te=g(Xe,"INPUT",{type:!0,name:!0,id:!0,class:!0}),Xe.forEach(h),We.forEach(h),lt.forEach(h),Be.forEach(h),qe=L(U),be&&be.l(U),He=Ae(),this.h()},h(){_(d,"class","label"),_(u,"class","button svelte-afbo94"),_(u,"title","Refresh current view (R)"),ye(u,"refreshing",r[2]),_(n,"class","svelte-afbo94"),_(T,"for","page"),_(K,"class","label"),_(Z,"class","button"),_(Z,"title","Create new record"),_(ee,"type","radio"),_(ee,"name","deleted"),_(ee,"id","deletedTrue"),ee.__value="false",re(ee,ee.__value),ee.disabled=Oe=r[0].filters.deleted==="false",_(ee,"class","svelte-afbo94"),_(Ve,"class","label"),_(we,"for","deletedTrue"),_(we,"class","button"),_(we,"title",pe="Show"+(r[0].filters.deleted==="false"?"ing":"")+" current database state"),ye(we,"active",r[0].filters.deleted==="false"),ye(we,"disabled",r[0].filters.deleted==="false"),_(Y,"class","label"),_(ke,"for","deletedFalse"),_(ke,"class","button"),_(ke,"title",Le="Show"+(r[0].filters.deleted==="true"?"ing":"")+" deleted records"),ye(ke,"active",r[0].filters.deleted==="true"),ye(ke,"disabled",r[0].filters.deleted==="true"),_(te,"type","radio"),_(te,"name","deleted"),_(te,"id","deletedFalse"),te.__value="true",re(te,te.__value),te.disabled=xe=r[0].filters.deleted==="true",_(te,"class","svelte-afbo94"),_(ve,"class","combo svelte-afbo94"),_(M,"id","viewOptions"),_(M,"class","svelte-afbo94"),_(p,"class","pagination svelte-afbo94"),_(t,"class","svelte-afbo94"),kt.p(ee,te)},m(U,x){A(U,l,x),A(U,t,x),c(t,n),ie(a,n,null),c(n,s),ie(o,n,null),c(n,i),c(n,u),c(u,d),c(u,v),ie(b,u,null),c(t,C),et[E].m(t,null),c(t,y),c(t,p),c(p,k),c(k,T),c(k,q),ie(S,k,null),c(k,N),c(k,O),c(p,P),c(p,M),c(M,Z),ie(G,Z,null),c(Z,j),c(Z,K),c(M,ae),me&&me.m(M,null),c(M,Ce),c(M,ve),c(ve,ee),ee.checked=ee.__value===r[0].filters.deleted,c(ve,fe),c(ve,we),ie(Ue,we,null),c(we,it),c(we,Ve),c(Ve,ce),c(Ve,Q),c(Ve,ot),c(ve,nt),c(ve,ke),ie(ze,ke,null),c(ke,at),c(ke,Y),c(Y,J),c(Y,Ie),c(Y,Re),c(ve,de),c(ve,te),te.checked=te.__value===r[0].filters.deleted,A(U,qe,x),be&&be.m(U,x),A(U,He,x),he=!0,yt||(Nt=[le(window,"keypress",r[4]),le(u,"click",r[3]),le(Z,"click",_t(r[7])),le(ee,"change",r[8]),le(ee,"change",r[10]),le(te,"change",r[11]),le(te,"change",r[12])],yt=!0)},p(U,[x]){var tt,lt,Je,We;(!he||x&1)&&e!==(e=(((tt=U[0].table)==null?void 0:tt.name)||"Loading…")+((lt=U[0].online)!=null&<.MPKIT_URL?": "+U[0].online.MPKIT_URL.replace("https://",""):""))&&(Et.title=e),(!he||x&4)&&ye(u,"refreshing",U[2]);let Be=E;E=Ot(U),E!==Be&&(ge(),R(et[Be],1,1,()=>{et[Be]=null}),$e(),m=et[E],m||(m=et[E]=St[E](U),m.c()),D(m,1),m.m(t,y));const Me={};x&1&&(Me.max=(Je=U[0].records)==null?void 0:Je.total_pages),!V&&x&1&&(V=!0,Me.value=U[0].filters.page,wl(()=>V=!1)),S.$set(Me),(!he||x&1)&&w!==(w=(((We=U[0].records)==null?void 0:We.total_pages)||1)+"")&&_e(O,w),U[0].view.database!=="tiles"?me?(me.p(U,x),x&1&&D(me,1)):(me=_l(U),me.c(),D(me,1),me.m(M,Ce)):me&&(ge(),R(me,1,1,()=>{me=null}),$e()),(!he||x&1&&Oe!==(Oe=U[0].filters.deleted==="false"))&&(ee.disabled=Oe),x&1&&(ee.checked=ee.__value===U[0].filters.deleted),(!he||x&1)&&De!==(De=U[0].filters.deleted==="false"?"ing":"")&&_e(Q,De),(!he||x&1&&pe!==(pe="Show"+(U[0].filters.deleted==="false"?"ing":"")+" current database state"))&&_(we,"title",pe),(!he||x&1)&&ye(we,"active",U[0].filters.deleted==="false"),(!he||x&1)&&ye(we,"disabled",U[0].filters.deleted==="false"),(!he||x&1)&&Te!==(Te=U[0].filters.deleted==="true"?"ing":"")&&_e(Ie,Te),(!he||x&1&&Le!==(Le="Show"+(U[0].filters.deleted==="true"?"ing":"")+" deleted records"))&&_(ke,"title",Le),(!he||x&1)&&ye(ke,"active",U[0].filters.deleted==="true"),(!he||x&1)&&ye(ke,"disabled",U[0].filters.deleted==="true"),(!he||x&1&&xe!==(xe=U[0].filters.deleted==="true"))&&(te.disabled=xe),x&1&&(te.checked=te.__value===U[0].filters.deleted),U[0].record!==null?be?(be.p(U,x),x&1&&D(be,1)):(be=pl(U),be.c(),D(be,1),be.m(He.parentNode,He)):be&&(ge(),R(be,1,1,()=>{be=null}),$e())},i(U){he||(D(a.$$.fragment,U),D(o.$$.fragment,U),D(b.$$.fragment,U),D(m),D(S.$$.fragment,U),D(G.$$.fragment,U),D(me),D(Ue.$$.fragment,U),D(ze.$$.fragment,U),D(be),he=!0)},o(U){R(a.$$.fragment,U),R(o.$$.fragment,U),R(b.$$.fragment,U),R(m),R(S.$$.fragment,U),R(G.$$.fragment,U),R(me),R(Ue.$$.fragment,U),R(ze.$$.fragment,U),R(be),he=!1},d(U){U&&(h(l),h(t),h(qe),h(He)),se(a),se(o),se(b),et[E].d(),se(S),se(G),me&&me.d(),se(Ue),se(ze),be&&be.d(U),kt.r(),yt=!1,st(Nt)}}}function Or(r,e,l){let t,n;Pe(r,H,m=>l(0,t=m)),Pe(r,wt,m=>l(1,n=m));let a=!1;const s=()=>{l(2,a=!0),Ne.get({table:n.params.id,filters:t.filters,sort:t.sort,deleted:t.filters.deleted}).then(()=>l(2,a=!1))},o=m=>{document.activeElement===document.body&&!m.target.matches("input, textarea")&&m.key==="r"&&s()},i=[[]];function u(m){r.$$.not_equal(t.filters.page,m)&&(t.filters.page=m,H.set(t))}const d=()=>{Ne.get({table:n.params.id,filters:t.filters,sort:t.sort,deleted:t.filters.deleted})},f=()=>Fe(H,t.record={},t);function v(){t.filters.deleted=this.__value,H.set(t)}const b=()=>{Ne.get({table:n.params.id,filters:t.filters,sort:t.sort,deleted:t.filters.deleted})};function C(){t.filters.deleted=this.__value,H.set(t)}const E=()=>{Ne.get({table:n.params.id,filters:t.filters,sort:t.sort,deleted:t.filters.deleted})};return r.$$.update=()=>{r.$$.dirty&3&&Fe(H,t.table=t.tables.filter(m=>m.id===n.params.id)[0],t),r.$$.dirty&2&&n.params.id&&Ne.get({table:n.params.id})&&H.clearFilters()},[t,n,a,s,o,u,d,f,v,i,b,C,E]}class qr extends Ge{constructor(e){super(),Qe(this,e,Or,Sr,Ze,{})}}export{qr as component}; diff --git a/gui/next/build/_app/immutable/nodes/13.D8FJ5ozT.js b/gui/next/build/_app/immutable/nodes/13.D8FJ5ozT.js new file mode 100644 index 0000000..f9a6cbc --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/13.D8FJ5ozT.js @@ -0,0 +1 @@ +import{s as Be,d as g,a as Q,K as Z,i as q,b as u,w as _,c as v,e as w,f as J,g as P,h as b,t as K,j as N,n as be,I as $e,D as x,r as Fe,C as Ee,p as Je,z as ee,k as Ke,T as Ge,L as me,a0 as Ye,S as Qe,H as We,J as Xe,E as Ze,G as xe}from"../chunks/Ul9VwQ7n.js";import{S as qe,i as ze,t as F,a as A,g as oe,e as ie,d as te,m as le,c as se,b as ne,h as et}from"../chunks/Bh3MJlbi.js";import{g as tt}from"../chunks/CS29TWE_.js";import{e as ue}from"../chunks/BNCRiqmJ.js";import{f as lt}from"../chunks/odGh2V91.js";import{s as ce}from"../chunks/DGc7Lmco.js";import{I as de}from"../chunks/D-yR0E5w.js";import{A as st}from"../chunks/DntFPtNo.js";import{t as nt}from"../chunks/x4PJc0Qf.js";import{J as rt}from"../chunks/BVVGnpm8.js";const at={get:async s=>{const e=typeof window<"u"&&window.location.port!=="4173"&&window.location.port!=="5173"?`http://localhost:${parseInt(window.location.port)}/api/logs`:"http://localhost:3333/api/logs",n=s.last??null;return fetch(`${e}?lastId=`+n).then(t=>t.ok?t.json():Promise.reject(t)).then(t=>(t.logs.forEach(l=>{l.downloaded_at=Date.now()}),t)).catch(t=>({error:t}))}},ot=1,it=s=>!!s&&typeof s=="object"&&s.schema_version===ot,ft=s=>s&&s.data&&s.data.type||s&&s.error_type||"Log",ke=s=>s?typeof s=="string"?s:s.path?s.line!=null?`${s.path}:${s.line}`:`${s.path}`:s.line!=null?`line ${s.line}`:null:null;function we(s,e,n){const t=s.slice();return t[12]=e[n],t}function Se(s){let e,n;return{c(){e=b("span"),n=K(s[5]),this.h()},l(t){e=v(t,"SPAN",{class:!0});var l=w(e);n=J(l,s[5]),l.forEach(g),this.h()},h(){_(e,"class","location svelte-u09j0c")},m(t,l){q(t,e,l),u(e,n)},p(t,l){l&32&&Q(n,t[5])},d(t){t&&g(e)}}}function ut(s){let e;function n(a,r){return a[3]||a[2].length<=fe?ht:dt}let t=n(s),l=t(s);return{c(){e=b("div"),l.c(),this.h()},l(a){e=v(a,"DIV",{class:!0});var r=w(e);l.l(r),r.forEach(g),this.h()},h(){_(e,"class","message pre svelte-u09j0c")},m(a,r){q(a,e,r),l.m(e,null)},p(a,r){t===(t=n(a))&&l?l.p(a,r):(l.d(1),l=t(a),l&&(l.c(),l.m(e,null)))},i:be,o:be,d(a){a&&g(e),l.d()}}}function ct(s){let e,n;return e=new rt({props:{value:s[6],showFullLines:!0}}),{c(){ne(e.$$.fragment)},l(t){se(e.$$.fragment,t)},m(t,l){le(e,t,l),n=!0},p(t,l){const a={};l&64&&(a.value=t[6]),e.$set(a)},i(t){n||(A(e.$$.fragment,t),n=!0)},o(t){F(e.$$.fragment,t),n=!1},d(t){te(e,t)}}}function dt(s){let e=s[2].substr(0,fe)+"",n,t,l,a,r=s[2].length-fe+"",i,o,c,d;return{c(){n=K(e),t=N(),l=b("span"),a=b("button"),i=K(r),o=K(" more characters"),this.h()},l(f){n=J(f,e),t=P(f),l=v(f,"SPAN",{class:!0});var p=w(l);a=v(p,"BUTTON",{type:!0,class:!0});var h=w(a);i=J(h,r),o=J(h," more characters"),h.forEach(g),p.forEach(g),this.h()},h(){_(a,"type","button"),_(a,"class","svelte-u09j0c"),_(l,"class","longStringInfo svelte-u09j0c")},m(f,p){q(f,n,p),q(f,t,p),q(f,l,p),u(l,a),u(a,i),u(a,o),c||(d=x(a,"click",s[11]),c=!0)},p(f,p){p&4&&e!==(e=f[2].substr(0,fe)+"")&&Q(n,e),p&4&&r!==(r=f[2].length-fe+"")&&Q(i,r)},d(f){f&&(g(n),g(t),g(l)),c=!1,d()}}}function ht(s){let e;return{c(){e=K(s[2])},l(n){e=J(n,s[2])},m(n,t){q(n,e,t)},p(n,t){t&4&&Q(e,n[2])},d(n){n&&g(e)}}}function Te(s){let e,n=s[0].source_span+"",t;return{c(){e=b("pre"),t=K(n),this.h()},l(l){e=v(l,"PRE",{class:!0});var a=w(e);t=J(a,n),a.forEach(g),this.h()},h(){_(e,"class","source svelte-u09j0c")},m(l,a){q(l,e,a),u(e,t)},p(l,a){a&1&&n!==(n=l[0].source_span+"")&&Q(t,n)},d(l){l&&g(e)}}}function Le(s){let e,n,t,l=s[1].length+"",a,r,i,o,c=ue(s[1]),d=[];for(let f=0;f1&&Le(s),C=(s[4].url||s[4].user)&&ye(s);return{c(){e=b("div"),n=b("div"),t=b("span"),l=K(s[7]),a=N(),h&&h.c(),r=N(),o&&o.c(),c=N(),$&&$.c(),d=N(),L&&L.c(),f=N(),C&&C.c(),this.h()},l(k){e=v(k,"DIV",{class:!0});var E=w(e);n=v(E,"DIV",{class:!0});var j=w(n);t=v(j,"SPAN",{class:!0});var I=w(t);l=J(I,s[7]),I.forEach(g),a=P(j),h&&h.l(j),j.forEach(g),r=P(E),o&&o.l(E),c=P(E),$&&$.l(E),d=P(E),L&&L.l(E),f=P(E),C&&C.l(E),E.forEach(g),this.h()},h(){_(t,"class","type svelte-u09j0c"),_(n,"class","header svelte-u09j0c"),_(e,"class","diagnostic svelte-u09j0c"),Z(e,"isError",s[8])},m(k,E){q(k,e,E),u(e,n),u(n,t),u(t,l),u(n,a),h&&h.m(n,null),u(e,r),~i&&S[i].m(e,null),u(e,c),$&&$.m(e,null),u(e,d),L&&L.m(e,null),u(e,f),C&&C.m(e,null),p=!0},p(k,[E]){(!p||E&128)&&Q(l,k[7]),k[5]?h?h.p(k,E):(h=Se(k),h.c(),h.m(n,null)):h&&(h.d(1),h=null);let j=i;i=V(k),i===j?~i&&S[i].p(k,E):(o&&(oe(),F(S[j],1,1,()=>{S[j]=null}),ie()),~i?(o=S[i],o?o.p(k,E):(o=S[i]=T[i](k),o.c()),A(o,1),o.m(e,c)):o=null),k[0].source_span?$?$.p(k,E):($=Te(k),$.c(),$.m(e,d)):$&&($.d(1),$=null),k[1].length>1?L?L.p(k,E):(L=Le(k),L.c(),L.m(e,f)):L&&(L.d(1),L=null),k[4].url||k[4].user?C?C.p(k,E):(C=ye(k),C.c(),C.m(e,null)):C&&(C.d(1),C=null),(!p||E&256)&&Z(e,"isError",k[8])},i(k){p||(A(o),p=!0)},o(k){F(o),p=!1},d(k){k&&g(e),h&&h.d(),~i&&S[i].d(),$&&$.d(),L&&L.d(),C&&C.d()}}}const fe=262144;function gt(s,e,n){let t,l,a,r,i,o,c,d,f,{log:p}=e,h=!1;const T=()=>n(3,h=!0);return s.$$set=S=>{"log"in S&&n(9,p=S.log)},s.$$.update=()=>{s.$$.dirty&512&&n(0,t=p.data||{}),s.$$.dirty&1&&n(10,l=it(t)),s.$$.dirty&1&&n(8,a=!!t.type),s.$$.dirty&512&&n(7,r=ft(p)),s.$$.dirty&513&&n(2,i=t.message!=null?String(t.message):p.message==null?"":String(p.message)),s.$$.dirty&4&&n(6,o=i.lengthF(l[r],1,1,()=>{l[r]=null});return{c(){e=b("table");for(let r=0;rs[4].logs.downloaded_at[0])},m(U,R){q(U,e,R),u(e,n),u(n,t),u(t,a),u(t,r),u(t,o),u(e,d),u(e,f),le(p,f,null),u(e,h),u(e,T),u(T,S),u(S,V),u(V,$),u(V,C),le(k,V,null),u(S,E),u(S,j),u(j,I),u(j,y),le(z,j,null),u(e,Y),D=!0,H||(B=[x(V,"click",he),x(j,"click",Ze(O))],H=!0)},p(U,R){s=U,(!D||R&16)&&l!==(l=new Date(s[21].created_at).toLocaleDateString(void 0,{})+"")&&Q(a,l),(!D||R&16)&&i!==(i=new Date(s[21].created_at).toLocaleTimeString(void 0,{})+"")&&Q(o,i),(!D||R&16&&c!==(c=s[21].created_at))&&_(t,"datetime",c);const X={};R&16&&(X.log=s[21]),p.$set(X),(!D||R&20)&&Z(j,"active",s[2].find(G)),(!D||R&50)&&Z(e,"hidden",s[1]&&s[5](s[21])||s[21].hidden),(!D||R&16)&&Z(e,"error",s[21].error_type.match(/error/i)),(!D||R&16)&&Z(e,"fresh",s[21].downloaded_at>s[4].logs.downloaded_at[0])},i(U){D||(A(p.$$.fragment,U),A(k.$$.fragment,U),A(z.$$.fragment,U),U&&(M||Xe(()=>{M=et(e,lt,{duration:200}),M.start()})),D=!0)},o(U){F(p.$$.fragment,U),F(k.$$.fragment,U),F(z.$$.fragment,U),D=!1},d(U){U&&g(e),te(p),te(k),te(z),H=!1,Fe(B)}}}function Ue(s){let e,n="No newer logs to show
Checking every 3 seconds";return{c(){e=b("footer"),e.innerHTML=n,this.h()},l(t){e=v(t,"FOOTER",{class:!0,"data-svelte-h":!0}),ee(e)!=="svelte-akhvzo"&&(e.innerHTML=n),this.h()},h(){_(e,"class","svelte-12glt4h")},m(t,l){q(t,e,l)},d(t){t&&g(e)}}}function Me(s){let e,n;return e=new st({props:{$$slots:{default:[pt]},$$scope:{ctx:s}}}),{c(){ne(e.$$.fragment)},l(t){se(e.$$.fragment,t)},m(t,l){le(e,t,l),n=!0},p(t,l){const a={};l&67108868&&(a.$$scope={dirty:l,ctx:t}),e.$set(a)},i(t){n||(A(e.$$.fragment,t),n=!0)},o(t){F(e.$$.fragment,t),n=!1},d(t){te(e,t)}}}function Re(s){let e,n,t=ue(s[2]),l=[];for(let r=0;rF(l[r],1,1,()=>{l[r]=null});return{c(){e=b("ul");for(let r=0;r{c=null}),ie())},i(d){r||(A(c),r=!0)},o(d){F(c),r=!1},d(d){d&&g(e),c&&c.d(),i=!1,o()}}}function mt(s){var he;let e,n,t,l,a,r,i,o="Filter:",c,d,f,p,h,T,S="Clear screen",V,$,L,C="Toggle pinned logs panel",k,E,j,I,m,y,z,Y;ve.title=e="Logs"+((he=s[4].online)!=null&&he.MPKIT_URL?": "+s[4].online.MPKIT_URL.replace("https://",""):"");let M=s[1]&&je(s);E=new de({props:{icon:"pin"}});let D=s[4].logs.logs&&Ae(s),H=!s[1]&&Ue(),B=s[3]&&Me(s);return{c(){n=N(),t=b("div"),l=b("section"),a=b("nav"),r=b("form"),i=b("label"),i.textContent=o,c=N(),d=b("input"),f=N(),M&&M.c(),p=N(),h=b("div"),T=b("button"),T.textContent=S,V=N(),$=b("button"),L=b("span"),L.textContent=C,k=N(),ne(E.$$.fragment),j=N(),D&&D.c(),I=N(),H&&H.c(),m=N(),B&&B.c(),this.h()},l(O){Je("svelte-dfdkqr",ve.head).forEach(g),n=P(O),t=v(O,"DIV",{class:!0});var U=w(t);l=v(U,"SECTION",{class:!0});var R=w(l);a=v(R,"NAV",{class:!0});var X=w(a);r=v(X,"FORM",{});var W=w(r);i=v(W,"LABEL",{for:!0,"data-svelte-h":!0}),ee(i)!=="svelte-kf6j7o"&&(i.textContent=o),c=P(W),d=v(W,"INPUT",{type:!0,id:!0,class:!0}),f=P(W),M&&M.l(W),W.forEach(g),p=P(X),h=v(X,"DIV",{class:!0});var re=w(h);T=v(re,"BUTTON",{type:!0,class:!0,"data-svelte-h":!0}),ee(T)!=="svelte-1hlqgjb"&&(T.textContent=S),V=P(re),$=v(re,"BUTTON",{type:!0,title:!0,class:!0});var ae=w($);L=v(ae,"SPAN",{class:!0,"data-svelte-h":!0}),ee(L)!=="svelte-1o6petk"&&(L.textContent=C),k=P(ae),se(E.$$.fragment,ae),ae.forEach(g),re.forEach(g),X.forEach(g),j=P(R),D&&D.l(R),I=P(R),H&&H.l(R),R.forEach(g),m=P(U),B&&B.l(U),U.forEach(g),this.h()},h(){_(i,"for","filter"),_(d,"type","text"),_(d,"id","filter"),_(d,"class","svelte-12glt4h"),_(T,"type","button"),_(T,"class","button"),_(L,"class","label"),_($,"type","button"),_($,"title","Toggle pinned logs panel"),_($,"class","button"),_(h,"class","svelte-12glt4h"),_(a,"class","svelte-12glt4h"),_(l,"class","logs svelte-12glt4h"),_(t,"class","container svelte-12glt4h")},m(O,G){q(O,n,G),q(O,t,G),u(t,l),u(l,a),u(a,r),u(r,i),u(r,c),u(r,d),Ee(d,s[1]),u(r,f),M&&M.m(r,null),u(a,p),u(a,h),u(h,T),u(h,V),u(h,$),u($,L),u($,k),le(E,$,null),u(l,j),D&&D.m(l,null),u(l,I),H&&H.m(l,null),u(t,m),B&&B.m(t,null),s[16](t),y=!0,z||(Y=[x(d,"input",s[8]),x(T,"click",s[10]),x($,"click",s[7])],z=!0)},p(O,[G]){var U;(!y||G&16)&&e!==(e="Logs"+((U=O[4].online)!=null&&U.MPKIT_URL?": "+O[4].online.MPKIT_URL.replace("https://",""):""))&&(ve.title=e),G&2&&d.value!==O[1]&&Ee(d,O[1]),O[1]?M?(M.p(O,G),G&2&&A(M,1)):(M=je(O),M.c(),A(M,1),M.m(r,null)):M&&(oe(),F(M,1,1,()=>{M=null}),ie()),O[4].logs.logs?D?(D.p(O,G),G&16&&A(D,1)):(D=Ae(O),D.c(),A(D,1),D.m(l,I)):D&&(oe(),F(D,1,1,()=>{D=null}),ie()),O[1]?H&&(H.d(1),H=null):H||(H=Ue(),H.c(),H.m(l,null)),O[3]?B?(B.p(O,G),G&8&&A(B,1)):(B=Me(O),B.c(),A(B,1),B.m(t,null)):B&&(oe(),F(B,1,1,()=>{B=null}),ie())},i(O){y||(A(M),A(E.$$.fragment,O),A(D),A(B),y=!0)},o(O){F(M),F(E.$$.fragment,O),F(D),F(B),y=!1},d(O){O&&(g(n),g(t)),M&&M.d(),te(E),D&&D.d(),H&&H.d(),B&&B.d(),s[16](null),z=!1,Fe(Y)}}}function vt(s,e,n){let t;Ke(s,ce,m=>n(4,t=m));let l,a="",r=[],i,o;Ge(()=>(c(),p(),o=setInterval(()=>{document.visibilityState!=="hidden"&&c()},7500),()=>clearInterval(o)));const c=async()=>{var z,Y,M;const m=((Y=(z=t.logs.logs)==null?void 0:z.at(-1))==null?void 0:Y.id)??null,y=await at.get({last:m});m?(M=y.logs)!=null&&M.length&&(me(ce,t.logs.logs=[...t.logs.logs,...y.logs],t),t.logs.downloaded_at.push(Date.now()),t.logs.downloaded_at.length>2&&t.logs.downloaded_at.splice(0,1)):t.logs.logs||(me(ce,t.logs=y,t),t.logs.downloaded_at||me(ce,t.logs.downloaded_at=[Date.now()],t))},d=m=>m.hidden===!0||m.error_type.toLowerCase().indexOf(a)===-1&&m.message.toLowerCase().indexOf(a)===-1;let f=!1;Ye(()=>{{const m=document.querySelector(".logs");m&&Math.abs(m.scrollHeight-m.scrollTop-m.clientHeight)<10&&(f=!1)}}),Qe(async()=>{var m;f||(await xe(),document.querySelector("footer").scrollIntoView(),(m=t.logs.logs)!=null&&m.length&&(f=!0))});const p=()=>{n(3,i=localStorage.pinnedPanel==="true"),n(2,r=localStorage.pinnedLogs?JSON.parse(localStorage.pinnedLogs):[])},h=m=>{r.find(y=>y.id===m.id)?n(2,r=r.filter(y=>y.id!==m.id)):n(2,r=[...r,m]),localStorage.pinnedLogs=JSON.stringify(r)},T=()=>{i?(n(3,i=!1),localStorage.pinnedPanel=!1):(n(3,i=!0),localStorage.pinnedPanel=!0)};function S(){a=this.value,n(1,a)}const V=()=>n(1,a=""),$=()=>t.logs.logs.forEach((m,y)=>me(ce,t.logs.logs[y].hidden=!0,t)),L=(m,y)=>navigator.clipboard.writeText(m.message).then(()=>{y.target.classList.add("confirmation"),setTimeout(()=>y.target.classList.remove("confirmation"),1e3)}),C=m=>h(m),k=(m,y)=>y.id===m.id,E=()=>{localStorage.pinnedLogs=[],n(2,r=[])},j=m=>h(m);function I(m){We[m?"unshift":"push"](()=>{l=m,n(0,l)})}return[l,a,r,i,t,d,h,T,S,V,$,L,C,k,E,j,I]}class Dt extends qe{constructor(e){super(),ze(this,e,vt,mt,Be,{})}}export{Dt as component}; diff --git a/gui/next/build/_app/immutable/nodes/14.D7NRbAwv.js b/gui/next/build/_app/immutable/nodes/14.D7NRbAwv.js new file mode 100644 index 0000000..b6a8936 --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/14.D7NRbAwv.js @@ -0,0 +1 @@ +import{s as i,n as o,p as c,d as l,k as p}from"../chunks/Ul9VwQ7n.js";import{S as m,i as d}from"../chunks/Bh3MJlbi.js";import{s as u}from"../chunks/DGc7Lmco.js";function _(n){var s;let e;return document.title=e="Users"+((s=n[0].online)!=null&&s.MPKIT_URL?": "+n[0].online.MPKIT_URL.replace("https://",""):""),{c:o,l(t){c("svelte-mcmxo",document.head).forEach(l)},m:o,p(t,[a]){var r;a&1&&e!==(e="Users"+((r=t[0].online)!=null&&r.MPKIT_URL?": "+t[0].online.MPKIT_URL.replace("https://",""):""))&&(document.title=e)},i:o,o,d:o}}function f(n,e,s){let t;return p(n,u,a=>s(0,t=a)),[t]}class I extends m{constructor(e){super(),d(this,e,f,_,i,{})}}export{I as component}; diff --git a/gui/next/build/_app/immutable/nodes/15.WKQetCTJ.js b/gui/next/build/_app/immutable/nodes/15.WKQetCTJ.js new file mode 100644 index 0000000..f88acca --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/15.WKQetCTJ.js @@ -0,0 +1 @@ +import{s as Be,d as u,i as c,p as We,g as G,j as H,k as Te,a as R,w as z,b,c as h,e as M,f as K,v as J,h as v,t as O,z as A,I as Ge,n as Le}from"../chunks/Ul9VwQ7n.js";import{S as He,i as Qe,d as Ne,t as q,a as N,m as qe,c as Ae,b as Ve,g as le,e as ie}from"../chunks/Bh3MJlbi.js";import{e as we}from"../chunks/BNCRiqmJ.js";import{p as Xe}from"../chunks/C5zjxmar.js";import{u as Ye}from"../chunks/CNoDK8-a.js";import{s as Ze}from"../chunks/DGc7Lmco.js";import{t as ye}from"../chunks/x4PJc0Qf.js";import{A as xe}from"../chunks/DntFPtNo.js";import{J as et}from"../chunks/BVVGnpm8.js";function Ie(o,t,f){const l=o.slice();return l[4]=t[f][0],l[5]=t[f][1],l}function Se(o){var i;let t,f=((i=o[1])==null?void 0:i.id)+"",l;return{c(){t=O("ID: "),l=O(f)},l(s){t=K(s,"ID: "),l=K(s,f)},m(s,a){c(s,t,a),c(s,l,a)},p(s,a){var e;a&2&&f!==(f=((e=s[1])==null?void 0:e.id)+"")&&R(l,f)},d(s){s&&(u(t),u(l))}}}function je(o){var a;let t,f="External ID:",l,i=((a=o[1])==null?void 0:a.external_id)+"",s;return{c(){t=v("dt"),t.textContent=f,l=v("dd"),s=O(i),this.h()},l(e){t=h(e,"DT",{class:!0,"data-svelte-h":!0}),A(t)!=="svelte-1xroeo8"&&(t.textContent=f),l=h(e,"DD",{class:!0});var n=M(l);s=K(n,i),n.forEach(u),this.h()},h(){z(t,"class","svelte-uhfiox"),z(l,"class","svelte-uhfiox")},m(e,n){c(e,t,n),c(e,l,n),b(l,s)},p(e,n){var r;n&2&&i!==(i=((r=e[1])==null?void 0:r.external_id)+"")&&R(s,i)},d(e){e&&(u(t),u(l))}}}function Pe(o){var a;let t,f="JWT:",l,i=((a=o[1])==null?void 0:a.jwt_token)+"",s;return{c(){t=v("dt"),t.textContent=f,l=v("dd"),s=O(i),this.h()},l(e){t=h(e,"DT",{class:!0,"data-svelte-h":!0}),A(t)!=="svelte-l7ssfz"&&(t.textContent=f),l=h(e,"DD",{class:!0});var n=M(l);s=K(n,i),n.forEach(u),this.h()},h(){z(t,"class","svelte-uhfiox"),z(l,"class","svelte-uhfiox")},m(e,n){c(e,t,n),c(e,l,n),b(l,s)},p(e,n){var r;n&2&&i!==(i=((r=e[1])==null?void 0:r.jwt_token)+"")&&R(s,i)},d(e){e&&(u(t),u(l))}}}function Ue(o){var a;let t,f="First name:",l,i=((a=o[1])==null?void 0:a.name)+"",s;return{c(){t=v("dt"),t.textContent=f,l=v("dd"),s=O(i)},l(e){t=h(e,"DT",{"data-svelte-h":!0}),A(t)!=="svelte-8iyt8l"&&(t.textContent=f),l=h(e,"DD",{});var n=M(l);s=K(n,i),n.forEach(u)},m(e,n){c(e,t,n),c(e,l,n),b(l,s)},p(e,n){var r;n&2&&i!==(i=((r=e[1])==null?void 0:r.name)+"")&&R(s,i)},d(e){e&&(u(t),u(l))}}}function Me(o){var a;let t,f="First name:",l,i=((a=o[1])==null?void 0:a.first_name)+"",s;return{c(){t=v("dt"),t.textContent=f,l=v("dd"),s=O(i)},l(e){t=h(e,"DT",{"data-svelte-h":!0}),A(t)!=="svelte-8iyt8l"&&(t.textContent=f),l=h(e,"DD",{});var n=M(l);s=K(n,i),n.forEach(u)},m(e,n){c(e,t,n),c(e,l,n),b(l,s)},p(e,n){var r;n&2&&i!==(i=((r=e[1])==null?void 0:r.first_name)+"")&&R(s,i)},d(e){e&&(u(t),u(l))}}}function Je(o){var a;let t,f="Middle name:",l,i=((a=o[1])==null?void 0:a.middle_name)+"",s;return{c(){t=v("dt"),t.textContent=f,l=v("dd"),s=O(i)},l(e){t=h(e,"DT",{"data-svelte-h":!0}),A(t)!=="svelte-1eitmmc"&&(t.textContent=f),l=h(e,"DD",{});var n=M(l);s=K(n,i),n.forEach(u)},m(e,n){c(e,t,n),c(e,l,n),b(l,s)},p(e,n){var r;n&2&&i!==(i=((r=e[1])==null?void 0:r.middle_name)+"")&&R(s,i)},d(e){e&&(u(t),u(l))}}}function Ke(o){var a;let t,f="Last name:",l,i=((a=o[1])==null?void 0:a.last_name)+"",s;return{c(){t=v("dt"),t.textContent=f,l=v("dd"),s=O(i)},l(e){t=h(e,"DT",{"data-svelte-h":!0}),A(t)!=="svelte-1sn8cp"&&(t.textContent=f),l=h(e,"DD",{});var n=M(l);s=K(n,i),n.forEach(u)},m(e,n){c(e,t,n),c(e,l,n),b(l,s)},p(e,n){var r;n&2&&i!==(i=((r=e[1])==null?void 0:r.last_name)+"")&&R(s,i)},d(e){e&&(u(t),u(l))}}}function Oe(o){var a;let t,f="Slug:",l,i=((a=o[1])==null?void 0:a.slug)+"",s;return{c(){t=v("dt"),t.textContent=f,l=v("dd"),s=O(i)},l(e){t=h(e,"DT",{"data-svelte-h":!0}),A(t)!=="svelte-q9mm1z"&&(t.textContent=f),l=h(e,"DD",{});var n=M(l);s=K(n,i),n.forEach(u)},m(e,n){c(e,t,n),c(e,l,n),b(l,s)},p(e,n){var r;n&2&&i!==(i=((r=e[1])==null?void 0:r.slug)+"")&&R(s,i)},d(e){e&&(u(t),u(l))}}}function Re(o){var a;let t,f="Language:",l,i=((a=o[1])==null?void 0:a.language)+"",s;return{c(){t=v("dt"),t.textContent=f,l=v("dd"),s=O(i)},l(e){t=h(e,"DT",{"data-svelte-h":!0}),A(t)!=="svelte-14i3pp2"&&(t.textContent=f),l=h(e,"DD",{});var n=M(l);s=K(n,i),n.forEach(u)},m(e,n){c(e,t,n),c(e,l,n),b(l,s)},p(e,n){var r;n&2&&i!==(i=((r=e[1])==null?void 0:r.language)+"")&&R(s,i)},d(e){e&&(u(t),u(l))}}}function ze(o){let t,f,l=we(Object.entries(o[1].properties)),i=[];for(let a=0;aq(i[a],1,1,()=>{i[a]=null});return{c(){t=v("dl");for(let a=0;a{g[_]=null}),ie(),e=g[a],e?e.p(p,k):(e=g[a]=C[a](p),e.c()),N(e,1),e.m(i,n))},i(p){r||(N(e),r=!0)},o(p){q(e),r=!1},d(p){p&&(u(t),u(i)),g[a].d()}}}function it(o){var ne,ae,fe,se,oe,re,de,ue,_e,ce,me,pe;let t,f,l,i,s=new Date((ne=o[1])==null?void 0:ne.created_at).toLocaleDateString(void 0,{})+"",a,e,n=new Date((ae=o[1])==null?void 0:ae.created_at).toLocaleTimeString(void 0,{})+"",r,C,g,$,p,k,_,Y,Z,y,x,ee,te,Q,V,E=((fe=o[1])==null?void 0:fe.id)&&Se(o),T=((se=o[1])==null?void 0:se.external_id)&&je(o),L=((oe=o[1])==null?void 0:oe.jwt_token)&&Pe(o),w=((re=o[1])==null?void 0:re.name)&&Ue(o),I=((de=o[1])==null?void 0:de.first_name)&&Me(o),S=((ue=o[1])==null?void 0:ue.middle_name)&&Je(o),j=((_e=o[1])==null?void 0:_e.last_name)&&Ke(o),P=((ce=o[1])==null?void 0:ce.slug)&&Oe(o),U=((me=o[1])==null?void 0:me.language)&&Re(o),D=((pe=o[1])==null?void 0:pe.properties)&&ze(o);return{c(){t=v("div"),f=v("div"),E&&E.c(),l=H(),i=v("time"),a=O(s),e=H(),r=O(n),g=H(),$=v("dl"),T&&T.c(),p=J(),L&&L.c(),k=H(),_=v("dl"),w&&w.c(),Y=J(),I&&I.c(),Z=J(),S&&S.c(),y=J(),j&&j.c(),x=J(),P&&P.c(),ee=J(),U&&U.c(),te=H(),D&&D.c(),Q=J(),this.h()},l(d){t=h(d,"DIV",{});var m=M(t);f=h(m,"DIV",{class:!0});var B=M(f);E&&E.l(B),l=G(B),i=h(B,"TIME",{datetime:!0,class:!0});var W=M(i);a=K(W,s),e=G(W),r=K(W,n),W.forEach(u),B.forEach(u),m.forEach(u),g=G(d),$=h(d,"DL",{class:!0});var X=M($);T&&T.l(X),p=J(),L&&L.l(X),X.forEach(u),k=G(d),_=h(d,"DL",{class:!0});var F=M(_);w&&w.l(F),Y=J(),I&&I.l(F),Z=J(),S&&S.l(F),y=J(),j&&j.l(F),x=J(),P&&P.l(F),ee=J(),U&&U.l(F),F.forEach(u),te=G(d),D&&D.l(d),Q=J(),this.h()},h(){var d;z(i,"datetime",C=(d=o[1])==null?void 0:d.created_at),z(i,"class","svelte-uhfiox"),z(f,"class","info svelte-uhfiox"),z($,"class","tech svelte-uhfiox"),z(_,"class","personal definitions svelte-uhfiox")},m(d,m){c(d,t,m),b(t,f),E&&E.m(f,null),b(f,l),b(f,i),b(i,a),b(i,e),b(i,r),c(d,g,m),c(d,$,m),T&&T.m($,null),b($,p),L&&L.m($,null),c(d,k,m),c(d,_,m),w&&w.m(_,null),b(_,Y),I&&I.m(_,null),b(_,Z),S&&S.m(_,null),b(_,y),j&&j.m(_,null),b(_,x),P&&P.m(_,null),b(_,ee),U&&U.m(_,null),c(d,te,m),D&&D.m(d,m),c(d,Q,m),V=!0},p(d,m){var B,W,X,F,he,ve,be,ke,De,ge,Ce,$e,Ee;(B=d[1])!=null&&B.id?E?E.p(d,m):(E=Se(d),E.c(),E.m(f,l)):E&&(E.d(1),E=null),(!V||m&2)&&s!==(s=new Date((W=d[1])==null?void 0:W.created_at).toLocaleDateString(void 0,{})+"")&&R(a,s),(!V||m&2)&&n!==(n=new Date((X=d[1])==null?void 0:X.created_at).toLocaleTimeString(void 0,{})+"")&&R(r,n),(!V||m&2&&C!==(C=(F=d[1])==null?void 0:F.created_at))&&z(i,"datetime",C),(he=d[1])!=null&&he.external_id?T?T.p(d,m):(T=je(d),T.c(),T.m($,p)):T&&(T.d(1),T=null),(ve=d[1])!=null&&ve.jwt_token?L?L.p(d,m):(L=Pe(d),L.c(),L.m($,null)):L&&(L.d(1),L=null),(be=d[1])!=null&&be.name?w?w.p(d,m):(w=Ue(d),w.c(),w.m(_,Y)):w&&(w.d(1),w=null),(ke=d[1])!=null&&ke.first_name?I?I.p(d,m):(I=Me(d),I.c(),I.m(_,Z)):I&&(I.d(1),I=null),(De=d[1])!=null&&De.middle_name?S?S.p(d,m):(S=Je(d),S.c(),S.m(_,y)):S&&(S.d(1),S=null),(ge=d[1])!=null&&ge.last_name?j?j.p(d,m):(j=Ke(d),j.c(),j.m(_,x)):j&&(j.d(1),j=null),(Ce=d[1])!=null&&Ce.slug?P?P.p(d,m):(P=Oe(d),P.c(),P.m(_,ee)):P&&(P.d(1),P=null),($e=d[1])!=null&&$e.language?U?U.p(d,m):(U=Re(d),U.c(),U.m(_,null)):U&&(U.d(1),U=null),(Ee=d[1])!=null&&Ee.properties?D?(D.p(d,m),m&2&&N(D,1)):(D=ze(d),D.c(),N(D,1),D.m(Q.parentNode,Q)):D&&(le(),q(D,1,1,()=>{D=null}),ie())},i(d){V||(N(D),V=!0)},o(d){q(D),V=!1},d(d){d&&(u(t),u(g),u($),u(k),u(_),u(te),u(Q)),E&&E.d(),T&&T.d(),L&&L.d(),w&&w.d(),I&&I.d(),S&&S.d(),j&&j.d(),P&&P.d(),U&&U.d(),D&&D.d(d)}}}function nt(o){var s,a,e,n;let t,f,l,i;return document.title=t=(((s=o[1])==null?void 0:s.email)??"Users")+((a=o[2].online)!=null&&a.MPKIT_URL?": "+o[2].online.MPKIT_URL.replace("https://",""):""),l=new xe({props:{title:((e=o[1])==null?void 0:e.email)??((n=o[1])==null?void 0:n.id)??"Loading…",closeUrl:"/users?"+o[0].url.searchParams.toString(),$$slots:{default:[it]},$$scope:{ctx:o}}}),{c(){f=H(),Ve(l.$$.fragment)},l(r){We("svelte-n9gl86",document.head).forEach(u),f=G(r),Ae(l.$$.fragment,r)},m(r,C){c(r,f,C),qe(l,r,C),i=!0},p(r,[C]){var $,p,k,_;(!i||C&6)&&t!==(t=((($=r[1])==null?void 0:$.email)??"Users")+((p=r[2].online)!=null&&p.MPKIT_URL?": "+r[2].online.MPKIT_URL.replace("https://",""):""))&&(document.title=t);const g={};C&2&&(g.title=((k=r[1])==null?void 0:k.email)??((_=r[1])==null?void 0:_.id)??"Loading…"),C&1&&(g.closeUrl="/users?"+r[0].url.searchParams.toString()),C&258&&(g.$$scope={dirty:C,ctx:r}),l.$set(g)},i(r){i||(N(l.$$.fragment,r),i=!0)},o(r){q(l.$$.fragment,r),i=!1},d(r){r&&u(f),Ne(l,r)}}}function at(o,t,f){let l,i;Te(o,Xe,e=>f(0,l=e)),Te(o,Ze,e=>f(2,i=e));let s;const a=async()=>{const e={attribute:"id",value:l.params.id};await Ye.get(e).then(n=>{f(1,s=n.results[0])})};return o.$$.update=()=>{o.$$.dirty&1&&l.params.id&&a()},[l,s,i]}class pt extends He{constructor(t){super(),Qe(this,t,at,nt,Be,{})}}export{pt as component}; diff --git a/gui/next/build/_app/immutable/nodes/2.C3vbTXim.js b/gui/next/build/_app/immutable/nodes/2.C3vbTXim.js new file mode 100644 index 0000000..3d3bb08 --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/2.C3vbTXim.js @@ -0,0 +1,7 @@ +import{s as je,d as u,i as X,b as l,D as me,w as c,c as d,e as y,g as L,f as Y,h as f,j as N,t as Z,F as Ze,H as Le,X as He,l as nt,I as at,r as Qe,Y as Je,Z as st,a as De,u as lt,m as rt,o as ot,C as Pe,J as it,p as ut,z as ne,k as Ve,_ as dt,K as ze,$ as ft}from"../chunks/Ul9VwQ7n.js";import{S as Ue,i as Ae,d as pe,t as V,a as F,m as he,c as ge,b as ve,j as ct,e as We,g as xe}from"../chunks/Bh3MJlbi.js";import{e as Ke}from"../chunks/BNCRiqmJ.js";import"../chunks/bH_aOImW.js";import{p as _t}from"../chunks/C5zjxmar.js";import{b as Se}from"../chunks/CIy9Z9Qf.js";import{s as Ce}from"../chunks/DGc7Lmco.js";import{I as Me}from"../chunks/D-yR0E5w.js";import{N as mt}from"../chunks/Bg88RIi0.js";const be=e=>{const t=e instanceof Date?e:new Date(e),n=new Intl.RelativeTimeFormat("en"),a={years:3600*24*365,months:3600*24*30,weeks:3600*24*7,days:3600*24,hours:3600,minutes:60,seconds:1},s=(t.getTime()-Date.now())/1e3;for(let i in a)if(a[i]{o.preventDefault();const p=await Se.retry({properties:new FormData(s)});p.errors?Ce.notification.create("error",`Background job ${p.admin_background_job_retry.id} could not be run again`):(i("itemsChanged"),Ce.notification.create("success",`Background job ${p.admin_background_job_retry.id} planned to run again`))};function v(o){Le[o?"unshift":"push"](()=>{s=o,n(1,s)})}return e.$$set=o=>{"id"in o&&n(0,a=o.id)},[a,s,_,v]}class gt extends Ue{constructor(t){super(),Ae(this,t,ht,pt,je,{id:0})}}function vt(e){let t,n,a,s,i,_,v,o,p,h;return _=new Me({props:{icon:"x",size:"22"}}),{c(){t=f("form"),n=f("input"),a=N(),s=f("button"),i=f("i"),ve(_.$$.fragment),v=Z(`\r + Delete background job`),this.h()},l(r){t=d(r,"FORM",{});var b=y(t);n=d(b,"INPUT",{type:!0,name:!0}),a=L(b),s=d(b,"BUTTON",{class:!0});var P=y(s);i=d(P,"I",{class:!0});var k=y(i);ge(_.$$.fragment,k),k.forEach(u),v=Y(P,`\r + Delete background job`),P.forEach(u),b.forEach(u),this.h()},h(){c(n,"type","hidden"),c(n,"name","id"),n.value=e[0],c(i,"class","svelte-ooaugn"),c(s,"class","danger")},m(r,b){X(r,t,b),l(t,n),l(t,a),l(t,s),l(s,i),he(_,i,null),l(s,v),e[3](t),o=!0,p||(h=me(t,"submit",e[2]),p=!0)},p(r,[b]){(!o||b&1)&&(n.value=r[0])},i(r){o||(F(_.$$.fragment,r),o=!0)},o(r){V(_.$$.fragment,r),o=!1},d(r){r&&u(t),pe(_),e[3](null),p=!1,h()}}}function bt(e,t,n){let{id:a}=t,s;const i=Ze(),_=async o=>{if(o.preventDefault(),confirm("Are you sure you want to delete this background job?")){const p=await Se.delete({properties:new FormData(s)});p.errors?Ce.notification.create("error",`Background job ${p.admin_background_job_delete.id} could not be deleted`):(i("itemsChanged"),Ce.notification.create("success",`Background job ${p.admin_background_job_delete.id} deleted`))}};function v(o){Le[o?"unshift":"push"](()=>{s=o,n(1,s)})}return e.$$set=o=>{"id"in o&&n(0,a=o.id)},[a,s,_,v]}class Et extends Ue{constructor(t){super(),Ae(this,t,bt,vt,je,{id:0})}}function Ge(e,t,n){const a=e.slice();return a[16]=t[n],a}function yt(e){let t;return{c(){t=Z("Runs")},l(n){t=Y(n,"Runs")},m(n,a){X(n,t,a)},d(n){n&&u(t)}}}function $t(e){let t;return{c(){t=Z("Failed")},l(n){t=Y(n,"Failed")},m(n,a){X(n,t,a)},d(n){n&&u(t)}}}function Xe(e){let t,n,a;return n=new gt({props:{id:e[16].id}}),n.$on("itemsChanged",e[6]),{c(){t=f("li"),ve(n.$$.fragment),this.h()},l(s){t=d(s,"LI",{class:!0});var i=y(t);ge(n.$$.fragment,i),i.forEach(u),this.h()},h(){c(t,"class","svelte-1m1ug4d")},m(s,i){X(s,t,i),he(n,t,null),a=!0},p(s,i){const _={};i&2&&(_.id=s[16].id),n.$set(_)},i(s){a||(F(n.$$.fragment,s),a=!0)},o(s){V(n.$$.fragment,s),a=!1},d(s){s&&u(t),pe(n)}}}function kt(e){let t=(e[16].run_at_parsed||be(new Date(e[16].run_at)))+"",n;return{c(){n=Z(t)},l(a){n=Y(a,t)},m(a,s){X(a,n,s)},p(a,s){s&2&&t!==(t=(a[16].run_at_parsed||be(new Date(a[16].run_at)))+"")&&De(n,t)},d(a){a&&u(n)}}}function Dt(e){let t=(e[16].dead_at_parsed||be(new Date(e[16].dead_at))||"")+"",n;return{c(){n=Z(t)},l(a){n=Y(a,t)},m(a,s){X(a,n,s)},p(a,s){s&2&&t!==(t=(a[16].dead_at_parsed||be(new Date(a[16].dead_at))||"")+"")&&De(n,t)},d(a){a&&u(n)}}}function Ye(e){let t,n,a,s,i,_="More options",v,o,p,h,r,b,P,k,te,w,z=(e[16].source_name||e[16].id)+"",E,A,K,R,S=e[16].queue+"",ae,se,j,ie,q,J,ue;o=new Me({props:{icon:"navigationMenuVertical",size:"16"}});function Ee(){return e[11](e[16])}let g=e[16].dead_at&&Xe(e);k=new Et({props:{id:e[16].id}}),k.$on("itemsChanged",e[6]);function G($,C){return $[0].type==="DEAD"?Dt:kt}let le=G(e),U=le(e);return{c(){t=f("tr"),n=f("td"),a=f("div"),s=f("button"),i=f("span"),i.textContent=_,v=N(),ve(o.$$.fragment),p=N(),h=f("menu"),r=f("ul"),g&&g.c(),b=N(),P=f("li"),ve(k.$$.fragment),te=N(),w=f("a"),E=Z(z),K=N(),R=f("td"),ae=Z(S),se=N(),j=f("td"),U.c(),ie=N(),this.h()},l($){t=d($,"TR",{class:!0});var C=y(t);n=d(C,"TD",{class:!0});var Q=y(n);a=d(Q,"DIV",{class:!0});var H=y(a);s=d(H,"BUTTON",{class:!0});var W=y(s);i=d(W,"SPAN",{class:!0,"data-svelte-h":!0}),ne(i)!=="svelte-1agpmtc"&&(i.textContent=_),v=L(W),ge(o.$$.fragment,W),W.forEach(u),p=L(H),h=d(H,"MENU",{class:!0});var de=y(h);r=d(de,"UL",{});var M=y(r);g&&g.l(M),b=L(M),P=d(M,"LI",{class:!0});var fe=y(P);ge(k.$$.fragment,fe),fe.forEach(u),M.forEach(u),de.forEach(u),te=L(H),w=d(H,"A",{href:!0,class:!0});var ye=y(w);E=Y(ye,z),ye.forEach(u),H.forEach(u),Q.forEach(u),K=L(C),R=d(C,"TD",{class:!0});var $e=y(R);ae=Y($e,S),$e.forEach(u),se=L(C),j=d(C,"TD",{class:!0});var re=y(j);U.l(re),re.forEach(u),ie=L(C),C.forEach(u),this.h()},h(){c(i,"class","label"),c(s,"class","button compact more svelte-1m1ug4d"),c(P,"class","svelte-1m1ug4d"),c(h,"class","content-context svelte-1m1ug4d"),ze(h,"active",e[2].id===e[16].id),c(w,"href",A="/backgroundJobs/"+e[0].type.toLowerCase()+"/"+e[16].id+"?"+e[4].url.searchParams.toString()),c(w,"class","svelte-1m1ug4d"),c(a,"class","svelte-1m1ug4d"),c(n,"class","id svelte-1m1ug4d"),c(R,"class","svelte-1m1ug4d"),c(j,"class","svelte-1m1ug4d"),c(t,"class","svelte-1m1ug4d")},m($,C){X($,t,C),l(t,n),l(n,a),l(a,s),l(s,i),l(s,v),he(o,s,null),l(a,p),l(a,h),l(h,r),g&&g.m(r,null),l(r,b),l(r,P),he(k,P,null),l(a,te),l(a,w),l(w,E),l(t,K),l(t,R),l(R,ae),l(t,se),l(t,j),U.m(j,null),l(t,ie),q=!0,J||(ue=[me(s,"click",Ee),me(n,"mouseleave",e[12])],J=!0)},p($,C){e=$,e[16].dead_at?g?(g.p(e,C),C&2&&F(g,1)):(g=Xe(e),g.c(),F(g,1),g.m(r,b)):g&&(xe(),V(g,1,1,()=>{g=null}),We());const Q={};C&2&&(Q.id=e[16].id),k.$set(Q),(!q||C&6)&&ze(h,"active",e[2].id===e[16].id),(!q||C&2)&&z!==(z=(e[16].source_name||e[16].id)+"")&&De(E,z),(!q||C&19&&A!==(A="/backgroundJobs/"+e[0].type.toLowerCase()+"/"+e[16].id+"?"+e[4].url.searchParams.toString()))&&c(w,"href",A),(!q||C&2)&&S!==(S=e[16].queue+"")&&De(ae,S),le===(le=G(e))&&U?U.p(e,C):(U.d(1),U=le(e),U&&(U.c(),U.m(j,null)))},i($){q||(F(o.$$.fragment,$),F(g),F(k.$$.fragment,$),q=!0)},o($){V(o.$$.fragment,$),V(g),V(k.$$.fragment,$),q=!1},d($){$&&u(t),pe(o),g&&g.d(),pe(k),U.d(),J=!1,Qe(ue)}}}function Ct(e){var Be;let t,n,a,s,i,_,v,o,p="Type:",h,r,b,P="Scheduled",k,te="Failed",w,z="Running",E,A,K,R,S,ae="Name / id",se,j,ie="Priority",q,J,ue,Ee,g,G,le="Page:",U,$,C,Q,H=(e[1].total_pages||1)+"",W,de,M,fe,ye;document.title=t="Jobs"+((Be=e[5].online)!=null&&Be.MPKIT_URL?": "+e[5].online.MPKIT_URL.replace("https://",""):"");function $e(m,T){return m[0].type==="DEAD"?$t:yt}let re=$e(e),x=re(e),oe=Ke(e[1].results),D=[];for(let m=0;mV(D[m],1,1,()=>{D[m]=null});function tt(m){e[13](m)}let Oe={form:"filters",name:"page",min:1,max:e[1].total_pages,step:1,decreaseLabel:"Previous page",increaseLabel:"Next page",style:"navigation"};e[0].page!==void 0&&(Oe.value=e[0].page),$=new mt({props:Oe}),Le.push(()=>ct($,"value",tt)),$.$on("input",function(){He(e[3].requestSubmit())&&e[3].requestSubmit().apply(this,arguments)});const Ne=e[8].default,O=nt(Ne,e,e[7],null);return{c(){n=N(),a=f("div"),s=f("div"),i=f("nav"),_=f("form"),v=f("fieldset"),o=f("label"),o.textContent=p,h=N(),r=f("select"),b=f("option"),b.textContent=P,k=f("option"),k.textContent=te,w=f("option"),w.textContent=z,E=N(),A=f("table"),K=f("thead"),R=f("tr"),S=f("th"),S.textContent=ae,se=N(),j=f("th"),j.textContent=ie,q=N(),J=f("th"),x.c(),ue=N();for(let m=0;me[9].call(r)),c(v,"class","svelte-1m1ug4d"),c(_,"id","filters"),c(_,"class","svelte-1m1ug4d"),c(i,"class","filters svelte-1m1ug4d"),c(S,"class","id svelte-1m1ug4d"),c(j,"class","svelte-1m1ug4d"),c(J,"class","svelte-1m1ug4d"),c(K,"class","svelte-1m1ug4d"),c(A,"class","svelte-1m1ug4d"),c(G,"for","page"),c(g,"class","pagination svelte-1m1ug4d"),c(s,"class","svelte-1m1ug4d"),c(a,"class","container svelte-1m1ug4d")},m(m,T){X(m,n,T),X(m,a,T),l(a,s),l(s,i),l(i,_),l(_,v),l(v,o),l(v,h),l(v,r),l(r,b),l(r,k),l(r,w),Je(r,e[0].type,!0),e[10](_),l(s,E),l(s,A),l(A,K),l(K,R),l(R,S),l(R,se),l(R,j),l(R,q),l(R,J),x.m(J,null),l(A,ue);for(let B=0;BC=!1)),$.$set(B),(!M||T&2)&&H!==(H=(e[1].total_pages||1)+"")&&De(W,H),O&&O.p&&(!M||T&128)&<(O,Ne,e,e[7],M?ot(Ne,e[7],T,null):rt(e[7]),null)},i(m){if(!M){for(let T=0;Tn(4,a=E)),Ve(e,Ce,E=>n(5,s=E));let{$$slots:i={},$$scope:_}=t,v={results:[]},o={id:null},p={page:1,type:"SCHEDULED",...Object.fromEntries(a.url.searchParams)},h,r;const b=async()=>{clearInterval(r),n(1,v=await Se.get(p)),r=setInterval(()=>{v.results.forEach(E=>{p.type==="DEAD"?E.dead_at_parsed=be(new Date(E.dead_at)):E.run_at_parsed=be(new Date(E.run_at))})},1e3)};dt(()=>{clearInterval(r)});function P(){p.type=ft(this),n(0,p)}function k(E){Le[E?"unshift":"push"](()=>{h=E,n(3,h)})}const te=E=>n(2,o.id=E.id,o),w=()=>n(2,o.id=null,o);function z(E){e.$$.not_equal(p.page,E)&&(p.page=E,n(0,p))}return e.$$set=E=>{"$$scope"in E&&n(7,_=E.$$scope)},e.$$.update=()=>{e.$$.dirty&1&&p&&b()},[p,v,o,h,a,s,b,_,i,P,k,te,w,z]}class St extends Ue{constructor(t){super(),Ae(this,t,Tt,Ct,je,{})}}export{St as component}; diff --git a/gui/next/build/_app/immutable/nodes/3.Bz4QTVmH.js b/gui/next/build/_app/immutable/nodes/3.Bz4QTVmH.js new file mode 100644 index 0000000..000b0ac --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/3.Bz4QTVmH.js @@ -0,0 +1 @@ +import{s as l,l as i,u as r,m as u,o as f}from"../chunks/Ul9VwQ7n.js";import{S as _,i as c,t as m,a as p}from"../chunks/Bh3MJlbi.js";function $(n){let s;const a=n[1].default,e=i(a,n,n[0],null);return{c(){e&&e.c()},l(t){e&&e.l(t)},m(t,o){e&&e.m(t,o),s=!0},p(t,[o]){e&&e.p&&(!s||o&1)&&r(e,a,t,t[0],s?f(a,t[0],o,null):u(t[0]),null)},i(t){s||(p(e,t),s=!0)},o(t){m(e,t),s=!1},d(t){e&&e.d(t)}}}function d(n,s,a){let{$$slots:e={},$$scope:t}=s;return n.$$set=o=>{"$$scope"in o&&a(0,t=o.$$scope)},[t,e]}class S extends _{constructor(s){super(),c(this,s,d,$,l,{})}}export{S as component}; diff --git a/gui/next/build/_app/immutable/nodes/4.Cy2tpkZR.js b/gui/next/build/_app/immutable/nodes/4.Cy2tpkZR.js new file mode 100644 index 0000000..462cff4 --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/4.Cy2tpkZR.js @@ -0,0 +1 @@ +import{s as le,d as v,I as ie,r as ce,C as X,i as V,b,D as j,w as g,c as k,e as w,g as N,z as G,h as E,j as A,k as Y,L as fe,F as ue,T as ae,n as Q,J as de,a as me,K as P,f as _e,t as he,H as Z,l as pe,u as be,m as ge,o as ve}from"../chunks/Ul9VwQ7n.js";import{S as ne,i as re,t as L,a as C,g as ke,e as Ee,d as F,m as J,c as M,b as O,h as ye}from"../chunks/Bh3MJlbi.js";import{e as x}from"../chunks/BNCRiqmJ.js";import{f as $e}from"../chunks/odGh2V91.js";import{p as we}from"../chunks/C5zjxmar.js";import{s as ee}from"../chunks/DGc7Lmco.js";import{t as Se}from"../chunks/t7b_BBSP.js";import{I as oe}from"../chunks/D-yR0E5w.js";import{C as Ce}from"../chunks/BVq9mvWR.js";function te(i,t,e){const a=i.slice();return a[15]=t[e],a[17]=e,a}function Ie(i){let t,e,a;return e=new oe({props:{icon:"search",size:"18"}}),{c(){t=E("i"),O(e.$$.fragment),this.h()},l(n){t=k(n,"I",{class:!0});var s=w(t);M(e.$$.fragment,s),s.forEach(v),this.h()},h(){g(t,"class","svelte-117f3bg")},m(n,s){V(n,t,s),J(e,t,null),a=!0},p:Q,i(n){a||(C(e.$$.fragment,n),a=!0)},o(n){L(e.$$.fragment,n),a=!1},d(n){n&&v(t),F(e)}}}function De(i){let t,e,a="Reset filter",n,s,_,r,c;return s=new oe({props:{icon:"x",size:"18"}}),{c(){t=E("button"),e=E("span"),e.textContent=a,n=A(),O(s.$$.fragment),this.h()},l(l){t=k(l,"BUTTON",{class:!0});var o=w(t);e=k(o,"SPAN",{class:!0,"data-svelte-h":!0}),G(e)!=="svelte-8g7ehw"&&(e.textContent=a),n=N(o),M(s.$$.fragment,o),o.forEach(v),this.h()},h(){g(e,"class","label"),g(t,"class","svelte-117f3bg")},m(l,o){V(l,t,o),b(t,e),b(t,n),J(s,t,null),_=!0,r||(c=j(t,"click",i[8]),r=!0)},p:Q,i(l){_||(C(s.$$.fragment,l),_=!0)},o(l){L(s.$$.fragment,l),_=!1},d(l){l&&v(t),F(s),r=!1,c()}}}function se(i){let t,e,a=i[15].name+"",n,s,_,r;return{c(){t=E("li"),e=E("a"),n=he(a),_=A(),this.h()},l(c){t=k(c,"LI",{});var l=w(t);e=k(l,"A",{href:!0,class:!0});var o=w(e);n=_e(o,a),o.forEach(v),_=N(l),l.forEach(v),this.h()},h(){g(e,"href",s="/database/table/"+i[15].id),g(e,"class","svelte-117f3bg"),P(e,"active",i[15].id===i[4].params.id)},m(c,l){V(c,t,l),b(t,e),b(e,n),b(t,_)},p(c,l){l&1&&a!==(a=c[15].name+"")&&me(n,a),l&1&&s!==(s="/database/table/"+c[15].id)&&g(e,"href",s),l&17&&P(e,"active",c[15].id===c[4].params.id)},i(c){c&&(r||de(()=>{r=ye(t,$e,{duration:100,delay:7*i[17]}),r.start()}))},o:Q,d(c){c&&v(t)}}}function qe(i){let t,e,a,n,s,_,r,c,l,o="Ctrl",d,K="K",H,I,D,T,B,f;const U=[De,Ie],$=[];function z(u,p){return u[3]?0:1}n=z(i),s=$[n]=U[n](i);let S=x(i[0]),h=[];for(let u=0;u{$[y]=null}),Ee(),s=$[n],s?s.p(u,p):(s=$[n]=U[n](u),s.c()),C(s,1),s.m(a,_)),p&8&&r.value!==u[3]&&X(r,u[3]),p&17){S=x(u[0]);let m;for(m=0;me(4,a=f)),Y(i,ee,f=>e(13,n=f));let s=n.tables,_=s,r,c,l;(async()=>await Se.get())().then(f=>{s=f,e(0,_=f),fe(ee,n.tables=f,n)});const o=ue();ae(async()=>{c.focus(),document.addEventListener("keydown",f=>{f.ctrlKey&&f.key==="k"&&(f.preventDefault(),o("sidebarNeeded"),c.focus(),c.select())}),a.data.table&&r.querySelector(`[href$="${a.data.table.id}"]`).scrollIntoView({behavior:"smooth",block:"center"})});const d=()=>{l?e(0,_=s.filter(f=>f.name.includes(l))):e(0,_=s)},K=f=>{f.key==="Escape"&&(e(3,l=""),d()),f.key==="Enter"&&r.querySelector("li:first-child a").click()},H=f=>{var U,$,z,S,h,u,p,y,m,q;f.key==="ArrowDown"&&r.contains(document.activeElement)&&(f.preventDefault(),document.activeElement.matches("input")?(U=r.querySelector("a"))==null||U.focus():(h=(S=(z=($=document.activeElement)==null?void 0:$.parentElement)==null?void 0:z.nextElementSibling)==null?void 0:S.querySelector("a"))==null||h.focus()),f.key==="ArrowUp"&&r.contains(document.activeElement)&&(f.preventDefault(),(u=document.activeElement)!=null&&u.matches("li:first-child a")?c.focus():(q=(m=(y=(p=document.activeElement)==null?void 0:p.parentElement)==null?void 0:y.previousElementSibling)==null?void 0:m.querySelector("a"))==null||q.focus()),f.key==="Escape"&&r.contains(document.activeElement)&&(c.focus(),e(3,l=""),d())},I=()=>{e(3,l=null),d()};function D(f){Z[f?"unshift":"push"](()=>{c=f,e(2,c)})}function T(){l=this.value,e(3,l)}function B(f){Z[f?"unshift":"push"](()=>{r=f,e(1,r)})}return[_,r,c,l,a,d,K,H,I,D,T,B]}class Ne extends ne{constructor(t){super(),re(this,t,Ke,qe,le,{})}}function Ae(i){let t,e,a,n,s,_,r;t=new Ce({}),s=new Ne({}),s.$on("sidebarNeeded",i[3]);const c=i[2].default,l=pe(c,i,i[1],null);return{c(){O(t.$$.fragment),e=A(),a=E("div"),n=E("div"),O(s.$$.fragment),_=A(),l&&l.c(),this.h()},l(o){M(t.$$.fragment,o),e=N(o),a=k(o,"DIV",{class:!0});var d=w(a);n=k(d,"DIV",{class:!0});var K=w(n);M(s.$$.fragment,K),K.forEach(v),_=N(d),l&&l.l(d),d.forEach(v),this.h()},h(){g(n,"class","tables-container svelte-s8xmdg"),g(a,"class","container svelte-s8xmdg"),P(a,"tablesHidden",i[0])},m(o,d){J(t,o,d),V(o,e,d),V(o,a,d),b(a,n),J(s,n,null),b(a,_),l&&l.m(a,null),r=!0},p(o,[d]){l&&l.p&&(!r||d&2)&&be(l,c,o,o[1],r?ve(c,o[1],d,null):ge(o[1]),null),(!r||d&1)&&P(a,"tablesHidden",o[0])},i(o){r||(C(t.$$.fragment,o),C(s.$$.fragment,o),C(l,o),r=!0)},o(o){L(t.$$.fragment,o),L(s.$$.fragment,o),L(l,o),r=!1},d(o){o&&(v(e),v(a)),F(t,o),F(s),l&&l.d(o)}}}function Le(i,t,e){let{$$slots:a={},$$scope:n}=t,s=!1;ae(()=>{document.addEventListener("keydown",r=>{!r.target.matches("input, textarea")&&r.key==="b"&&(e(0,s=!s),localStorage.tablesHidden=s)})});const _=()=>e(0,s=!1);return i.$$set=r=>{"$$scope"in r&&e(1,n=r.$$scope)},[s,n,a,_]}class Je extends ne{constructor(t){super(),re(this,t,Le,Ae,le,{})}}export{Je as component}; diff --git a/gui/next/build/_app/immutable/nodes/5.Bz4QTVmH.js b/gui/next/build/_app/immutable/nodes/5.Bz4QTVmH.js new file mode 100644 index 0000000..000b0ac --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/5.Bz4QTVmH.js @@ -0,0 +1 @@ +import{s as l,l as i,u as r,m as u,o as f}from"../chunks/Ul9VwQ7n.js";import{S as _,i as c,t as m,a as p}from"../chunks/Bh3MJlbi.js";function $(n){let s;const a=n[1].default,e=i(a,n,n[0],null);return{c(){e&&e.c()},l(t){e&&e.l(t)},m(t,o){e&&e.m(t,o),s=!0},p(t,[o]){e&&e.p&&(!s||o&1)&&r(e,a,t,t[0],s?f(a,t[0],o,null):u(t[0]),null)},i(t){s||(p(e,t),s=!0)},o(t){m(e,t),s=!1},d(t){e&&e.d(t)}}}function d(n,s,a){let{$$slots:e={},$$scope:t}=s;return n.$$set=o=>{"$$scope"in o&&a(0,t=o.$$scope)},[t,e]}class S extends _{constructor(s){super(),c(this,s,d,$,l,{})}}export{S as component}; diff --git a/gui/next/build/_app/immutable/nodes/6.BTcDvYil.js b/gui/next/build/_app/immutable/nodes/6.BTcDvYil.js new file mode 100644 index 0000000..1bec116 --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/6.BTcDvYil.js @@ -0,0 +1,7 @@ +import{s as Je,d as c,i as te,b as o,D as he,w as u,c as p,e as $,g as O,f as me,h,j as S,t as ve,F as tt,H as Ae,r as Ke,ad as wt,I as Qe,J as lt,E as Tt,z as ue,k as xe,T as Pt,L as we,a as Ie,n as et,C as Pe,Y as ot,Z as It,p as Dt,l as jt,u as Nt,m as Lt,o as Ot,G as ut,$ as St,K as Oe}from"../chunks/Ul9VwQ7n.js";import{S as Ge,i as Ye,d as fe,t as q,a as L,m as ce,c as de,b as _e,f as ze,g as Ce,e as ye,j as Ut}from"../chunks/Bh3MJlbi.js";import{q as Ct,g as At}from"../chunks/CS29TWE_.js";import{e as Se}from"../chunks/BNCRiqmJ.js";import{g as Mt}from"../chunks/bH_aOImW.js";import{s as oe}from"../chunks/DGc7Lmco.js";import{p as Rt}from"../chunks/C5zjxmar.js";import{u as Me}from"../chunks/CNoDK8-a.js";import{c as Bt,p as Vt,T as Ft}from"../chunks/Cpu2L2kn.js";import{I as De}from"../chunks/D-yR0E5w.js";import{t as qt}from"../chunks/x4PJc0Qf.js";import{N as Ht}from"../chunks/Bg88RIi0.js";import{C as zt}from"../chunks/BVq9mvWR.js";function Jt(l){let e,n,t,s,i,a,f,r,m,g;return a=new De({props:{icon:"x",size:"22"}}),{c(){e=h("form"),n=h("input"),t=S(),s=h("button"),i=h("i"),_e(a.$$.fragment),f=ve(`\r + Delete user`),this.h()},l(d){e=p(d,"FORM",{});var b=$(e);n=p(b,"INPUT",{type:!0,name:!0}),t=O(b),s=p(b,"BUTTON",{class:!0});var E=$(s);i=p(E,"I",{class:!0});var y=$(i);de(a.$$.fragment,y),y.forEach(c),f=me(E,`\r + Delete user`),E.forEach(c),b.forEach(c),this.h()},h(){u(n,"type","hidden"),u(n,"name","id"),n.value=l[0],u(i,"class","svelte-ooaugn"),u(s,"class","danger")},m(d,b){te(d,e,b),o(e,n),o(e,t),o(e,s),o(s,i),ce(a,i,null),o(s,f),l[3](e),r=!0,m||(g=he(e,"submit",l[2]),m=!0)},p(d,[b]){(!r||b&1)&&(n.value=d[0])},i(d){r||(L(a.$$.fragment,d),r=!0)},o(d){q(a.$$.fragment,d),r=!1},d(d){d&&c(e),fe(a),l[3](null),m=!1,g()}}}function Kt(l,e,n){let{id:t}=e,s,i=tt();const a=async r=>{if(r.preventDefault(),confirm("Are you sure you want to delete this user?")){i("close");const g=new FormData(s).get("id");(await Me.delete(g)).errors?oe.notification.create("error",`Record ${g} could not be deleted`):(oe.notification.create("success",`Record ${g} deleted`),i("success"))}};function f(r){Ae[r?"unshift":"push"](()=>{s=r,n(1,s)})}return l.$$set=r=>{"id"in r&&n(0,t=r.id)},[t,s,a,f]}class Gt extends Ge{constructor(e){super(),Ye(this,e,Kt,Jt,Je,{id:0})}}function Yt(l){let e,n,t,s,i,a,f;return s=new Gt({props:{id:l[0].id}}),s.$on("success",l[3]),s.$on("close",l[4]),{c(){e=h("menu"),n=h("ul"),t=h("li"),_e(s.$$.fragment),this.h()},l(r){e=p(r,"MENU",{class:!0});var m=$(e);n=p(m,"UL",{});var g=$(n);t=p(g,"LI",{class:!0});var d=$(t);de(s.$$.fragment,d),d.forEach(c),g.forEach(c),m.forEach(c),this.h()},h(){u(t,"class","svelte-8i1sxu"),u(e,"class","content-context svelte-8i1sxu")},m(r,m){te(r,e,m),o(e,n),o(n,t),ce(s,t,null),i=!0,a||(f=[he(window,"keyup",l[2]),wt(Bt.call(null,e,l[5]))],a=!0)},p(r,[m]){const g={};m&1&&(g.id=r[0].id),s.$set(g)},i(r){i||(L(s.$$.fragment,r),i=!0)},o(r){q(s.$$.fragment,r),i=!1},d(r){r&&c(e),fe(s),a=!1,Ke(f)}}}function Wt(l,e,n){let{record:t}=e;const s=tt(),i=m=>{m.key==="Escape"&&s("close")},a=()=>s("reload"),f=()=>s("close"),r=()=>s("close");return l.$$set=m=>{"record"in m&&n(0,t=m.record)},[t,s,i,a,f,r]}class Xt extends Ge{constructor(e){super(),Ye(this,e,Wt,Yt,Je,{record:0})}}function ft(l,e,n){const t=l.slice();return t[13]=e[n],t}function ct(l,e,n){const t=l.slice();t[16]=e[n];const s=t[1]!==null?Vt(t[1].properties[t[16].name],t[16].attribute_type):{type:t[16].attribute_type,value:""};return t[17]=s,t}function dt(l){let e,n=`
`;return{c(){e=h("fieldset"),e.innerHTML=n,this.h()},l(t){e=p(t,"FIELDSET",{class:!0,"data-svelte-h":!0}),ue(e)!=="svelte-1u8xex3"&&(e.innerHTML=n),this.h()},h(){u(e,"class","svelte-26svji")},m(t,s){te(t,e,s)},d(t){t&&c(e)}}}function Zt(l){let e=l[16].attribute_type+"",n,t,s,i,a;return{c(){n=ve(e),t=S(),s=h("input"),this.h()},l(f){n=me(f,e),t=O(f),s=p(f,"INPUT",{type:!0,name:!0,class:!0}),this.h()},h(){u(s,"type","hidden"),u(s,"name",i=l[16].name+"[type]"),s.value=a=l[16].attribute_type,u(s,"class","svelte-26svji")},m(f,r){te(f,n,r),te(f,t,r),te(f,s,r)},p(f,r){r&1&&e!==(e=f[16].attribute_type+"")&&Ie(n,e),r&1&&i!==(i=f[16].name+"[type]")&&u(s,"name",i),r&1&&a!==(a=f[16].attribute_type)&&(s.value=a)},i:et,o:et,d(f){f&&(c(n),c(t),c(s))}}}function Qt(l){let e,n;return e=new Ft({props:{name:l[16].name+"[type]",options:[{value:"string",label:"string"},{value:"json",label:"json"}],checked:l[17].type==="json"?"json":"string"}}),{c(){_e(e.$$.fragment)},l(t){de(e.$$.fragment,t)},m(t,s){ce(e,t,s),n=!0},p(t,s){const i={};s&1&&(i.name=t[16].name+"[type]"),s&3&&(i.checked=t[17].type==="json"?"json":"string"),e.$set(i)},i(t){n||(L(e.$$.fragment,t),n=!0)},o(t){q(e.$$.fragment,t),n=!1},d(t){fe(e,t)}}}function xt(l){let e,n,t,s;return{c(){e=h("textarea"),this.h()},l(i){e=p(i,"TEXTAREA",{rows:!0,name:!0,id:!0,class:!0}),$(e).forEach(c),this.h()},h(){u(e,"rows","1"),u(e,"name",n=l[16].name+"[value]"),u(e,"id",t="edit_"+l[16].name),e.value=s=l[17].type==="json"||l[17].type==="jsonEscaped"?JSON.stringify(l[17].value,void 0,2):l[17].value,u(e,"class","svelte-26svji")},m(i,a){te(i,e,a)},p(i,a){a&1&&n!==(n=i[16].name+"[value]")&&u(e,"name",n),a&1&&t!==(t="edit_"+i[16].name)&&u(e,"id",t),a&3&&s!==(s=i[17].type==="json"||i[17].type==="jsonEscaped"?JSON.stringify(i[17].value,void 0,2):i[17].value)&&(e.value=s)},d(i){i&&c(e)}}}function el(l){let e,n,t,s,i,a,f,r,m,g;return{c(){e=h("select"),n=h("option"),t=h("option"),s=ve("true"),a=h("option"),f=ve("false"),this.h()},l(d){e=p(d,"SELECT",{name:!0,id:!0});var b=$(e);n=p(b,"OPTION",{class:!0}),$(n).forEach(c),t=p(b,"OPTION",{});var E=$(t);s=me(E,"true"),E.forEach(c),a=p(b,"OPTION",{});var y=$(a);f=me(y,"false"),y.forEach(c),b.forEach(c),this.h()},h(){n.__value="",Pe(n,n.__value),u(n,"class","value-null"),t.__value="true",Pe(t,t.__value),t.selected=i=l[17].value==="true",a.__value="false",Pe(a,a.__value),a.selected=r=l[17].value==="false",u(e,"name",m=l[16].name+"[value]"),u(e,"id",g="edit_"+l[16].name)},m(d,b){te(d,e,b),o(e,n),o(e,t),o(t,s),o(e,a),o(a,f)},p(d,b){b&3&&i!==(i=d[17].value==="true")&&(t.selected=i),b&3&&r!==(r=d[17].value==="false")&&(a.selected=r),b&1&&m!==(m=d[16].name+"[value]")&&u(e,"name",m),b&1&&g!==(g="edit_"+d[16].name)&&u(e,"id",g)},d(d){d&&c(e)}}}function _t(l){let e=l[5][l[16].name].message+"",n;return{c(){n=ve(e)},l(t){n=me(t,e)},m(t,s){te(t,n,s)},p(t,s){s&33&&e!==(e=t[5][t[16].name].message+"")&&Ie(n,e)},d(t){t&&c(n)}}}function mt(l){let e,n,t,s=l[16].name+"",i,a,f,r,m,g,d,b,E,y,H,k;const D=[Qt,Zt],w=[];function U(T,R){return T[16].attribute_type==="string"?0:1}m=U(l),g=w[m]=D[m](l);function z(T,R){return T[16].attribute_type==="boolean"?el:xt}let B=z(l),A=B(l),I=l[5][l[16].name]&&_t(l);return{c(){e=h("fieldset"),n=h("dir"),t=h("label"),i=ve(s),a=h("br"),f=S(),r=h("div"),g.c(),b=S(),E=h("div"),A.c(),y=S(),H=h("div"),I&&I.c(),this.h()},l(T){e=p(T,"FIELDSET",{class:!0});var R=$(e);n=p(R,"DIR",{});var K=$(n);t=p(K,"LABEL",{for:!0,class:!0});var G=$(t);i=me(G,s),a=p(G,"BR",{}),f=O(G),r=p(G,"DIV",{class:!0});var M=$(r);g.l(M),M.forEach(c),G.forEach(c),K.forEach(c),b=O(R),E=p(R,"DIV",{});var J=$(E);A.l(J),y=O(J),H=p(J,"DIV",{role:!0,class:!0});var C=$(H);I&&I.l(C),C.forEach(c),J.forEach(c),R.forEach(c),this.h()},h(){u(r,"class","type svelte-26svji"),u(t,"for",d="edit_"+l[16].name),u(t,"class","svelte-26svji"),u(H,"role","alert"),u(H,"class","svelte-26svji"),u(e,"class","svelte-26svji")},m(T,R){te(T,e,R),o(e,n),o(n,t),o(t,i),o(t,a),o(t,f),o(t,r),w[m].m(r,null),o(e,b),o(e,E),A.m(E,null),o(E,y),o(E,H),I&&I.m(H,null),k=!0},p(T,R){(!k||R&1)&&s!==(s=T[16].name+"")&&Ie(i,s);let K=m;m=U(T),m===K?w[m].p(T,R):(Ce(),q(w[K],1,1,()=>{w[K]=null}),ye(),g=w[m],g?g.p(T,R):(g=w[m]=D[m](T),g.c()),L(g,1),g.m(r,null)),(!k||R&1&&d!==(d="edit_"+T[16].name))&&u(t,"for",d),B===(B=z(T))&&A?A.p(T,R):(A.d(1),A=B(T),A&&(A.c(),A.m(E,y))),T[5][T[16].name]?I?I.p(T,R):(I=_t(T),I.c(),I.m(H,null)):I&&(I.d(1),I=null)},i(T){k||(L(g),k=!0)},o(T){q(g),k=!1},d(T){T&&c(e),w[m].d(),A.d(),I&&I.d()}}}function vt(l){let e,n=(l[13].message??JSON.stringify(l[13]))+"",t,s;return{c(){e=h("li"),t=ve(n),s=S(),this.h()},l(i){e=p(i,"LI",{class:!0});var a=$(e);t=me(a,n),s=O(a),a.forEach(c),this.h()},h(){u(e,"class","svelte-26svji")},m(i,a){te(i,e,a),o(e,t),o(e,s)},p(i,a){a&16&&n!==(n=(i[13].message??JSON.stringify(i[13]))+"")&&Ie(t,n)},d(i){i&&c(e)}}}function tl(l){let e;return{c(){e=ve("Edit user")},l(n){e=me(n,"Edit user")},m(n,t){te(n,e,t)},d(n){n&&c(e)}}}function ll(l){let e;return{c(){e=ve("Create user")},l(n){e=me(n,"Create user")},m(n,t){te(n,e,t)},d(n){n&&c(e)}}}function sl(l){let e,n,t,s,i,a=``,f,r,m,g,d,b,E,y,H,k,D,w,U="Cancel",z,B,A,I,T,R,K,G,M=l[1]===null&&dt(),J=Se(l[0]),C=[];for(let v=0;vq(C[v],1,1,()=>{C[v]=null});let V=Se(l[4]),F=[];for(let v=0;v{R&&(T||(T=ze(e,l[7],{},!0)),T.run(1))}),R=!0}},o(v){C=C.filter(Boolean);for(let N=0;Nn(6,t=k));let s,i,a=[],f={},{userProperties:r}=e,{userToEdit:m}=e;const g=tt(),d=function(k,{delay:D=0,duration:w=150}){return{delay:D,duration:w,css:U=>{const z=Ct(U);return`opacity: ${z}; transform: scale(${z});`}}};Pt(()=>{setTimeout(()=>{s.showModal()},10)}),document.addEventListener("keydown",k=>{k.key==="Escape"&&(k.preventDefault(),we(oe,t.user=void 0,t))},{once:!0});const b=async k=>{k.preventDefault();const D=new FormData(i);n(5,f={});for(const w of D.entries())if(w[0].endsWith("[type]")&&(w[1]==="json"||w[1]==="array")){const U=w[0].replace("[type]",""),z=D.get(U+"[value]");z!==""&&!qt(z)&&n(5,f[U]={property:U,message:`Not a valid ${w[1]}`},f)}if(Object.keys(f).length)await tick(),document.querySelector('[role="alert"]:not(:empty)').scrollIntoView({behavior:"smooth",block:"center"});else if(m===null){const w=D.get("email"),U=D.get("password");D.delete("email"),D.delete("password");const z=await Me.create(w,U,D);z.errors?n(4,a=z.errors):(we(oe,t.user=void 0,t),oe.notification.create("success",`User ${z.user.id} created`),g("success"))}else{const w=D.get("email");D.delete("email");const U=await Me.edit(m.id,w,D);U.errors?n(4,a=U.errors):(we(oe,t.user=void 0,t),oe.notification.create("success",`User ${U.user_update.id} edited`),g("success"))}},E=()=>we(oe,t.user=void 0,t);function y(k){Ae[k?"unshift":"push"](()=>{i=k,n(3,i)})}function H(k){Ae[k?"unshift":"push"](()=>{s=k,n(2,s)})}return l.$$set=k=>{"userProperties"in k&&n(0,r=k.userProperties),"userToEdit"in k&&n(1,m=k.userToEdit)},[r,m,s,i,a,f,t,d,b,E,y,H]}class al extends Ge{constructor(e){super(),Ye(this,e,nl,sl,Je,{userProperties:0,userToEdit:1})}}const{document:Ze}=At;function pt(l,e,n){const t=l.slice();return t[28]=e[n],t}function ht(l){let e,n,t="Clear filters",s,i,a,f,r,m;return i=new De({props:{icon:"x",size:"14"}}),{c(){e=h("button"),n=h("span"),n.textContent=t,s=S(),_e(i.$$.fragment),this.h()},l(g){e=p(g,"BUTTON",{type:!0,class:!0});var d=$(e);n=p(d,"SPAN",{class:!0,"data-svelte-h":!0}),ue(n)!=="svelte-ki22n5"&&(n.textContent=t),s=O(d),de(i.$$.fragment,d),d.forEach(c),this.h()},h(){u(n,"class","label svelte-1g093it"),u(e,"type","button"),u(e,"class","clear svelte-1g093it")},m(g,d){te(g,e,d),o(e,n),o(e,s),ce(i,e,null),f=!0,r||(m=he(e,"click",l[10]),r=!0)},p:et,i(g){f||(L(i.$$.fragment,g),g&<(()=>{f&&(a||(a=ze(e,l[8],{},!0)),a.run(1))}),f=!0)},o(g){q(i.$$.fragment,g),g&&(a||(a=ze(e,l[8],{},!1)),a.run(0)),f=!1},d(g){g&&c(e),fe(i),g&&a&&a.end(),r=!1,m()}}}function gt(l){let e,n,t=Se(l[1]),s=[];for(let a=0;aq(s[a],1,1,()=>{s[a]=null});return{c(){e=h("tbody");for(let a=0;a{v=null}),ye()),(!V||_&2)&&A!==(A=l[28].id+"")&&Ie(I,A),(!V||_&34&&T!==(T="/users/"+l[28].id+"?"+l[5].url.searchParams.toString()))&&u(B,"href",T),(!V||_&2)&&M!==(M=l[28].email+"")&&Ie(J,M),(!V||_&34&&C!==(C="/users/"+l[28].id+"?"+l[5].url.searchParams.toString()))&&u(G,"href",C),(!V||_&34)&&Oe(e,"active",l[5].params.id==l[28].id),(!V||_&18)&&Oe(e,"context",l[4].id===l[28].id)},i(N){V||(L(d.$$.fragment,N),L(D.$$.fragment,N),L(v),V=!0)},o(N){q(d.$$.fragment,N),q(D.$$.fragment,N),q(v),V=!1},d(N){N&&c(e),fe(d),fe(D),v&&v.d(),F=!1,Ke(ae)}}}function $t(l){let e;const n=l[13].default,t=jt(n,l,l[12],null);return{c(){t&&t.c()},l(s){t&&t.l(s)},m(s,i){t&&t.m(s,i),e=!0},p(s,i){t&&t.p&&(!e||i&4096)&&Nt(t,n,s,s[12],e?Ot(n,s[12],i,null):Lt(s[12]),null)},i(s){e||(L(t,s),e=!0)},o(s){q(t,s),e=!1},d(s){t&&t.d(s)}}}function kt(l){let e,n;return e=new al({props:{userProperties:l[2],userToEdit:l[6].user}}),e.$on("success",l[26]),{c(){_e(e.$$.fragment)},l(t){de(e.$$.fragment,t)},m(t,s){ce(e,t,s),n=!0},p(t,s){const i={};s&4&&(i.userProperties=t[2]),s&64&&(i.userToEdit=t[6].user),e.$set(i)},i(t){n||(L(e.$$.fragment,t),n=!0)},o(t){q(e.$$.fragment,t),n=!1},d(t){fe(e,t)}}}function rl(l){var at;let e,n,t,s,i,a,f,r,m,g="Filter by",d,b,E,y,H="email",k,D="id",w,U,z,B,A,I,T="Apply filter",R,K,G,M,J,C,j=' ID Email',V,F,ae,se,ee,v="Page:",N,_,Y,ge,be=l[3].totalPages+"",re,Ee,W,ne,ie,$e,Ue="Create a new user",je,Re,Ne,We,st;Ze.title=e="Users"+((at=l[6].online)!=null&&at.MPKIT_URL?": "+l[6].online.MPKIT_URL.replace("https://",""):""),s=new zt({});let X=l[3].value&&ht(l);K=new De({props:{icon:"arrowRight"}});let Z=l[1]&>(l);function yt(P){l[23](P)}let nt={form:"filters",name:"page",min:1,max:l[3].totalPages,step:1,decreaseLabel:"Previous page",increaseLabel:"Next page",style:"navigation"};l[3].page!==void 0&&(nt.value=l[3].page),_=new Ht({props:nt}),Ae.push(()=>Ut(_,"value",yt)),_.$on("input",l[24]),ne=new De({props:{icon:"plus"}});let Q=l[5].params.id&&$t(l),x=l[6].user!==void 0&&kt(l);return{c(){n=S(),t=h("div"),_e(s.$$.fragment),i=S(),a=h("section"),f=h("nav"),r=h("form"),m=h("label"),m.textContent=g,d=S(),b=h("fieldset"),E=h("select"),y=h("option"),y.textContent=H,k=h("option"),k.textContent=D,w=S(),U=h("input"),z=S(),X&&X.c(),B=S(),A=h("button"),I=h("span"),I.textContent=T,R=S(),_e(K.$$.fragment),G=S(),M=h("article"),J=h("table"),C=h("thead"),C.innerHTML=j,V=S(),Z&&Z.c(),F=S(),ae=h("nav"),se=h("div"),ee=h("label"),ee.textContent=v,N=S(),_e(_.$$.fragment),ge=ve(`\r + of `),re=ve(be),Ee=S(),W=h("button"),_e(ne.$$.fragment),ie=S(),$e=h("span"),$e.textContent=Ue,je=S(),Q&&Q.c(),Re=S(),x&&x.c(),this.h()},l(P){Dt("svelte-mcmxo",Ze.head).forEach(c),n=O(P),t=p(P,"DIV",{class:!0});var pe=$(t);de(s.$$.fragment,pe),i=O(pe),a=p(pe,"SECTION",{class:!0});var ke=$(a);f=p(ke,"NAV",{class:!0});var rt=$(f);r=p(rt,"FORM",{action:!0,id:!0,class:!0});var Be=$(r);m=p(Be,"LABEL",{for:!0,"data-svelte-h":!0}),ue(m)!=="svelte-rbwhex"&&(m.textContent=g),d=O(Be),b=p(Be,"FIELDSET",{class:!0});var Te=$(b);E=p(Te,"SELECT",{id:!0,name:!0,class:!0});var Xe=$(E);y=p(Xe,"OPTION",{"data-svelte-h":!0}),ue(y)!=="svelte-51kto6"&&(y.textContent=H),k=p(Xe,"OPTION",{"data-svelte-h":!0}),ue(k)!=="svelte-ns3pfu"&&(k.textContent=D),Xe.forEach(c),w=O(Te),U=p(Te,"INPUT",{type:!0,name:!0,class:!0}),z=O(Te),X&&X.l(Te),B=O(Te),A=p(Te,"BUTTON",{type:!0,class:!0});var Ve=$(A);I=p(Ve,"SPAN",{class:!0,"data-svelte-h":!0}),ue(I)!=="svelte-ctu7wl"&&(I.textContent=T),R=O(Ve),de(K.$$.fragment,Ve),Ve.forEach(c),Te.forEach(c),Be.forEach(c),rt.forEach(c),G=O(ke),M=p(ke,"ARTICLE",{class:!0});var it=$(M);J=p(it,"TABLE",{class:!0});var Fe=$(J);C=p(Fe,"THEAD",{class:!0,"data-svelte-h":!0}),ue(C)!=="svelte-17vx132"&&(C.innerHTML=j),V=O(Fe),Z&&Z.l(Fe),Fe.forEach(c),it.forEach(c),F=O(ke),ae=p(ke,"NAV",{class:!0});var qe=$(ae);se=p(qe,"DIV",{});var Le=$(se);ee=p(Le,"LABEL",{for:!0,"data-svelte-h":!0}),ue(ee)!=="svelte-1r8oyu6"&&(ee.textContent=v),N=O(Le),de(_.$$.fragment,Le),ge=me(Le,`\r + of `),re=me(Le,be),Le.forEach(c),Ee=O(qe),W=p(qe,"BUTTON",{class:!0,title:!0});var He=$(W);de(ne.$$.fragment,He),ie=O(He),$e=p(He,"SPAN",{class:!0,"data-svelte-h":!0}),ue($e)!=="svelte-vjukmr"&&($e.textContent=Ue),He.forEach(c),qe.forEach(c),ke.forEach(c),je=O(pe),Q&&Q.l(pe),Re=O(pe),x&&x.l(pe),pe.forEach(c),this.h()},h(){u(m,"for","filters_attribute"),y.__value="email",Pe(y,y.__value),k.__value="id",Pe(k,k.__value),u(E,"id","filters_attribute"),u(E,"name","attribute"),u(E,"class","svelte-1g093it"),l[3].attribute===void 0&<(()=>l[14].call(E)),u(U,"type","text"),u(U,"name","value"),u(U,"class","svelte-1g093it"),u(I,"class","label svelte-1g093it"),u(A,"type","submit"),u(A,"class","button svelte-1g093it"),u(b,"class","search svelte-1g093it"),u(r,"action",""),u(r,"id","filters"),u(r,"class","svelte-1g093it"),u(f,"class","filters svelte-1g093it"),u(C,"class","svelte-1g093it"),u(J,"class","svelte-1g093it"),u(M,"class","contetnt"),u(ee,"for","page"),u($e,"class","label"),u(W,"class","button"),u(W,"title","Create user"),u(ae,"class","pagination svelte-1g093it"),u(a,"class","container svelte-1g093it"),u(t,"class","page svelte-1g093it")},m(P,le){te(P,n,le),te(P,t,le),ce(s,t,null),o(t,i),o(t,a),o(a,f),o(f,r),o(r,m),o(r,d),o(r,b),o(b,E),o(E,y),o(E,k),ot(E,l[3].attribute,!0),o(b,w),o(b,U),Pe(U,l[3].value),o(b,z),X&&X.m(b,null),o(b,B),o(b,A),o(A,I),o(A,R),ce(K,A,null),l[17](r),o(a,G),o(a,M),o(M,J),o(J,C),o(J,V),Z&&Z.m(J,null),o(a,F),o(a,ae),o(ae,se),o(se,ee),o(se,N),ce(_,se,null),o(se,ge),o(se,re),o(ae,Ee),o(ae,W),ce(ne,W,null),o(W,ie),o(W,$e),o(t,je),Q&&Q.m(t,null),o(t,Re),x&&x.m(t,null),Ne=!0,We||(st=[he(E,"change",l[14]),he(E,"change",l[15]),he(U,"input",l[16]),he(r,"submit",l[18]),he(W,"click",Tt(l[25]))],We=!0)},p(P,[le]){var ke;(!Ne||le&64)&&e!==(e="Users"+((ke=P[6].online)!=null&&ke.MPKIT_URL?": "+P[6].online.MPKIT_URL.replace("https://",""):""))&&(Ze.title=e),le&8&&ot(E,P[3].attribute),le&8&&U.value!==P[3].value&&Pe(U,P[3].value),P[3].value?X?(X.p(P,le),le&8&&L(X,1)):(X=ht(P),X.c(),L(X,1),X.m(b,B)):X&&(Ce(),q(X,1,1,()=>{X=null}),ye()),P[1]?Z?(Z.p(P,le),le&2&&L(Z,1)):(Z=gt(P),Z.c(),L(Z,1),Z.m(J,null)):Z&&(Ce(),q(Z,1,1,()=>{Z=null}),ye());const pe={};le&8&&(pe.max=P[3].totalPages),!Y&&le&8&&(Y=!0,pe.value=P[3].page,It(()=>Y=!1)),_.$set(pe),(!Ne||le&8)&&be!==(be=P[3].totalPages+"")&&Ie(re,be),P[5].params.id?Q?(Q.p(P,le),le&32&&L(Q,1)):(Q=$t(P),Q.c(),L(Q,1),Q.m(t,Re)):Q&&(Ce(),q(Q,1,1,()=>{Q=null}),ye()),P[6].user!==void 0?x?(x.p(P,le),le&64&&L(x,1)):(x=kt(P),x.c(),L(x,1),x.m(t,null)):x&&(Ce(),q(x,1,1,()=>{x=null}),ye())},i(P){Ne||(L(s.$$.fragment,P),L(X),L(K.$$.fragment,P),L(Z),L(_.$$.fragment,P),L(ne.$$.fragment,P),L(Q),L(x),Ne=!0)},o(P){q(s.$$.fragment,P),q(X),q(K.$$.fragment,P),q(Z),q(_.$$.fragment,P),q(ne.$$.fragment,P),q(Q),q(x),Ne=!1},d(P){P&&(c(n),c(t)),fe(s),X&&X.d(),fe(K),l[17](null),Z&&Z.d(),fe(_),fe(ne),Q&&Q.d(),x&&x.d(),We=!1,Ke(st)}}}function il(l,e,n){let t,s;xe(l,Rt,j=>n(5,t=j)),xe(l,oe,j=>n(6,s=j));let{$$slots:i={},$$scope:a}=e,f,r=[],m=null,g={page:1,attribute:"email",value:""},d={page:1,totalPages:1,attribute:"email",value:"",...Object.fromEntries(t.url.searchParams)};we(oe,s.user=void 0,s);let b={id:null};const E=function(){const j=Object.fromEntries(t.url.searchParams);Me.get(j).then(V=>{n(1,r=V.results),n(3,d.totalPages=V.total_pages,d)})},y=function(j,{delay:V=0,duration:F=150}){return{delay:V,duration:F,css:ae=>`scale: ${Ct(ae)};`}},H=function(j=null){m===null?Me.getCustomProperties().then(V=>{n(2,m=V),we(oe,s.user=j,s)}).catch(()=>{oe.notification.create("error","Could not load table properties. Please try again later.")}):we(oe,s.user=j,s)},k=async function(){n(3,d=structuredClone(g)),await ut(),f.requestSubmit()},D=async function(j){j.preventDefault();const V=t.url.searchParams,F=new URLSearchParams(new FormData(j.target));V.get("value")!==F.get("value")&&(F.set("page",1),n(3,d.page=1,d)),await Mt(document.location.pathname+"?"+F.toString()),await ut(),await E()};function w(){d.attribute=St(this),n(3,d)}const U=()=>n(3,d.value="",d);function z(){d.value=this.value,n(3,d)}function B(j){Ae[j?"unshift":"push"](()=>{f=j,n(0,f)})}const A=j=>D(j),I=j=>n(4,b.id=j.id,b),T=j=>{H(j)},R=()=>E(),K=()=>n(4,b.id=null,b);function G(j){l.$$.not_equal(d.page,j)&&(d.page=j,n(3,d))}const M=j=>{f.requestSubmit(j.detail.submitter)},J=()=>H(),C=()=>E();return l.$$set=j=>{"$$scope"in j&&n(12,a=j.$$scope)},E(),[f,r,m,d,b,t,s,E,y,H,k,D,a,i,w,U,z,B,A,I,T,R,K,G,M,J,C]}class $l extends Ge{constructor(e){super(),Ye(this,e,il,rl,Je,{})}}export{$l as component}; diff --git a/gui/next/build/_app/immutable/nodes/7.D_-4meMh.js b/gui/next/build/_app/immutable/nodes/7.D_-4meMh.js new file mode 100644 index 0000000..a26da51 --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/7.D_-4meMh.js @@ -0,0 +1,5 @@ +import{O as da,P as ha,Q as sl,R as pa,s as va,d as a,r as ma,a as Ct,w as t,K as A,i as Yt,b as e,D as q,A as aa,p as _a,g as u,c as l,e as r,z as C,f as D,j as f,h as n,t as N,k as ga,L as mn,n as S,v as ra,J as $a}from"../chunks/Ul9VwQ7n.js";import{g as ua,t as _,e as fa,a as m,S as ba,i as ka,d as L,m as y,c as E,b as U,f as ia}from"../chunks/Bh3MJlbi.js";import{f as oa}from"../chunks/odGh2V91.js";import{s as cs}from"../chunks/DGc7Lmco.js";import{t as La}from"../chunks/t7b_BBSP.js";import{I as w}from"../chunks/D-yR0E5w.js";function ya(s,o){const $=o.token={};function c(d,v,p,b){if(o.token!==$)return;o.resolved=b;let P=o.ctx;p!==void 0&&(P=P.slice(),P[p]=b);const B=d&&(o.current=d)(P);let k=!1;o.block&&(o.blocks?o.blocks.forEach((z,ve)=>{ve!==v&&z&&(ua(),_(z,1,1,()=>{o.blocks[ve]===z&&(o.blocks[ve]=null)}),fa())}):o.block.d(1),B.c(),m(B,1),B.m(o.mount(),o.anchor),k=!0),o.block=B,o.blocks&&(o.blocks[v]=B),k&&pa()}if(da(s)){const d=ha();if(s.then(v=>{sl(d),c(o.then,1,o.value,v),sl(null)},v=>{if(sl(d),c(o.catch,2,o.error,v),sl(null),!o.hasCatch)throw v}),o.current!==o.pending)return c(o.pending,0),!0}else{if(o.current!==o.then)return c(o.then,1,o.value,s),!0;o.resolved=s}}function Ea(s,o,$){const c=o.slice(),{resolved:d}=s;s.current===s.then&&(c[s.value]=d),s.current===s.catch&&(c[s.error]=d),s.block.p(c,$)}function Ua(s){return{c:S,l:S,m:S,p:S,i:S,o:S,d:S}}function wa(s){let o,$,c=s[21].version!==s[1].online.version&&ca(s);return{c(){c&&c.c(),o=ra()},l(d){c&&c.l(d),o=ra()},m(d,v){c&&c.m(d,v),Yt(d,o,v),$=!0},p(d,v){d[21].version!==d[1].online.version?c?(c.p(d,v),v&2&&m(c,1)):(c=ca(d),c.c(),m(c,1),c.m(o.parentNode,o)):c&&(ua(),_(c,1,1,()=>{c=null}),fa())},i(d){$||(m(c),$=!0)},o(d){_(c),$=!1},d(d){d&&a(o),c&&c.d(d)}}}function ca(s){let o,$,c,d,v="Update available",p,b,P,B;return $=new w({props:{icon:"arrowTripleUp"}}),{c(){o=n("button"),U($.$$.fragment),c=f(),d=n("span"),d.textContent=v,this.h()},l(k){o=l(k,"BUTTON",{title:!0,class:!0});var z=r(o);E($.$$.fragment,z),c=u(z),d=l(z,"SPAN",{"data-svelte-h":!0}),C(d)!=="svelte-16bfzxk"&&(d.textContent=v),z.forEach(a),this.h()},h(){t(o,"title","Update to siteglide-cli version "+s[21].version),t(o,"class","update svelte-1t1yf9")},m(k,z){Yt(k,o,z),y($,o,null),e(o,c),e(o,d),b=!0,P||(B=q(o,"click",s[6]),P=!0)},p:S,i(k){b||(m($.$$.fragment,k),k&&$a(()=>{b&&(p||(p=ia(o,oa,{},!0)),p.run(1))}),b=!0)},o(k){_($.$$.fragment,k),k&&(p||(p=ia(o,oa,{},!1)),p.run(0)),b=!1},d(k){k&&a(o),L($),k&&p&&p.end(),P=!1,B()}}}function Ca(s){return{c:S,l:S,m:S,p:S,i:S,o:S,d:S}}function Ta(s){var An;let o,$,c,d,v,p,b,P,B,k,z="Database",ve,me,ll='
  • Inspect tables and records
  • Create, edit or delete records
  • Filter and find any record
  • ',us,ae,Ae,R,_e,fs,ge,nl="Show more information about Database tool",ds,T,I,$e,al,Be,Zt=s[1].header.includes("database")?"Unpin Database from":"Pin Database to",hs,rl,ps,il,H,re,Tt,Me,ol,Je,_n="Users",cl,He,gn='
  • Inspect registered users and their personal data
  • ',ul,be,Pt,x,Oe,fl,Fe,$n="Show more information about Users tool",dl,qt,j,ke,hl,Qe,xt=s[1].header.includes("users")?"Unpin Users from":"Pin Users to",vs,pl,ms,vl,O,ie,It,Ge,ml,Ve,bn="Logs",_l,Re,kn='
  • View system logs
  • Inspect logs you've outputted yourself
  • Debug Liquid or GraphQL errors
  • ',gl,Le,Dt,ee,je,$l,Ke,Ln="Show more information about Logs tool",bl,Nt,K,ye,kl,We,es=s[1].header.includes("logs")?"Unpin Logs from":"Pin Logs to",_s,Ll,gs,yl,F,oe,St,Xe,El,Ye,yn="Background Jobs",Ul,Ze,En='
  • List scheduled background jobs
  • Debug background jobs that failed to run
  • ',wl,Ee,zt,te,xe,Cl,et,Un="Show more information about Background Jobs tool",Tl,At,W,Ue,Pl,tt,ts=s[1].header.includes("backgroundJobs")?"Unpin Background Jobs from":"Pin Background Jobs to",$s,ql,bs,Il,Q,ce,Bt,st,Dl,lt,wn="Constants",Nl,nt,Cn='
  • Check all constants in one place
  • Create new constants
  • Edit or delete existing ones
  • ',Sl,we,Mt,se,at,zl,rt,Tn="Show more information about Constants tool",Al,Jt,X,Ce,Bl,it,ss=s[1].header.includes("constants")?"Unpin Constants from":"Pin Constants to",ks,Ml,Ls,Jl,Te,G,ue,ot,ct,Hl,ut,Pn="Liquid Evaluator",Ol,ft,qn='
  • Run Liquid code against your instance
  • Test Liquid logic
  • Quickly prototype your ideas
  • ',Fl,Pe,Ht,le,dt,Ql,ht,In="Show more information about Liquid Evaluator",Gl,Ot,Y,qe,Vl,pt,ls=s[1].header.includes("liquid")?"Unpin Liquid Evaluator from":"Pin Liquid Evaluator to",ys,Rl,Es,jl,V,fe,vt,mt,Kl,_t,Dn="GraphiQL",Wl,gt,Nn='
  • Run GraphQL against your instance
  • Explore documentation
  • Quickly prototype your queries and mutations
  • ',Xl,Ie,Ft,ne,$t,Yl,bt,Sn="Show more information about GraphiQL",Zl,Qt,Z,De,xl,kt,ns=s[1].header.includes("graphiql")?"Unpin GraphiQL from":"Pin GraphiQL to",Us,en,ws,Cs,de,Gt,tn,Ne,as,Se,Lt,sn,ln,rs,ze,yt,nn,g,an,zn;document.title=o="Siteglide"+((An=s[1].online)!=null&&An.MPKIT_URL?": "+s[1].online.MPKIT_URL.replace("https://",""):""),P=new w({props:{icon:"database",size:"48"}}),_e=new w({props:{icon:"info",size:"14"}}),$e=new w({props:{icon:s[1].header.includes("database")?"pinFilled":"pin",size:"14"}}),Me=new w({props:{icon:"users",size:"48"}}),Oe=new w({props:{icon:"info",size:"14"}}),ke=new w({props:{icon:s[1].header.includes("users")?"pinFilled":"pin",size:"14"}}),Ge=new w({props:{icon:"log",size:"48"}}),je=new w({props:{icon:"info",size:"14"}}),ye=new w({props:{icon:s[1].header.includes("logs")?"pinFilled":"pin",size:"14"}}),Xe=new w({props:{icon:"backgroundJob",size:"48"}}),xe=new w({props:{icon:"info",size:"14"}}),Ue=new w({props:{icon:s[1].header.includes("backgroundJobs")?"pinFilled":"pin",size:"14"}}),st=new w({props:{icon:"constant",size:"48"}}),at=new w({props:{icon:"info",size:"14"}}),Ce=new w({props:{icon:s[1].header.includes("constants")?"pinFilled":"pin",size:"14"}}),ct=new w({props:{icon:"liquid",size:"48"}}),dt=new w({props:{icon:"info",size:"14"}}),qe=new w({props:{icon:s[1].header.includes("liquid")?"pinFilled":"pin",size:"14"}}),mt=new w({props:{icon:"graphql",size:"48"}}),$t=new w({props:{icon:"info",size:"14"}}),De=new w({props:{icon:s[1].header.includes("graphiql")?"pinFilled":"pin",size:"14"}});let M={ctx:s,current:null,token:null,hasCatch:!1,pending:Ca,then:wa,catch:Ua,value:21,blocks:[,,,]};return ya(s[5](),M),Lt=new w({props:{icon:"book"}}),yt=new w({props:{icon:"serverSettings"}}),{c(){$=f(),c=n("nav"),d=n("ul"),v=n("li"),p=n("a"),b=n("div"),U(P.$$.fragment),B=f(),k=n("h2"),k.textContent=z,ve=f(),me=n("ul"),me.innerHTML=ll,us=f(),ae=n("ul"),Ae=n("li"),R=n("button"),U(_e.$$.fragment),fs=f(),ge=n("span"),ge.textContent=nl,ds=f(),T=n("li"),I=n("button"),U($e.$$.fragment),al=f(),Be=n("span"),hs=N(Zt),rl=N(" header menu"),il=f(),H=n("li"),re=n("a"),Tt=n("div"),U(Me.$$.fragment),ol=f(),Je=n("h2"),Je.textContent=_n,cl=f(),He=n("ul"),He.innerHTML=gn,ul=f(),be=n("ul"),Pt=n("li"),x=n("button"),U(Oe.$$.fragment),fl=f(),Fe=n("span"),Fe.textContent=$n,dl=f(),qt=n("li"),j=n("button"),U(ke.$$.fragment),hl=f(),Qe=n("span"),vs=N(xt),pl=N(" header menu"),vl=f(),O=n("li"),ie=n("a"),It=n("div"),U(Ge.$$.fragment),ml=f(),Ve=n("h2"),Ve.textContent=bn,_l=f(),Re=n("ul"),Re.innerHTML=kn,gl=f(),Le=n("ul"),Dt=n("li"),ee=n("button"),U(je.$$.fragment),$l=f(),Ke=n("span"),Ke.textContent=Ln,bl=f(),Nt=n("li"),K=n("button"),U(ye.$$.fragment),kl=f(),We=n("span"),_s=N(es),Ll=N(" header menu"),yl=f(),F=n("li"),oe=n("a"),St=n("div"),U(Xe.$$.fragment),El=f(),Ye=n("h2"),Ye.textContent=yn,Ul=f(),Ze=n("ul"),Ze.innerHTML=En,wl=f(),Ee=n("ul"),zt=n("li"),te=n("button"),U(xe.$$.fragment),Cl=f(),et=n("span"),et.textContent=Un,Tl=f(),At=n("li"),W=n("button"),U(Ue.$$.fragment),Pl=f(),tt=n("span"),$s=N(ts),ql=N(" header menu"),Il=f(),Q=n("li"),ce=n("a"),Bt=n("div"),U(st.$$.fragment),Dl=f(),lt=n("h2"),lt.textContent=wn,Nl=f(),nt=n("ul"),nt.innerHTML=Cn,Sl=f(),we=n("ul"),Mt=n("li"),se=n("button"),U(at.$$.fragment),zl=f(),rt=n("span"),rt.textContent=Tn,Al=f(),Jt=n("li"),X=n("button"),U(Ce.$$.fragment),Bl=f(),it=n("span"),ks=N(ss),Ml=N(" header menu"),Jl=f(),Te=n("ul"),G=n("li"),ue=n("a"),ot=n("div"),U(ct.$$.fragment),Hl=f(),ut=n("h2"),ut.textContent=Pn,Ol=f(),ft=n("ul"),ft.innerHTML=qn,Fl=f(),Pe=n("ul"),Ht=n("li"),le=n("button"),U(dt.$$.fragment),Ql=f(),ht=n("span"),ht.textContent=In,Gl=f(),Ot=n("li"),Y=n("button"),U(qe.$$.fragment),Vl=f(),pt=n("span"),ys=N(ls),Rl=N(" header menu"),jl=f(),V=n("li"),fe=n("a"),vt=n("div"),U(mt.$$.fragment),Kl=f(),_t=n("h2"),_t.textContent=Dn,Wl=f(),gt=n("ul"),gt.innerHTML=Nn,Xl=f(),Ie=n("ul"),Ft=n("li"),ne=n("button"),U($t.$$.fragment),Yl=f(),bt=n("span"),bt.textContent=Sn,Zl=f(),Qt=n("li"),Z=n("button"),U(De.$$.fragment),xl=f(),kt=n("span"),Us=N(ns),en=N(" header menu"),Cs=f(),de=n("footer"),Gt=n("div"),M.block.c(),tn=f(),Ne=n("ul"),as=n("li"),Se=n("a"),U(Lt.$$.fragment),sn=N(`\r + Documentation`),ln=f(),rs=n("li"),ze=n("a"),U(yt.$$.fragment),nn=N(`\r + Siteglide Portal`),this.h()},l(i){_a("svelte-1cqdfx4",document.head).forEach(a),$=u(i),c=l(i,"NAV",{class:!0});var he=r(c);d=l(he,"UL",{class:!0});var J=r(d);v=l(J,"LI",{class:!0});var pe=r(v);p=l(pe,"A",{href:!0,class:!0});var Et=r(p);b=l(Et,"DIV",{class:!0});var is=r(b);E(P.$$.fragment,is),is.forEach(a),B=u(Et),k=l(Et,"H2",{class:!0,"data-svelte-h":!0}),C(k)!=="svelte-1a38a01"&&(k.textContent=z),Et.forEach(a),ve=u(pe),me=l(pe,"UL",{class:!0,"data-svelte-h":!0}),C(me)!=="svelte-1tj1zl5"&&(me.innerHTML=ll),us=u(pe),ae=l(pe,"UL",{class:!0});var Ut=r(ae);Ae=l(Ut,"LI",{class:!0});var os=r(Ae);R=l(os,"BUTTON",{title:!0,class:!0});var wt=r(R);E(_e.$$.fragment,wt),fs=u(wt),ge=l(wt,"SPAN",{class:!0,"data-svelte-h":!0}),C(ge)!=="svelte-vg36pf"&&(ge.textContent=nl),wt.forEach(a),os.forEach(a),ds=u(Ut),T=l(Ut,"LI",{class:!0});var Bn=r(T);I=l(Bn,"BUTTON",{title:!0,class:!0});var Ts=r(I);E($e.$$.fragment,Ts),al=u(Ts),Be=l(Ts,"SPAN",{class:!0});var rn=r(Be);hs=D(rn,Zt),rl=D(rn," header menu"),rn.forEach(a),Ts.forEach(a),Bn.forEach(a),Ut.forEach(a),pe.forEach(a),il=u(J),H=l(J,"LI",{class:!0});var Vt=r(H);re=l(Vt,"A",{href:!0,class:!0});var Ps=r(re);Tt=l(Ps,"DIV",{class:!0});var Mn=r(Tt);E(Me.$$.fragment,Mn),Mn.forEach(a),ol=u(Ps),Je=l(Ps,"H2",{class:!0,"data-svelte-h":!0}),C(Je)!=="svelte-bvmn5u"&&(Je.textContent=_n),Ps.forEach(a),cl=u(Vt),He=l(Vt,"UL",{class:!0,"data-svelte-h":!0}),C(He)!=="svelte-ml78fh"&&(He.innerHTML=gn),ul=u(Vt),be=l(Vt,"UL",{class:!0});var qs=r(be);Pt=l(qs,"LI",{class:!0});var Jn=r(Pt);x=l(Jn,"BUTTON",{title:!0,class:!0});var Is=r(x);E(Oe.$$.fragment,Is),fl=u(Is),Fe=l(Is,"SPAN",{class:!0,"data-svelte-h":!0}),C(Fe)!=="svelte-10o6fc2"&&(Fe.textContent=$n),Is.forEach(a),Jn.forEach(a),dl=u(qs),qt=l(qs,"LI",{class:!0});var Hn=r(qt);j=l(Hn,"BUTTON",{title:!0,class:!0});var Ds=r(j);E(ke.$$.fragment,Ds),hl=u(Ds),Qe=l(Ds,"SPAN",{class:!0});var on=r(Qe);vs=D(on,xt),pl=D(on," header menu"),on.forEach(a),Ds.forEach(a),Hn.forEach(a),qs.forEach(a),Vt.forEach(a),vl=u(J),O=l(J,"LI",{class:!0});var Rt=r(O);ie=l(Rt,"A",{href:!0,class:!0});var Ns=r(ie);It=l(Ns,"DIV",{class:!0});var On=r(It);E(Ge.$$.fragment,On),On.forEach(a),ml=u(Ns),Ve=l(Ns,"H2",{class:!0,"data-svelte-h":!0}),C(Ve)!=="svelte-1ef7qq7"&&(Ve.textContent=bn),Ns.forEach(a),_l=u(Rt),Re=l(Rt,"UL",{class:!0,"data-svelte-h":!0}),C(Re)!=="svelte-16nvdoq"&&(Re.innerHTML=kn),gl=u(Rt),Le=l(Rt,"UL",{class:!0});var Ss=r(Le);Dt=l(Ss,"LI",{class:!0});var Fn=r(Dt);ee=l(Fn,"BUTTON",{title:!0,class:!0});var zs=r(ee);E(je.$$.fragment,zs),$l=u(zs),Ke=l(zs,"SPAN",{class:!0,"data-svelte-h":!0}),C(Ke)!=="svelte-7a5jqd"&&(Ke.textContent=Ln),zs.forEach(a),Fn.forEach(a),bl=u(Ss),Nt=l(Ss,"LI",{class:!0});var Qn=r(Nt);K=l(Qn,"BUTTON",{title:!0,class:!0});var As=r(K);E(ye.$$.fragment,As),kl=u(As),We=l(As,"SPAN",{class:!0});var cn=r(We);_s=D(cn,es),Ll=D(cn," header menu"),cn.forEach(a),As.forEach(a),Qn.forEach(a),Ss.forEach(a),Rt.forEach(a),yl=u(J),F=l(J,"LI",{class:!0});var jt=r(F);oe=l(jt,"A",{href:!0,class:!0});var Bs=r(oe);St=l(Bs,"DIV",{class:!0});var Gn=r(St);E(Xe.$$.fragment,Gn),Gn.forEach(a),El=u(Bs),Ye=l(Bs,"H2",{class:!0,"data-svelte-h":!0}),C(Ye)!=="svelte-1bxtcha"&&(Ye.textContent=yn),Bs.forEach(a),Ul=u(jt),Ze=l(jt,"UL",{class:!0,"data-svelte-h":!0}),C(Ze)!=="svelte-198kha5"&&(Ze.innerHTML=En),wl=u(jt),Ee=l(jt,"UL",{class:!0});var Ms=r(Ee);zt=l(Ms,"LI",{class:!0});var Vn=r(zt);te=l(Vn,"BUTTON",{title:!0,class:!0});var Js=r(te);E(xe.$$.fragment,Js),Cl=u(Js),et=l(Js,"SPAN",{class:!0,"data-svelte-h":!0}),C(et)!=="svelte-12zm1eu"&&(et.textContent=Un),Js.forEach(a),Vn.forEach(a),Tl=u(Ms),At=l(Ms,"LI",{class:!0});var Rn=r(At);W=l(Rn,"BUTTON",{title:!0,class:!0});var Hs=r(W);E(Ue.$$.fragment,Hs),Pl=u(Hs),tt=l(Hs,"SPAN",{class:!0});var un=r(tt);$s=D(un,ts),ql=D(un," header menu"),un.forEach(a),Hs.forEach(a),Rn.forEach(a),Ms.forEach(a),jt.forEach(a),Il=u(J),Q=l(J,"LI",{class:!0});var Kt=r(Q);ce=l(Kt,"A",{href:!0,class:!0});var Os=r(ce);Bt=l(Os,"DIV",{class:!0});var jn=r(Bt);E(st.$$.fragment,jn),jn.forEach(a),Dl=u(Os),lt=l(Os,"H2",{class:!0,"data-svelte-h":!0}),C(lt)!=="svelte-187k1uv"&&(lt.textContent=wn),Os.forEach(a),Nl=u(Kt),nt=l(Kt,"UL",{class:!0,"data-svelte-h":!0}),C(nt)!=="svelte-1hxwc9f"&&(nt.innerHTML=Cn),Sl=u(Kt),we=l(Kt,"UL",{class:!0});var Fs=r(we);Mt=l(Fs,"LI",{class:!0});var Kn=r(Mt);se=l(Kn,"BUTTON",{title:!0,class:!0});var Qs=r(se);E(at.$$.fragment,Qs),zl=u(Qs),rt=l(Qs,"SPAN",{class:!0,"data-svelte-h":!0}),C(rt)!=="svelte-96zp3x"&&(rt.textContent=Tn),Qs.forEach(a),Kn.forEach(a),Al=u(Fs),Jt=l(Fs,"LI",{class:!0});var Wn=r(Jt);X=l(Wn,"BUTTON",{title:!0,class:!0});var Gs=r(X);E(Ce.$$.fragment,Gs),Bl=u(Gs),it=l(Gs,"SPAN",{class:!0});var fn=r(it);ks=D(fn,ss),Ml=D(fn," header menu"),fn.forEach(a),Gs.forEach(a),Wn.forEach(a),Fs.forEach(a),Kt.forEach(a),J.forEach(a),Jl=u(he),Te=l(he,"UL",{class:!0});var Vs=r(Te);G=l(Vs,"LI",{class:!0});var Wt=r(G);ue=l(Wt,"A",{href:!0,class:!0});var Rs=r(ue);ot=l(Rs,"DIV",{class:!0,style:!0});var Xn=r(ot);E(ct.$$.fragment,Xn),Xn.forEach(a),Hl=u(Rs),ut=l(Rs,"H2",{class:!0,"data-svelte-h":!0}),C(ut)!=="svelte-1945w61"&&(ut.textContent=Pn),Rs.forEach(a),Ol=u(Wt),ft=l(Wt,"UL",{class:!0,"data-svelte-h":!0}),C(ft)!=="svelte-1k625ps"&&(ft.innerHTML=qn),Fl=u(Wt),Pe=l(Wt,"UL",{class:!0});var js=r(Pe);Ht=l(js,"LI",{class:!0});var Yn=r(Ht);le=l(Yn,"BUTTON",{title:!0,class:!0});var Ks=r(le);E(dt.$$.fragment,Ks),Ql=u(Ks),ht=l(Ks,"SPAN",{class:!0,"data-svelte-h":!0}),C(ht)!=="svelte-zgpe6t"&&(ht.textContent=In),Ks.forEach(a),Yn.forEach(a),Gl=u(js),Ot=l(js,"LI",{class:!0});var Zn=r(Ot);Y=l(Zn,"BUTTON",{title:!0,class:!0});var Ws=r(Y);E(qe.$$.fragment,Ws),Vl=u(Ws),pt=l(Ws,"SPAN",{class:!0});var dn=r(pt);ys=D(dn,ls),Rl=D(dn," header menu"),dn.forEach(a),Ws.forEach(a),Zn.forEach(a),js.forEach(a),Wt.forEach(a),jl=u(Vs),V=l(Vs,"LI",{class:!0});var Xt=r(V);fe=l(Xt,"A",{href:!0,class:!0});var Xs=r(fe);vt=l(Xs,"DIV",{class:!0,style:!0});var xn=r(vt);E(mt.$$.fragment,xn),xn.forEach(a),Kl=u(Xs),_t=l(Xs,"H2",{class:!0,"data-svelte-h":!0}),C(_t)!=="svelte-v0z4e8"&&(_t.textContent=Dn),Xs.forEach(a),Wl=u(Xt),gt=l(Xt,"UL",{class:!0,"data-svelte-h":!0}),C(gt)!=="svelte-17bqupm"&&(gt.innerHTML=Nn),Xl=u(Xt),Ie=l(Xt,"UL",{class:!0});var Ys=r(Ie);Ft=l(Ys,"LI",{class:!0});var ea=r(Ft);ne=l(ea,"BUTTON",{title:!0,class:!0});var Zs=r(ne);E($t.$$.fragment,Zs),Yl=u(Zs),bt=l(Zs,"SPAN",{class:!0,"data-svelte-h":!0}),C(bt)!=="svelte-1mz1lxe"&&(bt.textContent=Sn),Zs.forEach(a),ea.forEach(a),Zl=u(Ys),Qt=l(Ys,"LI",{class:!0});var ta=r(Qt);Z=l(ta,"BUTTON",{title:!0,class:!0});var xs=r(Z);E(De.$$.fragment,xs),xl=u(xs),kt=l(xs,"SPAN",{class:!0});var hn=r(kt);Us=D(hn,ns),en=D(hn," header menu"),hn.forEach(a),xs.forEach(a),ta.forEach(a),Ys.forEach(a),Xt.forEach(a),Vs.forEach(a),he.forEach(a),Cs=u(i),de=l(i,"FOOTER",{class:!0});var el=r(de);Gt=l(el,"DIV",{});var sa=r(Gt);M.block.l(sa),sa.forEach(a),tn=u(el),Ne=l(el,"UL",{class:!0});var tl=r(Ne);as=l(tl,"LI",{});var la=r(as);Se=l(la,"A",{href:!0,class:!0});var pn=r(Se);E(Lt.$$.fragment,pn),sn=D(pn,`\r + Documentation`),pn.forEach(a),la.forEach(a),ln=u(tl),rs=l(tl,"LI",{});var na=r(rs);ze=l(na,"A",{href:!0,class:!0});var vn=r(ze);E(yt.$$.fragment,vn),nn=D(vn,`\r + Siteglide Portal`),vn.forEach(a),na.forEach(a),tl.forEach(a),el.forEach(a),this.h()},h(){t(b,"class","icon svelte-1t1yf9"),t(k,"class","svelte-1t1yf9"),t(p,"href","/database"),t(p,"class","svelte-1t1yf9"),t(me,"class","description svelte-1t1yf9"),t(ge,"class","label"),t(R,"title","More information"),t(R,"class","svelte-1t1yf9"),t(Ae,"class","svelte-1t1yf9"),t(Be,"class","label"),t(I,"title",ps=(s[1].header.includes("database")?"Unpin Database from":"Pin Database to")+" header menu"),t(I,"class","svelte-1t1yf9"),t(T,"class","svelte-1t1yf9"),t(ae,"class","actions svelte-1t1yf9"),t(v,"class","application svelte-1t1yf9"),A(v,"showDescription",s[0].includes("database")),t(Tt,"class","icon svelte-1t1yf9"),t(Je,"class","svelte-1t1yf9"),t(re,"href","/users"),t(re,"class","svelte-1t1yf9"),t(He,"class","description svelte-1t1yf9"),t(Fe,"class","label"),t(x,"title","More information"),t(x,"class","svelte-1t1yf9"),t(Pt,"class","svelte-1t1yf9"),t(Qe,"class","label"),t(j,"title",ms=(s[1].header.includes("users")?"Unpin Users from":"Pin Users to")+" header menu"),t(j,"class","svelte-1t1yf9"),t(qt,"class","svelte-1t1yf9"),t(be,"class","actions svelte-1t1yf9"),t(H,"class","application svelte-1t1yf9"),A(H,"showDescription",s[0].includes("users")),t(It,"class","icon svelte-1t1yf9"),t(Ve,"class","svelte-1t1yf9"),t(ie,"href","/logs"),t(ie,"class","svelte-1t1yf9"),t(Re,"class","description svelte-1t1yf9"),t(Ke,"class","label"),t(ee,"title","More information"),t(ee,"class","svelte-1t1yf9"),t(Dt,"class","svelte-1t1yf9"),t(We,"class","label"),t(K,"title",gs=(s[1].header.includes("logs")?"Unpin Logs from":"Pin Logs to")+" header menu"),t(K,"class","svelte-1t1yf9"),t(Nt,"class","svelte-1t1yf9"),t(Le,"class","actions svelte-1t1yf9"),t(O,"class","application svelte-1t1yf9"),A(O,"showDescription",s[0].includes("logs")),t(St,"class","icon svelte-1t1yf9"),t(Ye,"class","svelte-1t1yf9"),t(oe,"href","/backgroundJobs"),t(oe,"class","svelte-1t1yf9"),t(Ze,"class","description svelte-1t1yf9"),t(et,"class","label"),t(te,"title","More information"),t(te,"class","svelte-1t1yf9"),t(zt,"class","svelte-1t1yf9"),t(tt,"class","label"),t(W,"title",bs=(s[1].header.includes("backgroundJobs")?"Unpin Background Jobs from":"Pin Background Jobs to")+" header menu"),t(W,"class","svelte-1t1yf9"),t(At,"class","svelte-1t1yf9"),t(Ee,"class","actions svelte-1t1yf9"),t(F,"class","application svelte-1t1yf9"),A(F,"showDescription",s[0].includes("backgroundJobs")),t(Bt,"class","icon svelte-1t1yf9"),t(lt,"class","svelte-1t1yf9"),t(ce,"href","/constants"),t(ce,"class","svelte-1t1yf9"),t(nt,"class","description svelte-1t1yf9"),t(rt,"class","label"),t(se,"title","More information"),t(se,"class","svelte-1t1yf9"),t(Mt,"class","svelte-1t1yf9"),t(it,"class","label"),t(X,"title",Ls=(s[1].header.includes("constants")?"Unpin Constants from":"Pin Constants to")+" header menu"),t(X,"class","svelte-1t1yf9"),t(Jt,"class","svelte-1t1yf9"),t(we,"class","actions svelte-1t1yf9"),t(Q,"class","application svelte-1t1yf9"),A(Q,"showDescription",s[0].includes("constants")),t(d,"class","applications svelte-1t1yf9"),t(ot,"class","icon svelte-1t1yf9"),aa(ot,"color","#aeb0b3"),t(ut,"class","svelte-1t1yf9"),t(ue,"href",(typeof window<"u"&&window.location.port!=="4173"&&window.location.port!=="5173"?`http://localhost:${parseInt(window.location.port)}`:"http://localhost:3333")+"/gui/liquid"),t(ue,"class","svelte-1t1yf9"),t(ft,"class","description svelte-1t1yf9"),t(ht,"class","label"),t(le,"title","More information"),t(le,"class","svelte-1t1yf9"),t(Ht,"class","svelte-1t1yf9"),t(pt,"class","label"),t(Y,"title",Es=(s[1].header.includes("liquid")?"Unpin Liquid Evaluator from":"Pin Liquid Evaluator to")+" header menu"),t(Y,"class","svelte-1t1yf9"),t(Ot,"class","svelte-1t1yf9"),t(Pe,"class","actions svelte-1t1yf9"),t(G,"class","application svelte-1t1yf9"),A(G,"showDescription",s[0].includes("liquid")),t(vt,"class","icon svelte-1t1yf9"),aa(vt,"color","#f30e9c"),t(_t,"class","svelte-1t1yf9"),t(fe,"href",(typeof window<"u"&&window.location.port!=="4173"&&window.location.port!=="5173"?`http://localhost:${parseInt(window.location.port)}`:"http://localhost:3333")+"/gui/graphql"),t(fe,"class","svelte-1t1yf9"),t(gt,"class","description svelte-1t1yf9"),t(bt,"class","label"),t(ne,"title","More information"),t(ne,"class","svelte-1t1yf9"),t(Ft,"class","svelte-1t1yf9"),t(kt,"class","label"),t(Z,"title",ws=(s[1].header.includes("graphiql")?"Unpin GraphiQL from":"Pin GraphiQL to")+" header menu"),t(Z,"class","svelte-1t1yf9"),t(Qt,"class","svelte-1t1yf9"),t(Ie,"class","actions svelte-1t1yf9"),t(V,"class","application svelte-1t1yf9"),A(V,"showDescription",s[0].includes("graphiql")),t(Te,"class","applications svelte-1t1yf9"),t(c,"class","svelte-1t1yf9"),t(Se,"href","https://developers.siteglide.com"),t(Se,"class","button"),t(ze,"href","https://my.siteglide.com"),t(ze,"class","button"),t(Ne,"class","svelte-1t1yf9"),t(de,"class","svelte-1t1yf9")},m(i,h){Yt(i,$,h),Yt(i,c,h),e(c,d),e(d,v),e(v,p),e(p,b),y(P,b,null),e(p,B),e(p,k),e(v,ve),e(v,me),e(v,us),e(v,ae),e(ae,Ae),e(Ae,R),y(_e,R,null),e(R,fs),e(R,ge),e(ae,ds),e(ae,T),e(T,I),y($e,I,null),e(I,al),e(I,Be),e(Be,hs),e(Be,rl),e(d,il),e(d,H),e(H,re),e(re,Tt),y(Me,Tt,null),e(re,ol),e(re,Je),e(H,cl),e(H,He),e(H,ul),e(H,be),e(be,Pt),e(Pt,x),y(Oe,x,null),e(x,fl),e(x,Fe),e(be,dl),e(be,qt),e(qt,j),y(ke,j,null),e(j,hl),e(j,Qe),e(Qe,vs),e(Qe,pl),e(d,vl),e(d,O),e(O,ie),e(ie,It),y(Ge,It,null),e(ie,ml),e(ie,Ve),e(O,_l),e(O,Re),e(O,gl),e(O,Le),e(Le,Dt),e(Dt,ee),y(je,ee,null),e(ee,$l),e(ee,Ke),e(Le,bl),e(Le,Nt),e(Nt,K),y(ye,K,null),e(K,kl),e(K,We),e(We,_s),e(We,Ll),e(d,yl),e(d,F),e(F,oe),e(oe,St),y(Xe,St,null),e(oe,El),e(oe,Ye),e(F,Ul),e(F,Ze),e(F,wl),e(F,Ee),e(Ee,zt),e(zt,te),y(xe,te,null),e(te,Cl),e(te,et),e(Ee,Tl),e(Ee,At),e(At,W),y(Ue,W,null),e(W,Pl),e(W,tt),e(tt,$s),e(tt,ql),e(d,Il),e(d,Q),e(Q,ce),e(ce,Bt),y(st,Bt,null),e(ce,Dl),e(ce,lt),e(Q,Nl),e(Q,nt),e(Q,Sl),e(Q,we),e(we,Mt),e(Mt,se),y(at,se,null),e(se,zl),e(se,rt),e(we,Al),e(we,Jt),e(Jt,X),y(Ce,X,null),e(X,Bl),e(X,it),e(it,ks),e(it,Ml),e(c,Jl),e(c,Te),e(Te,G),e(G,ue),e(ue,ot),y(ct,ot,null),e(ue,Hl),e(ue,ut),e(G,Ol),e(G,ft),e(G,Fl),e(G,Pe),e(Pe,Ht),e(Ht,le),y(dt,le,null),e(le,Ql),e(le,ht),e(Pe,Gl),e(Pe,Ot),e(Ot,Y),y(qe,Y,null),e(Y,Vl),e(Y,pt),e(pt,ys),e(pt,Rl),e(Te,jl),e(Te,V),e(V,fe),e(fe,vt),y(mt,vt,null),e(fe,Kl),e(fe,_t),e(V,Wl),e(V,gt),e(V,Xl),e(V,Ie),e(Ie,Ft),e(Ft,ne),y($t,ne,null),e(ne,Yl),e(ne,bt),e(Ie,Zl),e(Ie,Qt),e(Qt,Z),y(De,Z,null),e(Z,xl),e(Z,kt),e(kt,Us),e(kt,en),Yt(i,Cs,h),Yt(i,de,h),e(de,Gt),M.block.m(Gt,M.anchor=null),M.mount=()=>Gt,M.anchor=null,e(de,tn),e(de,Ne),e(Ne,as),e(as,Se),y(Lt,Se,null),e(Se,sn),e(Ne,ln),e(Ne,rs),e(rs,ze),y(yt,ze,null),e(ze,nn),g=!0,an||(zn=[q(p,"focus",s[2],{once:!0}),q(p,"mouseover",s[2],{once:!0}),q(R,"click",s[7]),q(I,"click",s[8]),q(x,"click",s[9]),q(j,"click",s[10]),q(ee,"click",s[11]),q(K,"click",s[12]),q(te,"click",s[13]),q(W,"click",s[14]),q(se,"click",s[15]),q(X,"click",s[16]),q(le,"click",s[17]),q(Y,"click",s[18]),q(ne,"click",s[19]),q(Z,"click",s[20])],an=!0)},p(i,[h]){var wt;s=i,(!g||h&2)&&o!==(o="Siteglide"+((wt=s[1].online)!=null&&wt.MPKIT_URL?": "+s[1].online.MPKIT_URL.replace("https://",""):""))&&(document.title=o);const he={};h&2&&(he.icon=s[1].header.includes("database")?"pinFilled":"pin"),$e.$set(he),(!g||h&2)&&Zt!==(Zt=s[1].header.includes("database")?"Unpin Database from":"Pin Database to")&&Ct(hs,Zt),(!g||h&2&&ps!==(ps=(s[1].header.includes("database")?"Unpin Database from":"Pin Database to")+" header menu"))&&t(I,"title",ps),(!g||h&1)&&A(v,"showDescription",s[0].includes("database"));const J={};h&2&&(J.icon=s[1].header.includes("users")?"pinFilled":"pin"),ke.$set(J),(!g||h&2)&&xt!==(xt=s[1].header.includes("users")?"Unpin Users from":"Pin Users to")&&Ct(vs,xt),(!g||h&2&&ms!==(ms=(s[1].header.includes("users")?"Unpin Users from":"Pin Users to")+" header menu"))&&t(j,"title",ms),(!g||h&1)&&A(H,"showDescription",s[0].includes("users"));const pe={};h&2&&(pe.icon=s[1].header.includes("logs")?"pinFilled":"pin"),ye.$set(pe),(!g||h&2)&&es!==(es=s[1].header.includes("logs")?"Unpin Logs from":"Pin Logs to")&&Ct(_s,es),(!g||h&2&&gs!==(gs=(s[1].header.includes("logs")?"Unpin Logs from":"Pin Logs to")+" header menu"))&&t(K,"title",gs),(!g||h&1)&&A(O,"showDescription",s[0].includes("logs"));const Et={};h&2&&(Et.icon=s[1].header.includes("backgroundJobs")?"pinFilled":"pin"),Ue.$set(Et),(!g||h&2)&&ts!==(ts=s[1].header.includes("backgroundJobs")?"Unpin Background Jobs from":"Pin Background Jobs to")&&Ct($s,ts),(!g||h&2&&bs!==(bs=(s[1].header.includes("backgroundJobs")?"Unpin Background Jobs from":"Pin Background Jobs to")+" header menu"))&&t(W,"title",bs),(!g||h&1)&&A(F,"showDescription",s[0].includes("backgroundJobs"));const is={};h&2&&(is.icon=s[1].header.includes("constants")?"pinFilled":"pin"),Ce.$set(is),(!g||h&2)&&ss!==(ss=s[1].header.includes("constants")?"Unpin Constants from":"Pin Constants to")&&Ct(ks,ss),(!g||h&2&&Ls!==(Ls=(s[1].header.includes("constants")?"Unpin Constants from":"Pin Constants to")+" header menu"))&&t(X,"title",Ls),(!g||h&1)&&A(Q,"showDescription",s[0].includes("constants"));const Ut={};h&2&&(Ut.icon=s[1].header.includes("liquid")?"pinFilled":"pin"),qe.$set(Ut),(!g||h&2)&&ls!==(ls=s[1].header.includes("liquid")?"Unpin Liquid Evaluator from":"Pin Liquid Evaluator to")&&Ct(ys,ls),(!g||h&2&&Es!==(Es=(s[1].header.includes("liquid")?"Unpin Liquid Evaluator from":"Pin Liquid Evaluator to")+" header menu"))&&t(Y,"title",Es),(!g||h&1)&&A(G,"showDescription",s[0].includes("liquid"));const os={};h&2&&(os.icon=s[1].header.includes("graphiql")?"pinFilled":"pin"),De.$set(os),(!g||h&2)&&ns!==(ns=s[1].header.includes("graphiql")?"Unpin GraphiQL from":"Pin GraphiQL to")&&Ct(Us,ns),(!g||h&2&&ws!==(ws=(s[1].header.includes("graphiql")?"Unpin GraphiQL from":"Pin GraphiQL to")+" header menu"))&&t(Z,"title",ws),(!g||h&1)&&A(V,"showDescription",s[0].includes("graphiql")),Ea(M,s,h)},i(i){g||(m(P.$$.fragment,i),m(_e.$$.fragment,i),m($e.$$.fragment,i),m(Me.$$.fragment,i),m(Oe.$$.fragment,i),m(ke.$$.fragment,i),m(Ge.$$.fragment,i),m(je.$$.fragment,i),m(ye.$$.fragment,i),m(Xe.$$.fragment,i),m(xe.$$.fragment,i),m(Ue.$$.fragment,i),m(st.$$.fragment,i),m(at.$$.fragment,i),m(Ce.$$.fragment,i),m(ct.$$.fragment,i),m(dt.$$.fragment,i),m(qe.$$.fragment,i),m(mt.$$.fragment,i),m($t.$$.fragment,i),m(De.$$.fragment,i),m(M.block),m(Lt.$$.fragment,i),m(yt.$$.fragment,i),g=!0)},o(i){_(P.$$.fragment,i),_(_e.$$.fragment,i),_($e.$$.fragment,i),_(Me.$$.fragment,i),_(Oe.$$.fragment,i),_(ke.$$.fragment,i),_(Ge.$$.fragment,i),_(je.$$.fragment,i),_(ye.$$.fragment,i),_(Xe.$$.fragment,i),_(xe.$$.fragment,i),_(Ue.$$.fragment,i),_(st.$$.fragment,i),_(at.$$.fragment,i),_(Ce.$$.fragment,i),_(ct.$$.fragment,i),_(dt.$$.fragment,i),_(qe.$$.fragment,i),_(mt.$$.fragment,i),_($t.$$.fragment,i),_(De.$$.fragment,i);for(let h=0;h<3;h+=1){const he=M.blocks[h];_(he)}_(Lt.$$.fragment,i),_(yt.$$.fragment,i),g=!1},d(i){i&&(a($),a(c),a(Cs),a(de)),L(P),L(_e),L($e),L(Me),L(Oe),L(ke),L(Ge),L(je),L(ye),L(Xe),L(xe),L(Ue),L(st),L(at),L(Ce),L(ct),L(dt),L(qe),L(mt),L($t),L(De),M.block.d(),M.token=null,M=null,L(Lt),L(yt),an=!1,ma(zn)}}}function Pa(s,o,$){let c;ga(s,cs,T=>$(1,c=T));let d=[];const v=async()=>{c.tables.length||mn(cs,c.tables=await La.get(),c)},p=T=>{c.header.indexOf(T)>-1?mn(cs,c.header=c.header.filter(I=>I!==T),c):mn(cs,c.header=[...c.header,T],c),localStorage.header=JSON.stringify(c.header)},b=T=>{d.indexOf(T)>-1?$(0,d=d.filter(I=>I!==T)):$(0,d=[...d,T])};return[d,c,v,p,b,async()=>await(await fetch("https://registry.npmjs.org/@siteglide/siteglide-cli/latest")).json(),()=>{navigator.clipboard.writeText("npm i -g @siteglide/siteglide-cli@latest").then(()=>{cs.notification.create("info","
    Update command copied to clipboard Run npm i -g @siteglide/siteglide-cli@latest in the terminal
    ")}).catch(T=>{copying=!1,error=!0,console.error(T)})},()=>b("database"),()=>p("database"),()=>b("users"),()=>p("users"),()=>b("logs"),()=>p("logs"),()=>b("backgroundJobs"),()=>p("backgroundJobs"),()=>b("constants"),()=>p("constants"),()=>b("liquid"),()=>p("liquid"),()=>b("graphiql"),()=>p("graphiql")]}class Aa extends ba{constructor(o){super(),ka(this,o,Pa,Ta,va,{})}}export{Aa as component}; diff --git a/gui/next/build/_app/immutable/nodes/8.DxJ3_9M1.js b/gui/next/build/_app/immutable/nodes/8.DxJ3_9M1.js new file mode 100644 index 0000000..643565a --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/8.DxJ3_9M1.js @@ -0,0 +1 @@ +import{s}from"../chunks/Ul9VwQ7n.js";import{S as t,i as e}from"../chunks/Bh3MJlbi.js";class l extends t{constructor(o){super(),e(this,o,null,null,s,{})}}export{l as component}; diff --git a/gui/next/build/_app/immutable/nodes/9.DQ8eZK33.js b/gui/next/build/_app/immutable/nodes/9.DQ8eZK33.js new file mode 100644 index 0000000..ab74afa --- /dev/null +++ b/gui/next/build/_app/immutable/nodes/9.DQ8eZK33.js @@ -0,0 +1 @@ +import{s as se,l as ie,d,u as re,m as oe,o as ce,w as k,i as m,b as _,c as b,e as L,h as g,S as fe,G as ue,H as de,W as _e,p as me,z as I,g as w,j as D,k as pe,v as N,n as y,f as P,t as A,a as J}from"../chunks/Ul9VwQ7n.js";import{S as ae,i as ne,t as H,a as j,d as z,m as B,c as F,b as G,g as R,e as M}from"../chunks/Bh3MJlbi.js";import{p as he}from"../chunks/C5zjxmar.js";import{b as ve}from"../chunks/CIy9Z9Qf.js";import{A as be}from"../chunks/DntFPtNo.js";import{J as ge}from"../chunks/BVVGnpm8.js";function qe(f){let e,a,o,i,r,s;const l=f[3].default,t=ie(l,f,f[2],null);return{c(){e=g("template"),a=g("pre"),o=g("code"),t&&t.c(),this.h()},l(n){e=b(n,"TEMPLATE",{});var c=L(e.content);a=b(c,"PRE",{class:!0});var p=L(a);o=b(p,"CODE",{class:!0});var h=L(o);t&&t.l(h),h.forEach(d),p.forEach(d),c.forEach(d),this.h()},h(){k(o,"class",i="language-"+f[0]),k(a,"class",r="line-numbers language-"+f[0])},m(n,c){m(n,e,c),_(e.content,a),_(a,o),t&&t.m(o,null),f[4](e),s=!0},p(n,[c]){t&&t.p&&(!s||c&4)&&re(t,l,n,n[2],s?ce(l,n[2],c,null):oe(n[2]),null),(!s||c&1&&i!==(i="language-"+n[0]))&&k(o,"class",i),(!s||c&1&&r!==(r="line-numbers language-"+n[0]))&&k(a,"class",r)},i(n){s||(j(t,n),s=!0)},o(n){H(t,n),s=!1},d(n){n&&d(e),t&&t.d(n),f[4](null)}}}function ke(f,e,a){let{$$slots:o={},$$scope:i}=e,{language:r}=e,s;fe(async()=>{var n;await ue(),(n=document.querySelector("#code"))==null||n.remove();const t=s.content.cloneNode(!0);t.firstChild.id="code",s.after(t),Prism.highlightAll()});function l(t){de[t?"unshift":"push"](()=>{s=t,a(1,s)})}return f.$$set=t=>{"language"in t&&a(0,r=t.language),"$$scope"in t&&a(2,i=t.$$scope)},[r,s,i,o,l]}class Ce extends ae{constructor(e){super(),ne(this,e,ke,qe,se,{language:0})}}function $e(f){let e,a,o,i,r,s,l,t,n=f[1].source_name&&Q(f),c=f[1].id&&X(f),p=f[1].error_message&&x(f),h=f[1].liquid_body&&ee(f),$=f[1].partial_name&&te(f),q=f[1].arguments&&le(f);return{c(){e=g("dl"),n&&n.c(),a=N(),c&&c.c(),o=D(),p&&p.c(),i=D(),h&&h.c(),r=D(),$&&$.c(),s=D(),q&&q.c(),l=N(),this.h()},l(u){e=b(u,"DL",{class:!0});var v=L(e);n&&n.l(v),a=N(),c&&c.l(v),v.forEach(d),o=w(u),p&&p.l(u),i=w(u),h&&h.l(u),r=w(u),$&&$.l(u),s=w(u),q&&q.l(u),l=N(),this.h()},h(){k(e,"class","info svelte-7qclwq")},m(u,v){m(u,e,v),n&&n.m(e,null),_(e,a),c&&c.m(e,null),m(u,o,v),p&&p.m(u,v),m(u,i,v),h&&h.m(u,v),m(u,r,v),$&&$.m(u,v),m(u,s,v),q&&q.m(u,v),m(u,l,v),t=!0},p(u,v){u[1].source_name?n?n.p(u,v):(n=Q(u),n.c(),n.m(e,a)):n&&(n.d(1),n=null),u[1].id?c?c.p(u,v):(c=X(u),c.c(),c.m(e,null)):c&&(c.d(1),c=null),u[1].error_message?p?p.p(u,v):(p=x(u),p.c(),p.m(i.parentNode,i)):p&&(p.d(1),p=null),u[1].liquid_body?h?(h.p(u,v),v&2&&j(h,1)):(h=ee(u),h.c(),j(h,1),h.m(r.parentNode,r)):h&&(R(),H(h,1,1,()=>{h=null}),M()),u[1].partial_name?$?$.p(u,v):($=te(u),$.c(),$.m(s.parentNode,s)):$&&($.d(1),$=null),u[1].arguments?q?(q.p(u,v),v&2&&j(q,1)):(q=le(u),q.c(),j(q,1),q.m(l.parentNode,l)):q&&(R(),H(q,1,1,()=>{q=null}),M())},i(u){t||(j(h),j(q),t=!0)},o(u){H(h),H(q),t=!1},d(u){u&&(d(e),d(o),d(i),d(r),d(s),d(l)),n&&n.d(),c&&c.d(),p&&p.d(u),h&&h.d(u),$&&$.d(u),q&&q.d(u)}}}function we(f){let e;return{c(){e=A("There is no such background job")},l(a){e=P(a,"There is no such background job")},m(a,o){m(a,e,o)},p:y,i:y,o:y,d(a){a&&d(e)}}}function Q(f){let e,a,o="ID:",i,r,s=f[1].id+"",l,t;return{c(){e=g("div"),a=g("dt"),a.textContent=o,i=D(),r=g("dd"),l=A(s),t=D(),this.h()},l(n){e=b(n,"DIV",{class:!0});var c=L(e);a=b(c,"DT",{class:!0,"data-svelte-h":!0}),I(a)!=="svelte-179gw2t"&&(a.textContent=o),i=w(c),r=b(c,"DD",{});var p=L(r);l=P(p,s),p.forEach(d),t=w(c),c.forEach(d),this.h()},h(){k(a,"class","svelte-7qclwq"),k(e,"class","svelte-7qclwq")},m(n,c){m(n,e,c),_(e,a),_(e,i),_(e,r),_(r,l),_(e,t)},p(n,c){c&2&&s!==(s=n[1].id+"")&&J(l,s)},d(n){n&&d(e)}}}function X(f){let e,a,o="Created at:",i,r,s=new Date(f[1].created_at).toLocaleString()+"",l,t,n,c,p="Run at:",h,$,q=new Date(f[1].run_at).toLocaleString()+"",u,v,O,U,S=f[1].dead_at&&Y(f),T=f[1].arguments.url&&Z(f);return{c(){e=g("div"),a=g("dt"),a.textContent=o,i=D(),r=g("dd"),l=A(s),t=D(),n=g("div"),c=g("dt"),c.textContent=p,h=D(),$=g("dd"),u=A(q),v=D(),S&&S.c(),O=N(),T&&T.c(),U=N(),this.h()},l(C){e=b(C,"DIV",{class:!0});var E=L(e);a=b(E,"DT",{class:!0,"data-svelte-h":!0}),I(a)!=="svelte-psrdxl"&&(a.textContent=o),i=w(E),r=b(E,"DD",{});var W=L(r);l=P(W,s),W.forEach(d),t=w(E),E.forEach(d),n=b(C,"DIV",{class:!0});var V=L(n);c=b(V,"DT",{class:!0,"data-svelte-h":!0}),I(c)!=="svelte-u0lbhu"&&(c.textContent=p),h=w(V),$=b(V,"DD",{});var K=L($);u=P(K,q),K.forEach(d),v=w(V),V.forEach(d),S&&S.l(C),O=N(),T&&T.l(C),U=N(),this.h()},h(){k(a,"class","svelte-7qclwq"),k(e,"class","svelte-7qclwq"),k(c,"class","svelte-7qclwq"),k(n,"class","svelte-7qclwq")},m(C,E){m(C,e,E),_(e,a),_(e,i),_(e,r),_(r,l),_(e,t),m(C,n,E),_(n,c),_(n,h),_(n,$),_($,u),_(n,v),S&&S.m(C,E),m(C,O,E),T&&T.m(C,E),m(C,U,E)},p(C,E){E&2&&s!==(s=new Date(C[1].created_at).toLocaleString()+"")&&J(l,s),E&2&&q!==(q=new Date(C[1].run_at).toLocaleString()+"")&&J(u,q),C[1].dead_at?S?S.p(C,E):(S=Y(C),S.c(),S.m(O.parentNode,O)):S&&(S.d(1),S=null),C[1].arguments.url?T?T.p(C,E):(T=Z(C),T.c(),T.m(U.parentNode,U)):T&&(T.d(1),T=null)},d(C){C&&(d(e),d(n),d(O),d(U)),S&&S.d(C),T&&T.d(C)}}}function Y(f){let e,a,o="Dead at:",i,r,s=new Date(f[1].dead_at).toLocaleString()+"",l,t;return{c(){e=g("div"),a=g("dt"),a.textContent=o,i=D(),r=g("dd"),l=A(s),t=D(),this.h()},l(n){e=b(n,"DIV",{class:!0});var c=L(e);a=b(c,"DT",{class:!0,"data-svelte-h":!0}),I(a)!=="svelte-1gjx1j5"&&(a.textContent=o),i=w(c),r=b(c,"DD",{class:!0});var p=L(r);l=P(p,s),p.forEach(d),t=w(c),c.forEach(d),this.h()},h(){k(a,"class","svelte-7qclwq"),k(r,"class","error svelte-7qclwq"),k(e,"class","svelte-7qclwq")},m(n,c){m(n,e,c),_(e,a),_(e,i),_(e,r),_(r,l),_(e,t)},p(n,c){c&2&&s!==(s=new Date(n[1].dead_at).toLocaleString()+"")&&J(l,s)},d(n){n&&d(e)}}}function Z(f){let e,a,o="URL:",i,r,s=(f[1].arguments.context.location.href||"/")+"",l;return{c(){e=g("div"),a=g("dt"),a.textContent=o,i=D(),r=g("dd"),l=A(s),this.h()},l(t){e=b(t,"DIV",{class:!0});var n=L(e);a=b(n,"DT",{class:!0,"data-svelte-h":!0}),I(a)!=="svelte-vrqyfv"&&(a.textContent=o),i=w(n),r=b(n,"DD",{});var c=L(r);l=P(c,s),c.forEach(d),n.forEach(d),this.h()},h(){k(a,"class","svelte-7qclwq"),k(e,"class","svelte-7qclwq")},m(t,n){m(t,e,n),_(e,a),_(e,i),_(e,r),_(r,l)},p(t,n){n&2&&s!==(s=(t[1].arguments.context.location.href||"/")+"")&&J(l,s)},d(t){t&&d(e)}}}function x(f){let e,a="Error message",o,i,r=f[1].error_message+"",s;return{c(){e=g("h2"),e.textContent=a,o=D(),i=g("code"),s=A(r),this.h()},l(l){e=b(l,"H2",{class:!0,"data-svelte-h":!0}),I(e)!=="svelte-46lcxd"&&(e.textContent=a),o=w(l),i=b(l,"CODE",{class:!0});var t=L(i);s=P(t,r),t.forEach(d),this.h()},h(){k(e,"class","svelte-7qclwq"),k(i,"class","svelte-7qclwq")},m(l,t){m(l,e,t),m(l,o,t),m(l,i,t),_(i,s)},p(l,t){t&2&&r!==(r=l[1].error_message+"")&&J(s,r)},d(l){l&&(d(e),d(o),d(i))}}}function ee(f){let e,a="Background job code:",o,i,r;return i=new Ce({props:{language:"liquid",$$slots:{default:[De]},$$scope:{ctx:f}}}),{c(){e=g("h2"),e.textContent=a,o=D(),G(i.$$.fragment),this.h()},l(s){e=b(s,"H2",{class:!0,"data-svelte-h":!0}),I(e)!=="svelte-dymu4w"&&(e.textContent=a),o=w(s),F(i.$$.fragment,s),this.h()},h(){k(e,"class","svelte-7qclwq")},m(s,l){m(s,e,l),m(s,o,l),B(i,s,l),r=!0},p(s,l){const t={};l&10&&(t.$$scope={dirty:l,ctx:s}),i.$set(t)},i(s){r||(j(i.$$.fragment,s),r=!0)},o(s){H(i.$$.fragment,s),r=!1},d(s){s&&(d(e),d(o)),z(i,s)}}}function De(f){let e=f[1].liquid_body+"",a;return{c(){a=A(e)},l(o){a=P(o,e)},m(o,i){m(o,a,i)},p(o,i){i&2&&e!==(e=o[1].liquid_body+"")&&J(a,e)},d(o){o&&d(a)}}}function te(f){let e,a="Background function name:",o,i,r=f[1].partial_name+"",s;return{c(){e=g("h2"),e.textContent=a,o=D(),i=g("code"),s=A(r),this.h()},l(l){e=b(l,"H2",{class:!0,"data-svelte-h":!0}),I(e)!=="svelte-1qty0jf"&&(e.textContent=a),o=w(l),i=b(l,"CODE",{class:!0});var t=L(i);s=P(t,r),t.forEach(d),this.h()},h(){k(e,"class","svelte-7qclwq"),k(i,"class","svelte-7qclwq")},m(l,t){m(l,e,t),m(l,o,t),m(l,i,t),_(i,s)},p(l,t){t&2&&r!==(r=l[1].partial_name+"")&&J(s,r)},d(l){l&&(d(e),d(o),d(i))}}}function le(f){let e,a="Arguments",o,i,r,s;return r=new ge({props:{value:f[1].arguments,expandedLines:1,showFullLines:!0}}),{c(){e=g("h2"),e.textContent=a,o=D(),i=g("code"),G(r.$$.fragment),this.h()},l(l){e=b(l,"H2",{class:!0,"data-svelte-h":!0}),I(e)!=="svelte-h49jwy"&&(e.textContent=a),o=w(l),i=b(l,"CODE",{class:!0});var t=L(i);F(r.$$.fragment,t),t.forEach(d),this.h()},h(){k(e,"class","svelte-7qclwq"),k(i,"class","svelte-7qclwq")},m(l,t){m(l,e,t),m(l,o,t),m(l,i,t),B(r,i,null),s=!0},p(l,t){const n={};t&2&&(n.value=l[1].arguments),r.$set(n)},i(l){s||(j(r.$$.fragment,l),s=!0)},o(l){H(r.$$.fragment,l),s=!1},d(l){l&&(d(e),d(o),d(i)),z(r)}}}function Ee(f){let e,a,o,i;const r=[we,$e],s=[];function l(t,n){return t[1]===null?0:1}return e=l(f),a=s[e]=r[e](f),{c(){a.c(),o=N()},l(t){a.l(t),o=N()},m(t,n){s[e].m(t,n),m(t,o,n),i=!0},p(t,n){let c=e;e=l(t),e===c?s[e].p(t,n):(R(),H(s[c],1,1,()=>{s[c]=null}),M(),a=s[e],a?a.p(t,n):(a=s[e]=r[e](t),a.c()),j(a,1),a.m(o.parentNode,o))},i(t){i||(j(a),i=!0)},o(t){H(a),i=!1},d(t){t&&d(o),s[e].d(t)}}}function Le(f){let e,a="",o,i,r,s;return r=new be({props:{title:f[1].source_name||f[1].id||"Loading…",closeUrl:"/backgroundJobs?"+f[0].url.searchParams.toString(),$$slots:{default:[Ee]},$$scope:{ctx:f}}}),{c(){e=g("script"),e.innerHTML=a,i=D(),G(r.$$.fragment),this.h()},l(l){const t=me("svelte-1pgpgj4",document.head);e=b(t,"SCRIPT",{src:!0,"data-manual":!0,"data-svelte-h":!0}),I(e)!=="svelte-6mxszl"&&(e.innerHTML=a),t.forEach(d),i=w(l),F(r.$$.fragment,l),this.h()},h(){_e(e.src,o="/prism.js")||k(e,"src",o),k(e,"data-manual","")},m(l,t){_(document.head,e),m(l,i,t),B(r,l,t),s=!0},p(l,[t]){const n={};t&2&&(n.title=l[1].source_name||l[1].id||"Loading…"),t&1&&(n.closeUrl="/backgroundJobs?"+l[0].url.searchParams.toString()),t&10&&(n.$$scope={dirty:t,ctx:l}),r.$set(n)},i(l){s||(j(r.$$.fragment,l),s=!0)},o(l){H(r.$$.fragment,l),s=!1},d(l){l&&d(i),d(e),z(r,l)}}}function Se(f,e,a){let o;pe(f,he,s=>a(0,o=s));let i={};const r=async()=>{await ve.get({id:o.params.id,type:o.params.type.toUpperCase()}).then(s=>{s.results.length?a(1,i=s.results[0]):a(1,i=null)})};return f.$$.update=()=>{f.$$.dirty&1&&o.params.id&&r(o.params.id)},[o,i]}class Ae extends ae{constructor(e){super(),ne(this,e,Se,Le,se,{})}}export{Ae as component}; diff --git a/gui/next/build/_app/version.json b/gui/next/build/_app/version.json new file mode 100644 index 0000000..3b4a302 --- /dev/null +++ b/gui/next/build/_app/version.json @@ -0,0 +1 @@ +{"version":"1785837307558"} \ No newline at end of file diff --git a/gui/next/build/favicon.png b/gui/next/build/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..9fffb15c24546ca430e79b2b4fc71f9369178820 GIT binary patch literal 1548 zcmV+n2J`ueP)esbKb1`dne5V<-=be*5GQdz4qGY z?8`JA-s=B~KPCa&<-xUhIZo;TewRNtb*WI+fBubzj!`A5)j>m;qWD_`c)51tcscet zCWoDK9WOX8cPp_rr00qmXP=>AD~>xZzE~4yR3y zI*aS1xD%)IE`+zAP4hbCrC3s{xkYhJr%TDa(Zpp@DUpzng4xK!M59eS_w5vZeZAxw z!=EO=<~j&zaFrx4;2Xc>6@`rJClCOJhpnhGI7gs!s>ptR5j`&{ z)wLja=eq=6?Wk>a{$zvFGka9Xp+UytG<8n`>@{rr`I=hykJoAiks>)CjsPt~#oz$` zTTi)IM$k6=@?+!V=m8+{O#+`TF*D!qk|QKmhP>{i%mqTwN7`e`a8F|(xzVt__^@eb z;@*F?ShZcGSS4gZB^Zs_Ld;`V64mI*q;^b4qPx@cK3in(Rf#|b<5&Yg_McM}^1sZh zNklUg$eRHT#U%y;(IvJ&IoPr{N$=H>ESeljCPuX2&|@iIl6|09wq2-LzWrCw|N3)- z#Padpgo*Ru0AIQ0+OMkE)(o5tbKTHtoc+|JotWZHPiwMkjfuF;F_y5I&VQWxaV_aOX z)(N?V;BSO1R{~L#9QiCE@cA-BiZg1F@!1C413XUgh#<|sjDUA?0IA!jkyQ5d9H5=( z#mP?z09fdx2*90p3|h^H>KNjdg`9${Q>fp4`Mc*Q-Lc7&7Q&~-G^B0 zV6mWmRWaZ0DqCo0C)EWXlj^FAX2>OdnJNFVDgvSmX6KGg>LE3|H!f&6NWf+4u!s)@ zIN%tFKppr4WrA7=4q`Z8ce)R$x6qqlopD|5m4L*hT7s-$YJZs_KlaOX`Dc{C$ICL0 z(Vid(2Q$LPN6Xh7@`H@#lz>9s7WYB~EpJ+sp#1fes9Qq7v7l|9^`r>Ua(tO4EBu@& zclF~rnbV&$n8r9p&q*G#21euDKh}@SikahmR3Y5U0h<;t&#srm?HeR!dj`pI9@kUF zX!-an_~-r8{FSR+qd%p}^Ky>WF{K-nOBOp1JELKYcY#Dkv=_xDCeh8T;&zTj$KkNs z9OG$$&!{h`c`Fk5F0d1_c@9yu11y&L5`{QVF&8}EL%X{BFc;`_n!DPd-(=!4r!(?)wJh+>m!Vdr;s)B|vb_;?-2@tS|?Lu5OG~J0({Z?RP3!jY1G}zZI+e{RC z*x?a>WxzT?Nwomc+JBhkB#W z7uRn?rkQjlhAkE&Am+t?6NtR25*#(EVPH&y|JtkBW1Ug{(dL5>XtxSKtKK^C9R1eq yzGkIz%WzlPw*NH(csLdoWLX~HdrkZ2?f74#ixE> + + + + + + + + + + + + + + +
    + +
    + + diff --git a/gui/next/build/prism.js b/gui/next/build/prism.js new file mode 100644 index 0000000..382c1e2 --- /dev/null +++ b/gui/next/build/prism.js @@ -0,0 +1,254 @@ +/* PrismJS 1.29.0 +https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+liquid+markup-templating&plugins=line-numbers+normalize-whitespace */ +var _self='undefined'!=typeof window?window:'undefined'!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){ + var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){ + return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,'&').replace(/=g.reach);A+=w.value.length,w=w.next){ + var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){ + var P,L=1;if(y){ + if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){ + var I={cause:f+','+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach); + } + } + } + } + } + }function s(){ + var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0; + }function u(e,n,t){ + var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a; + }function c(e,n,t){ + for(var r=n.next,a=0;a'+i.content+''; + },!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener('message',(function(n){ + var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close(); + }),!1),a):a;var g=a.util.currentScript();function f(){ + a.manual||a.highlightAll(); + }if(g&&(a.filename=g.src,g.hasAttribute('data-manual')&&(a.manual=!0)),!a.manual){ + var h=document.readyState;'loading'===h||'interactive'===h&&g&&g.defer?document.addEventListener('DOMContentLoaded',f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16); + }return a; +}(_self);'undefined'!=typeof module&&module.exports&&(module.exports=Prism),'undefined'!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{'internal-subset':{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,'doctype-tag':/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},'special-attr':[],'attr-value':{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:'attr-equals'},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,'attr-name':{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:'named-entity'},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside['attr-value'].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside['internal-subset'].inside=Prism.languages.markup,Prism.hooks.add('wrap',(function(a){ + 'entity'===a.type&&(a.attributes.title=a.content.replace(/&/,'&')); +})),Object.defineProperty(Prism.languages.markup.tag,'addInlined',{value:function(a,e){ + var s={};s['language-'+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={'included-cdata':{pattern://i,inside:s}};t['language-'+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp('(<__[^>]*>)(?:))*\\]\\]>|(?!)'.replace(/__/g,(function(){ + return a; + })),'i'),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore('markup','cdata',n); +}}),Object.defineProperty(Prism.languages.markup.tag,'addAttribute',{value:function(a,e){ + Prism.languages.markup.tag.inside['special-attr'].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))",'i'),lookbehind:!0,inside:{'attr-name':/^[^\s=]+/,'attr-value':{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,'language-'+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:'attr-equals'},/"|'/]}}}}); +}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend('markup',{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(e){ + function n(e,n){ + return'___'+e.toUpperCase()+n+'___'; + }Object.defineProperties(e.languages['markup-templating']={},{buildPlaceholders:{value:function(t,a,r,o){ + if(t.language===a){ + var c=t.tokenStack=[];t.code=t.code.replace(r,(function(e){ + if('function'==typeof o&&!o(e))return e;for(var r,i=c.length;-1!==t.code.indexOf(r=n(a,i));)++i;return c[i]=e,r; + })),t.grammar=e.languages.markup; + } + }},tokenizePlaceholders:{value:function(t,a){ + if(t.language===a&&t.tokenStack){ + t.grammar=e.languages[a];var r=0,o=Object.keys(t.tokenStack);!function c(i){ + for(var u=0;u=o.length);u++){ + var g=i[u];if('string'==typeof g||g.content&&'string'==typeof g.content){ + var l=o[r],s=t.tokenStack[l],f='string'==typeof g?g:g.content,p=n(a,l),k=f.indexOf(p);if(k>-1){ + ++r;var m=f.substring(0,k),d=new e.Token(a,e.tokenize(s,t.grammar),'language-'+a,s),h=f.substring(k+p.length),v=[];m&&v.push.apply(v,c([m])),v.push(d),h&&v.push.apply(v,c([h])),'string'==typeof g?i.splice.apply(i,[u,1].concat(v)):g.content=v; + } + }else g.content&&c(g.content); + }return i; + }(t.tokens); + } + }}}); +}(Prism); +Prism.languages.liquid={comment:{pattern:/(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,lookbehind:!0},delimiter:{pattern:/^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,alias:'punctuation'},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,object:/\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,function:[{pattern:/(\|\s*)\w+/,lookbehind:!0,alias:'filter'},{pattern:/(\.\s*)(?:first|last|size)/,lookbehind:!0}],boolean:/\b(?:false|nil|true)\b/,range:{pattern:/\.\./,alias:'operator'},number:/\b\d+(?:\.\d+)?\b/,operator:/[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,punctuation:/[.,\[\]()]/,empty:{pattern:/\bempty\b/,alias:'keyword'}},Prism.hooks.add('before-tokenize',(function(e){ + var t=!1;Prism.languages['markup-templating'].buildPlaceholders(e,'liquid',/\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g,(function(e){ + var n=/^\{%-?\s*(\w+)/.exec(e);if(n){ + var i=n[1];if('raw'===i&&!t)return t=!0,!0;if('endraw'===i)return t=!1,!0; + }return!t; + })); +})),Prism.hooks.add('after-tokenize',(function(e){ + Prism.languages['markup-templating'].tokenizePlaceholders(e,'liquid'); +})); +!function(){ + if('undefined'!=typeof Prism&&'undefined'!=typeof document){ + var e='line-numbers',n=/\n(?!$)/g,t=Prism.plugins.lineNumbers={getLine:function(n,t){ + if('PRE'===n.tagName&&n.classList.contains(e)){ + var i=n.querySelector('.line-numbers-rows');if(i){ + var r=parseInt(n.getAttribute('data-start'),10)||1,s=r+(i.children.length-1);ts&&(t=s);var l=t-r;return i.children[l]; + } + } + },resize:function(e){ + r([e]); + },assumeViewportIndependence:!0},i=void 0;window.addEventListener('resize',(function(){ + t.assumeViewportIndependence&&i===window.innerWidth||(i=window.innerWidth,r(Array.prototype.slice.call(document.querySelectorAll('pre.line-numbers')))); + })),Prism.hooks.add('complete',(function(t){ + if(t.code){ + var i=t.element,s=i.parentNode;if(s&&/pre/i.test(s.nodeName)&&!i.querySelector('.line-numbers-rows')&&Prism.util.isActive(i,e)){ + i.classList.remove(e),s.classList.add(e);var l,o=t.code.match(n),a=o?o.length+1:1,u=new Array(a+1).join('');(l=document.createElement('span')).setAttribute('aria-hidden','true'),l.className='line-numbers-rows',l.innerHTML=u,s.hasAttribute('data-start')&&(s.style.counterReset='linenumber '+(parseInt(s.getAttribute('data-start'),10)-1)),t.element.appendChild(l),r([s]),Prism.hooks.run('line-numbers',t); + } + } + })),Prism.hooks.add('line-numbers',(function(e){ + e.plugins=e.plugins||{},e.plugins.lineNumbers=!0; + })); + }function r(e){ + if(0!=(e=e.filter((function(e){ + var n,t=(n=e,n?window.getComputedStyle?getComputedStyle(n):n.currentStyle||null:null)['white-space'];return'pre-wrap'===t||'pre-line'===t; + }))).length){ + var t=e.map((function(e){ + var t=e.querySelector('code'),i=e.querySelector('.line-numbers-rows');if(t&&i){ + var r=e.querySelector('.line-numbers-sizer'),s=t.textContent.split(n);r||((r=document.createElement('span')).className='line-numbers-sizer',t.appendChild(r)),r.innerHTML='0',r.style.display='block';var l=r.getBoundingClientRect().height;return r.innerHTML='',{element:e,lines:s,lineHeights:[],oneLinerHeight:l,sizer:r}; + } + })).filter(Boolean);t.forEach((function(e){ + var n=e.sizer,t=e.lines,i=e.lineHeights,r=e.oneLinerHeight;i[t.length-1]=void 0,t.forEach((function(e,t){ + if(e&&e.length>1){ + var s=n.appendChild(document.createElement('span'));s.style.display='block',s.textContent=e; + }else i[t]=r; + })); + })),t.forEach((function(e){ + for(var n=e.sizer,t=e.lineHeights,i=0,r=0;rt&&(o[l]='\n'+o[l],a=s); + }n[i]=o.join(''); + }return n.join('\n'); + }},'undefined'!=typeof module&&module.exports&&(module.exports=n),Prism.plugins.NormalizeWhitespace=new n({'remove-trailing':!0,'remove-indent':!0,'left-trim':!0,'right-trim':!0}),Prism.hooks.add('before-sanity-check',(function(e){ + var n=Prism.plugins.NormalizeWhitespace;if((!e.settings||!1!==e.settings['whitespace-normalization'])&&Prism.util.isActive(e.element,'whitespace-normalization',!0))if(e.element&&e.element.parentNode||!e.code){ + var r=e.element.parentNode;if(e.code&&r&&'pre'===r.nodeName.toLowerCase()){ + for(var i in null==e.settings&&(e.settings={}),t)if(Object.hasOwnProperty.call(t,i)){ + var o=t[i];if(r.hasAttribute('data-'+i))try{ + var a=JSON.parse(r.getAttribute('data-'+i)||'true');typeof a===o&&(e.settings[i]=a); + }catch(e){} + }for(var l=r.childNodes,s='',c='',u=!1,m=0;m=6.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@playwright/test": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz", + "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.57.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.3.tgz", + "integrity": "sha512-qyX8+93kK/7R5BEXPC2PjUt0+fS/VO2BVHjEHyIEWiYn88rcRBHmdLgoJjktBltgAf+NY7RfCGB1SoyKS/p9kg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.3.tgz", + "integrity": "sha512-6sHrL42bjt5dHQzJ12Q4vMKfN+kUnZ0atHHnv4V0Wd9JMTk7FDzSY35+7qbz3ypQYMBPANbpGK7JpnWNnhGt8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.3.tgz", + "integrity": "sha512-1ht2SpGIjEl2igJ9AbNpPIKzb1B5goXOcmtD0RFxnwNuMxqkR6AUaaErZz+4o+FKmzxcSNBOLrzsICZVNYa1Rw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.3.tgz", + "integrity": "sha512-FYZ4iVunXxtT+CZqQoPVwPhH7549e/Gy7PIRRtq4t5f/vt54pX6eG9ebttRH6QSH7r/zxAFA4EZGlQ0h0FvXiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.3.tgz", + "integrity": "sha512-M/mwDCJ4wLsIgyxv2Lj7Len+UMHd4zAXu4GQ2UaCdksStglWhP61U3uowkaYBQBhVoNpwx5Hputo8eSqM7K82Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.3.tgz", + "integrity": "sha512-5jZT2c7jBCrMegKYTYTpni8mg8y3uY8gzeq2ndFOANwNuC/xJbVAoGKR9LhMDA0H3nIhvaqUoBEuJoICBudFrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.3.tgz", + "integrity": "sha512-YeGUhkN1oA+iSPzzhEjVPS29YbViOr8s4lSsFaZKLHswgqP911xx25fPOyE9+khmN6W4VeM0aevbDp4kkEoHiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.3.tgz", + "integrity": "sha512-eo0iOIOvcAlWB3Z3eh8pVM8hZ0oVkK3AjEM9nSrkSug2l15qHzF3TOwT0747omI6+CJJvl7drwZepT+re6Fy/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.3.tgz", + "integrity": "sha512-DJay3ep76bKUDImmn//W5SvpjRN5LmK/ntWyeJs/dcnwiiHESd3N4uteK9FDLf0S0W8E6Y0sVRXpOCoQclQqNg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.3.tgz", + "integrity": "sha512-BKKWQkY2WgJ5MC/ayvIJTHjy0JUGb5efaHCUiG/39sSUvAYRBaO3+/EK0AZT1RF3pSj86O24GLLik9mAYu0IJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.3.tgz", + "integrity": "sha512-Q9nVlWtKAG7ISW80OiZGxTr6rYtyDSkauHUtvkQI6TNOJjFvpj4gcH+KaJihqYInnAzEEUetPQubRwHef4exVg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.3.tgz", + "integrity": "sha512-2H5LmhzrpC4fFRNwknzmmTvvyJPHwESoJgyReXeFoYYuIDfBhP29TEXOkCJE/KxHi27mj7wDUClNq78ue3QEBQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.3.tgz", + "integrity": "sha512-9S542V0ie9LCTznPYlvaeySwBeIEa7rDBgLHKZ5S9DBgcqdJYburabm8TqiqG6mrdTzfV5uttQRHcbKff9lWtA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.3.tgz", + "integrity": "sha512-ukxw+YH3XXpcezLgbJeasgxyTbdpnNAkrIlFGDl7t+pgCxZ89/6n1a+MxlY7CegU+nDgrgdqDelPRNQ/47zs0g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.3.tgz", + "integrity": "sha512-Iauw9UsTTvlF++FhghFJjqYxyXdggXsOqGpFBylaRopVpcbfyIIsNvkf9oGwfgIcf57z3m8+/oSYTo6HutBFNw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.3.tgz", + "integrity": "sha512-3OqKAHSEQXKdq9mQ4eajqUgNIK27VZPW3I26EP8miIzuKzCJ3aW3oEn2pzF+4/Hj/Moc0YDsOtBgT5bZ56/vcA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.3.tgz", + "integrity": "sha512-0CM8dSVzVIaqMcXIFej8zZrSFLnGrAE8qlNbbHfTw1EEPnFTg1U1ekI0JdzjPyzSfUsHWtodilQQG/RA55berA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.3.tgz", + "integrity": "sha512-+fgJE12FZMIgBaKIAGd45rxf+5ftcycANJRWk8Vz0NnMTM5rADPGuRFTYar+Mqs560xuART7XsX2lSACa1iOmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.3.tgz", + "integrity": "sha512-tMD7NnbAolWPzQlJQJjVFh/fNH3K/KnA7K8gv2dJWCwwnaK6DFCYST1QXYWfu5V0cDwarWC8Sf/cfMHniNq21A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.3.tgz", + "integrity": "sha512-u5KsqxOxjEeIbn7bUK1MPM34jrnPwjeqgyin4/N6e/KzXKfpE9Mi0nCxcQjaM9lLmPcHmn/xx1yOjgTMtu1jWQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.3.tgz", + "integrity": "sha512-vo54aXwjpTtsAnb3ca7Yxs9t2INZg7QdXN/7yaoG7nPGbOBXYXQY41Km+S1Ov26vzOAzLcAjmMdjyEqS1JkVhw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.3.tgz", + "integrity": "sha512-HI+PIVZ+m+9AgpnY3pt6rinUdRYrGHvmVdsNQ4odNqQ/eRF78DVpMR7mOq7nW06QxpczibwBmeQzB68wJ+4W4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.3.tgz", + "integrity": "sha512-vRByotbdMo3Wdi+8oC2nVxtc3RkkFKrGaok+a62AT8lz/YBuQjaVYAS5Zcs3tPzW43Vsf9J0wehJbUY5xRSekA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.3.tgz", + "integrity": "sha512-POZHq7UeuzMJljC5NjKi8vKMFN6/5EOqcX1yGntNLp7rUTpBAXQ1hW8kWPFxYLv07QMcNM75xqVLGPWQq6TKFA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.3.tgz", + "integrity": "sha512-aPFONczE4fUFKNXszdvnd2GqKEYQdV5oEsIbKPujJmWlCI9zEsv1Otig8RKK+X9bed9gFUN6LAeN4ZcNuu4zjg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.8.tgz", + "integrity": "sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/adapter-auto": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-3.3.1.tgz", + "integrity": "sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-meta-resolve": "^4.1.0" + }, + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/adapter-static": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz", + "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.50.0", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.50.0.tgz", + "integrity": "sha512-Hj8sR8O27p2zshFEIJzsvfhLzxga/hWw6tRLnBjMYw70m1aS9BSYCqAUtzDBjRREtX1EvLMYgaC0mYE3Hz4KWA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.1", + "cookie": "^0.6.0", + "devalue": "^5.6.2", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": "^5.3.3", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.2.tgz", + "integrity": "sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0", + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.10", + "svelte-hmr": "^0.16.0", + "vitefu": "^0.2.5" + }, + "engines": { + "node": "^18.0.0 || >=20" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz", + "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.0.0 || >=20" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.0" + } + }, + "node_modules/@types/autosize": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/autosize/-/autosize-4.0.3.tgz", + "integrity": "sha512-o0ZyU3ePp3+KRbhHsY4ogjc+ZQWgVN5h6j8BHW5RII4cFKi6PEKK9QPAcphJVkD0dGpyFnD3VRR0WMvHVjCv9w==", + "license": "MIT" + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/autosize": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/autosize/-/autosize-6.0.1.tgz", + "integrity": "sha512-f86EjiUKE6Xvczc4ioP1JBlWG7FKrE13qe/DxBCpe8GCipCq2nFw73aO8QEBKHfSbYGDN5eB9jXWKen7tspDqQ==", + "license": "MIT" + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/code-red": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", + "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@types/estree": "^1.0.1", + "acorn": "^8.10.0", + "estree-walker": "^3.0.3", + "periscopic": "^3.1.0" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/devalue": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.2.tgz", + "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/playwright": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", + "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.57.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", + "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.3.tgz", + "integrity": "sha512-y9yUpfQvetAjiDLtNMf1hL9NXchIJgWt6zIKeoB+tCd3npX08Eqfzg60V9DhIGVMtQ0AlMkFw5xa+AQ37zxnAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.55.3", + "@rollup/rollup-android-arm64": "4.55.3", + "@rollup/rollup-darwin-arm64": "4.55.3", + "@rollup/rollup-darwin-x64": "4.55.3", + "@rollup/rollup-freebsd-arm64": "4.55.3", + "@rollup/rollup-freebsd-x64": "4.55.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.3", + "@rollup/rollup-linux-arm-musleabihf": "4.55.3", + "@rollup/rollup-linux-arm64-gnu": "4.55.3", + "@rollup/rollup-linux-arm64-musl": "4.55.3", + "@rollup/rollup-linux-loong64-gnu": "4.55.3", + "@rollup/rollup-linux-loong64-musl": "4.55.3", + "@rollup/rollup-linux-ppc64-gnu": "4.55.3", + "@rollup/rollup-linux-ppc64-musl": "4.55.3", + "@rollup/rollup-linux-riscv64-gnu": "4.55.3", + "@rollup/rollup-linux-riscv64-musl": "4.55.3", + "@rollup/rollup-linux-s390x-gnu": "4.55.3", + "@rollup/rollup-linux-x64-gnu": "4.55.3", + "@rollup/rollup-linux-x64-musl": "4.55.3", + "@rollup/rollup-openbsd-x64": "4.55.3", + "@rollup/rollup-openharmony-arm64": "4.55.3", + "@rollup/rollup-win32-arm64-msvc": "4.55.3", + "@rollup/rollup-win32-ia32-msvc": "4.55.3", + "@rollup/rollup-win32-x64-gnu": "4.55.3", + "@rollup/rollup-win32-x64-msvc": "4.55.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "dev": true, + "license": "MIT" + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svelte": { + "version": "4.2.20", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.20.tgz", + "integrity": "sha512-eeEgGc2DtiUil5ANdtd8vPwt9AgaMdnuUFnPft9F5oMvU/FHu5IHFic+p1dR/UOB7XU2mX2yHW+NcTch4DCh5Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/estree": "^1.0.1", + "acorn": "^8.9.0", + "aria-query": "^5.3.0", + "axobject-query": "^4.0.0", + "code-red": "^1.0.3", + "css-tree": "^2.3.1", + "estree-walker": "^3.0.3", + "is-reference": "^3.0.1", + "locate-character": "^3.0.0", + "magic-string": "^0.30.4", + "periscopic": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/svelte-autosize": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/svelte-autosize/-/svelte-autosize-1.1.5.tgz", + "integrity": "sha512-whiND/GthFDG9Ansvil21qxmFhSMfuooVZPg40sbcLHYKR9srYhnfrP5qdw8MXHAm6DY9g5PawurOAWl34fK7g==", + "license": "MIT", + "dependencies": { + "@types/autosize": "^4.0.3", + "autosize": "*" + }, + "peerDependencies": { + "svelte": ">=3.0.0" + } + }, + "node_modules/svelte-hmr": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz", + "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.19.0 || ^4.0.0" + } + }, + "node_modules/svelte-json-tree": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/svelte-json-tree/-/svelte-json-tree-2.2.0.tgz", + "integrity": "sha512-zcfepTrJ6xhpdgRZEujmiFh+ainRw7HO4Bsoh8PMAsm7fkgUPtnrZi3An8tmCFY8jajYhMrauHsd1S1XTeuiCw==", + "license": "MIT", + "peerDependencies": { + "svelte": "^4.0.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vitefu": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + } + } +} diff --git a/gui/next/package.json b/gui/next/package.json new file mode 100644 index 0000000..22be143 --- /dev/null +++ b/gui/next/package.json @@ -0,0 +1,25 @@ +{ + "name": "admin-v2", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "test": "playwright test" + }, + "devDependencies": { + "@playwright/test": "1.57.0", + "@sveltejs/adapter-auto": "^3.3.1", + "@sveltejs/adapter-static": "^3.0.6", + "@sveltejs/kit": "^2.7.3", + "@sveltejs/vite-plugin-svelte": "^3.1.2", + "svelte": "^4.2.19", + "vite": "^5.4.10" + }, + "type": "module", + "dependencies": { + "svelte-autosize": "^1.1.0", + "svelte-json-tree": "^2.2.0" + } +} diff --git a/gui/next/playwright.config.js b/gui/next/playwright.config.js new file mode 100644 index 0000000..87cd44b --- /dev/null +++ b/gui/next/playwright.config.js @@ -0,0 +1,78 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * @see https://playwright.dev/docs/test-configuration + */ +export default defineConfig({ + testDir: './playwright', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 1 : 0, + workers: 6, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: 'http://localhost:4173/', + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + /* save screenshots when failed, only on CI */ + screenshot: process.env.CI ? 'only-on-failure' : 'off' + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] } + } + + // { + // name: 'firefox', + // use: { ...devices['Desktop Firefox'] }, + // }, + + // { + // name: 'webkit', + // use: { ...devices['Desktop Safari'] }, + // }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ] + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // url: 'http://127.0.0.1:3000', + // reuseExistingServer: !process.env.CI, + // }, +}); + diff --git a/gui/next/pnpm-lock.yaml b/gui/next/pnpm-lock.yaml new file mode 100644 index 0000000..037849d --- /dev/null +++ b/gui/next/pnpm-lock.yaml @@ -0,0 +1,960 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + svelte-autosize: + specifier: ^1.1.0 + version: 1.1.0 + svelte-json-tree: + specifier: ^2.2.0 + version: 2.2.0(svelte@4.2.19) + devDependencies: + '@playwright/test': + specifier: ^1.53.1 + version: 1.53.1 + '@sveltejs/adapter-auto': + specifier: ^3.3.1 + version: 3.3.1(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10))(svelte@4.2.19)(vite@5.4.10)) + '@sveltejs/adapter-static': + specifier: ^3.0.6 + version: 3.0.6(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10))(svelte@4.2.19)(vite@5.4.10)) + '@sveltejs/kit': + specifier: ^2.7.3 + version: 2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10))(svelte@4.2.19)(vite@5.4.10) + '@sveltejs/vite-plugin-svelte': + specifier: ^3.1.2 + version: 3.1.2(svelte@4.2.19)(vite@5.4.10) + svelte: + specifier: ^4.2.19 + version: 4.2.19 + vite: + specifier: ^5.4.10 + version: 5.4.10 + +packages: + + '@ampproject/remapping@2.2.1': + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.3': + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.1': + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.19': + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + + '@playwright/test@1.53.1': + resolution: {integrity: sha512-Z4c23LHV0muZ8hfv4jw6HngPJkbbtZxTkxPNIg7cJcTc9C28N/p2q7g3JZS2SiKBBHJ3uM1dgDye66bB7LEk5w==} + engines: {node: '>=18'} + hasBin: true + + '@polka/url@1.0.0-next.24': + resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} + + '@rollup/rollup-android-arm-eabi@4.24.0': + resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.24.0': + resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.24.0': + resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.24.0': + resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.24.0': + resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.24.0': + resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.24.0': + resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.24.0': + resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': + resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.24.0': + resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.24.0': + resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.24.0': + resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.24.0': + resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.24.0': + resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.24.0': + resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.24.0': + resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==} + cpu: [x64] + os: [win32] + + '@sveltejs/adapter-auto@3.3.1': + resolution: {integrity: sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==} + peerDependencies: + '@sveltejs/kit': ^2.0.0 + + '@sveltejs/adapter-static@3.0.6': + resolution: {integrity: sha512-MGJcesnJWj7FxDcB/GbrdYD3q24Uk0PIL4QIX149ku+hlJuj//nxUbb0HxUTpjkecWfHjVveSUnUaQWnPRXlpg==} + peerDependencies: + '@sveltejs/kit': ^2.0.0 + + '@sveltejs/kit@2.7.3': + resolution: {integrity: sha512-Vx7nq5MJ86I8qXYsVidC5PX6xm+uxt8DydvOdmJoyOK7LvGP18OFEG359yY+aa51t6pENvqZAMqAREQQx1OI2Q==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.3 + + '@sveltejs/vite-plugin-svelte-inspector@2.1.0': + resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} + engines: {node: ^18.0.0 || >=20} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^3.0.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.0 + + '@sveltejs/vite-plugin-svelte@3.1.2': + resolution: {integrity: sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==} + engines: {node: ^18.0.0 || >=20} + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.0 + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + autosize@6.0.1: + resolution: {integrity: sha512-f86EjiUKE6Xvczc4ioP1JBlWG7FKrE13qe/DxBCpe8GCipCq2nFw73aO8QEBKHfSbYGDN5eB9jXWKen7tspDqQ==} + + axobject-query@4.0.0: + resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + + code-red@1.0.4: + resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devalue@5.1.1: + resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esm-env@1.0.0: + resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + + playwright-core@1.53.1: + resolution: {integrity: sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.53.1: + resolution: {integrity: sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw==} + engines: {node: '>=18'} + hasBin: true + + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} + + rollup@4.24.0: + resolution: {integrity: sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + + sirv@3.0.0: + resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + engines: {node: '>=18'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + svelte-autosize@1.1.0: + resolution: {integrity: sha512-CPHq/K0ssrwuHBxFCCOtpWtXZwk4edjEIZ2mJT4KKzjSBq+CO9nOmstjpOh5TpoOf/4MtDcwAwnWmktqANjU6A==} + + svelte-hmr@0.16.0: + resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} + peerDependencies: + svelte: ^3.19.0 || ^4.0.0 + + svelte-json-tree@2.2.0: + resolution: {integrity: sha512-zcfepTrJ6xhpdgRZEujmiFh+ainRw7HO4Bsoh8PMAsm7fkgUPtnrZi3An8tmCFY8jajYhMrauHsd1S1XTeuiCw==} + peerDependencies: + svelte: ^4.0.0 + + svelte@4.2.19: + resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} + engines: {node: '>=16'} + + tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + vite@5.4.10: + resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitefu@0.2.5: + resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + +snapshots: + + '@ampproject/remapping@2.2.1': + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@jridgewell/gen-mapping@0.3.3': + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + + '@jridgewell/resolve-uri@3.1.1': {} + + '@jridgewell/set-array@1.1.2': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.19': + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@playwright/test@1.53.1': + dependencies: + playwright: 1.53.1 + + '@polka/url@1.0.0-next.24': {} + + '@rollup/rollup-android-arm-eabi@4.24.0': + optional: true + + '@rollup/rollup-android-arm64@4.24.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.24.0': + optional: true + + '@rollup/rollup-darwin-x64@4.24.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.24.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.24.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.24.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.24.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.24.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.24.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.24.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.24.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.24.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.24.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.24.0': + optional: true + + '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10))(svelte@4.2.19)(vite@5.4.10))': + dependencies: + '@sveltejs/kit': 2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10))(svelte@4.2.19)(vite@5.4.10) + import-meta-resolve: 4.1.0 + + '@sveltejs/adapter-static@3.0.6(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10))(svelte@4.2.19)(vite@5.4.10))': + dependencies: + '@sveltejs/kit': 2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10))(svelte@4.2.19)(vite@5.4.10) + + '@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10))(svelte@4.2.19)(vite@5.4.10)': + dependencies: + '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.10) + '@types/cookie': 0.6.0 + cookie: 0.6.0 + devalue: 5.1.1 + esm-env: 1.0.0 + import-meta-resolve: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.10 + mrmime: 2.0.0 + sade: 1.8.1 + set-cookie-parser: 2.6.0 + sirv: 3.0.0 + svelte: 4.2.19 + tiny-glob: 0.2.9 + vite: 5.4.10 + + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10))(svelte@4.2.19)(vite@5.4.10)': + dependencies: + '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.10) + debug: 4.3.4 + svelte: 4.2.19 + vite: 5.4.10 + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10)': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.10))(svelte@4.2.19)(vite@5.4.10) + debug: 4.3.4 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.10 + svelte: 4.2.19 + svelte-hmr: 0.16.0(svelte@4.2.19) + vite: 5.4.10 + vitefu: 0.2.5(vite@5.4.10) + transitivePeerDependencies: + - supports-color + + '@types/cookie@0.6.0': {} + + '@types/estree@1.0.5': {} + + '@types/estree@1.0.6': {} + + acorn@8.10.0: {} + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + autosize@6.0.1: {} + + axobject-query@4.0.0: + dependencies: + dequal: 2.0.3 + + code-red@1.0.4: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + '@types/estree': 1.0.5 + acorn: 8.10.0 + estree-walker: 3.0.3 + periscopic: 3.1.0 + + cookie@0.6.0: {} + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.0 + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + deepmerge@4.3.1: {} + + dequal@2.0.3: {} + + devalue@5.1.1: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esm-env@1.0.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + fsevents@2.3.2: + optional: true + + fsevents@2.3.3: + optional: true + + globalyzer@0.1.0: {} + + globrex@0.1.2: {} + + import-meta-resolve@4.1.0: {} + + is-reference@3.0.2: + dependencies: + '@types/estree': 1.0.5 + + kleur@4.1.5: {} + + locate-character@3.0.0: {} + + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + mdn-data@2.0.30: {} + + mri@1.2.0: {} + + mrmime@2.0.0: {} + + ms@2.1.2: {} + + nanoid@3.3.7: {} + + periscopic@3.1.0: + dependencies: + '@types/estree': 1.0.5 + estree-walker: 3.0.3 + is-reference: 3.0.2 + + picocolors@1.1.0: {} + + playwright-core@1.53.1: {} + + playwright@1.53.1: + dependencies: + playwright-core: 1.53.1 + optionalDependencies: + fsevents: 2.3.2 + + postcss@8.4.47: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.0 + source-map-js: 1.2.1 + + rollup@4.24.0: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.24.0 + '@rollup/rollup-android-arm64': 4.24.0 + '@rollup/rollup-darwin-arm64': 4.24.0 + '@rollup/rollup-darwin-x64': 4.24.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.24.0 + '@rollup/rollup-linux-arm-musleabihf': 4.24.0 + '@rollup/rollup-linux-arm64-gnu': 4.24.0 + '@rollup/rollup-linux-arm64-musl': 4.24.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.24.0 + '@rollup/rollup-linux-riscv64-gnu': 4.24.0 + '@rollup/rollup-linux-s390x-gnu': 4.24.0 + '@rollup/rollup-linux-x64-gnu': 4.24.0 + '@rollup/rollup-linux-x64-musl': 4.24.0 + '@rollup/rollup-win32-arm64-msvc': 4.24.0 + '@rollup/rollup-win32-ia32-msvc': 4.24.0 + '@rollup/rollup-win32-x64-msvc': 4.24.0 + fsevents: 2.3.3 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + set-cookie-parser@2.6.0: {} + + sirv@3.0.0: + dependencies: + '@polka/url': 1.0.0-next.24 + mrmime: 2.0.0 + totalist: 3.0.1 + + source-map-js@1.2.0: {} + + source-map-js@1.2.1: {} + + svelte-autosize@1.1.0: + dependencies: + autosize: 6.0.1 + + svelte-hmr@0.16.0(svelte@4.2.19): + dependencies: + svelte: 4.2.19 + + svelte-json-tree@2.2.0(svelte@4.2.19): + dependencies: + svelte: 4.2.19 + + svelte@4.2.19: + dependencies: + '@ampproject/remapping': 2.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + '@types/estree': 1.0.5 + acorn: 8.10.0 + aria-query: 5.3.0 + axobject-query: 4.0.0 + code-red: 1.0.4 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.10 + periscopic: 3.1.0 + + tiny-glob@0.2.9: + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + + totalist@3.0.1: {} + + vite@5.4.10: + dependencies: + esbuild: 0.21.5 + postcss: 8.4.47 + rollup: 4.24.0 + optionalDependencies: + fsevents: 2.3.3 + + vitefu@0.2.5(vite@5.4.10): + optionalDependencies: + vite: 5.4.10 diff --git a/gui/next/src/app.html b/gui/next/src/app.html new file mode 100644 index 0000000..df63da8 --- /dev/null +++ b/gui/next/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
    %sveltekit.body%
    + + diff --git a/gui/next/src/lib/api/backgroundJob.js b/gui/next/src/lib/api/backgroundJob.js new file mode 100644 index 0000000..da57157 --- /dev/null +++ b/gui/next/src/lib/api/backgroundJob.js @@ -0,0 +1,125 @@ +/* + handles operations on background jobs +*/ + +// imports +// ------------------------------------------------------------------------ +import { graphql } from '$lib/api/graphql'; + + + +const backgroundJob = { + + // purpose: downloads background jobs list from API + // arguments: filters to apply to query (object) + // returns: background jobs in json format (array of objects) + // ------------------------------------------------------------------------ + get: async (filters) => { + + let idFilter = ''; + if(filters?.id){ + idFilter = `id: { value: "${filters.id}" }`; + } + + let typeFilter = ''; + if(filters?.type){ + typeFilter = `type: ${filters.type}`; + } + + const query = ` + query { + admin_background_jobs( + per_page: 20, + page: ${filters?.page || 1} + filter: { + ${idFilter} + ${typeFilter} + } + ) { + has_next_page, + has_previous_page, + total_pages, + results { + id + arguments + attempts + created_at + dead_at + error + error_class + error_message + failed_at + form_configuration_name + form_name + id + label + liquid_body + partial_name + locked_at + queue + resource_id + resource_type + retry_at + run_at + source_name + source_type + started_at + updated_at + } + } + }`; + + return graphql({ query }, false).then(data => data.admin_background_jobs); + + }, + + + // purpose: deletes a planned background job + // arguments: id of the job to delete (string) + // ------------------------------------------------------------------------ + delete: async (args) => { + + let properties = Object.fromEntries(args.properties.entries()); + const id = properties.id; + + const query = ` + mutation { + admin_background_job_delete(id: "${id}") { + id + } + } + `; + + return graphql({ query }, false); + + }, + + + // purpose: runs the background job again + // arguments: id of the job to run (string) + // ------------------------------------------------------------------------ + retry: async (args) => { + + let properties = Object.fromEntries(args.properties.entries()); + const id = properties.id; + + const query = ` + mutation { + admin_background_job_retry(id: "${id}"){ + id + } + } + `; + + return graphql({ query }, false); + + } + + +}; + + + +// exports +// ------------------------------------------------------------------------ +export { backgroundJob }; diff --git a/gui/next/src/lib/api/constant.js b/gui/next/src/lib/api/constant.js new file mode 100644 index 0000000..13b730d --- /dev/null +++ b/gui/next/src/lib/api/constant.js @@ -0,0 +1,68 @@ +/* + operation on instance constants +*/ + + +// imports +// ------------------------------------------------------------------------ +import { graphql } from '$lib/api/graphql'; + + + +// purpose: gets constants from the instance +// returns: array of objects with contants (array) +// ------------------------------------------------------------------------ +const constant = { + + get: () => { + const query = ` + query { + constants( + per_page: 100 + ) { + results { + name, + value, + updated_at + } + } + }`; + + return graphql({ query }, false).then(data => data.constants.results); + }, + + edit: (data) => { + data = Object.fromEntries(data.entries()); + + const query = ` + mutation { + constant_set(name: "${data.name}", value: "${data.value}"){ + name, + value + } + }`; + + return graphql({ query }, false); + }, + + delete: (data) => { + data = Object.fromEntries(data.entries()); + + const query = ` + mutation { + constant_unset(name: "${data.name}"){ + name + } + } + `; + + return graphql({ query }, false); + } + +}; + + + +// exports +// ------------------------------------------------------------------------ +export { constant }; diff --git a/gui/next/src/lib/api/graphql.js b/gui/next/src/lib/api/graphql.js new file mode 100644 index 0000000..921d05a --- /dev/null +++ b/gui/next/src/lib/api/graphql.js @@ -0,0 +1,38 @@ +/* + an interface to call graphql queries against the instance +*/ + + + +// purpose: run a graphql query +// arguments: body of the query (string) +// returns: data returned from the database (object) +// ------------------------------------------------------------------------ +const graphql = (body) => { + // the URL to use to connect to the API, in development or preview mode we are using the default pos-cli gui serve port + const url = (typeof window !== 'undefined' && window.location.port !== '4173' && window.location.port !== '5173') ? `http://localhost:${parseInt(window.location.port)}/api/graph` : 'http://localhost:3333/api/graph'; + + return fetch(url, { + headers: { 'Content-Type': 'application/json' }, + method: 'POST', + body: JSON.stringify(body) + }) + .then((res) => res.json()) + .then((res) => { + if(res.errors) { + res.errors.forEach(error => { + console.log(body.query); + console.info(error); + }); + return res; + } + + return res && res.data; + }); +}; + + + +// exports +// ------------------------------------------------------------------------ +export { graphql }; diff --git a/gui/next/src/lib/api/logs.js b/gui/next/src/lib/api/logs.js new file mode 100644 index 0000000..d80ff26 --- /dev/null +++ b/gui/next/src/lib/api/logs.js @@ -0,0 +1,47 @@ +/* + handles downloading logs from API +*/ + + + +const logs = { + + // purpose: downloads logs from API + // arguments: object + // last - optional, the id of the last log downloaded + // returns: logs in json format + // ------------------------------------------------------------------------ + get: async (args) => { + // the URL to use to connect to the API, in development or preview mode we are using the default pos-cli gui serve port + const url = (typeof window !== 'undefined' && window.location.port !== '4173' && window.location.port !== '5173') ? `http://localhost:${parseInt(window.location.port)}/api/logs` : 'http://localhost:3333/api/logs'; + + const last = args.last ?? null; + + return fetch(`${url}?lastId=` + last) + .then(response => { + if(response.ok){ + return response.json(); + } + + return Promise.reject(response); + }) + .then(data => { + // add a timestamp to each log to know when was it downloaded + data.logs.forEach(log => { + log.downloaded_at = Date.now(); + }); + return data; + }) + .catch(error => { + return { error: error }; + }); + + } + +}; + + + +// exports +// ------------------------------------------------------------------------ +export { logs }; diff --git a/gui/next/src/lib/api/record.js b/gui/next/src/lib/api/record.js new file mode 100644 index 0000000..09c9aaa --- /dev/null +++ b/gui/next/src/lib/api/record.js @@ -0,0 +1,286 @@ +/* + operations on records +*/ + + +// imports +// ------------------------------------------------------------------------ +import { graphql } from '$lib/api/graphql'; +import { state } from '$lib/state'; +import { buildMutationIngredients, columnTypeToVariableType } from '$lib/helpers/buildMutationIngredients'; + + +// purpose: build the strings and objects needed to pass with GraphQL request to filter the properties +// arguments: list of properties to filter the data with (array of objects) that icludes: +// attribute_type, property, operation, value +// returns: GraphQL variables definitions, e.g. '($variable_name: String. $another_variable: Int)' (string) +// variables with their values to pass with the query, e.g. { variable_name: 'Variable value', another_variable: 5 } (object) +// filters used to filter properties in GraphQL requests, +// e.g. 'properties: [name: "variable_name", contains: $variable_value]' (string) +// ------------------------------------------------------------------------ +const buildQueryIngredients = (filters = []) => { + // graphql variables definition for the query (string) + let variablesDefinition = ''; + // variables passed with the query (object) + let variables = {}; + // filters passed with the query (string) + let propertiesFilter = ''; + // list of data types for variables in each operations, unmentioned are considered 'string' (object) + const operationsForType = { + string: ['array_contains', 'not_array_contains', 'contains', 'ends_with', 'not_contains', 'not_ends_with', 'not_starts_with', 'not_value', 'starts_with', 'value'], + int: ['value_int', 'not_value_int'], + float: ['not_value_float', 'value_float'], + bool: ['exists', 'not_value_boolean', 'value_boolean'], + range: ['range'], + array: ['value_array', 'not_value_array', 'value_in', 'not_value_in', 'array_overlaps', 'not_array_overlaps'] + }; + + // build the data for each applied filter + for(const filter of filters){ + + // if there is no value, don't output filter string for that filter which effectively clears it + if(!filter.minFilterValue && !filter.maxFilterValue && !filter.value){ + break; + } + + // storing the type for current filter + let filterType = ''; + // we are getting each filter value as a string, so it needs to be parsed for graphql request + let parsedFilterValue = ''; + + if(operationsForType.int.includes(filter.operation)){ + filterType = 'integer'; + parsedFilterValue = parseInt(filter.value); + } else if (operationsForType.float.includes(filter.operation)){ + filterType = 'float'; + parsedFilterValue = parseFloat(filter.value); + } else if (operationsForType.bool.includes(filter.operation)){ + filterType = 'boolean'; + parsedFilterValue = filter.value === 'true' ? true : false; + } else if(operationsForType.range.includes(filter.operation)){ + filterType = 'range'; + parsedFilterValue = {}; + parsedFilterValue[filter.minFilter] = filter.minFilterValue; + parsedFilterValue[filter.maxFilter] = filter.maxFilterValue; + } else if(operationsForType.array.includes(filter.operation)){ + filterType = 'array'; + parsedFilterValue = JSON.parse(filter.value); + } else { + filterType = 'string'; + parsedFilterValue = filter.value; + } + + // skipping the ID as it is not filtered as a property + if(filter.name !== 'id'){ + // add current filter variable to variables definition string + variablesDefinition += `, $${filter.name}: ${columnTypeToVariableType[filterType] || 'String'}`; + + // add the current filter to the variables object passed with the request (corresponding with variables definition) + variables[filter.name] = parsedFilterValue; + + // add current filter to properties filters string passed in GraphQL request + propertiesFilter += `{ + name: "${filter.name}", + ${filter.operation}: $${filter.name} + }`; + } + + }; + + // build the final variables definition string with all the needed variables and their types + if(variablesDefinition.length){ + variablesDefinition = variablesDefinition.slice(2); // remove first comma ', ' + variablesDefinition = `(${variablesDefinition})`; // add brackets to definition string + } + + // build final string for filtering the properties + propertiesFilter = ` + properties: [${propertiesFilter}] + `; + + return { variablesDefinition, variables, propertiesFilter }; +}; + + +const record = { + + // purpose: gets records from the database for fiven table id + // arguments: (object) + // id of the table that you need the records for (int) + // filters to the graphql query (object) + // if you want to get also the deleted items (bool) + // returns: array of records as they appear in the database (array) + // ------------------------------------------------------------------------ + get: (args) => { + + const defaults = { + deleted: false, + filters: { + page: 1 + } + }; + const params = {...defaults, ...args}; + + const tableFilter = params.table ? `table_id: { value: ${params.table} }` : ''; + + const idFilterIndex = params.filters?.attributes?.findIndex(attribute => attribute.name === 'id'); + let idFilter = ''; + if(idFilterIndex >= 0 && params.filters.attributes[idFilterIndex].value){ + idFilter = `id: { ${params.filters.attributes[idFilterIndex].operation}: ${params.filters.attributes[idFilterIndex].value} }`; + } + + let sort = ''; + if(params.sort){ + if(params.sort.by === 'id' || params.sort.by === 'created_at' || params.sort.by === 'updated_at'){ + sort = `${params.sort.by}: { order: ${params.sort.order} }`; + } else { + sort = `properties: { name: "${params.sort.by}", order: ${params.sort.order} }`; + } + } else { + sort = 'created_at: { order: DESC }'; + } + + const deletedFilter = params.deleted === 'true' ? 'deleted_at: { exists: true }' : ''; + + const propertiesFilterData = buildQueryIngredients(params.filters?.attributes); + + const query = ` + query${propertiesFilterData.variablesDefinition} { + records( + page: ${params.filters.page} + per_page: 20, + sort: { ${sort} }, + filter: { + ${tableFilter} + ${idFilter} + ${deletedFilter} + ${propertiesFilterData.propertiesFilter} + } + ) { + current_page + total_pages + results { + id + created_at + updated_at + deleted_at + properties + } + } + }`; + + return graphql({ query, variables: propertiesFilterData.variables }).then(data => { + state.data('records', data.records); + }); + }, + + + // purpose: creates new record in the database + // arguments: + // returns: id of the newly created record (int) + // ------------------------------------------------------------------------ + create: (args) => { + const formDataEntries = Object.fromEntries(args.properties.entries()); + const table = formDataEntries.tableName; + const ingredients = buildMutationIngredients(args.properties); + + const query = ` + mutation${ingredients.variablesDefinition} { + record_create(record: { + table: "${table}", + properties: [${ingredients.properties}] + }) { + id + } + }`; + + return graphql({ query, variables: ingredients.variables }); + }, + + + // purpose: edits record in the database + // arguments: (object) + // tableName (string) - name of the table that you are adding the record in + // id (int) - id of the record to edit + // properties (FormData) - key-value pairs for the record + // returns: id of the edited record (int) + // ------------------------------------------------------------------------ + edit: (args) => { + let formDataEntries = Object.fromEntries(args.properties.entries()); + const table = formDataEntries.tableName; + const id = formDataEntries.recordId; + const ingredients = buildMutationIngredients(args.properties); + + const query = ` + mutation${ingredients.variablesDefinition} { + record_update( + id: ${id}, + record: { + table: "${table}" + properties: [${ingredients.properties}] + } + ) { + id + } + }`; + + return graphql({ query, variables: ingredients.variables }); + }, + + + // purpose: deletes record in the database + // arguments: (object) + // tableName (string) - name of the table that you are deleting the record from + // id (int) - id of the record to delete + // returns: id of the deleted record (int) + // ------------------------------------------------------------------------ + delete: (args) => { + let properties = Object.fromEntries(args.properties.entries()); + const table = properties.tableName; + const id = properties.recordId; + + const query = ` + mutation { + record_delete(table: "${table}", id: ${id}) { + id + } + }`; + + return graphql({ query }); + }, + + + // purpose: restores record from the deleted state back to the fresh + // arguments: (object) + // tableName (string) - name of the table that you are deleting the record from + // id (int) - id of the record to delete + // returns: id of the deleted record (int) + // ------------------------------------------------------------------------ + restore: (args) => { + let properties = Object.fromEntries(args.properties.entries()); + const table = properties.tableName; + const id = properties.recordId; + + const query = ` + mutation { + record_update( + id: ${id}, + record: { + table: "${table}", + deleted_at: null + } + ) { + id + } + }`; + + return graphql({ query }); + } + +}; + + + +// exports +// ------------------------------------------------------------------------ +export { record }; diff --git a/gui/next/src/lib/api/table.js b/gui/next/src/lib/api/table.js new file mode 100644 index 0000000..5114ab8 --- /dev/null +++ b/gui/next/src/lib/api/table.js @@ -0,0 +1,50 @@ +/* + gets tables from the database +*/ + + +// imports +// ------------------------------------------------------------------------ +import { graphql } from '$lib/api/graphql'; + + + +// purpose: gets table(s) from the database +// arguments: id of the table information you need (string, optional) +// returns: array of tables as they appear in the database (array) +// ------------------------------------------------------------------------ +const table = { + get: (id) => { + const query = ` + query( + $per_page: Int + $id: ID + ) { + admin_tables( + per_page: $per_page + filter: { + id: { value: $id } + } + ) { + results { + id + name + properties { + name + attribute_type + } + } + } + }`; + + const variables = { per_page: 100, id: id }; + + return graphql({ query, variables }).then(data => data.admin_tables.results); + } +}; + + + +// exports +// ------------------------------------------------------------------------ +export { table }; diff --git a/gui/next/src/lib/api/user.js b/gui/next/src/lib/api/user.js new file mode 100644 index 0000000..cc9f546 --- /dev/null +++ b/gui/next/src/lib/api/user.js @@ -0,0 +1,150 @@ +/* + handles managing users +*/ + + +// imports +// ------------------------------------------------------------------------ +import { graphql } from '$lib/api/graphql'; +import { buildMutationIngredients } from '$lib/helpers/buildMutationIngredients'; + +const user = { + + // purpose: gets users from the database + // arguments: properties to filter (object) + // id of the user (int) + // email (string) + // first_name (string) + // last_name (string) + // page (int) + // returns: array of users as they appear in the database (array of objects) + // ------------------------------------------------------------------------ + get: async (filters = {}) => { + let filtersString = ''; + let details = ''; + + if(filters.value){ + if(filters.attribute === 'email'){ + filtersString += `${filters.attribute}: { contains: "${filters.value}" }`; + } else { + filtersString += `${filters.attribute}: { value: "${filters.value}" }`; + } + + if(filters?.attribute === 'id' && filters?.value){ + details = ` + deleted_at + created_at + external_id + jwt_token + temporary_token + name + first_name + middle_name + last_name + slug + language + `; + } + } + + const query = ` + query { + users( + page: ${filters?.page ?? 1} + per_page: 50 + sort: { id: { order: DESC } } + filter: { + ${filtersString} + } + ) { + current_page + total_pages + results { + id + email + ${details} + properties + } + } + }`; + + return graphql({ query }, false).then(data => data.users ); + }, + + // purpose: delete users from the database + // arguments: + // id of the user (int) + // ------------------------------------------------------------------------ + delete: async (id) => { + const query = ` + mutation { + user_delete(id: ${id}){ id } + } + `; + + return graphql({ query }, false); + }, + + // purpose: creates a new user + // arguments: + // properties: object containing first_name, last_name, properties + // returns: id of the new user + // ------------------------------------------------------------------------ + create: async (email, password, properties) => { + const ingredients = buildMutationIngredients(properties); + const userQuery = ` + mutation${ingredients.variablesDefinition} { + user: user_create(user: { email: "${email}", password: "${password}", properties: [${ingredients.properties}] }) { + id + } + } + `; + + return graphql({ query: userQuery, variables: ingredients.variables }, false); + }, + + // purpose: edits a user + // arguments: + // id: id of the user to modify + // email: email of the user + // properties: object containing additional custom properties + // returns: id of the new user + // ------------------------------------------------------------------------ + edit: async (id, email, properties) => { + const ingredients = buildMutationIngredients(properties); + const userQuery = ` + mutation${ingredients.variablesDefinition} { + user_update(user: { email: "${email}", properties: [${ingredients.properties}] }, id: ${id}) { + id + } + } + `; + + return graphql({ query: userQuery, variables: ingredients.variables }, false); + }, + + // purpose: returns custom properies of the user schema + // arguments: + // returns: list of properties + // ------------------------------------------------------------------------ + getCustomProperties: async () => { + const propertiesQuery = ` + query { + admin_user_schema { + properties { + attribute_type + name + } + } + } + `; + + return graphql({ query: propertiesQuery }, false).then(data => data.admin_user_schema.properties); + } +}; + + + +// exports +// ------------------------------------------------------------------------ +export { user }; diff --git a/gui/next/src/lib/backgroundJob/Delete.svelte b/gui/next/src/lib/backgroundJob/Delete.svelte new file mode 100644 index 0000000..88d9189 --- /dev/null +++ b/gui/next/src/lib/backgroundJob/Delete.svelte @@ -0,0 +1,61 @@ + + + + + + + + + + +
    + + +
    diff --git a/gui/next/src/lib/backgroundJob/Retry.svelte b/gui/next/src/lib/backgroundJob/Retry.svelte new file mode 100644 index 0000000..ebc1b92 --- /dev/null +++ b/gui/next/src/lib/backgroundJob/Retry.svelte @@ -0,0 +1,45 @@ + + + + + + +
    + + +
    diff --git a/gui/next/src/lib/database/ContextMenu.svelte b/gui/next/src/lib/database/ContextMenu.svelte new file mode 100644 index 0000000..fb6b40d --- /dev/null +++ b/gui/next/src/lib/database/ContextMenu.svelte @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + dispatch('close')}> +
      +
    • + +
    • +
    • + {#if $state.filters.deleted === 'true'} + dispatch('close')} /> + {:else} + dispatch('close')} /> + {/if} +
    • +
    +
    diff --git a/gui/next/src/lib/database/Create.svelte b/gui/next/src/lib/database/Create.svelte new file mode 100644 index 0000000..cfd8f87 --- /dev/null +++ b/gui/next/src/lib/database/Create.svelte @@ -0,0 +1,338 @@ + + + + + + + + + + + + +
    + +
    + + + {#if editing.id} + + {/if} + + {#each properties as property} + {@const value = editing.properties ? parseValue(editing.properties[property.name], property.attribute_type) : {type: property.attribute_type, value: ''}} +
    + + + +
    + {#if property.attribute_type === 'boolean'} + + {:else} + + {/if} +
    + {#if validation[property.name]} + {validation[property.name].message} + {/if} +
    +
    +
    + {/each} + + + +
    + +
    + +
    diff --git a/gui/next/src/lib/database/Delete.svelte b/gui/next/src/lib/database/Delete.svelte new file mode 100644 index 0000000..86e7ba6 --- /dev/null +++ b/gui/next/src/lib/database/Delete.svelte @@ -0,0 +1,66 @@ + + + + + + + + + + +
    + + + +
    diff --git a/gui/next/src/lib/database/Filters.svelte b/gui/next/src/lib/database/Filters.svelte new file mode 100644 index 0000000..5507ccb --- /dev/null +++ b/gui/next/src/lib/database/Filters.svelte @@ -0,0 +1,163 @@ + + + + + + + + + + +
    + + {#if $state.table?.properties} + + {#each $state.filters.attributes as attribute} +
    + + + + + + + + {#if operations[attribute.attribute_type]} + + + + {#if attribute.operation === 'exists'} + + {:else if attribute.operation === 'range'} + + + + + {:else} + + {/if} + + + + {:else} + + Unknow property type: {attribute.attribute_type} + + {/if} + +
    + {/each} + + {/if} + +
    diff --git a/gui/next/src/lib/database/Restore.svelte b/gui/next/src/lib/database/Restore.svelte new file mode 100644 index 0000000..78b2624 --- /dev/null +++ b/gui/next/src/lib/database/Restore.svelte @@ -0,0 +1,51 @@ + + + + + + +
    + + + +
    diff --git a/gui/next/src/lib/database/Sort.svelte b/gui/next/src/lib/database/Sort.svelte new file mode 100644 index 0000000..ae8dc5e --- /dev/null +++ b/gui/next/src/lib/database/Sort.svelte @@ -0,0 +1,110 @@ + + + + + + + + + + +
    + + {#if $state.table?.properties} + + + + + + + + {/if} + +
    diff --git a/gui/next/src/lib/database/Table.svelte b/gui/next/src/lib/database/Table.svelte new file mode 100644 index 0000000..bdca2e4 --- /dev/null +++ b/gui/next/src/lib/database/Table.svelte @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + +{#if $state.table?.properties} + + + + + {#each $state.table.properties as property} + + {/each} + + + {#if $state.filters.deleted === 'true'} + + {/if} + + + {#if $state.records?.results?.length} + {#each $state.records?.results as record (record.id)} + + + {#each $state.table.properties as property} + {@const value = parseValue(record.properties[property.name], property.attribute_type)} + + {/each} + + + {#if $state.filters.deleted === 'true'} + + {/if} + + {/each} + {/if} +
    id{property.name} ({property.attribute_type})created atupdated atdeleted at
    +
    +
    + + +
    + {#if contextMenu.id === record.id} + contextMenu.id = null} /> + {/if} + {record.id} +
    +
    + {#if value.value !== undefined} + {#if value.type === 'json' || value.type === 'jsonEscaped'} + {#if $state.view.tableStyle === 'expanded'} + + {:else} + {JSON.stringify(value.value)} + {/if} + {:else} + {value.value} + {/if} + {/if} + + {(new Date(record?.created_at)).toLocaleDateString(undefined, {})} + {(new Date(record?.created_at)).toLocaleTimeString(undefined, {})} + + {(new Date(record?.updated_at)).toLocaleDateString(undefined, {})} + {(new Date(record?.updated_at)).toLocaleTimeString(undefined, {})} + + {(new Date(record?.deleted_at)).toLocaleDateString(undefined, {})} + {(new Date(record?.deleted_at)).toLocaleTimeString(undefined, {})} +
    +{/if} diff --git a/gui/next/src/lib/database/Tables.svelte b/gui/next/src/lib/database/Tables.svelte new file mode 100644 index 0000000..671bed6 --- /dev/null +++ b/gui/next/src/lib/database/Tables.svelte @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + diff --git a/gui/next/src/lib/diagnostics.js b/gui/next/src/lib/diagnostics.js new file mode 100644 index 0000000..a2030b0 --- /dev/null +++ b/gui/next/src/lib/diagnostics.js @@ -0,0 +1,33 @@ +/* + Helpers for the structured Liquid diagnostic (the `data` payload the backend + attaches to a log entry, TASK-18.2). Mirrors lib/diagnostics.js used by the CLI. + + A log entry's `data` can be one of: + - a structured diagnostic: { schema_version: 1, type, message, stack, context, + source_span, timestamp }. `stack` is an array of { path, line } frames, + innermost-first (stack[0] is the error location). + - the legacy {% log %} context hash: { url, page, partial, user } + - absent (historical entries) + + Consumers must tolerate all three and degrade gracefully. +*/ + +const SUPPORTED_SCHEMA_VERSION = 1; + +const isStructuredDiagnostic = (data) => + !!data && typeof data === 'object' && data.schema_version === SUPPORTED_SCHEMA_VERSION; + +// The type label shown for a log entry: an error's class (data.type), else the +// log's own type (error_type, e.g. 'yo'/'info'/'error'), else a generic 'Log'. +const displayType = (log) => (log && log.data && log.data.type) || (log && log.error_type) || 'Log'; + +// "path:line", "path", "line N", or null — a single stack frame's label. +const frameLabel = (frame) => { + if (!frame) return null; + if (typeof frame === 'string') return frame; // tolerate legacy string frames + if (frame.path) return frame.line != null ? `${frame.path}:${frame.line}` : `${frame.path}`; + if (frame.line != null) return `line ${frame.line}`; + return null; +}; + +export { isStructuredDiagnostic, displayType, frameLabel, SUPPORTED_SCHEMA_VERSION }; diff --git a/gui/next/src/lib/helpers/buildMutationIngredients.js b/gui/next/src/lib/helpers/buildMutationIngredients.js new file mode 100644 index 0000000..365a078 --- /dev/null +++ b/gui/next/src/lib/helpers/buildMutationIngredients.js @@ -0,0 +1,114 @@ + +// purpose: maps column types to corresponding property type used in GraphQL string +// ------------------------------------------------------------------------ +export const columnTypeToPropertyType = { + array: 'value_array', + boolean: 'value_boolean', + date: 'value', + datetime: 'value', + float: 'value_float', + integer: 'value_int', + string: 'value', + text: 'value', + upload: 'value', + json: 'value_json' +}; + + +// purpose: maps column types to corresponding variable type used in GraphQL variables definition +// ------------------------------------------------------------------------ +export const columnTypeToVariableType = { + string: 'String', + integer: 'Int', + float: 'Float', + boolean: 'Boolean', + array: '[String!]', + json: 'JSONPayload', + range: 'RangeFilter' +}; + +// purpose: builds all the needed data to build and trigger GraphQL mutation +// arguments: FormData object with the column, type and value (column[value], column[type]) +// returns: variablesDefinition (string) - GraphQL variables definitions $variable: Type +// variables (object) - values for defined variables passed to GraphQL API +// properties (string) - list of GraphQL properties for given variables to use inside "properties: []" +// ------------------------------------------------------------------------ +export const buildMutationIngredients = (formData) => { + + // entries from the form (object) + const formEntries = formData.entries(); + // graphql variables definition for the query (string) + let variablesDefinition = ''; + // variables passed with the query (object) + let variables = {}; + // properties list with variables as their value passed with the query (string) + let properties = ''; + // helper object that will store the column name with all it's corresponding propertiest needed to pass to graphql (object) + let columns = {}; + + // values we are getting from FormData are strings, this will parse them depending on the column type we are taking them from + function parseValue(type, value){ + if(value === ''){ + return null; + } + + if(type === 'integer'){ + return parseInt(value); + } + + if(type === 'float'){ + return parseFloat(value); + } + + if(type === 'boolean'){ + if(value === 'true'){ + return true; + } else { + return false; + } + } + + if(type === 'array'){ + return JSON.parse(value); + } + + if(type === 'json'){ + return JSON.parse(value); + } + + return value; + }; + + // parse FormData entries to an `columns` object + for(const [entry, value] of formEntries){ + // do it only for FormData entries related to columns + if(entry.indexOf('[') >= 0){ + // get the column name from FormData + let column = entry.slice(0, entry.indexOf('[')); + // get the column properties names like the 'type' and 'value' + let property = entry.slice(entry.indexOf('[')+1, entry.indexOf(']')); + + // build an object like: column_name = { type: 'type', value: 'value' } + (columns[column] ??= {})[property] = value; + } + }; + + // for each edited column build the needed strings and add the value to `variables` + for(const column in columns){ + variablesDefinition += `, $${column}: ${columnTypeToVariableType[columns[column].type] || 'String'}`; + + variables[column] = parseValue(columns[column].type, columns[column].value); + + properties += `{ name: "${column}", ${columnTypeToPropertyType[columns[column].type]}: $${column} }`; + } + + + // build the final variables definition string with all the needed variables and their types + if(variablesDefinition.length){ + variablesDefinition = variablesDefinition.slice(2); // remove first comma ', ' + variablesDefinition = `(${variablesDefinition})`; // add brackets to definition string + } + + return { variablesDefinition, variables, properties }; + +}; \ No newline at end of file diff --git a/gui/next/src/lib/helpers/clickOutside.js b/gui/next/src/lib/helpers/clickOutside.js new file mode 100644 index 0000000..16998f3 --- /dev/null +++ b/gui/next/src/lib/helpers/clickOutside.js @@ -0,0 +1,29 @@ +/* + svelte action that handles clicking outside given node +*/ + + +const clickOutside = (node, callback) => { + const handleClick = event => { + + const path = event.composedPath(); + + if (!path.includes(node)) { + callback(event); + } + }; + + document.addEventListener('mousedown', handleClick); + + return { + destroy() { + document.removeEventListener('mousedown', handleClick); + } + }; +}; + + + +// exports +// ------------------------------------------------------------------------ +export { clickOutside }; diff --git a/gui/next/src/lib/helpers/httpStatusCodes.js b/gui/next/src/lib/helpers/httpStatusCodes.js new file mode 100644 index 0000000..7c125e0 --- /dev/null +++ b/gui/next/src/lib/helpers/httpStatusCodes.js @@ -0,0 +1,79 @@ +/* + list of http status codes matched with their description +*/ + + +const httpStatusCodes = { + 100: 'Continue', + 101: 'Switching Protocols', + 102: 'Processing', + 103: 'Early Hints', + + 200: 'OK', + 201: 'Created', + 202: 'Accepted', + 203: 'Non-Authoritative Information', + 204: 'No Content', + 205: 'Reset Content', + 206: 'Partial Content', + 207: 'Multi-Status', + 208: 'Already Reported', + 226: 'IM Used', + + 300: 'Multiple Choices', + 301: 'Moved Permanently', + 302: 'Found', + 303: 'See Other', + 304: 'Not Modified', + 305: 'Use Proxy', + 306: 'Switch Proxy', + 307: 'Temporary Redirect', + 308: 'Permanent Redirect', + + 400: 'Bad Request', + 401: 'Unauthorized', + 402: 'Payment Required', + 403: 'Forbidden', + 404: 'Not Found', + 405: 'Method Not Allowed', + 406: 'Not Acceptable', + 407: 'Proxy Authentication Required', + 408: 'Request Timeout', + 409: 'Conflict', + 410: 'Gone', + 411: 'Length Required', + 412: 'Precondition Failed', + 413: 'Payload Too Large', + 414: 'URI Too Long', + 415: 'Unsupported Media Type', + 416: 'Range Not Satisfiable', + 417: 'Expectation Failed', + 418: 'I\'m a teapot', + 421: 'Misdirected Request', + 422: 'Unprocessable Content', + 423: 'Locked', + 424: 'Failed Dependency', + 425: 'Too Early', + 426: 'Upgrade Required', + 428: 'Precondition Required', + 429: 'Too Many Requests', + 431: 'Request Header Fields Too Large', + 451: 'Unavailable For Legal Reasons', + + 500: 'Internal Server Error', + 501: 'Not Implemented', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + 504: 'Gateway Timeout', + 505: 'HTTP Version Not Supported', + 506: 'Variant Also Negotiates', + 507: 'Insufficient Storage', + 508: 'Loop Detected', + 510: 'Not Extended', + 511: 'Network Authentication Required' +}; + + +// exports +// ------------------------------------------------------------------------ +export { httpStatusCodes }; diff --git a/gui/next/src/lib/parseValue.js b/gui/next/src/lib/parseValue.js new file mode 100644 index 0000000..57654b6 --- /dev/null +++ b/gui/next/src/lib/parseValue.js @@ -0,0 +1,51 @@ +// imports +// ------------------------------------------------------------------------ +import { tryParseJSON } from '$lib/tryParseJSON.js'; + + + +// purpose: parses the value to present it in the most adequate way +// (strings can be strings, JSONs or escaped JSONs) +// arguments: value to parse (any) +// type of the value (string) +// ------------------------------------------------------------------------ +const parseValue = (value, type) => { + let parsed = { + value: value, + type: type + }; + + if(value === null || value === undefined){ + parsed.value = null; + parsed.type = 'null'; + return {...parsed}; + } + + if(type === 'boolean'){ + if(value === true){ + parsed.value = 'true'; + } else { + parsed.value = 'false'; + } + } + + if(typeof value === 'object'){ + parsed.value = value; + parsed.type = 'json'; + return {...parsed}; + } + + if(tryParseJSON(value)){ + parsed.value = tryParseJSON(value); + parsed.type = 'jsonEscaped'; + return {...parsed}; + } + + return {...parsed, original: { value, type }}; +}; + + + +// exports +// ------------------------------------------------------------------------ +export { parseValue }; diff --git a/gui/next/src/lib/relativeTime.js b/gui/next/src/lib/relativeTime.js new file mode 100644 index 0000000..cf6cb7d --- /dev/null +++ b/gui/next/src/lib/relativeTime.js @@ -0,0 +1,33 @@ +/* + shows dates as relative from current +*/ + + + +const relativeTime = input => { + + const date = (input instanceof Date) ? input : new Date(input); + const formatter = new Intl.RelativeTimeFormat('en'); + const ranges = { + years: 3600 * 24 * 365, + months: 3600 * 24 * 30, + weeks: 3600 * 24 * 7, + days: 3600 * 24, + hours: 3600, + minutes: 60, + seconds: 1 + }; + const secondsElapsed = (date.getTime() - Date.now()) / 1000; + + for (let key in ranges) { + if (ranges[key] < Math.abs(secondsElapsed)) { + const delta = secondsElapsed / ranges[key]; + return formatter.format(Math.round(delta), key); + } + } + +}; + + + +export { relativeTime }; diff --git a/gui/next/src/lib/state.js b/gui/next/src/lib/state.js new file mode 100644 index 0000000..cb99bee --- /dev/null +++ b/gui/next/src/lib/state.js @@ -0,0 +1,203 @@ +/* + store that handles all the state and data related objects + + usage: import { state } from '$lib/state.js' and then use + the methods provided in the return statement for navigating through + the state. +*/ + + +// imports +// ------------------------------------------------------------------------ +import { browser } from '$app/environment'; +import { writable } from 'svelte/store'; + + +const state = createStore(); + +function createStore(){ + + // read local storage values + // ------------------------------------------------------------------------ + const view = browser && localStorage.view ? JSON.parse(localStorage.view) : null; + + // store properties + // ------------------------------------------------------------------------ + const state = {}; + // list of items pinned to the header navigation (array of strings) + state.header = browser && localStorage.header ? JSON.parse(localStorage.header) : ['database', 'users', 'logs']; + // if the app is connected to the instance (object or false) + state.online = undefined; + // logs data (object) + state.logs = {}; + // new logs data (object) + state.logsv2 = {}; + // currently active log (object) + state.logv2 = {}; + // network logs data (object) + state.networks = {}; + // currently active network log (object) + state.network = {}; + // tables for current instance (array) + state.tables = []; + // currently active table (object) + state.table = {}; + // type of view for the records ('table' or 'tiles') + state.view = { + database: view?.database ? view.database : 'table', + tableStyle: view?.tableStyle ? view.tableStyle : 'collapsed' + }; + // currently viewed records list (object) + state.records = {}; + // currently viewed/edited record (object) + state.record = null; + // currently highlighted ids (object) + state.highlighted = { + record: null, + constant: null + }; + // filters for the records (object) + state.filters = { + page: 1, + attributes: [ + { attribute_type: 'id', name: 'id', operation: 'value', value: '' } + ], + deleted: 'false' + }; + // sort order for the records (object) + state.sort = { + by: 'created_at', + order: 'DESC' + }; + // list of notifications (array of objects) + state.notifications = []; + // width of the aside panel in css units (string) + state.asideWidth = browser && localStorage.asideWidth ? localStorage.asideWidth : false; + // list of users + state.users = []; + + // purpose: creates the store with data provided in state object + // ------------------------------------------------------------------------ + const { subscribe, set, update } = writable(state); + + + // purpose: updates the store properties + // arguments: name of the property you want to update (string) + // new value (any) + // ------------------------------------------------------------------------ + const data = (property, value) => { + update(state => { + state[property] = value; + + return state; + }); + }; + + + // purpose: clears all the filters + // ------------------------------------------------------------------------ + const clearFilters = () => { + update(state => { + state.filters = { + page: 1, + attributes: [ + { attribute_type: 'id', name: 'id', operation: 'value', value: '' } + ], + deleted: 'false' + }; + + state.sort = { + by: 'created_at', + order: 'DESC' + }; + + + return state; + }); + }; + + + // purpose: highlights an record if visible + // arguments: type of data to highlight ('record') + // id of the element to highlight (int) + // ------------------------------------------------------------------------ + let highlightTimeout; + + const highlight = (type, id) => { + update(state => { + state.highlighted[type] = id; + + return state; + }); + + clearTimeout(highlightTimeout); + highlightTimeout = setTimeout(() => { + highlight('record', null); highlight('constant', null); + }, 7000); + }; + + + // purpose: manages notifications + // ------------------------------------------------------------------------ + const notification = { + + // purpose: creates new notification + // arguments: notification type ('success', 'error') + // notification text message for the user (string) + // ------------------------------------------------------------------------ + create: (type, message) => { + update(state => { + state.notifications.push({id: Date.now(), type: type, message: message}); + + return state; + }); + }, + + // purpose: removes a notification from the view + // arguments: id of the notification in array (int) + // ------------------------------------------------------------------------ + remove: (id) => { + update(state => { + state.notifications = state.notifications.filter(notification => notification.id !== id); + + return state; + }); + } + + }; + + + // purpose: manages the view styles + // arguments: new view + // ------------------------------------------------------------------------ + const setView = (newView) => { + update(state => { + state.view = {...state.view, ...newView}; + + if(browser){ + localStorage.view = JSON.stringify(state.view); + } + + return state; + }); + }; + + + + return { + subscribe, + set, + data, + clearFilters, + highlight, + notification, + setView + }; + +}; + + + +// exports +// ------------------------------------------------------------------------ +export { state }; diff --git a/gui/next/src/lib/tryParseJSON.js b/gui/next/src/lib/tryParseJSON.js new file mode 100644 index 0000000..1eb4ce9 --- /dev/null +++ b/gui/next/src/lib/tryParseJSON.js @@ -0,0 +1,32 @@ +// purpose: tries to parse the string as JSON +// arguments: string or JSON object to check if can be parsed as JSON (string or object) +// returns: JSON object if parseable or false if can't be parsed (object or false) +// ------------------------------------------------------------------------ +const tryParseJSON = (argument) => { + + // first, check if passed argument is JSON and if so just return it + if(argument && typeof argument === 'object'){ + return argument; + } + + // if argument is a string, try to parse it as JSON + try { + const o = JSON.parse(argument); + + if(o && typeof o === 'object'){ + return o; + } + } catch { + // catch the error from parsing JSON but do nothing + } + + // if everything failed we can assumen the argument is not parsable JSON + return false; + +}; + + + +// exports +// ------------------------------------------------------------------------ +export { tryParseJSON }; diff --git a/gui/next/src/lib/ui/Aside.svelte b/gui/next/src/lib/ui/Aside.svelte new file mode 100644 index 0000000..202922f --- /dev/null +++ b/gui/next/src/lib/ui/Aside.svelte @@ -0,0 +1,220 @@ + + + + + + + + + + + + diff --git a/gui/next/src/lib/ui/CautionBanner.svelte b/gui/next/src/lib/ui/CautionBanner.svelte new file mode 100644 index 0000000..db2681a --- /dev/null +++ b/gui/next/src/lib/ui/CautionBanner.svelte @@ -0,0 +1,33 @@ + + + + + + + diff --git a/gui/next/src/lib/ui/Code.svelte b/gui/next/src/lib/ui/Code.svelte new file mode 100644 index 0000000..f89f26b --- /dev/null +++ b/gui/next/src/lib/ui/Code.svelte @@ -0,0 +1,50 @@ + + + + + + + + + + + diff --git a/gui/next/src/lib/ui/ConnectionIndicator.svelte b/gui/next/src/lib/ui/ConnectionIndicator.svelte new file mode 100644 index 0000000..da7ef4b --- /dev/null +++ b/gui/next/src/lib/ui/ConnectionIndicator.svelte @@ -0,0 +1,93 @@ + + + + + + + + + + + +{#if $state.online === false} +
    + Disconnected from the instance +
    +{/if} diff --git a/gui/next/src/lib/ui/Copy.svelte b/gui/next/src/lib/ui/Copy.svelte new file mode 100644 index 0000000..5755c02 --- /dev/null +++ b/gui/next/src/lib/ui/Copy.svelte @@ -0,0 +1,99 @@ + + + + + + + + + + + diff --git a/gui/next/src/lib/ui/Diagnostic.svelte b/gui/next/src/lib/ui/Diagnostic.svelte new file mode 100644 index 0000000..23b5c2e --- /dev/null +++ b/gui/next/src/lib/ui/Diagnostic.svelte @@ -0,0 +1,198 @@ + + + + + + + + + + +
    + +
    + {type} + {#if location}{location}{/if} +
    + + {#if parsedMessage} + + {:else if messageText} +
    + {#if showFull || messageText.length <= maxMessageLength} + {messageText} + {:else} + {messageText.substr(0, maxMessageLength)} + + + + {/if} +
    + {/if} + + {#if data.source_span} +
    {data.source_span}
    + {/if} + + {#if stack.length > 1} +
    + Show full stack ({stack.length} frames) +
      + {#each stack as frame} +
    1. {frameLabel(frame)}
    2. + {/each} +
    +
    + {/if} + + {#if context.url || context.user} +
    + {#if context.url}url: {context.url}{/if} + {#if context.user}user: {context.user.email || context.user.id}{/if} +
    + {/if} + +
    diff --git a/gui/next/src/lib/ui/Header.svelte b/gui/next/src/lib/ui/Header.svelte new file mode 100644 index 0000000..4db3b2c --- /dev/null +++ b/gui/next/src/lib/ui/Header.svelte @@ -0,0 +1,317 @@ + + + + + + + + + + +
    +
    + + + + + +
    +
    diff --git a/gui/next/src/lib/ui/Icon.svelte b/gui/next/src/lib/ui/Icon.svelte new file mode 100644 index 0000000..766c654 --- /dev/null +++ b/gui/next/src/lib/ui/Icon.svelte @@ -0,0 +1,67 @@ + + + + + +{#if icon} + + + +{/if} diff --git a/gui/next/src/lib/ui/JSONTree.svelte b/gui/next/src/lib/ui/JSONTree.svelte new file mode 100644 index 0000000..94ceffd --- /dev/null +++ b/gui/next/src/lib/ui/JSONTree.svelte @@ -0,0 +1,77 @@ + + + + + + + + + +
    + + + +
    diff --git a/gui/next/src/lib/ui/Notifications.svelte b/gui/next/src/lib/ui/Notifications.svelte new file mode 100644 index 0000000..5b664c6 --- /dev/null +++ b/gui/next/src/lib/ui/Notifications.svelte @@ -0,0 +1,135 @@ + + + + + + + + + + +
    + + {#each $state.notifications as notification (notification.id)} +
    + {@html notification.message} + + +
    + {/each} + +
    + +
    + +
    diff --git a/gui/next/src/lib/ui/forms/Number.svelte b/gui/next/src/lib/ui/forms/Number.svelte new file mode 100644 index 0000000..89e24de --- /dev/null +++ b/gui/next/src/lib/ui/forms/Number.svelte @@ -0,0 +1,167 @@ + + + + + + + + + + + +
    + + + + debouncedInput(event)} + on:focusin={() => focused = true} + on:focusout={() => focused = false} + autofocus={focused} + style="--max: {max?.toString().length || 1}ch" + > + + + +
    diff --git a/gui/next/src/lib/ui/forms/Toggle.svelte b/gui/next/src/lib/ui/forms/Toggle.svelte new file mode 100644 index 0000000..9f3b5d5 --- /dev/null +++ b/gui/next/src/lib/ui/forms/Toggle.svelte @@ -0,0 +1,211 @@ + + + + + + + + + + + +
    + + {#if options.length === 2} + + { if(event.code === 'Space'){ event.preventDefault(); checked = checked === options[0].value ? options[1].value : options[0].value } } } + > + + + + + { if(event.code === 'Space'){ event.preventDefault(); checked = checked === options[0].value ? options[1].value : options[0].value } } } + > + + + {:else if options.length === 1} + + + + { if(event.code === 'Space'){ event.preventDefault(); checked = checked === options[0].value ? '' : options[0].value } } } + on:change={event => checked = event.target.checked ? options[0].value : '' } + on:change + > + + {/if} + +
    diff --git a/gui/next/src/lib/users/ContextMenu.svelte b/gui/next/src/lib/users/ContextMenu.svelte new file mode 100644 index 0000000..81a730b --- /dev/null +++ b/gui/next/src/lib/users/ContextMenu.svelte @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + dispatch('close')}> +
      +
    • + dispatch('reload')} on:close={() => dispatch('close')} /> +
    • +
    +
    diff --git a/gui/next/src/lib/users/Create.svelte b/gui/next/src/lib/users/Create.svelte new file mode 100644 index 0000000..bf70b8f --- /dev/null +++ b/gui/next/src/lib/users/Create.svelte @@ -0,0 +1,354 @@ + + + + + + + + + + + + +
    + +
    +
    + + + +
    + +
    +
    + {#if userToEdit === null} +
    + + + +
    + +
    +
    + {/if} + {#each userProperties as property} + {@const value = userToEdit !== null ? parseValue(userToEdit.properties[property.name], property.attribute_type) : {type: property.attribute_type, value: ''}} +
    + + + +
    + {#if property.attribute_type === 'boolean'} + + {:else} + + {/if} +
    + {#if validation[property.name]} + {validation[property.name].message} + {/if} +
    +
    +
    + {/each} + +
    +
    + +
    diff --git a/gui/next/src/lib/users/Delete.svelte b/gui/next/src/lib/users/Delete.svelte new file mode 100644 index 0000000..7de6cfc --- /dev/null +++ b/gui/next/src/lib/users/Delete.svelte @@ -0,0 +1,59 @@ + + + + + + + + + + +
    + + +
    diff --git a/gui/next/src/routes/+layout.svelte b/gui/next/src/routes/+layout.svelte new file mode 100644 index 0000000..497eabd --- /dev/null +++ b/gui/next/src/routes/+layout.svelte @@ -0,0 +1,24 @@ + + + + + + +
    + + + + diff --git a/gui/next/src/routes/+page.svelte b/gui/next/src/routes/+page.svelte new file mode 100644 index 0000000..293a8ed --- /dev/null +++ b/gui/next/src/routes/+page.svelte @@ -0,0 +1,502 @@ + + + + + + + + + + + + Siteglide{$state.online?.MPKIT_URL ? ': ' + $state.online.MPKIT_URL.replace('https://', '') : ''} + + + + + \ No newline at end of file diff --git a/gui/next/src/routes/backgroundJobs/+layout.svelte b/gui/next/src/routes/backgroundJobs/+layout.svelte new file mode 100644 index 0000000..902fbac --- /dev/null +++ b/gui/next/src/routes/backgroundJobs/+layout.svelte @@ -0,0 +1,373 @@ + + + + + + + + + + + + Jobs{$state.online?.MPKIT_URL ? ': ' + $state.online.MPKIT_URL.replace('https://', '') : ''} + + + +
    + +
    + + + + + + + + + + + + + + {#each items.results as item} + + + + + + + + {/each} + +
    Name / idPriority + {#if filters.type === 'DEAD'} + Failed + {:else} + Runs + {/if} +
    contextMenu.id = null}> +
    + + + + +
      + {#if item.dead_at} +
    • + +
    • + {/if} +
    • + +
    • +
    +
    + + + {item.source_name || item.id} + + +
    +
    {item.queue} + {#if filters.type === 'DEAD'} + { item.dead_at_parsed || relativeTime(new Date(item.dead_at)) || '' } + {:else} + { item.run_at_parsed || relativeTime(new Date(item.run_at)) } + {/if} +
    + + + +
    + + + +
    diff --git a/gui/next/src/routes/backgroundJobs/+page.svelte b/gui/next/src/routes/backgroundJobs/+page.svelte new file mode 100644 index 0000000..e69de29 diff --git a/gui/next/src/routes/backgroundJobs/[type]/[id]/+page.svelte b/gui/next/src/routes/backgroundJobs/[type]/[id]/+page.svelte new file mode 100644 index 0000000..e24e59a --- /dev/null +++ b/gui/next/src/routes/backgroundJobs/[type]/[id]/+page.svelte @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + diff --git a/gui/next/src/routes/constants/+layout.svelte b/gui/next/src/routes/constants/+layout.svelte new file mode 100644 index 0000000..4fa864c --- /dev/null +++ b/gui/next/src/routes/constants/+layout.svelte @@ -0,0 +1 @@ + diff --git a/gui/next/src/routes/constants/+page.svelte b/gui/next/src/routes/constants/+page.svelte new file mode 100644 index 0000000..29e1485 --- /dev/null +++ b/gui/next/src/routes/constants/+page.svelte @@ -0,0 +1,385 @@ + + + + + + + + + + + + Constants{$state.online?.MPKIT_URL ? ': ' + $state.online.MPKIT_URL.replace('https://', '') : ''} + + +
    + + + +
    +
    +
    + + +
    +
    + + +
    + +
    +
    + +
      + + {#each items as item, index} +
    • +
      remove(event)}> + + +
      +
      update(event, index)}> + + +
      + item.changed = true}> + +
      + +
      +
    • + {/each} + +
    + +
    diff --git a/gui/next/src/routes/database/+layout.svelte b/gui/next/src/routes/database/+layout.svelte new file mode 100644 index 0000000..2f4461e --- /dev/null +++ b/gui/next/src/routes/database/+layout.svelte @@ -0,0 +1,70 @@ + + + + + + + + + + + + +
    + +
    + tablesHidden = false} /> +
    + + + +
    diff --git a/gui/next/src/routes/database/+page.svelte b/gui/next/src/routes/database/+page.svelte new file mode 100644 index 0000000..e38c8f9 --- /dev/null +++ b/gui/next/src/routes/database/+page.svelte @@ -0,0 +1,15 @@ + + + + + + + + Database{$state.online?.MPKIT_URL ? ': ' + $state.online.MPKIT_URL.replace('https://', '') : ''} + diff --git a/gui/next/src/routes/database/table/[id]/+page.svelte b/gui/next/src/routes/database/table/[id]/+page.svelte new file mode 100644 index 0000000..d042426 --- /dev/null +++ b/gui/next/src/routes/database/table/[id]/+page.svelte @@ -0,0 +1,245 @@ + + + + + + + + + + + + {$state.table?.name || 'Loading…'}{$state.online?.MPKIT_URL ? ': ' + $state.online.MPKIT_URL.replace('https://', '') : ''} + + + + +
    + + + + {#if $state.view.database !== 'tiles'} + + {:else} + Work in progress :) + {/if} + + + + + +{#if $state.record !== null} + +{/if} diff --git a/gui/next/src/routes/logs/+layout.svelte b/gui/next/src/routes/logs/+layout.svelte new file mode 100644 index 0000000..4fa864c --- /dev/null +++ b/gui/next/src/routes/logs/+layout.svelte @@ -0,0 +1 @@ + diff --git a/gui/next/src/routes/logs/+page.svelte b/gui/next/src/routes/logs/+page.svelte new file mode 100644 index 0000000..61921bf --- /dev/null +++ b/gui/next/src/routes/logs/+page.svelte @@ -0,0 +1,434 @@ + + + + + + + + + + + + Logs{$state.online?.MPKIT_URL ? ': ' + $state.online.MPKIT_URL.replace('https://', '') : ''} + + + +
    + +
    + + + + {#if $state.logs.logs} +
    + {#each $state.logs.logs as log} + $state.logs.downloaded_at[0]} + in:fade|local={{ duration: 200 }} + > + + + + + {/each} +
    + + + + +
    + + +
    +
    + {/if} + + {#if !filter} +
    + No newer logs to show
    Checking every 3 seconds +
    + {/if} + +
    + + + {#if pinnedPanel} + + {/if} + + diff --git a/gui/next/src/routes/users/+layout.svelte b/gui/next/src/routes/users/+layout.svelte new file mode 100644 index 0000000..b51cd6f --- /dev/null +++ b/gui/next/src/routes/users/+layout.svelte @@ -0,0 +1,441 @@ + + + + + + + + + + + Users{$state.online?.MPKIT_URL ? ': ' + $state.online.MPKIT_URL.replace('https://', '') : ''} + + + +
    + + + +
    + + + +
    + + + + + + + + + {#if items} + + {#each items as user} + + + + + + {/each} + + {/if} +
    IDEmail
    + + + + + + {user.id} + + + + {user.email} + +
    +
    + + + +
    + +{#if $page.params.id} + +{/if} + +{#if $state.user !== undefined} + reloadUsers() } /> +{/if} + + +
    diff --git a/gui/next/src/routes/users/+page.svelte b/gui/next/src/routes/users/+page.svelte new file mode 100644 index 0000000..a72492a --- /dev/null +++ b/gui/next/src/routes/users/+page.svelte @@ -0,0 +1,15 @@ + + + + + + + + Users{$state.online?.MPKIT_URL ? ': ' + $state.online.MPKIT_URL.replace('https://', '') : ''} + diff --git a/gui/next/src/routes/users/[id]/+page.svelte b/gui/next/src/routes/users/[id]/+page.svelte new file mode 100644 index 0000000..0c7ad61 --- /dev/null +++ b/gui/next/src/routes/users/[id]/+page.svelte @@ -0,0 +1,129 @@ + + + + + + + + + + + + {item?.email ?? 'Users'}{$state.online?.MPKIT_URL ? ': ' + $state.online.MPKIT_URL.replace('https://', '') : ''} + + + diff --git a/gui/next/src/style/button.css b/gui/next/src/style/button.css new file mode 100644 index 0000000..562964c --- /dev/null +++ b/gui/next/src/style/button.css @@ -0,0 +1,146 @@ +/* + button component + + general styling + buttons in the context area + icon + invisible label in button for screen readers + combined buttons placed next to each other + small variant + danger variant + confirmation variant +*/ + + + +/* general styling +============================================================================ */ +.button { + padding: .7rem 1rem; + display: inline-flex; + align-items: center; + gap: .6em; + + border-radius: .5rem; + background-color: var(--color-middleground); + + leading-trim: both; + line-height: 1em; + color: var(--color-text); + + transition: all .1s linear; +} + +button:not(:disabled):not(.disabled) { + cursor: pointer +} + +.button:not(.disabled):not(:disabled):hover { + background-color: rgba(var(--color-rgb-interaction-hover), .2); +} + +.button:focus-visible { + box-shadow: 0 0 1px 2px var(--color-interaction-hover); +} + +.button.active { + background-color: rgba(var(--color-rgb-interaction-hover), .1); +} + + +/* buttons in the context area +============================================================================ */ +.content-context .button { + background-color: var(--color-context-button-background); + + color: var(--color-context-button-text); +} + +.content-context .button:hover { + background-color: var(--color-context-button-background-hover); +} + +.content-context .button:hover svg { + color: currentColor; +} + + + +/* icon +============================================================================ */ +.button svg { + width: 18px; + height: 18px; + margin-block: -.04rem; + + pointer-events: none; +} + +.button:not(:disabled):hover svg { + color: var(--color-interaction); +} + +.button:has(svg) { + padding-block: .64rem; +} + +.button:disabled svg { + color: var(--color-text-secondary); +} + + +/* invisible label in button for screen readers +============================================================================ */ +.button .label, +button .label { + position: absolute; + left: -100vw; +} + + +/* combined buttons placed next to each other +============================================================================ */ +.combo { + display: flex; + gap: 1px; +} + +.combo .button:first-of-type { + border-radius: .5rem 0 0 .5rem; +} + +.combo .button:last-of-type { + border-radius: 0 .5rem .5rem 0; +} + + + +/* small variant +============================================================================ */ +.button.compact { + padding: .4rem; +} + + +/* danger variant +============================================================================ */ +.button.danger { + color: var(--color-danger); +} + + +/* danger variant +============================================================================ */ +.button.confirmation { + background-color: rgba(var(--color-rgb-confirmation), .2); + + color: var(--color-confirmation); +} + +.button.confirmation:hover { + color: var(--color-confirmation); +} + +.button.confirmation:hover svg { + color: inherit; +} diff --git a/gui/next/src/style/code.css b/gui/next/src/style/code.css new file mode 100644 index 0000000..e177adb --- /dev/null +++ b/gui/next/src/style/code.css @@ -0,0 +1,4 @@ +/* PrismJS 1.29.0 +https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+liquid+markup-templating&plugins=line-numbers+normalize-whitespace */ +code[class*=language-],pre[class*=language-]{color:#ccc;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green} +pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right} diff --git a/gui/next/src/style/config.css b/gui/next/src/style/config.css new file mode 100644 index 0000000..6b6aa82 --- /dev/null +++ b/gui/next/src/style/config.css @@ -0,0 +1,196 @@ +/* + stores all configurable variables used for styling + + colors + spacings + fonts + easings +*/ + + + +:root, +::backdrop { + + + /* colors + ============================================================================ */ + + /* light theme + ========================== */ + /* typography */ + --color-light-rgb-text: 74, 74, 74; + --color-light-rgb-text-secondary: 146, 146, 146; + --color-light-rgb-text-inverted: 255, 255, 255; + + /* interaction */ + --color-light-rgb-interaction: 25, 79, 144; + --color-light-rgb-interaction-hover: 58, 141, 222; + --color-light-rgb-interaction-active: 50, 130, 210; + + /* backgrounds and frames */ + --color-light-rgb-frame: 221, 221, 221; + + --color-light-rgb-page: 255, 255, 255; + --color-light-rgb-background: 245, 246, 252; + --color-light-rgb-middleground: 235, 236, 242; + --color-light-rgb-context: 53, 55, 57; + + /* attention colors */ + --color-light-rgb-confirmation: 30, 142, 73; + --color-light-rgb-danger: 199, 46, 46; + --color-light-rgb-highlight: 250, 240, 211; + + /* forms */ + --color-light-context-input-background: 87, 90, 92; + + /* buttons */ + --color-light-context-button-background: 28, 29, 30; + --color-light-context-button-background-hover: 36, 42, 49; + --color-light-context-button-text: 255, 255, 255; + + + /* dark theme + ========================== */ + /* typography */ + --color-dark-rgb-text: 208, 212, 218; + --color-dark-rgb-text-secondary: 114, 148, 152; + --colot-light-rgb-text-inverted: 0, 0, 0; + + /* interaction */ + --color-dark-rgb-interaction: 100, 180, 200; + --color-dark-rgb-interaction-hover: 130, 210, 230; + --color-dark-rgb-interaction-active: 115, 195, 215; + + /* backgrounds and frames */ + --color-dark-rgb-frame: 47, 61, 76; + + --color-dark-rgb-page: 29, 40, 51; + --color-dark-rgb-background: 19, 32, 45; + --color-dark-rgb-middleground: 15, 25, 35; + --color-dark-rgb-context: 21, 29, 38; + + /* attention colors */ + --color-dark-rgb-confirmation: 30, 142, 73; + --color-dark-rgb-danger: 221, 89, 89; + --color-dark-rgb-highlight: 106, 62, 10; + + /* forms */ + --color-dark-context-input-background: 87, 90, 92; + + /* buttons */ + --color-dark-context-button-background: 41, 48, 57; + --color-dark-context-button-background-hover: 61, 68, 78; + --color-dark-context-button-text: 255, 255, 255; + +} + +/* rbg parts based on the theme choosen */ +:root, +::backdrop { + --color-rgb-text: var(--color-light-rgb-text); + --color-rgb-text-secondary: var(--color-light-rgb-text-secondary); + --color-rgb-text-inverted: var(--color-light-rgb-text-inverted); + + --color-rgb-interaction: var(--color-light-rgb-interaction); + --color-rgb-interaction-hover: var(--color-light-rgb-interaction-hover); + --color-rgb-interaction-active: var(--color-light-rgb-interaction-active); + + --color-rgb-frame: var(--color-light-rgb-frame); + + --color-rgb-page: var(--color-light-rgb-page); + --color-rgb-background: var(--color-light-rgb-background); + --color-rgb-middleground: var(--color-light-rgb-middleground); + --color-rgb-context: var(--color-light-rgb-context); + + --color-rgb-confirmation: var(--color-light-rgb-confirmation); + --color-rgb-danger: var(--color-light-rgb-danger); + --color-rgb-highlight: var(--color-light-rgb-highlight); + + --color-rgb-context-input-background: var(--color-light-context-input-background); + + --color-rgb-context-button-background: var(--color-light-context-button-background); + --color-rgb-context-button-background-hover: var(--color-light-context-button-background-hover); + --color-rgb-context-button-text: var(--color-light-context-button-text); +} + +@media (prefers-color-scheme: dark) { + :root, + ::backdrop { + --color-rgb-text: var(--color-dark-rgb-text); + --color-rgb-text-secondary: var(--color-dark-rgb-text-secondary); + --color-rgb-text-inverted: var(--color-dark-rgb-text-inverted); + + --color-rgb-interaction: var(--color-dark-rgb-interaction); + --color-rgb-interaction-hover: var(--color-dark-rgb-interaction-hover); + --color-rgb-interaction-active: var(--color-dark-rgb-interaction-active); + + --color-rgb-frame: var(--color-dark-rgb-frame); + + --color-rgb-page: var(--color-dark-rgb-page); + --color-rgb-background: var(--color-dark-rgb-background); + --color-rgb-middleground: var(--color-dark-rgb-middleground); + --color-rgb-context: var(--color-dark-rgb-context); + + --color-rgb-confirmation: var(--color-dark-rgb-confirmation); + --color-rgb-danger: var(--color-dark-rgb-danger); + --color-rgb-highlight: var(--color-dark-rgb-highlight); + + --color-rgb-context-input-background: var(--color-dark-context-input-background); + + --color-rgb-context-button-background: var(--color-dark-context-button-background); + --color-rgb-context-button-background-hover: var(--color-dark-context-button-background-hover); + --color-rgb-context-button-text: var(--color-dark-context-button-text); + } +} + +/* negotiated rgb parts to an actual color */ +:root { + --color-text: rgb(var(--color-rgb-text)); + --color-text-secondary: rgb(var(--color-rgb-text-secondary)); + --color-text-inverted: rgb(var(--color-rgb-text-inverted)); + + --color-interaction: rgb(var(--color-rgb-interaction)); + --color-interaction-hover: rgb(var(--color-rgb-interaction-hover)); + --color-interaction-active: rgb(var(--color-rgb-interaction-active)); + + --color-frame: rgb(var(--color-rgb-frame)); + + --color-page: rgb(var(--color-rgb-page)); + --color-background: rgb(var(--color-rgb-background)); + --color-middleground: rgb(var(--color-rgb-middleground)); + --color-context: rgb(var(--color-rgb-context)); + + --color-confirmation: rgb(var(--color-rgb-confirmation)); + --color-danger: rgb(var(--color-rgb-danger)); + --color-highlight: rgb(var(--color-rgb-highlight)); + + --color-context-input-background: rgb(var(--color-rgb-context-input-background)); + + --color-context-button-background: rgb(var(--color-rgb-context-button-background)); + --color-context-button-background-hover: rgb(var(--color-rgb-context-button-background-hover)); + --color-context-button-text: rgb(var(--color-rgb-context-button-text)); +} + + +/* spacings +============================================================================ */ +:root { + --space-page: 2rem; + --space-navigation: 1rem; + --space-table: 1rem; +} + + +/* fonts +============================================================================ */ +:root { + --font-normal: system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; +} + + +/* easings +============================================================================ */ +:root { + --easing-rapid: cubic-bezier(0.075, 0.82, 0.165, 1); +} diff --git a/gui/next/src/style/forms.css b/gui/next/src/style/forms.css new file mode 100644 index 0000000..50de1de --- /dev/null +++ b/gui/next/src/style/forms.css @@ -0,0 +1,68 @@ +/* + styling of forms and form inputs + + colors + spacings +*/ + + + +input[type="text"], +input[type="password"], +input[type="email"], +input[type="number"], +input[type="date"], +select, +textarea { + padding: .5rem 1rem; + + border-radius: .5rem; + background-color: var(--color-middleground); + + transition-property: background-color, box-shadow, color; + transition-duration: .1s; + transition-timing-function: linear; +} + + .content-context select, + .content-context input { + background-color: var(--color-context-input-background); + } + +textarea { + padding: 1rem; +} + + .content-context textarea { + background-color: var(--color-context-input-background); + } + +select { + padding-inline-end: 2.1em; + + background-image: url('data:image/svg+xml,'); + background-repeat: no-repeat; + background-position: right .7em center; + background-size: .7em; +} + +input:focus-visible, +select:focus-visible, +textarea:focus-visible { + box-shadow: 0 0 1px 2px var(--color-interaction-hover); +} + +input::placeholder, +textarea::placeholder { + color: var(--color-text-secondary); +} + +.content-context input:disabled, +.content-context select:disabled, +.content-context textarea:disabled { + color: rgba(var(--color-rgb-context-button-text), .6); +} + +input[type="checkbox"] { + all: revert; +} diff --git a/gui/next/src/style/general.css b/gui/next/src/style/general.css new file mode 100644 index 0000000..814c696 --- /dev/null +++ b/gui/next/src/style/general.css @@ -0,0 +1,103 @@ +/* + stores universally shared ulility classes and general page styling + + main page + context sections + links + utilities + definition list +*/ + + + +/* main page +============================================================================ */ +body { + height: 100vh; + display: grid; + grid-template-rows: min-content 1fr; + + background-color: var(--color-page); + + text-rendering: optimizeLegibility; + font-family: var(--font-normal); + color: var(--color-text); +} + + +/* context sections +============================================================================ */ +.content-context { + background-color: var(--color-context); + + color: var(--color-text-inverted); +} + + +/* links +============================================================================ */ +a { + transition-property: color, background-color; + transition-duration: .1s; + transition-timing-function: ease-in-out; +} + + +/* utilities +============================================================================ */ + +/* used to mark keyboard shortcuts */ +kbd { + padding: .4em .2em; + + border-radius: .2em; + background-color: var(--color-middleground); + + text-transform: uppercase; + line-height: .6em; + font-family: monospace; +} + + +/* definition list +============================================================================ */ +.definitions { + display: grid; + grid-template-columns: auto auto; +} + +.definitions dt, +.definitions dd { + padding-block: .7rem; + display: flex; + align-items: center; +} + + .definitions dt:not(:last-of-type), + .definitions dd:not(:last-of-type) { + border-block-end: 1px solid var(--color-background); + } + + .definitions dt { + padding-inline-end: 1em; + + white-space: nowrap; + color: var(--color-text-secondary); + } + + .definitions dd { + min-width: 0; + display: flex; + justify-content: end; + + word-wrap: break-word; + text-wrap: balance; + } + + .definitions dd > * { + width: 100%; + display: block; + + word-wrap: break-word; + text-align: end; + } diff --git a/gui/next/src/style/reset.css b/gui/next/src/style/reset.css new file mode 100644 index 0000000..0c0620f --- /dev/null +++ b/gui/next/src/style/reset.css @@ -0,0 +1,75 @@ +/* + resets default browser styling and fixes some browser-specific issues + based on https://elad2412.github.io/the-new-css-reset/ +*/ + + + + +*:where(:not(html, iframe, canvas, img, svg, video, audio):not(svg *, symbol *)) { + all: unset; + display: revert; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +a, button { + cursor: revert; +} + +ol, ul, menu { + list-style: none; +} + +img { + max-width: 100%; +} + +table { + border-collapse: collapse; +} + +input, textarea { + -webkit-user-select: auto; +} + +input[type="radio"] { + all: revert; +} + +textarea { + white-space: revert; +} + +meter { + -webkit-appearance: revert; + appearance: revert; +} + +::placeholder { + color: unset; +} + +:where([hidden]) { + display: none; +} + +:where([contenteditable]:not([contenteditable="false"])) { + -moz-user-modify: read-write; + -webkit-user-modify: read-write; + overflow-wrap: break-word; + -webkit-line-break: after-white-space; + -webkit-user-select: auto; +} + +:where([draggable="true"]) { + -webkit-user-drag: element; +} + +html { + font-family: sans-serif; +} diff --git a/gui/next/static/favicon.png b/gui/next/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..9fffb15c24546ca430e79b2b4fc71f9369178820 GIT binary patch literal 1548 zcmV+n2J`ueP)esbKb1`dne5V<-=be*5GQdz4qGY z?8`JA-s=B~KPCa&<-xUhIZo;TewRNtb*WI+fBubzj!`A5)j>m;qWD_`c)51tcscet zCWoDK9WOX8cPp_rr00qmXP=>AD~>xZzE~4yR3y zI*aS1xD%)IE`+zAP4hbCrC3s{xkYhJr%TDa(Zpp@DUpzng4xK!M59eS_w5vZeZAxw z!=EO=<~j&zaFrx4;2Xc>6@`rJClCOJhpnhGI7gs!s>ptR5j`&{ z)wLja=eq=6?Wk>a{$zvFGka9Xp+UytG<8n`>@{rr`I=hykJoAiks>)CjsPt~#oz$` zTTi)IM$k6=@?+!V=m8+{O#+`TF*D!qk|QKmhP>{i%mqTwN7`e`a8F|(xzVt__^@eb z;@*F?ShZcGSS4gZB^Zs_Ld;`V64mI*q;^b4qPx@cK3in(Rf#|b<5&Yg_McM}^1sZh zNklUg$eRHT#U%y;(IvJ&IoPr{N$=H>ESeljCPuX2&|@iIl6|09wq2-LzWrCw|N3)- z#Padpgo*Ru0AIQ0+OMkE)(o5tbKTHtoc+|JotWZHPiwMkjfuF;F_y5I&VQWxaV_aOX z)(N?V;BSO1R{~L#9QiCE@cA-BiZg1F@!1C413XUgh#<|sjDUA?0IA!jkyQ5d9H5=( z#mP?z09fdx2*90p3|h^H>KNjdg`9${Q>fp4`Mc*Q-Lc7&7Q&~-G^B0 zV6mWmRWaZ0DqCo0C)EWXlj^FAX2>OdnJNFVDgvSmX6KGg>LE3|H!f&6NWf+4u!s)@ zIN%tFKppr4WrA7=4q`Z8ce)R$x6qqlopD|5m4L*hT7s-$YJZs_KlaOX`Dc{C$ICL0 z(Vid(2Q$LPN6Xh7@`H@#lz>9s7WYB~EpJ+sp#1fes9Qq7v7l|9^`r>Ua(tO4EBu@& zclF~rnbV&$n8r9p&q*G#21euDKh}@SikahmR3Y5U0h<;t&#srm?HeR!dj`pI9@kUF zX!-an_~-r8{FSR+qd%p}^Ky>WF{K-nOBOp1JELKYcY#Dkv=_xDCeh8T;&zTj$KkNs z9OG$$&!{h`c`Fk5F0d1_c@9yu11y&L5`{QVF&8}EL%X{BFc;`_n!DPd-(=!4r!(?)wJh+>m!Vdr;s)B|vb_;?-2@tS|?Lu5OG~J0({Z?RP3!jY1G}zZI+e{RC z*x?a>WxzT?Nwomc+JBhkB#W z7uRn?rkQjlhAkE&Am+t?6NtR25*#(EVPH&y|JtkBW1Ug{(dL5>XtxSKtKK^C9R1eq yzGkIz%WzlPw*NH(csLdoWLX~HdrkZ2?f74#ixE>=g.reach);A+=w.value.length,w=w.next){ + var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){ + var P,L=1;if(y){ + if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){ + var I={cause:f+','+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach); + } + } + } + } + } + }function s(){ + var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0; + }function u(e,n,t){ + var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a; + }function c(e,n,t){ + for(var r=n.next,a=0;a'+i.content+''; + },!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener('message',(function(n){ + var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close(); + }),!1),a):a;var g=a.util.currentScript();function f(){ + a.manual||a.highlightAll(); + }if(g&&(a.filename=g.src,g.hasAttribute('data-manual')&&(a.manual=!0)),!a.manual){ + var h=document.readyState;'loading'===h||'interactive'===h&&g&&g.defer?document.addEventListener('DOMContentLoaded',f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16); + }return a; +}(_self);'undefined'!=typeof module&&module.exports&&(module.exports=Prism),'undefined'!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{'internal-subset':{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,'doctype-tag':/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},'special-attr':[],'attr-value':{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:'attr-equals'},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,'attr-name':{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:'named-entity'},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside['attr-value'].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside['internal-subset'].inside=Prism.languages.markup,Prism.hooks.add('wrap',(function(a){ + 'entity'===a.type&&(a.attributes.title=a.content.replace(/&/,'&')); +})),Object.defineProperty(Prism.languages.markup.tag,'addInlined',{value:function(a,e){ + var s={};s['language-'+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={'included-cdata':{pattern://i,inside:s}};t['language-'+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp('(<__[^>]*>)(?:))*\\]\\]>|(?!)'.replace(/__/g,(function(){ + return a; + })),'i'),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore('markup','cdata',n); +}}),Object.defineProperty(Prism.languages.markup.tag,'addAttribute',{value:function(a,e){ + Prism.languages.markup.tag.inside['special-attr'].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))",'i'),lookbehind:!0,inside:{'attr-name':/^[^\s=]+/,'attr-value':{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,'language-'+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:'attr-equals'},/"|'/]}}}}); +}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend('markup',{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(e){ + function n(e,n){ + return'___'+e.toUpperCase()+n+'___'; + }Object.defineProperties(e.languages['markup-templating']={},{buildPlaceholders:{value:function(t,a,r,o){ + if(t.language===a){ + var c=t.tokenStack=[];t.code=t.code.replace(r,(function(e){ + if('function'==typeof o&&!o(e))return e;for(var r,i=c.length;-1!==t.code.indexOf(r=n(a,i));)++i;return c[i]=e,r; + })),t.grammar=e.languages.markup; + } + }},tokenizePlaceholders:{value:function(t,a){ + if(t.language===a&&t.tokenStack){ + t.grammar=e.languages[a];var r=0,o=Object.keys(t.tokenStack);!function c(i){ + for(var u=0;u=o.length);u++){ + var g=i[u];if('string'==typeof g||g.content&&'string'==typeof g.content){ + var l=o[r],s=t.tokenStack[l],f='string'==typeof g?g:g.content,p=n(a,l),k=f.indexOf(p);if(k>-1){ + ++r;var m=f.substring(0,k),d=new e.Token(a,e.tokenize(s,t.grammar),'language-'+a,s),h=f.substring(k+p.length),v=[];m&&v.push.apply(v,c([m])),v.push(d),h&&v.push.apply(v,c([h])),'string'==typeof g?i.splice.apply(i,[u,1].concat(v)):g.content=v; + } + }else g.content&&c(g.content); + }return i; + }(t.tokens); + } + }}}); +}(Prism); +Prism.languages.liquid={comment:{pattern:/(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,lookbehind:!0},delimiter:{pattern:/^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,alias:'punctuation'},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,object:/\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,function:[{pattern:/(\|\s*)\w+/,lookbehind:!0,alias:'filter'},{pattern:/(\.\s*)(?:first|last|size)/,lookbehind:!0}],boolean:/\b(?:false|nil|true)\b/,range:{pattern:/\.\./,alias:'operator'},number:/\b\d+(?:\.\d+)?\b/,operator:/[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,punctuation:/[.,\[\]()]/,empty:{pattern:/\bempty\b/,alias:'keyword'}},Prism.hooks.add('before-tokenize',(function(e){ + var t=!1;Prism.languages['markup-templating'].buildPlaceholders(e,'liquid',/\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g,(function(e){ + var n=/^\{%-?\s*(\w+)/.exec(e);if(n){ + var i=n[1];if('raw'===i&&!t)return t=!0,!0;if('endraw'===i)return t=!1,!0; + }return!t; + })); +})),Prism.hooks.add('after-tokenize',(function(e){ + Prism.languages['markup-templating'].tokenizePlaceholders(e,'liquid'); +})); +!function(){ + if('undefined'!=typeof Prism&&'undefined'!=typeof document){ + var e='line-numbers',n=/\n(?!$)/g,t=Prism.plugins.lineNumbers={getLine:function(n,t){ + if('PRE'===n.tagName&&n.classList.contains(e)){ + var i=n.querySelector('.line-numbers-rows');if(i){ + var r=parseInt(n.getAttribute('data-start'),10)||1,s=r+(i.children.length-1);ts&&(t=s);var l=t-r;return i.children[l]; + } + } + },resize:function(e){ + r([e]); + },assumeViewportIndependence:!0},i=void 0;window.addEventListener('resize',(function(){ + t.assumeViewportIndependence&&i===window.innerWidth||(i=window.innerWidth,r(Array.prototype.slice.call(document.querySelectorAll('pre.line-numbers')))); + })),Prism.hooks.add('complete',(function(t){ + if(t.code){ + var i=t.element,s=i.parentNode;if(s&&/pre/i.test(s.nodeName)&&!i.querySelector('.line-numbers-rows')&&Prism.util.isActive(i,e)){ + i.classList.remove(e),s.classList.add(e);var l,o=t.code.match(n),a=o?o.length+1:1,u=new Array(a+1).join('');(l=document.createElement('span')).setAttribute('aria-hidden','true'),l.className='line-numbers-rows',l.innerHTML=u,s.hasAttribute('data-start')&&(s.style.counterReset='linenumber '+(parseInt(s.getAttribute('data-start'),10)-1)),t.element.appendChild(l),r([s]),Prism.hooks.run('line-numbers',t); + } + } + })),Prism.hooks.add('line-numbers',(function(e){ + e.plugins=e.plugins||{},e.plugins.lineNumbers=!0; + })); + }function r(e){ + if(0!=(e=e.filter((function(e){ + var n,t=(n=e,n?window.getComputedStyle?getComputedStyle(n):n.currentStyle||null:null)['white-space'];return'pre-wrap'===t||'pre-line'===t; + }))).length){ + var t=e.map((function(e){ + var t=e.querySelector('code'),i=e.querySelector('.line-numbers-rows');if(t&&i){ + var r=e.querySelector('.line-numbers-sizer'),s=t.textContent.split(n);r||((r=document.createElement('span')).className='line-numbers-sizer',t.appendChild(r)),r.innerHTML='0',r.style.display='block';var l=r.getBoundingClientRect().height;return r.innerHTML='',{element:e,lines:s,lineHeights:[],oneLinerHeight:l,sizer:r}; + } + })).filter(Boolean);t.forEach((function(e){ + var n=e.sizer,t=e.lines,i=e.lineHeights,r=e.oneLinerHeight;i[t.length-1]=void 0,t.forEach((function(e,t){ + if(e&&e.length>1){ + var s=n.appendChild(document.createElement('span'));s.style.display='block',s.textContent=e; + }else i[t]=r; + })); + })),t.forEach((function(e){ + for(var n=e.sizer,t=e.lineHeights,i=0,r=0;rt&&(o[l]='\n'+o[l],a=s); + }n[i]=o.join(''); + }return n.join('\n'); + }},'undefined'!=typeof module&&module.exports&&(module.exports=n),Prism.plugins.NormalizeWhitespace=new n({'remove-trailing':!0,'remove-indent':!0,'left-trim':!0,'right-trim':!0}),Prism.hooks.add('before-sanity-check',(function(e){ + var n=Prism.plugins.NormalizeWhitespace;if((!e.settings||!1!==e.settings['whitespace-normalization'])&&Prism.util.isActive(e.element,'whitespace-normalization',!0))if(e.element&&e.element.parentNode||!e.code){ + var r=e.element.parentNode;if(e.code&&r&&'pre'===r.nodeName.toLowerCase()){ + for(var i in null==e.settings&&(e.settings={}),t)if(Object.hasOwnProperty.call(t,i)){ + var o=t[i];if(r.hasAttribute('data-'+i))try{ + var a=JSON.parse(r.getAttribute('data-'+i)||'true');typeof a===o&&(e.settings[i]=a); + }catch(e){} + }for(var l=r.childNodes,s='',c='',u=!1,m=0;m [options]') - .description('This command will open up the GraphiQL editor and/or Liquid Evaluator locally.') + .description('Open the local Admin GUI (Logs, Database, Constants, GraphiQL, Liquid Evaluator).') .arguments('[environment]', 'name of environment. Example: staging') .option('-c --config-file ', 'config file path', '.siteglide-config') .option('-p --port ', 'port number', '3333') @@ -29,14 +29,14 @@ program try { await server.start(process.env, 'gui'); - if(params.open){ - setTimeout(async function(){ - await open(`http://localhost:${params.port}/gui/graphql`); - },1000); + if (params.open) { + setTimeout(async function () { + await open(`http://localhost:${params.port}/`); + }, 1000); } } catch (e) { logger.Error('GUI failed. Please check that you have the correct permissions and your site is not locked or creating.'); } }); -program.parse(process.argv); \ No newline at end of file +program.parse(process.argv); diff --git a/siteglide-cli-server.js b/siteglide-cli-server.js index 8dba578..7c25b8f 100755 --- a/siteglide-cli-server.js +++ b/siteglide-cli-server.js @@ -5,9 +5,10 @@ const express = require('express'), bodyParser = require('body-parser'), Gateway = require('./lib/proxy'), logger = require('./lib/logger'), - path = require('path'); + path = require('path'), + version = require('./package.json').version; -const start = (env,command) => { +const start = (env, command) => { const port = env.PORT || 3333; const app = express(); @@ -26,7 +27,7 @@ const start = (env,command) => { var liquidRouting; - if(command==='gui'){ + if (command === 'gui') { liquidRouting = (req, res) => { gateway .liquid(req.body) @@ -38,33 +39,58 @@ const start = (env,command) => { app.use(bodyParser.json()); app.use(compression()); + if (command === 'gui') { + app.use('/', express.static(path.resolve(__dirname, 'gui', 'next', 'build'))); + } app.use('/gui/graphql', express.static(path.resolve(__dirname, 'gui', 'graphql', 'public'))); - if(command==='gui'){ + if (command === 'gui') { app.use('/gui/liquid', express.static(path.resolve(__dirname, 'gui', 'liquid', 'public'))); } - // INFO + // INFO — MPKIT_URL/version for gui/next; SG_URL for legacy GraphiQL/Liquid status bars const info = (req, res) => { - return res.send(JSON.stringify({ SG_URL: env.SITEGLIDE_URL })); + return res.send(JSON.stringify({ + MPKIT_URL: env.SITEGLIDE_URL, + SG_URL: env.SITEGLIDE_URL, + version: version + })); }; app.get('/info', info); app.post('/graphql', graphqlRouting); app.post('/api/graph', graphqlRouting); - if(command==='gui'){ + if (command === 'gui') { app.post('/api/liquid', liquidRouting); app.get('/api/liquid', liquidRouting); + app.get('/api/logs', (req, res) => { + gateway + .logs({ lastId: req.query.lastId }) + .then(body => res.send(body)) + .catch(error => res.send(error)); + }); + + // SPA fallback for gui/next client routes (after API + static mounts) + app.get('*', (req, res, next) => { + if (req.path.startsWith('/gui/') || req.path.startsWith('/api/') || req.path === '/info' || req.path === '/graphql') { + return next(); + } + res.sendFile(path.resolve(__dirname, 'gui', 'next', 'build', 'index.html')); + }); } gateway.ping().then(async () => { - app.listen(port, function() { + app.listen(port, function () { logger.Debug(`Server is listening on ${port}`); logger.Success(`Connected to ${env.SITEGLIDE_URL}`); - logger.Success(`GraphiQL Editor: http://localhost:${port}/gui/graphql`); - if(command==='gui'){ + if (command === 'gui') { + logger.Success(`Admin: http://localhost:${port}`); + logger.Success('---'); + logger.Success(`Instance Logs: http://localhost:${port}/logs`); + logger.Success(`GraphiQL Editor: http://localhost:${port}/gui/graphql`); logger.Success(`Liquid Evaluator: http://localhost:${port}/gui/liquid`); - }else{ - logger.Warn('The graphql command is now deprecated and will be removed in a future update. Please switch to the new gui command to use the GraphiQL Editor and Liquid Evaluator.') + } else { + logger.Success(`GraphiQL Editor: http://localhost:${port}/gui/graphql`); + logger.Warn('The graphql command is now deprecated and will be removed in a future update. Please switch to the new gui command to use the GraphiQL Editor and Liquid Evaluator.'); } }) .on('error', err => { @@ -72,14 +98,14 @@ const start = (env,command) => { logger.Error(`Port ${port} is already in use.`, { exit: false }); logger.Print('\n'); logger.Warn('Please use -p to run server on a different port.\n'); - logger.Warn('Example: siteglide-cli graphql -p 31337'); + logger.Warn('Example: siteglide-cli gui -p 31337'); } else { logger.Error(`Something wrong happened when trying to run Express server: ${err}`); } }); - }) + }); }; module.exports = { start: start -}; \ No newline at end of file +}; diff --git a/siteglide-cli.js b/siteglide-cli.js index 4af7dc6..ca7716c 100755 --- a/siteglide-cli.js +++ b/siteglide-cli.js @@ -26,7 +26,7 @@ program .command('list', 'List your current environments for the site') .command('sync [environment]', 'update site on local file change') .command('pull [environment]', 'get all files from site') - .command('gui [environment]', 'gui for GraphiQL and Liquid Evaluator') + .command('gui [environment]', 'gui for Admin, Logs, GraphiQL and Liquid Evaluator') .command('logs [environment]', 'stream debugging logs from your website') .command('init', 'create default folder structure for Siteglide Admin') .command('deploy [environment]', 'upload all code to your site') From 9950e5f5dca82e55fda002405c41e61a9610aef8 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Thu, 6 Aug 2026 10:13:42 +0100 Subject: [PATCH 11/34] pos-cli check command --- lib/check.js | 464 +++++++++++++++++++++++++++++++++++++++++ siteglide-cli-check.js | 66 ++++++ 2 files changed, 530 insertions(+) create mode 100644 lib/check.js create mode 100644 siteglide-cli-check.js diff --git a/lib/check.js b/lib/check.js new file mode 100644 index 0000000..5e3976f --- /dev/null +++ b/lib/check.js @@ -0,0 +1,464 @@ +const fs = require('fs'); +const path = require('path'); +const { fileURLToPath } = require('url'); +const chalk = require('chalk'); +const yaml = require('js-yaml'); +const ora = require('ora'); +const logger = require('./logger'); + +// Severity levels from platformos-check-node +const Severity = { + ERROR: 0, + WARNING: 1, + INFO: 2 +}; + +const loadPlatformosCheck = async () => { + try { + const platformosCheck = await import('@platformos/platformos-check-node'); + return platformosCheck; + } catch (error) { + logger.Error( + 'Failed to load @platformos/platformos-check-node.\n' + + `${error && error.message ? error.message : error}\n` + + 'Ensure it is installed: npm install @platformos/platformos-check-node' + ); + } +}; + +const validatePath = (checkPath) => { + if (!fs.existsSync(checkPath)) { + logger.Error(`Path does not exist: ${checkPath}`); + return; + } + + const stats = fs.statSync(checkPath); + if (!stats.isDirectory()) { + logger.Error(`Path is not a directory: ${checkPath}`); + } +}; + +/** + * Convert file:// URI to filesystem path + */ +const uriToPath = (uri) => { + try { + return fileURLToPath(uri); + } catch { + // Fallback for non-standard URIs + return uri.replace('file://', ''); + } +}; + +/** + * Get severity label + */ +const severityToLabel = (severity) => { + switch (severity) { + case Severity.ERROR: + return 'error'; + case Severity.WARNING: + return 'warning'; + case Severity.INFO: + return 'info'; + default: + return 'unknown'; + } +}; + +/** + * Get code snippet from file (lines are 0-indexed from platformos-check) + */ +const getSnippet = (uri, startLine, endLine) => { + try { + const fsPath = uriToPath(uri); + const fileContent = fs.readFileSync(fsPath, 'utf8'); + const lines = fileContent.split('\n'); + const snippetLines = lines.slice(startLine, endLine + 1); + + return snippetLines + .map((line, index) => { + const lineNumber = startLine + index + 1; + const paddedLineNum = String(lineNumber).padStart(4, ' '); + return `${paddedLineNum} ${line}`; + }) + .join('\n'); + } catch { + return ''; + } +}; + +/** + * Format a single offense with code snippet + */ +const formatOffense = (offense, basePath = null) => { + let absolutePath = uriToPath(offense.uri); + // Normalize path separators and resolve to absolute path + absolutePath = path.normalize(absolutePath); + + let filePath = absolutePath; + if (basePath) { + const normalizedBase = path.normalize(path.resolve(basePath)); + filePath = path.relative(normalizedBase, absolutePath); + // Convert backslashes to forward slashes for consistent output + filePath = filePath.split(path.sep).join('/'); + } + + const severityLabel = severityToLabel(offense.severity); + const location = `${filePath}:${offense.start.line + 1}:${offense.start.character}`; + const snippet = getSnippet(offense.uri, offense.start.line, offense.end.line); + + return { + location, + message: offense.message, + check: offense.check, + severity: severityLabel, + snippet, + file: filePath + }; +}; + +/** + * Sort offenses by severity (ERROR < WARNING < INFO) + */ +const sortBySeverity = (a, b) => a.severity - b.severity; + +/** + * Group and sort offenses by file, then by severity + */ +const groupOffensesByFile = (offenses, basePath = null) => { + const grouped = {}; + + offenses.forEach(offense => { + let absolutePath = uriToPath(offense.uri); + // Normalize path separators and resolve to absolute path + absolutePath = path.normalize(absolutePath); + + let filePath = absolutePath; + if (basePath) { + const normalizedBase = path.normalize(path.resolve(basePath)); + filePath = path.relative(normalizedBase, absolutePath); + // Convert backslashes to forward slashes for consistent output + filePath = filePath.split(path.sep).join('/'); + } + + if (!grouped[filePath]) { + grouped[filePath] = []; + } + grouped[filePath].push(offense); + }); + + // Sort offenses within each file by severity + Object.keys(grouped).forEach(file => { + grouped[file].sort(sortBySeverity); + }); + + return grouped; +}; + +/** + * Count offenses by severity + */ +const countOffensesBySeverity = (offenses) => { + return offenses.reduce((counts, offense) => { + switch (offense.severity) { + case Severity.ERROR: + counts.errors++; + break; + case Severity.WARNING: + counts.warnings++; + break; + case Severity.INFO: + counts.info++; + break; + } + return counts; + }, { errors: 0, warnings: 0, info: 0 }); +}; + +/** + * Format and display offenses in text format + */ +const printTextOutput = (offenses, silent, basePath = null) => { + if (offenses.length === 0) { + if (!silent) { + logger.Success('No offenses found.'); + } + return; + } + + const grouped = groupOffensesByFile(offenses, basePath); + const fileCount = Object.keys(grouped).length; + const counts = countOffensesBySeverity(offenses); + + // Print offenses grouped by file + logger.Print(''); + const sortedFiles = Object.keys(grouped).sort(); + for (const file of sortedFiles) { + logger.Print(chalk.bold.cyan(file)); + logger.Print(''); + + for (const offense of grouped[file]) { + const formatted = formatOffense(offense, basePath); + + // Print severity icon and check name + let severityIcon, checkName; + switch (offense.severity) { + case Severity.ERROR: + severityIcon = chalk.red.bold('✖'); + checkName = chalk.red.bold(formatted.check); + break; + case Severity.WARNING: + severityIcon = chalk.yellow.bold('⚠'); + checkName = chalk.yellow.bold(formatted.check); + break; + case Severity.INFO: + severityIcon = chalk.cyan.bold('ℹ'); + checkName = chalk.cyan.bold(formatted.check); + break; + } + + logger.Print(`${severityIcon} ${checkName}`); + logger.Print(chalk.gray(` ${formatted.message}`)); + + // Print code snippet if available + if (formatted.snippet) { + logger.Print(''); + logger.Print(chalk.gray(formatted.snippet)); + } + + logger.Print(''); + } + } + + // Print summary at the end + logger.Print(chalk.gray('─'.repeat(60))); + logger.Print(''); + + // Summary header + const totalOffenses = offenses.length; + const summaryHeader = `${totalOffenses} offense${totalOffenses === 1 ? '' : 's'} found in ${fileCount} file${fileCount === 1 ? '' : 's'}`; + + logger.Print(chalk.bold.white(summaryHeader)); + logger.Print(''); + + // Count badges + const badges = []; + if (counts.errors > 0) { + badges.push(chalk.red(`✖ ${counts.errors} error${counts.errors === 1 ? '' : 's'}`)); + } + if (counts.warnings > 0) { + badges.push(chalk.yellow(`⚠ ${counts.warnings} warning${counts.warnings === 1 ? '' : 's'}`)); + } + if (counts.info > 0) { + badges.push(chalk.cyan(`ℹ ${counts.info} info`)); + } + + logger.Print(' ' + badges.join(' ')); + logger.Print(''); +}; + +/** + * Format offenses as JSON + */ +const printJsonOutput = (offenses, basePath = null) => { + const grouped = groupOffensesByFile(offenses, basePath); + + const result = Object.entries(grouped).map(([filePath, fileOffenses]) => { + const counts = countOffensesBySeverity(fileOffenses); + + return { + path: filePath, + offenses: fileOffenses.map(offense => ({ + check: offense.check, + severity: severityToLabel(offense.severity), + start_row: offense.start.line, + start_column: offense.start.character, + end_row: offense.end.line, + end_column: offense.end.character, + message: offense.message + })), + errorCount: counts.errors, + warningCount: counts.warnings, + infoCount: counts.info + }; + }); + + const totalCounts = countOffensesBySeverity(offenses); + + const output = { + offenseCount: offenses.length, + fileCount: Object.keys(grouped).length, + errorCount: totalCounts.errors, + warningCount: totalCounts.warnings, + infoCount: totalCounts.info, + files: result + }; + + logger.Print(JSON.stringify(output, null, 2)); +}; + +/** + * Add '#' character at the start of each line in a string + */ +const commentString = (input) => { + return input + .split('\n') + .map(line => `# ${line}`) + .join('\n'); +}; + +/** + * Initialize .platformos-check.yml configuration file + */ +const initConfig = async (rootPath) => { + const configFileName = '.platformos-check.yml'; + const configFilePath = path.join(rootPath, configFileName); + + // Check if config file already exists + if (fs.existsSync(configFilePath)) { + logger.Info(`${configFileName} already exists at ${rootPath}`); + return; + } + + const platformosCheck = await loadPlatformosCheck(); + + try { + // Load default configuration + const { settings } = await platformosCheck.loadConfig(undefined, rootPath); + + // Create the initial config that extends recommended settings + const config = { + extends: 'platformos-check:recommended', + ignore: ['node_modules/**'] + }; + + const initConfigYml = yaml.dump(config, { lineWidth: -1 }); + + // Comment out all settings for user reference + const settingsYml = commentString(yaml.dump(settings, { lineWidth: -1 })); + + // Combine: base config + commented settings + const finalConfig = `${initConfigYml}\n# Below are all available settings with their default values:\n${settingsYml}`; + + // Write config file + fs.writeFileSync(configFilePath, finalConfig, 'utf8'); + + logger.Success(`Created ${configFileName} at ${rootPath}`); + } catch (error) { + logger.Error(`Error creating config file: ${error.message}`); + } +}; + +/** + * Download the latest platformOS Liquid documentation used by the linter + */ +const updateDocs = async () => { + const platformosCheck = await loadPlatformosCheck(); + + const spinner = ora({ text: 'Downloading platformOS Liquid docs...', stream: process.stdout }); + spinner.start(); + + try { + await platformosCheck.updateDocs((msg) => { + if (msg) { + spinner.text = msg; + } + }); + spinner.succeed('platformOS Liquid docs updated successfully.'); + } catch (error) { + spinner.fail('Failed to update docs.'); + logger.Error(error.message); + } +}; + +const run = async (opts) => { + const { path: checkPath, autoFix, checks, format, silent } = opts; + + validatePath(checkPath); + + const platformosCheck = await loadPlatformosCheck(); + + if (checks && checks.length > 0) { + const validNames = new Set(platformosCheck.allChecks.map((c) => c.meta.code)); + const unknown = checks.filter((name) => !validNames.has(name)); + if (unknown.length > 0) { + const available = Array.from(validNames).sort().join(', '); + logger.Error( + `Unknown check${unknown.length > 1 ? 's' : ''}: ${unknown.join(', ')}\n` + + `Available checks: ${available}` + ); + return; + } + } + + let offenses = []; + let spinner; + let app; + + // Only show spinner for text output (not JSON) + if (format !== 'json' && !silent) { + spinner = ora({ text: 'Loading files...', stream: process.stdout }); + spinner.start(); + } + + try { + // Run checks with progress callback + const result = await platformosCheck.appCheckRun(checkPath, undefined, (message) => { + if (spinner && message) { + spinner.text = message; + } + }); + + offenses = checks + ? result.offenses.filter((o) => checks.includes(o.check)) + : result.offenses; + app = result.app; + + // Update spinner with completion info if it's still running + if (spinner && spinner.isSpinning) { + const fileCount = app.length; + spinner.text = `Checked ${fileCount} file${fileCount === 1 ? '' : 's'}`; + } + + if (autoFix && offenses.length > 0) { + if (spinner) { + spinner.text = `Applying automatic fixes to ${offenses.length} offense${offenses.length === 1 ? '' : 's'}...`; + } + await platformosCheck.autofix(app, offenses); + + // Re-run check after autofix to get updated offenses + if (spinner) { + spinner.text = 'Re-checking after fixes...'; + } + const recheck = await platformosCheck.appCheckRun(checkPath); + offenses = recheck.offenses; + } + + if (spinner) { + spinner.stop(); + } + } catch (error) { + if (spinner) { + spinner.fail('Check failed'); + } + logger.Error(`Error running platformos-check: ${error.message}\n${error.stack}`); + return; + } + + if (format === 'json') { + printJsonOutput(offenses, checkPath); + } else { + printTextOutput(offenses, silent, checkPath); + } + + if (offenses.length > 0) { + process.exitCode = 1; + } +}; + +module.exports = { + run, + initConfig, + updateDocs +}; diff --git a/siteglide-cli-check.js b/siteglide-cli-check.js new file mode 100644 index 0000000..8b1b5ef --- /dev/null +++ b/siteglide-cli-check.js @@ -0,0 +1,66 @@ +#!/usr/bin/env node + +const path = require('path'); +const program = require('commander'); +const version = require('./package.json').version; +const logger = require('./lib/logger'); +const { run, initConfig, updateDocs } = require('./lib/check'); + +function collect(value, previous) { + return previous.concat([value]); +} + +program + .version(version, '-v, --version') + .name('siteglide-cli check') + .usage('[path] [options]') + .description('Check Liquid code quality with platformos-check linter') + .arguments('[path]') + .option('--init', 'initialize .platformos-check.yml configuration file') + .option('--update-docs', 'download the latest platformOS Liquid documentation used by the linter') + .option('-a', 'enable automatic fixing') + .option('-c, --check ', 'only show offenses from the named check (repeatable)', collect, []) + .option('-f ', 'output format: text or json', 'text') + .option('-s, --silent', 'only show errors, no success messages') + .action(async (checkPath, options) => { + const absolutePath = path.resolve(checkPath || process.cwd()); + const hasInit = !!options.init; + const hasUpdateDocs = !!options.updateDocs; + const hasLintFlags = !!options.a || (options.check && options.check.length > 0) || + (options.f && options.f !== 'text') || !!options.silent; + + if (hasInit && hasUpdateDocs) { + logger.Error('Cannot combine --init and --update-docs.'); + return; + } + + if (hasInit && hasLintFlags) { + logger.Error('Cannot combine --init with lint options (-a, -c, -f, -s).'); + return; + } + + if (hasUpdateDocs && hasLintFlags) { + logger.Error('Cannot combine --update-docs with lint options (-a, -c, -f, -s).'); + return; + } + + if (hasInit) { + await initConfig(absolutePath); + return; + } + + if (hasUpdateDocs) { + await updateDocs(); + return; + } + + await run({ + path: absolutePath, + autoFix: options.a || false, + checks: options.check.length > 0 ? options.check : undefined, + format: options.f || 'text', + silent: options.silent || false + }); + }); + +program.parse(process.argv); From 609fc3cc85e308b23b08b3a34c56359668aa7748 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Thu, 6 Aug 2026 10:13:45 +0100 Subject: [PATCH 12/34] pos-cli check command added --- package-lock.json | 7223 ++++++++++++++++++++++++++++++++------------- package.json | 5 +- siteglide-cli.js | 1 + 3 files changed, 5139 insertions(+), 2090 deletions(-) diff --git a/package-lock.json b/package-lock.json index 351469d..b0280f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,169 +1,796 @@ { "name": "@siteglide/siteglide-cli", - "version": "1.9.4", - "lockfileVersion": 1, + "version": "1.10.3", + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@nodelib/fs.scandir": { + "packages": { + "": { + "name": "@siteglide/siteglide-cli", + "version": "1.10.3", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@platformos/platformos-check-node": "^0.0.20", + "@platformos/platformos-common": "^0.0.18", + "archiver": "^5.3.0", + "archiver-promise": "^1.0.0", + "async": "^3.2.3", + "body-parser": "^1.19.2", + "chalk": "^4.1.2", + "cheerio": "^1.0.0-rc.10", + "chokidar": "^3.5.3", + "clean-css": "^5.2.4", + "commander": "^8.3.0", + "compression": "^1.7.4", + "degit": "^2.8.4", + "email-validator": "^2.0.4", + "express": "^4.17.3", + "fs-extra": "^10.0.1", + "globby": "^11", + "imagemin": "^7.0.1", + "imagemin-mozjpeg": "^9.0.0", + "imagemin-pngquant": "^9.0.2", + "js-yaml": "^4.1.0", + "livereload": "^0.9.3", + "mime-types": "^2.1.35", + "minimist": "^1.2.6", + "mustache": "^4.2.0", + "node-fetch": "^2.6.7", + "node-notifier": "^10.0.1", + "node-stream-zip": "^1.15.0", + "normalize-url": "^6.1.0", + "open": "^8.4.0", + "ora": "^5.4.1", + "request": "^2.88.2", + "request-promise": "^4.2.6", + "shelljs": "^0.8.5", + "terser": "^5.12.1", + "update-notifier": "^5.1.0", + "valid-url": "^1.0.9", + "webpack-cli": "6.0.1", + "website-scraper": "^4.2.3", + "website-scraper-existing-directory": "^0.1.0" + }, + "bin": { + "siteglide-cli": "siteglide-cli.js", + "siteglide-cli-add": "siteglide-cli-add.js", + "siteglide-cli-archive": "siteglide-cli-archive.js", + "siteglide-cli-check": "siteglide-cli-check.js", + "siteglide-cli-deploy": "siteglide-cli-deploy.js", + "siteglide-cli-export": "siteglide-cli-export.js", + "siteglide-cli-gui": "siteglide-cli-gui.js", + "siteglide-cli-import": "siteglide-cli-import.js", + "siteglide-cli-init": "siteglide-cli-init.js", + "siteglide-cli-logs": "siteglide-cli-logs.js", + "siteglide-cli-migrate": "siteglide-cli-migrate.js", + "siteglide-cli-modules": "siteglide-cli-modules.js", + "siteglide-cli-pull": "siteglide-cli-pull.js", + "siteglide-cli-push": "siteglide-cli-push.js", + "siteglide-cli-server": "siteglide-cli-server.js", + "siteglide-cli-sync": "siteglide-cli-sync.js", + "siteglide-cli-watch": "siteglide-cli-watch.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", + "license": "MIT", + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "requires": { + "dependencies": { "@nodelib/fs.stat": "2.0.4", "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "@nodelib/fs.stat": { + "node_modules/@nodelib/fs.stat": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==" + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "engines": { + "node": ">= 8" + } }, - "@nodelib/fs.walk": { + "node_modules/@nodelib/fs.walk": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "requires": { + "dependencies": { "@nodelib/fs.scandir": "2.1.4", "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@platformos/liquid-html-parser": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@platformos/liquid-html-parser/-/liquid-html-parser-0.0.18.tgz", + "integrity": "sha512-516LZjJzPsslWNmK6VaJGUD3NgCAQIwLtuSNMJxL8jY1PRshivPaKD//oNVFyNMTRuzorJZrvnGkH+AE4VUB8Q==", + "license": "MIT", + "dependencies": { + "line-column": "^1.0.2", + "ohm-js": "^17.5.0" + } + }, + "node_modules/@platformos/platformos-check-common": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@platformos/platformos-check-common/-/platformos-check-common-0.0.20.tgz", + "integrity": "sha512-zKONP6klZ1fKT7PJP0sl2v+2FX9c+6PmBb7wj5uFl/G/embPo6CLSbKREMy4tCu+LT85605WlsnPk0r/8LzsKQ==", + "license": "MIT", + "dependencies": { + "@platformos/liquid-html-parser": "0.0.18", + "graphql": "^16.12.0", + "js-yaml": "^4.1.1", + "jsonc-parser": "^3.3.1", + "line-column": "^1.0.2", + "lodash": "^4.17.23", + "minimatch": "^10.2.2", + "vscode-json-languageservice": "^5.7.1", + "vscode-uri": "^3.1.0", + "yaml": "^2.8.2" + } + }, + "node_modules/@platformos/platformos-check-common/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@platformos/platformos-check-common/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@platformos/platformos-check-common/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@platformos/platformos-check-docs-updater": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@platformos/platformos-check-docs-updater/-/platformos-check-docs-updater-0.0.20.tgz", + "integrity": "sha512-/o+L9NgHTYk3Q+WiaIFKolhjBwlHjSLq0OXCOO6efNGBCMPRXrf8/9FB63SpF64Fdr2eYpEtGnRrMXSJ4bz7KQ==", + "license": "MIT", + "dependencies": { + "@platformos/platformos-check-common": "0.0.20", + "env-paths": "^2.2.1", + "he": "^1.2.0" + }, + "bin": { + "theme-docs": "scripts/cli.js" + } + }, + "node_modules/@platformos/platformos-check-node": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@platformos/platformos-check-node/-/platformos-check-node-0.0.20.tgz", + "integrity": "sha512-wzPzZRldjWVaOaeHZ5fkvSZEWtvr0/20DFedR7HLhdVPT1G3pfuFiYGIiWCUxCURyXG9dgZFTUJkQUVfjKJ5XA==", + "license": "MIT", + "dependencies": { + "@platformos/platformos-check-common": "0.0.20", + "@platformos/platformos-check-docs-updater": "0.0.20", + "glob": "^13.0.0", + "normalize-path": "^3.0.0", + "vscode-uri": "^3.1.0", + "yaml": "^2.8.2" + } + }, + "node_modules/@platformos/platformos-check-node/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@platformos/platformos-check-node/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@platformos/platformos-check-node/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@platformos/platformos-check-node/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@platformos/platformos-common": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@platformos/platformos-common/-/platformos-common-0.0.18.tgz", + "integrity": "sha512-dEwQ7bJckJA6TRRcfI+qdnA7QspS7P4h7WFgVIz5IEQTqNGSuN9FVi7Rc67LHkwiBzSf2wg1a2k4LguMH1ym0w==", + "license": "MIT", + "dependencies": { + "js-yaml": "^4.1.1", + "vscode-json-languageservice": "^5.7.1", + "vscode-uri": "^3.1.0" } }, - "@sindresorhus/is": { + "node_modules/@sindresorhus/is": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "engines": { + "node": ">=4" + } }, - "@szmarczak/http-timer": { + "node_modules/@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { + "dependencies": { "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" } }, - "@types/glob": { + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "requires": { + "dependencies": { "@types/minimatch": "*", "@types/node": "*" } }, - "@types/minimatch": { + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" }, - "@types/node": { + "node_modules/@types/node": { "version": "17.0.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.12.tgz", "integrity": "sha512-4YpbAsnJXWYK/fpTVFlMIcUIho2AYCi4wg5aNPrG1ng7fn/1/RZfCIpRCiBX+12RVa34RluilnvCqD+g3KiSiA==" }, - "accepts": { + "node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", + "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", + "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", + "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { + "dependencies": { "mime-types": "~2.1.24", "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" } }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "ajv": { + "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { + "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "ansi-align": { + "node_modules/ajv-formats/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", + "peer": true + }, + "node_modules/ansi-align": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "requires": { + "dependencies": { "string-width": "^3.0.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, - "ansi-regex": { + "node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } }, - "ansi-styles": { + "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==", - "requires": { + "dependencies": { "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "anymatch": { + "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "requires": { + "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "arch": { + "node_modules/arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" + "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" + } + ] }, - "archive-type": { + "node_modules/archive-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", - "requires": { + "dependencies": { "file-type": "^4.2.0" }, - "dependencies": { - "file-type": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=" - } + "engines": { + "node": ">=4" + } + }, + "node_modules/archive-type/node_modules/file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "engines": { + "node": ">=4" } }, - "archiver": { + "node_modules/archiver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", - "requires": { + "dependencies": { "archiver-utils": "^2.1.0", "async": "^3.2.0", "buffer-crc32": "^0.2.1", @@ -171,136 +798,158 @@ "readdir-glob": "^1.0.0", "tar-stream": "^2.2.0", "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" } }, - "archiver-promise": { + "node_modules/archiver-promise": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archiver-promise/-/archiver-promise-1.0.0.tgz", "integrity": "sha1-p8TlLmB/2XbFSjAlBFQXM2g09lI=", - "requires": { + "dependencies": { "archiver": "^1.2.0" + } + }, + "node_modules/archiver-promise/node_modules/archiver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", + "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", + "dependencies": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "walkdir": "^0.0.11", + "zip-stream": "^1.1.0" }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/archiver-promise/node_modules/archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", "dependencies": { - "archiver": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", - "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", - "requires": { - "archiver-utils": "^1.3.0", - "async": "^2.0.0", - "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "walkdir": "^0.0.11", - "zip-stream": "^1.1.0" - } - }, - "archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", - "requires": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", - "lazystream": "^1.0.0", - "lodash": "^4.8.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", - "requires": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", - "requires": { - "crc": "^3.4.4", - "readable-stream": "^2.0.0" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", - "requires": { - "archiver-utils": "^1.3.0", - "compress-commons": "^1.2.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0" - } - } + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/archiver-promise/node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/archiver-promise/node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/archiver-promise/node_modules/compress-commons": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "dependencies": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/archiver-promise/node_modules/crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "dependencies": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/archiver-promise/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/archiver-promise/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-promise/node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "archiver-utils": { + "node_modules/archiver-promise/node_modules/zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "dependencies": { + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/archiver-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "requires": { + "dependencies": { "glob": "^7.1.4", "graceful-fs": "^4.2.0", "lazystream": "^1.0.0", @@ -312,366 +961,491 @@ "normalize-path": "^3.0.0", "readable-stream": "^2.0.0" }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "argparse": { + "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "array-find-index": { + "node_modules/array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "engines": { + "node": ">=0.10.0" + } }, - "array-flatten": { + "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "array-union": { + "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } }, - "asn1": { + "node_modules/asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { + "dependencies": { "safer-buffer": "~2.1.0" } }, - "assert-plus": { + "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } }, - "async": { + "node_modules/async": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" }, - "asynckit": { + "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "aws-sign2": { + "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } }, - "aws4": { + "node_modules/aws4": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "base64-js": { + "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.12", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.12.tgz", + "integrity": "sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } }, - "bcrypt-pbkdf": { + "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { + "dependencies": { "tweetnacl": "^0.14.3" } }, - "bin-build": { + "node_modules/bin-build": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", - "requires": { + "dependencies": { "decompress": "^4.0.0", "download": "^6.2.2", "execa": "^0.7.0", "p-map-series": "^1.0.0", "tempfile": "^2.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/bin-build/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-build/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" } }, - "bin-check": { + "node_modules/bin-build/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-build/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-build/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/bin-check": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", - "requires": { + "dependencies": { "execa": "^0.7.0", "executable": "^4.1.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/bin-check/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-check/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "bin-version": { + "node_modules/bin-check/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-check/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-check/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/bin-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", - "requires": { + "dependencies": { "execa": "^1.0.0", "find-versions": "^3.0.0" }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } + "engines": { + "node": ">=6" } }, - "bin-version-check": { + "node_modules/bin-version-check": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz", "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==", - "requires": { + "dependencies": { "bin-version": "^3.0.0", "semver": "^5.6.0", "semver-truncate": "^1.1.2" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-version-check/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/bin-version/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" } }, - "bin-wrapper": { + "node_modules/bin-version/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-version/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-version/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-version/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-version/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-version/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/bin-version/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-version/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-version/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/bin-wrapper": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz", "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==", - "requires": { + "dependencies": { "bin-check": "^4.1.0", "bin-version-check": "^4.0.0", "download": "^7.1.0", @@ -679,155 +1453,195 @@ "os-filter-obj": "^2.0.0", "pify": "^4.0.1" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/download": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", + "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", + "dependencies": { + "archive-type": "^4.0.0", + "caw": "^2.0.1", + "content-disposition": "^0.5.2", + "decompress": "^4.2.0", + "ext-name": "^5.0.0", + "file-type": "^8.1.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^8.3.1", + "make-dir": "^1.2.0", + "p-event": "^2.1.0", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/download/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/file-type": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", + "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dependencies": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/got/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/p-event": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", + "dependencies": { + "p-timeout": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "dependencies": { - "download": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", - "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", - "requires": { - "archive-type": "^4.0.0", - "caw": "^2.0.1", - "content-disposition": "^0.5.2", - "decompress": "^4.2.0", - "ext-name": "^5.0.0", - "file-type": "^8.1.0", - "filenamify": "^2.0.0", - "get-stream": "^3.0.0", - "got": "^8.3.1", - "make-dir": "^1.2.0", - "p-event": "^2.1.0", - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "file-type": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", - "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "got": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", - "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", - "requires": { - "@sindresorhus/is": "^0.7.0", - "cacheable-request": "^2.1.1", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "into-stream": "^3.1.0", - "is-retry-allowed": "^1.1.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "mimic-response": "^1.0.0", - "p-cancelable": "^0.4.0", - "p-timeout": "^2.0.1", - "pify": "^3.0.0", - "safe-buffer": "^5.1.1", - "timed-out": "^4.0.1", - "url-parse-lax": "^3.0.0", - "url-to-options": "^1.0.1" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "p-cancelable": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" - }, - "p-event": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", - "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", - "requires": { - "p-timeout": "^2.0.1" - } - }, - "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "requires": { - "p-finally": "^1.0.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } - } + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "binary-extensions": { + "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } }, - "bl": { + "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { + "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, - "bluebird": { + "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "body-parser": { + "node_modules/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", - "requires": { + "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", @@ -838,18 +1652,21 @@ "qs": "6.9.7", "raw-body": "2.4.3", "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.8" } }, - "boolbase": { + "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, - "boxen": { + "node_modules/boxen": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", - "requires": { + "dependencies": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", "chalk": "^4.1.0", @@ -859,84 +1676,157 @@ "widest-line": "^3.1.0", "wrap-ansi": "^7.0.0" }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - } + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "brace-expansion": { + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { + "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { + "dependencies": { "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "buffer": { + "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, - "buffer-alloc": { + "node_modules/buffer-alloc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "requires": { + "dependencies": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" } }, - "buffer-alloc-unsafe": { + "node_modules/buffer-alloc-unsafe": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, - "buffer-crc32": { + "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" + } }, - "buffer-fill": { + "node_modules/buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, - "buffer-from": { + "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "bytes": { + "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } }, - "cacheable-request": { + "node_modules/cacheable-request": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", - "requires": { + "dependencies": { "clone-response": "1.0.2", "get-stream": "3.0.0", "http-cache-semantics": "3.8.1", @@ -944,87 +1834,136 @@ "lowercase-keys": "1.0.0", "normalize-url": "2.0.1", "responselike": "1.0.2" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dependencies": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cacheable-request/node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/cacheable-request/node_modules/sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" - }, - "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", - "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" - } - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "requires": { - "is-plain-obj": "^1.0.0" - } - } + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "camelcase": { + "node_modules/camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "engines": { + "node": ">=0.10.0" + } }, - "camelcase-keys": { + "node_modules/camelcase-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { + "dependencies": { "camelcase": "^2.0.0", "map-obj": "^1.0.0" - } + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0", + "peer": true }, - "caseless": { + "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "caw": { + "node_modules/caw": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", - "requires": { + "dependencies": { "get-proxy": "^2.0.0", "isurl": "^1.0.0-alpha5", "tunnel-agent": "^0.6.0", "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "chalk": { + "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { + "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "cheerio": { + "node_modules/cheerio": { "version": "1.0.0-rc.10", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "requires": { + "dependencies": { "cheerio-select": "^1.5.0", "dom-serializer": "^1.3.2", "domhandler": "^4.2.0", @@ -1032,129 +1971,215 @@ "parse5": "^6.0.1", "parse5-htmlparser2-tree-adapter": "^6.0.1", "tslib": "^2.2.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "cheerio-select": { + "node_modules/cheerio-select": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", - "requires": { + "dependencies": { "css-select": "^4.1.3", "css-what": "^5.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0", "domutils": "^2.7.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "chokidar": { + "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "ci-info": { + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, - "clean-css": { + "node_modules/clean-css": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", - "requires": { + "dependencies": { "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" } }, - "cli-boxes": { + "node_modules/cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "cli-cursor": { + "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { + "dependencies": { "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" } }, - "cli-spinners": { + "node_modules/cli-spinners": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==" + "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "clone": { + "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "clone-response": { + "node_modules/clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { + "dependencies": { "mimic-response": "^1.0.0" } }, - "color-convert": { + "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { + "dependencies": { "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "combined-stream": { + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { + "dependencies": { "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "commander": { + "node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } }, - "compress-commons": { + "node_modules/compress-commons": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.0.tgz", "integrity": "sha512-ofaaLqfraD1YRTkrRKPCrGJ1pFeDG/MVCkVVV2FNGeWquSlqw5wOrwOfPQ1xF2u+blpeWASie5EubHz+vsNIgA==", - "requires": { + "dependencies": { "buffer-crc32": "^0.2.13", "crc32-stream": "^4.0.1", "normalize-path": "^3.0.0", "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" } }, - "compressible": { + "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { + "dependencies": { "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" } }, - "compression": { + "node_modules/compression": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { + "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", "compressible": "~2.0.16", @@ -1163,176 +2188,228 @@ "safe-buffer": "5.1.2", "vary": "~1.1.2" }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - } + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" } }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "config-chain": { + "node_modules/config-chain": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "requires": { + "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, - "configstore": { + "node_modules/configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "requires": { + "dependencies": { "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", "make-dir": "^3.0.0", "unique-string": "^2.0.0", "write-file-atomic": "^3.0.0", "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "console-stream": { + "node_modules/console-stream": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=" }, - "content-disposition": { + "node_modules/content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { + "dependencies": { "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" } }, - "content-type": { + "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } }, - "cookie": { + "node_modules/cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } }, - "cookie-signature": { + "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "core-util-is": { + "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "crc": { + "node_modules/crc": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "requires": { + "dependencies": { "buffer": "^5.1.0" } }, - "crc-32": { + "node_modules/crc-32": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", - "requires": { + "dependencies": { "exit-on-epipe": "~1.0.1", "printj": "~1.1.0" + }, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" } }, - "crc32-stream": { + "node_modules/crc32-stream": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "requires": { + "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" } }, - "cross-spawn": { + "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { + "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "crypto-random-string": { + "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } }, - "css-select": { + "node_modules/css-select": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", - "requires": { + "dependencies": { "boolbase": "^1.0.0", "css-what": "^5.0.0", "domhandler": "^4.2.0", "domutils": "^2.6.0", "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "css-url-parser": { + "node_modules/css-url-parser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-url-parser/-/css-url-parser-1.1.3.tgz", "integrity": "sha1-qkAeXT3RwLkwTAlgKLuZIAH/XJc=" }, - "css-what": { + "node_modules/css-what": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } }, - "currently-unhandled": { + "node_modules/currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { + "dependencies": { "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "dashdash": { + "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { + "dependencies": { "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" } }, - "debug": { + "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { + "dependencies": { "ms": "2.0.0" } }, - "decamelize": { + "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } }, - "decode-uri-component": { + "node_modules/decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "engines": { + "node": ">=0.10" + } }, - "decompress": { + "node_modules/decompress": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", - "requires": { + "dependencies": { "decompress-tar": "^4.0.0", "decompress-tarbz2": "^4.0.0", "decompress-targz": "^4.0.0", @@ -1342,261 +2419,342 @@ "pify": "^2.3.0", "strip-dirs": "^2.0.0" }, - "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - } + "engines": { + "node": ">=4" } }, - "decompress-response": { + "node_modules/decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { + "dependencies": { "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "decompress-tar": { + "node_modules/decompress-tar": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "requires": { + "dependencies": { "file-type": "^5.2.0", "is-stream": "^1.1.0", "tar-stream": "^1.5.2" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar/node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", "dependencies": { - "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - } + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/decompress-tar/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-tar/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/decompress-tar/node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "decompress-tarbz2": { + "node_modules/decompress-tarbz2": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "requires": { + "dependencies": { "decompress-tar": "^4.1.0", "file-type": "^6.1.0", "is-stream": "^1.1.0", "seek-bzip": "^1.0.5", "unbzip2-stream": "^1.0.9" }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - } + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" } }, - "decompress-targz": { + "node_modules/decompress-targz": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "requires": { + "dependencies": { "decompress-tar": "^4.1.1", "file-type": "^5.2.0", "is-stream": "^1.1.0" }, - "dependencies": { - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - } + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" } }, - "decompress-unzip": { + "node_modules/decompress-unzip": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "requires": { + "dependencies": { "file-type": "^3.8.0", "get-stream": "^2.2.0", "pify": "^2.3.0", "yauzl": "^2.4.2" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - } + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" } }, - "deep-extend": { + "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==" + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } }, - "defaults": { + "node_modules/defaults": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "requires": { + "dependencies": { "clone": "^1.0.2" } }, - "defer-to-connect": { + "node_modules/defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, - "define-lazy-prop": { + "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } }, - "degit": { + "node_modules/degit": { "version": "2.8.4", "resolved": "https://registry.npmjs.org/degit/-/degit-2.8.4.tgz", - "integrity": "sha512-vqYuzmSA5I50J882jd+AbAhQtgK6bdKUJIex1JNfEUPENCgYsxugzKVZlFyMwV4i06MmnV47/Iqi5Io86zf3Ng==" + "integrity": "sha512-vqYuzmSA5I50J882jd+AbAhQtgK6bdKUJIex1JNfEUPENCgYsxugzKVZlFyMwV4i06MmnV47/Iqi5Io86zf3Ng==", + "bin": { + "degit": "degit" + }, + "engines": { + "node": ">=8.0.0" + } }, - "delayed-stream": { + "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } }, - "depd": { + "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } }, - "destroy": { + "node_modules/destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "dir-glob": { + "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { + "dependencies": { "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "dom-serializer": { + "node_modules/dom-serializer": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "requires": { + "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "domelementtype": { + "node_modules/domelementtype": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] }, - "domhandler": { + "node_modules/domhandler": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", - "requires": { + "dependencies": { "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "domutils": { + "node_modules/domutils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", - "requires": { + "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "dot-prop": { + "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { + "dependencies": { "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "download": { + "node_modules/download": { "version": "6.2.5", "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", - "requires": { + "dependencies": { "caw": "^2.0.0", "content-disposition": "^0.5.2", "decompress": "^4.0.0", @@ -1609,117 +2767,264 @@ "p-event": "^1.0.0", "pify": "^3.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dependencies": { - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "duplexer3": { + "node_modules/download/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, - "ecc-jsbn": { + "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { + "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, - "ee-first": { + "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "email-validator": { + "node_modules/electron-to-chromium": { + "version": "1.5.402", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.402.tgz", + "integrity": "sha512-/oOpMaPT6Yg+6/1XQhyIPlzgj7Ye9zf+nNM2Uh6OcE2G2oNptWazFa+qB2Pdqqbsc9KnIDzgAntoYN0dbwOXwA==", + "license": "ISC", + "peer": true + }, + "node_modules/email-validator": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", - "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==" + "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", + "engines": { + "node": ">4.0" + } }, - "emoji-regex": { + "node_modules/emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, - "encodeurl": { + "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } }, - "end-of-stream": { + "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { + "dependencies": { "once": "^1.4.0" } }, - "entities": { + "node_modules/enhanced-resolve": { + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } }, - "error-ex": { + "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { + "dependencies": { "is-arrayish": "^0.2.1" } }, - "escape-goat": { + "node_modules/es-module-lexer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "license": "MIT", + "peer": true + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } }, - "escape-html": { + "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } }, - "etag": { + "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } }, - "eventemitter3": { + "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, - "execa": { + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "requires": { + "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "human-signals": "^1.1.1", @@ -1729,26 +3034,38 @@ "onetime": "^5.1.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "executable": { + "node_modules/executable": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "requires": { + "dependencies": { "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" } }, - "exit-on-epipe": { + "node_modules/exit-on-epipe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "engines": { + "node": ">=0.8" + } }, - "express": { + "node_modules/express": { "version": "4.17.3", "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", - "requires": { + "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.19.2", @@ -1780,144 +3097,221 @@ "utils-merge": "1.0.1", "vary": "~1.1.2" }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/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==", "dependencies": { - "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==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + { + "type": "consulting", + "url": "https://feross.org/support" } - } + ] }, - "ext-list": { + "node_modules/ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", - "requires": { + "dependencies": { "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "ext-name": { + "node_modules/ext-name": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", - "requires": { + "dependencies": { "ext-list": "^2.0.0", "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "extend": { + "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "extsprintf": { + "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] }, - "fast-deep-equal": { + "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "fast-glob": { + "node_modules/fast-glob": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "requires": { + "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.0", "merge2": "^1.3.0", "micromatch": "^4.0.2", "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" } }, - "fast-json-stable-stringify": { + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "fastq": { + "node_modules/fast-uri": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "requires": { + "dependencies": { "reusify": "^1.0.4" } }, - "fd-slicer": { + "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "requires": { + "dependencies": { "pend": "~1.2.0" } }, - "figures": { + "node_modules/figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "requires": { + "dependencies": { "escape-string-regexp": "^1.0.5", "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "file-type": { + "node_modules/file-type": { "version": "12.4.2", "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", - "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==" + "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==", + "engines": { + "node": ">=8" + } }, - "filename-reserved-regex": { + "node_modules/filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=" + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "engines": { + "node": ">=4" + } }, - "filenamify": { + "node_modules/filenamify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", - "requires": { + "dependencies": { "filename-reserved-regex": "^2.0.0", "strip-outer": "^1.0.0", "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "fill-range": { + "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { + "dependencies": { "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "finalhandler": { + "node_modules/finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { + "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -1925,189 +3319,262 @@ "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "find-up": { + "node_modules/find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { + "dependencies": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "find-versions": { + "node_modules/find-versions": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", - "requires": { + "dependencies": { "semver-regex": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" } }, - "forever-agent": { + "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } }, - "form-data": { + "node_modules/form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { + "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" } }, - "forwarded": { + "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } }, - "fresh": { + "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } }, - "from2": { + "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { + "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" - }, + } + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "fs-constants": { + "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, - "fs-extra": { + "node_modules/fs-extra": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", - "requires": { + "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" } }, - "fs.realpath": { + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { + "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "function-bind": { + "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "get-proxy": { + "node_modules/get-proxy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", - "requires": { + "dependencies": { "npm-conf": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "get-stdin": { + "node_modules/get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "engines": { + "node": ">=0.10.0" + } }, - "get-stream": { + "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { + "dependencies": { "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "getpass": { + "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { + "dependencies": { "assert-plus": "^1.0.0" } }, - "glob": { + "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { + "dependencies": { "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "global-dirs": { + "node_modules/global-dirs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "requires": { + "dependencies": { "ini": "2.0.0" }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" - } + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "globby": { + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/globby": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", - "requires": { + "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.1.1", "ignore": "^5.1.4", "merge2": "^1.3.0", "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "got": { + "node_modules/got": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "requires": { + "dependencies": { "decompress-response": "^3.2.0", "duplexer3": "^0.1.4", "get-stream": "^3.0.0", @@ -2123,158 +3590,240 @@ "url-parse-lax": "^1.0.0", "url-to-options": "^1.0.1" }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - } + "engines": { + "node": ">=4" } }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "node_modules/got/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/got/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } }, - "growly": { + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphql": { + "version": "16.14.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.14.2.tgz", + "integrity": "sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, - "har-schema": { + "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } }, - "har-validator": { + "node_modules/har-validator": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { + "deprecated": "this library is no longer supported", + "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "has": { + "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { + "dependencies": { "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" } }, - "has-ansi": { + "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { + "dependencies": { "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "has-flag": { + "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==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } }, - "has-symbol-support-x": { + "node_modules/has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "engines": { + "node": "*" + } }, - "has-to-string-tag-x": { + "node_modules/has-to-string-tag-x": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "requires": { + "dependencies": { "has-symbol-support-x": "^1.4.1" + }, + "engines": { + "node": "*" } }, - "has-yarn": { + "node_modules/has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } }, - "he": { + "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } }, - "hosted-git-info": { + "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, - "htmlparser2": { + "node_modules/htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "requires": { + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", "domutils": "^2.5.2", "entities": "^2.0.0" } }, - "http-cache-semantics": { + "node_modules/http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" }, - "http-errors": { + "node_modules/http-errors": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "requires": { + "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" } }, - "http-signature": { + "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { + "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "human-signals": { + "node_modules/human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "engines": { + "node": ">=8.12.0" + } }, - "iconv-lite": { + "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { + "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "ieee754": { + "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "ignore": { + "node_modules/ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "engines": { + "node": ">= 4" + } }, - "imagemin": { + "node_modules/imagemin": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-7.0.1.tgz", "integrity": "sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==", - "requires": { + "dependencies": { "file-type": "^12.0.0", "globby": "^10.0.0", "graceful-fs": "^4.2.2", @@ -2283,566 +3832,875 @@ "p-pipe": "^3.0.0", "replace-ext": "^1.0.0" }, - "dependencies": { - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - } + "engines": { + "node": ">=8" } }, - "imagemin-mozjpeg": { + "node_modules/imagemin-mozjpeg": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/imagemin-mozjpeg/-/imagemin-mozjpeg-9.0.0.tgz", "integrity": "sha512-TwOjTzYqCFRgROTWpVSt5UTT0JeCuzF1jswPLKALDd89+PmrJ2PdMMYeDLYZ1fs9cTovI9GJd68mRSnuVt691w==", - "requires": { + "dependencies": { "execa": "^4.0.0", "is-jpg": "^2.0.0", "mozjpeg": "^7.0.0" + }, + "engines": { + "node": ">=10" } }, - "imagemin-pngquant": { + "node_modules/imagemin-pngquant": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/imagemin-pngquant/-/imagemin-pngquant-9.0.2.tgz", "integrity": "sha512-cj//bKo8+Frd/DM8l6Pg9pws1pnDUjgb7ae++sUX1kUVdv2nrngPykhiUOgFeE0LGY/LmUbCf4egCHC4YUcZSg==", - "requires": { + "dependencies": { "execa": "^4.0.0", "is-png": "^2.0.0", "is-stream": "^2.0.0", "ow": "^0.17.0", "pngquant-bin": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/imagemin/node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "import-lazy": { + "node_modules/import-lazy": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", - "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==" + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "imurmurhash": { + "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } }, - "indent-string": { + "node_modules/indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { + "dependencies": { "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { + "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, - "interpret": { + "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } }, - "into-stream": { + "node_modules/into-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", - "requires": { + "dependencies": { "from2": "^2.1.1", "p-is-promise": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "ipaddr.js": { + "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } }, - "is-arrayish": { + "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, - "is-binary-path": { + "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { + "dependencies": { "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-ci": { + "node_modules/is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { + "dependencies": { "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" } }, - "is-core-module": { + "node_modules/is-core-module": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.3.0.tgz", "integrity": "sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==", - "requires": { + "dependencies": { "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-docker": { + "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==" + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } }, - "is-finite": { + "node_modules/is-finite": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-fullwidth-code-point": { + "node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } }, - "is-glob": { + "node_modules/is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-installed-globally": { + "node_modules/is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "requires": { + "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "is-interactive": { + "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } }, - "is-jpg": { + "node_modules/is-jpg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-2.0.0.tgz", - "integrity": "sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc=" + "integrity": "sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc=", + "engines": { + "node": ">=6" + } }, - "is-natural-number": { + "node_modules/is-natural-number": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" }, - "is-npm": { + "node_modules/is-npm": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-number": { + "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } }, - "is-obj": { + "node_modules/is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } }, - "is-object": { + "node_modules/is-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", - "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==" + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "is-path-inside": { + "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } }, - "is-plain-obj": { + "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "is-png": { + "node_modules/is-png": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-png/-/is-png-2.0.0.tgz", - "integrity": "sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==" + "integrity": "sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==", + "engines": { + "node": ">=8" + } }, - "is-retry-allowed": { + "node_modules/is-retry-allowed": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "engines": { + "node": ">=0.10.0" + } }, - "is-stream": { + "node_modules/is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "engines": { + "node": ">=8" + } }, - "is-typedarray": { + "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "is-unicode-supported": { + "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-utf8": { + "node_modules/is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, - "is-wsl": { + "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==", - "requires": { + "dependencies": { "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-yarn-global": { + "node_modules/is-yarn-global": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" }, - "isarray": { + "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "isstream": { + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, - "isurl": { + "node_modules/isurl": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { + "dependencies": { "has-to-string-tag-x": "^1.2.0", "is-object": "^1.0.1" + }, + "engines": { + "node": ">= 4" } }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-yaml": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "jsbn": { + "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, - "json-buffer": { + "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" }, - "json-schema": { + "node_modules/json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, - "json-schema-traverse": { + "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "json-stringify-safe": { + "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "jsonfile": { + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, + "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", + "dependencies": { "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "jsprim": { + "node_modules/jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { + "engines": [ + "node >=0.6.0" + ], + "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" } }, - "junk": { + "node_modules/junk": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", - "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==" + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "engines": { + "node": ">=8" + } }, - "keyv": { + "node_modules/keyv": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", - "requires": { + "dependencies": { "json-buffer": "3.0.0" } }, - "latest-version": { + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/latest-version": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "requires": { + "dependencies": { "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" } }, - "lazystream": { + "node_modules/lazystream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "requires": { + "dependencies": { "readable-stream": "^2.0.5" }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "livereload": { + "node_modules/line-column": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww==", + "license": "MIT", + "dependencies": { + "isarray": "^1.0.0", + "isobject": "^2.0.0" + } + }, + "node_modules/livereload": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", - "requires": { + "dependencies": { "chokidar": "^3.5.0", "livereload-js": "^3.3.1", "opts": ">= 1.2.0", "ws": "^7.4.3" + }, + "bin": { + "livereload": "bin/livereload.js" + }, + "engines": { + "node": ">=8.0.0" } }, - "livereload-js": { + "node_modules/livereload-js": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.3.2.tgz", "integrity": "sha512-w677WnINxFkuixAoUEXOStewzLYGI76XVag+0JWMMEyjJQKs0ibWZMxkTlB96Lm3EjZ7IeOxVziBEbtxVQqQZA==" }, - "load-json-file": { + "node_modules/load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { + "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", "pify": "^2.0.0", "pinkie-promise": "^2.0.0", "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" }, - "lodash.assignin": { + "node_modules/lodash.assignin": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" }, - "lodash.bind": { + "node_modules/lodash.bind": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" }, - "lodash.defaults": { + "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" }, - "lodash.difference": { + "node_modules/lodash.difference": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" }, - "lodash.filter": { + "node_modules/lodash.filter": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" }, - "lodash.flatten": { + "node_modules/lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" }, - "lodash.foreach": { + "node_modules/lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" }, - "lodash.isplainobject": { + "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" }, - "lodash.map": { + "node_modules/lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" }, - "lodash.merge": { + "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, - "lodash.pick": { + "node_modules/lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "deprecated": "This package is deprecated. Use destructuring assignment syntax instead." }, - "lodash.reduce": { + "node_modules/lodash.reduce": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" }, - "lodash.reject": { + "node_modules/lodash.reject": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" }, - "lodash.some": { + "node_modules/lodash.some": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" }, - "lodash.union": { + "node_modules/lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" }, - "log-symbols": { + "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "requires": { + "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "logalot": { + "node_modules/logalot": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=", - "requires": { + "dependencies": { "figures": "^1.3.5", "squeak": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "longest": { + "node_modules/longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "engines": { + "node": ">=0.10.0" + } }, - "loud-rejection": { + "node_modules/loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "requires": { + "dependencies": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "lowercase-keys": { + "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } }, - "lpad-align": { + "node_modules/lpad-align": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=", - "requires": { + "dependencies": { "get-stdin": "^4.0.1", "indent-string": "^2.1.0", "longest": "^1.0.0", "meow": "^3.3.0" + }, + "bin": { + "lpad-align": "cli.js" + }, + "engines": { + "node": ">=0.10.0" } }, - "lru-cache": { + "node_modules/lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { + "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, - "make-dir": { + "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { + "dependencies": { "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "map-obj": { + "node_modules/map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "engines": { + "node": ">=0.10.0" + } }, - "media-typer": { + "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } }, - "meow": { + "node_modules/meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { + "dependencies": { "camelcase-keys": "^2.0.0", "decamelize": "^1.1.2", "loud-rejection": "^1.0.0", @@ -2853,288 +4711,505 @@ "read-pkg-up": "^1.0.1", "redent": "^1.0.0", "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "merge-descriptors": { + "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, - "merge-stream": { + "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, - "merge2": { + "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } }, - "methods": { + "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } }, - "micromatch": { + "node_modules/micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "requires": { + "dependencies": { "braces": "^3.0.1", "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" } }, - "mime": { + "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, - "mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { + "dependencies": { "mime-db": "1.52.0" }, - "dependencies": { - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - } + "engines": { + "node": ">= 0.6" } }, - "mimic-fn": { + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "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==" + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } }, - "mimic-response": { + "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } }, - "minimatch": { + "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { + "node_modules/minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, - "mozjpeg": { + "node_modules/minimizer-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mozjpeg": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-7.0.0.tgz", "integrity": "sha512-mH7atSbIusVTO3A4H43sEdmveN3aWn54k6V0edefzCEvOsTrbjg5murY2TsNznaztWnIgaRbWxeLVp4IgKdedQ==", - "requires": { + "hasInstallScript": true, + "dependencies": { "bin-build": "^3.0.0", "bin-wrapper": "^4.0.0", "logalot": "^2.1.0" + }, + "bin": { + "mozjpeg": "cli.js" + }, + "engines": { + "node": ">=10" } }, - "ms": { + "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "mustache": { + "node_modules/mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } }, - "negotiator": { + "node_modules/negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } }, - "nice-try": { + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT", + "peer": true + }, + "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, - "node-fetch": { + "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { + "dependencies": { "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node-notifier": { + "node_modules/node-notifier": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-10.0.1.tgz", "integrity": "sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==", - "requires": { + "dependencies": { "growly": "^1.3.0", "is-wsl": "^2.2.0", "semver": "^7.3.5", "shellwords": "^0.1.1", "uuid": "^8.3.2", "which": "^2.0.2" + } + }, + "node_modules/node-notifier/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-notifier/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-notifier/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/node-notifier/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" } }, - "node-stream-zip": { + "node_modules/node-stream-zip": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", - "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==" + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/antelle" + } }, - "normalize-package-data": { + "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { + "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, - "normalize-path": { + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } }, - "normalize-url": { + "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "npm-conf": { + "node_modules/npm-conf": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", - "requires": { + "dependencies": { "config-chain": "^1.1.11", "pify": "^3.0.0" }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } + "engines": { + "node": ">=4" } }, - "npm-run-path": { + "node_modules/npm-conf/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "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==", - "requires": { + "dependencies": { "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "nth-check": { + "node_modules/nth-check": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", - "requires": { + "dependencies": { "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "oauth-sign": { + "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } }, - "object-assign": { + "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ohm-js": { + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/ohm-js/-/ohm-js-17.5.0.tgz", + "integrity": "sha512-l4Sa7026+6jsvYbt0PXKmL+f+ML32fD++IznLgxDhx2t9Cx6NC7zwRqblCujPHGGmkQerHoeBzRutdxaw/S72g==", + "license": "MIT", + "engines": { + "node": ">=0.12.1" + } }, - "on-finished": { + "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { + "dependencies": { "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "on-headers": { + "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==" + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { + "dependencies": { "wrappy": "1" } }, - "onetime": { + "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { + "dependencies": { "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "open": { + "node_modules/open": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "requires": { + "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "opts": { + "node_modules/opts": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==" }, - "ora": { + "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "requires": { + "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", @@ -3145,531 +5220,840 @@ "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "os-filter-obj": { + "node_modules/os-filter-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", - "requires": { + "dependencies": { "arch": "^2.1.0" + }, + "engines": { + "node": ">=4" } }, - "ow": { + "node_modules/ow": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/ow/-/ow-0.17.0.tgz", "integrity": "sha512-i3keDzDQP5lWIe4oODyDFey1qVrq2hXKTuTH2VpqwpYtzPiKZt2ziRI4NBQmgW40AnV5Euz17OyWweCb+bNEQA==", - "requires": { + "dependencies": { "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-cancelable": { + "node_modules/p-cancelable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "engines": { + "node": ">=4" + } }, - "p-event": { + "node_modules/p-event": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", - "requires": { + "dependencies": { "p-timeout": "^1.1.1" + }, + "engines": { + "node": ">=4" } }, - "p-finally": { + "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } }, - "p-is-promise": { + "node_modules/p-is-promise": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } }, - "p-map-series": { + "node_modules/p-map-series": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", - "requires": { + "dependencies": { "p-reduce": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "p-pipe": { + "node_modules/p-pipe": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", - "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==" + "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "p-queue": { + "node_modules/p-queue": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "requires": { + "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue/node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", "dependencies": { - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "requires": { - "p-finally": "^1.0.0" - } - } + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json/node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/package-json/node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/package-json/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" } }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" + "node_modules/package-json/node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "requires": { - "p-finally": "^1.0.0" + "node_modules/package-json/node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" } }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, + "node_modules/package-json/node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "dependencies": { - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } - } + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "parse-json": { + "node_modules/parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { + "dependencies": { "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "parse5": { + "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, - "parse5-htmlparser2-tree-adapter": { + "node_modules/parse5-htmlparser2-tree-adapter": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "requires": { + "dependencies": { "parse5": "^6.0.1" } }, - "parseurl": { + "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } }, - "path-exists": { + "node_modules/path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { + "dependencies": { "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { + "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "path-to-regexp": { + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "path-type": { + "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } }, - "pend": { + "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, - "performance-now": { + "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "picomatch": { + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC", + "peer": true + }, + "node_modules/picomatch": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==" + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pify": { + "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } }, - "pinkie": { + "node_modules/pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } }, - "pinkie-promise": { + "node_modules/pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { + "dependencies": { "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "pngquant-bin": { + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pngquant-bin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-6.0.0.tgz", "integrity": "sha512-oXWAS9MQ9iiDAJRdAZ9KO1mC5UwhzKkJsmetiu0iqIjJuW7JsuLhmc4JdRm7uJkIWRzIAou/Vq2VcjfJwz30Ow==", - "requires": { + "hasInstallScript": true, + "dependencies": { "bin-build": "^3.0.0", "bin-wrapper": "^4.0.1", "execa": "^4.0.0", "logalot": "^2.0.0" + }, + "bin": { + "pngquant": "cli.js" + }, + "engines": { + "node": ">=10" } }, - "prepend-http": { + "node_modules/prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "engines": { + "node": ">=0.10.0" + } }, - "printj": { + "node_modules/printj": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } }, - "process-nextick-args": { + "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "proto-list": { + "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" }, - "proxy-addr": { + "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { + "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "pseudomap": { + "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, - "psl": { + "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, - "pump": { + "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { + "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, - "punycode": { + "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } }, - "pupa": { + "node_modules/pupa": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "requires": { + "dependencies": { "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "qs": { + "node_modules/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "query-string": { + "node_modules/query-string": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "requires": { + "dependencies": { "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "queue-microtask": { + "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "range-parser": { + "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } }, - "raw-body": { + "node_modules/raw-body": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", - "requires": { + "dependencies": { "bytes": "3.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "rc": { + "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { + "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" } }, - "read-pkg": { + "node_modules/read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { + "dependencies": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", "path-type": "^1.0.0" }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - } + "engines": { + "node": ">=0.10.0" } }, - "read-pkg-up": { + "node_modules/read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { + "dependencies": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "readable-stream": { + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { + "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "readdir-glob": { + "node_modules/readdir-glob": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "requires": { + "dependencies": { "minimatch": "^3.0.4" } }, - "readdirp": { + "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { + "dependencies": { "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "rechoir": { + "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { + "dependencies": { "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" } }, - "redent": { + "node_modules/redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { + "dependencies": { "indent-string": "^2.1.0", "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "registry-auth-token": { + "node_modules/registry-auth-token": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "requires": { + "dependencies": { "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" } }, - "registry-url": { + "node_modules/registry-url": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "requires": { + "dependencies": { "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" } }, - "remove-trailing-separator": { + "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, - "repeating": { + "node_modules/repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { + "dependencies": { "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "replace-ext": { + "node_modules/replace-ext": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "engines": { + "node": ">= 0.10" + } }, - "request": { + "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", @@ -3691,143 +6075,287 @@ "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - } + "engines": { + "node": ">= 6" } }, - "request-promise": { + "node_modules/request-promise": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", - "requires": { + "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dependencies": { "bluebird": "^3.5.0", "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" } }, - "request-promise-core": { + "node_modules/request-promise-core": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "requires": { + "dependencies": { "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" } }, - "resolve": { + "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "requires": { + "dependencies": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "responselike": { + "node_modules/responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "requires": { + "dependencies": { "lowercase-keys": "^1.0.0" } }, - "restore-cursor": { + "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { + "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" } }, - "reusify": { + "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "run-parallel": { + "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { "queue-microtask": "^1.2.2" } }, - "safe-buffer": { + "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==" }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sanitize-filename": { + "node_modules/sanitize-filename": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "requires": { + "dependencies": { "truncate-utf8-bytes": "^1.0.0" } }, - "seek-bzip": { + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/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", + "peer": true + }, + "node_modules/seek-bzip": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", - "requires": { + "dependencies": { "commander": "^2.8.1" }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" } }, - "semver": { + "node_modules/seek-bzip/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } }, - "semver-diff": { + "node_modules/semver-diff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "requires": { + "dependencies": { "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" } }, - "semver-regex": { + "node_modules/semver-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==" + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "engines": { + "node": ">=6" + } }, - "semver-truncate": { + "node_modules/semver-truncate": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", - "requires": { + "dependencies": { "semver": "^5.3.0" }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "engines": { + "node": ">=0.10.0" } }, - "send": { + "node_modules/semver-truncate/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { "version": "0.17.2", "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "requires": { + "dependencies": { "debug": "2.6.9", "depd": "~1.1.2", "destroy": "~1.0.4", @@ -3842,170 +6370,223 @@ "range-parser": "~1.2.1", "statuses": "~1.5.0" }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } + "engines": { + "node": ">= 0.8.0" } }, - "serve-static": { + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { "version": "1.14.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "requires": { + "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.17.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "setprototypeof": { + "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "shebang-command": { + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } }, - "shelljs": { + "node_modules/shelljs": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "requires": { + "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" } }, - "shellwords": { + "node_modules/shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } }, - "sort-keys": { + "node_modules/sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { + "dependencies": { "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "sort-keys-length": { + "node_modules/sort-keys-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", - "requires": { + "dependencies": { "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "source-map": { + "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } }, - "source-map-support": { + "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "spdx-correct": { + "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { + "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-exceptions": { + "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, - "spdx-expression-parse": { + "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { + "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-license-ids": { + "node_modules/spdx-license-ids": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" }, - "squeak": { + "node_modules/squeak": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=", - "requires": { + "dependencies": { "chalk": "^1.0.0", "console-stream": "^0.1.1", "lpad-align": "^1.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/squeak/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/squeak/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/squeak/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "engines": { + "node": ">=0.8.0" } }, - "srcset": { + "node_modules/srcset": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/srcset/-/srcset-2.0.1.tgz", - "integrity": "sha512-00kZI87TdRKwt+P8jj8UZxbfp7mK2ufxcIMWvhAOZNJTRROimpHeruWrGvCZneiuVDLqdyHefVp748ECTnyUBQ==" + "integrity": "sha512-00kZI87TdRKwt+P8jj8UZxbfp7mK2ufxcIMWvhAOZNJTRROimpHeruWrGvCZneiuVDLqdyHefVp748ECTnyUBQ==", + "engines": { + "node": ">=8" + } }, - "sshpk": { + "node_modules/sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { + "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", @@ -4015,318 +6596,468 @@ "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" } }, - "statuses": { + "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } }, - "stealthy-require": { + "node_modules/stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "engines": { + "node": ">=0.10.0" + } }, - "strict-uri-encode": { + "node_modules/strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } }, - "string-width": { + "node_modules/string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } + "engines": { + "node": ">=8" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { + "dependencies": { "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { + "dependencies": { "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "strip-dirs": { + "node_modules/strip-dirs": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "requires": { + "dependencies": { "is-natural-number": "^4.0.1" } }, - "strip-eof": { + "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "engines": { + "node": ">=0.10.0" + } }, - "strip-final-newline": { + "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==" + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } }, - "strip-indent": { + "node_modules/strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { + "dependencies": { "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" } }, - "strip-json-comments": { + "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": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } }, - "strip-outer": { + "node_modules/strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "requires": { + "dependencies": { "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "supports-color": { + "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==", - "requires": { + "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "tar-stream": { + "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { + "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" } }, - "temp-dir": { + "node_modules/temp-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "engines": { + "node": ">=4" + } }, - "tempfile": { + "node_modules/tempfile": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", - "requires": { + "dependencies": { "temp-dir": "^1.0.0", "uuid": "^3.0.1" + }, + "engines": { + "node": ">=4" } }, - "terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", - "requires": { - "acorn": "^8.5.0", + "node_modules/terser": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.49.2.tgz", + "integrity": "sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" } }, - "through": { + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, - "timed-out": { + "node_modules/timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "engines": { + "node": ">=0.10.0" + } }, - "to-buffer": { + "node_modules/to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" }, - "to-readable-stream": { + "node_modules/to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "toidentifier": { + "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } }, - "tough-cookie": { + "node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { + "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" } }, - "tr46": { + "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, - "trim-newlines": { + "node_modules/trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "engines": { + "node": ">=0.10.0" + } }, - "trim-repeated": { + "node_modules/trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", - "requires": { + "dependencies": { "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "truncate-utf8-bytes": { + "node_modules/truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", - "requires": { + "dependencies": { "utf8-byte-length": "^1.0.1" } }, - "tslib": { + "node_modules/tslib": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, - "tunnel-agent": { + "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { + "dependencies": { "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" } }, - "tweetnacl": { + "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, - "type-fest": { + "node_modules/type-fest": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "type-is": { + "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { + "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "typedarray-to-buffer": { + "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { + "dependencies": { "is-typedarray": "^1.0.0" } }, - "unbzip2-stream": { + "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "requires": { + "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" } }, - "unique-string": { + "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { + "dependencies": { "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "universalify": { + "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } }, - "unpipe": { + "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } }, - "update-notifier": { + "node_modules/update-notifier": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "requires": { + "dependencies": { "boxen": "^5.0.0", "chalk": "^4.1.0", "configstore": "^5.0.1", @@ -4342,128 +7073,350 @@ "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/update-notifier/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/update-notifier/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "uri-js": { + "node_modules/update-notifier/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "url-parse-lax": { + "node_modules/url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { + "dependencies": { "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "url-to-options": { + "node_modules/url-to-options": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "engines": { + "node": ">= 4" + } }, - "utf8-byte-length": { + "node_modules/utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=" }, - "util-deprecate": { + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "utils-merge": { + "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } }, - "uuid": { + "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "bin": { + "uuid": "bin/uuid" + } }, - "valid-url": { + "node_modules/valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=" }, - "validate-npm-package-license": { + "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { + "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "vary": { + "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } }, - "verror": { + "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { + "engines": [ + "node >=0.6.0" + ], + "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, - "walkdir": { + "node_modules/vscode-json-languageservice": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-5.7.2.tgz", + "integrity": "sha512-WtKRDtJfFEmLrgtu+ODexOHm/6/krRF0k6t+uvkKIKW1Jh9ZIyxZQwJJwB3qhrEgvAxa37zbUg+vn+UyUK/U2w==", + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "jsonc-parser": "^3.3.1", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "^3.17.5", + "vscode-uri": "^3.1.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.0.tgz", + "integrity": "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "license": "MIT" + }, + "node_modules/walkdir": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", - "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=" + "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/watchpack": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } }, - "wcwidth": { + "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "requires": { + "dependencies": { "defaults": "^1.0.3" } }, - "webidl-conversions": { + "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, - "website-scraper": { + "node_modules/webpack": { + "version": "5.109.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.109.2.tgz", + "integrity": "sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.24.4", + "es-module-lexer": "^2.1.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "graceful-fs": "^4.2.11", + "mime-db": "^1.54.0", + "minimizer-webpack-plugin": "^5.6.1", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "watchpack": "^2.5.2", + "webpack-sources": "^3.5.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", + "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.6.1", + "@webpack-cli/configtest": "^3.0.1", + "@webpack-cli/info": "^3.0.1", + "@webpack-cli/serve": "^3.0.1", + "colorette": "^2.0.14", + "commander": "^12.1.0", + "cross-spawn": "^7.0.3", + "envinfo": "^7.14.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^6.0.1" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.82.0" + }, + "peerDependenciesMeta": { + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/webpack-cli/node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-cli/node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/website-scraper": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/website-scraper/-/website-scraper-4.2.3.tgz", "integrity": "sha512-Pqrirzwt02NtaTFkBulF3fGSvPGOAVpdwPFHzoh49gFjU2GgaEgoW8WMlhPbzRcQkd6+XmsU+LZeW9SiluDHkA==", - "requires": { + "dependencies": { "bluebird": "^3.0.1", "cheerio": "0.22.0", "css-url-parser": "^1.0.0", @@ -4476,283 +7429,375 @@ "request": "^2.85.0", "sanitize-filename": "^1.6.3", "srcset": "^2.0.0" - }, - "dependencies": { - "cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - } } }, - "website-scraper-existing-directory": { + "node_modules/website-scraper-existing-directory": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/website-scraper-existing-directory/-/website-scraper-existing-directory-0.1.0.tgz", "integrity": "sha512-78VNoIB6fw3dpPhyQtY27RIdgwnCZsAXGINbZZ6MAHHAdBlQPcHT5C3UjHU8zPx8mx7G2odp2O7SoPO9HklkKg==", - "requires": { + "dependencies": { "fs-extra": "^7.0.1" }, + "peerDependencies": { + "website-scraper": "^4.0.0" + } + }, + "node_modules/website-scraper-existing-directory/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/website-scraper-existing-directory/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/website-scraper-existing-directory/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/website-scraper/node_modules/cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/website-scraper/node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/website-scraper/node_modules/css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "engines": { + "node": "*" + } + }, + "node_modules/website-scraper/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "whatwg-url": { + "node_modules/website-scraper/node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/website-scraper/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/website-scraper/node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/website-scraper/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/website-scraper/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/website-scraper/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/website-scraper/node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/website-scraper/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/website-scraper/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/website-scraper/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/website-scraper/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/website-scraper/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { + "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "widest-line": { + "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "requires": { + "dependencies": { "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "wrap-ansi": { + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write-file-atomic": { + "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { + "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, - "ws": { + "node_modules/ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "xdg-basedir": { + "node_modules/xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } }, - "xtend": { + "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } }, - "yallist": { + "node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, - "yauzl": { + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "requires": { + "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, - "zip-stream": { + "node_modules/zip-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", - "requires": { + "dependencies": { "archiver-utils": "^2.1.0", "compress-commons": "^4.1.0", "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" } } } diff --git a/package.json b/package.json index 9eb719a..f181a00 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,14 @@ }, "homepage": "https://developers.siteglide.com/introducing-siteglide-cli", "engines": { - "node": ">=12" + "node": ">=18" }, "keywords": [ "Siteglide" ], "dependencies": { + "@platformos/platformos-check-node": "^0.0.20", + "@platformos/platformos-common": "^0.0.18", "archiver": "^5.3.0", "archiver-promise": "^1.0.0", "async": "^3.2.3", @@ -62,6 +64,7 @@ "siteglide-cli": "./siteglide-cli.js", "siteglide-cli-add": "./siteglide-cli-add.js", "siteglide-cli-archive": "./siteglide-cli-archive.js", + "siteglide-cli-check": "./siteglide-cli-check.js", "siteglide-cli-deploy": "./siteglide-cli-deploy.js", "siteglide-cli-export": "./siteglide-cli-export.js", "siteglide-cli-gui": "./siteglide-cli-gui.js", diff --git a/siteglide-cli.js b/siteglide-cli.js index 4af7dc6..fbd1867 100755 --- a/siteglide-cli.js +++ b/siteglide-cli.js @@ -29,6 +29,7 @@ program .command('gui [environment]', 'gui for GraphiQL and Liquid Evaluator') .command('logs [environment]', 'stream debugging logs from your website') .command('init', 'create default folder structure for Siteglide Admin') + .command('check [path]', 'check Liquid code quality with platformos-check linter') .command('deploy [environment]', 'upload all code to your site') .command('export [environment]', 'export the code, assets and data from your site') .command('migrate [environment] --url [url]', 'Static site migration into siteglide') From 953df51d26907628bbaf1d2a20bbc0c3d998bf46 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Thu, 6 Aug 2026 14:39:03 +0100 Subject: [PATCH 13/34] Enhance env list --- lib/envClassification.js | 104 +++++++++++++++++++++++++++++++++++++++ package.json | 1 + siteglide-cli-list.js | 50 +++++++++++++------ siteglide-cli.js | 2 +- 4 files changed, 140 insertions(+), 17 deletions(-) create mode 100644 lib/envClassification.js diff --git a/lib/envClassification.js b/lib/envClassification.js new file mode 100644 index 0000000..a13f3f1 --- /dev/null +++ b/lib/envClassification.js @@ -0,0 +1,104 @@ +/** + * Environment host/classification helpers. + * Keep behaviour aligned with Siteglide-MCP---Experimental/src/ops/security.js + * (hostnameFromUrl, isStagingHostname, classifyEnvironment). + */ + +/** + * @param {string} url + * @returns {string} + */ +function hostnameFromUrl(url) { + if (!url || typeof url !== 'string') { + return ''; + } + try { + const withProto = /^https?:\/\//i.test(url) ? url : `https://${url}`; + return new URL(withProto).hostname.toLowerCase(); + } catch { + return String(url) + .replace(/^https?:\/\//i, '') + .split('/')[0] + .split(':')[0] + .toLowerCase(); + } +} + +/** + * @param {string} host + * @returns {boolean} + */ +function isStagingHostname(host) { + if (!host) { + return false; + } + const h = host.toLowerCase(); + if (h.includes('staging-siteglide.com') || h.endsWith('staging-siteglide.com')) { + return true; + } + if (h.includes('.staging.oregon.platform-os.com')) { + return true; + } + const extra = (process.env.SITEGLIDE_MCP_NONPROD_URL_SUFFIXES || '') + .split(',') + .map((s) => s.trim().toLowerCase()) + .filter(Boolean); + for (const suffix of extra) { + if (h === suffix || h.endsWith(suffix) || h.includes(suffix)) { + return true; + } + } + return false; +} + +/** + * @param {{ url?: string } | null | undefined} auth + * @returns {'staging' | 'production'} + */ +function classifyEnvironment(auth) { + const host = hostnameFromUrl(auth?.url || ''); + if (isStagingHostname(host)) { + return 'staging'; + } + return 'production'; +} + +/** + * List environments from config (and optional MPKIT_* override), matching MCP envs_list shape. + * @param {Record} settings + * @param {{ details?: boolean }} [opts] + * @returns {Array<{ name: string, host?: string, url?: string, classification?: string }>} + */ +function listEnvironments(settings, opts = {}) { + const details = Boolean(opts.details); + const env = process.env; + + if (env.MPKIT_URL && env.MPKIT_TOKEN && env.MPKIT_EMAIL) { + const auth = { url: env.MPKIT_URL, email: env.MPKIT_EMAIL, token: env.MPKIT_TOKEN }; + const host = hostnameFromUrl(auth.url); + const item = { name: '(MPKIT)', url: auth.url }; + if (details) { + item.host = host; + item.classification = classifyEnvironment(auth); + } + return [item]; + } + + return Object.keys(settings || {}).map((name) => { + const entry = settings[name] || {}; + const url = entry.url || ''; + const item = { name, url }; + if (details) { + item.host = hostnameFromUrl(url); + item.classification = classifyEnvironment({ url }); + } + return item; + }); +} + +module.exports = { + hostnameFromUrl, + isStagingHostname, + classifyEnvironment, + listEnvironments +}; diff --git a/package.json b/package.json index 206f398..5c91661 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,7 @@ "siteglide-cli-gui": "./siteglide-cli-gui.js", "siteglide-cli-import": "./siteglide-cli-import.js", "siteglide-cli-init": "./siteglide-cli-init.js", + "siteglide-cli-list": "./siteglide-cli-list.js", "siteglide-cli-logs": "./siteglide-cli-logs.js", "siteglide-cli-mcp": "./siteglide-cli-mcp.js", "siteglide-cli-migrate": "./siteglide-cli-migrate.js", diff --git a/siteglide-cli-list.js b/siteglide-cli-list.js index d149564..0eaf3ad 100644 --- a/siteglide-cli-list.js +++ b/siteglide-cli-list.js @@ -1,21 +1,39 @@ #!/usr/bin/env node -const logger = require('./lib/logger'), - files = require('./lib/assets/files'); +const program = require('commander'), + logger = require('./lib/logger'), + files = require('./lib/assets/files'), + { listEnvironments } = require('./lib/envClassification'), + version = require('./package.json').version; -const listEnvironments = () => { - const settings = Object(files.getConfig()); - const list = Object.keys(settings); +program + .version(version, '-v, --version') + .name('siteglide-cli list') + .usage('[options]') + .description('List environments from .siteglide-config. Use --details for host and staging/production classification (same rules as MCP envs_list).') + .option('-d --details', 'include host and classification (staging|production)') + .option('-c --config-file ', 'config file path', '.siteglide-config') + .action((params) => { + process.env.CONFIG_FILE_PATH = params.configFile; + const settings = Object(files.getConfig()); + const environments = listEnvironments(settings, { details: params.details }); - if (list.length) { - logger.Info('Available environments: '); - for (const id in list) { - const env = list[id]; - logger.Info(`- [${env}] ${settings[env].url}`, { hideTimestamp: true }); - } - } else { - logger.Error('No environments registered yet, please see siteglide-cli add', { exit: false }); - } -}; + if (!environments.length) { + logger.Error('No environments registered yet, please see siteglide-cli add', { exit: false }); + return; + } -listEnvironments(); + logger.Info('Available environments: '); + for (const env of environments) { + if (params.details) { + logger.Info( + `- [${env.name}] ${env.url} host=${env.host} classification=${env.classification}`, + { hideTimestamp: true } + ); + } else { + logger.Info(`- [${env.name}] ${env.url}`, { hideTimestamp: true }); + } + } + }); + +program.parse(process.argv); diff --git a/siteglide-cli.js b/siteglide-cli.js index f3df1a6..2e206b6 100755 --- a/siteglide-cli.js +++ b/siteglide-cli.js @@ -23,7 +23,7 @@ updateNotifier({ program .version(version, '-v, --version') .command('add [environment] --email [email] --url [url]', 'Add a site or environment') - .command('list', 'List your current environments for the site') + .command('list', 'List environments (use list --details for host + staging/production)') .command('sync [environment]', 'update site on local file change') .command('pull [environment]', 'get all files from site') .command('gui [environment]', 'gui for Admin, Logs, GraphiQL and Liquid Evaluator') From 311c31f14214955a8b1bbfddf41e4065183394d2 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Thu, 6 Aug 2026 15:19:50 +0100 Subject: [PATCH 14/34] Stop the rename marketplace_builder step. --- lib/migrateAppDirectory.js | 87 ++------------------------------- scripts/build-test-share-zip.js | 22 ++++++++- scripts/smoke-migrate-app.js | 25 ---------- siteglide-cli-pull.js | 29 +++-------- 4 files changed, 32 insertions(+), 131 deletions(-) delete mode 100644 scripts/smoke-migrate-app.js diff --git a/lib/migrateAppDirectory.js b/lib/migrateAppDirectory.js index 0cbdf5f..27ce4d1 100644 --- a/lib/migrateAppDirectory.js +++ b/lib/migrateAppDirectory.js @@ -1,90 +1,12 @@ const fs = require('fs-extra'), path = require('path'), dir = require('./directories'), - logger = require('./logger'), - Confirm = require('./confirm'); + logger = require('./logger'); /** - * TEMPORARY: ask before renaming marketplace_builder → app (remove later). - * Lets you keep legacy layout on production sites while testing a newer CLI. - * - * @returns {Promise} true if user answered Y - */ -const confirmRenameLegacyToApp = async () => { - logger.Info( - `This project still uses ${dir.LEGACY_APP}/. platformOS (and AI tools) prefer ${dir.APP}/ — ` + - 'renaming keeps the layout tidier and helps AI tools recognise the code structure.' - ); - logger.Info( - '(Temporary prompt — say n to leave marketplace_builder/ alone, e.g. for an older CLI on other projects.)' - ); - const answer = await Confirm( - `Rename ${dir.LEGACY_APP}/ → ${dir.APP}/ before pull? (Y/n)\n` - ); - return answer === 'Y'; -}; - -/** - * Rename marketplace_builder → app on disk only (no git staging — large trees - * can hit ENOBUFS on Windows; users stage/commit themselves if they want). - * - * @param {string} cwd - * @returns {Promise<'renamed-fs'>} - */ -const renameLegacyToApp = async (cwd) => { - const legacy = path.join(cwd, dir.LEGACY_APP); - const modern = path.join(cwd, dir.APP); - - logger.Info(`[pull] Migrating ${dir.LEGACY_APP}/ → ${dir.APP}/ (filesystem rename)`); - await fs.move(legacy, modern, { overwrite: false }); - logger.Info( - `[pull] Renamed ${dir.LEGACY_APP}/ → ${dir.APP}/. ` + - 'Stage and commit in git yourself if you want rename history recorded.' - ); - return 'renamed-fs'; -}; - -/** - * platformOS guidance: use `app/` not legacy `marketplace_builder/`. - * If only the legacy folder exists, rename it to `app`. - * - * @param {{ cwd?: string, skipConfirm?: boolean }} [opts] - * @returns {Promise<'renamed-fs'|'skipped-both'|'skipped-missing'|'skipped-declined'>} - */ -const migrateMarketplaceBuilderToApp = async (opts = {}) => { - const cwd = opts.cwd || process.cwd(); - const legacy = path.join(cwd, dir.LEGACY_APP); - const modern = path.join(cwd, dir.APP); - - if (!(await fs.pathExists(legacy))) { - return 'skipped-missing'; - } - - if (await fs.pathExists(modern)) { - logger.Warn( - `[pull] Both ${dir.LEGACY_APP}/ and ${dir.APP}/ exist — leaving both. Prefer ${dir.APP}/ (platformOS).`, - { exit: false } - ); - return 'skipped-both'; - } - - // TEMPORARY confirm — remove skipConfirm default / prompt when ready to always migrate. - if (!opts.skipConfirm) { - const ok = await confirmRenameLegacyToApp(); - if (!ok) { - logger.Info( - `[pull] Keeping ${dir.LEGACY_APP}/ (pull will write there). Prefer ${dir.APP}/ when you can.` - ); - return 'skipped-declined'; - } - } - - return renameLegacyToApp(cwd); -}; - -/** - * Which folder pull should write site files into after migrate. - * Prefer app/ when present; otherwise marketplace_builder/ if that was kept. + * Which folder pull should write site files into. + * Prefer existing on-disk root: app/ if present, else marketplace_builder/. + * Defaults to app/ only when neither exists yet. * * @param {string} [cwd] * @returns {Promise} @@ -117,7 +39,6 @@ const assertExclusiveSiteAppRoot = (cwd = process.cwd()) => { }; module.exports = { - migrateMarketplaceBuilderToApp, resolveSiteAppRoot, assertExclusiveSiteAppRoot }; diff --git a/scripts/build-test-share-zip.js b/scripts/build-test-share-zip.js index 5321cd1..08ffbad 100644 --- a/scripts/build-test-share-zip.js +++ b/scripts/build-test-share-zip.js @@ -137,6 +137,12 @@ Then confirm: where siteglide-cli-test (Windows) or which siteglide-cli-test (Mac/Linux) Do NOT install over or uninstall the normal siteglide-cli package. +Do NOT create or edit mcp.json by hand — pull writes IDE MCP config. + +When the user is ready (site folder open, environment already added if needed), run a first pull from that site, e.g.: + siteglide-cli-test pull staging + +After pull finishes, tell the user to enable the Siteglide test MCP server in their AI tool settings (e.g. Cursor: Settings → Tools & MCP → enable siteglide-test) and reload the window if tools do not appear. \`\`\` ## Manual install (PowerShell) @@ -150,14 +156,23 @@ npm install -g . siteglide-cli-test --version \`\`\` -## Try it on a Siteglide site +## First pull (registers MCP in the site project) + +When you are ready — in a Siteglide site folder that already has an environment (e.g. via \`siteglide-cli-test add\`): \`\`\`powershell cd path\\to\\your-site siteglide-cli-test pull staging \`\`\` -Then in Cursor: **Settings → Tools & MCP** → enable **siteglide-test** → reload the window. +Pull writes \`.cursor/mcp.json\` (and other IDE configs) pointing at the installed CLI. Do not create \`mcp.json\` by hand. + +## Enable MCP in your AI tool + +After pull finishes, turn the server on in settings, then reload if needed: + +- **Cursor:** Settings → Tools & MCP → enable **siteglide-test** → reload the window +- **Other tools:** enable the **siteglide-test** MCP server in that product's MCP settings Commands use the \`siteglide-cli-test\` prefix, e.g.: @@ -183,6 +198,9 @@ Your normal \`siteglide-cli\` is unchanged. 3. Run: cd ../siteglide-cli-test && npm install && npm install -g . 4. Confirm \`siteglide-cli-test --version\` works. 5. Do not remove or overwrite the normal siteglide-cli package. +6. Do not create or edit mcp.json by hand — pull writes IDE MCP config. +7. When I am ready (site folder open; environment added if needed), run a first pull from that site, e.g. siteglide-cli-test pull staging. +8. After pull finishes, prompt me to enable the Siteglide test MCP server in my AI tool settings (e.g. Cursor: Settings → Tools & MCP → enable siteglide-test) and reload the window if tools do not appear. This is a test build; commands are siteglide-cli-test (not siteglide-cli). `; diff --git a/scripts/smoke-migrate-app.js b/scripts/smoke-migrate-app.js deleted file mode 100644 index 1d42da7..0000000 --- a/scripts/smoke-migrate-app.js +++ /dev/null @@ -1,25 +0,0 @@ -const assert = require('assert'); -const fs = require('fs-extra'); -const os = require('os'); -const path = require('path'); -const { migrateMarketplaceBuilderToApp } = require('../lib/migrateAppDirectory'); - -(async () => { - const root = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-migrate-')); - await fs.mkdir(path.join(root, 'marketplace_builder')); - await fs.writeFile(path.join(root, 'marketplace_builder', 'x.txt'), 'ok'); - - const result = await migrateMarketplaceBuilderToApp({ cwd: root, skipConfirm: true }); - assert.equal(result, 'renamed-fs'); - assert.equal(await fs.pathExists(path.join(root, 'app', 'x.txt')), true); - assert.equal(await fs.pathExists(path.join(root, 'marketplace_builder')), false); - - const skip = await migrateMarketplaceBuilderToApp({ cwd: root, skipConfirm: true }); - assert.equal(skip, 'skipped-missing'); - - await fs.remove(root); - console.log('migrate app directory smoke ok'); -})().catch((error) => { - console.error(error); - process.exit(1); -}); diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index d2269b6..13c4655 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -16,7 +16,6 @@ const program = require('commander'), dir = require('./lib/directories'), { ensureMcpRegistered, ensureMcpIdeRules } = require('./lib/ai'), { - migrateMarketplaceBuilderToApp, resolveSiteAppRoot } = require('./lib/migrateAppDirectory'); @@ -397,12 +396,11 @@ const moveModulesToRoot = async (fromRoot) => { }; /** - * Download the main site backup zip and convert it into the local site root (`app/` or - * `marketplace_builder/` if the temporary rename confirm was declined). + * Download the main site backup zip and convert it into the local site root (`app/`). * Calls Siteglide-API `/cli/backup` then `/cli/backupStatus/:id` (no module_name). * * @param {Gateway} gateway - Authenticated API client for the current environment. - * @param {string} [siteRoot] - Relative site folder (`app` or `marketplace_builder`). + * @param {string} [siteRoot] - Relative site folder (`app` or, rarely, `marketplace_builder`). * Side effects: writes/overwrites that folder; may merge into `./modules`; * updates `pullSpinner` text; downloads then deletes a temporary zip. */ @@ -434,13 +432,11 @@ const pullSiteZip = async (gateway, siteRoot = dir.APP) => { * * @param {Gateway} gateway - Authenticated API client for the current environment. * @param {string} moduleName - Installed module machine name to pull. - * @param {number} index - 1-based position in the current pull queue (for logs). - * @param {number} total - Total modules in the current pull queue (for logs). * Side effects: writes/overwrites files under `./modules`; updates `pullSpinner` text; * uses then deletes a temp zip and `.tmp/pull-` work directory. */ -const pullModuleZip = async (gateway, moduleName, index, total) => { - logger.Info(`[pull] Module ${moduleName} (${index}/${total})`); +const pullModuleZip = async (gateway, moduleName) => { + logger.Info(`[pull] Starting module ${moduleName}`); const filename = `${dir.MODULES}-${moduleName}.zip`; const workDir = path.join(dir.TMP, `pull-${moduleName}`); const pullTask = await gateway.pullZip({ module_name: moduleName }); @@ -470,7 +466,6 @@ const pullModuleZip = async (gateway, moduleName, index, total) => { if (await fs.pathExists(`./${workDir}`)) { await fs.remove(`./${workDir}`); } - logger.Info(`[pull] Module "${moduleName}" done`); }; /** @@ -526,9 +521,10 @@ const pullModulesInParallel = async (gateway, modulesToPull, concurrency) => { pullSpinner.text = `Pulling modules (up to ${limit} at a time)`; let completed = 0; - await mapLimit(modulesToPull, limit, async (moduleName, index) => { - await pullModuleZip(gateway, moduleName, index + 1, total); + await mapLimit(modulesToPull, limit, async (moduleName) => { + await pullModuleZip(gateway, moduleName); completed += 1; + logger.Info(`[pull] Module "${moduleName}" done (${completed}/${total})`); pullSpinner.text = `Pulling modules (${completed}/${total} done, up to ${limit} at a time)`; }); @@ -688,7 +684,7 @@ program .version(version, '-v, --version') .name('siteglide-cli pull') .usage('') - .description('Pull site files into app/ and module public files into modules/. Migrates marketplace_builder/ → app/ when needed (filesystem rename + staged exact path rewrite in a git repo). Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds IDE discovery folders linked to ./.agents/skills. Registers Siteglide MCP in IDE configs if missing. Modules pull in parallel (see --concurrency). Overwrites local files. By default pulls all installed modules; use -m to filter to one module.') + .description('Pull site files into the existing site root (app/ or marketplace_builder/) and module public files into modules/. Does not rename marketplace_builder/ ↔ app/. Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds IDE discovery folders linked to ./.agents/skills. Registers Siteglide MCP in IDE configs if missing. Modules pull in parallel (see --concurrency). Overwrites local files. By default pulls all installed modules; use -m to filter to one module.') .arguments('[environment]', 'Name of environment. Example: staging') .option('-c --config-file ', 'config file path', '.siteglide-config') .option('-i --ignore-assets', 'Do not download assets such as CSS, JS, JSON etc', false) @@ -717,10 +713,6 @@ program return Confirm('Are you sure you would like to pull? This will overwrite your local files immediately! (Y/n)\n').then(async function (response) { if (response === 'Y') { try { - // Must run before any unzip/download creates ./app (otherwise both - // marketplace_builder/ and app/ appear and migration is skipped). - // TEMPORARY: prompts before rename — remove confirm later. - const migrateResult = await migrateMarketplaceBuilderToApp(); const siteRoot = await resolveSiteAppRoot(); logger.Info(`[pull] Site files root: ${siteRoot}/`); @@ -778,11 +770,6 @@ program await tidyUpAfterPull(); logger.Info('[pull] All steps finished'); - if (migrateResult === 'renamed-fs') { - logger.Info( - '[pull] Tip: if you use git, stage/commit the marketplace_builder/ → app/ rename when ready' - ); - } pullSpinner.succeed('Pulled files'); } catch (e) { logger.Debug(e); From 69e7735c33a492d467005a87cfc71273d38cd4a1 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Thu, 6 Aug 2026 15:48:47 +0100 Subject: [PATCH 15/34] Zip has time --- scripts/build-test-share-zip.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/build-test-share-zip.js b/scripts/build-test-share-zip.js index 08ffbad..f596abe 100644 --- a/scripts/build-test-share-zip.js +++ b/scripts/build-test-share-zip.js @@ -11,7 +11,12 @@ const CLI_ROOT = path.resolve(__dirname, '..'); const MCP_ROOT = path.resolve(CLI_ROOT, '..', 'Siteglide-MCP---Experimental'); const OUT_ROOT = path.resolve(CLI_ROOT, '..', 'siteglide-cli-workspace-notes', 'dist'); const STAGE = path.join(OUT_ROOT, 'siteglide-cli-test-bundle'); -const ZIP_NAME = `siteglide-cli-test-${new Date().toISOString().slice(0, 10)}.zip`; +const pad2 = (n) => String(n).padStart(2, '0'); +const zipStamp = (() => { + const d = new Date(); + return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}-${pad2(d.getHours())}${pad2(d.getMinutes())}${pad2(d.getSeconds())}`; +})(); +const ZIP_NAME = `siteglide-cli-test-${zipStamp}.zip`; const CLI_SKIP = new Set([ 'node_modules', From 16631e078cffd9ae6c5c3a7b2ebb7b241aefd066 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Fri, 14 Aug 2026 13:16:48 +0100 Subject: [PATCH 16/34] Gate MCP setup on pull behind .siteglide/alpha.json credentials. Skip IDE MCP registration unless alpha npm credentials exist; check installed version and offer alpha upgrades when MCP is already configured. Point local MCP dependency at Siteglide-MCP. Co-authored-by: Cursor --- .gitignore | 1 + .siteglide/alpha.json.example | 6 + lib/envClassification.js | 2 +- lib/mcpAlpha.js | 351 ++++++++++++++++++++++++++++++++ package.json | 2 +- scripts/build-test-share-zip.js | 2 +- scripts/smoke-mcp-register.js | 37 +++- siteglide-cli-mcp.js | 4 +- siteglide-cli-pull.js | 7 +- 9 files changed, 397 insertions(+), 15 deletions(-) create mode 100644 .siteglide/alpha.json.example create mode 100644 lib/mcpAlpha.js diff --git a/.gitignore b/.gitignore index e23c6c2..bfc8e16 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .siteglide-config +.siteglide/alpha.json node_modules /marketplace_builder .env diff --git a/.siteglide/alpha.json.example b/.siteglide/alpha.json.example new file mode 100644 index 0000000..4d4ac79 --- /dev/null +++ b/.siteglide/alpha.json.example @@ -0,0 +1,6 @@ +{ + "token": "npm_xxxxxxxx", + "registry": "https://registry.npmjs.org/", + "tag": "alpha", + "package": "@siteglide/siteglide-mcp" +} diff --git a/lib/envClassification.js b/lib/envClassification.js index a13f3f1..d5d3303 100644 --- a/lib/envClassification.js +++ b/lib/envClassification.js @@ -1,6 +1,6 @@ /** * Environment host/classification helpers. - * Keep behaviour aligned with Siteglide-MCP---Experimental/src/ops/security.js + * Keep behaviour aligned with Siteglide-MCP/src/ops/security.js * (hostnameFromUrl, isStagingHostname, classifyEnvironment). */ diff --git a/lib/mcpAlpha.js b/lib/mcpAlpha.js new file mode 100644 index 0000000..3d447bc --- /dev/null +++ b/lib/mcpAlpha.js @@ -0,0 +1,351 @@ +const fs = require('fs'), + os = require('os'), + path = require('path'), + { execFileSync } = require('child_process'), + fetch = require('node-fetch'), + semver = require('semver'), + logger = require('./logger'), + Confirm = require('./confirm'), + { + SERVER_NAME, + ensureMcpRegistered, + ensureMcpIdeRules, + getRegistryTargets + } = require('./ai'); + +const DEFAULT_PACKAGE = '@siteglide/siteglide-mcp'; +const DEFAULT_REGISTRY = 'https://registry.npmjs.org/'; +const DEFAULT_TAG = 'alpha'; +const ALPHA_RELATIVE_PATH = path.join('.siteglide', 'alpha.json'); + +const resolveCliRoot = () => path.resolve(__dirname, '..'); + +const resolveAlphaPath = (rootPath = process.cwd()) => path.join(rootPath, ALPHA_RELATIVE_PATH); + +const readJsonObject = (filePath) => { + if (!fs.existsSync(filePath)) { + return null; + } + try { + const parsed = JSON.parse(fs.readFileSync(filePath, 'utf8')); + if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) { + return parsed; + } + } catch (error) { + logger.Warn(`[pull] ${ALPHA_RELATIVE_PATH} is invalid JSON (${error.message})`, { exit: false }); + } + return null; +}; + +/** + * Read npm credentials for restricted MCP installs from ./.siteglide/alpha.json. + * Expected shape: { token, registry?, tag?, package? } + * + * @param {string} [rootPath] + * @returns {null | { token: string, registry: string, tag: string, package: string }} + */ +const readAlphaCredentials = (rootPath = process.cwd()) => { + const parsed = readJsonObject(resolveAlphaPath(rootPath)); + if (!parsed) { + return null; + } + + const token = typeof parsed.token === 'string' + ? parsed.token.trim() + : typeof parsed._authToken === 'string' + ? parsed._authToken.trim() + : ''; + + if (!token) { + return null; + } + + return { + token, + registry: typeof parsed.registry === 'string' && parsed.registry.trim() + ? parsed.registry.trim() + : DEFAULT_REGISTRY, + tag: typeof parsed.tag === 'string' && parsed.tag.trim() + ? parsed.tag.trim() + : DEFAULT_TAG, + package: typeof parsed.package === 'string' && parsed.package.trim() + ? parsed.package.trim() + : DEFAULT_PACKAGE + }; +}; + +const hasAlphaCredentials = (rootPath = process.cwd()) => readAlphaCredentials(rootPath) !== null; + +const registryPackageUrl = (registry, packageName) => { + const base = registry.endsWith('/') ? registry.slice(0, -1) : registry; + return `${base}/${packageName.replace('/', '%2F')}`; +}; + +const resolveInstalledMcpVersion = (cliRoot = resolveCliRoot()) => { + try { + const pkgPath = require.resolve(`${DEFAULT_PACKAGE}/package.json`, { paths: [cliRoot] }); + return JSON.parse(fs.readFileSync(pkgPath, 'utf8')).version; + } catch (error) { + return null; + } +}; + +/** + * @returns {Promise<{ tagVersion: string | null, versions: string[], distTags: Record } | null>} + */ +const fetchPublishedMcpVersions = async (credentials) => { + const url = registryPackageUrl(credentials.registry, credentials.package); + try { + const response = await fetch(url, { + headers: { + Authorization: `Bearer ${credentials.token}`, + Accept: 'application/json' + } + }); + + if (!response.ok) { + logger.Debug(`[pull] MCP registry lookup failed (${response.status}) for ${credentials.package}`); + return null; + } + + const data = await response.json(); + const versions = data.versions && typeof data.versions === 'object' + ? Object.keys(data.versions) + : []; + const distTags = data['dist-tags'] && typeof data['dist-tags'] === 'object' + ? data['dist-tags'] + : {}; + + return { + tagVersion: typeof distTags[credentials.tag] === 'string' ? distTags[credentials.tag] : null, + versions, + distTags + }; + } catch (error) { + logger.Debug(`[pull] MCP registry lookup error: ${error.message}`); + return null; + } +}; + +const pickLatestPublishedVersion = (published, tag) => { + if (published.tagVersion && semver.valid(published.tagVersion)) { + return published.tagVersion; + } + + const stable = published.versions + .filter((version) => semver.valid(version)) + .sort(semver.rcompare); + + return stable[0] || null; +}; + +const writeTempNpmrc = (credentials) => { + const registryHost = credentials.registry.replace(/^https?:\/\//, '').replace(/\/$/, ''); + const npmrcPath = path.join(os.tmpdir(), `siteglide-mcp-alpha-${process.pid}.npmrc`); + const scope = credentials.package.startsWith('@') ? credentials.package.split('/')[0] : null; + const lines = [ + `//${registryHost}/:_authToken=${credentials.token}` + ]; + + if (scope) { + lines.unshift(`${scope}:registry=${credentials.registry}`); + } + + fs.writeFileSync(npmrcPath, lines.join('\n') + '\n', 'utf8'); + return npmrcPath; +}; + +const removeTempFile = (filePath) => { + try { + if (filePath && fs.existsSync(filePath)) { + fs.unlinkSync(filePath); + } + } catch (error) { + logger.Debug(`[pull] Could not remove temp npmrc: ${error.message}`); + } +}; + +const installMcpPackage = (credentials, version, cliRoot = resolveCliRoot()) => { + const spec = version ? `${credentials.package}@${version}` : `${credentials.package}@${credentials.tag}`; + const npmrcPath = writeTempNpmrc(credentials); + + try { + execFileSync( + process.platform === 'win32' ? 'npm.cmd' : 'npm', + ['install', spec, '--no-save', '--userconfig', npmrcPath], + { + cwd: cliRoot, + stdio: 'inherit', + env: process.env + } + ); + return true; + } catch (error) { + logger.Warn(`[pull] MCP install failed: ${error.message}`, { exit: false }); + return false; + } finally { + removeTempFile(npmrcPath); + } +}; + +const isAffirmative = (answer) => /^y(es)?$/i.test(String(answer || '').trim()); + +/** + * Project-local IDE configs that should contain the Siteglide MCP server entry. + * @param {string} rootPath + */ +const getProjectMcpTargets = (rootPath) => getRegistryTargets(rootPath).filter((target) => { + return target.configPath.startsWith(rootPath); +}); + +const readMcpConfigObject = (filePath) => { + if (!fs.existsSync(filePath)) { + return null; + } + try { + const parsed = JSON.parse(fs.readFileSync(filePath, 'utf8')); + if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) { + return parsed; + } + } catch (error) { + return null; + } + return null; +}; + +/** + * @returns {{ configured: boolean, paths: string[], missing: string[] }} + */ +const getMcpConfigStatus = (rootPath = process.cwd()) => { + const targets = getProjectMcpTargets(rootPath); + const paths = []; + const missing = []; + + for (let i = 0; i < targets.length; i++) { + const target = targets[i]; + const config = readMcpConfigObject(target.configPath); + if (!config) { + missing.push(target.configPath); + continue; + } + + const servers = config[target.serversKey]; + if (servers && typeof servers === 'object' && !Array.isArray(servers) && servers[SERVER_NAME]) { + paths.push(target.configPath); + } else { + missing.push(target.configPath); + } + } + + return { + configured: paths.length > 0, + paths, + missing + }; +}; + +/** + * Alpha-gated MCP setup on pull: + * - Requires ./.siteglide/alpha.json with npm token + * - Ensures MCP package is installed and IDE configs exist + * - Offers upgrade when MCP is already configured and a newer version exists + * + * @param {{ rootPath?: string, homedir?: string, interactive?: boolean }} [opts] + */ +const ensureMcpOnPull = async (opts = {}) => { + const rootPath = opts.rootPath || process.cwd(); + const homedir = opts.homedir || os.homedir(); + const interactive = opts.interactive !== false; + const credentials = readAlphaCredentials(rootPath); + + if (!credentials) { + logger.Debug(`[pull] Skipping MCP setup — create ${ALPHA_RELATIVE_PATH} with npm credentials for alpha access`); + return { + skipped: true, + reason: 'missing-alpha-credentials' + }; + } + + const cliRoot = resolveCliRoot(); + let installedVersion = resolveInstalledMcpVersion(cliRoot); + const configStatus = getMcpConfigStatus(rootPath); + const published = await fetchPublishedMcpVersions(credentials); + const latestVersion = published ? pickLatestPublishedVersion(published, credentials.tag) : null; + + if (!installedVersion) { + if (latestVersion) { + logger.Info(`[pull] Siteglide MCP is not installed (latest ${credentials.tag}: ${latestVersion})`); + if (interactive) { + const answer = await Confirm(`Install ${credentials.package}@${latestVersion}? (y/N) `); + if (isAffirmative(answer)) { + if (installMcpPackage(credentials, latestVersion, cliRoot)) { + installedVersion = resolveInstalledMcpVersion(cliRoot); + } + } + } + } else { + logger.Warn('[pull] Siteglide MCP is not installed and registry versions could not be read', { exit: false }); + } + } else if ( + configStatus.configured && + latestVersion && + semver.valid(installedVersion) && + semver.valid(latestVersion) && + semver.gt(latestVersion, installedVersion) + ) { + logger.Info(`[pull] Siteglide MCP ${installedVersion} installed; ${credentials.tag} latest is ${latestVersion}`); + if (interactive) { + const answer = await Confirm(`Upgrade Siteglide MCP to ${latestVersion}? (y/N) `); + if (isAffirmative(answer)) { + if (installMcpPackage(credentials, latestVersion, cliRoot)) { + installedVersion = resolveInstalledMcpVersion(cliRoot); + logger.Info(`[pull] Siteglide MCP upgraded to ${installedVersion}`); + } + } + } + } else if (installedVersion) { + logger.Debug(`[pull] Siteglide MCP ${installedVersion} installed`); + } + + if (!resolveInstalledMcpVersion(cliRoot)) { + logger.Warn('[pull] Siteglide MCP is unavailable — IDE registration skipped', { exit: false }); + return { + skipped: true, + reason: 'mcp-not-installed', + installedVersion, + latestVersion + }; + } + + const registration = ensureMcpRegistered({ rootPath, homedir }); + ensureMcpIdeRules({ rootPath }); + const afterConfig = getMcpConfigStatus(rootPath); + + if (afterConfig.configured) { + logger.Info(`[pull] Siteglide MCP configured (${installedVersion || 'unknown'})`); + } else if (afterConfig.missing.length > 0) { + logger.Warn(`[pull] Siteglide MCP registration incomplete for: ${afterConfig.missing.join(', ')}`, { exit: false }); + } + + return { + skipped: false, + installedVersion: installedVersion || resolveInstalledMcpVersion(cliRoot), + latestVersion, + configStatus: afterConfig, + registration + }; +}; + +module.exports = { + ALPHA_RELATIVE_PATH, + DEFAULT_PACKAGE, + DEFAULT_REGISTRY, + DEFAULT_TAG, + readAlphaCredentials, + hasAlphaCredentials, + resolveInstalledMcpVersion, + fetchPublishedMcpVersions, + getMcpConfigStatus, + installMcpPackage, + ensureMcpOnPull +}; diff --git a/package.json b/package.json index 5c91661..b66a318 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "dependencies": { "@platformos/platformos-check-node": "^0.0.20", "@platformos/platformos-common": "^0.0.18", - "@siteglide/siteglide-mcp": "file:../Siteglide-MCP---Experimental", + "@siteglide/siteglide-mcp": "file:../Siteglide-MCP", "archiver": "^5.3.0", "archiver-promise": "^1.0.0", "async": "^3.2.3", diff --git a/scripts/build-test-share-zip.js b/scripts/build-test-share-zip.js index f596abe..9378dd3 100644 --- a/scripts/build-test-share-zip.js +++ b/scripts/build-test-share-zip.js @@ -8,7 +8,7 @@ const path = require('path'); const { execFileSync } = require('child_process'); const CLI_ROOT = path.resolve(__dirname, '..'); -const MCP_ROOT = path.resolve(CLI_ROOT, '..', 'Siteglide-MCP---Experimental'); +const MCP_ROOT = path.resolve(CLI_ROOT, '..', 'Siteglide-MCP'); const OUT_ROOT = path.resolve(CLI_ROOT, '..', 'siteglide-cli-workspace-notes', 'dist'); const STAGE = path.join(OUT_ROOT, 'siteglide-cli-test-bundle'); const pad2 = (n) => String(n).padStart(2, '0'); diff --git a/scripts/smoke-mcp-register.js b/scripts/smoke-mcp-register.js index f6014e4..981b213 100644 --- a/scripts/smoke-mcp-register.js +++ b/scripts/smoke-mcp-register.js @@ -1,7 +1,14 @@ +(async () => { const assert = require('assert'); const fs = require('fs'); const os = require('os'); const path = require('path'); +const { + ensureMcpOnPull, + hasAlphaCredentials, + readAlphaCredentials, + getMcpConfigStatus +} = require('../lib/mcpAlpha'); const { ensureMcpRegistered, ensureMcpIdeRules, @@ -13,6 +20,25 @@ const { const root = fs.mkdtempSync(path.join(os.tmpdir(), 'sg-mcp-reg-')); const fakeHome = fs.mkdtempSync(path.join(os.tmpdir(), 'sg-mcp-home-')); const cursorPath = path.join(root, '.cursor', 'mcp.json'); + +assert.strictEqual(hasAlphaCredentials(root), false, 'missing alpha.json should skip MCP setup'); + +const skipped = await ensureMcpOnPull({ rootPath: root, homedir: fakeHome, interactive: false }); +assert.strictEqual(skipped.skipped, true); +assert.strictEqual(skipped.reason, 'missing-alpha-credentials'); +assert.strictEqual(fs.existsSync(path.join(root, '.cursor', 'rules', 'setup_siteglide_mcp.mdc')), false); + +fs.mkdirSync(path.join(root, '.siteglide'), { recursive: true }); +fs.writeFileSync( + path.join(root, '.siteglide', 'alpha.json'), + JSON.stringify({ token: 'npm_test_token' }, null, 2) +); + +const creds = readAlphaCredentials(root); +assert.ok(creds); +assert.strictEqual(creds.tag, 'alpha'); +assert.strictEqual(creds.package, '@siteglide/siteglide-mcp'); + fs.mkdirSync(path.dirname(cursorPath), { recursive: true }); fs.writeFileSync( cursorPath, @@ -31,7 +57,6 @@ const afterFirst = JSON.parse(fs.readFileSync(cursorPath, 'utf8')); assert.deepStrictEqual(afterFirst.mcpServers.other, { command: 'keep-me' }); assert.strictEqual(afterFirst.mcpServers[SERVER_NAME].command, process.execPath); assert.deepStrictEqual(afterFirst.mcpServers[SERVER_NAME].args, [resolveMcpScriptPath()]); -assert.ok(!afterFirst.mcpServers[SERVER_NAME].command.includes('siteglide-cli-mcp') || afterFirst.mcpServers[SERVER_NAME].args); const second = ensureMcpRegistered({ rootPath: root, homedir: fakeHome }); assert.ok(second.unchanged.includes('Cursor')); @@ -41,15 +66,15 @@ const desired = buildMcpLaunchEntry(); assert.strictEqual(desired.command, process.execPath); assert.ok(fs.existsSync(desired.args[0])); +const configStatus = getMcpConfigStatus(root); +assert.ok(configStatus.configured); +assert.ok(configStatus.paths.includes(cursorPath)); + const rules = ensureMcpIdeRules({ rootPath: root }); assert.ok(rules.written.includes('Cursor')); assert.ok(fs.existsSync(path.join(root, '.cursor', 'rules', 'setup_siteglide_mcp.mdc'))); -assert.ok(fs.existsSync(path.join(root, '.claude', 'siteglide-mcp.md'))); -const cursorRule = fs.readFileSync(path.join(root, '.cursor', 'rules', 'setup_siteglide_mcp.mdc'), 'utf8'); -assert.ok(cursorRule.indexOf('.siteglide-config') > -1); -assert.ok(cursorRule.indexOf('envs_list') > -1); -assert.ok(cursorRule.indexOf('NEVER') > -1); fs.rmSync(root, { recursive: true, force: true }); fs.rmSync(fakeHome, { recursive: true, force: true }); console.log('mcp registration smoke ok'); +})(); diff --git a/siteglide-cli-mcp.js b/siteglide-cli-mcp.js index 9bbb58a..3d104fb 100644 --- a/siteglide-cli-mcp.js +++ b/siteglide-cli-mcp.js @@ -18,14 +18,14 @@ function resolveMcpBin() { /* fall through */ } - const sibling = path.resolve(__dirname, '..', 'Siteglide-MCP---Experimental', 'bin', 'siteglide-mcp.js'); + const sibling = path.resolve(__dirname, '..', 'Siteglide-MCP', 'bin', 'siteglide-mcp.js'); if (fs.existsSync(sibling)) { return sibling; } console.error( '[siteglide-cli-mcp] @siteglide/siteglide-mcp is not installed.\n' + - 'From the workspace: npm install in Siteglide-MCP---Experimental, and link it from siteglide-cli.' + 'From the workspace: npm install in Siteglide-MCP, and link it from siteglide-cli.' ); process.exit(1); } diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index 13c4655..b6b1915 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -14,7 +14,7 @@ const program = require('commander'), unzip = require('./lib/unzip'), path = require('path'), dir = require('./lib/directories'), - { ensureMcpRegistered, ensureMcpIdeRules } = require('./lib/ai'), + { ensureMcpOnPull } = require('./lib/mcpAlpha'), { resolveSiteAppRoot } = require('./lib/migrateAppDirectory'); @@ -763,9 +763,8 @@ program // After module zips (and assets that may land under modules/) are on disk await mergeModuleAgentsToRoot(modulesToPull); - pullSpinner.text = 'Checking IDE MCP registration'; - ensureMcpRegistered(); - ensureMcpIdeRules(); + pullSpinner.text = 'Checking Siteglide MCP (alpha)'; + await ensureMcpOnPull(); await tidyUpAfterPull(); From fb2a84243a51508ac0a94b1b50939b3f1ec39947 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Fri, 14 Aug 2026 16:51:37 +0100 Subject: [PATCH 17/34] Don't ignore .md files, don't pull siteglide modules, treat module assets same as app assets when deploying. --- .../siteglide_exec_command_940796a4.plan.md | 18 +- lib/assets/files.js | 8 +- lib/assets/packAssets.js | 24 +- lib/pullIgnoredModules.js | 294 ++++++++++++++++++ lib/settings.js | 3 +- siteglide-cli-archive.js | 2 +- siteglide-cli-pull.js | 92 +++--- test/lib/pullIgnoredModules.test.js | 161 ++++++++++ 8 files changed, 544 insertions(+), 58 deletions(-) create mode 100644 lib/pullIgnoredModules.js create mode 100644 test/lib/pullIgnoredModules.test.js diff --git a/.cursor/plans/siteglide_exec_command_940796a4.plan.md b/.cursor/plans/siteglide_exec_command_940796a4.plan.md index b1fc445..ae6bcdc 100644 --- a/.cursor/plans/siteglide_exec_command_940796a4.plan.md +++ b/.cursor/plans/siteglide_exec_command_940796a4.plan.md @@ -9,7 +9,7 @@ todos: content: "CANCELLED: siteglide-cli exec bins" status: cancelled - id: mcp-repo - content: Scaffold Siteglide-MCP---Experimental (compose upstream supervisor + Siteglide rules + ops tools; stdio entrypoints) + content: Scaffold Siteglide-MCP (compose upstream supervisor + Siteglide rules + ops tools; stdio entrypoints) status: completed - id: layout-bridge content: "CANCELLED: MCP path bridge — replaced by pull migrate marketplace_builder → app (platformOS advice)" @@ -45,9 +45,9 @@ isProject: false ## MCP home (locked) -All Siteglide MCP implementation lives in [`d:\git\Siteglide-MCP---Experimental`](d:\git\Siteglide-MCP---Experimental) — not inside the CLI package tree. +All Siteglide MCP implementation lives in [`d:\git\Siteglide-MCP`](d:\git\Siteglide-MCP) — not inside the CLI package tree. -| Keep in `siteglide-cli` | Put in `Siteglide-MCP---Experimental` | +| Keep in `siteglide-cli` | Put in `Siteglide-MCP` | | --- | --- | | `ai init` (writes config pointing at MCP bins) | Composed supervisor (`validate_code` + Siteglide rules) | | Thin wrapper bins that call / spawn the MCP package | Operational MCP tools (`envs_list`, `graphql_exec`, `liquid_exec`, `logs_fetch`) | @@ -82,7 +82,7 @@ flowchart LR ## Scope -1. **`Siteglide-MCP---Experimental`** — compose upstream check engine + Siteglide rules + ops tools + layout bridge +1. **`Siteglide-MCP`** — compose upstream check engine + Siteglide rules + ops tools + layout bridge 2. **`siteglide-cli ai init`** — register MCP bins 3. **Thin CLI wrappers** for `mcp` / `supervisor` @@ -103,7 +103,7 @@ Upstream embedding API: - `registerValidateCode(server, context)` - `ValidateCodeResult` types -In `Siteglide-MCP---Experimental`: +In `Siteglide-MCP`: 1. Detect layout; if needed, create **temp overlay bridge** → `bridgedProjectDir` 2. `startServer` / lint against bridged dir (rewrite `file_path` for agents using `marketplace_builder/...`) @@ -115,7 +115,7 @@ In `Siteglide-MCP---Experimental`: flowchart TB cliAi["siteglide-cli ai init"] cliAi --> bins["siteglide-cli-mcp / siteglide-cli-supervisor"] - bins --> pkg["Siteglide-MCP---Experimental"] + bins --> pkg["Siteglide-MCP"] pkg --> bridge["layout bridge if needed"] bridge --> start["startServer upstream"] pkg --> sg["registerSiteglideTools"] @@ -126,7 +126,7 @@ flowchart TB ### Layout (in MCP repo) ``` -Siteglide-MCP---Experimental/ +Siteglide-MCP/ src/supervisor/compose.js # bridge + startServer + registerSiteglideTools src/layout/ detect.js # app | marketplace_builder | null @@ -210,7 +210,7 @@ Prefer public lint API from the supervisor package (`runLint` / equivalent) behi ## Decisions (locked) -### MCP (`Siteglide-MCP---Experimental`) +### MCP (`Siteglide-MCP`) - Compose upstream check engine + Siteglide rules - Ops MVP: `envs_list`, `graphql_exec`, `liquid_exec`, `logs_fetch` - **Layout bridge:** temp overlay when only `marketplace_builder/` (cross-platform junctions/symlinks) @@ -231,7 +231,7 @@ Prefer public lint API from the supervisor package (`runLint` / equivalent) behi ## Phases -### 1 — scaffold `Siteglide-MCP---Experimental` +### 1 — scaffold `Siteglide-MCP` Compose supervisor + layout bridge + Siteglide guide/rules tool + ops MVP + stdio entries ### 2 — wire CLI diff --git a/lib/assets/files.js b/lib/assets/files.js index 9c67cf2..0fc8de6 100644 --- a/lib/assets/files.js +++ b/lib/assets/files.js @@ -14,10 +14,14 @@ const _paths = customConfig => [customConfig, config.CONFIG, config.LEGACY_CONFI const _getAssets = async () => { const siteRoot = dir.currentApp(); const appAssets = siteRoot && fs.existsSync(`${siteRoot}/assets`) - ? await glob(`${siteRoot}/assets/**`) + ? await glob(`${siteRoot}/assets/**`, { onlyFiles: true }) : []; - return [...appAssets] || []; + const moduleAssets = fs.existsSync(dir.MODULES) + ? await glob(`${dir.MODULES}/*/{public,private}/assets/**`, { onlyFiles: true }) + : []; + + return [...appAssets, ...moduleAssets]; }; const _getConfigPath = customConfig => { diff --git a/lib/assets/packAssets.js b/lib/assets/packAssets.js index b5241ba..1daf622 100644 --- a/lib/assets/packAssets.js +++ b/lib/assets/packAssets.js @@ -9,14 +9,16 @@ const archiver = require('archiver-promise'), const getAppDirectory = () => dir.currentApp() || dir.LEGACY_APP; -// const addModulesToArchive = archive => { -// if (!fs.existsSync(dir.MODULES)) return true; +const addModulesToArchive = archive => { + if (!fs.existsSync(dir.MODULES)) { + return; + } -// const modules = glob.sync('*/', { cwd: dir.MODULES }); -// for (const module of modules) { -// addModuleToArchive(module, archive); -// } -// }; + const modules = glob.sync('*/', { cwd: dir.MODULES }); + for (let i = 0; i < modules.length; i++) { + addModuleToArchive(modules[i].replace('/', ''), archive); + } +}; const publicAssetsSameAsPrivate = (file, files) => { return file.startsWith('public/assets') && files.includes(file.replace(/public/, 'private')); @@ -43,8 +45,12 @@ const packAssets = async path => { const appDirectory = getAppDirectory(); const assetsArchive = prepareArchive(path); archiver(path, { zlib: { level: 6 }}); - assetsArchive.glob('**/**', { cwd: `${appDirectory}/assets`}); - // addModulesToArchive(assetsArchive); + + if (fs.existsSync(`${appDirectory}/assets`)) { + assetsArchive.glob('**/**', { cwd: `${appDirectory}/assets` }); + } + + addModulesToArchive(assetsArchive); return assetsArchive.finalize(); }; diff --git a/lib/pullIgnoredModules.js b/lib/pullIgnoredModules.js new file mode 100644 index 0000000..299c299 --- /dev/null +++ b/lib/pullIgnoredModules.js @@ -0,0 +1,294 @@ +/** + * Module machine names skipped by default on `siteglide-cli pull`. + * Project `.siteglide-modules/pull.json` can add (`exclude`) or remove (`include`) names. + */ +const fs = require('fs-extra'); +const path = require('path'); +const logger = require('./logger'); + +const PULL_MODULES_CONFIG_DIR = '.siteglide-modules'; +const PULL_MODULES_CONFIG_FILE = 'pull.json'; +const PULL_MODULES_CONFIG_RELATIVE_PATH = path.join(PULL_MODULES_CONFIG_DIR, PULL_MODULES_CONFIG_FILE); + +const DEFAULT_PULL_IGNORED_MODULES = [ + 'module_86', + 'module_357', + 'siteglide_authors', + 'siteglide_blog', + 'siteglide_ecommerce', + 'siteglide_menu', + 'siteglide_secure_zones', + 'siteglide_system', + 'siteglide_events', + 'siteglide_media_downloads', + 'siteglide_design_system', + 'siteglide_email_marketing' +]; + +/** + * @returns {{ usage: string, include: string[], exclude: string[] }} + */ +const defaultPullModulesConfigDocument = () => { + return { + usage: [ + 'Siteglide CLI pull module filter for this project.', + '', + 'By default, pull skips built-in Siteglide platform modules (Studio, ecommerce, blog, etc.).', + 'Use this file to adjust that list for your site:', + ' exclude — add module machine names to skip (merged onto the built-in list)', + ' include — remove module machine names from the skip list (they will be pulled)', + 'Neither key replaces the built-in list.', + '', + 'Commit this file to git (do not gitignore .siteglide-modules/) so every developer', + 'pulling the same site downloads the same modules.', + '', + 'Example — pull module_357 but also skip a custom module:', + ' "include": ["module_357"],', + ' "exclude": ["my_custom_module"]', + '', + 'Use siteglide-cli pull -m to pull a single module once, including ignored ones.' + ].join('\n'), + include: [], + exclude: [] + }; +}; + +/** + * @param {string} [rootPath] + * @returns {string} + */ +const resolvePullModulesConfigPath = (rootPath = process.cwd()) => { + return path.join(rootPath, PULL_MODULES_CONFIG_RELATIVE_PATH); +}; + +/** + * @param {unknown} value + * @returns {string[]} + */ +const normalizeModuleList = (value) => { + if (!Array.isArray(value)) { + return []; + } + const seen = {}; + const normalized = []; + for (let i = 0; i < value.length; i++) { + const name = normalizeModuleName(value[i]); + if (!name || seen[name]) { + continue; + } + seen[name] = true; + normalized.push(name); + } + return normalized; +}; + +/** + * Apply include/exclude on top of the built-in ignore list. + * + * @param {{ include?: unknown, exclude?: unknown }} [config] + * @returns {string[]} + */ +const mergePullIgnoredModules = (config = {}) => { + const include = normalizeModuleList(config.include); + const exclude = normalizeModuleList(config.exclude); + const merged = DEFAULT_PULL_IGNORED_MODULES.slice(); + + for (let i = 0; i < exclude.length; i++) { + const name = exclude[i]; + if (merged.indexOf(name) === -1) { + merged.push(name); + } + } + + for (let i = 0; i < include.length; i++) { + const name = include[i]; + const index = merged.indexOf(name); + if (index !== -1) { + merged.splice(index, 1); + } + } + + return merged; +}; + +/** + * Create `.siteglide-modules/pull.json` when missing. Never overwrites an existing file. + * + * @param {string} [rootPath] + * @returns {Promise<{ configPath: string, created: boolean }>} + */ +const ensurePullModulesConfig = async (rootPath = process.cwd()) => { + const configPath = resolvePullModulesConfigPath(rootPath); + if (await fs.pathExists(configPath)) { + return { configPath, created: false }; + } + await fs.ensureDir(path.dirname(configPath)); + await fs.writeFile( + configPath, + `${JSON.stringify(defaultPullModulesConfigDocument(), null, '\t')}\n`, + 'utf8' + ); + return { configPath, created: true }; +}; + +/** + * @param {string} [rootPath] + * @returns {Promise<{ include: string[], exclude: string[] }>} + */ +const readPullModulesConfig = async (rootPath = process.cwd()) => { + const configPath = resolvePullModulesConfigPath(rootPath); + if (!(await fs.pathExists(configPath))) { + return { include: [], exclude: [] }; + } + try { + const parsed = JSON.parse(await fs.readFile(configPath, 'utf8')); + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { + logger.Warn(`[pull] ${PULL_MODULES_CONFIG_RELATIVE_PATH} must be a JSON object; using built-in ignore list only`, { exit: false }); + return { include: [], exclude: [] }; + } + return { + include: normalizeModuleList(parsed.include), + exclude: normalizeModuleList(parsed.exclude) + }; + } catch (error) { + logger.Warn(`[pull] ${PULL_MODULES_CONFIG_RELATIVE_PATH} is invalid JSON (${error.message}); using built-in ignore list only`, { exit: false }); + return { include: [], exclude: [] }; + } +}; + +/** + * Ensure config file exists, read include/exclude, return the effective ignore list. + * + * @param {string} [rootPath] + * @returns {Promise<{ created: boolean, effectiveIgnoredModules: string[] }>} + */ +const preparePullModulesConfig = async (rootPath = process.cwd()) => { + const { created } = await ensurePullModulesConfig(rootPath); + const config = await readPullModulesConfig(rootPath); + return { + created, + effectiveIgnoredModules: mergePullIgnoredModules(config) + }; +}; + +/** + * @param {string} [rootPath] + * @returns {Promise} + */ +const loadEffectivePullIgnoredModules = async (rootPath = process.cwd()) => { + const prepared = await preparePullModulesConfig(rootPath); + return prepared.effectiveIgnoredModules; +}; + +/** + * @param {string} moduleName + * @returns {string} + */ +const normalizeModuleName = (moduleName) => { + if (typeof moduleName !== 'string') { + return ''; + } + return moduleName.trim(); +}; + +/** + * @param {string} moduleName + * @param {string[]} [ignoredModules] + * @returns {boolean} + */ +const isPullIgnoredModule = (moduleName, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { + const normalized = normalizeModuleName(moduleName); + if (!normalized) { + return false; + } + return ignoredModules.indexOf(normalized) !== -1; +}; + +/** + * @param {string[]} installedModules + * @param {string[]} [ignoredModules] + * @returns {string[]} + */ +const filterPullIgnoredModules = (installedModules, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { + if (!Array.isArray(installedModules)) { + return []; + } + return installedModules.filter((name) => { + return !isPullIgnoredModule(name, ignoredModules); + }); +}; + +/** + * @param {string[]} installedModules + * @param {string[]} [ignoredModules] + * @returns {{ selected: string[], ignored: string[] }} + */ +const partitionPullIgnoredModules = (installedModules, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { + const selected = []; + const ignored = []; + if (!Array.isArray(installedModules)) { + return { selected, ignored }; + } + for (let i = 0; i < installedModules.length; i++) { + const name = installedModules[i]; + if (isPullIgnoredModule(name, ignoredModules)) { + ignored.push(name); + } else { + selected.push(name); + } + } + return { selected, ignored }; +}; + +/** + * When `-m` targets a default-ignored module, allow that module through for this run. + * + * @param {string|undefined} moduleFilter + * @param {string[]} [ignoredModules] + * @returns {string[]} + */ +const resolvePullIgnoredModules = (moduleFilter, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { + if (!moduleFilter) { + return ignoredModules; + } + return ignoredModules.filter((name) => { + return name !== moduleFilter; + }); +}; + +/** + * Decide which installed modules to pull for this run. + * + * @param {string[]} installedModules - Module names returned by `/cli/list_modules`. + * @param {string|undefined} moduleFilter - Optional `-m` value; when set, only that module is selected. + * @param {string[]} [ignoredModules] - Default-ignored module names (without `-m` override applied). + * @returns {string[]|null} Modules to pull, or `null` if `moduleFilter` is set but not installed. + */ +const selectModulesToPull = (installedModules, moduleFilter, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { + if (moduleFilter) { + if (installedModules.indexOf(moduleFilter) === -1) { + return null; + } + return [moduleFilter]; + } + return filterPullIgnoredModules(installedModules, ignoredModules); +}; + +module.exports = { + DEFAULT_PULL_IGNORED_MODULES, + PULL_MODULES_CONFIG_RELATIVE_PATH, + defaultPullModulesConfigDocument, + resolvePullModulesConfigPath, + normalizeModuleList, + mergePullIgnoredModules, + ensurePullModulesConfig, + readPullModulesConfig, + preparePullModulesConfig, + loadEffectivePullIgnoredModules, + normalizeModuleName, + isPullIgnoredModule, + filterPullIgnoredModules, + partitionPullIgnoredModules, + resolvePullIgnoredModules, + selectModulesToPull +}; diff --git a/lib/settings.js b/lib/settings.js index 3ae10ca..d2d0456 100755 --- a/lib/settings.js +++ b/lib/settings.js @@ -1,5 +1,6 @@ const fs = require('fs'), - logger = require('./logger'); + logger = require('./logger'), + dir = require('./directories'); const loadSettingsFile = path => { if (fs.existsSync(path)) { diff --git a/siteglide-cli-archive.js b/siteglide-cli-archive.js index a3d664e..424cba0 100755 --- a/siteglide-cli-archive.js +++ b/siteglide-cli-archive.js @@ -69,7 +69,7 @@ const makeArchive = (archivePath, directory, program) => { releaseArchive.glob('**/*', { cwd: directory, ignore: ['assets/**', '**/node_modules/**']}, { prefix: directory }); } - addModulesToArchive(releaseArchive).then(r => { + addModulesToArchive(releaseArchive, program.opts().withImages).then(r => { releaseArchive.finalize(); }); diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index b6b1915..52132fd 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -17,7 +17,16 @@ const program = require('commander'), { ensureMcpOnPull } = require('./lib/mcpAlpha'), { resolveSiteAppRoot - } = require('./lib/migrateAppDirectory'); + } = require('./lib/migrateAppDirectory'), + { + DEFAULT_PULL_IGNORED_MODULES, + PULL_MODULES_CONFIG_RELATIVE_PATH, + isPullIgnoredModule, + preparePullModulesConfig, + partitionPullIgnoredModules, + resolvePullIgnoredModules, + selectModulesToPull + } = require('./lib/pullIgnoredModules'); const pullSpinner = ora({ text: 'Pulling files', stream: process.stdout }); @@ -384,14 +393,27 @@ const cleanupEmptyDirs = async (root) => { * Side effects: creates `./modules` if needed; copies module files into it (overwrites); deletes `${fromRoot}/modules`. * No-op if `${fromRoot}/modules` does not exist. */ -const moveModulesToRoot = async (fromRoot) => { +const moveModulesToRoot = async (fromRoot, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { const modulesPath = `./${fromRoot}/modules`; if (!(await fs.pathExists(modulesPath))) { return; } logger.Debug(`[pull] Moving ./${fromRoot}/modules → ./${dir.MODULES}`); await fs.ensureDir(`./${dir.MODULES}`); - await fs.copy(modulesPath, `./${dir.MODULES}`, { overwrite: true }); + const entries = await fs.readdir(modulesPath); + for (let i = 0; i < entries.length; i++) { + const moduleName = entries[i]; + const srcPath = path.join(modulesPath, moduleName); + const stats = await fs.stat(srcPath); + if (!stats.isDirectory()) { + continue; + } + if (isPullIgnoredModule(moduleName, ignoredModules)) { + logger.Debug(`[pull] Skipping default-ignored module "${moduleName}" from ./${fromRoot}/modules`); + continue; + } + await fs.copy(srcPath, path.join(`./${dir.MODULES}`, moduleName), { overwrite: true }); + } await fs.remove(modulesPath); }; @@ -404,7 +426,7 @@ const moveModulesToRoot = async (fromRoot) => { * Side effects: writes/overwrites that folder; may merge into `./modules`; * updates `pullSpinner` text; downloads then deletes a temporary zip. */ -const pullSiteZip = async (gateway, siteRoot = dir.APP) => { +const pullSiteZip = async (gateway, siteRoot = dir.APP, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { logger.Info(`[pull] Step: downloading main site zip → ${siteRoot}/`); const filename = `${siteRoot}.zip`; pullSpinner.text = 'Pulling site files'; @@ -416,7 +438,7 @@ const pullSiteZip = async (gateway, siteRoot = dir.APP) => { await unzip(filename, siteRoot); await copyChildren(`./${siteRoot}/app`, `./${siteRoot}`); await fs.remove(`./${filename}`); - await moveModulesToRoot(siteRoot); + await moveModulesToRoot(siteRoot, ignoredModules); if (await fs.pathExists(`./${siteRoot}/asset_manifest.json`)) { await fs.remove(`./${siteRoot}/asset_manifest.json`); } @@ -435,7 +457,7 @@ const pullSiteZip = async (gateway, siteRoot = dir.APP) => { * Side effects: writes/overwrites files under `./modules`; updates `pullSpinner` text; * uses then deletes a temp zip and `.tmp/pull-` work directory. */ -const pullModuleZip = async (gateway, moduleName) => { +const pullModuleZip = async (gateway, moduleName, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { logger.Info(`[pull] Starting module ${moduleName}`); const filename = `${dir.MODULES}-${moduleName}.zip`; const workDir = path.join(dir.TMP, `pull-${moduleName}`); @@ -453,7 +475,7 @@ const pullModuleZip = async (gateway, moduleName) => { await fs.remove(`./${workDir}/app`); } - await moveModulesToRoot(workDir); + await moveModulesToRoot(workDir, ignoredModules); // Some module zips nest files as /... instead of modules//... const directModulePath = `./${workDir}/${moduleName}`; @@ -510,7 +532,7 @@ const mapLimit = async (items, limit, iterator) => { * @param {number} concurrency - Max concurrent module pulls. * Side effects: same as `pullModuleZip` for each module; updates pullSpinner text. */ -const pullModulesInParallel = async (gateway, modulesToPull, concurrency) => { +const pullModulesInParallel = async (gateway, modulesToPull, concurrency, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { const total = modulesToPull.length; if (total === 0) { return; @@ -522,7 +544,7 @@ const pullModulesInParallel = async (gateway, modulesToPull, concurrency) => { let completed = 0; await mapLimit(modulesToPull, limit, async (moduleName) => { - await pullModuleZip(gateway, moduleName); + await pullModuleZip(gateway, moduleName, ignoredModules); completed += 1; logger.Info(`[pull] Module "${moduleName}" done (${completed}/${total})`); pullSpinner.text = `Pulling modules (${completed}/${total} done, up to ${limit} at a time)`; @@ -541,7 +563,7 @@ const pullModulesInParallel = async (gateway, modulesToPull, concurrency) => { * Side effects: creates dirs and writes/overwrites asset files under the site root or `./modules`; * updates `pullSpinner` text; downloads each asset from its remote_url. */ -const pullAssets = async (gateway, siteRoot = dir.APP) => { +const pullAssets = async (gateway, siteRoot = dir.APP, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { pullSpinner.text = 'Pulling assets'; const response = await gateway.pull(); const asset_files = []; @@ -562,6 +584,7 @@ const pullAssets = async (gateway, siteRoot = dir.APP) => { (urlToTest.indexOf('.svg') > -1) || (urlToTest.indexOf('.map') > -1) || (urlToTest.indexOf('.json') > -1) || + (urlToTest.indexOf('.md') > -1) || (urlToTest.indexOf('.htm') > -1) ) { await getBinary(file.data.remote_url, time).then(body => { @@ -595,6 +618,11 @@ const pullAssets = async (gateway, siteRoot = dir.APP) => { return; } if (isModuleAsset) { + const moduleName = relativePath.split('/')[0]; + if (isPullIgnoredModule(moduleName, ignoredModules)) { + logger.Debug(`[pull] Skipping asset for default-ignored module "${moduleName}": ${physicalPath}`); + return; + } moduleAssetCount++; } const fullPath = path.join(root, relativePath); @@ -616,7 +644,7 @@ const pullAssets = async (gateway, siteRoot = dir.APP) => { * then deletes that nested folder, removes empty dirs under `app`; * updates `pullSpinner` text and writes tidying-up logs. */ -const tidyUpAfterPull = async () => { +const tidyUpAfterPull = async (ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { logger.Info('[pull] Step: tidying up local files'); pullSpinner.text = 'Tidying up...'; @@ -649,7 +677,7 @@ const tidyUpAfterPull = async () => { const appRoot = appRoots[i]; const nestedModules = `./${appRoot}/modules`; if (await fs.pathExists(nestedModules)) { - await moveModulesToRoot(appRoot); + await moveModulesToRoot(appRoot, ignoredModules); } if (await fs.pathExists(nestedModules)) { await fs.remove(nestedModules); @@ -662,29 +690,11 @@ const tidyUpAfterPull = async () => { logger.Info('[pull] Tidying up complete'); }; -/** - * Decide which installed modules to pull for this run. - * - * @param {string[]} installedModules - Module names returned by `/cli/list_modules`. - * @param {string|undefined} moduleFilter - Optional `-m` value; when set, only that module is selected. - * @returns {string[]|null} Modules to pull, or `null` if `moduleFilter` is set but not installed. - * Side effects: none. - */ -const selectModules = (installedModules, moduleFilter) => { - if (!moduleFilter) { - return installedModules; - } - if (installedModules.indexOf(moduleFilter) === -1) { - return null; - } - return [moduleFilter]; -}; - program .version(version, '-v, --version') .name('siteglide-cli pull') .usage('') - .description('Pull site files into the existing site root (app/ or marketplace_builder/) and module public files into modules/. Does not rename marketplace_builder/ ↔ app/. Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds IDE discovery folders linked to ./.agents/skills. Registers Siteglide MCP in IDE configs if missing. Modules pull in parallel (see --concurrency). Overwrites local files. By default pulls all installed modules; use -m to filter to one module.') + .description('Pull site files into the existing site root (app/ or marketplace_builder/) and module public files into modules/. Does not rename marketplace_builder/ ↔ app/. Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds IDE discovery folders linked to ./.agents/skills. Registers Siteglide MCP in IDE configs if missing. Modules pull in parallel (see --concurrency). Overwrites local files. By default skips built-in Siteglide platform modules; customize via .siteglide-modules/pull.json (include/exclude). Use -m to pull one module including ignored ones.') .arguments('[environment]', 'Name of environment. Example: staging') .option('-c --config-file ', 'config file path', '.siteglide-config') .option('-i --ignore-assets', 'Do not download assets such as CSS, JS, JSON etc', false) @@ -725,6 +735,10 @@ program } pullSpinner.text = 'Fetching installed modules'; + const { created: pullModulesConfigCreated, effectiveIgnoredModules } = await preparePullModulesConfig(process.cwd()); + if (pullModulesConfigCreated) { + logger.Info(`[pull] Created ./${PULL_MODULES_CONFIG_RELATIVE_PATH} — edit include/exclude to customize skipped modules (commit to git so the team stays in sync)`); + } const modulesResponse = await gateway.listModules(); const installedModules = (modulesResponse && modulesResponse.data) ? modulesResponse.data : []; logger.Debug(`[pull] list_modules returned ${installedModules.length} module(s)`); @@ -736,7 +750,9 @@ program logger.Debug('[pull] Raw list_modules response keys: ' + Object.keys(modulesResponse || {}).join(', ')); } - const modulesToPull = selectModules(installedModules, moduleFilter); + const ignoredModules = resolvePullIgnoredModules(moduleFilter, effectiveIgnoredModules); + const moduleSelection = partitionPullIgnoredModules(installedModules, effectiveIgnoredModules); + const modulesToPull = selectModulesToPull(installedModules, moduleFilter, effectiveIgnoredModules); if (moduleFilter && modulesToPull === null) { pullSpinner.fail(`Module "${moduleFilter}" is not installed on this site`); @@ -744,18 +760,22 @@ program process.exit(1); } + if (!moduleFilter && moduleSelection.ignored.length > 0) { + logger.Info(`[pull] Skipping ${moduleSelection.ignored.length} default-ignored module(s): ${moduleSelection.ignored.join(', ')}`); + } + if (modulesToPull.length === 0) { logger.Info('[pull] No modules selected to pull'); } else { logger.Info(`[pull] Will pull ${modulesToPull.length} module(s): ${modulesToPull.join(', ')}`); } - await pullSiteZip(gateway, siteRoot); + await pullSiteZip(gateway, siteRoot, ignoredModules); - await pullModulesInParallel(gateway, modulesToPull, modulePullConcurrency); + await pullModulesInParallel(gateway, modulesToPull, modulePullConcurrency, ignoredModules); if (!ignoreAssets) { - await pullAssets(gateway, siteRoot); + await pullAssets(gateway, siteRoot, ignoredModules); } else { logger.Info('[pull] Skipping assets step'); } @@ -766,7 +786,7 @@ program pullSpinner.text = 'Checking Siteglide MCP (alpha)'; await ensureMcpOnPull(); - await tidyUpAfterPull(); + await tidyUpAfterPull(ignoredModules); logger.Info('[pull] All steps finished'); pullSpinner.succeed('Pulled files'); diff --git a/test/lib/pullIgnoredModules.test.js b/test/lib/pullIgnoredModules.test.js new file mode 100644 index 0000000..186b727 --- /dev/null +++ b/test/lib/pullIgnoredModules.test.js @@ -0,0 +1,161 @@ +const fs = require('fs-extra'); +const os = require('os'); +const path = require('path'); +const { + DEFAULT_PULL_IGNORED_MODULES, + PULL_MODULES_CONFIG_RELATIVE_PATH, + mergePullIgnoredModules, + ensurePullModulesConfig, + readPullModulesConfig, + preparePullModulesConfig, + isPullIgnoredModule, + filterPullIgnoredModules, + partitionPullIgnoredModules, + resolvePullIgnoredModules, + selectModulesToPull +} = require('../../lib/pullIgnoredModules'); + +const installed = ['module_357', 'user', 'siteglide_system', 'studio']; + +test('mergePullIgnoredModules returns built-in list when include and exclude are empty', () => { + expect(mergePullIgnoredModules({ include: [], exclude: [] })).toEqual(DEFAULT_PULL_IGNORED_MODULES); +}); + +test('mergePullIgnoredModules adds exclude entries without replacing built-ins', () => { + expect(mergePullIgnoredModules({ exclude: ['custom_module'] })).toEqual([ + ...DEFAULT_PULL_IGNORED_MODULES, + 'custom_module' + ]); +}); + +test('mergePullIgnoredModules removes include entries from the built-in list', () => { + expect(mergePullIgnoredModules({ include: ['module_357', 'siteglide_system'] })).toEqual( + DEFAULT_PULL_IGNORED_MODULES.filter((name) => { + return name !== 'module_357' && name !== 'siteglide_system'; + }) + ); +}); + +test('mergePullIgnoredModules lets include remove a name added by exclude', () => { + expect(mergePullIgnoredModules({ + include: ['custom_module'], + exclude: ['custom_module'] + })).toEqual(DEFAULT_PULL_IGNORED_MODULES); +}); + +test('ensurePullModulesConfig creates pull.json when missing and does not overwrite existing file', async () => { + const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-pull-modules-')); + const configPath = path.join(rootPath, PULL_MODULES_CONFIG_RELATIVE_PATH); + + const first = await ensurePullModulesConfig(rootPath); + expect(first.created).toEqual(true); + expect(await fs.pathExists(configPath)).toEqual(true); + + const parsed = JSON.parse(await fs.readFile(configPath, 'utf8')); + expect(parsed.include).toEqual([]); + expect(parsed.exclude).toEqual([]); + expect(typeof parsed.usage).toEqual('string'); + expect(parsed.usage).toContain('exclude'); + expect(parsed.usage).toContain('include'); + expect(parsed.usage).toContain('git'); + + await fs.writeFile(configPath, '{"include":[],"exclude":["team_override"]}\n', 'utf8'); + + const second = await ensurePullModulesConfig(rootPath); + expect(second.created).toEqual(false); + expect(JSON.parse(await fs.readFile(configPath, 'utf8'))).toEqual({ + include: [], + exclude: ['team_override'] + }); + + await fs.remove(rootPath); +}); + +test('preparePullModulesConfig applies include and exclude from pull.json', async () => { + const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-pull-modules-config-')); + const configPath = path.join(rootPath, PULL_MODULES_CONFIG_RELATIVE_PATH); + await fs.ensureDir(path.dirname(configPath)); + await fs.writeFile(configPath, JSON.stringify({ + include: ['module_357'], + exclude: ['custom_module'] + }, null, '\t') + '\n', 'utf8'); + + const prepared = await preparePullModulesConfig(rootPath); + expect(prepared.created).toEqual(false); + expect(prepared.effectiveIgnoredModules).toEqual([ + ...DEFAULT_PULL_IGNORED_MODULES.filter((name) => { + return name !== 'module_357'; + }), + 'custom_module' + ]); + + const config = await readPullModulesConfig(rootPath); + expect(config).toEqual({ + include: ['module_357'], + exclude: ['custom_module'] + }); + + await fs.remove(rootPath); +}); + +test('DEFAULT_PULL_IGNORED_MODULES lists expected Siteglide platform modules', () => { + expect(DEFAULT_PULL_IGNORED_MODULES).toEqual([ + 'module_86', + 'module_357', + 'siteglide_authors', + 'siteglide_blog', + 'siteglide_ecommerce', + 'siteglide_menu', + 'siteglide_secure_zones', + 'siteglide_system', + 'siteglide_events', + 'siteglide_media_downloads', + 'siteglide_design_system', + 'siteglide_email_marketing' + ]); +}); + +test('isPullIgnoredModule matches default ignored names', () => { + expect(isPullIgnoredModule('module_357')).toEqual(true); + expect(isPullIgnoredModule('user')).toEqual(false); +}); + +test('filterPullIgnoredModules removes default ignored modules', () => { + expect(filterPullIgnoredModules(installed)).toEqual(['user', 'studio']); +}); + +test('partitionPullIgnoredModules splits selected and ignored lists', () => { + expect(partitionPullIgnoredModules(installed)).toEqual({ + selected: ['user', 'studio'], + ignored: ['module_357', 'siteglide_system'] + }); +}); + +test('selectModulesToPull returns all non-ignored modules without -m', () => { + expect(selectModulesToPull(installed)).toEqual(['user', 'studio']); +}); + +test('selectModulesToPull allows explicit -m for a default-ignored module', () => { + expect(selectModulesToPull(installed, 'module_357')).toEqual(['module_357']); +}); + +test('selectModulesToPull returns null when -m module is not installed', () => { + expect(selectModulesToPull(installed, 'missing')).toEqual(null); +}); + +test('resolvePullIgnoredModules drops the explicit -m target from the ignore list', () => { + expect(resolvePullIgnoredModules('module_357')).toEqual([ + 'module_86', + 'siteglide_authors', + 'siteglide_blog', + 'siteglide_ecommerce', + 'siteglide_menu', + 'siteglide_secure_zones', + 'siteglide_system', + 'siteglide_events', + 'siteglide_media_downloads', + 'siteglide_design_system', + 'siteglide_email_marketing' + ]); + expect(resolvePullIgnoredModules(undefined)).toEqual(DEFAULT_PULL_IGNORED_MODULES); +}); From e581c6890ad3c59ed36bd5ee2ae7daf7d749898a Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Mon, 17 Aug 2026 14:49:05 +0100 Subject: [PATCH 18/34] Allow deploy to deploy .md files; allow deploy to deploy files/folders starting with "."; add default module skip list; adding quicker script file for testing internally; --- lib/assets/deploy.js | 2 +- lib/assets/files.js | 4 ++-- lib/assets/packAssets.js | 7 ++++--- lib/deployGlob.js | 15 +++++++++++++++ lib/pullIgnoredModules.js | 28 ++++++++++------------------ package.json | 3 ++- siteglide-cli-archive.js | 8 ++++++-- siteglide-cli-pull.js | 2 +- test/lib/pullIgnoredModules.test.js | 4 ++-- 9 files changed, 43 insertions(+), 30 deletions(-) create mode 100644 lib/deployGlob.js diff --git a/lib/assets/deploy.js b/lib/assets/deploy.js index 694a021..6f7cb6e 100644 --- a/lib/assets/deploy.js +++ b/lib/assets/deploy.js @@ -27,7 +27,7 @@ const waitForUnpack = async fileUrl => { } while (fileExists && counter < 90); }; -const deployAssets = async gateway => { +const deployAssets = async (gateway) => { logger.Debug('Generating and uploading new assets manifest...'); const assetsArchiveName = './.tmp/assets.zip'; const instanceId = await gateway.getInstance(); diff --git a/lib/assets/files.js b/lib/assets/files.js index 0fc8de6..e4aff13 100644 --- a/lib/assets/files.js +++ b/lib/assets/files.js @@ -14,11 +14,11 @@ const _paths = customConfig => [customConfig, config.CONFIG, config.LEGACY_CONFI const _getAssets = async () => { const siteRoot = dir.currentApp(); const appAssets = siteRoot && fs.existsSync(`${siteRoot}/assets`) - ? await glob(`${siteRoot}/assets/**`, { onlyFiles: true }) + ? await glob(`${siteRoot}/assets/**`, { onlyFiles: true, dot: true }) : []; const moduleAssets = fs.existsSync(dir.MODULES) - ? await glob(`${dir.MODULES}/*/{public,private}/assets/**`, { onlyFiles: true }) + ? await glob(`${dir.MODULES}/*/{public,private}/assets/**`, { onlyFiles: true, dot: true }) : []; return [...appAssets, ...moduleAssets]; diff --git a/lib/assets/packAssets.js b/lib/assets/packAssets.js index 1daf622..15afdd0 100644 --- a/lib/assets/packAssets.js +++ b/lib/assets/packAssets.js @@ -5,7 +5,8 @@ const archiver = require('archiver-promise'), templates = require('../templates'), settings = require('../settings'), prepareArchive = require('../prepareArchive'), - dir = require('../directories'); + dir = require('../directories'), + { deployGlobOptions } = require('../deployGlob'); const getAppDirectory = () => dir.currentApp() || dir.LEGACY_APP; @@ -25,7 +26,7 @@ const publicAssetsSameAsPrivate = (file, files) => { }; const addModuleToArchive = (module, archive, pattern = '?(public|private)/assets/**') => { - const files = glob.sync(pattern, { cwd: `${dir.MODULES}/${module}`, nodir: true }); + const files = glob.sync(pattern, deployGlobOptions({ cwd: `${dir.MODULES}/${module}`, nodir: true })); for (const f of files) { if (publicAssetsSameAsPrivate(f, files)) continue; @@ -47,7 +48,7 @@ const packAssets = async path => { archiver(path, { zlib: { level: 6 }}); if (fs.existsSync(`${appDirectory}/assets`)) { - assetsArchive.glob('**/**', { cwd: `${appDirectory}/assets` }); + assetsArchive.glob('**/**', deployGlobOptions({ cwd: `${appDirectory}/assets` })); } addModulesToArchive(assetsArchive); diff --git a/lib/deployGlob.js b/lib/deployGlob.js new file mode 100644 index 0000000..0db2677 --- /dev/null +++ b/lib/deployGlob.js @@ -0,0 +1,15 @@ +/** Include dot-directories such as `.agents` in deploy scans and archives. */ +const DEPLOY_GLOB_OPTIONS = { dot: true }; + +/** + * @param {import('glob').IOptions} [options] + * @returns {import('glob').IOptions} + */ +const deployGlobOptions = (options = {}) => { + return Object.assign({}, DEPLOY_GLOB_OPTIONS, options); +}; + +module.exports = { + DEPLOY_GLOB_OPTIONS, + deployGlobOptions +}; diff --git a/lib/pullIgnoredModules.js b/lib/pullIgnoredModules.js index 299c299..6648390 100644 --- a/lib/pullIgnoredModules.js +++ b/lib/pullIgnoredModules.js @@ -1,13 +1,16 @@ /** * Module machine names skipped by default on `siteglide-cli pull`. - * Project `.siteglide-modules/pull.json` can add (`exclude`) or remove (`include`) names. + * Project `.siteglide/cli-settings/modules.json` can add (`exclude`) or remove (`include`) names. + * + * Built-in Siteglide platform modules are slow to pull and rarely contain project-specific + * public/ code; custom modules are usually what you want locally. Use include or -m when needed. */ const fs = require('fs-extra'); const path = require('path'); const logger = require('./logger'); -const PULL_MODULES_CONFIG_DIR = '.siteglide-modules'; -const PULL_MODULES_CONFIG_FILE = 'pull.json'; +const PULL_MODULES_CONFIG_DIR = path.join('.siteglide', 'cli-settings'); +const PULL_MODULES_CONFIG_FILE = 'modules.json'; const PULL_MODULES_CONFIG_RELATIVE_PATH = path.join(PULL_MODULES_CONFIG_DIR, PULL_MODULES_CONFIG_FILE); const DEFAULT_PULL_IGNORED_MODULES = [ @@ -31,22 +34,11 @@ const DEFAULT_PULL_IGNORED_MODULES = [ const defaultPullModulesConfigDocument = () => { return { usage: [ - 'Siteglide CLI pull module filter for this project.', - '', - 'By default, pull skips built-in Siteglide platform modules (Studio, ecommerce, blog, etc.).', - 'Use this file to adjust that list for your site:', - ' exclude — add module machine names to skip (merged onto the built-in list)', - ' include — remove module machine names from the skip list (they will be pulled)', - 'Neither key replaces the built-in list.', + 'Adjust pull\'s built-in module skip list: exclude adds names, include removes them — commit to git so the team pulls the same modules.', '', - 'Commit this file to git (do not gitignore .siteglide-modules/) so every developer', - 'pulling the same site downloads the same modules.', - '', - 'Example — pull module_357 but also skip a custom module:', + 'Examples:', ' "include": ["module_357"],', - ' "exclude": ["my_custom_module"]', - '', - 'Use siteglide-cli pull -m to pull a single module once, including ignored ones.' + ' "exclude": ["my_custom_module"]' ].join('\n'), include: [], exclude: [] @@ -112,7 +104,7 @@ const mergePullIgnoredModules = (config = {}) => { }; /** - * Create `.siteglide-modules/pull.json` when missing. Never overwrites an existing file. + * Create `.siteglide/cli-settings/modules.json` when missing. Never overwrites an existing file. * * @param {string} [rootPath] * @returns {Promise<{ configPath: string, created: boolean }>} diff --git a/package.json b/package.json index b66a318..f88749f 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "scripts": { "postinstall": "node ./scripts/check-node-version.js", "build-assets": "npx webpack-cli gui/editor/src/index.js -o gui/editor/public/app.js --mode=production", - "build-gui": "npm --prefix gui/next ci && npm --prefix gui/next run build" + "build-gui": "npm --prefix gui/next ci && npm --prefix gui/next run build", + "i": "npm install -g ." }, "main": "./siteglide-cli.js", "license": "MIT", diff --git a/siteglide-cli-archive.js b/siteglide-cli-archive.js index 424cba0..b756d79 100755 --- a/siteglide-cli-archive.js +++ b/siteglide-cli-archive.js @@ -11,6 +11,7 @@ const program = require('commander'), version = require('./package.json').version, dir = require('./lib/directories'), files = require('./lib/assets/files'), + { deployGlobOptions } = require('./lib/deployGlob'), Gateway = require('./lib/proxy'); const { assertExclusiveSiteAppRoot } = require('./lib/migrateAppDirectory'); @@ -30,7 +31,7 @@ const addModulesToArchive = (archive, withImages) => { const addModuleToArchive = (module, archive, withImages, pattern = '?(public|private)/**') => { module = module.replace('/',''); return new Promise((resolve, reject) => { - glob(pattern, { cwd: `${dir.MODULES}/${module}` }, (err, files) => { + glob(pattern, deployGlobOptions({ cwd: `${dir.MODULES}/${module}` }), (err, files) => { if (err) throw reject(err); const moduleTemplateData = templateData(); @@ -66,7 +67,10 @@ const makeArchive = (archivePath, directory, program) => { const releaseArchive = prepareArchive(archivePath); if (directory) { - releaseArchive.glob('**/*', { cwd: directory, ignore: ['assets/**', '**/node_modules/**']}, { prefix: directory }); + releaseArchive.glob('**/*', deployGlobOptions({ + cwd: directory, + ignore: ['assets/**', '**/node_modules/**'] + }), { prefix: directory }); } addModulesToArchive(releaseArchive, program.opts().withImages).then(r => { diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index 52132fd..07a24e7 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -694,7 +694,7 @@ program .version(version, '-v, --version') .name('siteglide-cli pull') .usage('') - .description('Pull site files into the existing site root (app/ or marketplace_builder/) and module public files into modules/. Does not rename marketplace_builder/ ↔ app/. Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds IDE discovery folders linked to ./.agents/skills. Registers Siteglide MCP in IDE configs if missing. Modules pull in parallel (see --concurrency). Overwrites local files. By default skips built-in Siteglide platform modules; customize via .siteglide-modules/pull.json (include/exclude). Use -m to pull one module including ignored ones.') + .description('Pull site files into the existing site root (app/ or marketplace_builder/) and module public files into modules/. Does not rename marketplace_builder/ ↔ app/. Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds IDE discovery folders linked to ./.agents/skills. Registers Siteglide MCP in IDE configs if missing. Modules pull in parallel (see --concurrency). Overwrites local files. By default skips built-in Siteglide platform modules; customize via .siteglide/cli-settings/modules.json (include/exclude). Use -m to pull one module including ignored ones.') .arguments('[environment]', 'Name of environment. Example: staging') .option('-c --config-file ', 'config file path', '.siteglide-config') .option('-i --ignore-assets', 'Do not download assets such as CSS, JS, JSON etc', false) diff --git a/test/lib/pullIgnoredModules.test.js b/test/lib/pullIgnoredModules.test.js index 186b727..49db473 100644 --- a/test/lib/pullIgnoredModules.test.js +++ b/test/lib/pullIgnoredModules.test.js @@ -43,7 +43,7 @@ test('mergePullIgnoredModules lets include remove a name added by exclude', () = })).toEqual(DEFAULT_PULL_IGNORED_MODULES); }); -test('ensurePullModulesConfig creates pull.json when missing and does not overwrite existing file', async () => { +test('ensurePullModulesConfig creates modules.json when missing and does not overwrite existing file', async () => { const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-pull-modules-')); const configPath = path.join(rootPath, PULL_MODULES_CONFIG_RELATIVE_PATH); @@ -71,7 +71,7 @@ test('ensurePullModulesConfig creates pull.json when missing and does not overwr await fs.remove(rootPath); }); -test('preparePullModulesConfig applies include and exclude from pull.json', async () => { +test('preparePullModulesConfig applies include and exclude from modules.json', async () => { const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-pull-modules-config-')); const configPath = path.join(rootPath, PULL_MODULES_CONFIG_RELATIVE_PATH); await fs.ensureDir(path.dirname(configPath)); From 80d543250493b57dc89345f82c8a5debd24caac1 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Mon, 17 Aug 2026 15:12:21 +0100 Subject: [PATCH 19/34] Rename for pull modules skip override. --- lib/pullIgnoredModules.js | 45 ++++++++++++++++++++++++----- siteglide-cli-pull.js | 4 +-- test/lib/pullIgnoredModules.test.js | 26 ++++++++++------- 3 files changed, 54 insertions(+), 21 deletions(-) diff --git a/lib/pullIgnoredModules.js b/lib/pullIgnoredModules.js index 6648390..6e2bea6 100644 --- a/lib/pullIgnoredModules.js +++ b/lib/pullIgnoredModules.js @@ -1,6 +1,6 @@ /** * Module machine names skipped by default on `siteglide-cli pull`. - * Project `.siteglide/cli-settings/modules.json` can add (`exclude`) or remove (`include`) names. + * Project `.siteglide/cli-settings/modules.json` — `pull_behaviour.include` / `exclude` adjust the skip list. * * Built-in Siteglide platform modules are slow to pull and rarely contain project-specific * public/ code; custom modules are usually what you want locally. Use include or -m when needed. @@ -31,11 +31,13 @@ const DEFAULT_PULL_IGNORED_MODULES = [ /** * @returns {{ usage: string, include: string[], exclude: string[] }} */ -const defaultPullModulesConfigDocument = () => { +const defaultPullBehaviour = () => { return { usage: [ 'Adjust pull\'s built-in module skip list: exclude adds names, include removes them — commit to git so the team pulls the same modules.', '', + 'module_984 distributes AI skills and is not skipped by default; when pulled, skill files merge into ./.agents unless you exclude it.', + '', 'Examples:', ' "include": ["module_357"],', ' "exclude": ["my_custom_module"]' @@ -45,6 +47,33 @@ const defaultPullModulesConfigDocument = () => { }; }; +/** + * @returns {{ pull_behaviour: { usage: string, include: string[], exclude: string[] } }} + */ +const defaultPullModulesConfigDocument = () => { + return { + pull_behaviour: defaultPullBehaviour() + }; +}; + +/** + * @param {unknown} parsed + * @returns {{ include: string[], exclude: string[] }|null} + */ +const parsePullBehaviourFromDocument = (parsed) => { + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { + return null; + } + const pullBehaviour = parsed.pull_behaviour; + if (!pullBehaviour || typeof pullBehaviour !== 'object' || Array.isArray(pullBehaviour)) { + return null; + } + return { + include: normalizeModuleList(pullBehaviour.include), + exclude: normalizeModuleList(pullBehaviour.exclude) + }; +}; + /** * @param {string} [rootPath] * @returns {string} @@ -134,14 +163,12 @@ const readPullModulesConfig = async (rootPath = process.cwd()) => { } try { const parsed = JSON.parse(await fs.readFile(configPath, 'utf8')); - if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { - logger.Warn(`[pull] ${PULL_MODULES_CONFIG_RELATIVE_PATH} must be a JSON object; using built-in ignore list only`, { exit: false }); + const pullBehaviour = parsePullBehaviourFromDocument(parsed); + if (!pullBehaviour) { + logger.Warn(`[pull] ${PULL_MODULES_CONFIG_RELATIVE_PATH} must contain a pull_behaviour object; using built-in ignore list only`, { exit: false }); return { include: [], exclude: [] }; } - return { - include: normalizeModuleList(parsed.include), - exclude: normalizeModuleList(parsed.exclude) - }; + return pullBehaviour; } catch (error) { logger.Warn(`[pull] ${PULL_MODULES_CONFIG_RELATIVE_PATH} is invalid JSON (${error.message}); using built-in ignore list only`, { exit: false }); return { include: [], exclude: [] }; @@ -269,7 +296,9 @@ const selectModulesToPull = (installedModules, moduleFilter, ignoredModules = DE module.exports = { DEFAULT_PULL_IGNORED_MODULES, PULL_MODULES_CONFIG_RELATIVE_PATH, + defaultPullBehaviour, defaultPullModulesConfigDocument, + parsePullBehaviourFromDocument, resolvePullModulesConfigPath, normalizeModuleList, mergePullIgnoredModules, diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index 07a24e7..77ab1cf 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -694,7 +694,7 @@ program .version(version, '-v, --version') .name('siteglide-cli pull') .usage('') - .description('Pull site files into the existing site root (app/ or marketplace_builder/) and module public files into modules/. Does not rename marketplace_builder/ ↔ app/. Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds IDE discovery folders linked to ./.agents/skills. Registers Siteglide MCP in IDE configs if missing. Modules pull in parallel (see --concurrency). Overwrites local files. By default skips built-in Siteglide platform modules; customize via .siteglide/cli-settings/modules.json (include/exclude). Use -m to pull one module including ignored ones.') + .description('Pull site files into the existing site root (app/ or marketplace_builder/) and module public files into modules/. Does not rename marketplace_builder/ ↔ app/. Merges each module\'s public/assets/.agents into ./.agents (overwrite). When skills are present, scaffolds IDE discovery folders linked to ./.agents/skills. Registers Siteglide MCP in IDE configs if missing. Modules pull in parallel (see --concurrency). Overwrites local files. By default skips built-in Siteglide platform modules; customize via .siteglide/cli-settings/modules.json (pull_behaviour.include/exclude). Use -m to pull one module including ignored ones.') .arguments('[environment]', 'Name of environment. Example: staging') .option('-c --config-file ', 'config file path', '.siteglide-config') .option('-i --ignore-assets', 'Do not download assets such as CSS, JS, JSON etc', false) @@ -737,7 +737,7 @@ program pullSpinner.text = 'Fetching installed modules'; const { created: pullModulesConfigCreated, effectiveIgnoredModules } = await preparePullModulesConfig(process.cwd()); if (pullModulesConfigCreated) { - logger.Info(`[pull] Created ./${PULL_MODULES_CONFIG_RELATIVE_PATH} — edit include/exclude to customize skipped modules (commit to git so the team stays in sync)`); + logger.Info(`[pull] Created ./${PULL_MODULES_CONFIG_RELATIVE_PATH} — edit pull_behaviour include/exclude to customize skipped modules (commit to git so the team stays in sync)`); } const modulesResponse = await gateway.listModules(); const installedModules = (modulesResponse && modulesResponse.data) ? modulesResponse.data : []; diff --git a/test/lib/pullIgnoredModules.test.js b/test/lib/pullIgnoredModules.test.js index 49db473..03f85ce 100644 --- a/test/lib/pullIgnoredModules.test.js +++ b/test/lib/pullIgnoredModules.test.js @@ -52,20 +52,22 @@ test('ensurePullModulesConfig creates modules.json when missing and does not ove expect(await fs.pathExists(configPath)).toEqual(true); const parsed = JSON.parse(await fs.readFile(configPath, 'utf8')); - expect(parsed.include).toEqual([]); - expect(parsed.exclude).toEqual([]); - expect(typeof parsed.usage).toEqual('string'); - expect(parsed.usage).toContain('exclude'); - expect(parsed.usage).toContain('include'); - expect(parsed.usage).toContain('git'); + expect(parsed.pull_behaviour.include).toEqual([]); + expect(parsed.pull_behaviour.exclude).toEqual([]); + expect(typeof parsed.pull_behaviour.usage).toEqual('string'); + expect(parsed.pull_behaviour.usage).toContain('exclude'); + expect(parsed.pull_behaviour.usage).toContain('include'); + expect(parsed.pull_behaviour.usage).toContain('git'); - await fs.writeFile(configPath, '{"include":[],"exclude":["team_override"]}\n', 'utf8'); + await fs.writeFile(configPath, '{"pull_behaviour":{"include":[],"exclude":["team_override"]}}\n', 'utf8'); const second = await ensurePullModulesConfig(rootPath); expect(second.created).toEqual(false); expect(JSON.parse(await fs.readFile(configPath, 'utf8'))).toEqual({ - include: [], - exclude: ['team_override'] + pull_behaviour: { + include: [], + exclude: ['team_override'] + } }); await fs.remove(rootPath); @@ -76,8 +78,10 @@ test('preparePullModulesConfig applies include and exclude from modules.json', a const configPath = path.join(rootPath, PULL_MODULES_CONFIG_RELATIVE_PATH); await fs.ensureDir(path.dirname(configPath)); await fs.writeFile(configPath, JSON.stringify({ - include: ['module_357'], - exclude: ['custom_module'] + pull_behaviour: { + include: ['module_357'], + exclude: ['custom_module'] + } }, null, '\t') + '\n', 'utf8'); const prepared = await preparePullModulesConfig(rootPath); From ef385a7345c51cc4df993ef3dbf35d86aa6962a8 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Mon, 17 Aug 2026 15:58:59 +0100 Subject: [PATCH 20/34] Anticipate how the MCP will be installed, may change --- lib/mcpAlpha.js | 288 +++++++++++++++++++--------------- scripts/smoke-mcp-register.js | 19 --- siteglide-cli-pull.js | 2 +- test/lib/mcpAlpha.test.js | 63 ++++++++ 4 files changed, 227 insertions(+), 145 deletions(-) create mode 100644 test/lib/mcpAlpha.test.js diff --git a/lib/mcpAlpha.js b/lib/mcpAlpha.js index 3d447bc..e5a8968 100644 --- a/lib/mcpAlpha.js +++ b/lib/mcpAlpha.js @@ -13,69 +13,30 @@ const fs = require('fs'), getRegistryTargets } = require('./ai'); -const DEFAULT_PACKAGE = '@siteglide/siteglide-mcp'; +/** npm org scope for Siteglide packages (not the package name). */ +const NPM_ORG_SCOPE = '@siteglide'; +/** MCP package name within the @siteglide org. */ +const MCP_PACKAGE_NAME = 'siteglide-mcp'; +/** Full scoped npm package: org/package-name */ +const DEFAULT_PACKAGE = `${NPM_ORG_SCOPE}/${MCP_PACKAGE_NAME}`; const DEFAULT_REGISTRY = 'https://registry.npmjs.org/'; const DEFAULT_TAG = 'alpha'; -const ALPHA_RELATIVE_PATH = path.join('.siteglide', 'alpha.json'); const resolveCliRoot = () => path.resolve(__dirname, '..'); -const resolveAlphaPath = (rootPath = process.cwd()) => path.join(rootPath, ALPHA_RELATIVE_PATH); - -const readJsonObject = (filePath) => { - if (!fs.existsSync(filePath)) { - return null; - } +const isCliLocalMcpDependency = (cliRoot = resolveCliRoot()) => { try { - const parsed = JSON.parse(fs.readFileSync(filePath, 'utf8')); - if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) { - return parsed; + const cliPkg = JSON.parse(fs.readFileSync(path.join(cliRoot, 'package.json'), 'utf8')); + const dep = cliPkg.dependencies && cliPkg.dependencies[DEFAULT_PACKAGE]; + if (typeof dep !== 'string') { + return false; } + return dep.indexOf('file:') === 0 || dep.indexOf('link:') === 0; } catch (error) { - logger.Warn(`[pull] ${ALPHA_RELATIVE_PATH} is invalid JSON (${error.message})`, { exit: false }); + return false; } - return null; }; -/** - * Read npm credentials for restricted MCP installs from ./.siteglide/alpha.json. - * Expected shape: { token, registry?, tag?, package? } - * - * @param {string} [rootPath] - * @returns {null | { token: string, registry: string, tag: string, package: string }} - */ -const readAlphaCredentials = (rootPath = process.cwd()) => { - const parsed = readJsonObject(resolveAlphaPath(rootPath)); - if (!parsed) { - return null; - } - - const token = typeof parsed.token === 'string' - ? parsed.token.trim() - : typeof parsed._authToken === 'string' - ? parsed._authToken.trim() - : ''; - - if (!token) { - return null; - } - - return { - token, - registry: typeof parsed.registry === 'string' && parsed.registry.trim() - ? parsed.registry.trim() - : DEFAULT_REGISTRY, - tag: typeof parsed.tag === 'string' && parsed.tag.trim() - ? parsed.tag.trim() - : DEFAULT_TAG, - package: typeof parsed.package === 'string' && parsed.package.trim() - ? parsed.package.trim() - : DEFAULT_PACKAGE - }; -}; - -const hasAlphaCredentials = (rootPath = process.cwd()) => readAlphaCredentials(rootPath) !== null; - const registryPackageUrl = (registry, packageName) => { const base = registry.endsWith('/') ? registry.slice(0, -1) : registry; return `${base}/${packageName.replace('/', '%2F')}`; @@ -90,21 +51,61 @@ const resolveInstalledMcpVersion = (cliRoot = resolveCliRoot()) => { } }; +/** + * @param {string} [cliRoot] + * @returns {{ version: string, resolved: string | null, linked: boolean } | null} + */ +const resolveLocalMcpFromNpmList = (cliRoot = resolveCliRoot()) => { + try { + const output = execFileSync( + process.platform === 'win32' ? 'npm.cmd' : 'npm', + ['list', DEFAULT_PACKAGE, '--json', '--depth=0'], + { + cwd: cliRoot, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'ignore'] + } + ); + const data = JSON.parse(output); + const dep = data.dependencies && data.dependencies[DEFAULT_PACKAGE]; + if (!dep || typeof dep.version !== 'string') { + return null; + } + const resolved = typeof dep.resolved === 'string' ? dep.resolved : null; + return { + version: dep.version, + resolved, + linked: Boolean(resolved && (resolved.indexOf('file:') === 0 || resolved.indexOf('link:') === 0)) + }; + } catch (error) { + logger.Debug(`[pull] npm list ${DEFAULT_PACKAGE} failed: ${error.message}`); + return null; + } +}; + /** * @returns {Promise<{ tagVersion: string | null, versions: string[], distTags: Record } | null>} */ -const fetchPublishedMcpVersions = async (credentials) => { - const url = registryPackageUrl(credentials.registry, credentials.package); +const fetchPublishedMcpVersions = async ( + packageName = DEFAULT_PACKAGE, + registry = DEFAULT_REGISTRY, + tag = DEFAULT_TAG +) => { + const url = registryPackageUrl(registry, packageName); try { const response = await fetch(url, { headers: { - Authorization: `Bearer ${credentials.token}`, Accept: 'application/json' } }); + if (response.status === 404) { + logger.Debug(`[pull] ${packageName} is not published on ${registry}`); + return null; + } + if (!response.ok) { - logger.Debug(`[pull] MCP registry lookup failed (${response.status}) for ${credentials.package}`); + logger.Debug(`[pull] MCP registry lookup failed (${response.status}) for ${packageName}`); return null; } @@ -117,7 +118,7 @@ const fetchPublishedMcpVersions = async (credentials) => { : {}; return { - tagVersion: typeof distTags[credentials.tag] === 'string' ? distTags[credentials.tag] : null, + tagVersion: typeof distTags[tag] === 'string' ? distTags[tag] : null, versions, distTags }; @@ -127,7 +128,10 @@ const fetchPublishedMcpVersions = async (credentials) => { } }; -const pickLatestPublishedVersion = (published, tag) => { +const pickLatestPublishedVersion = (published, tag = DEFAULT_TAG) => { + if (!published) { + return null; + } if (published.tagVersion && semver.valid(published.tagVersion)) { return published.tagVersion; } @@ -139,40 +143,12 @@ const pickLatestPublishedVersion = (published, tag) => { return stable[0] || null; }; -const writeTempNpmrc = (credentials) => { - const registryHost = credentials.registry.replace(/^https?:\/\//, '').replace(/\/$/, ''); - const npmrcPath = path.join(os.tmpdir(), `siteglide-mcp-alpha-${process.pid}.npmrc`); - const scope = credentials.package.startsWith('@') ? credentials.package.split('/')[0] : null; - const lines = [ - `//${registryHost}/:_authToken=${credentials.token}` - ]; - - if (scope) { - lines.unshift(`${scope}:registry=${credentials.registry}`); - } - - fs.writeFileSync(npmrcPath, lines.join('\n') + '\n', 'utf8'); - return npmrcPath; -}; - -const removeTempFile = (filePath) => { - try { - if (filePath && fs.existsSync(filePath)) { - fs.unlinkSync(filePath); - } - } catch (error) { - logger.Debug(`[pull] Could not remove temp npmrc: ${error.message}`); - } -}; - -const installMcpPackage = (credentials, version, cliRoot = resolveCliRoot()) => { - const spec = version ? `${credentials.package}@${version}` : `${credentials.package}@${credentials.tag}`; - const npmrcPath = writeTempNpmrc(credentials); - +const installMcpPackage = (version, cliRoot = resolveCliRoot()) => { + const spec = `${DEFAULT_PACKAGE}@${version}`; try { execFileSync( process.platform === 'win32' ? 'npm.cmd' : 'npm', - ['install', spec, '--no-save', '--userconfig', npmrcPath], + ['install', spec, '--no-save'], { cwd: cliRoot, stdio: 'inherit', @@ -183,8 +159,6 @@ const installMcpPackage = (credentials, version, cliRoot = resolveCliRoot()) => } catch (error) { logger.Warn(`[pull] MCP install failed: ${error.message}`, { exit: false }); return false; - } finally { - removeTempFile(npmrcPath); } }; @@ -244,11 +218,21 @@ const getMcpConfigStatus = (rootPath = process.cwd()) => { }; }; +const formatLocalMcpLabel = (localInstall) => { + if (!localInstall) { + return DEFAULT_PACKAGE; + } + if (localInstall.linked && localInstall.resolved) { + return `${DEFAULT_PACKAGE}@${localInstall.version} (${localInstall.resolved})`; + } + return `${DEFAULT_PACKAGE}@${localInstall.version}`; +}; + /** - * Alpha-gated MCP setup on pull: - * - Requires ./.siteglide/alpha.json with npm token - * - Ensures MCP package is installed and IDE configs exist - * - Offers upgrade when MCP is already configured and a newer version exists + * MCP setup on pull: + * - Checks the public npm registry for siteglide-mcp under the @siteglide org (alpha tag) + * - Offers install/upgrade when a published version exists + * - When IDE mcp.json lacks siteglide, warns if npm is empty and offers local test registration * * @param {{ rootPath?: string, homedir?: string, interactive?: boolean }} [opts] */ @@ -256,48 +240,36 @@ const ensureMcpOnPull = async (opts = {}) => { const rootPath = opts.rootPath || process.cwd(); const homedir = opts.homedir || os.homedir(); const interactive = opts.interactive !== false; - const credentials = readAlphaCredentials(rootPath); - - if (!credentials) { - logger.Debug(`[pull] Skipping MCP setup — create ${ALPHA_RELATIVE_PATH} with npm credentials for alpha access`); - return { - skipped: true, - reason: 'missing-alpha-credentials' - }; - } - const cliRoot = resolveCliRoot(); + let installedVersion = resolveInstalledMcpVersion(cliRoot); + const localInstall = resolveLocalMcpFromNpmList(cliRoot); const configStatus = getMcpConfigStatus(rootPath); - const published = await fetchPublishedMcpVersions(credentials); - const latestVersion = published ? pickLatestPublishedVersion(published, credentials.tag) : null; + const published = await fetchPublishedMcpVersions(); + const latestVersion = pickLatestPublishedVersion(published, DEFAULT_TAG); - if (!installedVersion) { - if (latestVersion) { - logger.Info(`[pull] Siteglide MCP is not installed (latest ${credentials.tag}: ${latestVersion})`); - if (interactive) { - const answer = await Confirm(`Install ${credentials.package}@${latestVersion}? (y/N) `); - if (isAffirmative(answer)) { - if (installMcpPackage(credentials, latestVersion, cliRoot)) { - installedVersion = resolveInstalledMcpVersion(cliRoot); - } + if (!installedVersion && latestVersion) { + logger.Info(`[pull] Siteglide MCP is not installed (${DEFAULT_TAG} on npm: ${latestVersion})`); + if (interactive) { + const answer = await Confirm(`Install ${DEFAULT_PACKAGE}@${latestVersion} from npm? (y/N) `); + if (isAffirmative(answer)) { + if (installMcpPackage(latestVersion, cliRoot)) { + installedVersion = resolveInstalledMcpVersion(cliRoot); } } - } else { - logger.Warn('[pull] Siteglide MCP is not installed and registry versions could not be read', { exit: false }); } } else if ( - configStatus.configured && + installedVersion && latestVersion && semver.valid(installedVersion) && semver.valid(latestVersion) && semver.gt(latestVersion, installedVersion) ) { - logger.Info(`[pull] Siteglide MCP ${installedVersion} installed; ${credentials.tag} latest is ${latestVersion}`); + logger.Info(`[pull] Siteglide MCP ${installedVersion} installed; ${DEFAULT_TAG} latest on npm is ${latestVersion}`); if (interactive) { const answer = await Confirm(`Upgrade Siteglide MCP to ${latestVersion}? (y/N) `); if (isAffirmative(answer)) { - if (installMcpPackage(credentials, latestVersion, cliRoot)) { + if (installMcpPackage(latestVersion, cliRoot)) { installedVersion = resolveInstalledMcpVersion(cliRoot); logger.Info(`[pull] Siteglide MCP upgraded to ${installedVersion}`); } @@ -307,7 +279,71 @@ const ensureMcpOnPull = async (opts = {}) => { logger.Debug(`[pull] Siteglide MCP ${installedVersion} installed`); } - if (!resolveInstalledMcpVersion(cliRoot)) { + installedVersion = resolveInstalledMcpVersion(cliRoot); + const hasInstalledMcp = Boolean(installedVersion); + + if (!configStatus.configured) { + if (!latestVersion && !hasInstalledMcp) { + logger.Warn( + `[pull] ${MCP_PACKAGE_NAME} is not published on npm under ${NPM_ORG_SCOPE} yet — Siteglide MCP for IDE agents is coming soon.`, + { exit: false } + ); + return { + skipped: true, + reason: 'not-published', + installedVersion, + latestVersion + }; + } + + const localTestInstall = Boolean( + hasInstalledMcp && ( + !latestVersion || + (localInstall && localInstall.linked) || + isCliLocalMcpDependency(cliRoot) + ) + ); + + if (hasInstalledMcp && localTestInstall) { + const label = formatLocalMcpLabel( + localInstall || { version: installedVersion, resolved: null, linked: isCliLocalMcpDependency(cliRoot) } + ); + if (interactive) { + const answer = await Confirm( + `Add local test version ${label} to your IDE MCP config (mcp.json)? (y/N) ` + ); + if (!isAffirmative(answer)) { + logger.Info('[pull] Skipping Siteglide MCP IDE registration'); + return { + skipped: true, + reason: 'user-declined-registration', + installedVersion, + latestVersion, + configStatus + }; + } + } else { + logger.Debug('[pull] Local Siteglide MCP install present; IDE registration skipped (non-interactive)'); + return { + skipped: true, + reason: 'non-interactive-registration', + installedVersion, + latestVersion, + configStatus + }; + } + } + } + + if (!hasInstalledMcp) { + if (!latestVersion) { + return { + skipped: true, + reason: 'not-published', + installedVersion, + latestVersion + }; + } logger.Warn('[pull] Siteglide MCP is unavailable — IDE registration skipped', { exit: false }); return { skipped: true, @@ -337,15 +373,17 @@ const ensureMcpOnPull = async (opts = {}) => { }; module.exports = { - ALPHA_RELATIVE_PATH, + NPM_ORG_SCOPE, + MCP_PACKAGE_NAME, DEFAULT_PACKAGE, DEFAULT_REGISTRY, DEFAULT_TAG, - readAlphaCredentials, - hasAlphaCredentials, resolveInstalledMcpVersion, + resolveLocalMcpFromNpmList, fetchPublishedMcpVersions, + pickLatestPublishedVersion, getMcpConfigStatus, installMcpPackage, + isCliLocalMcpDependency, ensureMcpOnPull }; diff --git a/scripts/smoke-mcp-register.js b/scripts/smoke-mcp-register.js index 981b213..f202163 100644 --- a/scripts/smoke-mcp-register.js +++ b/scripts/smoke-mcp-register.js @@ -4,9 +4,6 @@ const fs = require('fs'); const os = require('os'); const path = require('path'); const { - ensureMcpOnPull, - hasAlphaCredentials, - readAlphaCredentials, getMcpConfigStatus } = require('../lib/mcpAlpha'); const { @@ -21,24 +18,8 @@ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'sg-mcp-reg-')); const fakeHome = fs.mkdtempSync(path.join(os.tmpdir(), 'sg-mcp-home-')); const cursorPath = path.join(root, '.cursor', 'mcp.json'); -assert.strictEqual(hasAlphaCredentials(root), false, 'missing alpha.json should skip MCP setup'); - -const skipped = await ensureMcpOnPull({ rootPath: root, homedir: fakeHome, interactive: false }); -assert.strictEqual(skipped.skipped, true); -assert.strictEqual(skipped.reason, 'missing-alpha-credentials'); assert.strictEqual(fs.existsSync(path.join(root, '.cursor', 'rules', 'setup_siteglide_mcp.mdc')), false); -fs.mkdirSync(path.join(root, '.siteglide'), { recursive: true }); -fs.writeFileSync( - path.join(root, '.siteglide', 'alpha.json'), - JSON.stringify({ token: 'npm_test_token' }, null, 2) -); - -const creds = readAlphaCredentials(root); -assert.ok(creds); -assert.strictEqual(creds.tag, 'alpha'); -assert.strictEqual(creds.package, '@siteglide/siteglide-mcp'); - fs.mkdirSync(path.dirname(cursorPath), { recursive: true }); fs.writeFileSync( cursorPath, diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index 77ab1cf..6f22e49 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -783,7 +783,7 @@ program // After module zips (and assets that may land under modules/) are on disk await mergeModuleAgentsToRoot(modulesToPull); - pullSpinner.text = 'Checking Siteglide MCP (alpha)'; + pullSpinner.text = 'Checking Siteglide MCP'; await ensureMcpOnPull(); await tidyUpAfterPull(ignoredModules); diff --git a/test/lib/mcpAlpha.test.js b/test/lib/mcpAlpha.test.js new file mode 100644 index 0000000..9153ac2 --- /dev/null +++ b/test/lib/mcpAlpha.test.js @@ -0,0 +1,63 @@ +const fs = require('fs-extra'); +const os = require('os'); +const path = require('path'); +const { + NPM_ORG_SCOPE, + MCP_PACKAGE_NAME, + DEFAULT_PACKAGE, + pickLatestPublishedVersion, + getMcpConfigStatus, + isCliLocalMcpDependency +} = require('../../lib/mcpAlpha'); +const { SERVER_NAME } = require('../../lib/ai'); + +test('pickLatestPublishedVersion prefers dist-tag then highest semver', () => { + expect(pickLatestPublishedVersion({ + tagVersion: '0.2.0-alpha.1', + versions: ['0.1.0-alpha.0', '0.2.0-alpha.1'], + distTags: { alpha: '0.2.0-alpha.1' } + }, 'alpha')).toEqual('0.2.0-alpha.1'); + + expect(pickLatestPublishedVersion({ + tagVersion: null, + versions: ['0.1.0-alpha.0', '0.2.0-alpha.1'], + distTags: {} + }, 'alpha')).toEqual('0.2.0-alpha.1'); + + expect(pickLatestPublishedVersion(null, 'alpha')).toEqual(null); +}); + +test('getMcpConfigStatus reports configured when siteglide server exists', async () => { + const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-mcp-status-')); + const cursorPath = path.join(rootPath, '.cursor', 'mcp.json'); + + try { + await fs.ensureDir(path.dirname(cursorPath)); + await fs.writeFile(cursorPath, JSON.stringify({ + mcpServers: { + [SERVER_NAME]: { command: 'node', args: ['siteglide-cli-mcp.js'] } + } + }, null, 2)); + + expect(getMcpConfigStatus(rootPath)).toEqual({ + configured: true, + paths: [cursorPath], + missing: [ + path.join(rootPath, '.mcp.json'), + path.join(rootPath, '.vscode', 'mcp.json') + ] + }); + } finally { + await fs.remove(rootPath); + } +}); + +test('DEFAULT_PACKAGE is scoped npm name: @siteglide org + siteglide-mcp package', () => { + expect(NPM_ORG_SCOPE).toEqual('@siteglide'); + expect(MCP_PACKAGE_NAME).toEqual('siteglide-mcp'); + expect(DEFAULT_PACKAGE).toEqual('@siteglide/siteglide-mcp'); +}); + +test('isCliLocalMcpDependency detects file: dependency in CLI package.json', () => { + expect(isCliLocalMcpDependency()).toEqual(true); +}); From f07cc2b25213353758c00d943443fb8226becdc4 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Mon, 17 Aug 2026 17:30:30 +0100 Subject: [PATCH 21/34] Remove the commit to skip // files. More trouble than it's worth. --- siteglide-cli-pull.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index 6f22e49..6bc9597 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -601,14 +601,8 @@ const pullAssets = async (gateway, siteRoot = dir.APP, ignoredModules = DEFAULT_ })); let moduleAssetCount = 0; let wroteCount = 0; - let skippedEmptyPath = 0; asset_files.forEach(file => { const physicalPath = file.data.physical_file_path.replace(/\\/g, '/'); - if (physicalPath.indexOf('//') > -1) { - skippedEmptyPath++; - logger.Info(`[pull] Skipping asset with empty folder in path: ${physicalPath}`); - return; - } const isModuleAsset = physicalPath === dir.MODULES || physicalPath.indexOf(dir.MODULES + '/') === 0; const root = isModuleAsset ? dir.MODULES : siteRoot; const relativePath = isModuleAsset @@ -630,9 +624,6 @@ const pullAssets = async (gateway, siteRoot = dir.APP, ignoredModules = DEFAULT_ fs.writeFileSync(fullPath, file.data.body, logger.Error); wroteCount++; }); - if (skippedEmptyPath > 0) { - logger.Info(`[pull] Assets: skipped ${skippedEmptyPath} file(s) with empty folder in path`); - } logger.Info(`[pull] Assets: wrote ${wroteCount} file(s) (${moduleAssetCount} under modules)`); }; From bb60c16e728d946bffc7bc25651a824996c01fa8 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Tue, 18 Aug 2026 13:12:44 +0100 Subject: [PATCH 22/34] Clarify that on 1st pull marketplace_builder should be used. References to marketplace_builder/ app to now use a function so it can be replaced later if agreed. --- .../siteglide_exec_command_940796a4.plan.md | 288 ---------------- lib/assets/files.js | 2 +- lib/assets/generateManifest.js | 10 +- lib/assets/packAssets.js | 4 +- lib/confirm.js | 1 - lib/deployServiceClient.js | 16 +- lib/directories.js | 30 +- lib/mcpAlpha.js | 317 ++++++++++-------- lib/migrateAppDirectory.js | 20 +- lib/migration/commands/optimize/images.js | 21 +- lib/migration/commands/urls.js | 6 +- .../lib/scraper-plugins/generate-filename.js | 8 +- scripts/smoke-mcp-register.js | 90 ++--- siteglide-cli-archive.js | 2 +- siteglide-cli-deploy.js | 2 +- siteglide-cli-export.js | 31 +- siteglide-cli-migrate.js | 8 +- siteglide-cli-pull.js | 10 +- siteglide-cli-watch.js | 10 +- test/helpers/mcpIdeArtifacts.js | 38 +++ test/lib/directories.test.js | 37 ++ test/lib/mcpAlpha.test.js | 20 +- test/lib/mcpRegistration.test.js | 64 ++++ 23 files changed, 490 insertions(+), 545 deletions(-) delete mode 100644 .cursor/plans/siteglide_exec_command_940796a4.plan.md create mode 100644 test/helpers/mcpIdeArtifacts.js create mode 100644 test/lib/directories.test.js create mode 100644 test/lib/mcpRegistration.test.js diff --git a/.cursor/plans/siteglide_exec_command_940796a4.plan.md b/.cursor/plans/siteglide_exec_command_940796a4.plan.md deleted file mode 100644 index ae6bcdc..0000000 --- a/.cursor/plans/siteglide_exec_command_940796a4.plan.md +++ /dev/null @@ -1,288 +0,0 @@ ---- -name: siteglide MCP desktop -overview: Siteglide MCP desktop (stdio) + pull-time MCP registration + marketplace_builder→app migrate (FS rename + staged path rewrite; commit to record renames). test-rename harness removed. -todos: - - id: lib-exec - content: "CANCELLED: siteglide-cli exec — ops live in MCP graphql_exec/liquid_exec instead" - status: cancelled - - id: cli-exec - content: "CANCELLED: siteglide-cli exec bins" - status: cancelled - - id: mcp-repo - content: Scaffold Siteglide-MCP (compose upstream supervisor + Siteglide rules + ops tools; stdio entrypoints) - status: completed - - id: layout-bridge - content: "CANCELLED: MCP path bridge — replaced by pull migrate marketplace_builder → app (platformOS advice)" - status: cancelled - - id: pull-app-migrate - content: On pull, git mv or rename marketplace_builder → app; pull site/assets into app/ - status: completed - - id: cli-ai-wrappers - content: "CANCELLED: ai init / dual supervisor — replaced by single mcp + pull-time IDE registration" - status: cancelled - - id: pull-mcp-register - content: On pull, merge-safe register siteglide MCP for cursor/claude/copilot/windsurf if missing - status: completed - - id: rebase-pull-modules - content: Rebase onto Pull-should-pull-all-modules'-public-files- - status: completed - - id: deps-tests - content: Wire package deps; smoke tests; update explain_to_my_boss; document Docker/HTTP as phase-later - status: completed - - id: http-docker-later - content: "DEFERRED: HTTP/SSE + Docker for browser agents" - status: cancelled - - id: win-git-rename-index - content: "Fix migrate+pull git UX: stage exact path rewrite before unzip; then stage app/ content mods (avoid D/A churn)" - status: completed - - id: test-rename-cmd - content: "REMOVED: siteglide-cli test-rename harness (rename works; commit records renames)" - status: cancelled -isProject: false ---- - -# Siteglide-MCP desktop + CLI wrappers - -## MCP home (locked) - -All Siteglide MCP implementation lives in [`d:\git\Siteglide-MCP`](d:\git\Siteglide-MCP) — not inside the CLI package tree. - -| Keep in `siteglide-cli` | Put in `Siteglide-MCP` | -| --- | --- | -| `ai init` (writes config pointing at MCP bins) | Composed supervisor (`validate_code` + Siteglide rules) | -| Thin wrapper bins that call / spawn the MCP package | Operational MCP tools (`envs_list`, `graphql_exec`, `liquid_exec`, `logs_fetch`) | -| | Modular `rules/` / `guides/` data | -| | **Layout bridge** (`marketplace_builder` ↔ `app` temp overlay) | -| | Future HTTP/SSE + Docker image | - -**Not in scope:** CLI `exec graphql|liquid` — agents use MCP ops tools; humans can use existing GUI evaluators. -**Why separate:** independent versioning, npm-bump of `@platformos/platformos-mcp-supervisor` without a CLI release, reusable by web agents / Docker without installing the whole CLI, cleaner boundary for Siteglide rules. - -**How CLI consumes it:** `siteglide-cli` depends on or invokes this repo’s published package / bins; `siteglide-cli mcp` / `supervisor` are thin launchers; `ai init` registers those commands. - -## Docker / browser later - -**Yes**, if transports stay swappable. - -- **v1:** stdio — Cursor / Claude Code / local agents -- **Later:** HTTP + SSE (or streamable HTTP); browser → Siteglide agent BFF → Docker MCP (no secrets in the browser) - -```mermaid -flowchart LR - browser["Browser AI UI"] --> bff["Siteglide agent backend"] - bff --> httpMcp["Docker MCP HTTP/SSE"] - httpMcp --> tools["Same tool registry"] - tools --> upstream["@platformos/platformos-mcp-supervisor"] - tools --> rules["Siteglide rules"] - tools --> bridge["layout bridge overlay"] - tools --> api["Siteglide-API / Gateway"] -``` - -**Not in v1:** shipping HTTP/Docker — only design so tool registration is transport-agnostic. - -## Scope - -1. **`Siteglide-MCP`** — compose upstream check engine + Siteglide rules + ops tools + layout bridge -2. **`siteglide-cli ai init`** — register MCP bins -3. **Thin CLI wrappers** for `mcp` / `supervisor` - -No Siteglide-API changes. Do not fork `platformos-tools`. No CLI `exec` command. - -## Two supervisors (use the new one) - -| Version | Use? | -| --- | --- | -| Legacy `pos-supervisor` | No | -| `@platformos/platformos-mcp-supervisor` (platformos-tools) | **Yes** | - -## Compose, do not fork (update-friendly) - -Upstream embedding API: - -- `startServer({ projectDir })` → `{ server, context, shutdown }` -- `registerValidateCode(server, context)` -- `ValidateCodeResult` types - -In `Siteglide-MCP`: - -1. Detect layout; if needed, create **temp overlay bridge** → `bridgedProjectDir` -2. `startServer` / lint against bridged dir (rewrite `file_path` for agents using `marketplace_builder/...`) -3. `registerSiteglideTools(server, …)` on the **same** `McpServer` -4. Ops tools (sibling stdio entry or same process) -5. Bump `@platformos/platformos-mcp-supervisor` for pOS updates — Siteglide rules/bridge unchanged unless public API breaks - -```mermaid -flowchart TB - cliAi["siteglide-cli ai init"] - cliAi --> bins["siteglide-cli-mcp / siteglide-cli-supervisor"] - bins --> pkg["Siteglide-MCP"] - pkg --> bridge["layout bridge if needed"] - bridge --> start["startServer upstream"] - pkg --> sg["registerSiteglideTools"] - pkg --> ops["ops tools Gateway"] - npmBump["npm bump platformos-mcp-supervisor"] -.-> start -``` - -### Layout (in MCP repo) - -``` -Siteglide-MCP/ - src/supervisor/compose.js # bridge + startServer + registerSiteglideTools - src/layout/ - detect.js # app | marketplace_builder | null - bridge.js # create/destroy temp overlay - rewritePath.js # path rewrite for validate_code - src/siteglide/register.js - src/siteglide/rules/ - src/siteglide/guides/ - src/ops/ # envs-list, graphql-exec, liquid-exec, logs-fetch - src/stdio.js # stdio transport bootstrap - src/http.js # deferred — same registerTools for later Docker -``` - -## Path bridge (locked interim) - -platformOS **already** classifies `marketplace_builder/` files (`getFileType` / `isKnownLiquidFile` in platformos-common). Gaps remain: `getAppPaths` / `DocumentsLocator` search **`app/` only**; some checks hardcode `app/...`. Native LSP support was asked of platformOS; until that ships, Siteglide uses an interim bridge. - -**Do not** create `app` → `marketplace_builder` inside the customer project (git noise, deploy confusion). - -**Do** build a **session temp overlay** before lint: - -``` -/siteglide-mcp-bridge-XXXX/ - app/ → junction/symlink to /marketplace_builder - modules/ → junction/symlink to /modules (if present) - .platformos-check.yml (copy from project if present, else minimal stub) -``` - -```mermaid -flowchart LR - agent["Agent validate_code"] --> wrap["Siteglide wrapper"] - wrap --> rewrite["Rewrite file_path prefixes"] - wrap --> overlay["Temp overlay projectDir"] - overlay --> appLink["app junction"] - appLink --> mb["project/marketplace_builder"] - overlay --> upstream["upstream runLint / validate_code"] -``` - -### When to activate - -| Project state | Bridge? | -| --- | --- | -| Only `marketplace_builder/` (no real `app/`) | **Yes** | -| Real `app/` exists | **No** | -| Both exist | **No** — prefer real `app/`; log once | -| Only `modules/` | **No** | - -Detect real `app/` with `fs.lstat` (don’t nest or delete foreign symlinks/junctions). - -### Cross-platform links - -| OS | Directory link type | Notes | -| --- | --- | --- | -| Windows | `'junction'` | No admin / Developer Mode for directory junctions | -| macOS / Linux | `'dir'` (or default) | Standard symlink | - -Normalize paths to `/` for MCP/agent strings; `path.resolve` absolute targets before linking. - -Lifecycle: create once at MCP start → reuse for all `validate_code` → destroy on `shutdown()` / process exit. - -### file_path rewrite - -When bridge active: map `marketplace_builder/...` (relative or absolute under project) → overlay `app/...`; accept `app/...` relative to overlay. **v1:** diagnostics may still say `app/...` (alias documented via skills); optional reverse-map later. - -### validate_code wiring - -Prefer public lint API from the supervisor package (`runLint` / equivalent) behind `runValidateCodeWithBridge`. If only `startServer` is exported, use documented lower-level registration; avoid monkey-patching. Fallback to check-node only if supervisor exports are insufficient. - -### Bridge tests - -- detect: only-mb → bridge; only-app → no; both → no -- rewritePath: relative + absolute (win32/posix fixtures) -- overlay create/destroy + readable `app/...` through junction -- smoke: lint fixture under `marketplace_builder` via bridged `validate_code` - -### Bridge out of scope - -- Patching `platformos-tools` in our tree -- Persistent in-repo `app` symlinks -- Keeping the bridge forever after upstream native support (remove when they ship and we bump) - -## Decisions (locked) - -### MCP (`Siteglide-MCP`) -- Compose upstream check engine + Siteglide rules -- Ops MVP: `envs_list`, `graphql_exec`, `liquid_exec`, `logs_fetch` -- **Layout bridge:** temp overlay when only `marketplace_builder/` (cross-platform junctions/symlinks) -- **v1 transport: stdio only**; transport-agnostic registration for HTTP/Docker later -- Auth for ops: `.siteglide-config` / `MPKIT_*` / explicit params (HTTP auth later) -- Upstream `validate_code` needs **no** Siteglide auth; ops tools do - -### ai init (CLI) -- Registers `siteglide-cli-mcp` + `siteglide-cli-supervisor` (wrappers → MCP repo) - -### Skills vs MCP -- Skills = guidance (temporary `Siteglide-AI-Skills`; later modules/CLI install) -- MCP = callable tools; they coexist -- Rules/skills cannot alone fix `app/` search paths — bridge handles that until pOS does - -### Not shipping -- CLI `exec graphql|liquid` (undone; MCP ops cover agent GraphQL/Liquid) - -## Phases - -### 1 — scaffold `Siteglide-MCP` -Compose supervisor + layout bridge + Siteglide guide/rules tool + ops MVP + stdio entries - -### 2 — wire CLI -Depend on / invoke MCP package; `ai init`; thin `mcp` / `supervisor` bins - -### 3 — (later) -HTTP/SSE, Dockerfile, web agent BFF auth; drop bridge when upstream marketplace_builder support is enough - -## Next — Windows git index after `marketplace_builder` → `app` - -**Symptom:** After pull migrate on Windows, git shows ~10k changed files (mass delete + add) instead of renames. - -### Research takeaways (why “just git mv harder” is the wrong goal) - -Git does **not** store renames. It stores snapshots; `git status` / `git diff` *detect* renames by pairing deletes with adds ([torek / SO](https://stackoverflow.com/questions/60185482/git-mv-did-not-flag-every-file-as-renamed-several-are-deleted-added), [Dynamics blog](https://community.dynamics.com/blogs/post/?postid=24c0d875-2cc4-45d1-996a-a56a753eaca2)): - -- **Exact renames** (identical blob hash): linear, fast, works for thousands of files — `git mv` and `mv` + `git add -A` are equivalent for history. -- **Inexact renames** (path moved *and* content changed): quadratic; skipped when pair count exceeds `diff.renameLimit` / `status.renameLimit` (default historically ~1000). Then status shows raw `D`/`A` for the whole tree — matches the ~10k churn symptom. -- Mixing a directory rename with a full site zip overwrite in one unstaged/staged blob is exactly the inexact-rename trap: hashes no longer match, limit kicks in, UI looks broken. -- Windows `fatal: bad source` on `git mv *` is usually shell globbing ([git-for-windows#3250](https://github.com/git-for-windows/git/issues/3250)); our code already uses `execFile` + `git.exe` without globs. Remaining `git mv` failures are secondary — FS rename is fine if the **index timing** is right ([git-for-windows#1750](https://github.com/git-for-windows/git/issues/1750): Explorer move needs `git add -A` to sync index). - -### Chosen approach (concrete) - -In [`lib/migrateAppDirectory.js`](d:\git\siteglide-cli\lib\migrateAppDirectory.js) + [`siteglide-cli-pull.js`](d:\git\siteglide-cli\siteglide-cli-pull.js): - -1. **Diagnose once on a real Windows site** (migrate-only pause or debug flag): after disk rename + index update, *before* unzip, run `git -c status.renameLimit=0 status --short` / `git diff --cached --name-status -M100%`. Expect mostly `R100%`. If not, fix staging first. -2. **Prefer FS rename + immediate index sync** (keep `git mv` as optional fast path only): `fs.move(marketplace_builder, app)` then `git add -A -- app marketplace_builder` while on-disk content still matches HEAD blobs → stages **exact** renames into the index. -3. **Then** download/unzip into `app/` (existing pull). Do **not** re-run a combined `git add -A` over both old and new roots after content rewrite in a way that re-pairs D/A across the rename; after unzip only stage under `app/` (`git add -A -- app`) so post-pull churn is **modifications** (and new files) under `app/`, with the path rewrite already recorded. -4. **Log clearly** after migrate: rename staged; any large remaining status after pull is site content sync under `app/`, not a failed folder move. -5. **Verify**: migrate-only → `R` lines; full pull → no mass `D marketplace_builder` + `A app` for the same relative paths; Cursor/git status should not look like 10k delete+add of the whole tree. - -Do **not** rely on raising global `renameLimit` as the primary fix (helps display of inexact pairs, does not fix mixing rename+content). Do **not** require a mid-pull commit from the CLI (user commits when ready; commit is when rename detection is clearest in history/UIs). - -### Removed — `siteglide-cli test-rename` - -Harness and Jest migrate fixture removed once rename staging was confirmed; keep FS rename + staged path rewrite in pull only. - -## Out of scope (this pass) - -- CLI `exec` command -- Implementing Docker/HTTP hosting now -- Forking platformos-mcp-supervisor -- Legacy pos-supervisor / `load_development_guide` -- Full pos-cli mcp-min parity -- Patching upstream pos-cli / platformos-tools -- Persistent customer-repo `app` symlinks - -## Usage (target) - -```bash -siteglide-cli pull staging -siteglide-cli mcp -# Later: docker run … siteglide-mcp --transport http --port 5910 -``` diff --git a/lib/assets/files.js b/lib/assets/files.js index e4aff13..62fde09 100644 --- a/lib/assets/files.js +++ b/lib/assets/files.js @@ -12,7 +12,7 @@ const config = { const _paths = customConfig => [customConfig, config.CONFIG, config.LEGACY_CONFIG]; const _getAssets = async () => { - const siteRoot = dir.currentApp(); + const siteRoot = dir.getSiteRoot(); const appAssets = siteRoot && fs.existsSync(`${siteRoot}/assets`) ? await glob(`${siteRoot}/assets/**`, { onlyFiles: true, dot: true }) : []; diff --git a/lib/assets/generateManifest.js b/lib/assets/generateManifest.js index a5eb743..74e1057 100644 --- a/lib/assets/generateManifest.js +++ b/lib/assets/generateManifest.js @@ -2,12 +2,10 @@ const fs = require('fs'), files = require('../assets/files'), dir = require('../directories'); -const getAppDirectory = () => dir.currentApp() || dir.LEGACY_APP; - const serializerManifestEntry = file => { - const appDirectory = getAppDirectory(); + const siteRoot = dir.defaultSiteRoot(); const fileUpdatedAt = Math.floor(new Date(fs.statSync(file)['mtime']) / 1000); - return { physical_file_path: file.replace(new RegExp(`^${appDirectory}/`), ''), updated_at: fileUpdatedAt }; + return { physical_file_path: file.replace(new RegExp(`^${siteRoot}/`), ''), updated_at: fileUpdatedAt }; }; const manifestGenerate = async () => { @@ -16,10 +14,10 @@ const manifestGenerate = async () => { }; const manifestGenerateForAssets = (assets) => { - const appDirectory = getAppDirectory(); + const siteRoot = dir.defaultSiteRoot(); let manifest = {}; for (const file of assets) { - const path = file.replace(new RegExp(`(public|private)/assets/|(${appDirectory})/assets/`), ''); + const path = file.replace(new RegExp(`(public|private)/assets/|(${siteRoot})/assets/`), ''); manifest[path] = serializerManifestEntry(file); } diff --git a/lib/assets/packAssets.js b/lib/assets/packAssets.js index 15afdd0..c6a6b32 100644 --- a/lib/assets/packAssets.js +++ b/lib/assets/packAssets.js @@ -8,8 +8,6 @@ const archiver = require('archiver-promise'), dir = require('../directories'), { deployGlobOptions } = require('../deployGlob'); -const getAppDirectory = () => dir.currentApp() || dir.LEGACY_APP; - const addModulesToArchive = archive => { if (!fs.existsSync(dir.MODULES)) { return; @@ -43,7 +41,7 @@ const prepareDestination = (path) => { const packAssets = async path => { prepareDestination(path); - const appDirectory = getAppDirectory(); + const appDirectory = dir.defaultSiteRoot(); const assetsArchive = prepareArchive(path); archiver(path, { zlib: { level: 6 }}); diff --git a/lib/confirm.js b/lib/confirm.js index 734aa2f..efa61a4 100644 --- a/lib/confirm.js +++ b/lib/confirm.js @@ -13,5 +13,4 @@ const Confirm = (question) => { }); }); }; - module.exports = Confirm; \ No newline at end of file diff --git a/lib/deployServiceClient.js b/lib/deployServiceClient.js index 8fff23b..b56e5bd 100755 --- a/lib/deployServiceClient.js +++ b/lib/deployServiceClient.js @@ -4,15 +4,17 @@ const io = require('socket.io-client'), logger = require('../lib/logger'), uploadFile = require('./s3UploadFile'), mime = require('mime-types'), - readdirp = require('readdirp'); + readdirp = require('readdirp'), + dir = require('./directories'); const directoriesToIgnore = ['!.git', '!node_modules']; -const assetsDirectory = 'marketplace_builder/assets'; -const assetsManifestFile = 'marketplace_builder/assets.json'; +const siteRoot = () => dir.defaultSiteRoot(); +const assetsDirectory = () => `${siteRoot()}/assets`; +const assetsManifestFile = () => `${siteRoot()}/assets.json`; const uploadManifest = assetsHash => { return new Promise(function(resolve, reject) { - fs.writeFile(assetsManifestFile, JSON.stringify(assetsHash), 'utf8', err => { + fs.writeFile(assetsManifestFile(), JSON.stringify(assetsHash), 'utf8', err => { if (err) reject(err); else resolve(true); }); @@ -21,12 +23,12 @@ const uploadManifest = assetsHash => { const sendRequestsForPresignedUrls = (socket, assets, remoteAssetsDirectory) => { readdirp({ - root: assetsDirectory, + root: assetsDirectory(), directoryFilter: directoriesToIgnore }) .on('data', entry => { const fileName = `${remoteAssetsDirectory}/${entry.path}`; - const localFileName = `${assetsDirectory}/${entry.path}`; + const localFileName = `${assetsDirectory()}/${entry.path}`; assets.push({ fileName: fileName, contentLength: fs.statSync(localFileName)['size'], @@ -93,7 +95,7 @@ const presignUrlsAndUploadFiles = (instanceId) => { }); socket.on('deploy:url', data => { - const localFileName = data.fileName.replace(remoteAssetsDirectory, assetsDirectory); + const localFileName = data.fileName.replace(remoteAssetsDirectory, assetsDirectory()); uploadFile(localFileName, data.url) .then(() => { logger.Print('.'); diff --git a/lib/directories.js b/lib/directories.js index cc9d942..67a4141 100644 --- a/lib/directories.js +++ b/lib/directories.js @@ -2,8 +2,8 @@ const fs = require('fs'); const path = require('path'); const app = { + SITE_ROOT: 'marketplace_builder', APP: 'app', - LEGACY_APP: 'marketplace_builder', MODULES: 'modules', }; @@ -12,25 +12,37 @@ const internal = { }; const computed = { - ALLOWED: [app.APP, app.LEGACY_APP, app.MODULES] + ALLOWED: [app.SITE_ROOT, app.APP, app.MODULES] }; const existsInCwd = (name, cwd = process.cwd()) => fs.existsSync(path.join(cwd, name)); const methods = { toWatch: (cwd = process.cwd()) => computed.ALLOWED.filter((d) => existsInCwd(d, cwd)), - /** Prefer app/, else marketplace_builder/. Undefined if neither exists. */ - currentApp: (cwd = process.cwd()) => { + /** + * Prefer marketplace_builder/, else app/. Undefined if neither exists. + * + * @param {string} [cwd] + * @returns {string|undefined} + */ + getSiteRoot: (cwd = process.cwd()) => { + if (existsInCwd(app.SITE_ROOT, cwd)) { + return app.SITE_ROOT; + } if (existsInCwd(app.APP, cwd)) { return app.APP; } - if (existsInCwd(app.LEGACY_APP, cwd)) { - return app.LEGACY_APP; - } return undefined; }, - bothAppRootsExist: (cwd = process.cwd()) => - existsInCwd(app.APP, cwd) && existsInCwd(app.LEGACY_APP, cwd), + /** + * Resolved site root, or marketplace_builder/ when neither exists yet (e.g. first pull). + * + * @param {string} [cwd] + * @returns {string} + */ + defaultSiteRoot: (cwd = process.cwd()) => methods.getSiteRoot(cwd) || app.SITE_ROOT, + bothSiteRootsExist: (cwd = process.cwd()) => + existsInCwd(app.SITE_ROOT, cwd) && existsInCwd(app.APP, cwd), available: (cwd = process.cwd()) => computed.ALLOWED.filter((d) => existsInCwd(d, cwd)) }; diff --git a/lib/mcpAlpha.js b/lib/mcpAlpha.js index e5a8968..a777e2a 100644 --- a/lib/mcpAlpha.js +++ b/lib/mcpAlpha.js @@ -1,7 +1,8 @@ const fs = require('fs'), os = require('os'), path = require('path'), - { execFileSync } = require('child_process'), + { execFileSync, execFile } = require('child_process'), + { promisify } = require('util'), fetch = require('node-fetch'), semver = require('semver'), logger = require('./logger'), @@ -13,6 +14,11 @@ const fs = require('fs'), getRegistryTargets } = require('./ai'); +const execFileAsync = promisify(execFile); + +/** Max time to wait for require.resolve of @siteglide/siteglide-mcp after install. */ +const RESOLVE_MCP_VERSION_TIMEOUT_MS = 5000; + /** npm org scope for Siteglide packages (not the package name). */ const NPM_ORG_SCOPE = '@siteglide'; /** MCP package name within the @siteglide org. */ @@ -24,19 +30,22 @@ const DEFAULT_TAG = 'alpha'; const resolveCliRoot = () => path.resolve(__dirname, '..'); -const isCliLocalMcpDependency = (cliRoot = resolveCliRoot()) => { - try { - const cliPkg = JSON.parse(fs.readFileSync(path.join(cliRoot, 'package.json'), 'utf8')); - const dep = cliPkg.dependencies && cliPkg.dependencies[DEFAULT_PACKAGE]; - if (typeof dep !== 'string') { - return false; - } - return dep.indexOf('file:') === 0 || dep.indexOf('link:') === 0; - } catch (error) { - return false; +/** @param {string} step @param {number} startedAt @param {string} [detail] */ +const logMcpStep = (step, startedAt, detail) => { + const ms = Date.now() - startedAt; + const suffix = detail ? ` — ${detail}` : ''; + const message = `[pull][mcp] ${step} (${ms}ms)${suffix}`; + if (ms >= 30000) { + logger.Warn(`${message} — step exceeded 30s`, { exit: false }); + } else { + logger.Info(message); } }; +const logMcpStepStart = (step) => { + logger.Info(`[pull][mcp] ${step}…`); +}; + const registryPackageUrl = (registry, packageName) => { const base = registry.endsWith('/') ? registry.slice(0, -1) : registry; return `${base}/${packageName.replace('/', '%2F')}`; @@ -52,34 +61,56 @@ const resolveInstalledMcpVersion = (cliRoot = resolveCliRoot()) => { }; /** + * Same as resolveInstalledMcpVersion but in a child process so a hung + * require.resolve cannot block pull indefinitely. + * * @param {string} [cliRoot] - * @returns {{ version: string, resolved: string | null, linked: boolean } | null} + * @param {number} [timeoutMs] + * @returns {Promise<{ version: string | null, timedOut: boolean }>} */ -const resolveLocalMcpFromNpmList = (cliRoot = resolveCliRoot()) => { +const resolveInstalledMcpVersionWithTimeout = async ( + cliRoot = resolveCliRoot(), + timeoutMs = RESOLVE_MCP_VERSION_TIMEOUT_MS +) => { + const payload = JSON.stringify({ packageName: DEFAULT_PACKAGE, cliRoot }); + const script = [ + 'const fs = require("fs");', + 'const data = JSON.parse(process.argv[1]);', + 'try {', + ' const pkgPath = require.resolve(data.packageName + "/package.json", { paths: [data.cliRoot] });', + ' process.stdout.write(JSON.parse(fs.readFileSync(pkgPath, "utf8")).version || "");', + '} catch (e) {', + ' process.stdout.write("");', + '}' + ].join(''); + try { - const output = execFileSync( - process.platform === 'win32' ? 'npm.cmd' : 'npm', - ['list', DEFAULT_PACKAGE, '--json', '--depth=0'], + const { stdout } = await execFileAsync( + process.execPath, + ['-e', script, payload], { - cwd: cliRoot, + timeout: timeoutMs, encoding: 'utf8', - stdio: ['ignore', 'pipe', 'ignore'] + windowsHide: true } ); - const data = JSON.parse(output); - const dep = data.dependencies && data.dependencies[DEFAULT_PACKAGE]; - if (!dep || typeof dep.version !== 'string') { - return null; - } - const resolved = typeof dep.resolved === 'string' ? dep.resolved : null; + const version = String(stdout || '').trim(); return { - version: dep.version, - resolved, - linked: Boolean(resolved && (resolved.indexOf('file:') === 0 || resolved.indexOf('link:') === 0)) + version: version || null, + timedOut: false }; } catch (error) { - logger.Debug(`[pull] npm list ${DEFAULT_PACKAGE} failed: ${error.message}`); - return null; + if (error.killed || error.code === 'ETIMEDOUT') { + return { + version: null, + timedOut: true + }; + } + logger.Debug(`[pull] resolve installed MCP version failed: ${error.message}`); + return { + version: null, + timedOut: false + }; } }; @@ -143,6 +174,26 @@ const pickLatestPublishedVersion = (published, tag = DEFAULT_TAG) => { return stable[0] || null; }; +/** + * True when a published npm version exists and installed copy is missing or older. + * + * @param {string | null} installedVersion + * @param {string | null} latestVersion + * @returns {boolean} + */ +const needsMcpInstall = (installedVersion, latestVersion) => { + if (!latestVersion || !semver.valid(latestVersion)) { + return false; + } + if (!installedVersion) { + return true; + } + if (semver.valid(installedVersion) && semver.gt(latestVersion, installedVersion)) { + return true; + } + return false; +}; + const installMcpPackage = (version, cliRoot = resolveCliRoot()) => { const spec = `${DEFAULT_PACKAGE}@${version}`; try { @@ -218,133 +269,115 @@ const getMcpConfigStatus = (rootPath = process.cwd()) => { }; }; -const formatLocalMcpLabel = (localInstall) => { - if (!localInstall) { - return DEFAULT_PACKAGE; - } - if (localInstall.linked && localInstall.resolved) { - return `${DEFAULT_PACKAGE}@${localInstall.version} (${localInstall.resolved})`; - } - return `${DEFAULT_PACKAGE}@${localInstall.version}`; -}; - /** * MCP setup on pull: - * - Checks the public npm registry for siteglide-mcp under the @siteglide org (alpha tag) - * - Offers install/upgrade when a published version exists - * - When IDE mcp.json lacks siteglide, warns if npm is empty and offers local test registration + * - Checks npm for the published @alpha version + * - Asks before install only when that version is not already installed + * - Registers Siteglide MCP in IDE configs when the package is present * * @param {{ rootPath?: string, homedir?: string, interactive?: boolean }} [opts] */ const ensureMcpOnPull = async (opts = {}) => { + const overallStart = Date.now(); const rootPath = opts.rootPath || process.cwd(); const homedir = opts.homedir || os.homedir(); const interactive = opts.interactive !== false; const cliRoot = resolveCliRoot(); + logger.Info('[pull][mcp] starting MCP check'); + + let stepStart = Date.now(); + logMcpStepStart('resolve installed version'); let installedVersion = resolveInstalledMcpVersion(cliRoot); - const localInstall = resolveLocalMcpFromNpmList(cliRoot); + logMcpStep('resolve installed version', stepStart, installedVersion || 'not found'); + + stepStart = Date.now(); + logMcpStepStart('read IDE MCP config status'); const configStatus = getMcpConfigStatus(rootPath); + logMcpStep( + 'read IDE MCP config status', + stepStart, + configStatus.configured ? `configured (${configStatus.paths.length} file(s))` : 'not configured' + ); + + stepStart = Date.now(); + logMcpStepStart('fetch published npm versions'); const published = await fetchPublishedMcpVersions(); const latestVersion = pickLatestPublishedVersion(published, DEFAULT_TAG); + logMcpStep( + 'fetch published npm versions', + stepStart, + latestVersion ? `${DEFAULT_TAG} latest: ${latestVersion}` : 'none on npm' + ); + + if (!latestVersion) { + logger.Warn( + `[pull] ${MCP_PACKAGE_NAME} is not published on npm under ${NPM_ORG_SCOPE} yet — Siteglide MCP for IDE agents is coming soon.`, + { exit: false } + ); + logMcpStep('MCP check complete (skipped)', overallStart, 'not published'); + return { + skipped: true, + reason: 'not-published', + installedVersion, + latestVersion + }; + } - if (!installedVersion && latestVersion) { - logger.Info(`[pull] Siteglide MCP is not installed (${DEFAULT_TAG} on npm: ${latestVersion})`); + if (needsMcpInstall(installedVersion, latestVersion)) { if (interactive) { - const answer = await Confirm(`Install ${DEFAULT_PACKAGE}@${latestVersion} from npm? (y/N) `); - if (isAffirmative(answer)) { - if (installMcpPackage(latestVersion, cliRoot)) { - installedVersion = resolveInstalledMcpVersion(cliRoot); - } - } - } - } else if ( - installedVersion && - latestVersion && - semver.valid(installedVersion) && - semver.valid(latestVersion) && - semver.gt(latestVersion, installedVersion) - ) { - logger.Info(`[pull] Siteglide MCP ${installedVersion} installed; ${DEFAULT_TAG} latest on npm is ${latestVersion}`); - if (interactive) { - const answer = await Confirm(`Upgrade Siteglide MCP to ${latestVersion}? (y/N) `); + logMcpStepStart('waiting for MCP install confirmation'); + stepStart = Date.now(); + const answer = await Confirm( + `Attempt Siteglide MCP install from ${DEFAULT_PACKAGE}@${latestVersion} on npm? (y/N) ` + ); + logMcpStep('MCP install confirmation', stepStart, isAffirmative(answer) ? 'yes' : 'no'); if (isAffirmative(answer)) { + stepStart = Date.now(); + logMcpStepStart(`npm install ${DEFAULT_PACKAGE}@${latestVersion}`); if (installMcpPackage(latestVersion, cliRoot)) { installedVersion = resolveInstalledMcpVersion(cliRoot); - logger.Info(`[pull] Siteglide MCP upgraded to ${installedVersion}`); + logMcpStep('npm install', stepStart, installedVersion || 'installed'); + } else { + logMcpStep('npm install', stepStart, 'failed'); } + } else { + logger.Info('[pull] Skipping Siteglide MCP install'); } + } else { + logger.Debug('[pull] MCP install skipped (non-interactive)'); } - } else if (installedVersion) { - logger.Debug(`[pull] Siteglide MCP ${installedVersion} installed`); + } else { + logger.Debug(`[pull] Siteglide MCP ${installedVersion} is up to date (${DEFAULT_TAG} latest: ${latestVersion})`); } - installedVersion = resolveInstalledMcpVersion(cliRoot); - const hasInstalledMcp = Boolean(installedVersion); - - if (!configStatus.configured) { - if (!latestVersion && !hasInstalledMcp) { - logger.Warn( - `[pull] ${MCP_PACKAGE_NAME} is not published on npm under ${NPM_ORG_SCOPE} yet — Siteglide MCP for IDE agents is coming soon.`, - { exit: false } - ); - return { - skipped: true, - reason: 'not-published', - installedVersion, - latestVersion - }; - } - - const localTestInstall = Boolean( - hasInstalledMcp && ( - !latestVersion || - (localInstall && localInstall.linked) || - isCliLocalMcpDependency(cliRoot) - ) + stepStart = Date.now(); + logMcpStepStart('re-resolve installed version'); + const reResolved = await resolveInstalledMcpVersionWithTimeout(cliRoot); + if (reResolved.timedOut) { + logMcpStep( + 're-resolve installed version', + stepStart, + `timed out after ${RESOLVE_MCP_VERSION_TIMEOUT_MS}ms` ); - - if (hasInstalledMcp && localTestInstall) { - const label = formatLocalMcpLabel( - localInstall || { version: installedVersion, resolved: null, linked: isCliLocalMcpDependency(cliRoot) } - ); - if (interactive) { - const answer = await Confirm( - `Add local test version ${label} to your IDE MCP config (mcp.json)? (y/N) ` - ); - if (!isAffirmative(answer)) { - logger.Info('[pull] Skipping Siteglide MCP IDE registration'); - return { - skipped: true, - reason: 'user-declined-registration', - installedVersion, - latestVersion, - configStatus - }; - } - } else { - logger.Debug('[pull] Local Siteglide MCP install present; IDE registration skipped (non-interactive)'); - return { - skipped: true, - reason: 'non-interactive-registration', - installedVersion, - latestVersion, - configStatus - }; - } - } + logger.Warn( + `[pull] Siteglide MCP version check timed out after ${RESOLVE_MCP_VERSION_TIMEOUT_MS / 1000}s — skipping MCP setup`, + { exit: false } + ); + logMcpStep('MCP check complete (skipped)', overallStart, 're-resolve timed out'); + return { + skipped: true, + reason: 're-resolve-timeout', + installedVersion: null, + latestVersion + }; } + installedVersion = reResolved.version; + logMcpStep('re-resolve installed version', stepStart, installedVersion || 'not found'); - if (!hasInstalledMcp) { - if (!latestVersion) { - return { - skipped: true, - reason: 'not-published', - installedVersion, - latestVersion - }; - } + if (!installedVersion) { logger.Warn('[pull] Siteglide MCP is unavailable — IDE registration skipped', { exit: false }); + logMcpStep('MCP check complete (skipped)', overallStart, 'mcp not installed'); return { skipped: true, reason: 'mcp-not-installed', @@ -353,19 +386,40 @@ const ensureMcpOnPull = async (opts = {}) => { }; } + stepStart = Date.now(); + logMcpStepStart('register MCP in IDE configs'); const registration = ensureMcpRegistered({ rootPath, homedir }); + logMcpStep( + 'register MCP in IDE configs', + stepStart, + `added: ${registration.added.length}, updated: ${registration.updated.length}, unchanged: ${registration.unchanged.length}` + ); + + stepStart = Date.now(); + logMcpStepStart('write MCP IDE agent rules'); ensureMcpIdeRules({ rootPath }); + logMcpStep('write MCP IDE agent rules', stepStart, 'done'); + + stepStart = Date.now(); + logMcpStepStart('verify IDE MCP config status'); const afterConfig = getMcpConfigStatus(rootPath); + logMcpStep( + 'verify IDE MCP config status', + stepStart, + afterConfig.configured ? `configured (${afterConfig.paths.length} file(s))` : 'incomplete' + ); if (afterConfig.configured) { - logger.Info(`[pull] Siteglide MCP configured (${installedVersion || 'unknown'})`); + logger.Info(`[pull] Siteglide MCP configured (${installedVersion})`); } else if (afterConfig.missing.length > 0) { logger.Warn(`[pull] Siteglide MCP registration incomplete for: ${afterConfig.missing.join(', ')}`, { exit: false }); } + logMcpStep('MCP check complete', overallStart, installedVersion); + return { skipped: false, - installedVersion: installedVersion || resolveInstalledMcpVersion(cliRoot), + installedVersion, latestVersion, configStatus: afterConfig, registration @@ -378,12 +432,13 @@ module.exports = { DEFAULT_PACKAGE, DEFAULT_REGISTRY, DEFAULT_TAG, + RESOLVE_MCP_VERSION_TIMEOUT_MS, resolveInstalledMcpVersion, - resolveLocalMcpFromNpmList, + resolveInstalledMcpVersionWithTimeout, fetchPublishedMcpVersions, pickLatestPublishedVersion, getMcpConfigStatus, installMcpPackage, - isCliLocalMcpDependency, + needsMcpInstall, ensureMcpOnPull }; diff --git a/lib/migrateAppDirectory.js b/lib/migrateAppDirectory.js index 27ce4d1..5551974 100644 --- a/lib/migrateAppDirectory.js +++ b/lib/migrateAppDirectory.js @@ -5,37 +5,37 @@ const fs = require('fs-extra'), /** * Which folder pull should write site files into. - * Prefer existing on-disk root: app/ if present, else marketplace_builder/. - * Defaults to app/ only when neither exists yet. + * Prefer existing on-disk root: marketplace_builder/ if present, else app/. + * Defaults to marketplace_builder/ when neither exists yet. * * @param {string} [cwd] * @returns {Promise} */ const resolveSiteAppRoot = async (cwd = process.cwd()) => { + if (await fs.pathExists(path.join(cwd, dir.SITE_ROOT))) { + return dir.SITE_ROOT; + } if (await fs.pathExists(path.join(cwd, dir.APP))) { return dir.APP; } - if (await fs.pathExists(path.join(cwd, dir.LEGACY_APP))) { - return dir.LEGACY_APP; - } - return dir.APP; + return dir.SITE_ROOT; }; /** - * Resolve exclusive site root for sync/deploy: `app/` OR `marketplace_builder/`. + * Resolve exclusive site root for sync/deploy: `marketplace_builder/` OR `app/`. * If both exist, warns and exits — source of truth is ambiguous. * * @param {string} [cwd] * @returns {string|null} Folder name, or null if neither exists */ const assertExclusiveSiteAppRoot = (cwd = process.cwd()) => { - if (dir.bothAppRootsExist(cwd)) { + if (dir.bothSiteRootsExist(cwd)) { logger.Error( - `Both ${dir.APP}/ and ${dir.LEGACY_APP}/ exist. ` + + `Both ${dir.SITE_ROOT}/ and ${dir.APP}/ exist. ` + 'Sort out which is the source of truth (keep one, remove or rename the other) before continuing.' ); } - return dir.currentApp(cwd) || null; + return dir.getSiteRoot(cwd) || null; }; module.exports = { diff --git a/lib/migration/commands/optimize/images.js b/lib/migration/commands/optimize/images.js index 794e86c..d084383 100644 --- a/lib/migration/commands/optimize/images.js +++ b/lib/migration/commands/optimize/images.js @@ -6,12 +6,17 @@ const fs = require('fs-extra'); const logger = require('../../../logger'); const path = require('path'); const shell = require('shelljs'); +const dir = require('../../../directories'); const spinner = ora(); const compressImage = async() => { + const siteRoot = dir.defaultSiteRoot(); + const assetsDir = path.join(process.cwd(), siteRoot, 'assets'); + const compressedDir = path.join(process.cwd(), siteRoot, 'assets-compressed'); + return new Promise(async (resolve, reject) => { - const files = getAllFiles(`${process.cwd()}/marketplace_builder/assets`) + const files = getAllFiles(assetsDir) if(files.length===0) { resolve(true) @@ -27,7 +32,7 @@ const compressImage = async() => { for(var i=0;i { }); fs.unlink(path.resolve(res[0].destinationPath)); if(i+1===files.length){ - if (fs.existsSync(`./marketplace_builder/assets-compressed`)) { - shell.rm('-r',`./marketplace_builder/assets-compressed`); + if (fs.existsSync(compressedDir)) { + shell.rm('-r', compressedDir); } resolve(true); } }else{ if(i+1===files.length){ - if (fs.existsSync(`./marketplace_builder/assets-compressed`)) { - shell.rm('-r',`./marketplace_builder/assets-compressed`); + if (fs.existsSync(compressedDir)) { + shell.rm('-r', compressedDir); } resolve(true); } } }) .catch( err => { - if (fs.existsSync(`./marketplace_builder/assets-compressed`)) { - shell.rm('-r',`./marketplace_builder/assets-compressed`); + if (fs.existsSync(compressedDir)) { + shell.rm('-r', compressedDir); } resolve(false); }); diff --git a/lib/migration/commands/urls.js b/lib/migration/commands/urls.js index bf9d31d..840f029 100644 --- a/lib/migration/commands/urls.js +++ b/lib/migration/commands/urls.js @@ -2,6 +2,7 @@ require("v8").setFlagsFromString('--expose_gc'); global.gc = require("vm").runInNewContext('gc'); const glob = require('globby'); +const dir = require('../../../directories'); const getFile = require('../lib/utils/get-file'); const saveFile = require('../lib/utils/save-file'); @@ -9,8 +10,8 @@ const replaceUrls = require('../lib/replace-urls'); const fs = require('fs-extra'); const run = async(params) => { - - let files = await glob('marketplace_builder/views/pages/**/*.html'); + const siteRoot = dir.defaultSiteRoot(); + let files = await glob(`${siteRoot}/views/pages/**/*.html`); try { for(var i=0;i { }; - module.exports = { run }; diff --git a/lib/migration/lib/scraper-plugins/generate-filename.js b/lib/migration/lib/scraper-plugins/generate-filename.js index b51db0a..64639c2 100644 --- a/lib/migration/lib/scraper-plugins/generate-filename.js +++ b/lib/migration/lib/scraper-plugins/generate-filename.js @@ -4,19 +4,21 @@ const path = require('path'); const mt = require('mime-types'); const utils = require('../utils'); +const dir = require('../../../../directories'); const resourceTypes = require('website-scraper/lib/config/resource-types'); const resourceTypeExtensions = require('website-scraper/lib/config/resource-ext-by-type'); class GenerateFilename { apply(registerAction) { registerAction('generateFilename', ({ resource, responseData }) => { + const siteRoot = dir.defaultSiteRoot(); const resourceUrl = resource.getUrl(); const host = utils.getHostFromUrl(resourceUrl); let filePath = utils.getFilepathFromUrl(resourceUrl); let extension = utils.getFilenameExtension(filePath); let query = utils.getQueryFromUrl(resourceUrl); const mimeExtension = mt.extension(responseData.mimeType); - const viewsDirectory = 'marketplace_builder/views/pages'; // need to make dynamic so that it doesn't always write to root folder + const viewsDirectory = `${siteRoot}/views/pages`; if (process.env.DEBUG === 'true') { console.log('Original data', { @@ -34,7 +36,7 @@ class GenerateFilename { console.log('Final filePath (html, mime)', filePath); } } else { - filePath = `marketplace_builder/assets/${filePath}.${mimeExtension}`; + filePath = `${siteRoot}/assets/${filePath}.${mimeExtension}`; if (process.env.DEBUG === 'true') { console.log('Final filePath (non-html, mime)', filePath); } @@ -60,7 +62,7 @@ class GenerateFilename { console.log('Final filePath (html, ext orig)', filePath); } } else { - filePath = `marketplace_builder/assets/${filePath}`; + filePath = `${siteRoot}/assets/${filePath}`; if (resourceUrl.includes('?Action=thumbnail')){ if( (query.find(item => item.includes('Width=')))|| diff --git a/scripts/smoke-mcp-register.js b/scripts/smoke-mcp-register.js index f202163..aa0874d 100644 --- a/scripts/smoke-mcp-register.js +++ b/scripts/smoke-mcp-register.js @@ -13,49 +13,57 @@ const { resolveMcpScriptPath, buildMcpLaunchEntry } = require('../lib/ai'); +const { removeMcpIdeArtifacts } = require('../test/helpers/mcpIdeArtifacts'); const root = fs.mkdtempSync(path.join(os.tmpdir(), 'sg-mcp-reg-')); const fakeHome = fs.mkdtempSync(path.join(os.tmpdir(), 'sg-mcp-home-')); const cursorPath = path.join(root, '.cursor', 'mcp.json'); -assert.strictEqual(fs.existsSync(path.join(root, '.cursor', 'rules', 'setup_siteglide_mcp.mdc')), false); - -fs.mkdirSync(path.dirname(cursorPath), { recursive: true }); -fs.writeFileSync( - cursorPath, - JSON.stringify({ - mcpServers: { - other: { command: 'keep-me' }, - [SERVER_NAME]: { command: 'siteglide-cli-mcp' } - } - }, null, 2) -); - -const first = ensureMcpRegistered({ rootPath: root, homedir: fakeHome }); -assert.ok(first.updated.includes('Cursor'), 'should repair bare siteglide-cli-mcp'); -assert.ok(first.added.includes('Windsurf')); -const afterFirst = JSON.parse(fs.readFileSync(cursorPath, 'utf8')); -assert.deepStrictEqual(afterFirst.mcpServers.other, { command: 'keep-me' }); -assert.strictEqual(afterFirst.mcpServers[SERVER_NAME].command, process.execPath); -assert.deepStrictEqual(afterFirst.mcpServers[SERVER_NAME].args, [resolveMcpScriptPath()]); - -const second = ensureMcpRegistered({ rootPath: root, homedir: fakeHome }); -assert.ok(second.unchanged.includes('Cursor')); -assert.strictEqual(second.updated.includes('Cursor'), false); - -const desired = buildMcpLaunchEntry(); -assert.strictEqual(desired.command, process.execPath); -assert.ok(fs.existsSync(desired.args[0])); - -const configStatus = getMcpConfigStatus(root); -assert.ok(configStatus.configured); -assert.ok(configStatus.paths.includes(cursorPath)); - -const rules = ensureMcpIdeRules({ rootPath: root }); -assert.ok(rules.written.includes('Cursor')); -assert.ok(fs.existsSync(path.join(root, '.cursor', 'rules', 'setup_siteglide_mcp.mdc'))); - -fs.rmSync(root, { recursive: true, force: true }); -fs.rmSync(fakeHome, { recursive: true, force: true }); -console.log('mcp registration smoke ok'); -})(); +try { + assert.strictEqual(fs.existsSync(path.join(root, '.cursor', 'rules', 'setup_siteglide_mcp.mdc')), false); + + fs.mkdirSync(path.dirname(cursorPath), { recursive: true }); + fs.writeFileSync( + cursorPath, + JSON.stringify({ + mcpServers: { + other: { command: 'keep-me' }, + [SERVER_NAME]: { command: 'siteglide-cli-mcp' } + } + }, null, 2) + ); + + const first = ensureMcpRegistered({ rootPath: root, homedir: fakeHome }); + assert.ok(first.updated.includes('Cursor'), 'should repair bare siteglide-cli-mcp'); + assert.ok(first.added.includes('Windsurf')); + const afterFirst = JSON.parse(fs.readFileSync(cursorPath, 'utf8')); + assert.deepStrictEqual(afterFirst.mcpServers.other, { command: 'keep-me' }); + assert.strictEqual(afterFirst.mcpServers[SERVER_NAME].command, process.execPath); + assert.deepStrictEqual(afterFirst.mcpServers[SERVER_NAME].args, [resolveMcpScriptPath()]); + + const second = ensureMcpRegistered({ rootPath: root, homedir: fakeHome }); + assert.ok(second.unchanged.includes('Cursor')); + assert.strictEqual(second.updated.includes('Cursor'), false); + + const desired = buildMcpLaunchEntry(); + assert.strictEqual(desired.command, process.execPath); + assert.ok(fs.existsSync(desired.args[0])); + + const configStatus = getMcpConfigStatus(root); + assert.ok(configStatus.configured); + assert.ok(configStatus.paths.includes(cursorPath)); + + const rules = ensureMcpIdeRules({ rootPath: root }); + assert.ok(rules.written.includes('Cursor')); + assert.ok(fs.existsSync(path.join(root, '.cursor', 'rules', 'setup_siteglide_mcp.mdc'))); + + console.log('mcp registration smoke ok'); +} finally { + await removeMcpIdeArtifacts(root); + fs.rmSync(root, { recursive: true, force: true }); + fs.rmSync(fakeHome, { recursive: true, force: true }); +} +})().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/siteglide-cli-archive.js b/siteglide-cli-archive.js index b756d79..9e3da2a 100755 --- a/siteglide-cli-archive.js +++ b/siteglide-cli-archive.js @@ -107,7 +107,7 @@ program const siteRoot = assertExclusiveSiteAppRoot(); if (!siteRoot && !fs.existsSync(dir.MODULES)) { logger.Error( - `${dir.APP}/ or ${dir.LEGACY_APP}/ has to exist! Please make sure you have the correct folder structure.`, + `${dir.SITE_ROOT}/ or ${dir.APP}/ has to exist! Please make sure you have the correct folder structure.`, { hideTimestamp: true } ); } diff --git a/siteglide-cli-deploy.js b/siteglide-cli-deploy.js index d0ad482..fbe772c 100755 --- a/siteglide-cli-deploy.js +++ b/siteglide-cli-deploy.js @@ -66,7 +66,7 @@ const getBody = (filePath, processTemplate) => { const deploy = async (env, authData, params) => { const gateway = new Gateway(authData); - const siteRoot = dir.currentApp() || null; + const siteRoot = dir.getSiteRoot() || null; if (siteRoot) { let files = await glob(`${siteRoot}/views/pages/**/*.liquid`); diff --git a/siteglide-cli-export.js b/siteglide-cli-export.js index dcda213..5da48cf 100755 --- a/siteglide-cli-export.js +++ b/siteglide-cli-export.js @@ -60,7 +60,8 @@ program const filename = params.path; const exportInternalIds = params.exportInternalIds; const authData = fetchAuthData(environment, program, program); - const zipFileName = `${dir.LEGACY_APP}.zip`; + const siteRoot = dir.defaultSiteRoot(); + const zipFileName = `${siteRoot}.zip`; gateway = new Gateway(authData); Confirm('Are you sure you would like to export? This will overwrite your local files immediately! (Y/n)\n').then(async function (response) { @@ -69,21 +70,21 @@ program await gateway.pullZip().then(pullTask => { waitForStatus(() => gateway.pullZipStatus(pullTask.id)) .then(pullTask => downloadFile(pullTask.zip_file.url, zipFileName)) - .then(() => unzip(zipFileName, dir.LEGACY_APP)) - .then(() => shell.cp('-R', `./${dir.LEGACY_APP}/app/*`, `./${dir.LEGACY_APP}`)) + .then(() => unzip(zipFileName, siteRoot)) + .then(() => shell.cp('-R', `./${siteRoot}/app/*`, `./${siteRoot}`)) .then(() => shell.rm(`./${zipFileName}`)) .then(() => { - if (fs.existsSync(`./${dir.LEGACY_APP}/modules`)) { - shell.cp('-R', `./${dir.LEGACY_APP}/modules`, `./`) - shell.rm('-r', `./${dir.LEGACY_APP}/modules`) + if (fs.existsSync(`./${siteRoot}/modules`)) { + shell.cp('-R', `./${siteRoot}/modules`, `./`) + shell.rm('-r', `./${siteRoot}/modules`) } }) - .then(() => shell.rm(`./${dir.LEGACY_APP}/asset_manifest.json`)) - .then(() => shell.rm('-r',`./${dir.LEGACY_APP}/app`)) + .then(() => shell.rm(`./${siteRoot}/asset_manifest.json`)) + .then(() => shell.rm('-r',`./${siteRoot}/app`)) .then(() => { - var list = fs.readdirSync(`./${dir.LEGACY_APP}`).filter(folder => fs.statSync(path.join(`./${dir.LEGACY_APP}`, folder)).isDirectory()); + var list = fs.readdirSync(`./${siteRoot}`).filter(folder => fs.statSync(path.join(`./${siteRoot}`, folder)).isDirectory()); for(var i = 0; i < list.length; i++) { - var folder = path.join(`./${dir.LEGACY_APP}`, list[i]); + var folder = path.join(`./${siteRoot}`, list[i]); try { fs.rmdirSync(folder); } catch(e) { @@ -182,11 +183,11 @@ program (urlToTest.indexOf('.csv')>-1) ){ var folderPath = file.data.physical_file_path.split('/'); - folderPath = dir.LEGACY_APP+'/'+folderPath.slice(0, folderPath.length-1).join('/'); + folderPath = siteRoot+'/'+folderPath.slice(0, folderPath.length-1).join('/'); fs.mkdirSync(folderPath, { recursive: true }); await getAsset(file.data.remote_url,time).then(async response => { if(response!=='error_missing_file'){ - response.body.pipe(fs.createWriteStream(dir.LEGACY_APP+'/'+file.data.physical_file_path)); + response.body.pipe(fs.createWriteStream(siteRoot+'/'+file.data.physical_file_path)); count++; if(params.withAssets){ exportSpinner.text = `Downloaded ${count} assets out of ${assets.length}, this may take a while...`; @@ -200,12 +201,12 @@ program asset_files.forEach(file => { var folderPath = file.data.physical_file_path.split('/'); - folderPath = dir.LEGACY_APP+'/'+folderPath.slice(0, folderPath.length-1).join('/'); + folderPath = siteRoot+'/'+folderPath.slice(0, folderPath.length-1).join('/'); fs.mkdirSync(folderPath, { recursive: true }); - fs.writeFileSync(dir.LEGACY_APP+'/'+file.data.physical_file_path, file.data.body, logger.Error); + fs.writeFileSync(siteRoot+'/'+file.data.physical_file_path, file.data.body, logger.Error); }); - exportSpinner.stopAndPersist().succeed(`Files downloaded into ${dir.LEGACY_APP} folder`); + exportSpinner.stopAndPersist().succeed(`Files downloaded into ${siteRoot} folder`); }, logger.Error); await gateway.export(exportInternalIds, params.csv).then(exportTask => { diff --git a/siteglide-cli-migrate.js b/siteglide-cli-migrate.js index 6b622fe..c964262 100755 --- a/siteglide-cli-migrate.js +++ b/siteglide-cli-migrate.js @@ -152,8 +152,8 @@ program .then(() => process.exit(0)) .catch(() => process.exit(1)); } else { - await makeArchive('./.tmp/assets.zip', dir.LEGACY_APP) - .then(async () => await makeArchive('./.tmp/marketplace-release.zip', dir.LEGACY_APP)) + await makeArchive('./.tmp/assets.zip', dir.defaultSiteRoot()) + .then(async () => await makeArchive('./.tmp/marketplace-release.zip', dir.defaultSiteRoot())) } }) ); @@ -170,8 +170,8 @@ program .then(() => process.exit(0)) .catch(() => process.exit(1)); } else { - await makeArchive('./.tmp/assets.zip', dir.LEGACY_APP) - .then(async () => await makeArchive('./.tmp/marketplace-release.zip', dir.LEGACY_APP)) + await makeArchive('./.tmp/assets.zip', dir.defaultSiteRoot()) + .then(async () => await makeArchive('./.tmp/marketplace-release.zip', dir.defaultSiteRoot())) } }) ); diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index 6bc9597..9538a25 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -418,7 +418,7 @@ const moveModulesToRoot = async (fromRoot, ignoredModules = DEFAULT_PULL_IGNORED }; /** - * Download the main site backup zip and convert it into the local site root (`app/`). + * Download the main site backup zip and convert it into the local site root (`marketplace_builder/` or `app/`). * Calls Siteglide-API `/cli/backup` then `/cli/backupStatus/:id` (no module_name). * * @param {Gateway} gateway - Authenticated API client for the current environment. @@ -426,7 +426,7 @@ const moveModulesToRoot = async (fromRoot, ignoredModules = DEFAULT_PULL_IGNORED * Side effects: writes/overwrites that folder; may merge into `./modules`; * updates `pullSpinner` text; downloads then deletes a temporary zip. */ -const pullSiteZip = async (gateway, siteRoot = dir.APP, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { +const pullSiteZip = async (gateway, siteRoot = dir.SITE_ROOT, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { logger.Info(`[pull] Step: downloading main site zip → ${siteRoot}/`); const filename = `${siteRoot}.zip`; pullSpinner.text = 'Pulling site files'; @@ -563,7 +563,7 @@ const pullModulesInParallel = async (gateway, modulesToPull, concurrency, ignore * Side effects: creates dirs and writes/overwrites asset files under the site root or `./modules`; * updates `pullSpinner` text; downloads each asset from its remote_url. */ -const pullAssets = async (gateway, siteRoot = dir.APP, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { +const pullAssets = async (gateway, siteRoot = dir.SITE_ROOT, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { pullSpinner.text = 'Pulling assets'; const response = await gateway.pull(); const asset_files = []; @@ -639,7 +639,7 @@ const tidyUpAfterPull = async (ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => logger.Info('[pull] Step: tidying up local files'); pullSpinner.text = 'Tidying up...'; - const siteZips = [`./${dir.APP}.zip`, `./${dir.LEGACY_APP}.zip`]; + const siteZips = [`./${dir.SITE_ROOT}.zip`, `./${dir.APP}.zip`]; for (let i = 0; i < siteZips.length; i++) { const siteZip = siteZips[i]; if (await fs.pathExists(siteZip)) { @@ -663,7 +663,7 @@ const tidyUpAfterPull = async (ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => } // Pull must not leave modules nested under app (or leftover marketplace_builder) - const appRoots = [dir.APP, dir.LEGACY_APP]; + const appRoots = [dir.SITE_ROOT, dir.APP]; for (let i = 0; i < appRoots.length; i++) { const appRoot = appRoots[i]; const nestedModules = `./${appRoot}/modules`; diff --git a/siteglide-cli-watch.js b/siteglide-cli-watch.js index ad32fc5..5cc80be 100755 --- a/siteglide-cli-watch.js +++ b/siteglide-cli-watch.js @@ -25,8 +25,8 @@ const filename = filePath => filePath.split(path.sep).pop(); const filePathUnixified = filePath => filePath .replace(/\\/g, '/') - .replace(new RegExp(`^${dir.APP}/`), '') - .replace(new RegExp(`^${dir.LEGACY_APP}/`), ''); + .replace(new RegExp(`^${dir.SITE_ROOT}/`), '') + .replace(new RegExp(`^${dir.APP}/`), ''); let counter = 0; let siteRoot = null; @@ -193,8 +193,8 @@ const pushFile = (gateway, syncedFilePath) => { const isModule19CustomCss = (syncedFilePath) => { const normalized = syncedFilePath.replace(/\\/g, '/'); const legacyCustom = - normalized === `${dir.LEGACY_APP}/assets/css/modules/module_19/_custom-variables.scss` || - normalized === `${dir.LEGACY_APP}/assets/css/modules/module_19/_custom.scss`; + normalized === `${dir.SITE_ROOT}/assets/css/modules/module_19/_custom-variables.scss` || + normalized === `${dir.SITE_ROOT}/assets/css/modules/module_19/_custom.scss`; const appCustom = normalized === `${dir.APP}/assets/css/modules/module_19/_custom-variables.scss` || normalized === `${dir.APP}/assets/css/modules/module_19/_custom.scss`; @@ -287,7 +287,7 @@ gateway.ping().then(async () => { if (watchDirectories.length === 0) { logger.Error( - `${dir.APP}/ or ${dir.LEGACY_APP}/ has to exist! Please make sure you have the correct folder structure.` + `${dir.SITE_ROOT}/ or ${dir.APP}/ has to exist! Please make sure you have the correct folder structure.` ); } diff --git a/test/helpers/mcpIdeArtifacts.js b/test/helpers/mcpIdeArtifacts.js new file mode 100644 index 0000000..6251df8 --- /dev/null +++ b/test/helpers/mcpIdeArtifacts.js @@ -0,0 +1,38 @@ +const fs = require('fs-extra'); +const path = require('path'); + +/** Relative paths under a project root written by MCP registration / IDE rules. */ +const MCP_IDE_ARTIFACT_RELATIVE_PATHS = [ + path.join('.cursor', 'mcp.json'), + path.join('.cursor', 'rules', 'setup_siteglide_mcp.mdc'), + '.mcp.json', + path.join('.vscode', 'mcp.json'), + path.join('.claude', 'siteglide-mcp.md'), + path.join('.windsurf', 'rules', 'setup_siteglide_mcp.md'), + path.join('.github', 'siteglide-mcp.md') +]; + +/** + * @param {string} rootPath + * @returns {string[]} + */ +const mcpIdeArtifactPaths = (rootPath) => MCP_IDE_ARTIFACT_RELATIVE_PATHS.map((relPath) => { + return path.join(rootPath, relPath); +}); + +/** + * Remove MCP IDE config/rules files from a project root (e.g. after tests). + * + * @param {string} rootPath + */ +const removeMcpIdeArtifacts = async (rootPath) => { + for (let i = 0; i < MCP_IDE_ARTIFACT_RELATIVE_PATHS.length; i++) { + await fs.remove(path.join(rootPath, MCP_IDE_ARTIFACT_RELATIVE_PATHS[i])); + } +}; + +module.exports = { + MCP_IDE_ARTIFACT_RELATIVE_PATHS, + mcpIdeArtifactPaths, + removeMcpIdeArtifacts +}; diff --git a/test/lib/directories.test.js b/test/lib/directories.test.js new file mode 100644 index 0000000..c427e4e --- /dev/null +++ b/test/lib/directories.test.js @@ -0,0 +1,37 @@ +const fs = require('fs-extra'); +const os = require('os'); +const path = require('path'); +const dir = require('../../lib/directories'); + +test('getSiteRoot prefers marketplace_builder over app', async () => { + const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-site-root-')); + + try { + await fs.mkdir(path.join(rootPath, dir.SITE_ROOT)); + await fs.mkdir(path.join(rootPath, dir.APP)); + expect(dir.getSiteRoot(rootPath)).toEqual(dir.SITE_ROOT); + } finally { + await fs.remove(rootPath); + } +}); + +test('getSiteRoot uses app when marketplace_builder is missing', async () => { + const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-site-root-')); + + try { + await fs.mkdir(path.join(rootPath, dir.APP)); + expect(dir.getSiteRoot(rootPath)).toEqual(dir.APP); + } finally { + await fs.remove(rootPath); + } +}); + +test('defaultSiteRoot falls back to marketplace_builder', async () => { + const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-site-root-')); + + try { + expect(dir.defaultSiteRoot(rootPath)).toEqual(dir.SITE_ROOT); + } finally { + await fs.remove(rootPath); + } +}); diff --git a/test/lib/mcpAlpha.test.js b/test/lib/mcpAlpha.test.js index 9153ac2..64cf156 100644 --- a/test/lib/mcpAlpha.test.js +++ b/test/lib/mcpAlpha.test.js @@ -7,7 +7,9 @@ const { DEFAULT_PACKAGE, pickLatestPublishedVersion, getMcpConfigStatus, - isCliLocalMcpDependency + needsMcpInstall, + resolveInstalledMcpVersion, + resolveInstalledMcpVersionWithTimeout } = require('../../lib/mcpAlpha'); const { SERVER_NAME } = require('../../lib/ai'); @@ -58,6 +60,18 @@ test('DEFAULT_PACKAGE is scoped npm name: @siteglide org + siteglide-mcp package expect(DEFAULT_PACKAGE).toEqual('@siteglide/siteglide-mcp'); }); -test('isCliLocalMcpDependency detects file: dependency in CLI package.json', () => { - expect(isCliLocalMcpDependency()).toEqual(true); +test('needsMcpInstall when published version missing or already installed', () => { + expect(needsMcpInstall(null, null)).toEqual(false); + expect(needsMcpInstall('0.1.0-alpha.0', null)).toEqual(false); + expect(needsMcpInstall(null, '0.2.0-alpha.1')).toEqual(true); + expect(needsMcpInstall('0.1.0-alpha.0', '0.2.0-alpha.1')).toEqual(true); + expect(needsMcpInstall('0.2.0-alpha.1', '0.2.0-alpha.1')).toEqual(false); +}); + +test('resolveInstalledMcpVersionWithTimeout returns installed version', async () => { + const expectedVersion = resolveInstalledMcpVersion(); + expect(await resolveInstalledMcpVersionWithTimeout()).toEqual({ + version: expectedVersion, + timedOut: false + }); }); diff --git a/test/lib/mcpRegistration.test.js b/test/lib/mcpRegistration.test.js new file mode 100644 index 0000000..bf803c2 --- /dev/null +++ b/test/lib/mcpRegistration.test.js @@ -0,0 +1,64 @@ +const fs = require('fs-extra'); +const os = require('os'); +const path = require('path'); +const { getMcpConfigStatus } = require('../../lib/mcpAlpha'); +const { + SERVER_NAME, + ensureMcpRegistered, + ensureMcpIdeRules, + resolveMcpScriptPath, + buildMcpLaunchEntry +} = require('../../lib/ai'); +const { mcpIdeArtifactPaths, removeMcpIdeArtifacts } = require('../helpers/mcpIdeArtifacts'); + +test('ensureMcpRegistered and ensureMcpIdeRules write only under rootPath and cleanup removes artifacts', async () => { + const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-mcp-reg-')); + const fakeHome = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-mcp-home-')); + const cursorPath = path.join(rootPath, '.cursor', 'mcp.json'); + + try { + await fs.ensureDir(path.dirname(cursorPath)); + await fs.writeFile(cursorPath, JSON.stringify({ + mcpServers: { + other: { command: 'keep-me' }, + [SERVER_NAME]: { command: 'siteglide-cli-mcp' } + } + }, null, 2)); + + const first = ensureMcpRegistered({ rootPath, homedir: fakeHome }); + expect(first.updated).toContain('Cursor'); + expect(first.added).toContain('Windsurf'); + + const afterFirst = JSON.parse(await fs.readFile(cursorPath, 'utf8')); + expect(afterFirst.mcpServers.other).toEqual({ command: 'keep-me' }); + expect(afterFirst.mcpServers[SERVER_NAME].command).toEqual(process.execPath); + expect(afterFirst.mcpServers[SERVER_NAME].args).toEqual([resolveMcpScriptPath()]); + + const second = ensureMcpRegistered({ rootPath, homedir: fakeHome }); + expect(second.unchanged).toContain('Cursor'); + expect(second.updated.includes('Cursor')).toEqual(false); + + const desired = buildMcpLaunchEntry(); + expect(desired.command).toEqual(process.execPath); + expect(fs.existsSync(desired.args[0])).toEqual(true); + + expect(getMcpConfigStatus(rootPath).configured).toEqual(true); + + const rules = ensureMcpIdeRules({ rootPath }); + expect(rules.written).toEqual(['Cursor', 'Claude', 'Windsurf', 'Copilot']); + + for (let i = 0; i < mcpIdeArtifactPaths(rootPath).length; i++) { + expect(await fs.pathExists(mcpIdeArtifactPaths(rootPath)[i])).toEqual(true); + } + + await removeMcpIdeArtifacts(rootPath); + + for (let i = 0; i < mcpIdeArtifactPaths(rootPath).length; i++) { + expect(await fs.pathExists(mcpIdeArtifactPaths(rootPath)[i])).toEqual(false); + } + } finally { + await removeMcpIdeArtifacts(rootPath); + await fs.remove(rootPath); + await fs.remove(fakeHome); + } +}); From edf8f8253db4231b74f159c0366623418914b93c Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Tue, 18 Aug 2026 13:20:09 +0100 Subject: [PATCH 23/34] Re-word module skip usage. --- lib/pullIgnoredModules.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/pullIgnoredModules.js b/lib/pullIgnoredModules.js index 6e2bea6..4a20961 100644 --- a/lib/pullIgnoredModules.js +++ b/lib/pullIgnoredModules.js @@ -34,9 +34,7 @@ const DEFAULT_PULL_IGNORED_MODULES = [ const defaultPullBehaviour = () => { return { usage: [ - 'Adjust pull\'s built-in module skip list: exclude adds names, include removes them — commit to git so the team pulls the same modules.', - '', - 'module_984 distributes AI skills and is not skipped by default; when pulled, skill files merge into ./.agents unless you exclude it.', + 'By default, pull skips Siteglide modules, but not marketplace or custom modules, whose public files will be downloaded (but may not necessarily be designed to be edited). Exclude will skip additional modules. include will pull additional modules which would otherwise be skipped. We recommend committing this file to git so the team pulls the same modules. module_984 distributes AI skills and is not skipped by default; when pulled, skill files merge into ./.agents unless you exclude it.', '', 'Examples:', ' "include": ["module_357"],', From e80a3f1d6fb81c24a7529e2aa78ad03880df37ba Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Tue, 18 Aug 2026 13:31:16 +0100 Subject: [PATCH 24/34] 1st see if published MCP, then secondarily check if access to private github repo. --- lib/ask.js | 67 +++++++++++ lib/mcpAlpha.js | 68 ++++++++--- lib/mcpGithub.js | 194 ++++++++++++++++++++++++++++++ test/lib/mcpAlphaFallback.test.js | 125 +++++++++++++++++++ test/lib/mcpGithub.test.js | 52 ++++++++ 5 files changed, 489 insertions(+), 17 deletions(-) create mode 100644 lib/ask.js create mode 100644 lib/mcpGithub.js create mode 100644 test/lib/mcpAlphaFallback.test.js create mode 100644 test/lib/mcpGithub.test.js diff --git a/lib/ask.js b/lib/ask.js new file mode 100644 index 0000000..b66c356 --- /dev/null +++ b/lib/ask.js @@ -0,0 +1,67 @@ +var rl = require('readline'); + +const createInterface = () => { + return rl.createInterface({ + input: process.stdin, + output: process.stdout, + terminal: false + }); +}; + +/** + * @param {string} question + * @returns {Promise} + */ +const Ask = (question) => { + const r = createInterface(); + return new Promise((resolve) => { + r.question(question, (answer) => { + r.close(); + resolve(answer); + }); + }); +}; + +/** + * @param {string[]} branches + * @param {string} [defaultBranch] + * @returns {Promise} + */ +const chooseBranch = async (branches, defaultBranch) => { + if (!Array.isArray(branches) || branches.length === 0) { + return null; + } + + const fallback = defaultBranch && branches.indexOf(defaultBranch) !== -1 + ? defaultBranch + : branches[0]; + const defaultIndex = branches.indexOf(fallback) + 1; + + const lines = branches.map((branch, index) => { + return ` ${index + 1}) ${branch}`; + }); + + const answer = await Ask( + `Branches:\n${lines.join('\n')}\nChoose branch [${defaultIndex}]: ` + ); + const trimmed = String(answer || '').trim(); + if (!trimmed) { + return fallback; + } + + const asNumber = parseInt(trimmed, 10); + if (!isNaN(asNumber) && asNumber >= 1 && asNumber <= branches.length) { + return branches[asNumber - 1]; + } + + if (branches.indexOf(trimmed) !== -1) { + return trimmed; + } + + return fallback; +}; + +module.exports = { + Ask, + chooseBranch +}; diff --git a/lib/mcpAlpha.js b/lib/mcpAlpha.js index a777e2a..9175de8 100644 --- a/lib/mcpAlpha.js +++ b/lib/mcpAlpha.js @@ -7,6 +7,10 @@ const fs = require('fs'), semver = require('semver'), logger = require('./logger'), Confirm = require('./confirm'), + { + probeGithubMcpRepo, + attemptGithubMcpInstall + } = require('./mcpGithub'), { SERVER_NAME, ensureMcpRegistered, @@ -272,17 +276,18 @@ const getMcpConfigStatus = (rootPath = process.cwd()) => { /** * MCP setup on pull: * - Checks npm for the published @alpha version + * - Probes GitHub access to Siteglide/Siteglide-MCP as install fallback * - Asks before install only when that version is not already installed * - Registers Siteglide MCP in IDE configs when the package is present * - * @param {{ rootPath?: string, homedir?: string, interactive?: boolean }} [opts] + * @param {{ rootPath?: string, homedir?: string, interactive?: boolean, cliRoot?: string }} [opts] */ const ensureMcpOnPull = async (opts = {}) => { const overallStart = Date.now(); const rootPath = opts.rootPath || process.cwd(); const homedir = opts.homedir || os.homedir(); const interactive = opts.interactive !== false; - const cliRoot = resolveCliRoot(); + const cliRoot = opts.cliRoot || resolveCliRoot(); logger.Info('[pull][mcp] starting MCP check'); @@ -310,21 +315,16 @@ const ensureMcpOnPull = async (opts = {}) => { latestVersion ? `${DEFAULT_TAG} latest: ${latestVersion}` : 'none on npm' ); - if (!latestVersion) { - logger.Warn( - `[pull] ${MCP_PACKAGE_NAME} is not published on npm under ${NPM_ORG_SCOPE} yet — Siteglide MCP for IDE agents is coming soon.`, - { exit: false } - ); - logMcpStep('MCP check complete (skipped)', overallStart, 'not published'); - return { - skipped: true, - reason: 'not-published', - installedVersion, - latestVersion - }; - } + stepStart = Date.now(); + logMcpStepStart('probe GitHub MCP repo access'); + const githubProbe = await probeGithubMcpRepo(); + logMcpStep( + 'probe GitHub MCP repo access', + stepStart, + githubProbe.accessible ? `accessible (${githubProbe.branches.length} branch(es))` : 'not accessible' + ); - if (needsMcpInstall(installedVersion, latestVersion)) { + if (latestVersion && needsMcpInstall(installedVersion, latestVersion)) { if (interactive) { logMcpStepStart('waiting for MCP install confirmation'); stepStart = Date.now(); @@ -347,10 +347,34 @@ const ensureMcpOnPull = async (opts = {}) => { } else { logger.Debug('[pull] MCP install skipped (non-interactive)'); } - } else { + } else if (latestVersion && installedVersion) { logger.Debug(`[pull] Siteglide MCP ${installedVersion} is up to date (${DEFAULT_TAG} latest: ${latestVersion})`); } + if (!installedVersion) { + installedVersion = resolveInstalledMcpVersion(cliRoot); + } + + let silentSkipNoSource = false; + + if (!installedVersion) { + if (githubProbe.accessible) { + const githubInstall = await attemptGithubMcpInstall({ + interactive, + cliRoot, + githubProbe, + logStepStart: logMcpStepStart, + logStep: logMcpStep + }); + if (githubInstall.installed) { + installedVersion = resolveInstalledMcpVersion(cliRoot); + } + } else { + logger.Debug('[pull] Siteglide MCP GitHub repo not accessible — skipping GitHub install'); + silentSkipNoSource = !latestVersion; + } + } + stepStart = Date.now(); logMcpStepStart('re-resolve installed version'); const reResolved = await resolveInstalledMcpVersionWithTimeout(cliRoot); @@ -376,6 +400,16 @@ const ensureMcpOnPull = async (opts = {}) => { logMcpStep('re-resolve installed version', stepStart, installedVersion || 'not found'); if (!installedVersion) { + if (silentSkipNoSource) { + logger.Debug('[pull] Siteglide MCP install skipped — no npm or GitHub source available'); + logMcpStep('MCP check complete (skipped)', overallStart, 'no install source'); + return { + skipped: true, + reason: 'no-install-source', + installedVersion, + latestVersion + }; + } logger.Warn('[pull] Siteglide MCP is unavailable — IDE registration skipped', { exit: false }); logMcpStep('MCP check complete (skipped)', overallStart, 'mcp not installed'); return { diff --git a/lib/mcpGithub.js b/lib/mcpGithub.js new file mode 100644 index 0000000..498dfa9 --- /dev/null +++ b/lib/mcpGithub.js @@ -0,0 +1,194 @@ +const path = require('path'); +const { execFile, execFileSync } = require('child_process'); +const { promisify } = require('util'); +const logger = require('./logger'); +const Confirm = require('./confirm'); +const { chooseBranch } = require('./ask'); + +const execFileAsync = promisify(execFile); + +const GITHUB_MCP_REPO = 'Siteglide/Siteglide-MCP'; +const GITHUB_MCP_URL = 'https://github.com/Siteglide/Siteglide-MCP.git'; +const GITHUB_PROBE_TIMEOUT_MS = 10000; + +const isAffirmative = (answer) => /^y(es)?$/i.test(String(answer || '').trim()); + +/** + * @param {string} output + * @returns {string[]} + */ +const parseLsRemoteBranches = (output) => { + const branches = []; + const lines = String(output || '').split(/\r?\n/); + for (let i = 0; i < lines.length; i++) { + const line = lines[i].trim(); + if (!line) { + continue; + } + const match = line.match(/refs\/heads\/(.+)$/); + if (match && match[1]) { + branches.push(match[1]); + } + } + return branches.sort((a, b) => { + return a.localeCompare(b); + }); +}; + +/** + * @param {string} branch + * @returns {string} + */ +const buildGithubInstallSpec = (branch) => { + return `github:${GITHUB_MCP_REPO}#${branch}`; +}; + +/** + * @param {{ timeoutMs?: number }} [opts] + * @returns {Promise<{ accessible: boolean, branches: string[] }>} + */ +const probeGithubMcpRepo = async (opts = {}) => { + const timeoutMs = opts.timeoutMs || GITHUB_PROBE_TIMEOUT_MS; + const runExecFile = opts.execFileAsync || execFileAsync; + try { + const { stdout } = await runExecFile( + 'git', + ['ls-remote', '--heads', GITHUB_MCP_URL], + { + timeout: timeoutMs, + encoding: 'utf8', + windowsHide: true + } + ); + const branches = parseLsRemoteBranches(stdout); + if (branches.length === 0) { + logger.Debug('[pull] GitHub MCP repo probe returned no branches'); + return { + accessible: false, + branches: [] + }; + } + return { + accessible: true, + branches + }; + } catch (error) { + logger.Debug(`[pull] GitHub MCP repo probe failed: ${error.message}`); + return { + accessible: false, + branches: [] + }; + } +}; + +/** + * @param {string} branch + * @param {string} cliRoot + * @returns {boolean} + */ +const installMcpFromGithub = (branch, cliRoot) => { + const spec = buildGithubInstallSpec(branch); + try { + execFileSync( + process.platform === 'win32' ? 'npm.cmd' : 'npm', + ['install', spec, '--no-save'], + { + cwd: cliRoot, + stdio: 'inherit', + env: process.env + } + ); + return true; + } catch (error) { + logger.Warn(`[pull] MCP GitHub install failed: ${error.message}`, { exit: false }); + return false; + } +}; + +/** + * @param {{ + * interactive?: boolean, + * cliRoot?: string, + * githubProbe?: { accessible: boolean, branches: string[] }, + * logStepStart?: (step: string) => void, + * logStep?: (step: string, startedAt: number, detail?: string) => void + * }} opts + * @returns {Promise<{ attempted: boolean, installed: boolean, branch: string|null }>} + */ +const attemptGithubMcpInstall = async (opts = {}) => { + const interactive = opts.interactive !== false; + const githubProbe = opts.githubProbe || { accessible: false, branches: [] }; + const cliRoot = opts.cliRoot || path.resolve(__dirname, '..'); + const logStepStart = opts.logStepStart || (() => {}); + const logStep = opts.logStep || (() => {}); + + if (!githubProbe.accessible) { + return { + attempted: false, + installed: false, + branch: null + }; + } + + if (!interactive) { + logger.Debug('[pull] MCP GitHub install skipped (non-interactive)'); + return { + attempted: false, + installed: false, + branch: null + }; + } + + logStepStart('waiting for GitHub MCP install confirmation'); + let stepStart = Date.now(); + const answer = await Confirm( + `Attempt Siteglide MCP install from github.com/${GITHUB_MCP_REPO}? (y/N) ` + ); + logStep('GitHub install confirmation', stepStart, isAffirmative(answer) ? 'yes' : 'no'); + + if (!isAffirmative(answer)) { + logger.Info('[pull] Skipping Siteglide MCP GitHub install'); + return { + attempted: true, + installed: false, + branch: null + }; + } + + logStepStart('choose MCP branch'); + stepStart = Date.now(); + const branch = await chooseBranch(githubProbe.branches); + logStep('choose MCP branch', stepStart, branch || 'none'); + + if (!branch) { + logger.Warn('[pull] No branch selected — MCP GitHub install skipped', { exit: false }); + return { + attempted: true, + installed: false, + branch: null + }; + } + + const spec = buildGithubInstallSpec(branch); + logStepStart(`npm install ${spec}`); + stepStart = Date.now(); + const installed = installMcpFromGithub(branch, cliRoot); + logStep('npm install from GitHub', stepStart, installed ? branch : 'failed'); + + return { + attempted: true, + installed, + branch: installed ? branch : null + }; +}; + +module.exports = { + GITHUB_MCP_REPO, + GITHUB_MCP_URL, + GITHUB_PROBE_TIMEOUT_MS, + parseLsRemoteBranches, + buildGithubInstallSpec, + probeGithubMcpRepo, + installMcpFromGithub, + attemptGithubMcpInstall +}; diff --git a/test/lib/mcpAlphaFallback.test.js b/test/lib/mcpAlphaFallback.test.js new file mode 100644 index 0000000..32c43b2 --- /dev/null +++ b/test/lib/mcpAlphaFallback.test.js @@ -0,0 +1,125 @@ +const fs = require('fs-extra'); +const os = require('os'); +const path = require('path'); +const { removeMcpIdeArtifacts } = require('../helpers/mcpIdeArtifacts'); + +const mockFetch = jest.fn(); +const mockProbeGithubMcpRepo = jest.fn(); +const mockAttemptGithubMcpInstall = jest.fn(); +const mockConfirm = jest.fn(); +const mockEnsureMcpRegistered = jest.fn(); +const mockEnsureMcpIdeRules = jest.fn(); + +jest.mock('node-fetch', () => mockFetch); +jest.mock('../../lib/mcpGithub', () => ({ + probeGithubMcpRepo: (...args) => mockProbeGithubMcpRepo(...args), + attemptGithubMcpInstall: (...args) => mockAttemptGithubMcpInstall(...args) +})); +jest.mock('../../lib/confirm', () => (...args) => mockConfirm(...args)); +jest.mock('../../lib/ai', () => { + const actual = jest.requireActual('../../lib/ai'); + return { + ...actual, + ensureMcpRegistered: (...args) => mockEnsureMcpRegistered(...args), + ensureMcpIdeRules: (...args) => mockEnsureMcpIdeRules(...args) + }; +}); + +const logger = require('../../lib/logger'); +const { ensureMcpOnPull } = require('../../lib/mcpAlpha'); + +beforeEach(() => { + mockFetch.mockReset(); + mockProbeGithubMcpRepo.mockReset(); + mockAttemptGithubMcpInstall.mockReset(); + mockConfirm.mockReset(); + mockEnsureMcpRegistered.mockReset(); + mockEnsureMcpIdeRules.mockReset(); + jest.spyOn(logger, 'Warn').mockImplementation(() => {}); + jest.spyOn(logger, 'Info').mockImplementation(() => {}); + jest.spyOn(logger, 'Debug').mockImplementation(() => {}); + mockEnsureMcpRegistered.mockResolvedValue({ updated: [] }); + mockEnsureMcpIdeRules.mockResolvedValue({ updated: [] }); +}); + +afterEach(() => { + jest.restoreAllMocks(); +}); + +test('ensureMcpOnPull silently skips when npm and GitHub are unavailable', async () => { + const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-mcp-fallback-')); + const cliRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-mcp-cli-')); + + try { + mockFetch.mockResolvedValue({ + status: 404, + ok: false + }); + mockProbeGithubMcpRepo.mockResolvedValue({ + accessible: false, + branches: [] + }); + + const result = await ensureMcpOnPull({ + rootPath, + cliRoot, + interactive: true + }); + + expect(result).toEqual({ + skipped: true, + reason: 'no-install-source', + installedVersion: null, + latestVersion: null + }); + expect(logger.Warn).not.toHaveBeenCalled(); + expect(mockAttemptGithubMcpInstall).not.toHaveBeenCalled(); + } finally { + await removeMcpIdeArtifacts(rootPath); + await fs.remove(rootPath); + await fs.remove(cliRoot); + } +}); + +test('ensureMcpOnPull does not warn about npm when GitHub install is declined', async () => { + const rootPath = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-mcp-fallback-')); + const cliRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'sg-mcp-cli-')); + + try { + mockFetch.mockResolvedValue({ + status: 404, + ok: false + }); + mockProbeGithubMcpRepo.mockResolvedValue({ + accessible: true, + branches: ['main'] + }); + mockAttemptGithubMcpInstall.mockResolvedValue({ + attempted: true, + installed: false, + branch: null + }); + + const result = await ensureMcpOnPull({ + rootPath, + cliRoot, + interactive: true + }); + + expect(result).toEqual({ + skipped: true, + reason: 'mcp-not-installed', + installedVersion: null, + latestVersion: null + }); + expect(mockAttemptGithubMcpInstall).toHaveBeenCalled(); + expect(logger.Warn).not.toHaveBeenCalledWith( + expect.stringMatching(/coming soon|not published on npm/i), + expect.anything() + ); + } finally { + await removeMcpIdeArtifacts(rootPath); + await fs.remove(rootPath); + await fs.remove(cliRoot); + } +}); diff --git a/test/lib/mcpGithub.test.js b/test/lib/mcpGithub.test.js new file mode 100644 index 0000000..3c93cb7 --- /dev/null +++ b/test/lib/mcpGithub.test.js @@ -0,0 +1,52 @@ +const { + GITHUB_MCP_REPO, + parseLsRemoteBranches, + buildGithubInstallSpec, + probeGithubMcpRepo +} = require('../../lib/mcpGithub'); + +test('parseLsRemoteBranches extracts branch names from git ls-remote output', () => { + const output = [ + 'abc123\trefs/heads/main', + 'def456\trefs/heads/staging-mj', + 'ghi789\trefs/heads/feature/foo' + ].join('\n'); + + expect(parseLsRemoteBranches(output)).toEqual([ + 'feature/foo', + 'main', + 'staging-mj' + ]); +}); + +test('buildGithubInstallSpec returns npm github spec', () => { + expect(buildGithubInstallSpec('main')).toEqual(`github:${GITHUB_MCP_REPO}#main`); +}); + +test('probeGithubMcpRepo returns branches when git ls-remote succeeds', async () => { + const result = await probeGithubMcpRepo({ + timeoutMs: 1000, + execFileAsync: async () => { + return { + stdout: 'abc123\trefs/heads/main\ndef456\trefs/heads/dev\n' + }; + } + }); + expect(result).toEqual({ + accessible: true, + branches: ['dev', 'main'] + }); +}); + +test('probeGithubMcpRepo returns not accessible when git ls-remote fails', async () => { + const result = await probeGithubMcpRepo({ + timeoutMs: 1000, + execFileAsync: async () => { + throw new Error('authentication failed'); + } + }); + expect(result).toEqual({ + accessible: false, + branches: [] + }); +}); From c97762b27c507c782df3725012b6904bae380a30 Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Tue, 18 Aug 2026 14:32:42 +0100 Subject: [PATCH 25/34] Testing the dependencies between CLI and MCP. CLI should be independant, but should upgrade when MCP available. Should priortise install from npm, but will use github as backup if Siteglide (for pre-alpha testing - temporary really). --- lib/mcpGithub.js | 6 +++++- package.json | 2 +- siteglide-cli-mcp.js | 3 ++- siteglide-cli-pull.js | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/mcpGithub.js b/lib/mcpGithub.js index 498dfa9..10df3b3 100644 --- a/lib/mcpGithub.js +++ b/lib/mcpGithub.js @@ -57,7 +57,11 @@ const probeGithubMcpRepo = async (opts = {}) => { { timeout: timeoutMs, encoding: 'utf8', - windowsHide: true + windowsHide: true, + env: { + ...process.env, + GIT_TERMINAL_PROMPT: '0' + } } ); const branches = parseLsRemoteBranches(stdout); diff --git a/package.json b/package.json index f88749f..37311ba 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "A CLI for Making Website Management a Breeze", "scripts": { "postinstall": "node ./scripts/check-node-version.js", + "install:mcp": "npm install file:../Siteglide-MCP --no-save", "build-assets": "npx webpack-cli gui/editor/src/index.js -o gui/editor/public/app.js --mode=production", "build-gui": "npm --prefix gui/next ci && npm --prefix gui/next run build", "i": "npm install -g ." @@ -23,7 +24,6 @@ "dependencies": { "@platformos/platformos-check-node": "^0.0.20", "@platformos/platformos-common": "^0.0.18", - "@siteglide/siteglide-mcp": "file:../Siteglide-MCP", "archiver": "^5.3.0", "archiver-promise": "^1.0.0", "async": "^3.2.3", diff --git a/siteglide-cli-mcp.js b/siteglide-cli-mcp.js index 3d104fb..0fbd271 100644 --- a/siteglide-cli-mcp.js +++ b/siteglide-cli-mcp.js @@ -25,7 +25,8 @@ function resolveMcpBin() { console.error( '[siteglide-cli-mcp] @siteglide/siteglide-mcp is not installed.\n' + - 'From the workspace: npm install in Siteglide-MCP, and link it from siteglide-cli.' + 'Run siteglide-cli pull to install MCP from npm or GitHub when available,\n' + + 'or from the siteglide-cli repo: npm run install:mcp' ); process.exit(1); } diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index 9538a25..9736f79 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -774,7 +774,7 @@ program // After module zips (and assets that may land under modules/) are on disk await mergeModuleAgentsToRoot(modulesToPull); - pullSpinner.text = 'Checking Siteglide MCP'; + pullSpinner.stop(); await ensureMcpOnPull(); await tidyUpAfterPull(ignoredModules); From 6de7c67d3f12b71a3f025bed710daf902f8bfa6e Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Tue, 18 Aug 2026 14:34:19 +0100 Subject: [PATCH 26/34] In logs only, use "Siteglide AI skills" as an alias for "module_984" Co-authored-by: Cursor --- lib/pullIgnoredModules.js | 34 +++++++++++++++++++++++ siteglide-cli-pull.js | 42 +++++++++++++++-------------- test/lib/pullIgnoredModules.test.js | 10 ++++++- 3 files changed, 65 insertions(+), 21 deletions(-) diff --git a/lib/pullIgnoredModules.js b/lib/pullIgnoredModules.js index 4a20961..1e52091 100644 --- a/lib/pullIgnoredModules.js +++ b/lib/pullIgnoredModules.js @@ -208,6 +208,37 @@ const normalizeModuleName = (moduleName) => { return moduleName.trim(); }; +/** Display names for module machine names in log output only (API paths stay unchanged). */ +const MODULE_LOG_ALIASES = { + module_984: 'Siteglide AI skills' +}; + +/** + * @param {string} moduleName + * @returns {string} + */ +const formatModuleNameForLog = (moduleName) => { + const normalized = normalizeModuleName(moduleName); + if (!normalized) { + return moduleName; + } + if (MODULE_LOG_ALIASES[normalized]) { + return MODULE_LOG_ALIASES[normalized]; + } + return normalized; +}; + +/** + * @param {string[]} moduleNames + * @returns {string[]} + */ +const formatModuleListForLog = (moduleNames) => { + if (!Array.isArray(moduleNames)) { + return []; + } + return moduleNames.map(formatModuleNameForLog); +}; + /** * @param {string} moduleName * @param {string[]} [ignoredModules] @@ -293,6 +324,7 @@ const selectModulesToPull = (installedModules, moduleFilter, ignoredModules = DE module.exports = { DEFAULT_PULL_IGNORED_MODULES, + MODULE_LOG_ALIASES, PULL_MODULES_CONFIG_RELATIVE_PATH, defaultPullBehaviour, defaultPullModulesConfigDocument, @@ -305,6 +337,8 @@ module.exports = { preparePullModulesConfig, loadEffectivePullIgnoredModules, normalizeModuleName, + formatModuleNameForLog, + formatModuleListForLog, isPullIgnoredModule, filterPullIgnoredModules, partitionPullIgnoredModules, diff --git a/siteglide-cli-pull.js b/siteglide-cli-pull.js index 9736f79..cbe9219 100755 --- a/siteglide-cli-pull.js +++ b/siteglide-cli-pull.js @@ -25,7 +25,9 @@ const program = require('commander'), preparePullModulesConfig, partitionPullIgnoredModules, resolvePullIgnoredModules, - selectModulesToPull + selectModulesToPull, + formatModuleNameForLog, + formatModuleListForLog } = require('./lib/pullIgnoredModules'); const pullSpinner = ora({ text: 'Pulling files', stream: process.stdout }); @@ -115,14 +117,14 @@ const copyAgentsTree = async (srcDir, destDir, moduleName) => { const destPath = path.join(destDir, name); const stats = await fs.stat(srcPath); if (stats.isDirectory()) { - logger.Debug(`[pull] .agents: merging directory "${name}/" from module "${moduleName}"`); + logger.Debug(`[pull] .agents: merging directory "${name}/" from module "${formatModuleNameForLog(moduleName)}"`); fileCount += await copyAgentsTree(srcPath, destPath, moduleName); } else { await makeWritable(destPath); await fs.copy(srcPath, destPath, { overwrite: true }); await makeReadOnly(destPath); const displayPath = destPath.replace(/\\/g, '/').replace(/^\.\//, ''); - logger.Debug(`[pull] .agents: wrote ./${displayPath} (from module "${moduleName}")`); + logger.Debug(`[pull] .agents: wrote ./${displayPath} (from module "${formatModuleNameForLog(moduleName)}")`); fileCount++; } } @@ -158,22 +160,22 @@ const mergeModuleAgentsToRoot = async (moduleNames) => { logger.Debug(`[pull] Checking for ${agentsSrcDisplay}`); if (!(await fs.pathExists(agentsSrc))) { - logger.Debug(`[pull] Module "${moduleName}" — no ${AGENTS_ROOT} directory found`); + logger.Debug(`[pull] Module "${formatModuleNameForLog(moduleName)}" — no ${AGENTS_ROOT} directory found`); continue; } const srcStat = await fs.stat(agentsSrc); if (!srcStat.isDirectory()) { - logger.Debug(`[pull] Module "${moduleName}" — ${AGENTS_ROOT} exists but is not a directory; skip`); + logger.Debug(`[pull] Module "${formatModuleNameForLog(moduleName)}" — ${AGENTS_ROOT} exists but is not a directory; skip`); continue; } - logger.Info(`[pull] Module "${moduleName}" — found ${AGENTS_ROOT}; merging into ./${AGENTS_ROOT}`); + logger.Info(`[pull] Module "${formatModuleNameForLog(moduleName)}" — found ${AGENTS_ROOT}; merging into ./${AGENTS_ROOT}`); const count = await copyAgentsTree(agentsSrc, `./${AGENTS_ROOT}`, moduleName); result.modulesWithAgents++; result.totalFiles += count; if (count > 0) { - logger.Info(`[pull] Module "${moduleName}" — merged ${count} file(s) into ./${AGENTS_ROOT}`); + logger.Info(`[pull] Module "${formatModuleNameForLog(moduleName)}" — merged ${count} file(s) into ./${AGENTS_ROOT}`); } } @@ -409,7 +411,7 @@ const moveModulesToRoot = async (fromRoot, ignoredModules = DEFAULT_PULL_IGNORED continue; } if (isPullIgnoredModule(moduleName, ignoredModules)) { - logger.Debug(`[pull] Skipping default-ignored module "${moduleName}" from ./${fromRoot}/modules`); + logger.Debug(`[pull] Skipping default-ignored module "${formatModuleNameForLog(moduleName)}" from ./${fromRoot}/modules`); continue; } await fs.copy(srcPath, path.join(`./${dir.MODULES}`, moduleName), { overwrite: true }); @@ -458,13 +460,13 @@ const pullSiteZip = async (gateway, siteRoot = dir.SITE_ROOT, ignoredModules = D * uses then deletes a temp zip and `.tmp/pull-` work directory. */ const pullModuleZip = async (gateway, moduleName, ignoredModules = DEFAULT_PULL_IGNORED_MODULES) => { - logger.Info(`[pull] Starting module ${moduleName}`); + logger.Info(`[pull] Starting module ${formatModuleNameForLog(moduleName)}`); const filename = `${dir.MODULES}-${moduleName}.zip`; const workDir = path.join(dir.TMP, `pull-${moduleName}`); const pullTask = await gateway.pullZip({ module_name: moduleName }); - logger.Debug(`[pull] Module "${moduleName}" backup started (id: ${pullTask.id})`); + logger.Debug(`[pull] Module "${formatModuleNameForLog(moduleName)}" backup started (id: ${pullTask.id})`); const readyTask = await waitForStatus(() => gateway.pullZipStatus(pullTask.id)); - logger.Debug(`[pull] Module "${moduleName}" backup ready (status: ${readyTask.status}) — downloading zip`); + logger.Debug(`[pull] Module "${formatModuleNameForLog(moduleName)}" backup ready (status: ${readyTask.status}) — downloading zip`); await downloadFile(readyTask.zip_file.url, filename); await fs.remove(workDir); await unzip(filename, workDir); @@ -480,7 +482,7 @@ const pullModuleZip = async (gateway, moduleName, ignoredModules = DEFAULT_PULL_ // Some module zips nest files as /... instead of modules//... const directModulePath = `./${workDir}/${moduleName}`; if (await fs.pathExists(directModulePath)) { - logger.Debug(`[pull] Module "${moduleName}" zip used direct layout; copying into ./${dir.MODULES}/${moduleName}`); + logger.Debug(`[pull] Module "${formatModuleNameForLog(moduleName)}" zip used direct layout; copying into ./${dir.MODULES}/${moduleName}`); await fs.ensureDir(`./${dir.MODULES}/${moduleName}`); await fs.copy(directModulePath, `./${dir.MODULES}/${moduleName}`, { overwrite: true }); } @@ -546,7 +548,7 @@ const pullModulesInParallel = async (gateway, modulesToPull, concurrency, ignore await mapLimit(modulesToPull, limit, async (moduleName) => { await pullModuleZip(gateway, moduleName, ignoredModules); completed += 1; - logger.Info(`[pull] Module "${moduleName}" done (${completed}/${total})`); + logger.Info(`[pull] Module "${formatModuleNameForLog(moduleName)}" done (${completed}/${total})`); pullSpinner.text = `Pulling modules (${completed}/${total} done, up to ${limit} at a time)`; }); @@ -614,7 +616,7 @@ const pullAssets = async (gateway, siteRoot = dir.SITE_ROOT, ignoredModules = DE if (isModuleAsset) { const moduleName = relativePath.split('/')[0]; if (isPullIgnoredModule(moduleName, ignoredModules)) { - logger.Debug(`[pull] Skipping asset for default-ignored module "${moduleName}": ${physicalPath}`); + logger.Debug(`[pull] Skipping asset for default-ignored module "${formatModuleNameForLog(moduleName)}": ${physicalPath}`); return; } moduleAssetCount++; @@ -719,7 +721,7 @@ program pullSpinner.start(); if (moduleFilter) { - logger.Info(`[pull] Module filter (-m): "${moduleFilter}"`); + logger.Info(`[pull] Module filter (-m): "${formatModuleNameForLog(moduleFilter)}"`); } if (ignoreAssets) { logger.Info('[pull] --ignore-assets set; asset download step will be skipped'); @@ -735,7 +737,7 @@ program logger.Debug(`[pull] list_modules returned ${installedModules.length} module(s)`); if (installedModules.length > 0) { installedModules.forEach((name, i) => { - logger.Debug(`\t${i + 1}. ${name}`, { hideTimestamp: true }); + logger.Debug(`\t${i + 1}. ${formatModuleNameForLog(name)}`, { hideTimestamp: true }); }); } else { logger.Debug('[pull] Raw list_modules response keys: ' + Object.keys(modulesResponse || {}).join(', ')); @@ -746,19 +748,19 @@ program const modulesToPull = selectModulesToPull(installedModules, moduleFilter, effectiveIgnoredModules); if (moduleFilter && modulesToPull === null) { - pullSpinner.fail(`Module "${moduleFilter}" is not installed on this site`); - logger.Error(`[pull] Filter "${moduleFilter}" not found in installed modules`); + pullSpinner.fail(`Module "${formatModuleNameForLog(moduleFilter)}" is not installed on this site`); + logger.Error(`[pull] Filter "${formatModuleNameForLog(moduleFilter)}" not found in installed modules`); process.exit(1); } if (!moduleFilter && moduleSelection.ignored.length > 0) { - logger.Info(`[pull] Skipping ${moduleSelection.ignored.length} default-ignored module(s): ${moduleSelection.ignored.join(', ')}`); + logger.Info(`[pull] Skipping ${moduleSelection.ignored.length} default-ignored module(s): ${formatModuleListForLog(moduleSelection.ignored).join(', ')}`); } if (modulesToPull.length === 0) { logger.Info('[pull] No modules selected to pull'); } else { - logger.Info(`[pull] Will pull ${modulesToPull.length} module(s): ${modulesToPull.join(', ')}`); + logger.Info(`[pull] Will pull ${modulesToPull.length} module(s): ${formatModuleListForLog(modulesToPull).join(', ')}`); } await pullSiteZip(gateway, siteRoot, ignoredModules); diff --git a/test/lib/pullIgnoredModules.test.js b/test/lib/pullIgnoredModules.test.js index 03f85ce..8f6fcbd 100644 --- a/test/lib/pullIgnoredModules.test.js +++ b/test/lib/pullIgnoredModules.test.js @@ -12,7 +12,9 @@ const { filterPullIgnoredModules, partitionPullIgnoredModules, resolvePullIgnoredModules, - selectModulesToPull + selectModulesToPull, + formatModuleNameForLog, + formatModuleListForLog } = require('../../lib/pullIgnoredModules'); const installed = ['module_357', 'user', 'siteglide_system', 'studio']; @@ -163,3 +165,9 @@ test('resolvePullIgnoredModules drops the explicit -m target from the ignore lis ]); expect(resolvePullIgnoredModules(undefined)).toEqual(DEFAULT_PULL_IGNORED_MODULES); }); + +test('formatModuleNameForLog uses display alias for module_984 only in logs', () => { + expect(formatModuleNameForLog('module_984')).toEqual('Siteglide AI skills'); + expect(formatModuleNameForLog('module_357')).toEqual('module_357'); + expect(formatModuleListForLog(['module_984', 'user'])).toEqual(['Siteglide AI skills', 'user']); +}); From 857a2bb4eb8aee5e3afce0a3b93d4d83966da1c3 Mon Sep 17 00:00:00 2001 From: mattwalter91 Date: Thu, 20 Aug 2026 08:06:02 +0100 Subject: [PATCH 27/34] m4a support --- lib/watch-files-extensions.js | 1 + siteglide-cli-export.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/watch-files-extensions.js b/lib/watch-files-extensions.js index eac9aff..00fc637 100755 --- a/lib/watch-files-extensions.js +++ b/lib/watch-files-extensions.js @@ -18,6 +18,7 @@ module.exports = [ 'key', 'less', 'liquid', + 'm4a', 'map', 'md', 'mov', diff --git a/siteglide-cli-export.js b/siteglide-cli-export.js index 5da48cf..e8eb49e 100755 --- a/siteglide-cli-export.js +++ b/siteglide-cli-export.js @@ -112,7 +112,7 @@ program } var assets = response.asset; if(!params.withAssets){ - assets = assets.filter(file => (file.data.physical_file_path.indexOf('assets/images/')===-1||file.data.physical_file_path.indexOf('assets/documents/')===-1)).filter(file => !file.data.physical_file_path.match(/.(jpg|jpeg|png|gif|heic|svg|pdf|mp3|mp4|mov|ogg|otf|ttf|webm|webp|woff|woff2|ico|ppt|pptx|doc|docx|xls|xlsx|pages|numbers|key|zip|csv)$/i)); + assets = assets.filter(file => (file.data.physical_file_path.indexOf('assets/images/')===-1||file.data.physical_file_path.indexOf('assets/documents/')===-1)).filter(file => !file.data.physical_file_path.match(/.(jpg|jpeg|png|gif|heic|svg|pdf|m4a|mp3|mp4|mov|ogg|otf|ttf|webm|webp|woff|woff2|ico|ppt|pptx|doc|docx|xls|xlsx|pages|numbers|key|zip|csv)$/i)); } assets = assets.filter(file => !file.data.physical_file_path.includes('/.keep')).filter(file => !file.data.physical_file_path.includes('_sgthumb')); var count = 0; From 4f2e2bb8186e5dd806bdb2fa3f80872dce3719b1 Mon Sep 17 00:00:00 2001 From: mattwalter91 Date: Thu, 20 Aug 2026 08:07:09 +0100 Subject: [PATCH 28/34] generateManifest - Store file size --- lib/assets/generateManifest.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/assets/generateManifest.js b/lib/assets/generateManifest.js index 74e1057..6c2e665 100644 --- a/lib/assets/generateManifest.js +++ b/lib/assets/generateManifest.js @@ -4,8 +4,10 @@ const fs = require('fs'), const serializerManifestEntry = file => { const siteRoot = dir.defaultSiteRoot(); - const fileUpdatedAt = Math.floor(new Date(fs.statSync(file)['mtime']) / 1000); - return { physical_file_path: file.replace(new RegExp(`^${siteRoot}/`), ''), updated_at: fileUpdatedAt }; + const fileProperties = fs.statSync(file); + const fileUpdatedAt = Math.floor(new Date(fileProperties['mtime']) / 1000); + const fileSize = fileProperties['size']; + return { physical_file_path: file.replace(new RegExp(`^${siteRoot}/`), ''), updated_at: fileUpdatedAt, file_size: fileSize }; }; const manifestGenerate = async () => { From 50e1f69967d06fb47029d3cf994199ea9d7314e8 Mon Sep 17 00:00:00 2001 From: mattwalter91 Date: Thu, 20 Aug 2026 09:15:26 +0100 Subject: [PATCH 29/34] m4a support --- siteglide-cli-export.js | 1 + 1 file changed, 1 insertion(+) diff --git a/siteglide-cli-export.js b/siteglide-cli-export.js index e8eb49e..300a409 100755 --- a/siteglide-cli-export.js +++ b/siteglide-cli-export.js @@ -158,6 +158,7 @@ program (urlToTest.indexOf('.gif')>-1)|| (urlToTest.indexOf('.heic')>-1)|| (urlToTest.indexOf('.pdf')>-1)|| + (urlToTest.indexOf('.m4a')>-1)|| (urlToTest.indexOf('.mp3')>-1)|| (urlToTest.indexOf('.mp4')>-1)|| (urlToTest.indexOf('.mov')>-1)|| From fbb73cdbe20acc071a5ad89ab833efc554458c7f Mon Sep 17 00:00:00 2001 From: mattwalter91 Date: Thu, 20 Aug 2026 10:33:39 +0100 Subject: [PATCH 30/34] Readme - Fix doc links --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4a2f038..c104dad 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ Siteglide CLI is a tool that enables you to work on your project from your local editor and has similar behaviours to that of using FTP, in that you can sync up and pull down changes from your website. You will be required to use some terminal commands to use this feature. -For features and setup instructions, see our help documentation [here](https://developers.siteglide.com/introducing-siteglide-cli) +For features and setup instructions, see our help documentation [here](https://docs.siteglide.com/articles/1541403-introduction-to-the-command-line-interface-cli) -Our changelog can be found [here](https://developers.siteglide.com/cli-changelog) +Our changelog can be found [here](https://docs.siteglide.com/articles/4471977-cli-changelog) [![NPM version](https://img.shields.io/npm/v/@siteglide/siteglide-cli)](https://npmjs.org/package/@siteglide/siteglide-cli) [![NPM downloads](https://img.shields.io/npm/dt/@siteglide/siteglide-cli)](https://npmjs.org/package/@siteglide/siteglide-cli) From d9e0bece4ae61457680b46b6b98b9ceae1eca177 Mon Sep 17 00:00:00 2001 From: mattwalter91 Date: Thu, 20 Aug 2026 10:33:56 +0100 Subject: [PATCH 31/34] GUI - Update wording in GUI link logs --- siteglide-cli-server.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/siteglide-cli-server.js b/siteglide-cli-server.js index 7c25b8f..be9558e 100755 --- a/siteglide-cli-server.js +++ b/siteglide-cli-server.js @@ -82,13 +82,14 @@ const start = (env, command) => { app.listen(port, function () { logger.Debug(`Server is listening on ${port}`); logger.Success(`Connected to ${env.SITEGLIDE_URL}`); - if (command === 'gui') { - logger.Success(`Admin: http://localhost:${port}`); + if(command === 'gui'){ + logger.Success('---'); + logger.Success(`All GUI Tools: http://localhost:${port}`); logger.Success('---'); logger.Success(`Instance Logs: http://localhost:${port}/logs`); logger.Success(`GraphiQL Editor: http://localhost:${port}/gui/graphql`); logger.Success(`Liquid Evaluator: http://localhost:${port}/gui/liquid`); - } else { + }else{ logger.Success(`GraphiQL Editor: http://localhost:${port}/gui/graphql`); logger.Warn('The graphql command is now deprecated and will be removed in a future update. Please switch to the new gui command to use the GraphiQL Editor and Liquid Evaluator.'); } From 9c952849fe3abc7f6c15dc5acf72563cd4d3f0bc Mon Sep 17 00:00:00 2001 From: MattJonesSiteglide Date: Thu, 20 Aug 2026 10:50:14 +0100 Subject: [PATCH 32/34] Add semver dependency --- package-lock.json | 100 +++++++++++++++++----------------------------- package.json | 1 + 2 files changed, 38 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index b0280f9..39b0d98 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,6 +43,7 @@ "ora": "^5.4.1", "request": "^2.88.2", "request-promise": "^4.2.6", + "semver": "^7.8.5", "shelljs": "^0.8.5", "terser": "^5.12.1", "update-notifier": "^5.1.0", @@ -61,7 +62,9 @@ "siteglide-cli-gui": "siteglide-cli-gui.js", "siteglide-cli-import": "siteglide-cli-import.js", "siteglide-cli-init": "siteglide-cli-init.js", + "siteglide-cli-list": "siteglide-cli-list.js", "siteglide-cli-logs": "siteglide-cli-logs.js", + "siteglide-cli-mcp": "siteglide-cli-mcp.js", "siteglide-cli-migrate": "siteglide-cli-migrate.js", "siteglide-cli-modules": "siteglide-cli-modules.js", "siteglide-cli-pull": "siteglide-cli-pull.js", @@ -4680,6 +4683,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -4977,31 +4989,6 @@ "which": "^2.0.2" } }, - "node_modules/node-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-notifier/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-notifier/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -5011,11 +4998,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/node-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/node-releases": { "version": "2.0.53", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", @@ -5531,6 +5513,15 @@ "node": ">=4" } }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/package-json/node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -6306,11 +6297,15 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/semver-diff": { @@ -6324,6 +6319,15 @@ "node": ">=8" } }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/semver-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", @@ -7088,36 +7092,6 @@ "node": ">=4" } }, - "node_modules/update-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/package.json b/package.json index 37311ba..ec784de 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "ora": "^5.4.1", "request": "^2.88.2", "request-promise": "^4.2.6", + "semver": "^7.8.5", "shelljs": "^0.8.5", "terser": "^5.12.1", "update-notifier": "^5.1.0", From 00b453a53969ef722e0c2648997d42c06bc2bb7a Mon Sep 17 00:00:00 2001 From: mattwalter91 Date: Thu, 20 Aug 2026 10:51:53 +0100 Subject: [PATCH 33/34] pull - Add more to ignored modules list --- lib/pullIgnoredModules.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/pullIgnoredModules.js b/lib/pullIgnoredModules.js index 1e52091..000c97e 100644 --- a/lib/pullIgnoredModules.js +++ b/lib/pullIgnoredModules.js @@ -25,7 +25,10 @@ const DEFAULT_PULL_IGNORED_MODULES = [ 'siteglide_events', 'siteglide_media_downloads', 'siteglide_design_system', - 'siteglide_email_marketing' + 'siteglide_email_marketing', + 'undefined', + 'captchas', //pOS captchas module + 'captchas_turnstile' //pOS captchas module ]; /** From 0cc25452dc9498f43f739482047cf5920d808e52 Mon Sep 17 00:00:00 2001 From: mattwalter91 Date: Thu, 20 Aug 2026 10:52:09 +0100 Subject: [PATCH 34/34] Jest - Add package for testing --- package.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 37311ba..11134e6 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "install:mcp": "npm install file:../Siteglide-MCP --no-save", "build-assets": "npx webpack-cli gui/editor/src/index.js -o gui/editor/public/app.js --mode=production", "build-gui": "npm --prefix gui/next ci && npm --prefix gui/next run build", - "i": "npm install -g ." + "i": "npm install -g .", + "test": "jest --silent" }, "main": "./siteglide-cli.js", "license": "MIT", @@ -63,6 +64,9 @@ "website-scraper": "^4.2.3", "website-scraper-existing-directory": "^0.1.0" }, + "devDependencies": { + "jest": "^30.4.2" + }, "bin": { "siteglide-cli": "./siteglide-cli.js", "siteglide-cli-add": "./siteglide-cli-add.js",