Make openapi.js work offline - still needs conditionals fixed though

This commit is contained in:
Rory&
2026-01-22 21:34:01 +01:00
parent 6eb1d2593f
commit 31345651db
25 changed files with 72 additions and 26 deletions

Binary file not shown.

View File

@@ -18,6 +18,7 @@ let
./tsconfig.json
./assets
./patches
./scripts
]
)
);
@@ -41,7 +42,7 @@ pkgs.buildNpmPackage {
npmDeps = pkgs.importNpmLock { npmRoot = filteredSrc; };
npmConfigHook = pkgs.importNpmLock.npmConfigHook;
npmBuildScript = "build:src:tsgo";
npmBuildScript = "build:tsgo";
makeCacheWritable = true;
nativeBuildInputs = with pkgs; [
(pkgs.python3.withPackages (ps: with ps; [ setuptools ]))
@@ -64,6 +65,7 @@ pkgs.buildNpmPackage {
# remove packages not needed for production, or at least try to...
npm prune --omit dev --no-save $npmInstallFlags "''${npmInstallFlagsArray[@]}" $npmFlags "''${npmFlagsArray[@]}"
rm -v dist/src.tsbuildinfo
rm -rv scripts
time ${./nix/trimNodeModules.sh}
# Copy outputs

View File

@@ -213,7 +213,7 @@ function apiRoutes(missingRoutes) {
obj.tags = [...new Set([...(obj.tags || []), getTag(p)])];
if (missingRoutes.additional.includes(path.replace(/\/$/, ""))) {
if (route.spacebarOnly === true || missingRoutes?.additional.includes(path.replace(/\/$/, ""))) {
obj["x-badges"] = [
{
label: "Spacebar-only",
@@ -231,12 +231,13 @@ function apiRoutes(missingRoutes) {
async function main() {
console.log("Generating OpenAPI Specification...");
const routesRes = await fetch("https://github.com/spacebarchat/missing-routes/raw/main/missing.json", {
headers: {
Accept: "application/json",
},
});
const missingRoutes = await routesRes.json();
// const routesRes = await fetch("https://github.com/spacebarchat/missing-routes/raw/main/missing.json", {
// headers: {
// Accept: "application/json",
// },
// });
// const missingRoutes = await routesRes.json();
let missingRoutes = undefined;
combineSchemas(schemas);
apiRoutes(missingRoutes);

View File

@@ -22,7 +22,7 @@ import { getDatabase } from "@spacebar/util";
const router = Router({ mergeParams: true });
router.get("/", route({ deprecated: true }), (req: Request, res: Response) => {
router.get("/", route({ deprecated: true, spacebarOnly: true }), (req: Request, res: Response) => {
if (!getDatabase()) return res.sendStatus(503);
return res.sendStatus(200);

View File

@@ -22,7 +22,7 @@ import { getDatabase } from "@spacebar/util";
const router = Router({ mergeParams: true });
router.get("/", route({ deprecated: true }), (req: Request, res: Response) => {
router.get("/", route({ deprecated: true, spacebarOnly: true }), (req: Request, res: Response) => {
if (!getDatabase()) return res.sendStatus(503);
return res.sendStatus(200);

View File

@@ -34,6 +34,7 @@ router.get(
body: "ApplicationDetectableResponse",
},
},
spacebarOnly: false, // not part of public openapi
}),
async (req: Request, res: Response) => {
// cache for 6 hours

View File

@@ -20,10 +20,17 @@ import { createHash } from "node:crypto";
import { Snowflake } from "@spacebar/util";
import { Request, Response, Router } from "express";
const router = Router({ mergeParams: true });
router.post("/", route({ responses: { 200: { body: "CreateFingerprintResponse" } } }), (req: Request, res: Response) => {
const snowflake = Snowflake.generate();
return res.json({
fingerprint: `${snowflake}.${createHash("sha512").update(snowflake).digest("base64")}`,
});
});
router.post(
"/",
route({
responses: { 200: { body: "CreateFingerprintResponse" } },
spacebarOnly: false, // not part of public openapi
}),
(req: Request, res: Response) => {
const snowflake = Snowflake.generate();
return res.json({
fingerprint: `${snowflake}.${createHash("sha512").update(snowflake).digest("base64")}`,
});
},
);
export default router;

View File

@@ -38,6 +38,7 @@ router.get(
},
right: "CREATE_REGISTRATION_TOKENS",
responses: { 200: { body: "GenerateRegistrationTokensResponse" } },
spacebarOnly: true,
}),
async (req: Request, res: Response) => {
const count = req.query.count ? parseInt(req.query.count as string) : 1;

View File

@@ -36,6 +36,7 @@ router.post(
body: "APIErrorResponse",
},
},
spacebarOnly: false, // not part of public openapi
}),
async (req: Request, res: Response) => {
// const { code, ticket, gift_code_sku_id, login_source } =

View File

@@ -41,6 +41,7 @@ router.post(
200: { body: "TokenResponse" },
400: { body: "APIErrorResponse" },
},
spacebarOnly: false, // not part of public openapi
}),
async (req: Request, res: Response) => {
if (!WebAuthn.fido2) {

View File

@@ -30,6 +30,7 @@ router.get(
body: "WhoAmIResponse",
},
},
spacebarOnly: true,
}),
/*
interface Request {

View File

@@ -28,6 +28,7 @@ router.post(
responses: {
204: {},
},
spacebarOnly: false, // Not part of public openapi
}),
(req: Request, res: Response) => {
// TODO:

View File

@@ -32,6 +32,7 @@ router.get(
body: "GuildRecommendationsResponse",
},
},
spacebarOnly: false, // Not part of public openapi schema
}),
async (req: Request, res: Response) => {
// const { limit, personalization_disabled } = req.query;

View File

@@ -30,6 +30,7 @@ router.get(
body: "InstancePingResponse",
},
},
spacebarOnly: true,
}),
(req: Request, res: Response) => {
const { general } = Config.get();

View File

@@ -30,6 +30,7 @@ router.get(
body: "Object",
},
},
spacebarOnly: true,
}),
async (req: Request, res: Response) => {
const general = Config.get();

View File

@@ -29,6 +29,7 @@ router.get(
body: "InstanceDomainsResponse",
},
},
spacebarOnly: true,
}),
(req: Request, res: Response) => {
const { cdn, gateway, api } = Config.get();

View File

@@ -29,6 +29,7 @@ router.get(
body: "APIGeneralConfiguration",
},
},
spacebarOnly: true,
}),
(req: Request, res: Response) => {
const { general } = Config.get();

View File

@@ -29,6 +29,7 @@ router.get(
body: "APILimitsConfiguration",
},
},
spacebarOnly: true,
}),
(req: Request, res: Response) => {
const { limits } = Config.get();

View File

@@ -32,6 +32,7 @@ router.get(
body: "APIErrorResponse",
},
},
spacebarOnly: true,
}),
async (req: Request, res: Response) => {
if (!Config.get().security.statsWorldReadable) {

View File

@@ -57,6 +57,7 @@ for (const type of Object.values(ReportMenuTypeNames)) {
},
204: {},
},
spacebarOnly: false, // Maps to /reporting/menu/:id
}),
(req: Request, res: Response) => {
// TODO: implement
@@ -76,6 +77,7 @@ for (const type of Object.values(ReportMenuTypeNames)) {
},
204: {},
},
spacebarOnly: false, // Maps to /reporting/:id
}),
(req: Request, res: Response) => {
// TODO: implement

View File

@@ -20,11 +20,17 @@ import { Router, Request, Response } from "express";
import { route } from "@spacebar/api";
const router = Router({ mergeParams: true });
router.get("/", route({}), (req: Request, res: Response) => {
res.json({
page: {},
scheduled_maintenances: {},
});
});
router.get(
"/",
route({
spacebarOnly: false, // not part of public openapi
}),
(req: Request, res: Response) => {
res.json({
page: {},
scheduled_maintenances: {},
});
},
);
export default router;

View File

@@ -21,9 +21,15 @@ import { route } from "@spacebar/api";
const router = Router({ mergeParams: true });
router.post("/", route({}), (req: Request, res: Response) => {
// TODO:
res.sendStatus(204);
});
router.post(
"/",
route({
spacebarOnly: false, // Not part of the public OpenAPI schema
}),
(req: Request, res: Response) => {
// TODO:
res.sendStatus(204);
},
);
export default router;

View File

@@ -40,6 +40,7 @@ router.get(
description: "Whether to try to apply the settings update atomically (default false)",
},
},
spacebarOnly: false, // maps to /users/@me/settings-proto/1
}),
async (req: Request, res: Response) => {
const userSettings = await UserSettingsProtos.getOrDefault(req.user_id);
@@ -59,6 +60,7 @@ router.patch(
body: "SettingsProtoUpdateResponse",
},
},
spacebarOnly: false, // maps to /users/@me/settings-proto/1
}),
async (req: Request, res: Response) => {
const { settings, required_data_version } = req.body as SettingsProtoUpdateSchema;
@@ -84,6 +86,7 @@ router.get(
body: "SettingsProtoJsonResponse",
},
},
spacebarOnly: true,
}),
async (req: Request, res: Response) => {
const userSettings = await UserSettingsProtos.getOrDefault(req.user_id);
@@ -109,6 +112,7 @@ router.patch(
description: "Whether to try to apply the settings update atomically (default false)",
},
},
spacebarOnly: true,
}),
async (req: Request, res: Response) => {
const { settings, required_data_version } = req.body as SettingsProtoUpdateJsonSchema;

View File

@@ -40,6 +40,7 @@ router.get(
description: "Whether to try to apply the settings update atomically (default false)",
},
},
spacebarOnly: false, // maps to /users/@me/settings-proto/2
}),
async (req: Request, res: Response) => {
const userSettings = await UserSettingsProtos.getOrDefault(req.user_id);
@@ -59,6 +60,7 @@ router.patch(
body: "SettingsProtoUpdateResponse",
},
},
spacebarOnly: false, // maps to /users/@me/settings-proto/2
}),
async (req: Request, res: Response) => {
const { settings, required_data_version } = req.body as SettingsProtoUpdateSchema;
@@ -84,6 +86,7 @@ router.get(
body: "SettingsProtoJsonResponse",
},
},
spacebarOnly: true,
}),
async (req: Request, res: Response) => {
const userSettings = await UserSettingsProtos.getOrDefault(req.user_id);
@@ -109,6 +112,7 @@ router.patch(
description: "Whether to try to apply the settings update atomically (default false)",
},
},
spacebarOnly: true,
}),
async (req: Request, res: Response) => {
const { settings, required_data_version } = req.body as SettingsProtoUpdateJsonSchema;

View File

@@ -64,6 +64,7 @@ export interface RouteOptions {
};
};
deprecated?: boolean;
spacebarOnly?: boolean;
// test?: {
// response?: RouteResponse;
// body?: unknown;