@rodyssey/cli 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +1776 -1742
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -2071,7 +2071,7 @@ var {
2071
2071
  // package.json
2072
2072
  var package_default = {
2073
2073
  name: "@rodyssey/cli",
2074
- version: "0.5.0",
2074
+ version: "0.6.0",
2075
2075
  description: "Scaffold new projects from airconcepts templates",
2076
2076
  repository: {
2077
2077
  type: "git",
@@ -2474,7 +2474,7 @@ Server view:`);
2474
2474
 
2475
2475
  // src/create.ts
2476
2476
  import { execSync } from "node:child_process";
2477
- import { existsSync as existsSync3, rmSync } from "node:fs";
2477
+ import { existsSync as existsSync5, rmSync, writeFileSync as writeFileSync5 } from "node:fs";
2478
2478
  import path2 from "node:path";
2479
2479
 
2480
2480
  // src/utils.ts
@@ -2548,1824 +2548,1858 @@ function loadEnv(envName, options = {}) {
2548
2548
  }
2549
2549
  }
2550
2550
 
2551
- // src/create.ts
2552
- var PLACEHOLDER = "__PROJECT_NAME__";
2553
- var PLACEHOLDER_LOWER = "__project_name__";
2554
- var REPLACEMENT_FILES = {
2555
- webapp: ["package.json", "index.html"],
2556
- "webapp-fullstack": ["package.json", "wrangler.jsonc"]
2551
+ // src/config-file.ts
2552
+ import { existsSync as existsSync4, readFileSync as readFileSync4, writeFileSync as writeFileSync4 } from "node:fs";
2553
+ import { resolve as resolve2 } from "node:path";
2554
+
2555
+ // src/update-webapp-config.ts
2556
+ import { existsSync as existsSync3, readFileSync as readFileSync3, writeFileSync as writeFileSync3 } from "node:fs";
2557
+ import { resolve } from "node:path";
2558
+ var CONFIG_URLS = {
2559
+ local: "http://localhost:5176/api/webapps/config",
2560
+ development: "https://development-cms.rodyssey.ai/api/webapps/config",
2561
+ staging: "https://staging-cms.rodyssey.ai/api/webapps/config",
2562
+ production: "https://cms.rodyssey.ai/api/webapps/config"
2557
2563
  };
2558
- function isObject2(value) {
2559
- return !!value && typeof value === "object" && !Array.isArray(value);
2560
- }
2561
- function pickString(...values) {
2562
- return values.find((value) => typeof value === "string" && value.length > 0);
2564
+ function parseJsonOption(value, optionName) {
2565
+ const maybePath = resolve(process.cwd(), value);
2566
+ const raw = existsSync3(maybePath) ? readFileSync3(maybePath, "utf-8") : value;
2567
+ try {
2568
+ const parsed = JSON.parse(raw);
2569
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
2570
+ throw new Error("value must be a JSON object");
2571
+ }
2572
+ return parsed;
2573
+ } catch (error) {
2574
+ const message = error instanceof Error ? error.message : String(error);
2575
+ throw new Error(`Invalid ${optionName}: ${message}`);
2576
+ }
2563
2577
  }
2564
- function nestedObject(value, key) {
2565
- if (!isObject2(value))
2578
+ function coerceMaybeNull(value) {
2579
+ if (value === undefined)
2566
2580
  return;
2567
- const nested = value[key];
2568
- return isObject2(nested) ? nested : undefined;
2581
+ if (value === "null")
2582
+ return null;
2583
+ return value;
2569
2584
  }
2570
- function extractWebappId(payload) {
2571
- const webapp = nestedObject(payload, "webapp");
2572
- return pickString(webapp?.id, webapp?.webappId);
2585
+ function resolveConfigUrl(options, required = true) {
2586
+ const configUrl = options.url || process.env.WEBAPP_CONFIG_URL || CONFIG_URLS[options.env];
2587
+ if (!configUrl) {
2588
+ if (!required)
2589
+ return;
2590
+ console.error("❌ Error: no webapp config endpoint configured.");
2591
+ console.error(`\uD83D\uDCA1 Use one of these environments: ${Object.keys(CONFIG_URLS).join(", ")}, pass --url, or set WEBAPP_CONFIG_URL in your .env file.`);
2592
+ process.exit(1);
2593
+ }
2594
+ const url = new URL(configUrl);
2595
+ if (!options.host && !options.port) {
2596
+ return url.toString().replace(/\/$/, "");
2597
+ }
2598
+ if (options.host)
2599
+ url.hostname = options.host;
2600
+ if (options.port)
2601
+ url.port = String(options.port);
2602
+ return url.toString().replace(/\/$/, "");
2573
2603
  }
2574
- function extractDeployToken(payload) {
2575
- const webapp = nestedObject(payload, "webapp");
2576
- return pickString(webapp?.deployToken, webapp?.deploymentToken);
2604
+ function buildDetailsPayload(options) {
2605
+ const payload = options.details ? parseJsonOption(options.details, "--details") : {};
2606
+ const title = coerceMaybeNull(options.title);
2607
+ const description = coerceMaybeNull(options.description);
2608
+ const coverImg = coerceMaybeNull(options.coverImg);
2609
+ if (title !== undefined)
2610
+ payload.title = title;
2611
+ if (description !== undefined)
2612
+ payload.description = description;
2613
+ if (coverImg !== undefined)
2614
+ payload.coverImg = coverImg;
2615
+ if (options.localization !== undefined) {
2616
+ payload.localization = options.localization === "null" ? null : parseJsonOption(options.localization, "--localization");
2617
+ }
2618
+ return payload;
2577
2619
  }
2578
- function writeProjectEnv(projectDir, provisioned) {
2579
- upsertEnvFile(path2.join(projectDir, ".env"), {
2580
- WEBAPP_ID: provisioned.webappId,
2581
- DEPLOY_TOKEN: provisioned.deployToken
2582
- });
2620
+ function resolveWebappId(webappId) {
2621
+ const resolved = webappId || process.env.WEBAPP_ID;
2622
+ if (!resolved) {
2623
+ console.error("❌ Error: WEBAPP_ID is not set. Pass --webapp-id or set it in your .env file.");
2624
+ process.exit(1);
2625
+ }
2626
+ return resolved;
2583
2627
  }
2584
- async function provisionWebapp(projectName, options) {
2585
- const cmsUrl = resolveCmsUrl(options.env, options.cmsUrl);
2586
- const token = resolveSessionToken(options.env);
2587
- const createUrl = options.createUrl || `${cmsUrl}/api/cli/webapps/create`;
2588
- const createResponse = await fetch(createUrl, {
2589
- method: "POST",
2628
+ function ensureDeployToken(env) {
2629
+ if (process.env.DEPLOY_TOKEN)
2630
+ return;
2631
+ console.error("❌ Error: DEPLOY_TOKEN is not set in environment variables.");
2632
+ console.info(`\uD83D\uDCA1 Please check your .env or .env.${env} file.`);
2633
+ process.exit(1);
2634
+ }
2635
+ function getConfigUrl(options, required = true) {
2636
+ return resolveConfigUrl(options, required);
2637
+ }
2638
+ async function patchWebappConfig(options) {
2639
+ loadEnv(options.env);
2640
+ const webappId = resolveWebappId(options.webappId);
2641
+ const CONFIG_URL = getConfigUrl(options, false);
2642
+ if (!CONFIG_URL) {
2643
+ throw new Error("No webapp config endpoint configured.");
2644
+ }
2645
+ ensureDeployToken(options.env);
2646
+ const response = await fetch(CONFIG_URL, {
2647
+ method: "PATCH",
2590
2648
  headers: {
2591
- Accept: "application/json",
2592
- Authorization: `Bearer ${token}`,
2649
+ Authorization: `Bearer ${process.env.DEPLOY_TOKEN}`,
2593
2650
  "Content-Type": "application/json"
2594
2651
  },
2595
- body: JSON.stringify({ title: projectName })
2652
+ body: JSON.stringify({ webappId, details: options.details })
2596
2653
  });
2597
- const createPayload = await readResponsePayload(createResponse);
2598
- if (!createResponse.ok) {
2599
- throw new Error(`CMS webapp creation failed: ${createResponse.status} ${createResponse.statusText}
2600
- ${JSON.stringify(createPayload, null, 2)}`);
2654
+ if (!response.ok) {
2655
+ const errorText = await response.text();
2656
+ throw new Error(`Config update failed: ${response.status} ${response.statusText}
2657
+ ${errorText}`);
2601
2658
  }
2602
- const webappId = extractWebappId(createPayload);
2603
- if (!webappId) {
2604
- throw new Error(`CMS create response did not include webapp.id:
2605
- ${JSON.stringify(createPayload, null, 2)}`);
2659
+ return await response.json().catch(() => {
2660
+ return;
2661
+ });
2662
+ }
2663
+ async function fetchWebappConfig(options) {
2664
+ loadEnv(options.env);
2665
+ const webappId = resolveWebappId(options.webappId);
2666
+ const CONFIG_URL = getConfigUrl(options, false);
2667
+ if (!CONFIG_URL) {
2668
+ throw new Error("No webapp config endpoint configured.");
2606
2669
  }
2607
- const deployToken = extractDeployToken(createPayload);
2608
- if (!deployToken) {
2609
- throw new Error(`CMS create response did not include webapp.deployToken:
2610
- ${JSON.stringify(createPayload, null, 2)}`);
2670
+ ensureDeployToken(options.env);
2671
+ const url = new URL(CONFIG_URL);
2672
+ url.searchParams.set("webappId", webappId);
2673
+ const response = await fetch(url, {
2674
+ method: "GET",
2675
+ headers: {
2676
+ Authorization: `Bearer ${process.env.DEPLOY_TOKEN}`,
2677
+ Accept: "application/json"
2678
+ }
2679
+ });
2680
+ if (!response.ok) {
2681
+ const errorText = await response.text();
2682
+ throw new Error(`Config fetch failed: ${response.status} ${response.statusText}
2683
+ ${errorText}`);
2611
2684
  }
2612
- return {
2613
- webappId,
2614
- deployToken
2615
- };
2685
+ return await response.json();
2616
2686
  }
2617
- async function create(projectName, repoUrl, templateName, autoCreate) {
2618
- const targetDir = path2.resolve(process.cwd(), projectName);
2619
- if (existsSync3(targetDir)) {
2620
- console.error(`
2621
- Directory "${projectName}" already exists.
2687
+ async function getWebappConfig(options) {
2688
+ loadEnv(options.env);
2689
+ const webappId = resolveWebappId(options.webappId);
2690
+ const CONFIG_URL = getConfigUrl(options);
2691
+ if (!CONFIG_URL)
2692
+ return;
2693
+ const url = new URL(CONFIG_URL);
2694
+ url.searchParams.set("webappId", webappId);
2695
+ console.log(`⚙️ Pulling webapp config for [${options.env}] environment...`);
2696
+ console.log(`\uD83D\uDCCD Config URL: ${url.toString()}`);
2697
+ console.log(`\uD83D\uDCCD Webapp ID: ${webappId}
2622
2698
  `);
2699
+ const config = await fetchWebappConfig(options);
2700
+ const output = JSON.stringify(config, null, 2);
2701
+ if (options.out) {
2702
+ writeFileSync3(options.out, `${output}
2703
+ `, "utf-8");
2704
+ console.log(`✅ Webapp config written to ${options.out}`);
2705
+ return;
2706
+ }
2707
+ console.log(output);
2708
+ }
2709
+ async function updateWebappConfig(options) {
2710
+ loadEnv(options.env);
2711
+ const webappId = resolveWebappId(options.webappId);
2712
+ const details = buildDetailsPayload(options);
2713
+ if (Object.keys(details).length === 0) {
2714
+ console.error("❌ Error: no detail fields provided. Use --title, --description, --cover-img, --localization, or --details.");
2623
2715
  process.exit(1);
2624
2716
  }
2625
- if (autoCreate?.enabled) {
2626
- resolveCmsUrl(autoCreate.env, autoCreate.cmsUrl);
2627
- resolveSessionToken(autoCreate.env);
2717
+ const payload = { webappId, details };
2718
+ const CONFIG_URL = getConfigUrl(options, !options.dryRun);
2719
+ if (!options.dryRun)
2720
+ ensureDeployToken(options.env);
2721
+ console.log(`⚙️ Updating webapp config for [${options.env}] environment...`);
2722
+ if (CONFIG_URL) {
2723
+ console.log(`\uD83D\uDCCD Config URL: ${CONFIG_URL}`);
2628
2724
  }
2629
- console.log(`
2630
- ⏳ Cloning template "${templateName}"...
2631
- `);
2632
- try {
2633
- execSync(`git clone --depth 1 ${repoUrl} ${projectName}`, {
2634
- stdio: "inherit",
2635
- cwd: process.cwd()
2636
- });
2637
- } catch {
2638
- console.error(`
2639
- ✖ Failed to clone template. Make sure you have SSH access to the repo.
2725
+ console.log(`\uD83D\uDCCD Webapp ID: ${webappId}
2640
2726
  `);
2641
- process.exit(1);
2642
- }
2643
- const gitDir = path2.join(targetDir, ".git");
2644
- if (existsSync3(gitDir)) {
2645
- rmSync(gitDir, { recursive: true, force: true });
2727
+ if (options.dryRun) {
2728
+ console.log("\uD83E\uDDEA Dry run payload:");
2729
+ console.log(JSON.stringify(payload, null, 2));
2730
+ return;
2646
2731
  }
2647
- const filesToReplace = REPLACEMENT_FILES[templateName] ?? [];
2648
- if (filesToReplace.length > 0) {
2649
- console.log(` \uD83D\uDCDD Replacing project name...`);
2650
- replaceInFiles(targetDir, filesToReplace, PLACEHOLDER, projectName);
2651
- replaceInFiles(targetDir, filesToReplace, PLACEHOLDER_LOWER, projectName.toLowerCase());
2732
+ if (!CONFIG_URL)
2733
+ return;
2734
+ const result = await patchWebappConfig({
2735
+ env: options.env,
2736
+ details,
2737
+ webappId,
2738
+ url: options.url,
2739
+ host: options.host,
2740
+ port: options.port
2741
+ });
2742
+ console.log("✅ Webapp config updated");
2743
+ if (result !== undefined) {
2744
+ console.log(`
2745
+ \uD83D\uDCCB Update result:`, result);
2652
2746
  }
2653
- execSync("git init", { stdio: "ignore", cwd: targetDir });
2654
- if (autoCreate?.enabled) {
2655
- console.log(` \uD83C\uDF10 Creating CMS webapp in [${autoCreate.env}]...`);
2656
- const provisioned = await provisionWebapp(projectName, autoCreate);
2657
- writeProjectEnv(targetDir, provisioned);
2658
- console.log(` \uD83D\uDD10 Wrote WEBAPP_ID and DEPLOY_TOKEN to .env`);
2659
- console.log(` \uD83D\uDCCD Webapp ID: ${provisioned.webappId}`);
2747
+ }
2748
+
2749
+ // src/cli-ui.ts
2750
+ function isPlainObject(value) {
2751
+ return !!value && typeof value === "object" && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
2752
+ }
2753
+ function compact(value) {
2754
+ return JSON.stringify(value);
2755
+ }
2756
+ function pretty(value) {
2757
+ return JSON.stringify(value, null, 2);
2758
+ }
2759
+ function useColor() {
2760
+ return !!process.stdout.isTTY && !process.env.NO_COLOR;
2761
+ }
2762
+ function paint(code, text) {
2763
+ return useColor() ? `\x1B[${code}m${text}\x1B[0m` : text;
2764
+ }
2765
+ var green = (s) => paint("32", s);
2766
+ var red = (s) => paint("31", s);
2767
+ var yellow = (s) => paint("33", s);
2768
+ var dim = (s) => paint("2", s);
2769
+ var strike = (s) => paint("9", s);
2770
+ async function prompt(question) {
2771
+ const readline = await import("node:readline");
2772
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
2773
+ return new Promise((resolveAnswer) => {
2774
+ rl.question(question, (answer) => {
2775
+ rl.close();
2776
+ resolveAnswer(answer);
2777
+ });
2778
+ });
2779
+ }
2780
+ function isExplicitYes(answer) {
2781
+ const trimmed = answer.trim().toLowerCase();
2782
+ return trimmed === "y" || trimmed === "yes";
2783
+ }
2784
+ function pathToDot(path2) {
2785
+ return path2.replace(/^\//, "").replaceAll("/", ".");
2786
+ }
2787
+ function deepEqual(a, b) {
2788
+ if (a === b)
2789
+ return true;
2790
+ if (typeof a !== typeof b)
2791
+ return false;
2792
+ if (a === null || b === null)
2793
+ return false;
2794
+ if (Array.isArray(a) || Array.isArray(b)) {
2795
+ if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length)
2796
+ return false;
2797
+ return a.every((v, i) => deepEqual(v, b[i]));
2660
2798
  }
2661
- console.log(`
2662
- Project "${projectName}" created successfully!
2799
+ if (typeof a === "object" && typeof b === "object") {
2800
+ const ak = Object.keys(a);
2801
+ const bk = Object.keys(b);
2802
+ if (ak.length !== bk.length)
2803
+ return false;
2804
+ return ak.every((k) => deepEqual(a[k], b[k]));
2805
+ }
2806
+ return false;
2807
+ }
2808
+ function diffJson(before, after, path2 = "") {
2809
+ if (deepEqual(before, after))
2810
+ return [];
2811
+ if (before === undefined)
2812
+ return [{ path: path2, kind: "add", after }];
2813
+ if (after === undefined)
2814
+ return [{ path: path2, kind: "remove", before }];
2815
+ if (!isPlainObject(before) || !isPlainObject(after)) {
2816
+ return [{ path: path2, kind: "change", before, after }];
2817
+ }
2818
+ const keys = new Set([...Object.keys(before), ...Object.keys(after)]);
2819
+ const out = [];
2820
+ for (const key of keys) {
2821
+ out.push(...diffJson(before[key], after[key], `${path2}/${key}`));
2822
+ }
2823
+ return out;
2824
+ }
2825
+ function deltaLine(d) {
2826
+ const path2 = pathToDot(d.path) || "(root)";
2827
+ if (d.kind === "add")
2828
+ return green(` ${path2}: ${compact(d.after)}`);
2829
+ if (d.kind === "change") {
2830
+ return yellow(` ${path2}: ${strike(compact(d.before))} → ${compact(d.after)}`);
2831
+ }
2832
+ return red(strike(` ${path2}: ${compact(d.before)}`));
2833
+ }
2834
+ function formatObjectDelta(deltas, header) {
2835
+ if (deltas.length === 0)
2836
+ return `${header}
2837
+ ${dim(" (no changes)")}`;
2838
+ const adds = deltas.filter((d) => d.kind === "add");
2839
+ const changes = deltas.filter((d) => d.kind === "change");
2840
+ const removes = deltas.filter((d) => d.kind === "remove");
2841
+ const sections = [];
2842
+ if (adds.length)
2843
+ sections.push([green("New"), ...adds.map(deltaLine)].join(`
2844
+ `));
2845
+ if (changes.length)
2846
+ sections.push([yellow("Update"), ...changes.map(deltaLine)].join(`
2847
+ `));
2848
+ if (removes.length)
2849
+ sections.push([red("Delete"), ...removes.map(deltaLine)].join(`
2850
+ `));
2851
+ return `${header}
2663
2852
 
2664
- Next steps:
2853
+ ${sections.join(`
2665
2854
 
2666
- cd ${projectName}
2667
- bun install
2668
- bun run dev
2669
- `);
2855
+ `)}`;
2670
2856
  }
2671
2857
 
2672
- // src/deploy.ts
2673
- import { execSync as execSync2 } from "node:child_process";
2674
- import { existsSync as existsSync7, readFileSync as readFileSync6, readdirSync, statSync, unlinkSync } from "node:fs";
2675
- import { join as join2 } from "node:path";
2676
-
2677
- // node_modules/mime/dist/types/other.js
2678
- var types = {
2679
- "application/prs.cww": ["cww"],
2680
- "application/prs.xsf+xml": ["xsf"],
2681
- "application/vnd.1000minds.decision-model+xml": ["1km"],
2682
- "application/vnd.3gpp.pic-bw-large": ["plb"],
2683
- "application/vnd.3gpp.pic-bw-small": ["psb"],
2684
- "application/vnd.3gpp.pic-bw-var": ["pvb"],
2685
- "application/vnd.3gpp2.tcap": ["tcap"],
2686
- "application/vnd.3m.post-it-notes": ["pwn"],
2687
- "application/vnd.accpac.simply.aso": ["aso"],
2688
- "application/vnd.accpac.simply.imp": ["imp"],
2689
- "application/vnd.acucobol": ["acu"],
2690
- "application/vnd.acucorp": ["atc", "acutc"],
2691
- "application/vnd.adobe.air-application-installer-package+zip": ["air"],
2692
- "application/vnd.adobe.formscentral.fcdt": ["fcdt"],
2693
- "application/vnd.adobe.fxp": ["fxp", "fxpl"],
2694
- "application/vnd.adobe.xdp+xml": ["xdp"],
2695
- "application/vnd.adobe.xfdf": ["*xfdf"],
2696
- "application/vnd.age": ["age"],
2697
- "application/vnd.ahead.space": ["ahead"],
2698
- "application/vnd.airzip.filesecure.azf": ["azf"],
2699
- "application/vnd.airzip.filesecure.azs": ["azs"],
2700
- "application/vnd.amazon.ebook": ["azw"],
2701
- "application/vnd.americandynamics.acc": ["acc"],
2702
- "application/vnd.amiga.ami": ["ami"],
2703
- "application/vnd.android.package-archive": ["apk"],
2704
- "application/vnd.anser-web-certificate-issue-initiation": ["cii"],
2705
- "application/vnd.anser-web-funds-transfer-initiation": ["fti"],
2706
- "application/vnd.antix.game-component": ["atx"],
2707
- "application/vnd.apple.installer+xml": ["mpkg"],
2708
- "application/vnd.apple.keynote": ["key"],
2709
- "application/vnd.apple.mpegurl": ["m3u8"],
2710
- "application/vnd.apple.numbers": ["numbers"],
2711
- "application/vnd.apple.pages": ["pages"],
2712
- "application/vnd.apple.pkpass": ["pkpass"],
2713
- "application/vnd.aristanetworks.swi": ["swi"],
2714
- "application/vnd.astraea-software.iota": ["iota"],
2715
- "application/vnd.audiograph": ["aep"],
2716
- "application/vnd.autodesk.fbx": ["fbx"],
2717
- "application/vnd.balsamiq.bmml+xml": ["bmml"],
2718
- "application/vnd.blueice.multipass": ["mpm"],
2719
- "application/vnd.bmi": ["bmi"],
2720
- "application/vnd.businessobjects": ["rep"],
2721
- "application/vnd.chemdraw+xml": ["cdxml"],
2722
- "application/vnd.chipnuts.karaoke-mmd": ["mmd"],
2723
- "application/vnd.cinderella": ["cdy"],
2724
- "application/vnd.citationstyles.style+xml": ["csl"],
2725
- "application/vnd.claymore": ["cla"],
2726
- "application/vnd.cloanto.rp9": ["rp9"],
2727
- "application/vnd.clonk.c4group": ["c4g", "c4d", "c4f", "c4p", "c4u"],
2728
- "application/vnd.cluetrust.cartomobile-config": ["c11amc"],
2729
- "application/vnd.cluetrust.cartomobile-config-pkg": ["c11amz"],
2730
- "application/vnd.commonspace": ["csp"],
2731
- "application/vnd.contact.cmsg": ["cdbcmsg"],
2732
- "application/vnd.cosmocaller": ["cmc"],
2733
- "application/vnd.crick.clicker": ["clkx"],
2734
- "application/vnd.crick.clicker.keyboard": ["clkk"],
2735
- "application/vnd.crick.clicker.palette": ["clkp"],
2736
- "application/vnd.crick.clicker.template": ["clkt"],
2737
- "application/vnd.crick.clicker.wordbank": ["clkw"],
2738
- "application/vnd.criticaltools.wbs+xml": ["wbs"],
2739
- "application/vnd.ctc-posml": ["pml"],
2740
- "application/vnd.cups-ppd": ["ppd"],
2741
- "application/vnd.curl.car": ["car"],
2742
- "application/vnd.curl.pcurl": ["pcurl"],
2743
- "application/vnd.dart": ["dart"],
2744
- "application/vnd.data-vision.rdz": ["rdz"],
2745
- "application/vnd.dbf": ["dbf"],
2746
- "application/vnd.dcmp+xml": ["dcmp"],
2747
- "application/vnd.dece.data": ["uvf", "uvvf", "uvd", "uvvd"],
2748
- "application/vnd.dece.ttml+xml": ["uvt", "uvvt"],
2749
- "application/vnd.dece.unspecified": ["uvx", "uvvx"],
2750
- "application/vnd.dece.zip": ["uvz", "uvvz"],
2751
- "application/vnd.denovo.fcselayout-link": ["fe_launch"],
2752
- "application/vnd.dna": ["dna"],
2753
- "application/vnd.dolby.mlp": ["mlp"],
2754
- "application/vnd.dpgraph": ["dpg"],
2755
- "application/vnd.dreamfactory": ["dfac"],
2756
- "application/vnd.ds-keypoint": ["kpxx"],
2757
- "application/vnd.dvb.ait": ["ait"],
2758
- "application/vnd.dvb.service": ["svc"],
2759
- "application/vnd.dynageo": ["geo"],
2760
- "application/vnd.ecowin.chart": ["mag"],
2761
- "application/vnd.enliven": ["nml"],
2762
- "application/vnd.epson.esf": ["esf"],
2763
- "application/vnd.epson.msf": ["msf"],
2764
- "application/vnd.epson.quickanime": ["qam"],
2765
- "application/vnd.epson.salt": ["slt"],
2766
- "application/vnd.epson.ssf": ["ssf"],
2767
- "application/vnd.eszigno3+xml": ["es3", "et3"],
2768
- "application/vnd.ezpix-album": ["ez2"],
2769
- "application/vnd.ezpix-package": ["ez3"],
2770
- "application/vnd.fdf": ["*fdf"],
2771
- "application/vnd.fdsn.mseed": ["mseed"],
2772
- "application/vnd.fdsn.seed": ["seed", "dataless"],
2773
- "application/vnd.flographit": ["gph"],
2774
- "application/vnd.fluxtime.clip": ["ftc"],
2775
- "application/vnd.framemaker": ["fm", "frame", "maker", "book"],
2776
- "application/vnd.frogans.fnc": ["fnc"],
2777
- "application/vnd.frogans.ltf": ["ltf"],
2778
- "application/vnd.fsc.weblaunch": ["fsc"],
2779
- "application/vnd.fujitsu.oasys": ["oas"],
2780
- "application/vnd.fujitsu.oasys2": ["oa2"],
2781
- "application/vnd.fujitsu.oasys3": ["oa3"],
2782
- "application/vnd.fujitsu.oasysgp": ["fg5"],
2783
- "application/vnd.fujitsu.oasysprs": ["bh2"],
2784
- "application/vnd.fujixerox.ddd": ["ddd"],
2785
- "application/vnd.fujixerox.docuworks": ["xdw"],
2786
- "application/vnd.fujixerox.docuworks.binder": ["xbd"],
2787
- "application/vnd.fuzzysheet": ["fzs"],
2788
- "application/vnd.genomatix.tuxedo": ["txd"],
2789
- "application/vnd.geogebra.file": ["ggb"],
2790
- "application/vnd.geogebra.slides": ["ggs"],
2791
- "application/vnd.geogebra.tool": ["ggt"],
2792
- "application/vnd.geometry-explorer": ["gex", "gre"],
2793
- "application/vnd.geonext": ["gxt"],
2794
- "application/vnd.geoplan": ["g2w"],
2795
- "application/vnd.geospace": ["g3w"],
2796
- "application/vnd.gmx": ["gmx"],
2797
- "application/vnd.google-apps.document": ["gdoc"],
2798
- "application/vnd.google-apps.drawing": ["gdraw"],
2799
- "application/vnd.google-apps.form": ["gform"],
2800
- "application/vnd.google-apps.jam": ["gjam"],
2801
- "application/vnd.google-apps.map": ["gmap"],
2802
- "application/vnd.google-apps.presentation": ["gslides"],
2803
- "application/vnd.google-apps.script": ["gscript"],
2804
- "application/vnd.google-apps.site": ["gsite"],
2805
- "application/vnd.google-apps.spreadsheet": ["gsheet"],
2806
- "application/vnd.google-earth.kml+xml": ["kml"],
2807
- "application/vnd.google-earth.kmz": ["kmz"],
2808
- "application/vnd.gov.sk.xmldatacontainer+xml": ["xdcf"],
2809
- "application/vnd.grafeq": ["gqf", "gqs"],
2810
- "application/vnd.groove-account": ["gac"],
2811
- "application/vnd.groove-help": ["ghf"],
2812
- "application/vnd.groove-identity-message": ["gim"],
2813
- "application/vnd.groove-injector": ["grv"],
2814
- "application/vnd.groove-tool-message": ["gtm"],
2815
- "application/vnd.groove-tool-template": ["tpl"],
2816
- "application/vnd.groove-vcard": ["vcg"],
2817
- "application/vnd.hal+xml": ["hal"],
2818
- "application/vnd.handheld-entertainment+xml": ["zmm"],
2819
- "application/vnd.hbci": ["hbci"],
2820
- "application/vnd.hhe.lesson-player": ["les"],
2821
- "application/vnd.hp-hpgl": ["hpgl"],
2822
- "application/vnd.hp-hpid": ["hpid"],
2823
- "application/vnd.hp-hps": ["hps"],
2824
- "application/vnd.hp-jlyt": ["jlt"],
2825
- "application/vnd.hp-pcl": ["pcl"],
2826
- "application/vnd.hp-pclxl": ["pclxl"],
2827
- "application/vnd.hydrostatix.sof-data": ["sfd-hdstx"],
2828
- "application/vnd.ibm.minipay": ["mpy"],
2829
- "application/vnd.ibm.modcap": ["afp", "listafp", "list3820"],
2830
- "application/vnd.ibm.rights-management": ["irm"],
2831
- "application/vnd.ibm.secure-container": ["sc"],
2832
- "application/vnd.iccprofile": ["icc", "icm"],
2833
- "application/vnd.igloader": ["igl"],
2834
- "application/vnd.immervision-ivp": ["ivp"],
2835
- "application/vnd.immervision-ivu": ["ivu"],
2836
- "application/vnd.insors.igm": ["igm"],
2837
- "application/vnd.intercon.formnet": ["xpw", "xpx"],
2838
- "application/vnd.intergeo": ["i2g"],
2839
- "application/vnd.intu.qbo": ["qbo"],
2840
- "application/vnd.intu.qfx": ["qfx"],
2841
- "application/vnd.ipunplugged.rcprofile": ["rcprofile"],
2842
- "application/vnd.irepository.package+xml": ["irp"],
2843
- "application/vnd.is-xpr": ["xpr"],
2844
- "application/vnd.isac.fcs": ["fcs"],
2845
- "application/vnd.jam": ["jam"],
2846
- "application/vnd.jcp.javame.midlet-rms": ["rms"],
2847
- "application/vnd.jisp": ["jisp"],
2848
- "application/vnd.joost.joda-archive": ["joda"],
2849
- "application/vnd.kahootz": ["ktz", "ktr"],
2850
- "application/vnd.kde.karbon": ["karbon"],
2851
- "application/vnd.kde.kchart": ["chrt"],
2852
- "application/vnd.kde.kformula": ["kfo"],
2853
- "application/vnd.kde.kivio": ["flw"],
2854
- "application/vnd.kde.kontour": ["kon"],
2855
- "application/vnd.kde.kpresenter": ["kpr", "kpt"],
2856
- "application/vnd.kde.kspread": ["ksp"],
2857
- "application/vnd.kde.kword": ["kwd", "kwt"],
2858
- "application/vnd.kenameaapp": ["htke"],
2859
- "application/vnd.kidspiration": ["kia"],
2860
- "application/vnd.kinar": ["kne", "knp"],
2861
- "application/vnd.koan": ["skp", "skd", "skt", "skm"],
2862
- "application/vnd.kodak-descriptor": ["sse"],
2863
- "application/vnd.las.las+xml": ["lasxml"],
2864
- "application/vnd.llamagraphics.life-balance.desktop": ["lbd"],
2865
- "application/vnd.llamagraphics.life-balance.exchange+xml": ["lbe"],
2866
- "application/vnd.lotus-1-2-3": ["123"],
2867
- "application/vnd.lotus-approach": ["apr"],
2868
- "application/vnd.lotus-freelance": ["pre"],
2869
- "application/vnd.lotus-notes": ["nsf"],
2870
- "application/vnd.lotus-organizer": ["org"],
2871
- "application/vnd.lotus-screencam": ["scm"],
2872
- "application/vnd.lotus-wordpro": ["lwp"],
2873
- "application/vnd.macports.portpkg": ["portpkg"],
2874
- "application/vnd.mapbox-vector-tile": ["mvt"],
2875
- "application/vnd.mcd": ["mcd"],
2876
- "application/vnd.medcalcdata": ["mc1"],
2877
- "application/vnd.mediastation.cdkey": ["cdkey"],
2878
- "application/vnd.mfer": ["mwf"],
2879
- "application/vnd.mfmp": ["mfm"],
2880
- "application/vnd.micrografx.flo": ["flo"],
2881
- "application/vnd.micrografx.igx": ["igx"],
2882
- "application/vnd.mif": ["mif"],
2883
- "application/vnd.mobius.daf": ["daf"],
2884
- "application/vnd.mobius.dis": ["dis"],
2885
- "application/vnd.mobius.mbk": ["mbk"],
2886
- "application/vnd.mobius.mqy": ["mqy"],
2887
- "application/vnd.mobius.msl": ["msl"],
2888
- "application/vnd.mobius.plc": ["plc"],
2889
- "application/vnd.mobius.txf": ["txf"],
2890
- "application/vnd.mophun.application": ["mpn"],
2891
- "application/vnd.mophun.certificate": ["mpc"],
2892
- "application/vnd.mozilla.xul+xml": ["xul"],
2893
- "application/vnd.ms-artgalry": ["cil"],
2894
- "application/vnd.ms-cab-compressed": ["cab"],
2895
- "application/vnd.ms-excel": ["xls", "xlm", "xla", "xlc", "xlt", "xlw"],
2896
- "application/vnd.ms-excel.addin.macroenabled.12": ["xlam"],
2897
- "application/vnd.ms-excel.sheet.binary.macroenabled.12": ["xlsb"],
2898
- "application/vnd.ms-excel.sheet.macroenabled.12": ["xlsm"],
2899
- "application/vnd.ms-excel.template.macroenabled.12": ["xltm"],
2900
- "application/vnd.ms-fontobject": ["eot"],
2901
- "application/vnd.ms-htmlhelp": ["chm"],
2902
- "application/vnd.ms-ims": ["ims"],
2903
- "application/vnd.ms-lrm": ["lrm"],
2904
- "application/vnd.ms-officetheme": ["thmx"],
2905
- "application/vnd.ms-outlook": ["msg"],
2906
- "application/vnd.ms-pki.seccat": ["cat"],
2907
- "application/vnd.ms-pki.stl": ["*stl"],
2908
- "application/vnd.ms-powerpoint": ["ppt", "pps", "pot"],
2909
- "application/vnd.ms-powerpoint.addin.macroenabled.12": ["ppam"],
2910
- "application/vnd.ms-powerpoint.presentation.macroenabled.12": ["pptm"],
2911
- "application/vnd.ms-powerpoint.slide.macroenabled.12": ["sldm"],
2912
- "application/vnd.ms-powerpoint.slideshow.macroenabled.12": ["ppsm"],
2913
- "application/vnd.ms-powerpoint.template.macroenabled.12": ["potm"],
2914
- "application/vnd.ms-project": ["*mpp", "mpt"],
2915
- "application/vnd.ms-visio.viewer": ["vdx"],
2916
- "application/vnd.ms-word.document.macroenabled.12": ["docm"],
2917
- "application/vnd.ms-word.template.macroenabled.12": ["dotm"],
2918
- "application/vnd.ms-works": ["wps", "wks", "wcm", "wdb"],
2919
- "application/vnd.ms-wpl": ["wpl"],
2920
- "application/vnd.ms-xpsdocument": ["xps"],
2921
- "application/vnd.mseq": ["mseq"],
2922
- "application/vnd.musician": ["mus"],
2923
- "application/vnd.muvee.style": ["msty"],
2924
- "application/vnd.mynfc": ["taglet"],
2925
- "application/vnd.nato.bindingdataobject+xml": ["bdo"],
2926
- "application/vnd.neurolanguage.nlu": ["nlu"],
2927
- "application/vnd.nitf": ["ntf", "nitf"],
2928
- "application/vnd.noblenet-directory": ["nnd"],
2929
- "application/vnd.noblenet-sealer": ["nns"],
2930
- "application/vnd.noblenet-web": ["nnw"],
2931
- "application/vnd.nokia.n-gage.ac+xml": ["*ac"],
2932
- "application/vnd.nokia.n-gage.data": ["ngdat"],
2933
- "application/vnd.nokia.n-gage.symbian.install": ["n-gage"],
2934
- "application/vnd.nokia.radio-preset": ["rpst"],
2935
- "application/vnd.nokia.radio-presets": ["rpss"],
2936
- "application/vnd.novadigm.edm": ["edm"],
2937
- "application/vnd.novadigm.edx": ["edx"],
2938
- "application/vnd.novadigm.ext": ["ext"],
2939
- "application/vnd.oasis.opendocument.chart": ["odc"],
2940
- "application/vnd.oasis.opendocument.chart-template": ["otc"],
2941
- "application/vnd.oasis.opendocument.database": ["odb"],
2942
- "application/vnd.oasis.opendocument.formula": ["odf"],
2943
- "application/vnd.oasis.opendocument.formula-template": ["odft"],
2944
- "application/vnd.oasis.opendocument.graphics": ["odg"],
2945
- "application/vnd.oasis.opendocument.graphics-template": ["otg"],
2946
- "application/vnd.oasis.opendocument.image": ["odi"],
2947
- "application/vnd.oasis.opendocument.image-template": ["oti"],
2948
- "application/vnd.oasis.opendocument.presentation": ["odp"],
2949
- "application/vnd.oasis.opendocument.presentation-template": ["otp"],
2950
- "application/vnd.oasis.opendocument.spreadsheet": ["ods"],
2951
- "application/vnd.oasis.opendocument.spreadsheet-template": ["ots"],
2952
- "application/vnd.oasis.opendocument.text": ["odt"],
2953
- "application/vnd.oasis.opendocument.text-master": ["odm"],
2954
- "application/vnd.oasis.opendocument.text-template": ["ott"],
2955
- "application/vnd.oasis.opendocument.text-web": ["oth"],
2956
- "application/vnd.olpc-sugar": ["xo"],
2957
- "application/vnd.oma.dd2+xml": ["dd2"],
2958
- "application/vnd.openblox.game+xml": ["obgx"],
2959
- "application/vnd.openofficeorg.extension": ["oxt"],
2960
- "application/vnd.openstreetmap.data+xml": ["osm"],
2961
- "application/vnd.openxmlformats-officedocument.presentationml.presentation": [
2962
- "pptx"
2963
- ],
2964
- "application/vnd.openxmlformats-officedocument.presentationml.slide": [
2965
- "sldx"
2966
- ],
2967
- "application/vnd.openxmlformats-officedocument.presentationml.slideshow": [
2968
- "ppsx"
2969
- ],
2970
- "application/vnd.openxmlformats-officedocument.presentationml.template": [
2971
- "potx"
2972
- ],
2973
- "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": ["xlsx"],
2974
- "application/vnd.openxmlformats-officedocument.spreadsheetml.template": [
2975
- "xltx"
2976
- ],
2977
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [
2978
- "docx"
2979
- ],
2980
- "application/vnd.openxmlformats-officedocument.wordprocessingml.template": [
2981
- "dotx"
2982
- ],
2983
- "application/vnd.osgeo.mapguide.package": ["mgp"],
2984
- "application/vnd.osgi.dp": ["dp"],
2985
- "application/vnd.osgi.subsystem": ["esa"],
2986
- "application/vnd.palm": ["pdb", "pqa", "oprc"],
2987
- "application/vnd.pawaafile": ["paw"],
2988
- "application/vnd.pg.format": ["str"],
2989
- "application/vnd.pg.osasli": ["ei6"],
2990
- "application/vnd.picsel": ["efif"],
2991
- "application/vnd.pmi.widget": ["wg"],
2992
- "application/vnd.pocketlearn": ["plf"],
2993
- "application/vnd.powerbuilder6": ["pbd"],
2994
- "application/vnd.previewsystems.box": ["box"],
2995
- "application/vnd.procrate.brushset": ["brushset"],
2996
- "application/vnd.procreate.brush": ["brush"],
2997
- "application/vnd.procreate.dream": ["drm"],
2998
- "application/vnd.proteus.magazine": ["mgz"],
2999
- "application/vnd.publishare-delta-tree": ["qps"],
3000
- "application/vnd.pvi.ptid1": ["ptid"],
3001
- "application/vnd.pwg-xhtml-print+xml": ["xhtm"],
3002
- "application/vnd.quark.quarkxpress": [
3003
- "qxd",
3004
- "qxt",
3005
- "qwd",
3006
- "qwt",
3007
- "qxl",
3008
- "qxb"
3009
- ],
3010
- "application/vnd.rar": ["rar"],
3011
- "application/vnd.realvnc.bed": ["bed"],
3012
- "application/vnd.recordare.musicxml": ["mxl"],
3013
- "application/vnd.recordare.musicxml+xml": ["musicxml"],
3014
- "application/vnd.rig.cryptonote": ["cryptonote"],
3015
- "application/vnd.rim.cod": ["cod"],
3016
- "application/vnd.rn-realmedia": ["rm"],
3017
- "application/vnd.rn-realmedia-vbr": ["rmvb"],
3018
- "application/vnd.route66.link66+xml": ["link66"],
3019
- "application/vnd.sailingtracker.track": ["st"],
3020
- "application/vnd.seemail": ["see"],
3021
- "application/vnd.sema": ["sema"],
3022
- "application/vnd.semd": ["semd"],
3023
- "application/vnd.semf": ["semf"],
3024
- "application/vnd.shana.informed.formdata": ["ifm"],
3025
- "application/vnd.shana.informed.formtemplate": ["itp"],
3026
- "application/vnd.shana.informed.interchange": ["iif"],
3027
- "application/vnd.shana.informed.package": ["ipk"],
3028
- "application/vnd.simtech-mindmapper": ["twd", "twds"],
3029
- "application/vnd.smaf": ["mmf"],
3030
- "application/vnd.smart.teacher": ["teacher"],
3031
- "application/vnd.software602.filler.form+xml": ["fo"],
3032
- "application/vnd.solent.sdkm+xml": ["sdkm", "sdkd"],
3033
- "application/vnd.spotfire.dxp": ["dxp"],
3034
- "application/vnd.spotfire.sfs": ["sfs"],
3035
- "application/vnd.stardivision.calc": ["sdc"],
3036
- "application/vnd.stardivision.draw": ["sda"],
3037
- "application/vnd.stardivision.impress": ["sdd"],
3038
- "application/vnd.stardivision.math": ["smf"],
3039
- "application/vnd.stardivision.writer": ["sdw", "vor"],
3040
- "application/vnd.stardivision.writer-global": ["sgl"],
3041
- "application/vnd.stepmania.package": ["smzip"],
3042
- "application/vnd.stepmania.stepchart": ["sm"],
3043
- "application/vnd.sun.wadl+xml": ["wadl"],
3044
- "application/vnd.sun.xml.calc": ["sxc"],
3045
- "application/vnd.sun.xml.calc.template": ["stc"],
3046
- "application/vnd.sun.xml.draw": ["sxd"],
3047
- "application/vnd.sun.xml.draw.template": ["std"],
3048
- "application/vnd.sun.xml.impress": ["sxi"],
3049
- "application/vnd.sun.xml.impress.template": ["sti"],
3050
- "application/vnd.sun.xml.math": ["sxm"],
3051
- "application/vnd.sun.xml.writer": ["sxw"],
3052
- "application/vnd.sun.xml.writer.global": ["sxg"],
3053
- "application/vnd.sun.xml.writer.template": ["stw"],
3054
- "application/vnd.sus-calendar": ["sus", "susp"],
3055
- "application/vnd.svd": ["svd"],
3056
- "application/vnd.symbian.install": ["sis", "sisx"],
3057
- "application/vnd.syncml+xml": ["xsm"],
3058
- "application/vnd.syncml.dm+wbxml": ["bdm"],
3059
- "application/vnd.syncml.dm+xml": ["xdm"],
3060
- "application/vnd.syncml.dmddf+xml": ["ddf"],
3061
- "application/vnd.tao.intent-module-archive": ["tao"],
3062
- "application/vnd.tcpdump.pcap": ["pcap", "cap", "dmp"],
3063
- "application/vnd.tmobile-livetv": ["tmo"],
3064
- "application/vnd.trid.tpt": ["tpt"],
3065
- "application/vnd.triscape.mxs": ["mxs"],
3066
- "application/vnd.trueapp": ["tra"],
3067
- "application/vnd.ufdl": ["ufd", "ufdl"],
3068
- "application/vnd.uiq.theme": ["utz"],
3069
- "application/vnd.umajin": ["umj"],
3070
- "application/vnd.unity": ["unityweb"],
3071
- "application/vnd.uoml+xml": ["uoml", "uo"],
3072
- "application/vnd.vcx": ["vcx"],
3073
- "application/vnd.visio": ["vsd", "vst", "vss", "vsw", "vsdx", "vtx"],
3074
- "application/vnd.visionary": ["vis"],
3075
- "application/vnd.vsf": ["vsf"],
3076
- "application/vnd.wap.wbxml": ["wbxml"],
3077
- "application/vnd.wap.wmlc": ["wmlc"],
3078
- "application/vnd.wap.wmlscriptc": ["wmlsc"],
3079
- "application/vnd.webturbo": ["wtb"],
3080
- "application/vnd.wolfram.player": ["nbp"],
3081
- "application/vnd.wordperfect": ["wpd"],
3082
- "application/vnd.wqd": ["wqd"],
3083
- "application/vnd.wt.stf": ["stf"],
3084
- "application/vnd.xara": ["xar"],
3085
- "application/vnd.xfdl": ["xfdl"],
3086
- "application/vnd.yamaha.hv-dic": ["hvd"],
3087
- "application/vnd.yamaha.hv-script": ["hvs"],
3088
- "application/vnd.yamaha.hv-voice": ["hvp"],
3089
- "application/vnd.yamaha.openscoreformat": ["osf"],
3090
- "application/vnd.yamaha.openscoreformat.osfpvg+xml": ["osfpvg"],
3091
- "application/vnd.yamaha.smaf-audio": ["saf"],
3092
- "application/vnd.yamaha.smaf-phrase": ["spf"],
3093
- "application/vnd.yellowriver-custom-menu": ["cmp"],
3094
- "application/vnd.zul": ["zir", "zirz"],
3095
- "application/vnd.zzazz.deck+xml": ["zaz"],
3096
- "application/x-7z-compressed": ["7z"],
3097
- "application/x-abiword": ["abw"],
3098
- "application/x-ace-compressed": ["ace"],
3099
- "application/x-apple-diskimage": ["*dmg"],
3100
- "application/x-arj": ["arj"],
3101
- "application/x-authorware-bin": ["aab", "x32", "u32", "vox"],
3102
- "application/x-authorware-map": ["aam"],
3103
- "application/x-authorware-seg": ["aas"],
3104
- "application/x-bcpio": ["bcpio"],
3105
- "application/x-bdoc": ["*bdoc"],
3106
- "application/x-bittorrent": ["torrent"],
3107
- "application/x-blender": ["blend"],
3108
- "application/x-blorb": ["blb", "blorb"],
3109
- "application/x-bzip": ["bz"],
3110
- "application/x-bzip2": ["bz2", "boz"],
3111
- "application/x-cbr": ["cbr", "cba", "cbt", "cbz", "cb7"],
3112
- "application/x-cdlink": ["vcd"],
3113
- "application/x-cfs-compressed": ["cfs"],
3114
- "application/x-chat": ["chat"],
3115
- "application/x-chess-pgn": ["pgn"],
3116
- "application/x-chrome-extension": ["crx"],
3117
- "application/x-cocoa": ["cco"],
3118
- "application/x-compressed": ["*rar"],
3119
- "application/x-conference": ["nsc"],
3120
- "application/x-cpio": ["cpio"],
3121
- "application/x-csh": ["csh"],
3122
- "application/x-debian-package": ["*deb", "udeb"],
3123
- "application/x-dgc-compressed": ["dgc"],
3124
- "application/x-director": [
3125
- "dir",
3126
- "dcr",
3127
- "dxr",
3128
- "cst",
3129
- "cct",
3130
- "cxt",
3131
- "w3d",
3132
- "fgd",
3133
- "swa"
3134
- ],
3135
- "application/x-doom": ["wad"],
3136
- "application/x-dtbncx+xml": ["ncx"],
3137
- "application/x-dtbook+xml": ["dtb"],
3138
- "application/x-dtbresource+xml": ["res"],
3139
- "application/x-dvi": ["dvi"],
3140
- "application/x-envoy": ["evy"],
3141
- "application/x-eva": ["eva"],
3142
- "application/x-font-bdf": ["bdf"],
3143
- "application/x-font-ghostscript": ["gsf"],
3144
- "application/x-font-linux-psf": ["psf"],
3145
- "application/x-font-pcf": ["pcf"],
3146
- "application/x-font-snf": ["snf"],
3147
- "application/x-font-type1": ["pfa", "pfb", "pfm", "afm"],
3148
- "application/x-freearc": ["arc"],
3149
- "application/x-futuresplash": ["spl"],
3150
- "application/x-gca-compressed": ["gca"],
3151
- "application/x-glulx": ["ulx"],
3152
- "application/x-gnumeric": ["gnumeric"],
3153
- "application/x-gramps-xml": ["gramps"],
3154
- "application/x-gtar": ["gtar"],
3155
- "application/x-hdf": ["hdf"],
3156
- "application/x-httpd-php": ["php"],
3157
- "application/x-install-instructions": ["install"],
3158
- "application/x-ipynb+json": ["ipynb"],
3159
- "application/x-iso9660-image": ["*iso"],
3160
- "application/x-iwork-keynote-sffkey": ["*key"],
3161
- "application/x-iwork-numbers-sffnumbers": ["*numbers"],
3162
- "application/x-iwork-pages-sffpages": ["*pages"],
3163
- "application/x-java-archive-diff": ["jardiff"],
3164
- "application/x-java-jnlp-file": ["jnlp"],
3165
- "application/x-keepass2": ["kdbx"],
3166
- "application/x-latex": ["latex"],
3167
- "application/x-lua-bytecode": ["luac"],
3168
- "application/x-lzh-compressed": ["lzh", "lha"],
3169
- "application/x-makeself": ["run"],
3170
- "application/x-mie": ["mie"],
3171
- "application/x-mobipocket-ebook": ["*prc", "mobi"],
3172
- "application/x-ms-application": ["application"],
3173
- "application/x-ms-shortcut": ["lnk"],
3174
- "application/x-ms-wmd": ["wmd"],
3175
- "application/x-ms-wmz": ["wmz"],
3176
- "application/x-ms-xbap": ["xbap"],
3177
- "application/x-msaccess": ["mdb"],
3178
- "application/x-msbinder": ["obd"],
3179
- "application/x-mscardfile": ["crd"],
3180
- "application/x-msclip": ["clp"],
3181
- "application/x-msdos-program": ["*exe"],
3182
- "application/x-msdownload": ["*exe", "*dll", "com", "bat", "*msi"],
3183
- "application/x-msmediaview": ["mvb", "m13", "m14"],
3184
- "application/x-msmetafile": ["*wmf", "*wmz", "*emf", "emz"],
3185
- "application/x-msmoney": ["mny"],
3186
- "application/x-mspublisher": ["pub"],
3187
- "application/x-msschedule": ["scd"],
3188
- "application/x-msterminal": ["trm"],
3189
- "application/x-mswrite": ["wri"],
3190
- "application/x-netcdf": ["nc", "cdf"],
3191
- "application/x-ns-proxy-autoconfig": ["pac"],
3192
- "application/x-nzb": ["nzb"],
3193
- "application/x-perl": ["pl", "pm"],
3194
- "application/x-pilot": ["*prc", "*pdb"],
3195
- "application/x-pkcs12": ["p12", "pfx"],
3196
- "application/x-pkcs7-certificates": ["p7b", "spc"],
3197
- "application/x-pkcs7-certreqresp": ["p7r"],
3198
- "application/x-rar-compressed": ["*rar"],
3199
- "application/x-redhat-package-manager": ["rpm"],
3200
- "application/x-research-info-systems": ["ris"],
3201
- "application/x-sea": ["sea"],
3202
- "application/x-sh": ["sh"],
3203
- "application/x-shar": ["shar"],
3204
- "application/x-shockwave-flash": ["swf"],
3205
- "application/x-silverlight-app": ["xap"],
3206
- "application/x-sql": ["*sql"],
3207
- "application/x-stuffit": ["sit"],
3208
- "application/x-stuffitx": ["sitx"],
3209
- "application/x-subrip": ["srt"],
3210
- "application/x-sv4cpio": ["sv4cpio"],
3211
- "application/x-sv4crc": ["sv4crc"],
3212
- "application/x-t3vm-image": ["t3"],
3213
- "application/x-tads": ["gam"],
3214
- "application/x-tar": ["tar"],
3215
- "application/x-tcl": ["tcl", "tk"],
3216
- "application/x-tex": ["tex"],
3217
- "application/x-tex-tfm": ["tfm"],
3218
- "application/x-texinfo": ["texinfo", "texi"],
3219
- "application/x-tgif": ["*obj"],
3220
- "application/x-ustar": ["ustar"],
3221
- "application/x-virtualbox-hdd": ["hdd"],
3222
- "application/x-virtualbox-ova": ["ova"],
3223
- "application/x-virtualbox-ovf": ["ovf"],
3224
- "application/x-virtualbox-vbox": ["vbox"],
3225
- "application/x-virtualbox-vbox-extpack": ["vbox-extpack"],
3226
- "application/x-virtualbox-vdi": ["vdi"],
3227
- "application/x-virtualbox-vhd": ["vhd"],
3228
- "application/x-virtualbox-vmdk": ["vmdk"],
3229
- "application/x-wais-source": ["src"],
3230
- "application/x-web-app-manifest+json": ["webapp"],
3231
- "application/x-x509-ca-cert": ["der", "crt", "pem"],
3232
- "application/x-xfig": ["fig"],
3233
- "application/x-xliff+xml": ["*xlf"],
3234
- "application/x-xpinstall": ["xpi"],
3235
- "application/x-xz": ["xz"],
3236
- "application/x-zip-compressed": ["*zip"],
3237
- "application/x-zmachine": ["z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"],
3238
- "audio/vnd.dece.audio": ["uva", "uvva"],
3239
- "audio/vnd.digital-winds": ["eol"],
3240
- "audio/vnd.dra": ["dra"],
3241
- "audio/vnd.dts": ["dts"],
3242
- "audio/vnd.dts.hd": ["dtshd"],
3243
- "audio/vnd.lucent.voice": ["lvp"],
3244
- "audio/vnd.ms-playready.media.pya": ["pya"],
3245
- "audio/vnd.nuera.ecelp4800": ["ecelp4800"],
3246
- "audio/vnd.nuera.ecelp7470": ["ecelp7470"],
3247
- "audio/vnd.nuera.ecelp9600": ["ecelp9600"],
3248
- "audio/vnd.rip": ["rip"],
3249
- "audio/x-aac": ["*aac"],
3250
- "audio/x-aiff": ["aif", "aiff", "aifc"],
3251
- "audio/x-caf": ["caf"],
3252
- "audio/x-flac": ["flac"],
3253
- "audio/x-m4a": ["*m4a"],
3254
- "audio/x-matroska": ["mka"],
3255
- "audio/x-mpegurl": ["m3u"],
3256
- "audio/x-ms-wax": ["wax"],
3257
- "audio/x-ms-wma": ["wma"],
3258
- "audio/x-pn-realaudio": ["ram", "ra"],
3259
- "audio/x-pn-realaudio-plugin": ["rmp"],
3260
- "audio/x-realaudio": ["*ra"],
3261
- "audio/x-wav": ["*wav"],
3262
- "chemical/x-cdx": ["cdx"],
3263
- "chemical/x-cif": ["cif"],
3264
- "chemical/x-cmdf": ["cmdf"],
3265
- "chemical/x-cml": ["cml"],
3266
- "chemical/x-csml": ["csml"],
3267
- "chemical/x-xyz": ["xyz"],
3268
- "image/prs.btif": ["btif", "btf"],
3269
- "image/prs.pti": ["pti"],
3270
- "image/vnd.adobe.photoshop": ["psd"],
3271
- "image/vnd.airzip.accelerator.azv": ["azv"],
3272
- "image/vnd.blockfact.facti": ["facti"],
3273
- "image/vnd.dece.graphic": ["uvi", "uvvi", "uvg", "uvvg"],
3274
- "image/vnd.djvu": ["djvu", "djv"],
3275
- "image/vnd.dvb.subtitle": ["*sub"],
3276
- "image/vnd.dwg": ["dwg"],
3277
- "image/vnd.dxf": ["dxf"],
3278
- "image/vnd.fastbidsheet": ["fbs"],
3279
- "image/vnd.fpx": ["fpx"],
3280
- "image/vnd.fst": ["fst"],
3281
- "image/vnd.fujixerox.edmics-mmr": ["mmr"],
3282
- "image/vnd.fujixerox.edmics-rlc": ["rlc"],
3283
- "image/vnd.microsoft.icon": ["ico"],
3284
- "image/vnd.ms-dds": ["dds"],
3285
- "image/vnd.ms-modi": ["mdi"],
3286
- "image/vnd.ms-photo": ["wdp"],
3287
- "image/vnd.net-fpx": ["npx"],
3288
- "image/vnd.pco.b16": ["b16"],
3289
- "image/vnd.tencent.tap": ["tap"],
3290
- "image/vnd.valve.source.texture": ["vtf"],
3291
- "image/vnd.wap.wbmp": ["wbmp"],
3292
- "image/vnd.xiff": ["xif"],
3293
- "image/vnd.zbrush.pcx": ["pcx"],
3294
- "image/x-3ds": ["3ds"],
3295
- "image/x-adobe-dng": ["dng"],
3296
- "image/x-cmu-raster": ["ras"],
3297
- "image/x-cmx": ["cmx"],
3298
- "image/x-freehand": ["fh", "fhc", "fh4", "fh5", "fh7"],
3299
- "image/x-icon": ["*ico"],
3300
- "image/x-jng": ["jng"],
3301
- "image/x-mrsid-image": ["sid"],
3302
- "image/x-ms-bmp": ["*bmp"],
3303
- "image/x-pcx": ["*pcx"],
3304
- "image/x-pict": ["pic", "pct"],
3305
- "image/x-portable-anymap": ["pnm"],
3306
- "image/x-portable-bitmap": ["pbm"],
3307
- "image/x-portable-graymap": ["pgm"],
3308
- "image/x-portable-pixmap": ["ppm"],
3309
- "image/x-rgb": ["rgb"],
3310
- "image/x-tga": ["tga"],
3311
- "image/x-xbitmap": ["xbm"],
3312
- "image/x-xpixmap": ["xpm"],
3313
- "image/x-xwindowdump": ["xwd"],
3314
- "message/vnd.wfa.wsc": ["wsc"],
3315
- "model/vnd.bary": ["bary"],
3316
- "model/vnd.cld": ["cld"],
3317
- "model/vnd.collada+xml": ["dae"],
3318
- "model/vnd.dwf": ["dwf"],
3319
- "model/vnd.gdl": ["gdl"],
3320
- "model/vnd.gtw": ["gtw"],
3321
- "model/vnd.mts": ["*mts"],
3322
- "model/vnd.opengex": ["ogex"],
3323
- "model/vnd.parasolid.transmit.binary": ["x_b"],
3324
- "model/vnd.parasolid.transmit.text": ["x_t"],
3325
- "model/vnd.pytha.pyox": ["pyo", "pyox"],
3326
- "model/vnd.sap.vds": ["vds"],
3327
- "model/vnd.usda": ["usda"],
3328
- "model/vnd.usdz+zip": ["usdz"],
3329
- "model/vnd.valve.source.compiled-map": ["bsp"],
3330
- "model/vnd.vtu": ["vtu"],
3331
- "text/prs.lines.tag": ["dsc"],
3332
- "text/vnd.curl": ["curl"],
3333
- "text/vnd.curl.dcurl": ["dcurl"],
3334
- "text/vnd.curl.mcurl": ["mcurl"],
3335
- "text/vnd.curl.scurl": ["scurl"],
3336
- "text/vnd.dvb.subtitle": ["sub"],
3337
- "text/vnd.familysearch.gedcom": ["ged"],
3338
- "text/vnd.fly": ["fly"],
3339
- "text/vnd.fmi.flexstor": ["flx"],
3340
- "text/vnd.graphviz": ["gv"],
3341
- "text/vnd.in3d.3dml": ["3dml"],
3342
- "text/vnd.in3d.spot": ["spot"],
3343
- "text/vnd.sun.j2me.app-descriptor": ["jad"],
3344
- "text/vnd.wap.wml": ["wml"],
3345
- "text/vnd.wap.wmlscript": ["wmls"],
3346
- "text/x-asm": ["s", "asm"],
3347
- "text/x-c": ["c", "cc", "cxx", "cpp", "h", "hh", "dic"],
3348
- "text/x-component": ["htc"],
3349
- "text/x-fortran": ["f", "for", "f77", "f90"],
3350
- "text/x-handlebars-template": ["hbs"],
3351
- "text/x-java-source": ["java"],
3352
- "text/x-lua": ["lua"],
3353
- "text/x-markdown": ["mkd"],
3354
- "text/x-nfo": ["nfo"],
3355
- "text/x-opml": ["opml"],
3356
- "text/x-org": ["*org"],
3357
- "text/x-pascal": ["p", "pas"],
3358
- "text/x-processing": ["pde"],
3359
- "text/x-sass": ["sass"],
3360
- "text/x-scss": ["scss"],
3361
- "text/x-setext": ["etx"],
3362
- "text/x-sfv": ["sfv"],
3363
- "text/x-suse-ymp": ["ymp"],
3364
- "text/x-uuencode": ["uu"],
3365
- "text/x-vcalendar": ["vcs"],
3366
- "text/x-vcard": ["vcf"],
3367
- "video/vnd.dece.hd": ["uvh", "uvvh"],
3368
- "video/vnd.dece.mobile": ["uvm", "uvvm"],
3369
- "video/vnd.dece.pd": ["uvp", "uvvp"],
3370
- "video/vnd.dece.sd": ["uvs", "uvvs"],
3371
- "video/vnd.dece.video": ["uvv", "uvvv"],
3372
- "video/vnd.dvb.file": ["dvb"],
3373
- "video/vnd.fvt": ["fvt"],
3374
- "video/vnd.mpegurl": ["mxu", "m4u"],
3375
- "video/vnd.ms-playready.media.pyv": ["pyv"],
3376
- "video/vnd.uvvu.mp4": ["uvu", "uvvu"],
3377
- "video/vnd.vivo": ["viv"],
3378
- "video/x-f4v": ["f4v"],
3379
- "video/x-fli": ["fli"],
3380
- "video/x-flv": ["flv"],
3381
- "video/x-m4v": ["m4v"],
3382
- "video/x-matroska": ["mkv", "mk3d", "mks"],
3383
- "video/x-mng": ["mng"],
3384
- "video/x-ms-asf": ["asf", "asx"],
3385
- "video/x-ms-vob": ["vob"],
3386
- "video/x-ms-wm": ["wm"],
3387
- "video/x-ms-wmv": ["wmv"],
3388
- "video/x-ms-wmx": ["wmx"],
3389
- "video/x-ms-wvx": ["wvx"],
3390
- "video/x-msvideo": ["avi"],
3391
- "video/x-sgi-movie": ["movie"],
3392
- "video/x-smv": ["smv"],
3393
- "x-conference/x-cooltalk": ["ice"]
3394
- };
3395
- Object.freeze(types);
3396
- var other_default = types;
3397
-
3398
- // node_modules/mime/dist/types/standard.js
3399
- var types2 = {
3400
- "application/andrew-inset": ["ez"],
3401
- "application/appinstaller": ["appinstaller"],
3402
- "application/applixware": ["aw"],
3403
- "application/appx": ["appx"],
3404
- "application/appxbundle": ["appxbundle"],
3405
- "application/atom+xml": ["atom"],
3406
- "application/atomcat+xml": ["atomcat"],
3407
- "application/atomdeleted+xml": ["atomdeleted"],
3408
- "application/atomsvc+xml": ["atomsvc"],
3409
- "application/atsc-dwd+xml": ["dwd"],
3410
- "application/atsc-held+xml": ["held"],
3411
- "application/atsc-rsat+xml": ["rsat"],
3412
- "application/automationml-aml+xml": ["aml"],
3413
- "application/automationml-amlx+zip": ["amlx"],
3414
- "application/bdoc": ["bdoc"],
3415
- "application/calendar+xml": ["xcs"],
3416
- "application/ccxml+xml": ["ccxml"],
3417
- "application/cdfx+xml": ["cdfx"],
3418
- "application/cdmi-capability": ["cdmia"],
3419
- "application/cdmi-container": ["cdmic"],
3420
- "application/cdmi-domain": ["cdmid"],
3421
- "application/cdmi-object": ["cdmio"],
3422
- "application/cdmi-queue": ["cdmiq"],
3423
- "application/cpl+xml": ["cpl"],
3424
- "application/cu-seeme": ["cu"],
3425
- "application/cwl": ["cwl"],
3426
- "application/dash+xml": ["mpd"],
3427
- "application/dash-patch+xml": ["mpp"],
3428
- "application/davmount+xml": ["davmount"],
3429
- "application/dicom": ["dcm"],
3430
- "application/docbook+xml": ["dbk"],
3431
- "application/dssc+der": ["dssc"],
3432
- "application/dssc+xml": ["xdssc"],
3433
- "application/ecmascript": ["ecma"],
3434
- "application/emma+xml": ["emma"],
3435
- "application/emotionml+xml": ["emotionml"],
3436
- "application/epub+zip": ["epub"],
3437
- "application/exi": ["exi"],
3438
- "application/express": ["exp"],
3439
- "application/fdf": ["fdf"],
3440
- "application/fdt+xml": ["fdt"],
3441
- "application/font-tdpfr": ["pfr"],
3442
- "application/geo+json": ["geojson"],
3443
- "application/gml+xml": ["gml"],
3444
- "application/gpx+xml": ["gpx"],
3445
- "application/gxf": ["gxf"],
3446
- "application/gzip": ["gz"],
3447
- "application/hjson": ["hjson"],
3448
- "application/hyperstudio": ["stk"],
3449
- "application/inkml+xml": ["ink", "inkml"],
3450
- "application/ipfix": ["ipfix"],
3451
- "application/its+xml": ["its"],
3452
- "application/java-archive": ["jar", "war", "ear"],
3453
- "application/java-serialized-object": ["ser"],
3454
- "application/java-vm": ["class"],
3455
- "application/javascript": ["*js"],
3456
- "application/json": ["json", "map"],
3457
- "application/json5": ["json5"],
3458
- "application/jsonml+json": ["jsonml"],
3459
- "application/ld+json": ["jsonld"],
3460
- "application/lgr+xml": ["lgr"],
3461
- "application/lost+xml": ["lostxml"],
3462
- "application/mac-binhex40": ["hqx"],
3463
- "application/mac-compactpro": ["cpt"],
3464
- "application/mads+xml": ["mads"],
3465
- "application/manifest+json": ["webmanifest"],
3466
- "application/marc": ["mrc"],
3467
- "application/marcxml+xml": ["mrcx"],
3468
- "application/mathematica": ["ma", "nb", "mb"],
3469
- "application/mathml+xml": ["mathml"],
3470
- "application/mbox": ["mbox"],
3471
- "application/media-policy-dataset+xml": ["mpf"],
3472
- "application/mediaservercontrol+xml": ["mscml"],
3473
- "application/metalink+xml": ["metalink"],
3474
- "application/metalink4+xml": ["meta4"],
3475
- "application/mets+xml": ["mets"],
3476
- "application/mmt-aei+xml": ["maei"],
3477
- "application/mmt-usd+xml": ["musd"],
3478
- "application/mods+xml": ["mods"],
3479
- "application/mp21": ["m21", "mp21"],
3480
- "application/mp4": ["*mp4", "*mpg4", "mp4s", "m4p"],
3481
- "application/msix": ["msix"],
3482
- "application/msixbundle": ["msixbundle"],
3483
- "application/msword": ["doc", "dot"],
3484
- "application/mxf": ["mxf"],
3485
- "application/n-quads": ["nq"],
3486
- "application/n-triples": ["nt"],
3487
- "application/node": ["cjs"],
3488
- "application/octet-stream": [
3489
- "bin",
3490
- "dms",
3491
- "lrf",
3492
- "mar",
3493
- "so",
3494
- "dist",
3495
- "distz",
3496
- "pkg",
3497
- "bpk",
3498
- "dump",
3499
- "elc",
3500
- "deploy",
3501
- "exe",
3502
- "dll",
3503
- "deb",
3504
- "dmg",
3505
- "iso",
3506
- "img",
3507
- "msi",
3508
- "msp",
3509
- "msm",
3510
- "buffer"
3511
- ],
3512
- "application/oda": ["oda"],
3513
- "application/oebps-package+xml": ["opf"],
3514
- "application/ogg": ["ogx"],
3515
- "application/omdoc+xml": ["omdoc"],
3516
- "application/onenote": [
3517
- "onetoc",
3518
- "onetoc2",
3519
- "onetmp",
3520
- "onepkg",
3521
- "one",
3522
- "onea"
3523
- ],
3524
- "application/oxps": ["oxps"],
3525
- "application/p2p-overlay+xml": ["relo"],
3526
- "application/patch-ops-error+xml": ["xer"],
3527
- "application/pdf": ["pdf"],
3528
- "application/pgp-encrypted": ["pgp"],
3529
- "application/pgp-keys": ["asc"],
3530
- "application/pgp-signature": ["sig", "*asc"],
3531
- "application/pics-rules": ["prf"],
3532
- "application/pkcs10": ["p10"],
3533
- "application/pkcs7-mime": ["p7m", "p7c"],
3534
- "application/pkcs7-signature": ["p7s"],
3535
- "application/pkcs8": ["p8"],
3536
- "application/pkix-attr-cert": ["ac"],
3537
- "application/pkix-cert": ["cer"],
3538
- "application/pkix-crl": ["crl"],
3539
- "application/pkix-pkipath": ["pkipath"],
3540
- "application/pkixcmp": ["pki"],
3541
- "application/pls+xml": ["pls"],
3542
- "application/postscript": ["ai", "eps", "ps"],
3543
- "application/provenance+xml": ["provx"],
3544
- "application/pskc+xml": ["pskcxml"],
3545
- "application/raml+yaml": ["raml"],
3546
- "application/rdf+xml": ["rdf", "owl"],
3547
- "application/reginfo+xml": ["rif"],
3548
- "application/relax-ng-compact-syntax": ["rnc"],
3549
- "application/resource-lists+xml": ["rl"],
3550
- "application/resource-lists-diff+xml": ["rld"],
3551
- "application/rls-services+xml": ["rs"],
3552
- "application/route-apd+xml": ["rapd"],
3553
- "application/route-s-tsid+xml": ["sls"],
3554
- "application/route-usd+xml": ["rusd"],
3555
- "application/rpki-ghostbusters": ["gbr"],
3556
- "application/rpki-manifest": ["mft"],
3557
- "application/rpki-roa": ["roa"],
3558
- "application/rsd+xml": ["rsd"],
3559
- "application/rss+xml": ["rss"],
3560
- "application/rtf": ["rtf"],
3561
- "application/sbml+xml": ["sbml"],
3562
- "application/scvp-cv-request": ["scq"],
3563
- "application/scvp-cv-response": ["scs"],
3564
- "application/scvp-vp-request": ["spq"],
3565
- "application/scvp-vp-response": ["spp"],
3566
- "application/sdp": ["sdp"],
3567
- "application/senml+xml": ["senmlx"],
3568
- "application/sensml+xml": ["sensmlx"],
3569
- "application/set-payment-initiation": ["setpay"],
3570
- "application/set-registration-initiation": ["setreg"],
3571
- "application/shf+xml": ["shf"],
3572
- "application/sieve": ["siv", "sieve"],
3573
- "application/smil+xml": ["smi", "smil"],
3574
- "application/sparql-query": ["rq"],
3575
- "application/sparql-results+xml": ["srx"],
3576
- "application/sql": ["sql"],
3577
- "application/srgs": ["gram"],
3578
- "application/srgs+xml": ["grxml"],
3579
- "application/sru+xml": ["sru"],
3580
- "application/ssdl+xml": ["ssdl"],
3581
- "application/ssml+xml": ["ssml"],
3582
- "application/swid+xml": ["swidtag"],
3583
- "application/tei+xml": ["tei", "teicorpus"],
3584
- "application/thraud+xml": ["tfi"],
3585
- "application/timestamped-data": ["tsd"],
3586
- "application/toml": ["toml"],
3587
- "application/trig": ["trig"],
3588
- "application/ttml+xml": ["ttml"],
3589
- "application/ubjson": ["ubj"],
3590
- "application/urc-ressheet+xml": ["rsheet"],
3591
- "application/urc-targetdesc+xml": ["td"],
3592
- "application/voicexml+xml": ["vxml"],
3593
- "application/wasm": ["wasm"],
3594
- "application/watcherinfo+xml": ["wif"],
3595
- "application/widget": ["wgt"],
3596
- "application/winhlp": ["hlp"],
3597
- "application/wsdl+xml": ["wsdl"],
3598
- "application/wspolicy+xml": ["wspolicy"],
3599
- "application/xaml+xml": ["xaml"],
3600
- "application/xcap-att+xml": ["xav"],
3601
- "application/xcap-caps+xml": ["xca"],
3602
- "application/xcap-diff+xml": ["xdf"],
3603
- "application/xcap-el+xml": ["xel"],
3604
- "application/xcap-ns+xml": ["xns"],
3605
- "application/xenc+xml": ["xenc"],
3606
- "application/xfdf": ["xfdf"],
3607
- "application/xhtml+xml": ["xhtml", "xht"],
3608
- "application/xliff+xml": ["xlf"],
3609
- "application/xml": ["xml", "xsl", "xsd", "rng"],
3610
- "application/xml-dtd": ["dtd"],
3611
- "application/xop+xml": ["xop"],
3612
- "application/xproc+xml": ["xpl"],
3613
- "application/xslt+xml": ["*xsl", "xslt"],
3614
- "application/xspf+xml": ["xspf"],
3615
- "application/xv+xml": ["mxml", "xhvml", "xvml", "xvm"],
3616
- "application/yang": ["yang"],
3617
- "application/yin+xml": ["yin"],
3618
- "application/zip": ["zip"],
3619
- "application/zip+dotlottie": ["lottie"],
3620
- "audio/3gpp": ["*3gpp"],
3621
- "audio/aac": ["adts", "aac"],
3622
- "audio/adpcm": ["adp"],
3623
- "audio/amr": ["amr"],
3624
- "audio/basic": ["au", "snd"],
3625
- "audio/midi": ["mid", "midi", "kar", "rmi"],
3626
- "audio/mobile-xmf": ["mxmf"],
3627
- "audio/mp3": ["*mp3"],
3628
- "audio/mp4": ["m4a", "mp4a", "m4b"],
3629
- "audio/mpeg": ["mpga", "mp2", "mp2a", "mp3", "m2a", "m3a"],
3630
- "audio/ogg": ["oga", "ogg", "spx", "opus"],
3631
- "audio/s3m": ["s3m"],
3632
- "audio/silk": ["sil"],
3633
- "audio/wav": ["wav"],
3634
- "audio/wave": ["*wav"],
3635
- "audio/webm": ["weba"],
3636
- "audio/xm": ["xm"],
3637
- "font/collection": ["ttc"],
3638
- "font/otf": ["otf"],
3639
- "font/ttf": ["ttf"],
3640
- "font/woff": ["woff"],
3641
- "font/woff2": ["woff2"],
3642
- "image/aces": ["exr"],
3643
- "image/apng": ["apng"],
3644
- "image/avci": ["avci"],
3645
- "image/avcs": ["avcs"],
3646
- "image/avif": ["avif"],
3647
- "image/bmp": ["bmp", "dib"],
3648
- "image/cgm": ["cgm"],
3649
- "image/dicom-rle": ["drle"],
3650
- "image/dpx": ["dpx"],
3651
- "image/emf": ["emf"],
3652
- "image/fits": ["fits"],
3653
- "image/g3fax": ["g3"],
3654
- "image/gif": ["gif"],
3655
- "image/heic": ["heic"],
3656
- "image/heic-sequence": ["heics"],
3657
- "image/heif": ["heif"],
3658
- "image/heif-sequence": ["heifs"],
3659
- "image/hej2k": ["hej2"],
3660
- "image/ief": ["ief"],
3661
- "image/jaii": ["jaii"],
3662
- "image/jais": ["jais"],
3663
- "image/jls": ["jls"],
3664
- "image/jp2": ["jp2", "jpg2"],
3665
- "image/jpeg": ["jpg", "jpeg", "jpe"],
3666
- "image/jph": ["jph"],
3667
- "image/jphc": ["jhc"],
3668
- "image/jpm": ["jpm", "jpgm"],
3669
- "image/jpx": ["jpx", "jpf"],
3670
- "image/jxl": ["jxl"],
3671
- "image/jxr": ["jxr"],
3672
- "image/jxra": ["jxra"],
3673
- "image/jxrs": ["jxrs"],
3674
- "image/jxs": ["jxs"],
3675
- "image/jxsc": ["jxsc"],
3676
- "image/jxsi": ["jxsi"],
3677
- "image/jxss": ["jxss"],
3678
- "image/ktx": ["ktx"],
3679
- "image/ktx2": ["ktx2"],
3680
- "image/pjpeg": ["jfif"],
3681
- "image/png": ["png"],
3682
- "image/sgi": ["sgi"],
3683
- "image/svg+xml": ["svg", "svgz"],
3684
- "image/t38": ["t38"],
3685
- "image/tiff": ["tif", "tiff"],
3686
- "image/tiff-fx": ["tfx"],
3687
- "image/webp": ["webp"],
3688
- "image/wmf": ["wmf"],
3689
- "message/disposition-notification": ["disposition-notification"],
3690
- "message/global": ["u8msg"],
3691
- "message/global-delivery-status": ["u8dsn"],
3692
- "message/global-disposition-notification": ["u8mdn"],
3693
- "message/global-headers": ["u8hdr"],
3694
- "message/rfc822": ["eml", "mime", "mht", "mhtml"],
3695
- "model/3mf": ["3mf"],
3696
- "model/gltf+json": ["gltf"],
3697
- "model/gltf-binary": ["glb"],
3698
- "model/iges": ["igs", "iges"],
3699
- "model/jt": ["jt"],
3700
- "model/mesh": ["msh", "mesh", "silo"],
3701
- "model/mtl": ["mtl"],
3702
- "model/obj": ["obj"],
3703
- "model/prc": ["prc"],
3704
- "model/step": ["step", "stp", "stpnc", "p21", "210"],
3705
- "model/step+xml": ["stpx"],
3706
- "model/step+zip": ["stpz"],
3707
- "model/step-xml+zip": ["stpxz"],
3708
- "model/stl": ["stl"],
3709
- "model/u3d": ["u3d"],
3710
- "model/vrml": ["wrl", "vrml"],
3711
- "model/x3d+binary": ["*x3db", "x3dbz"],
3712
- "model/x3d+fastinfoset": ["x3db"],
3713
- "model/x3d+vrml": ["*x3dv", "x3dvz"],
3714
- "model/x3d+xml": ["x3d", "x3dz"],
3715
- "model/x3d-vrml": ["x3dv"],
3716
- "text/cache-manifest": ["appcache", "manifest"],
3717
- "text/calendar": ["ics", "ifb"],
3718
- "text/coffeescript": ["coffee", "litcoffee"],
3719
- "text/css": ["css"],
3720
- "text/csv": ["csv"],
3721
- "text/html": ["html", "htm", "shtml"],
3722
- "text/jade": ["jade"],
3723
- "text/javascript": ["js", "mjs"],
3724
- "text/jsx": ["jsx"],
3725
- "text/less": ["less"],
3726
- "text/markdown": ["md", "markdown"],
3727
- "text/mathml": ["mml"],
3728
- "text/mdx": ["mdx"],
3729
- "text/n3": ["n3"],
3730
- "text/plain": ["txt", "text", "conf", "def", "list", "log", "in", "ini"],
3731
- "text/richtext": ["rtx"],
3732
- "text/rtf": ["*rtf"],
3733
- "text/sgml": ["sgml", "sgm"],
3734
- "text/shex": ["shex"],
3735
- "text/slim": ["slim", "slm"],
3736
- "text/spdx": ["spdx"],
3737
- "text/stylus": ["stylus", "styl"],
3738
- "text/tab-separated-values": ["tsv"],
3739
- "text/troff": ["t", "tr", "roff", "man", "me", "ms"],
3740
- "text/turtle": ["ttl"],
3741
- "text/uri-list": ["uri", "uris", "urls"],
3742
- "text/vcard": ["vcard"],
3743
- "text/vtt": ["vtt"],
3744
- "text/wgsl": ["wgsl"],
3745
- "text/xml": ["*xml"],
3746
- "text/yaml": ["yaml", "yml"],
3747
- "video/3gpp": ["3gp", "3gpp"],
3748
- "video/3gpp2": ["3g2"],
3749
- "video/h261": ["h261"],
3750
- "video/h263": ["h263"],
3751
- "video/h264": ["h264"],
3752
- "video/iso.segment": ["m4s"],
3753
- "video/jpeg": ["jpgv"],
3754
- "video/jpm": ["*jpm", "*jpgm"],
3755
- "video/mj2": ["mj2", "mjp2"],
3756
- "video/mp2t": ["ts", "m2t", "m2ts", "mts"],
3757
- "video/mp4": ["mp4", "mp4v", "mpg4"],
3758
- "video/mpeg": ["mpeg", "mpg", "mpe", "m1v", "m2v"],
3759
- "video/ogg": ["ogv"],
3760
- "video/quicktime": ["qt", "mov"],
3761
- "video/webm": ["webm"]
3762
- };
3763
- Object.freeze(types2);
3764
- var standard_default = types2;
3765
-
3766
- // node_modules/mime/dist/src/Mime.js
3767
- var __classPrivateFieldGet = function(receiver, state, kind, f) {
3768
- if (kind === "a" && !f)
3769
- throw new TypeError("Private accessor was defined without a getter");
3770
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
3771
- throw new TypeError("Cannot read private member from an object whose class did not declare it");
3772
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
3773
- };
3774
- var _Mime_extensionToType;
3775
- var _Mime_typeToExtension;
3776
- var _Mime_typeToExtensions;
3777
-
3778
- class Mime {
3779
- constructor(...args) {
3780
- _Mime_extensionToType.set(this, new Map);
3781
- _Mime_typeToExtension.set(this, new Map);
3782
- _Mime_typeToExtensions.set(this, new Map);
3783
- for (const arg of args) {
3784
- this.define(arg);
3785
- }
3786
- }
3787
- define(typeMap, force = false) {
3788
- for (let [type, extensions] of Object.entries(typeMap)) {
3789
- type = type.toLowerCase();
3790
- extensions = extensions.map((ext) => ext.toLowerCase());
3791
- if (!__classPrivateFieldGet(this, _Mime_typeToExtensions, "f").has(type)) {
3792
- __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").set(type, new Set);
3793
- }
3794
- const allExtensions = __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").get(type);
3795
- let first = true;
3796
- for (let extension of extensions) {
3797
- const starred = extension.startsWith("*");
3798
- extension = starred ? extension.slice(1) : extension;
3799
- allExtensions?.add(extension);
3800
- if (first) {
3801
- __classPrivateFieldGet(this, _Mime_typeToExtension, "f").set(type, extension);
3802
- }
3803
- first = false;
3804
- if (starred)
3805
- continue;
3806
- const currentType = __classPrivateFieldGet(this, _Mime_extensionToType, "f").get(extension);
3807
- if (currentType && currentType != type && !force) {
3808
- throw new Error(`"${type} -> ${extension}" conflicts with "${currentType} -> ${extension}". Pass \`force=true\` to override this definition.`);
3809
- }
3810
- __classPrivateFieldGet(this, _Mime_extensionToType, "f").set(extension, type);
3811
- }
3812
- }
3813
- return this;
3814
- }
3815
- getType(path3) {
3816
- if (typeof path3 !== "string")
3817
- return null;
3818
- const last = path3.replace(/^.*[/\\]/s, "").toLowerCase();
3819
- const ext = last.replace(/^.*\./s, "").toLowerCase();
3820
- const hasPath = last.length < path3.length;
3821
- const hasDot = ext.length < last.length - 1;
3822
- if (!hasDot && hasPath)
3823
- return null;
3824
- return __classPrivateFieldGet(this, _Mime_extensionToType, "f").get(ext) ?? null;
3825
- }
3826
- getExtension(type) {
3827
- if (typeof type !== "string")
3828
- return null;
3829
- type = type?.split?.(";")[0];
3830
- return (type && __classPrivateFieldGet(this, _Mime_typeToExtension, "f").get(type.trim().toLowerCase())) ?? null;
3831
- }
3832
- getAllExtensions(type) {
3833
- if (typeof type !== "string")
3834
- return null;
3835
- return __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").get(type.toLowerCase()) ?? null;
3836
- }
3837
- _freeze() {
3838
- this.define = () => {
3839
- throw new Error("define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances");
3840
- };
3841
- Object.freeze(this);
3842
- for (const extensions of __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").values()) {
3843
- Object.freeze(extensions);
3844
- }
3845
- return this;
3846
- }
3847
- _getTestState() {
3848
- return {
3849
- types: __classPrivateFieldGet(this, _Mime_extensionToType, "f"),
3850
- extensions: __classPrivateFieldGet(this, _Mime_typeToExtension, "f")
3851
- };
3852
- }
3853
- }
3854
- _Mime_extensionToType = new WeakMap, _Mime_typeToExtension = new WeakMap, _Mime_typeToExtensions = new WeakMap;
3855
- var Mime_default = Mime;
3856
-
3857
- // node_modules/mime/dist/src/index.js
3858
- var src_default = new Mime_default(standard_default, other_default)._freeze();
3859
-
3860
2858
  // src/config-file.ts
3861
- import { existsSync as existsSync5, readFileSync as readFileSync4, writeFileSync as writeFileSync4 } from "node:fs";
3862
- import { resolve as resolve2 } from "node:path";
3863
-
3864
- // src/update-webapp-config.ts
3865
- import { existsSync as existsSync4, readFileSync as readFileSync3, writeFileSync as writeFileSync3 } from "node:fs";
3866
- import { resolve } from "node:path";
3867
- var CONFIG_URLS = {
3868
- local: "http://localhost:5176/api/webapps/config",
3869
- development: "https://development-cms.rodyssey.ai/api/webapps/config",
3870
- staging: "https://staging-cms.rodyssey.ai/api/webapps/config",
3871
- production: "https://cms.rodyssey.ai/api/webapps/config"
3872
- };
3873
- function parseJsonOption(value, optionName) {
3874
- const maybePath = resolve(process.cwd(), value);
3875
- const raw = existsSync4(maybePath) ? readFileSync3(maybePath, "utf-8") : value;
3876
- try {
3877
- const parsed = JSON.parse(raw);
3878
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
3879
- throw new Error("value must be a JSON object");
3880
- }
3881
- return parsed;
3882
- } catch (error) {
3883
- const message = error instanceof Error ? error.message : String(error);
3884
- throw new Error(`Invalid ${optionName}: ${message}`);
3885
- }
3886
- }
3887
- function coerceMaybeNull(value) {
3888
- if (value === undefined)
3889
- return;
3890
- if (value === "null")
3891
- return null;
3892
- return value;
2859
+ var DEFAULT_CONFIG_FILE = "webapp.config.json";
2860
+ function isClearSignalEmpty(value) {
2861
+ if (value === null)
2862
+ return true;
2863
+ if (Array.isArray(value) && value.length === 0)
2864
+ return true;
2865
+ if (isPlainObject(value) && Object.keys(value).length === 0)
2866
+ return true;
2867
+ return false;
3893
2868
  }
3894
- function resolveConfigUrl(options, required = true) {
3895
- const configUrl = options.url || process.env.WEBAPP_CONFIG_URL || CONFIG_URLS[options.env];
3896
- if (!configUrl) {
3897
- if (!required)
3898
- return;
3899
- console.error("❌ Error: no webapp config endpoint configured.");
3900
- console.error(`\uD83D\uDCA1 Use one of these environments: ${Object.keys(CONFIG_URLS).join(", ")}, pass --url, or set WEBAPP_CONFIG_URL in your .env file.`);
3901
- process.exit(1);
3902
- }
3903
- const url = new URL(configUrl);
3904
- if (!options.host && !options.port) {
3905
- return url.toString().replace(/\/$/, "");
2869
+ function sanitizeDetails(details) {
2870
+ const out = {};
2871
+ for (const [key, value] of Object.entries(details)) {
2872
+ if (isClearSignalEmpty(value))
2873
+ continue;
2874
+ out[key] = value;
3906
2875
  }
3907
- if (options.host)
3908
- url.hostname = options.host;
3909
- if (options.port)
3910
- url.port = String(options.port);
3911
- return url.toString().replace(/\/$/, "");
2876
+ return out;
3912
2877
  }
3913
- function buildDetailsPayload(options) {
3914
- const payload = options.details ? parseJsonOption(options.details, "--details") : {};
3915
- const title = coerceMaybeNull(options.title);
3916
- const description = coerceMaybeNull(options.description);
3917
- const coverImg = coerceMaybeNull(options.coverImg);
3918
- if (title !== undefined)
3919
- payload.title = title;
3920
- if (description !== undefined)
3921
- payload.description = description;
3922
- if (coverImg !== undefined)
3923
- payload.coverImg = coverImg;
3924
- if (options.localization !== undefined) {
3925
- payload.localization = options.localization === "null" ? null : parseJsonOption(options.localization, "--localization");
2878
+ function unwrapDetails(payload) {
2879
+ if (isPlainObject(payload) && isPlainObject(payload.details)) {
2880
+ return payload.details;
3926
2881
  }
3927
- return payload;
2882
+ if (isPlainObject(payload) && "details" in payload)
2883
+ return {};
2884
+ if (isPlainObject(payload))
2885
+ return payload;
2886
+ return {};
3928
2887
  }
3929
- function resolveWebappId(webappId) {
3930
- const resolved = webappId || process.env.WEBAPP_ID;
3931
- if (!resolved) {
3932
- console.error("❌ Error: WEBAPP_ID is not set. Pass --webapp-id or set it in your .env file.");
3933
- process.exit(1);
2888
+ function projectDetailsPatch(current, patch) {
2889
+ const next = { ...current };
2890
+ for (const [key, value] of Object.entries(patch)) {
2891
+ if (isClearSignalEmpty(value)) {
2892
+ delete next[key];
2893
+ } else {
2894
+ next[key] = value;
2895
+ }
3934
2896
  }
3935
- return resolved;
3936
- }
3937
- function ensureDeployToken(env) {
3938
- if (process.env.DEPLOY_TOKEN)
3939
- return;
3940
- console.error("❌ Error: DEPLOY_TOKEN is not set in environment variables.");
3941
- console.info(`\uD83D\uDCA1 Please check your .env or .env.${env} file.`);
3942
- process.exit(1);
2897
+ return next;
3943
2898
  }
3944
- function getConfigUrl(options, required = true) {
3945
- return resolveConfigUrl(options, required);
2899
+ function computeDetailsDelta(current, fileDetails) {
2900
+ return diffJson(current, projectDetailsPatch(current, fileDetails));
3946
2901
  }
3947
- async function patchWebappConfig(options) {
3948
- loadEnv(options.env);
3949
- const webappId = resolveWebappId(options.webappId);
3950
- const CONFIG_URL = getConfigUrl(options, false);
3951
- if (!CONFIG_URL) {
3952
- throw new Error("No webapp config endpoint configured.");
2902
+ function readConfigFile(filePath) {
2903
+ if (!existsSync4(filePath)) {
2904
+ throw new Error(`Config file not found: ${filePath}. Run \`ro app config pull\` first.`);
3953
2905
  }
3954
- ensureDeployToken(options.env);
3955
- const response = await fetch(CONFIG_URL, {
3956
- method: "PATCH",
3957
- headers: {
3958
- Authorization: `Bearer ${process.env.DEPLOY_TOKEN}`,
3959
- "Content-Type": "application/json"
3960
- },
3961
- body: JSON.stringify({ webappId, details: options.details })
3962
- });
3963
- if (!response.ok) {
3964
- const errorText = await response.text();
3965
- throw new Error(`Config update failed: ${response.status} ${response.statusText}
3966
- ${errorText}`);
2906
+ let raw;
2907
+ try {
2908
+ raw = readFileSync4(filePath, "utf-8");
2909
+ } catch (error) {
2910
+ const message = error instanceof Error ? error.message : String(error);
2911
+ throw new Error(`Could not read ${filePath}: ${message}`);
3967
2912
  }
3968
- return await response.json().catch(() => {
3969
- return;
3970
- });
3971
- }
3972
- async function fetchWebappConfig(options) {
3973
- loadEnv(options.env);
3974
- const webappId = resolveWebappId(options.webappId);
3975
- const CONFIG_URL = getConfigUrl(options, false);
3976
- if (!CONFIG_URL) {
3977
- throw new Error("No webapp config endpoint configured.");
2913
+ let parsed;
2914
+ try {
2915
+ parsed = JSON.parse(raw);
2916
+ } catch (error) {
2917
+ const message = error instanceof Error ? error.message : String(error);
2918
+ throw new Error(`Invalid JSON in ${filePath}: ${message}`);
3978
2919
  }
3979
- ensureDeployToken(options.env);
3980
- const url = new URL(CONFIG_URL);
3981
- url.searchParams.set("webappId", webappId);
3982
- const response = await fetch(url, {
3983
- method: "GET",
3984
- headers: {
3985
- Authorization: `Bearer ${process.env.DEPLOY_TOKEN}`,
3986
- Accept: "application/json"
3987
- }
3988
- });
3989
- if (!response.ok) {
3990
- const errorText = await response.text();
3991
- throw new Error(`Config fetch failed: ${response.status} ${response.statusText}
3992
- ${errorText}`);
2920
+ if (!isPlainObject(parsed)) {
2921
+ throw new Error(`${filePath} must contain a JSON object.`);
3993
2922
  }
3994
- return await response.json();
2923
+ return parsed;
3995
2924
  }
3996
- async function getWebappConfig(options) {
3997
- loadEnv(options.env);
3998
- const webappId = resolveWebappId(options.webappId);
3999
- const CONFIG_URL = getConfigUrl(options);
4000
- if (!CONFIG_URL)
4001
- return;
4002
- const url = new URL(CONFIG_URL);
4003
- url.searchParams.set("webappId", webappId);
4004
- console.log(`⚙️ Pulling webapp config for [${options.env}] environment...`);
4005
- console.log(`\uD83D\uDCCD Config URL: ${url.toString()}`);
4006
- console.log(`\uD83D\uDCCD Webapp ID: ${webappId}
4007
- `);
4008
- const config = await fetchWebappConfig(options);
4009
- const output = JSON.stringify(config, null, 2);
4010
- if (options.out) {
4011
- writeFileSync3(options.out, `${output}
2925
+ async function pullWebappConfig(options) {
2926
+ const raw = await fetchWebappConfig({
2927
+ env: options.env,
2928
+ webappId: options.webappId,
2929
+ url: options.url,
2930
+ host: options.host,
2931
+ port: options.port
2932
+ });
2933
+ const details = unwrapDetails(raw);
2934
+ const cleaned = sanitizeDetails(details);
2935
+ const stripped = Object.keys(details).length - Object.keys(cleaned).length;
2936
+ const fileName = options.out || DEFAULT_CONFIG_FILE;
2937
+ const outPath = resolve2(process.cwd(), fileName);
2938
+ writeFileSync4(outPath, `${JSON.stringify(cleaned, null, 2)}
4012
2939
  `, "utf-8");
4013
- console.log(`✅ Webapp config written to ${options.out}`);
4014
- return;
4015
- }
4016
- console.log(output);
2940
+ console.log(`✅ Wrote ${fileName} (${Object.keys(cleaned).length} fields, ${stripped} empty default${stripped === 1 ? "" : "s"} stripped)`);
4017
2941
  }
4018
- async function updateWebappConfig(options) {
4019
- loadEnv(options.env);
4020
- const webappId = resolveWebappId(options.webappId);
4021
- const details = buildDetailsPayload(options);
4022
- if (Object.keys(details).length === 0) {
4023
- console.error("❌ Error: no detail fields provided. Use --title, --description, --cover-img, --localization, or --details.");
4024
- process.exit(1);
4025
- }
4026
- const payload = { webappId, details };
4027
- const CONFIG_URL = getConfigUrl(options, !options.dryRun);
4028
- if (!options.dryRun)
4029
- ensureDeployToken(options.env);
4030
- console.log(`⚙️ Updating webapp config for [${options.env}] environment...`);
4031
- if (CONFIG_URL) {
4032
- console.log(`\uD83D\uDCCD Config URL: ${CONFIG_URL}`);
2942
+ async function pushWebappConfig(options) {
2943
+ const fileName = options.file || DEFAULT_CONFIG_FILE;
2944
+ const filePath = resolve2(process.cwd(), fileName);
2945
+ const fileDetails = readConfigFile(filePath);
2946
+ const raw = await fetchWebappConfig({
2947
+ env: options.env,
2948
+ webappId: options.webappId,
2949
+ url: options.url,
2950
+ host: options.host,
2951
+ port: options.port
2952
+ });
2953
+ const current = unwrapDetails(raw);
2954
+ const deltas = computeDetailsDelta(current, fileDetails);
2955
+ console.log(formatObjectDelta(deltas, `Pushing ${fileName} → [${options.env}]`));
2956
+ if (deltas.length === 0) {
2957
+ console.log(`
2958
+ ✓ Already in sync — nothing to push.`);
2959
+ return;
4033
2960
  }
4034
- console.log(`\uD83D\uDCCD Webapp ID: ${webappId}
4035
- `);
4036
2961
  if (options.dryRun) {
4037
- console.log("\uD83E\uDDEA Dry run payload:");
4038
- console.log(JSON.stringify(payload, null, 2));
2962
+ console.log(`
2963
+ Dry run — no request sent.`);
4039
2964
  return;
4040
2965
  }
4041
- if (!CONFIG_URL)
4042
- return;
4043
- const result = await patchWebappConfig({
2966
+ const tty = !!process.stdin.isTTY && !!process.stdout.isTTY;
2967
+ if (!options.yes) {
2968
+ if (!tty) {
2969
+ throw new Error("Refusing to push in non-interactive mode. Pass --yes to confirm or --dry-run to preview.");
2970
+ }
2971
+ const answer = await prompt(`
2972
+ Proceed with push on [${options.env}]? (y/N): `);
2973
+ if (!isExplicitYes(answer)) {
2974
+ console.log("✋ Aborted.");
2975
+ return;
2976
+ }
2977
+ }
2978
+ await patchWebappConfig({
4044
2979
  env: options.env,
4045
- details,
4046
- webappId,
2980
+ details: fileDetails,
2981
+ webappId: options.webappId,
4047
2982
  url: options.url,
4048
2983
  host: options.host,
4049
2984
  port: options.port
4050
2985
  });
4051
- console.log("✅ Webapp config updated");
4052
- if (result !== undefined) {
2986
+ console.log(`
2987
+ Webapp config pushed.`);
2988
+ }
2989
+ async function checkConfigDriftOnDeploy(options) {
2990
+ const fileName = options.file || DEFAULT_CONFIG_FILE;
2991
+ const filePath = resolve2(process.cwd(), fileName);
2992
+ if (!existsSync4(filePath))
2993
+ return;
2994
+ if (!process.env.WEBAPP_ID) {
2995
+ console.warn(`
2996
+ ⚠️ Skipping config drift check: WEBAPP_ID is not set.`);
2997
+ return;
2998
+ }
2999
+ let fileDetails;
3000
+ try {
3001
+ fileDetails = readConfigFile(filePath);
3002
+ } catch (error) {
3003
+ const message = error instanceof Error ? error.message : String(error);
3004
+ console.warn(`
3005
+ ⚠️ Skipping config drift check: ${message}`);
3006
+ return;
3007
+ }
3008
+ let current;
3009
+ try {
3010
+ const raw = await fetchWebappConfig({
3011
+ env: options.env,
3012
+ host: options.host,
3013
+ port: options.port
3014
+ });
3015
+ current = unwrapDetails(raw);
3016
+ } catch (error) {
3017
+ const message = error instanceof Error ? error.message : String(error);
3018
+ console.warn(`
3019
+ ⚠️ Could not check config drift: ${message}`);
3020
+ return;
3021
+ }
3022
+ const deltas = computeDetailsDelta(current, fileDetails);
3023
+ if (deltas.length === 0)
3024
+ return;
3025
+ console.log(`
3026
+ \uD83D\uDCDD ${fileName} differs from the CMS:`);
3027
+ console.log(formatObjectDelta(deltas, `Config drift on [${options.env}]`));
3028
+ const tty = !!process.stdin.isTTY && !!process.stdout.isTTY;
3029
+ let shouldPush = options.pushConfig === true;
3030
+ if (!shouldPush) {
3031
+ if (!tty) {
3032
+ console.log(`
3033
+ ℹ️ ${fileName} differs from CMS — run 'ro app config push' to sync, or deploy with --push-config.`);
3034
+ return;
3035
+ }
3036
+ const answer = await prompt(`
3037
+ Push ${fileName} to the CMS now? (y/N): `);
3038
+ shouldPush = isExplicitYes(answer);
3039
+ }
3040
+ if (!shouldPush) {
4053
3041
  console.log(`
4054
- \uD83D\uDCCB Update result:`, result);
3042
+ Skipped. Run 'ro app config push' later to sync.`);
3043
+ return;
3044
+ }
3045
+ try {
3046
+ await patchWebappConfig({
3047
+ env: options.env,
3048
+ details: fileDetails,
3049
+ host: options.host,
3050
+ port: options.port
3051
+ });
3052
+ console.log("✅ Webapp config pushed.");
3053
+ } catch (error) {
3054
+ const message = error instanceof Error ? error.message : String(error);
3055
+ console.warn(`
3056
+ ⚠️ Config push failed (deploy still succeeded): ${message}`);
3057
+ console.warn(" Retry with: ro app config push");
4055
3058
  }
4056
3059
  }
4057
3060
 
4058
- // src/cli-ui.ts
4059
- function isPlainObject(value) {
4060
- return !!value && typeof value === "object" && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
3061
+ // src/create.ts
3062
+ var PLACEHOLDER = "__PROJECT_NAME__";
3063
+ var PLACEHOLDER_LOWER = "__project_name__";
3064
+ var REPLACEMENT_FILES = {
3065
+ webapp: ["package.json", "index.html"],
3066
+ "webapp-fullstack": ["package.json", "wrangler.jsonc"]
3067
+ };
3068
+ function isObject2(value) {
3069
+ return !!value && typeof value === "object" && !Array.isArray(value);
4061
3070
  }
4062
- function compact(value) {
4063
- return JSON.stringify(value);
3071
+ function pickString(...values) {
3072
+ return values.find((value) => typeof value === "string" && value.length > 0);
4064
3073
  }
4065
- function pretty(value) {
4066
- return JSON.stringify(value, null, 2);
3074
+ function nestedObject(value, key) {
3075
+ if (!isObject2(value))
3076
+ return;
3077
+ const nested = value[key];
3078
+ return isObject2(nested) ? nested : undefined;
4067
3079
  }
4068
- function useColor() {
4069
- return !!process.stdout.isTTY && !process.env.NO_COLOR;
3080
+ function extractWebappId(payload) {
3081
+ const webapp = nestedObject(payload, "webapp");
3082
+ return pickString(webapp?.id, webapp?.webappId);
4070
3083
  }
4071
- function paint(code, text) {
4072
- return useColor() ? `\x1B[${code}m${text}\x1B[0m` : text;
3084
+ function extractDeployToken(payload) {
3085
+ const webapp = nestedObject(payload, "webapp");
3086
+ return pickString(webapp?.deployToken, webapp?.deploymentToken);
4073
3087
  }
4074
- var green = (s) => paint("32", s);
4075
- var red = (s) => paint("31", s);
4076
- var yellow = (s) => paint("33", s);
4077
- var dim = (s) => paint("2", s);
4078
- var strike = (s) => paint("9", s);
4079
- async function prompt(question) {
4080
- const readline = await import("node:readline");
4081
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
4082
- return new Promise((resolveAnswer) => {
4083
- rl.question(question, (answer) => {
4084
- rl.close();
4085
- resolveAnswer(answer);
4086
- });
3088
+ function writeProjectEnv(projectDir, provisioned) {
3089
+ upsertEnvFile(path2.join(projectDir, ".env"), {
3090
+ WEBAPP_ID: provisioned.webappId,
3091
+ DEPLOY_TOKEN: provisioned.deployToken
4087
3092
  });
4088
3093
  }
4089
- function isExplicitYes(answer) {
4090
- const trimmed = answer.trim().toLowerCase();
4091
- return trimmed === "y" || trimmed === "yes";
3094
+ async function provisionWebapp(projectName, options) {
3095
+ const cmsUrl = resolveCmsUrl(options.env, options.cmsUrl);
3096
+ const token = resolveSessionToken(options.env);
3097
+ const createUrl = options.createUrl || `${cmsUrl}/api/cli/webapps/create`;
3098
+ const createResponse = await fetch(createUrl, {
3099
+ method: "POST",
3100
+ headers: {
3101
+ Accept: "application/json",
3102
+ Authorization: `Bearer ${token}`,
3103
+ "Content-Type": "application/json"
3104
+ },
3105
+ body: JSON.stringify({ title: projectName })
3106
+ });
3107
+ const createPayload = await readResponsePayload(createResponse);
3108
+ if (!createResponse.ok) {
3109
+ throw new Error(`CMS webapp creation failed: ${createResponse.status} ${createResponse.statusText}
3110
+ ${JSON.stringify(createPayload, null, 2)}`);
3111
+ }
3112
+ const webappId = extractWebappId(createPayload);
3113
+ if (!webappId) {
3114
+ throw new Error(`CMS create response did not include webapp.id:
3115
+ ${JSON.stringify(createPayload, null, 2)}`);
3116
+ }
3117
+ const deployToken = extractDeployToken(createPayload);
3118
+ if (!deployToken) {
3119
+ throw new Error(`CMS create response did not include webapp.deployToken:
3120
+ ${JSON.stringify(createPayload, null, 2)}`);
3121
+ }
3122
+ return {
3123
+ webappId,
3124
+ deployToken
3125
+ };
3126
+ }
3127
+ async function fetchCmsConfig(cmsUrl, webappId, deployToken) {
3128
+ const url = new URL(`${cmsUrl}/api/webapps/config`);
3129
+ url.searchParams.set("webappId", webappId);
3130
+ const response = await fetch(url, {
3131
+ method: "GET",
3132
+ headers: {
3133
+ Authorization: `Bearer ${deployToken}`,
3134
+ Accept: "application/json"
3135
+ }
3136
+ });
3137
+ if (!response.ok) {
3138
+ const errorText = await response.text();
3139
+ throw new Error(`Config fetch failed: ${response.status} ${response.statusText}
3140
+ ${errorText}`);
3141
+ }
3142
+ return response.json();
4092
3143
  }
4093
- function pathToDot(path3) {
4094
- return path3.replace(/^\//, "").replaceAll("/", ".");
3144
+ function writeProjectConfig(projectDir, details) {
3145
+ writeFileSync5(path2.join(projectDir, DEFAULT_CONFIG_FILE), `${JSON.stringify(details, null, 2)}
3146
+ `, "utf-8");
4095
3147
  }
4096
- function deepEqual(a, b) {
4097
- if (a === b)
4098
- return true;
4099
- if (typeof a !== typeof b)
4100
- return false;
4101
- if (a === null || b === null)
4102
- return false;
4103
- if (Array.isArray(a) || Array.isArray(b)) {
4104
- if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length)
4105
- return false;
4106
- return a.every((v, i) => deepEqual(v, b[i]));
3148
+ async function create(projectName, repoUrl, templateName, autoCreate) {
3149
+ const targetDir = path2.resolve(process.cwd(), projectName);
3150
+ if (existsSync5(targetDir)) {
3151
+ console.error(`
3152
+ Directory "${projectName}" already exists.
3153
+ `);
3154
+ process.exit(1);
4107
3155
  }
4108
- if (typeof a === "object" && typeof b === "object") {
4109
- const ak = Object.keys(a);
4110
- const bk = Object.keys(b);
4111
- if (ak.length !== bk.length)
4112
- return false;
4113
- return ak.every((k) => deepEqual(a[k], b[k]));
3156
+ if (autoCreate?.enabled) {
3157
+ resolveCmsUrl(autoCreate.env, autoCreate.cmsUrl);
3158
+ resolveSessionToken(autoCreate.env);
4114
3159
  }
4115
- return false;
4116
- }
4117
- function diffJson(before, after, path3 = "") {
4118
- if (deepEqual(before, after))
4119
- return [];
4120
- if (before === undefined)
4121
- return [{ path: path3, kind: "add", after }];
4122
- if (after === undefined)
4123
- return [{ path: path3, kind: "remove", before }];
4124
- if (!isPlainObject(before) || !isPlainObject(after)) {
4125
- return [{ path: path3, kind: "change", before, after }];
3160
+ console.log(`
3161
+ ⏳ Cloning template "${templateName}"...
3162
+ `);
3163
+ try {
3164
+ execSync(`git clone --depth 1 ${repoUrl} ${projectName}`, {
3165
+ stdio: "inherit",
3166
+ cwd: process.cwd()
3167
+ });
3168
+ } catch {
3169
+ console.error(`
3170
+ Failed to clone template. Make sure you have SSH access to the repo.
3171
+ `);
3172
+ process.exit(1);
4126
3173
  }
4127
- const keys = new Set([...Object.keys(before), ...Object.keys(after)]);
4128
- const out = [];
4129
- for (const key of keys) {
4130
- out.push(...diffJson(before[key], after[key], `${path3}/${key}`));
3174
+ const gitDir = path2.join(targetDir, ".git");
3175
+ if (existsSync5(gitDir)) {
3176
+ rmSync(gitDir, { recursive: true, force: true });
4131
3177
  }
4132
- return out;
4133
- }
4134
- function deltaLine(d) {
4135
- const path3 = pathToDot(d.path) || "(root)";
4136
- if (d.kind === "add")
4137
- return green(` ${path3}: ${compact(d.after)}`);
4138
- if (d.kind === "change") {
4139
- return yellow(` ${path3}: ${strike(compact(d.before))} → ${compact(d.after)}`);
3178
+ const filesToReplace = REPLACEMENT_FILES[templateName] ?? [];
3179
+ if (filesToReplace.length > 0) {
3180
+ console.log(` \uD83D\uDCDD Replacing project name...`);
3181
+ replaceInFiles(targetDir, filesToReplace, PLACEHOLDER, projectName);
3182
+ replaceInFiles(targetDir, filesToReplace, PLACEHOLDER_LOWER, projectName.toLowerCase());
4140
3183
  }
4141
- return red(strike(` ${path3}: ${compact(d.before)}`));
4142
- }
4143
- function formatObjectDelta(deltas, header) {
4144
- if (deltas.length === 0)
4145
- return `${header}
4146
- ${dim(" (no changes)")}`;
4147
- const adds = deltas.filter((d) => d.kind === "add");
4148
- const changes = deltas.filter((d) => d.kind === "change");
4149
- const removes = deltas.filter((d) => d.kind === "remove");
4150
- const sections = [];
4151
- if (adds.length)
4152
- sections.push([green("New"), ...adds.map(deltaLine)].join(`
4153
- `));
4154
- if (changes.length)
4155
- sections.push([yellow("Update"), ...changes.map(deltaLine)].join(`
4156
- `));
4157
- if (removes.length)
4158
- sections.push([red("Delete"), ...removes.map(deltaLine)].join(`
4159
- `));
4160
- return `${header}
3184
+ execSync("git init", { stdio: "ignore", cwd: targetDir });
3185
+ if (autoCreate?.enabled) {
3186
+ console.log(` \uD83C\uDF10 Creating CMS webapp in [${autoCreate.env}]...`);
3187
+ const provisioned = await provisionWebapp(projectName, autoCreate);
3188
+ writeProjectEnv(targetDir, provisioned);
3189
+ console.log(` \uD83D\uDD10 Wrote WEBAPP_ID and DEPLOY_TOKEN to .env`);
3190
+ console.log(` \uD83D\uDCCD Webapp ID: ${provisioned.webappId}`);
3191
+ try {
3192
+ const cmsUrl = resolveCmsUrl(autoCreate.env, autoCreate.cmsUrl);
3193
+ const raw = await fetchCmsConfig(cmsUrl, provisioned.webappId, provisioned.deployToken);
3194
+ writeProjectConfig(targetDir, sanitizeDetails(unwrapDetails(raw)));
3195
+ console.log(` \uD83D\uDCC4 Wrote webapp.config.json (pulled from CMS)`);
3196
+ } catch (err) {
3197
+ const msg = err instanceof Error ? err.message : String(err);
3198
+ console.warn(` ⚠️ Could not pull config from CMS (${msg}) — wrote empty webapp.config.json`);
3199
+ writeProjectConfig(targetDir, {});
3200
+ }
3201
+ } else {
3202
+ writeProjectConfig(targetDir, {});
3203
+ console.log(` \uD83D\uDCC4 Wrote webapp.config.json`);
3204
+ }
3205
+ console.log(`
3206
+ ✅ Project "${projectName}" created successfully!
4161
3207
 
4162
- ${sections.join(`
3208
+ Next steps:
4163
3209
 
4164
- `)}`;
3210
+ cd ${projectName}
3211
+ bun install
3212
+ bun run dev
3213
+ `);
4165
3214
  }
4166
3215
 
4167
- // src/config-file.ts
4168
- var DEFAULT_CONFIG_FILE = "webapp.config.json";
4169
- function isClearSignalEmpty(value) {
4170
- if (value === null)
4171
- return true;
4172
- if (Array.isArray(value) && value.length === 0)
4173
- return true;
4174
- if (isPlainObject(value) && Object.keys(value).length === 0)
4175
- return true;
4176
- return false;
4177
- }
4178
- function sanitizeDetails(details) {
4179
- const out = {};
4180
- for (const [key, value] of Object.entries(details)) {
4181
- if (isClearSignalEmpty(value))
4182
- continue;
4183
- out[key] = value;
4184
- }
4185
- return out;
4186
- }
4187
- function unwrapDetails(payload) {
4188
- if (isPlainObject(payload) && isPlainObject(payload.details)) {
4189
- return payload.details;
4190
- }
4191
- if (isPlainObject(payload) && "details" in payload)
4192
- return {};
4193
- if (isPlainObject(payload))
4194
- return payload;
4195
- return {};
4196
- }
4197
- function projectDetailsPatch(current, patch) {
4198
- const next = { ...current };
4199
- for (const [key, value] of Object.entries(patch)) {
4200
- if (isClearSignalEmpty(value)) {
4201
- delete next[key];
4202
- } else {
4203
- next[key] = value;
3216
+ // src/deploy.ts
3217
+ import { execSync as execSync2 } from "node:child_process";
3218
+ import { existsSync as existsSync7, readFileSync as readFileSync6, readdirSync, statSync, unlinkSync } from "node:fs";
3219
+ import { join as join2 } from "node:path";
3220
+
3221
+ // node_modules/mime/dist/types/other.js
3222
+ var types = {
3223
+ "application/prs.cww": ["cww"],
3224
+ "application/prs.xsf+xml": ["xsf"],
3225
+ "application/vnd.1000minds.decision-model+xml": ["1km"],
3226
+ "application/vnd.3gpp.pic-bw-large": ["plb"],
3227
+ "application/vnd.3gpp.pic-bw-small": ["psb"],
3228
+ "application/vnd.3gpp.pic-bw-var": ["pvb"],
3229
+ "application/vnd.3gpp2.tcap": ["tcap"],
3230
+ "application/vnd.3m.post-it-notes": ["pwn"],
3231
+ "application/vnd.accpac.simply.aso": ["aso"],
3232
+ "application/vnd.accpac.simply.imp": ["imp"],
3233
+ "application/vnd.acucobol": ["acu"],
3234
+ "application/vnd.acucorp": ["atc", "acutc"],
3235
+ "application/vnd.adobe.air-application-installer-package+zip": ["air"],
3236
+ "application/vnd.adobe.formscentral.fcdt": ["fcdt"],
3237
+ "application/vnd.adobe.fxp": ["fxp", "fxpl"],
3238
+ "application/vnd.adobe.xdp+xml": ["xdp"],
3239
+ "application/vnd.adobe.xfdf": ["*xfdf"],
3240
+ "application/vnd.age": ["age"],
3241
+ "application/vnd.ahead.space": ["ahead"],
3242
+ "application/vnd.airzip.filesecure.azf": ["azf"],
3243
+ "application/vnd.airzip.filesecure.azs": ["azs"],
3244
+ "application/vnd.amazon.ebook": ["azw"],
3245
+ "application/vnd.americandynamics.acc": ["acc"],
3246
+ "application/vnd.amiga.ami": ["ami"],
3247
+ "application/vnd.android.package-archive": ["apk"],
3248
+ "application/vnd.anser-web-certificate-issue-initiation": ["cii"],
3249
+ "application/vnd.anser-web-funds-transfer-initiation": ["fti"],
3250
+ "application/vnd.antix.game-component": ["atx"],
3251
+ "application/vnd.apple.installer+xml": ["mpkg"],
3252
+ "application/vnd.apple.keynote": ["key"],
3253
+ "application/vnd.apple.mpegurl": ["m3u8"],
3254
+ "application/vnd.apple.numbers": ["numbers"],
3255
+ "application/vnd.apple.pages": ["pages"],
3256
+ "application/vnd.apple.pkpass": ["pkpass"],
3257
+ "application/vnd.aristanetworks.swi": ["swi"],
3258
+ "application/vnd.astraea-software.iota": ["iota"],
3259
+ "application/vnd.audiograph": ["aep"],
3260
+ "application/vnd.autodesk.fbx": ["fbx"],
3261
+ "application/vnd.balsamiq.bmml+xml": ["bmml"],
3262
+ "application/vnd.blueice.multipass": ["mpm"],
3263
+ "application/vnd.bmi": ["bmi"],
3264
+ "application/vnd.businessobjects": ["rep"],
3265
+ "application/vnd.chemdraw+xml": ["cdxml"],
3266
+ "application/vnd.chipnuts.karaoke-mmd": ["mmd"],
3267
+ "application/vnd.cinderella": ["cdy"],
3268
+ "application/vnd.citationstyles.style+xml": ["csl"],
3269
+ "application/vnd.claymore": ["cla"],
3270
+ "application/vnd.cloanto.rp9": ["rp9"],
3271
+ "application/vnd.clonk.c4group": ["c4g", "c4d", "c4f", "c4p", "c4u"],
3272
+ "application/vnd.cluetrust.cartomobile-config": ["c11amc"],
3273
+ "application/vnd.cluetrust.cartomobile-config-pkg": ["c11amz"],
3274
+ "application/vnd.commonspace": ["csp"],
3275
+ "application/vnd.contact.cmsg": ["cdbcmsg"],
3276
+ "application/vnd.cosmocaller": ["cmc"],
3277
+ "application/vnd.crick.clicker": ["clkx"],
3278
+ "application/vnd.crick.clicker.keyboard": ["clkk"],
3279
+ "application/vnd.crick.clicker.palette": ["clkp"],
3280
+ "application/vnd.crick.clicker.template": ["clkt"],
3281
+ "application/vnd.crick.clicker.wordbank": ["clkw"],
3282
+ "application/vnd.criticaltools.wbs+xml": ["wbs"],
3283
+ "application/vnd.ctc-posml": ["pml"],
3284
+ "application/vnd.cups-ppd": ["ppd"],
3285
+ "application/vnd.curl.car": ["car"],
3286
+ "application/vnd.curl.pcurl": ["pcurl"],
3287
+ "application/vnd.dart": ["dart"],
3288
+ "application/vnd.data-vision.rdz": ["rdz"],
3289
+ "application/vnd.dbf": ["dbf"],
3290
+ "application/vnd.dcmp+xml": ["dcmp"],
3291
+ "application/vnd.dece.data": ["uvf", "uvvf", "uvd", "uvvd"],
3292
+ "application/vnd.dece.ttml+xml": ["uvt", "uvvt"],
3293
+ "application/vnd.dece.unspecified": ["uvx", "uvvx"],
3294
+ "application/vnd.dece.zip": ["uvz", "uvvz"],
3295
+ "application/vnd.denovo.fcselayout-link": ["fe_launch"],
3296
+ "application/vnd.dna": ["dna"],
3297
+ "application/vnd.dolby.mlp": ["mlp"],
3298
+ "application/vnd.dpgraph": ["dpg"],
3299
+ "application/vnd.dreamfactory": ["dfac"],
3300
+ "application/vnd.ds-keypoint": ["kpxx"],
3301
+ "application/vnd.dvb.ait": ["ait"],
3302
+ "application/vnd.dvb.service": ["svc"],
3303
+ "application/vnd.dynageo": ["geo"],
3304
+ "application/vnd.ecowin.chart": ["mag"],
3305
+ "application/vnd.enliven": ["nml"],
3306
+ "application/vnd.epson.esf": ["esf"],
3307
+ "application/vnd.epson.msf": ["msf"],
3308
+ "application/vnd.epson.quickanime": ["qam"],
3309
+ "application/vnd.epson.salt": ["slt"],
3310
+ "application/vnd.epson.ssf": ["ssf"],
3311
+ "application/vnd.eszigno3+xml": ["es3", "et3"],
3312
+ "application/vnd.ezpix-album": ["ez2"],
3313
+ "application/vnd.ezpix-package": ["ez3"],
3314
+ "application/vnd.fdf": ["*fdf"],
3315
+ "application/vnd.fdsn.mseed": ["mseed"],
3316
+ "application/vnd.fdsn.seed": ["seed", "dataless"],
3317
+ "application/vnd.flographit": ["gph"],
3318
+ "application/vnd.fluxtime.clip": ["ftc"],
3319
+ "application/vnd.framemaker": ["fm", "frame", "maker", "book"],
3320
+ "application/vnd.frogans.fnc": ["fnc"],
3321
+ "application/vnd.frogans.ltf": ["ltf"],
3322
+ "application/vnd.fsc.weblaunch": ["fsc"],
3323
+ "application/vnd.fujitsu.oasys": ["oas"],
3324
+ "application/vnd.fujitsu.oasys2": ["oa2"],
3325
+ "application/vnd.fujitsu.oasys3": ["oa3"],
3326
+ "application/vnd.fujitsu.oasysgp": ["fg5"],
3327
+ "application/vnd.fujitsu.oasysprs": ["bh2"],
3328
+ "application/vnd.fujixerox.ddd": ["ddd"],
3329
+ "application/vnd.fujixerox.docuworks": ["xdw"],
3330
+ "application/vnd.fujixerox.docuworks.binder": ["xbd"],
3331
+ "application/vnd.fuzzysheet": ["fzs"],
3332
+ "application/vnd.genomatix.tuxedo": ["txd"],
3333
+ "application/vnd.geogebra.file": ["ggb"],
3334
+ "application/vnd.geogebra.slides": ["ggs"],
3335
+ "application/vnd.geogebra.tool": ["ggt"],
3336
+ "application/vnd.geometry-explorer": ["gex", "gre"],
3337
+ "application/vnd.geonext": ["gxt"],
3338
+ "application/vnd.geoplan": ["g2w"],
3339
+ "application/vnd.geospace": ["g3w"],
3340
+ "application/vnd.gmx": ["gmx"],
3341
+ "application/vnd.google-apps.document": ["gdoc"],
3342
+ "application/vnd.google-apps.drawing": ["gdraw"],
3343
+ "application/vnd.google-apps.form": ["gform"],
3344
+ "application/vnd.google-apps.jam": ["gjam"],
3345
+ "application/vnd.google-apps.map": ["gmap"],
3346
+ "application/vnd.google-apps.presentation": ["gslides"],
3347
+ "application/vnd.google-apps.script": ["gscript"],
3348
+ "application/vnd.google-apps.site": ["gsite"],
3349
+ "application/vnd.google-apps.spreadsheet": ["gsheet"],
3350
+ "application/vnd.google-earth.kml+xml": ["kml"],
3351
+ "application/vnd.google-earth.kmz": ["kmz"],
3352
+ "application/vnd.gov.sk.xmldatacontainer+xml": ["xdcf"],
3353
+ "application/vnd.grafeq": ["gqf", "gqs"],
3354
+ "application/vnd.groove-account": ["gac"],
3355
+ "application/vnd.groove-help": ["ghf"],
3356
+ "application/vnd.groove-identity-message": ["gim"],
3357
+ "application/vnd.groove-injector": ["grv"],
3358
+ "application/vnd.groove-tool-message": ["gtm"],
3359
+ "application/vnd.groove-tool-template": ["tpl"],
3360
+ "application/vnd.groove-vcard": ["vcg"],
3361
+ "application/vnd.hal+xml": ["hal"],
3362
+ "application/vnd.handheld-entertainment+xml": ["zmm"],
3363
+ "application/vnd.hbci": ["hbci"],
3364
+ "application/vnd.hhe.lesson-player": ["les"],
3365
+ "application/vnd.hp-hpgl": ["hpgl"],
3366
+ "application/vnd.hp-hpid": ["hpid"],
3367
+ "application/vnd.hp-hps": ["hps"],
3368
+ "application/vnd.hp-jlyt": ["jlt"],
3369
+ "application/vnd.hp-pcl": ["pcl"],
3370
+ "application/vnd.hp-pclxl": ["pclxl"],
3371
+ "application/vnd.hydrostatix.sof-data": ["sfd-hdstx"],
3372
+ "application/vnd.ibm.minipay": ["mpy"],
3373
+ "application/vnd.ibm.modcap": ["afp", "listafp", "list3820"],
3374
+ "application/vnd.ibm.rights-management": ["irm"],
3375
+ "application/vnd.ibm.secure-container": ["sc"],
3376
+ "application/vnd.iccprofile": ["icc", "icm"],
3377
+ "application/vnd.igloader": ["igl"],
3378
+ "application/vnd.immervision-ivp": ["ivp"],
3379
+ "application/vnd.immervision-ivu": ["ivu"],
3380
+ "application/vnd.insors.igm": ["igm"],
3381
+ "application/vnd.intercon.formnet": ["xpw", "xpx"],
3382
+ "application/vnd.intergeo": ["i2g"],
3383
+ "application/vnd.intu.qbo": ["qbo"],
3384
+ "application/vnd.intu.qfx": ["qfx"],
3385
+ "application/vnd.ipunplugged.rcprofile": ["rcprofile"],
3386
+ "application/vnd.irepository.package+xml": ["irp"],
3387
+ "application/vnd.is-xpr": ["xpr"],
3388
+ "application/vnd.isac.fcs": ["fcs"],
3389
+ "application/vnd.jam": ["jam"],
3390
+ "application/vnd.jcp.javame.midlet-rms": ["rms"],
3391
+ "application/vnd.jisp": ["jisp"],
3392
+ "application/vnd.joost.joda-archive": ["joda"],
3393
+ "application/vnd.kahootz": ["ktz", "ktr"],
3394
+ "application/vnd.kde.karbon": ["karbon"],
3395
+ "application/vnd.kde.kchart": ["chrt"],
3396
+ "application/vnd.kde.kformula": ["kfo"],
3397
+ "application/vnd.kde.kivio": ["flw"],
3398
+ "application/vnd.kde.kontour": ["kon"],
3399
+ "application/vnd.kde.kpresenter": ["kpr", "kpt"],
3400
+ "application/vnd.kde.kspread": ["ksp"],
3401
+ "application/vnd.kde.kword": ["kwd", "kwt"],
3402
+ "application/vnd.kenameaapp": ["htke"],
3403
+ "application/vnd.kidspiration": ["kia"],
3404
+ "application/vnd.kinar": ["kne", "knp"],
3405
+ "application/vnd.koan": ["skp", "skd", "skt", "skm"],
3406
+ "application/vnd.kodak-descriptor": ["sse"],
3407
+ "application/vnd.las.las+xml": ["lasxml"],
3408
+ "application/vnd.llamagraphics.life-balance.desktop": ["lbd"],
3409
+ "application/vnd.llamagraphics.life-balance.exchange+xml": ["lbe"],
3410
+ "application/vnd.lotus-1-2-3": ["123"],
3411
+ "application/vnd.lotus-approach": ["apr"],
3412
+ "application/vnd.lotus-freelance": ["pre"],
3413
+ "application/vnd.lotus-notes": ["nsf"],
3414
+ "application/vnd.lotus-organizer": ["org"],
3415
+ "application/vnd.lotus-screencam": ["scm"],
3416
+ "application/vnd.lotus-wordpro": ["lwp"],
3417
+ "application/vnd.macports.portpkg": ["portpkg"],
3418
+ "application/vnd.mapbox-vector-tile": ["mvt"],
3419
+ "application/vnd.mcd": ["mcd"],
3420
+ "application/vnd.medcalcdata": ["mc1"],
3421
+ "application/vnd.mediastation.cdkey": ["cdkey"],
3422
+ "application/vnd.mfer": ["mwf"],
3423
+ "application/vnd.mfmp": ["mfm"],
3424
+ "application/vnd.micrografx.flo": ["flo"],
3425
+ "application/vnd.micrografx.igx": ["igx"],
3426
+ "application/vnd.mif": ["mif"],
3427
+ "application/vnd.mobius.daf": ["daf"],
3428
+ "application/vnd.mobius.dis": ["dis"],
3429
+ "application/vnd.mobius.mbk": ["mbk"],
3430
+ "application/vnd.mobius.mqy": ["mqy"],
3431
+ "application/vnd.mobius.msl": ["msl"],
3432
+ "application/vnd.mobius.plc": ["plc"],
3433
+ "application/vnd.mobius.txf": ["txf"],
3434
+ "application/vnd.mophun.application": ["mpn"],
3435
+ "application/vnd.mophun.certificate": ["mpc"],
3436
+ "application/vnd.mozilla.xul+xml": ["xul"],
3437
+ "application/vnd.ms-artgalry": ["cil"],
3438
+ "application/vnd.ms-cab-compressed": ["cab"],
3439
+ "application/vnd.ms-excel": ["xls", "xlm", "xla", "xlc", "xlt", "xlw"],
3440
+ "application/vnd.ms-excel.addin.macroenabled.12": ["xlam"],
3441
+ "application/vnd.ms-excel.sheet.binary.macroenabled.12": ["xlsb"],
3442
+ "application/vnd.ms-excel.sheet.macroenabled.12": ["xlsm"],
3443
+ "application/vnd.ms-excel.template.macroenabled.12": ["xltm"],
3444
+ "application/vnd.ms-fontobject": ["eot"],
3445
+ "application/vnd.ms-htmlhelp": ["chm"],
3446
+ "application/vnd.ms-ims": ["ims"],
3447
+ "application/vnd.ms-lrm": ["lrm"],
3448
+ "application/vnd.ms-officetheme": ["thmx"],
3449
+ "application/vnd.ms-outlook": ["msg"],
3450
+ "application/vnd.ms-pki.seccat": ["cat"],
3451
+ "application/vnd.ms-pki.stl": ["*stl"],
3452
+ "application/vnd.ms-powerpoint": ["ppt", "pps", "pot"],
3453
+ "application/vnd.ms-powerpoint.addin.macroenabled.12": ["ppam"],
3454
+ "application/vnd.ms-powerpoint.presentation.macroenabled.12": ["pptm"],
3455
+ "application/vnd.ms-powerpoint.slide.macroenabled.12": ["sldm"],
3456
+ "application/vnd.ms-powerpoint.slideshow.macroenabled.12": ["ppsm"],
3457
+ "application/vnd.ms-powerpoint.template.macroenabled.12": ["potm"],
3458
+ "application/vnd.ms-project": ["*mpp", "mpt"],
3459
+ "application/vnd.ms-visio.viewer": ["vdx"],
3460
+ "application/vnd.ms-word.document.macroenabled.12": ["docm"],
3461
+ "application/vnd.ms-word.template.macroenabled.12": ["dotm"],
3462
+ "application/vnd.ms-works": ["wps", "wks", "wcm", "wdb"],
3463
+ "application/vnd.ms-wpl": ["wpl"],
3464
+ "application/vnd.ms-xpsdocument": ["xps"],
3465
+ "application/vnd.mseq": ["mseq"],
3466
+ "application/vnd.musician": ["mus"],
3467
+ "application/vnd.muvee.style": ["msty"],
3468
+ "application/vnd.mynfc": ["taglet"],
3469
+ "application/vnd.nato.bindingdataobject+xml": ["bdo"],
3470
+ "application/vnd.neurolanguage.nlu": ["nlu"],
3471
+ "application/vnd.nitf": ["ntf", "nitf"],
3472
+ "application/vnd.noblenet-directory": ["nnd"],
3473
+ "application/vnd.noblenet-sealer": ["nns"],
3474
+ "application/vnd.noblenet-web": ["nnw"],
3475
+ "application/vnd.nokia.n-gage.ac+xml": ["*ac"],
3476
+ "application/vnd.nokia.n-gage.data": ["ngdat"],
3477
+ "application/vnd.nokia.n-gage.symbian.install": ["n-gage"],
3478
+ "application/vnd.nokia.radio-preset": ["rpst"],
3479
+ "application/vnd.nokia.radio-presets": ["rpss"],
3480
+ "application/vnd.novadigm.edm": ["edm"],
3481
+ "application/vnd.novadigm.edx": ["edx"],
3482
+ "application/vnd.novadigm.ext": ["ext"],
3483
+ "application/vnd.oasis.opendocument.chart": ["odc"],
3484
+ "application/vnd.oasis.opendocument.chart-template": ["otc"],
3485
+ "application/vnd.oasis.opendocument.database": ["odb"],
3486
+ "application/vnd.oasis.opendocument.formula": ["odf"],
3487
+ "application/vnd.oasis.opendocument.formula-template": ["odft"],
3488
+ "application/vnd.oasis.opendocument.graphics": ["odg"],
3489
+ "application/vnd.oasis.opendocument.graphics-template": ["otg"],
3490
+ "application/vnd.oasis.opendocument.image": ["odi"],
3491
+ "application/vnd.oasis.opendocument.image-template": ["oti"],
3492
+ "application/vnd.oasis.opendocument.presentation": ["odp"],
3493
+ "application/vnd.oasis.opendocument.presentation-template": ["otp"],
3494
+ "application/vnd.oasis.opendocument.spreadsheet": ["ods"],
3495
+ "application/vnd.oasis.opendocument.spreadsheet-template": ["ots"],
3496
+ "application/vnd.oasis.opendocument.text": ["odt"],
3497
+ "application/vnd.oasis.opendocument.text-master": ["odm"],
3498
+ "application/vnd.oasis.opendocument.text-template": ["ott"],
3499
+ "application/vnd.oasis.opendocument.text-web": ["oth"],
3500
+ "application/vnd.olpc-sugar": ["xo"],
3501
+ "application/vnd.oma.dd2+xml": ["dd2"],
3502
+ "application/vnd.openblox.game+xml": ["obgx"],
3503
+ "application/vnd.openofficeorg.extension": ["oxt"],
3504
+ "application/vnd.openstreetmap.data+xml": ["osm"],
3505
+ "application/vnd.openxmlformats-officedocument.presentationml.presentation": [
3506
+ "pptx"
3507
+ ],
3508
+ "application/vnd.openxmlformats-officedocument.presentationml.slide": [
3509
+ "sldx"
3510
+ ],
3511
+ "application/vnd.openxmlformats-officedocument.presentationml.slideshow": [
3512
+ "ppsx"
3513
+ ],
3514
+ "application/vnd.openxmlformats-officedocument.presentationml.template": [
3515
+ "potx"
3516
+ ],
3517
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": ["xlsx"],
3518
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.template": [
3519
+ "xltx"
3520
+ ],
3521
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [
3522
+ "docx"
3523
+ ],
3524
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.template": [
3525
+ "dotx"
3526
+ ],
3527
+ "application/vnd.osgeo.mapguide.package": ["mgp"],
3528
+ "application/vnd.osgi.dp": ["dp"],
3529
+ "application/vnd.osgi.subsystem": ["esa"],
3530
+ "application/vnd.palm": ["pdb", "pqa", "oprc"],
3531
+ "application/vnd.pawaafile": ["paw"],
3532
+ "application/vnd.pg.format": ["str"],
3533
+ "application/vnd.pg.osasli": ["ei6"],
3534
+ "application/vnd.picsel": ["efif"],
3535
+ "application/vnd.pmi.widget": ["wg"],
3536
+ "application/vnd.pocketlearn": ["plf"],
3537
+ "application/vnd.powerbuilder6": ["pbd"],
3538
+ "application/vnd.previewsystems.box": ["box"],
3539
+ "application/vnd.procrate.brushset": ["brushset"],
3540
+ "application/vnd.procreate.brush": ["brush"],
3541
+ "application/vnd.procreate.dream": ["drm"],
3542
+ "application/vnd.proteus.magazine": ["mgz"],
3543
+ "application/vnd.publishare-delta-tree": ["qps"],
3544
+ "application/vnd.pvi.ptid1": ["ptid"],
3545
+ "application/vnd.pwg-xhtml-print+xml": ["xhtm"],
3546
+ "application/vnd.quark.quarkxpress": [
3547
+ "qxd",
3548
+ "qxt",
3549
+ "qwd",
3550
+ "qwt",
3551
+ "qxl",
3552
+ "qxb"
3553
+ ],
3554
+ "application/vnd.rar": ["rar"],
3555
+ "application/vnd.realvnc.bed": ["bed"],
3556
+ "application/vnd.recordare.musicxml": ["mxl"],
3557
+ "application/vnd.recordare.musicxml+xml": ["musicxml"],
3558
+ "application/vnd.rig.cryptonote": ["cryptonote"],
3559
+ "application/vnd.rim.cod": ["cod"],
3560
+ "application/vnd.rn-realmedia": ["rm"],
3561
+ "application/vnd.rn-realmedia-vbr": ["rmvb"],
3562
+ "application/vnd.route66.link66+xml": ["link66"],
3563
+ "application/vnd.sailingtracker.track": ["st"],
3564
+ "application/vnd.seemail": ["see"],
3565
+ "application/vnd.sema": ["sema"],
3566
+ "application/vnd.semd": ["semd"],
3567
+ "application/vnd.semf": ["semf"],
3568
+ "application/vnd.shana.informed.formdata": ["ifm"],
3569
+ "application/vnd.shana.informed.formtemplate": ["itp"],
3570
+ "application/vnd.shana.informed.interchange": ["iif"],
3571
+ "application/vnd.shana.informed.package": ["ipk"],
3572
+ "application/vnd.simtech-mindmapper": ["twd", "twds"],
3573
+ "application/vnd.smaf": ["mmf"],
3574
+ "application/vnd.smart.teacher": ["teacher"],
3575
+ "application/vnd.software602.filler.form+xml": ["fo"],
3576
+ "application/vnd.solent.sdkm+xml": ["sdkm", "sdkd"],
3577
+ "application/vnd.spotfire.dxp": ["dxp"],
3578
+ "application/vnd.spotfire.sfs": ["sfs"],
3579
+ "application/vnd.stardivision.calc": ["sdc"],
3580
+ "application/vnd.stardivision.draw": ["sda"],
3581
+ "application/vnd.stardivision.impress": ["sdd"],
3582
+ "application/vnd.stardivision.math": ["smf"],
3583
+ "application/vnd.stardivision.writer": ["sdw", "vor"],
3584
+ "application/vnd.stardivision.writer-global": ["sgl"],
3585
+ "application/vnd.stepmania.package": ["smzip"],
3586
+ "application/vnd.stepmania.stepchart": ["sm"],
3587
+ "application/vnd.sun.wadl+xml": ["wadl"],
3588
+ "application/vnd.sun.xml.calc": ["sxc"],
3589
+ "application/vnd.sun.xml.calc.template": ["stc"],
3590
+ "application/vnd.sun.xml.draw": ["sxd"],
3591
+ "application/vnd.sun.xml.draw.template": ["std"],
3592
+ "application/vnd.sun.xml.impress": ["sxi"],
3593
+ "application/vnd.sun.xml.impress.template": ["sti"],
3594
+ "application/vnd.sun.xml.math": ["sxm"],
3595
+ "application/vnd.sun.xml.writer": ["sxw"],
3596
+ "application/vnd.sun.xml.writer.global": ["sxg"],
3597
+ "application/vnd.sun.xml.writer.template": ["stw"],
3598
+ "application/vnd.sus-calendar": ["sus", "susp"],
3599
+ "application/vnd.svd": ["svd"],
3600
+ "application/vnd.symbian.install": ["sis", "sisx"],
3601
+ "application/vnd.syncml+xml": ["xsm"],
3602
+ "application/vnd.syncml.dm+wbxml": ["bdm"],
3603
+ "application/vnd.syncml.dm+xml": ["xdm"],
3604
+ "application/vnd.syncml.dmddf+xml": ["ddf"],
3605
+ "application/vnd.tao.intent-module-archive": ["tao"],
3606
+ "application/vnd.tcpdump.pcap": ["pcap", "cap", "dmp"],
3607
+ "application/vnd.tmobile-livetv": ["tmo"],
3608
+ "application/vnd.trid.tpt": ["tpt"],
3609
+ "application/vnd.triscape.mxs": ["mxs"],
3610
+ "application/vnd.trueapp": ["tra"],
3611
+ "application/vnd.ufdl": ["ufd", "ufdl"],
3612
+ "application/vnd.uiq.theme": ["utz"],
3613
+ "application/vnd.umajin": ["umj"],
3614
+ "application/vnd.unity": ["unityweb"],
3615
+ "application/vnd.uoml+xml": ["uoml", "uo"],
3616
+ "application/vnd.vcx": ["vcx"],
3617
+ "application/vnd.visio": ["vsd", "vst", "vss", "vsw", "vsdx", "vtx"],
3618
+ "application/vnd.visionary": ["vis"],
3619
+ "application/vnd.vsf": ["vsf"],
3620
+ "application/vnd.wap.wbxml": ["wbxml"],
3621
+ "application/vnd.wap.wmlc": ["wmlc"],
3622
+ "application/vnd.wap.wmlscriptc": ["wmlsc"],
3623
+ "application/vnd.webturbo": ["wtb"],
3624
+ "application/vnd.wolfram.player": ["nbp"],
3625
+ "application/vnd.wordperfect": ["wpd"],
3626
+ "application/vnd.wqd": ["wqd"],
3627
+ "application/vnd.wt.stf": ["stf"],
3628
+ "application/vnd.xara": ["xar"],
3629
+ "application/vnd.xfdl": ["xfdl"],
3630
+ "application/vnd.yamaha.hv-dic": ["hvd"],
3631
+ "application/vnd.yamaha.hv-script": ["hvs"],
3632
+ "application/vnd.yamaha.hv-voice": ["hvp"],
3633
+ "application/vnd.yamaha.openscoreformat": ["osf"],
3634
+ "application/vnd.yamaha.openscoreformat.osfpvg+xml": ["osfpvg"],
3635
+ "application/vnd.yamaha.smaf-audio": ["saf"],
3636
+ "application/vnd.yamaha.smaf-phrase": ["spf"],
3637
+ "application/vnd.yellowriver-custom-menu": ["cmp"],
3638
+ "application/vnd.zul": ["zir", "zirz"],
3639
+ "application/vnd.zzazz.deck+xml": ["zaz"],
3640
+ "application/x-7z-compressed": ["7z"],
3641
+ "application/x-abiword": ["abw"],
3642
+ "application/x-ace-compressed": ["ace"],
3643
+ "application/x-apple-diskimage": ["*dmg"],
3644
+ "application/x-arj": ["arj"],
3645
+ "application/x-authorware-bin": ["aab", "x32", "u32", "vox"],
3646
+ "application/x-authorware-map": ["aam"],
3647
+ "application/x-authorware-seg": ["aas"],
3648
+ "application/x-bcpio": ["bcpio"],
3649
+ "application/x-bdoc": ["*bdoc"],
3650
+ "application/x-bittorrent": ["torrent"],
3651
+ "application/x-blender": ["blend"],
3652
+ "application/x-blorb": ["blb", "blorb"],
3653
+ "application/x-bzip": ["bz"],
3654
+ "application/x-bzip2": ["bz2", "boz"],
3655
+ "application/x-cbr": ["cbr", "cba", "cbt", "cbz", "cb7"],
3656
+ "application/x-cdlink": ["vcd"],
3657
+ "application/x-cfs-compressed": ["cfs"],
3658
+ "application/x-chat": ["chat"],
3659
+ "application/x-chess-pgn": ["pgn"],
3660
+ "application/x-chrome-extension": ["crx"],
3661
+ "application/x-cocoa": ["cco"],
3662
+ "application/x-compressed": ["*rar"],
3663
+ "application/x-conference": ["nsc"],
3664
+ "application/x-cpio": ["cpio"],
3665
+ "application/x-csh": ["csh"],
3666
+ "application/x-debian-package": ["*deb", "udeb"],
3667
+ "application/x-dgc-compressed": ["dgc"],
3668
+ "application/x-director": [
3669
+ "dir",
3670
+ "dcr",
3671
+ "dxr",
3672
+ "cst",
3673
+ "cct",
3674
+ "cxt",
3675
+ "w3d",
3676
+ "fgd",
3677
+ "swa"
3678
+ ],
3679
+ "application/x-doom": ["wad"],
3680
+ "application/x-dtbncx+xml": ["ncx"],
3681
+ "application/x-dtbook+xml": ["dtb"],
3682
+ "application/x-dtbresource+xml": ["res"],
3683
+ "application/x-dvi": ["dvi"],
3684
+ "application/x-envoy": ["evy"],
3685
+ "application/x-eva": ["eva"],
3686
+ "application/x-font-bdf": ["bdf"],
3687
+ "application/x-font-ghostscript": ["gsf"],
3688
+ "application/x-font-linux-psf": ["psf"],
3689
+ "application/x-font-pcf": ["pcf"],
3690
+ "application/x-font-snf": ["snf"],
3691
+ "application/x-font-type1": ["pfa", "pfb", "pfm", "afm"],
3692
+ "application/x-freearc": ["arc"],
3693
+ "application/x-futuresplash": ["spl"],
3694
+ "application/x-gca-compressed": ["gca"],
3695
+ "application/x-glulx": ["ulx"],
3696
+ "application/x-gnumeric": ["gnumeric"],
3697
+ "application/x-gramps-xml": ["gramps"],
3698
+ "application/x-gtar": ["gtar"],
3699
+ "application/x-hdf": ["hdf"],
3700
+ "application/x-httpd-php": ["php"],
3701
+ "application/x-install-instructions": ["install"],
3702
+ "application/x-ipynb+json": ["ipynb"],
3703
+ "application/x-iso9660-image": ["*iso"],
3704
+ "application/x-iwork-keynote-sffkey": ["*key"],
3705
+ "application/x-iwork-numbers-sffnumbers": ["*numbers"],
3706
+ "application/x-iwork-pages-sffpages": ["*pages"],
3707
+ "application/x-java-archive-diff": ["jardiff"],
3708
+ "application/x-java-jnlp-file": ["jnlp"],
3709
+ "application/x-keepass2": ["kdbx"],
3710
+ "application/x-latex": ["latex"],
3711
+ "application/x-lua-bytecode": ["luac"],
3712
+ "application/x-lzh-compressed": ["lzh", "lha"],
3713
+ "application/x-makeself": ["run"],
3714
+ "application/x-mie": ["mie"],
3715
+ "application/x-mobipocket-ebook": ["*prc", "mobi"],
3716
+ "application/x-ms-application": ["application"],
3717
+ "application/x-ms-shortcut": ["lnk"],
3718
+ "application/x-ms-wmd": ["wmd"],
3719
+ "application/x-ms-wmz": ["wmz"],
3720
+ "application/x-ms-xbap": ["xbap"],
3721
+ "application/x-msaccess": ["mdb"],
3722
+ "application/x-msbinder": ["obd"],
3723
+ "application/x-mscardfile": ["crd"],
3724
+ "application/x-msclip": ["clp"],
3725
+ "application/x-msdos-program": ["*exe"],
3726
+ "application/x-msdownload": ["*exe", "*dll", "com", "bat", "*msi"],
3727
+ "application/x-msmediaview": ["mvb", "m13", "m14"],
3728
+ "application/x-msmetafile": ["*wmf", "*wmz", "*emf", "emz"],
3729
+ "application/x-msmoney": ["mny"],
3730
+ "application/x-mspublisher": ["pub"],
3731
+ "application/x-msschedule": ["scd"],
3732
+ "application/x-msterminal": ["trm"],
3733
+ "application/x-mswrite": ["wri"],
3734
+ "application/x-netcdf": ["nc", "cdf"],
3735
+ "application/x-ns-proxy-autoconfig": ["pac"],
3736
+ "application/x-nzb": ["nzb"],
3737
+ "application/x-perl": ["pl", "pm"],
3738
+ "application/x-pilot": ["*prc", "*pdb"],
3739
+ "application/x-pkcs12": ["p12", "pfx"],
3740
+ "application/x-pkcs7-certificates": ["p7b", "spc"],
3741
+ "application/x-pkcs7-certreqresp": ["p7r"],
3742
+ "application/x-rar-compressed": ["*rar"],
3743
+ "application/x-redhat-package-manager": ["rpm"],
3744
+ "application/x-research-info-systems": ["ris"],
3745
+ "application/x-sea": ["sea"],
3746
+ "application/x-sh": ["sh"],
3747
+ "application/x-shar": ["shar"],
3748
+ "application/x-shockwave-flash": ["swf"],
3749
+ "application/x-silverlight-app": ["xap"],
3750
+ "application/x-sql": ["*sql"],
3751
+ "application/x-stuffit": ["sit"],
3752
+ "application/x-stuffitx": ["sitx"],
3753
+ "application/x-subrip": ["srt"],
3754
+ "application/x-sv4cpio": ["sv4cpio"],
3755
+ "application/x-sv4crc": ["sv4crc"],
3756
+ "application/x-t3vm-image": ["t3"],
3757
+ "application/x-tads": ["gam"],
3758
+ "application/x-tar": ["tar"],
3759
+ "application/x-tcl": ["tcl", "tk"],
3760
+ "application/x-tex": ["tex"],
3761
+ "application/x-tex-tfm": ["tfm"],
3762
+ "application/x-texinfo": ["texinfo", "texi"],
3763
+ "application/x-tgif": ["*obj"],
3764
+ "application/x-ustar": ["ustar"],
3765
+ "application/x-virtualbox-hdd": ["hdd"],
3766
+ "application/x-virtualbox-ova": ["ova"],
3767
+ "application/x-virtualbox-ovf": ["ovf"],
3768
+ "application/x-virtualbox-vbox": ["vbox"],
3769
+ "application/x-virtualbox-vbox-extpack": ["vbox-extpack"],
3770
+ "application/x-virtualbox-vdi": ["vdi"],
3771
+ "application/x-virtualbox-vhd": ["vhd"],
3772
+ "application/x-virtualbox-vmdk": ["vmdk"],
3773
+ "application/x-wais-source": ["src"],
3774
+ "application/x-web-app-manifest+json": ["webapp"],
3775
+ "application/x-x509-ca-cert": ["der", "crt", "pem"],
3776
+ "application/x-xfig": ["fig"],
3777
+ "application/x-xliff+xml": ["*xlf"],
3778
+ "application/x-xpinstall": ["xpi"],
3779
+ "application/x-xz": ["xz"],
3780
+ "application/x-zip-compressed": ["*zip"],
3781
+ "application/x-zmachine": ["z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"],
3782
+ "audio/vnd.dece.audio": ["uva", "uvva"],
3783
+ "audio/vnd.digital-winds": ["eol"],
3784
+ "audio/vnd.dra": ["dra"],
3785
+ "audio/vnd.dts": ["dts"],
3786
+ "audio/vnd.dts.hd": ["dtshd"],
3787
+ "audio/vnd.lucent.voice": ["lvp"],
3788
+ "audio/vnd.ms-playready.media.pya": ["pya"],
3789
+ "audio/vnd.nuera.ecelp4800": ["ecelp4800"],
3790
+ "audio/vnd.nuera.ecelp7470": ["ecelp7470"],
3791
+ "audio/vnd.nuera.ecelp9600": ["ecelp9600"],
3792
+ "audio/vnd.rip": ["rip"],
3793
+ "audio/x-aac": ["*aac"],
3794
+ "audio/x-aiff": ["aif", "aiff", "aifc"],
3795
+ "audio/x-caf": ["caf"],
3796
+ "audio/x-flac": ["flac"],
3797
+ "audio/x-m4a": ["*m4a"],
3798
+ "audio/x-matroska": ["mka"],
3799
+ "audio/x-mpegurl": ["m3u"],
3800
+ "audio/x-ms-wax": ["wax"],
3801
+ "audio/x-ms-wma": ["wma"],
3802
+ "audio/x-pn-realaudio": ["ram", "ra"],
3803
+ "audio/x-pn-realaudio-plugin": ["rmp"],
3804
+ "audio/x-realaudio": ["*ra"],
3805
+ "audio/x-wav": ["*wav"],
3806
+ "chemical/x-cdx": ["cdx"],
3807
+ "chemical/x-cif": ["cif"],
3808
+ "chemical/x-cmdf": ["cmdf"],
3809
+ "chemical/x-cml": ["cml"],
3810
+ "chemical/x-csml": ["csml"],
3811
+ "chemical/x-xyz": ["xyz"],
3812
+ "image/prs.btif": ["btif", "btf"],
3813
+ "image/prs.pti": ["pti"],
3814
+ "image/vnd.adobe.photoshop": ["psd"],
3815
+ "image/vnd.airzip.accelerator.azv": ["azv"],
3816
+ "image/vnd.blockfact.facti": ["facti"],
3817
+ "image/vnd.dece.graphic": ["uvi", "uvvi", "uvg", "uvvg"],
3818
+ "image/vnd.djvu": ["djvu", "djv"],
3819
+ "image/vnd.dvb.subtitle": ["*sub"],
3820
+ "image/vnd.dwg": ["dwg"],
3821
+ "image/vnd.dxf": ["dxf"],
3822
+ "image/vnd.fastbidsheet": ["fbs"],
3823
+ "image/vnd.fpx": ["fpx"],
3824
+ "image/vnd.fst": ["fst"],
3825
+ "image/vnd.fujixerox.edmics-mmr": ["mmr"],
3826
+ "image/vnd.fujixerox.edmics-rlc": ["rlc"],
3827
+ "image/vnd.microsoft.icon": ["ico"],
3828
+ "image/vnd.ms-dds": ["dds"],
3829
+ "image/vnd.ms-modi": ["mdi"],
3830
+ "image/vnd.ms-photo": ["wdp"],
3831
+ "image/vnd.net-fpx": ["npx"],
3832
+ "image/vnd.pco.b16": ["b16"],
3833
+ "image/vnd.tencent.tap": ["tap"],
3834
+ "image/vnd.valve.source.texture": ["vtf"],
3835
+ "image/vnd.wap.wbmp": ["wbmp"],
3836
+ "image/vnd.xiff": ["xif"],
3837
+ "image/vnd.zbrush.pcx": ["pcx"],
3838
+ "image/x-3ds": ["3ds"],
3839
+ "image/x-adobe-dng": ["dng"],
3840
+ "image/x-cmu-raster": ["ras"],
3841
+ "image/x-cmx": ["cmx"],
3842
+ "image/x-freehand": ["fh", "fhc", "fh4", "fh5", "fh7"],
3843
+ "image/x-icon": ["*ico"],
3844
+ "image/x-jng": ["jng"],
3845
+ "image/x-mrsid-image": ["sid"],
3846
+ "image/x-ms-bmp": ["*bmp"],
3847
+ "image/x-pcx": ["*pcx"],
3848
+ "image/x-pict": ["pic", "pct"],
3849
+ "image/x-portable-anymap": ["pnm"],
3850
+ "image/x-portable-bitmap": ["pbm"],
3851
+ "image/x-portable-graymap": ["pgm"],
3852
+ "image/x-portable-pixmap": ["ppm"],
3853
+ "image/x-rgb": ["rgb"],
3854
+ "image/x-tga": ["tga"],
3855
+ "image/x-xbitmap": ["xbm"],
3856
+ "image/x-xpixmap": ["xpm"],
3857
+ "image/x-xwindowdump": ["xwd"],
3858
+ "message/vnd.wfa.wsc": ["wsc"],
3859
+ "model/vnd.bary": ["bary"],
3860
+ "model/vnd.cld": ["cld"],
3861
+ "model/vnd.collada+xml": ["dae"],
3862
+ "model/vnd.dwf": ["dwf"],
3863
+ "model/vnd.gdl": ["gdl"],
3864
+ "model/vnd.gtw": ["gtw"],
3865
+ "model/vnd.mts": ["*mts"],
3866
+ "model/vnd.opengex": ["ogex"],
3867
+ "model/vnd.parasolid.transmit.binary": ["x_b"],
3868
+ "model/vnd.parasolid.transmit.text": ["x_t"],
3869
+ "model/vnd.pytha.pyox": ["pyo", "pyox"],
3870
+ "model/vnd.sap.vds": ["vds"],
3871
+ "model/vnd.usda": ["usda"],
3872
+ "model/vnd.usdz+zip": ["usdz"],
3873
+ "model/vnd.valve.source.compiled-map": ["bsp"],
3874
+ "model/vnd.vtu": ["vtu"],
3875
+ "text/prs.lines.tag": ["dsc"],
3876
+ "text/vnd.curl": ["curl"],
3877
+ "text/vnd.curl.dcurl": ["dcurl"],
3878
+ "text/vnd.curl.mcurl": ["mcurl"],
3879
+ "text/vnd.curl.scurl": ["scurl"],
3880
+ "text/vnd.dvb.subtitle": ["sub"],
3881
+ "text/vnd.familysearch.gedcom": ["ged"],
3882
+ "text/vnd.fly": ["fly"],
3883
+ "text/vnd.fmi.flexstor": ["flx"],
3884
+ "text/vnd.graphviz": ["gv"],
3885
+ "text/vnd.in3d.3dml": ["3dml"],
3886
+ "text/vnd.in3d.spot": ["spot"],
3887
+ "text/vnd.sun.j2me.app-descriptor": ["jad"],
3888
+ "text/vnd.wap.wml": ["wml"],
3889
+ "text/vnd.wap.wmlscript": ["wmls"],
3890
+ "text/x-asm": ["s", "asm"],
3891
+ "text/x-c": ["c", "cc", "cxx", "cpp", "h", "hh", "dic"],
3892
+ "text/x-component": ["htc"],
3893
+ "text/x-fortran": ["f", "for", "f77", "f90"],
3894
+ "text/x-handlebars-template": ["hbs"],
3895
+ "text/x-java-source": ["java"],
3896
+ "text/x-lua": ["lua"],
3897
+ "text/x-markdown": ["mkd"],
3898
+ "text/x-nfo": ["nfo"],
3899
+ "text/x-opml": ["opml"],
3900
+ "text/x-org": ["*org"],
3901
+ "text/x-pascal": ["p", "pas"],
3902
+ "text/x-processing": ["pde"],
3903
+ "text/x-sass": ["sass"],
3904
+ "text/x-scss": ["scss"],
3905
+ "text/x-setext": ["etx"],
3906
+ "text/x-sfv": ["sfv"],
3907
+ "text/x-suse-ymp": ["ymp"],
3908
+ "text/x-uuencode": ["uu"],
3909
+ "text/x-vcalendar": ["vcs"],
3910
+ "text/x-vcard": ["vcf"],
3911
+ "video/vnd.dece.hd": ["uvh", "uvvh"],
3912
+ "video/vnd.dece.mobile": ["uvm", "uvvm"],
3913
+ "video/vnd.dece.pd": ["uvp", "uvvp"],
3914
+ "video/vnd.dece.sd": ["uvs", "uvvs"],
3915
+ "video/vnd.dece.video": ["uvv", "uvvv"],
3916
+ "video/vnd.dvb.file": ["dvb"],
3917
+ "video/vnd.fvt": ["fvt"],
3918
+ "video/vnd.mpegurl": ["mxu", "m4u"],
3919
+ "video/vnd.ms-playready.media.pyv": ["pyv"],
3920
+ "video/vnd.uvvu.mp4": ["uvu", "uvvu"],
3921
+ "video/vnd.vivo": ["viv"],
3922
+ "video/x-f4v": ["f4v"],
3923
+ "video/x-fli": ["fli"],
3924
+ "video/x-flv": ["flv"],
3925
+ "video/x-m4v": ["m4v"],
3926
+ "video/x-matroska": ["mkv", "mk3d", "mks"],
3927
+ "video/x-mng": ["mng"],
3928
+ "video/x-ms-asf": ["asf", "asx"],
3929
+ "video/x-ms-vob": ["vob"],
3930
+ "video/x-ms-wm": ["wm"],
3931
+ "video/x-ms-wmv": ["wmv"],
3932
+ "video/x-ms-wmx": ["wmx"],
3933
+ "video/x-ms-wvx": ["wvx"],
3934
+ "video/x-msvideo": ["avi"],
3935
+ "video/x-sgi-movie": ["movie"],
3936
+ "video/x-smv": ["smv"],
3937
+ "x-conference/x-cooltalk": ["ice"]
3938
+ };
3939
+ Object.freeze(types);
3940
+ var other_default = types;
3941
+
3942
+ // node_modules/mime/dist/types/standard.js
3943
+ var types2 = {
3944
+ "application/andrew-inset": ["ez"],
3945
+ "application/appinstaller": ["appinstaller"],
3946
+ "application/applixware": ["aw"],
3947
+ "application/appx": ["appx"],
3948
+ "application/appxbundle": ["appxbundle"],
3949
+ "application/atom+xml": ["atom"],
3950
+ "application/atomcat+xml": ["atomcat"],
3951
+ "application/atomdeleted+xml": ["atomdeleted"],
3952
+ "application/atomsvc+xml": ["atomsvc"],
3953
+ "application/atsc-dwd+xml": ["dwd"],
3954
+ "application/atsc-held+xml": ["held"],
3955
+ "application/atsc-rsat+xml": ["rsat"],
3956
+ "application/automationml-aml+xml": ["aml"],
3957
+ "application/automationml-amlx+zip": ["amlx"],
3958
+ "application/bdoc": ["bdoc"],
3959
+ "application/calendar+xml": ["xcs"],
3960
+ "application/ccxml+xml": ["ccxml"],
3961
+ "application/cdfx+xml": ["cdfx"],
3962
+ "application/cdmi-capability": ["cdmia"],
3963
+ "application/cdmi-container": ["cdmic"],
3964
+ "application/cdmi-domain": ["cdmid"],
3965
+ "application/cdmi-object": ["cdmio"],
3966
+ "application/cdmi-queue": ["cdmiq"],
3967
+ "application/cpl+xml": ["cpl"],
3968
+ "application/cu-seeme": ["cu"],
3969
+ "application/cwl": ["cwl"],
3970
+ "application/dash+xml": ["mpd"],
3971
+ "application/dash-patch+xml": ["mpp"],
3972
+ "application/davmount+xml": ["davmount"],
3973
+ "application/dicom": ["dcm"],
3974
+ "application/docbook+xml": ["dbk"],
3975
+ "application/dssc+der": ["dssc"],
3976
+ "application/dssc+xml": ["xdssc"],
3977
+ "application/ecmascript": ["ecma"],
3978
+ "application/emma+xml": ["emma"],
3979
+ "application/emotionml+xml": ["emotionml"],
3980
+ "application/epub+zip": ["epub"],
3981
+ "application/exi": ["exi"],
3982
+ "application/express": ["exp"],
3983
+ "application/fdf": ["fdf"],
3984
+ "application/fdt+xml": ["fdt"],
3985
+ "application/font-tdpfr": ["pfr"],
3986
+ "application/geo+json": ["geojson"],
3987
+ "application/gml+xml": ["gml"],
3988
+ "application/gpx+xml": ["gpx"],
3989
+ "application/gxf": ["gxf"],
3990
+ "application/gzip": ["gz"],
3991
+ "application/hjson": ["hjson"],
3992
+ "application/hyperstudio": ["stk"],
3993
+ "application/inkml+xml": ["ink", "inkml"],
3994
+ "application/ipfix": ["ipfix"],
3995
+ "application/its+xml": ["its"],
3996
+ "application/java-archive": ["jar", "war", "ear"],
3997
+ "application/java-serialized-object": ["ser"],
3998
+ "application/java-vm": ["class"],
3999
+ "application/javascript": ["*js"],
4000
+ "application/json": ["json", "map"],
4001
+ "application/json5": ["json5"],
4002
+ "application/jsonml+json": ["jsonml"],
4003
+ "application/ld+json": ["jsonld"],
4004
+ "application/lgr+xml": ["lgr"],
4005
+ "application/lost+xml": ["lostxml"],
4006
+ "application/mac-binhex40": ["hqx"],
4007
+ "application/mac-compactpro": ["cpt"],
4008
+ "application/mads+xml": ["mads"],
4009
+ "application/manifest+json": ["webmanifest"],
4010
+ "application/marc": ["mrc"],
4011
+ "application/marcxml+xml": ["mrcx"],
4012
+ "application/mathematica": ["ma", "nb", "mb"],
4013
+ "application/mathml+xml": ["mathml"],
4014
+ "application/mbox": ["mbox"],
4015
+ "application/media-policy-dataset+xml": ["mpf"],
4016
+ "application/mediaservercontrol+xml": ["mscml"],
4017
+ "application/metalink+xml": ["metalink"],
4018
+ "application/metalink4+xml": ["meta4"],
4019
+ "application/mets+xml": ["mets"],
4020
+ "application/mmt-aei+xml": ["maei"],
4021
+ "application/mmt-usd+xml": ["musd"],
4022
+ "application/mods+xml": ["mods"],
4023
+ "application/mp21": ["m21", "mp21"],
4024
+ "application/mp4": ["*mp4", "*mpg4", "mp4s", "m4p"],
4025
+ "application/msix": ["msix"],
4026
+ "application/msixbundle": ["msixbundle"],
4027
+ "application/msword": ["doc", "dot"],
4028
+ "application/mxf": ["mxf"],
4029
+ "application/n-quads": ["nq"],
4030
+ "application/n-triples": ["nt"],
4031
+ "application/node": ["cjs"],
4032
+ "application/octet-stream": [
4033
+ "bin",
4034
+ "dms",
4035
+ "lrf",
4036
+ "mar",
4037
+ "so",
4038
+ "dist",
4039
+ "distz",
4040
+ "pkg",
4041
+ "bpk",
4042
+ "dump",
4043
+ "elc",
4044
+ "deploy",
4045
+ "exe",
4046
+ "dll",
4047
+ "deb",
4048
+ "dmg",
4049
+ "iso",
4050
+ "img",
4051
+ "msi",
4052
+ "msp",
4053
+ "msm",
4054
+ "buffer"
4055
+ ],
4056
+ "application/oda": ["oda"],
4057
+ "application/oebps-package+xml": ["opf"],
4058
+ "application/ogg": ["ogx"],
4059
+ "application/omdoc+xml": ["omdoc"],
4060
+ "application/onenote": [
4061
+ "onetoc",
4062
+ "onetoc2",
4063
+ "onetmp",
4064
+ "onepkg",
4065
+ "one",
4066
+ "onea"
4067
+ ],
4068
+ "application/oxps": ["oxps"],
4069
+ "application/p2p-overlay+xml": ["relo"],
4070
+ "application/patch-ops-error+xml": ["xer"],
4071
+ "application/pdf": ["pdf"],
4072
+ "application/pgp-encrypted": ["pgp"],
4073
+ "application/pgp-keys": ["asc"],
4074
+ "application/pgp-signature": ["sig", "*asc"],
4075
+ "application/pics-rules": ["prf"],
4076
+ "application/pkcs10": ["p10"],
4077
+ "application/pkcs7-mime": ["p7m", "p7c"],
4078
+ "application/pkcs7-signature": ["p7s"],
4079
+ "application/pkcs8": ["p8"],
4080
+ "application/pkix-attr-cert": ["ac"],
4081
+ "application/pkix-cert": ["cer"],
4082
+ "application/pkix-crl": ["crl"],
4083
+ "application/pkix-pkipath": ["pkipath"],
4084
+ "application/pkixcmp": ["pki"],
4085
+ "application/pls+xml": ["pls"],
4086
+ "application/postscript": ["ai", "eps", "ps"],
4087
+ "application/provenance+xml": ["provx"],
4088
+ "application/pskc+xml": ["pskcxml"],
4089
+ "application/raml+yaml": ["raml"],
4090
+ "application/rdf+xml": ["rdf", "owl"],
4091
+ "application/reginfo+xml": ["rif"],
4092
+ "application/relax-ng-compact-syntax": ["rnc"],
4093
+ "application/resource-lists+xml": ["rl"],
4094
+ "application/resource-lists-diff+xml": ["rld"],
4095
+ "application/rls-services+xml": ["rs"],
4096
+ "application/route-apd+xml": ["rapd"],
4097
+ "application/route-s-tsid+xml": ["sls"],
4098
+ "application/route-usd+xml": ["rusd"],
4099
+ "application/rpki-ghostbusters": ["gbr"],
4100
+ "application/rpki-manifest": ["mft"],
4101
+ "application/rpki-roa": ["roa"],
4102
+ "application/rsd+xml": ["rsd"],
4103
+ "application/rss+xml": ["rss"],
4104
+ "application/rtf": ["rtf"],
4105
+ "application/sbml+xml": ["sbml"],
4106
+ "application/scvp-cv-request": ["scq"],
4107
+ "application/scvp-cv-response": ["scs"],
4108
+ "application/scvp-vp-request": ["spq"],
4109
+ "application/scvp-vp-response": ["spp"],
4110
+ "application/sdp": ["sdp"],
4111
+ "application/senml+xml": ["senmlx"],
4112
+ "application/sensml+xml": ["sensmlx"],
4113
+ "application/set-payment-initiation": ["setpay"],
4114
+ "application/set-registration-initiation": ["setreg"],
4115
+ "application/shf+xml": ["shf"],
4116
+ "application/sieve": ["siv", "sieve"],
4117
+ "application/smil+xml": ["smi", "smil"],
4118
+ "application/sparql-query": ["rq"],
4119
+ "application/sparql-results+xml": ["srx"],
4120
+ "application/sql": ["sql"],
4121
+ "application/srgs": ["gram"],
4122
+ "application/srgs+xml": ["grxml"],
4123
+ "application/sru+xml": ["sru"],
4124
+ "application/ssdl+xml": ["ssdl"],
4125
+ "application/ssml+xml": ["ssml"],
4126
+ "application/swid+xml": ["swidtag"],
4127
+ "application/tei+xml": ["tei", "teicorpus"],
4128
+ "application/thraud+xml": ["tfi"],
4129
+ "application/timestamped-data": ["tsd"],
4130
+ "application/toml": ["toml"],
4131
+ "application/trig": ["trig"],
4132
+ "application/ttml+xml": ["ttml"],
4133
+ "application/ubjson": ["ubj"],
4134
+ "application/urc-ressheet+xml": ["rsheet"],
4135
+ "application/urc-targetdesc+xml": ["td"],
4136
+ "application/voicexml+xml": ["vxml"],
4137
+ "application/wasm": ["wasm"],
4138
+ "application/watcherinfo+xml": ["wif"],
4139
+ "application/widget": ["wgt"],
4140
+ "application/winhlp": ["hlp"],
4141
+ "application/wsdl+xml": ["wsdl"],
4142
+ "application/wspolicy+xml": ["wspolicy"],
4143
+ "application/xaml+xml": ["xaml"],
4144
+ "application/xcap-att+xml": ["xav"],
4145
+ "application/xcap-caps+xml": ["xca"],
4146
+ "application/xcap-diff+xml": ["xdf"],
4147
+ "application/xcap-el+xml": ["xel"],
4148
+ "application/xcap-ns+xml": ["xns"],
4149
+ "application/xenc+xml": ["xenc"],
4150
+ "application/xfdf": ["xfdf"],
4151
+ "application/xhtml+xml": ["xhtml", "xht"],
4152
+ "application/xliff+xml": ["xlf"],
4153
+ "application/xml": ["xml", "xsl", "xsd", "rng"],
4154
+ "application/xml-dtd": ["dtd"],
4155
+ "application/xop+xml": ["xop"],
4156
+ "application/xproc+xml": ["xpl"],
4157
+ "application/xslt+xml": ["*xsl", "xslt"],
4158
+ "application/xspf+xml": ["xspf"],
4159
+ "application/xv+xml": ["mxml", "xhvml", "xvml", "xvm"],
4160
+ "application/yang": ["yang"],
4161
+ "application/yin+xml": ["yin"],
4162
+ "application/zip": ["zip"],
4163
+ "application/zip+dotlottie": ["lottie"],
4164
+ "audio/3gpp": ["*3gpp"],
4165
+ "audio/aac": ["adts", "aac"],
4166
+ "audio/adpcm": ["adp"],
4167
+ "audio/amr": ["amr"],
4168
+ "audio/basic": ["au", "snd"],
4169
+ "audio/midi": ["mid", "midi", "kar", "rmi"],
4170
+ "audio/mobile-xmf": ["mxmf"],
4171
+ "audio/mp3": ["*mp3"],
4172
+ "audio/mp4": ["m4a", "mp4a", "m4b"],
4173
+ "audio/mpeg": ["mpga", "mp2", "mp2a", "mp3", "m2a", "m3a"],
4174
+ "audio/ogg": ["oga", "ogg", "spx", "opus"],
4175
+ "audio/s3m": ["s3m"],
4176
+ "audio/silk": ["sil"],
4177
+ "audio/wav": ["wav"],
4178
+ "audio/wave": ["*wav"],
4179
+ "audio/webm": ["weba"],
4180
+ "audio/xm": ["xm"],
4181
+ "font/collection": ["ttc"],
4182
+ "font/otf": ["otf"],
4183
+ "font/ttf": ["ttf"],
4184
+ "font/woff": ["woff"],
4185
+ "font/woff2": ["woff2"],
4186
+ "image/aces": ["exr"],
4187
+ "image/apng": ["apng"],
4188
+ "image/avci": ["avci"],
4189
+ "image/avcs": ["avcs"],
4190
+ "image/avif": ["avif"],
4191
+ "image/bmp": ["bmp", "dib"],
4192
+ "image/cgm": ["cgm"],
4193
+ "image/dicom-rle": ["drle"],
4194
+ "image/dpx": ["dpx"],
4195
+ "image/emf": ["emf"],
4196
+ "image/fits": ["fits"],
4197
+ "image/g3fax": ["g3"],
4198
+ "image/gif": ["gif"],
4199
+ "image/heic": ["heic"],
4200
+ "image/heic-sequence": ["heics"],
4201
+ "image/heif": ["heif"],
4202
+ "image/heif-sequence": ["heifs"],
4203
+ "image/hej2k": ["hej2"],
4204
+ "image/ief": ["ief"],
4205
+ "image/jaii": ["jaii"],
4206
+ "image/jais": ["jais"],
4207
+ "image/jls": ["jls"],
4208
+ "image/jp2": ["jp2", "jpg2"],
4209
+ "image/jpeg": ["jpg", "jpeg", "jpe"],
4210
+ "image/jph": ["jph"],
4211
+ "image/jphc": ["jhc"],
4212
+ "image/jpm": ["jpm", "jpgm"],
4213
+ "image/jpx": ["jpx", "jpf"],
4214
+ "image/jxl": ["jxl"],
4215
+ "image/jxr": ["jxr"],
4216
+ "image/jxra": ["jxra"],
4217
+ "image/jxrs": ["jxrs"],
4218
+ "image/jxs": ["jxs"],
4219
+ "image/jxsc": ["jxsc"],
4220
+ "image/jxsi": ["jxsi"],
4221
+ "image/jxss": ["jxss"],
4222
+ "image/ktx": ["ktx"],
4223
+ "image/ktx2": ["ktx2"],
4224
+ "image/pjpeg": ["jfif"],
4225
+ "image/png": ["png"],
4226
+ "image/sgi": ["sgi"],
4227
+ "image/svg+xml": ["svg", "svgz"],
4228
+ "image/t38": ["t38"],
4229
+ "image/tiff": ["tif", "tiff"],
4230
+ "image/tiff-fx": ["tfx"],
4231
+ "image/webp": ["webp"],
4232
+ "image/wmf": ["wmf"],
4233
+ "message/disposition-notification": ["disposition-notification"],
4234
+ "message/global": ["u8msg"],
4235
+ "message/global-delivery-status": ["u8dsn"],
4236
+ "message/global-disposition-notification": ["u8mdn"],
4237
+ "message/global-headers": ["u8hdr"],
4238
+ "message/rfc822": ["eml", "mime", "mht", "mhtml"],
4239
+ "model/3mf": ["3mf"],
4240
+ "model/gltf+json": ["gltf"],
4241
+ "model/gltf-binary": ["glb"],
4242
+ "model/iges": ["igs", "iges"],
4243
+ "model/jt": ["jt"],
4244
+ "model/mesh": ["msh", "mesh", "silo"],
4245
+ "model/mtl": ["mtl"],
4246
+ "model/obj": ["obj"],
4247
+ "model/prc": ["prc"],
4248
+ "model/step": ["step", "stp", "stpnc", "p21", "210"],
4249
+ "model/step+xml": ["stpx"],
4250
+ "model/step+zip": ["stpz"],
4251
+ "model/step-xml+zip": ["stpxz"],
4252
+ "model/stl": ["stl"],
4253
+ "model/u3d": ["u3d"],
4254
+ "model/vrml": ["wrl", "vrml"],
4255
+ "model/x3d+binary": ["*x3db", "x3dbz"],
4256
+ "model/x3d+fastinfoset": ["x3db"],
4257
+ "model/x3d+vrml": ["*x3dv", "x3dvz"],
4258
+ "model/x3d+xml": ["x3d", "x3dz"],
4259
+ "model/x3d-vrml": ["x3dv"],
4260
+ "text/cache-manifest": ["appcache", "manifest"],
4261
+ "text/calendar": ["ics", "ifb"],
4262
+ "text/coffeescript": ["coffee", "litcoffee"],
4263
+ "text/css": ["css"],
4264
+ "text/csv": ["csv"],
4265
+ "text/html": ["html", "htm", "shtml"],
4266
+ "text/jade": ["jade"],
4267
+ "text/javascript": ["js", "mjs"],
4268
+ "text/jsx": ["jsx"],
4269
+ "text/less": ["less"],
4270
+ "text/markdown": ["md", "markdown"],
4271
+ "text/mathml": ["mml"],
4272
+ "text/mdx": ["mdx"],
4273
+ "text/n3": ["n3"],
4274
+ "text/plain": ["txt", "text", "conf", "def", "list", "log", "in", "ini"],
4275
+ "text/richtext": ["rtx"],
4276
+ "text/rtf": ["*rtf"],
4277
+ "text/sgml": ["sgml", "sgm"],
4278
+ "text/shex": ["shex"],
4279
+ "text/slim": ["slim", "slm"],
4280
+ "text/spdx": ["spdx"],
4281
+ "text/stylus": ["stylus", "styl"],
4282
+ "text/tab-separated-values": ["tsv"],
4283
+ "text/troff": ["t", "tr", "roff", "man", "me", "ms"],
4284
+ "text/turtle": ["ttl"],
4285
+ "text/uri-list": ["uri", "uris", "urls"],
4286
+ "text/vcard": ["vcard"],
4287
+ "text/vtt": ["vtt"],
4288
+ "text/wgsl": ["wgsl"],
4289
+ "text/xml": ["*xml"],
4290
+ "text/yaml": ["yaml", "yml"],
4291
+ "video/3gpp": ["3gp", "3gpp"],
4292
+ "video/3gpp2": ["3g2"],
4293
+ "video/h261": ["h261"],
4294
+ "video/h263": ["h263"],
4295
+ "video/h264": ["h264"],
4296
+ "video/iso.segment": ["m4s"],
4297
+ "video/jpeg": ["jpgv"],
4298
+ "video/jpm": ["*jpm", "*jpgm"],
4299
+ "video/mj2": ["mj2", "mjp2"],
4300
+ "video/mp2t": ["ts", "m2t", "m2ts", "mts"],
4301
+ "video/mp4": ["mp4", "mp4v", "mpg4"],
4302
+ "video/mpeg": ["mpeg", "mpg", "mpe", "m1v", "m2v"],
4303
+ "video/ogg": ["ogv"],
4304
+ "video/quicktime": ["qt", "mov"],
4305
+ "video/webm": ["webm"]
4306
+ };
4307
+ Object.freeze(types2);
4308
+ var standard_default = types2;
4309
+
4310
+ // node_modules/mime/dist/src/Mime.js
4311
+ var __classPrivateFieldGet = function(receiver, state, kind, f) {
4312
+ if (kind === "a" && !f)
4313
+ throw new TypeError("Private accessor was defined without a getter");
4314
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
4315
+ throw new TypeError("Cannot read private member from an object whose class did not declare it");
4316
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
4317
+ };
4318
+ var _Mime_extensionToType;
4319
+ var _Mime_typeToExtension;
4320
+ var _Mime_typeToExtensions;
4321
+
4322
+ class Mime {
4323
+ constructor(...args) {
4324
+ _Mime_extensionToType.set(this, new Map);
4325
+ _Mime_typeToExtension.set(this, new Map);
4326
+ _Mime_typeToExtensions.set(this, new Map);
4327
+ for (const arg of args) {
4328
+ this.define(arg);
4204
4329
  }
4205
4330
  }
4206
- return next;
4207
- }
4208
- function computeDetailsDelta(current, fileDetails) {
4209
- return diffJson(current, projectDetailsPatch(current, fileDetails));
4210
- }
4211
- function readConfigFile(filePath) {
4212
- if (!existsSync5(filePath)) {
4213
- throw new Error(`Config file not found: ${filePath}. Run \`ro app config pull\` first.`);
4214
- }
4215
- let raw;
4216
- try {
4217
- raw = readFileSync4(filePath, "utf-8");
4218
- } catch (error) {
4219
- const message = error instanceof Error ? error.message : String(error);
4220
- throw new Error(`Could not read ${filePath}: ${message}`);
4221
- }
4222
- let parsed;
4223
- try {
4224
- parsed = JSON.parse(raw);
4225
- } catch (error) {
4226
- const message = error instanceof Error ? error.message : String(error);
4227
- throw new Error(`Invalid JSON in ${filePath}: ${message}`);
4228
- }
4229
- if (!isPlainObject(parsed)) {
4230
- throw new Error(`${filePath} must contain a JSON object.`);
4231
- }
4232
- return parsed;
4233
- }
4234
- async function pullWebappConfig(options) {
4235
- const raw = await fetchWebappConfig({
4236
- env: options.env,
4237
- webappId: options.webappId,
4238
- url: options.url,
4239
- host: options.host,
4240
- port: options.port
4241
- });
4242
- const details = unwrapDetails(raw);
4243
- const cleaned = sanitizeDetails(details);
4244
- const stripped = Object.keys(details).length - Object.keys(cleaned).length;
4245
- const fileName = options.out || DEFAULT_CONFIG_FILE;
4246
- const outPath = resolve2(process.cwd(), fileName);
4247
- writeFileSync4(outPath, `${JSON.stringify(cleaned, null, 2)}
4248
- `, "utf-8");
4249
- console.log(`✅ Wrote ${fileName} (${Object.keys(cleaned).length} fields, ${stripped} empty default${stripped === 1 ? "" : "s"} stripped)`);
4250
- }
4251
- async function pushWebappConfig(options) {
4252
- const fileName = options.file || DEFAULT_CONFIG_FILE;
4253
- const filePath = resolve2(process.cwd(), fileName);
4254
- const fileDetails = readConfigFile(filePath);
4255
- const raw = await fetchWebappConfig({
4256
- env: options.env,
4257
- webappId: options.webappId,
4258
- url: options.url,
4259
- host: options.host,
4260
- port: options.port
4261
- });
4262
- const current = unwrapDetails(raw);
4263
- const deltas = computeDetailsDelta(current, fileDetails);
4264
- console.log(formatObjectDelta(deltas, `Pushing ${fileName} → [${options.env}]`));
4265
- if (deltas.length === 0) {
4266
- console.log(`
4267
- ✓ Already in sync — nothing to push.`);
4268
- return;
4269
- }
4270
- if (options.dryRun) {
4271
- console.log(`
4272
- ↷ Dry run — no request sent.`);
4273
- return;
4274
- }
4275
- const tty = !!process.stdin.isTTY && !!process.stdout.isTTY;
4276
- if (!options.yes) {
4277
- if (!tty) {
4278
- throw new Error("Refusing to push in non-interactive mode. Pass --yes to confirm or --dry-run to preview.");
4279
- }
4280
- const answer = await prompt(`
4281
- Proceed with push on [${options.env}]? (y/N): `);
4282
- if (!isExplicitYes(answer)) {
4283
- console.log("✋ Aborted.");
4284
- return;
4331
+ define(typeMap, force = false) {
4332
+ for (let [type, extensions] of Object.entries(typeMap)) {
4333
+ type = type.toLowerCase();
4334
+ extensions = extensions.map((ext) => ext.toLowerCase());
4335
+ if (!__classPrivateFieldGet(this, _Mime_typeToExtensions, "f").has(type)) {
4336
+ __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").set(type, new Set);
4337
+ }
4338
+ const allExtensions = __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").get(type);
4339
+ let first = true;
4340
+ for (let extension of extensions) {
4341
+ const starred = extension.startsWith("*");
4342
+ extension = starred ? extension.slice(1) : extension;
4343
+ allExtensions?.add(extension);
4344
+ if (first) {
4345
+ __classPrivateFieldGet(this, _Mime_typeToExtension, "f").set(type, extension);
4346
+ }
4347
+ first = false;
4348
+ if (starred)
4349
+ continue;
4350
+ const currentType = __classPrivateFieldGet(this, _Mime_extensionToType, "f").get(extension);
4351
+ if (currentType && currentType != type && !force) {
4352
+ throw new Error(`"${type} -> ${extension}" conflicts with "${currentType} -> ${extension}". Pass \`force=true\` to override this definition.`);
4353
+ }
4354
+ __classPrivateFieldGet(this, _Mime_extensionToType, "f").set(extension, type);
4355
+ }
4285
4356
  }
4357
+ return this;
4286
4358
  }
4287
- await patchWebappConfig({
4288
- env: options.env,
4289
- details: fileDetails,
4290
- webappId: options.webappId,
4291
- url: options.url,
4292
- host: options.host,
4293
- port: options.port
4294
- });
4295
- console.log(`
4296
- Webapp config pushed.`);
4297
- }
4298
- async function checkConfigDriftOnDeploy(options) {
4299
- const fileName = options.file || DEFAULT_CONFIG_FILE;
4300
- const filePath = resolve2(process.cwd(), fileName);
4301
- if (!existsSync5(filePath))
4302
- return;
4303
- if (!process.env.WEBAPP_ID) {
4304
- console.warn(`
4305
- ⚠️ Skipping config drift check: WEBAPP_ID is not set.`);
4306
- return;
4359
+ getType(path3) {
4360
+ if (typeof path3 !== "string")
4361
+ return null;
4362
+ const last = path3.replace(/^.*[/\\]/s, "").toLowerCase();
4363
+ const ext = last.replace(/^.*\./s, "").toLowerCase();
4364
+ const hasPath = last.length < path3.length;
4365
+ const hasDot = ext.length < last.length - 1;
4366
+ if (!hasDot && hasPath)
4367
+ return null;
4368
+ return __classPrivateFieldGet(this, _Mime_extensionToType, "f").get(ext) ?? null;
4307
4369
  }
4308
- let fileDetails;
4309
- try {
4310
- fileDetails = readConfigFile(filePath);
4311
- } catch (error) {
4312
- const message = error instanceof Error ? error.message : String(error);
4313
- console.warn(`
4314
- ⚠️ Skipping config drift check: ${message}`);
4315
- return;
4370
+ getExtension(type) {
4371
+ if (typeof type !== "string")
4372
+ return null;
4373
+ type = type?.split?.(";")[0];
4374
+ return (type && __classPrivateFieldGet(this, _Mime_typeToExtension, "f").get(type.trim().toLowerCase())) ?? null;
4316
4375
  }
4317
- let current;
4318
- try {
4319
- const raw = await fetchWebappConfig({
4320
- env: options.env,
4321
- host: options.host,
4322
- port: options.port
4323
- });
4324
- current = unwrapDetails(raw);
4325
- } catch (error) {
4326
- const message = error instanceof Error ? error.message : String(error);
4327
- console.warn(`
4328
- ⚠️ Could not check config drift: ${message}`);
4329
- return;
4376
+ getAllExtensions(type) {
4377
+ if (typeof type !== "string")
4378
+ return null;
4379
+ return __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").get(type.toLowerCase()) ?? null;
4330
4380
  }
4331
- const deltas = computeDetailsDelta(current, fileDetails);
4332
- if (deltas.length === 0)
4333
- return;
4334
- console.log(`
4335
- \uD83D\uDCDD ${fileName} differs from the CMS:`);
4336
- console.log(formatObjectDelta(deltas, `Config drift on [${options.env}]`));
4337
- const tty = !!process.stdin.isTTY && !!process.stdout.isTTY;
4338
- let shouldPush = options.pushConfig === true;
4339
- if (!shouldPush) {
4340
- if (!tty) {
4341
- console.log(`
4342
- ℹ️ ${fileName} differs from CMS — run 'ro app config push' to sync, or deploy with --push-config.`);
4343
- return;
4381
+ _freeze() {
4382
+ this.define = () => {
4383
+ throw new Error("define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances");
4384
+ };
4385
+ Object.freeze(this);
4386
+ for (const extensions of __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").values()) {
4387
+ Object.freeze(extensions);
4344
4388
  }
4345
- const answer = await prompt(`
4346
- Push ${fileName} to the CMS now? (y/N): `);
4347
- shouldPush = isExplicitYes(answer);
4348
- }
4349
- if (!shouldPush) {
4350
- console.log(`
4351
- ↷ Skipped. Run 'ro app config push' later to sync.`);
4352
- return;
4389
+ return this;
4353
4390
  }
4354
- try {
4355
- await patchWebappConfig({
4356
- env: options.env,
4357
- details: fileDetails,
4358
- host: options.host,
4359
- port: options.port
4360
- });
4361
- console.log("✅ Webapp config pushed.");
4362
- } catch (error) {
4363
- const message = error instanceof Error ? error.message : String(error);
4364
- console.warn(`
4365
- ⚠️ Config push failed (deploy still succeeded): ${message}`);
4366
- console.warn(" Retry with: ro app config push");
4391
+ _getTestState() {
4392
+ return {
4393
+ types: __classPrivateFieldGet(this, _Mime_extensionToType, "f"),
4394
+ extensions: __classPrivateFieldGet(this, _Mime_typeToExtension, "f")
4395
+ };
4367
4396
  }
4368
4397
  }
4398
+ _Mime_extensionToType = new WeakMap, _Mime_typeToExtension = new WeakMap, _Mime_typeToExtensions = new WeakMap;
4399
+ var Mime_default = Mime;
4400
+
4401
+ // node_modules/mime/dist/src/index.js
4402
+ var src_default = new Mime_default(standard_default, other_default)._freeze();
4369
4403
 
4370
4404
  // src/sync-widget-manifest.ts
4371
4405
  import { existsSync as existsSync6, readFileSync as readFileSync5 } from "node:fs";
@@ -4877,7 +4911,7 @@ async function deploy(env = "development", overrides = {}) {
4877
4911
  }
4878
4912
 
4879
4913
  // src/global-config.ts
4880
- import { existsSync as existsSync8, readFileSync as readFileSync7, writeFileSync as writeFileSync5 } from "node:fs";
4914
+ import { existsSync as existsSync8, readFileSync as readFileSync7, writeFileSync as writeFileSync6 } from "node:fs";
4881
4915
  import { resolve as resolve4 } from "node:path";
4882
4916
  var PROD_ENV = "production";
4883
4917
  function applyMergePatch(target, patch) {
@@ -5018,7 +5052,7 @@ ${pretty(payload)}`);
5018
5052
  const text = pretty(payload);
5019
5053
  if (options.out) {
5020
5054
  const outPath = resolve4(process.cwd(), options.out);
5021
- writeFileSync5(outPath, `${text}
5055
+ writeFileSync6(outPath, `${text}
5022
5056
  `, "utf-8");
5023
5057
  console.log(`✅ Wrote global config to ${outPath}`);
5024
5058
  } else {
@@ -5113,7 +5147,7 @@ async function patchGlobalConfig(options) {
5113
5147
  }
5114
5148
 
5115
5149
  // src/group.ts
5116
- import { writeFileSync as writeFileSync6 } from "node:fs";
5150
+ import { writeFileSync as writeFileSync7 } from "node:fs";
5117
5151
  import { resolve as resolve5 } from "node:path";
5118
5152
  var PROD_ENV2 = "production";
5119
5153
  var ENTITY_TYPES = ["webapp", "character", "scene", "story"];
@@ -5204,7 +5238,7 @@ ${pretty(payload)}`);
5204
5238
  function emitRead(payload, human, options) {
5205
5239
  if (options.out) {
5206
5240
  const outPath = resolve5(process.cwd(), options.out);
5207
- writeFileSync6(outPath, `${pretty(payload)}
5241
+ writeFileSync7(outPath, `${pretty(payload)}
5208
5242
  `, "utf-8");
5209
5243
  console.log(`✅ Wrote response to ${outPath}`);
5210
5244
  return;
@@ -5475,7 +5509,7 @@ ${JSON.stringify(payload, null, 2)}`);
5475
5509
 
5476
5510
  // src/upgrade-template.ts
5477
5511
  import { execSync as execSync3 } from "node:child_process";
5478
- import { existsSync as existsSync10, readFileSync as readFileSync9, writeFileSync as writeFileSync7, mkdirSync as mkdirSync2, copyFileSync, rmSync as rmSync2 } from "node:fs";
5512
+ import { existsSync as existsSync10, readFileSync as readFileSync9, writeFileSync as writeFileSync8, mkdirSync as mkdirSync2, copyFileSync, rmSync as rmSync2 } from "node:fs";
5479
5513
  import path3 from "node:path";
5480
5514
  var TEMPLATES = {
5481
5515
  webapp: {
@@ -5621,7 +5655,7 @@ function updatePackageJsonScripts(template) {
5621
5655
  console.log(` \uD83D\uDCDD ${change.action} script: "${change.name}"`);
5622
5656
  }
5623
5657
  if (result.updated) {
5624
- writeFileSync7(pkgPath, JSON.stringify(pkg, null, 2) + `
5658
+ writeFileSync8(pkgPath, JSON.stringify(pkg, null, 2) + `
5625
5659
  `, "utf-8");
5626
5660
  console.log(`✅ package.json scripts updated
5627
5661
  `);
@@ -5677,7 +5711,7 @@ function ensureBuildScript() {
5677
5711
  return;
5678
5712
  }
5679
5713
  pkg.scripts.build = result.script;
5680
- writeFileSync7(pkgPath, JSON.stringify(pkg, null, 2) + `
5714
+ writeFileSync8(pkgPath, JSON.stringify(pkg, null, 2) + `
5681
5715
  `, "utf-8");
5682
5716
  console.log(` \uD83D\uDCDD Added "vite build --mode server-scripts" to the build script`);
5683
5717
  }