@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.
- package/dist/index.d.ts +83 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +169 -0
- package/dist/index.js.map +1 -0
- package/dist/next.d.ts +56 -0
- package/dist/next.d.ts.map +1 -0
- package/dist/next.js +60 -0
- package/dist/next.js.map +1 -0
- package/dist/react.d.ts +32 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +156 -0
- package/dist/react.js.map +1 -0
- package/dist/types.d.ts +90 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
package/dist/index.d.ts
ADDED
|
@@ -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":"AAqCA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,MAAM,CAAQ;IACd,QAAQ,CAAS;IAC1B,YAAY,OAAe,EAAE,MAAc,EAAE,QAAkB;QAC7D,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,aAAa;IACf,GAAG,CAAQ;IACX,MAAM,CAAS;IACP,SAAS,CAAc;IACvB,YAAY,CAAuC;IACnD,YAAY,CAAyB;IAEtD,YAAY,IAA0B;QACpC,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;QAClE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACvC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAA;QACxC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;QACrC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAA;IAClC,CAAC;IAEO,OAAO,CAAC,KAA8B;QAC5C,OAAO;YACL,MAAM,EAAE,kBAAkB;YAC1B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,GAAG,IAAI,CAAC,YAAY;YACpB,GAAG,KAAK;SACT,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,MAAyC,EACzC,IAAY,EACZ,IAKC;QAED,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,WAAW,IAAI,EAAE,CAAA;QACzC,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;YACpC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,KAAK,SAAS;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/C,CAAC;YACD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;YAC3B,IAAI,CAAC;gBAAE,MAAM,IAAI,IAAI,CAAC,EAAE,CAAA;QAC1B,CAAC;QACD,MAAM,SAAS,GAAsE;YACnF,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACtF,MAAM,EAAE,IAAI,EAAE,MAAM;SACrB,CAAA;QACD,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5C,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY,CAAA;QAC9C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;gBAC/B,CAAC;gBAAC,SAAiB,CAAC,KAAK,GAAG,UAAU,CAAA;YACxC,CAAC;iBAAM,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC9D,mEAAmE;gBACnE,oCAAoC;gBACpC,SAAS,CAAC,IAAI,GAAG;oBACf,GAAG,CAAC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjF,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5C,CAAA;YACH,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAC7B,IAAI,MAAM,GAAQ,IAAI,CAAA;QACtB,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,+CAA+C;YACjD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,IAAI,YAAY,GAAG,CAAC,MAAM,EAAE,CAAA;YACtE,MAAM,IAAI,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,CAAA;QACzD,CAAC;QACD,OAAO,MAAW,CAAA;IACpB,CAAC;IAED,wEAAwE;IAExE;;;;;OAKG;IACH,IAAI,CACF,UAAgB,EAChB,KAAiB,EACjB,IAA6E;QAE7E,MAAM,WAAW,GAA0D,EAAE,CAAA;QAC7E,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;YAChC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,gBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,EAChD;YACE,KAAK,EAAE;gBACL,IAAI,EAAE,KAAK,EAAE,IAAI;gBACjB,QAAQ,EAAE,KAAK,EAAE,QAAQ;gBACzB,MAAM,EAAE,KAAK,EAAE,MAAM;gBACrB,MAAM,EAAE,KAAK,EAAE,MAAM;gBACrB,MAAM,EAAE,KAAK,EAAE,MAAM;gBACrB,QAAQ,EAAE,KAAK,EAAE,QAAQ;gBACzB,IAAI,EAAE,KAAK,EAAE,IAAI;gBACjB,GAAG,WAAW;aACf;YACD,MAAM,EAAE,IAAI,EAAE,MAAM;YACpB,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CACF,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;IAED,qCAAqC;IACrC,GAAG,CACD,UAAgB,EAChB,EAAU,EACV,IAIC;QAED,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,gBAAgB,kBAAkB,CAAC,UAAU,CAAC,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAC1E;YACE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;YAC/D,MAAM,EAAE,IAAI,EAAE,MAAM;YACpB,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CACF,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,OAAO,CACX,IAAY,EACZ,IAA6E;QAE7E,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAmC,KAAK,EAAE,UAAU,EAAE;gBACvF,KAAK,EAAE,EAAE,IAAI,EAAE;gBACf,MAAM,EAAE,IAAI,EAAE,MAAM;gBACpB,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9C,CAAC,CAAA;YACF,OAAO,QAAQ,CAAC,IAAI,CAAA;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,IAAI,CAAA;YAClE,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAED,wEAAwE;IAExE,8BAA8B;IAC9B,MAAM,CACJ,IAAU,EACV,IAA6E;QAE7E,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,YAAY,kBAAkB,CAAC,IAAI,CAAC,EAAE,EACtC;YACE,MAAM,EAAE,IAAI,EAAE,MAAM;YACpB,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CACF,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;IAED,wEAAwE;IAExE,SAAS,CAAC,KAA6D;QACrE,OAAO,IAAI,CAAC,OAAO,CAA2C,KAAK,EAAE,QAAQ,EAAE;YAC7E,KAAK,EAAE,KAAY;SACpB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,IAA0B;IAE1B,OAAO,IAAI,aAAa,CAAS,IAAI,CAAC,CAAA;AACxC,CAAC"}
|
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
|
package/dist/next.js.map
ADDED
|
@@ -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"}
|
package/dist/react.d.ts
ADDED
|
@@ -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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,MAAM,EAAE,CAAA;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,iFAAiF;AACjF,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,sBAAsB,IAAI,CAAC,CAAC,MAAM,CAAC,SACjE,MAAM,GACN,UAAU,GACV,MAAM,GACN,KAAK,GACL,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,CAAC,CAAC,MAAM,CAAC,SAAS,QAAQ,GACxB,MAAM,GACN,CAAC,CAAC,MAAM,CAAC,SAAS,SAAS,GACzB,OAAO,GACP,CAAC,CAAC,MAAM,CAAC,SAAS,MAAM,GACtB,OAAO,GACP,CAAC,CAAC,MAAM,CAAC,SAAS,QAAQ,GACxB,CAAC,SAAS;IAAE,OAAO,EAAE,aAAa,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAA;CAAE,GACtD,CAAC,GACD,CAAC,SAAS;IAAE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACtC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GACpB,MAAM,GACV,CAAC,CAAC,MAAM,CAAC,SAAS,cAAc,GAC9B,MAAM,GACN,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,GACvB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,GACvB,CAAC,SAAS;IAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;CAAE,GAC3E,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,GACvB,OAAO,EAAE,GACX,CAAC,CAAC,MAAM,CAAC,SAAS,QAAQ,GACxB,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC9B,OAAO,CAAA;AAE3B,6EAA6E;AAC7E,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,IAAI;KAC1E,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACnC,CAAA;AAID,+DAA+D;AAC/D,MAAM,WAAW,eAAe,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC9D,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,CAAA;IACxD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,KAAK,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACvC;AAED,8CAA8C;AAC9C,MAAM,WAAW,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D,IAAI,EAAE,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAID,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAClB,MAAM,EACN;QACE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;QAC9C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KACvB,CACF,CAAA;IACD,OAAO,CAAC,EAAE,MAAM,CACd,MAAM,EACN;QACE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;KAC/C,CACF,CAAA;CACF;AAED,uEAAuE;AACvE,MAAM,MAAM,cAAc,CACxB,MAAM,SAAS,iBAAiB,EAChC,IAAI,SAAS,MAAM,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IACnD,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;AAEpE,mEAAmE;AACnE,MAAM,MAAM,UAAU,CACpB,MAAM,SAAS,iBAAiB,EAChC,IAAI,SAAS,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAC/C,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;AAIhE,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,CAAA;IACzD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;IACnD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd"}
|
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
|
+
}
|