From 1b1b2f7730161086946792c33cf966e7e2522fb1 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 31 May 2026 08:07:10 +0000 Subject: [PATCH] chore(sdk): prepare package for npm publishing --- packages/cliploop-sdk/dist/index.d.ts | 50 +++++++++++ packages/cliploop-sdk/dist/index.js | 106 ++++++++++++++++++++++++ packages/cliploop-sdk/dist/index.js.map | 1 + packages/cliploop-sdk/package.json | 28 +++++-- 4 files changed, 180 insertions(+), 5 deletions(-) create mode 100644 packages/cliploop-sdk/dist/index.d.ts create mode 100644 packages/cliploop-sdk/dist/index.js create mode 100644 packages/cliploop-sdk/dist/index.js.map diff --git a/packages/cliploop-sdk/dist/index.d.ts b/packages/cliploop-sdk/dist/index.d.ts new file mode 100644 index 0000000..8950f38 --- /dev/null +++ b/packages/cliploop-sdk/dist/index.d.ts @@ -0,0 +1,50 @@ +export type WeeklyPromoChannel = "instagram" | "tiktok" | "whatsapp" | "x"; +export type WeeklyPromoInput = { + appName: string; + appWebsiteUrl?: string; + weeklyUpdate: string; + targetAudience?: string; + callToAction?: string; + channel: WeeklyPromoChannel; + tone: string; +}; +export type WeeklyPromoResponse = { + artifactId: string; + previewUrl: string | null; + downloadUrl: string | null; + artifactUrl: string | null; + script: Record; + scenePlan: unknown[]; + creditsCharged: number; + renderStatus: string; + idempotencyKey: string; +}; +export type ClipLoopClientOptions = { + apiKey?: string; + baseUrl?: string; +}; +export type ClipLoopRequestOptions = { + idempotencyKey?: string; +}; +export declare class ClipLoopApiError extends Error { + readonly status: number; + readonly body: unknown; + readonly requestId?: string; + constructor(args: { + message: string; + status: number; + body?: unknown; + }); + toJSON(): { + name: string; + message: string; + status: number; + requestId: string | undefined; + }; +} +export declare class ClipLoopClient { + readonly apiKey: string; + readonly baseURL: string; + constructor(options?: ClipLoopClientOptions); + generateWeeklyPromo(input: WeeklyPromoInput, options?: ClipLoopRequestOptions): Promise; +} diff --git a/packages/cliploop-sdk/dist/index.js b/packages/cliploop-sdk/dist/index.js new file mode 100644 index 0000000..c01495f --- /dev/null +++ b/packages/cliploop-sdk/dist/index.js @@ -0,0 +1,106 @@ +export class ClipLoopApiError extends Error { + status; + body; + requestId; + constructor(args) { + super(args.message); + this.name = "ClipLoopApiError"; + this.status = args.status; + this.body = args.body ?? null; + const requestId = typeof this.body === "object" && this.body && "requestId" in this.body + ? this.body.requestId + : undefined; + this.requestId = requestId; + } + toJSON() { + return { + name: this.name, + message: this.message, + status: this.status, + requestId: this.requestId, + }; + } +} +const DEFAULT_BASE_URL = "https://app.cliploop.site"; +function envApiKey() { + if (typeof process !== "undefined" && process?.env) { + return process.env.CLIPLOOP_API_KEY; + } + return undefined; +} +export class ClipLoopClient { + apiKey; + baseURL; + constructor(options = {}) { + if (!options.apiKey) { + const envKey = envApiKey(); + if (!envKey) { + throw new Error("Missing API key. Pass apiKey or set CLIPLOOP_API_KEY."); + } + this.apiKey = envKey; + } + else { + this.apiKey = options.apiKey; + } + const baseUrl = (typeof options.baseUrl === "string" && options.baseUrl.trim()) || + DEFAULT_BASE_URL; + this.baseURL = baseUrl.replace(/\/$/, ""); + } + async generateWeeklyPromo(input, options = {}) { + const idempotencyKey = options.idempotencyKey ?? `cliploop-sdk-${crypto.randomUUID()}`; + const body = { + appName: input.appName, + weeklyUpdate: input.weeklyUpdate, + channel: input.channel, + tone: input.tone, + }; + if (input.appWebsiteUrl !== undefined) { + body.appWebsiteUrl = input.appWebsiteUrl; + } + if (input.targetAudience !== undefined) { + body.targetAudience = input.targetAudience; + } + if (input.callToAction !== undefined) { + body.callToAction = input.callToAction; + } + const response = await fetch(`${this.baseURL}/api/public/weekly-promo`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${this.apiKey}`, + "Idempotency-Key": idempotencyKey, + }, + body: JSON.stringify(body), + }); + const text = await response.text(); + const data = text.length ? safeJsonParse(text) : {}; + if (!response.ok) { + throw new ClipLoopApiError({ + message: buildMessage(response.status, data, idempotencyKey), + status: response.status, + body: data, + }); + } + return { + ...data, + idempotencyKey, + }; + } +} +function safeJsonParse(value) { + try { + return JSON.parse(value); + } + catch { + return value; + } +} +function buildMessage(status, body, idempotencyKey) { + const summary = typeof body === "object" && body && "error" in body + ? String(body.error) + : typeof body === "string" + ? body + : "Request failed."; + return `ClipLoop API error ${status}: ${summary} (idempotencyKey: ${idempotencyKey})`; +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/cliploop-sdk/dist/index.js.map b/packages/cliploop-sdk/dist/index.js.map new file mode 100644 index 0000000..97a4ca9 --- /dev/null +++ b/packages/cliploop-sdk/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/cliploop-sdk/package.json b/packages/cliploop-sdk/package.json index 018696f..a3de7b7 100644 --- a/packages/cliploop-sdk/package.json +++ b/packages/cliploop-sdk/package.json @@ -18,6 +18,7 @@ "scripts": { "build": "tsc -p tsconfig.json", "typecheck": "tsc -p tsconfig.json --noEmit", + "prepack": "npm run build", "example:weekly-promo": "tsx examples/weekly-promo.ts" }, "dependencies": {}, @@ -28,13 +29,30 @@ "engines": { "node": ">=18.18" }, - "description": "ClipLoop TypeScript SDK for the Weekly Promo API and future video generation endpoints.", + "description": "TypeScript SDK for the ClipLoop programmable video generation API.", + "homepage": "https://docs.cliploop.site/sdks/", + "repository": { + "type": "git", + "url": "https://github.com/talocode/cliploop", + "directory": "packages/cliploop-sdk" + }, + "bugs": { + "url": "https://github.com/talocode/cliploop/issues" + }, "keywords": [ "cliploop", - "video", - "generation", + "video-generation", + "video-api", + "ai-video", "sdk", - "api" + "typescript", + "talocode" ], - "license": "UNLICENSED" + "license": "UNLICENSED", + "sideEffects": false, + "files": [ + "dist", + "README.md", + "package.json" + ] }