@plasmicpkgs/plasmic-strapi 0.1.175 → 0.1.177

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.esm.js CHANGED
@@ -258,8 +258,8 @@ Learn how to [get your API token](https://docs.strapi.io/user-docs/latest/settin
258
258
  host: {
259
259
  type: "string",
260
260
  displayName: "Host",
261
- defaultValueHint: "https://strapi-app.plasmic.app",
262
- defaultValue: "https://strapi-app.plasmic.app",
261
+ defaultValueHint: "https://your_project_id.strapiapp.com/",
262
+ defaultValue: "https://graceful-belief-d395c347a3.strapiapp.com/",
263
263
  description: "Server where you application is hosted."
264
264
  },
265
265
  token: {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.tsx", "../src/StrapiCollection.tsx", "../src/custom-functions.tsx", "../src/utils.ts", "../src/StrapiCredentialsProvider.tsx", "../src/StrapiField.tsx"],
4
- "sourcesContent": ["import registerComponent, {\n ComponentMeta,\n} from \"@plasmicapp/host/registerComponent\";\nimport registerGlobalContext from \"@plasmicapp/host/registerGlobalContext\";\nimport { StrapiCollection, strapiCollectionMeta } from \"./StrapiCollection\";\nimport {\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta,\n} from \"./StrapiCredentialsProvider\";\nimport { StrapiField, strapiFieldMeta } from \"./StrapiField\";\n\nexport function registerAll(loader?: {\n registerComponent: typeof registerComponent;\n registerGlobalContext: typeof registerGlobalContext;\n}) {\n const _registerComponent = <T extends React.ComponentType<any>>(\n Component: T,\n defaultMeta: ComponentMeta<React.ComponentProps<T>>\n ) => {\n if (loader) {\n loader.registerComponent(Component, defaultMeta);\n } else {\n registerComponent(Component, defaultMeta);\n }\n };\n\n if (loader) {\n loader.registerGlobalContext(\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta\n );\n } else {\n registerGlobalContext(\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta\n );\n }\n\n _registerComponent(StrapiCollection, strapiCollectionMeta);\n _registerComponent(StrapiField, strapiFieldMeta);\n}\n\nexport * from \"./custom-functions\";\nexport { StrapiCollection, strapiCollectionMeta } from \"./StrapiCollection\";\nexport {\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta,\n} from \"./StrapiCredentialsProvider\";\nexport { StrapiField, strapiFieldMeta } from \"./StrapiField\";\n", "import { ComponentMeta, DataProvider, repeatedElement } from \"@plasmicapp/host\";\nimport { usePlasmicQueryData } from \"@plasmicapp/query\";\nimport { pascalCase } from \"change-case\";\nimport get from \"dlv\";\nimport React, { ReactNode } from \"react\";\nimport { queryStrapi } from \"./custom-functions\";\nimport { useStrapiCredentials } from \"./StrapiCredentialsProvider\";\nimport { filterFields, modulePath, queryParameters, uniq } from \"./utils\";\n\nconst makeDataProviderName = (collection: string) =>\n `currentStrapi${pascalCase(collection)}Item`;\n\ninterface StrapiCollectionProps {\n name?: string;\n children?: ReactNode;\n className?: string;\n noLayout?: boolean;\n noAutoRepeat?: boolean;\n filterField?: string;\n filterValue?: string;\n limit?: number;\n filterParameter?: string;\n setControlContextData?: (data: { strapiFields: string[] }) => void;\n}\n\nexport const strapiCollectionMeta: ComponentMeta<StrapiCollectionProps> = {\n name: \"StrapiCollection\",\n displayName: \"Strapi Collection\",\n importName: \"StrapiCollection\",\n importPath: modulePath,\n providesData: true,\n description:\n \"Fetches Strapi data of a given collection, and repeats `children` slot content for each row fetched. [See tutorial video](https://www.youtube.com/watch?v=1SLoVY3hkQ4).\",\n defaultStyles: {\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr 1fr 1fr\",\n gridRowGap: \"8px\",\n gridColumnGap: \"8px\",\n padding: \"8px\",\n maxWidth: \"100%\",\n },\n props: {\n children: {\n type: \"slot\",\n defaultValue: {\n type: \"vbox\",\n children: {\n type: \"component\",\n name: \"StrapiField\",\n },\n },\n },\n name: {\n type: \"string\",\n displayName: \"Name\",\n description: \"Name of the collection to be fetched.\",\n defaultValueHint: \"restaurants\",\n },\n filterField: {\n type: \"choice\",\n displayName: \"Filter field\",\n description: \"Field (from Collection) to filter by\",\n options: (_, ctx) => ctx?.strapiFields ?? [],\n hidden: (props) => !props.name,\n },\n filterParameter: {\n type: \"choice\",\n displayName: \"Filter Parameter\",\n description: \"Field Parameter filter by\",\n options: () => {\n return queryParameters.map((item: any) => ({\n label: item?.label,\n value: item?.value,\n }));\n },\n hidden: (props) => !props.filterField,\n },\n filterValue: {\n type: \"string\",\n displayName: \"Filter value\",\n description: \"Value to filter by, should be of filter field type\",\n hidden: (props) => !props.filterParameter,\n },\n limit: {\n type: \"number\",\n displayName: \"Limit\",\n description: \"Maximum number of collections to fetch (0 for unlimited).\",\n },\n noLayout: {\n type: \"boolean\",\n displayName: \"No layout\",\n description:\n \"When set, Strapi Collection will not layout its children; instead, the layout set on its parent element will be used. Useful if you want to set flex gap or control container tag type.\",\n defaultValue: false,\n },\n noAutoRepeat: {\n type: \"boolean\",\n displayName: \"No auto-repeat\",\n description: \"Do not automatically repeat children for every category.\",\n defaultValue: false,\n },\n },\n};\n\nexport function StrapiCollection({\n name,\n filterParameter,\n filterValue,\n filterField,\n limit,\n children,\n className,\n noLayout,\n noAutoRepeat,\n setControlContextData,\n}: StrapiCollectionProps) {\n const { host, token } = useStrapiCredentials();\n\n if (!host) {\n return <div>Please specify a host.</div>;\n }\n\n const cacheKey = JSON.stringify({\n host,\n token,\n name,\n filterField,\n filterValue,\n filterParameter,\n });\n\n const data = usePlasmicQueryData<any[] | null>(cacheKey, async () =>\n queryStrapi(host, token, name, filterField, filterValue, filterParameter)\n );\n\n if (!data?.data) {\n return (\n <div>\n Please configure the Strapi provider with a valid host and token.\n </div>\n );\n }\n\n if (!get(data.data, [\"data\"])) {\n return <div>Please specify a valid collection.</div>;\n }\n\n const collectionData = get(data.data, [\"data\"]) as any[];\n\n const filteredFields = filterFields(collectionData);\n\n setControlContextData?.({\n strapiFields: uniq(filteredFields ?? []),\n });\n if (filterParameter && !filterValue && !filterField) {\n return <div>Please specify a Filter Field and a Filter Value</div>;\n }\n if (!filterParameter && filterValue && !filterField) {\n return <div>Please specify a Filter Parameter and a Filter Field</div>;\n }\n if (!filterParameter && !filterValue && filterField) {\n return <div>Please specify a Filter Parameter and a Filter Value</div>;\n }\n\n if (filterParameter && filterValue && !filterField) {\n return <div>Please specify a Filter Field</div>;\n }\n if (!filterParameter && filterValue && filterField) {\n return <div>Please specify a Filter Parameter</div>;\n }\n if (filterParameter && !filterValue && filterField) {\n return <div>Please specify a Filter Value</div>;\n }\n\n const collection =\n limit! > 0 ? collectionData.slice(0, limit) : collectionData;\n\n if (collection.length === 0) {\n return <div>No collection found </div>;\n }\n\n const repElements = noAutoRepeat\n ? children\n : collection.map((item, index) => (\n <DataProvider\n key={item.documentId ?? item.id}\n name={\"strapiItem\"}\n data={item}\n hidden={true}\n >\n <DataProvider name={makeDataProviderName(name!)} data={item}>\n {repeatedElement(index, children)}\n </DataProvider>\n </DataProvider>\n ));\n\n return (\n <DataProvider name=\"strapiItems\" data={collection}>\n {noLayout ? (\n <> {repElements} </>\n ) : (\n <div className={className}> {repElements} </div>\n )}\n </DataProvider>\n );\n}\n", "import registerFunction, {\n CustomFunctionMeta,\n} from \"@plasmicapp/host/registerFunction\";\nimport get from \"dlv\";\nimport qs from \"qs\";\nimport { filterFields, modulePath, queryParameters, uniq } from \"./utils\";\n\nexport const queryStrapiMeta: CustomFunctionMeta<typeof queryStrapi> = {\n name: \"queryStrapi\",\n displayName: \"Query Strapi\",\n description: \"Query a Strapi collection\",\n importPath: modulePath,\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 data = await queryStrapi(host, token, collection);\n if (!get(data.data, [\"data\"])) {\n return { strapiFields: [] };\n }\n\n const collectionData = get(data.data, [\"data\"]) as any[];\n\n const filteredFields = filterFields(collectionData);\n return { strapiFields: uniq(filteredFields ?? []) };\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) {\n if (!host) {\n return null;\n }\n\n collection = collection ?? \"\";\n\n const query = host.trim() + \"/api/\" + collection.trim();\n\n const requestInit: any = { 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 return resp.json();\n}\n\nexport function registerAllCustomFunctions(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", "export const modulePath = \"@plasmicpkgs/plasmic-strapi\";\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\nexport const uniq = <T>(xs: Array<T>): T[] => Array.from(new Set(xs));\n\nexport const getAttributes = (item?: Record<string, any>) => {\n if (!item) {\n return undefined;\n }\n // Strapi v4\n if (item.attributes) {\n return item.attributes;\n }\n // Strapi v5\n const { documentId: _documentId, locale: _locale, ...rest } = item;\n return rest;\n};\n\nexport function filterFields(collectionData: any[]) {\n return collectionData.flatMap((item: any) => {\n const attributes = getAttributes(item);\n const displayableFields = Object.keys(attributes).filter((field) => {\n const value = attributes[field];\n const maybeMime = getAttributes(value?.data)?.mime;\n return (\n typeof value !== \"object\" ||\n (typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\"))\n );\n });\n return displayableFields;\n });\n}\n", "import { GlobalContextMeta } from \"@plasmicapp/host\";\nimport React, { useContext } from \"react\";\nimport { modulePath } from \"./utils\";\n\ninterface StrapiCredentials {\n host?: string;\n token?: string;\n}\n\nconst StrapiCredentialsContext = React.createContext<\n StrapiCredentials | undefined\n>(undefined);\n\nexport function useStrapiCredentials() {\n const creds = useContext(StrapiCredentialsContext);\n if (!creds) {\n throw new Error(\"Missing StrapiCredentials\");\n }\n\n return creds;\n}\n\nexport const strapiCredentialsProviderMeta: GlobalContextMeta<StrapiCredentials> =\n {\n name: \"StrapiCredentialsProvider\",\n displayName: \"Strapi Credentials Provider\",\n description: `[See tutorial video](https://www.youtube.com/watch?v=1SLoVY3hkQ4).\n\nAPI token is needed only if data is not publicly readable.\n\nLearn how to [get your API token](https://docs.strapi.io/user-docs/latest/settings/managing-global-settings.html#managing-api-tokens).`,\n importName: \"StrapiCredentialsProvider\",\n importPath: modulePath,\n props: {\n host: {\n type: \"string\",\n displayName: \"Host\",\n defaultValueHint: \"https://strapi-app.plasmic.app\",\n defaultValue: \"https://strapi-app.plasmic.app\",\n description: \"Server where you application is hosted.\",\n },\n token: {\n type: \"string\",\n displayName: \"API Token\",\n description:\n \"API Token (generated in http://yourhost/admin/settings/api-tokens) (or leave blank for unauthenticated usage).\",\n },\n },\n };\n\nexport function StrapiCredentialsProvider({\n host,\n token,\n children,\n}: React.PropsWithChildren<StrapiCredentials>) {\n host = host?.replace(/\\/+$/, \"\");\n return (\n <StrapiCredentialsContext.Provider value={{ host, token }}>\n {children}\n </StrapiCredentialsContext.Provider>\n );\n}\n", "import { ComponentMeta, useSelector } from \"@plasmicapp/host\";\nimport get from \"dlv\";\nimport React from \"react\";\nimport { useStrapiCredentials } from \"./StrapiCredentialsProvider\";\nimport { getAttributes, modulePath } from \"./utils\";\n\ninterface StrapiFieldProps {\n className?: string;\n path?: string;\n setControlContextData?: (data: {\n fields: string[];\n isImage: boolean;\n }) => void;\n}\n\nexport const strapiFieldMeta: ComponentMeta<StrapiFieldProps> = {\n name: \"StrapiField\",\n displayName: \"Strapi Field\",\n importName: \"StrapiField\",\n importPath: modulePath,\n props: {\n path: {\n type: \"choice\",\n options: (_, ctx) => {\n return ctx?.fields ?? [];\n },\n displayName: \"Field\",\n description: \"Field name\",\n },\n },\n};\n\nexport function StrapiField({\n className,\n path,\n setControlContextData,\n}: StrapiFieldProps) {\n const item = useSelector(\"strapiItem\");\n if (!item) {\n return <div>StrapiField must be used within a StrapiCollection</div>;\n }\n\n // Getting only fields that aren't objects\n const attributes = getAttributes(item);\n const displayableFields = Object.keys(attributes).filter((field) => {\n const value = attributes[field];\n const maybeMime = getAttributes(value?.data)?.mime;\n return (\n typeof value !== \"object\" ||\n (typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\"))\n );\n });\n\n setControlContextData?.({\n fields: displayableFields,\n isImage: false,\n });\n\n if (!path) {\n return <div>StrapiField must specify a field name.</div>;\n }\n\n const data = get(attributes, [path]);\n const maybeMime = getAttributes(data?.data)?.mime;\n\n setControlContextData?.({\n fields: displayableFields,\n isImage: typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\"),\n });\n\n if (!data) {\n return <div>Please specify a valid field name.</div>;\n } else if (typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\")) {\n const creds = useStrapiCredentials();\n const attrs = getAttributes(data.data);\n const img_url = attrs.url.startsWith(\"http\")\n ? attrs.url\n : creds.host + attrs.url;\n const img_width = attrs.width;\n const img_height = attrs.height;\n return (\n <img\n className={className}\n src={img_url}\n width={300}\n height={(300 * img_height) / img_width}\n />\n );\n } else {\n return <div className={className}>{data}</div>;\n }\n}\n"],
4
+ "sourcesContent": ["import registerComponent, {\n ComponentMeta,\n} from \"@plasmicapp/host/registerComponent\";\nimport registerGlobalContext from \"@plasmicapp/host/registerGlobalContext\";\nimport { StrapiCollection, strapiCollectionMeta } from \"./StrapiCollection\";\nimport {\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta,\n} from \"./StrapiCredentialsProvider\";\nimport { StrapiField, strapiFieldMeta } from \"./StrapiField\";\n\nexport function registerAll(loader?: {\n registerComponent: typeof registerComponent;\n registerGlobalContext: typeof registerGlobalContext;\n}) {\n const _registerComponent = <T extends React.ComponentType<any>>(\n Component: T,\n defaultMeta: ComponentMeta<React.ComponentProps<T>>\n ) => {\n if (loader) {\n loader.registerComponent(Component, defaultMeta);\n } else {\n registerComponent(Component, defaultMeta);\n }\n };\n\n if (loader) {\n loader.registerGlobalContext(\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta\n );\n } else {\n registerGlobalContext(\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta\n );\n }\n\n _registerComponent(StrapiCollection, strapiCollectionMeta);\n _registerComponent(StrapiField, strapiFieldMeta);\n}\n\nexport * from \"./custom-functions\";\nexport { StrapiCollection, strapiCollectionMeta } from \"./StrapiCollection\";\nexport {\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta,\n} from \"./StrapiCredentialsProvider\";\nexport { StrapiField, strapiFieldMeta } from \"./StrapiField\";\n", "import { ComponentMeta, DataProvider, repeatedElement } from \"@plasmicapp/host\";\nimport { usePlasmicQueryData } from \"@plasmicapp/query\";\nimport { pascalCase } from \"change-case\";\nimport get from \"dlv\";\nimport React, { ReactNode } from \"react\";\nimport { queryStrapi } from \"./custom-functions\";\nimport { useStrapiCredentials } from \"./StrapiCredentialsProvider\";\nimport { filterFields, modulePath, queryParameters, uniq } from \"./utils\";\n\nconst makeDataProviderName = (collection: string) =>\n `currentStrapi${pascalCase(collection)}Item`;\n\ninterface StrapiCollectionProps {\n name?: string;\n children?: ReactNode;\n className?: string;\n noLayout?: boolean;\n noAutoRepeat?: boolean;\n filterField?: string;\n filterValue?: string;\n limit?: number;\n filterParameter?: string;\n setControlContextData?: (data: { strapiFields: string[] }) => void;\n}\n\nexport const strapiCollectionMeta: ComponentMeta<StrapiCollectionProps> = {\n name: \"StrapiCollection\",\n displayName: \"Strapi Collection\",\n importName: \"StrapiCollection\",\n importPath: modulePath,\n providesData: true,\n description:\n \"Fetches Strapi data of a given collection, and repeats `children` slot content for each row fetched. [See tutorial video](https://www.youtube.com/watch?v=1SLoVY3hkQ4).\",\n defaultStyles: {\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr 1fr 1fr\",\n gridRowGap: \"8px\",\n gridColumnGap: \"8px\",\n padding: \"8px\",\n maxWidth: \"100%\",\n },\n props: {\n children: {\n type: \"slot\",\n defaultValue: {\n type: \"vbox\",\n children: {\n type: \"component\",\n name: \"StrapiField\",\n },\n },\n },\n name: {\n type: \"string\",\n displayName: \"Name\",\n description: \"Name of the collection to be fetched.\",\n defaultValueHint: \"restaurants\",\n },\n filterField: {\n type: \"choice\",\n displayName: \"Filter field\",\n description: \"Field (from Collection) to filter by\",\n options: (_, ctx) => ctx?.strapiFields ?? [],\n hidden: (props) => !props.name,\n },\n filterParameter: {\n type: \"choice\",\n displayName: \"Filter Parameter\",\n description: \"Field Parameter filter by\",\n options: () => {\n return queryParameters.map((item: any) => ({\n label: item?.label,\n value: item?.value,\n }));\n },\n hidden: (props) => !props.filterField,\n },\n filterValue: {\n type: \"string\",\n displayName: \"Filter value\",\n description: \"Value to filter by, should be of filter field type\",\n hidden: (props) => !props.filterParameter,\n },\n limit: {\n type: \"number\",\n displayName: \"Limit\",\n description: \"Maximum number of collections to fetch (0 for unlimited).\",\n },\n noLayout: {\n type: \"boolean\",\n displayName: \"No layout\",\n description:\n \"When set, Strapi Collection will not layout its children; instead, the layout set on its parent element will be used. Useful if you want to set flex gap or control container tag type.\",\n defaultValue: false,\n },\n noAutoRepeat: {\n type: \"boolean\",\n displayName: \"No auto-repeat\",\n description: \"Do not automatically repeat children for every category.\",\n defaultValue: false,\n },\n },\n};\n\nexport function StrapiCollection({\n name,\n filterParameter,\n filterValue,\n filterField,\n limit,\n children,\n className,\n noLayout,\n noAutoRepeat,\n setControlContextData,\n}: StrapiCollectionProps) {\n const { host, token } = useStrapiCredentials();\n\n if (!host) {\n return <div>Please specify a host.</div>;\n }\n\n const cacheKey = JSON.stringify({\n host,\n token,\n name,\n filterField,\n filterValue,\n filterParameter,\n });\n\n const data = usePlasmicQueryData<any[] | null>(cacheKey, async () =>\n queryStrapi(host, token, name, filterField, filterValue, filterParameter)\n );\n\n if (!data?.data) {\n return (\n <div>\n Please configure the Strapi provider with a valid host and token.\n </div>\n );\n }\n\n if (!get(data.data, [\"data\"])) {\n return <div>Please specify a valid collection.</div>;\n }\n\n const collectionData = get(data.data, [\"data\"]) as any[];\n\n const filteredFields = filterFields(collectionData);\n\n setControlContextData?.({\n strapiFields: uniq(filteredFields ?? []),\n });\n if (filterParameter && !filterValue && !filterField) {\n return <div>Please specify a Filter Field and a Filter Value</div>;\n }\n if (!filterParameter && filterValue && !filterField) {\n return <div>Please specify a Filter Parameter and a Filter Field</div>;\n }\n if (!filterParameter && !filterValue && filterField) {\n return <div>Please specify a Filter Parameter and a Filter Value</div>;\n }\n\n if (filterParameter && filterValue && !filterField) {\n return <div>Please specify a Filter Field</div>;\n }\n if (!filterParameter && filterValue && filterField) {\n return <div>Please specify a Filter Parameter</div>;\n }\n if (filterParameter && !filterValue && filterField) {\n return <div>Please specify a Filter Value</div>;\n }\n\n const collection =\n limit! > 0 ? collectionData.slice(0, limit) : collectionData;\n\n if (collection.length === 0) {\n return <div>No collection found </div>;\n }\n\n const repElements = noAutoRepeat\n ? children\n : collection.map((item, index) => (\n <DataProvider\n key={item.documentId ?? item.id}\n name={\"strapiItem\"}\n data={item}\n hidden={true}\n >\n <DataProvider name={makeDataProviderName(name!)} data={item}>\n {repeatedElement(index, children)}\n </DataProvider>\n </DataProvider>\n ));\n\n return (\n <DataProvider name=\"strapiItems\" data={collection}>\n {noLayout ? (\n <> {repElements} </>\n ) : (\n <div className={className}> {repElements} </div>\n )}\n </DataProvider>\n );\n}\n", "import registerFunction, {\n CustomFunctionMeta,\n} from \"@plasmicapp/host/registerFunction\";\nimport get from \"dlv\";\nimport qs from \"qs\";\nimport { filterFields, modulePath, queryParameters, uniq } from \"./utils\";\n\nexport const queryStrapiMeta: CustomFunctionMeta<typeof queryStrapi> = {\n name: \"queryStrapi\",\n displayName: \"Query Strapi\",\n description: \"Query a Strapi collection\",\n importPath: modulePath,\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 data = await queryStrapi(host, token, collection);\n if (!get(data.data, [\"data\"])) {\n return { strapiFields: [] };\n }\n\n const collectionData = get(data.data, [\"data\"]) as any[];\n\n const filteredFields = filterFields(collectionData);\n return { strapiFields: uniq(filteredFields ?? []) };\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) {\n if (!host) {\n return null;\n }\n\n collection = collection ?? \"\";\n\n const query = host.trim() + \"/api/\" + collection.trim();\n\n const requestInit: any = { 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 return resp.json();\n}\n\nexport function registerAllCustomFunctions(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", "export const modulePath = \"@plasmicpkgs/plasmic-strapi\";\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\nexport const uniq = <T>(xs: Array<T>): T[] => Array.from(new Set(xs));\n\nexport const getAttributes = (item?: Record<string, any>) => {\n if (!item) {\n return undefined;\n }\n // Strapi v4\n if (item.attributes) {\n return item.attributes;\n }\n // Strapi v5\n const { documentId: _documentId, locale: _locale, ...rest } = item;\n return rest;\n};\n\nexport function filterFields(collectionData: any[]) {\n return collectionData.flatMap((item: any) => {\n const attributes = getAttributes(item);\n const displayableFields = Object.keys(attributes).filter((field) => {\n const value = attributes[field];\n const maybeMime = getAttributes(value?.data)?.mime;\n return (\n typeof value !== \"object\" ||\n (typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\"))\n );\n });\n return displayableFields;\n });\n}\n", "import { GlobalContextMeta } from \"@plasmicapp/host\";\nimport React, { useContext } from \"react\";\nimport { modulePath } from \"./utils\";\n\ninterface StrapiCredentials {\n host?: string;\n token?: string;\n}\n\nconst StrapiCredentialsContext = React.createContext<\n StrapiCredentials | undefined\n>(undefined);\n\nexport function useStrapiCredentials() {\n const creds = useContext(StrapiCredentialsContext);\n if (!creds) {\n throw new Error(\"Missing StrapiCredentials\");\n }\n\n return creds;\n}\n\nexport const strapiCredentialsProviderMeta: GlobalContextMeta<StrapiCredentials> =\n {\n name: \"StrapiCredentialsProvider\",\n displayName: \"Strapi Credentials Provider\",\n description: `[See tutorial video](https://www.youtube.com/watch?v=1SLoVY3hkQ4).\n\nAPI token is needed only if data is not publicly readable.\n\nLearn how to [get your API token](https://docs.strapi.io/user-docs/latest/settings/managing-global-settings.html#managing-api-tokens).`,\n importName: \"StrapiCredentialsProvider\",\n importPath: modulePath,\n props: {\n host: {\n type: \"string\",\n displayName: \"Host\",\n defaultValueHint: \"https://your_project_id.strapiapp.com/\",\n defaultValue: \"https://graceful-belief-d395c347a3.strapiapp.com/\",\n description: \"Server where you application is hosted.\",\n },\n token: {\n type: \"string\",\n displayName: \"API Token\",\n description:\n \"API Token (generated in http://yourhost/admin/settings/api-tokens) (or leave blank for unauthenticated usage).\",\n },\n },\n };\n\nexport function StrapiCredentialsProvider({\n host,\n token,\n children,\n}: React.PropsWithChildren<StrapiCredentials>) {\n host = host?.replace(/\\/+$/, \"\");\n return (\n <StrapiCredentialsContext.Provider value={{ host, token }}>\n {children}\n </StrapiCredentialsContext.Provider>\n );\n}\n", "import { ComponentMeta, useSelector } from \"@plasmicapp/host\";\nimport get from \"dlv\";\nimport React from \"react\";\nimport { useStrapiCredentials } from \"./StrapiCredentialsProvider\";\nimport { getAttributes, modulePath } from \"./utils\";\n\ninterface StrapiFieldProps {\n className?: string;\n path?: string;\n setControlContextData?: (data: {\n fields: string[];\n isImage: boolean;\n }) => void;\n}\n\nexport const strapiFieldMeta: ComponentMeta<StrapiFieldProps> = {\n name: \"StrapiField\",\n displayName: \"Strapi Field\",\n importName: \"StrapiField\",\n importPath: modulePath,\n props: {\n path: {\n type: \"choice\",\n options: (_, ctx) => {\n return ctx?.fields ?? [];\n },\n displayName: \"Field\",\n description: \"Field name\",\n },\n },\n};\n\nexport function StrapiField({\n className,\n path,\n setControlContextData,\n}: StrapiFieldProps) {\n const item = useSelector(\"strapiItem\");\n if (!item) {\n return <div>StrapiField must be used within a StrapiCollection</div>;\n }\n\n // Getting only fields that aren't objects\n const attributes = getAttributes(item);\n const displayableFields = Object.keys(attributes).filter((field) => {\n const value = attributes[field];\n const maybeMime = getAttributes(value?.data)?.mime;\n return (\n typeof value !== \"object\" ||\n (typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\"))\n );\n });\n\n setControlContextData?.({\n fields: displayableFields,\n isImage: false,\n });\n\n if (!path) {\n return <div>StrapiField must specify a field name.</div>;\n }\n\n const data = get(attributes, [path]);\n const maybeMime = getAttributes(data?.data)?.mime;\n\n setControlContextData?.({\n fields: displayableFields,\n isImage: typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\"),\n });\n\n if (!data) {\n return <div>Please specify a valid field name.</div>;\n } else if (typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\")) {\n const creds = useStrapiCredentials();\n const attrs = getAttributes(data.data);\n const img_url = attrs.url.startsWith(\"http\")\n ? attrs.url\n : creds.host + attrs.url;\n const img_width = attrs.width;\n const img_height = attrs.height;\n return (\n <img\n className={className}\n src={img_url}\n width={300}\n height={(300 * img_height) / img_width}\n />\n );\n } else {\n return <div className={className}>{data}</div>;\n }\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["get", "React", "React", "get", "get", "React", "React", "_a", "maybeMime", "get"]
7
7
  }
package/dist/index.js CHANGED
@@ -298,8 +298,8 @@ Learn how to [get your API token](https://docs.strapi.io/user-docs/latest/settin
298
298
  host: {
299
299
  type: "string",
300
300
  displayName: "Host",
301
- defaultValueHint: "https://strapi-app.plasmic.app",
302
- defaultValue: "https://strapi-app.plasmic.app",
301
+ defaultValueHint: "https://your_project_id.strapiapp.com/",
302
+ defaultValue: "https://graceful-belief-d395c347a3.strapiapp.com/",
303
303
  description: "Server where you application is hosted."
304
304
  },
305
305
  token: {
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.tsx", "../src/StrapiCollection.tsx", "../src/custom-functions.tsx", "../src/utils.ts", "../src/StrapiCredentialsProvider.tsx", "../src/StrapiField.tsx"],
4
- "sourcesContent": ["import registerComponent, {\n ComponentMeta,\n} from \"@plasmicapp/host/registerComponent\";\nimport registerGlobalContext from \"@plasmicapp/host/registerGlobalContext\";\nimport { StrapiCollection, strapiCollectionMeta } from \"./StrapiCollection\";\nimport {\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta,\n} from \"./StrapiCredentialsProvider\";\nimport { StrapiField, strapiFieldMeta } from \"./StrapiField\";\n\nexport function registerAll(loader?: {\n registerComponent: typeof registerComponent;\n registerGlobalContext: typeof registerGlobalContext;\n}) {\n const _registerComponent = <T extends React.ComponentType<any>>(\n Component: T,\n defaultMeta: ComponentMeta<React.ComponentProps<T>>\n ) => {\n if (loader) {\n loader.registerComponent(Component, defaultMeta);\n } else {\n registerComponent(Component, defaultMeta);\n }\n };\n\n if (loader) {\n loader.registerGlobalContext(\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta\n );\n } else {\n registerGlobalContext(\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta\n );\n }\n\n _registerComponent(StrapiCollection, strapiCollectionMeta);\n _registerComponent(StrapiField, strapiFieldMeta);\n}\n\nexport * from \"./custom-functions\";\nexport { StrapiCollection, strapiCollectionMeta } from \"./StrapiCollection\";\nexport {\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta,\n} from \"./StrapiCredentialsProvider\";\nexport { StrapiField, strapiFieldMeta } from \"./StrapiField\";\n", "import { ComponentMeta, DataProvider, repeatedElement } from \"@plasmicapp/host\";\nimport { usePlasmicQueryData } from \"@plasmicapp/query\";\nimport { pascalCase } from \"change-case\";\nimport get from \"dlv\";\nimport React, { ReactNode } from \"react\";\nimport { queryStrapi } from \"./custom-functions\";\nimport { useStrapiCredentials } from \"./StrapiCredentialsProvider\";\nimport { filterFields, modulePath, queryParameters, uniq } from \"./utils\";\n\nconst makeDataProviderName = (collection: string) =>\n `currentStrapi${pascalCase(collection)}Item`;\n\ninterface StrapiCollectionProps {\n name?: string;\n children?: ReactNode;\n className?: string;\n noLayout?: boolean;\n noAutoRepeat?: boolean;\n filterField?: string;\n filterValue?: string;\n limit?: number;\n filterParameter?: string;\n setControlContextData?: (data: { strapiFields: string[] }) => void;\n}\n\nexport const strapiCollectionMeta: ComponentMeta<StrapiCollectionProps> = {\n name: \"StrapiCollection\",\n displayName: \"Strapi Collection\",\n importName: \"StrapiCollection\",\n importPath: modulePath,\n providesData: true,\n description:\n \"Fetches Strapi data of a given collection, and repeats `children` slot content for each row fetched. [See tutorial video](https://www.youtube.com/watch?v=1SLoVY3hkQ4).\",\n defaultStyles: {\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr 1fr 1fr\",\n gridRowGap: \"8px\",\n gridColumnGap: \"8px\",\n padding: \"8px\",\n maxWidth: \"100%\",\n },\n props: {\n children: {\n type: \"slot\",\n defaultValue: {\n type: \"vbox\",\n children: {\n type: \"component\",\n name: \"StrapiField\",\n },\n },\n },\n name: {\n type: \"string\",\n displayName: \"Name\",\n description: \"Name of the collection to be fetched.\",\n defaultValueHint: \"restaurants\",\n },\n filterField: {\n type: \"choice\",\n displayName: \"Filter field\",\n description: \"Field (from Collection) to filter by\",\n options: (_, ctx) => ctx?.strapiFields ?? [],\n hidden: (props) => !props.name,\n },\n filterParameter: {\n type: \"choice\",\n displayName: \"Filter Parameter\",\n description: \"Field Parameter filter by\",\n options: () => {\n return queryParameters.map((item: any) => ({\n label: item?.label,\n value: item?.value,\n }));\n },\n hidden: (props) => !props.filterField,\n },\n filterValue: {\n type: \"string\",\n displayName: \"Filter value\",\n description: \"Value to filter by, should be of filter field type\",\n hidden: (props) => !props.filterParameter,\n },\n limit: {\n type: \"number\",\n displayName: \"Limit\",\n description: \"Maximum number of collections to fetch (0 for unlimited).\",\n },\n noLayout: {\n type: \"boolean\",\n displayName: \"No layout\",\n description:\n \"When set, Strapi Collection will not layout its children; instead, the layout set on its parent element will be used. Useful if you want to set flex gap or control container tag type.\",\n defaultValue: false,\n },\n noAutoRepeat: {\n type: \"boolean\",\n displayName: \"No auto-repeat\",\n description: \"Do not automatically repeat children for every category.\",\n defaultValue: false,\n },\n },\n};\n\nexport function StrapiCollection({\n name,\n filterParameter,\n filterValue,\n filterField,\n limit,\n children,\n className,\n noLayout,\n noAutoRepeat,\n setControlContextData,\n}: StrapiCollectionProps) {\n const { host, token } = useStrapiCredentials();\n\n if (!host) {\n return <div>Please specify a host.</div>;\n }\n\n const cacheKey = JSON.stringify({\n host,\n token,\n name,\n filterField,\n filterValue,\n filterParameter,\n });\n\n const data = usePlasmicQueryData<any[] | null>(cacheKey, async () =>\n queryStrapi(host, token, name, filterField, filterValue, filterParameter)\n );\n\n if (!data?.data) {\n return (\n <div>\n Please configure the Strapi provider with a valid host and token.\n </div>\n );\n }\n\n if (!get(data.data, [\"data\"])) {\n return <div>Please specify a valid collection.</div>;\n }\n\n const collectionData = get(data.data, [\"data\"]) as any[];\n\n const filteredFields = filterFields(collectionData);\n\n setControlContextData?.({\n strapiFields: uniq(filteredFields ?? []),\n });\n if (filterParameter && !filterValue && !filterField) {\n return <div>Please specify a Filter Field and a Filter Value</div>;\n }\n if (!filterParameter && filterValue && !filterField) {\n return <div>Please specify a Filter Parameter and a Filter Field</div>;\n }\n if (!filterParameter && !filterValue && filterField) {\n return <div>Please specify a Filter Parameter and a Filter Value</div>;\n }\n\n if (filterParameter && filterValue && !filterField) {\n return <div>Please specify a Filter Field</div>;\n }\n if (!filterParameter && filterValue && filterField) {\n return <div>Please specify a Filter Parameter</div>;\n }\n if (filterParameter && !filterValue && filterField) {\n return <div>Please specify a Filter Value</div>;\n }\n\n const collection =\n limit! > 0 ? collectionData.slice(0, limit) : collectionData;\n\n if (collection.length === 0) {\n return <div>No collection found </div>;\n }\n\n const repElements = noAutoRepeat\n ? children\n : collection.map((item, index) => (\n <DataProvider\n key={item.documentId ?? item.id}\n name={\"strapiItem\"}\n data={item}\n hidden={true}\n >\n <DataProvider name={makeDataProviderName(name!)} data={item}>\n {repeatedElement(index, children)}\n </DataProvider>\n </DataProvider>\n ));\n\n return (\n <DataProvider name=\"strapiItems\" data={collection}>\n {noLayout ? (\n <> {repElements} </>\n ) : (\n <div className={className}> {repElements} </div>\n )}\n </DataProvider>\n );\n}\n", "import registerFunction, {\n CustomFunctionMeta,\n} from \"@plasmicapp/host/registerFunction\";\nimport get from \"dlv\";\nimport qs from \"qs\";\nimport { filterFields, modulePath, queryParameters, uniq } from \"./utils\";\n\nexport const queryStrapiMeta: CustomFunctionMeta<typeof queryStrapi> = {\n name: \"queryStrapi\",\n displayName: \"Query Strapi\",\n description: \"Query a Strapi collection\",\n importPath: modulePath,\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 data = await queryStrapi(host, token, collection);\n if (!get(data.data, [\"data\"])) {\n return { strapiFields: [] };\n }\n\n const collectionData = get(data.data, [\"data\"]) as any[];\n\n const filteredFields = filterFields(collectionData);\n return { strapiFields: uniq(filteredFields ?? []) };\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) {\n if (!host) {\n return null;\n }\n\n collection = collection ?? \"\";\n\n const query = host.trim() + \"/api/\" + collection.trim();\n\n const requestInit: any = { 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 return resp.json();\n}\n\nexport function registerAllCustomFunctions(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", "export const modulePath = \"@plasmicpkgs/plasmic-strapi\";\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\nexport const uniq = <T>(xs: Array<T>): T[] => Array.from(new Set(xs));\n\nexport const getAttributes = (item?: Record<string, any>) => {\n if (!item) {\n return undefined;\n }\n // Strapi v4\n if (item.attributes) {\n return item.attributes;\n }\n // Strapi v5\n const { documentId: _documentId, locale: _locale, ...rest } = item;\n return rest;\n};\n\nexport function filterFields(collectionData: any[]) {\n return collectionData.flatMap((item: any) => {\n const attributes = getAttributes(item);\n const displayableFields = Object.keys(attributes).filter((field) => {\n const value = attributes[field];\n const maybeMime = getAttributes(value?.data)?.mime;\n return (\n typeof value !== \"object\" ||\n (typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\"))\n );\n });\n return displayableFields;\n });\n}\n", "import { GlobalContextMeta } from \"@plasmicapp/host\";\nimport React, { useContext } from \"react\";\nimport { modulePath } from \"./utils\";\n\ninterface StrapiCredentials {\n host?: string;\n token?: string;\n}\n\nconst StrapiCredentialsContext = React.createContext<\n StrapiCredentials | undefined\n>(undefined);\n\nexport function useStrapiCredentials() {\n const creds = useContext(StrapiCredentialsContext);\n if (!creds) {\n throw new Error(\"Missing StrapiCredentials\");\n }\n\n return creds;\n}\n\nexport const strapiCredentialsProviderMeta: GlobalContextMeta<StrapiCredentials> =\n {\n name: \"StrapiCredentialsProvider\",\n displayName: \"Strapi Credentials Provider\",\n description: `[See tutorial video](https://www.youtube.com/watch?v=1SLoVY3hkQ4).\n\nAPI token is needed only if data is not publicly readable.\n\nLearn how to [get your API token](https://docs.strapi.io/user-docs/latest/settings/managing-global-settings.html#managing-api-tokens).`,\n importName: \"StrapiCredentialsProvider\",\n importPath: modulePath,\n props: {\n host: {\n type: \"string\",\n displayName: \"Host\",\n defaultValueHint: \"https://strapi-app.plasmic.app\",\n defaultValue: \"https://strapi-app.plasmic.app\",\n description: \"Server where you application is hosted.\",\n },\n token: {\n type: \"string\",\n displayName: \"API Token\",\n description:\n \"API Token (generated in http://yourhost/admin/settings/api-tokens) (or leave blank for unauthenticated usage).\",\n },\n },\n };\n\nexport function StrapiCredentialsProvider({\n host,\n token,\n children,\n}: React.PropsWithChildren<StrapiCredentials>) {\n host = host?.replace(/\\/+$/, \"\");\n return (\n <StrapiCredentialsContext.Provider value={{ host, token }}>\n {children}\n </StrapiCredentialsContext.Provider>\n );\n}\n", "import { ComponentMeta, useSelector } from \"@plasmicapp/host\";\nimport get from \"dlv\";\nimport React from \"react\";\nimport { useStrapiCredentials } from \"./StrapiCredentialsProvider\";\nimport { getAttributes, modulePath } from \"./utils\";\n\ninterface StrapiFieldProps {\n className?: string;\n path?: string;\n setControlContextData?: (data: {\n fields: string[];\n isImage: boolean;\n }) => void;\n}\n\nexport const strapiFieldMeta: ComponentMeta<StrapiFieldProps> = {\n name: \"StrapiField\",\n displayName: \"Strapi Field\",\n importName: \"StrapiField\",\n importPath: modulePath,\n props: {\n path: {\n type: \"choice\",\n options: (_, ctx) => {\n return ctx?.fields ?? [];\n },\n displayName: \"Field\",\n description: \"Field name\",\n },\n },\n};\n\nexport function StrapiField({\n className,\n path,\n setControlContextData,\n}: StrapiFieldProps) {\n const item = useSelector(\"strapiItem\");\n if (!item) {\n return <div>StrapiField must be used within a StrapiCollection</div>;\n }\n\n // Getting only fields that aren't objects\n const attributes = getAttributes(item);\n const displayableFields = Object.keys(attributes).filter((field) => {\n const value = attributes[field];\n const maybeMime = getAttributes(value?.data)?.mime;\n return (\n typeof value !== \"object\" ||\n (typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\"))\n );\n });\n\n setControlContextData?.({\n fields: displayableFields,\n isImage: false,\n });\n\n if (!path) {\n return <div>StrapiField must specify a field name.</div>;\n }\n\n const data = get(attributes, [path]);\n const maybeMime = getAttributes(data?.data)?.mime;\n\n setControlContextData?.({\n fields: displayableFields,\n isImage: typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\"),\n });\n\n if (!data) {\n return <div>Please specify a valid field name.</div>;\n } else if (typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\")) {\n const creds = useStrapiCredentials();\n const attrs = getAttributes(data.data);\n const img_url = attrs.url.startsWith(\"http\")\n ? attrs.url\n : creds.host + attrs.url;\n const img_width = attrs.width;\n const img_height = attrs.height;\n return (\n <img\n className={className}\n src={img_url}\n width={300}\n height={(300 * img_height) / img_width}\n />\n );\n } else {\n return <div className={className}>{data}</div>;\n }\n}\n"],
4
+ "sourcesContent": ["import registerComponent, {\n ComponentMeta,\n} from \"@plasmicapp/host/registerComponent\";\nimport registerGlobalContext from \"@plasmicapp/host/registerGlobalContext\";\nimport { StrapiCollection, strapiCollectionMeta } from \"./StrapiCollection\";\nimport {\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta,\n} from \"./StrapiCredentialsProvider\";\nimport { StrapiField, strapiFieldMeta } from \"./StrapiField\";\n\nexport function registerAll(loader?: {\n registerComponent: typeof registerComponent;\n registerGlobalContext: typeof registerGlobalContext;\n}) {\n const _registerComponent = <T extends React.ComponentType<any>>(\n Component: T,\n defaultMeta: ComponentMeta<React.ComponentProps<T>>\n ) => {\n if (loader) {\n loader.registerComponent(Component, defaultMeta);\n } else {\n registerComponent(Component, defaultMeta);\n }\n };\n\n if (loader) {\n loader.registerGlobalContext(\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta\n );\n } else {\n registerGlobalContext(\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta\n );\n }\n\n _registerComponent(StrapiCollection, strapiCollectionMeta);\n _registerComponent(StrapiField, strapiFieldMeta);\n}\n\nexport * from \"./custom-functions\";\nexport { StrapiCollection, strapiCollectionMeta } from \"./StrapiCollection\";\nexport {\n StrapiCredentialsProvider,\n strapiCredentialsProviderMeta,\n} from \"./StrapiCredentialsProvider\";\nexport { StrapiField, strapiFieldMeta } from \"./StrapiField\";\n", "import { ComponentMeta, DataProvider, repeatedElement } from \"@plasmicapp/host\";\nimport { usePlasmicQueryData } from \"@plasmicapp/query\";\nimport { pascalCase } from \"change-case\";\nimport get from \"dlv\";\nimport React, { ReactNode } from \"react\";\nimport { queryStrapi } from \"./custom-functions\";\nimport { useStrapiCredentials } from \"./StrapiCredentialsProvider\";\nimport { filterFields, modulePath, queryParameters, uniq } from \"./utils\";\n\nconst makeDataProviderName = (collection: string) =>\n `currentStrapi${pascalCase(collection)}Item`;\n\ninterface StrapiCollectionProps {\n name?: string;\n children?: ReactNode;\n className?: string;\n noLayout?: boolean;\n noAutoRepeat?: boolean;\n filterField?: string;\n filterValue?: string;\n limit?: number;\n filterParameter?: string;\n setControlContextData?: (data: { strapiFields: string[] }) => void;\n}\n\nexport const strapiCollectionMeta: ComponentMeta<StrapiCollectionProps> = {\n name: \"StrapiCollection\",\n displayName: \"Strapi Collection\",\n importName: \"StrapiCollection\",\n importPath: modulePath,\n providesData: true,\n description:\n \"Fetches Strapi data of a given collection, and repeats `children` slot content for each row fetched. [See tutorial video](https://www.youtube.com/watch?v=1SLoVY3hkQ4).\",\n defaultStyles: {\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr 1fr 1fr\",\n gridRowGap: \"8px\",\n gridColumnGap: \"8px\",\n padding: \"8px\",\n maxWidth: \"100%\",\n },\n props: {\n children: {\n type: \"slot\",\n defaultValue: {\n type: \"vbox\",\n children: {\n type: \"component\",\n name: \"StrapiField\",\n },\n },\n },\n name: {\n type: \"string\",\n displayName: \"Name\",\n description: \"Name of the collection to be fetched.\",\n defaultValueHint: \"restaurants\",\n },\n filterField: {\n type: \"choice\",\n displayName: \"Filter field\",\n description: \"Field (from Collection) to filter by\",\n options: (_, ctx) => ctx?.strapiFields ?? [],\n hidden: (props) => !props.name,\n },\n filterParameter: {\n type: \"choice\",\n displayName: \"Filter Parameter\",\n description: \"Field Parameter filter by\",\n options: () => {\n return queryParameters.map((item: any) => ({\n label: item?.label,\n value: item?.value,\n }));\n },\n hidden: (props) => !props.filterField,\n },\n filterValue: {\n type: \"string\",\n displayName: \"Filter value\",\n description: \"Value to filter by, should be of filter field type\",\n hidden: (props) => !props.filterParameter,\n },\n limit: {\n type: \"number\",\n displayName: \"Limit\",\n description: \"Maximum number of collections to fetch (0 for unlimited).\",\n },\n noLayout: {\n type: \"boolean\",\n displayName: \"No layout\",\n description:\n \"When set, Strapi Collection will not layout its children; instead, the layout set on its parent element will be used. Useful if you want to set flex gap or control container tag type.\",\n defaultValue: false,\n },\n noAutoRepeat: {\n type: \"boolean\",\n displayName: \"No auto-repeat\",\n description: \"Do not automatically repeat children for every category.\",\n defaultValue: false,\n },\n },\n};\n\nexport function StrapiCollection({\n name,\n filterParameter,\n filterValue,\n filterField,\n limit,\n children,\n className,\n noLayout,\n noAutoRepeat,\n setControlContextData,\n}: StrapiCollectionProps) {\n const { host, token } = useStrapiCredentials();\n\n if (!host) {\n return <div>Please specify a host.</div>;\n }\n\n const cacheKey = JSON.stringify({\n host,\n token,\n name,\n filterField,\n filterValue,\n filterParameter,\n });\n\n const data = usePlasmicQueryData<any[] | null>(cacheKey, async () =>\n queryStrapi(host, token, name, filterField, filterValue, filterParameter)\n );\n\n if (!data?.data) {\n return (\n <div>\n Please configure the Strapi provider with a valid host and token.\n </div>\n );\n }\n\n if (!get(data.data, [\"data\"])) {\n return <div>Please specify a valid collection.</div>;\n }\n\n const collectionData = get(data.data, [\"data\"]) as any[];\n\n const filteredFields = filterFields(collectionData);\n\n setControlContextData?.({\n strapiFields: uniq(filteredFields ?? []),\n });\n if (filterParameter && !filterValue && !filterField) {\n return <div>Please specify a Filter Field and a Filter Value</div>;\n }\n if (!filterParameter && filterValue && !filterField) {\n return <div>Please specify a Filter Parameter and a Filter Field</div>;\n }\n if (!filterParameter && !filterValue && filterField) {\n return <div>Please specify a Filter Parameter and a Filter Value</div>;\n }\n\n if (filterParameter && filterValue && !filterField) {\n return <div>Please specify a Filter Field</div>;\n }\n if (!filterParameter && filterValue && filterField) {\n return <div>Please specify a Filter Parameter</div>;\n }\n if (filterParameter && !filterValue && filterField) {\n return <div>Please specify a Filter Value</div>;\n }\n\n const collection =\n limit! > 0 ? collectionData.slice(0, limit) : collectionData;\n\n if (collection.length === 0) {\n return <div>No collection found </div>;\n }\n\n const repElements = noAutoRepeat\n ? children\n : collection.map((item, index) => (\n <DataProvider\n key={item.documentId ?? item.id}\n name={\"strapiItem\"}\n data={item}\n hidden={true}\n >\n <DataProvider name={makeDataProviderName(name!)} data={item}>\n {repeatedElement(index, children)}\n </DataProvider>\n </DataProvider>\n ));\n\n return (\n <DataProvider name=\"strapiItems\" data={collection}>\n {noLayout ? (\n <> {repElements} </>\n ) : (\n <div className={className}> {repElements} </div>\n )}\n </DataProvider>\n );\n}\n", "import registerFunction, {\n CustomFunctionMeta,\n} from \"@plasmicapp/host/registerFunction\";\nimport get from \"dlv\";\nimport qs from \"qs\";\nimport { filterFields, modulePath, queryParameters, uniq } from \"./utils\";\n\nexport const queryStrapiMeta: CustomFunctionMeta<typeof queryStrapi> = {\n name: \"queryStrapi\",\n displayName: \"Query Strapi\",\n description: \"Query a Strapi collection\",\n importPath: modulePath,\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 data = await queryStrapi(host, token, collection);\n if (!get(data.data, [\"data\"])) {\n return { strapiFields: [] };\n }\n\n const collectionData = get(data.data, [\"data\"]) as any[];\n\n const filteredFields = filterFields(collectionData);\n return { strapiFields: uniq(filteredFields ?? []) };\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) {\n if (!host) {\n return null;\n }\n\n collection = collection ?? \"\";\n\n const query = host.trim() + \"/api/\" + collection.trim();\n\n const requestInit: any = { 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 return resp.json();\n}\n\nexport function registerAllCustomFunctions(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", "export const modulePath = \"@plasmicpkgs/plasmic-strapi\";\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\nexport const uniq = <T>(xs: Array<T>): T[] => Array.from(new Set(xs));\n\nexport const getAttributes = (item?: Record<string, any>) => {\n if (!item) {\n return undefined;\n }\n // Strapi v4\n if (item.attributes) {\n return item.attributes;\n }\n // Strapi v5\n const { documentId: _documentId, locale: _locale, ...rest } = item;\n return rest;\n};\n\nexport function filterFields(collectionData: any[]) {\n return collectionData.flatMap((item: any) => {\n const attributes = getAttributes(item);\n const displayableFields = Object.keys(attributes).filter((field) => {\n const value = attributes[field];\n const maybeMime = getAttributes(value?.data)?.mime;\n return (\n typeof value !== \"object\" ||\n (typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\"))\n );\n });\n return displayableFields;\n });\n}\n", "import { GlobalContextMeta } from \"@plasmicapp/host\";\nimport React, { useContext } from \"react\";\nimport { modulePath } from \"./utils\";\n\ninterface StrapiCredentials {\n host?: string;\n token?: string;\n}\n\nconst StrapiCredentialsContext = React.createContext<\n StrapiCredentials | undefined\n>(undefined);\n\nexport function useStrapiCredentials() {\n const creds = useContext(StrapiCredentialsContext);\n if (!creds) {\n throw new Error(\"Missing StrapiCredentials\");\n }\n\n return creds;\n}\n\nexport const strapiCredentialsProviderMeta: GlobalContextMeta<StrapiCredentials> =\n {\n name: \"StrapiCredentialsProvider\",\n displayName: \"Strapi Credentials Provider\",\n description: `[See tutorial video](https://www.youtube.com/watch?v=1SLoVY3hkQ4).\n\nAPI token is needed only if data is not publicly readable.\n\nLearn how to [get your API token](https://docs.strapi.io/user-docs/latest/settings/managing-global-settings.html#managing-api-tokens).`,\n importName: \"StrapiCredentialsProvider\",\n importPath: modulePath,\n props: {\n host: {\n type: \"string\",\n displayName: \"Host\",\n defaultValueHint: \"https://your_project_id.strapiapp.com/\",\n defaultValue: \"https://graceful-belief-d395c347a3.strapiapp.com/\",\n description: \"Server where you application is hosted.\",\n },\n token: {\n type: \"string\",\n displayName: \"API Token\",\n description:\n \"API Token (generated in http://yourhost/admin/settings/api-tokens) (or leave blank for unauthenticated usage).\",\n },\n },\n };\n\nexport function StrapiCredentialsProvider({\n host,\n token,\n children,\n}: React.PropsWithChildren<StrapiCredentials>) {\n host = host?.replace(/\\/+$/, \"\");\n return (\n <StrapiCredentialsContext.Provider value={{ host, token }}>\n {children}\n </StrapiCredentialsContext.Provider>\n );\n}\n", "import { ComponentMeta, useSelector } from \"@plasmicapp/host\";\nimport get from \"dlv\";\nimport React from \"react\";\nimport { useStrapiCredentials } from \"./StrapiCredentialsProvider\";\nimport { getAttributes, modulePath } from \"./utils\";\n\ninterface StrapiFieldProps {\n className?: string;\n path?: string;\n setControlContextData?: (data: {\n fields: string[];\n isImage: boolean;\n }) => void;\n}\n\nexport const strapiFieldMeta: ComponentMeta<StrapiFieldProps> = {\n name: \"StrapiField\",\n displayName: \"Strapi Field\",\n importName: \"StrapiField\",\n importPath: modulePath,\n props: {\n path: {\n type: \"choice\",\n options: (_, ctx) => {\n return ctx?.fields ?? [];\n },\n displayName: \"Field\",\n description: \"Field name\",\n },\n },\n};\n\nexport function StrapiField({\n className,\n path,\n setControlContextData,\n}: StrapiFieldProps) {\n const item = useSelector(\"strapiItem\");\n if (!item) {\n return <div>StrapiField must be used within a StrapiCollection</div>;\n }\n\n // Getting only fields that aren't objects\n const attributes = getAttributes(item);\n const displayableFields = Object.keys(attributes).filter((field) => {\n const value = attributes[field];\n const maybeMime = getAttributes(value?.data)?.mime;\n return (\n typeof value !== \"object\" ||\n (typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\"))\n );\n });\n\n setControlContextData?.({\n fields: displayableFields,\n isImage: false,\n });\n\n if (!path) {\n return <div>StrapiField must specify a field name.</div>;\n }\n\n const data = get(attributes, [path]);\n const maybeMime = getAttributes(data?.data)?.mime;\n\n setControlContextData?.({\n fields: displayableFields,\n isImage: typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\"),\n });\n\n if (!data) {\n return <div>Please specify a valid field name.</div>;\n } else if (typeof maybeMime === \"string\" && maybeMime.startsWith(\"image\")) {\n const creds = useStrapiCredentials();\n const attrs = getAttributes(data.data);\n const img_url = attrs.url.startsWith(\"http\")\n ? attrs.url\n : creds.host + attrs.url;\n const img_width = attrs.width;\n const img_height = attrs.height;\n return (\n <img\n className={className}\n src={img_url}\n width={300}\n height={(300 * img_height) / img_width}\n />\n );\n } else {\n return <div className={className}>{data}</div>;\n }\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["import_dlv", "import_react", "get", "qs", "registerFunction", "React", "React", "get", "import_host", "import_dlv", "import_react", "React", "_a", "maybeMime", "get", "registerComponent", "registerGlobalContext"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plasmicpkgs/plasmic-strapi",
3
- "version": "0.1.175",
3
+ "version": "0.1.177",
4
4
  "description": "Plasmic Strapi components.",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -47,7 +47,7 @@
47
47
  "qs": "^6.11.0"
48
48
  },
49
49
  "devDependencies": {
50
- "@plasmicapp/host": "1.0.224",
50
+ "@plasmicapp/host": "1.0.225",
51
51
  "@plasmicapp/query": "0.1.80",
52
52
  "@size-limit/preset-small-lib": "^7.0.8",
53
53
  "@types/dlv": "^1.1.2",
@@ -59,5 +59,5 @@
59
59
  "size-limit": "^7.0.8",
60
60
  "typescript": "^5.2.2"
61
61
  },
62
- "gitHead": "abfd8b249d026a1ac8eeaeba5a83a3043e5e82b3"
62
+ "gitHead": "d37fc3f8207cda80c220fc0130fa821c0aed7abe"
63
63
  }