@plasmicpkgs/contentful 0.0.10 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -65,7 +65,7 @@ export declare function queryContentful({ space, accessToken, environment, conte
65
65
  * })
66
66
  * ```
67
67
  */
68
- export declare function _queryContentful({ space, accessToken, environment, contentType, filterLogic, filterField, searchParameter, filterValue, order, reverseOrder, limit, skip, include, select, locale, }: QueryContentfulOpts & QueryContentfulOldFilterProps): Promise<any>;
68
+ export declare function _queryContentful({ space, accessToken, environment, contentType, filterLogic, filterField, searchParameter, filterValue, order, reverseOrder, limit, skip, include, select, }: QueryContentfulOpts & QueryContentfulOldFilterProps): Promise<any>;
69
69
 
70
70
  /**
71
71
  * @deprecated These filter props are deprecated. Use `filterLogic` with the query builder instead.
package/dist/index.esm.js CHANGED
@@ -43,7 +43,8 @@ import registerFunction from "@plasmicapp/host/registerFunction";
43
43
 
44
44
  // src/utils.ts
45
45
  var _uniq = (xs) => Array.from(new Set(xs));
46
- var BASE_URL = "https://cdn.contentful.com";
46
+ var _a;
47
+ var BASE_URL = typeof process !== "undefined" && ((_a = process.env) == null ? void 0 : _a.NEXT_PUBLIC_CONTENTFUL_BASE_URL) || "https://cdn.contentful.com";
47
48
  function _ensure(x, msg) {
48
49
  if (x === null || x === void 0) {
49
50
  throw new Error(msg != null ? msg : `Value must not be undefined or null`);
@@ -223,7 +224,7 @@ function denormalizeData(data) {
223
224
  }
224
225
  const processedFields = /* @__PURE__ */ new Set();
225
226
  const denormalizeField = (fieldValue) => {
226
- var _a, _b;
227
+ var _a2, _b;
227
228
  if (Array.isArray(fieldValue)) {
228
229
  const updatedArray = fieldValue.map((arrayItem) => {
229
230
  return denormalizeField(arrayItem);
@@ -237,7 +238,7 @@ function denormalizeData(data) {
237
238
  );
238
239
  if (asset) {
239
240
  fieldValue = __spreadProps(__spreadValues({}, fieldValue), {
240
- url: "https:" + ((_b = (_a = asset.fields) == null ? void 0 : _a.file) == null ? void 0 : _b.url)
241
+ url: "https:" + ((_b = (_a2 = asset.fields) == null ? void 0 : _a2.file) == null ? void 0 : _b.url)
241
242
  });
242
243
  } else {
243
244
  console.log(`Asset URL not found for ID: ${fieldId}`);
@@ -246,9 +247,7 @@ function denormalizeData(data) {
246
247
  const fieldId = fieldValue.sys.id;
247
248
  if (entryMap[fieldId]) {
248
249
  if (processedFields.has(fieldId)) {
249
- console.warn(
250
- `Circular reference detected for Entry ID: ${fieldId}.`
251
- );
250
+ console.warn(`Circular ref detected for Entry ID: ${fieldId}.`);
252
251
  } else {
253
252
  fieldValue = __spreadProps(__spreadValues({}, fieldValue), {
254
253
  fields: denormalizeItem(entryMap[fieldId]).fields
@@ -270,8 +269,8 @@ function denormalizeData(data) {
270
269
  return fieldValue;
271
270
  };
272
271
  const denormalizeItem = (item) => {
273
- var _a;
274
- const itemId = (_a = item.sys) == null ? void 0 : _a.id;
272
+ var _a2;
273
+ const itemId = (_a2 = item.sys) == null ? void 0 : _a2.id;
275
274
  if (itemId) {
276
275
  processedFields.add(itemId);
277
276
  }
@@ -308,8 +307,7 @@ function _queryContentful(_0) {
308
307
  limit,
309
308
  skip,
310
309
  include,
311
- select,
312
- locale
310
+ select
313
311
  }) {
314
312
  if (!space || !accessToken) {
315
313
  throw new Error("Space and accessToken are required");
@@ -354,9 +352,6 @@ function _queryContentful(_0) {
354
352
  searchParams.set("select", select);
355
353
  }
356
354
  }
357
- if (locale) {
358
- searchParams.set("locale", locale);
359
- }
360
355
  const resp = yield fetch(`${BASE_URL}${path}?${searchParams.toString()}`);
361
356
  const data = yield resp.json();
362
357
  return denormalizeData(data);
@@ -407,8 +402,8 @@ var queryContentfulMeta = {
407
402
  displayName: "Content Type",
408
403
  description: "Content type to query",
409
404
  options: (_, ctx) => {
410
- var _a, _b;
411
- return (_b = (_a = ctx == null ? void 0 : ctx.contentTypes) == null ? void 0 : _a.map((ct) => ({
405
+ var _a2, _b;
406
+ return (_b = (_a2 = ctx == null ? void 0 : ctx.contentTypes) == null ? void 0 : _a2.map((ct) => ({
412
407
  label: ct.name,
413
408
  value: ct.sys.id
414
409
  }))) != null ? _b : [];
@@ -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 = \"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(\n `Circular reference detected for Entry ID: ${fieldId}.`\n );\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 locale,\n}: QueryContentfulOpts & QueryContentfulOldFilterProps): Promise<any> {\n if (!space || !accessToken) {\n throw new Error(\"Space and accessToken are required\");\n }\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 if (locale) {\n searchParams.set(\"locale\", locale);\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 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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",
6
- "names": []
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 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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",
6
+ "names": ["_a"]
7
7
  }
package/dist/index.js CHANGED
@@ -79,7 +79,8 @@ var import_registerFunction = __toESM(require("@plasmicapp/host/registerFunction
79
79
 
80
80
  // src/utils.ts
81
81
  var _uniq = (xs) => Array.from(new Set(xs));
82
- var BASE_URL = "https://cdn.contentful.com";
82
+ var _a;
83
+ var BASE_URL = typeof process !== "undefined" && ((_a = process.env) == null ? void 0 : _a.NEXT_PUBLIC_CONTENTFUL_BASE_URL) || "https://cdn.contentful.com";
83
84
  function _ensure(x, msg) {
84
85
  if (x === null || x === void 0) {
85
86
  throw new Error(msg != null ? msg : `Value must not be undefined or null`);
@@ -259,7 +260,7 @@ function denormalizeData(data) {
259
260
  }
260
261
  const processedFields = /* @__PURE__ */ new Set();
261
262
  const denormalizeField = (fieldValue) => {
262
- var _a, _b;
263
+ var _a2, _b;
263
264
  if (Array.isArray(fieldValue)) {
264
265
  const updatedArray = fieldValue.map((arrayItem) => {
265
266
  return denormalizeField(arrayItem);
@@ -273,7 +274,7 @@ function denormalizeData(data) {
273
274
  );
274
275
  if (asset) {
275
276
  fieldValue = __spreadProps(__spreadValues({}, fieldValue), {
276
- url: "https:" + ((_b = (_a = asset.fields) == null ? void 0 : _a.file) == null ? void 0 : _b.url)
277
+ url: "https:" + ((_b = (_a2 = asset.fields) == null ? void 0 : _a2.file) == null ? void 0 : _b.url)
277
278
  });
278
279
  } else {
279
280
  console.log(`Asset URL not found for ID: ${fieldId}`);
@@ -282,9 +283,7 @@ function denormalizeData(data) {
282
283
  const fieldId = fieldValue.sys.id;
283
284
  if (entryMap[fieldId]) {
284
285
  if (processedFields.has(fieldId)) {
285
- console.warn(
286
- `Circular reference detected for Entry ID: ${fieldId}.`
287
- );
286
+ console.warn(`Circular ref detected for Entry ID: ${fieldId}.`);
288
287
  } else {
289
288
  fieldValue = __spreadProps(__spreadValues({}, fieldValue), {
290
289
  fields: denormalizeItem(entryMap[fieldId]).fields
@@ -306,8 +305,8 @@ function denormalizeData(data) {
306
305
  return fieldValue;
307
306
  };
308
307
  const denormalizeItem = (item) => {
309
- var _a;
310
- const itemId = (_a = item.sys) == null ? void 0 : _a.id;
308
+ var _a2;
309
+ const itemId = (_a2 = item.sys) == null ? void 0 : _a2.id;
311
310
  if (itemId) {
312
311
  processedFields.add(itemId);
313
312
  }
@@ -344,8 +343,7 @@ function _queryContentful(_0) {
344
343
  limit,
345
344
  skip,
346
345
  include,
347
- select,
348
- locale
346
+ select
349
347
  }) {
350
348
  if (!space || !accessToken) {
351
349
  throw new Error("Space and accessToken are required");
@@ -390,9 +388,6 @@ function _queryContentful(_0) {
390
388
  searchParams.set("select", select);
391
389
  }
392
390
  }
393
- if (locale) {
394
- searchParams.set("locale", locale);
395
- }
396
391
  const resp = yield fetch(`${BASE_URL}${path}?${searchParams.toString()}`);
397
392
  const data = yield resp.json();
398
393
  return denormalizeData(data);
@@ -443,8 +438,8 @@ var queryContentfulMeta = {
443
438
  displayName: "Content Type",
444
439
  description: "Content type to query",
445
440
  options: (_, ctx) => {
446
- var _a, _b;
447
- return (_b = (_a = ctx == null ? void 0 : ctx.contentTypes) == null ? void 0 : _a.map((ct) => ({
441
+ var _a2, _b;
442
+ return (_b = (_a2 = ctx == null ? void 0 : ctx.contentTypes) == null ? void 0 : _a2.map((ct) => ({
448
443
  label: ct.name,
449
444
  value: ct.sys.id
450
445
  }))) != null ? _b : [];
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 = \"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(\n `Circular reference detected for Entry ID: ${fieldId}.`\n );\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 locale,\n}: QueryContentfulOpts & QueryContentfulOldFilterProps): Promise<any> {\n if (!space || !accessToken) {\n throw new Error(\"Space and accessToken are required\");\n }\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 if (locale) {\n searchParams.set(\"locale\", locale);\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 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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",
6
- "names": ["registerFunction"]
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 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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",
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.10",
3
+ "version": "0.0.11",
4
4
  "description": "Plasmic registration for Contentful",
5
5
  "repository": {
6
6
  "type": "git",
@@ -41,5 +41,5 @@
41
41
  "peerDependencies": {
42
42
  "@plasmicapp/host": "^1.0.211"
43
43
  },
44
- "gitHead": "32344d56d6f870db71a1047e7106912f5f5b8ce4"
44
+ "gitHead": "955c7b4179dbc8452feb22d1e82b2ba37ecddaab"
45
45
  }