@plasmicpkgs/strapi 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -55,7 +55,16 @@ export declare const _queryParameters: {
55
55
  label: string;
56
56
  }[];
57
57
 
58
- export declare function queryStrapi(host: string, token: string | undefined, collection: string | undefined, filterField?: string, filterValue?: string, filterParameter?: string): Promise<StrapiQueryResponse | null>;
58
+ export declare function queryStrapi({ host, token, collection, filterField, filterValue, filterParameter, }: QueryStrapiOpts): Promise<StrapiQueryResponse | null>;
59
+
60
+ declare interface QueryStrapiOpts {
61
+ host?: string;
62
+ token?: string;
63
+ collection?: string;
64
+ filterField?: string;
65
+ filterValue?: string;
66
+ filterParameter?: string;
67
+ }
59
68
 
60
69
  export declare function registerStrapi(loader?: {
61
70
  registerFunction: any;
package/dist/index.esm.js CHANGED
@@ -247,52 +247,58 @@ var queryStrapiMeta = {
247
247
  importPath: "@plasmicpkgs/strapi",
248
248
  params: [
249
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
- }));
250
+ name: "opts",
251
+ type: "object",
252
+ display: "flatten",
253
+ fields: {
254
+ host: {
255
+ type: "string",
256
+ description: "The Strapi host URL (e.g., https://example.com)"
257
+ },
258
+ token: {
259
+ type: "string",
260
+ description: "The Strapi API token (optional, for authenticated requests)"
261
+ },
262
+ collection: {
263
+ type: "string",
264
+ description: "The name of the Strapi collection to query"
265
+ },
266
+ filterField: {
267
+ type: "choice",
268
+ options: (_, ctx) => {
269
+ return ctx == null ? void 0 : ctx.strapiFields;
270
+ }
271
+ },
272
+ filterValue: {
273
+ type: "string",
274
+ description: "The value to filter by (optional, if you want to filter results)"
275
+ },
276
+ filterParameter: {
277
+ type: "choice",
278
+ description: "The parameter for filtering (e.g., 'eq', 'contains', etc.) (optional)",
279
+ options: () => {
280
+ return queryParameters.map((item) => ({
281
+ label: item == null ? void 0 : item.label,
282
+ value: item == null ? void 0 : item.value
283
+ }));
284
+ }
285
+ }
285
286
  }
286
287
  }
287
288
  ],
288
- fnContext: (host, token, collection) => {
289
+ fnContext: (strapiOpts) => {
290
+ if (!(strapiOpts == null ? void 0 : strapiOpts.host)) {
291
+ return {
292
+ dataKey: "",
293
+ fetcher: () => __async(void 0, null, function* () {
294
+ return {};
295
+ })
296
+ };
297
+ }
289
298
  return {
290
- dataKey: JSON.stringify({ host, token, collection }),
299
+ dataKey: JSON.stringify(strapiOpts),
291
300
  fetcher: () => __async(void 0, null, function* () {
292
- if (!host) {
293
- return {};
294
- }
295
- const resp = yield queryStrapi(host, token, collection);
301
+ const resp = yield queryStrapi(strapiOpts);
296
302
  const collectionData = resp == null ? void 0 : resp.data;
297
303
  if (!collectionData) {
298
304
  return { strapiFields: [] };
@@ -302,8 +308,15 @@ var queryStrapiMeta = {
302
308
  };
303
309
  }
304
310
  };
305
- function queryStrapi(host, token, collection, filterField, filterValue, filterParameter) {
306
- return __async(this, null, function* () {
311
+ function queryStrapi(_0) {
312
+ return __async(this, arguments, function* ({
313
+ host,
314
+ token,
315
+ collection,
316
+ filterField,
317
+ filterValue,
318
+ filterParameter
319
+ }) {
307
320
  if (!host || !collection) {
308
321
  return null;
309
322
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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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",
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: \"opts\",\n type: \"object\",\n display: \"flatten\",\n fields: {\n host: {\n type: \"string\",\n description: \"The Strapi host URL (e.g., https://example.com)\",\n },\n token: {\n type: \"string\",\n description:\n \"The Strapi API token (optional, for authenticated requests)\",\n },\n collection: {\n type: \"string\",\n description: \"The name of the Strapi collection to query\",\n },\n filterField: {\n type: \"choice\",\n options: (_, ctx) => {\n return ctx?.strapiFields;\n },\n },\n filterValue: {\n type: \"string\",\n description:\n \"The value to filter by (optional, if you want to filter results)\",\n },\n 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 },\n ],\n fnContext: (strapiOpts?: QueryStrapiOpts) => {\n if (!strapiOpts?.host) {\n return {\n dataKey: \"\",\n fetcher: async () => {\n return {};\n },\n };\n }\n return {\n dataKey: JSON.stringify(strapiOpts),\n fetcher: async () => {\n const resp = await queryStrapi(strapiOpts);\n const collectionData = resp?.data;\n if (!collectionData) {\n return { strapiFields: [] };\n }\n\n return { strapiFields: extractFilterableFields(collectionData) };\n },\n };\n },\n};\n\nexport interface QueryStrapiOpts {\n host?: string;\n token?: string;\n collection?: string;\n filterField?: string;\n filterValue?: string;\n filterParameter?: string;\n}\n\nexport async function queryStrapi({\n host,\n token,\n collection,\n filterField,\n filterValue,\n filterParameter,\n}: QueryStrapiOpts): 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
6
  "names": []
7
7
  }
package/dist/index.js CHANGED
@@ -290,52 +290,58 @@ var queryStrapiMeta = {
290
290
  importPath: "@plasmicpkgs/strapi",
291
291
  params: [
292
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
- }));
293
+ name: "opts",
294
+ type: "object",
295
+ display: "flatten",
296
+ fields: {
297
+ host: {
298
+ type: "string",
299
+ description: "The Strapi host URL (e.g., https://example.com)"
300
+ },
301
+ token: {
302
+ type: "string",
303
+ description: "The Strapi API token (optional, for authenticated requests)"
304
+ },
305
+ collection: {
306
+ type: "string",
307
+ description: "The name of the Strapi collection to query"
308
+ },
309
+ filterField: {
310
+ type: "choice",
311
+ options: (_, ctx) => {
312
+ return ctx == null ? void 0 : ctx.strapiFields;
313
+ }
314
+ },
315
+ filterValue: {
316
+ type: "string",
317
+ description: "The value to filter by (optional, if you want to filter results)"
318
+ },
319
+ filterParameter: {
320
+ type: "choice",
321
+ description: "The parameter for filtering (e.g., 'eq', 'contains', etc.) (optional)",
322
+ options: () => {
323
+ return queryParameters.map((item) => ({
324
+ label: item == null ? void 0 : item.label,
325
+ value: item == null ? void 0 : item.value
326
+ }));
327
+ }
328
+ }
328
329
  }
329
330
  }
330
331
  ],
331
- fnContext: (host, token, collection) => {
332
+ fnContext: (strapiOpts) => {
333
+ if (!(strapiOpts == null ? void 0 : strapiOpts.host)) {
334
+ return {
335
+ dataKey: "",
336
+ fetcher: () => __async(void 0, null, function* () {
337
+ return {};
338
+ })
339
+ };
340
+ }
332
341
  return {
333
- dataKey: JSON.stringify({ host, token, collection }),
342
+ dataKey: JSON.stringify(strapiOpts),
334
343
  fetcher: () => __async(void 0, null, function* () {
335
- if (!host) {
336
- return {};
337
- }
338
- const resp = yield queryStrapi(host, token, collection);
344
+ const resp = yield queryStrapi(strapiOpts);
339
345
  const collectionData = resp == null ? void 0 : resp.data;
340
346
  if (!collectionData) {
341
347
  return { strapiFields: [] };
@@ -345,8 +351,15 @@ var queryStrapiMeta = {
345
351
  };
346
352
  }
347
353
  };
348
- function queryStrapi(host, token, collection, filterField, filterValue, filterParameter) {
349
- return __async(this, null, function* () {
354
+ function queryStrapi(_0) {
355
+ return __async(this, arguments, function* ({
356
+ host,
357
+ token,
358
+ collection,
359
+ filterField,
360
+ filterValue,
361
+ filterParameter
362
+ }) {
350
363
  if (!host || !collection) {
351
364
  return null;
352
365
  }
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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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",
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: \"opts\",\n type: \"object\",\n display: \"flatten\",\n fields: {\n host: {\n type: \"string\",\n description: \"The Strapi host URL (e.g., https://example.com)\",\n },\n token: {\n type: \"string\",\n description:\n \"The Strapi API token (optional, for authenticated requests)\",\n },\n collection: {\n type: \"string\",\n description: \"The name of the Strapi collection to query\",\n },\n filterField: {\n type: \"choice\",\n options: (_, ctx) => {\n return ctx?.strapiFields;\n },\n },\n filterValue: {\n type: \"string\",\n description:\n \"The value to filter by (optional, if you want to filter results)\",\n },\n 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 },\n ],\n fnContext: (strapiOpts?: QueryStrapiOpts) => {\n if (!strapiOpts?.host) {\n return {\n dataKey: \"\",\n fetcher: async () => {\n return {};\n },\n };\n }\n return {\n dataKey: JSON.stringify(strapiOpts),\n fetcher: async () => {\n const resp = await queryStrapi(strapiOpts);\n const collectionData = resp?.data;\n if (!collectionData) {\n return { strapiFields: [] };\n }\n\n return { strapiFields: extractFilterableFields(collectionData) };\n },\n };\n },\n};\n\nexport interface QueryStrapiOpts {\n host?: string;\n token?: string;\n collection?: string;\n filterField?: string;\n filterValue?: string;\n filterParameter?: string;\n}\n\nexport async function queryStrapi({\n host,\n token,\n collection,\n filterField,\n filterValue,\n filterParameter,\n}: QueryStrapiOpts): 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
6
  "names": ["qs", "registerFunction"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plasmicpkgs/strapi",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "description": "Plasmic registration for Strapi",
5
5
  "repository": {
6
6
  "type": "git",
@@ -35,12 +35,12 @@
35
35
  "qs": "^6.11.0"
36
36
  },
37
37
  "devDependencies": {
38
- "@plasmicapp/host": "1.0.231",
38
+ "@plasmicapp/host": "1.0.233",
39
39
  "@types/qs": "^6.9.7",
40
40
  "typescript": "^5.7.3"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "@plasmicapp/host": "^1.0.211"
44
44
  },
45
- "gitHead": "6b9428c7b4f35d9b84241981523e746e18e2abb7"
45
+ "gitHead": "592d26e3b6a7199b682855fba6458851a37d7e3d"
46
46
  }