@plasmicpkgs/contentful 0.0.20 → 0.0.22

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
@@ -388,11 +388,13 @@ var queryContentfulMeta = {
388
388
  fields: {
389
389
  space: {
390
390
  type: "string",
391
- description: "Contentful space ID"
391
+ description: "Contentful space ID",
392
+ required: true
392
393
  },
393
394
  accessToken: {
394
395
  type: "string",
395
- description: "Contentful access token"
396
+ description: "Contentful access token",
397
+ required: true
396
398
  },
397
399
  environment: {
398
400
  type: "string",
@@ -402,6 +404,7 @@ var queryContentfulMeta = {
402
404
  type: "choice",
403
405
  displayName: "Content Type",
404
406
  description: "Content type to query",
407
+ required: true,
405
408
  options: (_, ctx) => {
406
409
  var _a2, _b;
407
410
  return (_b = (_a2 = ctx == null ? void 0 : ctx.contentTypes) == null ? void 0 : _a2.map((ct) => ({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/utils.ts", "../src/schema.ts", "../src/where.ts", "../src/query-contentful.ts"],
4
- "sourcesContent": ["import registerFunction, {\n CustomFunctionMeta,\n} from \"@plasmicapp/host/registerFunction\";\nimport {\n _queryContentful,\n queryContentful,\n queryContentfulMeta,\n} from \"./query-contentful\";\n\nexport function registerContentful(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(queryContentful, queryContentfulMeta);\n}\n\nexport {\n // Exports for @plasmicpkgs/plasmic-contentful\n _queryContentful,\n queryContentful,\n};\n\n// Exports for @plasmicpkgs/plasmic-contentful\nexport { denormalizeData as _denormalizeData } from \"./query-contentful\";\nexport type { _Entry } from \"./types\";\nexport { _ensure, _uniq } from \"./utils\";\n", "export const _uniq = <T>(xs: Array<T>): T[] => Array.from(new Set(xs));\nexport const BASE_URL =\n (typeof process !== \"undefined\" &&\n process.env?.NEXT_PUBLIC_CONTENTFUL_BASE_URL) ||\n \"https://cdn.contentful.com\";\n\nexport function _ensure<T>(x: T | null | undefined, msg?: string): T {\n if (x === null || x === undefined) {\n throw new Error(msg ?? `Value must not be undefined or null`);\n } else {\n return x;\n }\n}\n\n/**\n * Capitalizes the first letter of a string\n */\nexport function capitalize(str: string): string {\n if (!str) {\n return str;\n }\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n", "import { BASE_URL } from \"./utils\";\n\nexport interface ContentTypeField {\n id: string;\n name: string;\n type: string;\n required: boolean;\n localized: boolean;\n disabled: boolean;\n}\n\nexport interface ContentTypeSchema {\n sys: { id: string };\n name: string;\n displayField?: string;\n fields: ContentTypeField[];\n}\n\n/**\n * Fetch all content types for a space/environment\n * Returns full schemas which can be used for both dropdown population and field discovery\n */\nexport async function fetchContentTypes(\n space: string,\n accessToken: string,\n environment: string = \"master\"\n): Promise<ContentTypeSchema[]> {\n const url = `${BASE_URL}/spaces/${space}/environments/${environment}/content_types`;\n const params = new URLSearchParams({ access_token: accessToken });\n\n const resp = await fetch(`${url}?${params.toString()}`);\n\n if (!resp.ok) {\n throw new Error(\n `Failed to fetch content types: ${resp.status} ${resp.statusText}`\n );\n }\n\n const data = await resp.json();\n return data.items;\n}\n\n/**\n * Helper to find a specific content type schema from a list\n */\nexport function findContentTypeSchema(\n contentType: string | undefined,\n contentTypes: ContentTypeSchema[] | undefined\n): ContentTypeSchema | undefined {\n if (!contentType || !contentTypes) {\n return undefined;\n }\n return contentTypes.find((ct) => ct.sys.id === contentType);\n}\n", "import type { Field } from \"@react-awesome-query-builder/core\";\nimport type { RulesLogic } from \"json-logic-js\";\nimport type { ContentTypeField, ContentTypeSchema } from \"./schema\";\nimport { capitalize } from \"./utils\";\n\n/**\n * Convert Contentful field type to query builder field configuration\n */\nfunction contentfulSchemaFieldToQueryBuilderField(\n field: ContentTypeField\n): Field | undefined {\n switch (field.type) {\n case \"Integer\":\n case \"Number\":\n return {\n label: capitalize(field.name),\n type: \"number\",\n operators: [\n \"equal\",\n \"not_equal\",\n \"less\",\n \"less_or_equal\",\n \"greater\",\n \"greater_or_equal\",\n \"is_null\",\n \"is_not_null\",\n ],\n };\n\n case \"Boolean\":\n return {\n label: capitalize(field.name),\n type: \"boolean\",\n };\n\n case \"Date\":\n return {\n label: capitalize(field.name),\n type: \"datetime\",\n operators: [\n \"equal\",\n \"not_equal\",\n \"less\",\n \"less_or_equal\",\n \"greater\",\n \"greater_or_equal\",\n \"is_null\",\n \"is_not_null\",\n ],\n };\n\n case \"Symbol\":\n case \"Text\":\n return {\n label: capitalize(field.name),\n type: \"text\",\n operators: [\"equal\", \"not_equal\", \"like\", \"is_null\", \"is_not_null\"],\n };\n\n default:\n return undefined;\n }\n}\n\n/**\n * Build query builder config from content type schema\n */\nexport function schemaToQueryBuilderConfig(schema: ContentTypeSchema) {\n const fields: Record<string, Field> = {};\n\n for (const field of schema.fields) {\n const qbField = contentfulSchemaFieldToQueryBuilderField(field);\n if (qbField) {\n fields[field.id] = qbField;\n }\n }\n\n return {\n fields,\n conjunctions: {\n AND: {\n label: \"All\",\n },\n // OR explicitly omitted - not supported by Contentful API\n },\n settings: {\n showNot: false,\n maxNesting: 1,\n canRegroup: false,\n canLeaveEmptyGroup: false,\n },\n };\n}\n\n/**\n * Maps JsonLogic to Contentful API filters format.\n *\n * See also:\n * - https://www.contentful.com/developers/docs/references/content-delivery-api/\n */\nexport function rulesLogicToContentfulFilters(\n logic: RulesLogic | undefined\n): Record<string, any> {\n if (logic === null || logic === undefined) {\n return {};\n } else if (typeof logic !== \"object\") {\n throw new Error(`unexpected logic: ${JSON.stringify(logic)}`);\n } else if (\"and\" in logic) {\n // Handle AND - flatten to multiple parameters\n // Contentful supports implicit AND between all query parameters\n return logic[\"and\"].reduce((acc: Record<string, any>, condition: any) => {\n return { ...acc, ...rulesLogicToContentfulFilters(condition) };\n }, {});\n } else if (\"or\" in logic) {\n // OR is not supported by Contentful API\n throw new Error(\n \"Contentful API does not support OR operations. Please restructure your query using only AND conditions.\"\n );\n } else if (\"!\" in logic) {\n // NOT is not supported by Contentful API\n throw new Error(\n \"Contentful API does not support NOT operations. Please use field-level negation operators like 'not_equal' ([ne]) instead.\"\n );\n } else if (\"==\" in logic) {\n const [{ var: field }, operand] = logic[\"==\"] as [{ var: string }, unknown];\n if (operand === null) {\n return { [`fields.${field}[exists]`]: \"false\" };\n }\n return {\n [`fields.${field}`]: operand,\n };\n } else if (\"!=\" in logic) {\n const [{ var: field }, operand] = logic[\"!=\"] as [{ var: string }, unknown];\n if (operand === null) {\n return { [`fields.${field}[exists]`]: \"true\" };\n }\n return {\n [`fields.${field}[ne]`]: operand,\n };\n } else if (\"in\" in logic) {\n // Map in operator to Contentful filters format:\n // JsonLogic: { \"in\": [\"searchText\", { \"var\": \"fieldName\" }] }\n // Contentful filters: { \"fields.fieldName[match]\": \"searchText\" }\n const [operand, { var: field }] = logic[\"in\"] as [string, { var: string }];\n return {\n [`fields.${field}[match]`]: operand,\n };\n } else {\n // Map JsonLogic comparison operators to Contentful filters format:\n // JsonLogic: { \"<=\": [{ \"var\": \"age\" }, 18] }\n // Contentful filters: { \"fields.age[lte]\": 18 }\n const [key, value] = Object.entries(logic)[0];\n const apiOp: string | undefined = operatorMapping[key];\n if (apiOp) {\n const [{ var: field }, operand] = value as [{ var: string }, unknown];\n return { [`fields.${field}[${apiOp}]`]: operand };\n }\n\n throw new Error(`unexpected logic: ${JSON.stringify(logic)}`);\n }\n}\n\n/** Maps JsonLogic operator to Contentful filter operator. */\nconst operatorMapping: Record<string, string> = {\n \"<\": \"lt\",\n \"<=\": \"lte\",\n \">\": \"gt\",\n \">=\": \"gte\",\n};\n", "import { CustomFunctionMeta } from \"@plasmicapp/host/registerFunction\";\nimport type { RulesLogic } from \"json-logic-js\";\nimport {\n ContentTypeField,\n ContentTypeSchema,\n fetchContentTypes,\n findContentTypeSchema,\n} from \"./schema\";\nimport { _Entry } from \"./types\";\nimport { BASE_URL, capitalize } from \"./utils\";\nimport {\n rulesLogicToContentfulFilters,\n schemaToQueryBuilderConfig,\n} from \"./where\";\n\nexport const modulePath = \"@plasmicpkgs/contentful\";\n\nexport function denormalizeData(data: any | null): any {\n if (!data?.items || !data?.includes) {\n return data;\n }\n\n const entryMap: { [id: string]: any } = {};\n\n if (data.includes.Entry) {\n data.includes.Entry.forEach((entry: any) => {\n entryMap[entry.sys.id] = entry;\n });\n }\n\n // Track processed fields to avoid following circular references\n const processedFields = new Set<string>();\n\n const denormalizeField = (fieldValue: any): any => {\n if (Array.isArray(fieldValue)) {\n const updatedArray: any[] = fieldValue.map((arrayItem) => {\n return denormalizeField(arrayItem);\n });\n return updatedArray;\n } else if (fieldValue && typeof fieldValue === \"object\") {\n if (\n data.includes.Asset &&\n \"sys\" in fieldValue &&\n fieldValue.sys.linkType === \"Asset\"\n ) {\n const fieldId = fieldValue.sys.id;\n const asset = data.includes.Asset.find(\n (a: any) => a.sys.id === fieldId\n );\n if (asset) {\n fieldValue = {\n ...fieldValue,\n url: \"https:\" + asset.fields?.file?.url,\n };\n } else {\n console.log(`Asset URL not found for ID: ${fieldId}`);\n }\n } else if (\n data.includes.Entry &&\n \"sys\" in fieldValue &&\n fieldValue.sys.linkType === \"Entry\"\n ) {\n const fieldId = fieldValue.sys.id;\n if (entryMap[fieldId]) {\n if (processedFields.has(fieldId)) {\n console.warn(`Circular ref detected for Entry ID: ${fieldId}.`);\n } else {\n fieldValue = {\n ...fieldValue,\n fields: denormalizeItem(entryMap[fieldId]).fields,\n };\n }\n } else {\n console.log(`Entry not found for ID: ${fieldId}`);\n }\n }\n fieldValue = Object.entries(fieldValue).reduce((obj, [key, value]) => {\n if (key === \"sys\" || key === \"fields\") {\n obj[key] = value;\n } else {\n obj[key] = denormalizeField(value);\n }\n return obj;\n }, {} as Record<string, any>);\n }\n\n return fieldValue;\n };\n\n const denormalizeItem = (item: any) => {\n const itemId = item.sys?.id;\n if (itemId) {\n processedFields.add(itemId);\n }\n\n const updatedFields: { [fieldName: string]: unknown | unknown[] } = {};\n for (const fieldName in item.fields) {\n updatedFields[fieldName] = denormalizeField(item.fields[fieldName]);\n }\n\n if (itemId) {\n processedFields.delete(itemId);\n }\n\n return {\n ...item,\n fields: updatedFields ?? undefined,\n };\n };\n\n const itemsWithDenormalizedFields: _Entry[] = data.items.map((item: any) => {\n return denormalizeItem(item);\n });\n\n return {\n ...data,\n items: itemsWithDenormalizedFields,\n };\n}\n\n/**\n * @deprecated These filter props are deprecated. Use `filterLogic` with the query builder instead.\n * Only used by the deprecated ContentfulCollection component for backward compatibility.\n */\nexport interface QueryContentfulOldFilterProps {\n filterField?: string;\n searchParameter?: string;\n filterValue?: string | number;\n}\n\nexport interface QueryContentfulOpts {\n space?: string;\n accessToken?: string;\n environment?: string;\n contentType?: string;\n /**\n * Filter logic using JSON Logic format to filter Contentful entries.\n * See {@link https://www.npmjs.com/package/@types/json-logic-js?activeTab=readme}\n */\n filterLogic?: RulesLogic;\n order?: string;\n reverseOrder?: boolean;\n limit?: number;\n skip?: number;\n include?: number;\n // string type supports comma-separated string as documented in the Contentful API, inserted via the dynamic value editor\n // array type supports multiple fields to be selected via the choice prop editor for convenience\n select?: string | string[];\n locale?: string;\n}\n\n/**\n * Query Contentful with simplified filter props.\n *\n * @deprecated Use {@link queryContentful} with `filterLogic` parameter instead.\n *\n * @example\n * ```ts\n * // Old way (deprecated)\n * _queryContentful({\n * space: 'space-id',\n * accessToken: 'token',\n * contentType: 'article',\n * filterField: 'title',\n * searchParameter: '[match]',\n * filterValue: 'Hello'\n * })\n *\n * // New way\n * queryContentful({\n * space: 'space-id',\n * accessToken: 'token',\n * contentType: 'article',\n * filterLogic: { \"==\": [{ var: \"title\" }, \"Hello\"] }\n * })\n * ```\n */\nexport async function _queryContentful({\n space,\n accessToken,\n environment = \"master\",\n contentType,\n filterLogic,\n filterField,\n searchParameter,\n filterValue,\n order,\n reverseOrder,\n limit,\n skip,\n include,\n select,\n}: QueryContentfulOpts & QueryContentfulOldFilterProps): Promise<any> {\n if (!space || !accessToken) {\n throw new Error(\"Space and accessToken are required\");\n }\n if (!contentType) {\n return null;\n }\n\n const path = `/spaces/${space}/environments/${environment}/entries`;\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"access_token\", accessToken);\n searchParams.set(\"content_type\", contentType);\n\n // Convert filterLogic to Contentful filters\n let filters: Record<string, any> = {};\n if (filterLogic) {\n filters = rulesLogicToContentfulFilters(filterLogic);\n } else if (filterField && searchParameter && filterValue !== undefined) {\n // BACKWARD COMPATIBILITY: Legacy filter props\n filters[`fields.${filterField}${searchParameter}`] = filterValue.toString();\n }\n\n // Apply all filter parameters\n for (const [key, value] of Object.entries(filters)) {\n searchParams.set(key, value.toString());\n }\n\n if (limit) {\n searchParams.set(\"limit\", limit.toString());\n }\n\n if (skip !== undefined) {\n searchParams.set(\"skip\", skip.toString());\n }\n\n if (order) {\n searchParams.set(\n \"order\",\n `${reverseOrder ? \"-\" : \"\"}${\n order.startsWith(\"sys.\") ? order : `fields.${order}`\n }`\n );\n }\n\n if (include !== undefined) {\n searchParams.set(\"include\", include.toString());\n }\n\n if (select) {\n if (Array.isArray(select)) {\n if (select.length > 0) {\n searchParams.set(\"select\", select.join(\",\"));\n }\n } else {\n // The user may pass a comma-separated string as documented in the Contentful API\n searchParams.set(\"select\", select);\n }\n }\n\n const resp = await fetch(`${BASE_URL}${path}?${searchParams.toString()}`);\n const data = await resp.json();\n\n return denormalizeData(data);\n}\n\n/**\n * Query a Contentful content type with optional filtering and ordering.\n *\n * @param opts - Query options including space, accessToken, contentType, filter logic, and pagination\n * @returns Promise resolving to the Contentful query response with denormalized data\n *\n * @example\n * ```ts\n * // Fetch all entries\n * const result = await queryContentful({\n * space: 'your-space-id',\n * accessToken: 'your-access-token',\n * contentType: 'blogPost'\n * });\n *\n * // Fetch with filter\n * const filtered = await queryContentful({\n * space: 'your-space-id',\n * accessToken: 'your-access-token',\n * contentType: 'blogPost',\n * filterLogic: { \"==\": [{ var: \"status\" }, \"published\"] }\n * });\n * ```\n */\nexport async function queryContentful({\n space,\n accessToken,\n environment = \"master\",\n contentType,\n filterLogic,\n}: QueryContentfulOpts): Promise<any> {\n return _queryContentful({\n space,\n accessToken,\n environment,\n contentType,\n filterLogic,\n });\n}\n\nexport const queryContentfulMeta: CustomFunctionMeta<typeof queryContentful> = {\n name: \"queryContentful\",\n displayName: \"Query Contentful\",\n description: \"Query Contentful entries with filtering and ordering\",\n importPath: modulePath,\n isQuery: true,\n params: [\n {\n name: \"opts\",\n type: \"object\",\n display: \"flatten\",\n fields: {\n space: {\n type: \"string\",\n description: \"Contentful space ID\",\n },\n accessToken: {\n type: \"string\",\n description: \"Contentful access token\",\n },\n environment: {\n type: \"string\",\n description: \"Contentful environment (default: master)\",\n },\n contentType: {\n type: \"choice\",\n displayName: \"Content Type\",\n description: \"Content type to query\",\n options: (_: any, ctx: any) => {\n return (\n ctx?.contentTypes?.map((ct: ContentTypeSchema) => ({\n label: ct.name,\n value: ct.sys.id,\n })) ?? []\n );\n },\n },\n filterLogic: {\n type: \"queryBuilder\",\n displayName: \"Filter\",\n description: \"Filter fetched entries. Defaults to fetch all entries.\",\n config: ([opts], ctx: any) => {\n const schema = findContentTypeSchema(\n opts?.contentType,\n ctx?.contentTypes\n );\n\n if (schema) {\n return schemaToQueryBuilderConfig(schema);\n }\n\n return {\n fields: {},\n };\n },\n },\n order: {\n type: \"choice\",\n displayName: \"Order by\",\n description: \"Field to order by (optional)\",\n defaultValueHint: \"sys.updatedAt\",\n options: ([opts], ctx: any) => {\n const systemFields = [\n { label: \"Created at\", value: \"sys.createdAt\" },\n { label: \"Updated at\", value: \"sys.updatedAt\" },\n { label: \"ID\", value: \"sys.id\" },\n ];\n\n const schema = findContentTypeSchema(\n opts?.contentType,\n ctx?.contentTypes\n );\n\n if (schema) {\n const contentFields = schema.fields\n .filter((field: ContentTypeField) => !field.disabled)\n .map((field: ContentTypeField) => ({\n label: capitalize(field.name),\n value: `fields.${field.id}`,\n }));\n\n return [...systemFields, ...contentFields];\n }\n\n return systemFields;\n },\n },\n reverseOrder: {\n type: \"boolean\",\n description: \"Reverse the order\",\n hidden: ([opts]: [QueryContentfulOpts | undefined]) => !opts?.order,\n defaultValueHint: false,\n },\n limit: {\n type: \"number\",\n description: \"Limit number of results\",\n defaultValueHint: 100,\n },\n skip: {\n type: \"number\",\n description: \"Skip number of results (for pagination)\",\n defaultValueHint: 0,\n },\n include: {\n type: \"number\",\n description: \"Depth of linked items to include (max 10)\",\n max: 10,\n min: 0,\n defaultValueHint: 1,\n },\n select: {\n type: \"choice\",\n multiSelect: true,\n description: \"Fields to select. Defaults to all fields.\",\n options: ([opts], ctx: any) => {\n const schema = findContentTypeSchema(\n opts?.contentType,\n ctx?.contentTypes\n );\n\n const fieldOptions = schema\n ? schema.fields\n .filter((field: ContentTypeField) => !field.disabled)\n .map((field: ContentTypeField) => ({\n label: capitalize(field.name), // Use capitalized friendly name from schema\n value: `fields.${field.id}`,\n }))\n : [];\n\n return [\n ...fieldOptions,\n { label: \"Fields only\", value: \"fields\" },\n { label: \"Metadata only\", value: \"sys\" },\n ];\n },\n },\n locale: {\n type: \"string\",\n description: \"Locale code (e.g., en-US)\",\n },\n },\n },\n ],\n fnContext: (contentfulOpts?: QueryContentfulOpts) => {\n if (!contentfulOpts?.space || !contentfulOpts?.accessToken) {\n return {\n dataKey: \"\",\n fetcher: async () => ({\n contentTypes: [],\n }),\n };\n }\n\n // Cache at workspace level (space + environment) to fetch all schemas once.\n // Excluding contentType from cache key means switching content types won't\n // trigger new API calls - we just find the schema in the cached array.\n const workspaceCacheKey = JSON.stringify({\n space: contentfulOpts.space,\n accessToken: contentfulOpts.accessToken,\n environment: contentfulOpts.environment,\n });\n\n return {\n dataKey: workspaceCacheKey,\n fetcher: async () => {\n try {\n // Fetch all content types once (includes full schemas with fields)\n const contentTypes = await fetchContentTypes(\n contentfulOpts.space!,\n contentfulOpts.accessToken!,\n contentfulOpts.environment\n );\n\n return {\n contentTypes,\n };\n } catch (error) {\n console.error(\"Failed to fetch content types:\", error);\n return {\n contentTypes: [],\n };\n }\n },\n };\n },\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import registerFunction, {\n CustomFunctionMeta,\n} from \"@plasmicapp/host/registerFunction\";\nimport {\n _queryContentful,\n queryContentful,\n queryContentfulMeta,\n} from \"./query-contentful\";\n\nexport function registerContentful(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(queryContentful, queryContentfulMeta);\n}\n\nexport {\n // Exports for @plasmicpkgs/plasmic-contentful\n _queryContentful,\n queryContentful,\n};\n\n// Exports for @plasmicpkgs/plasmic-contentful\nexport { denormalizeData as _denormalizeData } from \"./query-contentful\";\nexport type { _Entry } from \"./types\";\nexport { _ensure, _uniq } from \"./utils\";\n", "export const _uniq = <T>(xs: Array<T>): T[] => Array.from(new Set(xs));\nexport const BASE_URL =\n (typeof process !== \"undefined\" &&\n process.env?.NEXT_PUBLIC_CONTENTFUL_BASE_URL) ||\n \"https://cdn.contentful.com\";\n\nexport function _ensure<T>(x: T | null | undefined, msg?: string): T {\n if (x === null || x === undefined) {\n throw new Error(msg ?? `Value must not be undefined or null`);\n } else {\n return x;\n }\n}\n\n/**\n * Capitalizes the first letter of a string\n */\nexport function capitalize(str: string): string {\n if (!str) {\n return str;\n }\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n", "import { BASE_URL } from \"./utils\";\n\nexport interface ContentTypeField {\n id: string;\n name: string;\n type: string;\n required: boolean;\n localized: boolean;\n disabled: boolean;\n}\n\nexport interface ContentTypeSchema {\n sys: { id: string };\n name: string;\n displayField?: string;\n fields: ContentTypeField[];\n}\n\n/**\n * Fetch all content types for a space/environment\n * Returns full schemas which can be used for both dropdown population and field discovery\n */\nexport async function fetchContentTypes(\n space: string,\n accessToken: string,\n environment: string = \"master\"\n): Promise<ContentTypeSchema[]> {\n const url = `${BASE_URL}/spaces/${space}/environments/${environment}/content_types`;\n const params = new URLSearchParams({ access_token: accessToken });\n\n const resp = await fetch(`${url}?${params.toString()}`);\n\n if (!resp.ok) {\n throw new Error(\n `Failed to fetch content types: ${resp.status} ${resp.statusText}`\n );\n }\n\n const data = await resp.json();\n return data.items;\n}\n\n/**\n * Helper to find a specific content type schema from a list\n */\nexport function findContentTypeSchema(\n contentType: string | undefined,\n contentTypes: ContentTypeSchema[] | undefined\n): ContentTypeSchema | undefined {\n if (!contentType || !contentTypes) {\n return undefined;\n }\n return contentTypes.find((ct) => ct.sys.id === contentType);\n}\n", "import type { Field } from \"@react-awesome-query-builder/core\";\nimport type { RulesLogic } from \"json-logic-js\";\nimport type { ContentTypeField, ContentTypeSchema } from \"./schema\";\nimport { capitalize } from \"./utils\";\n\n/**\n * Convert Contentful field type to query builder field configuration\n */\nfunction contentfulSchemaFieldToQueryBuilderField(\n field: ContentTypeField\n): Field | undefined {\n switch (field.type) {\n case \"Integer\":\n case \"Number\":\n return {\n label: capitalize(field.name),\n type: \"number\",\n operators: [\n \"equal\",\n \"not_equal\",\n \"less\",\n \"less_or_equal\",\n \"greater\",\n \"greater_or_equal\",\n \"is_null\",\n \"is_not_null\",\n ],\n };\n\n case \"Boolean\":\n return {\n label: capitalize(field.name),\n type: \"boolean\",\n };\n\n case \"Date\":\n return {\n label: capitalize(field.name),\n type: \"datetime\",\n operators: [\n \"equal\",\n \"not_equal\",\n \"less\",\n \"less_or_equal\",\n \"greater\",\n \"greater_or_equal\",\n \"is_null\",\n \"is_not_null\",\n ],\n };\n\n case \"Symbol\":\n case \"Text\":\n return {\n label: capitalize(field.name),\n type: \"text\",\n operators: [\"equal\", \"not_equal\", \"like\", \"is_null\", \"is_not_null\"],\n };\n\n default:\n return undefined;\n }\n}\n\n/**\n * Build query builder config from content type schema\n */\nexport function schemaToQueryBuilderConfig(schema: ContentTypeSchema) {\n const fields: Record<string, Field> = {};\n\n for (const field of schema.fields) {\n const qbField = contentfulSchemaFieldToQueryBuilderField(field);\n if (qbField) {\n fields[field.id] = qbField;\n }\n }\n\n return {\n fields,\n conjunctions: {\n AND: {\n label: \"All\",\n },\n // OR explicitly omitted - not supported by Contentful API\n },\n settings: {\n showNot: false,\n maxNesting: 1,\n canRegroup: false,\n canLeaveEmptyGroup: false,\n },\n };\n}\n\n/**\n * Maps JsonLogic to Contentful API filters format.\n *\n * See also:\n * - https://www.contentful.com/developers/docs/references/content-delivery-api/\n */\nexport function rulesLogicToContentfulFilters(\n logic: RulesLogic | undefined\n): Record<string, any> {\n if (logic === null || logic === undefined) {\n return {};\n } else if (typeof logic !== \"object\") {\n throw new Error(`unexpected logic: ${JSON.stringify(logic)}`);\n } else if (\"and\" in logic) {\n // Handle AND - flatten to multiple parameters\n // Contentful supports implicit AND between all query parameters\n return logic[\"and\"].reduce((acc: Record<string, any>, condition: any) => {\n return { ...acc, ...rulesLogicToContentfulFilters(condition) };\n }, {});\n } else if (\"or\" in logic) {\n // OR is not supported by Contentful API\n throw new Error(\n \"Contentful API does not support OR operations. Please restructure your query using only AND conditions.\"\n );\n } else if (\"!\" in logic) {\n // NOT is not supported by Contentful API\n throw new Error(\n \"Contentful API does not support NOT operations. Please use field-level negation operators like 'not_equal' ([ne]) instead.\"\n );\n } else if (\"==\" in logic) {\n const [{ var: field }, operand] = logic[\"==\"] as [{ var: string }, unknown];\n if (operand === null) {\n return { [`fields.${field}[exists]`]: \"false\" };\n }\n return {\n [`fields.${field}`]: operand,\n };\n } else if (\"!=\" in logic) {\n const [{ var: field }, operand] = logic[\"!=\"] as [{ var: string }, unknown];\n if (operand === null) {\n return { [`fields.${field}[exists]`]: \"true\" };\n }\n return {\n [`fields.${field}[ne]`]: operand,\n };\n } else if (\"in\" in logic) {\n // Map in operator to Contentful filters format:\n // JsonLogic: { \"in\": [\"searchText\", { \"var\": \"fieldName\" }] }\n // Contentful filters: { \"fields.fieldName[match]\": \"searchText\" }\n const [operand, { var: field }] = logic[\"in\"] as [string, { var: string }];\n return {\n [`fields.${field}[match]`]: operand,\n };\n } else {\n // Map JsonLogic comparison operators to Contentful filters format:\n // JsonLogic: { \"<=\": [{ \"var\": \"age\" }, 18] }\n // Contentful filters: { \"fields.age[lte]\": 18 }\n const [key, value] = Object.entries(logic)[0];\n const apiOp: string | undefined = operatorMapping[key];\n if (apiOp) {\n const [{ var: field }, operand] = value as [{ var: string }, unknown];\n return { [`fields.${field}[${apiOp}]`]: operand };\n }\n\n throw new Error(`unexpected logic: ${JSON.stringify(logic)}`);\n }\n}\n\n/** Maps JsonLogic operator to Contentful filter operator. */\nconst operatorMapping: Record<string, string> = {\n \"<\": \"lt\",\n \"<=\": \"lte\",\n \">\": \"gt\",\n \">=\": \"gte\",\n};\n", "import { CustomFunctionMeta } from \"@plasmicapp/host/registerFunction\";\nimport type { RulesLogic } from \"json-logic-js\";\nimport {\n ContentTypeField,\n ContentTypeSchema,\n fetchContentTypes,\n findContentTypeSchema,\n} from \"./schema\";\nimport { _Entry } from \"./types\";\nimport { BASE_URL, capitalize } from \"./utils\";\nimport {\n rulesLogicToContentfulFilters,\n schemaToQueryBuilderConfig,\n} from \"./where\";\n\nexport const modulePath = \"@plasmicpkgs/contentful\";\n\nexport function denormalizeData(data: any | null): any {\n if (!data?.items || !data?.includes) {\n return data;\n }\n\n const entryMap: { [id: string]: any } = {};\n\n if (data.includes.Entry) {\n data.includes.Entry.forEach((entry: any) => {\n entryMap[entry.sys.id] = entry;\n });\n }\n\n // Track processed fields to avoid following circular references\n const processedFields = new Set<string>();\n\n const denormalizeField = (fieldValue: any): any => {\n if (Array.isArray(fieldValue)) {\n const updatedArray: any[] = fieldValue.map((arrayItem) => {\n return denormalizeField(arrayItem);\n });\n return updatedArray;\n } else if (fieldValue && typeof fieldValue === \"object\") {\n if (\n data.includes.Asset &&\n \"sys\" in fieldValue &&\n fieldValue.sys.linkType === \"Asset\"\n ) {\n const fieldId = fieldValue.sys.id;\n const asset = data.includes.Asset.find(\n (a: any) => a.sys.id === fieldId\n );\n if (asset) {\n fieldValue = {\n ...fieldValue,\n url: \"https:\" + asset.fields?.file?.url,\n };\n } else {\n console.log(`Asset URL not found for ID: ${fieldId}`);\n }\n } else if (\n data.includes.Entry &&\n \"sys\" in fieldValue &&\n fieldValue.sys.linkType === \"Entry\"\n ) {\n const fieldId = fieldValue.sys.id;\n if (entryMap[fieldId]) {\n if (processedFields.has(fieldId)) {\n console.warn(`Circular ref detected for Entry ID: ${fieldId}.`);\n } else {\n fieldValue = {\n ...fieldValue,\n fields: denormalizeItem(entryMap[fieldId]).fields,\n };\n }\n } else {\n console.log(`Entry not found for ID: ${fieldId}`);\n }\n }\n fieldValue = Object.entries(fieldValue).reduce((obj, [key, value]) => {\n if (key === \"sys\" || key === \"fields\") {\n obj[key] = value;\n } else {\n obj[key] = denormalizeField(value);\n }\n return obj;\n }, {} as Record<string, any>);\n }\n\n return fieldValue;\n };\n\n const denormalizeItem = (item: any) => {\n const itemId = item.sys?.id;\n if (itemId) {\n processedFields.add(itemId);\n }\n\n const updatedFields: { [fieldName: string]: unknown | unknown[] } = {};\n for (const fieldName in item.fields) {\n updatedFields[fieldName] = denormalizeField(item.fields[fieldName]);\n }\n\n if (itemId) {\n processedFields.delete(itemId);\n }\n\n return {\n ...item,\n fields: updatedFields ?? undefined,\n };\n };\n\n const itemsWithDenormalizedFields: _Entry[] = data.items.map((item: any) => {\n return denormalizeItem(item);\n });\n\n return {\n ...data,\n items: itemsWithDenormalizedFields,\n };\n}\n\n/**\n * @deprecated These filter props are deprecated. Use `filterLogic` with the query builder instead.\n * Only used by the deprecated ContentfulCollection component for backward compatibility.\n */\nexport interface QueryContentfulOldFilterProps {\n filterField?: string;\n searchParameter?: string;\n filterValue?: string | number;\n}\n\nexport interface QueryContentfulOpts {\n space?: string;\n accessToken?: string;\n environment?: string;\n contentType?: string;\n /**\n * Filter logic using JSON Logic format to filter Contentful entries.\n * See {@link https://www.npmjs.com/package/@types/json-logic-js?activeTab=readme}\n */\n filterLogic?: RulesLogic;\n order?: string;\n reverseOrder?: boolean;\n limit?: number;\n skip?: number;\n include?: number;\n // string type supports comma-separated string as documented in the Contentful API, inserted via the dynamic value editor\n // array type supports multiple fields to be selected via the choice prop editor for convenience\n select?: string | string[];\n locale?: string;\n}\n\n/**\n * Query Contentful with simplified filter props.\n *\n * @deprecated Use {@link queryContentful} with `filterLogic` parameter instead.\n *\n * @example\n * ```ts\n * // Old way (deprecated)\n * _queryContentful({\n * space: 'space-id',\n * accessToken: 'token',\n * contentType: 'article',\n * filterField: 'title',\n * searchParameter: '[match]',\n * filterValue: 'Hello'\n * })\n *\n * // New way\n * queryContentful({\n * space: 'space-id',\n * accessToken: 'token',\n * contentType: 'article',\n * filterLogic: { \"==\": [{ var: \"title\" }, \"Hello\"] }\n * })\n * ```\n */\nexport async function _queryContentful({\n space,\n accessToken,\n environment = \"master\",\n contentType,\n filterLogic,\n filterField,\n searchParameter,\n filterValue,\n order,\n reverseOrder,\n limit,\n skip,\n include,\n select,\n}: QueryContentfulOpts & QueryContentfulOldFilterProps): Promise<any> {\n if (!space || !accessToken) {\n throw new Error(\"Space and accessToken are required\");\n }\n if (!contentType) {\n return null;\n }\n\n const path = `/spaces/${space}/environments/${environment}/entries`;\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"access_token\", accessToken);\n searchParams.set(\"content_type\", contentType);\n\n // Convert filterLogic to Contentful filters\n let filters: Record<string, any> = {};\n if (filterLogic) {\n filters = rulesLogicToContentfulFilters(filterLogic);\n } else if (filterField && searchParameter && filterValue !== undefined) {\n // BACKWARD COMPATIBILITY: Legacy filter props\n filters[`fields.${filterField}${searchParameter}`] = filterValue.toString();\n }\n\n // Apply all filter parameters\n for (const [key, value] of Object.entries(filters)) {\n searchParams.set(key, value.toString());\n }\n\n if (limit) {\n searchParams.set(\"limit\", limit.toString());\n }\n\n if (skip !== undefined) {\n searchParams.set(\"skip\", skip.toString());\n }\n\n if (order) {\n searchParams.set(\n \"order\",\n `${reverseOrder ? \"-\" : \"\"}${\n order.startsWith(\"sys.\") ? order : `fields.${order}`\n }`\n );\n }\n\n if (include !== undefined) {\n searchParams.set(\"include\", include.toString());\n }\n\n if (select) {\n if (Array.isArray(select)) {\n if (select.length > 0) {\n searchParams.set(\"select\", select.join(\",\"));\n }\n } else {\n // The user may pass a comma-separated string as documented in the Contentful API\n searchParams.set(\"select\", select);\n }\n }\n\n const resp = await fetch(`${BASE_URL}${path}?${searchParams.toString()}`);\n const data = await resp.json();\n\n return denormalizeData(data);\n}\n\n/**\n * Query a Contentful content type with optional filtering and ordering.\n *\n * @param opts - Query options including space, accessToken, contentType, filter logic, and pagination\n * @returns Promise resolving to the Contentful query response with denormalized data\n *\n * @example\n * ```ts\n * // Fetch all entries\n * const result = await queryContentful({\n * space: 'your-space-id',\n * accessToken: 'your-access-token',\n * contentType: 'blogPost'\n * });\n *\n * // Fetch with filter\n * const filtered = await queryContentful({\n * space: 'your-space-id',\n * accessToken: 'your-access-token',\n * contentType: 'blogPost',\n * filterLogic: { \"==\": [{ var: \"status\" }, \"published\"] }\n * });\n * ```\n */\nexport async function queryContentful({\n space,\n accessToken,\n environment = \"master\",\n contentType,\n filterLogic,\n}: QueryContentfulOpts): Promise<any> {\n return _queryContentful({\n space,\n accessToken,\n environment,\n contentType,\n filterLogic,\n });\n}\n\nexport const queryContentfulMeta: CustomFunctionMeta<typeof queryContentful> = {\n name: \"queryContentful\",\n displayName: \"Query Contentful\",\n description: \"Query Contentful entries with filtering and ordering\",\n importPath: modulePath,\n isQuery: true,\n params: [\n {\n name: \"opts\",\n type: \"object\",\n display: \"flatten\",\n fields: {\n space: {\n type: \"string\",\n description: \"Contentful space ID\",\n required: true,\n },\n accessToken: {\n type: \"string\",\n description: \"Contentful access token\",\n required: true,\n },\n environment: {\n type: \"string\",\n description: \"Contentful environment (default: master)\",\n },\n contentType: {\n type: \"choice\",\n displayName: \"Content Type\",\n description: \"Content type to query\",\n required: true,\n options: (_: any, ctx: any) => {\n return (\n ctx?.contentTypes?.map((ct: ContentTypeSchema) => ({\n label: ct.name,\n value: ct.sys.id,\n })) ?? []\n );\n },\n },\n filterLogic: {\n type: \"queryBuilder\",\n displayName: \"Filter\",\n description: \"Filter fetched entries. Defaults to fetch all entries.\",\n config: ([opts], ctx: any) => {\n const schema = findContentTypeSchema(\n opts?.contentType,\n ctx?.contentTypes\n );\n\n if (schema) {\n return schemaToQueryBuilderConfig(schema);\n }\n\n return {\n fields: {},\n };\n },\n },\n order: {\n type: \"choice\",\n displayName: \"Order by\",\n description: \"Field to order by (optional)\",\n defaultValueHint: \"sys.updatedAt\",\n options: ([opts], ctx: any) => {\n const systemFields = [\n { label: \"Created at\", value: \"sys.createdAt\" },\n { label: \"Updated at\", value: \"sys.updatedAt\" },\n { label: \"ID\", value: \"sys.id\" },\n ];\n\n const schema = findContentTypeSchema(\n opts?.contentType,\n ctx?.contentTypes\n );\n\n if (schema) {\n const contentFields = schema.fields\n .filter((field: ContentTypeField) => !field.disabled)\n .map((field: ContentTypeField) => ({\n label: capitalize(field.name),\n value: `fields.${field.id}`,\n }));\n\n return [...systemFields, ...contentFields];\n }\n\n return systemFields;\n },\n },\n reverseOrder: {\n type: \"boolean\",\n description: \"Reverse the order\",\n hidden: ([opts]: [QueryContentfulOpts | undefined]) => !opts?.order,\n defaultValueHint: false,\n },\n limit: {\n type: \"number\",\n description: \"Limit number of results\",\n defaultValueHint: 100,\n },\n skip: {\n type: \"number\",\n description: \"Skip number of results (for pagination)\",\n defaultValueHint: 0,\n },\n include: {\n type: \"number\",\n description: \"Depth of linked items to include (max 10)\",\n max: 10,\n min: 0,\n defaultValueHint: 1,\n },\n select: {\n type: \"choice\",\n multiSelect: true,\n description: \"Fields to select. Defaults to all fields.\",\n options: ([opts], ctx: any) => {\n const schema = findContentTypeSchema(\n opts?.contentType,\n ctx?.contentTypes\n );\n\n const fieldOptions = schema\n ? schema.fields\n .filter((field: ContentTypeField) => !field.disabled)\n .map((field: ContentTypeField) => ({\n label: capitalize(field.name), // Use capitalized friendly name from schema\n value: `fields.${field.id}`,\n }))\n : [];\n\n return [\n ...fieldOptions,\n { label: \"Fields only\", value: \"fields\" },\n { label: \"Metadata only\", value: \"sys\" },\n ];\n },\n },\n locale: {\n type: \"string\",\n description: \"Locale code (e.g., en-US)\",\n },\n },\n },\n ],\n fnContext: (contentfulOpts?: QueryContentfulOpts) => {\n if (!contentfulOpts?.space || !contentfulOpts?.accessToken) {\n return {\n dataKey: \"\",\n fetcher: async () => ({\n contentTypes: [],\n }),\n };\n }\n\n // Cache at workspace level (space + environment) to fetch all schemas once.\n // Excluding contentType from cache key means switching content types won't\n // trigger new API calls - we just find the schema in the cached array.\n const workspaceCacheKey = JSON.stringify({\n space: contentfulOpts.space,\n accessToken: contentfulOpts.accessToken,\n environment: contentfulOpts.environment,\n });\n\n return {\n dataKey: workspaceCacheKey,\n fetcher: async () => {\n try {\n // Fetch all content types once (includes full schemas with fields)\n const contentTypes = await fetchContentTypes(\n contentfulOpts.space!,\n contentfulOpts.accessToken!,\n contentfulOpts.environment\n );\n\n return {\n contentTypes,\n };\n } catch (error) {\n console.error(\"Failed to fetch content types:\", error);\n return {\n contentTypes: [],\n };\n }\n },\n };\n },\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["_a"]
7
7
  }
package/dist/index.js CHANGED
@@ -424,11 +424,13 @@ var queryContentfulMeta = {
424
424
  fields: {
425
425
  space: {
426
426
  type: "string",
427
- description: "Contentful space ID"
427
+ description: "Contentful space ID",
428
+ required: true
428
429
  },
429
430
  accessToken: {
430
431
  type: "string",
431
- description: "Contentful access token"
432
+ description: "Contentful access token",
433
+ required: true
432
434
  },
433
435
  environment: {
434
436
  type: "string",
@@ -438,6 +440,7 @@ var queryContentfulMeta = {
438
440
  type: "choice",
439
441
  displayName: "Content Type",
440
442
  description: "Content type to query",
443
+ required: true,
441
444
  options: (_, ctx) => {
442
445
  var _a2, _b;
443
446
  return (_b = (_a2 = ctx == null ? void 0 : ctx.contentTypes) == null ? void 0 : _a2.map((ct) => ({
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/utils.ts", "../src/schema.ts", "../src/where.ts", "../src/query-contentful.ts"],
4
- "sourcesContent": ["import registerFunction, {\n CustomFunctionMeta,\n} from \"@plasmicapp/host/registerFunction\";\nimport {\n _queryContentful,\n queryContentful,\n queryContentfulMeta,\n} from \"./query-contentful\";\n\nexport function registerContentful(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(queryContentful, queryContentfulMeta);\n}\n\nexport {\n // Exports for @plasmicpkgs/plasmic-contentful\n _queryContentful,\n queryContentful,\n};\n\n// Exports for @plasmicpkgs/plasmic-contentful\nexport { denormalizeData as _denormalizeData } from \"./query-contentful\";\nexport type { _Entry } from \"./types\";\nexport { _ensure, _uniq } from \"./utils\";\n", "export const _uniq = <T>(xs: Array<T>): T[] => Array.from(new Set(xs));\nexport const BASE_URL =\n (typeof process !== \"undefined\" &&\n process.env?.NEXT_PUBLIC_CONTENTFUL_BASE_URL) ||\n \"https://cdn.contentful.com\";\n\nexport function _ensure<T>(x: T | null | undefined, msg?: string): T {\n if (x === null || x === undefined) {\n throw new Error(msg ?? `Value must not be undefined or null`);\n } else {\n return x;\n }\n}\n\n/**\n * Capitalizes the first letter of a string\n */\nexport function capitalize(str: string): string {\n if (!str) {\n return str;\n }\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n", "import { BASE_URL } from \"./utils\";\n\nexport interface ContentTypeField {\n id: string;\n name: string;\n type: string;\n required: boolean;\n localized: boolean;\n disabled: boolean;\n}\n\nexport interface ContentTypeSchema {\n sys: { id: string };\n name: string;\n displayField?: string;\n fields: ContentTypeField[];\n}\n\n/**\n * Fetch all content types for a space/environment\n * Returns full schemas which can be used for both dropdown population and field discovery\n */\nexport async function fetchContentTypes(\n space: string,\n accessToken: string,\n environment: string = \"master\"\n): Promise<ContentTypeSchema[]> {\n const url = `${BASE_URL}/spaces/${space}/environments/${environment}/content_types`;\n const params = new URLSearchParams({ access_token: accessToken });\n\n const resp = await fetch(`${url}?${params.toString()}`);\n\n if (!resp.ok) {\n throw new Error(\n `Failed to fetch content types: ${resp.status} ${resp.statusText}`\n );\n }\n\n const data = await resp.json();\n return data.items;\n}\n\n/**\n * Helper to find a specific content type schema from a list\n */\nexport function findContentTypeSchema(\n contentType: string | undefined,\n contentTypes: ContentTypeSchema[] | undefined\n): ContentTypeSchema | undefined {\n if (!contentType || !contentTypes) {\n return undefined;\n }\n return contentTypes.find((ct) => ct.sys.id === contentType);\n}\n", "import type { Field } from \"@react-awesome-query-builder/core\";\nimport type { RulesLogic } from \"json-logic-js\";\nimport type { ContentTypeField, ContentTypeSchema } from \"./schema\";\nimport { capitalize } from \"./utils\";\n\n/**\n * Convert Contentful field type to query builder field configuration\n */\nfunction contentfulSchemaFieldToQueryBuilderField(\n field: ContentTypeField\n): Field | undefined {\n switch (field.type) {\n case \"Integer\":\n case \"Number\":\n return {\n label: capitalize(field.name),\n type: \"number\",\n operators: [\n \"equal\",\n \"not_equal\",\n \"less\",\n \"less_or_equal\",\n \"greater\",\n \"greater_or_equal\",\n \"is_null\",\n \"is_not_null\",\n ],\n };\n\n case \"Boolean\":\n return {\n label: capitalize(field.name),\n type: \"boolean\",\n };\n\n case \"Date\":\n return {\n label: capitalize(field.name),\n type: \"datetime\",\n operators: [\n \"equal\",\n \"not_equal\",\n \"less\",\n \"less_or_equal\",\n \"greater\",\n \"greater_or_equal\",\n \"is_null\",\n \"is_not_null\",\n ],\n };\n\n case \"Symbol\":\n case \"Text\":\n return {\n label: capitalize(field.name),\n type: \"text\",\n operators: [\"equal\", \"not_equal\", \"like\", \"is_null\", \"is_not_null\"],\n };\n\n default:\n return undefined;\n }\n}\n\n/**\n * Build query builder config from content type schema\n */\nexport function schemaToQueryBuilderConfig(schema: ContentTypeSchema) {\n const fields: Record<string, Field> = {};\n\n for (const field of schema.fields) {\n const qbField = contentfulSchemaFieldToQueryBuilderField(field);\n if (qbField) {\n fields[field.id] = qbField;\n }\n }\n\n return {\n fields,\n conjunctions: {\n AND: {\n label: \"All\",\n },\n // OR explicitly omitted - not supported by Contentful API\n },\n settings: {\n showNot: false,\n maxNesting: 1,\n canRegroup: false,\n canLeaveEmptyGroup: false,\n },\n };\n}\n\n/**\n * Maps JsonLogic to Contentful API filters format.\n *\n * See also:\n * - https://www.contentful.com/developers/docs/references/content-delivery-api/\n */\nexport function rulesLogicToContentfulFilters(\n logic: RulesLogic | undefined\n): Record<string, any> {\n if (logic === null || logic === undefined) {\n return {};\n } else if (typeof logic !== \"object\") {\n throw new Error(`unexpected logic: ${JSON.stringify(logic)}`);\n } else if (\"and\" in logic) {\n // Handle AND - flatten to multiple parameters\n // Contentful supports implicit AND between all query parameters\n return logic[\"and\"].reduce((acc: Record<string, any>, condition: any) => {\n return { ...acc, ...rulesLogicToContentfulFilters(condition) };\n }, {});\n } else if (\"or\" in logic) {\n // OR is not supported by Contentful API\n throw new Error(\n \"Contentful API does not support OR operations. Please restructure your query using only AND conditions.\"\n );\n } else if (\"!\" in logic) {\n // NOT is not supported by Contentful API\n throw new Error(\n \"Contentful API does not support NOT operations. Please use field-level negation operators like 'not_equal' ([ne]) instead.\"\n );\n } else if (\"==\" in logic) {\n const [{ var: field }, operand] = logic[\"==\"] as [{ var: string }, unknown];\n if (operand === null) {\n return { [`fields.${field}[exists]`]: \"false\" };\n }\n return {\n [`fields.${field}`]: operand,\n };\n } else if (\"!=\" in logic) {\n const [{ var: field }, operand] = logic[\"!=\"] as [{ var: string }, unknown];\n if (operand === null) {\n return { [`fields.${field}[exists]`]: \"true\" };\n }\n return {\n [`fields.${field}[ne]`]: operand,\n };\n } else if (\"in\" in logic) {\n // Map in operator to Contentful filters format:\n // JsonLogic: { \"in\": [\"searchText\", { \"var\": \"fieldName\" }] }\n // Contentful filters: { \"fields.fieldName[match]\": \"searchText\" }\n const [operand, { var: field }] = logic[\"in\"] as [string, { var: string }];\n return {\n [`fields.${field}[match]`]: operand,\n };\n } else {\n // Map JsonLogic comparison operators to Contentful filters format:\n // JsonLogic: { \"<=\": [{ \"var\": \"age\" }, 18] }\n // Contentful filters: { \"fields.age[lte]\": 18 }\n const [key, value] = Object.entries(logic)[0];\n const apiOp: string | undefined = operatorMapping[key];\n if (apiOp) {\n const [{ var: field }, operand] = value as [{ var: string }, unknown];\n return { [`fields.${field}[${apiOp}]`]: operand };\n }\n\n throw new Error(`unexpected logic: ${JSON.stringify(logic)}`);\n }\n}\n\n/** Maps JsonLogic operator to Contentful filter operator. */\nconst operatorMapping: Record<string, string> = {\n \"<\": \"lt\",\n \"<=\": \"lte\",\n \">\": \"gt\",\n \">=\": \"gte\",\n};\n", "import { CustomFunctionMeta } from \"@plasmicapp/host/registerFunction\";\nimport type { RulesLogic } from \"json-logic-js\";\nimport {\n ContentTypeField,\n ContentTypeSchema,\n fetchContentTypes,\n findContentTypeSchema,\n} from \"./schema\";\nimport { _Entry } from \"./types\";\nimport { BASE_URL, capitalize } from \"./utils\";\nimport {\n rulesLogicToContentfulFilters,\n schemaToQueryBuilderConfig,\n} from \"./where\";\n\nexport const modulePath = \"@plasmicpkgs/contentful\";\n\nexport function denormalizeData(data: any | null): any {\n if (!data?.items || !data?.includes) {\n return data;\n }\n\n const entryMap: { [id: string]: any } = {};\n\n if (data.includes.Entry) {\n data.includes.Entry.forEach((entry: any) => {\n entryMap[entry.sys.id] = entry;\n });\n }\n\n // Track processed fields to avoid following circular references\n const processedFields = new Set<string>();\n\n const denormalizeField = (fieldValue: any): any => {\n if (Array.isArray(fieldValue)) {\n const updatedArray: any[] = fieldValue.map((arrayItem) => {\n return denormalizeField(arrayItem);\n });\n return updatedArray;\n } else if (fieldValue && typeof fieldValue === \"object\") {\n if (\n data.includes.Asset &&\n \"sys\" in fieldValue &&\n fieldValue.sys.linkType === \"Asset\"\n ) {\n const fieldId = fieldValue.sys.id;\n const asset = data.includes.Asset.find(\n (a: any) => a.sys.id === fieldId\n );\n if (asset) {\n fieldValue = {\n ...fieldValue,\n url: \"https:\" + asset.fields?.file?.url,\n };\n } else {\n console.log(`Asset URL not found for ID: ${fieldId}`);\n }\n } else if (\n data.includes.Entry &&\n \"sys\" in fieldValue &&\n fieldValue.sys.linkType === \"Entry\"\n ) {\n const fieldId = fieldValue.sys.id;\n if (entryMap[fieldId]) {\n if (processedFields.has(fieldId)) {\n console.warn(`Circular ref detected for Entry ID: ${fieldId}.`);\n } else {\n fieldValue = {\n ...fieldValue,\n fields: denormalizeItem(entryMap[fieldId]).fields,\n };\n }\n } else {\n console.log(`Entry not found for ID: ${fieldId}`);\n }\n }\n fieldValue = Object.entries(fieldValue).reduce((obj, [key, value]) => {\n if (key === \"sys\" || key === \"fields\") {\n obj[key] = value;\n } else {\n obj[key] = denormalizeField(value);\n }\n return obj;\n }, {} as Record<string, any>);\n }\n\n return fieldValue;\n };\n\n const denormalizeItem = (item: any) => {\n const itemId = item.sys?.id;\n if (itemId) {\n processedFields.add(itemId);\n }\n\n const updatedFields: { [fieldName: string]: unknown | unknown[] } = {};\n for (const fieldName in item.fields) {\n updatedFields[fieldName] = denormalizeField(item.fields[fieldName]);\n }\n\n if (itemId) {\n processedFields.delete(itemId);\n }\n\n return {\n ...item,\n fields: updatedFields ?? undefined,\n };\n };\n\n const itemsWithDenormalizedFields: _Entry[] = data.items.map((item: any) => {\n return denormalizeItem(item);\n });\n\n return {\n ...data,\n items: itemsWithDenormalizedFields,\n };\n}\n\n/**\n * @deprecated These filter props are deprecated. Use `filterLogic` with the query builder instead.\n * Only used by the deprecated ContentfulCollection component for backward compatibility.\n */\nexport interface QueryContentfulOldFilterProps {\n filterField?: string;\n searchParameter?: string;\n filterValue?: string | number;\n}\n\nexport interface QueryContentfulOpts {\n space?: string;\n accessToken?: string;\n environment?: string;\n contentType?: string;\n /**\n * Filter logic using JSON Logic format to filter Contentful entries.\n * See {@link https://www.npmjs.com/package/@types/json-logic-js?activeTab=readme}\n */\n filterLogic?: RulesLogic;\n order?: string;\n reverseOrder?: boolean;\n limit?: number;\n skip?: number;\n include?: number;\n // string type supports comma-separated string as documented in the Contentful API, inserted via the dynamic value editor\n // array type supports multiple fields to be selected via the choice prop editor for convenience\n select?: string | string[];\n locale?: string;\n}\n\n/**\n * Query Contentful with simplified filter props.\n *\n * @deprecated Use {@link queryContentful} with `filterLogic` parameter instead.\n *\n * @example\n * ```ts\n * // Old way (deprecated)\n * _queryContentful({\n * space: 'space-id',\n * accessToken: 'token',\n * contentType: 'article',\n * filterField: 'title',\n * searchParameter: '[match]',\n * filterValue: 'Hello'\n * })\n *\n * // New way\n * queryContentful({\n * space: 'space-id',\n * accessToken: 'token',\n * contentType: 'article',\n * filterLogic: { \"==\": [{ var: \"title\" }, \"Hello\"] }\n * })\n * ```\n */\nexport async function _queryContentful({\n space,\n accessToken,\n environment = \"master\",\n contentType,\n filterLogic,\n filterField,\n searchParameter,\n filterValue,\n order,\n reverseOrder,\n limit,\n skip,\n include,\n select,\n}: QueryContentfulOpts & QueryContentfulOldFilterProps): Promise<any> {\n if (!space || !accessToken) {\n throw new Error(\"Space and accessToken are required\");\n }\n if (!contentType) {\n return null;\n }\n\n const path = `/spaces/${space}/environments/${environment}/entries`;\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"access_token\", accessToken);\n searchParams.set(\"content_type\", contentType);\n\n // Convert filterLogic to Contentful filters\n let filters: Record<string, any> = {};\n if (filterLogic) {\n filters = rulesLogicToContentfulFilters(filterLogic);\n } else if (filterField && searchParameter && filterValue !== undefined) {\n // BACKWARD COMPATIBILITY: Legacy filter props\n filters[`fields.${filterField}${searchParameter}`] = filterValue.toString();\n }\n\n // Apply all filter parameters\n for (const [key, value] of Object.entries(filters)) {\n searchParams.set(key, value.toString());\n }\n\n if (limit) {\n searchParams.set(\"limit\", limit.toString());\n }\n\n if (skip !== undefined) {\n searchParams.set(\"skip\", skip.toString());\n }\n\n if (order) {\n searchParams.set(\n \"order\",\n `${reverseOrder ? \"-\" : \"\"}${\n order.startsWith(\"sys.\") ? order : `fields.${order}`\n }`\n );\n }\n\n if (include !== undefined) {\n searchParams.set(\"include\", include.toString());\n }\n\n if (select) {\n if (Array.isArray(select)) {\n if (select.length > 0) {\n searchParams.set(\"select\", select.join(\",\"));\n }\n } else {\n // The user may pass a comma-separated string as documented in the Contentful API\n searchParams.set(\"select\", select);\n }\n }\n\n const resp = await fetch(`${BASE_URL}${path}?${searchParams.toString()}`);\n const data = await resp.json();\n\n return denormalizeData(data);\n}\n\n/**\n * Query a Contentful content type with optional filtering and ordering.\n *\n * @param opts - Query options including space, accessToken, contentType, filter logic, and pagination\n * @returns Promise resolving to the Contentful query response with denormalized data\n *\n * @example\n * ```ts\n * // Fetch all entries\n * const result = await queryContentful({\n * space: 'your-space-id',\n * accessToken: 'your-access-token',\n * contentType: 'blogPost'\n * });\n *\n * // Fetch with filter\n * const filtered = await queryContentful({\n * space: 'your-space-id',\n * accessToken: 'your-access-token',\n * contentType: 'blogPost',\n * filterLogic: { \"==\": [{ var: \"status\" }, \"published\"] }\n * });\n * ```\n */\nexport async function queryContentful({\n space,\n accessToken,\n environment = \"master\",\n contentType,\n filterLogic,\n}: QueryContentfulOpts): Promise<any> {\n return _queryContentful({\n space,\n accessToken,\n environment,\n contentType,\n filterLogic,\n });\n}\n\nexport const queryContentfulMeta: CustomFunctionMeta<typeof queryContentful> = {\n name: \"queryContentful\",\n displayName: \"Query Contentful\",\n description: \"Query Contentful entries with filtering and ordering\",\n importPath: modulePath,\n isQuery: true,\n params: [\n {\n name: \"opts\",\n type: \"object\",\n display: \"flatten\",\n fields: {\n space: {\n type: \"string\",\n description: \"Contentful space ID\",\n },\n accessToken: {\n type: \"string\",\n description: \"Contentful access token\",\n },\n environment: {\n type: \"string\",\n description: \"Contentful environment (default: master)\",\n },\n contentType: {\n type: \"choice\",\n displayName: \"Content Type\",\n description: \"Content type to query\",\n options: (_: any, ctx: any) => {\n return (\n ctx?.contentTypes?.map((ct: ContentTypeSchema) => ({\n label: ct.name,\n value: ct.sys.id,\n })) ?? []\n );\n },\n },\n filterLogic: {\n type: \"queryBuilder\",\n displayName: \"Filter\",\n description: \"Filter fetched entries. Defaults to fetch all entries.\",\n config: ([opts], ctx: any) => {\n const schema = findContentTypeSchema(\n opts?.contentType,\n ctx?.contentTypes\n );\n\n if (schema) {\n return schemaToQueryBuilderConfig(schema);\n }\n\n return {\n fields: {},\n };\n },\n },\n order: {\n type: \"choice\",\n displayName: \"Order by\",\n description: \"Field to order by (optional)\",\n defaultValueHint: \"sys.updatedAt\",\n options: ([opts], ctx: any) => {\n const systemFields = [\n { label: \"Created at\", value: \"sys.createdAt\" },\n { label: \"Updated at\", value: \"sys.updatedAt\" },\n { label: \"ID\", value: \"sys.id\" },\n ];\n\n const schema = findContentTypeSchema(\n opts?.contentType,\n ctx?.contentTypes\n );\n\n if (schema) {\n const contentFields = schema.fields\n .filter((field: ContentTypeField) => !field.disabled)\n .map((field: ContentTypeField) => ({\n label: capitalize(field.name),\n value: `fields.${field.id}`,\n }));\n\n return [...systemFields, ...contentFields];\n }\n\n return systemFields;\n },\n },\n reverseOrder: {\n type: \"boolean\",\n description: \"Reverse the order\",\n hidden: ([opts]: [QueryContentfulOpts | undefined]) => !opts?.order,\n defaultValueHint: false,\n },\n limit: {\n type: \"number\",\n description: \"Limit number of results\",\n defaultValueHint: 100,\n },\n skip: {\n type: \"number\",\n description: \"Skip number of results (for pagination)\",\n defaultValueHint: 0,\n },\n include: {\n type: \"number\",\n description: \"Depth of linked items to include (max 10)\",\n max: 10,\n min: 0,\n defaultValueHint: 1,\n },\n select: {\n type: \"choice\",\n multiSelect: true,\n description: \"Fields to select. Defaults to all fields.\",\n options: ([opts], ctx: any) => {\n const schema = findContentTypeSchema(\n opts?.contentType,\n ctx?.contentTypes\n );\n\n const fieldOptions = schema\n ? schema.fields\n .filter((field: ContentTypeField) => !field.disabled)\n .map((field: ContentTypeField) => ({\n label: capitalize(field.name), // Use capitalized friendly name from schema\n value: `fields.${field.id}`,\n }))\n : [];\n\n return [\n ...fieldOptions,\n { label: \"Fields only\", value: \"fields\" },\n { label: \"Metadata only\", value: \"sys\" },\n ];\n },\n },\n locale: {\n type: \"string\",\n description: \"Locale code (e.g., en-US)\",\n },\n },\n },\n ],\n fnContext: (contentfulOpts?: QueryContentfulOpts) => {\n if (!contentfulOpts?.space || !contentfulOpts?.accessToken) {\n return {\n dataKey: \"\",\n fetcher: async () => ({\n contentTypes: [],\n }),\n };\n }\n\n // Cache at workspace level (space + environment) to fetch all schemas once.\n // Excluding contentType from cache key means switching content types won't\n // trigger new API calls - we just find the schema in the cached array.\n const workspaceCacheKey = JSON.stringify({\n space: contentfulOpts.space,\n accessToken: contentfulOpts.accessToken,\n environment: contentfulOpts.environment,\n });\n\n return {\n dataKey: workspaceCacheKey,\n fetcher: async () => {\n try {\n // Fetch all content types once (includes full schemas with fields)\n const contentTypes = await fetchContentTypes(\n contentfulOpts.space!,\n contentfulOpts.accessToken!,\n contentfulOpts.environment\n );\n\n return {\n contentTypes,\n };\n } catch (error) {\n console.error(\"Failed to fetch content types:\", error);\n return {\n contentTypes: [],\n };\n }\n },\n };\n },\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAEO;;;ACFA,IAAM,QAAQ,CAAI,OAAsB,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;AAArE;AACO,IAAM,WACV,OAAO,YAAY,iBAClB,aAAQ,QAAR,mBAAa,oCACf;AAEK,SAAS,QAAW,GAAyB,KAAiB;AACnE,MAAI,MAAM,QAAQ,MAAM,QAAW;AACjC,UAAM,IAAI,MAAM,oBAAO,qCAAqC;AAAA,EAC9D,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAKO,SAAS,WAAW,KAAqB;AAC9C,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AACA,SAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAClD;;;ACAA,SAAsB,kBACpB,OACA,aACA,cAAsB,UACQ;AAAA;AAC9B,UAAM,MAAM,GAAG,QAAQ,WAAW,KAAK,iBAAiB,WAAW;AACnE,UAAM,SAAS,IAAI,gBAAgB,EAAE,cAAc,YAAY,CAAC;AAEhE,UAAM,OAAO,MAAM,MAAM,GAAG,GAAG,IAAI,OAAO,SAAS,CAAC,EAAE;AAEtD,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI;AAAA,QACR,kCAAkC,KAAK,MAAM,IAAI,KAAK,UAAU;AAAA,MAClE;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA;AAKO,SAAS,sBACd,aACA,cAC+B;AAC/B,MAAI,CAAC,eAAe,CAAC,cAAc;AACjC,WAAO;AAAA,EACT;AACA,SAAO,aAAa,KAAK,CAAC,OAAO,GAAG,IAAI,OAAO,WAAW;AAC5D;;;AC7CA,SAAS,yCACP,OACmB;AACnB,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,OAAO,WAAW,MAAM,IAAI;AAAA,QAC5B,MAAM;AAAA,QACN,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,OAAO,WAAW,MAAM,IAAI;AAAA,QAC5B,MAAM;AAAA,MACR;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,OAAO,WAAW,MAAM,IAAI;AAAA,QAC5B,MAAM;AAAA,QACN,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,OAAO,WAAW,MAAM,IAAI;AAAA,QAC5B,MAAM;AAAA,QACN,WAAW,CAAC,SAAS,aAAa,QAAQ,WAAW,aAAa;AAAA,MACpE;AAAA,IAEF;AACE,aAAO;AAAA,EACX;AACF;AAKO,SAAS,2BAA2B,QAA2B;AACpE,QAAM,SAAgC,CAAC;AAEvC,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,UAAU,yCAAyC,KAAK;AAC9D,QAAI,SAAS;AACX,aAAO,MAAM,EAAE,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,cAAc;AAAA,MACZ,KAAK;AAAA,QACH,OAAO;AAAA,MACT;AAAA;AAAA,IAEF;AAAA,IACA,UAAU;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,oBAAoB;AAAA,IACtB;AAAA,EACF;AACF;AAQO,SAAS,8BACd,OACqB;AACrB,MAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,WAAO,CAAC;AAAA,EACV,WAAW,OAAO,UAAU,UAAU;AACpC,UAAM,IAAI,MAAM,qBAAqB,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,EAC9D,WAAW,SAAS,OAAO;AAGzB,WAAO,MAAM,KAAK,EAAE,OAAO,CAAC,KAA0B,cAAmB;AACvE,aAAO,kCAAK,MAAQ,8BAA8B,SAAS;AAAA,IAC7D,GAAG,CAAC,CAAC;AAAA,EACP,WAAW,QAAQ,OAAO;AAExB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF,WAAW,OAAO,OAAO;AAEvB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF,WAAW,QAAQ,OAAO;AACxB,UAAM,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,IAAI,MAAM,IAAI;AAC5C,QAAI,YAAY,MAAM;AACpB,aAAO,EAAE,CAAC,UAAU,KAAK,UAAU,GAAG,QAAQ;AAAA,IAChD;AACA,WAAO;AAAA,MACL,CAAC,UAAU,KAAK,EAAE,GAAG;AAAA,IACvB;AAAA,EACF,WAAW,QAAQ,OAAO;AACxB,UAAM,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,IAAI,MAAM,IAAI;AAC5C,QAAI,YAAY,MAAM;AACpB,aAAO,EAAE,CAAC,UAAU,KAAK,UAAU,GAAG,OAAO;AAAA,IAC/C;AACA,WAAO;AAAA,MACL,CAAC,UAAU,KAAK,MAAM,GAAG;AAAA,IAC3B;AAAA,EACF,WAAW,QAAQ,OAAO;AAIxB,UAAM,CAAC,SAAS,EAAE,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI;AAC5C,WAAO;AAAA,MACL,CAAC,UAAU,KAAK,SAAS,GAAG;AAAA,IAC9B;AAAA,EACF,OAAO;AAIL,UAAM,CAAC,KAAK,KAAK,IAAI,OAAO,QAAQ,KAAK,EAAE,CAAC;AAC5C,UAAM,QAA4B,gBAAgB,GAAG;AACrD,QAAI,OAAO;AACT,YAAM,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,IAAI;AAClC,aAAO,EAAE,CAAC,UAAU,KAAK,IAAI,KAAK,GAAG,GAAG,QAAQ;AAAA,IAClD;AAEA,UAAM,IAAI,MAAM,qBAAqB,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,EAC9D;AACF;AAGA,IAAM,kBAA0C;AAAA,EAC9C,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AACR;;;ACzJO,IAAM,aAAa;AAEnB,SAAS,gBAAgB,MAAuB;AACrD,MAAI,EAAC,6BAAM,UAAS,EAAC,6BAAM,WAAU;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,WAAkC,CAAC;AAEzC,MAAI,KAAK,SAAS,OAAO;AACvB,SAAK,SAAS,MAAM,QAAQ,CAAC,UAAe;AAC1C,eAAS,MAAM,IAAI,EAAE,IAAI;AAAA,IAC3B,CAAC;AAAA,EACH;AAGA,QAAM,kBAAkB,oBAAI,IAAY;AAExC,QAAM,mBAAmB,CAAC,eAAyB;AAjCrD,QAAAA,KAAA;AAkCI,QAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,YAAM,eAAsB,WAAW,IAAI,CAAC,cAAc;AACxD,eAAO,iBAAiB,SAAS;AAAA,MACnC,CAAC;AACD,aAAO;AAAA,IACT,WAAW,cAAc,OAAO,eAAe,UAAU;AACvD,UACE,KAAK,SAAS,SACd,SAAS,cACT,WAAW,IAAI,aAAa,SAC5B;AACA,cAAM,UAAU,WAAW,IAAI;AAC/B,cAAM,QAAQ,KAAK,SAAS,MAAM;AAAA,UAChC,CAAC,MAAW,EAAE,IAAI,OAAO;AAAA,QAC3B;AACA,YAAI,OAAO;AACT,uBAAa,iCACR,aADQ;AAAA,YAEX,KAAK,aAAW,MAAAA,MAAA,MAAM,WAAN,gBAAAA,IAAc,SAAd,mBAAoB;AAAA,UACtC;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,+BAA+B,OAAO,EAAE;AAAA,QACtD;AAAA,MACF,WACE,KAAK,SAAS,SACd,SAAS,cACT,WAAW,IAAI,aAAa,SAC5B;AACA,cAAM,UAAU,WAAW,IAAI;AAC/B,YAAI,SAAS,OAAO,GAAG;AACrB,cAAI,gBAAgB,IAAI,OAAO,GAAG;AAChC,oBAAQ,KAAK,uCAAuC,OAAO,GAAG;AAAA,UAChE,OAAO;AACL,yBAAa,iCACR,aADQ;AAAA,cAEX,QAAQ,gBAAgB,SAAS,OAAO,CAAC,EAAE;AAAA,YAC7C;AAAA,UACF;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,2BAA2B,OAAO,EAAE;AAAA,QAClD;AAAA,MACF;AACA,mBAAa,OAAO,QAAQ,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AACpE,YAAI,QAAQ,SAAS,QAAQ,UAAU;AACrC,cAAI,GAAG,IAAI;AAAA,QACb,OAAO;AACL,cAAI,GAAG,IAAI,iBAAiB,KAAK;AAAA,QACnC;AACA,eAAO;AAAA,MACT,GAAG,CAAC,CAAwB;AAAA,IAC9B;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,CAAC,SAAc;AAzFzC,QAAAA;AA0FI,UAAM,UAASA,MAAA,KAAK,QAAL,gBAAAA,IAAU;AACzB,QAAI,QAAQ;AACV,sBAAgB,IAAI,MAAM;AAAA,IAC5B;AAEA,UAAM,gBAA8D,CAAC;AACrE,eAAW,aAAa,KAAK,QAAQ;AACnC,oBAAc,SAAS,IAAI,iBAAiB,KAAK,OAAO,SAAS,CAAC;AAAA,IACpE;AAEA,QAAI,QAAQ;AACV,sBAAgB,OAAO,MAAM;AAAA,IAC/B;AAEA,WAAO,iCACF,OADE;AAAA,MAEL,QAAQ,wCAAiB;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,8BAAwC,KAAK,MAAM,IAAI,CAAC,SAAc;AAC1E,WAAO,gBAAgB,IAAI;AAAA,EAC7B,CAAC;AAED,SAAO,iCACF,OADE;AAAA,IAEL,OAAO;AAAA,EACT;AACF;AA2DA,SAAsB,iBAAiB,IAe+B;AAAA,6CAf/B;AAAA,IACrC;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAsE;AACpE,QAAI,CAAC,SAAS,CAAC,aAAa;AAC1B,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,WAAW,KAAK,iBAAiB,WAAW;AACzD,UAAM,eAAe,IAAI,gBAAgB;AAEzC,iBAAa,IAAI,gBAAgB,WAAW;AAC5C,iBAAa,IAAI,gBAAgB,WAAW;AAG5C,QAAI,UAA+B,CAAC;AACpC,QAAI,aAAa;AACf,gBAAU,8BAA8B,WAAW;AAAA,IACrD,WAAW,eAAe,mBAAmB,gBAAgB,QAAW;AAEtE,cAAQ,UAAU,WAAW,GAAG,eAAe,EAAE,IAAI,YAAY,SAAS;AAAA,IAC5E;AAGA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,mBAAa,IAAI,KAAK,MAAM,SAAS,CAAC;AAAA,IACxC;AAEA,QAAI,OAAO;AACT,mBAAa,IAAI,SAAS,MAAM,SAAS,CAAC;AAAA,IAC5C;AAEA,QAAI,SAAS,QAAW;AACtB,mBAAa,IAAI,QAAQ,KAAK,SAAS,CAAC;AAAA,IAC1C;AAEA,QAAI,OAAO;AACT,mBAAa;AAAA,QACX;AAAA,QACA,GAAG,eAAe,MAAM,EAAE,GACxB,MAAM,WAAW,MAAM,IAAI,QAAQ,UAAU,KAAK,EACpD;AAAA,MACF;AAAA,IACF;AAEA,QAAI,YAAY,QAAW;AACzB,mBAAa,IAAI,WAAW,QAAQ,SAAS,CAAC;AAAA,IAChD;AAEA,QAAI,QAAQ;AACV,UAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,YAAI,OAAO,SAAS,GAAG;AACrB,uBAAa,IAAI,UAAU,OAAO,KAAK,GAAG,CAAC;AAAA,QAC7C;AAAA,MACF,OAAO;AAEL,qBAAa,IAAI,UAAU,MAAM;AAAA,MACnC;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,MAAM,GAAG,QAAQ,GAAG,IAAI,IAAI,aAAa,SAAS,CAAC,EAAE;AACxE,UAAM,OAAO,MAAM,KAAK,KAAK;AAE7B,WAAO,gBAAgB,IAAI;AAAA,EAC7B;AAAA;AA0BA,SAAsB,gBAAgB,IAMA;AAAA,6CANA;AAAA,IACpC;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACF,GAAsC;AACpC,WAAO,iBAAiB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAEO,IAAM,sBAAkE;AAAA,EAC7E,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,QAAQ;AAAA,IACN;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,QACN,OAAO;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,aAAa;AAAA,UACX,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,aAAa;AAAA,UACX,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,aAAa;AAAA,UACX,MAAM;AAAA,UACN,aAAa;AAAA,UACb,aAAa;AAAA,UACb,SAAS,CAAC,GAAQ,QAAa;AAtUzC,gBAAAA,KAAA;AAuUY,oBACE,MAAAA,MAAA,2BAAK,iBAAL,gBAAAA,IAAmB,IAAI,CAAC,QAA2B;AAAA,cACjD,OAAO,GAAG;AAAA,cACV,OAAO,GAAG,IAAI;AAAA,YAChB,QAHA,YAGO,CAAC;AAAA,UAEZ;AAAA,QACF;AAAA,QACA,aAAa;AAAA,UACX,MAAM;AAAA,UACN,aAAa;AAAA,UACb,aAAa;AAAA,UACb,QAAQ,CAAC,CAAC,IAAI,GAAG,QAAa;AAC5B,kBAAM,SAAS;AAAA,cACb,6BAAM;AAAA,cACN,2BAAK;AAAA,YACP;AAEA,gBAAI,QAAQ;AACV,qBAAO,2BAA2B,MAAM;AAAA,YAC1C;AAEA,mBAAO;AAAA,cACL,QAAQ,CAAC;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,UACb,aAAa;AAAA,UACb,kBAAkB;AAAA,UAClB,SAAS,CAAC,CAAC,IAAI,GAAG,QAAa;AAC7B,kBAAM,eAAe;AAAA,cACnB,EAAE,OAAO,cAAc,OAAO,gBAAgB;AAAA,cAC9C,EAAE,OAAO,cAAc,OAAO,gBAAgB;AAAA,cAC9C,EAAE,OAAO,MAAM,OAAO,SAAS;AAAA,YACjC;AAEA,kBAAM,SAAS;AAAA,cACb,6BAAM;AAAA,cACN,2BAAK;AAAA,YACP;AAEA,gBAAI,QAAQ;AACV,oBAAM,gBAAgB,OAAO,OAC1B,OAAO,CAAC,UAA4B,CAAC,MAAM,QAAQ,EACnD,IAAI,CAAC,WAA6B;AAAA,gBACjC,OAAO,WAAW,MAAM,IAAI;AAAA,gBAC5B,OAAO,UAAU,MAAM,EAAE;AAAA,cAC3B,EAAE;AAEJ,qBAAO,CAAC,GAAG,cAAc,GAAG,aAAa;AAAA,YAC3C;AAEA,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA,cAAc;AAAA,UACZ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,QAAQ,CAAC,CAAC,IAAI,MAAyC,EAAC,6BAAM;AAAA,UAC9D,kBAAkB;AAAA,QACpB;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,UACb,kBAAkB;AAAA,QACpB;AAAA,QACA,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,kBAAkB;AAAA,QACpB;AAAA,QACA,SAAS;AAAA,UACP,MAAM;AAAA,UACN,aAAa;AAAA,UACb,KAAK;AAAA,UACL,KAAK;AAAA,UACL,kBAAkB;AAAA,QACpB;AAAA,QACA,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,aAAa;AAAA,UACb,SAAS,CAAC,CAAC,IAAI,GAAG,QAAa;AAC7B,kBAAM,SAAS;AAAA,cACb,6BAAM;AAAA,cACN,2BAAK;AAAA,YACP;AAEA,kBAAM,eAAe,SACjB,OAAO,OACJ,OAAO,CAAC,UAA4B,CAAC,MAAM,QAAQ,EACnD,IAAI,CAAC,WAA6B;AAAA,cACjC,OAAO,WAAW,MAAM,IAAI;AAAA;AAAA,cAC5B,OAAO,UAAU,MAAM,EAAE;AAAA,YAC3B,EAAE,IACJ,CAAC;AAEL,mBAAO;AAAA,cACL,GAAG;AAAA,cACH,EAAE,OAAO,eAAe,OAAO,SAAS;AAAA,cACxC,EAAE,OAAO,iBAAiB,OAAO,MAAM;AAAA,YACzC;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,WAAW,CAAC,mBAAyC;AACnD,QAAI,EAAC,iDAAgB,UAAS,EAAC,iDAAgB,cAAa;AAC1D,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,MAAS;AAAI;AAAA,YACpB,cAAc,CAAC;AAAA,UACjB;AAAA;AAAA,MACF;AAAA,IACF;AAKA,UAAM,oBAAoB,KAAK,UAAU;AAAA,MACvC,OAAO,eAAe;AAAA,MACtB,aAAa,eAAe;AAAA,MAC5B,aAAa,eAAe;AAAA,IAC9B,CAAC;AAED,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,MAAY;AACnB,YAAI;AAEF,gBAAM,eAAe,MAAM;AAAA,YACzB,eAAe;AAAA,YACf,eAAe;AAAA,YACf,eAAe;AAAA,UACjB;AAEA,iBAAO;AAAA,YACL;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,MAAM,kCAAkC,KAAK;AACrD,iBAAO;AAAA,YACL,cAAc,CAAC;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AJ1dO,SAAS,mBAAmB,QAAoC;AACrE,WAAS,kBACP,IACA,MACA;AACA,QAAI,QAAQ;AACV,aAAO,iBAAiB,IAAI,IAAI;AAAA,IAClC,OAAO;AACL,kCAAAC,SAAiB,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AAEA,oBAAkB,iBAAiB,mBAAmB;AACxD;",
4
+ "sourcesContent": ["import registerFunction, {\n CustomFunctionMeta,\n} from \"@plasmicapp/host/registerFunction\";\nimport {\n _queryContentful,\n queryContentful,\n queryContentfulMeta,\n} from \"./query-contentful\";\n\nexport function registerContentful(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(queryContentful, queryContentfulMeta);\n}\n\nexport {\n // Exports for @plasmicpkgs/plasmic-contentful\n _queryContentful,\n queryContentful,\n};\n\n// Exports for @plasmicpkgs/plasmic-contentful\nexport { denormalizeData as _denormalizeData } from \"./query-contentful\";\nexport type { _Entry } from \"./types\";\nexport { _ensure, _uniq } from \"./utils\";\n", "export const _uniq = <T>(xs: Array<T>): T[] => Array.from(new Set(xs));\nexport const BASE_URL =\n (typeof process !== \"undefined\" &&\n process.env?.NEXT_PUBLIC_CONTENTFUL_BASE_URL) ||\n \"https://cdn.contentful.com\";\n\nexport function _ensure<T>(x: T | null | undefined, msg?: string): T {\n if (x === null || x === undefined) {\n throw new Error(msg ?? `Value must not be undefined or null`);\n } else {\n return x;\n }\n}\n\n/**\n * Capitalizes the first letter of a string\n */\nexport function capitalize(str: string): string {\n if (!str) {\n return str;\n }\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n", "import { BASE_URL } from \"./utils\";\n\nexport interface ContentTypeField {\n id: string;\n name: string;\n type: string;\n required: boolean;\n localized: boolean;\n disabled: boolean;\n}\n\nexport interface ContentTypeSchema {\n sys: { id: string };\n name: string;\n displayField?: string;\n fields: ContentTypeField[];\n}\n\n/**\n * Fetch all content types for a space/environment\n * Returns full schemas which can be used for both dropdown population and field discovery\n */\nexport async function fetchContentTypes(\n space: string,\n accessToken: string,\n environment: string = \"master\"\n): Promise<ContentTypeSchema[]> {\n const url = `${BASE_URL}/spaces/${space}/environments/${environment}/content_types`;\n const params = new URLSearchParams({ access_token: accessToken });\n\n const resp = await fetch(`${url}?${params.toString()}`);\n\n if (!resp.ok) {\n throw new Error(\n `Failed to fetch content types: ${resp.status} ${resp.statusText}`\n );\n }\n\n const data = await resp.json();\n return data.items;\n}\n\n/**\n * Helper to find a specific content type schema from a list\n */\nexport function findContentTypeSchema(\n contentType: string | undefined,\n contentTypes: ContentTypeSchema[] | undefined\n): ContentTypeSchema | undefined {\n if (!contentType || !contentTypes) {\n return undefined;\n }\n return contentTypes.find((ct) => ct.sys.id === contentType);\n}\n", "import type { Field } from \"@react-awesome-query-builder/core\";\nimport type { RulesLogic } from \"json-logic-js\";\nimport type { ContentTypeField, ContentTypeSchema } from \"./schema\";\nimport { capitalize } from \"./utils\";\n\n/**\n * Convert Contentful field type to query builder field configuration\n */\nfunction contentfulSchemaFieldToQueryBuilderField(\n field: ContentTypeField\n): Field | undefined {\n switch (field.type) {\n case \"Integer\":\n case \"Number\":\n return {\n label: capitalize(field.name),\n type: \"number\",\n operators: [\n \"equal\",\n \"not_equal\",\n \"less\",\n \"less_or_equal\",\n \"greater\",\n \"greater_or_equal\",\n \"is_null\",\n \"is_not_null\",\n ],\n };\n\n case \"Boolean\":\n return {\n label: capitalize(field.name),\n type: \"boolean\",\n };\n\n case \"Date\":\n return {\n label: capitalize(field.name),\n type: \"datetime\",\n operators: [\n \"equal\",\n \"not_equal\",\n \"less\",\n \"less_or_equal\",\n \"greater\",\n \"greater_or_equal\",\n \"is_null\",\n \"is_not_null\",\n ],\n };\n\n case \"Symbol\":\n case \"Text\":\n return {\n label: capitalize(field.name),\n type: \"text\",\n operators: [\"equal\", \"not_equal\", \"like\", \"is_null\", \"is_not_null\"],\n };\n\n default:\n return undefined;\n }\n}\n\n/**\n * Build query builder config from content type schema\n */\nexport function schemaToQueryBuilderConfig(schema: ContentTypeSchema) {\n const fields: Record<string, Field> = {};\n\n for (const field of schema.fields) {\n const qbField = contentfulSchemaFieldToQueryBuilderField(field);\n if (qbField) {\n fields[field.id] = qbField;\n }\n }\n\n return {\n fields,\n conjunctions: {\n AND: {\n label: \"All\",\n },\n // OR explicitly omitted - not supported by Contentful API\n },\n settings: {\n showNot: false,\n maxNesting: 1,\n canRegroup: false,\n canLeaveEmptyGroup: false,\n },\n };\n}\n\n/**\n * Maps JsonLogic to Contentful API filters format.\n *\n * See also:\n * - https://www.contentful.com/developers/docs/references/content-delivery-api/\n */\nexport function rulesLogicToContentfulFilters(\n logic: RulesLogic | undefined\n): Record<string, any> {\n if (logic === null || logic === undefined) {\n return {};\n } else if (typeof logic !== \"object\") {\n throw new Error(`unexpected logic: ${JSON.stringify(logic)}`);\n } else if (\"and\" in logic) {\n // Handle AND - flatten to multiple parameters\n // Contentful supports implicit AND between all query parameters\n return logic[\"and\"].reduce((acc: Record<string, any>, condition: any) => {\n return { ...acc, ...rulesLogicToContentfulFilters(condition) };\n }, {});\n } else if (\"or\" in logic) {\n // OR is not supported by Contentful API\n throw new Error(\n \"Contentful API does not support OR operations. Please restructure your query using only AND conditions.\"\n );\n } else if (\"!\" in logic) {\n // NOT is not supported by Contentful API\n throw new Error(\n \"Contentful API does not support NOT operations. Please use field-level negation operators like 'not_equal' ([ne]) instead.\"\n );\n } else if (\"==\" in logic) {\n const [{ var: field }, operand] = logic[\"==\"] as [{ var: string }, unknown];\n if (operand === null) {\n return { [`fields.${field}[exists]`]: \"false\" };\n }\n return {\n [`fields.${field}`]: operand,\n };\n } else if (\"!=\" in logic) {\n const [{ var: field }, operand] = logic[\"!=\"] as [{ var: string }, unknown];\n if (operand === null) {\n return { [`fields.${field}[exists]`]: \"true\" };\n }\n return {\n [`fields.${field}[ne]`]: operand,\n };\n } else if (\"in\" in logic) {\n // Map in operator to Contentful filters format:\n // JsonLogic: { \"in\": [\"searchText\", { \"var\": \"fieldName\" }] }\n // Contentful filters: { \"fields.fieldName[match]\": \"searchText\" }\n const [operand, { var: field }] = logic[\"in\"] as [string, { var: string }];\n return {\n [`fields.${field}[match]`]: operand,\n };\n } else {\n // Map JsonLogic comparison operators to Contentful filters format:\n // JsonLogic: { \"<=\": [{ \"var\": \"age\" }, 18] }\n // Contentful filters: { \"fields.age[lte]\": 18 }\n const [key, value] = Object.entries(logic)[0];\n const apiOp: string | undefined = operatorMapping[key];\n if (apiOp) {\n const [{ var: field }, operand] = value as [{ var: string }, unknown];\n return { [`fields.${field}[${apiOp}]`]: operand };\n }\n\n throw new Error(`unexpected logic: ${JSON.stringify(logic)}`);\n }\n}\n\n/** Maps JsonLogic operator to Contentful filter operator. */\nconst operatorMapping: Record<string, string> = {\n \"<\": \"lt\",\n \"<=\": \"lte\",\n \">\": \"gt\",\n \">=\": \"gte\",\n};\n", "import { CustomFunctionMeta } from \"@plasmicapp/host/registerFunction\";\nimport type { RulesLogic } from \"json-logic-js\";\nimport {\n ContentTypeField,\n ContentTypeSchema,\n fetchContentTypes,\n findContentTypeSchema,\n} from \"./schema\";\nimport { _Entry } from \"./types\";\nimport { BASE_URL, capitalize } from \"./utils\";\nimport {\n rulesLogicToContentfulFilters,\n schemaToQueryBuilderConfig,\n} from \"./where\";\n\nexport const modulePath = \"@plasmicpkgs/contentful\";\n\nexport function denormalizeData(data: any | null): any {\n if (!data?.items || !data?.includes) {\n return data;\n }\n\n const entryMap: { [id: string]: any } = {};\n\n if (data.includes.Entry) {\n data.includes.Entry.forEach((entry: any) => {\n entryMap[entry.sys.id] = entry;\n });\n }\n\n // Track processed fields to avoid following circular references\n const processedFields = new Set<string>();\n\n const denormalizeField = (fieldValue: any): any => {\n if (Array.isArray(fieldValue)) {\n const updatedArray: any[] = fieldValue.map((arrayItem) => {\n return denormalizeField(arrayItem);\n });\n return updatedArray;\n } else if (fieldValue && typeof fieldValue === \"object\") {\n if (\n data.includes.Asset &&\n \"sys\" in fieldValue &&\n fieldValue.sys.linkType === \"Asset\"\n ) {\n const fieldId = fieldValue.sys.id;\n const asset = data.includes.Asset.find(\n (a: any) => a.sys.id === fieldId\n );\n if (asset) {\n fieldValue = {\n ...fieldValue,\n url: \"https:\" + asset.fields?.file?.url,\n };\n } else {\n console.log(`Asset URL not found for ID: ${fieldId}`);\n }\n } else if (\n data.includes.Entry &&\n \"sys\" in fieldValue &&\n fieldValue.sys.linkType === \"Entry\"\n ) {\n const fieldId = fieldValue.sys.id;\n if (entryMap[fieldId]) {\n if (processedFields.has(fieldId)) {\n console.warn(`Circular ref detected for Entry ID: ${fieldId}.`);\n } else {\n fieldValue = {\n ...fieldValue,\n fields: denormalizeItem(entryMap[fieldId]).fields,\n };\n }\n } else {\n console.log(`Entry not found for ID: ${fieldId}`);\n }\n }\n fieldValue = Object.entries(fieldValue).reduce((obj, [key, value]) => {\n if (key === \"sys\" || key === \"fields\") {\n obj[key] = value;\n } else {\n obj[key] = denormalizeField(value);\n }\n return obj;\n }, {} as Record<string, any>);\n }\n\n return fieldValue;\n };\n\n const denormalizeItem = (item: any) => {\n const itemId = item.sys?.id;\n if (itemId) {\n processedFields.add(itemId);\n }\n\n const updatedFields: { [fieldName: string]: unknown | unknown[] } = {};\n for (const fieldName in item.fields) {\n updatedFields[fieldName] = denormalizeField(item.fields[fieldName]);\n }\n\n if (itemId) {\n processedFields.delete(itemId);\n }\n\n return {\n ...item,\n fields: updatedFields ?? undefined,\n };\n };\n\n const itemsWithDenormalizedFields: _Entry[] = data.items.map((item: any) => {\n return denormalizeItem(item);\n });\n\n return {\n ...data,\n items: itemsWithDenormalizedFields,\n };\n}\n\n/**\n * @deprecated These filter props are deprecated. Use `filterLogic` with the query builder instead.\n * Only used by the deprecated ContentfulCollection component for backward compatibility.\n */\nexport interface QueryContentfulOldFilterProps {\n filterField?: string;\n searchParameter?: string;\n filterValue?: string | number;\n}\n\nexport interface QueryContentfulOpts {\n space?: string;\n accessToken?: string;\n environment?: string;\n contentType?: string;\n /**\n * Filter logic using JSON Logic format to filter Contentful entries.\n * See {@link https://www.npmjs.com/package/@types/json-logic-js?activeTab=readme}\n */\n filterLogic?: RulesLogic;\n order?: string;\n reverseOrder?: boolean;\n limit?: number;\n skip?: number;\n include?: number;\n // string type supports comma-separated string as documented in the Contentful API, inserted via the dynamic value editor\n // array type supports multiple fields to be selected via the choice prop editor for convenience\n select?: string | string[];\n locale?: string;\n}\n\n/**\n * Query Contentful with simplified filter props.\n *\n * @deprecated Use {@link queryContentful} with `filterLogic` parameter instead.\n *\n * @example\n * ```ts\n * // Old way (deprecated)\n * _queryContentful({\n * space: 'space-id',\n * accessToken: 'token',\n * contentType: 'article',\n * filterField: 'title',\n * searchParameter: '[match]',\n * filterValue: 'Hello'\n * })\n *\n * // New way\n * queryContentful({\n * space: 'space-id',\n * accessToken: 'token',\n * contentType: 'article',\n * filterLogic: { \"==\": [{ var: \"title\" }, \"Hello\"] }\n * })\n * ```\n */\nexport async function _queryContentful({\n space,\n accessToken,\n environment = \"master\",\n contentType,\n filterLogic,\n filterField,\n searchParameter,\n filterValue,\n order,\n reverseOrder,\n limit,\n skip,\n include,\n select,\n}: QueryContentfulOpts & QueryContentfulOldFilterProps): Promise<any> {\n if (!space || !accessToken) {\n throw new Error(\"Space and accessToken are required\");\n }\n if (!contentType) {\n return null;\n }\n\n const path = `/spaces/${space}/environments/${environment}/entries`;\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"access_token\", accessToken);\n searchParams.set(\"content_type\", contentType);\n\n // Convert filterLogic to Contentful filters\n let filters: Record<string, any> = {};\n if (filterLogic) {\n filters = rulesLogicToContentfulFilters(filterLogic);\n } else if (filterField && searchParameter && filterValue !== undefined) {\n // BACKWARD COMPATIBILITY: Legacy filter props\n filters[`fields.${filterField}${searchParameter}`] = filterValue.toString();\n }\n\n // Apply all filter parameters\n for (const [key, value] of Object.entries(filters)) {\n searchParams.set(key, value.toString());\n }\n\n if (limit) {\n searchParams.set(\"limit\", limit.toString());\n }\n\n if (skip !== undefined) {\n searchParams.set(\"skip\", skip.toString());\n }\n\n if (order) {\n searchParams.set(\n \"order\",\n `${reverseOrder ? \"-\" : \"\"}${\n order.startsWith(\"sys.\") ? order : `fields.${order}`\n }`\n );\n }\n\n if (include !== undefined) {\n searchParams.set(\"include\", include.toString());\n }\n\n if (select) {\n if (Array.isArray(select)) {\n if (select.length > 0) {\n searchParams.set(\"select\", select.join(\",\"));\n }\n } else {\n // The user may pass a comma-separated string as documented in the Contentful API\n searchParams.set(\"select\", select);\n }\n }\n\n const resp = await fetch(`${BASE_URL}${path}?${searchParams.toString()}`);\n const data = await resp.json();\n\n return denormalizeData(data);\n}\n\n/**\n * Query a Contentful content type with optional filtering and ordering.\n *\n * @param opts - Query options including space, accessToken, contentType, filter logic, and pagination\n * @returns Promise resolving to the Contentful query response with denormalized data\n *\n * @example\n * ```ts\n * // Fetch all entries\n * const result = await queryContentful({\n * space: 'your-space-id',\n * accessToken: 'your-access-token',\n * contentType: 'blogPost'\n * });\n *\n * // Fetch with filter\n * const filtered = await queryContentful({\n * space: 'your-space-id',\n * accessToken: 'your-access-token',\n * contentType: 'blogPost',\n * filterLogic: { \"==\": [{ var: \"status\" }, \"published\"] }\n * });\n * ```\n */\nexport async function queryContentful({\n space,\n accessToken,\n environment = \"master\",\n contentType,\n filterLogic,\n}: QueryContentfulOpts): Promise<any> {\n return _queryContentful({\n space,\n accessToken,\n environment,\n contentType,\n filterLogic,\n });\n}\n\nexport const queryContentfulMeta: CustomFunctionMeta<typeof queryContentful> = {\n name: \"queryContentful\",\n displayName: \"Query Contentful\",\n description: \"Query Contentful entries with filtering and ordering\",\n importPath: modulePath,\n isQuery: true,\n params: [\n {\n name: \"opts\",\n type: \"object\",\n display: \"flatten\",\n fields: {\n space: {\n type: \"string\",\n description: \"Contentful space ID\",\n required: true,\n },\n accessToken: {\n type: \"string\",\n description: \"Contentful access token\",\n required: true,\n },\n environment: {\n type: \"string\",\n description: \"Contentful environment (default: master)\",\n },\n contentType: {\n type: \"choice\",\n displayName: \"Content Type\",\n description: \"Content type to query\",\n required: true,\n options: (_: any, ctx: any) => {\n return (\n ctx?.contentTypes?.map((ct: ContentTypeSchema) => ({\n label: ct.name,\n value: ct.sys.id,\n })) ?? []\n );\n },\n },\n filterLogic: {\n type: \"queryBuilder\",\n displayName: \"Filter\",\n description: \"Filter fetched entries. Defaults to fetch all entries.\",\n config: ([opts], ctx: any) => {\n const schema = findContentTypeSchema(\n opts?.contentType,\n ctx?.contentTypes\n );\n\n if (schema) {\n return schemaToQueryBuilderConfig(schema);\n }\n\n return {\n fields: {},\n };\n },\n },\n order: {\n type: \"choice\",\n displayName: \"Order by\",\n description: \"Field to order by (optional)\",\n defaultValueHint: \"sys.updatedAt\",\n options: ([opts], ctx: any) => {\n const systemFields = [\n { label: \"Created at\", value: \"sys.createdAt\" },\n { label: \"Updated at\", value: \"sys.updatedAt\" },\n { label: \"ID\", value: \"sys.id\" },\n ];\n\n const schema = findContentTypeSchema(\n opts?.contentType,\n ctx?.contentTypes\n );\n\n if (schema) {\n const contentFields = schema.fields\n .filter((field: ContentTypeField) => !field.disabled)\n .map((field: ContentTypeField) => ({\n label: capitalize(field.name),\n value: `fields.${field.id}`,\n }));\n\n return [...systemFields, ...contentFields];\n }\n\n return systemFields;\n },\n },\n reverseOrder: {\n type: \"boolean\",\n description: \"Reverse the order\",\n hidden: ([opts]: [QueryContentfulOpts | undefined]) => !opts?.order,\n defaultValueHint: false,\n },\n limit: {\n type: \"number\",\n description: \"Limit number of results\",\n defaultValueHint: 100,\n },\n skip: {\n type: \"number\",\n description: \"Skip number of results (for pagination)\",\n defaultValueHint: 0,\n },\n include: {\n type: \"number\",\n description: \"Depth of linked items to include (max 10)\",\n max: 10,\n min: 0,\n defaultValueHint: 1,\n },\n select: {\n type: \"choice\",\n multiSelect: true,\n description: \"Fields to select. Defaults to all fields.\",\n options: ([opts], ctx: any) => {\n const schema = findContentTypeSchema(\n opts?.contentType,\n ctx?.contentTypes\n );\n\n const fieldOptions = schema\n ? schema.fields\n .filter((field: ContentTypeField) => !field.disabled)\n .map((field: ContentTypeField) => ({\n label: capitalize(field.name), // Use capitalized friendly name from schema\n value: `fields.${field.id}`,\n }))\n : [];\n\n return [\n ...fieldOptions,\n { label: \"Fields only\", value: \"fields\" },\n { label: \"Metadata only\", value: \"sys\" },\n ];\n },\n },\n locale: {\n type: \"string\",\n description: \"Locale code (e.g., en-US)\",\n },\n },\n },\n ],\n fnContext: (contentfulOpts?: QueryContentfulOpts) => {\n if (!contentfulOpts?.space || !contentfulOpts?.accessToken) {\n return {\n dataKey: \"\",\n fetcher: async () => ({\n contentTypes: [],\n }),\n };\n }\n\n // Cache at workspace level (space + environment) to fetch all schemas once.\n // Excluding contentType from cache key means switching content types won't\n // trigger new API calls - we just find the schema in the cached array.\n const workspaceCacheKey = JSON.stringify({\n space: contentfulOpts.space,\n accessToken: contentfulOpts.accessToken,\n environment: contentfulOpts.environment,\n });\n\n return {\n dataKey: workspaceCacheKey,\n fetcher: async () => {\n try {\n // Fetch all content types once (includes full schemas with fields)\n const contentTypes = await fetchContentTypes(\n contentfulOpts.space!,\n contentfulOpts.accessToken!,\n contentfulOpts.environment\n );\n\n return {\n contentTypes,\n };\n } catch (error) {\n console.error(\"Failed to fetch content types:\", error);\n return {\n contentTypes: [],\n };\n }\n },\n };\n },\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["_a", "registerFunction"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plasmicpkgs/contentful",
3
- "version": "0.0.20",
3
+ "version": "0.0.22",
4
4
  "description": "Plasmic registration for Contentful",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,15 +24,15 @@
24
24
  "dist"
25
25
  ],
26
26
  "scripts": {
27
- "build": "yarn build:types && yarn build:index",
28
- "build:types": "yarn tsc",
27
+ "build": "pnpm build:types && pnpm build:index",
28
+ "build:types": "tsc",
29
29
  "build:index": "node ../../build.mjs ./src/index.ts",
30
30
  "test": "vitest run",
31
31
  "prepublishOnly": "npm run build",
32
32
  "postpublish": "bash ../../scripts/publish-api-doc-model.sh"
33
33
  },
34
34
  "devDependencies": {
35
- "@plasmicapp/host": "2.0.5",
35
+ "@plasmicapp/host": "2.0.7",
36
36
  "@react-awesome-query-builder/core": "^6.6.15",
37
37
  "@types/json-logic-js": "^2.0.8",
38
38
  "typescript": "^5.7.3",
@@ -41,5 +41,5 @@
41
41
  "peerDependencies": {
42
42
  "@plasmicapp/host": ">=1.0.211"
43
43
  },
44
- "gitHead": "41f43c9b107d2fff575c443bc4649fa708897242"
44
+ "gitHead": "6087f1621240c66b20d4a8fcf02c8bf889c554aa"
45
45
  }