@openrails/contentkit-ui 0.71.0 → 0.73.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.
- package/README.md +122 -10
- package/dist/client/content/bans.d.ts +2 -0
- package/dist/client/content/bans.js +24 -12
- package/dist/client/content/bans.js.map +1 -1
- package/dist/client/content/comments.d.ts +2 -0
- package/dist/client/content/comments.js.map +1 -1
- package/dist/client/content/polls.d.ts +9 -2
- package/dist/client/content/polls.js.map +1 -1
- package/dist/client/generated/routes.d.ts +28 -2
- package/dist/client/generated/routes.js +40 -0
- package/dist/client/generated/routes.js.map +1 -1
- package/dist/client/generated/wire.d.ts +4 -0
- package/dist/client/generated/wire.js.map +1 -1
- package/dist/client/index.d.ts +3 -3
- package/dist/client/media/queue.d.ts +1 -1
- package/dist/client/media/queue.js +1 -1
- package/dist/client/media/queue.js.map +1 -1
- package/dist/client/taxonomy.d.ts +5 -1
- package/dist/client/taxonomy.js +7 -0
- package/dist/client/taxonomy.js.map +1 -1
- package/dist/client.js +2 -2
- package/dist/components/admin/media-item-panel.d.ts +27 -0
- package/dist/components/admin/media-item-panel.js +397 -0
- package/dist/components/admin/media-item-panel.js.map +1 -0
- package/dist/components/admin/poll-manager.d.ts +28 -0
- package/dist/components/admin/poll-manager.js +297 -0
- package/dist/components/admin/poll-manager.js.map +1 -0
- package/dist/components/admin/post-manager.d.ts +45 -0
- package/dist/components/admin/post-manager.js +602 -0
- package/dist/components/admin/post-manager.js.map +1 -0
- package/dist/components/admin/shell.d.ts +73 -0
- package/dist/components/admin/shell.js +148 -0
- package/dist/components/admin/shell.js.map +1 -0
- package/dist/components/admin/taxonomy-manager.d.ts +54 -0
- package/dist/components/admin/taxonomy-manager.js +976 -0
- package/dist/components/admin/taxonomy-manager.js.map +1 -0
- package/dist/components/admin/upload-queue.d.ts +23 -0
- package/dist/components/admin/upload-queue.js +365 -0
- package/dist/components/admin/upload-queue.js.map +1 -0
- package/dist/components/admin/user-comment-standing.d.ts +25 -0
- package/dist/components/admin/user-comment-standing.js +229 -0
- package/dist/components/admin/user-comment-standing.js.map +1 -0
- package/dist/components/social/bans.d.ts +5 -2
- package/dist/components/social/bans.js +132 -134
- package/dist/components/social/bans.js.map +1 -1
- package/dist/components/social/index.d.ts +1 -1
- package/dist/components/social/moderation.d.ts +11 -13
- package/dist/components/social/moderation.js +299 -218
- package/dist/components/social/moderation.js.map +1 -1
- package/dist/components/social/parts.d.ts +3 -2
- package/dist/components/social/parts.js +74 -48
- package/dist/components/social/parts.js.map +1 -1
- package/dist/components/social/poll-editor.js +1 -0
- package/dist/components/social/poll-editor.js.map +1 -1
- package/dist/editor/index.d.ts +1 -0
- package/dist/editor/rich-text-editor.d.ts +13 -0
- package/dist/editor/rich-text-editor.js +228 -0
- package/dist/editor/rich-text-editor.js.map +1 -0
- package/dist/editor.js +2 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +15 -8
- package/dist/locales/admin/de.d.ts +2 -0
- package/dist/locales/admin/de.js +227 -0
- package/dist/locales/admin/de.js.map +1 -0
- package/dist/locales/admin/en.d.ts +222 -0
- package/dist/locales/admin/en.js +227 -0
- package/dist/locales/admin/en.js.map +1 -0
- package/dist/locales/admin/es.d.ts +2 -0
- package/dist/locales/admin/es.js +227 -0
- package/dist/locales/admin/es.js.map +1 -0
- package/dist/locales/admin/ja.d.ts +2 -0
- package/dist/locales/admin/ja.js +227 -0
- package/dist/locales/admin/ja.js.map +1 -0
- package/dist/locales/admin/ko.d.ts +2 -0
- package/dist/locales/admin/ko.js +227 -0
- package/dist/locales/admin/ko.js.map +1 -0
- package/dist/locales/admin/zh.d.ts +2 -0
- package/dist/locales/admin/zh.js +227 -0
- package/dist/locales/admin/zh.js.map +1 -0
- package/dist/locales/de.js +5 -3
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.d.ts +227 -0
- package/dist/locales/en.js +5 -3
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es.js +5 -3
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/ja.js +5 -3
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.js +5 -3
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/social/de.js +8 -1
- package/dist/locales/social/de.js.map +1 -1
- package/dist/locales/social/en.d.ts +7 -0
- package/dist/locales/social/en.js +8 -1
- package/dist/locales/social/en.js.map +1 -1
- package/dist/locales/social/es.js +8 -1
- package/dist/locales/social/es.js.map +1 -1
- package/dist/locales/social/ja.js +8 -1
- package/dist/locales/social/ja.js.map +1 -1
- package/dist/locales/social/ko.js +8 -1
- package/dist/locales/social/ko.js.map +1 -1
- package/dist/locales/social/zh.js +8 -1
- package/dist/locales/social/zh.js.map +1 -1
- package/dist/locales/zh.js +5 -3
- package/dist/locales/zh.js.map +1 -1
- package/dist/provider.d.ts +2 -0
- package/dist/provider.js +23 -19
- package/dist/provider.js.map +1 -1
- package/dist/react/admin.d.ts +55 -0
- package/dist/react/admin.js +97 -0
- package/dist/react/admin.js.map +1 -0
- package/dist/react/comments.d.ts +18 -2
- package/dist/react/comments.js +24 -8
- package/dist/react/comments.js.map +1 -1
- package/dist/react/context.d.ts +7 -1
- package/dist/react/context.js +6 -1
- package/dist/react/context.js.map +1 -1
- package/dist/react/folder.js.map +1 -1
- package/dist/react/index.d.ts +4 -3
- package/dist/react/polls.js +88 -87
- package/dist/react/polls.js.map +1 -1
- package/dist/react/posts.js +123 -122
- package/dist/react/posts.js.map +1 -1
- package/dist/react/resources.js +3 -0
- package/dist/react/resources.js.map +1 -1
- package/dist/react/upload.d.ts +10 -10
- package/dist/react/upload.js +1 -1
- package/dist/react/upload.js.map +1 -1
- package/dist/react/use-resource.d.ts +16 -0
- package/dist/react/use-resource.js +20 -1
- package/dist/react/use-resource.js.map +1 -1
- package/dist/react.js +21 -20
- package/dist/styles.css +1 -1
- package/package.json +37 -2
|
@@ -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\";\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};\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\", \"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\", \"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: \"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: \"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] 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: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\";\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};\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] 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:taxonomy\": [\"internal_error\"],\n \"module:upload\": [\"internal_error\", \"unavailable\", \"upgrade_required\"],\n \"request\": [\"invalid_request\"],\n};\n"],"mappings":"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"}
|
|
@@ -46,6 +46,10 @@ export interface Assignment {
|
|
|
46
46
|
state?: "active" | "proposed";
|
|
47
47
|
source_revision: number;
|
|
48
48
|
}
|
|
49
|
+
export interface AssignmentPage {
|
|
50
|
+
assignments: Assignment[];
|
|
51
|
+
next_cursor?: string;
|
|
52
|
+
}
|
|
49
53
|
export interface AssignmentsWritten {
|
|
50
54
|
assignments: number;
|
|
51
55
|
}
|
|
@@ -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 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 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 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 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 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 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 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"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -5,16 +5,16 @@ export { IMAGE_SCHEME, imageRef, imageRefs, PostsClient, type PostAdminQuery, ty
|
|
|
5
5
|
export { CommentsClient, type AdminCommentQuery, type CommentQuery } from './content/comments.js';
|
|
6
6
|
export { ReactionsClient } from './content/reactions.js';
|
|
7
7
|
export { FavoritesClient } from './content/favorites.js';
|
|
8
|
-
export { PollsClient, type PollQuery } from './content/polls.js';
|
|
8
|
+
export { PollsClient, type PollAdminQuery, type PollQuery, type PollState } from './content/polls.js';
|
|
9
9
|
export { BansClient } from './content/bans.js';
|
|
10
10
|
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
|
-
export { TaxonomyClient, type NodeQuery } from './taxonomy.js';
|
|
12
|
+
export { TaxonomyClient, type NodeAssignmentQuery, type NodeQuery } from './taxonomy.js';
|
|
13
13
|
export { CodesClient } from './codes.js';
|
|
14
14
|
export { call, routeURL, type CallOptions, type Method, type PageQuery, type PathParams, type RouteQuery, type RoutePath } from './route.js';
|
|
15
15
|
export { MediaApi, type ReadOptions } from './media/api.js';
|
|
16
16
|
export { MediaClient, backoff, samePath, stem, type CommitOptions, type CommitSource, type ContentFolders, type MediaOptions, type NamedOptions, type NamedUpload, type PlannedPart, type Progress, type PutOptions, type UploadOptions, type UploadState, type UploadedFile, type WaitOptions, } from './media/client.js';
|
|
17
|
-
export {
|
|
17
|
+
export { ItemUploadQueue, type ItemStatus, type QueueItem, type QueueOptions, type QueueSnapshot } from './media/queue.js';
|
|
18
18
|
export { acceptOf, defaultImage, filesFor, isPattern, ratioLabel, ruleDir, ruleFor, screenFiles, uniqueName, uploadRules, withMediaType, type Screened, } from './media/rules.js';
|
|
19
19
|
export { READ_CHUNK, chunkOffsets, isProcessing, mergeReads, processing } from './media/windows.js';
|
|
20
20
|
export { defaultTransport, fetchTransport, xhrTransport, type Transport } from './media/transport.js';
|
|
@@ -49,7 +49,7 @@ export interface QueueOptions {
|
|
|
49
49
|
* order the user arranges, and commits the uploads as puts appended in that
|
|
50
50
|
* order. Framework-free; the React hooks wrap it.
|
|
51
51
|
*/
|
|
52
|
-
export declare class
|
|
52
|
+
export declare class ItemUploadQueue {
|
|
53
53
|
private readonly client;
|
|
54
54
|
private readonly o;
|
|
55
55
|
private items;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","names":[],"sources":["../../../src/client/media/queue.ts"],"sourcesContent":["import { ContentKitError, toContentKitError } from \"../errors.js\";\nimport type { FileInfo, Op, RefBody } from \"../generated/wire.js\";\nimport { fill } from \"../public.js\";\nimport { samePath, stem, type MediaClient, type Progress, type UploadedFile, type UploadState } from \"./client.js\";\n\nexport type ItemStatus = \"queued\" | \"uploading\" | \"uploaded\" | \"failed\" | \"committed\";\n\nexport interface QueueItem {\n readonly id: string;\n readonly file: File;\n /** The upload path the commit puts; the server's canonical one once uploaded. */\n path: string;\n meta?: Record<string, unknown>;\n status: ItemStatus;\n progress?: Progress;\n error?: ContentKitError;\n result?: UploadedFile;\n /** Resumable multipart state while uploading or after a failure. */\n state?: UploadState;\n /**\n * Committed unattached for processing on upload (the host's\n * ProcessOnUpload): commit() attaches it, remove() discards it.\n */\n unattached?: boolean;\n /** The server's view of an unattached upload while it processes (editor read): dims, pending, failed, progress. */\n processing?: FileInfo;\n /** Processing finished (placed and outputs written, or failed). */\n processed?: boolean;\n}\n\nexport interface QueueSnapshot {\n readonly items: readonly QueueItem[];\n /** A rate, quota or permission refusal: no new uploads start until start(). */\n readonly blocked?: ContentKitError;\n /** Every item is uploaded (or committed) and none is in flight. */\n readonly ready: boolean;\n}\n\nexport interface QueueOptions {\n ref: RefBody;\n /** Each file's upload path: a template whose {name} is the file's name, e.g. \"originals/{name}\". */\n path: string;\n /** Files uploading at once. Default 2. */\n concurrency?: number;\n /** Start uploads as files are added. Default true. */\n autoStart?: boolean;\n /** Called with every item state change, to persist resumable state. */\n onState?: (item: QueueItem, state: UploadState | null) => void;\n /** Milliseconds between processing polls of unattached uploads. Default 2000. */\n pollInterval?: number;\n}\n\n/** An op index past the end of the list: the upload is appended. */\nconst END = 2 ** 31 - 1;\n\n/**\n * An ordered file queue for one item: uploads in the background, keeps the\n * order the user arranges, and commits the uploads as puts appended in that\n * order. Framework-free; the React hooks wrap it.\n */\nexport class UploadQueue {\n private items: QueueItem[] = [];\n private blocked?: ContentKitError;\n private running = new Map<string, AbortController>();\n private listeners = new Set<() => void>();\n private snap!: QueueSnapshot;\n private started: boolean;\n /** In-flight unattached commits, by item id. */\n private staging = new Map<string, Promise<FileInfo | undefined>>();\n private poll?: ReturnType<typeof setTimeout>;\n private disposed = false;\n private batch?: { input: string; operationID: string };\n\n constructor(\n private readonly client: MediaClient,\n private readonly o: QueueOptions,\n ) {\n this.started = o.autoStart ?? true;\n this.publish();\n }\n\n subscribe = (fn: () => void): (() => void) => {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n };\n\n getSnapshot = (): QueueSnapshot => this.snap;\n\n /** Queues files; state restores a multipart upload saved through onState before a reload. */\n add(\n files: Iterable<File>,\n opts: { path?: (f: File) => string; state?: (f: File) => UploadState | undefined } = {},\n ): QueueItem[] {\n const added = [...files].map(\n (file): QueueItem => ({\n id: crypto.randomUUID(),\n file,\n path: opts.path?.(file) ?? fill(this.o.path, { name: file.name }),\n status: \"queued\",\n state: opts.state?.(file),\n }),\n );\n this.items.push(...added);\n this.changed();\n return added;\n }\n\n /** Moves an item to index (before commit). */\n move(id: string, index: number): void {\n const from = this.items.findIndex((i) => i.id === id);\n if (from < 0) return;\n const [item] = this.items.splice(from, 1);\n this.items.splice(Math.max(0, Math.min(index, this.items.length)), 0, item!);\n this.changed();\n }\n\n update(id: string, patch: Pick<Partial<QueueItem>, \"path\" | \"meta\">): void {\n const item = this.find(id);\n if (item?.unattached && patch.path && patch.path !== item.path) {\n void this.client.commit(this.o.ref, [{ op: \"rename\", path: item.path, to: patch.path }]).then(\n (files) => {\n const f = files.find((x) => samePath(x.path, stem(patch.path!)));\n if (f) this.patch(id, { path: f.path });\n },\n () => {},\n );\n }\n this.patch(id, patch);\n }\n\n /**\n * Removes an item, discarding its multipart upload if one is open, or its\n * unattached upload (the commit removes it and its outputs).\n */\n remove(id: string): void {\n const item = this.find(id);\n if (!item) return;\n this.running.get(id)?.abort();\n if (item.state) void this.client.discard(item.state).catch(() => {});\n const staged = this.staging.get(id);\n if (item.unattached || staged) {\n void (staged ?? Promise.resolve())\n .then((file) => {\n if (file || item.unattached) {\n return this.client.commit(this.o.ref, [{ op: \"remove\", path: file?.path ?? item.path }]);\n }\n })\n .catch(() => {});\n }\n this.o.onState?.(item, null);\n this.items = this.items.filter((i) => i.id !== id);\n this.changed();\n }\n\n /** Re-queues a failed item; a multipart upload resumes from its state. */\n retry(id: string): void {\n this.patch(id, { status: \"queued\", error: undefined });\n }\n\n /** Starts uploading (autoStart false) or lifts a block after a refusal. */\n start(): void {\n this.started = true;\n this.blocked = undefined;\n this.changed();\n }\n\n /** Stops starting uploads and pauses running ones (they stay resumable). */\n pause(): void {\n this.started = false;\n for (const c of this.running.values()) c.abort();\n this.changed();\n }\n\n /**\n * Commits every uploaded item, in queue order, after the item's uploads:\n * unattached ones are attached (no reprocessing), the rest put. With head,\n * only the uploaded items before the first one still uploading or failed\n * (a draft committing files as they finish). Returns the item's attached\n * uploads in order.\n */\n async commit(signal?: AbortSignal, o: { head?: boolean } = {}): Promise<FileInfo[]> {\n await Promise.all(this.staging.values());\n let items = this.items;\n if (o.head) {\n // Only the uploaded head of the queue, so files land in the order added.\n const end = items.findIndex((i) => i.status !== \"uploaded\" && i.status !== \"committed\");\n if (end >= 0) items = items.slice(0, end);\n }\n const ready = items.filter((i) => i.status === \"uploaded\");\n if (ready.length === 0) return [];\n const ops = ready.flatMap((i): Op[] => {\n const attach: Op = { op: \"attach\", path: i.path, index: END, ...(i.meta ? { meta: i.meta } : {}) };\n if (i.unattached) return [attach];\n const put: Op = { op: \"put\", path: i.path, blob: i.result!.blob, create_id: i.id, index: END, ...(i.meta ? { meta: i.meta } : {}) };\n // A lost staging response may hide a successful unattached create.\n return i.result!.processOnUpload ? [put, attach] : [put];\n });\n const sources = Object.fromEntries(ready.map((i) => [i.result!.blob, { file: i.file, type: i.result!.type }]));\n const input = JSON.stringify(ops);\n if (this.batch?.input !== input) this.batch = { input, operationID: crypto.randomUUID() };\n const batch = this.batch;\n const files = await this.client.commit(this.o.ref, ops, {\n signal,\n sources,\n operationID: batch.operationID,\n onState: (body) => {\n batch.input = JSON.stringify(body.ops);\n batch.operationID = body.operation_id;\n let changed = false;\n for (const op of body.ops) {\n if (op.op !== \"put\" || !op.blob) continue;\n const original = ready.find((i) => i.id === op.create_id);\n if (!original?.result) continue;\n const current = this.find(original.id);\n if (current?.result && current.result.blob === original.result.blob && current.result.blob !== op.blob) {\n changed = this.set(current.id, { result: { ...current.result, blob: op.blob } }) || changed;\n }\n }\n if (changed) this.changed();\n },\n });\n for (const i of ready) this.set(i.id, { status: \"committed\", unattached: false });\n this.changed();\n return files.filter((f) => !f.unattached);\n }\n\n /** Aborts running uploads and stops polling; call on unmount. */\n dispose(): void {\n this.started = false;\n this.disposed = true;\n for (const c of this.running.values()) c.abort();\n clearTimeout(this.poll);\n this.listeners.clear();\n }\n\n /** Commits an uploaded file unattached, so the host processes it now. */\n private stage(id: string): void {\n const item = this.find(id);\n if (!item?.result) return;\n const { blob, type } = item.result;\n const op: Op = { op: \"put\", path: item.path, blob, create_id: item.id, unattached: true, ...(item.meta ? { meta: item.meta } : {}) };\n const p = this.client\n .commit(this.o.ref, [op], { sources: { [blob]: { file: item.file, type } } })\n .then(\n (files) => {\n const f = files.find((x) => x.unattached && samePath(x.path, stem(item.path)));\n if (f && this.find(id)) this.patch(id, { unattached: true, path: f.path });\n this.schedulePoll();\n return f;\n },\n (error: unknown) => {\n if (error instanceof ContentKitError && error.code === \"conflict\") {\n this.patch(id, { status: \"failed\", error });\n }\n // Other failures leave it uploaded; commit() retries the same create.\n return undefined;\n },\n )\n .finally(() => this.staging.delete(id));\n this.staging.set(id, p);\n }\n\n private schedulePoll(): void {\n if (this.poll || this.disposed) return;\n this.poll = setTimeout(() => {\n this.poll = undefined;\n void this.refresh().finally(() => {\n if (this.items.some((i) => i.unattached && !i.processed)) this.schedulePoll();\n });\n }, this.o.pollInterval ?? 2000);\n }\n\n /** Reads the processing state of unattached uploads still processing. */\n private async refresh(): Promise<void> {\n const pending = this.items.filter((i) => i.unattached && !i.processed);\n if (pending.length === 0) return;\n let files: FileInfo[];\n try {\n files = (await this.client.read(this.o.ref, { editor: true })).files;\n } catch {\n return;\n }\n const byPath = new Map(files.filter((f) => f.upload).map((f) => [f.path, f]));\n let changed = false;\n for (const i of pending) {\n const f = byPath.get(i.path);\n if (!f) continue;\n changed = this.set(i.id, { processing: f, processed: !!f.failed || (!f.pending?.length && !f.staged) }) || changed;\n }\n if (changed) this.changed();\n }\n\n private find(id: string): QueueItem | undefined {\n return this.items.find((i) => i.id === id);\n }\n\n private patch(id: string, patch: Partial<QueueItem>): void {\n if (this.set(id, patch)) this.changed();\n }\n\n private set(id: string, patch: Partial<QueueItem>): boolean {\n const i = this.items.findIndex((x) => x.id === id);\n if (i >= 0) this.items[i] = { ...this.items[i]!, ...patch };\n return i >= 0;\n }\n\n private changed(): void {\n this.pump();\n this.publish();\n for (const fn of this.listeners) fn();\n }\n\n private publish(): void {\n this.snap = {\n items: [...this.items],\n blocked: this.blocked,\n ready:\n this.running.size === 0 &&\n this.items.length > 0 &&\n this.items.every((i) => i.status === \"uploaded\" || i.status === \"committed\"),\n };\n }\n\n private pump(): void {\n if (!this.started || this.blocked) return;\n const limit = this.o.concurrency ?? 2;\n for (const item of this.items) {\n if (this.running.size >= limit) return;\n if (item.status === \"queued\" && !this.running.has(item.id)) this.run(item.id);\n }\n }\n\n private run(id: string): void {\n const item = this.find(id)!;\n const ctl = new AbortController();\n this.running.set(id, ctl);\n this.set(id, { status: \"uploading\", progress: undefined, error: undefined });\n this.client\n .upload(item.file, {\n ref: this.o.ref,\n path: item.path,\n signal: ctl.signal,\n resume: item.state,\n onProgress: (progress) => this.patch(id, { progress }),\n onState: (state) => {\n this.patch(id, { state: state ?? undefined });\n const cur = this.find(id);\n if (cur) this.o.onState?.(cur, state);\n },\n })\n .then(\n (result) => {\n this.running.delete(id);\n this.patch(id, { status: \"uploaded\", result, path: result.path, state: undefined });\n if (result.processOnUpload) this.stage(id);\n },\n (e: unknown) => {\n this.running.delete(id);\n const error = toContentKitError(e);\n if (error.code === \"aborted\") {\n this.patch(id, { status: \"queued\" });\n return;\n }\n if (error.blocksQueue) {\n // Refused for every file: keep it queued behind the block.\n this.blocked = error;\n this.patch(id, { status: \"queued\", error });\n return;\n }\n this.patch(id, { status: \"failed\", error });\n },\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"queue.js","names":[],"sources":["../../../src/client/media/queue.ts"],"sourcesContent":["import { ContentKitError, toContentKitError } from \"../errors.js\";\nimport type { FileInfo, Op, RefBody } from \"../generated/wire.js\";\nimport { fill } from \"../public.js\";\nimport { samePath, stem, type MediaClient, type Progress, type UploadedFile, type UploadState } from \"./client.js\";\n\nexport type ItemStatus = \"queued\" | \"uploading\" | \"uploaded\" | \"failed\" | \"committed\";\n\nexport interface QueueItem {\n readonly id: string;\n readonly file: File;\n /** The upload path the commit puts; the server's canonical one once uploaded. */\n path: string;\n meta?: Record<string, unknown>;\n status: ItemStatus;\n progress?: Progress;\n error?: ContentKitError;\n result?: UploadedFile;\n /** Resumable multipart state while uploading or after a failure. */\n state?: UploadState;\n /**\n * Committed unattached for processing on upload (the host's\n * ProcessOnUpload): commit() attaches it, remove() discards it.\n */\n unattached?: boolean;\n /** The server's view of an unattached upload while it processes (editor read): dims, pending, failed, progress. */\n processing?: FileInfo;\n /** Processing finished (placed and outputs written, or failed). */\n processed?: boolean;\n}\n\nexport interface QueueSnapshot {\n readonly items: readonly QueueItem[];\n /** A rate, quota or permission refusal: no new uploads start until start(). */\n readonly blocked?: ContentKitError;\n /** Every item is uploaded (or committed) and none is in flight. */\n readonly ready: boolean;\n}\n\nexport interface QueueOptions {\n ref: RefBody;\n /** Each file's upload path: a template whose {name} is the file's name, e.g. \"originals/{name}\". */\n path: string;\n /** Files uploading at once. Default 2. */\n concurrency?: number;\n /** Start uploads as files are added. Default true. */\n autoStart?: boolean;\n /** Called with every item state change, to persist resumable state. */\n onState?: (item: QueueItem, state: UploadState | null) => void;\n /** Milliseconds between processing polls of unattached uploads. Default 2000. */\n pollInterval?: number;\n}\n\n/** An op index past the end of the list: the upload is appended. */\nconst END = 2 ** 31 - 1;\n\n/**\n * An ordered file queue for one item: uploads in the background, keeps the\n * order the user arranges, and commits the uploads as puts appended in that\n * order. Framework-free; the React hooks wrap it.\n */\nexport class ItemUploadQueue {\n private items: QueueItem[] = [];\n private blocked?: ContentKitError;\n private running = new Map<string, AbortController>();\n private listeners = new Set<() => void>();\n private snap!: QueueSnapshot;\n private started: boolean;\n /** In-flight unattached commits, by item id. */\n private staging = new Map<string, Promise<FileInfo | undefined>>();\n private poll?: ReturnType<typeof setTimeout>;\n private disposed = false;\n private batch?: { input: string; operationID: string };\n\n constructor(\n private readonly client: MediaClient,\n private readonly o: QueueOptions,\n ) {\n this.started = o.autoStart ?? true;\n this.publish();\n }\n\n subscribe = (fn: () => void): (() => void) => {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n };\n\n getSnapshot = (): QueueSnapshot => this.snap;\n\n /** Queues files; state restores a multipart upload saved through onState before a reload. */\n add(\n files: Iterable<File>,\n opts: { path?: (f: File) => string; state?: (f: File) => UploadState | undefined } = {},\n ): QueueItem[] {\n const added = [...files].map(\n (file): QueueItem => ({\n id: crypto.randomUUID(),\n file,\n path: opts.path?.(file) ?? fill(this.o.path, { name: file.name }),\n status: \"queued\",\n state: opts.state?.(file),\n }),\n );\n this.items.push(...added);\n this.changed();\n return added;\n }\n\n /** Moves an item to index (before commit). */\n move(id: string, index: number): void {\n const from = this.items.findIndex((i) => i.id === id);\n if (from < 0) return;\n const [item] = this.items.splice(from, 1);\n this.items.splice(Math.max(0, Math.min(index, this.items.length)), 0, item!);\n this.changed();\n }\n\n update(id: string, patch: Pick<Partial<QueueItem>, \"path\" | \"meta\">): void {\n const item = this.find(id);\n if (item?.unattached && patch.path && patch.path !== item.path) {\n void this.client.commit(this.o.ref, [{ op: \"rename\", path: item.path, to: patch.path }]).then(\n (files) => {\n const f = files.find((x) => samePath(x.path, stem(patch.path!)));\n if (f) this.patch(id, { path: f.path });\n },\n () => {},\n );\n }\n this.patch(id, patch);\n }\n\n /**\n * Removes an item, discarding its multipart upload if one is open, or its\n * unattached upload (the commit removes it and its outputs).\n */\n remove(id: string): void {\n const item = this.find(id);\n if (!item) return;\n this.running.get(id)?.abort();\n if (item.state) void this.client.discard(item.state).catch(() => {});\n const staged = this.staging.get(id);\n if (item.unattached || staged) {\n void (staged ?? Promise.resolve())\n .then((file) => {\n if (file || item.unattached) {\n return this.client.commit(this.o.ref, [{ op: \"remove\", path: file?.path ?? item.path }]);\n }\n })\n .catch(() => {});\n }\n this.o.onState?.(item, null);\n this.items = this.items.filter((i) => i.id !== id);\n this.changed();\n }\n\n /** Re-queues a failed item; a multipart upload resumes from its state. */\n retry(id: string): void {\n this.patch(id, { status: \"queued\", error: undefined });\n }\n\n /** Starts uploading (autoStart false) or lifts a block after a refusal. */\n start(): void {\n this.started = true;\n this.blocked = undefined;\n this.changed();\n }\n\n /** Stops starting uploads and pauses running ones (they stay resumable). */\n pause(): void {\n this.started = false;\n for (const c of this.running.values()) c.abort();\n this.changed();\n }\n\n /**\n * Commits every uploaded item, in queue order, after the item's uploads:\n * unattached ones are attached (no reprocessing), the rest put. With head,\n * only the uploaded items before the first one still uploading or failed\n * (a draft committing files as they finish). Returns the item's attached\n * uploads in order.\n */\n async commit(signal?: AbortSignal, o: { head?: boolean } = {}): Promise<FileInfo[]> {\n await Promise.all(this.staging.values());\n let items = this.items;\n if (o.head) {\n // Only the uploaded head of the queue, so files land in the order added.\n const end = items.findIndex((i) => i.status !== \"uploaded\" && i.status !== \"committed\");\n if (end >= 0) items = items.slice(0, end);\n }\n const ready = items.filter((i) => i.status === \"uploaded\");\n if (ready.length === 0) return [];\n const ops = ready.flatMap((i): Op[] => {\n const attach: Op = { op: \"attach\", path: i.path, index: END, ...(i.meta ? { meta: i.meta } : {}) };\n if (i.unattached) return [attach];\n const put: Op = { op: \"put\", path: i.path, blob: i.result!.blob, create_id: i.id, index: END, ...(i.meta ? { meta: i.meta } : {}) };\n // A lost staging response may hide a successful unattached create.\n return i.result!.processOnUpload ? [put, attach] : [put];\n });\n const sources = Object.fromEntries(ready.map((i) => [i.result!.blob, { file: i.file, type: i.result!.type }]));\n const input = JSON.stringify(ops);\n if (this.batch?.input !== input) this.batch = { input, operationID: crypto.randomUUID() };\n const batch = this.batch;\n const files = await this.client.commit(this.o.ref, ops, {\n signal,\n sources,\n operationID: batch.operationID,\n onState: (body) => {\n batch.input = JSON.stringify(body.ops);\n batch.operationID = body.operation_id;\n let changed = false;\n for (const op of body.ops) {\n if (op.op !== \"put\" || !op.blob) continue;\n const original = ready.find((i) => i.id === op.create_id);\n if (!original?.result) continue;\n const current = this.find(original.id);\n if (current?.result && current.result.blob === original.result.blob && current.result.blob !== op.blob) {\n changed = this.set(current.id, { result: { ...current.result, blob: op.blob } }) || changed;\n }\n }\n if (changed) this.changed();\n },\n });\n for (const i of ready) this.set(i.id, { status: \"committed\", unattached: false });\n this.changed();\n return files.filter((f) => !f.unattached);\n }\n\n /** Aborts running uploads and stops polling; call on unmount. */\n dispose(): void {\n this.started = false;\n this.disposed = true;\n for (const c of this.running.values()) c.abort();\n clearTimeout(this.poll);\n this.listeners.clear();\n }\n\n /** Commits an uploaded file unattached, so the host processes it now. */\n private stage(id: string): void {\n const item = this.find(id);\n if (!item?.result) return;\n const { blob, type } = item.result;\n const op: Op = { op: \"put\", path: item.path, blob, create_id: item.id, unattached: true, ...(item.meta ? { meta: item.meta } : {}) };\n const p = this.client\n .commit(this.o.ref, [op], { sources: { [blob]: { file: item.file, type } } })\n .then(\n (files) => {\n const f = files.find((x) => x.unattached && samePath(x.path, stem(item.path)));\n if (f && this.find(id)) this.patch(id, { unattached: true, path: f.path });\n this.schedulePoll();\n return f;\n },\n (error: unknown) => {\n if (error instanceof ContentKitError && error.code === \"conflict\") {\n this.patch(id, { status: \"failed\", error });\n }\n // Other failures leave it uploaded; commit() retries the same create.\n return undefined;\n },\n )\n .finally(() => this.staging.delete(id));\n this.staging.set(id, p);\n }\n\n private schedulePoll(): void {\n if (this.poll || this.disposed) return;\n this.poll = setTimeout(() => {\n this.poll = undefined;\n void this.refresh().finally(() => {\n if (this.items.some((i) => i.unattached && !i.processed)) this.schedulePoll();\n });\n }, this.o.pollInterval ?? 2000);\n }\n\n /** Reads the processing state of unattached uploads still processing. */\n private async refresh(): Promise<void> {\n const pending = this.items.filter((i) => i.unattached && !i.processed);\n if (pending.length === 0) return;\n let files: FileInfo[];\n try {\n files = (await this.client.read(this.o.ref, { editor: true })).files;\n } catch {\n return;\n }\n const byPath = new Map(files.filter((f) => f.upload).map((f) => [f.path, f]));\n let changed = false;\n for (const i of pending) {\n const f = byPath.get(i.path);\n if (!f) continue;\n changed = this.set(i.id, { processing: f, processed: !!f.failed || (!f.pending?.length && !f.staged) }) || changed;\n }\n if (changed) this.changed();\n }\n\n private find(id: string): QueueItem | undefined {\n return this.items.find((i) => i.id === id);\n }\n\n private patch(id: string, patch: Partial<QueueItem>): void {\n if (this.set(id, patch)) this.changed();\n }\n\n private set(id: string, patch: Partial<QueueItem>): boolean {\n const i = this.items.findIndex((x) => x.id === id);\n if (i >= 0) this.items[i] = { ...this.items[i]!, ...patch };\n return i >= 0;\n }\n\n private changed(): void {\n this.pump();\n this.publish();\n for (const fn of this.listeners) fn();\n }\n\n private publish(): void {\n this.snap = {\n items: [...this.items],\n blocked: this.blocked,\n ready:\n this.running.size === 0 &&\n this.items.length > 0 &&\n this.items.every((i) => i.status === \"uploaded\" || i.status === \"committed\"),\n };\n }\n\n private pump(): void {\n if (!this.started || this.blocked) return;\n const limit = this.o.concurrency ?? 2;\n for (const item of this.items) {\n if (this.running.size >= limit) return;\n if (item.status === \"queued\" && !this.running.has(item.id)) this.run(item.id);\n }\n }\n\n private run(id: string): void {\n const item = this.find(id)!;\n const ctl = new AbortController();\n this.running.set(id, ctl);\n this.set(id, { status: \"uploading\", progress: undefined, error: undefined });\n this.client\n .upload(item.file, {\n ref: this.o.ref,\n path: item.path,\n signal: ctl.signal,\n resume: item.state,\n onProgress: (progress) => this.patch(id, { progress }),\n onState: (state) => {\n this.patch(id, { state: state ?? undefined });\n const cur = this.find(id);\n if (cur) this.o.onState?.(cur, state);\n },\n })\n .then(\n (result) => {\n this.running.delete(id);\n this.patch(id, { status: \"uploaded\", result, path: result.path, state: undefined });\n if (result.processOnUpload) this.stage(id);\n },\n (e: unknown) => {\n this.running.delete(id);\n const error = toContentKitError(e);\n if (error.code === \"aborted\") {\n this.patch(id, { status: \"queued\" });\n return;\n }\n if (error.blocksQueue) {\n // Refused for every file: keep it queued behind the block.\n this.blocked = error;\n this.patch(id, { status: \"queued\", error });\n return;\n }\n this.patch(id, { status: \"failed\", error });\n },\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import { Assignment, AssignmentsWritten, ContentRef, Count, CountsRebuilt, Edge, EdgesWritten, EffectiveTagsOf, MergeReport, Name, Node, NodeDetail, NodeInput, NodePage, NodeUpdate } from './generated/wire.js';
|
|
1
|
+
import { Assignment, AssignmentPage, AssignmentsWritten, ContentRef, Count, CountsRebuilt, Edge, EdgesWritten, EffectiveTagsOf, MergeReport, Name, Node, NodeDetail, NodeInput, NodePage, NodeUpdate } from './generated/wire.js';
|
|
2
2
|
import { Http } from './http.js';
|
|
3
3
|
import { RouteQuery } from './route.js';
|
|
4
4
|
/** GET /taxonomy/nodes filters, as the route names them. */
|
|
5
5
|
export type NodeQuery = RouteQuery<"GET", "/nodes">;
|
|
6
|
+
/** GET /taxonomy/nodes/{id}/assignments filters. */
|
|
7
|
+
export type NodeAssignmentQuery = RouteQuery<"GET", "/nodes/{id}/assignments">;
|
|
6
8
|
/** The taxonomy admin API (root:taxonomy:write). */
|
|
7
9
|
export declare class TaxonomyClient {
|
|
8
10
|
private readonly http;
|
|
9
11
|
constructor(http: Http);
|
|
10
12
|
nodes(q?: NodeQuery, signal?: AbortSignal): Promise<NodePage>;
|
|
11
13
|
node(id: string, signal?: AbortSignal): Promise<NodeDetail>;
|
|
14
|
+
/** The contents assigned to a node, a cursor page at a time. */
|
|
15
|
+
nodeAssignments(id: string, q?: NodeAssignmentQuery, signal?: AbortSignal): Promise<AssignmentPage>;
|
|
12
16
|
createNodes(nodes: NodeInput[]): Promise<Node[]>;
|
|
13
17
|
updateNode(id: string, patch: NodeUpdate): Promise<Node>;
|
|
14
18
|
/** Marks the node deleted. */
|
package/dist/client/taxonomy.js
CHANGED
|
@@ -17,6 +17,13 @@ var t = class {
|
|
|
17
17
|
signal: n
|
|
18
18
|
});
|
|
19
19
|
}
|
|
20
|
+
nodeAssignments(t, n = {}, r) {
|
|
21
|
+
return e(this.http, "GET", "/nodes/{id}/assignments", {
|
|
22
|
+
params: { id: t },
|
|
23
|
+
query: n,
|
|
24
|
+
signal: r
|
|
25
|
+
});
|
|
26
|
+
}
|
|
20
27
|
createNodes(t) {
|
|
21
28
|
return this.write(e(this.http, "POST", "/nodes", { body: t }));
|
|
22
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"taxonomy.js","names":[],"sources":["../../src/client/taxonomy.ts"],"sourcesContent":["import type {\n Assignment,\n AssignmentsWritten,\n ContentRef,\n Count,\n CountsRebuilt,\n Edge,\n EdgesWritten,\n EffectiveTagsOf,\n MergeReport,\n Name,\n Node,\n NodeDetail,\n NodeInput,\n NodePage,\n NodeUpdate,\n} from \"./generated/wire.js\";\nimport type { Http } from \"./http.js\";\nimport { call, type RouteQuery } from \"./route.js\";\n\n/** GET /taxonomy/nodes filters, as the route names them. */\nexport type NodeQuery = RouteQuery<\"GET\", \"/nodes\">;\n\n/** The taxonomy admin API (root:taxonomy:write). */\nexport class TaxonomyClient {\n constructor(private readonly http: Http) {}\n\n nodes(q: NodeQuery = {}, signal?: AbortSignal): Promise<NodePage> {\n return call(this.http, \"GET\", \"/nodes\", { query: q, signal });\n }\n node(id: string, signal?: AbortSignal): Promise<NodeDetail> {\n return call(this.http, \"GET\", \"/nodes/{id}\", { params: { id }, signal });\n }\n createNodes(nodes: NodeInput[]): Promise<Node[]> {\n return this.write(call(this.http, \"POST\", \"/nodes\", { body: nodes }));\n }\n updateNode(id: string, patch: NodeUpdate): Promise<Node> {\n return this.write(call(this.http, \"PATCH\", \"/nodes/{id}\", { params: { id }, body: patch }));\n }\n /** Marks the node deleted. */\n deleteNode(id: string): Promise<Node> {\n return this.write(call(this.http, \"DELETE\", \"/nodes/{id}\", { params: { id } }));\n }\n /** Replaces, adds or removes names. */\n names(id: string, op: \"set\" | \"add\" | \"remove\", names: Name[]): Promise<NodeDetail> {\n const method = op === \"set\" ? \"PUT\" : op === \"add\" ? \"POST\" : \"DELETE\";\n return this.write(call(this.http, method, \"/nodes/{id}/names\", { params: { id }, body: names }));\n }\n merge(id: string, into: string): Promise<MergeReport> {\n return this.write(call(this.http, \"POST\", \"/nodes/{id}/merge\", { params: { id }, body: { into_taxonomy_id: into } }));\n }\n edges(op: \"add\" | \"remove\", edges: Edge[]): Promise<EdgesWritten> {\n return this.write(call(this.http, op === \"add\" ? \"POST\" : \"DELETE\", \"/edges\", { body: edges }));\n }\n /** Assigns or unassigns nodes; suppressCounts skips count upkeep (rebuildCounts afterwards). */\n assignments(op: \"add\" | \"remove\", assignments: Assignment[], o: { suppressCounts?: boolean } = {}): Promise<AssignmentsWritten> {\n return this.write(call(this.http, op === \"add\" ? \"POST\" : \"DELETE\", \"/assignments\", { body: assignments, query: { suppress_counts: o.suppressCounts } }));\n }\n /** The effective tags (work and version) of each content. */\n effective(refs: ContentRef[], signal?: AbortSignal): Promise<EffectiveTagsOf[]> {\n return call(this.http, \"POST\", \"/effective\", { body: refs, signal });\n }\n /** Content counts of nodes, by taxonomy id. */\n counts(ids: readonly string[], signal?: AbortSignal): Promise<Record<string, Count[]>> {\n return call(this.http, \"GET\", \"/counts\", { query: { taxonomy_id: ids }, signal });\n }\n rebuildCounts(): Promise<CountsRebuilt> {\n return this.write(call(this.http, \"POST\", \"/counts/rebuild\"));\n }\n\n private async write<T>(p: Promise<T>): Promise<T> {\n const emit = this.http.captureChanges();\n const out = await p;\n emit({ type: \"taxonomy.changed\" });\n return out;\n }\n}\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"taxonomy.js","names":[],"sources":["../../src/client/taxonomy.ts"],"sourcesContent":["import type {\n Assignment,\n AssignmentPage,\n AssignmentsWritten,\n ContentRef,\n Count,\n CountsRebuilt,\n Edge,\n EdgesWritten,\n EffectiveTagsOf,\n MergeReport,\n Name,\n Node,\n NodeDetail,\n NodeInput,\n NodePage,\n NodeUpdate,\n} from \"./generated/wire.js\";\nimport type { Http } from \"./http.js\";\nimport { call, type RouteQuery } from \"./route.js\";\n\n/** GET /taxonomy/nodes filters, as the route names them. */\nexport type NodeQuery = RouteQuery<\"GET\", \"/nodes\">;\n/** GET /taxonomy/nodes/{id}/assignments filters. */\nexport type NodeAssignmentQuery = RouteQuery<\"GET\", \"/nodes/{id}/assignments\">;\n\n/** The taxonomy admin API (root:taxonomy:write). */\nexport class TaxonomyClient {\n constructor(private readonly http: Http) {}\n\n nodes(q: NodeQuery = {}, signal?: AbortSignal): Promise<NodePage> {\n return call(this.http, \"GET\", \"/nodes\", { query: q, signal });\n }\n node(id: string, signal?: AbortSignal): Promise<NodeDetail> {\n return call(this.http, \"GET\", \"/nodes/{id}\", { params: { id }, signal });\n }\n /** The contents assigned to a node, a cursor page at a time. */\n nodeAssignments(id: string, q: NodeAssignmentQuery = {}, signal?: AbortSignal): Promise<AssignmentPage> {\n return call(this.http, \"GET\", \"/nodes/{id}/assignments\", { params: { id }, query: q, signal });\n }\n createNodes(nodes: NodeInput[]): Promise<Node[]> {\n return this.write(call(this.http, \"POST\", \"/nodes\", { body: nodes }));\n }\n updateNode(id: string, patch: NodeUpdate): Promise<Node> {\n return this.write(call(this.http, \"PATCH\", \"/nodes/{id}\", { params: { id }, body: patch }));\n }\n /** Marks the node deleted. */\n deleteNode(id: string): Promise<Node> {\n return this.write(call(this.http, \"DELETE\", \"/nodes/{id}\", { params: { id } }));\n }\n /** Replaces, adds or removes names. */\n names(id: string, op: \"set\" | \"add\" | \"remove\", names: Name[]): Promise<NodeDetail> {\n const method = op === \"set\" ? \"PUT\" : op === \"add\" ? \"POST\" : \"DELETE\";\n return this.write(call(this.http, method, \"/nodes/{id}/names\", { params: { id }, body: names }));\n }\n merge(id: string, into: string): Promise<MergeReport> {\n return this.write(call(this.http, \"POST\", \"/nodes/{id}/merge\", { params: { id }, body: { into_taxonomy_id: into } }));\n }\n edges(op: \"add\" | \"remove\", edges: Edge[]): Promise<EdgesWritten> {\n return this.write(call(this.http, op === \"add\" ? \"POST\" : \"DELETE\", \"/edges\", { body: edges }));\n }\n /** Assigns or unassigns nodes; suppressCounts skips count upkeep (rebuildCounts afterwards). */\n assignments(op: \"add\" | \"remove\", assignments: Assignment[], o: { suppressCounts?: boolean } = {}): Promise<AssignmentsWritten> {\n return this.write(call(this.http, op === \"add\" ? \"POST\" : \"DELETE\", \"/assignments\", { body: assignments, query: { suppress_counts: o.suppressCounts } }));\n }\n /** The effective tags (work and version) of each content. */\n effective(refs: ContentRef[], signal?: AbortSignal): Promise<EffectiveTagsOf[]> {\n return call(this.http, \"POST\", \"/effective\", { body: refs, signal });\n }\n /** Content counts of nodes, by taxonomy id. */\n counts(ids: readonly string[], signal?: AbortSignal): Promise<Record<string, Count[]>> {\n return call(this.http, \"GET\", \"/counts\", { query: { taxonomy_id: ids }, signal });\n }\n rebuildCounts(): Promise<CountsRebuilt> {\n return this.write(call(this.http, \"POST\", \"/counts/rebuild\"));\n }\n\n private async write<T>(p: Promise<T>): Promise<T> {\n const emit = this.http.captureChanges();\n const out = await p;\n emit({ type: \"taxonomy.changed\" });\n return out;\n }\n}\n"],"mappings":";;AA2BA,IAAa,IAAb,MAA4B;CACG;CAA7B,YAAY,GAA6B;EAAZ,KAAA,OAAA;CAAa;CAE1C,MAAM,IAAe,CAAC,GAAG,GAAyC;EAChE,OAAO,EAAK,KAAK,MAAM,OAAO,UAAU;GAAE,OAAO;GAAG;EAAO,CAAC;CAC9D;CACA,KAAK,GAAY,GAA2C;EAC1D,OAAO,EAAK,KAAK,MAAM,OAAO,eAAe;GAAE,QAAQ,EAAE,MAAG;GAAG;EAAO,CAAC;CACzE;CAEA,gBAAgB,GAAY,IAAyB,CAAC,GAAG,GAA+C;EACtG,OAAO,EAAK,KAAK,MAAM,OAAO,2BAA2B;GAAE,QAAQ,EAAE,MAAG;GAAG,OAAO;GAAG;EAAO,CAAC;CAC/F;CACA,YAAY,GAAqC;EAC/C,OAAO,KAAK,MAAM,EAAK,KAAK,MAAM,QAAQ,UAAU,EAAE,MAAM,EAAM,CAAC,CAAC;CACtE;CACA,WAAW,GAAY,GAAkC;EACvD,OAAO,KAAK,MAAM,EAAK,KAAK,MAAM,SAAS,eAAe;GAAE,QAAQ,EAAE,MAAG;GAAG,MAAM;EAAM,CAAC,CAAC;CAC5F;CAEA,WAAW,GAA2B;EACpC,OAAO,KAAK,MAAM,EAAK,KAAK,MAAM,UAAU,eAAe,EAAE,QAAQ,EAAE,MAAG,EAAE,CAAC,CAAC;CAChF;CAEA,MAAM,GAAY,GAA8B,GAAoC;EAClF,IAAM,IAAS,MAAO,QAAQ,QAAQ,MAAO,QAAQ,SAAS;EAC9D,OAAO,KAAK,MAAM,EAAK,KAAK,MAAM,GAAQ,qBAAqB;GAAE,QAAQ,EAAE,MAAG;GAAG,MAAM;EAAM,CAAC,CAAC;CACjG;CACA,MAAM,GAAY,GAAoC;EACpD,OAAO,KAAK,MAAM,EAAK,KAAK,MAAM,QAAQ,qBAAqB;GAAE,QAAQ,EAAE,MAAG;GAAG,MAAM,EAAE,kBAAkB,EAAK;EAAE,CAAC,CAAC;CACtH;CACA,MAAM,GAAsB,GAAsC;EAChE,OAAO,KAAK,MAAM,EAAK,KAAK,MAAM,MAAO,QAAQ,SAAS,UAAU,UAAU,EAAE,MAAM,EAAM,CAAC,CAAC;CAChG;CAEA,YAAY,GAAsB,GAA2B,IAAkC,CAAC,GAAgC;EAC9H,OAAO,KAAK,MAAM,EAAK,KAAK,MAAM,MAAO,QAAQ,SAAS,UAAU,gBAAgB;GAAE,MAAM;GAAa,OAAO,EAAE,iBAAiB,EAAE,eAAe;EAAE,CAAC,CAAC;CAC1J;CAEA,UAAU,GAAoB,GAAkD;EAC9E,OAAO,EAAK,KAAK,MAAM,QAAQ,cAAc;GAAE,MAAM;GAAM;EAAO,CAAC;CACrE;CAEA,OAAO,GAAwB,GAAwD;EACrF,OAAO,EAAK,KAAK,MAAM,OAAO,WAAW;GAAE,OAAO,EAAE,aAAa,EAAI;GAAG;EAAO,CAAC;CAClF;CACA,gBAAwC;EACtC,OAAO,KAAK,MAAM,EAAK,KAAK,MAAM,QAAQ,iBAAiB,CAAC;CAC9D;CAEA,MAAc,MAAS,GAA2B;EAChD,IAAM,IAAO,KAAK,KAAK,eAAe,GAChC,IAAM,MAAM;EAElB,OADA,EAAK,EAAE,MAAM,mBAAmB,CAAC,GAC1B;CACT;AACF"}
|
package/dist/client.js
CHANGED
|
@@ -13,7 +13,7 @@ import { MediaClient as A, backoff as j, samePath as M, stem as N } from "./clie
|
|
|
13
13
|
import { acceptOf as P, defaultImage as F, filesFor as I, isPattern as L, ratioLabel as R, ruleDir as z, ruleFor as B, screenFiles as V, uniqueName as H, uploadRules as U, withMediaType as W } from "./client/media/rules.js";
|
|
14
14
|
import { centeredCrop as G, constrainCrop as K, editOf as q, editedSize as J, fromRotated as Y, rotation as X, sameEdit as Z, toOriginal as Q, toRotated as $ } from "./client/crop.js";
|
|
15
15
|
import { encodeRemaining as ee } from "./client/media/encode.js";
|
|
16
|
-
import {
|
|
16
|
+
import { ItemUploadQueue as te } from "./client/media/queue.js";
|
|
17
17
|
import { decodeImage as ne, isAnimatedImage as re } from "./client/image.js";
|
|
18
18
|
import { READ_CHUNK as ie, chunkOffsets as ae, isProcessing as oe, mergeReads as se, processing as ce } from "./client/media/windows.js";
|
|
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";
|
|
@@ -30,4 +30,4 @@ import { IMAGE_SCHEME as He, PostsClient as Ue, imageRef as We, imageRefs as Ge
|
|
|
30
30
|
import { ReactionsClient as Ke } from "./client/content/reactions.js";
|
|
31
31
|
import { TaxonomyClient as qe } from "./client/taxonomy.js";
|
|
32
32
|
import { createContentKitClient as Je } from "./client/client.js";
|
|
33
|
-
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, 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, 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, qe as TaxonomyClient,
|
|
33
|
+
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, 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, qe 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, Je 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 };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { RefBody } from '../../client/generated/wire.js';
|
|
2
|
+
import { AdminFlowProps } from './shell.js';
|
|
3
|
+
type Choice = string | {
|
|
4
|
+
value: string;
|
|
5
|
+
label: string;
|
|
6
|
+
};
|
|
7
|
+
export interface MediaItemPanelProps extends AdminFlowProps {
|
|
8
|
+
/** The video item. */
|
|
9
|
+
item: RefBody;
|
|
10
|
+
/** The video's upload path. Default "source". */
|
|
11
|
+
source?: string;
|
|
12
|
+
/** The subtitle uploads' path pattern; null hides them. Default "subs/{name}". */
|
|
13
|
+
subtitles?: string | null;
|
|
14
|
+
/** The poster's upload path (its frames come from the video); null hides it. Default "poster". */
|
|
15
|
+
poster?: string | null;
|
|
16
|
+
/** The poster's public preset. Default "poster". */
|
|
17
|
+
posterPreset?: string;
|
|
18
|
+
/** Subtitle languages offered: codes, or codes with labels. Without them the language is typed. */
|
|
19
|
+
languages?: readonly Choice[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* One video item for its editors: its encode state and progress, the source
|
|
23
|
+
* (replace it), subtitle sidecars (language, label, forced), the poster from
|
|
24
|
+
* a frame or an image, and regenerate, which retries failed uploads.
|
|
25
|
+
*/
|
|
26
|
+
export declare function MediaItemPanel({ client: own, baseUrl, auth, guard, appearance, className, language, messages, ...p }: MediaItemPanelProps): import('react').JSX.Element;
|
|
27
|
+
export {};
|