@crowdin/apps-api-adapter
v0.20.0
Published
Adapter that lets @crowdin/crowdin-api-client run inside Crowdin apps by routing REST calls through the host AP.apiRequest bridge.
Downloads
2,035
Readme
Crowdin Apps API Adapter
Lets the official @crowdin/crowdin-api-client run inside a Crowdin app. Instead of performing HTTP requests itself, the adapter routes every call through the host AP.apiRequest bridge: Crowdin executes the request under the current user's session, restricted to the API scopes the app's manifest declares, and no tokens ever reach your bundle.
It works in any app where the Crowdin host injects the AP global: classic Crowdin app UI modules and serverless apps alike. If you build with @crowdin/serverless-apps-sdk, you do not need this package directly: createCrowdinClient() from @crowdin/serverless-apps-sdk/api already wires it up.
Installation
npm install @crowdin/apps-api-adapter @crowdin/crowdin-api-clientThe adapter has no runtime dependencies; @crowdin/crowdin-api-client is the client it plugs into.
Usage
import { AppsApiAdapter } from "@crowdin/apps-api-adapter";
import { Client } from "@crowdin/crowdin-api-client";
const crowdin = new Client(
{ token: "unused" },
{ httpClient: new AppsApiAdapter() },
);
const { data: projects } = await crowdin.projectsGroupsApi.listProjects();The token is required by the client constructor but never used: the host authenticates every request with the current user's session.
Errors
Non-2xx responses reject with AppsApiError carrying status, statusText, payload, and an axios-shaped response ({ status, data }), which @crowdin/crowdin-api-client converts into its own CrowdinError / CrowdinValidationError where applicable.
Notes and limitations
- Binary uploads: pass a
Blob,File,ArrayBuffer, or typed array; the adapter converts it before crossing the bridge.FormDatais not supported (no Crowdin API v2 endpoint requires multipart). - GraphQL is not proxied by the host bridge; only the REST API (
/api/v2) is available.
Custom transport
For tests, or when your runtime exposes the host bridge differently, inject a transport:
import { AppsApiAdapter } from "@crowdin/apps-api-adapter";
import type { ApiRequestTransport } from "@crowdin/apps-api-adapter";
const transport: ApiRequestTransport = async ({ method, path, headers, body }) => ({
status: 200,
statusText: "OK",
body: { data: [] },
});
const adapter = new AppsApiAdapter({ transport });License
MIT
