@inneropen/marvin-sdk 1.0.2 → 1.3.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/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import { MarvinResource, MarvinEntry, MarvinAsset, MarvinCollection, MarvinEntryType, MarvinSite, GetResourcesOptions as GetResourcesOptions$1 } from './types/index.js';
2
2
  export { GetAssetsOptions, GetEntriesOptions, MarvinPublishResponse } from './types/index.js';
3
+ import { H as HttpClient } from './HttpClient-CLtgQGXH.js';
4
+ export { A as AuthStrategy, B as BearerTokenAuth, a as HttpClientConfig, N as NoAuth, S as SessionAuth } from './HttpClient-CLtgQGXH.js';
3
5
 
4
6
  /**
5
7
  * Marvin SDK Configuration
@@ -16,14 +18,109 @@ interface MarvinConfig {
16
18
  declare function createConfigFromEnv(overrides?: Partial<MarvinConfig>): MarvinConfig;
17
19
 
18
20
  /**
19
- * HTTP Client for Marvin API
21
+ * Base error class for all Marvin SDK errors
20
22
  */
23
+ declare class MarvinError extends Error {
24
+ readonly code?: string | undefined;
25
+ readonly statusCode?: number | undefined;
26
+ constructor(message: string, code?: string | undefined, statusCode?: number | undefined);
27
+ }
28
+ /**
29
+ * HTTP/API request errors
30
+ */
31
+ declare class MarvinApiError extends MarvinError {
32
+ readonly statusCode: number;
33
+ readonly endpoint: string;
34
+ readonly responseBody?: string | undefined;
35
+ constructor(message: string, statusCode: number, endpoint: string, responseBody?: string | undefined);
36
+ static fromResponse(status: number, statusText: string, endpoint: string, body?: string): MarvinApiError;
37
+ }
38
+ /**
39
+ * Authentication/authorization errors
40
+ */
41
+ declare class MarvinAuthError extends MarvinError {
42
+ constructor(message: string, statusCode?: number);
43
+ }
44
+ /**
45
+ * Configuration errors
46
+ */
47
+ declare class MarvinConfigError extends MarvinError {
48
+ constructor(message: string);
49
+ }
50
+ /**
51
+ * Validation errors
52
+ */
53
+ declare class MarvinValidationError extends MarvinError {
54
+ readonly field?: string | undefined;
55
+ constructor(message: string, field?: string | undefined);
56
+ }
21
57
 
22
- declare class MarvinHttpClient {
23
- private config;
58
+ /**
59
+ * Pagination response types and helpers
60
+ */
61
+ interface PaginationMeta {
62
+ total?: number;
63
+ page?: number;
64
+ limit?: number;
65
+ offset?: number;
66
+ hasMore?: boolean;
67
+ }
68
+ interface PaginatedResponse<T> {
69
+ data: T[];
70
+ meta?: PaginationMeta;
71
+ }
72
+ interface PaginationParams {
73
+ limit?: number;
74
+ offset?: number;
75
+ page?: number;
76
+ }
77
+ /**
78
+ * Create a paginated response
79
+ */
80
+ declare function createPaginatedResponse<T>(data: T[], meta?: PaginationMeta): PaginatedResponse<T>;
81
+ /**
82
+ * Extract data from paginated response
83
+ */
84
+ declare function extractData<T>(response: PaginatedResponse<T> | T[]): T[];
85
+ /**
86
+ * Check if response is paginated
87
+ */
88
+ declare function isPaginatedResponse<T>(response: PaginatedResponse<T> | T[]): response is PaginatedResponse<T>;
89
+ /**
90
+ * Calculate pagination offset from page number
91
+ */
92
+ declare function pageToOffset(page: number, limit: number): number;
93
+ /**
94
+ * Calculate page number from offset
95
+ */
96
+ declare function offsetToPage(offset: number, limit: number): number;
97
+
98
+ /**
99
+ * Simple in-memory cache for SDK data
100
+ */
101
+ declare class MarvinCache {
102
+ private duration;
103
+ private cache;
104
+ constructor(duration?: number);
105
+ get<T>(key: string): T | undefined;
106
+ set<T>(key: string, data: T): void;
107
+ has(key: string): boolean;
108
+ clear(): void;
109
+ delete(key: string): void;
110
+ }
111
+
112
+ /**
113
+ * HTTP Client for Marvin Publishing API
114
+ *
115
+ * Wrapper around core HttpClient for Publishing API specifics
116
+ */
117
+
118
+ declare class MarvinHttpClient extends HttpClient {
24
119
  constructor(config: MarvinConfig);
120
+ /**
121
+ * Fetch endpoint (backward compatibility)
122
+ */
25
123
  fetch<T>(endpoint: string): Promise<T>;
26
- buildQueryString(params: Record<string, string | number | undefined>): string;
27
124
  }
28
125
 
29
126
  /**
@@ -427,4 +524,4 @@ declare class MarvinClient {
427
524
  */
428
525
  declare function createMarvinClient(config?: Partial<MarvinConfig>): MarvinClient;
429
526
 
430
- export { Collection, Entry, GetResourcesOptions$1 as GetResourcesOptions, MarvinAsset, MarvinClient, MarvinCollection, type MarvinConfig, MarvinEntry, MarvinEntryType, MarvinResource, MarvinSite, Resource, Workspace, createConfigFromEnv, createMarvinClient };
527
+ export { Collection, Entry, GetResourcesOptions$1 as GetResourcesOptions, HttpClient, MarvinApiError, MarvinAsset, MarvinAuthError, MarvinCache, MarvinClient, MarvinCollection, type MarvinConfig, MarvinConfigError, MarvinEntry, MarvinEntryType, MarvinError, MarvinResource, MarvinSite, MarvinValidationError, type PaginatedResponse, type PaginationMeta, type PaginationParams, Resource, Workspace, createConfigFromEnv, createMarvinClient, createPaginatedResponse, extractData, isPaginatedResponse, offsetToPage, pageToOffset };
package/dist/index.js CHANGED
@@ -1,23 +1,24 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
- var __getOwnPropNames = Object.getOwnPropertyNames;
4
- var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __esm = (fn, res) => function __init() {
6
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
7
- };
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
1
+ import {
2
+ BearerTokenAuth,
3
+ HttpClient,
4
+ MarvinApiError,
5
+ MarvinAuthError,
6
+ MarvinCache,
7
+ MarvinConfigError,
8
+ MarvinError,
9
+ MarvinValidationError,
10
+ NoAuth,
11
+ SessionAuth,
12
+ __esm,
13
+ __export,
14
+ __toCommonJS,
15
+ createPaginatedResponse,
16
+ extractData,
17
+ init_core,
18
+ isPaginatedResponse,
19
+ offsetToPage,
20
+ pageToOffset
21
+ } from "./chunk-LQOFJMRJ.js";
21
22
 
22
23
  // src/client/config.ts
23
24
  var config_exports = {};
@@ -57,82 +58,20 @@ var MarvinHttpClient;
57
58
  var init_http = __esm({
58
59
  "src/client/http.ts"() {
59
60
  "use strict";
60
- MarvinHttpClient = class {
61
+ init_core();
62
+ MarvinHttpClient = class extends HttpClient {
61
63
  constructor(config) {
62
- this.config = config;
63
- }
64
- config;
65
- async fetch(endpoint) {
66
- const url = `${this.config.apiUrl}${endpoint}`;
67
- try {
68
- const response = await fetch(url, {
69
- headers: {
70
- "Authorization": `Bearer ${this.config.siteClientToken}`,
71
- "Content-Type": "application/json"
72
- }
73
- });
74
- if (!response.ok) {
75
- const errorText = await response.text();
76
- throw new Error(
77
- `Marvin API error: ${response.status} ${response.statusText} at ${endpoint}
78
- ${errorText}`
79
- );
80
- }
81
- return await response.json();
82
- } catch (error) {
83
- if (error instanceof Error) {
84
- const safeMessage = error.message.replace(
85
- this.config.siteClientToken,
86
- "[REDACTED]"
87
- );
88
- throw new Error(safeMessage);
89
- }
90
- throw error;
91
- }
92
- }
93
- buildQueryString(params) {
94
- const filtered = Object.entries(params).filter(([_, value]) => value !== void 0).map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`);
95
- return filtered.length > 0 ? `?${filtered.join("&")}` : "";
96
- }
97
- };
98
- }
99
- });
100
-
101
- // src/utils/cache.ts
102
- var MarvinCache;
103
- var init_cache = __esm({
104
- "src/utils/cache.ts"() {
105
- "use strict";
106
- MarvinCache = class {
107
- constructor(duration = 5 * 60 * 1e3) {
108
- this.duration = duration;
109
- }
110
- duration;
111
- cache = /* @__PURE__ */ new Map();
112
- get(key) {
113
- const entry = this.cache.get(key);
114
- if (!entry) return void 0;
115
- const age = Date.now() - entry.timestamp;
116
- if (age > this.duration) {
117
- this.cache.delete(key);
118
- return void 0;
119
- }
120
- return entry.data;
121
- }
122
- set(key, data) {
123
- this.cache.set(key, {
124
- data,
125
- timestamp: Date.now()
64
+ super({
65
+ baseUrl: config.apiUrl,
66
+ auth: new BearerTokenAuth(config.siteClientToken),
67
+ credentials: "same-origin"
126
68
  });
127
69
  }
128
- has(key) {
129
- return this.get(key) !== void 0;
130
- }
131
- clear() {
132
- this.cache.clear();
133
- }
134
- delete(key) {
135
- this.cache.delete(key);
70
+ /**
71
+ * Fetch endpoint (backward compatibility)
72
+ */
73
+ async fetch(endpoint) {
74
+ return this.get(endpoint);
136
75
  }
137
76
  };
138
77
  }
@@ -241,11 +180,12 @@ var init_entries = __esm({
241
180
  entry_type: options.entryType,
242
181
  collection: options.collection,
243
182
  limit: options.limit,
244
- offset: options.offset,
245
- status: options.status || "published"
183
+ offset: options.offset
184
+ // Don't send status - backend always returns published
246
185
  });
247
186
  const endpoint = `/api/publish/${this.workspaceSlug}/entries${queryString}`;
248
- return this.http.fetch(endpoint);
187
+ const response = await this.http.fetch(endpoint);
188
+ return response.data || [];
249
189
  }
250
190
  /**
251
191
  * Get a single entry by slug
@@ -329,8 +269,7 @@ var init_collection = __esm({
329
269
  * Get all entries in this collection
330
270
  */
331
271
  async entries() {
332
- const endpoint = `/api/publish/${this.workspaceSlug}/collections/${this.data.slug}/entries`;
333
- return this.http.fetch(endpoint);
272
+ return this.data.entries || [];
334
273
  }
335
274
  /**
336
275
  * Get assets in this collection (future)
@@ -372,7 +311,8 @@ var init_collections = __esm({
372
311
  */
373
312
  async list() {
374
313
  const endpoint = `/api/publish/${this.workspaceSlug}/collections`;
375
- return this.http.fetch(endpoint);
314
+ const response = await this.http.fetch(endpoint);
315
+ return response.data || [];
376
316
  }
377
317
  /**
378
318
  * Get a single collection by slug
@@ -415,7 +355,8 @@ var init_assets = __esm({
415
355
  offset: options.offset
416
356
  });
417
357
  const endpoint = `/api/publish/${this.workspaceSlug}/assets${queryString}`;
418
- return this.http.fetch(endpoint);
358
+ const response = await this.http.fetch(endpoint);
359
+ return response.data || [];
419
360
  }
420
361
  /**
421
362
  * Convenience: Get all images
@@ -530,7 +471,8 @@ var init_resources = __esm({
530
471
  offset: options.offset
531
472
  });
532
473
  const endpoint = `/api/publish/${this.workspaceSlug}/resources${queryString}`;
533
- return this.http.fetch(endpoint);
474
+ const response = await this.http.fetch(endpoint);
475
+ return response.data || [];
534
476
  }
535
477
  /**
536
478
  * Get a single resource by slug
@@ -624,7 +566,7 @@ var init_marvin = __esm({
624
566
  "use strict";
625
567
  init_config();
626
568
  init_http();
627
- init_cache();
569
+ init_core();
628
570
  init_workspace();
629
571
  MarvinClient = class {
630
572
  constructor(config) {
@@ -825,6 +767,7 @@ var init_marvin = __esm({
825
767
  // src/index.ts
826
768
  init_marvin();
827
769
  init_config();
770
+ init_core();
828
771
  init_workspace();
829
772
  init_entry();
830
773
  init_collection();
@@ -836,11 +779,26 @@ function createMarvinClient(config) {
836
779
  return new MarvinClient2(finalConfig);
837
780
  }
838
781
  export {
782
+ BearerTokenAuth,
839
783
  Collection,
840
784
  Entry,
785
+ HttpClient,
786
+ MarvinApiError,
787
+ MarvinAuthError,
788
+ MarvinCache,
841
789
  MarvinClient,
790
+ MarvinConfigError,
791
+ MarvinError,
792
+ MarvinValidationError,
793
+ NoAuth,
842
794
  Resource,
795
+ SessionAuth,
843
796
  Workspace,
844
797
  createConfigFromEnv,
845
- createMarvinClient
798
+ createMarvinClient,
799
+ createPaginatedResponse,
800
+ extractData,
801
+ isPaginatedResponse,
802
+ offsetToPage,
803
+ pageToOffset
846
804
  };