@actuate-media/client 0.2.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.
@@ -0,0 +1,83 @@
1
+ import type { ActuateConfigLike, ActuateDocument, ActuateList, CollectionData, GlobalData, ListQuery } from './types.js';
2
+ export type { ActuateConfigLike, ActuateDocument, ActuateList, ActuateFieldDefinition, CollectionData, GlobalData, FieldToType, FieldsToData, ListQuery, } from './types.js';
3
+ export interface ActuateClientOptions {
4
+ /** Base URL of the CMS (e.g. `https://maidpro.co`). `/api/cms` is appended automatically. */
5
+ url: string;
6
+ /** API key with at least `read` scope on the collections you want to query. */
7
+ apiKey?: string;
8
+ /** Override the global `fetch` implementation (e.g. in tests, or to bind a custom retry policy). */
9
+ fetchImpl?: typeof fetch;
10
+ /**
11
+ * Optional default cache settings forwarded to `fetch` as request init.
12
+ * Used by `next` integration to set `next: { revalidate, tags }`.
13
+ */
14
+ defaultCache?: {
15
+ revalidate?: number | false;
16
+ tags?: string[];
17
+ };
18
+ /** Additional headers attached to every request (e.g. a tenant header). */
19
+ headers?: Record<string, string>;
20
+ }
21
+ export declare class ActuateError extends Error {
22
+ readonly status: number;
23
+ readonly response: unknown;
24
+ constructor(message: string, status: number, response?: unknown);
25
+ }
26
+ /**
27
+ * Type-safe client for the Actuate CMS REST API.
28
+ *
29
+ * The class is intentionally generic over a config type so consumers get
30
+ * field-level autocomplete when they pass their `typeof actuateConfig`
31
+ * as the type parameter. Consumers who don't pass a config still get a
32
+ * working — but loosely-typed — client.
33
+ */
34
+ export declare class ActuateClient<Config extends ActuateConfigLike = ActuateConfigLike> {
35
+ readonly url: string;
36
+ readonly apiKey?: string;
37
+ private readonly fetchImpl;
38
+ private readonly defaultCache?;
39
+ private readonly extraHeaders?;
40
+ constructor(opts: ActuateClientOptions);
41
+ private headers;
42
+ private request;
43
+ /**
44
+ * List documents in a collection. Returns `{ docs, total, page, pageSize, totalPages }`.
45
+ *
46
+ * @example
47
+ * const { docs } = await client.list('posts', { status: 'PUBLISHED' })
48
+ */
49
+ list<Slug extends keyof NonNullable<Config['collections']> & string>(collection: Slug, query?: ListQuery, init?: {
50
+ signal?: AbortSignal;
51
+ cache?: ActuateClientOptions['defaultCache'];
52
+ }): Promise<ActuateList<CollectionData<Config, Slug>>>;
53
+ /** Fetch a single document by ID. */
54
+ get<Slug extends keyof NonNullable<Config['collections']> & string>(collection: Slug, id: string, init?: {
55
+ populate?: string;
56
+ signal?: AbortSignal;
57
+ cache?: ActuateClientOptions['defaultCache'];
58
+ }): Promise<ActuateDocument<CollectionData<Config, Slug>>>;
59
+ /** Resolve a public URL path (e.g. `/blog/my-post`) to its document. */
60
+ resolve(path: string, init?: {
61
+ signal?: AbortSignal;
62
+ cache?: ActuateClientOptions['defaultCache'];
63
+ }): Promise<ActuateDocument | null>;
64
+ /** Fetch a global by slug. */
65
+ global<Slug extends keyof NonNullable<Config['globals']> & string>(slug: Slug, init?: {
66
+ signal?: AbortSignal;
67
+ cache?: ActuateClientOptions['defaultCache'];
68
+ }): Promise<GlobalData<Config, Slug>>;
69
+ listMedia(query?: {
70
+ page?: number;
71
+ pageSize?: number;
72
+ search?: string;
73
+ }): Promise<{
74
+ docs: any[];
75
+ total: number;
76
+ }>;
77
+ }
78
+ /**
79
+ * Convenience factory. Equivalent to `new ActuateClient(opts)` but reads
80
+ * nicely as `const cms = createClient<typeof config>({...})`.
81
+ */
82
+ export declare function createClient<Config extends ActuateConfigLike = ActuateConfigLike>(opts: ActuateClientOptions): ActuateClient<Config>;
83
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,169 @@
1
+ export class ActuateError extends Error {
2
+ status;
3
+ response;
4
+ constructor(message, status, response) {
5
+ super(message);
6
+ this.name = 'ActuateError';
7
+ this.status = status;
8
+ this.response = response;
9
+ }
10
+ }
11
+ /**
12
+ * Type-safe client for the Actuate CMS REST API.
13
+ *
14
+ * The class is intentionally generic over a config type so consumers get
15
+ * field-level autocomplete when they pass their `typeof actuateConfig`
16
+ * as the type parameter. Consumers who don't pass a config still get a
17
+ * working — but loosely-typed — client.
18
+ */
19
+ export class ActuateClient {
20
+ url;
21
+ apiKey;
22
+ fetchImpl;
23
+ defaultCache;
24
+ extraHeaders;
25
+ constructor(opts) {
26
+ if (!opts.url)
27
+ throw new Error('ActuateClient: `url` is required');
28
+ this.url = opts.url.replace(/\/+$/, '');
29
+ this.apiKey = opts.apiKey;
30
+ this.fetchImpl = opts.fetchImpl ?? fetch;
31
+ this.defaultCache = opts.defaultCache;
32
+ this.extraHeaders = opts.headers;
33
+ }
34
+ headers(extra) {
35
+ return {
36
+ Accept: 'application/json',
37
+ ...(this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}),
38
+ ...this.extraHeaders,
39
+ ...extra,
40
+ };
41
+ }
42
+ async request(method, path, init) {
43
+ let target = `${this.url}/api/cms${path}`;
44
+ if (init?.query) {
45
+ const params = new URLSearchParams();
46
+ for (const [k, v] of Object.entries(init.query)) {
47
+ if (v !== undefined)
48
+ params.set(k, String(v));
49
+ }
50
+ const q = params.toString();
51
+ if (q)
52
+ target += `?${q}`;
53
+ }
54
+ const fetchInit = {
55
+ method,
56
+ headers: this.headers(init?.body ? { 'Content-Type': 'application/json' } : undefined),
57
+ signal: init?.signal,
58
+ };
59
+ if (init?.body !== undefined) {
60
+ fetchInit.body = JSON.stringify(init.body);
61
+ }
62
+ const cache = init?.cache ?? this.defaultCache;
63
+ if (cache) {
64
+ if (cache.revalidate === false) {
65
+ ;
66
+ fetchInit.cache = 'no-store';
67
+ }
68
+ else if (typeof cache.revalidate === 'number' || cache.tags) {
69
+ // Next.js fetch extensions are ignored by other runtimes, which is
70
+ // safe — they're additive metadata.
71
+ fetchInit.next = {
72
+ ...(typeof cache.revalidate === 'number' ? { revalidate: cache.revalidate } : {}),
73
+ ...(cache.tags ? { tags: cache.tags } : {}),
74
+ };
75
+ }
76
+ }
77
+ const res = await this.fetchImpl(target, fetchInit);
78
+ const text = await res.text();
79
+ let parsed = null;
80
+ if (text) {
81
+ try {
82
+ parsed = JSON.parse(text);
83
+ }
84
+ catch {
85
+ // non-JSON body — keep raw text for the error.
86
+ }
87
+ }
88
+ if (!res.ok) {
89
+ const msg = parsed?.error ?? `${method} ${path} failed: ${res.status}`;
90
+ throw new ActuateError(msg, res.status, parsed ?? text);
91
+ }
92
+ return parsed;
93
+ }
94
+ // ─── Collections ─────────────────────────────────────────────────────
95
+ /**
96
+ * List documents in a collection. Returns `{ docs, total, page, pageSize, totalPages }`.
97
+ *
98
+ * @example
99
+ * const { docs } = await client.list('posts', { status: 'PUBLISHED' })
100
+ */
101
+ list(collection, query, init) {
102
+ const flatFilters = {};
103
+ if (query?.filters) {
104
+ for (const [k, v] of Object.entries(query.filters)) {
105
+ flatFilters[`filter.${k}`] = v;
106
+ }
107
+ }
108
+ return this.request('GET', `/collections/${encodeURIComponent(collection)}`, {
109
+ query: {
110
+ page: query?.page,
111
+ pageSize: query?.pageSize,
112
+ status: query?.status,
113
+ locale: query?.locale,
114
+ search: query?.search,
115
+ populate: query?.populate,
116
+ sort: query?.sort,
117
+ ...flatFilters,
118
+ },
119
+ signal: init?.signal,
120
+ ...(init?.cache ? { cache: init.cache } : {}),
121
+ }).then((r) => r.data);
122
+ }
123
+ /** Fetch a single document by ID. */
124
+ get(collection, id, init) {
125
+ return this.request('GET', `/collections/${encodeURIComponent(collection)}/${encodeURIComponent(id)}`, {
126
+ query: init?.populate ? { populate: init.populate } : undefined,
127
+ signal: init?.signal,
128
+ ...(init?.cache ? { cache: init.cache } : {}),
129
+ }).then((r) => r.data);
130
+ }
131
+ /** Resolve a public URL path (e.g. `/blog/my-post`) to its document. */
132
+ async resolve(path, init) {
133
+ try {
134
+ const response = await this.request('GET', '/resolve', {
135
+ query: { path },
136
+ signal: init?.signal,
137
+ ...(init?.cache ? { cache: init.cache } : {}),
138
+ });
139
+ return response.data;
140
+ }
141
+ catch (err) {
142
+ if (err instanceof ActuateError && err.status === 404)
143
+ return null;
144
+ throw err;
145
+ }
146
+ }
147
+ // ─── Globals ─────────────────────────────────────────────────────────
148
+ /** Fetch a global by slug. */
149
+ global(slug, init) {
150
+ return this.request('GET', `/globals/${encodeURIComponent(slug)}`, {
151
+ signal: init?.signal,
152
+ ...(init?.cache ? { cache: init.cache } : {}),
153
+ }).then((r) => r.data);
154
+ }
155
+ // ─── Media ───────────────────────────────────────────────────────────
156
+ listMedia(query) {
157
+ return this.request('GET', '/media', {
158
+ query: query,
159
+ }).then((r) => r.data);
160
+ }
161
+ }
162
+ /**
163
+ * Convenience factory. Equivalent to `new ActuateClient(opts)` but reads
164
+ * nicely as `const cms = createClient<typeof config>({...})`.
165
+ */
166
+ export function createClient(opts) {
167
+ return new ActuateClient(opts);
168
+ }
169
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/next.d.ts ADDED
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Next.js server helpers for the Actuate client SDK.
3
+ *
4
+ * These are thin wrappers around `ActuateClient` that default to
5
+ * Next-friendly cache semantics. Use them inside Server Components,
6
+ * Route Handlers, or `generateStaticParams` for tag-based revalidation
7
+ * to play nicely with Actuate webhooks.
8
+ *
9
+ * On non-Next runtimes (e.g. Hono, Bun, Cloudflare Workers) the same
10
+ * methods work — the `next` fetch options become inert metadata.
11
+ */
12
+ import { ActuateClient } from './index.js';
13
+ import type { ActuateClientOptions, ActuateDocument } from './index.js';
14
+ import type { ActuateConfigLike, CollectionData, GlobalData } from './types.js';
15
+ export interface NextActuateClientOptions extends ActuateClientOptions {
16
+ /** Default revalidation seconds for every request. Pass `false` for `cache: 'no-store'`. */
17
+ revalidate?: number | false;
18
+ /**
19
+ * Default cache tags applied to every request. Use with
20
+ * `revalidateTag()` from `next/cache` to invalidate from webhooks.
21
+ * Defaults to `['actuate']` so a single `revalidateTag('actuate')`
22
+ * call invalidates the whole CMS layer.
23
+ */
24
+ tags?: string[];
25
+ }
26
+ /**
27
+ * Build an Actuate client preconfigured for Next.js fetch semantics.
28
+ *
29
+ * @example
30
+ * // app/lib/cms.ts
31
+ * import { createNextClient } from '@actuate-media/client/next'
32
+ * import type config from '@/actuate.config'
33
+ * export const cms = createNextClient<typeof config>({
34
+ * url: process.env.ACTUATE_URL!,
35
+ * apiKey: process.env.ACTUATE_API_KEY,
36
+ * revalidate: 60,
37
+ * tags: ['actuate'],
38
+ * })
39
+ */
40
+ export declare function createNextClient<Config extends ActuateConfigLike = ActuateConfigLike>(opts: NextActuateClientOptions): ActuateClient<Config>;
41
+ /**
42
+ * Tag-helper for `next/cache` `revalidateTag` calls. Returns the standard
43
+ * tag the SDK applies for a given collection or global.
44
+ */
45
+ export declare function actuateTag(kind: 'collection' | 'global', slug: string): string;
46
+ /**
47
+ * Quick-helper to fetch a single document by URL path inside a Server
48
+ * Component. Returns `null` for a 404.
49
+ */
50
+ export declare function resolvePagePath<Config extends ActuateConfigLike>(client: ActuateClient<Config>, path: string): Promise<ActuateDocument | null>;
51
+ export type { ActuateClientOptions, ActuateDocument, ActuateList } from './index.js';
52
+ export { ActuateClient, ActuateError, createClient } from './index.js';
53
+ export type CollectionDataOf<Config extends ActuateConfigLike, Slug extends keyof NonNullable<Config['collections']> & string> = CollectionData<Config, Slug>;
54
+ export type GlobalDataOf<Config extends ActuateConfigLike, Slug extends keyof NonNullable<Config['globals']> & string> = GlobalData<Config, Slug>;
55
+ export type { ListQuery, CollectionData, GlobalData } from './types.js';
56
+ //# sourceMappingURL=next.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../src/next.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAA;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAe,MAAM,YAAY,CAAA;AACpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAa,MAAM,YAAY,CAAA;AAE1F,MAAM,WAAW,wBAAyB,SAAQ,oBAAoB;IACpE,4FAA4F;IAC5F,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAC3B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,SAAS,iBAAiB,GAAG,iBAAiB,EACnF,IAAI,EAAE,wBAAwB,GAC7B,aAAa,CAAC,MAAM,CAAC,CAUvB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,MAAM,SAAS,iBAAiB,EACpE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAOjC;AAGD,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACpF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAGtE,MAAM,MAAM,gBAAgB,CAC1B,MAAM,SAAS,iBAAiB,EAChC,IAAI,SAAS,MAAM,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,MAAM,IAC5D,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AAEhC,MAAM,MAAM,YAAY,CACtB,MAAM,SAAS,iBAAiB,EAChC,IAAI,SAAS,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,IACxD,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AAE5B,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA"}
package/dist/next.js ADDED
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Next.js server helpers for the Actuate client SDK.
3
+ *
4
+ * These are thin wrappers around `ActuateClient` that default to
5
+ * Next-friendly cache semantics. Use them inside Server Components,
6
+ * Route Handlers, or `generateStaticParams` for tag-based revalidation
7
+ * to play nicely with Actuate webhooks.
8
+ *
9
+ * On non-Next runtimes (e.g. Hono, Bun, Cloudflare Workers) the same
10
+ * methods work — the `next` fetch options become inert metadata.
11
+ */
12
+ import { createClient } from './index.js';
13
+ /**
14
+ * Build an Actuate client preconfigured for Next.js fetch semantics.
15
+ *
16
+ * @example
17
+ * // app/lib/cms.ts
18
+ * import { createNextClient } from '@actuate-media/client/next'
19
+ * import type config from '@/actuate.config'
20
+ * export const cms = createNextClient<typeof config>({
21
+ * url: process.env.ACTUATE_URL!,
22
+ * apiKey: process.env.ACTUATE_API_KEY,
23
+ * revalidate: 60,
24
+ * tags: ['actuate'],
25
+ * })
26
+ */
27
+ export function createNextClient(opts) {
28
+ const { revalidate, tags, ...rest } = opts;
29
+ return createClient({
30
+ ...rest,
31
+ defaultCache: {
32
+ ...(typeof revalidate === 'number' ? { revalidate } : {}),
33
+ ...(revalidate === false ? { revalidate: false } : {}),
34
+ tags: tags ?? ['actuate'],
35
+ },
36
+ });
37
+ }
38
+ /**
39
+ * Tag-helper for `next/cache` `revalidateTag` calls. Returns the standard
40
+ * tag the SDK applies for a given collection or global.
41
+ */
42
+ export function actuateTag(kind, slug) {
43
+ return `actuate:${kind}:${slug}`;
44
+ }
45
+ /**
46
+ * Quick-helper to fetch a single document by URL path inside a Server
47
+ * Component. Returns `null` for a 404.
48
+ */
49
+ export async function resolvePagePath(client, path) {
50
+ try {
51
+ return await client.resolve(path);
52
+ }
53
+ catch (err) {
54
+ if (err?.status === 404)
55
+ return null;
56
+ throw err;
57
+ }
58
+ }
59
+ export { ActuateClient, ActuateError, createClient } from './index.js';
60
+ //# sourceMappingURL=next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.js","sourceRoot":"","sources":["../src/next.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAiB,YAAY,EAAE,MAAM,YAAY,CAAA;AAgBxD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAA8B;IAE9B,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;IAC1C,OAAO,YAAY,CAAS;QAC1B,GAAG,IAAI;QACP,YAAY,EAAE;YACZ,GAAG,CAAC,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,IAAI,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC;SAC1B;KACF,CAAC,CAAA;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAA6B,EAAE,IAAY;IACpE,OAAO,WAAW,IAAI,IAAI,IAAI,EAAE,CAAA;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAA6B,EAC7B,IAAY;IAEZ,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA2B,EAAE,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA;QAC7D,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AAID,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,32 @@
1
+ import type { ActuateClient, ActuateClientOptions, ActuateDocument, ActuateList } from './index.js';
2
+ import type { ActuateConfigLike, CollectionData, GlobalData, ListQuery } from './types.js';
3
+ export interface UseQueryResult<T> {
4
+ data: T | undefined;
5
+ error: Error | undefined;
6
+ isLoading: boolean;
7
+ /** Manually re-run the query. Useful for mutations + refetch flows. */
8
+ refetch: () => void;
9
+ }
10
+ interface BaseHookOptions {
11
+ /** Skip fetching when false. Lets consumers conditionally enable a hook. */
12
+ enabled?: boolean;
13
+ }
14
+ /**
15
+ * Lightweight client-side hook for a collection list. We deliberately keep
16
+ * this dependency-free (no SWR/React Query) so the SDK stays embeddable in
17
+ * any React app. Consumers who want richer caching can call the underlying
18
+ * client methods directly inside their preferred data-fetching library.
19
+ */
20
+ export declare function useCollection<Config extends ActuateConfigLike, Slug extends keyof NonNullable<Config['collections']> & string>(client: ActuateClient<Config>, collection: Slug, query?: ListQuery, opts?: BaseHookOptions): UseQueryResult<ActuateList<CollectionData<Config, Slug>>>;
21
+ /**
22
+ * Fetch a single document by ID. Pass `null`/`undefined` for the id to
23
+ * disable the hook (no fetch happens until a real id is supplied).
24
+ */
25
+ export declare function useContent<Config extends ActuateConfigLike, Slug extends keyof NonNullable<Config['collections']> & string>(client: ActuateClient<Config>, collection: Slug, id: string | null | undefined, init?: {
26
+ populate?: string;
27
+ } & BaseHookOptions): UseQueryResult<ActuateDocument<CollectionData<Config, Slug>>>;
28
+ /** Fetch a global by slug. */
29
+ export declare function useGlobal<Config extends ActuateConfigLike, Slug extends keyof NonNullable<Config['globals']> & string>(client: ActuateClient<Config>, slug: Slug, opts?: BaseHookOptions): UseQueryResult<GlobalData<Config, Slug>>;
30
+ export { ActuateClient, createClient, ActuateError } from './index.js';
31
+ export type { ActuateClientOptions };
32
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACnG,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE1F,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,GAAG,SAAS,CAAA;IACnB,KAAK,EAAE,KAAK,GAAG,SAAS,CAAA;IACxB,SAAS,EAAE,OAAO,CAAA;IAClB,uEAAuE;IACvE,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,UAAU,eAAe;IACvB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,SAAS,iBAAiB,EAChC,IAAI,SAAS,MAAM,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,MAAM,EAE9D,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,UAAU,EAAE,IAAI,EAChB,KAAK,CAAC,EAAE,SAAS,EACjB,IAAI,CAAC,EAAE,eAAe,GACrB,cAAc,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CA2C3D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,MAAM,SAAS,iBAAiB,EAChC,IAAI,SAAS,MAAM,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,MAAM,EAE9D,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,UAAU,EAAE,IAAI,EAChB,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC7B,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,eAAe,GAC7C,cAAc,CAAC,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAqD/D;AAED,8BAA8B;AAC9B,wBAAgB,SAAS,CACvB,MAAM,SAAS,iBAAiB,EAChC,IAAI,SAAS,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,EAE1D,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,IAAI,EAAE,IAAI,EACV,IAAI,CAAC,EAAE,eAAe,GACrB,cAAc,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CA2C1C;AAGD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACtE,YAAY,EAAE,oBAAoB,EAAE,CAAA"}
package/dist/react.js ADDED
@@ -0,0 +1,156 @@
1
+ 'use client';
2
+ import { useEffect, useRef, useState } from 'react';
3
+ /**
4
+ * Lightweight client-side hook for a collection list. We deliberately keep
5
+ * this dependency-free (no SWR/React Query) so the SDK stays embeddable in
6
+ * any React app. Consumers who want richer caching can call the underlying
7
+ * client methods directly inside their preferred data-fetching library.
8
+ */
9
+ export function useCollection(client, collection, query, opts) {
10
+ const [data, setData] = useState(undefined);
11
+ const [error, setError] = useState(undefined);
12
+ const [isLoading, setIsLoading] = useState(opts?.enabled !== false);
13
+ const versionRef = useRef(0);
14
+ const key = JSON.stringify({ collection, query, enabled: opts?.enabled ?? true });
15
+ const run = () => {
16
+ if (opts?.enabled === false) {
17
+ setIsLoading(false);
18
+ return;
19
+ }
20
+ const controller = new AbortController();
21
+ versionRef.current += 1;
22
+ const version = versionRef.current;
23
+ setIsLoading(true);
24
+ setError(undefined);
25
+ client
26
+ .list(collection, query, { signal: controller.signal })
27
+ .then((result) => {
28
+ if (version !== versionRef.current)
29
+ return;
30
+ setData(result);
31
+ })
32
+ .catch((err) => {
33
+ if (controller.signal.aborted)
34
+ return;
35
+ if (version !== versionRef.current)
36
+ return;
37
+ setError(err instanceof Error ? err : new Error(String(err)));
38
+ })
39
+ .finally(() => {
40
+ if (version !== versionRef.current)
41
+ return;
42
+ setIsLoading(false);
43
+ });
44
+ return () => controller.abort();
45
+ };
46
+ useEffect(() => {
47
+ const cleanup = run();
48
+ return cleanup;
49
+ // eslint-disable-next-line react-hooks/exhaustive-deps
50
+ }, [key]);
51
+ return { data, error, isLoading, refetch: run };
52
+ }
53
+ /**
54
+ * Fetch a single document by ID. Pass `null`/`undefined` for the id to
55
+ * disable the hook (no fetch happens until a real id is supplied).
56
+ */
57
+ export function useContent(client, collection, id, init) {
58
+ const [data, setData] = useState(undefined);
59
+ const [error, setError] = useState(undefined);
60
+ const [isLoading, setIsLoading] = useState(Boolean(id) && init?.enabled !== false);
61
+ const versionRef = useRef(0);
62
+ const key = JSON.stringify({
63
+ collection,
64
+ id,
65
+ populate: init?.populate,
66
+ enabled: init?.enabled ?? true,
67
+ });
68
+ const run = () => {
69
+ if (!id || init?.enabled === false) {
70
+ setIsLoading(false);
71
+ return;
72
+ }
73
+ const controller = new AbortController();
74
+ versionRef.current += 1;
75
+ const version = versionRef.current;
76
+ setIsLoading(true);
77
+ setError(undefined);
78
+ client
79
+ .get(collection, id, {
80
+ ...(init?.populate ? { populate: init.populate } : {}),
81
+ signal: controller.signal,
82
+ })
83
+ .then((doc) => {
84
+ if (version !== versionRef.current)
85
+ return;
86
+ setData(doc);
87
+ })
88
+ .catch((err) => {
89
+ if (controller.signal.aborted)
90
+ return;
91
+ if (version !== versionRef.current)
92
+ return;
93
+ setError(err instanceof Error ? err : new Error(String(err)));
94
+ })
95
+ .finally(() => {
96
+ if (version !== versionRef.current)
97
+ return;
98
+ setIsLoading(false);
99
+ });
100
+ return () => controller.abort();
101
+ };
102
+ useEffect(() => {
103
+ const cleanup = run();
104
+ return cleanup;
105
+ // eslint-disable-next-line react-hooks/exhaustive-deps
106
+ }, [key]);
107
+ return { data, error, isLoading, refetch: run };
108
+ }
109
+ /** Fetch a global by slug. */
110
+ export function useGlobal(client, slug, opts) {
111
+ const [data, setData] = useState(undefined);
112
+ const [error, setError] = useState(undefined);
113
+ const [isLoading, setIsLoading] = useState(opts?.enabled !== false);
114
+ const versionRef = useRef(0);
115
+ const key = JSON.stringify({ slug, enabled: opts?.enabled ?? true });
116
+ const run = () => {
117
+ if (opts?.enabled === false) {
118
+ setIsLoading(false);
119
+ return;
120
+ }
121
+ const controller = new AbortController();
122
+ versionRef.current += 1;
123
+ const version = versionRef.current;
124
+ setIsLoading(true);
125
+ setError(undefined);
126
+ client
127
+ .global(slug, { signal: controller.signal })
128
+ .then((result) => {
129
+ if (version !== versionRef.current)
130
+ return;
131
+ setData(result);
132
+ })
133
+ .catch((err) => {
134
+ if (controller.signal.aborted)
135
+ return;
136
+ if (version !== versionRef.current)
137
+ return;
138
+ setError(err instanceof Error ? err : new Error(String(err)));
139
+ })
140
+ .finally(() => {
141
+ if (version !== versionRef.current)
142
+ return;
143
+ setIsLoading(false);
144
+ });
145
+ return () => controller.abort();
146
+ };
147
+ useEffect(() => {
148
+ const cleanup = run();
149
+ return cleanup;
150
+ // eslint-disable-next-line react-hooks/exhaustive-deps
151
+ }, [key]);
152
+ return { data, error, isLoading, refetch: run };
153
+ }
154
+ // Re-export the parent module so consumers can `import { useContent, createClient } from '@actuate-media/client/react'`.
155
+ export { ActuateClient, createClient, ActuateError } from './index.js';
156
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Type system for the Actuate client SDK.
3
+ *
4
+ * The key trick: callers pass their `actuate.config.ts` as a generic type
5
+ * parameter to `createClient<typeof config>()`. The SDK then surfaces a
6
+ * typed `client.<collection>` accessor where every field's TS type is
7
+ * derived from the config. No codegen, no `actuate.types.d.ts` file —
8
+ * the user's source of truth is the config itself.
9
+ *
10
+ * If a consumer can't (or won't) pass their config, the client falls back
11
+ * to a generic `Record<string, unknown>` shape so calls still type-check.
12
+ */
13
+ export interface ActuateFieldDefinition {
14
+ type: string;
15
+ required?: boolean;
16
+ defaultValue?: unknown;
17
+ options?: Array<{
18
+ value: string;
19
+ label?: string;
20
+ }> | readonly string[];
21
+ fields?: Record<string, ActuateFieldDefinition>;
22
+ relationTo?: string;
23
+ }
24
+ /** Map a single field's declared `type` to the corresponding TypeScript type. */
25
+ export type FieldToType<F extends ActuateFieldDefinition> = F['type'] extends 'text' | 'richText' | 'slug' | 'url' | 'email' | 'color' | 'date' ? string : F['type'] extends 'number' ? number : F['type'] extends 'boolean' ? boolean : F['type'] extends 'json' ? unknown : F['type'] extends 'select' ? F extends {
26
+ options: ReadonlyArray<{
27
+ value: infer V;
28
+ }>;
29
+ } ? V : F extends {
30
+ options: readonly string[];
31
+ } ? F['options'][number] : string : F['type'] extends 'relationship' ? string : F['type'] extends 'media' ? {
32
+ id: string;
33
+ url: string;
34
+ alt?: string;
35
+ } : F['type'] extends 'array' ? F extends {
36
+ fields: infer SF extends Record<string, ActuateFieldDefinition>;
37
+ } ? Array<FieldsToData<SF>> : unknown[] : F['type'] extends 'blocks' ? Array<Record<string, unknown>> : unknown;
38
+ /** Map a fields record to the `data` shape persisted for that collection. */
39
+ export type FieldsToData<F extends Record<string, ActuateFieldDefinition>> = {
40
+ [K in keyof F]?: FieldToType<F[K]>;
41
+ };
42
+ /** The wire shape of a single document returned by the CMS. */
43
+ export interface ActuateDocument<TData = Record<string, unknown>> {
44
+ id: string;
45
+ collection: string;
46
+ status: 'DRAFT' | 'PUBLISHED' | 'ARCHIVED' | 'SCHEDULED';
47
+ title?: string;
48
+ slug?: string;
49
+ locale?: string;
50
+ data: TData;
51
+ publishedAt?: string | null;
52
+ createdAt: string;
53
+ updatedAt: string;
54
+ /** Page-builder collections additionally carry a `layout` + `pageSettings`. */
55
+ layout?: unknown;
56
+ pageSettings?: Record<string, unknown>;
57
+ }
58
+ /** Pagination envelope for list endpoints. */
59
+ export interface ActuateList<TData = Record<string, unknown>> {
60
+ docs: Array<ActuateDocument<TData>>;
61
+ total: number;
62
+ page: number;
63
+ pageSize: number;
64
+ totalPages: number;
65
+ }
66
+ export interface ActuateConfigLike {
67
+ collections?: Record<string, {
68
+ fields: Record<string, ActuateFieldDefinition>;
69
+ type?: 'page' | 'post';
70
+ }>;
71
+ globals?: Record<string, {
72
+ fields: Record<string, ActuateFieldDefinition>;
73
+ }>;
74
+ }
75
+ /** Extract the data-shape for a given collection key from a config. */
76
+ export type CollectionData<Config extends ActuateConfigLike, Slug extends keyof NonNullable<Config['collections']>> = FieldsToData<NonNullable<Config['collections']>[Slug]['fields']>;
77
+ /** Extract the data-shape for a given global key from a config. */
78
+ export type GlobalData<Config extends ActuateConfigLike, Slug extends keyof NonNullable<Config['globals']>> = FieldsToData<NonNullable<Config['globals']>[Slug]['fields']>;
79
+ export interface ListQuery {
80
+ page?: number;
81
+ pageSize?: number;
82
+ status?: 'DRAFT' | 'PUBLISHED' | 'ARCHIVED' | 'SCHEDULED';
83
+ locale?: string;
84
+ search?: string;
85
+ populate?: string;
86
+ /** Arbitrary filter columns the CMS allows (status, locale, folderId, …). */
87
+ filters?: Record<string, string | number | boolean>;
88
+ sort?: string;
89
+ }
90
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Type system for the Actuate client SDK.
3
+ *
4
+ * The key trick: callers pass their `actuate.config.ts` as a generic type
5
+ * parameter to `createClient<typeof config>()`. The SDK then surfaces a
6
+ * typed `client.<collection>` accessor where every field's TS type is
7
+ * derived from the config. No codegen, no `actuate.types.d.ts` file —
8
+ * the user's source of truth is the config itself.
9
+ *
10
+ * If a consumer can't (or won't) pass their config, the client falls back
11
+ * to a generic `Record<string, unknown>` shape so calls still type-check.
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@actuate-media/client",
3
+ "version": "0.2.0",
4
+ "description": "Type-safe HTTP client and React hooks for the Actuate CMS REST API.",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/actuate-media/actuatecms.git",
8
+ "directory": "packages/client"
9
+ },
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "type": "module",
14
+ "main": "./dist/index.js",
15
+ "types": "./dist/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.js",
20
+ "default": "./dist/index.js"
21
+ },
22
+ "./react": {
23
+ "types": "./dist/react.d.ts",
24
+ "import": "./dist/react.js",
25
+ "default": "./dist/react.js"
26
+ },
27
+ "./next": {
28
+ "types": "./dist/next.d.ts",
29
+ "import": "./dist/next.js",
30
+ "default": "./dist/next.js"
31
+ }
32
+ },
33
+ "files": [
34
+ "dist"
35
+ ],
36
+ "scripts": {
37
+ "build": "tsc --project tsconfig.json",
38
+ "dev": "tsc --project tsconfig.json --watch --preserveWatchOutput",
39
+ "type-check": "tsc --noEmit",
40
+ "test": "vitest run",
41
+ "clean": "rm -rf dist .turbo"
42
+ },
43
+ "peerDependencies": {
44
+ "react": ">=18.0.0"
45
+ },
46
+ "peerDependenciesMeta": {
47
+ "react": {
48
+ "optional": true
49
+ }
50
+ },
51
+ "devDependencies": {
52
+ "@types/react": "^19.0.0",
53
+ "react": "^19.2.0",
54
+ "typescript": "^5.7.0",
55
+ "vitest": "^3.0.0"
56
+ }
57
+ }