@plasmicpkgs/contentful 0.0.10 → 0.0.12
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 +1 -1
- package/dist/index.esm.js +10 -15
- package/dist/index.esm.js.map +3 -3
- package/dist/index.js +10 -15
- package/dist/index.js.map +3 -3
- package/package.json +3 -3
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,
|
|
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
|
|
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
|
|
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 = (
|
|
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
|
|
274
|
-
const itemId = (
|
|
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
|
|
411
|
-
return (_b = (
|
|
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 : [];
|
package/dist/index.esm.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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,sBAEA;;;ACFA,IAAM,QAAQ,CAAI,OAAsB,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;
|
|
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
|
|
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
|
|
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 = (
|
|
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
|
|
310
|
-
const itemId = (
|
|
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
|
|
447
|
-
return (_b = (
|
|
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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAEO;;;ACFA,IAAM,QAAQ,CAAI,OAAsB,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;
|
|
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.
|
|
3
|
+
"version": "0.0.12",
|
|
4
4
|
"description": "Plasmic registration for Contentful",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"postpublish": "bash ../../scripts/publish-api-doc-model.sh"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@plasmicapp/host": "1.0.
|
|
35
|
+
"@plasmicapp/host": "1.0.238",
|
|
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": "
|
|
44
|
+
"gitHead": "8d1c851cde5b6670789893501c50c16276c1673b"
|
|
45
45
|
}
|