@openrails/contentkit-ui 0.78.0 → 0.80.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,14 @@
1
+ import { Totals } from './generated/wire.js';
2
+ import { Http } from './http.js';
3
+ /** GET /catalog/totals filters: kinds to total (every listed kind when empty), languages to break them down by (every counted one when empty). */
4
+ export interface CatalogTotalsQuery {
5
+ kinds?: readonly string[];
6
+ languages?: readonly string[];
7
+ }
8
+ /** The public catalog. */
9
+ export declare class CatalogClient {
10
+ private readonly http;
11
+ constructor(http: Http);
12
+ /** Works per kind, in all and per language: how many anyone opens and how many each tier's holders open. */
13
+ totals(q?: CatalogTotalsQuery, signal?: AbortSignal): Promise<Totals>;
14
+ }
@@ -0,0 +1,21 @@
1
+ import { call as e } from "./route.js";
2
+ //#region src/client/catalog.ts
3
+ var t = class {
4
+ http;
5
+ constructor(e) {
6
+ this.http = e;
7
+ }
8
+ totals(t = {}, n) {
9
+ return e(this.http, "GET", "/totals", {
10
+ query: {
11
+ kinds: t.kinds?.join(","),
12
+ languages: t.languages?.join(",")
13
+ },
14
+ signal: n
15
+ });
16
+ }
17
+ };
18
+ //#endregion
19
+ export { t as CatalogClient };
20
+
21
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","names":[],"sources":["../../src/client/catalog.ts"],"sourcesContent":["import type { Totals } from \"./generated/wire.js\";\nimport type { Http } from \"./http.js\";\nimport { call } from \"./route.js\";\n\n/** GET /catalog/totals filters: kinds to total (every listed kind when empty), languages to break them down by (every counted one when empty). */\nexport interface CatalogTotalsQuery {\n kinds?: readonly string[];\n languages?: readonly string[];\n}\n\n/** The public catalog. */\nexport class CatalogClient {\n constructor(private readonly http: Http) {}\n\n /** Works per kind, in all and per language: how many anyone opens and how many each tier's holders open. */\n totals(q: CatalogTotalsQuery = {}, signal?: AbortSignal): Promise<Totals> {\n return call(this.http, \"GET\", \"/totals\", { query: { kinds: q.kinds?.join(\",\"), languages: q.languages?.join(\",\") }, signal });\n }\n}\n"],"mappings":";;AAWA,IAAa,IAAb,MAA2B;CACI;CAA7B,YAAY,GAA6B;EAAZ,KAAA,OAAA;CAAa;CAG1C,OAAO,IAAwB,CAAC,GAAG,GAAuC;EACxE,OAAO,EAAK,KAAK,MAAM,OAAO,WAAW;GAAE,OAAO;IAAE,OAAO,EAAE,OAAO,KAAK,GAAG;IAAG,WAAW,EAAE,WAAW,KAAK,GAAG;GAAE;GAAG;EAAO,CAAC;CAC9H;AACF"}
@@ -1,3 +1,4 @@
1
+ import { CatalogClient } from './catalog.js';
1
2
  import { CodesClient } from './codes.js';
2
3
  import { BansClient } from './content/bans.js';
3
4
  import { CommentsClient } from './content/comments.js';
@@ -42,6 +43,8 @@ export interface ContentKitClient {
42
43
  readonly taxonomy: TaxonomyClient;
43
44
  /** Content-code lookup. */
44
45
  readonly codes: CodesClient;
46
+ /** The public catalog: listing totals by kind and audience. */
47
+ readonly catalog: CatalogClient;
45
48
  /** The signed-in person's native and imported notifications. */
46
49
  readonly notifications: NotificationsClient;
47
50
  /** What the content module allows: which interactions signed-out visitors may make. */
@@ -1,38 +1,40 @@
1
1
  import { call as e } from "./route.js";
2
2
  import { MediaClient as t } from "./media/client.js";
3
- import { CodesClient as n } from "./codes.js";
4
- import { BansClient as r } from "./content/bans.js";
5
- import { CommentsClient as i } from "./content/comments.js";
6
- import { FavoritesClient as a } from "./content/favorites.js";
7
- import { ModerationClient as o } from "./content/moderation.js";
8
- import { PollsClient as s } from "./content/polls.js";
9
- import { PostsClient as c } from "./content/posts.js";
10
- import { ReactionsClient as l } from "./content/reactions.js";
11
- import { Http as u } from "./http.js";
12
- import { NotificationsClient as d } from "./notifications.js";
13
- import { TaxonomyClient as f } from "./taxonomy.js";
3
+ import { CatalogClient as n } from "./catalog.js";
4
+ import { CodesClient as r } from "./codes.js";
5
+ import { BansClient as i } from "./content/bans.js";
6
+ import { CommentsClient as a } from "./content/comments.js";
7
+ import { FavoritesClient as o } from "./content/favorites.js";
8
+ import { ModerationClient as s } from "./content/moderation.js";
9
+ import { PollsClient as c } from "./content/polls.js";
10
+ import { PostsClient as l } from "./content/posts.js";
11
+ import { ReactionsClient as u } from "./content/reactions.js";
12
+ import { Http as d } from "./http.js";
13
+ import { NotificationsClient as f } from "./notifications.js";
14
+ import { TaxonomyClient as p } from "./taxonomy.js";
14
15
  //#region src/client/client.ts
15
- function p(p) {
16
- let { media: m, folders: h, ...g } = p, _ = new u(g), v = new t(_, m, h);
16
+ function m(m) {
17
+ let { media: h, folders: g, ..._ } = m, v = new d(_), y = new t(v, h, g);
17
18
  return {
18
- media: v,
19
- posts: new c(_, v),
20
- comments: new i(_),
21
- reactions: new l(_),
22
- favorites: new a(_),
23
- polls: new s(_, v),
24
- bans: new r(_),
25
- moderation: new o(_),
26
- taxonomy: new f(_),
27
- codes: new n(_),
28
- notifications: new d(_),
29
- config: (t) => e(_, "GET", "/config", { signal: t }),
30
- url: (e, t) => _.mount(e, t),
31
- setReadScope: (e) => _.setReadScope(e),
32
- subscribe: (e) => _.subscribe(e)
19
+ media: y,
20
+ posts: new l(v, y),
21
+ comments: new a(v),
22
+ reactions: new u(v),
23
+ favorites: new o(v),
24
+ polls: new c(v, y),
25
+ bans: new i(v),
26
+ moderation: new s(v),
27
+ taxonomy: new p(v),
28
+ codes: new r(v),
29
+ catalog: new n(v),
30
+ notifications: new f(v),
31
+ config: (t) => e(v, "GET", "/config", { signal: t }),
32
+ url: (e, t) => v.mount(e, t),
33
+ setReadScope: (e) => v.setReadScope(e),
34
+ subscribe: (e) => v.subscribe(e)
33
35
  };
34
36
  }
35
37
  //#endregion
36
- export { p as createContentKitClient };
38
+ export { m as createContentKitClient };
37
39
 
38
40
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":[],"sources":["../../src/client/client.ts"],"sourcesContent":["import { CodesClient } from \"./codes.js\";\nimport { BansClient } from \"./content/bans.js\";\nimport { CommentsClient } from \"./content/comments.js\";\nimport { FavoritesClient } from \"./content/favorites.js\";\nimport { ModerationClient } from \"./content/moderation.js\";\nimport { PollsClient } from \"./content/polls.js\";\nimport { PostsClient } from \"./content/posts.js\";\nimport { ReactionsClient } from \"./content/reactions.js\";\nimport type { Config, RefBody } from \"./generated/wire.js\";\nimport { Http, type ContentKitChange, type ContentKitModule, type HttpOptions } from \"./http.js\";\nimport { MediaClient, type ContentFolders, type MediaOptions } from \"./media/client.js\";\nimport { call } from \"./route.js\";\nimport { NotificationsClient } from \"./notifications.js\";\nimport { TaxonomyClient } from \"./taxonomy.js\";\n\nexport interface ContentKitClientOptions extends HttpOptions {\n /** Upload tuning (transport, part concurrency, retries). */\n media?: MediaOptions;\n /** The media kinds of post and poll folders, when the host renamed them (content.Media). */\n folders?: ContentFolders;\n}\n\n/**\n * One ContentKit deployment as the browser sees it. Each module is a property\n * over one shared transport (mounts, auth, language, errors, change events).\n */\nexport interface ContentKitClient {\n /** Uploads, multipart, commits, reads, frames, HLS bases, hls.js `xhrSetup` and inline images. */\n readonly media: MediaClient;\n /** Published posts, staff CRUD, reactions, cover and body images. */\n readonly posts: PostsClient;\n /** Threads, replies, edits, tombstones, reactions, standing, the latest feed, moderation. */\n readonly comments: CommentsClient;\n /** Likes and dislikes of an item. */\n readonly reactions: ReactionsClient;\n /** The signed-in caller's favorites. */\n readonly favorites: FavoritesClient;\n /** Polls: votes, free-text answers and the staff editor. */\n readonly polls: PollsClient;\n /** Comment bans, owner and global. */\n readonly bans: BansClient;\n /** The review queue of held comments and posts. */\n readonly moderation: ModerationClient;\n /** The taxonomy admin API. */\n readonly taxonomy: TaxonomyClient;\n /** Content-code lookup. */\n readonly codes: CodesClient;\n /** The signed-in person's native and imported notifications. */\n readonly notifications: NotificationsClient;\n\n /** What the content module allows: which interactions signed-out visitors may make. */\n config(signal?: AbortSignal): Promise<Config>;\n /** A module's base URL as configured (no trailing slash). */\n url(module: ContentKitModule, ref?: RefBody): string;\n /** Cache context only, not authentication. The React provider keeps this in sync. */\n setReadScope(scope: string): void;\n /** Every successful mutation; a null scope means its data predates a context change. */\n subscribe(listener: (change: ContentKitChange, scope: string | null) => void): () => void;\n}\n\nexport function createContentKitClient(options: ContentKitClientOptions): ContentKitClient {\n const { media: mediaOptions, folders, ...http } = options;\n const h = new Http(http);\n const media = new MediaClient(h, mediaOptions, folders);\n return {\n media,\n posts: new PostsClient(h, media),\n comments: new CommentsClient(h),\n reactions: new ReactionsClient(h),\n favorites: new FavoritesClient(h),\n polls: new PollsClient(h, media),\n bans: new BansClient(h),\n moderation: new ModerationClient(h),\n taxonomy: new TaxonomyClient(h),\n codes: new CodesClient(h),\n notifications: new NotificationsClient(h),\n config: (signal) => call(h, \"GET\", \"/config\", { signal }),\n url: (module, ref) => h.mount(module, ref),\n setReadScope: (scope) => h.setReadScope(scope),\n subscribe: (listener) => h.subscribe(listener),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;AA4DA,SAAgB,EAAuB,GAAoD;CACzF,IAAM,EAAE,OAAO,GAAc,YAAS,GAAG,MAAS,GAC5C,IAAI,IAAI,EAAK,CAAI,GACjB,IAAQ,IAAI,EAAY,GAAG,GAAc,CAAO;CACtD,OAAO;EACL;EACA,OAAO,IAAI,EAAY,GAAG,CAAK;EAC/B,UAAU,IAAI,EAAe,CAAC;EAC9B,WAAW,IAAI,EAAgB,CAAC;EAChC,WAAW,IAAI,EAAgB,CAAC;EAChC,OAAO,IAAI,EAAY,GAAG,CAAK;EAC/B,MAAM,IAAI,EAAW,CAAC;EACtB,YAAY,IAAI,EAAiB,CAAC;EAClC,UAAU,IAAI,EAAe,CAAC;EAC9B,OAAO,IAAI,EAAY,CAAC;EACxB,eAAe,IAAI,EAAoB,CAAC;EACxC,SAAS,MAAW,EAAK,GAAG,OAAO,WAAW,EAAE,UAAO,CAAC;EACxD,MAAM,GAAQ,MAAQ,EAAE,MAAM,GAAQ,CAAG;EACzC,eAAe,MAAU,EAAE,aAAa,CAAK;EAC7C,YAAY,MAAa,EAAE,UAAU,CAAQ;CAC/C;AACF"}
1
+ {"version":3,"file":"client.js","names":[],"sources":["../../src/client/client.ts"],"sourcesContent":["import { CatalogClient } from \"./catalog.js\";\nimport { CodesClient } from \"./codes.js\";\nimport { BansClient } from \"./content/bans.js\";\nimport { CommentsClient } from \"./content/comments.js\";\nimport { FavoritesClient } from \"./content/favorites.js\";\nimport { ModerationClient } from \"./content/moderation.js\";\nimport { PollsClient } from \"./content/polls.js\";\nimport { PostsClient } from \"./content/posts.js\";\nimport { ReactionsClient } from \"./content/reactions.js\";\nimport type { Config, RefBody } from \"./generated/wire.js\";\nimport { Http, type ContentKitChange, type ContentKitModule, type HttpOptions } from \"./http.js\";\nimport { MediaClient, type ContentFolders, type MediaOptions } from \"./media/client.js\";\nimport { call } from \"./route.js\";\nimport { NotificationsClient } from \"./notifications.js\";\nimport { TaxonomyClient } from \"./taxonomy.js\";\n\nexport interface ContentKitClientOptions extends HttpOptions {\n /** Upload tuning (transport, part concurrency, retries). */\n media?: MediaOptions;\n /** The media kinds of post and poll folders, when the host renamed them (content.Media). */\n folders?: ContentFolders;\n}\n\n/**\n * One ContentKit deployment as the browser sees it. Each module is a property\n * over one shared transport (mounts, auth, language, errors, change events).\n */\nexport interface ContentKitClient {\n /** Uploads, multipart, commits, reads, frames, HLS bases, hls.js `xhrSetup` and inline images. */\n readonly media: MediaClient;\n /** Published posts, staff CRUD, reactions, cover and body images. */\n readonly posts: PostsClient;\n /** Threads, replies, edits, tombstones, reactions, standing, the latest feed, moderation. */\n readonly comments: CommentsClient;\n /** Likes and dislikes of an item. */\n readonly reactions: ReactionsClient;\n /** The signed-in caller's favorites. */\n readonly favorites: FavoritesClient;\n /** Polls: votes, free-text answers and the staff editor. */\n readonly polls: PollsClient;\n /** Comment bans, owner and global. */\n readonly bans: BansClient;\n /** The review queue of held comments and posts. */\n readonly moderation: ModerationClient;\n /** The taxonomy admin API. */\n readonly taxonomy: TaxonomyClient;\n /** Content-code lookup. */\n readonly codes: CodesClient;\n /** The public catalog: listing totals by kind and audience. */\n readonly catalog: CatalogClient;\n /** The signed-in person's native and imported notifications. */\n readonly notifications: NotificationsClient;\n\n /** What the content module allows: which interactions signed-out visitors may make. */\n config(signal?: AbortSignal): Promise<Config>;\n /** A module's base URL as configured (no trailing slash). */\n url(module: ContentKitModule, ref?: RefBody): string;\n /** Cache context only, not authentication. The React provider keeps this in sync. */\n setReadScope(scope: string): void;\n /** Every successful mutation; a null scope means its data predates a context change. */\n subscribe(listener: (change: ContentKitChange, scope: string | null) => void): () => void;\n}\n\nexport function createContentKitClient(options: ContentKitClientOptions): ContentKitClient {\n const { media: mediaOptions, folders, ...http } = options;\n const h = new Http(http);\n const media = new MediaClient(h, mediaOptions, folders);\n return {\n media,\n posts: new PostsClient(h, media),\n comments: new CommentsClient(h),\n reactions: new ReactionsClient(h),\n favorites: new FavoritesClient(h),\n polls: new PollsClient(h, media),\n bans: new BansClient(h),\n moderation: new ModerationClient(h),\n taxonomy: new TaxonomyClient(h),\n codes: new CodesClient(h),\n catalog: new CatalogClient(h),\n notifications: new NotificationsClient(h),\n config: (signal) => call(h, \"GET\", \"/config\", { signal }),\n url: (module, ref) => h.mount(module, ref),\n setReadScope: (scope) => h.setReadScope(scope),\n subscribe: (listener) => h.subscribe(listener),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;AA+DA,SAAgB,EAAuB,GAAoD;CACzF,IAAM,EAAE,OAAO,GAAc,YAAS,GAAG,MAAS,GAC5C,IAAI,IAAI,EAAK,CAAI,GACjB,IAAQ,IAAI,EAAY,GAAG,GAAc,CAAO;CACtD,OAAO;EACL;EACA,OAAO,IAAI,EAAY,GAAG,CAAK;EAC/B,UAAU,IAAI,EAAe,CAAC;EAC9B,WAAW,IAAI,EAAgB,CAAC;EAChC,WAAW,IAAI,EAAgB,CAAC;EAChC,OAAO,IAAI,EAAY,GAAG,CAAK;EAC/B,MAAM,IAAI,EAAW,CAAC;EACtB,YAAY,IAAI,EAAiB,CAAC;EAClC,UAAU,IAAI,EAAe,CAAC;EAC9B,OAAO,IAAI,EAAY,CAAC;EACxB,SAAS,IAAI,EAAc,CAAC;EAC5B,eAAe,IAAI,EAAoB,CAAC;EACxC,SAAS,MAAW,EAAK,GAAG,OAAO,WAAW,EAAE,UAAO,CAAC;EACxD,MAAM,GAAQ,MAAQ,EAAE,MAAM,GAAQ,CAAG;EACzC,eAAe,MAAU,EAAE,aAAa,CAAK;EAC7C,YAAY,MAAa,EAAE,UAAU,CAAQ;CAC/C;AACF"}
@@ -1,4 +1,4 @@
1
- export type ContentKitModule = "content" | "upload" | "media" | "codes" | "taxonomy" | "notifications";
1
+ export type ContentKitModule = "content" | "upload" | "media" | "codes" | "taxonomy" | "catalog" | "notifications";
2
2
  export declare const CONTENTKIT_MODULES: Readonly<Record<ContentKitModule, string>>;
3
3
  export type ContentKitRoute = {
4
4
  method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
@@ -1056,6 +1056,19 @@ export declare const CONTENTKIT_ROUTES: readonly [{
1056
1056
  };
1057
1057
  readonly errors: readonly [];
1058
1058
  readonly errorSets: readonly ["module:taxonomy", "auth"];
1059
+ }, {
1060
+ readonly method: "GET";
1061
+ readonly module: "catalog";
1062
+ readonly path: "/totals";
1063
+ readonly auth: "open";
1064
+ readonly permission: null;
1065
+ readonly query: readonly ["kinds", "languages"];
1066
+ readonly request: null;
1067
+ readonly responses: {
1068
+ readonly 200: "Totals";
1069
+ };
1070
+ readonly errors: readonly ["unavailable"];
1071
+ readonly errorSets: readonly ["module:catalog", "request"];
1059
1072
  }, {
1060
1073
  readonly method: "GET";
1061
1074
  readonly module: "notifications";
@@ -1449,6 +1449,18 @@ var e = [
1449
1449
  errors: [],
1450
1450
  errorSets: ["module:taxonomy", "auth"]
1451
1451
  },
1452
+ {
1453
+ method: "GET",
1454
+ module: "catalog",
1455
+ path: "/totals",
1456
+ auth: "open",
1457
+ permission: null,
1458
+ query: ["kinds", "languages"],
1459
+ request: null,
1460
+ responses: { 200: "Totals" },
1461
+ errors: ["unavailable"],
1462
+ errorSets: ["module:catalog", "request"]
1463
+ },
1452
1464
  {
1453
1465
  method: "GET",
1454
1466
  module: "notifications",
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","names":[],"sources":["../../../src/client/generated/routes.ts"],"sourcesContent":["// Generated by `go generate ./internal/contract` from ContentKit's route catalog. Do not edit.\n\nexport type ContentKitModule = \"content\" | \"upload\" | \"media\" | \"codes\" | \"taxonomy\" | \"notifications\";\n\n// Each module's sub-path under the one mount (contentkit.Runtime.Handler).\nexport const CONTENTKIT_MODULES: Readonly<Record<ContentKitModule, string>> = {\n content: \"\",\n upload: \"/media/upload\",\n media: \"/media\",\n codes: \"/codes\",\n taxonomy: \"/taxonomy\",\n notifications: \"/notifications\",\n};\n\nexport type ContentKitRoute = {\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n module: ContentKitModule;\n // The path from the module's mount: CONTENTKIT_MODULES[module] + path under the one mount.\n path: string;\n // open: never authenticates; public: the actor is optional; user: a signed-in person;\n // staff: a person or an application holding the host permission.\n auth: \"open\" | \"public\" | \"user\" | \"staff\";\n // A staff route's permission: root:<resource>:<action>.\n permission: string | null;\n query: readonly string[];\n // wire.ts type names (or a content type): the JSON body, and each success by status.\n request: string | null;\n responses: Readonly<Record<number, string | null>>;\n // The route's own codes, and the shared sets (CONTENTKIT_ERROR_SETS) it also answers.\n errors: readonly string[];\n errorSets: readonly string[];\n};\n\nexport const CONTENTKIT_ROUTES = [\n { method: \"GET\", module: \"content\", path: \"/config\", auth: \"open\", permission: null, query: [], request: null, responses: { 200: \"Config\" }, errors: [], errorSets: [\"module:content\"] },\n { method: \"GET\", module: \"content\", path: \"/posts\", auth: \"public\", permission: null, query: [\"language\", \"sort\", \"limit\", \"offset\"], request: null, responses: { 200: \"Post[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/posts/admin\", auth: \"staff\", permission: \"root:posts:write\", query: [\"language\", \"draft\", \"deleted\", \"q\", \"limit\", \"offset\"], request: null, responses: { 200: \"Post[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/posts/{id}\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"Post\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/posts\", auth: \"staff\", permission: \"root:posts:write\", query: [], request: \"PostInput\", responses: { 201: \"Post\", 202: \"Post\" }, errors: [\"conflict\", \"forbidden\", \"moderation_rejected\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PATCH\", module: \"content\", path: \"/posts/{id}\", auth: \"staff\", permission: \"root:posts:write\", query: [], request: \"PostInput\", responses: { 200: \"Post\", 202: \"Post\" }, errors: [\"conflict\", \"forbidden\", \"moderation_rejected\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/posts/{id}\", auth: \"staff\", permission: \"root:posts:write\", query: [], request: null, responses: { 204: null }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/posts/{id}/restore\", auth: \"staff\", permission: \"root:posts:write\", query: [], request: null, responses: { 200: \"Post\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"content\", path: \"/posts/{id}/cover\", auth: \"staff\", permission: \"root:posts:write\", query: [], request: \"ImageInput\", responses: { 200: \"PostCover\" }, errors: [\"not_configured\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/posts/{id}/images\", auth: \"staff\", permission: \"root:posts:write\", query: [], request: \"ImageInput\", responses: { 200: \"InlineImage\" }, errors: [\"not_configured\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/{kind}/{id}/comments\", auth: \"public\", permission: null, query: [\"sort\", \"limit\", \"offset\"], request: null, responses: { 200: \"Comment[]\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/{kind}/{id}/comments\", auth: \"public\", permission: null, query: [], request: \"CommentInput\", responses: { 201: \"Comment\", 202: \"Comment\" }, errors: [\"comment_banned\", \"comment_too_long\", \"forbidden\", \"moderation_rejected\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/comments/latest\", auth: \"public\", permission: null, query: [\"limit\", \"offset\"], request: null, responses: { 200: \"FeedItem[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/comments/admin\", auth: \"staff\", permission: \"root:comments:moderate\", query: [\"content_kind\", \"author\", \"limit\", \"offset\"], request: null, responses: { 200: \"AdminComment[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/comments/{cid}/restore\", auth: \"staff\", permission: \"root:comments:moderate\", query: [], request: null, responses: { 200: \"Restored\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/comments/{cid}/replies\", auth: \"public\", permission: null, query: [\"limit\", \"offset\"], request: null, responses: { 200: \"Comment[]\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PATCH\", module: \"content\", path: \"/comments/{cid}\", auth: \"public\", permission: null, query: [], request: \"CommentEdit\", responses: { 200: \"Comment\", 202: \"Comment\" }, errors: [\"comment_banned\", \"comment_too_long\", \"conflict\", \"forbidden\", \"moderation_rejected\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/comments/{cid}\", auth: \"public\", permission: null, query: [], request: null, responses: { 204: null }, errors: [\"forbidden\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/comments/{cid}/like\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"ReactionCounts\" }, errors: [\"forbidden\", \"invalid_request\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/comments/{cid}/dislike\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"ReactionCounts\" }, errors: [\"forbidden\", \"invalid_request\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/comments/{cid}/reaction\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"ReactionCounts\" }, errors: [\"forbidden\", \"invalid_request\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/{kind}/{id}/like\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"ReactionCounts\" }, errors: [\"forbidden\", \"invalid_request\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/{kind}/{id}/dislike\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"ReactionCounts\" }, errors: [\"forbidden\", \"invalid_request\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/{kind}/{id}/reaction\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"ReactionCounts\" }, errors: [\"forbidden\", \"invalid_request\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/{kind}/{id}/reaction\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"ReactionCounts\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/favorites\", auth: \"user\", permission: null, query: [\"limit\", \"offset\"], request: null, responses: { 200: \"FavoriteItem[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/{kind}/{id}/favorite\", auth: \"user\", permission: null, query: [], request: null, responses: { 200: \"FavoriteState\" }, errors: [\"forbidden\", \"not_found\", \"rate_limited\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/{kind}/{id}/favorite\", auth: \"user\", permission: null, query: [], request: null, responses: { 200: \"FavoriteState\" }, errors: [\"forbidden\", \"invalid_request\", \"rate_limited\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/{kind}/{id}/favorite\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"FavoriteState\" }, errors: [\"invalid_request\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/polls\", auth: \"public\", permission: null, query: [\"language\", \"month\", \"date\", \"limit\", \"offset\"], request: null, responses: { 200: \"Poll[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/polls/admin\", auth: \"staff\", permission: \"root:polls:write\", query: [\"language\", \"month\", \"date\", \"state\", \"q\", \"limit\", \"offset\"], request: null, responses: { 200: \"Poll[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/polls/{id}\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"Poll\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/polls\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: \"PollInput\", responses: { 201: \"Poll\" }, errors: [\"not_configured\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PATCH\", module: \"content\", path: \"/polls/{id}\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: \"PollUpdate\", responses: { 200: \"Poll\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/polls/{id}\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: null, responses: { 204: null }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/polls/{id}/vote\", auth: \"public\", permission: null, query: [], request: \"PollVote\", responses: { 200: \"Poll\" }, errors: [\"forbidden\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/polls/{id}/answer\", auth: \"user\", permission: null, query: [], request: \"PollAnswerInput\", responses: { 200: \"Poll\" }, errors: [\"forbidden\", \"not_found\", \"rate_limited\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"content\", path: \"/polls/{id}/image\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: \"ImageInput\", responses: { 200: \"PollImage\" }, errors: [\"not_configured\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/polls/{id}/options\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: \"PollOptionPatch\", responses: { 201: \"PollOption\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PATCH\", module: \"content\", path: \"/polls/{id}/options/{oid}\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: \"PollOptionPatch\", responses: { 200: \"PollOption\" }, errors: [\"not_configured\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/polls/{id}/options/{oid}\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: null, responses: { 204: null }, errors: [\"invalid_request\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"content\", path: \"/polls/{id}/options/{oid}/image\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: \"ImageInput\", responses: { 200: \"PollImage\" }, errors: [\"not_configured\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/comment-bans\", auth: \"user\", permission: null, query: [\"limit\", \"offset\"], request: null, responses: { 200: \"CommentBan[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"content\", path: \"/comment-bans/{user}\", auth: \"user\", permission: null, query: [], request: \"BanInput\", responses: { 200: \"CommentBan\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/comment-bans/{user}\", auth: \"user\", permission: null, query: [], request: null, responses: { 204: null }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/global-comment-bans\", auth: \"staff\", permission: \"root:comments:ban\", query: [\"limit\", \"offset\"], request: null, responses: { 200: \"CommentBan[]\" }, errors: [\"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/global-comment-bans/{user}\", auth: \"staff\", permission: \"root:comments:ban\", query: [], request: null, responses: { 200: \"CommentBan\" }, errors: [\"not_found\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"content\", path: \"/global-comment-bans/{user}\", auth: \"staff\", permission: \"root:comments:ban\", query: [], request: \"BanInput\", responses: { 200: \"CommentBan\" }, errors: [\"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/global-comment-bans/{user}\", auth: \"staff\", permission: \"root:comments:ban\", query: [], request: null, responses: { 204: null }, errors: [\"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/{kind}/{id}/can-comment\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"CommentStanding\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/moderation/held\", auth: \"staff\", permission: \"root:moderation:review\", query: [\"kind\", \"cursor\", \"limit\"], request: null, responses: { 200: \"HeldPage\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/moderation/{kind}/{id}/resolve\", auth: \"staff\", permission: \"root:moderation:review\", query: [], request: \"ResolveInput\", responses: { 200: \"ReviewOutcome\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"upload\", path: \"/presign\", auth: \"user\", permission: null, query: [], request: \"PresignBody\", responses: { 200: \"PresignReply\" }, errors: [\"conflict\", \"forbidden\", \"not_found\", \"quota_exceeded\", \"rate_limited\", \"too_large\", \"too_many_files\", \"type_not_allowed\"], errorSets: [\"module:upload\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"upload\", path: \"/parts\", auth: \"user\", permission: null, query: [], request: \"PartsBody\", responses: { 200: \"PartsReply\" }, errors: [\"forbidden\", \"not_found\"], errorSets: [\"module:upload\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"upload\", path: \"/parts/list\", auth: \"user\", permission: null, query: [], request: \"TicketBody\", responses: { 200: \"PartsReply\" }, errors: [\"forbidden\", \"not_found\"], errorSets: [\"module:upload\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"upload\", path: \"/complete\", auth: \"user\", permission: null, query: [], request: \"TicketBody\", responses: { 200: \"CompleteReply\" }, errors: [\"checksum_mismatch\", \"forbidden\", \"incomplete\", \"not_found\"], errorSets: [\"module:upload\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"upload\", path: \"/abort\", auth: \"user\", permission: null, query: [], request: \"TicketBody\", responses: { 204: null }, errors: [\"forbidden\", \"not_found\"], errorSets: [\"module:upload\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"upload\", path: \"/commit\", auth: \"user\", permission: null, query: [], request: \"CommitBody\", responses: { 200: \"CommitReply\" }, errors: [\"conflict\", \"forbidden\", \"image_too_small\", \"not_found\", \"not_uploaded\", \"quota_exceeded\", \"rate_limited\", \"too_large\", \"too_many_files\", \"type_not_allowed\"], errorSets: [\"module:upload\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"upload\", path: \"/frame\", auth: \"user\", permission: null, query: [\"kind\", \"id\", \"path\", \"t\", \"w\"], request: null, responses: { 200: \"image/jpeg\" }, errors: [\"forbidden\", \"not_found\"], errorSets: [\"module:upload\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"media\", path: \"/presets\", auth: \"open\", permission: null, query: [], request: null, responses: { 200: \"PresetRule[]\" }, errors: [], errorSets: [\"module:media\"] },\n { method: \"GET\", module: \"media\", path: \"/{kind}/{id}\", auth: \"public\", permission: null, query: [\"prefix\", \"offset\", \"limit\", \"download\", \"editor\"], request: null, responses: { 200: \"ReadResult\" }, errors: [], errorSets: [\"module:media\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"media\", path: \"/{kind}/{id}/hls/{path...}\", auth: \"public\", permission: null, query: [\"audio\", \"subs\"], request: null, responses: { 200: \"application/vnd.apple.mpegurl\" }, errors: [], errorSets: [\"module:media\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"codes\", path: \"/{code}\", auth: \"open\", permission: null, query: [\"lang\"], request: null, responses: { 200: \"Resolved\" }, errors: [\"gone\", \"not_found\"], errorSets: [\"module:codes\", \"request\"] },\n { method: \"GET\", module: \"taxonomy\", path: \"/nodes\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [\"kind\", \"state\", \"id\", \"slug\", \"language\", \"language_mode\", \"name_prefix\", \"q\", \"content_kind\", \"min_count\", \"sort\", \"cursor\", \"offset\", \"limit\"], request: null, responses: { 200: \"NodePage\" }, errors: [], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"taxonomy\", path: \"/nodes\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"NodeInput[]\", responses: { 201: \"Node[]\" }, errors: [\"conflict\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"taxonomy\", path: \"/nodes/{id}\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: null, responses: { 200: \"NodeDetail\" }, errors: [\"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"PATCH\", module: \"taxonomy\", path: \"/nodes/{id}\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"NodeUpdate\", responses: { 200: \"Node\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"taxonomy\", path: \"/nodes/{id}\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: null, responses: { 200: \"Node\" }, errors: [\"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"taxonomy\", path: \"/nodes/{id}/names\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"Name[]\", responses: { 200: \"NodeDetail\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"taxonomy\", path: \"/nodes/{id}/names\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"Name[]\", responses: { 200: \"NodeDetail\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"taxonomy\", path: \"/nodes/{id}/names\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"Name[]\", responses: { 200: \"NodeDetail\" }, errors: [\"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"taxonomy\", path: \"/nodes/{id}/assignments\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [\"content_kind\", \"relation\", \"cursor\", \"limit\"], request: null, responses: { 200: \"AssignmentPage\" }, errors: [\"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"taxonomy\", path: \"/nodes/{id}/merge\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"MergeInput\", responses: { 200: \"MergeReport\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"taxonomy\", path: \"/edges\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"Edge[]\", responses: { 200: \"EdgesWritten\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"taxonomy\", path: \"/edges\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"Edge[]\", responses: { 200: \"EdgesWritten\" }, errors: [], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"taxonomy\", path: \"/assignments\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [\"suppress_counts\"], request: \"Assignment[]\", responses: { 200: \"AssignmentsWritten\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"taxonomy\", path: \"/assignments\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [\"suppress_counts\"], request: \"Assignment[]\", responses: { 200: \"AssignmentsWritten\" }, errors: [], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"taxonomy\", path: \"/effective\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"ContentRef[]\", responses: { 200: \"EffectiveTagsOf[]\" }, errors: [], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"taxonomy\", path: \"/counts\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [\"taxonomy_id\"], request: null, responses: { 200: \"Record<string, Count[]>\" }, errors: [], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"taxonomy\", path: \"/counts/rebuild\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: null, responses: { 200: \"CountsRebuilt\" }, errors: [], errorSets: [\"module:taxonomy\", \"auth\"] },\n { method: \"GET\", module: \"notifications\", path: \"/inbox\", auth: \"user\", permission: null, query: [\"limit\", \"cursor\", \"unread\", \"dismissed\"], request: null, responses: { 200: \"Page\" }, errors: [], errorSets: [\"module:notifications\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"notifications\", path: \"/{id}/read\", auth: \"user\", permission: null, query: [], request: null, responses: { 200: \"Item\" }, errors: [\"not_found\"], errorSets: [\"module:notifications\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"notifications\", path: \"/{id}/read\", auth: \"user\", permission: null, query: [], request: null, responses: { 200: \"Item\" }, errors: [\"not_found\"], errorSets: [\"module:notifications\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"notifications\", path: \"/{id}/dismiss\", auth: \"user\", permission: null, query: [], request: null, responses: { 200: \"Item\" }, errors: [\"not_found\"], errorSets: [\"module:notifications\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"notifications\", path: \"/{id}/dismiss\", auth: \"user\", permission: null, query: [], request: null, responses: { 200: \"Item\" }, errors: [\"not_found\"], errorSets: [\"module:notifications\", \"auth\", \"request\"] },\n] as const satisfies readonly ContentKitRoute[];\n\n// The codes every route of a kind answers, by set name.\nexport const CONTENTKIT_ERROR_SETS: Readonly<Record<string, readonly string[]>> = {\n \"auth\": [\"forbidden\", \"unauthorized\", \"unavailable\"],\n \"module:codes\": [\"internal_error\"],\n \"module:content\": [\"internal_error\", \"tenant_mismatch\"],\n \"module:media\": [\"internal_error\", \"not_found\", \"rate_limited\", \"unavailable\", \"upgrade_required\"],\n \"module:notifications\": [\"internal_error\"],\n \"module:taxonomy\": [\"internal_error\"],\n \"module:upload\": [\"internal_error\", \"unavailable\", \"upgrade_required\"],\n \"request\": [\"invalid_request\"],\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"routes.js","names":[],"sources":["../../../src/client/generated/routes.ts"],"sourcesContent":["// Generated by `go generate ./internal/contract` from ContentKit's route catalog. Do not edit.\n\nexport type ContentKitModule = \"content\" | \"upload\" | \"media\" | \"codes\" | \"taxonomy\" | \"catalog\" | \"notifications\";\n\n// Each module's sub-path under the one mount (contentkit.Runtime.Handler).\nexport const CONTENTKIT_MODULES: Readonly<Record<ContentKitModule, string>> = {\n content: \"\",\n upload: \"/media/upload\",\n media: \"/media\",\n codes: \"/codes\",\n taxonomy: \"/taxonomy\",\n catalog: \"/catalog\",\n notifications: \"/notifications\",\n};\n\nexport type ContentKitRoute = {\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n module: ContentKitModule;\n // The path from the module's mount: CONTENTKIT_MODULES[module] + path under the one mount.\n path: string;\n // open: never authenticates; public: the actor is optional; user: a signed-in person;\n // staff: a person or an application holding the host permission.\n auth: \"open\" | \"public\" | \"user\" | \"staff\";\n // A staff route's permission: root:<resource>:<action>.\n permission: string | null;\n query: readonly string[];\n // wire.ts type names (or a content type): the JSON body, and each success by status.\n request: string | null;\n responses: Readonly<Record<number, string | null>>;\n // The route's own codes, and the shared sets (CONTENTKIT_ERROR_SETS) it also answers.\n errors: readonly string[];\n errorSets: readonly string[];\n};\n\nexport const CONTENTKIT_ROUTES = [\n { method: \"GET\", module: \"content\", path: \"/config\", auth: \"open\", permission: null, query: [], request: null, responses: { 200: \"Config\" }, errors: [], errorSets: [\"module:content\"] },\n { method: \"GET\", module: \"content\", path: \"/posts\", auth: \"public\", permission: null, query: [\"language\", \"sort\", \"limit\", \"offset\"], request: null, responses: { 200: \"Post[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/posts/admin\", auth: \"staff\", permission: \"root:posts:write\", query: [\"language\", \"draft\", \"deleted\", \"q\", \"limit\", \"offset\"], request: null, responses: { 200: \"Post[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/posts/{id}\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"Post\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/posts\", auth: \"staff\", permission: \"root:posts:write\", query: [], request: \"PostInput\", responses: { 201: \"Post\", 202: \"Post\" }, errors: [\"conflict\", \"forbidden\", \"moderation_rejected\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PATCH\", module: \"content\", path: \"/posts/{id}\", auth: \"staff\", permission: \"root:posts:write\", query: [], request: \"PostInput\", responses: { 200: \"Post\", 202: \"Post\" }, errors: [\"conflict\", \"forbidden\", \"moderation_rejected\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/posts/{id}\", auth: \"staff\", permission: \"root:posts:write\", query: [], request: null, responses: { 204: null }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/posts/{id}/restore\", auth: \"staff\", permission: \"root:posts:write\", query: [], request: null, responses: { 200: \"Post\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"content\", path: \"/posts/{id}/cover\", auth: \"staff\", permission: \"root:posts:write\", query: [], request: \"ImageInput\", responses: { 200: \"PostCover\" }, errors: [\"not_configured\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/posts/{id}/images\", auth: \"staff\", permission: \"root:posts:write\", query: [], request: \"ImageInput\", responses: { 200: \"InlineImage\" }, errors: [\"not_configured\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/{kind}/{id}/comments\", auth: \"public\", permission: null, query: [\"sort\", \"limit\", \"offset\"], request: null, responses: { 200: \"Comment[]\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/{kind}/{id}/comments\", auth: \"public\", permission: null, query: [], request: \"CommentInput\", responses: { 201: \"Comment\", 202: \"Comment\" }, errors: [\"comment_banned\", \"comment_too_long\", \"forbidden\", \"moderation_rejected\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/comments/latest\", auth: \"public\", permission: null, query: [\"limit\", \"offset\"], request: null, responses: { 200: \"FeedItem[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/comments/admin\", auth: \"staff\", permission: \"root:comments:moderate\", query: [\"content_kind\", \"author\", \"limit\", \"offset\"], request: null, responses: { 200: \"AdminComment[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/comments/{cid}/restore\", auth: \"staff\", permission: \"root:comments:moderate\", query: [], request: null, responses: { 200: \"Restored\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/comments/{cid}/replies\", auth: \"public\", permission: null, query: [\"limit\", \"offset\"], request: null, responses: { 200: \"Comment[]\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PATCH\", module: \"content\", path: \"/comments/{cid}\", auth: \"public\", permission: null, query: [], request: \"CommentEdit\", responses: { 200: \"Comment\", 202: \"Comment\" }, errors: [\"comment_banned\", \"comment_too_long\", \"conflict\", \"forbidden\", \"moderation_rejected\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/comments/{cid}\", auth: \"public\", permission: null, query: [], request: null, responses: { 204: null }, errors: [\"forbidden\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/comments/{cid}/like\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"ReactionCounts\" }, errors: [\"forbidden\", \"invalid_request\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/comments/{cid}/dislike\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"ReactionCounts\" }, errors: [\"forbidden\", \"invalid_request\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/comments/{cid}/reaction\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"ReactionCounts\" }, errors: [\"forbidden\", \"invalid_request\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/{kind}/{id}/like\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"ReactionCounts\" }, errors: [\"forbidden\", \"invalid_request\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/{kind}/{id}/dislike\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"ReactionCounts\" }, errors: [\"forbidden\", \"invalid_request\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/{kind}/{id}/reaction\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"ReactionCounts\" }, errors: [\"forbidden\", \"invalid_request\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/{kind}/{id}/reaction\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"ReactionCounts\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/favorites\", auth: \"user\", permission: null, query: [\"limit\", \"offset\"], request: null, responses: { 200: \"FavoriteItem[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/{kind}/{id}/favorite\", auth: \"user\", permission: null, query: [], request: null, responses: { 200: \"FavoriteState\" }, errors: [\"forbidden\", \"not_found\", \"rate_limited\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/{kind}/{id}/favorite\", auth: \"user\", permission: null, query: [], request: null, responses: { 200: \"FavoriteState\" }, errors: [\"forbidden\", \"invalid_request\", \"rate_limited\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/{kind}/{id}/favorite\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"FavoriteState\" }, errors: [\"invalid_request\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/polls\", auth: \"public\", permission: null, query: [\"language\", \"month\", \"date\", \"limit\", \"offset\"], request: null, responses: { 200: \"Poll[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/polls/admin\", auth: \"staff\", permission: \"root:polls:write\", query: [\"language\", \"month\", \"date\", \"state\", \"q\", \"limit\", \"offset\"], request: null, responses: { 200: \"Poll[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/polls/{id}\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"Poll\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/polls\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: \"PollInput\", responses: { 201: \"Poll\" }, errors: [\"not_configured\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PATCH\", module: \"content\", path: \"/polls/{id}\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: \"PollUpdate\", responses: { 200: \"Poll\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/polls/{id}\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: null, responses: { 204: null }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/polls/{id}/vote\", auth: \"public\", permission: null, query: [], request: \"PollVote\", responses: { 200: \"Poll\" }, errors: [\"forbidden\", \"not_found\", \"rate_limited\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/polls/{id}/answer\", auth: \"user\", permission: null, query: [], request: \"PollAnswerInput\", responses: { 200: \"Poll\" }, errors: [\"forbidden\", \"not_found\", \"rate_limited\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"content\", path: \"/polls/{id}/image\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: \"ImageInput\", responses: { 200: \"PollImage\" }, errors: [\"not_configured\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/polls/{id}/options\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: \"PollOptionPatch\", responses: { 201: \"PollOption\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PATCH\", module: \"content\", path: \"/polls/{id}/options/{oid}\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: \"PollOptionPatch\", responses: { 200: \"PollOption\" }, errors: [\"not_configured\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/polls/{id}/options/{oid}\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: null, responses: { 204: null }, errors: [\"invalid_request\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"content\", path: \"/polls/{id}/options/{oid}/image\", auth: \"staff\", permission: \"root:polls:write\", query: [], request: \"ImageInput\", responses: { 200: \"PollImage\" }, errors: [\"not_configured\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/comment-bans\", auth: \"user\", permission: null, query: [\"limit\", \"offset\"], request: null, responses: { 200: \"CommentBan[]\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"content\", path: \"/comment-bans/{user}\", auth: \"user\", permission: null, query: [], request: \"BanInput\", responses: { 200: \"CommentBan\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/comment-bans/{user}\", auth: \"user\", permission: null, query: [], request: null, responses: { 204: null }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/global-comment-bans\", auth: \"staff\", permission: \"root:comments:ban\", query: [\"limit\", \"offset\"], request: null, responses: { 200: \"CommentBan[]\" }, errors: [\"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/global-comment-bans/{user}\", auth: \"staff\", permission: \"root:comments:ban\", query: [], request: null, responses: { 200: \"CommentBan\" }, errors: [\"not_found\", \"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"content\", path: \"/global-comment-bans/{user}\", auth: \"staff\", permission: \"root:comments:ban\", query: [], request: \"BanInput\", responses: { 200: \"CommentBan\" }, errors: [\"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"content\", path: \"/global-comment-bans/{user}\", auth: \"staff\", permission: \"root:comments:ban\", query: [], request: null, responses: { 204: null }, errors: [\"unauthorized\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/{kind}/{id}/can-comment\", auth: \"public\", permission: null, query: [], request: null, responses: { 200: \"CommentStanding\" }, errors: [\"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"content\", path: \"/moderation/held\", auth: \"staff\", permission: \"root:moderation:review\", query: [\"kind\", \"cursor\", \"limit\"], request: null, responses: { 200: \"HeldPage\" }, errors: [], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"content\", path: \"/moderation/{kind}/{id}/resolve\", auth: \"staff\", permission: \"root:moderation:review\", query: [], request: \"ResolveInput\", responses: { 200: \"ReviewOutcome\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:content\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"upload\", path: \"/presign\", auth: \"user\", permission: null, query: [], request: \"PresignBody\", responses: { 200: \"PresignReply\" }, errors: [\"conflict\", \"forbidden\", \"not_found\", \"quota_exceeded\", \"rate_limited\", \"too_large\", \"too_many_files\", \"type_not_allowed\"], errorSets: [\"module:upload\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"upload\", path: \"/parts\", auth: \"user\", permission: null, query: [], request: \"PartsBody\", responses: { 200: \"PartsReply\" }, errors: [\"forbidden\", \"not_found\"], errorSets: [\"module:upload\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"upload\", path: \"/parts/list\", auth: \"user\", permission: null, query: [], request: \"TicketBody\", responses: { 200: \"PartsReply\" }, errors: [\"forbidden\", \"not_found\"], errorSets: [\"module:upload\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"upload\", path: \"/complete\", auth: \"user\", permission: null, query: [], request: \"TicketBody\", responses: { 200: \"CompleteReply\" }, errors: [\"checksum_mismatch\", \"forbidden\", \"incomplete\", \"not_found\"], errorSets: [\"module:upload\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"upload\", path: \"/abort\", auth: \"user\", permission: null, query: [], request: \"TicketBody\", responses: { 204: null }, errors: [\"forbidden\", \"not_found\"], errorSets: [\"module:upload\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"upload\", path: \"/commit\", auth: \"user\", permission: null, query: [], request: \"CommitBody\", responses: { 200: \"CommitReply\" }, errors: [\"conflict\", \"forbidden\", \"image_too_small\", \"not_found\", \"not_uploaded\", \"quota_exceeded\", \"rate_limited\", \"too_large\", \"too_many_files\", \"type_not_allowed\"], errorSets: [\"module:upload\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"upload\", path: \"/frame\", auth: \"user\", permission: null, query: [\"kind\", \"id\", \"path\", \"t\", \"w\"], request: null, responses: { 200: \"image/jpeg\" }, errors: [\"forbidden\", \"not_found\"], errorSets: [\"module:upload\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"media\", path: \"/presets\", auth: \"open\", permission: null, query: [], request: null, responses: { 200: \"PresetRule[]\" }, errors: [], errorSets: [\"module:media\"] },\n { method: \"GET\", module: \"media\", path: \"/{kind}/{id}\", auth: \"public\", permission: null, query: [\"prefix\", \"offset\", \"limit\", \"download\", \"editor\"], request: null, responses: { 200: \"ReadResult\" }, errors: [], errorSets: [\"module:media\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"media\", path: \"/{kind}/{id}/hls/{path...}\", auth: \"public\", permission: null, query: [\"audio\", \"subs\"], request: null, responses: { 200: \"application/vnd.apple.mpegurl\" }, errors: [], errorSets: [\"module:media\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"codes\", path: \"/{code}\", auth: \"open\", permission: null, query: [\"lang\"], request: null, responses: { 200: \"Resolved\" }, errors: [\"gone\", \"not_found\"], errorSets: [\"module:codes\", \"request\"] },\n { method: \"GET\", module: \"taxonomy\", path: \"/nodes\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [\"kind\", \"state\", \"id\", \"slug\", \"language\", \"language_mode\", \"name_prefix\", \"q\", \"content_kind\", \"min_count\", \"sort\", \"cursor\", \"offset\", \"limit\"], request: null, responses: { 200: \"NodePage\" }, errors: [], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"taxonomy\", path: \"/nodes\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"NodeInput[]\", responses: { 201: \"Node[]\" }, errors: [\"conflict\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"taxonomy\", path: \"/nodes/{id}\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: null, responses: { 200: \"NodeDetail\" }, errors: [\"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"PATCH\", module: \"taxonomy\", path: \"/nodes/{id}\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"NodeUpdate\", responses: { 200: \"Node\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"taxonomy\", path: \"/nodes/{id}\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: null, responses: { 200: \"Node\" }, errors: [\"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"taxonomy\", path: \"/nodes/{id}/names\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"Name[]\", responses: { 200: \"NodeDetail\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"taxonomy\", path: \"/nodes/{id}/names\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"Name[]\", responses: { 200: \"NodeDetail\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"taxonomy\", path: \"/nodes/{id}/names\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"Name[]\", responses: { 200: \"NodeDetail\" }, errors: [\"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"taxonomy\", path: \"/nodes/{id}/assignments\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [\"content_kind\", \"relation\", \"cursor\", \"limit\"], request: null, responses: { 200: \"AssignmentPage\" }, errors: [\"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"taxonomy\", path: \"/nodes/{id}/merge\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"MergeInput\", responses: { 200: \"MergeReport\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"taxonomy\", path: \"/edges\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"Edge[]\", responses: { 200: \"EdgesWritten\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"taxonomy\", path: \"/edges\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"Edge[]\", responses: { 200: \"EdgesWritten\" }, errors: [], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"taxonomy\", path: \"/assignments\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [\"suppress_counts\"], request: \"Assignment[]\", responses: { 200: \"AssignmentsWritten\" }, errors: [\"conflict\", \"not_found\"], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"taxonomy\", path: \"/assignments\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [\"suppress_counts\"], request: \"Assignment[]\", responses: { 200: \"AssignmentsWritten\" }, errors: [], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"taxonomy\", path: \"/effective\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: \"ContentRef[]\", responses: { 200: \"EffectiveTagsOf[]\" }, errors: [], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"GET\", module: \"taxonomy\", path: \"/counts\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [\"taxonomy_id\"], request: null, responses: { 200: \"Record<string, Count[]>\" }, errors: [], errorSets: [\"module:taxonomy\", \"auth\", \"request\"] },\n { method: \"POST\", module: \"taxonomy\", path: \"/counts/rebuild\", auth: \"staff\", permission: \"root:taxonomy:write\", query: [], request: null, responses: { 200: \"CountsRebuilt\" }, errors: [], errorSets: [\"module:taxonomy\", \"auth\"] },\n { method: \"GET\", module: \"catalog\", path: \"/totals\", auth: \"open\", permission: null, query: [\"kinds\", \"languages\"], request: null, responses: { 200: \"Totals\" }, errors: [\"unavailable\"], errorSets: [\"module:catalog\", \"request\"] },\n { method: \"GET\", module: \"notifications\", path: \"/inbox\", auth: \"user\", permission: null, query: [\"limit\", \"cursor\", \"unread\", \"dismissed\"], request: null, responses: { 200: \"Page\" }, errors: [], errorSets: [\"module:notifications\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"notifications\", path: \"/{id}/read\", auth: \"user\", permission: null, query: [], request: null, responses: { 200: \"Item\" }, errors: [\"not_found\"], errorSets: [\"module:notifications\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"notifications\", path: \"/{id}/read\", auth: \"user\", permission: null, query: [], request: null, responses: { 200: \"Item\" }, errors: [\"not_found\"], errorSets: [\"module:notifications\", \"auth\", \"request\"] },\n { method: \"PUT\", module: \"notifications\", path: \"/{id}/dismiss\", auth: \"user\", permission: null, query: [], request: null, responses: { 200: \"Item\" }, errors: [\"not_found\"], errorSets: [\"module:notifications\", \"auth\", \"request\"] },\n { method: \"DELETE\", module: \"notifications\", path: \"/{id}/dismiss\", auth: \"user\", permission: null, query: [], request: null, responses: { 200: \"Item\" }, errors: [\"not_found\"], errorSets: [\"module:notifications\", \"auth\", \"request\"] },\n] as const satisfies readonly ContentKitRoute[];\n\n// The codes every route of a kind answers, by set name.\nexport const CONTENTKIT_ERROR_SETS: Readonly<Record<string, readonly string[]>> = {\n \"auth\": [\"forbidden\", \"unauthorized\", \"unavailable\"],\n \"module:catalog\": [\"internal_error\"],\n \"module:codes\": [\"internal_error\"],\n \"module:content\": [\"internal_error\", \"tenant_mismatch\"],\n \"module:media\": [\"internal_error\", \"not_found\", \"rate_limited\", \"unavailable\", \"upgrade_required\"],\n \"module:notifications\": [\"internal_error\"],\n \"module:taxonomy\": [\"internal_error\"],\n \"module:upload\": [\"internal_error\", \"unavailable\", \"upgrade_required\"],\n \"request\": [\"invalid_request\"],\n};\n"],"mappings":"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"}
@@ -325,6 +325,10 @@ export interface Item {
325
325
  updated_at: string;
326
326
  revision: number;
327
327
  }
328
+ export interface LanguageTotal {
329
+ public: number;
330
+ tiers: Record<string, number>;
331
+ }
328
332
  export interface MergeInput {
329
333
  into_taxonomy_id: string;
330
334
  }
@@ -648,6 +652,14 @@ export interface ReviewOutcome {
648
652
  export interface TicketBody {
649
653
  ticket: string;
650
654
  }
655
+ export interface Total {
656
+ public: number;
657
+ tiers: Record<string, number>;
658
+ languages: Record<string, LanguageTotal>;
659
+ }
660
+ export interface Totals {
661
+ kinds: Record<string, Total>;
662
+ }
651
663
  export interface UploadRule {
652
664
  path: string;
653
665
  types: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"wire.js","names":[],"sources":["../../../src/client/generated/wire.ts"],"sourcesContent":["// Generated by `go generate ./internal/contract` from ContentKit's route catalog. Do not edit.\n\nimport type { ErrorCode } from \"./error-codes.js\";\n\nexport type { ErrorCode };\n\n// Upload sizes: one PUT up to MAX_SINGLE_PUT bytes, else multipart parts.\nexport const MAX_SINGLE_PUT = 67108864;\nexport const MIN_PART_SIZE = 8388608;\nexport const MAX_PART_SIZE = 16777216;\n\nexport type OpName = \"put\" | \"edit\" | \"move\" | \"rename\" | \"remove\" | \"attach\" | \"copy\" | \"frame\" | \"meta\" | \"regenerate\";\nexport type Access = \"full\" | \"none\";\nexport type ItemState = \"ready\" | \"processing\" | \"failed\";\nexport type EncodePhase = \"queued\" | \"downloading\" | \"probing\" | \"encoding\" | \"muxing\" | \"uploading\" | \"publishing\" | \"images\";\nexport type PollKind = \"multiple_choice\" | \"free_text\";\nexport type ModerationState = \"approved\" | \"held\" | \"rejected\";\n\nexport interface AdminComment {\n id: string;\n reply_to_id?: string;\n user_id?: string;\n anon_name?: string;\n body: string;\n deleted: boolean;\n likes: number;\n dislikes: number;\n mine: number;\n reply_count: number;\n author?: PublicUser;\n moderation?: ModerationState;\n moderation_reason?: string;\n created_at: string;\n updated_at: string;\n tenant_id: string;\n content_kind: string;\n content_id: string;\n content_version_id?: string;\n deleted_at?: string;\n}\n\nexport interface Anonymous {\n comments: boolean;\n reactions: boolean;\n votes: boolean;\n}\n\nexport interface Assignment {\n tenant_id: string;\n content_kind: string;\n content_id: string;\n content_version_id?: string;\n taxonomy_id: string;\n relation: string;\n state?: \"active\" | \"proposed\";\n source_revision: number;\n}\n\nexport interface AssignmentPage {\n assignments: Assignment[];\n next_cursor?: string;\n}\n\nexport interface AssignmentsWritten {\n assignments: number;\n}\n\nexport interface BanInput {\n reason?: string;\n until?: string;\n}\n\nexport interface BanNotice {\n scope: string;\n reason?: string;\n until?: string;\n}\n\nexport interface Comment {\n id: string;\n reply_to_id?: string;\n user_id?: string;\n anon_name?: string;\n body: string;\n deleted: boolean;\n likes: number;\n dislikes: number;\n mine: number;\n reply_count: number;\n author?: PublicUser;\n moderation?: ModerationState;\n moderation_reason?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface CommentBan {\n user_id: string;\n user?: PublicUser;\n scope: string;\n reason?: string;\n until?: string;\n banned_by: string;\n banned_at: string;\n expired: boolean;\n}\n\nexport interface CommentEdit {\n body: string;\n}\n\nexport interface CommentInput {\n body: string;\n reply_to_id?: string;\n anon_name?: string;\n}\n\nexport interface CommentStanding {\n can_comment: boolean;\n ban?: BanNotice;\n anonymous: boolean;\n max_length: number;\n user_id?: string;\n moderate: boolean;\n ban_scopes: (\"global\" | \"owner\")[];\n}\n\nexport interface CommitBody {\n ref: RefBody;\n operation_id: string;\n ops: Op[];\n}\n\nexport interface CommitReply {\n files: FileInfo[];\n}\n\nexport interface CompleteReply {\n blob: string;\n type: string;\n size: number;\n}\n\nexport interface Config {\n anonymous: Anonymous;\n comment_max_length: number;\n}\n\nexport interface ContentRef {\n tenant_id: string;\n content_kind: string;\n content_id: string;\n content_version_id?: string;\n}\n\nexport interface CopyFrom {\n id: string;\n path: string;\n}\n\nexport interface Count {\n content_kind: string;\n language: string;\n count: number;\n}\n\nexport interface CountsRebuilt {\n nodes: number;\n}\n\nexport interface Crop {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface Edge {\n from_taxonomy_id: string;\n relation: \"alias_of\" | \"artist_of\" | \"child\" | \"member_of\" | \"parent\" | \"synonym\" | \"voice_of\";\n to_taxonomy_id: string;\n source_revision: number;\n}\n\nexport interface EdgesWritten {\n edges: number;\n}\n\nexport interface Edit {\n crop?: Crop;\n rotate?: number;\n}\n\nexport interface EffectiveTag {\n taxonomy_id: string;\n kind: string;\n slug: string;\n relation: string;\n scope: \"content\" | \"version\";\n}\n\nexport interface EffectiveTagsOf {\n content: ContentRef;\n tags: EffectiveTag[];\n}\n\nexport interface EncodeProgress {\n phase: EncodePhase;\n queue_position?: number;\n segments_done?: number;\n segments_total?: number;\n percent: number;\n speed?: number;\n eta?: number;\n at: number;\n stalled?: boolean;\n stage?: number;\n stages?: number;\n}\n\nexport interface ErrorDetails {\n width?: number;\n height?: number;\n min_width?: number;\n max_pixels?: number;\n type?: string;\n allowed?: string[];\n size?: number;\n max_bytes?: number;\n frames?: number;\n max_frames?: number;\n seconds?: number;\n max_seconds?: number;\n min_aspect?: number;\n max_aspect?: number;\n max?: number;\n}\n\nexport interface ErrorReply {\n error: string;\n code: ErrorCode;\n retry_after?: number;\n action?: \"comment\" | \"comment_reaction\" | \"favorite\" | \"poll_vote\" | \"post_reaction\" | \"reaction\";\n ban?: BanNotice;\n blobs?: string[];\n details?: ErrorDetails;\n}\n\nexport interface Failure {\n of: string;\n message: string;\n code?: ErrorCode;\n details?: ErrorDetails;\n}\n\nexport interface FavoriteItem {\n tenant_id: string;\n content_kind: string;\n content_id: string;\n content_version_id?: string;\n created_at: string;\n}\n\nexport interface FavoriteState {\n favorited: boolean;\n count: number;\n}\n\nexport interface FeedItem {\n id: string;\n reply_to_id?: string;\n user_id?: string;\n anon_name?: string;\n body: string;\n deleted: boolean;\n likes: number;\n dislikes: number;\n mine: number;\n reply_count: number;\n author?: PublicUser;\n moderation?: ModerationState;\n moderation_reason?: string;\n created_at: string;\n updated_at: string;\n tenant_id: string;\n content_kind: string;\n content_id: string;\n content_version_id?: string;\n}\n\nexport interface FileInfo {\n path: string;\n type: string;\n size?: number;\n w?: number;\n h?: number;\n dur?: number;\n download?: string;\n url?: string;\n locked?: boolean;\n upload?: boolean;\n staged?: boolean;\n from?: string;\n edit?: Edit;\n frame?: Frame;\n meta?: Record<string, unknown>;\n unattached?: boolean;\n pending?: string[];\n failed?: Failure;\n editor_url?: string;\n progress?: EncodeProgress;\n}\n\nexport interface Frame {\n t?: number;\n auto?: boolean;\n of?: string;\n}\n\nexport interface Group {\n id: string;\n label: string;\n count: number;\n}\n\nexport interface HeldItem {\n kind: string;\n revision: number;\n id: string;\n ref: ContentRef;\n author_id?: string;\n author?: PublicUser;\n anon_name?: string;\n title?: string;\n body: string;\n reason: string;\n model?: string;\n prompt_version?: string;\n confidence?: number;\n error?: string;\n held_at: string;\n created_at: string;\n}\n\nexport interface HeldPage {\n items: HeldItem[];\n next?: string;\n}\n\nexport interface ImageInput {\n image?: string;\n}\n\nexport interface InlineImage {\n ref: string;\n url: string | null;\n}\n\nexport interface Item {\n id: string;\n recipient: Recipient;\n origin: Origin;\n kind: string;\n data: unknown;\n created_at: string;\n status?: string;\n action_requested?: boolean;\n severity?: string;\n read_at: string | null;\n dismissed_at: string | null;\n resolved_at: string | null;\n updated_at: string;\n revision: number;\n}\n\nexport interface MergeInput {\n into_taxonomy_id: string;\n}\n\nexport interface MergeReport {\n from_taxonomy_id: string;\n into_taxonomy_id: string;\n assignments_moved: number;\n names_moved: number;\n edges_rewritten: number;\n assignments_merged: number;\n}\n\nexport interface MultipartReply {\n ticket: string;\n min_part_size: number;\n max_part_size: number;\n max_parts: number;\n}\n\nexport interface Name {\n language: string;\n kind: \"alias\" | \"name\";\n name: string;\n normalized?: string;\n source_revision: number;\n}\n\nexport interface Node {\n taxonomy_id: string;\n tenant_id: string;\n kind: string;\n slug: string;\n state: \"active\" | \"deleted\" | \"merged\";\n source_revision: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface NodeDetail {\n taxonomy_id: string;\n tenant_id: string;\n kind: string;\n slug: string;\n state: \"active\" | \"deleted\" | \"merged\";\n source_revision: number;\n created_at: string;\n updated_at: string;\n names: Name[];\n edges: Edge[];\n counts: Count[];\n}\n\nexport interface NodeInput {\n taxonomy_id?: string;\n kind: string;\n slug: string;\n names?: Name[];\n source_revision: number;\n}\n\nexport interface NodePage {\n nodes: NodeRow[];\n next_cursor?: string;\n total: number;\n}\n\nexport interface NodeRow {\n taxonomy_id: string;\n tenant_id: string;\n kind: string;\n slug: string;\n state: \"active\" | \"deleted\" | \"merged\";\n source_revision: number;\n created_at: string;\n updated_at: string;\n name?: string;\n name_language?: string;\n count: number;\n}\n\nexport interface NodeUpdate {\n slug?: string;\n state?: \"active\" | \"deleted\" | \"merged\";\n source_revision?: number;\n}\n\nexport interface Op {\n op: OpName;\n path?: string;\n blob?: string;\n create_id?: string;\n index?: number;\n meta?: Record<string, unknown>;\n edit?: Edit;\n unattached?: boolean;\n to?: string;\n from?: CopyFrom;\n t?: number;\n auto?: boolean;\n preset?: string;\n force?: boolean;\n takedown?: boolean;\n}\n\nexport interface Origin {\n system: string;\n scope: string;\n id: string;\n subject?: string;\n}\n\nexport interface Page {\n items: Item[];\n next_cursor?: string;\n}\n\nexport interface PartBody {\n number: number;\n size: number;\n sha256: string;\n}\n\nexport interface PartReply {\n number: number;\n size?: number;\n sha256?: string;\n request?: RequestReply;\n}\n\nexport interface PartsBody {\n ticket: string;\n parts: PartBody[];\n}\n\nexport interface PartsReply {\n parts: PartReply[];\n}\n\nexport interface Poll {\n id: string;\n kind: PollKind;\n question: string;\n language: string;\n is_active: boolean;\n image_url?: string;\n live_at: string;\n closes_at?: string;\n closed: boolean;\n total_votes: number;\n options: PollOption[];\n voted: boolean;\n my_option?: string;\n answer_count?: number;\n groups?: Group[];\n my_answer?: PollAnswer;\n}\n\nexport interface PollAnswer {\n id: string;\n text: string;\n classified: boolean;\n updated_at: string;\n}\n\nexport interface PollAnswerInput {\n text: string;\n}\n\nexport interface PollImage {\n image_url: string | null;\n}\n\nexport interface PollInput {\n kind?: PollKind;\n question: string;\n language: string;\n live_at?: string;\n closes_at?: string;\n options?: PollOptionInput[];\n}\n\nexport interface PollOption {\n id: string;\n label: string;\n image_url?: string;\n position: number;\n vote_count: number;\n}\n\nexport interface PollOptionInput {\n label: string;\n position: number;\n}\n\nexport interface PollOptionPatch {\n label?: string;\n position?: number;\n}\n\nexport interface PollUpdate {\n question?: string;\n is_active?: boolean;\n live_at?: string;\n closes_at?: string | null;\n}\n\nexport interface PollVote {\n option_id: string;\n}\n\nexport interface Post {\n id: string;\n author_id: string;\n title: string;\n slug?: string;\n body: string;\n excerpt?: string;\n cover?: string;\n cover_url?: string;\n images?: Record<string, string>;\n language: string;\n is_draft: boolean;\n live_at?: string;\n total_likes: number;\n total_dislikes: number;\n comment_count: number;\n moderation?: ModerationState;\n moderation_reason?: string;\n code: string;\n url_slug: string;\n created_at: string;\n updated_at: string;\n deleted_at?: string;\n}\n\nexport interface PostCover {\n cover_url: string | null;\n}\n\nexport interface PostInput {\n title?: string;\n body?: string;\n excerpt?: string;\n language?: string;\n slug?: string;\n is_draft?: boolean;\n live_at?: string;\n}\n\nexport interface PresetRule {\n kind: string;\n name: string;\n from: string;\n base: string;\n namespace: string;\n to: string;\n widths: number[];\n aspect?: string;\n min_width?: number;\n first?: number;\n default: boolean;\n}\n\nexport interface PresignBody {\n ref: RefBody;\n path: string;\n type: string;\n size: number;\n sha256: string;\n}\n\nexport interface PresignReply {\n path: string;\n blob: string;\n exists?: boolean;\n put?: RequestReply;\n multipart?: MultipartReply;\n process_on_upload?: boolean;\n}\n\nexport interface PublicImage {\n from: string;\n preset: string;\n renditions: PublicRendition[];\n}\n\nexport interface PublicRendition {\n url: string;\n w: number;\n h: number;\n}\n\nexport interface PublicUser {\n id: string;\n name?: string;\n username: string;\n avatar?: string;\n avatar_srcset?: string;\n}\n\nexport interface ReactionCounts {\n likes: number;\n dislikes: number;\n mine: number;\n}\n\nexport interface ReadResult {\n access: Access;\n expires: number;\n meta?: Record<string, unknown>;\n previews?: string[];\n public?: PublicImage[];\n total: number;\n offset: number;\n limit: number;\n hls?: string[];\n state?: ItemState;\n full?: boolean;\n uploads?: UploadRule[];\n files: FileInfo[];\n}\n\nexport interface Recipient {\n audience: string;\n id: string;\n}\n\nexport interface RefBody {\n kind: string;\n id: string;\n}\n\nexport interface RequestReply {\n method: string;\n url: string;\n headers: Record<string, string>;\n expires: string;\n}\n\nexport interface ResolveInput {\n decision: \"approve\" | \"reject\" | \"review\";\n revision: number;\n reason?: string;\n}\n\nexport interface Resolved {\n tenant_id: string;\n content_kind: string;\n content_id: string;\n content_version_id?: string;\n code: string;\n slug: string;\n slugs?: Record<string, string>;\n path: string;\n}\n\nexport interface Restored {\n restored: boolean;\n}\n\nexport interface ReviewOutcome {\n decision: \"approve\" | \"reject\" | \"review\";\n}\n\nexport interface TicketBody {\n ticket: string;\n}\n\nexport interface UploadRule {\n path: string;\n types: string[];\n max_bytes: number;\n max?: number;\n named?: boolean;\n frames?: string;\n aspect?: string;\n min_width?: number;\n video?: VideoLimits;\n min_aspect?: number;\n max_aspect?: number;\n}\n\nexport interface VideoLimits {\n max_seconds?: number;\n max_fps?: number;\n max_pixels?: number;\n max_work?: number;\n}\n"],"mappings":";AAOA,IAAa,IAAiB,UACjB,IAAgB,SAChB,IAAgB"}
1
+ {"version":3,"file":"wire.js","names":[],"sources":["../../../src/client/generated/wire.ts"],"sourcesContent":["// Generated by `go generate ./internal/contract` from ContentKit's route catalog. Do not edit.\n\nimport type { ErrorCode } from \"./error-codes.js\";\n\nexport type { ErrorCode };\n\n// Upload sizes: one PUT up to MAX_SINGLE_PUT bytes, else multipart parts.\nexport const MAX_SINGLE_PUT = 67108864;\nexport const MIN_PART_SIZE = 8388608;\nexport const MAX_PART_SIZE = 16777216;\n\nexport type OpName = \"put\" | \"edit\" | \"move\" | \"rename\" | \"remove\" | \"attach\" | \"copy\" | \"frame\" | \"meta\" | \"regenerate\";\nexport type Access = \"full\" | \"none\";\nexport type ItemState = \"ready\" | \"processing\" | \"failed\";\nexport type EncodePhase = \"queued\" | \"downloading\" | \"probing\" | \"encoding\" | \"muxing\" | \"uploading\" | \"publishing\" | \"images\";\nexport type PollKind = \"multiple_choice\" | \"free_text\";\nexport type ModerationState = \"approved\" | \"held\" | \"rejected\";\n\nexport interface AdminComment {\n id: string;\n reply_to_id?: string;\n user_id?: string;\n anon_name?: string;\n body: string;\n deleted: boolean;\n likes: number;\n dislikes: number;\n mine: number;\n reply_count: number;\n author?: PublicUser;\n moderation?: ModerationState;\n moderation_reason?: string;\n created_at: string;\n updated_at: string;\n tenant_id: string;\n content_kind: string;\n content_id: string;\n content_version_id?: string;\n deleted_at?: string;\n}\n\nexport interface Anonymous {\n comments: boolean;\n reactions: boolean;\n votes: boolean;\n}\n\nexport interface Assignment {\n tenant_id: string;\n content_kind: string;\n content_id: string;\n content_version_id?: string;\n taxonomy_id: string;\n relation: string;\n state?: \"active\" | \"proposed\";\n source_revision: number;\n}\n\nexport interface AssignmentPage {\n assignments: Assignment[];\n next_cursor?: string;\n}\n\nexport interface AssignmentsWritten {\n assignments: number;\n}\n\nexport interface BanInput {\n reason?: string;\n until?: string;\n}\n\nexport interface BanNotice {\n scope: string;\n reason?: string;\n until?: string;\n}\n\nexport interface Comment {\n id: string;\n reply_to_id?: string;\n user_id?: string;\n anon_name?: string;\n body: string;\n deleted: boolean;\n likes: number;\n dislikes: number;\n mine: number;\n reply_count: number;\n author?: PublicUser;\n moderation?: ModerationState;\n moderation_reason?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface CommentBan {\n user_id: string;\n user?: PublicUser;\n scope: string;\n reason?: string;\n until?: string;\n banned_by: string;\n banned_at: string;\n expired: boolean;\n}\n\nexport interface CommentEdit {\n body: string;\n}\n\nexport interface CommentInput {\n body: string;\n reply_to_id?: string;\n anon_name?: string;\n}\n\nexport interface CommentStanding {\n can_comment: boolean;\n ban?: BanNotice;\n anonymous: boolean;\n max_length: number;\n user_id?: string;\n moderate: boolean;\n ban_scopes: (\"global\" | \"owner\")[];\n}\n\nexport interface CommitBody {\n ref: RefBody;\n operation_id: string;\n ops: Op[];\n}\n\nexport interface CommitReply {\n files: FileInfo[];\n}\n\nexport interface CompleteReply {\n blob: string;\n type: string;\n size: number;\n}\n\nexport interface Config {\n anonymous: Anonymous;\n comment_max_length: number;\n}\n\nexport interface ContentRef {\n tenant_id: string;\n content_kind: string;\n content_id: string;\n content_version_id?: string;\n}\n\nexport interface CopyFrom {\n id: string;\n path: string;\n}\n\nexport interface Count {\n content_kind: string;\n language: string;\n count: number;\n}\n\nexport interface CountsRebuilt {\n nodes: number;\n}\n\nexport interface Crop {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface Edge {\n from_taxonomy_id: string;\n relation: \"alias_of\" | \"artist_of\" | \"child\" | \"member_of\" | \"parent\" | \"synonym\" | \"voice_of\";\n to_taxonomy_id: string;\n source_revision: number;\n}\n\nexport interface EdgesWritten {\n edges: number;\n}\n\nexport interface Edit {\n crop?: Crop;\n rotate?: number;\n}\n\nexport interface EffectiveTag {\n taxonomy_id: string;\n kind: string;\n slug: string;\n relation: string;\n scope: \"content\" | \"version\";\n}\n\nexport interface EffectiveTagsOf {\n content: ContentRef;\n tags: EffectiveTag[];\n}\n\nexport interface EncodeProgress {\n phase: EncodePhase;\n queue_position?: number;\n segments_done?: number;\n segments_total?: number;\n percent: number;\n speed?: number;\n eta?: number;\n at: number;\n stalled?: boolean;\n stage?: number;\n stages?: number;\n}\n\nexport interface ErrorDetails {\n width?: number;\n height?: number;\n min_width?: number;\n max_pixels?: number;\n type?: string;\n allowed?: string[];\n size?: number;\n max_bytes?: number;\n frames?: number;\n max_frames?: number;\n seconds?: number;\n max_seconds?: number;\n min_aspect?: number;\n max_aspect?: number;\n max?: number;\n}\n\nexport interface ErrorReply {\n error: string;\n code: ErrorCode;\n retry_after?: number;\n action?: \"comment\" | \"comment_reaction\" | \"favorite\" | \"poll_vote\" | \"post_reaction\" | \"reaction\";\n ban?: BanNotice;\n blobs?: string[];\n details?: ErrorDetails;\n}\n\nexport interface Failure {\n of: string;\n message: string;\n code?: ErrorCode;\n details?: ErrorDetails;\n}\n\nexport interface FavoriteItem {\n tenant_id: string;\n content_kind: string;\n content_id: string;\n content_version_id?: string;\n created_at: string;\n}\n\nexport interface FavoriteState {\n favorited: boolean;\n count: number;\n}\n\nexport interface FeedItem {\n id: string;\n reply_to_id?: string;\n user_id?: string;\n anon_name?: string;\n body: string;\n deleted: boolean;\n likes: number;\n dislikes: number;\n mine: number;\n reply_count: number;\n author?: PublicUser;\n moderation?: ModerationState;\n moderation_reason?: string;\n created_at: string;\n updated_at: string;\n tenant_id: string;\n content_kind: string;\n content_id: string;\n content_version_id?: string;\n}\n\nexport interface FileInfo {\n path: string;\n type: string;\n size?: number;\n w?: number;\n h?: number;\n dur?: number;\n download?: string;\n url?: string;\n locked?: boolean;\n upload?: boolean;\n staged?: boolean;\n from?: string;\n edit?: Edit;\n frame?: Frame;\n meta?: Record<string, unknown>;\n unattached?: boolean;\n pending?: string[];\n failed?: Failure;\n editor_url?: string;\n progress?: EncodeProgress;\n}\n\nexport interface Frame {\n t?: number;\n auto?: boolean;\n of?: string;\n}\n\nexport interface Group {\n id: string;\n label: string;\n count: number;\n}\n\nexport interface HeldItem {\n kind: string;\n revision: number;\n id: string;\n ref: ContentRef;\n author_id?: string;\n author?: PublicUser;\n anon_name?: string;\n title?: string;\n body: string;\n reason: string;\n model?: string;\n prompt_version?: string;\n confidence?: number;\n error?: string;\n held_at: string;\n created_at: string;\n}\n\nexport interface HeldPage {\n items: HeldItem[];\n next?: string;\n}\n\nexport interface ImageInput {\n image?: string;\n}\n\nexport interface InlineImage {\n ref: string;\n url: string | null;\n}\n\nexport interface Item {\n id: string;\n recipient: Recipient;\n origin: Origin;\n kind: string;\n data: unknown;\n created_at: string;\n status?: string;\n action_requested?: boolean;\n severity?: string;\n read_at: string | null;\n dismissed_at: string | null;\n resolved_at: string | null;\n updated_at: string;\n revision: number;\n}\n\nexport interface LanguageTotal {\n public: number;\n tiers: Record<string, number>;\n}\n\nexport interface MergeInput {\n into_taxonomy_id: string;\n}\n\nexport interface MergeReport {\n from_taxonomy_id: string;\n into_taxonomy_id: string;\n assignments_moved: number;\n names_moved: number;\n edges_rewritten: number;\n assignments_merged: number;\n}\n\nexport interface MultipartReply {\n ticket: string;\n min_part_size: number;\n max_part_size: number;\n max_parts: number;\n}\n\nexport interface Name {\n language: string;\n kind: \"alias\" | \"name\";\n name: string;\n normalized?: string;\n source_revision: number;\n}\n\nexport interface Node {\n taxonomy_id: string;\n tenant_id: string;\n kind: string;\n slug: string;\n state: \"active\" | \"deleted\" | \"merged\";\n source_revision: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface NodeDetail {\n taxonomy_id: string;\n tenant_id: string;\n kind: string;\n slug: string;\n state: \"active\" | \"deleted\" | \"merged\";\n source_revision: number;\n created_at: string;\n updated_at: string;\n names: Name[];\n edges: Edge[];\n counts: Count[];\n}\n\nexport interface NodeInput {\n taxonomy_id?: string;\n kind: string;\n slug: string;\n names?: Name[];\n source_revision: number;\n}\n\nexport interface NodePage {\n nodes: NodeRow[];\n next_cursor?: string;\n total: number;\n}\n\nexport interface NodeRow {\n taxonomy_id: string;\n tenant_id: string;\n kind: string;\n slug: string;\n state: \"active\" | \"deleted\" | \"merged\";\n source_revision: number;\n created_at: string;\n updated_at: string;\n name?: string;\n name_language?: string;\n count: number;\n}\n\nexport interface NodeUpdate {\n slug?: string;\n state?: \"active\" | \"deleted\" | \"merged\";\n source_revision?: number;\n}\n\nexport interface Op {\n op: OpName;\n path?: string;\n blob?: string;\n create_id?: string;\n index?: number;\n meta?: Record<string, unknown>;\n edit?: Edit;\n unattached?: boolean;\n to?: string;\n from?: CopyFrom;\n t?: number;\n auto?: boolean;\n preset?: string;\n force?: boolean;\n takedown?: boolean;\n}\n\nexport interface Origin {\n system: string;\n scope: string;\n id: string;\n subject?: string;\n}\n\nexport interface Page {\n items: Item[];\n next_cursor?: string;\n}\n\nexport interface PartBody {\n number: number;\n size: number;\n sha256: string;\n}\n\nexport interface PartReply {\n number: number;\n size?: number;\n sha256?: string;\n request?: RequestReply;\n}\n\nexport interface PartsBody {\n ticket: string;\n parts: PartBody[];\n}\n\nexport interface PartsReply {\n parts: PartReply[];\n}\n\nexport interface Poll {\n id: string;\n kind: PollKind;\n question: string;\n language: string;\n is_active: boolean;\n image_url?: string;\n live_at: string;\n closes_at?: string;\n closed: boolean;\n total_votes: number;\n options: PollOption[];\n voted: boolean;\n my_option?: string;\n answer_count?: number;\n groups?: Group[];\n my_answer?: PollAnswer;\n}\n\nexport interface PollAnswer {\n id: string;\n text: string;\n classified: boolean;\n updated_at: string;\n}\n\nexport interface PollAnswerInput {\n text: string;\n}\n\nexport interface PollImage {\n image_url: string | null;\n}\n\nexport interface PollInput {\n kind?: PollKind;\n question: string;\n language: string;\n live_at?: string;\n closes_at?: string;\n options?: PollOptionInput[];\n}\n\nexport interface PollOption {\n id: string;\n label: string;\n image_url?: string;\n position: number;\n vote_count: number;\n}\n\nexport interface PollOptionInput {\n label: string;\n position: number;\n}\n\nexport interface PollOptionPatch {\n label?: string;\n position?: number;\n}\n\nexport interface PollUpdate {\n question?: string;\n is_active?: boolean;\n live_at?: string;\n closes_at?: string | null;\n}\n\nexport interface PollVote {\n option_id: string;\n}\n\nexport interface Post {\n id: string;\n author_id: string;\n title: string;\n slug?: string;\n body: string;\n excerpt?: string;\n cover?: string;\n cover_url?: string;\n images?: Record<string, string>;\n language: string;\n is_draft: boolean;\n live_at?: string;\n total_likes: number;\n total_dislikes: number;\n comment_count: number;\n moderation?: ModerationState;\n moderation_reason?: string;\n code: string;\n url_slug: string;\n created_at: string;\n updated_at: string;\n deleted_at?: string;\n}\n\nexport interface PostCover {\n cover_url: string | null;\n}\n\nexport interface PostInput {\n title?: string;\n body?: string;\n excerpt?: string;\n language?: string;\n slug?: string;\n is_draft?: boolean;\n live_at?: string;\n}\n\nexport interface PresetRule {\n kind: string;\n name: string;\n from: string;\n base: string;\n namespace: string;\n to: string;\n widths: number[];\n aspect?: string;\n min_width?: number;\n first?: number;\n default: boolean;\n}\n\nexport interface PresignBody {\n ref: RefBody;\n path: string;\n type: string;\n size: number;\n sha256: string;\n}\n\nexport interface PresignReply {\n path: string;\n blob: string;\n exists?: boolean;\n put?: RequestReply;\n multipart?: MultipartReply;\n process_on_upload?: boolean;\n}\n\nexport interface PublicImage {\n from: string;\n preset: string;\n renditions: PublicRendition[];\n}\n\nexport interface PublicRendition {\n url: string;\n w: number;\n h: number;\n}\n\nexport interface PublicUser {\n id: string;\n name?: string;\n username: string;\n avatar?: string;\n avatar_srcset?: string;\n}\n\nexport interface ReactionCounts {\n likes: number;\n dislikes: number;\n mine: number;\n}\n\nexport interface ReadResult {\n access: Access;\n expires: number;\n meta?: Record<string, unknown>;\n previews?: string[];\n public?: PublicImage[];\n total: number;\n offset: number;\n limit: number;\n hls?: string[];\n state?: ItemState;\n full?: boolean;\n uploads?: UploadRule[];\n files: FileInfo[];\n}\n\nexport interface Recipient {\n audience: string;\n id: string;\n}\n\nexport interface RefBody {\n kind: string;\n id: string;\n}\n\nexport interface RequestReply {\n method: string;\n url: string;\n headers: Record<string, string>;\n expires: string;\n}\n\nexport interface ResolveInput {\n decision: \"approve\" | \"reject\" | \"review\";\n revision: number;\n reason?: string;\n}\n\nexport interface Resolved {\n tenant_id: string;\n content_kind: string;\n content_id: string;\n content_version_id?: string;\n code: string;\n slug: string;\n slugs?: Record<string, string>;\n path: string;\n}\n\nexport interface Restored {\n restored: boolean;\n}\n\nexport interface ReviewOutcome {\n decision: \"approve\" | \"reject\" | \"review\";\n}\n\nexport interface TicketBody {\n ticket: string;\n}\n\nexport interface Total {\n public: number;\n tiers: Record<string, number>;\n languages: Record<string, LanguageTotal>;\n}\n\nexport interface Totals {\n kinds: Record<string, Total>;\n}\n\nexport interface UploadRule {\n path: string;\n types: string[];\n max_bytes: number;\n max?: number;\n named?: boolean;\n frames?: string;\n aspect?: string;\n min_width?: number;\n video?: VideoLimits;\n min_aspect?: number;\n max_aspect?: number;\n}\n\nexport interface VideoLimits {\n max_seconds?: number;\n max_fps?: number;\n max_pixels?: number;\n max_work?: number;\n}\n"],"mappings":";AAOA,IAAa,IAAiB,UACjB,IAAgB,SAChB,IAAgB"}
@@ -17,6 +17,8 @@ export interface ContentKitMounts {
17
17
  codes?: string;
18
18
  /** Taxonomy. Default `{baseUrl}/taxonomy`. */
19
19
  taxonomy?: string;
20
+ /** The public catalog. Default `{baseUrl}/catalog`. */
21
+ catalog?: string;
20
22
  /** User inbox. Default `{baseUrl}/notifications`. */
21
23
  notifications?: string;
22
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","names":[],"sources":["../../src/client/http.ts"],"sourcesContent":["import { ContentKitError, aborted, readContentKitError } from \"./errors.js\";\nimport type { ContentChange } from \"./content/types.js\";\nimport type { FileInfo, Item, RefBody } from \"./generated/wire.js\";\n\n/** A module's base URL, or one per item (a host that splits uploads by kind). */\nexport type Mount = string | ((ref: RefBody) => string);\n\n/**\n * Where each module lives when the host does not serve them all under\n * baseUrl's fixed sub-paths.\n */\nexport interface ContentKitMounts {\n /** Posts, comments, reactions, favorites, polls, bans, moderation. Default baseUrl. */\n content?: string;\n /** Media reads and HLS playlists. Default `{baseUrl}/media`. */\n media?: Mount;\n /** Uploads and commits. Default `{baseUrl}/media/upload`. */\n upload?: Mount;\n /** Content-code lookup. Default `{baseUrl}/codes`. */\n codes?: string;\n /** Taxonomy. Default `{baseUrl}/taxonomy`. */\n taxonomy?: string;\n /** User inbox. Default `{baseUrl}/notifications`. */\n notifications?: string;\n}\n\nexport type ContentKitModule = keyof ContentKitMounts;\n\n/** A mutation made through the client: the host's cache-invalidation hook gets each one. */\nexport type ContentKitChange =\n /** A commit applied; files are the item's uploads as an editor reads them, without URLs. */\n | { type: \"media.committed\"; ref: RefBody; files: FileInfo[] }\n /** An upload finished processing, as an editor read returns it. */\n | { type: \"media.processed\"; ref: RefBody; file: FileInfo }\n | { type: \"notifications.changed\" }\n | { type: \"notifications.updated\"; item: Item }\n | ContentChange;\n\nexport type TokenSource = () => string | null | undefined | Promise<string | null | undefined>;\n\nexport interface HttpOptions {\n /** Where the host mounts ContentKit, e.g. \"/api/v1/contentkit\". */\n baseUrl: string;\n mounts?: ContentKitMounts;\n /** Transport for API calls; pass an authenticating fetch (auth-ui's authFetch). */\n fetch?: typeof fetch;\n /**\n * Bearer for API calls and for HLS playlists on the API origin (hls.js\n * loads them with XHR, not fetch). An authenticating fetch overrides it.\n */\n token?: TokenSource;\n /** Sent as Accept-Language. */\n language?: () => string | null | undefined;\n /** Extra headers per call (CSRF). */\n headers?: () => HeadersInit | Promise<HeadersInit>;\n /** Default \"same-origin\"; \"include\" also sends cookies with HLS requests. */\n credentials?: RequestCredentials;\n}\n\nexport interface RequestOptions {\n method?: string;\n body?: unknown;\n signal?: AbortSignal;\n /** Read the body as a Blob instead of JSON. */\n blob?: boolean;\n}\n\nconst trim = (u: string) => u.replace(/\\/+$/, \"\");\n\n/** The transport every module shares: mounts, auth, language, errors and change events. */\nexport class Http {\n private readonly listeners = new Set<(change: ContentKitChange, scope: string | null) => void>();\n private readScope = { key: \"{}\" };\n private readonly base: string;\n\n constructor(private readonly o: HttpOptions) {\n if (typeof o.baseUrl !== \"string\") throw new Error(\"contentkit: createContentKitClient needs baseUrl\");\n this.base = trim(o.baseUrl);\n }\n\n /** The module's base URL, without a trailing slash. */\n mount(module: ContentKitModule, ref?: RefBody): string {\n const m = this.o.mounts?.[module];\n if (typeof m === \"function\") {\n if (!ref) throw new Error(`contentkit: the ${module} mount is per item; pass a ref`);\n return trim(m(ref));\n }\n if (m !== undefined) return trim(m);\n switch (module) {\n case \"content\":\n return this.base;\n case \"media\":\n return `${this.base}/media`;\n case \"upload\":\n return `${this.base}/media/upload`;\n default:\n return `${this.base}/${module}`;\n }\n }\n\n async request<T>(url: string, { method, body, signal, blob }: RequestOptions = {}): Promise<T> {\n const f = this.o.fetch ?? fetch;\n const headers = new Headers(await this.o.headers?.());\n if (body !== undefined) headers.set(\"Content-Type\", \"application/json\");\n const token = await this.o.token?.();\n if (token && !headers.has(\"Authorization\")) headers.set(\"Authorization\", `Bearer ${token}`);\n const lang = this.o.language?.();\n if (lang) headers.set(\"Accept-Language\", lang);\n let res: Response;\n try {\n res = await f(url, {\n method: method ?? (body === undefined ? \"GET\" : \"POST\"),\n headers,\n body: body === undefined ? null : JSON.stringify(body),\n credentials: this.o.credentials ?? \"same-origin\",\n signal: signal ?? null,\n });\n } catch (err) {\n if (signal?.aborted) throw aborted(signal);\n throw new ContentKitError(\"network\", `ContentKit API ${new URL(url, \"http://x\").pathname} unreachable`, { cause: err });\n }\n if (!res.ok) throw await readContentKitError(res);\n if (blob) return (await res.blob()) as T;\n return (res.status === 204 ? undefined : await res.json()) as T;\n }\n\n /**\n * hls.js `xhrSetup`: opens the request, sends cookies when credentials is\n * \"include\", and adds the bearer only on the API's origin (never a media host).\n */\n readonly xhrSetup = async (xhr: XMLHttpRequest, url: string): Promise<void> => {\n if (!xhr.readyState) xhr.open(\"GET\", url, true);\n if (this.o.credentials === \"include\") xhr.withCredentials = true;\n if (!this.onApiOrigin(url)) return;\n const token = await this.o.token?.();\n if (token) xhr.setRequestHeader(\"Authorization\", `Bearer ${token}`);\n };\n\n setReadScope(key: string): void {\n if (key !== this.readScope.key) this.readScope = { key };\n }\n\n /** Capture before awaiting a write; null tells caches to refetch after a scope change. */\n captureChanges(): (change: ContentKitChange) => void {\n const scope = this.readScope;\n return (change) => this.emit(change, scope === this.readScope ? scope.key : null);\n }\n\n subscribe(listener: (change: ContentKitChange, scope: string | null) => void): () => void {\n this.listeners.add(listener);\n return () => void this.listeners.delete(listener);\n }\n\n private emit(change: ContentKitChange, scope: string | null): void {\n for (const l of this.listeners) {\n try {\n l(change, scope);\n } catch (e) {\n // A host listener's fault must not fail the mutation that succeeded.\n console.error(\"contentkit: change listener failed\", e);\n }\n }\n }\n\n private onApiOrigin(url: string): boolean {\n const here = typeof location === \"undefined\" ? \"http://localhost\" : location.href;\n try {\n return new URL(url, here).origin === new URL(this.base || \"/\", here).origin;\n } catch {\n return false;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"http.js","names":[],"sources":["../../src/client/http.ts"],"sourcesContent":["import { ContentKitError, aborted, readContentKitError } from \"./errors.js\";\nimport type { ContentChange } from \"./content/types.js\";\nimport type { FileInfo, Item, RefBody } from \"./generated/wire.js\";\n\n/** A module's base URL, or one per item (a host that splits uploads by kind). */\nexport type Mount = string | ((ref: RefBody) => string);\n\n/**\n * Where each module lives when the host does not serve them all under\n * baseUrl's fixed sub-paths.\n */\nexport interface ContentKitMounts {\n /** Posts, comments, reactions, favorites, polls, bans, moderation. Default baseUrl. */\n content?: string;\n /** Media reads and HLS playlists. Default `{baseUrl}/media`. */\n media?: Mount;\n /** Uploads and commits. Default `{baseUrl}/media/upload`. */\n upload?: Mount;\n /** Content-code lookup. Default `{baseUrl}/codes`. */\n codes?: string;\n /** Taxonomy. Default `{baseUrl}/taxonomy`. */\n taxonomy?: string;\n /** The public catalog. Default `{baseUrl}/catalog`. */\n catalog?: string;\n /** User inbox. Default `{baseUrl}/notifications`. */\n notifications?: string;\n}\n\nexport type ContentKitModule = keyof ContentKitMounts;\n\n/** A mutation made through the client: the host's cache-invalidation hook gets each one. */\nexport type ContentKitChange =\n /** A commit applied; files are the item's uploads as an editor reads them, without URLs. */\n | { type: \"media.committed\"; ref: RefBody; files: FileInfo[] }\n /** An upload finished processing, as an editor read returns it. */\n | { type: \"media.processed\"; ref: RefBody; file: FileInfo }\n | { type: \"notifications.changed\" }\n | { type: \"notifications.updated\"; item: Item }\n | ContentChange;\n\nexport type TokenSource = () => string | null | undefined | Promise<string | null | undefined>;\n\nexport interface HttpOptions {\n /** Where the host mounts ContentKit, e.g. \"/api/v1/contentkit\". */\n baseUrl: string;\n mounts?: ContentKitMounts;\n /** Transport for API calls; pass an authenticating fetch (auth-ui's authFetch). */\n fetch?: typeof fetch;\n /**\n * Bearer for API calls and for HLS playlists on the API origin (hls.js\n * loads them with XHR, not fetch). An authenticating fetch overrides it.\n */\n token?: TokenSource;\n /** Sent as Accept-Language. */\n language?: () => string | null | undefined;\n /** Extra headers per call (CSRF). */\n headers?: () => HeadersInit | Promise<HeadersInit>;\n /** Default \"same-origin\"; \"include\" also sends cookies with HLS requests. */\n credentials?: RequestCredentials;\n}\n\nexport interface RequestOptions {\n method?: string;\n body?: unknown;\n signal?: AbortSignal;\n /** Read the body as a Blob instead of JSON. */\n blob?: boolean;\n}\n\nconst trim = (u: string) => u.replace(/\\/+$/, \"\");\n\n/** The transport every module shares: mounts, auth, language, errors and change events. */\nexport class Http {\n private readonly listeners = new Set<(change: ContentKitChange, scope: string | null) => void>();\n private readScope = { key: \"{}\" };\n private readonly base: string;\n\n constructor(private readonly o: HttpOptions) {\n if (typeof o.baseUrl !== \"string\") throw new Error(\"contentkit: createContentKitClient needs baseUrl\");\n this.base = trim(o.baseUrl);\n }\n\n /** The module's base URL, without a trailing slash. */\n mount(module: ContentKitModule, ref?: RefBody): string {\n const m = this.o.mounts?.[module];\n if (typeof m === \"function\") {\n if (!ref) throw new Error(`contentkit: the ${module} mount is per item; pass a ref`);\n return trim(m(ref));\n }\n if (m !== undefined) return trim(m);\n switch (module) {\n case \"content\":\n return this.base;\n case \"media\":\n return `${this.base}/media`;\n case \"upload\":\n return `${this.base}/media/upload`;\n default:\n return `${this.base}/${module}`;\n }\n }\n\n async request<T>(url: string, { method, body, signal, blob }: RequestOptions = {}): Promise<T> {\n const f = this.o.fetch ?? fetch;\n const headers = new Headers(await this.o.headers?.());\n if (body !== undefined) headers.set(\"Content-Type\", \"application/json\");\n const token = await this.o.token?.();\n if (token && !headers.has(\"Authorization\")) headers.set(\"Authorization\", `Bearer ${token}`);\n const lang = this.o.language?.();\n if (lang) headers.set(\"Accept-Language\", lang);\n let res: Response;\n try {\n res = await f(url, {\n method: method ?? (body === undefined ? \"GET\" : \"POST\"),\n headers,\n body: body === undefined ? null : JSON.stringify(body),\n credentials: this.o.credentials ?? \"same-origin\",\n signal: signal ?? null,\n });\n } catch (err) {\n if (signal?.aborted) throw aborted(signal);\n throw new ContentKitError(\"network\", `ContentKit API ${new URL(url, \"http://x\").pathname} unreachable`, { cause: err });\n }\n if (!res.ok) throw await readContentKitError(res);\n if (blob) return (await res.blob()) as T;\n return (res.status === 204 ? undefined : await res.json()) as T;\n }\n\n /**\n * hls.js `xhrSetup`: opens the request, sends cookies when credentials is\n * \"include\", and adds the bearer only on the API's origin (never a media host).\n */\n readonly xhrSetup = async (xhr: XMLHttpRequest, url: string): Promise<void> => {\n if (!xhr.readyState) xhr.open(\"GET\", url, true);\n if (this.o.credentials === \"include\") xhr.withCredentials = true;\n if (!this.onApiOrigin(url)) return;\n const token = await this.o.token?.();\n if (token) xhr.setRequestHeader(\"Authorization\", `Bearer ${token}`);\n };\n\n setReadScope(key: string): void {\n if (key !== this.readScope.key) this.readScope = { key };\n }\n\n /** Capture before awaiting a write; null tells caches to refetch after a scope change. */\n captureChanges(): (change: ContentKitChange) => void {\n const scope = this.readScope;\n return (change) => this.emit(change, scope === this.readScope ? scope.key : null);\n }\n\n subscribe(listener: (change: ContentKitChange, scope: string | null) => void): () => void {\n this.listeners.add(listener);\n return () => void this.listeners.delete(listener);\n }\n\n private emit(change: ContentKitChange, scope: string | null): void {\n for (const l of this.listeners) {\n try {\n l(change, scope);\n } catch (e) {\n // A host listener's fault must not fail the mutation that succeeded.\n console.error(\"contentkit: change listener failed\", e);\n }\n }\n }\n\n private onApiOrigin(url: string): boolean {\n const here = typeof location === \"undefined\" ? \"http://localhost\" : location.href;\n try {\n return new URL(url, here).origin === new URL(this.base || \"/\", here).origin;\n } catch {\n return false;\n }\n }\n}\n"],"mappings":"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"}
@@ -11,6 +11,7 @@ export { ModerationClient, type HeldQuery } from './content/moderation.js';
11
11
  export { reactionVerb, type BanScope, type ContentChange, type Decision, type HeldKind, type Reaction, type Sort } from './content/types.js';
12
12
  export { TaxonomyClient, type NodeAssignmentQuery, type NodeQuery } from './taxonomy.js';
13
13
  export { CodesClient } from './codes.js';
14
+ export { CatalogClient, type CatalogTotalsQuery } from './catalog.js';
14
15
  export { NotificationsClient, type NotificationItem } from './notifications.js';
15
16
  export { call, routeURL, type CallOptions, type Method, type PageQuery, type PathParams, type RouteQuery, type RoutePath } from './route.js';
16
17
  export { MediaApi, type ReadOptions } from './media/api.js';
package/dist/client.js CHANGED
@@ -19,16 +19,17 @@ import { READ_CHUNK as ie, chunkOffsets as ae, isProcessing as oe, mergeReads as
19
19
  import { ABR_DEFAULTS as le, NETWORK_FAILURES_BEFORE_ERROR as ue, REFRESH_BEFORE_EXPIRY as de, abrHlsConfig as fe, capRung as pe, classifyHlsError as me, classifyMediaError as he, expiryDelay as ge, hlsConfig as _e, initialEstimate as ve, refreshable as ye, startRung as be, statusKind as xe } from "./client/playback.js";
20
20
  import { formatDuration as Se, galleryItems as Ce, isAudioType as we, isImageType as Te, isSubtitleType as Ee, isVideoType as De, stageAspect as Oe } from "./client/gallery.js";
21
21
  import { PLAYBACK_SPEEDS as ke, PLAYER_TRACKS_KEY as Ae, PLAYER_VOLUME_KEY as je, parseSpriteVtt as Me, playerKeyAction as Ne, resumeAt as Pe } from "./client/player.js";
22
- import { CodesClient as Fe } from "./client/codes.js";
23
- import { BansClient as Ie } from "./client/content/bans.js";
24
- import { reactionVerb as Le } from "./client/content/types.js";
25
- import { CommentsClient as Re } from "./client/content/comments.js";
26
- import { FavoritesClient as ze } from "./client/content/favorites.js";
27
- import { ModerationClient as Be } from "./client/content/moderation.js";
28
- import { PollsClient as Ve } from "./client/content/polls.js";
29
- import { IMAGE_SCHEME as He, PostsClient as Ue, imageRef as We, imageRefs as Ge } from "./client/content/posts.js";
30
- import { ReactionsClient as Ke } from "./client/content/reactions.js";
31
- import { NotificationsClient as qe } from "./client/notifications.js";
32
- import { TaxonomyClient as Je } from "./client/taxonomy.js";
33
- import { createContentKitClient as Ye } from "./client/client.js";
34
- export { le as ABR_DEFAULTS, Ie as BansClient, i as CLIENT_ERROR_CODES, Fe as CodesClient, Re as CommentsClient, a as ContentKitError, e as DEFAULT_DENSITY, o as ERROR_CODES, ze as FavoritesClient, He as IMAGE_SCHEME, te as ItemUploadQueue, S as MAX_PART_SIZE, C as MAX_SINGLE_PUT, w as MIN_PART_SIZE, x as MediaApi, A as MediaClient, Be as ModerationClient, ue as NETWORK_FAILURES_BEFORE_ERROR, qe as NotificationsClient, ke as PLAYBACK_SPEEDS, Ae as PLAYER_TRACKS_KEY, je as PLAYER_VOLUME_KEY, E as Pacer, Ve as PollsClient, Ue as PostsClient, ie as READ_CHUNK, de as REFRESH_BEFORE_EXPIRY, Ke as ReactionsClient, Je as TaxonomyClient, fe as abrHlsConfig, P as acceptOf, h as aspectOf, j as backoff, _ as call, pe as capRung, G as centeredCrop, y as checkRef, ae as chunkOffsets, me as classifyHlsError, he as classifyMediaError, K as constrainCrop, Ye as createContentKitClient, ne as decodeImage, F as defaultImage, D as defaultTransport, t as densityFor, q as editOf, J as editedSize, ee as encodeRemaining, ge as expiryDelay, s as failureError, O as fetchTransport, I as filesFor, d as fill, Se as formatDuration, Y as fromRotated, Ce as galleryItems, _e as hlsConfig, We as imageRef, Ge as imageRefs, ve as initialEstimate, re as isAnimatedImage, we as isAudioType, b as isContentId, c as isContentKitError, Te as isImageType, L as isPattern, oe as isProcessing, Ee as isSubtitleType, De as isVideoType, se as mergeReads, Me as parseSpriteVtt, n as pickRendition, Ne as playerKeyAction, ce as processing, f as publicRenditions, p as publicURL, g as ratio, R as ratioLabel, Le as reactionVerb, l as readContentKitError, ye as refreshable, Pe as resumeAt, X as rotation, v as routeURL, z as ruleDir, B as ruleFor, Z as sameEdit, M as samePath, V as screenFiles, T as sha256Hex, r as sortRenditions, m as srcSet, Oe as stageAspect, be as startRung, xe as statusKind, N as stem, u as toContentKitError, Q as toOriginal, $ as toRotated, H as uniqueName, U as uploadRules, W as withMediaType, k as xhrTransport };
22
+ import { CatalogClient as Fe } from "./client/catalog.js";
23
+ import { CodesClient as Ie } from "./client/codes.js";
24
+ import { BansClient as Le } from "./client/content/bans.js";
25
+ import { reactionVerb as Re } from "./client/content/types.js";
26
+ import { CommentsClient as ze } from "./client/content/comments.js";
27
+ import { FavoritesClient as Be } from "./client/content/favorites.js";
28
+ import { ModerationClient as Ve } from "./client/content/moderation.js";
29
+ import { PollsClient as He } from "./client/content/polls.js";
30
+ import { IMAGE_SCHEME as Ue, PostsClient as We, imageRef as Ge, imageRefs as Ke } from "./client/content/posts.js";
31
+ import { ReactionsClient as qe } from "./client/content/reactions.js";
32
+ import { NotificationsClient as Je } from "./client/notifications.js";
33
+ import { TaxonomyClient as Ye } from "./client/taxonomy.js";
34
+ import { createContentKitClient as Xe } from "./client/client.js";
35
+ export { le as ABR_DEFAULTS, Le as BansClient, i as CLIENT_ERROR_CODES, Fe as CatalogClient, Ie as CodesClient, ze as CommentsClient, a as ContentKitError, e as DEFAULT_DENSITY, o as ERROR_CODES, Be as FavoritesClient, Ue as IMAGE_SCHEME, te as ItemUploadQueue, S as MAX_PART_SIZE, C as MAX_SINGLE_PUT, w as MIN_PART_SIZE, x as MediaApi, A as MediaClient, Ve as ModerationClient, ue as NETWORK_FAILURES_BEFORE_ERROR, Je as NotificationsClient, ke as PLAYBACK_SPEEDS, Ae as PLAYER_TRACKS_KEY, je as PLAYER_VOLUME_KEY, E as Pacer, He as PollsClient, We as PostsClient, ie as READ_CHUNK, de as REFRESH_BEFORE_EXPIRY, qe as ReactionsClient, Ye as TaxonomyClient, fe as abrHlsConfig, P as acceptOf, h as aspectOf, j as backoff, _ as call, pe as capRung, G as centeredCrop, y as checkRef, ae as chunkOffsets, me as classifyHlsError, he as classifyMediaError, K as constrainCrop, Xe as createContentKitClient, ne as decodeImage, F as defaultImage, D as defaultTransport, t as densityFor, q as editOf, J as editedSize, ee as encodeRemaining, ge as expiryDelay, s as failureError, O as fetchTransport, I as filesFor, d as fill, Se as formatDuration, Y as fromRotated, Ce as galleryItems, _e as hlsConfig, Ge as imageRef, Ke as imageRefs, ve as initialEstimate, re as isAnimatedImage, we as isAudioType, b as isContentId, c as isContentKitError, Te as isImageType, L as isPattern, oe as isProcessing, Ee as isSubtitleType, De as isVideoType, se as mergeReads, Me as parseSpriteVtt, n as pickRendition, Ne as playerKeyAction, ce as processing, f as publicRenditions, p as publicURL, g as ratio, R as ratioLabel, Re as reactionVerb, l as readContentKitError, ye as refreshable, Pe as resumeAt, X as rotation, v as routeURL, z as ruleDir, B as ruleFor, Z as sameEdit, M as samePath, V as screenFiles, T as sha256Hex, r as sortRenditions, m as srcSet, Oe as stageAspect, be as startRung, xe as statusKind, N as stem, u as toContentKitError, Q as toOriginal, $ as toRotated, H as uniqueName, U as uploadRules, W as withMediaType, k as xhrTransport };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openrails/contentkit-ui",
3
- "version": "0.78.0",
3
+ "version": "0.80.0",
4
4
  "description": "ContentKit in the browser: client, React hooks and styled components for media, uploads and content URLs.",
5
5
  "type": "module",
6
6
  "license": "MIT",