@rodyssey/cli 0.1.3 → 0.1.5
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.
- package/dist/cli.js +1739 -48
- package/package.json +3 -2
package/dist/cli.js
CHANGED
|
@@ -2069,19 +2069,244 @@ var {
|
|
|
2069
2069
|
Help
|
|
2070
2070
|
} = import__.default;
|
|
2071
2071
|
|
|
2072
|
+
// src/auth.ts
|
|
2073
|
+
import { spawn } from "node:child_process";
|
|
2074
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2075
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2076
|
+
import { createServer } from "node:http";
|
|
2077
|
+
import { dirname, join } from "node:path";
|
|
2078
|
+
import { homedir } from "node:os";
|
|
2079
|
+
var CMS_BASE_URLS = {
|
|
2080
|
+
local: "http://localhost:5176",
|
|
2081
|
+
development: "https://development-cms.rodyssey.ai",
|
|
2082
|
+
staging: "https://staging-cms.rodyssey.ai",
|
|
2083
|
+
production: "https://cms.rodyssey.ai"
|
|
2084
|
+
};
|
|
2085
|
+
var CONFIG_FILE = join(homedir(), ".rodyssey", "config.json");
|
|
2086
|
+
function readConfig() {
|
|
2087
|
+
if (!existsSync(CONFIG_FILE))
|
|
2088
|
+
return {};
|
|
2089
|
+
try {
|
|
2090
|
+
return JSON.parse(readFileSync(CONFIG_FILE, "utf-8"));
|
|
2091
|
+
} catch {
|
|
2092
|
+
return {};
|
|
2093
|
+
}
|
|
2094
|
+
}
|
|
2095
|
+
function writeConfig(config) {
|
|
2096
|
+
mkdirSync(dirname(CONFIG_FILE), { recursive: true });
|
|
2097
|
+
writeFileSync(CONFIG_FILE, `${JSON.stringify(config, null, 2)}
|
|
2098
|
+
`, "utf-8");
|
|
2099
|
+
}
|
|
2100
|
+
function getAuthConfig(config) {
|
|
2101
|
+
const auth = config.auth;
|
|
2102
|
+
if (!auth || typeof auth !== "object" || Array.isArray(auth))
|
|
2103
|
+
return {};
|
|
2104
|
+
return auth;
|
|
2105
|
+
}
|
|
2106
|
+
function isObject(value) {
|
|
2107
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
2108
|
+
}
|
|
2109
|
+
function extractToken(payload) {
|
|
2110
|
+
if (!isObject(payload))
|
|
2111
|
+
return;
|
|
2112
|
+
const candidates = [
|
|
2113
|
+
payload.accessToken,
|
|
2114
|
+
payload.token,
|
|
2115
|
+
payload.jwt,
|
|
2116
|
+
payload.idToken,
|
|
2117
|
+
isObject(payload.session) ? payload.session.token : undefined,
|
|
2118
|
+
isObject(payload.session) ? payload.session.accessToken : undefined,
|
|
2119
|
+
isObject(payload.data) ? payload.data.accessToken : undefined,
|
|
2120
|
+
isObject(payload.data) ? payload.data.token : undefined
|
|
2121
|
+
];
|
|
2122
|
+
return candidates.find((candidate) => typeof candidate === "string" && candidate.length > 0);
|
|
2123
|
+
}
|
|
2124
|
+
function extractUser(payload) {
|
|
2125
|
+
if (!isObject(payload))
|
|
2126
|
+
return;
|
|
2127
|
+
return payload.user ?? (isObject(payload.data) ? payload.data.user : undefined);
|
|
2128
|
+
}
|
|
2129
|
+
async function readResponsePayload(response) {
|
|
2130
|
+
const text = await response.text();
|
|
2131
|
+
if (!text)
|
|
2132
|
+
return;
|
|
2133
|
+
try {
|
|
2134
|
+
return JSON.parse(text);
|
|
2135
|
+
} catch {
|
|
2136
|
+
return { message: text };
|
|
2137
|
+
}
|
|
2138
|
+
}
|
|
2139
|
+
function base64Url(buffer) {
|
|
2140
|
+
return buffer.toString("base64").replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
|
|
2141
|
+
}
|
|
2142
|
+
function buildPkcePair() {
|
|
2143
|
+
const verifier = base64Url(randomBytes(32));
|
|
2144
|
+
const challenge = base64Url(createHash("sha256").update(verifier).digest());
|
|
2145
|
+
return { verifier, challenge };
|
|
2146
|
+
}
|
|
2147
|
+
function openBrowser(url) {
|
|
2148
|
+
const command = process.platform === "darwin" ? "open" : process.platform === "win32" ? "cmd" : "xdg-open";
|
|
2149
|
+
const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
|
|
2150
|
+
const child = spawn(command, args, { stdio: "ignore", detached: true });
|
|
2151
|
+
child.unref();
|
|
2152
|
+
}
|
|
2153
|
+
function resolveCmsUrl(env, cmsUrl) {
|
|
2154
|
+
const resolved = cmsUrl || process.env.CMS_URL || CMS_BASE_URLS[env];
|
|
2155
|
+
if (!resolved) {
|
|
2156
|
+
throw new Error(`Unknown CMS environment "${env}". Available: ${Object.keys(CMS_BASE_URLS).join(", ")}`);
|
|
2157
|
+
}
|
|
2158
|
+
return resolved.replace(/\/$/, "");
|
|
2159
|
+
}
|
|
2160
|
+
function getStoredSession(env) {
|
|
2161
|
+
return getAuthConfig(readConfig())[env];
|
|
2162
|
+
}
|
|
2163
|
+
function storeSession(session) {
|
|
2164
|
+
const config = readConfig();
|
|
2165
|
+
const auth = getAuthConfig(config);
|
|
2166
|
+
auth[session.env] = session;
|
|
2167
|
+
config.auth = auth;
|
|
2168
|
+
writeConfig(config);
|
|
2169
|
+
}
|
|
2170
|
+
function resolveSessionToken(env) {
|
|
2171
|
+
const token = process.env.CMS_TOKEN || getStoredSession(env)?.token;
|
|
2172
|
+
if (!token) {
|
|
2173
|
+
throw new Error(`No CMS auth token found for [${env}]. Run \`ro app auth login --env ${env}\` first.`);
|
|
2174
|
+
}
|
|
2175
|
+
return token;
|
|
2176
|
+
}
|
|
2177
|
+
async function login(options) {
|
|
2178
|
+
const cmsUrl = resolveCmsUrl(options.env, options.cmsUrl);
|
|
2179
|
+
const state = base64Url(randomBytes(24));
|
|
2180
|
+
const pkce = buildPkcePair();
|
|
2181
|
+
const timeoutMs = options.timeoutMs ?? 5 * 60 * 1000;
|
|
2182
|
+
const callback = await new Promise((resolve, reject) => {
|
|
2183
|
+
const server = createServer((request, response2) => {
|
|
2184
|
+
const requestUrl = new URL(request.url || "/", "http://127.0.0.1");
|
|
2185
|
+
if (requestUrl.pathname !== "/auth/callback") {
|
|
2186
|
+
response2.writeHead(404).end("Not found");
|
|
2187
|
+
return;
|
|
2188
|
+
}
|
|
2189
|
+
const code = requestUrl.searchParams.get("code");
|
|
2190
|
+
const returnedState = requestUrl.searchParams.get("state");
|
|
2191
|
+
const error = requestUrl.searchParams.get("error");
|
|
2192
|
+
if (error) {
|
|
2193
|
+
clearTimeout(timer);
|
|
2194
|
+
response2.writeHead(400, { "Content-Type": "text/plain" }).end(`Login failed: ${error}`);
|
|
2195
|
+
server.close();
|
|
2196
|
+
reject(new Error(`CMS login failed: ${error}`));
|
|
2197
|
+
return;
|
|
2198
|
+
}
|
|
2199
|
+
if (!code || returnedState !== state) {
|
|
2200
|
+
clearTimeout(timer);
|
|
2201
|
+
response2.writeHead(400, { "Content-Type": "text/plain" }).end("Invalid CLI login callback.");
|
|
2202
|
+
server.close();
|
|
2203
|
+
reject(new Error("Invalid CMS login callback. Missing code or state mismatch."));
|
|
2204
|
+
return;
|
|
2205
|
+
}
|
|
2206
|
+
response2.writeHead(200, { "Content-Type": "text/html" }).end('<!doctype html><meta charset="utf-8"><title>Rodyssey CLI</title><body><h1>Login complete</h1><p>You can close this window and return to the terminal.</p></body>');
|
|
2207
|
+
const address = server.address();
|
|
2208
|
+
clearTimeout(timer);
|
|
2209
|
+
server.close();
|
|
2210
|
+
resolve({ code, redirectUri: `http://127.0.0.1:${address.port}/auth/callback` });
|
|
2211
|
+
});
|
|
2212
|
+
const timer = setTimeout(() => {
|
|
2213
|
+
server.close();
|
|
2214
|
+
reject(new Error("CMS login timed out before the callback was received."));
|
|
2215
|
+
}, timeoutMs);
|
|
2216
|
+
server.on("error", (error) => {
|
|
2217
|
+
clearTimeout(timer);
|
|
2218
|
+
reject(error);
|
|
2219
|
+
});
|
|
2220
|
+
server.listen(options.callbackPort ?? 0, "127.0.0.1", () => {
|
|
2221
|
+
const address = server.address();
|
|
2222
|
+
const redirectUri = `http://127.0.0.1:${address.port}/auth/callback`;
|
|
2223
|
+
const authorizationUrl = new URL(options.loginUrl || `${cmsUrl}/auth/cli-login`);
|
|
2224
|
+
authorizationUrl.searchParams.set("redirect_uri", redirectUri);
|
|
2225
|
+
authorizationUrl.searchParams.set("state", state);
|
|
2226
|
+
authorizationUrl.searchParams.set("code_challenge", pkce.challenge);
|
|
2227
|
+
authorizationUrl.searchParams.set("code_challenge_method", "S256");
|
|
2228
|
+
console.log(`Open this URL to log in:
|
|
2229
|
+
${authorizationUrl.toString()}
|
|
2230
|
+
`);
|
|
2231
|
+
if (options.open !== false) {
|
|
2232
|
+
openBrowser(authorizationUrl.toString());
|
|
2233
|
+
}
|
|
2234
|
+
});
|
|
2235
|
+
});
|
|
2236
|
+
const tokenUrl = options.tokenUrl || `${cmsUrl}/api/auth/cli-token`;
|
|
2237
|
+
const response = await fetch(tokenUrl, {
|
|
2238
|
+
method: "POST",
|
|
2239
|
+
headers: {
|
|
2240
|
+
Accept: "application/json",
|
|
2241
|
+
"Content-Type": "application/json"
|
|
2242
|
+
},
|
|
2243
|
+
body: JSON.stringify({
|
|
2244
|
+
code: callback.code,
|
|
2245
|
+
redirect_uri: callback.redirectUri,
|
|
2246
|
+
code_verifier: pkce.verifier
|
|
2247
|
+
})
|
|
2248
|
+
});
|
|
2249
|
+
const payload = await readResponsePayload(response);
|
|
2250
|
+
if (!response.ok) {
|
|
2251
|
+
throw new Error(`CMS token exchange failed: ${response.status} ${response.statusText}
|
|
2252
|
+
${JSON.stringify(payload, null, 2)}`);
|
|
2253
|
+
}
|
|
2254
|
+
const token = extractToken(payload);
|
|
2255
|
+
if (!token) {
|
|
2256
|
+
throw new Error(`CMS token response did not include an auth token:
|
|
2257
|
+
${JSON.stringify(payload, null, 2)}`);
|
|
2258
|
+
}
|
|
2259
|
+
const session = {
|
|
2260
|
+
env: options.env,
|
|
2261
|
+
cmsUrl,
|
|
2262
|
+
token,
|
|
2263
|
+
user: extractUser(payload)
|
|
2264
|
+
};
|
|
2265
|
+
storeSession(session);
|
|
2266
|
+
return session;
|
|
2267
|
+
}
|
|
2268
|
+
async function me(options) {
|
|
2269
|
+
const storedSession = getStoredSession(options.env);
|
|
2270
|
+
if (!options.remote) {
|
|
2271
|
+
if (!storedSession) {
|
|
2272
|
+
throw new Error(`No local CMS session found for [${options.env}]. Run \`ro app auth login --env ${options.env}\` first.`);
|
|
2273
|
+
}
|
|
2274
|
+
return {
|
|
2275
|
+
env: storedSession.env,
|
|
2276
|
+
cmsUrl: storedSession.cmsUrl,
|
|
2277
|
+
loggedIn: true,
|
|
2278
|
+
user: storedSession.user ?? null
|
|
2279
|
+
};
|
|
2280
|
+
}
|
|
2281
|
+
const cmsUrl = resolveCmsUrl(options.env, options.cmsUrl || storedSession?.cmsUrl);
|
|
2282
|
+
const response = await fetch(options.meUrl || `${cmsUrl}/api/auth/me`, {
|
|
2283
|
+
method: "GET",
|
|
2284
|
+
headers: {
|
|
2285
|
+
Accept: "application/json",
|
|
2286
|
+
Authorization: `Bearer ${resolveSessionToken(options.env)}`
|
|
2287
|
+
}
|
|
2288
|
+
});
|
|
2289
|
+
const payload = await readResponsePayload(response);
|
|
2290
|
+
if (!response.ok) {
|
|
2291
|
+
throw new Error(`CMS me failed: ${response.status} ${response.statusText}
|
|
2292
|
+
${JSON.stringify(payload, null, 2)}`);
|
|
2293
|
+
}
|
|
2294
|
+
return payload;
|
|
2295
|
+
}
|
|
2296
|
+
|
|
2072
2297
|
// src/create.ts
|
|
2073
2298
|
import { execSync } from "node:child_process";
|
|
2074
|
-
import { existsSync as
|
|
2299
|
+
import { existsSync as existsSync3, readFileSync as readFileSync3, rmSync, writeFileSync as writeFileSync3 } from "node:fs";
|
|
2075
2300
|
import path2 from "node:path";
|
|
2076
2301
|
|
|
2077
2302
|
// src/utils.ts
|
|
2078
|
-
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
2303
|
+
import { readFileSync as readFileSync2, writeFileSync as writeFileSync2, existsSync as existsSync2 } from "node:fs";
|
|
2079
2304
|
import path from "node:path";
|
|
2080
2305
|
function replaceInFile(filePath, search, replace) {
|
|
2081
|
-
const content =
|
|
2306
|
+
const content = readFileSync2(filePath, "utf-8");
|
|
2082
2307
|
const updated = content.replaceAll(search, replace);
|
|
2083
2308
|
if (content !== updated) {
|
|
2084
|
-
|
|
2309
|
+
writeFileSync2(filePath, updated, "utf-8");
|
|
2085
2310
|
}
|
|
2086
2311
|
}
|
|
2087
2312
|
function replaceInFiles(dir, filenames, search, replace) {
|
|
@@ -2099,9 +2324,9 @@ function loadEnv(envName) {
|
|
|
2099
2324
|
}
|
|
2100
2325
|
files.push(".env");
|
|
2101
2326
|
for (const file of files) {
|
|
2102
|
-
if (!
|
|
2327
|
+
if (!existsSync2(file))
|
|
2103
2328
|
continue;
|
|
2104
|
-
const content =
|
|
2329
|
+
const content = readFileSync2(file, "utf-8");
|
|
2105
2330
|
for (const line of content.split(`
|
|
2106
2331
|
`)) {
|
|
2107
2332
|
const trimmed = line.trim();
|
|
@@ -2129,14 +2354,88 @@ var REPLACEMENT_FILES = {
|
|
|
2129
2354
|
webapp: ["package.json", "index.html"],
|
|
2130
2355
|
"webapp-fullstack": ["package.json", "wrangler.jsonc"]
|
|
2131
2356
|
};
|
|
2132
|
-
|
|
2357
|
+
function isObject2(value) {
|
|
2358
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
2359
|
+
}
|
|
2360
|
+
function pickString(...values) {
|
|
2361
|
+
return values.find((value) => typeof value === "string" && value.length > 0);
|
|
2362
|
+
}
|
|
2363
|
+
function nestedObject(value, key) {
|
|
2364
|
+
if (!isObject2(value))
|
|
2365
|
+
return;
|
|
2366
|
+
const nested = value[key];
|
|
2367
|
+
return isObject2(nested) ? nested : undefined;
|
|
2368
|
+
}
|
|
2369
|
+
function extractWebappId(payload) {
|
|
2370
|
+
const webapp = nestedObject(payload, "webapp");
|
|
2371
|
+
return pickString(webapp?.id, webapp?.webappId);
|
|
2372
|
+
}
|
|
2373
|
+
function extractDeployToken(payload) {
|
|
2374
|
+
const webapp = nestedObject(payload, "webapp");
|
|
2375
|
+
return pickString(webapp?.deployToken, webapp?.deploymentToken);
|
|
2376
|
+
}
|
|
2377
|
+
function upsertEnvValue(content, key, value) {
|
|
2378
|
+
const line = `${key}=${value}`;
|
|
2379
|
+
const pattern = new RegExp(`^${key}=.*$`, "m");
|
|
2380
|
+
if (pattern.test(content))
|
|
2381
|
+
return content.replace(pattern, line);
|
|
2382
|
+
return `${content}${content.endsWith(`
|
|
2383
|
+
`) || content.length === 0 ? "" : `
|
|
2384
|
+
`}${line}
|
|
2385
|
+
`;
|
|
2386
|
+
}
|
|
2387
|
+
function writeProjectEnv(projectDir, provisioned) {
|
|
2388
|
+
const envFile = path2.join(projectDir, ".env");
|
|
2389
|
+
let content = existsSync3(envFile) ? readFileSync3(envFile, "utf-8") : "";
|
|
2390
|
+
content = upsertEnvValue(content, "WEBAPP_ID", provisioned.webappId);
|
|
2391
|
+
content = upsertEnvValue(content, "DEPLOY_TOKEN", provisioned.deployToken);
|
|
2392
|
+
writeFileSync3(envFile, content, "utf-8");
|
|
2393
|
+
}
|
|
2394
|
+
async function provisionWebapp(projectName, options) {
|
|
2395
|
+
const cmsUrl = resolveCmsUrl(options.env, options.cmsUrl);
|
|
2396
|
+
const token = resolveSessionToken(options.env);
|
|
2397
|
+
const createUrl = options.createUrl || `${cmsUrl}/api/cli/webapps/create`;
|
|
2398
|
+
const createResponse = await fetch(createUrl, {
|
|
2399
|
+
method: "POST",
|
|
2400
|
+
headers: {
|
|
2401
|
+
Accept: "application/json",
|
|
2402
|
+
Authorization: `Bearer ${token}`,
|
|
2403
|
+
"Content-Type": "application/json"
|
|
2404
|
+
},
|
|
2405
|
+
body: JSON.stringify({ title: projectName })
|
|
2406
|
+
});
|
|
2407
|
+
const createPayload = await readResponsePayload(createResponse);
|
|
2408
|
+
if (!createResponse.ok) {
|
|
2409
|
+
throw new Error(`CMS webapp creation failed: ${createResponse.status} ${createResponse.statusText}
|
|
2410
|
+
${JSON.stringify(createPayload, null, 2)}`);
|
|
2411
|
+
}
|
|
2412
|
+
const webappId = extractWebappId(createPayload);
|
|
2413
|
+
if (!webappId) {
|
|
2414
|
+
throw new Error(`CMS create response did not include webapp.id:
|
|
2415
|
+
${JSON.stringify(createPayload, null, 2)}`);
|
|
2416
|
+
}
|
|
2417
|
+
const deployToken = extractDeployToken(createPayload);
|
|
2418
|
+
if (!deployToken) {
|
|
2419
|
+
throw new Error(`CMS create response did not include webapp.deployToken:
|
|
2420
|
+
${JSON.stringify(createPayload, null, 2)}`);
|
|
2421
|
+
}
|
|
2422
|
+
return {
|
|
2423
|
+
webappId,
|
|
2424
|
+
deployToken
|
|
2425
|
+
};
|
|
2426
|
+
}
|
|
2427
|
+
async function create(projectName, repoUrl, templateName, autoCreate) {
|
|
2133
2428
|
const targetDir = path2.resolve(process.cwd(), projectName);
|
|
2134
|
-
if (
|
|
2429
|
+
if (existsSync3(targetDir)) {
|
|
2135
2430
|
console.error(`
|
|
2136
2431
|
✖ Directory "${projectName}" already exists.
|
|
2137
2432
|
`);
|
|
2138
2433
|
process.exit(1);
|
|
2139
2434
|
}
|
|
2435
|
+
if (autoCreate?.enabled) {
|
|
2436
|
+
resolveCmsUrl(autoCreate.env, autoCreate.cmsUrl);
|
|
2437
|
+
resolveSessionToken(autoCreate.env);
|
|
2438
|
+
}
|
|
2140
2439
|
console.log(`
|
|
2141
2440
|
⏳ Cloning template "${templateName}"...
|
|
2142
2441
|
`);
|
|
@@ -2152,7 +2451,7 @@ async function create(projectName, repoUrl, templateName) {
|
|
|
2152
2451
|
process.exit(1);
|
|
2153
2452
|
}
|
|
2154
2453
|
const gitDir = path2.join(targetDir, ".git");
|
|
2155
|
-
if (
|
|
2454
|
+
if (existsSync3(gitDir)) {
|
|
2156
2455
|
rmSync(gitDir, { recursive: true, force: true });
|
|
2157
2456
|
}
|
|
2158
2457
|
const filesToReplace = REPLACEMENT_FILES[templateName] ?? [];
|
|
@@ -2162,6 +2461,13 @@ async function create(projectName, repoUrl, templateName) {
|
|
|
2162
2461
|
replaceInFiles(targetDir, filesToReplace, PLACEHOLDER_LOWER, projectName.toLowerCase());
|
|
2163
2462
|
}
|
|
2164
2463
|
execSync("git init", { stdio: "ignore", cwd: targetDir });
|
|
2464
|
+
if (autoCreate?.enabled) {
|
|
2465
|
+
console.log(` \uD83C\uDF10 Creating CMS webapp in [${autoCreate.env}]...`);
|
|
2466
|
+
const provisioned = await provisionWebapp(projectName, autoCreate);
|
|
2467
|
+
writeProjectEnv(targetDir, provisioned);
|
|
2468
|
+
console.log(` \uD83D\uDD10 Wrote WEBAPP_ID and DEPLOY_TOKEN to .env`);
|
|
2469
|
+
console.log(` \uD83D\uDCCD Webapp ID: ${provisioned.webappId}`);
|
|
2470
|
+
}
|
|
2165
2471
|
console.log(`
|
|
2166
2472
|
✅ Project "${projectName}" created successfully!
|
|
2167
2473
|
|
|
@@ -2175,26 +2481,1209 @@ async function create(projectName, repoUrl, templateName) {
|
|
|
2175
2481
|
|
|
2176
2482
|
// src/deploy.ts
|
|
2177
2483
|
import { execSync as execSync2 } from "node:child_process";
|
|
2178
|
-
import { existsSync as
|
|
2179
|
-
import { join } from "node:path";
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
var
|
|
2484
|
+
import { existsSync as existsSync4, readFileSync as readFileSync4, readdirSync, statSync, unlinkSync } from "node:fs";
|
|
2485
|
+
import { join as join2 } from "node:path";
|
|
2486
|
+
|
|
2487
|
+
// node_modules/mime/dist/types/other.js
|
|
2488
|
+
var types = {
|
|
2489
|
+
"application/prs.cww": ["cww"],
|
|
2490
|
+
"application/prs.xsf+xml": ["xsf"],
|
|
2491
|
+
"application/vnd.1000minds.decision-model+xml": ["1km"],
|
|
2492
|
+
"application/vnd.3gpp.pic-bw-large": ["plb"],
|
|
2493
|
+
"application/vnd.3gpp.pic-bw-small": ["psb"],
|
|
2494
|
+
"application/vnd.3gpp.pic-bw-var": ["pvb"],
|
|
2495
|
+
"application/vnd.3gpp2.tcap": ["tcap"],
|
|
2496
|
+
"application/vnd.3m.post-it-notes": ["pwn"],
|
|
2497
|
+
"application/vnd.accpac.simply.aso": ["aso"],
|
|
2498
|
+
"application/vnd.accpac.simply.imp": ["imp"],
|
|
2499
|
+
"application/vnd.acucobol": ["acu"],
|
|
2500
|
+
"application/vnd.acucorp": ["atc", "acutc"],
|
|
2501
|
+
"application/vnd.adobe.air-application-installer-package+zip": ["air"],
|
|
2502
|
+
"application/vnd.adobe.formscentral.fcdt": ["fcdt"],
|
|
2503
|
+
"application/vnd.adobe.fxp": ["fxp", "fxpl"],
|
|
2504
|
+
"application/vnd.adobe.xdp+xml": ["xdp"],
|
|
2505
|
+
"application/vnd.adobe.xfdf": ["*xfdf"],
|
|
2506
|
+
"application/vnd.age": ["age"],
|
|
2507
|
+
"application/vnd.ahead.space": ["ahead"],
|
|
2508
|
+
"application/vnd.airzip.filesecure.azf": ["azf"],
|
|
2509
|
+
"application/vnd.airzip.filesecure.azs": ["azs"],
|
|
2510
|
+
"application/vnd.amazon.ebook": ["azw"],
|
|
2511
|
+
"application/vnd.americandynamics.acc": ["acc"],
|
|
2512
|
+
"application/vnd.amiga.ami": ["ami"],
|
|
2513
|
+
"application/vnd.android.package-archive": ["apk"],
|
|
2514
|
+
"application/vnd.anser-web-certificate-issue-initiation": ["cii"],
|
|
2515
|
+
"application/vnd.anser-web-funds-transfer-initiation": ["fti"],
|
|
2516
|
+
"application/vnd.antix.game-component": ["atx"],
|
|
2517
|
+
"application/vnd.apple.installer+xml": ["mpkg"],
|
|
2518
|
+
"application/vnd.apple.keynote": ["key"],
|
|
2519
|
+
"application/vnd.apple.mpegurl": ["m3u8"],
|
|
2520
|
+
"application/vnd.apple.numbers": ["numbers"],
|
|
2521
|
+
"application/vnd.apple.pages": ["pages"],
|
|
2522
|
+
"application/vnd.apple.pkpass": ["pkpass"],
|
|
2523
|
+
"application/vnd.aristanetworks.swi": ["swi"],
|
|
2524
|
+
"application/vnd.astraea-software.iota": ["iota"],
|
|
2525
|
+
"application/vnd.audiograph": ["aep"],
|
|
2526
|
+
"application/vnd.autodesk.fbx": ["fbx"],
|
|
2527
|
+
"application/vnd.balsamiq.bmml+xml": ["bmml"],
|
|
2528
|
+
"application/vnd.blueice.multipass": ["mpm"],
|
|
2529
|
+
"application/vnd.bmi": ["bmi"],
|
|
2530
|
+
"application/vnd.businessobjects": ["rep"],
|
|
2531
|
+
"application/vnd.chemdraw+xml": ["cdxml"],
|
|
2532
|
+
"application/vnd.chipnuts.karaoke-mmd": ["mmd"],
|
|
2533
|
+
"application/vnd.cinderella": ["cdy"],
|
|
2534
|
+
"application/vnd.citationstyles.style+xml": ["csl"],
|
|
2535
|
+
"application/vnd.claymore": ["cla"],
|
|
2536
|
+
"application/vnd.cloanto.rp9": ["rp9"],
|
|
2537
|
+
"application/vnd.clonk.c4group": ["c4g", "c4d", "c4f", "c4p", "c4u"],
|
|
2538
|
+
"application/vnd.cluetrust.cartomobile-config": ["c11amc"],
|
|
2539
|
+
"application/vnd.cluetrust.cartomobile-config-pkg": ["c11amz"],
|
|
2540
|
+
"application/vnd.commonspace": ["csp"],
|
|
2541
|
+
"application/vnd.contact.cmsg": ["cdbcmsg"],
|
|
2542
|
+
"application/vnd.cosmocaller": ["cmc"],
|
|
2543
|
+
"application/vnd.crick.clicker": ["clkx"],
|
|
2544
|
+
"application/vnd.crick.clicker.keyboard": ["clkk"],
|
|
2545
|
+
"application/vnd.crick.clicker.palette": ["clkp"],
|
|
2546
|
+
"application/vnd.crick.clicker.template": ["clkt"],
|
|
2547
|
+
"application/vnd.crick.clicker.wordbank": ["clkw"],
|
|
2548
|
+
"application/vnd.criticaltools.wbs+xml": ["wbs"],
|
|
2549
|
+
"application/vnd.ctc-posml": ["pml"],
|
|
2550
|
+
"application/vnd.cups-ppd": ["ppd"],
|
|
2551
|
+
"application/vnd.curl.car": ["car"],
|
|
2552
|
+
"application/vnd.curl.pcurl": ["pcurl"],
|
|
2553
|
+
"application/vnd.dart": ["dart"],
|
|
2554
|
+
"application/vnd.data-vision.rdz": ["rdz"],
|
|
2555
|
+
"application/vnd.dbf": ["dbf"],
|
|
2556
|
+
"application/vnd.dcmp+xml": ["dcmp"],
|
|
2557
|
+
"application/vnd.dece.data": ["uvf", "uvvf", "uvd", "uvvd"],
|
|
2558
|
+
"application/vnd.dece.ttml+xml": ["uvt", "uvvt"],
|
|
2559
|
+
"application/vnd.dece.unspecified": ["uvx", "uvvx"],
|
|
2560
|
+
"application/vnd.dece.zip": ["uvz", "uvvz"],
|
|
2561
|
+
"application/vnd.denovo.fcselayout-link": ["fe_launch"],
|
|
2562
|
+
"application/vnd.dna": ["dna"],
|
|
2563
|
+
"application/vnd.dolby.mlp": ["mlp"],
|
|
2564
|
+
"application/vnd.dpgraph": ["dpg"],
|
|
2565
|
+
"application/vnd.dreamfactory": ["dfac"],
|
|
2566
|
+
"application/vnd.ds-keypoint": ["kpxx"],
|
|
2567
|
+
"application/vnd.dvb.ait": ["ait"],
|
|
2568
|
+
"application/vnd.dvb.service": ["svc"],
|
|
2569
|
+
"application/vnd.dynageo": ["geo"],
|
|
2570
|
+
"application/vnd.ecowin.chart": ["mag"],
|
|
2571
|
+
"application/vnd.enliven": ["nml"],
|
|
2572
|
+
"application/vnd.epson.esf": ["esf"],
|
|
2573
|
+
"application/vnd.epson.msf": ["msf"],
|
|
2574
|
+
"application/vnd.epson.quickanime": ["qam"],
|
|
2575
|
+
"application/vnd.epson.salt": ["slt"],
|
|
2576
|
+
"application/vnd.epson.ssf": ["ssf"],
|
|
2577
|
+
"application/vnd.eszigno3+xml": ["es3", "et3"],
|
|
2578
|
+
"application/vnd.ezpix-album": ["ez2"],
|
|
2579
|
+
"application/vnd.ezpix-package": ["ez3"],
|
|
2580
|
+
"application/vnd.fdf": ["*fdf"],
|
|
2581
|
+
"application/vnd.fdsn.mseed": ["mseed"],
|
|
2582
|
+
"application/vnd.fdsn.seed": ["seed", "dataless"],
|
|
2583
|
+
"application/vnd.flographit": ["gph"],
|
|
2584
|
+
"application/vnd.fluxtime.clip": ["ftc"],
|
|
2585
|
+
"application/vnd.framemaker": ["fm", "frame", "maker", "book"],
|
|
2586
|
+
"application/vnd.frogans.fnc": ["fnc"],
|
|
2587
|
+
"application/vnd.frogans.ltf": ["ltf"],
|
|
2588
|
+
"application/vnd.fsc.weblaunch": ["fsc"],
|
|
2589
|
+
"application/vnd.fujitsu.oasys": ["oas"],
|
|
2590
|
+
"application/vnd.fujitsu.oasys2": ["oa2"],
|
|
2591
|
+
"application/vnd.fujitsu.oasys3": ["oa3"],
|
|
2592
|
+
"application/vnd.fujitsu.oasysgp": ["fg5"],
|
|
2593
|
+
"application/vnd.fujitsu.oasysprs": ["bh2"],
|
|
2594
|
+
"application/vnd.fujixerox.ddd": ["ddd"],
|
|
2595
|
+
"application/vnd.fujixerox.docuworks": ["xdw"],
|
|
2596
|
+
"application/vnd.fujixerox.docuworks.binder": ["xbd"],
|
|
2597
|
+
"application/vnd.fuzzysheet": ["fzs"],
|
|
2598
|
+
"application/vnd.genomatix.tuxedo": ["txd"],
|
|
2599
|
+
"application/vnd.geogebra.file": ["ggb"],
|
|
2600
|
+
"application/vnd.geogebra.slides": ["ggs"],
|
|
2601
|
+
"application/vnd.geogebra.tool": ["ggt"],
|
|
2602
|
+
"application/vnd.geometry-explorer": ["gex", "gre"],
|
|
2603
|
+
"application/vnd.geonext": ["gxt"],
|
|
2604
|
+
"application/vnd.geoplan": ["g2w"],
|
|
2605
|
+
"application/vnd.geospace": ["g3w"],
|
|
2606
|
+
"application/vnd.gmx": ["gmx"],
|
|
2607
|
+
"application/vnd.google-apps.document": ["gdoc"],
|
|
2608
|
+
"application/vnd.google-apps.drawing": ["gdraw"],
|
|
2609
|
+
"application/vnd.google-apps.form": ["gform"],
|
|
2610
|
+
"application/vnd.google-apps.jam": ["gjam"],
|
|
2611
|
+
"application/vnd.google-apps.map": ["gmap"],
|
|
2612
|
+
"application/vnd.google-apps.presentation": ["gslides"],
|
|
2613
|
+
"application/vnd.google-apps.script": ["gscript"],
|
|
2614
|
+
"application/vnd.google-apps.site": ["gsite"],
|
|
2615
|
+
"application/vnd.google-apps.spreadsheet": ["gsheet"],
|
|
2616
|
+
"application/vnd.google-earth.kml+xml": ["kml"],
|
|
2617
|
+
"application/vnd.google-earth.kmz": ["kmz"],
|
|
2618
|
+
"application/vnd.gov.sk.xmldatacontainer+xml": ["xdcf"],
|
|
2619
|
+
"application/vnd.grafeq": ["gqf", "gqs"],
|
|
2620
|
+
"application/vnd.groove-account": ["gac"],
|
|
2621
|
+
"application/vnd.groove-help": ["ghf"],
|
|
2622
|
+
"application/vnd.groove-identity-message": ["gim"],
|
|
2623
|
+
"application/vnd.groove-injector": ["grv"],
|
|
2624
|
+
"application/vnd.groove-tool-message": ["gtm"],
|
|
2625
|
+
"application/vnd.groove-tool-template": ["tpl"],
|
|
2626
|
+
"application/vnd.groove-vcard": ["vcg"],
|
|
2627
|
+
"application/vnd.hal+xml": ["hal"],
|
|
2628
|
+
"application/vnd.handheld-entertainment+xml": ["zmm"],
|
|
2629
|
+
"application/vnd.hbci": ["hbci"],
|
|
2630
|
+
"application/vnd.hhe.lesson-player": ["les"],
|
|
2631
|
+
"application/vnd.hp-hpgl": ["hpgl"],
|
|
2632
|
+
"application/vnd.hp-hpid": ["hpid"],
|
|
2633
|
+
"application/vnd.hp-hps": ["hps"],
|
|
2634
|
+
"application/vnd.hp-jlyt": ["jlt"],
|
|
2635
|
+
"application/vnd.hp-pcl": ["pcl"],
|
|
2636
|
+
"application/vnd.hp-pclxl": ["pclxl"],
|
|
2637
|
+
"application/vnd.hydrostatix.sof-data": ["sfd-hdstx"],
|
|
2638
|
+
"application/vnd.ibm.minipay": ["mpy"],
|
|
2639
|
+
"application/vnd.ibm.modcap": ["afp", "listafp", "list3820"],
|
|
2640
|
+
"application/vnd.ibm.rights-management": ["irm"],
|
|
2641
|
+
"application/vnd.ibm.secure-container": ["sc"],
|
|
2642
|
+
"application/vnd.iccprofile": ["icc", "icm"],
|
|
2643
|
+
"application/vnd.igloader": ["igl"],
|
|
2644
|
+
"application/vnd.immervision-ivp": ["ivp"],
|
|
2645
|
+
"application/vnd.immervision-ivu": ["ivu"],
|
|
2646
|
+
"application/vnd.insors.igm": ["igm"],
|
|
2647
|
+
"application/vnd.intercon.formnet": ["xpw", "xpx"],
|
|
2648
|
+
"application/vnd.intergeo": ["i2g"],
|
|
2649
|
+
"application/vnd.intu.qbo": ["qbo"],
|
|
2650
|
+
"application/vnd.intu.qfx": ["qfx"],
|
|
2651
|
+
"application/vnd.ipunplugged.rcprofile": ["rcprofile"],
|
|
2652
|
+
"application/vnd.irepository.package+xml": ["irp"],
|
|
2653
|
+
"application/vnd.is-xpr": ["xpr"],
|
|
2654
|
+
"application/vnd.isac.fcs": ["fcs"],
|
|
2655
|
+
"application/vnd.jam": ["jam"],
|
|
2656
|
+
"application/vnd.jcp.javame.midlet-rms": ["rms"],
|
|
2657
|
+
"application/vnd.jisp": ["jisp"],
|
|
2658
|
+
"application/vnd.joost.joda-archive": ["joda"],
|
|
2659
|
+
"application/vnd.kahootz": ["ktz", "ktr"],
|
|
2660
|
+
"application/vnd.kde.karbon": ["karbon"],
|
|
2661
|
+
"application/vnd.kde.kchart": ["chrt"],
|
|
2662
|
+
"application/vnd.kde.kformula": ["kfo"],
|
|
2663
|
+
"application/vnd.kde.kivio": ["flw"],
|
|
2664
|
+
"application/vnd.kde.kontour": ["kon"],
|
|
2665
|
+
"application/vnd.kde.kpresenter": ["kpr", "kpt"],
|
|
2666
|
+
"application/vnd.kde.kspread": ["ksp"],
|
|
2667
|
+
"application/vnd.kde.kword": ["kwd", "kwt"],
|
|
2668
|
+
"application/vnd.kenameaapp": ["htke"],
|
|
2669
|
+
"application/vnd.kidspiration": ["kia"],
|
|
2670
|
+
"application/vnd.kinar": ["kne", "knp"],
|
|
2671
|
+
"application/vnd.koan": ["skp", "skd", "skt", "skm"],
|
|
2672
|
+
"application/vnd.kodak-descriptor": ["sse"],
|
|
2673
|
+
"application/vnd.las.las+xml": ["lasxml"],
|
|
2674
|
+
"application/vnd.llamagraphics.life-balance.desktop": ["lbd"],
|
|
2675
|
+
"application/vnd.llamagraphics.life-balance.exchange+xml": ["lbe"],
|
|
2676
|
+
"application/vnd.lotus-1-2-3": ["123"],
|
|
2677
|
+
"application/vnd.lotus-approach": ["apr"],
|
|
2678
|
+
"application/vnd.lotus-freelance": ["pre"],
|
|
2679
|
+
"application/vnd.lotus-notes": ["nsf"],
|
|
2680
|
+
"application/vnd.lotus-organizer": ["org"],
|
|
2681
|
+
"application/vnd.lotus-screencam": ["scm"],
|
|
2682
|
+
"application/vnd.lotus-wordpro": ["lwp"],
|
|
2683
|
+
"application/vnd.macports.portpkg": ["portpkg"],
|
|
2684
|
+
"application/vnd.mapbox-vector-tile": ["mvt"],
|
|
2685
|
+
"application/vnd.mcd": ["mcd"],
|
|
2686
|
+
"application/vnd.medcalcdata": ["mc1"],
|
|
2687
|
+
"application/vnd.mediastation.cdkey": ["cdkey"],
|
|
2688
|
+
"application/vnd.mfer": ["mwf"],
|
|
2689
|
+
"application/vnd.mfmp": ["mfm"],
|
|
2690
|
+
"application/vnd.micrografx.flo": ["flo"],
|
|
2691
|
+
"application/vnd.micrografx.igx": ["igx"],
|
|
2692
|
+
"application/vnd.mif": ["mif"],
|
|
2693
|
+
"application/vnd.mobius.daf": ["daf"],
|
|
2694
|
+
"application/vnd.mobius.dis": ["dis"],
|
|
2695
|
+
"application/vnd.mobius.mbk": ["mbk"],
|
|
2696
|
+
"application/vnd.mobius.mqy": ["mqy"],
|
|
2697
|
+
"application/vnd.mobius.msl": ["msl"],
|
|
2698
|
+
"application/vnd.mobius.plc": ["plc"],
|
|
2699
|
+
"application/vnd.mobius.txf": ["txf"],
|
|
2700
|
+
"application/vnd.mophun.application": ["mpn"],
|
|
2701
|
+
"application/vnd.mophun.certificate": ["mpc"],
|
|
2702
|
+
"application/vnd.mozilla.xul+xml": ["xul"],
|
|
2703
|
+
"application/vnd.ms-artgalry": ["cil"],
|
|
2704
|
+
"application/vnd.ms-cab-compressed": ["cab"],
|
|
2705
|
+
"application/vnd.ms-excel": ["xls", "xlm", "xla", "xlc", "xlt", "xlw"],
|
|
2706
|
+
"application/vnd.ms-excel.addin.macroenabled.12": ["xlam"],
|
|
2707
|
+
"application/vnd.ms-excel.sheet.binary.macroenabled.12": ["xlsb"],
|
|
2708
|
+
"application/vnd.ms-excel.sheet.macroenabled.12": ["xlsm"],
|
|
2709
|
+
"application/vnd.ms-excel.template.macroenabled.12": ["xltm"],
|
|
2710
|
+
"application/vnd.ms-fontobject": ["eot"],
|
|
2711
|
+
"application/vnd.ms-htmlhelp": ["chm"],
|
|
2712
|
+
"application/vnd.ms-ims": ["ims"],
|
|
2713
|
+
"application/vnd.ms-lrm": ["lrm"],
|
|
2714
|
+
"application/vnd.ms-officetheme": ["thmx"],
|
|
2715
|
+
"application/vnd.ms-outlook": ["msg"],
|
|
2716
|
+
"application/vnd.ms-pki.seccat": ["cat"],
|
|
2717
|
+
"application/vnd.ms-pki.stl": ["*stl"],
|
|
2718
|
+
"application/vnd.ms-powerpoint": ["ppt", "pps", "pot"],
|
|
2719
|
+
"application/vnd.ms-powerpoint.addin.macroenabled.12": ["ppam"],
|
|
2720
|
+
"application/vnd.ms-powerpoint.presentation.macroenabled.12": ["pptm"],
|
|
2721
|
+
"application/vnd.ms-powerpoint.slide.macroenabled.12": ["sldm"],
|
|
2722
|
+
"application/vnd.ms-powerpoint.slideshow.macroenabled.12": ["ppsm"],
|
|
2723
|
+
"application/vnd.ms-powerpoint.template.macroenabled.12": ["potm"],
|
|
2724
|
+
"application/vnd.ms-project": ["*mpp", "mpt"],
|
|
2725
|
+
"application/vnd.ms-visio.viewer": ["vdx"],
|
|
2726
|
+
"application/vnd.ms-word.document.macroenabled.12": ["docm"],
|
|
2727
|
+
"application/vnd.ms-word.template.macroenabled.12": ["dotm"],
|
|
2728
|
+
"application/vnd.ms-works": ["wps", "wks", "wcm", "wdb"],
|
|
2729
|
+
"application/vnd.ms-wpl": ["wpl"],
|
|
2730
|
+
"application/vnd.ms-xpsdocument": ["xps"],
|
|
2731
|
+
"application/vnd.mseq": ["mseq"],
|
|
2732
|
+
"application/vnd.musician": ["mus"],
|
|
2733
|
+
"application/vnd.muvee.style": ["msty"],
|
|
2734
|
+
"application/vnd.mynfc": ["taglet"],
|
|
2735
|
+
"application/vnd.nato.bindingdataobject+xml": ["bdo"],
|
|
2736
|
+
"application/vnd.neurolanguage.nlu": ["nlu"],
|
|
2737
|
+
"application/vnd.nitf": ["ntf", "nitf"],
|
|
2738
|
+
"application/vnd.noblenet-directory": ["nnd"],
|
|
2739
|
+
"application/vnd.noblenet-sealer": ["nns"],
|
|
2740
|
+
"application/vnd.noblenet-web": ["nnw"],
|
|
2741
|
+
"application/vnd.nokia.n-gage.ac+xml": ["*ac"],
|
|
2742
|
+
"application/vnd.nokia.n-gage.data": ["ngdat"],
|
|
2743
|
+
"application/vnd.nokia.n-gage.symbian.install": ["n-gage"],
|
|
2744
|
+
"application/vnd.nokia.radio-preset": ["rpst"],
|
|
2745
|
+
"application/vnd.nokia.radio-presets": ["rpss"],
|
|
2746
|
+
"application/vnd.novadigm.edm": ["edm"],
|
|
2747
|
+
"application/vnd.novadigm.edx": ["edx"],
|
|
2748
|
+
"application/vnd.novadigm.ext": ["ext"],
|
|
2749
|
+
"application/vnd.oasis.opendocument.chart": ["odc"],
|
|
2750
|
+
"application/vnd.oasis.opendocument.chart-template": ["otc"],
|
|
2751
|
+
"application/vnd.oasis.opendocument.database": ["odb"],
|
|
2752
|
+
"application/vnd.oasis.opendocument.formula": ["odf"],
|
|
2753
|
+
"application/vnd.oasis.opendocument.formula-template": ["odft"],
|
|
2754
|
+
"application/vnd.oasis.opendocument.graphics": ["odg"],
|
|
2755
|
+
"application/vnd.oasis.opendocument.graphics-template": ["otg"],
|
|
2756
|
+
"application/vnd.oasis.opendocument.image": ["odi"],
|
|
2757
|
+
"application/vnd.oasis.opendocument.image-template": ["oti"],
|
|
2758
|
+
"application/vnd.oasis.opendocument.presentation": ["odp"],
|
|
2759
|
+
"application/vnd.oasis.opendocument.presentation-template": ["otp"],
|
|
2760
|
+
"application/vnd.oasis.opendocument.spreadsheet": ["ods"],
|
|
2761
|
+
"application/vnd.oasis.opendocument.spreadsheet-template": ["ots"],
|
|
2762
|
+
"application/vnd.oasis.opendocument.text": ["odt"],
|
|
2763
|
+
"application/vnd.oasis.opendocument.text-master": ["odm"],
|
|
2764
|
+
"application/vnd.oasis.opendocument.text-template": ["ott"],
|
|
2765
|
+
"application/vnd.oasis.opendocument.text-web": ["oth"],
|
|
2766
|
+
"application/vnd.olpc-sugar": ["xo"],
|
|
2767
|
+
"application/vnd.oma.dd2+xml": ["dd2"],
|
|
2768
|
+
"application/vnd.openblox.game+xml": ["obgx"],
|
|
2769
|
+
"application/vnd.openofficeorg.extension": ["oxt"],
|
|
2770
|
+
"application/vnd.openstreetmap.data+xml": ["osm"],
|
|
2771
|
+
"application/vnd.openxmlformats-officedocument.presentationml.presentation": [
|
|
2772
|
+
"pptx"
|
|
2773
|
+
],
|
|
2774
|
+
"application/vnd.openxmlformats-officedocument.presentationml.slide": [
|
|
2775
|
+
"sldx"
|
|
2776
|
+
],
|
|
2777
|
+
"application/vnd.openxmlformats-officedocument.presentationml.slideshow": [
|
|
2778
|
+
"ppsx"
|
|
2779
|
+
],
|
|
2780
|
+
"application/vnd.openxmlformats-officedocument.presentationml.template": [
|
|
2781
|
+
"potx"
|
|
2782
|
+
],
|
|
2783
|
+
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": ["xlsx"],
|
|
2784
|
+
"application/vnd.openxmlformats-officedocument.spreadsheetml.template": [
|
|
2785
|
+
"xltx"
|
|
2786
|
+
],
|
|
2787
|
+
"application/vnd.openxmlformats-officedocument.wordprocessingml.document": [
|
|
2788
|
+
"docx"
|
|
2789
|
+
],
|
|
2790
|
+
"application/vnd.openxmlformats-officedocument.wordprocessingml.template": [
|
|
2791
|
+
"dotx"
|
|
2792
|
+
],
|
|
2793
|
+
"application/vnd.osgeo.mapguide.package": ["mgp"],
|
|
2794
|
+
"application/vnd.osgi.dp": ["dp"],
|
|
2795
|
+
"application/vnd.osgi.subsystem": ["esa"],
|
|
2796
|
+
"application/vnd.palm": ["pdb", "pqa", "oprc"],
|
|
2797
|
+
"application/vnd.pawaafile": ["paw"],
|
|
2798
|
+
"application/vnd.pg.format": ["str"],
|
|
2799
|
+
"application/vnd.pg.osasli": ["ei6"],
|
|
2800
|
+
"application/vnd.picsel": ["efif"],
|
|
2801
|
+
"application/vnd.pmi.widget": ["wg"],
|
|
2802
|
+
"application/vnd.pocketlearn": ["plf"],
|
|
2803
|
+
"application/vnd.powerbuilder6": ["pbd"],
|
|
2804
|
+
"application/vnd.previewsystems.box": ["box"],
|
|
2805
|
+
"application/vnd.procrate.brushset": ["brushset"],
|
|
2806
|
+
"application/vnd.procreate.brush": ["brush"],
|
|
2807
|
+
"application/vnd.procreate.dream": ["drm"],
|
|
2808
|
+
"application/vnd.proteus.magazine": ["mgz"],
|
|
2809
|
+
"application/vnd.publishare-delta-tree": ["qps"],
|
|
2810
|
+
"application/vnd.pvi.ptid1": ["ptid"],
|
|
2811
|
+
"application/vnd.pwg-xhtml-print+xml": ["xhtm"],
|
|
2812
|
+
"application/vnd.quark.quarkxpress": [
|
|
2813
|
+
"qxd",
|
|
2814
|
+
"qxt",
|
|
2815
|
+
"qwd",
|
|
2816
|
+
"qwt",
|
|
2817
|
+
"qxl",
|
|
2818
|
+
"qxb"
|
|
2819
|
+
],
|
|
2820
|
+
"application/vnd.rar": ["rar"],
|
|
2821
|
+
"application/vnd.realvnc.bed": ["bed"],
|
|
2822
|
+
"application/vnd.recordare.musicxml": ["mxl"],
|
|
2823
|
+
"application/vnd.recordare.musicxml+xml": ["musicxml"],
|
|
2824
|
+
"application/vnd.rig.cryptonote": ["cryptonote"],
|
|
2825
|
+
"application/vnd.rim.cod": ["cod"],
|
|
2826
|
+
"application/vnd.rn-realmedia": ["rm"],
|
|
2827
|
+
"application/vnd.rn-realmedia-vbr": ["rmvb"],
|
|
2828
|
+
"application/vnd.route66.link66+xml": ["link66"],
|
|
2829
|
+
"application/vnd.sailingtracker.track": ["st"],
|
|
2830
|
+
"application/vnd.seemail": ["see"],
|
|
2831
|
+
"application/vnd.sema": ["sema"],
|
|
2832
|
+
"application/vnd.semd": ["semd"],
|
|
2833
|
+
"application/vnd.semf": ["semf"],
|
|
2834
|
+
"application/vnd.shana.informed.formdata": ["ifm"],
|
|
2835
|
+
"application/vnd.shana.informed.formtemplate": ["itp"],
|
|
2836
|
+
"application/vnd.shana.informed.interchange": ["iif"],
|
|
2837
|
+
"application/vnd.shana.informed.package": ["ipk"],
|
|
2838
|
+
"application/vnd.simtech-mindmapper": ["twd", "twds"],
|
|
2839
|
+
"application/vnd.smaf": ["mmf"],
|
|
2840
|
+
"application/vnd.smart.teacher": ["teacher"],
|
|
2841
|
+
"application/vnd.software602.filler.form+xml": ["fo"],
|
|
2842
|
+
"application/vnd.solent.sdkm+xml": ["sdkm", "sdkd"],
|
|
2843
|
+
"application/vnd.spotfire.dxp": ["dxp"],
|
|
2844
|
+
"application/vnd.spotfire.sfs": ["sfs"],
|
|
2845
|
+
"application/vnd.stardivision.calc": ["sdc"],
|
|
2846
|
+
"application/vnd.stardivision.draw": ["sda"],
|
|
2847
|
+
"application/vnd.stardivision.impress": ["sdd"],
|
|
2848
|
+
"application/vnd.stardivision.math": ["smf"],
|
|
2849
|
+
"application/vnd.stardivision.writer": ["sdw", "vor"],
|
|
2850
|
+
"application/vnd.stardivision.writer-global": ["sgl"],
|
|
2851
|
+
"application/vnd.stepmania.package": ["smzip"],
|
|
2852
|
+
"application/vnd.stepmania.stepchart": ["sm"],
|
|
2853
|
+
"application/vnd.sun.wadl+xml": ["wadl"],
|
|
2854
|
+
"application/vnd.sun.xml.calc": ["sxc"],
|
|
2855
|
+
"application/vnd.sun.xml.calc.template": ["stc"],
|
|
2856
|
+
"application/vnd.sun.xml.draw": ["sxd"],
|
|
2857
|
+
"application/vnd.sun.xml.draw.template": ["std"],
|
|
2858
|
+
"application/vnd.sun.xml.impress": ["sxi"],
|
|
2859
|
+
"application/vnd.sun.xml.impress.template": ["sti"],
|
|
2860
|
+
"application/vnd.sun.xml.math": ["sxm"],
|
|
2861
|
+
"application/vnd.sun.xml.writer": ["sxw"],
|
|
2862
|
+
"application/vnd.sun.xml.writer.global": ["sxg"],
|
|
2863
|
+
"application/vnd.sun.xml.writer.template": ["stw"],
|
|
2864
|
+
"application/vnd.sus-calendar": ["sus", "susp"],
|
|
2865
|
+
"application/vnd.svd": ["svd"],
|
|
2866
|
+
"application/vnd.symbian.install": ["sis", "sisx"],
|
|
2867
|
+
"application/vnd.syncml+xml": ["xsm"],
|
|
2868
|
+
"application/vnd.syncml.dm+wbxml": ["bdm"],
|
|
2869
|
+
"application/vnd.syncml.dm+xml": ["xdm"],
|
|
2870
|
+
"application/vnd.syncml.dmddf+xml": ["ddf"],
|
|
2871
|
+
"application/vnd.tao.intent-module-archive": ["tao"],
|
|
2872
|
+
"application/vnd.tcpdump.pcap": ["pcap", "cap", "dmp"],
|
|
2873
|
+
"application/vnd.tmobile-livetv": ["tmo"],
|
|
2874
|
+
"application/vnd.trid.tpt": ["tpt"],
|
|
2875
|
+
"application/vnd.triscape.mxs": ["mxs"],
|
|
2876
|
+
"application/vnd.trueapp": ["tra"],
|
|
2877
|
+
"application/vnd.ufdl": ["ufd", "ufdl"],
|
|
2878
|
+
"application/vnd.uiq.theme": ["utz"],
|
|
2879
|
+
"application/vnd.umajin": ["umj"],
|
|
2880
|
+
"application/vnd.unity": ["unityweb"],
|
|
2881
|
+
"application/vnd.uoml+xml": ["uoml", "uo"],
|
|
2882
|
+
"application/vnd.vcx": ["vcx"],
|
|
2883
|
+
"application/vnd.visio": ["vsd", "vst", "vss", "vsw", "vsdx", "vtx"],
|
|
2884
|
+
"application/vnd.visionary": ["vis"],
|
|
2885
|
+
"application/vnd.vsf": ["vsf"],
|
|
2886
|
+
"application/vnd.wap.wbxml": ["wbxml"],
|
|
2887
|
+
"application/vnd.wap.wmlc": ["wmlc"],
|
|
2888
|
+
"application/vnd.wap.wmlscriptc": ["wmlsc"],
|
|
2889
|
+
"application/vnd.webturbo": ["wtb"],
|
|
2890
|
+
"application/vnd.wolfram.player": ["nbp"],
|
|
2891
|
+
"application/vnd.wordperfect": ["wpd"],
|
|
2892
|
+
"application/vnd.wqd": ["wqd"],
|
|
2893
|
+
"application/vnd.wt.stf": ["stf"],
|
|
2894
|
+
"application/vnd.xara": ["xar"],
|
|
2895
|
+
"application/vnd.xfdl": ["xfdl"],
|
|
2896
|
+
"application/vnd.yamaha.hv-dic": ["hvd"],
|
|
2897
|
+
"application/vnd.yamaha.hv-script": ["hvs"],
|
|
2898
|
+
"application/vnd.yamaha.hv-voice": ["hvp"],
|
|
2899
|
+
"application/vnd.yamaha.openscoreformat": ["osf"],
|
|
2900
|
+
"application/vnd.yamaha.openscoreformat.osfpvg+xml": ["osfpvg"],
|
|
2901
|
+
"application/vnd.yamaha.smaf-audio": ["saf"],
|
|
2902
|
+
"application/vnd.yamaha.smaf-phrase": ["spf"],
|
|
2903
|
+
"application/vnd.yellowriver-custom-menu": ["cmp"],
|
|
2904
|
+
"application/vnd.zul": ["zir", "zirz"],
|
|
2905
|
+
"application/vnd.zzazz.deck+xml": ["zaz"],
|
|
2906
|
+
"application/x-7z-compressed": ["7z"],
|
|
2907
|
+
"application/x-abiword": ["abw"],
|
|
2908
|
+
"application/x-ace-compressed": ["ace"],
|
|
2909
|
+
"application/x-apple-diskimage": ["*dmg"],
|
|
2910
|
+
"application/x-arj": ["arj"],
|
|
2911
|
+
"application/x-authorware-bin": ["aab", "x32", "u32", "vox"],
|
|
2912
|
+
"application/x-authorware-map": ["aam"],
|
|
2913
|
+
"application/x-authorware-seg": ["aas"],
|
|
2914
|
+
"application/x-bcpio": ["bcpio"],
|
|
2915
|
+
"application/x-bdoc": ["*bdoc"],
|
|
2916
|
+
"application/x-bittorrent": ["torrent"],
|
|
2917
|
+
"application/x-blender": ["blend"],
|
|
2918
|
+
"application/x-blorb": ["blb", "blorb"],
|
|
2919
|
+
"application/x-bzip": ["bz"],
|
|
2920
|
+
"application/x-bzip2": ["bz2", "boz"],
|
|
2921
|
+
"application/x-cbr": ["cbr", "cba", "cbt", "cbz", "cb7"],
|
|
2922
|
+
"application/x-cdlink": ["vcd"],
|
|
2923
|
+
"application/x-cfs-compressed": ["cfs"],
|
|
2924
|
+
"application/x-chat": ["chat"],
|
|
2925
|
+
"application/x-chess-pgn": ["pgn"],
|
|
2926
|
+
"application/x-chrome-extension": ["crx"],
|
|
2927
|
+
"application/x-cocoa": ["cco"],
|
|
2928
|
+
"application/x-compressed": ["*rar"],
|
|
2929
|
+
"application/x-conference": ["nsc"],
|
|
2930
|
+
"application/x-cpio": ["cpio"],
|
|
2931
|
+
"application/x-csh": ["csh"],
|
|
2932
|
+
"application/x-debian-package": ["*deb", "udeb"],
|
|
2933
|
+
"application/x-dgc-compressed": ["dgc"],
|
|
2934
|
+
"application/x-director": [
|
|
2935
|
+
"dir",
|
|
2936
|
+
"dcr",
|
|
2937
|
+
"dxr",
|
|
2938
|
+
"cst",
|
|
2939
|
+
"cct",
|
|
2940
|
+
"cxt",
|
|
2941
|
+
"w3d",
|
|
2942
|
+
"fgd",
|
|
2943
|
+
"swa"
|
|
2944
|
+
],
|
|
2945
|
+
"application/x-doom": ["wad"],
|
|
2946
|
+
"application/x-dtbncx+xml": ["ncx"],
|
|
2947
|
+
"application/x-dtbook+xml": ["dtb"],
|
|
2948
|
+
"application/x-dtbresource+xml": ["res"],
|
|
2949
|
+
"application/x-dvi": ["dvi"],
|
|
2950
|
+
"application/x-envoy": ["evy"],
|
|
2951
|
+
"application/x-eva": ["eva"],
|
|
2952
|
+
"application/x-font-bdf": ["bdf"],
|
|
2953
|
+
"application/x-font-ghostscript": ["gsf"],
|
|
2954
|
+
"application/x-font-linux-psf": ["psf"],
|
|
2955
|
+
"application/x-font-pcf": ["pcf"],
|
|
2956
|
+
"application/x-font-snf": ["snf"],
|
|
2957
|
+
"application/x-font-type1": ["pfa", "pfb", "pfm", "afm"],
|
|
2958
|
+
"application/x-freearc": ["arc"],
|
|
2959
|
+
"application/x-futuresplash": ["spl"],
|
|
2960
|
+
"application/x-gca-compressed": ["gca"],
|
|
2961
|
+
"application/x-glulx": ["ulx"],
|
|
2962
|
+
"application/x-gnumeric": ["gnumeric"],
|
|
2963
|
+
"application/x-gramps-xml": ["gramps"],
|
|
2964
|
+
"application/x-gtar": ["gtar"],
|
|
2965
|
+
"application/x-hdf": ["hdf"],
|
|
2966
|
+
"application/x-httpd-php": ["php"],
|
|
2967
|
+
"application/x-install-instructions": ["install"],
|
|
2968
|
+
"application/x-ipynb+json": ["ipynb"],
|
|
2969
|
+
"application/x-iso9660-image": ["*iso"],
|
|
2970
|
+
"application/x-iwork-keynote-sffkey": ["*key"],
|
|
2971
|
+
"application/x-iwork-numbers-sffnumbers": ["*numbers"],
|
|
2972
|
+
"application/x-iwork-pages-sffpages": ["*pages"],
|
|
2973
|
+
"application/x-java-archive-diff": ["jardiff"],
|
|
2974
|
+
"application/x-java-jnlp-file": ["jnlp"],
|
|
2975
|
+
"application/x-keepass2": ["kdbx"],
|
|
2976
|
+
"application/x-latex": ["latex"],
|
|
2977
|
+
"application/x-lua-bytecode": ["luac"],
|
|
2978
|
+
"application/x-lzh-compressed": ["lzh", "lha"],
|
|
2979
|
+
"application/x-makeself": ["run"],
|
|
2980
|
+
"application/x-mie": ["mie"],
|
|
2981
|
+
"application/x-mobipocket-ebook": ["*prc", "mobi"],
|
|
2982
|
+
"application/x-ms-application": ["application"],
|
|
2983
|
+
"application/x-ms-shortcut": ["lnk"],
|
|
2984
|
+
"application/x-ms-wmd": ["wmd"],
|
|
2985
|
+
"application/x-ms-wmz": ["wmz"],
|
|
2986
|
+
"application/x-ms-xbap": ["xbap"],
|
|
2987
|
+
"application/x-msaccess": ["mdb"],
|
|
2988
|
+
"application/x-msbinder": ["obd"],
|
|
2989
|
+
"application/x-mscardfile": ["crd"],
|
|
2990
|
+
"application/x-msclip": ["clp"],
|
|
2991
|
+
"application/x-msdos-program": ["*exe"],
|
|
2992
|
+
"application/x-msdownload": ["*exe", "*dll", "com", "bat", "*msi"],
|
|
2993
|
+
"application/x-msmediaview": ["mvb", "m13", "m14"],
|
|
2994
|
+
"application/x-msmetafile": ["*wmf", "*wmz", "*emf", "emz"],
|
|
2995
|
+
"application/x-msmoney": ["mny"],
|
|
2996
|
+
"application/x-mspublisher": ["pub"],
|
|
2997
|
+
"application/x-msschedule": ["scd"],
|
|
2998
|
+
"application/x-msterminal": ["trm"],
|
|
2999
|
+
"application/x-mswrite": ["wri"],
|
|
3000
|
+
"application/x-netcdf": ["nc", "cdf"],
|
|
3001
|
+
"application/x-ns-proxy-autoconfig": ["pac"],
|
|
3002
|
+
"application/x-nzb": ["nzb"],
|
|
3003
|
+
"application/x-perl": ["pl", "pm"],
|
|
3004
|
+
"application/x-pilot": ["*prc", "*pdb"],
|
|
3005
|
+
"application/x-pkcs12": ["p12", "pfx"],
|
|
3006
|
+
"application/x-pkcs7-certificates": ["p7b", "spc"],
|
|
3007
|
+
"application/x-pkcs7-certreqresp": ["p7r"],
|
|
3008
|
+
"application/x-rar-compressed": ["*rar"],
|
|
3009
|
+
"application/x-redhat-package-manager": ["rpm"],
|
|
3010
|
+
"application/x-research-info-systems": ["ris"],
|
|
3011
|
+
"application/x-sea": ["sea"],
|
|
3012
|
+
"application/x-sh": ["sh"],
|
|
3013
|
+
"application/x-shar": ["shar"],
|
|
3014
|
+
"application/x-shockwave-flash": ["swf"],
|
|
3015
|
+
"application/x-silverlight-app": ["xap"],
|
|
3016
|
+
"application/x-sql": ["*sql"],
|
|
3017
|
+
"application/x-stuffit": ["sit"],
|
|
3018
|
+
"application/x-stuffitx": ["sitx"],
|
|
3019
|
+
"application/x-subrip": ["srt"],
|
|
3020
|
+
"application/x-sv4cpio": ["sv4cpio"],
|
|
3021
|
+
"application/x-sv4crc": ["sv4crc"],
|
|
3022
|
+
"application/x-t3vm-image": ["t3"],
|
|
3023
|
+
"application/x-tads": ["gam"],
|
|
3024
|
+
"application/x-tar": ["tar"],
|
|
3025
|
+
"application/x-tcl": ["tcl", "tk"],
|
|
3026
|
+
"application/x-tex": ["tex"],
|
|
3027
|
+
"application/x-tex-tfm": ["tfm"],
|
|
3028
|
+
"application/x-texinfo": ["texinfo", "texi"],
|
|
3029
|
+
"application/x-tgif": ["*obj"],
|
|
3030
|
+
"application/x-ustar": ["ustar"],
|
|
3031
|
+
"application/x-virtualbox-hdd": ["hdd"],
|
|
3032
|
+
"application/x-virtualbox-ova": ["ova"],
|
|
3033
|
+
"application/x-virtualbox-ovf": ["ovf"],
|
|
3034
|
+
"application/x-virtualbox-vbox": ["vbox"],
|
|
3035
|
+
"application/x-virtualbox-vbox-extpack": ["vbox-extpack"],
|
|
3036
|
+
"application/x-virtualbox-vdi": ["vdi"],
|
|
3037
|
+
"application/x-virtualbox-vhd": ["vhd"],
|
|
3038
|
+
"application/x-virtualbox-vmdk": ["vmdk"],
|
|
3039
|
+
"application/x-wais-source": ["src"],
|
|
3040
|
+
"application/x-web-app-manifest+json": ["webapp"],
|
|
3041
|
+
"application/x-x509-ca-cert": ["der", "crt", "pem"],
|
|
3042
|
+
"application/x-xfig": ["fig"],
|
|
3043
|
+
"application/x-xliff+xml": ["*xlf"],
|
|
3044
|
+
"application/x-xpinstall": ["xpi"],
|
|
3045
|
+
"application/x-xz": ["xz"],
|
|
3046
|
+
"application/x-zip-compressed": ["*zip"],
|
|
3047
|
+
"application/x-zmachine": ["z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"],
|
|
3048
|
+
"audio/vnd.dece.audio": ["uva", "uvva"],
|
|
3049
|
+
"audio/vnd.digital-winds": ["eol"],
|
|
3050
|
+
"audio/vnd.dra": ["dra"],
|
|
3051
|
+
"audio/vnd.dts": ["dts"],
|
|
3052
|
+
"audio/vnd.dts.hd": ["dtshd"],
|
|
3053
|
+
"audio/vnd.lucent.voice": ["lvp"],
|
|
3054
|
+
"audio/vnd.ms-playready.media.pya": ["pya"],
|
|
3055
|
+
"audio/vnd.nuera.ecelp4800": ["ecelp4800"],
|
|
3056
|
+
"audio/vnd.nuera.ecelp7470": ["ecelp7470"],
|
|
3057
|
+
"audio/vnd.nuera.ecelp9600": ["ecelp9600"],
|
|
3058
|
+
"audio/vnd.rip": ["rip"],
|
|
3059
|
+
"audio/x-aac": ["*aac"],
|
|
3060
|
+
"audio/x-aiff": ["aif", "aiff", "aifc"],
|
|
3061
|
+
"audio/x-caf": ["caf"],
|
|
3062
|
+
"audio/x-flac": ["flac"],
|
|
3063
|
+
"audio/x-m4a": ["*m4a"],
|
|
3064
|
+
"audio/x-matroska": ["mka"],
|
|
3065
|
+
"audio/x-mpegurl": ["m3u"],
|
|
3066
|
+
"audio/x-ms-wax": ["wax"],
|
|
3067
|
+
"audio/x-ms-wma": ["wma"],
|
|
3068
|
+
"audio/x-pn-realaudio": ["ram", "ra"],
|
|
3069
|
+
"audio/x-pn-realaudio-plugin": ["rmp"],
|
|
3070
|
+
"audio/x-realaudio": ["*ra"],
|
|
3071
|
+
"audio/x-wav": ["*wav"],
|
|
3072
|
+
"chemical/x-cdx": ["cdx"],
|
|
3073
|
+
"chemical/x-cif": ["cif"],
|
|
3074
|
+
"chemical/x-cmdf": ["cmdf"],
|
|
3075
|
+
"chemical/x-cml": ["cml"],
|
|
3076
|
+
"chemical/x-csml": ["csml"],
|
|
3077
|
+
"chemical/x-xyz": ["xyz"],
|
|
3078
|
+
"image/prs.btif": ["btif", "btf"],
|
|
3079
|
+
"image/prs.pti": ["pti"],
|
|
3080
|
+
"image/vnd.adobe.photoshop": ["psd"],
|
|
3081
|
+
"image/vnd.airzip.accelerator.azv": ["azv"],
|
|
3082
|
+
"image/vnd.blockfact.facti": ["facti"],
|
|
3083
|
+
"image/vnd.dece.graphic": ["uvi", "uvvi", "uvg", "uvvg"],
|
|
3084
|
+
"image/vnd.djvu": ["djvu", "djv"],
|
|
3085
|
+
"image/vnd.dvb.subtitle": ["*sub"],
|
|
3086
|
+
"image/vnd.dwg": ["dwg"],
|
|
3087
|
+
"image/vnd.dxf": ["dxf"],
|
|
3088
|
+
"image/vnd.fastbidsheet": ["fbs"],
|
|
3089
|
+
"image/vnd.fpx": ["fpx"],
|
|
3090
|
+
"image/vnd.fst": ["fst"],
|
|
3091
|
+
"image/vnd.fujixerox.edmics-mmr": ["mmr"],
|
|
3092
|
+
"image/vnd.fujixerox.edmics-rlc": ["rlc"],
|
|
3093
|
+
"image/vnd.microsoft.icon": ["ico"],
|
|
3094
|
+
"image/vnd.ms-dds": ["dds"],
|
|
3095
|
+
"image/vnd.ms-modi": ["mdi"],
|
|
3096
|
+
"image/vnd.ms-photo": ["wdp"],
|
|
3097
|
+
"image/vnd.net-fpx": ["npx"],
|
|
3098
|
+
"image/vnd.pco.b16": ["b16"],
|
|
3099
|
+
"image/vnd.tencent.tap": ["tap"],
|
|
3100
|
+
"image/vnd.valve.source.texture": ["vtf"],
|
|
3101
|
+
"image/vnd.wap.wbmp": ["wbmp"],
|
|
3102
|
+
"image/vnd.xiff": ["xif"],
|
|
3103
|
+
"image/vnd.zbrush.pcx": ["pcx"],
|
|
3104
|
+
"image/x-3ds": ["3ds"],
|
|
3105
|
+
"image/x-adobe-dng": ["dng"],
|
|
3106
|
+
"image/x-cmu-raster": ["ras"],
|
|
3107
|
+
"image/x-cmx": ["cmx"],
|
|
3108
|
+
"image/x-freehand": ["fh", "fhc", "fh4", "fh5", "fh7"],
|
|
3109
|
+
"image/x-icon": ["*ico"],
|
|
3110
|
+
"image/x-jng": ["jng"],
|
|
3111
|
+
"image/x-mrsid-image": ["sid"],
|
|
3112
|
+
"image/x-ms-bmp": ["*bmp"],
|
|
3113
|
+
"image/x-pcx": ["*pcx"],
|
|
3114
|
+
"image/x-pict": ["pic", "pct"],
|
|
3115
|
+
"image/x-portable-anymap": ["pnm"],
|
|
3116
|
+
"image/x-portable-bitmap": ["pbm"],
|
|
3117
|
+
"image/x-portable-graymap": ["pgm"],
|
|
3118
|
+
"image/x-portable-pixmap": ["ppm"],
|
|
3119
|
+
"image/x-rgb": ["rgb"],
|
|
3120
|
+
"image/x-tga": ["tga"],
|
|
3121
|
+
"image/x-xbitmap": ["xbm"],
|
|
3122
|
+
"image/x-xpixmap": ["xpm"],
|
|
3123
|
+
"image/x-xwindowdump": ["xwd"],
|
|
3124
|
+
"message/vnd.wfa.wsc": ["wsc"],
|
|
3125
|
+
"model/vnd.bary": ["bary"],
|
|
3126
|
+
"model/vnd.cld": ["cld"],
|
|
3127
|
+
"model/vnd.collada+xml": ["dae"],
|
|
3128
|
+
"model/vnd.dwf": ["dwf"],
|
|
3129
|
+
"model/vnd.gdl": ["gdl"],
|
|
3130
|
+
"model/vnd.gtw": ["gtw"],
|
|
3131
|
+
"model/vnd.mts": ["*mts"],
|
|
3132
|
+
"model/vnd.opengex": ["ogex"],
|
|
3133
|
+
"model/vnd.parasolid.transmit.binary": ["x_b"],
|
|
3134
|
+
"model/vnd.parasolid.transmit.text": ["x_t"],
|
|
3135
|
+
"model/vnd.pytha.pyox": ["pyo", "pyox"],
|
|
3136
|
+
"model/vnd.sap.vds": ["vds"],
|
|
3137
|
+
"model/vnd.usda": ["usda"],
|
|
3138
|
+
"model/vnd.usdz+zip": ["usdz"],
|
|
3139
|
+
"model/vnd.valve.source.compiled-map": ["bsp"],
|
|
3140
|
+
"model/vnd.vtu": ["vtu"],
|
|
3141
|
+
"text/prs.lines.tag": ["dsc"],
|
|
3142
|
+
"text/vnd.curl": ["curl"],
|
|
3143
|
+
"text/vnd.curl.dcurl": ["dcurl"],
|
|
3144
|
+
"text/vnd.curl.mcurl": ["mcurl"],
|
|
3145
|
+
"text/vnd.curl.scurl": ["scurl"],
|
|
3146
|
+
"text/vnd.dvb.subtitle": ["sub"],
|
|
3147
|
+
"text/vnd.familysearch.gedcom": ["ged"],
|
|
3148
|
+
"text/vnd.fly": ["fly"],
|
|
3149
|
+
"text/vnd.fmi.flexstor": ["flx"],
|
|
3150
|
+
"text/vnd.graphviz": ["gv"],
|
|
3151
|
+
"text/vnd.in3d.3dml": ["3dml"],
|
|
3152
|
+
"text/vnd.in3d.spot": ["spot"],
|
|
3153
|
+
"text/vnd.sun.j2me.app-descriptor": ["jad"],
|
|
3154
|
+
"text/vnd.wap.wml": ["wml"],
|
|
3155
|
+
"text/vnd.wap.wmlscript": ["wmls"],
|
|
3156
|
+
"text/x-asm": ["s", "asm"],
|
|
3157
|
+
"text/x-c": ["c", "cc", "cxx", "cpp", "h", "hh", "dic"],
|
|
3158
|
+
"text/x-component": ["htc"],
|
|
3159
|
+
"text/x-fortran": ["f", "for", "f77", "f90"],
|
|
3160
|
+
"text/x-handlebars-template": ["hbs"],
|
|
3161
|
+
"text/x-java-source": ["java"],
|
|
3162
|
+
"text/x-lua": ["lua"],
|
|
3163
|
+
"text/x-markdown": ["mkd"],
|
|
3164
|
+
"text/x-nfo": ["nfo"],
|
|
3165
|
+
"text/x-opml": ["opml"],
|
|
3166
|
+
"text/x-org": ["*org"],
|
|
3167
|
+
"text/x-pascal": ["p", "pas"],
|
|
3168
|
+
"text/x-processing": ["pde"],
|
|
3169
|
+
"text/x-sass": ["sass"],
|
|
3170
|
+
"text/x-scss": ["scss"],
|
|
3171
|
+
"text/x-setext": ["etx"],
|
|
3172
|
+
"text/x-sfv": ["sfv"],
|
|
3173
|
+
"text/x-suse-ymp": ["ymp"],
|
|
3174
|
+
"text/x-uuencode": ["uu"],
|
|
3175
|
+
"text/x-vcalendar": ["vcs"],
|
|
3176
|
+
"text/x-vcard": ["vcf"],
|
|
3177
|
+
"video/vnd.dece.hd": ["uvh", "uvvh"],
|
|
3178
|
+
"video/vnd.dece.mobile": ["uvm", "uvvm"],
|
|
3179
|
+
"video/vnd.dece.pd": ["uvp", "uvvp"],
|
|
3180
|
+
"video/vnd.dece.sd": ["uvs", "uvvs"],
|
|
3181
|
+
"video/vnd.dece.video": ["uvv", "uvvv"],
|
|
3182
|
+
"video/vnd.dvb.file": ["dvb"],
|
|
3183
|
+
"video/vnd.fvt": ["fvt"],
|
|
3184
|
+
"video/vnd.mpegurl": ["mxu", "m4u"],
|
|
3185
|
+
"video/vnd.ms-playready.media.pyv": ["pyv"],
|
|
3186
|
+
"video/vnd.uvvu.mp4": ["uvu", "uvvu"],
|
|
3187
|
+
"video/vnd.vivo": ["viv"],
|
|
3188
|
+
"video/x-f4v": ["f4v"],
|
|
3189
|
+
"video/x-fli": ["fli"],
|
|
3190
|
+
"video/x-flv": ["flv"],
|
|
3191
|
+
"video/x-m4v": ["m4v"],
|
|
3192
|
+
"video/x-matroska": ["mkv", "mk3d", "mks"],
|
|
3193
|
+
"video/x-mng": ["mng"],
|
|
3194
|
+
"video/x-ms-asf": ["asf", "asx"],
|
|
3195
|
+
"video/x-ms-vob": ["vob"],
|
|
3196
|
+
"video/x-ms-wm": ["wm"],
|
|
3197
|
+
"video/x-ms-wmv": ["wmv"],
|
|
3198
|
+
"video/x-ms-wmx": ["wmx"],
|
|
3199
|
+
"video/x-ms-wvx": ["wvx"],
|
|
3200
|
+
"video/x-msvideo": ["avi"],
|
|
3201
|
+
"video/x-sgi-movie": ["movie"],
|
|
3202
|
+
"video/x-smv": ["smv"],
|
|
3203
|
+
"x-conference/x-cooltalk": ["ice"]
|
|
3204
|
+
};
|
|
3205
|
+
Object.freeze(types);
|
|
3206
|
+
var other_default = types;
|
|
3207
|
+
|
|
3208
|
+
// node_modules/mime/dist/types/standard.js
|
|
3209
|
+
var types2 = {
|
|
3210
|
+
"application/andrew-inset": ["ez"],
|
|
3211
|
+
"application/appinstaller": ["appinstaller"],
|
|
3212
|
+
"application/applixware": ["aw"],
|
|
3213
|
+
"application/appx": ["appx"],
|
|
3214
|
+
"application/appxbundle": ["appxbundle"],
|
|
3215
|
+
"application/atom+xml": ["atom"],
|
|
3216
|
+
"application/atomcat+xml": ["atomcat"],
|
|
3217
|
+
"application/atomdeleted+xml": ["atomdeleted"],
|
|
3218
|
+
"application/atomsvc+xml": ["atomsvc"],
|
|
3219
|
+
"application/atsc-dwd+xml": ["dwd"],
|
|
3220
|
+
"application/atsc-held+xml": ["held"],
|
|
3221
|
+
"application/atsc-rsat+xml": ["rsat"],
|
|
3222
|
+
"application/automationml-aml+xml": ["aml"],
|
|
3223
|
+
"application/automationml-amlx+zip": ["amlx"],
|
|
3224
|
+
"application/bdoc": ["bdoc"],
|
|
3225
|
+
"application/calendar+xml": ["xcs"],
|
|
3226
|
+
"application/ccxml+xml": ["ccxml"],
|
|
3227
|
+
"application/cdfx+xml": ["cdfx"],
|
|
3228
|
+
"application/cdmi-capability": ["cdmia"],
|
|
3229
|
+
"application/cdmi-container": ["cdmic"],
|
|
3230
|
+
"application/cdmi-domain": ["cdmid"],
|
|
3231
|
+
"application/cdmi-object": ["cdmio"],
|
|
3232
|
+
"application/cdmi-queue": ["cdmiq"],
|
|
3233
|
+
"application/cpl+xml": ["cpl"],
|
|
3234
|
+
"application/cu-seeme": ["cu"],
|
|
3235
|
+
"application/cwl": ["cwl"],
|
|
3236
|
+
"application/dash+xml": ["mpd"],
|
|
3237
|
+
"application/dash-patch+xml": ["mpp"],
|
|
3238
|
+
"application/davmount+xml": ["davmount"],
|
|
3239
|
+
"application/dicom": ["dcm"],
|
|
3240
|
+
"application/docbook+xml": ["dbk"],
|
|
3241
|
+
"application/dssc+der": ["dssc"],
|
|
3242
|
+
"application/dssc+xml": ["xdssc"],
|
|
3243
|
+
"application/ecmascript": ["ecma"],
|
|
3244
|
+
"application/emma+xml": ["emma"],
|
|
3245
|
+
"application/emotionml+xml": ["emotionml"],
|
|
3246
|
+
"application/epub+zip": ["epub"],
|
|
3247
|
+
"application/exi": ["exi"],
|
|
3248
|
+
"application/express": ["exp"],
|
|
3249
|
+
"application/fdf": ["fdf"],
|
|
3250
|
+
"application/fdt+xml": ["fdt"],
|
|
3251
|
+
"application/font-tdpfr": ["pfr"],
|
|
3252
|
+
"application/geo+json": ["geojson"],
|
|
3253
|
+
"application/gml+xml": ["gml"],
|
|
3254
|
+
"application/gpx+xml": ["gpx"],
|
|
3255
|
+
"application/gxf": ["gxf"],
|
|
3256
|
+
"application/gzip": ["gz"],
|
|
3257
|
+
"application/hjson": ["hjson"],
|
|
3258
|
+
"application/hyperstudio": ["stk"],
|
|
3259
|
+
"application/inkml+xml": ["ink", "inkml"],
|
|
3260
|
+
"application/ipfix": ["ipfix"],
|
|
3261
|
+
"application/its+xml": ["its"],
|
|
3262
|
+
"application/java-archive": ["jar", "war", "ear"],
|
|
3263
|
+
"application/java-serialized-object": ["ser"],
|
|
3264
|
+
"application/java-vm": ["class"],
|
|
3265
|
+
"application/javascript": ["*js"],
|
|
3266
|
+
"application/json": ["json", "map"],
|
|
3267
|
+
"application/json5": ["json5"],
|
|
3268
|
+
"application/jsonml+json": ["jsonml"],
|
|
3269
|
+
"application/ld+json": ["jsonld"],
|
|
3270
|
+
"application/lgr+xml": ["lgr"],
|
|
3271
|
+
"application/lost+xml": ["lostxml"],
|
|
3272
|
+
"application/mac-binhex40": ["hqx"],
|
|
3273
|
+
"application/mac-compactpro": ["cpt"],
|
|
3274
|
+
"application/mads+xml": ["mads"],
|
|
3275
|
+
"application/manifest+json": ["webmanifest"],
|
|
3276
|
+
"application/marc": ["mrc"],
|
|
3277
|
+
"application/marcxml+xml": ["mrcx"],
|
|
3278
|
+
"application/mathematica": ["ma", "nb", "mb"],
|
|
3279
|
+
"application/mathml+xml": ["mathml"],
|
|
3280
|
+
"application/mbox": ["mbox"],
|
|
3281
|
+
"application/media-policy-dataset+xml": ["mpf"],
|
|
3282
|
+
"application/mediaservercontrol+xml": ["mscml"],
|
|
3283
|
+
"application/metalink+xml": ["metalink"],
|
|
3284
|
+
"application/metalink4+xml": ["meta4"],
|
|
3285
|
+
"application/mets+xml": ["mets"],
|
|
3286
|
+
"application/mmt-aei+xml": ["maei"],
|
|
3287
|
+
"application/mmt-usd+xml": ["musd"],
|
|
3288
|
+
"application/mods+xml": ["mods"],
|
|
3289
|
+
"application/mp21": ["m21", "mp21"],
|
|
3290
|
+
"application/mp4": ["*mp4", "*mpg4", "mp4s", "m4p"],
|
|
3291
|
+
"application/msix": ["msix"],
|
|
3292
|
+
"application/msixbundle": ["msixbundle"],
|
|
3293
|
+
"application/msword": ["doc", "dot"],
|
|
3294
|
+
"application/mxf": ["mxf"],
|
|
3295
|
+
"application/n-quads": ["nq"],
|
|
3296
|
+
"application/n-triples": ["nt"],
|
|
3297
|
+
"application/node": ["cjs"],
|
|
3298
|
+
"application/octet-stream": [
|
|
3299
|
+
"bin",
|
|
3300
|
+
"dms",
|
|
3301
|
+
"lrf",
|
|
3302
|
+
"mar",
|
|
3303
|
+
"so",
|
|
3304
|
+
"dist",
|
|
3305
|
+
"distz",
|
|
3306
|
+
"pkg",
|
|
3307
|
+
"bpk",
|
|
3308
|
+
"dump",
|
|
3309
|
+
"elc",
|
|
3310
|
+
"deploy",
|
|
3311
|
+
"exe",
|
|
3312
|
+
"dll",
|
|
3313
|
+
"deb",
|
|
3314
|
+
"dmg",
|
|
3315
|
+
"iso",
|
|
3316
|
+
"img",
|
|
3317
|
+
"msi",
|
|
3318
|
+
"msp",
|
|
3319
|
+
"msm",
|
|
3320
|
+
"buffer"
|
|
3321
|
+
],
|
|
3322
|
+
"application/oda": ["oda"],
|
|
3323
|
+
"application/oebps-package+xml": ["opf"],
|
|
3324
|
+
"application/ogg": ["ogx"],
|
|
3325
|
+
"application/omdoc+xml": ["omdoc"],
|
|
3326
|
+
"application/onenote": [
|
|
3327
|
+
"onetoc",
|
|
3328
|
+
"onetoc2",
|
|
3329
|
+
"onetmp",
|
|
3330
|
+
"onepkg",
|
|
3331
|
+
"one",
|
|
3332
|
+
"onea"
|
|
3333
|
+
],
|
|
3334
|
+
"application/oxps": ["oxps"],
|
|
3335
|
+
"application/p2p-overlay+xml": ["relo"],
|
|
3336
|
+
"application/patch-ops-error+xml": ["xer"],
|
|
3337
|
+
"application/pdf": ["pdf"],
|
|
3338
|
+
"application/pgp-encrypted": ["pgp"],
|
|
3339
|
+
"application/pgp-keys": ["asc"],
|
|
3340
|
+
"application/pgp-signature": ["sig", "*asc"],
|
|
3341
|
+
"application/pics-rules": ["prf"],
|
|
3342
|
+
"application/pkcs10": ["p10"],
|
|
3343
|
+
"application/pkcs7-mime": ["p7m", "p7c"],
|
|
3344
|
+
"application/pkcs7-signature": ["p7s"],
|
|
3345
|
+
"application/pkcs8": ["p8"],
|
|
3346
|
+
"application/pkix-attr-cert": ["ac"],
|
|
3347
|
+
"application/pkix-cert": ["cer"],
|
|
3348
|
+
"application/pkix-crl": ["crl"],
|
|
3349
|
+
"application/pkix-pkipath": ["pkipath"],
|
|
3350
|
+
"application/pkixcmp": ["pki"],
|
|
3351
|
+
"application/pls+xml": ["pls"],
|
|
3352
|
+
"application/postscript": ["ai", "eps", "ps"],
|
|
3353
|
+
"application/provenance+xml": ["provx"],
|
|
3354
|
+
"application/pskc+xml": ["pskcxml"],
|
|
3355
|
+
"application/raml+yaml": ["raml"],
|
|
3356
|
+
"application/rdf+xml": ["rdf", "owl"],
|
|
3357
|
+
"application/reginfo+xml": ["rif"],
|
|
3358
|
+
"application/relax-ng-compact-syntax": ["rnc"],
|
|
3359
|
+
"application/resource-lists+xml": ["rl"],
|
|
3360
|
+
"application/resource-lists-diff+xml": ["rld"],
|
|
3361
|
+
"application/rls-services+xml": ["rs"],
|
|
3362
|
+
"application/route-apd+xml": ["rapd"],
|
|
3363
|
+
"application/route-s-tsid+xml": ["sls"],
|
|
3364
|
+
"application/route-usd+xml": ["rusd"],
|
|
3365
|
+
"application/rpki-ghostbusters": ["gbr"],
|
|
3366
|
+
"application/rpki-manifest": ["mft"],
|
|
3367
|
+
"application/rpki-roa": ["roa"],
|
|
3368
|
+
"application/rsd+xml": ["rsd"],
|
|
3369
|
+
"application/rss+xml": ["rss"],
|
|
3370
|
+
"application/rtf": ["rtf"],
|
|
3371
|
+
"application/sbml+xml": ["sbml"],
|
|
3372
|
+
"application/scvp-cv-request": ["scq"],
|
|
3373
|
+
"application/scvp-cv-response": ["scs"],
|
|
3374
|
+
"application/scvp-vp-request": ["spq"],
|
|
3375
|
+
"application/scvp-vp-response": ["spp"],
|
|
3376
|
+
"application/sdp": ["sdp"],
|
|
3377
|
+
"application/senml+xml": ["senmlx"],
|
|
3378
|
+
"application/sensml+xml": ["sensmlx"],
|
|
3379
|
+
"application/set-payment-initiation": ["setpay"],
|
|
3380
|
+
"application/set-registration-initiation": ["setreg"],
|
|
3381
|
+
"application/shf+xml": ["shf"],
|
|
3382
|
+
"application/sieve": ["siv", "sieve"],
|
|
3383
|
+
"application/smil+xml": ["smi", "smil"],
|
|
3384
|
+
"application/sparql-query": ["rq"],
|
|
3385
|
+
"application/sparql-results+xml": ["srx"],
|
|
3386
|
+
"application/sql": ["sql"],
|
|
3387
|
+
"application/srgs": ["gram"],
|
|
3388
|
+
"application/srgs+xml": ["grxml"],
|
|
3389
|
+
"application/sru+xml": ["sru"],
|
|
3390
|
+
"application/ssdl+xml": ["ssdl"],
|
|
3391
|
+
"application/ssml+xml": ["ssml"],
|
|
3392
|
+
"application/swid+xml": ["swidtag"],
|
|
3393
|
+
"application/tei+xml": ["tei", "teicorpus"],
|
|
3394
|
+
"application/thraud+xml": ["tfi"],
|
|
3395
|
+
"application/timestamped-data": ["tsd"],
|
|
3396
|
+
"application/toml": ["toml"],
|
|
3397
|
+
"application/trig": ["trig"],
|
|
3398
|
+
"application/ttml+xml": ["ttml"],
|
|
3399
|
+
"application/ubjson": ["ubj"],
|
|
3400
|
+
"application/urc-ressheet+xml": ["rsheet"],
|
|
3401
|
+
"application/urc-targetdesc+xml": ["td"],
|
|
3402
|
+
"application/voicexml+xml": ["vxml"],
|
|
3403
|
+
"application/wasm": ["wasm"],
|
|
3404
|
+
"application/watcherinfo+xml": ["wif"],
|
|
3405
|
+
"application/widget": ["wgt"],
|
|
3406
|
+
"application/winhlp": ["hlp"],
|
|
3407
|
+
"application/wsdl+xml": ["wsdl"],
|
|
3408
|
+
"application/wspolicy+xml": ["wspolicy"],
|
|
3409
|
+
"application/xaml+xml": ["xaml"],
|
|
3410
|
+
"application/xcap-att+xml": ["xav"],
|
|
3411
|
+
"application/xcap-caps+xml": ["xca"],
|
|
3412
|
+
"application/xcap-diff+xml": ["xdf"],
|
|
3413
|
+
"application/xcap-el+xml": ["xel"],
|
|
3414
|
+
"application/xcap-ns+xml": ["xns"],
|
|
3415
|
+
"application/xenc+xml": ["xenc"],
|
|
3416
|
+
"application/xfdf": ["xfdf"],
|
|
3417
|
+
"application/xhtml+xml": ["xhtml", "xht"],
|
|
3418
|
+
"application/xliff+xml": ["xlf"],
|
|
3419
|
+
"application/xml": ["xml", "xsl", "xsd", "rng"],
|
|
3420
|
+
"application/xml-dtd": ["dtd"],
|
|
3421
|
+
"application/xop+xml": ["xop"],
|
|
3422
|
+
"application/xproc+xml": ["xpl"],
|
|
3423
|
+
"application/xslt+xml": ["*xsl", "xslt"],
|
|
3424
|
+
"application/xspf+xml": ["xspf"],
|
|
3425
|
+
"application/xv+xml": ["mxml", "xhvml", "xvml", "xvm"],
|
|
3426
|
+
"application/yang": ["yang"],
|
|
3427
|
+
"application/yin+xml": ["yin"],
|
|
3428
|
+
"application/zip": ["zip"],
|
|
3429
|
+
"application/zip+dotlottie": ["lottie"],
|
|
3430
|
+
"audio/3gpp": ["*3gpp"],
|
|
3431
|
+
"audio/aac": ["adts", "aac"],
|
|
3432
|
+
"audio/adpcm": ["adp"],
|
|
3433
|
+
"audio/amr": ["amr"],
|
|
3434
|
+
"audio/basic": ["au", "snd"],
|
|
3435
|
+
"audio/midi": ["mid", "midi", "kar", "rmi"],
|
|
3436
|
+
"audio/mobile-xmf": ["mxmf"],
|
|
3437
|
+
"audio/mp3": ["*mp3"],
|
|
3438
|
+
"audio/mp4": ["m4a", "mp4a", "m4b"],
|
|
3439
|
+
"audio/mpeg": ["mpga", "mp2", "mp2a", "mp3", "m2a", "m3a"],
|
|
3440
|
+
"audio/ogg": ["oga", "ogg", "spx", "opus"],
|
|
3441
|
+
"audio/s3m": ["s3m"],
|
|
3442
|
+
"audio/silk": ["sil"],
|
|
3443
|
+
"audio/wav": ["wav"],
|
|
3444
|
+
"audio/wave": ["*wav"],
|
|
3445
|
+
"audio/webm": ["weba"],
|
|
3446
|
+
"audio/xm": ["xm"],
|
|
3447
|
+
"font/collection": ["ttc"],
|
|
3448
|
+
"font/otf": ["otf"],
|
|
3449
|
+
"font/ttf": ["ttf"],
|
|
3450
|
+
"font/woff": ["woff"],
|
|
3451
|
+
"font/woff2": ["woff2"],
|
|
3452
|
+
"image/aces": ["exr"],
|
|
3453
|
+
"image/apng": ["apng"],
|
|
3454
|
+
"image/avci": ["avci"],
|
|
3455
|
+
"image/avcs": ["avcs"],
|
|
3456
|
+
"image/avif": ["avif"],
|
|
3457
|
+
"image/bmp": ["bmp", "dib"],
|
|
3458
|
+
"image/cgm": ["cgm"],
|
|
3459
|
+
"image/dicom-rle": ["drle"],
|
|
3460
|
+
"image/dpx": ["dpx"],
|
|
3461
|
+
"image/emf": ["emf"],
|
|
3462
|
+
"image/fits": ["fits"],
|
|
3463
|
+
"image/g3fax": ["g3"],
|
|
3464
|
+
"image/gif": ["gif"],
|
|
3465
|
+
"image/heic": ["heic"],
|
|
3466
|
+
"image/heic-sequence": ["heics"],
|
|
3467
|
+
"image/heif": ["heif"],
|
|
3468
|
+
"image/heif-sequence": ["heifs"],
|
|
3469
|
+
"image/hej2k": ["hej2"],
|
|
3470
|
+
"image/ief": ["ief"],
|
|
3471
|
+
"image/jaii": ["jaii"],
|
|
3472
|
+
"image/jais": ["jais"],
|
|
3473
|
+
"image/jls": ["jls"],
|
|
3474
|
+
"image/jp2": ["jp2", "jpg2"],
|
|
3475
|
+
"image/jpeg": ["jpg", "jpeg", "jpe"],
|
|
3476
|
+
"image/jph": ["jph"],
|
|
3477
|
+
"image/jphc": ["jhc"],
|
|
3478
|
+
"image/jpm": ["jpm", "jpgm"],
|
|
3479
|
+
"image/jpx": ["jpx", "jpf"],
|
|
3480
|
+
"image/jxl": ["jxl"],
|
|
3481
|
+
"image/jxr": ["jxr"],
|
|
3482
|
+
"image/jxra": ["jxra"],
|
|
3483
|
+
"image/jxrs": ["jxrs"],
|
|
3484
|
+
"image/jxs": ["jxs"],
|
|
3485
|
+
"image/jxsc": ["jxsc"],
|
|
3486
|
+
"image/jxsi": ["jxsi"],
|
|
3487
|
+
"image/jxss": ["jxss"],
|
|
3488
|
+
"image/ktx": ["ktx"],
|
|
3489
|
+
"image/ktx2": ["ktx2"],
|
|
3490
|
+
"image/pjpeg": ["jfif"],
|
|
3491
|
+
"image/png": ["png"],
|
|
3492
|
+
"image/sgi": ["sgi"],
|
|
3493
|
+
"image/svg+xml": ["svg", "svgz"],
|
|
3494
|
+
"image/t38": ["t38"],
|
|
3495
|
+
"image/tiff": ["tif", "tiff"],
|
|
3496
|
+
"image/tiff-fx": ["tfx"],
|
|
3497
|
+
"image/webp": ["webp"],
|
|
3498
|
+
"image/wmf": ["wmf"],
|
|
3499
|
+
"message/disposition-notification": ["disposition-notification"],
|
|
3500
|
+
"message/global": ["u8msg"],
|
|
3501
|
+
"message/global-delivery-status": ["u8dsn"],
|
|
3502
|
+
"message/global-disposition-notification": ["u8mdn"],
|
|
3503
|
+
"message/global-headers": ["u8hdr"],
|
|
3504
|
+
"message/rfc822": ["eml", "mime", "mht", "mhtml"],
|
|
3505
|
+
"model/3mf": ["3mf"],
|
|
3506
|
+
"model/gltf+json": ["gltf"],
|
|
3507
|
+
"model/gltf-binary": ["glb"],
|
|
3508
|
+
"model/iges": ["igs", "iges"],
|
|
3509
|
+
"model/jt": ["jt"],
|
|
3510
|
+
"model/mesh": ["msh", "mesh", "silo"],
|
|
3511
|
+
"model/mtl": ["mtl"],
|
|
3512
|
+
"model/obj": ["obj"],
|
|
3513
|
+
"model/prc": ["prc"],
|
|
3514
|
+
"model/step": ["step", "stp", "stpnc", "p21", "210"],
|
|
3515
|
+
"model/step+xml": ["stpx"],
|
|
3516
|
+
"model/step+zip": ["stpz"],
|
|
3517
|
+
"model/step-xml+zip": ["stpxz"],
|
|
3518
|
+
"model/stl": ["stl"],
|
|
3519
|
+
"model/u3d": ["u3d"],
|
|
3520
|
+
"model/vrml": ["wrl", "vrml"],
|
|
3521
|
+
"model/x3d+binary": ["*x3db", "x3dbz"],
|
|
3522
|
+
"model/x3d+fastinfoset": ["x3db"],
|
|
3523
|
+
"model/x3d+vrml": ["*x3dv", "x3dvz"],
|
|
3524
|
+
"model/x3d+xml": ["x3d", "x3dz"],
|
|
3525
|
+
"model/x3d-vrml": ["x3dv"],
|
|
3526
|
+
"text/cache-manifest": ["appcache", "manifest"],
|
|
3527
|
+
"text/calendar": ["ics", "ifb"],
|
|
3528
|
+
"text/coffeescript": ["coffee", "litcoffee"],
|
|
3529
|
+
"text/css": ["css"],
|
|
3530
|
+
"text/csv": ["csv"],
|
|
3531
|
+
"text/html": ["html", "htm", "shtml"],
|
|
3532
|
+
"text/jade": ["jade"],
|
|
3533
|
+
"text/javascript": ["js", "mjs"],
|
|
3534
|
+
"text/jsx": ["jsx"],
|
|
3535
|
+
"text/less": ["less"],
|
|
3536
|
+
"text/markdown": ["md", "markdown"],
|
|
3537
|
+
"text/mathml": ["mml"],
|
|
3538
|
+
"text/mdx": ["mdx"],
|
|
3539
|
+
"text/n3": ["n3"],
|
|
3540
|
+
"text/plain": ["txt", "text", "conf", "def", "list", "log", "in", "ini"],
|
|
3541
|
+
"text/richtext": ["rtx"],
|
|
3542
|
+
"text/rtf": ["*rtf"],
|
|
3543
|
+
"text/sgml": ["sgml", "sgm"],
|
|
3544
|
+
"text/shex": ["shex"],
|
|
3545
|
+
"text/slim": ["slim", "slm"],
|
|
3546
|
+
"text/spdx": ["spdx"],
|
|
3547
|
+
"text/stylus": ["stylus", "styl"],
|
|
3548
|
+
"text/tab-separated-values": ["tsv"],
|
|
3549
|
+
"text/troff": ["t", "tr", "roff", "man", "me", "ms"],
|
|
3550
|
+
"text/turtle": ["ttl"],
|
|
3551
|
+
"text/uri-list": ["uri", "uris", "urls"],
|
|
3552
|
+
"text/vcard": ["vcard"],
|
|
3553
|
+
"text/vtt": ["vtt"],
|
|
3554
|
+
"text/wgsl": ["wgsl"],
|
|
3555
|
+
"text/xml": ["*xml"],
|
|
3556
|
+
"text/yaml": ["yaml", "yml"],
|
|
3557
|
+
"video/3gpp": ["3gp", "3gpp"],
|
|
3558
|
+
"video/3gpp2": ["3g2"],
|
|
3559
|
+
"video/h261": ["h261"],
|
|
3560
|
+
"video/h263": ["h263"],
|
|
3561
|
+
"video/h264": ["h264"],
|
|
3562
|
+
"video/iso.segment": ["m4s"],
|
|
3563
|
+
"video/jpeg": ["jpgv"],
|
|
3564
|
+
"video/jpm": ["*jpm", "*jpgm"],
|
|
3565
|
+
"video/mj2": ["mj2", "mjp2"],
|
|
3566
|
+
"video/mp2t": ["ts", "m2t", "m2ts", "mts"],
|
|
3567
|
+
"video/mp4": ["mp4", "mp4v", "mpg4"],
|
|
3568
|
+
"video/mpeg": ["mpeg", "mpg", "mpe", "m1v", "m2v"],
|
|
3569
|
+
"video/ogg": ["ogv"],
|
|
3570
|
+
"video/quicktime": ["qt", "mov"],
|
|
3571
|
+
"video/webm": ["webm"]
|
|
3572
|
+
};
|
|
3573
|
+
Object.freeze(types2);
|
|
3574
|
+
var standard_default = types2;
|
|
3575
|
+
|
|
3576
|
+
// node_modules/mime/dist/src/Mime.js
|
|
3577
|
+
var __classPrivateFieldGet = function(receiver, state, kind, f) {
|
|
3578
|
+
if (kind === "a" && !f)
|
|
3579
|
+
throw new TypeError("Private accessor was defined without a getter");
|
|
3580
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
|
|
3581
|
+
throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
3582
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
3583
|
+
};
|
|
3584
|
+
var _Mime_extensionToType;
|
|
3585
|
+
var _Mime_typeToExtension;
|
|
3586
|
+
var _Mime_typeToExtensions;
|
|
3587
|
+
|
|
3588
|
+
class Mime {
|
|
3589
|
+
constructor(...args) {
|
|
3590
|
+
_Mime_extensionToType.set(this, new Map);
|
|
3591
|
+
_Mime_typeToExtension.set(this, new Map);
|
|
3592
|
+
_Mime_typeToExtensions.set(this, new Map);
|
|
3593
|
+
for (const arg of args) {
|
|
3594
|
+
this.define(arg);
|
|
3595
|
+
}
|
|
3596
|
+
}
|
|
3597
|
+
define(typeMap, force = false) {
|
|
3598
|
+
for (let [type, extensions] of Object.entries(typeMap)) {
|
|
3599
|
+
type = type.toLowerCase();
|
|
3600
|
+
extensions = extensions.map((ext) => ext.toLowerCase());
|
|
3601
|
+
if (!__classPrivateFieldGet(this, _Mime_typeToExtensions, "f").has(type)) {
|
|
3602
|
+
__classPrivateFieldGet(this, _Mime_typeToExtensions, "f").set(type, new Set);
|
|
3603
|
+
}
|
|
3604
|
+
const allExtensions = __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").get(type);
|
|
3605
|
+
let first = true;
|
|
3606
|
+
for (let extension of extensions) {
|
|
3607
|
+
const starred = extension.startsWith("*");
|
|
3608
|
+
extension = starred ? extension.slice(1) : extension;
|
|
3609
|
+
allExtensions?.add(extension);
|
|
3610
|
+
if (first) {
|
|
3611
|
+
__classPrivateFieldGet(this, _Mime_typeToExtension, "f").set(type, extension);
|
|
3612
|
+
}
|
|
3613
|
+
first = false;
|
|
3614
|
+
if (starred)
|
|
3615
|
+
continue;
|
|
3616
|
+
const currentType = __classPrivateFieldGet(this, _Mime_extensionToType, "f").get(extension);
|
|
3617
|
+
if (currentType && currentType != type && !force) {
|
|
3618
|
+
throw new Error(`"${type} -> ${extension}" conflicts with "${currentType} -> ${extension}". Pass \`force=true\` to override this definition.`);
|
|
3619
|
+
}
|
|
3620
|
+
__classPrivateFieldGet(this, _Mime_extensionToType, "f").set(extension, type);
|
|
3621
|
+
}
|
|
3622
|
+
}
|
|
3623
|
+
return this;
|
|
3624
|
+
}
|
|
3625
|
+
getType(path3) {
|
|
3626
|
+
if (typeof path3 !== "string")
|
|
3627
|
+
return null;
|
|
3628
|
+
const last = path3.replace(/^.*[/\\]/s, "").toLowerCase();
|
|
3629
|
+
const ext = last.replace(/^.*\./s, "").toLowerCase();
|
|
3630
|
+
const hasPath = last.length < path3.length;
|
|
3631
|
+
const hasDot = ext.length < last.length - 1;
|
|
3632
|
+
if (!hasDot && hasPath)
|
|
3633
|
+
return null;
|
|
3634
|
+
return __classPrivateFieldGet(this, _Mime_extensionToType, "f").get(ext) ?? null;
|
|
3635
|
+
}
|
|
3636
|
+
getExtension(type) {
|
|
3637
|
+
if (typeof type !== "string")
|
|
3638
|
+
return null;
|
|
3639
|
+
type = type?.split?.(";")[0];
|
|
3640
|
+
return (type && __classPrivateFieldGet(this, _Mime_typeToExtension, "f").get(type.trim().toLowerCase())) ?? null;
|
|
3641
|
+
}
|
|
3642
|
+
getAllExtensions(type) {
|
|
3643
|
+
if (typeof type !== "string")
|
|
3644
|
+
return null;
|
|
3645
|
+
return __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").get(type.toLowerCase()) ?? null;
|
|
3646
|
+
}
|
|
3647
|
+
_freeze() {
|
|
3648
|
+
this.define = () => {
|
|
3649
|
+
throw new Error("define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances");
|
|
3650
|
+
};
|
|
3651
|
+
Object.freeze(this);
|
|
3652
|
+
for (const extensions of __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").values()) {
|
|
3653
|
+
Object.freeze(extensions);
|
|
3654
|
+
}
|
|
3655
|
+
return this;
|
|
3656
|
+
}
|
|
3657
|
+
_getTestState() {
|
|
3658
|
+
return {
|
|
3659
|
+
types: __classPrivateFieldGet(this, _Mime_extensionToType, "f"),
|
|
3660
|
+
extensions: __classPrivateFieldGet(this, _Mime_typeToExtension, "f")
|
|
3661
|
+
};
|
|
3662
|
+
}
|
|
3663
|
+
}
|
|
3664
|
+
_Mime_extensionToType = new WeakMap, _Mime_typeToExtension = new WeakMap, _Mime_typeToExtensions = new WeakMap;
|
|
3665
|
+
var Mime_default = Mime;
|
|
3666
|
+
|
|
3667
|
+
// node_modules/mime/dist/src/index.js
|
|
3668
|
+
var src_default = new Mime_default(standard_default, other_default)._freeze();
|
|
3669
|
+
|
|
3670
|
+
// src/deploy.ts
|
|
2183
3671
|
var DEPLOY_URLS = {
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
|
|
3672
|
+
local: "http://localhost:5176/api/webapps/deploy",
|
|
3673
|
+
development: "https://development-cms.rodyssey.ai/api/webapps/deploy",
|
|
3674
|
+
staging: "https://staging-cms.rodyssey.ai/api/webapps/deploy",
|
|
3675
|
+
production: "https://cms.rodyssey.ai/api/webapps/deploy"
|
|
2187
3676
|
};
|
|
2188
3677
|
var BUILD_DIR = "dist";
|
|
2189
3678
|
var ZIP_FILE = "webapp-build.zip";
|
|
2190
3679
|
var MAX_FILES_PER_BATCH = 5;
|
|
2191
3680
|
var MAX_SIZE_PER_BATCH = 30 * 1024 * 1024;
|
|
2192
3681
|
function getAllFiles(dirPath, arrayOfFiles = []) {
|
|
2193
|
-
if (!
|
|
3682
|
+
if (!existsSync4(dirPath))
|
|
2194
3683
|
return arrayOfFiles;
|
|
2195
3684
|
const files = readdirSync(dirPath);
|
|
2196
3685
|
files.forEach(function(f) {
|
|
2197
|
-
const fullPath =
|
|
3686
|
+
const fullPath = join2(dirPath, f);
|
|
2198
3687
|
if (statSync(fullPath).isDirectory()) {
|
|
2199
3688
|
arrayOfFiles = getAllFiles(fullPath, arrayOfFiles);
|
|
2200
3689
|
} else {
|
|
@@ -2204,16 +3693,24 @@ function getAllFiles(dirPath, arrayOfFiles = []) {
|
|
|
2204
3693
|
return arrayOfFiles;
|
|
2205
3694
|
}
|
|
2206
3695
|
function fileToBlob(filePath) {
|
|
2207
|
-
const buffer =
|
|
2208
|
-
return new Blob([buffer]);
|
|
3696
|
+
const buffer = readFileSync4(filePath);
|
|
3697
|
+
return new Blob([buffer], { type: src_default.getType(filePath) || "application/octet-stream" });
|
|
2209
3698
|
}
|
|
2210
|
-
async function deploy(env = "development") {
|
|
3699
|
+
async function deploy(env = "development", overrides = {}) {
|
|
2211
3700
|
loadEnv(env);
|
|
2212
|
-
|
|
3701
|
+
let DEPLOY_URL = DEPLOY_URLS[env];
|
|
2213
3702
|
if (!DEPLOY_URL) {
|
|
2214
3703
|
console.error(`❌ Unknown environment "${env}". Available: ${Object.keys(DEPLOY_URLS).join(", ")}`);
|
|
2215
3704
|
process.exit(1);
|
|
2216
3705
|
}
|
|
3706
|
+
if (overrides.host || overrides.port) {
|
|
3707
|
+
const url = new URL(DEPLOY_URL);
|
|
3708
|
+
if (overrides.host)
|
|
3709
|
+
url.hostname = overrides.host;
|
|
3710
|
+
if (overrides.port)
|
|
3711
|
+
url.port = String(overrides.port);
|
|
3712
|
+
DEPLOY_URL = url.toString().replace(/\/$/, "");
|
|
3713
|
+
}
|
|
2217
3714
|
const ASSETS_URL = DEPLOY_URL.replace("/webapps/deploy", "/webapps/assets");
|
|
2218
3715
|
console.log(`\uD83D\uDE80 Starting deployment process for [${env}] environment...
|
|
2219
3716
|
`);
|
|
@@ -2283,7 +3780,7 @@ ${errorText}`);
|
|
|
2283
3780
|
console.log(`\uD83D\uDCDC Step 3: Setting up ${scriptFiles.length} scripts (APIs & Crons)...`);
|
|
2284
3781
|
const scriptsPayload = { api: {}, cron: {}, cronConfig: null };
|
|
2285
3782
|
for (const f of scriptFiles) {
|
|
2286
|
-
const content =
|
|
3783
|
+
const content = readFileSync4(f, "utf-8");
|
|
2287
3784
|
const relativePath = f.substring(BUILD_DIR.length + 1).replace(/\\/g, "/");
|
|
2288
3785
|
if (relativePath === "cron-jobs/cron.config.json") {
|
|
2289
3786
|
scriptsPayload.cronConfig = JSON.parse(content);
|
|
@@ -2323,7 +3820,7 @@ ${errorText}`);
|
|
|
2323
3820
|
console.log(`✅ Created ${ZIP_FILE}
|
|
2324
3821
|
`);
|
|
2325
3822
|
console.log("☁️ Step 5: Deploying HTML zip to server...");
|
|
2326
|
-
const zipBuffer =
|
|
3823
|
+
const zipBuffer = readFileSync4(ZIP_FILE);
|
|
2327
3824
|
try {
|
|
2328
3825
|
const response = await fetch(DEPLOY_URL, {
|
|
2329
3826
|
method: "POST",
|
|
@@ -2346,7 +3843,7 @@ ${errorText}`);
|
|
|
2346
3843
|
console.error("❌ Deploy failed:", error);
|
|
2347
3844
|
throw error;
|
|
2348
3845
|
} finally {
|
|
2349
|
-
if (
|
|
3846
|
+
if (existsSync4(ZIP_FILE)) {
|
|
2350
3847
|
unlinkSync(ZIP_FILE);
|
|
2351
3848
|
console.log(`
|
|
2352
3849
|
\uD83E\uDDF9 Cleaned up ${ZIP_FILE}`);
|
|
@@ -2358,7 +3855,7 @@ ${errorText}`);
|
|
|
2358
3855
|
|
|
2359
3856
|
// src/upgrade-template.ts
|
|
2360
3857
|
import { execSync as execSync3 } from "node:child_process";
|
|
2361
|
-
import { existsSync as
|
|
3858
|
+
import { existsSync as existsSync5, readFileSync as readFileSync5, writeFileSync as writeFileSync4, mkdirSync as mkdirSync2, copyFileSync, rmSync as rmSync2 } from "node:fs";
|
|
2362
3859
|
var TEMPLATES = {
|
|
2363
3860
|
webapp: {
|
|
2364
3861
|
name: "webapp (SPA)",
|
|
@@ -2386,17 +3883,19 @@ var TEMPLATES = {
|
|
|
2386
3883
|
}
|
|
2387
3884
|
};
|
|
2388
3885
|
var CLI_SCRIPTS = {
|
|
2389
|
-
"link-game-sdk": "bunx @rodyssey/cli app update-game-sdk",
|
|
2390
|
-
deploy: "bunx @rodyssey/cli app deploy",
|
|
2391
|
-
"
|
|
3886
|
+
"link-game-sdk": "bunx @rodyssey/cli@latest app update-game-sdk",
|
|
3887
|
+
deploy: "bunx @rodyssey/cli@latest app deploy",
|
|
3888
|
+
"get-webapp-config": "bunx @rodyssey/cli@latest app config get",
|
|
3889
|
+
"update-webapp-config": "bunx @rodyssey/cli@latest app config set",
|
|
3890
|
+
"upgrade-template": "bunx @rodyssey/cli@latest app upgrade-template"
|
|
2392
3891
|
};
|
|
2393
3892
|
function detectTemplate() {
|
|
2394
|
-
if (
|
|
3893
|
+
if (existsSync5("app")) {
|
|
2395
3894
|
console.log(`\uD83D\uDD0D Detected fullstack template (found app/ directory)
|
|
2396
3895
|
`);
|
|
2397
3896
|
return TEMPLATES["webapp-fullstack"];
|
|
2398
3897
|
}
|
|
2399
|
-
if (
|
|
3898
|
+
if (existsSync5("src")) {
|
|
2400
3899
|
console.log(`\uD83D\uDD0D Detected SPA template (found src/ directory)
|
|
2401
3900
|
`);
|
|
2402
3901
|
return TEMPLATES["webapp"];
|
|
@@ -2407,11 +3906,11 @@ function detectTemplate() {
|
|
|
2407
3906
|
}
|
|
2408
3907
|
function updatePackageJsonScripts() {
|
|
2409
3908
|
const pkgPath = "package.json";
|
|
2410
|
-
if (!
|
|
3909
|
+
if (!existsSync5(pkgPath)) {
|
|
2411
3910
|
console.log("⚠️ No package.json found, skipping scripts update");
|
|
2412
3911
|
return;
|
|
2413
3912
|
}
|
|
2414
|
-
const pkg = JSON.parse(
|
|
3913
|
+
const pkg = JSON.parse(readFileSync5(pkgPath, "utf-8"));
|
|
2415
3914
|
if (!pkg.scripts) {
|
|
2416
3915
|
pkg.scripts = {};
|
|
2417
3916
|
}
|
|
@@ -2425,7 +3924,7 @@ function updatePackageJsonScripts() {
|
|
|
2425
3924
|
}
|
|
2426
3925
|
}
|
|
2427
3926
|
if (updated) {
|
|
2428
|
-
|
|
3927
|
+
writeFileSync4(pkgPath, JSON.stringify(pkg, null, 2) + `
|
|
2429
3928
|
`, "utf-8");
|
|
2430
3929
|
console.log(`✅ package.json scripts updated
|
|
2431
3930
|
`);
|
|
@@ -2449,8 +3948,8 @@ function updateCliSkill() {
|
|
|
2449
3948
|
}
|
|
2450
3949
|
execSync3(`git fetch ${cliRemote}`, { stdio: "inherit" });
|
|
2451
3950
|
execSync3(`git checkout ${cliRemote}/main -- skills/ro-cli/SKILL.md`, { stdio: "inherit" });
|
|
2452
|
-
if (
|
|
2453
|
-
|
|
3951
|
+
if (existsSync5("skills/ro-cli/SKILL.md")) {
|
|
3952
|
+
mkdirSync2(".agent/skills/ro-cli", { recursive: true });
|
|
2454
3953
|
copyFileSync("skills/ro-cli/SKILL.md", ".agent/skills/ro-cli/SKILL.md");
|
|
2455
3954
|
rmSync2("skills", { recursive: true, force: true });
|
|
2456
3955
|
console.log(` ✅ CLI skill updated
|
|
@@ -2482,7 +3981,7 @@ async function upgradeTemplate() {
|
|
|
2482
3981
|
const checkoutList = template.checkoutFiles.join(" ");
|
|
2483
3982
|
execSync3(`git checkout ${template.remoteName}/main -- ${checkoutList}`, { stdio: "inherit" });
|
|
2484
3983
|
for (const file of template.newFiles) {
|
|
2485
|
-
if (!
|
|
3984
|
+
if (!existsSync5(file)) {
|
|
2486
3985
|
console.log(`\uD83D\uDCC2 Checking out ${file}...`);
|
|
2487
3986
|
try {
|
|
2488
3987
|
execSync3(`git checkout ${template.remoteName}/main -- ${file}`, { stdio: "inherit" });
|
|
@@ -2507,7 +4006,7 @@ async function upgradeTemplate() {
|
|
|
2507
4006
|
|
|
2508
4007
|
// src/update-game-sdk.ts
|
|
2509
4008
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
2510
|
-
import { dirname, join as
|
|
4009
|
+
import { dirname as dirname2, join as join3 } from "node:path";
|
|
2511
4010
|
var BASE_URL = "https://development-app.rodyssey.ai";
|
|
2512
4011
|
var FILES = [
|
|
2513
4012
|
{
|
|
@@ -2537,7 +4036,7 @@ async function downloadFile(url, path3, description) {
|
|
|
2537
4036
|
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
2538
4037
|
}
|
|
2539
4038
|
const content = await response.text();
|
|
2540
|
-
const dir =
|
|
4039
|
+
const dir = dirname2(path3);
|
|
2541
4040
|
await mkdir(dir, { recursive: true });
|
|
2542
4041
|
await writeFile(path3, content, "utf-8");
|
|
2543
4042
|
console.log(`✅ Downloaded ${description} (${content.length} bytes)
|
|
@@ -2581,7 +4080,7 @@ async function downloadDocumentation(manifest) {
|
|
|
2581
4080
|
let failCount = 0;
|
|
2582
4081
|
for (const doc of manifest.documentation) {
|
|
2583
4082
|
const url = `${BASE_URL}/skills/${doc.file}`;
|
|
2584
|
-
const path3 =
|
|
4083
|
+
const path3 = join3(".agent", "skills", "game-sdk", doc.file);
|
|
2585
4084
|
const description = `${doc.title} (${doc.category})`;
|
|
2586
4085
|
const success = await downloadFile(url, path3, description);
|
|
2587
4086
|
if (success) {
|
|
@@ -2640,6 +4139,162 @@ async function updateGameSdk() {
|
|
|
2640
4139
|
}
|
|
2641
4140
|
}
|
|
2642
4141
|
|
|
4142
|
+
// src/update-webapp-config.ts
|
|
4143
|
+
import { existsSync as existsSync6, readFileSync as readFileSync6, writeFileSync as writeFileSync5 } from "node:fs";
|
|
4144
|
+
import { resolve } from "node:path";
|
|
4145
|
+
var CONFIG_URLS = {
|
|
4146
|
+
local: "http://localhost:5176/api/webapps/config",
|
|
4147
|
+
development: "https://development-cms.rodyssey.ai/api/webapps/config",
|
|
4148
|
+
staging: "https://staging-cms.rodyssey.ai/api/webapps/config",
|
|
4149
|
+
production: "https://cms.rodyssey.ai/api/webapps/config"
|
|
4150
|
+
};
|
|
4151
|
+
function parseJsonOption(value, optionName) {
|
|
4152
|
+
const maybePath = resolve(process.cwd(), value);
|
|
4153
|
+
const raw = existsSync6(maybePath) ? readFileSync6(maybePath, "utf-8") : value;
|
|
4154
|
+
try {
|
|
4155
|
+
const parsed = JSON.parse(raw);
|
|
4156
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
4157
|
+
throw new Error("value must be a JSON object");
|
|
4158
|
+
}
|
|
4159
|
+
return parsed;
|
|
4160
|
+
} catch (error) {
|
|
4161
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
4162
|
+
throw new Error(`Invalid ${optionName}: ${message}`);
|
|
4163
|
+
}
|
|
4164
|
+
}
|
|
4165
|
+
function resolveConfigUrl(options, required = true) {
|
|
4166
|
+
const configUrl = options.url || process.env.WEBAPP_CONFIG_URL || CONFIG_URLS[options.env];
|
|
4167
|
+
if (!configUrl) {
|
|
4168
|
+
if (!required)
|
|
4169
|
+
return;
|
|
4170
|
+
console.error("❌ Error: no webapp config endpoint configured.");
|
|
4171
|
+
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.`);
|
|
4172
|
+
process.exit(1);
|
|
4173
|
+
}
|
|
4174
|
+
const url = new URL(configUrl);
|
|
4175
|
+
if (!options.host && !options.port) {
|
|
4176
|
+
return url.toString().replace(/\/$/, "");
|
|
4177
|
+
}
|
|
4178
|
+
if (options.host)
|
|
4179
|
+
url.hostname = options.host;
|
|
4180
|
+
if (options.port)
|
|
4181
|
+
url.port = String(options.port);
|
|
4182
|
+
return url.toString().replace(/\/$/, "");
|
|
4183
|
+
}
|
|
4184
|
+
function buildConfigPayload(options) {
|
|
4185
|
+
const payload = options.config ? parseJsonOption(options.config, "--config") : {};
|
|
4186
|
+
if (options.title !== undefined)
|
|
4187
|
+
payload.title = options.title;
|
|
4188
|
+
if (options.description !== undefined)
|
|
4189
|
+
payload.description = options.description;
|
|
4190
|
+
if (options.coverImg !== undefined)
|
|
4191
|
+
payload.coverImg = options.coverImg;
|
|
4192
|
+
if (options.localization !== undefined) {
|
|
4193
|
+
payload.localization = parseJsonOption(options.localization, "--localization");
|
|
4194
|
+
}
|
|
4195
|
+
return payload;
|
|
4196
|
+
}
|
|
4197
|
+
function resolveWebappId(webappId) {
|
|
4198
|
+
const resolved = webappId || process.env.WEBAPP_ID;
|
|
4199
|
+
if (!resolved) {
|
|
4200
|
+
console.error("❌ Error: WEBAPP_ID is not set. Pass --webapp-id or set it in your .env file.");
|
|
4201
|
+
process.exit(1);
|
|
4202
|
+
}
|
|
4203
|
+
return resolved;
|
|
4204
|
+
}
|
|
4205
|
+
function ensureDeployToken(env) {
|
|
4206
|
+
if (process.env.DEPLOY_TOKEN)
|
|
4207
|
+
return;
|
|
4208
|
+
console.error("❌ Error: DEPLOY_TOKEN is not set in environment variables.");
|
|
4209
|
+
console.info(`\uD83D\uDCA1 Please check your .env or .env.${env} file.`);
|
|
4210
|
+
process.exit(1);
|
|
4211
|
+
}
|
|
4212
|
+
function getConfigUrl(options, required = true) {
|
|
4213
|
+
return resolveConfigUrl(options, required);
|
|
4214
|
+
}
|
|
4215
|
+
async function getWebappConfig(options) {
|
|
4216
|
+
loadEnv(options.env);
|
|
4217
|
+
const webappId = resolveWebappId(options.webappId);
|
|
4218
|
+
const CONFIG_URL = getConfigUrl(options);
|
|
4219
|
+
if (!CONFIG_URL)
|
|
4220
|
+
return;
|
|
4221
|
+
ensureDeployToken(options.env);
|
|
4222
|
+
const url = new URL(CONFIG_URL);
|
|
4223
|
+
url.searchParams.set("webappId", webappId);
|
|
4224
|
+
console.log(`⚙️ Pulling webapp config for [${options.env}] environment...`);
|
|
4225
|
+
console.log(`\uD83D\uDCCD Config URL: ${url.toString()}`);
|
|
4226
|
+
console.log(`\uD83D\uDCCD Webapp ID: ${webappId}
|
|
4227
|
+
`);
|
|
4228
|
+
const response = await fetch(url, {
|
|
4229
|
+
method: "GET",
|
|
4230
|
+
headers: {
|
|
4231
|
+
Authorization: `Bearer ${process.env.DEPLOY_TOKEN}`,
|
|
4232
|
+
Accept: "application/json"
|
|
4233
|
+
}
|
|
4234
|
+
});
|
|
4235
|
+
if (!response.ok) {
|
|
4236
|
+
const errorText = await response.text();
|
|
4237
|
+
throw new Error(`Config fetch failed: ${response.status} ${response.statusText}
|
|
4238
|
+
${errorText}`);
|
|
4239
|
+
}
|
|
4240
|
+
const config = await response.json();
|
|
4241
|
+
const output = JSON.stringify(config, null, 2);
|
|
4242
|
+
if (options.out) {
|
|
4243
|
+
writeFileSync5(options.out, `${output}
|
|
4244
|
+
`, "utf-8");
|
|
4245
|
+
console.log(`✅ Webapp config written to ${options.out}`);
|
|
4246
|
+
return;
|
|
4247
|
+
}
|
|
4248
|
+
console.log(output);
|
|
4249
|
+
}
|
|
4250
|
+
async function updateWebappConfig(options) {
|
|
4251
|
+
loadEnv(options.env);
|
|
4252
|
+
const webappId = resolveWebappId(options.webappId);
|
|
4253
|
+
const config = buildConfigPayload(options);
|
|
4254
|
+
if (Object.keys(config).length === 0) {
|
|
4255
|
+
console.error("❌ Error: no config fields provided. Use --title, --cover-img, --localization, or --config.");
|
|
4256
|
+
process.exit(1);
|
|
4257
|
+
}
|
|
4258
|
+
const payload = { webappId, config };
|
|
4259
|
+
const CONFIG_URL = getConfigUrl(options, !options.dryRun);
|
|
4260
|
+
if (!options.dryRun)
|
|
4261
|
+
ensureDeployToken(options.env);
|
|
4262
|
+
console.log(`⚙️ Updating webapp config for [${options.env}] environment...`);
|
|
4263
|
+
if (CONFIG_URL) {
|
|
4264
|
+
console.log(`\uD83D\uDCCD Config URL: ${CONFIG_URL}`);
|
|
4265
|
+
}
|
|
4266
|
+
console.log(`\uD83D\uDCCD Webapp ID: ${webappId}
|
|
4267
|
+
`);
|
|
4268
|
+
if (options.dryRun) {
|
|
4269
|
+
console.log("\uD83E\uDDEA Dry run payload:");
|
|
4270
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
4271
|
+
return;
|
|
4272
|
+
}
|
|
4273
|
+
if (!CONFIG_URL)
|
|
4274
|
+
return;
|
|
4275
|
+
const response = await fetch(CONFIG_URL, {
|
|
4276
|
+
method: "PATCH",
|
|
4277
|
+
headers: {
|
|
4278
|
+
Authorization: `Bearer ${process.env.DEPLOY_TOKEN}`,
|
|
4279
|
+
"Content-Type": "application/json"
|
|
4280
|
+
},
|
|
4281
|
+
body: JSON.stringify(payload)
|
|
4282
|
+
});
|
|
4283
|
+
if (!response.ok) {
|
|
4284
|
+
const errorText = await response.text();
|
|
4285
|
+
throw new Error(`Config update failed: ${response.status} ${response.statusText}
|
|
4286
|
+
${errorText}`);
|
|
4287
|
+
}
|
|
4288
|
+
const result = await response.json().catch(() => {
|
|
4289
|
+
return;
|
|
4290
|
+
});
|
|
4291
|
+
console.log("✅ Webapp config updated");
|
|
4292
|
+
if (result !== undefined) {
|
|
4293
|
+
console.log(`
|
|
4294
|
+
\uD83D\uDCCB Update result:`, result);
|
|
4295
|
+
}
|
|
4296
|
+
}
|
|
4297
|
+
|
|
2643
4298
|
// src/cli.ts
|
|
2644
4299
|
var TEMPLATES2 = {
|
|
2645
4300
|
webapp: {
|
|
@@ -2667,22 +4322,28 @@ Available templates:
|
|
|
2667
4322
|
input: process.stdin,
|
|
2668
4323
|
output: process.stdout
|
|
2669
4324
|
});
|
|
2670
|
-
return new Promise((
|
|
4325
|
+
return new Promise((resolve2) => {
|
|
2671
4326
|
rl.question(`Select a template (1-${entries.length}): `, (answer) => {
|
|
2672
4327
|
rl.close();
|
|
2673
4328
|
const index = parseInt(answer, 10) - 1;
|
|
2674
4329
|
if (index >= 0 && index < entries.length) {
|
|
2675
|
-
|
|
4330
|
+
resolve2(entries[index].name);
|
|
2676
4331
|
} else {
|
|
2677
4332
|
console.error("Invalid selection, defaulting to 'webapp'");
|
|
2678
|
-
|
|
4333
|
+
resolve2("webapp");
|
|
2679
4334
|
}
|
|
2680
4335
|
});
|
|
2681
4336
|
});
|
|
2682
4337
|
}
|
|
2683
4338
|
program.name("@rodyssey/cli").description("Airconcepts CLI toolkit").version("0.1.0");
|
|
2684
4339
|
var app = program.command("app").description("Manage webapp projects");
|
|
2685
|
-
|
|
4340
|
+
function addConfigTargetOptions(command) {
|
|
4341
|
+
return command.option("-e, --env <environment>", "Target environment (local | development | staging | production)", "development").option("--url <url>", "Override the config endpoint URL").option("--host <host>", "Override the config endpoint host").option("--port <port>", "Override the config endpoint port", parseInt).option("--webapp-id <id>", "Webapp ID. Defaults to WEBAPP_ID from .env");
|
|
4342
|
+
}
|
|
4343
|
+
function addConfigSetOptions(command) {
|
|
4344
|
+
return addConfigTargetOptions(command).option("--title <title>", "Webapp title").option("--description <description>", "Webapp description").option("--cover-img <url>", "Cover image URL").option("--localization <json-or-file>", "Localization JSON object or path to a JSON file").option("--config <json-or-file>", "Full config JSON object or path to a JSON file").option("--dry-run", "Print the request payload without sending it");
|
|
4345
|
+
}
|
|
4346
|
+
app.command("create").argument("<project-name>", "Name of the project to create").option("-t, --template <template>", "Template to use (webapp | webapp-fullstack)").option("--auto", "Create a CMS webapp and write WEBAPP_ID/DEPLOY_TOKEN to .env").option("-e, --env <environment>", "CMS environment for --auto (local | development | staging | production)", "development").option("--cms-url <url>", "CMS base URL for --auto. Defaults to the selected environment").option("--create-url <url>", "Full CMS create endpoint for --auto. Defaults to <cms-url>/api/cli/webapps/create").description("Create a new project from a template").action(async (projectName, options) => {
|
|
2686
4347
|
let templateName;
|
|
2687
4348
|
if (options.template) {
|
|
2688
4349
|
if (!(options.template in TEMPLATES2)) {
|
|
@@ -2694,13 +4355,43 @@ app.command("create").argument("<project-name>", "Name of the project to create"
|
|
|
2694
4355
|
templateName = await selectTemplate();
|
|
2695
4356
|
}
|
|
2696
4357
|
const template = TEMPLATES2[templateName];
|
|
2697
|
-
await create(projectName, template.repo, templateName
|
|
4358
|
+
await create(projectName, template.repo, templateName, {
|
|
4359
|
+
enabled: options.auto,
|
|
4360
|
+
env: options.env,
|
|
4361
|
+
cmsUrl: options.cmsUrl,
|
|
4362
|
+
createUrl: options.createUrl
|
|
4363
|
+
});
|
|
2698
4364
|
});
|
|
2699
4365
|
app.command("update-game-sdk").description("Download and update the GameSDK library, types, and documentation").action(async () => {
|
|
2700
4366
|
await updateGameSdk();
|
|
2701
4367
|
});
|
|
2702
|
-
app.command("deploy").description("Build and deploy the webapp to the server").option("-e, --env <environment>", "Target environment (development | staging | production)", "development").action(async (options) => {
|
|
2703
|
-
await deploy(options.env);
|
|
4368
|
+
app.command("deploy").description("Build and deploy the webapp to the server").option("-e, --env <environment>", "Target environment (local | development | staging | production)", "development").option("--host <host>", "Override the deploy host").option("--port <port>", "Override the deploy port", parseInt).action(async (options) => {
|
|
4369
|
+
await deploy(options.env, { host: options.host, port: options.port });
|
|
4370
|
+
});
|
|
4371
|
+
var auth = app.command("auth").description("Authenticate with the CMS");
|
|
4372
|
+
auth.command("login").description("Log in to the CMS using a browser callback").option("-e, --env <environment>", "CMS environment (local | development | staging | production)", "development").option("--cms-url <url>", "CMS base URL. Defaults to the selected environment").option("--login-url <url>", "Full browser login URL. Defaults to <cms-url>/auth/cli-login").option("--token-url <url>", "Full token exchange URL. Defaults to <cms-url>/api/auth/cli-token").option("--callback-port <port>", "Local callback port. Defaults to a random free port", parseInt).option("--timeout <seconds>", "Seconds to wait for the browser callback", parseInt, 300).option("--no-open", "Print the login URL without opening a browser").action(async (options) => {
|
|
4373
|
+
const session = await login({
|
|
4374
|
+
env: options.env,
|
|
4375
|
+
cmsUrl: options.cmsUrl,
|
|
4376
|
+
loginUrl: options.loginUrl,
|
|
4377
|
+
tokenUrl: options.tokenUrl,
|
|
4378
|
+
callbackPort: options.callbackPort,
|
|
4379
|
+
open: options.open,
|
|
4380
|
+
timeoutMs: (options.timeout ?? 300) * 1000
|
|
4381
|
+
});
|
|
4382
|
+
console.log(`✅ Logged in to CMS [${session.env}]`);
|
|
4383
|
+
console.log(`\uD83D\uDCCD CMS URL: ${session.cmsUrl}`);
|
|
4384
|
+
});
|
|
4385
|
+
auth.command("me").description("Show the locally stored CMS login session").option("-e, --env <environment>", "CMS environment (local | development | staging | production)", "development").option("--remote", "Call the CMS /me endpoint instead of only reading the local session").option("--cms-url <url>", "CMS base URL for --remote. Defaults to the selected environment or stored session").option("--me-url <url>", "Full me endpoint URL for --remote. Defaults to <cms-url>/api/auth/me").action(async (options) => {
|
|
4386
|
+
const currentUser = await me(options);
|
|
4387
|
+
console.log(JSON.stringify(currentUser, null, 2));
|
|
4388
|
+
});
|
|
4389
|
+
var config = app.command("config").description("Manage webapp metadata config");
|
|
4390
|
+
addConfigTargetOptions(config.command("get").description("Pull the current webapp metadata config from the CMS").option("--out <file>", "Write the config JSON to a file")).action(async (options) => {
|
|
4391
|
+
await getWebappConfig(options);
|
|
4392
|
+
});
|
|
4393
|
+
addConfigSetOptions(config.command("set").description("Update webapp metadata such as title, cover image, description, and localization")).action(async (options) => {
|
|
4394
|
+
await updateWebappConfig(options);
|
|
2704
4395
|
});
|
|
2705
4396
|
app.command("upgrade-template").description("Upgrade template files and CLI scripts from the template repository").action(async () => {
|
|
2706
4397
|
await upgradeTemplate();
|