@schmadev/client 1.0.0 → 1.0.3

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 ADDED
@@ -0,0 +1,63 @@
1
+ # @schmadev/client
2
+
3
+ The official TypeScript/JavaScript SDK for [Schma](https://schma.dev).
4
+
5
+ This isomorphic client provides a beautifully typed, fluent interface for fetching and manipulating content from your Schma workspaces. It is designed to work seamlessly in the browser, Node.js, Next.js (App & Pages routers), Astro, and anywhere else JavaScript runs.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @schmadev/client
11
+ ```
12
+
13
+ ## Quick Start
14
+
15
+ Initialize the client with your workspace configuration. If you used `npm create schma`, this is already set up for you.
16
+
17
+ ```typescript
18
+ import { createClient } from "@schmadev/client";
19
+
20
+ export const client = createClient({
21
+ workspaceId: process.env.NEXT_PUBLIC_SCHMA_WORKSPACE_ID!,
22
+ apiKey: process.env.SCHMA_API_KEY!,
23
+ });
24
+ ```
25
+
26
+ ## Fetching Content
27
+
28
+ The client provides a generic, type-safe query builder.
29
+
30
+ ```typescript
31
+ // Fetch multiple entries
32
+ const articles = await client.entries.getMany({
33
+ contentType: 'blogPost',
34
+ limit: 10,
35
+ orderBy: {
36
+ field: 'publishedAt',
37
+ direction: 'desc'
38
+ }
39
+ });
40
+
41
+ // Fetch a single entry by ID
42
+ const page = await client.entries.getOne({
43
+ entryId: 'ent_123abc'
44
+ });
45
+ ```
46
+
47
+ ## Advanced Queries
48
+
49
+ You can build complex queries using the filtering engine:
50
+
51
+ ```typescript
52
+ const featuredProducts = await client.entries.getMany({
53
+ contentType: 'product',
54
+ filters: [
55
+ { field: 'price', operator: 'lt', value: 100 },
56
+ { field: 'isFeatured', operator: 'eq', value: true }
57
+ ]
58
+ });
59
+ ```
60
+
61
+ ## Documentation
62
+
63
+ For the full SDK API reference and guides on how to generate local types for your schema, visit [docs.schma.dev](https://docs.schma.dev).
package/dist/index.d.mts CHANGED
@@ -1,3 +1,59 @@
1
+ declare function createMockClient(mockData?: any): {
2
+ contentTypes: {
3
+ list: () => Promise<{
4
+ data: any;
5
+ }>;
6
+ get: (id: string) => Promise<{
7
+ data: any;
8
+ }>;
9
+ create: (payload: any) => Promise<{
10
+ data: any;
11
+ }>;
12
+ };
13
+ entries: {
14
+ list: () => Promise<{
15
+ data: any;
16
+ }>;
17
+ get: ({ id }: {
18
+ id: string;
19
+ }) => Promise<{
20
+ data: any;
21
+ }>;
22
+ create: (payload: any) => Promise<{
23
+ data: any;
24
+ }>;
25
+ update: (id: string, payload: any) => Promise<{
26
+ data: any;
27
+ }>;
28
+ delete: () => Promise<{
29
+ data: {
30
+ success: boolean;
31
+ };
32
+ }>;
33
+ };
34
+ delivery: {
35
+ getEntry: ({ id }: {
36
+ id: string;
37
+ }) => Promise<any>;
38
+ listEntries: () => Promise<{
39
+ data: any;
40
+ total: any;
41
+ }>;
42
+ searchSimilar: () => Promise<{
43
+ data: any;
44
+ total: any;
45
+ }>;
46
+ };
47
+ analytics: {
48
+ getSummary: () => Promise<{
49
+ data: {
50
+ storage: number;
51
+ bandwidth: number;
52
+ };
53
+ }>;
54
+ };
55
+ };
56
+
1
57
  interface SchmaClientConfig {
2
58
  /**
3
59
  * The Schma API Key, or a function that returns the API key dynamically.
@@ -5,7 +61,7 @@ interface SchmaClientConfig {
5
61
  apiKey: string | (() => string | Promise<string>);
6
62
  /**
7
63
  * The base URL for the Schma API.
8
- * @default "https://schma-cms-production.up.railway.app"
64
+ * @default "https://schma-api-production.up.railway.app"
9
65
  */
10
66
  baseUrl?: string;
11
67
  /**
@@ -27,6 +83,7 @@ declare class SchmaClient {
27
83
  private baseUrl;
28
84
  private tenantSlug?;
29
85
  constructor(config: SchmaClientConfig);
86
+ setTenantSlug(slug: string): void;
30
87
  /**
31
88
  * Perform an API request using the native `fetch` API.
32
89
  */
@@ -257,4 +314,4 @@ declare class SchmaClient {
257
314
  */
258
315
  declare function createClient(config: SchmaClientConfig): SchmaClient;
259
316
 
260
- export { type GetEntryOptions, type ListEntriesOptions, type PaginatedResponse, SchmaClient, type SchmaClientConfig, createClient };
317
+ export { type GetEntryOptions, type ListEntriesOptions, type PaginatedResponse, SchmaClient, type SchmaClientConfig, createClient, createMockClient };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,59 @@
1
+ declare function createMockClient(mockData?: any): {
2
+ contentTypes: {
3
+ list: () => Promise<{
4
+ data: any;
5
+ }>;
6
+ get: (id: string) => Promise<{
7
+ data: any;
8
+ }>;
9
+ create: (payload: any) => Promise<{
10
+ data: any;
11
+ }>;
12
+ };
13
+ entries: {
14
+ list: () => Promise<{
15
+ data: any;
16
+ }>;
17
+ get: ({ id }: {
18
+ id: string;
19
+ }) => Promise<{
20
+ data: any;
21
+ }>;
22
+ create: (payload: any) => Promise<{
23
+ data: any;
24
+ }>;
25
+ update: (id: string, payload: any) => Promise<{
26
+ data: any;
27
+ }>;
28
+ delete: () => Promise<{
29
+ data: {
30
+ success: boolean;
31
+ };
32
+ }>;
33
+ };
34
+ delivery: {
35
+ getEntry: ({ id }: {
36
+ id: string;
37
+ }) => Promise<any>;
38
+ listEntries: () => Promise<{
39
+ data: any;
40
+ total: any;
41
+ }>;
42
+ searchSimilar: () => Promise<{
43
+ data: any;
44
+ total: any;
45
+ }>;
46
+ };
47
+ analytics: {
48
+ getSummary: () => Promise<{
49
+ data: {
50
+ storage: number;
51
+ bandwidth: number;
52
+ };
53
+ }>;
54
+ };
55
+ };
56
+
1
57
  interface SchmaClientConfig {
2
58
  /**
3
59
  * The Schma API Key, or a function that returns the API key dynamically.
@@ -5,7 +61,7 @@ interface SchmaClientConfig {
5
61
  apiKey: string | (() => string | Promise<string>);
6
62
  /**
7
63
  * The base URL for the Schma API.
8
- * @default "https://schma-cms-production.up.railway.app"
64
+ * @default "https://schma-api-production.up.railway.app"
9
65
  */
10
66
  baseUrl?: string;
11
67
  /**
@@ -27,6 +83,7 @@ declare class SchmaClient {
27
83
  private baseUrl;
28
84
  private tenantSlug?;
29
85
  constructor(config: SchmaClientConfig);
86
+ setTenantSlug(slug: string): void;
30
87
  /**
31
88
  * Perform an API request using the native `fetch` API.
32
89
  */
@@ -257,4 +314,4 @@ declare class SchmaClient {
257
314
  */
258
315
  declare function createClient(config: SchmaClientConfig): SchmaClient;
259
316
 
260
- export { type GetEntryOptions, type ListEntriesOptions, type PaginatedResponse, SchmaClient, type SchmaClientConfig, createClient };
317
+ export { type GetEntryOptions, type ListEntriesOptions, type PaginatedResponse, SchmaClient, type SchmaClientConfig, createClient, createMockClient };
package/dist/index.js CHANGED
@@ -21,9 +21,38 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
23
  SchmaClient: () => SchmaClient,
24
- createClient: () => createClient
24
+ createClient: () => createClient,
25
+ createMockClient: () => createMockClient
25
26
  });
26
27
  module.exports = __toCommonJS(index_exports);
28
+
29
+ // src/mock.ts
30
+ function createMockClient(mockData = {}) {
31
+ return {
32
+ contentTypes: {
33
+ list: async () => ({ data: mockData.contentTypes || [] }),
34
+ get: async (id) => ({ data: mockData.contentTypes?.find((c) => c.id === id) || null }),
35
+ create: async (payload) => ({ data: { id: "mock-ct-id", ...payload } })
36
+ },
37
+ entries: {
38
+ list: async () => ({ data: mockData.entries || [] }),
39
+ get: async ({ id }) => ({ data: mockData.entries?.find((e) => e.id === id) || null }),
40
+ create: async (payload) => ({ data: { id: "mock-entry-id", ...payload } }),
41
+ update: async (id, payload) => ({ data: { id, ...payload } }),
42
+ delete: async () => ({ data: { success: true } })
43
+ },
44
+ delivery: {
45
+ getEntry: async ({ id }) => mockData.entries?.find((e) => e.id === id) || null,
46
+ listEntries: async () => ({ data: mockData.entries || [], total: (mockData.entries || []).length }),
47
+ searchSimilar: async () => ({ data: mockData.entries || [], total: (mockData.entries || []).length })
48
+ },
49
+ analytics: {
50
+ getSummary: async () => ({ data: { storage: 0, bandwidth: 0 } })
51
+ }
52
+ };
53
+ }
54
+
55
+ // src/index.ts
27
56
  var SchmaClient = class {
28
57
  apiKey;
29
58
  baseUrl;
@@ -33,13 +62,16 @@ var SchmaClient = class {
33
62
  throw new Error("SchmaClient: apiKey is required.");
34
63
  }
35
64
  this.apiKey = config.apiKey;
36
- this.baseUrl = config.baseUrl?.replace(/\/$/, "") || "https://schma-cms-production.up.railway.app";
65
+ this.baseUrl = config.baseUrl?.replace(/\/$/, "") || "https://schma-api-production.up.railway.app";
37
66
  let envTenantSlug = void 0;
38
67
  if (typeof process !== "undefined" && process.env) {
39
68
  envTenantSlug = process.env.SCHMA_TENANT_SLUG || process.env.NEXT_PUBLIC_SCHMA_TENANT_SLUG;
40
69
  }
41
70
  this.tenantSlug = config.tenantSlug || envTenantSlug;
42
71
  }
72
+ setTenantSlug(slug) {
73
+ this.tenantSlug = slug;
74
+ }
43
75
  /**
44
76
  * Perform an API request using the native `fetch` API.
45
77
  */
@@ -337,6 +369,7 @@ function createClient(config) {
337
369
  // Annotate the CommonJS export names for ESM import in node:
338
370
  0 && (module.exports = {
339
371
  SchmaClient,
340
- createClient
372
+ createClient,
373
+ createMockClient
341
374
  });
342
375
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export interface SchmaClientConfig {\n /**\n * The Schma API Key, or a function that returns the API key dynamically.\n */\n apiKey: string | (() => string | Promise<string>);\n /**\n * The base URL for the Schma API.\n * @default \"https://schma-cms-production.up.railway.app\"\n */\n baseUrl?: string;\n /**\n * Optional tenant slug. Required for some management operations or multi-tenant scenarios.\n */\n tenantSlug?: string;\n}\n\nexport interface GetEntryOptions {\n id: string;\n}\n\nexport interface ListEntriesOptions {\n typeId?: string;\n}\n\nexport interface PaginatedResponse<T> {\n data: T[];\n}\n\nexport class SchmaClient {\n private apiKey: string | (() => string | Promise<string>);\n private baseUrl: string;\n private tenantSlug?: string;\n\n constructor(config: SchmaClientConfig) {\n if (!config.apiKey) {\n throw new Error(\"SchmaClient: apiKey is required.\");\n }\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl?.replace(/\\/$/, \"\") || \"https://schma-cms-production.up.railway.app\";\n \n let envTenantSlug: string | undefined = undefined;\n if (typeof process !== 'undefined' && process.env) {\n envTenantSlug = process.env.SCHMA_TENANT_SLUG || process.env.NEXT_PUBLIC_SCHMA_TENANT_SLUG;\n }\n \n this.tenantSlug = config.tenantSlug || envTenantSlug;\n }\n\n /**\n * Perform an API request using the native `fetch` API.\n */\n private async request<T>(path: string, options?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n \n const headers = new Headers(options?.headers);\n const resolvedApiKey = typeof this.apiKey === 'function' ? await this.apiKey() : this.apiKey;\n headers.set(\"Authorization\", `Bearer ${resolvedApiKey}`);\n headers.set(\"Content-Type\", \"application/json\");\n if (this.tenantSlug) {\n headers.set(\"x-tenant-slug\", this.tenantSlug);\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n let errorMsg = `Schma API Error: ${response.status} ${response.statusText}`;\n try {\n const errorData = await response.json();\n if (errorData.message || errorData.error) {\n errorMsg = `Schma API Error: ${errorData.message || errorData.error}`;\n }\n } catch (e) {}\n throw new Error(errorMsg);\n }\n\n if (response.status === 204) {\n return undefined as any;\n }\n\n return response.json();\n }\n\n // ── Management APIs ────────────────────────────────────\n\n public readonly contentTypes = {\n list: async <T = any>(): Promise<{ data: T[] }> => {\n return this.request<{ data: T[] }>(`/content-types`);\n },\n get: async <T = any>(id: string): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/content-types/${id}`);\n },\n create: async <T = any>(payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/content-types`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n update: async <T = any>(id: string, payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/content-types/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(payload),\n });\n },\n delete: async (id: string): Promise<{ status: string }> => {\n return this.request<{ status: string }>(`/content-types/${id}`, {\n method: \"DELETE\",\n });\n }\n };\n\n public readonly entries = {\n get: async <T = any>(options: GetEntryOptions): Promise<{ data: T }> => {\n if (!options.id) throw new Error(\"id is required to get an entry\");\n return this.request<{ data: T }>(`/entries/${options.id}`);\n },\n list: async <T = any>(options?: ListEntriesOptions): Promise<{ data: T[] }> => {\n const queryParams = new URLSearchParams();\n if (options?.typeId) queryParams.set(\"typeId\", options.typeId);\n const queryString = queryParams.toString();\n const path = `/entries${queryString ? `?${queryString}` : \"\"}`;\n return this.request<{ data: T[] }>(path);\n },\n create: async <T = any>(payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/entries`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n update: async <T = any>(id: string, payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/entries/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(payload),\n });\n },\n delete: async (id: string): Promise<{ status: string }> => {\n return this.request<{ status: string }>(`/entries/${id}`, {\n method: \"DELETE\",\n });\n },\n // Versioning\n listVersions: async (id: string): Promise<{ data: any[] }> => {\n return this.request<{ data: any[] }>(`/entries/${id}/versions`);\n },\n getVersion: async (id: string, versionId: string): Promise<{ data: any }> => {\n return this.request<{ data: any }>(`/entries/${id}/versions/${versionId}`);\n },\n restoreVersion: async (id: string, versionId: string): Promise<{ success: boolean; data: any }> => {\n return this.request<{ success: boolean; data: any }>(`/entries/${id}/versions/${versionId}/restore`, {\n method: \"POST\"\n });\n },\n // Preview Token\n generatePreviewToken: async (id: string): Promise<{ token: string; expiresAt: string }> => {\n return this.request<{ token: string; expiresAt: string }>(`/entries/${id}/preview-token`, {\n method: \"POST\"\n });\n }\n };\n\n // ── Delivery APIs (Read Only) ──────────────────────────\n\n public readonly delivery = {\n getEntry: async <T = any>(options: GetEntryOptions): Promise<T> => {\n if (!options.id) throw new Error(\"id is required to get an entry\");\n return this.request<T>(`/v1/delivery/entries/${options.id}`);\n },\n listEntries: async <T = any>(options?: { type?: string; limit?: number; offset?: number; locale?: string; preview?: string }): Promise<PaginatedResponse<T>> => {\n const queryParams = new URLSearchParams();\n if (options?.type) queryParams.set(\"type\", options.type);\n if (options?.limit !== undefined) queryParams.set(\"limit\", options.limit.toString());\n if (options?.offset !== undefined) queryParams.set(\"offset\", options.offset.toString());\n if (options?.locale) queryParams.set(\"locale\", options.locale);\n if (options?.preview) queryParams.set(\"preview\", options.preview);\n const queryString = queryParams.toString();\n const path = `/v1/delivery/entries${queryString ? `?${queryString}` : \"\"}`;\n return this.request<PaginatedResponse<T>>(path);\n },\n searchSimilar: async <T = any>(options: { text: string; limit?: number; preview?: string }): Promise<PaginatedResponse<T>> => {\n const queryParams = new URLSearchParams();\n queryParams.set(\"text\", options.text);\n if (options.limit !== undefined) queryParams.set(\"limit\", options.limit.toString());\n if (options.preview) queryParams.set(\"preview\", options.preview);\n const queryString = queryParams.toString();\n return this.request<PaginatedResponse<T>>(`/v1/delivery/entries/similar?${queryString}`);\n }\n };\n\n // ── Billing APIs ───────────────────────────────────────\n\n public readonly billing = {\n getUsage: async (): Promise<{ plan: string; usage: number; limit: number }> => {\n return this.request<{ plan: string; usage: number; limit: number }>(`/billing/usage`);\n },\n createCheckout: async (returnUrl?: string): Promise<{ url: string; message?: string }> => {\n return this.request<{ url: string; message?: string }>(`/billing/checkout`, {\n method: \"POST\",\n body: JSON.stringify({ returnUrl }),\n });\n },\n createPortalSession: async (returnUrl?: string): Promise<{ url: string; message?: string }> => {\n return this.request<{ url: string; message?: string }>(`/billing/portal`, {\n method: \"POST\",\n body: JSON.stringify({ returnUrl }),\n });\n }\n };\n\n // ── API Keys APIs ──────────────────────────────────────\n\n public readonly apiKeys = {\n list: async (): Promise<{ keys: any[] }> => {\n return this.request<{ keys: any[] }>(`/api-keys`);\n },\n create: async (payload: { name: string; permissions: string }): Promise<{ key: any; rawToken: string }> => {\n return this.request<{ key: any; rawToken: string }>(`/api-keys`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n revoke: async (id: string): Promise<{ success: boolean }> => {\n return this.request<{ success: boolean }>(`/api-keys/${id}`, {\n method: \"DELETE\",\n });\n }\n };\n\n // ── Webhooks APIs ───────────────────────────────────────\n\n public readonly webhooks = {\n list: async (): Promise<{ webhooks: any[] }> => {\n return this.request<{ webhooks: any[] }>(`/webhooks`);\n },\n create: async (payload: { url: string; events: string[] }): Promise<{ webhook: any; secret: string }> => {\n return this.request<{ webhook: any; secret: string }>(`/webhooks`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n update: async (id: string, payload: { isActive?: boolean; events?: string[] }): Promise<{ webhook: any }> => {\n return this.request<{ webhook: any }>(`/webhooks/${id}`, {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n });\n },\n rotateSecret: async (id: string): Promise<{ webhook: any; secret: string }> => {\n return this.request<{ webhook: any; secret: string }>(`/webhooks/${id}/rotate-secret`, {\n method: \"POST\",\n });\n },\n delete: async (id: string): Promise<{ success: boolean }> => {\n return this.request<{ success: boolean }>(`/webhooks/${id}`, {\n method: \"DELETE\",\n });\n },\n listDeliveries: async (id: string): Promise<{ deliveries: any[] }> => {\n return this.request<{ deliveries: any[] }>(`/webhooks/${id}/deliveries`);\n }\n };\n\n // ── AI APIs ───────────────────────────────────────────\n\n public readonly ai = {\n translate: async (payload: { text: string; targetLanguage: string }): Promise<{ success: boolean; translatedText: string }> => {\n return this.request<{ success: boolean; translatedText: string }>(`/ai/features/translate`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n },\n rewrite: async (payload: { text: string; instruction: string }): Promise<{ success: boolean; rewritten: string }> => {\n return this.request<{ success: boolean; rewritten: string }>(`/ai/features/rewrite`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n },\n qualityCheck: async (payload: { dataJson: any; schemaFields: any[] }): Promise<any> => {\n return this.request<any>(`/ai/features/quality-check`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n },\n bulkGenerate: async (payload: { typeId: string; schema: any; prompts: string[] }): Promise<{ success: boolean; data: any[] }> => {\n return this.request<{ success: boolean; data: any[] }>(`/ai/features/bulk-generate`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n }\n };\n\n // ── Analytics APIs ──────────────────────────────────────\n\n public readonly analytics = {\n getSummary: async (): Promise<{ \n totalEntries: number; \n totalMediaCount: number; \n totalMediaSizeMB: number; \n aiUsageThisMonth: number; \n aiUsageByProvider: { provider: string; calls: number }[]; \n contentDistribution: { type: string; count: number }[]; \n }> => {\n return this.request(`/analytics/summary`);\n }\n };\n\n // ── Audit Logs APIs ────────────────────────────────────\n\n public readonly audit = {\n list: async (options?: { limit?: number }): Promise<{ data: any[] }> => {\n const queryParams = new URLSearchParams();\n if (options?.limit !== undefined) queryParams.set(\"limit\", options.limit.toString());\n const queryString = queryParams.toString();\n return this.request<{ data: any[] }>(`/audit${queryString ? `?${queryString}` : \"\"}`);\n }\n };\n\n // ── Team Management APIs ───────────────────────────────\n\n public readonly team = {\n listMembers: async (): Promise<{ members: any[] }> => {\n return this.request<{ members: any[] }>(`/team`);\n },\n inviteMember: async (payload: { email: string; role: \"admin\" | \"editor\" }): Promise<{ message: string; membership: any }> => {\n return this.request<{ message: string; membership: any }>(`/team/invite`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n updateRole: async (userId: string, payload: { role: \"owner\" | \"admin\" | \"editor\" }): Promise<{ message: string; membership: any }> => {\n return this.request<{ message: string; membership: any }>(`/team/${userId}/role`, {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n });\n },\n removeMember: async (userId: string): Promise<{ message: string }> => {\n return this.request<{ message: string }>(`/team/${userId}`, {\n method: \"DELETE\",\n });\n }\n };\n\n // ── Settings APIs ──────────────────────────────────────\n \n public readonly workspaces = {\n list: async (): Promise<{ workspaces: any[] }> => {\n return this.request<{ workspaces: any[] }>(`/workspaces`);\n }\n };\n\n public readonly onboarding = {\n migrate: async (): Promise<{ success: boolean; error?: string }> => {\n return this.request<{ success: boolean; error?: string }>(`/onboarding/migrate`, {\n method: \"POST\"\n });\n }\n };\n\n public readonly settings = {\n updateDatabaseConnection: async (payload: { provider: \"supabase\" | \"neon\" | \"postgres\"; connectionUri: string }): Promise<{ success: boolean; error?: string }> => {\n return this.request<{ success: boolean; error?: string }>(`/onboarding/connect`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n testConnection: async (payload: { connectionUri: string }): Promise<{ success: boolean; message?: string; error?: string }> => {\n return this.request<{ success: boolean; message?: string; error?: string }>(`/onboarding/test`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n }\n };\n}\n\n/**\n * Creates a new SchmaClient instance.\n */\nexport function createClient(config: SchmaClientConfig): SchmaClient {\n return new SchmaClient(config);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/mock.ts"],"sourcesContent":["export interface SchmaClientConfig {\n /**\n * The Schma API Key, or a function that returns the API key dynamically.\n */\n apiKey: string | (() => string | Promise<string>);\n /**\n * The base URL for the Schma API.\n * @default \"https://schma-api-production.up.railway.app\"\n */\n baseUrl?: string;\n /**\n * Optional tenant slug. Required for some management operations or multi-tenant scenarios.\n */\n tenantSlug?: string;\n}\n\nexport interface GetEntryOptions {\n id: string;\n}\n\nexport interface ListEntriesOptions {\n typeId?: string;\n}\n\nexport interface PaginatedResponse<T> {\n data: T[];\n}\n\nexport class SchmaClient {\n private apiKey: string | (() => string | Promise<string>);\n private baseUrl: string;\n private tenantSlug?: string;\n\n constructor(config: SchmaClientConfig) {\n if (!config.apiKey) {\n throw new Error(\"SchmaClient: apiKey is required.\");\n }\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl?.replace(/\\/$/, \"\") || \"https://schma-api-production.up.railway.app\";\n \n let envTenantSlug: string | undefined = undefined;\n if (typeof process !== 'undefined' && process.env) {\n envTenantSlug = process.env.SCHMA_TENANT_SLUG || process.env.NEXT_PUBLIC_SCHMA_TENANT_SLUG;\n }\n \n this.tenantSlug = config.tenantSlug || envTenantSlug;\n }\n\n public setTenantSlug(slug: string) {\n this.tenantSlug = slug;\n }\n\n /**\n * Perform an API request using the native `fetch` API.\n */\n private async request<T>(path: string, options?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n \n const headers = new Headers(options?.headers);\n const resolvedApiKey = typeof this.apiKey === 'function' ? await this.apiKey() : this.apiKey;\n headers.set(\"Authorization\", `Bearer ${resolvedApiKey}`);\n headers.set(\"Content-Type\", \"application/json\");\n if (this.tenantSlug) {\n headers.set(\"x-tenant-slug\", this.tenantSlug);\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n let errorMsg = `Schma API Error: ${response.status} ${response.statusText}`;\n try {\n const errorData = await response.json();\n if (errorData.message || errorData.error) {\n errorMsg = `Schma API Error: ${errorData.message || errorData.error}`;\n }\n } catch (e) {}\n throw new Error(errorMsg);\n }\n\n if (response.status === 204) {\n return undefined as any;\n }\n\n return response.json();\n }\n\n // ── Management APIs ────────────────────────────────────\n\n public readonly contentTypes = {\n list: async <T = any>(): Promise<{ data: T[] }> => {\n return this.request<{ data: T[] }>(`/content-types`);\n },\n get: async <T = any>(id: string): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/content-types/${id}`);\n },\n create: async <T = any>(payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/content-types`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n update: async <T = any>(id: string, payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/content-types/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(payload),\n });\n },\n delete: async (id: string): Promise<{ status: string }> => {\n return this.request<{ status: string }>(`/content-types/${id}`, {\n method: \"DELETE\",\n });\n }\n };\n\n public readonly entries = {\n get: async <T = any>(options: GetEntryOptions): Promise<{ data: T }> => {\n if (!options.id) throw new Error(\"id is required to get an entry\");\n return this.request<{ data: T }>(`/entries/${options.id}`);\n },\n list: async <T = any>(options?: ListEntriesOptions): Promise<{ data: T[] }> => {\n const queryParams = new URLSearchParams();\n if (options?.typeId) queryParams.set(\"typeId\", options.typeId);\n const queryString = queryParams.toString();\n const path = `/entries${queryString ? `?${queryString}` : \"\"}`;\n return this.request<{ data: T[] }>(path);\n },\n create: async <T = any>(payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/entries`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n update: async <T = any>(id: string, payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/entries/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(payload),\n });\n },\n delete: async (id: string): Promise<{ status: string }> => {\n return this.request<{ status: string }>(`/entries/${id}`, {\n method: \"DELETE\",\n });\n },\n // Versioning\n listVersions: async (id: string): Promise<{ data: any[] }> => {\n return this.request<{ data: any[] }>(`/entries/${id}/versions`);\n },\n getVersion: async (id: string, versionId: string): Promise<{ data: any }> => {\n return this.request<{ data: any }>(`/entries/${id}/versions/${versionId}`);\n },\n restoreVersion: async (id: string, versionId: string): Promise<{ success: boolean; data: any }> => {\n return this.request<{ success: boolean; data: any }>(`/entries/${id}/versions/${versionId}/restore`, {\n method: \"POST\"\n });\n },\n // Preview Token\n generatePreviewToken: async (id: string): Promise<{ token: string; expiresAt: string }> => {\n return this.request<{ token: string; expiresAt: string }>(`/entries/${id}/preview-token`, {\n method: \"POST\"\n });\n }\n };\n\n // ── Delivery APIs (Read Only) ──────────────────────────\n\n public readonly delivery = {\n getEntry: async <T = any>(options: GetEntryOptions): Promise<T> => {\n if (!options.id) throw new Error(\"id is required to get an entry\");\n return this.request<T>(`/v1/delivery/entries/${options.id}`);\n },\n listEntries: async <T = any>(options?: { type?: string; limit?: number; offset?: number; locale?: string; preview?: string }): Promise<PaginatedResponse<T>> => {\n const queryParams = new URLSearchParams();\n if (options?.type) queryParams.set(\"type\", options.type);\n if (options?.limit !== undefined) queryParams.set(\"limit\", options.limit.toString());\n if (options?.offset !== undefined) queryParams.set(\"offset\", options.offset.toString());\n if (options?.locale) queryParams.set(\"locale\", options.locale);\n if (options?.preview) queryParams.set(\"preview\", options.preview);\n const queryString = queryParams.toString();\n const path = `/v1/delivery/entries${queryString ? `?${queryString}` : \"\"}`;\n return this.request<PaginatedResponse<T>>(path);\n },\n searchSimilar: async <T = any>(options: { text: string; limit?: number; preview?: string }): Promise<PaginatedResponse<T>> => {\n const queryParams = new URLSearchParams();\n queryParams.set(\"text\", options.text);\n if (options.limit !== undefined) queryParams.set(\"limit\", options.limit.toString());\n if (options.preview) queryParams.set(\"preview\", options.preview);\n const queryString = queryParams.toString();\n return this.request<PaginatedResponse<T>>(`/v1/delivery/entries/similar?${queryString}`);\n }\n };\n\n // ── Billing APIs ───────────────────────────────────────\n\n public readonly billing = {\n getUsage: async (): Promise<{ plan: string; usage: number; limit: number }> => {\n return this.request<{ plan: string; usage: number; limit: number }>(`/billing/usage`);\n },\n createCheckout: async (returnUrl?: string): Promise<{ url: string; message?: string }> => {\n return this.request<{ url: string; message?: string }>(`/billing/checkout`, {\n method: \"POST\",\n body: JSON.stringify({ returnUrl }),\n });\n },\n createPortalSession: async (returnUrl?: string): Promise<{ url: string; message?: string }> => {\n return this.request<{ url: string; message?: string }>(`/billing/portal`, {\n method: \"POST\",\n body: JSON.stringify({ returnUrl }),\n });\n }\n };\n\n // ── API Keys APIs ──────────────────────────────────────\n\n public readonly apiKeys = {\n list: async (): Promise<{ keys: any[] }> => {\n return this.request<{ keys: any[] }>(`/api-keys`);\n },\n create: async (payload: { name: string; permissions: string }): Promise<{ key: any; rawToken: string }> => {\n return this.request<{ key: any; rawToken: string }>(`/api-keys`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n revoke: async (id: string): Promise<{ success: boolean }> => {\n return this.request<{ success: boolean }>(`/api-keys/${id}`, {\n method: \"DELETE\",\n });\n }\n };\n\n // ── Webhooks APIs ───────────────────────────────────────\n\n public readonly webhooks = {\n list: async (): Promise<{ webhooks: any[] }> => {\n return this.request<{ webhooks: any[] }>(`/webhooks`);\n },\n create: async (payload: { url: string; events: string[] }): Promise<{ webhook: any; secret: string }> => {\n return this.request<{ webhook: any; secret: string }>(`/webhooks`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n update: async (id: string, payload: { isActive?: boolean; events?: string[] }): Promise<{ webhook: any }> => {\n return this.request<{ webhook: any }>(`/webhooks/${id}`, {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n });\n },\n rotateSecret: async (id: string): Promise<{ webhook: any; secret: string }> => {\n return this.request<{ webhook: any; secret: string }>(`/webhooks/${id}/rotate-secret`, {\n method: \"POST\",\n });\n },\n delete: async (id: string): Promise<{ success: boolean }> => {\n return this.request<{ success: boolean }>(`/webhooks/${id}`, {\n method: \"DELETE\",\n });\n },\n listDeliveries: async (id: string): Promise<{ deliveries: any[] }> => {\n return this.request<{ deliveries: any[] }>(`/webhooks/${id}/deliveries`);\n }\n };\n\n // ── AI APIs ───────────────────────────────────────────\n\n public readonly ai = {\n translate: async (payload: { text: string; targetLanguage: string }): Promise<{ success: boolean; translatedText: string }> => {\n return this.request<{ success: boolean; translatedText: string }>(`/ai/features/translate`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n },\n rewrite: async (payload: { text: string; instruction: string }): Promise<{ success: boolean; rewritten: string }> => {\n return this.request<{ success: boolean; rewritten: string }>(`/ai/features/rewrite`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n },\n qualityCheck: async (payload: { dataJson: any; schemaFields: any[] }): Promise<any> => {\n return this.request<any>(`/ai/features/quality-check`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n },\n bulkGenerate: async (payload: { typeId: string; schema: any; prompts: string[] }): Promise<{ success: boolean; data: any[] }> => {\n return this.request<{ success: boolean; data: any[] }>(`/ai/features/bulk-generate`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n }\n };\n\n // ── Analytics APIs ──────────────────────────────────────\n\n public readonly analytics = {\n getSummary: async (): Promise<{ \n totalEntries: number; \n totalMediaCount: number; \n totalMediaSizeMB: number; \n aiUsageThisMonth: number; \n aiUsageByProvider: { provider: string; calls: number }[]; \n contentDistribution: { type: string; count: number }[]; \n }> => {\n return this.request(`/analytics/summary`);\n }\n };\n\n // ── Audit Logs APIs ────────────────────────────────────\n\n public readonly audit = {\n list: async (options?: { limit?: number }): Promise<{ data: any[] }> => {\n const queryParams = new URLSearchParams();\n if (options?.limit !== undefined) queryParams.set(\"limit\", options.limit.toString());\n const queryString = queryParams.toString();\n return this.request<{ data: any[] }>(`/audit${queryString ? `?${queryString}` : \"\"}`);\n }\n };\n\n // ── Team Management APIs ───────────────────────────────\n\n public readonly team = {\n listMembers: async (): Promise<{ members: any[] }> => {\n return this.request<{ members: any[] }>(`/team`);\n },\n inviteMember: async (payload: { email: string; role: \"admin\" | \"editor\" }): Promise<{ message: string; membership: any }> => {\n return this.request<{ message: string; membership: any }>(`/team/invite`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n updateRole: async (userId: string, payload: { role: \"owner\" | \"admin\" | \"editor\" }): Promise<{ message: string; membership: any }> => {\n return this.request<{ message: string; membership: any }>(`/team/${userId}/role`, {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n });\n },\n removeMember: async (userId: string): Promise<{ message: string }> => {\n return this.request<{ message: string }>(`/team/${userId}`, {\n method: \"DELETE\",\n });\n }\n };\n\n // ── Settings APIs ──────────────────────────────────────\n \n public readonly workspaces = {\n list: async (): Promise<{ workspaces: any[] }> => {\n return this.request<{ workspaces: any[] }>(`/workspaces`);\n }\n };\n\n public readonly onboarding = {\n migrate: async (): Promise<{ success: boolean; error?: string }> => {\n return this.request<{ success: boolean; error?: string }>(`/onboarding/migrate`, {\n method: \"POST\"\n });\n }\n };\n\n public readonly settings = {\n updateDatabaseConnection: async (payload: { provider: \"supabase\" | \"neon\" | \"postgres\"; connectionUri: string }): Promise<{ success: boolean; error?: string }> => {\n return this.request<{ success: boolean; error?: string }>(`/onboarding/connect`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n testConnection: async (payload: { connectionUri: string }): Promise<{ success: boolean; message?: string; error?: string }> => {\n return this.request<{ success: boolean; message?: string; error?: string }>(`/onboarding/test`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n }\n };\n}\n\n/**\n * Creates a new SchmaClient instance.\n */\nexport function createClient(config: SchmaClientConfig): SchmaClient {\n return new SchmaClient(config);\n}\nexport * from \"./mock\";\n","export function createMockClient(mockData: any = {}) {\n return {\n contentTypes: {\n list: async () => ({ data: mockData.contentTypes || [] }),\n get: async (id: string) => ({ data: mockData.contentTypes?.find((c: any) => c.id === id) || null }),\n create: async (payload: any) => ({ data: { id: \"mock-ct-id\", ...payload } })\n },\n entries: {\n list: async () => ({ data: mockData.entries || [] }),\n get: async ({ id }: { id: string }) => ({ data: mockData.entries?.find((e: any) => e.id === id) || null }),\n create: async (payload: any) => ({ data: { id: \"mock-entry-id\", ...payload } }),\n update: async (id: string, payload: any) => ({ data: { id, ...payload } }),\n delete: async () => ({ data: { success: true } })\n },\n delivery: {\n getEntry: async ({ id }: { id: string }) => mockData.entries?.find((e: any) => e.id === id) || null,\n listEntries: async () => ({ data: mockData.entries || [], total: (mockData.entries || []).length }),\n searchSimilar: async () => ({ data: mockData.entries || [], total: (mockData.entries || []).length })\n },\n analytics: {\n getSummary: async () => ({ data: { storage: 0, bandwidth: 0 } })\n }\n };\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,29 @@
1
+ // src/mock.ts
2
+ function createMockClient(mockData = {}) {
3
+ return {
4
+ contentTypes: {
5
+ list: async () => ({ data: mockData.contentTypes || [] }),
6
+ get: async (id) => ({ data: mockData.contentTypes?.find((c) => c.id === id) || null }),
7
+ create: async (payload) => ({ data: { id: "mock-ct-id", ...payload } })
8
+ },
9
+ entries: {
10
+ list: async () => ({ data: mockData.entries || [] }),
11
+ get: async ({ id }) => ({ data: mockData.entries?.find((e) => e.id === id) || null }),
12
+ create: async (payload) => ({ data: { id: "mock-entry-id", ...payload } }),
13
+ update: async (id, payload) => ({ data: { id, ...payload } }),
14
+ delete: async () => ({ data: { success: true } })
15
+ },
16
+ delivery: {
17
+ getEntry: async ({ id }) => mockData.entries?.find((e) => e.id === id) || null,
18
+ listEntries: async () => ({ data: mockData.entries || [], total: (mockData.entries || []).length }),
19
+ searchSimilar: async () => ({ data: mockData.entries || [], total: (mockData.entries || []).length })
20
+ },
21
+ analytics: {
22
+ getSummary: async () => ({ data: { storage: 0, bandwidth: 0 } })
23
+ }
24
+ };
25
+ }
26
+
1
27
  // src/index.ts
2
28
  var SchmaClient = class {
3
29
  apiKey;
@@ -8,13 +34,16 @@ var SchmaClient = class {
8
34
  throw new Error("SchmaClient: apiKey is required.");
9
35
  }
10
36
  this.apiKey = config.apiKey;
11
- this.baseUrl = config.baseUrl?.replace(/\/$/, "") || "https://schma-cms-production.up.railway.app";
37
+ this.baseUrl = config.baseUrl?.replace(/\/$/, "") || "https://schma-api-production.up.railway.app";
12
38
  let envTenantSlug = void 0;
13
39
  if (typeof process !== "undefined" && process.env) {
14
40
  envTenantSlug = process.env.SCHMA_TENANT_SLUG || process.env.NEXT_PUBLIC_SCHMA_TENANT_SLUG;
15
41
  }
16
42
  this.tenantSlug = config.tenantSlug || envTenantSlug;
17
43
  }
44
+ setTenantSlug(slug) {
45
+ this.tenantSlug = slug;
46
+ }
18
47
  /**
19
48
  * Perform an API request using the native `fetch` API.
20
49
  */
@@ -311,6 +340,7 @@ function createClient(config) {
311
340
  }
312
341
  export {
313
342
  SchmaClient,
314
- createClient
343
+ createClient,
344
+ createMockClient
315
345
  };
316
346
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export interface SchmaClientConfig {\n /**\n * The Schma API Key, or a function that returns the API key dynamically.\n */\n apiKey: string | (() => string | Promise<string>);\n /**\n * The base URL for the Schma API.\n * @default \"https://schma-cms-production.up.railway.app\"\n */\n baseUrl?: string;\n /**\n * Optional tenant slug. Required for some management operations or multi-tenant scenarios.\n */\n tenantSlug?: string;\n}\n\nexport interface GetEntryOptions {\n id: string;\n}\n\nexport interface ListEntriesOptions {\n typeId?: string;\n}\n\nexport interface PaginatedResponse<T> {\n data: T[];\n}\n\nexport class SchmaClient {\n private apiKey: string | (() => string | Promise<string>);\n private baseUrl: string;\n private tenantSlug?: string;\n\n constructor(config: SchmaClientConfig) {\n if (!config.apiKey) {\n throw new Error(\"SchmaClient: apiKey is required.\");\n }\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl?.replace(/\\/$/, \"\") || \"https://schma-cms-production.up.railway.app\";\n \n let envTenantSlug: string | undefined = undefined;\n if (typeof process !== 'undefined' && process.env) {\n envTenantSlug = process.env.SCHMA_TENANT_SLUG || process.env.NEXT_PUBLIC_SCHMA_TENANT_SLUG;\n }\n \n this.tenantSlug = config.tenantSlug || envTenantSlug;\n }\n\n /**\n * Perform an API request using the native `fetch` API.\n */\n private async request<T>(path: string, options?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n \n const headers = new Headers(options?.headers);\n const resolvedApiKey = typeof this.apiKey === 'function' ? await this.apiKey() : this.apiKey;\n headers.set(\"Authorization\", `Bearer ${resolvedApiKey}`);\n headers.set(\"Content-Type\", \"application/json\");\n if (this.tenantSlug) {\n headers.set(\"x-tenant-slug\", this.tenantSlug);\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n let errorMsg = `Schma API Error: ${response.status} ${response.statusText}`;\n try {\n const errorData = await response.json();\n if (errorData.message || errorData.error) {\n errorMsg = `Schma API Error: ${errorData.message || errorData.error}`;\n }\n } catch (e) {}\n throw new Error(errorMsg);\n }\n\n if (response.status === 204) {\n return undefined as any;\n }\n\n return response.json();\n }\n\n // ── Management APIs ────────────────────────────────────\n\n public readonly contentTypes = {\n list: async <T = any>(): Promise<{ data: T[] }> => {\n return this.request<{ data: T[] }>(`/content-types`);\n },\n get: async <T = any>(id: string): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/content-types/${id}`);\n },\n create: async <T = any>(payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/content-types`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n update: async <T = any>(id: string, payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/content-types/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(payload),\n });\n },\n delete: async (id: string): Promise<{ status: string }> => {\n return this.request<{ status: string }>(`/content-types/${id}`, {\n method: \"DELETE\",\n });\n }\n };\n\n public readonly entries = {\n get: async <T = any>(options: GetEntryOptions): Promise<{ data: T }> => {\n if (!options.id) throw new Error(\"id is required to get an entry\");\n return this.request<{ data: T }>(`/entries/${options.id}`);\n },\n list: async <T = any>(options?: ListEntriesOptions): Promise<{ data: T[] }> => {\n const queryParams = new URLSearchParams();\n if (options?.typeId) queryParams.set(\"typeId\", options.typeId);\n const queryString = queryParams.toString();\n const path = `/entries${queryString ? `?${queryString}` : \"\"}`;\n return this.request<{ data: T[] }>(path);\n },\n create: async <T = any>(payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/entries`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n update: async <T = any>(id: string, payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/entries/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(payload),\n });\n },\n delete: async (id: string): Promise<{ status: string }> => {\n return this.request<{ status: string }>(`/entries/${id}`, {\n method: \"DELETE\",\n });\n },\n // Versioning\n listVersions: async (id: string): Promise<{ data: any[] }> => {\n return this.request<{ data: any[] }>(`/entries/${id}/versions`);\n },\n getVersion: async (id: string, versionId: string): Promise<{ data: any }> => {\n return this.request<{ data: any }>(`/entries/${id}/versions/${versionId}`);\n },\n restoreVersion: async (id: string, versionId: string): Promise<{ success: boolean; data: any }> => {\n return this.request<{ success: boolean; data: any }>(`/entries/${id}/versions/${versionId}/restore`, {\n method: \"POST\"\n });\n },\n // Preview Token\n generatePreviewToken: async (id: string): Promise<{ token: string; expiresAt: string }> => {\n return this.request<{ token: string; expiresAt: string }>(`/entries/${id}/preview-token`, {\n method: \"POST\"\n });\n }\n };\n\n // ── Delivery APIs (Read Only) ──────────────────────────\n\n public readonly delivery = {\n getEntry: async <T = any>(options: GetEntryOptions): Promise<T> => {\n if (!options.id) throw new Error(\"id is required to get an entry\");\n return this.request<T>(`/v1/delivery/entries/${options.id}`);\n },\n listEntries: async <T = any>(options?: { type?: string; limit?: number; offset?: number; locale?: string; preview?: string }): Promise<PaginatedResponse<T>> => {\n const queryParams = new URLSearchParams();\n if (options?.type) queryParams.set(\"type\", options.type);\n if (options?.limit !== undefined) queryParams.set(\"limit\", options.limit.toString());\n if (options?.offset !== undefined) queryParams.set(\"offset\", options.offset.toString());\n if (options?.locale) queryParams.set(\"locale\", options.locale);\n if (options?.preview) queryParams.set(\"preview\", options.preview);\n const queryString = queryParams.toString();\n const path = `/v1/delivery/entries${queryString ? `?${queryString}` : \"\"}`;\n return this.request<PaginatedResponse<T>>(path);\n },\n searchSimilar: async <T = any>(options: { text: string; limit?: number; preview?: string }): Promise<PaginatedResponse<T>> => {\n const queryParams = new URLSearchParams();\n queryParams.set(\"text\", options.text);\n if (options.limit !== undefined) queryParams.set(\"limit\", options.limit.toString());\n if (options.preview) queryParams.set(\"preview\", options.preview);\n const queryString = queryParams.toString();\n return this.request<PaginatedResponse<T>>(`/v1/delivery/entries/similar?${queryString}`);\n }\n };\n\n // ── Billing APIs ───────────────────────────────────────\n\n public readonly billing = {\n getUsage: async (): Promise<{ plan: string; usage: number; limit: number }> => {\n return this.request<{ plan: string; usage: number; limit: number }>(`/billing/usage`);\n },\n createCheckout: async (returnUrl?: string): Promise<{ url: string; message?: string }> => {\n return this.request<{ url: string; message?: string }>(`/billing/checkout`, {\n method: \"POST\",\n body: JSON.stringify({ returnUrl }),\n });\n },\n createPortalSession: async (returnUrl?: string): Promise<{ url: string; message?: string }> => {\n return this.request<{ url: string; message?: string }>(`/billing/portal`, {\n method: \"POST\",\n body: JSON.stringify({ returnUrl }),\n });\n }\n };\n\n // ── API Keys APIs ──────────────────────────────────────\n\n public readonly apiKeys = {\n list: async (): Promise<{ keys: any[] }> => {\n return this.request<{ keys: any[] }>(`/api-keys`);\n },\n create: async (payload: { name: string; permissions: string }): Promise<{ key: any; rawToken: string }> => {\n return this.request<{ key: any; rawToken: string }>(`/api-keys`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n revoke: async (id: string): Promise<{ success: boolean }> => {\n return this.request<{ success: boolean }>(`/api-keys/${id}`, {\n method: \"DELETE\",\n });\n }\n };\n\n // ── Webhooks APIs ───────────────────────────────────────\n\n public readonly webhooks = {\n list: async (): Promise<{ webhooks: any[] }> => {\n return this.request<{ webhooks: any[] }>(`/webhooks`);\n },\n create: async (payload: { url: string; events: string[] }): Promise<{ webhook: any; secret: string }> => {\n return this.request<{ webhook: any; secret: string }>(`/webhooks`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n update: async (id: string, payload: { isActive?: boolean; events?: string[] }): Promise<{ webhook: any }> => {\n return this.request<{ webhook: any }>(`/webhooks/${id}`, {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n });\n },\n rotateSecret: async (id: string): Promise<{ webhook: any; secret: string }> => {\n return this.request<{ webhook: any; secret: string }>(`/webhooks/${id}/rotate-secret`, {\n method: \"POST\",\n });\n },\n delete: async (id: string): Promise<{ success: boolean }> => {\n return this.request<{ success: boolean }>(`/webhooks/${id}`, {\n method: \"DELETE\",\n });\n },\n listDeliveries: async (id: string): Promise<{ deliveries: any[] }> => {\n return this.request<{ deliveries: any[] }>(`/webhooks/${id}/deliveries`);\n }\n };\n\n // ── AI APIs ───────────────────────────────────────────\n\n public readonly ai = {\n translate: async (payload: { text: string; targetLanguage: string }): Promise<{ success: boolean; translatedText: string }> => {\n return this.request<{ success: boolean; translatedText: string }>(`/ai/features/translate`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n },\n rewrite: async (payload: { text: string; instruction: string }): Promise<{ success: boolean; rewritten: string }> => {\n return this.request<{ success: boolean; rewritten: string }>(`/ai/features/rewrite`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n },\n qualityCheck: async (payload: { dataJson: any; schemaFields: any[] }): Promise<any> => {\n return this.request<any>(`/ai/features/quality-check`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n },\n bulkGenerate: async (payload: { typeId: string; schema: any; prompts: string[] }): Promise<{ success: boolean; data: any[] }> => {\n return this.request<{ success: boolean; data: any[] }>(`/ai/features/bulk-generate`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n }\n };\n\n // ── Analytics APIs ──────────────────────────────────────\n\n public readonly analytics = {\n getSummary: async (): Promise<{ \n totalEntries: number; \n totalMediaCount: number; \n totalMediaSizeMB: number; \n aiUsageThisMonth: number; \n aiUsageByProvider: { provider: string; calls: number }[]; \n contentDistribution: { type: string; count: number }[]; \n }> => {\n return this.request(`/analytics/summary`);\n }\n };\n\n // ── Audit Logs APIs ────────────────────────────────────\n\n public readonly audit = {\n list: async (options?: { limit?: number }): Promise<{ data: any[] }> => {\n const queryParams = new URLSearchParams();\n if (options?.limit !== undefined) queryParams.set(\"limit\", options.limit.toString());\n const queryString = queryParams.toString();\n return this.request<{ data: any[] }>(`/audit${queryString ? `?${queryString}` : \"\"}`);\n }\n };\n\n // ── Team Management APIs ───────────────────────────────\n\n public readonly team = {\n listMembers: async (): Promise<{ members: any[] }> => {\n return this.request<{ members: any[] }>(`/team`);\n },\n inviteMember: async (payload: { email: string; role: \"admin\" | \"editor\" }): Promise<{ message: string; membership: any }> => {\n return this.request<{ message: string; membership: any }>(`/team/invite`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n updateRole: async (userId: string, payload: { role: \"owner\" | \"admin\" | \"editor\" }): Promise<{ message: string; membership: any }> => {\n return this.request<{ message: string; membership: any }>(`/team/${userId}/role`, {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n });\n },\n removeMember: async (userId: string): Promise<{ message: string }> => {\n return this.request<{ message: string }>(`/team/${userId}`, {\n method: \"DELETE\",\n });\n }\n };\n\n // ── Settings APIs ──────────────────────────────────────\n \n public readonly workspaces = {\n list: async (): Promise<{ workspaces: any[] }> => {\n return this.request<{ workspaces: any[] }>(`/workspaces`);\n }\n };\n\n public readonly onboarding = {\n migrate: async (): Promise<{ success: boolean; error?: string }> => {\n return this.request<{ success: boolean; error?: string }>(`/onboarding/migrate`, {\n method: \"POST\"\n });\n }\n };\n\n public readonly settings = {\n updateDatabaseConnection: async (payload: { provider: \"supabase\" | \"neon\" | \"postgres\"; connectionUri: string }): Promise<{ success: boolean; error?: string }> => {\n return this.request<{ success: boolean; error?: string }>(`/onboarding/connect`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n testConnection: async (payload: { connectionUri: string }): Promise<{ success: boolean; message?: string; error?: string }> => {\n return this.request<{ success: boolean; message?: string; error?: string }>(`/onboarding/test`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n }\n };\n}\n\n/**\n * Creates a new SchmaClient instance.\n */\nexport function createClient(config: SchmaClientConfig): SchmaClient {\n return new SchmaClient(config);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/mock.ts","../src/index.ts"],"sourcesContent":["export function createMockClient(mockData: any = {}) {\n return {\n contentTypes: {\n list: async () => ({ data: mockData.contentTypes || [] }),\n get: async (id: string) => ({ data: mockData.contentTypes?.find((c: any) => c.id === id) || null }),\n create: async (payload: any) => ({ data: { id: \"mock-ct-id\", ...payload } })\n },\n entries: {\n list: async () => ({ data: mockData.entries || [] }),\n get: async ({ id }: { id: string }) => ({ data: mockData.entries?.find((e: any) => e.id === id) || null }),\n create: async (payload: any) => ({ data: { id: \"mock-entry-id\", ...payload } }),\n update: async (id: string, payload: any) => ({ data: { id, ...payload } }),\n delete: async () => ({ data: { success: true } })\n },\n delivery: {\n getEntry: async ({ id }: { id: string }) => mockData.entries?.find((e: any) => e.id === id) || null,\n listEntries: async () => ({ data: mockData.entries || [], total: (mockData.entries || []).length }),\n searchSimilar: async () => ({ data: mockData.entries || [], total: (mockData.entries || []).length })\n },\n analytics: {\n getSummary: async () => ({ data: { storage: 0, bandwidth: 0 } })\n }\n };\n}\n","export interface SchmaClientConfig {\n /**\n * The Schma API Key, or a function that returns the API key dynamically.\n */\n apiKey: string | (() => string | Promise<string>);\n /**\n * The base URL for the Schma API.\n * @default \"https://schma-api-production.up.railway.app\"\n */\n baseUrl?: string;\n /**\n * Optional tenant slug. Required for some management operations or multi-tenant scenarios.\n */\n tenantSlug?: string;\n}\n\nexport interface GetEntryOptions {\n id: string;\n}\n\nexport interface ListEntriesOptions {\n typeId?: string;\n}\n\nexport interface PaginatedResponse<T> {\n data: T[];\n}\n\nexport class SchmaClient {\n private apiKey: string | (() => string | Promise<string>);\n private baseUrl: string;\n private tenantSlug?: string;\n\n constructor(config: SchmaClientConfig) {\n if (!config.apiKey) {\n throw new Error(\"SchmaClient: apiKey is required.\");\n }\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl?.replace(/\\/$/, \"\") || \"https://schma-api-production.up.railway.app\";\n \n let envTenantSlug: string | undefined = undefined;\n if (typeof process !== 'undefined' && process.env) {\n envTenantSlug = process.env.SCHMA_TENANT_SLUG || process.env.NEXT_PUBLIC_SCHMA_TENANT_SLUG;\n }\n \n this.tenantSlug = config.tenantSlug || envTenantSlug;\n }\n\n public setTenantSlug(slug: string) {\n this.tenantSlug = slug;\n }\n\n /**\n * Perform an API request using the native `fetch` API.\n */\n private async request<T>(path: string, options?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n \n const headers = new Headers(options?.headers);\n const resolvedApiKey = typeof this.apiKey === 'function' ? await this.apiKey() : this.apiKey;\n headers.set(\"Authorization\", `Bearer ${resolvedApiKey}`);\n headers.set(\"Content-Type\", \"application/json\");\n if (this.tenantSlug) {\n headers.set(\"x-tenant-slug\", this.tenantSlug);\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n let errorMsg = `Schma API Error: ${response.status} ${response.statusText}`;\n try {\n const errorData = await response.json();\n if (errorData.message || errorData.error) {\n errorMsg = `Schma API Error: ${errorData.message || errorData.error}`;\n }\n } catch (e) {}\n throw new Error(errorMsg);\n }\n\n if (response.status === 204) {\n return undefined as any;\n }\n\n return response.json();\n }\n\n // ── Management APIs ────────────────────────────────────\n\n public readonly contentTypes = {\n list: async <T = any>(): Promise<{ data: T[] }> => {\n return this.request<{ data: T[] }>(`/content-types`);\n },\n get: async <T = any>(id: string): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/content-types/${id}`);\n },\n create: async <T = any>(payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/content-types`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n update: async <T = any>(id: string, payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/content-types/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(payload),\n });\n },\n delete: async (id: string): Promise<{ status: string }> => {\n return this.request<{ status: string }>(`/content-types/${id}`, {\n method: \"DELETE\",\n });\n }\n };\n\n public readonly entries = {\n get: async <T = any>(options: GetEntryOptions): Promise<{ data: T }> => {\n if (!options.id) throw new Error(\"id is required to get an entry\");\n return this.request<{ data: T }>(`/entries/${options.id}`);\n },\n list: async <T = any>(options?: ListEntriesOptions): Promise<{ data: T[] }> => {\n const queryParams = new URLSearchParams();\n if (options?.typeId) queryParams.set(\"typeId\", options.typeId);\n const queryString = queryParams.toString();\n const path = `/entries${queryString ? `?${queryString}` : \"\"}`;\n return this.request<{ data: T[] }>(path);\n },\n create: async <T = any>(payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/entries`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n update: async <T = any>(id: string, payload: any): Promise<{ data: T }> => {\n return this.request<{ data: T }>(`/entries/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(payload),\n });\n },\n delete: async (id: string): Promise<{ status: string }> => {\n return this.request<{ status: string }>(`/entries/${id}`, {\n method: \"DELETE\",\n });\n },\n // Versioning\n listVersions: async (id: string): Promise<{ data: any[] }> => {\n return this.request<{ data: any[] }>(`/entries/${id}/versions`);\n },\n getVersion: async (id: string, versionId: string): Promise<{ data: any }> => {\n return this.request<{ data: any }>(`/entries/${id}/versions/${versionId}`);\n },\n restoreVersion: async (id: string, versionId: string): Promise<{ success: boolean; data: any }> => {\n return this.request<{ success: boolean; data: any }>(`/entries/${id}/versions/${versionId}/restore`, {\n method: \"POST\"\n });\n },\n // Preview Token\n generatePreviewToken: async (id: string): Promise<{ token: string; expiresAt: string }> => {\n return this.request<{ token: string; expiresAt: string }>(`/entries/${id}/preview-token`, {\n method: \"POST\"\n });\n }\n };\n\n // ── Delivery APIs (Read Only) ──────────────────────────\n\n public readonly delivery = {\n getEntry: async <T = any>(options: GetEntryOptions): Promise<T> => {\n if (!options.id) throw new Error(\"id is required to get an entry\");\n return this.request<T>(`/v1/delivery/entries/${options.id}`);\n },\n listEntries: async <T = any>(options?: { type?: string; limit?: number; offset?: number; locale?: string; preview?: string }): Promise<PaginatedResponse<T>> => {\n const queryParams = new URLSearchParams();\n if (options?.type) queryParams.set(\"type\", options.type);\n if (options?.limit !== undefined) queryParams.set(\"limit\", options.limit.toString());\n if (options?.offset !== undefined) queryParams.set(\"offset\", options.offset.toString());\n if (options?.locale) queryParams.set(\"locale\", options.locale);\n if (options?.preview) queryParams.set(\"preview\", options.preview);\n const queryString = queryParams.toString();\n const path = `/v1/delivery/entries${queryString ? `?${queryString}` : \"\"}`;\n return this.request<PaginatedResponse<T>>(path);\n },\n searchSimilar: async <T = any>(options: { text: string; limit?: number; preview?: string }): Promise<PaginatedResponse<T>> => {\n const queryParams = new URLSearchParams();\n queryParams.set(\"text\", options.text);\n if (options.limit !== undefined) queryParams.set(\"limit\", options.limit.toString());\n if (options.preview) queryParams.set(\"preview\", options.preview);\n const queryString = queryParams.toString();\n return this.request<PaginatedResponse<T>>(`/v1/delivery/entries/similar?${queryString}`);\n }\n };\n\n // ── Billing APIs ───────────────────────────────────────\n\n public readonly billing = {\n getUsage: async (): Promise<{ plan: string; usage: number; limit: number }> => {\n return this.request<{ plan: string; usage: number; limit: number }>(`/billing/usage`);\n },\n createCheckout: async (returnUrl?: string): Promise<{ url: string; message?: string }> => {\n return this.request<{ url: string; message?: string }>(`/billing/checkout`, {\n method: \"POST\",\n body: JSON.stringify({ returnUrl }),\n });\n },\n createPortalSession: async (returnUrl?: string): Promise<{ url: string; message?: string }> => {\n return this.request<{ url: string; message?: string }>(`/billing/portal`, {\n method: \"POST\",\n body: JSON.stringify({ returnUrl }),\n });\n }\n };\n\n // ── API Keys APIs ──────────────────────────────────────\n\n public readonly apiKeys = {\n list: async (): Promise<{ keys: any[] }> => {\n return this.request<{ keys: any[] }>(`/api-keys`);\n },\n create: async (payload: { name: string; permissions: string }): Promise<{ key: any; rawToken: string }> => {\n return this.request<{ key: any; rawToken: string }>(`/api-keys`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n revoke: async (id: string): Promise<{ success: boolean }> => {\n return this.request<{ success: boolean }>(`/api-keys/${id}`, {\n method: \"DELETE\",\n });\n }\n };\n\n // ── Webhooks APIs ───────────────────────────────────────\n\n public readonly webhooks = {\n list: async (): Promise<{ webhooks: any[] }> => {\n return this.request<{ webhooks: any[] }>(`/webhooks`);\n },\n create: async (payload: { url: string; events: string[] }): Promise<{ webhook: any; secret: string }> => {\n return this.request<{ webhook: any; secret: string }>(`/webhooks`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n update: async (id: string, payload: { isActive?: boolean; events?: string[] }): Promise<{ webhook: any }> => {\n return this.request<{ webhook: any }>(`/webhooks/${id}`, {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n });\n },\n rotateSecret: async (id: string): Promise<{ webhook: any; secret: string }> => {\n return this.request<{ webhook: any; secret: string }>(`/webhooks/${id}/rotate-secret`, {\n method: \"POST\",\n });\n },\n delete: async (id: string): Promise<{ success: boolean }> => {\n return this.request<{ success: boolean }>(`/webhooks/${id}`, {\n method: \"DELETE\",\n });\n },\n listDeliveries: async (id: string): Promise<{ deliveries: any[] }> => {\n return this.request<{ deliveries: any[] }>(`/webhooks/${id}/deliveries`);\n }\n };\n\n // ── AI APIs ───────────────────────────────────────────\n\n public readonly ai = {\n translate: async (payload: { text: string; targetLanguage: string }): Promise<{ success: boolean; translatedText: string }> => {\n return this.request<{ success: boolean; translatedText: string }>(`/ai/features/translate`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n },\n rewrite: async (payload: { text: string; instruction: string }): Promise<{ success: boolean; rewritten: string }> => {\n return this.request<{ success: boolean; rewritten: string }>(`/ai/features/rewrite`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n },\n qualityCheck: async (payload: { dataJson: any; schemaFields: any[] }): Promise<any> => {\n return this.request<any>(`/ai/features/quality-check`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n },\n bulkGenerate: async (payload: { typeId: string; schema: any; prompts: string[] }): Promise<{ success: boolean; data: any[] }> => {\n return this.request<{ success: boolean; data: any[] }>(`/ai/features/bulk-generate`, {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n }\n };\n\n // ── Analytics APIs ──────────────────────────────────────\n\n public readonly analytics = {\n getSummary: async (): Promise<{ \n totalEntries: number; \n totalMediaCount: number; \n totalMediaSizeMB: number; \n aiUsageThisMonth: number; \n aiUsageByProvider: { provider: string; calls: number }[]; \n contentDistribution: { type: string; count: number }[]; \n }> => {\n return this.request(`/analytics/summary`);\n }\n };\n\n // ── Audit Logs APIs ────────────────────────────────────\n\n public readonly audit = {\n list: async (options?: { limit?: number }): Promise<{ data: any[] }> => {\n const queryParams = new URLSearchParams();\n if (options?.limit !== undefined) queryParams.set(\"limit\", options.limit.toString());\n const queryString = queryParams.toString();\n return this.request<{ data: any[] }>(`/audit${queryString ? `?${queryString}` : \"\"}`);\n }\n };\n\n // ── Team Management APIs ───────────────────────────────\n\n public readonly team = {\n listMembers: async (): Promise<{ members: any[] }> => {\n return this.request<{ members: any[] }>(`/team`);\n },\n inviteMember: async (payload: { email: string; role: \"admin\" | \"editor\" }): Promise<{ message: string; membership: any }> => {\n return this.request<{ message: string; membership: any }>(`/team/invite`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n updateRole: async (userId: string, payload: { role: \"owner\" | \"admin\" | \"editor\" }): Promise<{ message: string; membership: any }> => {\n return this.request<{ message: string; membership: any }>(`/team/${userId}/role`, {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n });\n },\n removeMember: async (userId: string): Promise<{ message: string }> => {\n return this.request<{ message: string }>(`/team/${userId}`, {\n method: \"DELETE\",\n });\n }\n };\n\n // ── Settings APIs ──────────────────────────────────────\n \n public readonly workspaces = {\n list: async (): Promise<{ workspaces: any[] }> => {\n return this.request<{ workspaces: any[] }>(`/workspaces`);\n }\n };\n\n public readonly onboarding = {\n migrate: async (): Promise<{ success: boolean; error?: string }> => {\n return this.request<{ success: boolean; error?: string }>(`/onboarding/migrate`, {\n method: \"POST\"\n });\n }\n };\n\n public readonly settings = {\n updateDatabaseConnection: async (payload: { provider: \"supabase\" | \"neon\" | \"postgres\"; connectionUri: string }): Promise<{ success: boolean; error?: string }> => {\n return this.request<{ success: boolean; error?: string }>(`/onboarding/connect`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n },\n testConnection: async (payload: { connectionUri: string }): Promise<{ success: boolean; message?: string; error?: string }> => {\n return this.request<{ success: boolean; message?: string; error?: string }>(`/onboarding/test`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n }\n };\n}\n\n/**\n * Creates a new SchmaClient instance.\n */\nexport function createClient(config: SchmaClientConfig): SchmaClient {\n return new SchmaClient(config);\n}\nexport * from \"./mock\";\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schmadev/client",
3
- "version": "1.0.0",
3
+ "version": "1.0.3",
4
4
  "description": "Isomorphic client for Schma CMS",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -15,8 +15,13 @@
15
15
  "files": [
16
16
  "dist"
17
17
  ],
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "dev": "tsup --watch",
21
+ "clean": "rm -rf dist"
22
+ },
18
23
  "devDependencies": {
19
- "@schmadev/typescript-config": "0.0.0",
24
+ "@schmadev/typescript-config": "workspace:*",
20
25
  "@types/node": "^26.6.1",
21
26
  "eslint": "10.9.1",
22
27
  "tsup": "^8.3.0",
@@ -24,10 +29,5 @@
24
29
  },
25
30
  "dependencies": {
26
31
  "zod": "4.6.5"
27
- },
28
- "scripts": {
29
- "build": "tsup",
30
- "dev": "tsup --watch",
31
- "clean": "rm -rf dist"
32
32
  }
33
- }
33
+ }