@plasmicpkgs/strapi 0.0.2

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/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 Plasmic
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Extracts fields whose types can be displayed in Plasmic.
3
+ * @internal
4
+ */
5
+ export declare function _extractDisplayableFields(items: StrapiItem | StrapiItem[]): string[];
6
+
7
+ /**
8
+ * Extracts fields whose types can be filtered in Plasmic.
9
+ * @internal
10
+ */
11
+ export declare function _extractFilterableFields(items: StrapiItem | StrapiItem[]): string[];
12
+
13
+ /** @internal */
14
+ export declare function _getFieldKeys(item: StrapiItem): string[];
15
+
16
+ /**
17
+ * Gets the value, or undefined if the field key does not exist.
18
+ * @internal
19
+ */
20
+ export declare function _getFieldValue(item: StrapiItem, key: string): StrapiValue | undefined;
21
+
22
+ /** @internal */
23
+ export declare function _getId(item: StrapiItem): string;
24
+
25
+ /**
26
+ * Gets media attributes if it's a media item.
27
+ *
28
+ * This is the small subset of the fields that we care about.
29
+ *
30
+ * @internal
31
+ */
32
+ export declare function _getMediaAttributes(value: StrapiItem): StrapiMediaAttributes | undefined;
33
+
34
+ /**
35
+ * Checks if the media attribute contains an image media
36
+ * @internal
37
+ */
38
+ export declare function _isImage(mediaAttr: StrapiMediaAttributes): mediaAttr is StrapiImageAttribute;
39
+
40
+ /** @internal */
41
+ export declare function _isStrapiItem(item: StrapiValue | undefined): item is StrapiItem;
42
+
43
+ /** @internal */
44
+ export declare function _isStrapiItemArray(value: StrapiValue | undefined): value is ReadonlyArray<StrapiItem>;
45
+
46
+ /** @internal */
47
+ export declare function _isStrapiPrimitive(value: StrapiValue | undefined): value is boolean | number | string;
48
+
49
+ /**
50
+ * https://docs-v4.strapi.io/dev-docs/api/entity-service/filter
51
+ * @internal
52
+ */
53
+ export declare const _queryParameters: {
54
+ value: string;
55
+ label: string;
56
+ }[];
57
+
58
+ export declare function queryStrapi(host: string, token: string | undefined, collection: string | undefined, filterField?: string, filterValue?: string, filterParameter?: string): Promise<StrapiQueryResponse | null>;
59
+
60
+ export declare function registerStrapi(loader?: {
61
+ registerFunction: any;
62
+ }): void;
63
+
64
+ declare interface StrapiImageAttribute extends StrapiMediaAttributes {
65
+ width: number;
66
+ height: number;
67
+ }
68
+
69
+ /** A content item or media item. */
70
+ declare type StrapiItem = StrapiItemV4 | StrapiItemV5;
71
+
72
+ declare interface StrapiItemV4 {
73
+ id: number;
74
+ attributes: {
75
+ [attribute: string]: StrapiValueV4;
76
+ };
77
+ }
78
+
79
+ declare interface StrapiItemV5 {
80
+ documentId: string;
81
+ [attribute: string]: StrapiValueV5;
82
+ }
83
+
84
+ /** This includes any asset such as image, video, audio, file */
85
+ declare interface StrapiMediaAttributes {
86
+ url: string;
87
+ mime: string;
88
+ ext: string;
89
+ size: number;
90
+ width: number | null;
91
+ height: number | null;
92
+ formats?: {
93
+ [key: string]: Omit<StrapiMediaAttributes, "formats">;
94
+ };
95
+ absoluteUrl?: string;
96
+ }
97
+
98
+ declare interface StrapiQueryResponse {
99
+ data: StrapiItem[];
100
+ meta: {
101
+ pagination: {
102
+ page: number;
103
+ pageSize: number;
104
+ pageCount: number;
105
+ total: number;
106
+ };
107
+ };
108
+ }
109
+
110
+ /** A primitive, item, item array, or null (for optional fields). */
111
+ declare type StrapiValue = boolean | number | string | StrapiItem | ReadonlyArray<StrapiItem> | ReadonlyArray<any> | Record<string, any> | null;
112
+
113
+ declare type StrapiValueV4 = boolean | number | string | {
114
+ data: StrapiItemV4 | ReadonlyArray<StrapiItemV4>;
115
+ } | ReadonlyArray<any> | Record<string, any> | null;
116
+
117
+ declare type StrapiValueV5 = boolean | number | string | StrapiItemV5 | ReadonlyArray<StrapiItemV5> | ReadonlyArray<any> | Record<string, any> | null;
118
+
119
+ export { }
@@ -0,0 +1,356 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __async = (__this, __arguments, generator) => {
21
+ return new Promise((resolve, reject) => {
22
+ var fulfilled = (value) => {
23
+ try {
24
+ step(generator.next(value));
25
+ } catch (e) {
26
+ reject(e);
27
+ }
28
+ };
29
+ var rejected = (value) => {
30
+ try {
31
+ step(generator.throw(value));
32
+ } catch (e) {
33
+ reject(e);
34
+ }
35
+ };
36
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
37
+ step((generator = generator.apply(__this, __arguments)).next());
38
+ });
39
+ };
40
+
41
+ // src/index.ts
42
+ import registerFunction from "@plasmicapp/host/registerFunction";
43
+
44
+ // src/query-strapi.tsx
45
+ import qs from "qs";
46
+
47
+ // src/strapi-compat.ts
48
+ function isV5Item(item) {
49
+ return "documentId" in item;
50
+ }
51
+ function isV4Item(item) {
52
+ return "id" in item && "attributes" in item;
53
+ }
54
+ function isStrapiPrimitive(value) {
55
+ const type = typeof value;
56
+ return type === "boolean" || type === "number" || type === "string";
57
+ }
58
+ function isStrapiItem(item) {
59
+ if (typeof item !== "object" || item === null || Array.isArray(item)) {
60
+ return false;
61
+ }
62
+ return isV5Item(item) || isV4Item(item);
63
+ }
64
+ function isStrapiItemArray(value) {
65
+ return typeof value === "object" && value !== null && Array.isArray(value);
66
+ }
67
+ function getId(item) {
68
+ if (isV5Item(item)) {
69
+ return item.documentId;
70
+ } else {
71
+ return item.id.toString();
72
+ }
73
+ }
74
+ function getItemKeys(item) {
75
+ if (isV5Item(item)) {
76
+ return Object.keys(item).filter((key) => key !== "documentId");
77
+ } else {
78
+ return Object.keys(item.attributes);
79
+ }
80
+ }
81
+ function getFieldValue(item, key) {
82
+ if (isV5Item(item)) {
83
+ return item[key];
84
+ } else {
85
+ const value = item.attributes[key];
86
+ if (value === null || value === void 0) {
87
+ return value;
88
+ }
89
+ switch (typeof value) {
90
+ case "boolean":
91
+ case "number":
92
+ case "string":
93
+ return value;
94
+ case "object":
95
+ if (value && "data" in value) {
96
+ return value.data;
97
+ } else {
98
+ return void 0;
99
+ }
100
+ default:
101
+ return void 0;
102
+ }
103
+ }
104
+ }
105
+ function getMediaAttributes(value) {
106
+ const attributes = isV5Item(value) ? value : value.attributes;
107
+ if ("url" in attributes && "mime" in attributes && "ext" in attributes && "size" in attributes) {
108
+ return attributes;
109
+ } else {
110
+ return void 0;
111
+ }
112
+ }
113
+
114
+ // src/utils.ts
115
+ var queryParameters = [
116
+ {
117
+ value: "$eq",
118
+ label: "Equal"
119
+ },
120
+ {
121
+ value: "$ne",
122
+ label: "Not equal"
123
+ },
124
+ {
125
+ value: "$lt",
126
+ label: "Less than"
127
+ },
128
+ {
129
+ value: "$lte",
130
+ label: "Less than or equal to"
131
+ },
132
+ {
133
+ value: "$gt",
134
+ label: "Greater than"
135
+ },
136
+ {
137
+ value: "$gte",
138
+ label: "Greater than or equal to"
139
+ },
140
+ {
141
+ value: "$in",
142
+ label: "Included in an array"
143
+ },
144
+ {
145
+ value: "$notIn",
146
+ label: "Not included in an array"
147
+ },
148
+ {
149
+ value: "$contains",
150
+ label: "Contains"
151
+ },
152
+ {
153
+ value: "$notContains",
154
+ label: "Does not contain"
155
+ }
156
+ ];
157
+ function isImage(mediaAttr) {
158
+ return mediaAttr == null ? void 0 : mediaAttr.mime.startsWith("image");
159
+ }
160
+ function normalizeUrl(url) {
161
+ return url.trim().replace(/^\/+/, "").replace(/\/+$/, "");
162
+ }
163
+ function extractFilterableFields(items) {
164
+ if (Array.isArray(items)) {
165
+ return Array.from(new Set(items.flatMap(filterableFields)));
166
+ } else {
167
+ return filterableFields(items);
168
+ }
169
+ }
170
+ function filterableFields(item) {
171
+ return getItemKeys(item).filter((key) => {
172
+ const value = getFieldValue(item, key);
173
+ return isStrapiPrimitive(value);
174
+ });
175
+ }
176
+ function extractDisplayableFields(items) {
177
+ if (Array.isArray(items)) {
178
+ return Array.from(new Set(items.flatMap(displayableFields)));
179
+ } else {
180
+ return displayableFields(items);
181
+ }
182
+ }
183
+ function displayableFields(item) {
184
+ return getItemKeys(item).filter((key) => {
185
+ const value = getFieldValue(item, key);
186
+ return isStrapiPrimitive(value) || isStrapiItem(value) && getMediaAttributes(value);
187
+ });
188
+ }
189
+ function transformMediaUrls(data, host) {
190
+ if (data === null || data === void 0) {
191
+ return data;
192
+ }
193
+ const normalizedHost = normalizeUrl(host);
194
+ function makeAbsoluteUrl(url) {
195
+ if (url.startsWith("http://") || url.startsWith("https://")) {
196
+ return url;
197
+ }
198
+ return normalizedHost + "/" + normalizeUrl(url);
199
+ }
200
+ function transformMediaItem(mediaAttrs) {
201
+ mediaAttrs.absoluteUrl = makeAbsoluteUrl(mediaAttrs.url);
202
+ if (mediaAttrs.formats && typeof mediaAttrs.formats === "object") {
203
+ for (const formatKey of Object.keys(mediaAttrs.formats)) {
204
+ transformMediaItem(mediaAttrs.formats[formatKey]);
205
+ }
206
+ }
207
+ }
208
+ function transformStrapiItem(item) {
209
+ const mediaAttrs = getMediaAttributes(item);
210
+ if (mediaAttrs) {
211
+ transformMediaItem(mediaAttrs);
212
+ } else {
213
+ for (const key of getItemKeys(item)) {
214
+ const fieldValue = getFieldValue(item, key);
215
+ transformValue(fieldValue);
216
+ }
217
+ }
218
+ }
219
+ function transformValue(value) {
220
+ if (value === null || value === void 0) {
221
+ return value;
222
+ }
223
+ if (isStrapiPrimitive(value)) {
224
+ return value;
225
+ }
226
+ if (Array.isArray(value)) {
227
+ value.forEach(transformValue);
228
+ return value;
229
+ }
230
+ if (isStrapiItem(value)) {
231
+ transformStrapiItem(value);
232
+ } else if (typeof value === "object") {
233
+ for (const key of Object.keys(value)) {
234
+ transformValue(value[key]);
235
+ }
236
+ }
237
+ return value;
238
+ }
239
+ return transformValue(data);
240
+ }
241
+
242
+ // src/query-strapi.tsx
243
+ var queryStrapiMeta = {
244
+ name: "queryStrapi",
245
+ displayName: "Query Strapi",
246
+ description: "Query a Strapi collection",
247
+ importPath: "@plasmicpkgs/strapi",
248
+ params: [
249
+ {
250
+ name: "strapiHost",
251
+ type: "string",
252
+ description: "The Strapi host URL (e.g., https://example.com)"
253
+ },
254
+ {
255
+ name: "strapiToken",
256
+ type: "string",
257
+ description: "The Strapi API token (optional, for authenticated requests)"
258
+ },
259
+ {
260
+ name: "collection",
261
+ type: "string",
262
+ description: "The name of the Strapi collection to query"
263
+ },
264
+ {
265
+ name: "filterField",
266
+ type: "choice",
267
+ options: (_, ctx) => {
268
+ return ctx == null ? void 0 : ctx.strapiFields;
269
+ }
270
+ },
271
+ {
272
+ name: "filterValue",
273
+ type: "string",
274
+ description: "The value to filter by (optional, if you want to filter results)"
275
+ },
276
+ {
277
+ name: "filterParameter",
278
+ type: "choice",
279
+ description: "The parameter for filtering (e.g., 'eq', 'contains', etc.) (optional)",
280
+ options: () => {
281
+ return queryParameters.map((item) => ({
282
+ label: item == null ? void 0 : item.label,
283
+ value: item == null ? void 0 : item.value
284
+ }));
285
+ }
286
+ }
287
+ ],
288
+ fnContext: (host, token, collection) => {
289
+ return {
290
+ dataKey: JSON.stringify({ host, token, collection }),
291
+ fetcher: () => __async(void 0, null, function* () {
292
+ if (!host) {
293
+ return {};
294
+ }
295
+ const resp = yield queryStrapi(host, token, collection);
296
+ const collectionData = resp == null ? void 0 : resp.data;
297
+ if (!collectionData) {
298
+ return { strapiFields: [] };
299
+ }
300
+ return { strapiFields: extractFilterableFields(collectionData) };
301
+ })
302
+ };
303
+ }
304
+ };
305
+ function queryStrapi(host, token, collection, filterField, filterValue, filterParameter) {
306
+ return __async(this, null, function* () {
307
+ if (!host || !collection) {
308
+ return null;
309
+ }
310
+ const query = normalizeUrl(host) + "/api/" + collection.trim();
311
+ const requestInit = { method: "GET" };
312
+ if (token) {
313
+ requestInit.headers = { Authorization: "Bearer " + token };
314
+ }
315
+ const queryParams = qs.stringify(__spreadProps(__spreadValues({}, filterField && filterParameter && filterValue ? {
316
+ filters: {
317
+ [filterField]: {
318
+ [filterParameter]: filterValue
319
+ }
320
+ }
321
+ } : {}), {
322
+ populate: "*"
323
+ }));
324
+ const resp = yield fetch(`${query}?${queryParams}`, requestInit);
325
+ const data = yield resp.json();
326
+ return transformMediaUrls(data, host);
327
+ });
328
+ }
329
+
330
+ // src/index.ts
331
+ function registerStrapi(loader) {
332
+ function _registerFunction(fn, meta) {
333
+ if (loader) {
334
+ loader.registerFunction(fn, meta);
335
+ } else {
336
+ registerFunction(fn, meta);
337
+ }
338
+ }
339
+ _registerFunction(queryStrapi, queryStrapiMeta);
340
+ }
341
+ export {
342
+ extractDisplayableFields as _extractDisplayableFields,
343
+ extractFilterableFields as _extractFilterableFields,
344
+ getItemKeys as _getFieldKeys,
345
+ getFieldValue as _getFieldValue,
346
+ getId as _getId,
347
+ getMediaAttributes as _getMediaAttributes,
348
+ isImage as _isImage,
349
+ isStrapiItem as _isStrapiItem,
350
+ isStrapiItemArray as _isStrapiItemArray,
351
+ isStrapiPrimitive as _isStrapiPrimitive,
352
+ queryParameters as _queryParameters,
353
+ queryStrapi,
354
+ registerStrapi
355
+ };
356
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/query-strapi.tsx", "../src/strapi-compat.ts", "../src/utils.ts"],
4
+ "sourcesContent": ["import registerFunction, {\n CustomFunctionMeta,\n} from \"@plasmicapp/host/registerFunction\";\nimport { queryStrapi, queryStrapiMeta } from \"./query-strapi\";\n\nexport function registerStrapi(loader?: { registerFunction: any }) {\n function _registerFunction<T extends (...args: any[]) => any>(\n fn: T,\n meta: CustomFunctionMeta<T>\n ) {\n if (loader) {\n loader.registerFunction(fn, meta);\n } else {\n registerFunction(fn, meta);\n }\n }\n\n _registerFunction(queryStrapi, queryStrapiMeta);\n}\n\nexport { queryStrapi };\n\n// used by @plasmicpkgs/plasmic-strapi\nexport {\n getItemKeys as _getFieldKeys,\n getFieldValue as _getFieldValue,\n getId as _getId,\n getMediaAttributes as _getMediaAttributes,\n isStrapiItem as _isStrapiItem,\n isStrapiItemArray as _isStrapiItemArray,\n isStrapiPrimitive as _isStrapiPrimitive,\n} from \"./strapi-compat\";\nexport {\n extractDisplayableFields as _extractDisplayableFields,\n extractFilterableFields as _extractFilterableFields,\n isImage as _isImage,\n queryParameters as _queryParameters,\n} from \"./utils\";\n", "import { CustomFunctionMeta } from \"@plasmicapp/host/registerFunction\";\nimport qs from \"qs\";\nimport { StrapiQueryResponse } from \"./strapi-compat\";\nimport {\n extractFilterableFields,\n normalizeUrl,\n queryParameters,\n transformMediaUrls,\n} from \"./utils\";\n\nexport const queryStrapiMeta: CustomFunctionMeta<typeof queryStrapi> = {\n name: \"queryStrapi\",\n displayName: \"Query Strapi\",\n description: \"Query a Strapi collection\",\n importPath: \"@plasmicpkgs/strapi\",\n params: [\n {\n name: \"strapiHost\",\n type: \"string\",\n description: \"The Strapi host URL (e.g., https://example.com)\",\n },\n {\n name: \"strapiToken\",\n type: \"string\",\n description:\n \"The Strapi API token (optional, for authenticated requests)\",\n },\n {\n name: \"collection\",\n type: \"string\",\n description: \"The name of the Strapi collection to query\",\n },\n {\n name: \"filterField\",\n type: \"choice\",\n options: (_, ctx) => {\n return ctx?.strapiFields;\n },\n },\n {\n name: \"filterValue\",\n type: \"string\",\n description:\n \"The value to filter by (optional, if you want to filter results)\",\n },\n {\n name: \"filterParameter\",\n type: \"choice\",\n description:\n \"The parameter for filtering (e.g., 'eq', 'contains', etc.) (optional)\",\n options: () => {\n return queryParameters.map((item: any) => ({\n label: item?.label,\n value: item?.value,\n }));\n },\n },\n ],\n fnContext: (host, token, collection) => {\n return {\n dataKey: JSON.stringify({ host, token, collection }),\n fetcher: async () => {\n if (!host) {\n return {};\n }\n const resp = await queryStrapi(host, token, collection);\n const collectionData = resp?.data;\n if (!collectionData) {\n return { strapiFields: [] };\n }\n\n return { strapiFields: extractFilterableFields(collectionData) };\n },\n };\n },\n};\n\nexport async function queryStrapi(\n host: string,\n token: string | undefined,\n collection: string | undefined,\n filterField?: string,\n filterValue?: string,\n filterParameter?: string\n): Promise<StrapiQueryResponse | null> {\n if (!host || !collection) {\n return null;\n }\n\n const query = normalizeUrl(host) + \"/api/\" + collection.trim();\n\n const requestInit: RequestInit = { method: \"GET\" };\n if (token) {\n requestInit.headers = { Authorization: \"Bearer \" + token };\n }\n\n const queryParams = qs.stringify({\n ...(filterField && filterParameter && filterValue\n ? {\n filters: {\n [filterField]: {\n [filterParameter]: filterValue,\n },\n },\n }\n : {}),\n populate: \"*\",\n });\n\n const resp = await fetch(`${query}?${queryParams}`, requestInit);\n const data = await resp.json();\n\n // Transform all relative media URLs to absolute URLs\n return transformMediaUrls(data, host);\n}\n", "// This file contains Strapi code for handling v4/v5 compatibility.\n// https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/new-response-format\n\nexport interface StrapiQueryResponse {\n data: StrapiItem[];\n meta: {\n pagination: {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n };\n };\n}\n\n/** A primitive, item, item array, or null (for optional fields). */\nexport type StrapiValue =\n | boolean\n | number\n | string\n | StrapiItem\n | ReadonlyArray<StrapiItem>\n | ReadonlyArray<any> // For rich text content, JSON fields, etc.\n | Record<string, any> // For JSON fields, metadata objects, etc.\n | null;\ntype StrapiValueV4 =\n | boolean\n | number\n | string\n | { data: StrapiItemV4 | ReadonlyArray<StrapiItemV4> }\n | ReadonlyArray<any> // For rich text content, JSON fields, etc.\n | Record<string, any> // For JSON fields, metadata objects, etc.\n | null;\ntype StrapiValueV5 =\n | boolean\n | number\n | string\n | StrapiItemV5\n | ReadonlyArray<StrapiItemV5>\n | ReadonlyArray<any> // For rich text content, JSON fields, etc.\n | Record<string, any> // For JSON fields, metadata objects, etc.\n | null;\n\n/** A content item or media item. */\nexport type StrapiItem = StrapiItemV4 | StrapiItemV5;\nexport interface StrapiItemV4 {\n id: number;\n attributes: {\n [attribute: string]: StrapiValueV4;\n };\n}\nexport interface StrapiItemV5 {\n documentId: string;\n [attribute: string]: StrapiValueV5;\n}\nfunction isV5Item(item: StrapiItem): item is StrapiItemV5 {\n return \"documentId\" in item;\n}\n\nfunction isV4Item(item: StrapiItem): item is StrapiItemV5 {\n return \"id\" in item && \"attributes\" in item;\n}\n\n/** @internal */\nexport function isStrapiPrimitive(\n value: StrapiValue | undefined\n): value is boolean | number | string {\n const type = typeof value;\n return type === \"boolean\" || type === \"number\" || type === \"string\";\n}\n/** @internal */\nexport function isStrapiItem(\n item: StrapiValue | undefined\n): item is StrapiItem {\n if (typeof item !== \"object\" || item === null || Array.isArray(item)) {\n return false;\n }\n // The object must be a valid v5 or v4 item\n return isV5Item(item as any) || isV4Item(item as any);\n}\n/** @internal */\nexport function isStrapiItemArray(\n value: StrapiValue | undefined\n): value is ReadonlyArray<StrapiItem> {\n return typeof value === \"object\" && value !== null && Array.isArray(value);\n}\n\n/** @internal */\nexport function getId(item: StrapiItem): string {\n if (isV5Item(item)) {\n return item.documentId;\n } else {\n // v4\n return item.id.toString();\n }\n}\n\n/** @internal */\nexport function getItemKeys(item: StrapiItem) {\n if (isV5Item(item)) {\n return Object.keys(item).filter((key) => key !== \"documentId\");\n } else {\n // v4\n return Object.keys(item.attributes);\n }\n}\n\n/**\n * Gets the value, or undefined if the field key does not exist.\n * @internal\n */\nexport function getFieldValue(\n item: StrapiItem,\n key: string\n): StrapiValue | undefined {\n if (isV5Item(item)) {\n return item[key];\n } else {\n // v4\n const value = item.attributes[key];\n if (value === null || value === undefined) {\n return value;\n }\n switch (typeof value) {\n case \"boolean\":\n case \"number\":\n case \"string\":\n return value;\n case \"object\":\n if (value && \"data\" in value) {\n return value.data;\n } else {\n return undefined;\n }\n default:\n return undefined;\n }\n }\n}\n\n/** This includes any asset such as image, video, audio, file */\nexport interface StrapiMediaAttributes {\n url: string;\n mime: string;\n ext: string;\n size: number;\n // width and height are null for non-image media (e.g. audio files)\n width: number | null;\n height: number | null;\n formats?: { [key: string]: Omit<StrapiMediaAttributes, \"formats\"> };\n // Added by transformMediaUrls - absolute URL with host prepended\n absoluteUrl?: string;\n}\n\nexport interface StrapiImageAttribute extends StrapiMediaAttributes {\n width: number;\n height: number;\n}\n/**\n * Gets media attributes if it's a media item.\n *\n * This is the small subset of the fields that we care about.\n *\n * @internal\n */\nexport function getMediaAttributes(\n value: StrapiItem\n): StrapiMediaAttributes | undefined {\n const attributes = isV5Item(value) ? value : value.attributes;\n if (\n \"url\" in attributes &&\n \"mime\" in attributes &&\n \"ext\" in attributes &&\n \"size\" in attributes\n ) {\n return attributes as { [attribute: string]: any } as StrapiMediaAttributes;\n } else {\n return undefined;\n }\n}\n", "import {\n StrapiImageAttribute,\n StrapiItem,\n StrapiMediaAttributes,\n StrapiQueryResponse,\n getFieldValue,\n getItemKeys,\n getMediaAttributes,\n isStrapiItem,\n isStrapiPrimitive,\n} from \"./strapi-compat\";\n\n/**\n * https://docs-v4.strapi.io/dev-docs/api/entity-service/filter\n * @internal\n */\nexport const queryParameters = [\n {\n value: \"$eq\",\n label: \"Equal\",\n },\n {\n value: \"$ne\",\n label: \"Not equal\",\n },\n {\n value: \"$lt\",\n label: \"Less than\",\n },\n {\n value: \"$lte\",\n label: \"Less than or equal to\",\n },\n {\n value: \"$gt\",\n label: \"Greater than\",\n },\n {\n value: \"$gte\",\n label: \"Greater than or equal to\",\n },\n {\n value: \"$in\",\n label: \"Included in an array\",\n },\n {\n value: \"$notIn\",\n label: \"Not included in an array\",\n },\n {\n value: \"$contains\",\n label: \"Contains\",\n },\n {\n value: \"$notContains\",\n label: \"Does not contain\",\n },\n];\n\n/**\n * Checks if the media attribute contains an image media\n * @internal\n */\nexport function isImage(\n mediaAttr: StrapiMediaAttributes\n): mediaAttr is StrapiImageAttribute {\n return mediaAttr?.mime.startsWith(\"image\");\n}\n\n/**\n * Removes leading and trailing slash and whitespace characters from a URL\n * @internal\n */\nexport function normalizeUrl(url: string): string {\n return (\n url\n .trim()\n // remove leading slash\n .replace(/^\\/+/, \"\")\n // remove leading trailing\n .replace(/\\/+$/, \"\")\n );\n}\n\n/**\n * Extracts fields whose types can be filtered in Plasmic.\n * @internal\n */\nexport function extractFilterableFields(\n items: StrapiItem | StrapiItem[]\n): string[] {\n if (Array.isArray(items)) {\n return Array.from(new Set(items.flatMap(filterableFields)));\n } else {\n return filterableFields(items);\n }\n}\n\nfunction filterableFields(item: StrapiItem): string[] {\n return getItemKeys(item).filter((key) => {\n const value = getFieldValue(item, key);\n return isStrapiPrimitive(value);\n });\n}\n\n/**\n * Extracts fields whose types can be displayed in Plasmic.\n * @internal\n */\nexport function extractDisplayableFields(\n items: StrapiItem | StrapiItem[]\n): string[] {\n if (Array.isArray(items)) {\n return Array.from(new Set(items.flatMap(displayableFields)));\n } else {\n return displayableFields(items);\n }\n}\n\nfunction displayableFields(item: StrapiItem): string[] {\n return getItemKeys(item).filter((key) => {\n const value = getFieldValue(item, key);\n return (\n isStrapiPrimitive(value) ||\n (isStrapiItem(value) && getMediaAttributes(value))\n );\n });\n}\n\n/**\n * Traverses @param data and adds an absoluteUrl field to all media items by prepending the @param host to the url\n * @internal\n */\nexport function transformMediaUrls(\n data: StrapiQueryResponse,\n host: string\n): StrapiQueryResponse {\n if (data === null || data === undefined) {\n return data;\n }\n\n const normalizedHost = normalizeUrl(host);\n\n /**\n * Converts a relative URL to absolute by prepending the host.\n * If URL is already absolute, returns it unchanged.\n */\n function makeAbsoluteUrl(url: string): string {\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) {\n return url;\n }\n return normalizedHost + \"/\" + normalizeUrl(url);\n }\n\n /**\n * Adds absoluteUrl to a media item and its format variations\n */\n function transformMediaItem(mediaAttrs: StrapiMediaAttributes): void {\n mediaAttrs.absoluteUrl = makeAbsoluteUrl(mediaAttrs.url);\n\n // Transform format variations (thumbnail, small, medium, large, etc.)\n if (mediaAttrs.formats && typeof mediaAttrs.formats === \"object\") {\n for (const formatKey of Object.keys(mediaAttrs.formats)) {\n transformMediaItem(mediaAttrs.formats[formatKey]);\n }\n }\n }\n\n /**\n * Recursively traverses a Strapi item and transforms all nested media\n */\n function transformStrapiItem(item: StrapiItem): void {\n const mediaAttrs = getMediaAttributes(item);\n\n if (mediaAttrs) {\n // This item is itself a media item\n transformMediaItem(mediaAttrs);\n } else {\n // This item contains other fields that might be media\n for (const key of getItemKeys(item)) {\n const fieldValue = getFieldValue(item, key);\n transformValue(fieldValue);\n }\n }\n }\n\n /**\n * Recursively traverses and transforms media URLs in any value\n */\n function transformValue(value: any): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (isStrapiPrimitive(value)) {\n return value;\n }\n\n if (Array.isArray(value)) {\n value.forEach(transformValue);\n return value;\n }\n\n if (isStrapiItem(value)) {\n transformStrapiItem(value);\n } else if (typeof value === \"object\") {\n // Plain object - traverse its properties\n for (const key of Object.keys(value)) {\n transformValue(value[key]);\n }\n }\n\n return value;\n }\n\n return transformValue(data);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/dist/index.js ADDED
@@ -0,0 +1,384 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
+ var __getProtoOf = Object.getPrototypeOf;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ var __export = (target, all) => {
26
+ for (var name in all)
27
+ __defProp(target, name, { get: all[name], enumerable: true });
28
+ };
29
+ var __copyProps = (to, from, except, desc) => {
30
+ if (from && typeof from === "object" || typeof from === "function") {
31
+ for (let key of __getOwnPropNames(from))
32
+ if (!__hasOwnProp.call(to, key) && key !== except)
33
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
34
+ }
35
+ return to;
36
+ };
37
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
38
+ // If the importer is in node compatibility mode or this is not an ESM
39
+ // file that has been converted to a CommonJS file using a Babel-
40
+ // compatible transform (i.e. "__esModule" has not been set), then set
41
+ // "default" to the CommonJS "module.exports" for node compatibility.
42
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
43
+ mod
44
+ ));
45
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
46
+ var __async = (__this, __arguments, generator) => {
47
+ return new Promise((resolve, reject) => {
48
+ var fulfilled = (value) => {
49
+ try {
50
+ step(generator.next(value));
51
+ } catch (e) {
52
+ reject(e);
53
+ }
54
+ };
55
+ var rejected = (value) => {
56
+ try {
57
+ step(generator.throw(value));
58
+ } catch (e) {
59
+ reject(e);
60
+ }
61
+ };
62
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
63
+ step((generator = generator.apply(__this, __arguments)).next());
64
+ });
65
+ };
66
+
67
+ // src/index.ts
68
+ var src_exports = {};
69
+ __export(src_exports, {
70
+ _extractDisplayableFields: () => extractDisplayableFields,
71
+ _extractFilterableFields: () => extractFilterableFields,
72
+ _getFieldKeys: () => getItemKeys,
73
+ _getFieldValue: () => getFieldValue,
74
+ _getId: () => getId,
75
+ _getMediaAttributes: () => getMediaAttributes,
76
+ _isImage: () => isImage,
77
+ _isStrapiItem: () => isStrapiItem,
78
+ _isStrapiItemArray: () => isStrapiItemArray,
79
+ _isStrapiPrimitive: () => isStrapiPrimitive,
80
+ _queryParameters: () => queryParameters,
81
+ queryStrapi: () => queryStrapi,
82
+ registerStrapi: () => registerStrapi
83
+ });
84
+ module.exports = __toCommonJS(src_exports);
85
+ var import_registerFunction = __toESM(require("@plasmicapp/host/registerFunction"));
86
+
87
+ // src/query-strapi.tsx
88
+ var import_qs = __toESM(require("qs"));
89
+
90
+ // src/strapi-compat.ts
91
+ function isV5Item(item) {
92
+ return "documentId" in item;
93
+ }
94
+ function isV4Item(item) {
95
+ return "id" in item && "attributes" in item;
96
+ }
97
+ function isStrapiPrimitive(value) {
98
+ const type = typeof value;
99
+ return type === "boolean" || type === "number" || type === "string";
100
+ }
101
+ function isStrapiItem(item) {
102
+ if (typeof item !== "object" || item === null || Array.isArray(item)) {
103
+ return false;
104
+ }
105
+ return isV5Item(item) || isV4Item(item);
106
+ }
107
+ function isStrapiItemArray(value) {
108
+ return typeof value === "object" && value !== null && Array.isArray(value);
109
+ }
110
+ function getId(item) {
111
+ if (isV5Item(item)) {
112
+ return item.documentId;
113
+ } else {
114
+ return item.id.toString();
115
+ }
116
+ }
117
+ function getItemKeys(item) {
118
+ if (isV5Item(item)) {
119
+ return Object.keys(item).filter((key) => key !== "documentId");
120
+ } else {
121
+ return Object.keys(item.attributes);
122
+ }
123
+ }
124
+ function getFieldValue(item, key) {
125
+ if (isV5Item(item)) {
126
+ return item[key];
127
+ } else {
128
+ const value = item.attributes[key];
129
+ if (value === null || value === void 0) {
130
+ return value;
131
+ }
132
+ switch (typeof value) {
133
+ case "boolean":
134
+ case "number":
135
+ case "string":
136
+ return value;
137
+ case "object":
138
+ if (value && "data" in value) {
139
+ return value.data;
140
+ } else {
141
+ return void 0;
142
+ }
143
+ default:
144
+ return void 0;
145
+ }
146
+ }
147
+ }
148
+ function getMediaAttributes(value) {
149
+ const attributes = isV5Item(value) ? value : value.attributes;
150
+ if ("url" in attributes && "mime" in attributes && "ext" in attributes && "size" in attributes) {
151
+ return attributes;
152
+ } else {
153
+ return void 0;
154
+ }
155
+ }
156
+
157
+ // src/utils.ts
158
+ var queryParameters = [
159
+ {
160
+ value: "$eq",
161
+ label: "Equal"
162
+ },
163
+ {
164
+ value: "$ne",
165
+ label: "Not equal"
166
+ },
167
+ {
168
+ value: "$lt",
169
+ label: "Less than"
170
+ },
171
+ {
172
+ value: "$lte",
173
+ label: "Less than or equal to"
174
+ },
175
+ {
176
+ value: "$gt",
177
+ label: "Greater than"
178
+ },
179
+ {
180
+ value: "$gte",
181
+ label: "Greater than or equal to"
182
+ },
183
+ {
184
+ value: "$in",
185
+ label: "Included in an array"
186
+ },
187
+ {
188
+ value: "$notIn",
189
+ label: "Not included in an array"
190
+ },
191
+ {
192
+ value: "$contains",
193
+ label: "Contains"
194
+ },
195
+ {
196
+ value: "$notContains",
197
+ label: "Does not contain"
198
+ }
199
+ ];
200
+ function isImage(mediaAttr) {
201
+ return mediaAttr == null ? void 0 : mediaAttr.mime.startsWith("image");
202
+ }
203
+ function normalizeUrl(url) {
204
+ return url.trim().replace(/^\/+/, "").replace(/\/+$/, "");
205
+ }
206
+ function extractFilterableFields(items) {
207
+ if (Array.isArray(items)) {
208
+ return Array.from(new Set(items.flatMap(filterableFields)));
209
+ } else {
210
+ return filterableFields(items);
211
+ }
212
+ }
213
+ function filterableFields(item) {
214
+ return getItemKeys(item).filter((key) => {
215
+ const value = getFieldValue(item, key);
216
+ return isStrapiPrimitive(value);
217
+ });
218
+ }
219
+ function extractDisplayableFields(items) {
220
+ if (Array.isArray(items)) {
221
+ return Array.from(new Set(items.flatMap(displayableFields)));
222
+ } else {
223
+ return displayableFields(items);
224
+ }
225
+ }
226
+ function displayableFields(item) {
227
+ return getItemKeys(item).filter((key) => {
228
+ const value = getFieldValue(item, key);
229
+ return isStrapiPrimitive(value) || isStrapiItem(value) && getMediaAttributes(value);
230
+ });
231
+ }
232
+ function transformMediaUrls(data, host) {
233
+ if (data === null || data === void 0) {
234
+ return data;
235
+ }
236
+ const normalizedHost = normalizeUrl(host);
237
+ function makeAbsoluteUrl(url) {
238
+ if (url.startsWith("http://") || url.startsWith("https://")) {
239
+ return url;
240
+ }
241
+ return normalizedHost + "/" + normalizeUrl(url);
242
+ }
243
+ function transformMediaItem(mediaAttrs) {
244
+ mediaAttrs.absoluteUrl = makeAbsoluteUrl(mediaAttrs.url);
245
+ if (mediaAttrs.formats && typeof mediaAttrs.formats === "object") {
246
+ for (const formatKey of Object.keys(mediaAttrs.formats)) {
247
+ transformMediaItem(mediaAttrs.formats[formatKey]);
248
+ }
249
+ }
250
+ }
251
+ function transformStrapiItem(item) {
252
+ const mediaAttrs = getMediaAttributes(item);
253
+ if (mediaAttrs) {
254
+ transformMediaItem(mediaAttrs);
255
+ } else {
256
+ for (const key of getItemKeys(item)) {
257
+ const fieldValue = getFieldValue(item, key);
258
+ transformValue(fieldValue);
259
+ }
260
+ }
261
+ }
262
+ function transformValue(value) {
263
+ if (value === null || value === void 0) {
264
+ return value;
265
+ }
266
+ if (isStrapiPrimitive(value)) {
267
+ return value;
268
+ }
269
+ if (Array.isArray(value)) {
270
+ value.forEach(transformValue);
271
+ return value;
272
+ }
273
+ if (isStrapiItem(value)) {
274
+ transformStrapiItem(value);
275
+ } else if (typeof value === "object") {
276
+ for (const key of Object.keys(value)) {
277
+ transformValue(value[key]);
278
+ }
279
+ }
280
+ return value;
281
+ }
282
+ return transformValue(data);
283
+ }
284
+
285
+ // src/query-strapi.tsx
286
+ var queryStrapiMeta = {
287
+ name: "queryStrapi",
288
+ displayName: "Query Strapi",
289
+ description: "Query a Strapi collection",
290
+ importPath: "@plasmicpkgs/strapi",
291
+ params: [
292
+ {
293
+ name: "strapiHost",
294
+ type: "string",
295
+ description: "The Strapi host URL (e.g., https://example.com)"
296
+ },
297
+ {
298
+ name: "strapiToken",
299
+ type: "string",
300
+ description: "The Strapi API token (optional, for authenticated requests)"
301
+ },
302
+ {
303
+ name: "collection",
304
+ type: "string",
305
+ description: "The name of the Strapi collection to query"
306
+ },
307
+ {
308
+ name: "filterField",
309
+ type: "choice",
310
+ options: (_, ctx) => {
311
+ return ctx == null ? void 0 : ctx.strapiFields;
312
+ }
313
+ },
314
+ {
315
+ name: "filterValue",
316
+ type: "string",
317
+ description: "The value to filter by (optional, if you want to filter results)"
318
+ },
319
+ {
320
+ name: "filterParameter",
321
+ type: "choice",
322
+ description: "The parameter for filtering (e.g., 'eq', 'contains', etc.) (optional)",
323
+ options: () => {
324
+ return queryParameters.map((item) => ({
325
+ label: item == null ? void 0 : item.label,
326
+ value: item == null ? void 0 : item.value
327
+ }));
328
+ }
329
+ }
330
+ ],
331
+ fnContext: (host, token, collection) => {
332
+ return {
333
+ dataKey: JSON.stringify({ host, token, collection }),
334
+ fetcher: () => __async(void 0, null, function* () {
335
+ if (!host) {
336
+ return {};
337
+ }
338
+ const resp = yield queryStrapi(host, token, collection);
339
+ const collectionData = resp == null ? void 0 : resp.data;
340
+ if (!collectionData) {
341
+ return { strapiFields: [] };
342
+ }
343
+ return { strapiFields: extractFilterableFields(collectionData) };
344
+ })
345
+ };
346
+ }
347
+ };
348
+ function queryStrapi(host, token, collection, filterField, filterValue, filterParameter) {
349
+ return __async(this, null, function* () {
350
+ if (!host || !collection) {
351
+ return null;
352
+ }
353
+ const query = normalizeUrl(host) + "/api/" + collection.trim();
354
+ const requestInit = { method: "GET" };
355
+ if (token) {
356
+ requestInit.headers = { Authorization: "Bearer " + token };
357
+ }
358
+ const queryParams = import_qs.default.stringify(__spreadProps(__spreadValues({}, filterField && filterParameter && filterValue ? {
359
+ filters: {
360
+ [filterField]: {
361
+ [filterParameter]: filterValue
362
+ }
363
+ }
364
+ } : {}), {
365
+ populate: "*"
366
+ }));
367
+ const resp = yield fetch(`${query}?${queryParams}`, requestInit);
368
+ const data = yield resp.json();
369
+ return transformMediaUrls(data, host);
370
+ });
371
+ }
372
+
373
+ // src/index.ts
374
+ function registerStrapi(loader) {
375
+ function _registerFunction(fn, meta) {
376
+ if (loader) {
377
+ loader.registerFunction(fn, meta);
378
+ } else {
379
+ (0, import_registerFunction.default)(fn, meta);
380
+ }
381
+ }
382
+ _registerFunction(queryStrapi, queryStrapiMeta);
383
+ }
384
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/query-strapi.tsx", "../src/strapi-compat.ts", "../src/utils.ts"],
4
+ "sourcesContent": ["import registerFunction, {\n CustomFunctionMeta,\n} from \"@plasmicapp/host/registerFunction\";\nimport { queryStrapi, queryStrapiMeta } from \"./query-strapi\";\n\nexport function registerStrapi(loader?: { registerFunction: any }) {\n function _registerFunction<T extends (...args: any[]) => any>(\n fn: T,\n meta: CustomFunctionMeta<T>\n ) {\n if (loader) {\n loader.registerFunction(fn, meta);\n } else {\n registerFunction(fn, meta);\n }\n }\n\n _registerFunction(queryStrapi, queryStrapiMeta);\n}\n\nexport { queryStrapi };\n\n// used by @plasmicpkgs/plasmic-strapi\nexport {\n getItemKeys as _getFieldKeys,\n getFieldValue as _getFieldValue,\n getId as _getId,\n getMediaAttributes as _getMediaAttributes,\n isStrapiItem as _isStrapiItem,\n isStrapiItemArray as _isStrapiItemArray,\n isStrapiPrimitive as _isStrapiPrimitive,\n} from \"./strapi-compat\";\nexport {\n extractDisplayableFields as _extractDisplayableFields,\n extractFilterableFields as _extractFilterableFields,\n isImage as _isImage,\n queryParameters as _queryParameters,\n} from \"./utils\";\n", "import { CustomFunctionMeta } from \"@plasmicapp/host/registerFunction\";\nimport qs from \"qs\";\nimport { StrapiQueryResponse } from \"./strapi-compat\";\nimport {\n extractFilterableFields,\n normalizeUrl,\n queryParameters,\n transformMediaUrls,\n} from \"./utils\";\n\nexport const queryStrapiMeta: CustomFunctionMeta<typeof queryStrapi> = {\n name: \"queryStrapi\",\n displayName: \"Query Strapi\",\n description: \"Query a Strapi collection\",\n importPath: \"@plasmicpkgs/strapi\",\n params: [\n {\n name: \"strapiHost\",\n type: \"string\",\n description: \"The Strapi host URL (e.g., https://example.com)\",\n },\n {\n name: \"strapiToken\",\n type: \"string\",\n description:\n \"The Strapi API token (optional, for authenticated requests)\",\n },\n {\n name: \"collection\",\n type: \"string\",\n description: \"The name of the Strapi collection to query\",\n },\n {\n name: \"filterField\",\n type: \"choice\",\n options: (_, ctx) => {\n return ctx?.strapiFields;\n },\n },\n {\n name: \"filterValue\",\n type: \"string\",\n description:\n \"The value to filter by (optional, if you want to filter results)\",\n },\n {\n name: \"filterParameter\",\n type: \"choice\",\n description:\n \"The parameter for filtering (e.g., 'eq', 'contains', etc.) (optional)\",\n options: () => {\n return queryParameters.map((item: any) => ({\n label: item?.label,\n value: item?.value,\n }));\n },\n },\n ],\n fnContext: (host, token, collection) => {\n return {\n dataKey: JSON.stringify({ host, token, collection }),\n fetcher: async () => {\n if (!host) {\n return {};\n }\n const resp = await queryStrapi(host, token, collection);\n const collectionData = resp?.data;\n if (!collectionData) {\n return { strapiFields: [] };\n }\n\n return { strapiFields: extractFilterableFields(collectionData) };\n },\n };\n },\n};\n\nexport async function queryStrapi(\n host: string,\n token: string | undefined,\n collection: string | undefined,\n filterField?: string,\n filterValue?: string,\n filterParameter?: string\n): Promise<StrapiQueryResponse | null> {\n if (!host || !collection) {\n return null;\n }\n\n const query = normalizeUrl(host) + \"/api/\" + collection.trim();\n\n const requestInit: RequestInit = { method: \"GET\" };\n if (token) {\n requestInit.headers = { Authorization: \"Bearer \" + token };\n }\n\n const queryParams = qs.stringify({\n ...(filterField && filterParameter && filterValue\n ? {\n filters: {\n [filterField]: {\n [filterParameter]: filterValue,\n },\n },\n }\n : {}),\n populate: \"*\",\n });\n\n const resp = await fetch(`${query}?${queryParams}`, requestInit);\n const data = await resp.json();\n\n // Transform all relative media URLs to absolute URLs\n return transformMediaUrls(data, host);\n}\n", "// This file contains Strapi code for handling v4/v5 compatibility.\n// https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/new-response-format\n\nexport interface StrapiQueryResponse {\n data: StrapiItem[];\n meta: {\n pagination: {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n };\n };\n}\n\n/** A primitive, item, item array, or null (for optional fields). */\nexport type StrapiValue =\n | boolean\n | number\n | string\n | StrapiItem\n | ReadonlyArray<StrapiItem>\n | ReadonlyArray<any> // For rich text content, JSON fields, etc.\n | Record<string, any> // For JSON fields, metadata objects, etc.\n | null;\ntype StrapiValueV4 =\n | boolean\n | number\n | string\n | { data: StrapiItemV4 | ReadonlyArray<StrapiItemV4> }\n | ReadonlyArray<any> // For rich text content, JSON fields, etc.\n | Record<string, any> // For JSON fields, metadata objects, etc.\n | null;\ntype StrapiValueV5 =\n | boolean\n | number\n | string\n | StrapiItemV5\n | ReadonlyArray<StrapiItemV5>\n | ReadonlyArray<any> // For rich text content, JSON fields, etc.\n | Record<string, any> // For JSON fields, metadata objects, etc.\n | null;\n\n/** A content item or media item. */\nexport type StrapiItem = StrapiItemV4 | StrapiItemV5;\nexport interface StrapiItemV4 {\n id: number;\n attributes: {\n [attribute: string]: StrapiValueV4;\n };\n}\nexport interface StrapiItemV5 {\n documentId: string;\n [attribute: string]: StrapiValueV5;\n}\nfunction isV5Item(item: StrapiItem): item is StrapiItemV5 {\n return \"documentId\" in item;\n}\n\nfunction isV4Item(item: StrapiItem): item is StrapiItemV5 {\n return \"id\" in item && \"attributes\" in item;\n}\n\n/** @internal */\nexport function isStrapiPrimitive(\n value: StrapiValue | undefined\n): value is boolean | number | string {\n const type = typeof value;\n return type === \"boolean\" || type === \"number\" || type === \"string\";\n}\n/** @internal */\nexport function isStrapiItem(\n item: StrapiValue | undefined\n): item is StrapiItem {\n if (typeof item !== \"object\" || item === null || Array.isArray(item)) {\n return false;\n }\n // The object must be a valid v5 or v4 item\n return isV5Item(item as any) || isV4Item(item as any);\n}\n/** @internal */\nexport function isStrapiItemArray(\n value: StrapiValue | undefined\n): value is ReadonlyArray<StrapiItem> {\n return typeof value === \"object\" && value !== null && Array.isArray(value);\n}\n\n/** @internal */\nexport function getId(item: StrapiItem): string {\n if (isV5Item(item)) {\n return item.documentId;\n } else {\n // v4\n return item.id.toString();\n }\n}\n\n/** @internal */\nexport function getItemKeys(item: StrapiItem) {\n if (isV5Item(item)) {\n return Object.keys(item).filter((key) => key !== \"documentId\");\n } else {\n // v4\n return Object.keys(item.attributes);\n }\n}\n\n/**\n * Gets the value, or undefined if the field key does not exist.\n * @internal\n */\nexport function getFieldValue(\n item: StrapiItem,\n key: string\n): StrapiValue | undefined {\n if (isV5Item(item)) {\n return item[key];\n } else {\n // v4\n const value = item.attributes[key];\n if (value === null || value === undefined) {\n return value;\n }\n switch (typeof value) {\n case \"boolean\":\n case \"number\":\n case \"string\":\n return value;\n case \"object\":\n if (value && \"data\" in value) {\n return value.data;\n } else {\n return undefined;\n }\n default:\n return undefined;\n }\n }\n}\n\n/** This includes any asset such as image, video, audio, file */\nexport interface StrapiMediaAttributes {\n url: string;\n mime: string;\n ext: string;\n size: number;\n // width and height are null for non-image media (e.g. audio files)\n width: number | null;\n height: number | null;\n formats?: { [key: string]: Omit<StrapiMediaAttributes, \"formats\"> };\n // Added by transformMediaUrls - absolute URL with host prepended\n absoluteUrl?: string;\n}\n\nexport interface StrapiImageAttribute extends StrapiMediaAttributes {\n width: number;\n height: number;\n}\n/**\n * Gets media attributes if it's a media item.\n *\n * This is the small subset of the fields that we care about.\n *\n * @internal\n */\nexport function getMediaAttributes(\n value: StrapiItem\n): StrapiMediaAttributes | undefined {\n const attributes = isV5Item(value) ? value : value.attributes;\n if (\n \"url\" in attributes &&\n \"mime\" in attributes &&\n \"ext\" in attributes &&\n \"size\" in attributes\n ) {\n return attributes as { [attribute: string]: any } as StrapiMediaAttributes;\n } else {\n return undefined;\n }\n}\n", "import {\n StrapiImageAttribute,\n StrapiItem,\n StrapiMediaAttributes,\n StrapiQueryResponse,\n getFieldValue,\n getItemKeys,\n getMediaAttributes,\n isStrapiItem,\n isStrapiPrimitive,\n} from \"./strapi-compat\";\n\n/**\n * https://docs-v4.strapi.io/dev-docs/api/entity-service/filter\n * @internal\n */\nexport const queryParameters = [\n {\n value: \"$eq\",\n label: \"Equal\",\n },\n {\n value: \"$ne\",\n label: \"Not equal\",\n },\n {\n value: \"$lt\",\n label: \"Less than\",\n },\n {\n value: \"$lte\",\n label: \"Less than or equal to\",\n },\n {\n value: \"$gt\",\n label: \"Greater than\",\n },\n {\n value: \"$gte\",\n label: \"Greater than or equal to\",\n },\n {\n value: \"$in\",\n label: \"Included in an array\",\n },\n {\n value: \"$notIn\",\n label: \"Not included in an array\",\n },\n {\n value: \"$contains\",\n label: \"Contains\",\n },\n {\n value: \"$notContains\",\n label: \"Does not contain\",\n },\n];\n\n/**\n * Checks if the media attribute contains an image media\n * @internal\n */\nexport function isImage(\n mediaAttr: StrapiMediaAttributes\n): mediaAttr is StrapiImageAttribute {\n return mediaAttr?.mime.startsWith(\"image\");\n}\n\n/**\n * Removes leading and trailing slash and whitespace characters from a URL\n * @internal\n */\nexport function normalizeUrl(url: string): string {\n return (\n url\n .trim()\n // remove leading slash\n .replace(/^\\/+/, \"\")\n // remove leading trailing\n .replace(/\\/+$/, \"\")\n );\n}\n\n/**\n * Extracts fields whose types can be filtered in Plasmic.\n * @internal\n */\nexport function extractFilterableFields(\n items: StrapiItem | StrapiItem[]\n): string[] {\n if (Array.isArray(items)) {\n return Array.from(new Set(items.flatMap(filterableFields)));\n } else {\n return filterableFields(items);\n }\n}\n\nfunction filterableFields(item: StrapiItem): string[] {\n return getItemKeys(item).filter((key) => {\n const value = getFieldValue(item, key);\n return isStrapiPrimitive(value);\n });\n}\n\n/**\n * Extracts fields whose types can be displayed in Plasmic.\n * @internal\n */\nexport function extractDisplayableFields(\n items: StrapiItem | StrapiItem[]\n): string[] {\n if (Array.isArray(items)) {\n return Array.from(new Set(items.flatMap(displayableFields)));\n } else {\n return displayableFields(items);\n }\n}\n\nfunction displayableFields(item: StrapiItem): string[] {\n return getItemKeys(item).filter((key) => {\n const value = getFieldValue(item, key);\n return (\n isStrapiPrimitive(value) ||\n (isStrapiItem(value) && getMediaAttributes(value))\n );\n });\n}\n\n/**\n * Traverses @param data and adds an absoluteUrl field to all media items by prepending the @param host to the url\n * @internal\n */\nexport function transformMediaUrls(\n data: StrapiQueryResponse,\n host: string\n): StrapiQueryResponse {\n if (data === null || data === undefined) {\n return data;\n }\n\n const normalizedHost = normalizeUrl(host);\n\n /**\n * Converts a relative URL to absolute by prepending the host.\n * If URL is already absolute, returns it unchanged.\n */\n function makeAbsoluteUrl(url: string): string {\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) {\n return url;\n }\n return normalizedHost + \"/\" + normalizeUrl(url);\n }\n\n /**\n * Adds absoluteUrl to a media item and its format variations\n */\n function transformMediaItem(mediaAttrs: StrapiMediaAttributes): void {\n mediaAttrs.absoluteUrl = makeAbsoluteUrl(mediaAttrs.url);\n\n // Transform format variations (thumbnail, small, medium, large, etc.)\n if (mediaAttrs.formats && typeof mediaAttrs.formats === \"object\") {\n for (const formatKey of Object.keys(mediaAttrs.formats)) {\n transformMediaItem(mediaAttrs.formats[formatKey]);\n }\n }\n }\n\n /**\n * Recursively traverses a Strapi item and transforms all nested media\n */\n function transformStrapiItem(item: StrapiItem): void {\n const mediaAttrs = getMediaAttributes(item);\n\n if (mediaAttrs) {\n // This item is itself a media item\n transformMediaItem(mediaAttrs);\n } else {\n // This item contains other fields that might be media\n for (const key of getItemKeys(item)) {\n const fieldValue = getFieldValue(item, key);\n transformValue(fieldValue);\n }\n }\n }\n\n /**\n * Recursively traverses and transforms media URLs in any value\n */\n function transformValue(value: any): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (isStrapiPrimitive(value)) {\n return value;\n }\n\n if (Array.isArray(value)) {\n value.forEach(transformValue);\n return value;\n }\n\n if (isStrapiItem(value)) {\n transformStrapiItem(value);\n } else if (typeof value === \"object\") {\n // Plain object - traverse its properties\n for (const key of Object.keys(value)) {\n transformValue(value[key]);\n }\n }\n\n return value;\n }\n\n return transformValue(data);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["qs", "registerFunction"]
7
+ }
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@plasmicpkgs/strapi",
3
+ "version": "0.0.2",
4
+ "description": "Plasmic registration for Strapi",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/plasmicapp/plasmic.git",
8
+ "directory": "plasmicpkgs/strapi"
9
+ },
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "module": "./dist/index.esm.js",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.esm.js",
20
+ "require": "./dist/index.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "scripts": {
27
+ "build": "yarn build:types && yarn build:index",
28
+ "build:types": "yarn tsc",
29
+ "build:index": "node ../../build.mjs ./src/index.ts",
30
+ "test": "TEST_CWD=`pwd` yarn --cwd=../.. test",
31
+ "prepublishOnly": "npm run build",
32
+ "postpublish": "bash ../../scripts/publish-api-doc-model.sh"
33
+ },
34
+ "dependencies": {
35
+ "qs": "^6.11.0"
36
+ },
37
+ "devDependencies": {
38
+ "@plasmicapp/host": "1.0.226",
39
+ "@types/qs": "^6.9.7",
40
+ "typescript": "^5.7.3"
41
+ },
42
+ "peerDependencies": {
43
+ "@plasmicapp/host": "^1.0.211"
44
+ },
45
+ "gitHead": "c39620efa79e8a4f070bd9fd8d7829b34630ffa1"
46
+ }