@webiny/app-headless-cms-common 6.4.4-beta.0 → 6.4.4-beta.2

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.
@@ -1,5 +1,9 @@
1
1
  function resolveFieldPath(fieldPath, bindParentName) {
2
2
  if (!fieldPath.includes("$")) return fieldPath;
3
+ if (fieldPath.startsWith("$.")) {
4
+ const relative = fieldPath.slice(2);
5
+ return bindParentName ? `${bindParentName}.${relative}` : relative;
6
+ }
3
7
  if (!bindParentName) return fieldPath.replace(/\$/g, "0");
4
8
  const pathParts = fieldPath.split(".");
5
9
  const parentParts = bindParentName.split(".");
@@ -1 +1 @@
1
- {"version":3,"file":"Fields/evaluateExpression.js","sources":["../../src/Fields/evaluateExpression.ts"],"sourcesContent":["export type Operator =\n | \"==\"\n | \"!=\"\n | \">\"\n | \"<\"\n | \">=\"\n | \"<=\"\n | \"contains\"\n | \"startsWith\"\n | \"endsWith\"\n | \"isEmpty\"\n | \"isNotEmpty\";\n\nexport interface ParsedExpression {\n target: string;\n operator: Operator;\n value: string | number | boolean | null;\n}\n\n/**\n * Resolve a fieldPath that may contain `$` placeholders using the bindParentName.\n *\n * The bindParentName gives us the concrete indices for the current list context.\n * For example, if fieldPath is `panorama.hotspots.$.title` and bindParentName\n * is `panorama.hotspots.2`, the result is `panorama.hotspots.2.title`.\n *\n * Supports multiple nested `$` segments for deeply nested list objects.\n */\nexport function resolveFieldPath(fieldPath: string, bindParentName?: string): string {\n if (!fieldPath.includes(\"$\")) {\n return fieldPath;\n }\n\n if (!bindParentName) {\n // No parent context, replace $ with 0 as fallback\n return fieldPath.replace(/\\$/g, \"0\");\n }\n\n const pathParts = fieldPath.split(\".\");\n const parentParts = bindParentName.split(\".\");\n\n // Build a map of prefix -> index from the parent path.\n // E.g., parentName \"panorama.hotspots.2.items.1\" gives us:\n // \"panorama.hotspots\" -> \"2\"\n // \"panorama.hotspots.2.items\" -> \"1\"\n const indexMap = new Map<string, string>();\n const prefixParts: string[] = [];\n for (const part of parentParts) {\n if (/^\\d+$/.test(part)) {\n indexMap.set(prefixParts.join(\".\"), part);\n } else {\n prefixParts.push(part);\n }\n }\n\n // Walk through pathParts and replace each `$` with the corresponding index\n const resolved: string[] = [];\n const currentPrefix: string[] = [];\n for (const part of pathParts) {\n if (part === \"$\") {\n const key = currentPrefix.join(\".\");\n const index = indexMap.get(key) ?? \"0\";\n resolved.push(index);\n } else {\n currentPrefix.push(part);\n resolved.push(part);\n }\n }\n\n return resolved.join(\".\");\n}\n\nfunction compareValues(\n operator: string,\n val: unknown,\n rhs: string | number | boolean | null\n): boolean {\n switch (operator) {\n case \"==\":\n return val == rhs;\n case \"!=\":\n return val != rhs;\n case \">\":\n return Number(val) > Number(rhs);\n case \"<\":\n return Number(val) < Number(rhs);\n case \">=\":\n return Number(val) >= Number(rhs);\n case \"<=\":\n return Number(val) <= Number(rhs);\n case \"contains\":\n return String(val ?? \"\").includes(String(rhs ?? \"\"));\n case \"startsWith\":\n return String(val ?? \"\").startsWith(String(rhs ?? \"\"));\n case \"endsWith\":\n return String(val ?? \"\").endsWith(String(rhs ?? \"\"));\n case \"isEmpty\":\n return val == null || val === \"\" || (Array.isArray(val) && val.length === 0);\n case \"isNotEmpty\":\n return val != null && val !== \"\" && !(Array.isArray(val) && val.length === 0);\n default:\n return false;\n }\n}\n\n/**\n * Evaluate a parsed expression against form values.\n *\n * If the resolved fieldPath ends with `.length`, it reads the array at the parent\n * path and uses its length as the left-hand value.\n */\nexport function evaluateExpression(\n parsed: ParsedExpression,\n getFormValue: (path: string) => unknown\n): boolean {\n const { target, operator, value: rhs } = parsed;\n\n let val: unknown;\n if (target.endsWith(\".length\")) {\n const arrayPath = target.slice(0, -\".length\".length);\n const arr = getFormValue(arrayPath);\n val = Array.isArray(arr) ? arr.length : 0;\n } else {\n val = getFormValue(target);\n }\n\n return compareValues(operator, val, rhs);\n}\n"],"names":["resolveFieldPath","fieldPath","bindParentName","pathParts","parentParts","indexMap","Map","prefixParts","part","resolved","currentPrefix","key","index","compareValues","operator","val","rhs","Number","String","Array","evaluateExpression","parsed","getFormValue","target","arrayPath","arr"],"mappings":"AA4BO,SAASA,iBAAiBC,SAAiB,EAAEC,cAAuB;IACvE,IAAI,CAACD,UAAU,QAAQ,CAAC,MACpB,OAAOA;IAGX,IAAI,CAACC,gBAED,OAAOD,UAAU,OAAO,CAAC,OAAO;IAGpC,MAAME,YAAYF,UAAU,KAAK,CAAC;IAClC,MAAMG,cAAcF,eAAe,KAAK,CAAC;IAMzC,MAAMG,WAAW,IAAIC;IACrB,MAAMC,cAAwB,EAAE;IAChC,KAAK,MAAMC,QAAQJ,YACf,IAAI,QAAQ,IAAI,CAACI,OACbH,SAAS,GAAG,CAACE,YAAY,IAAI,CAAC,MAAMC;SAEpCD,YAAY,IAAI,CAACC;IAKzB,MAAMC,WAAqB,EAAE;IAC7B,MAAMC,gBAA0B,EAAE;IAClC,KAAK,MAAMF,QAAQL,UACf,IAAIK,AAAS,QAATA,MAAc;QACd,MAAMG,MAAMD,cAAc,IAAI,CAAC;QAC/B,MAAME,QAAQP,SAAS,GAAG,CAACM,QAAQ;QACnCF,SAAS,IAAI,CAACG;IAClB,OAAO;QACHF,cAAc,IAAI,CAACF;QACnBC,SAAS,IAAI,CAACD;IAClB;IAGJ,OAAOC,SAAS,IAAI,CAAC;AACzB;AAEA,SAASI,cACLC,QAAgB,EAChBC,GAAY,EACZC,GAAqC;IAErC,OAAQF;QACJ,KAAK;YACD,OAAOC,OAAOC;QAClB,KAAK;YACD,OAAOD,OAAOC;QAClB,KAAK;YACD,OAAOC,OAAOF,OAAOE,OAAOD;QAChC,KAAK;YACD,OAAOC,OAAOF,OAAOE,OAAOD;QAChC,KAAK;YACD,OAAOC,OAAOF,QAAQE,OAAOD;QACjC,KAAK;YACD,OAAOC,OAAOF,QAAQE,OAAOD;QACjC,KAAK;YACD,OAAOE,OAAOH,OAAO,IAAI,QAAQ,CAACG,OAAOF,OAAO;QACpD,KAAK;YACD,OAAOE,OAAOH,OAAO,IAAI,UAAU,CAACG,OAAOF,OAAO;QACtD,KAAK;YACD,OAAOE,OAAOH,OAAO,IAAI,QAAQ,CAACG,OAAOF,OAAO;QACpD,KAAK;YACD,OAAOD,AAAO,QAAPA,OAAeA,AAAQ,OAARA,OAAeI,MAAM,OAAO,CAACJ,QAAQA,AAAe,MAAfA,IAAI,MAAM;QACzE,KAAK;YACD,OAAOA,AAAO,QAAPA,OAAeA,AAAQ,OAARA,OAAc,CAAEI,CAAAA,MAAM,OAAO,CAACJ,QAAQA,AAAe,MAAfA,IAAI,MAAM,AAAK;QAC/E;YACI,OAAO;IACf;AACJ;AAQO,SAASK,mBACZC,MAAwB,EACxBC,YAAuC;IAEvC,MAAM,EAAEC,MAAM,EAAET,QAAQ,EAAE,OAAOE,GAAG,EAAE,GAAGK;IAEzC,IAAIN;IACJ,IAAIQ,OAAO,QAAQ,CAAC,YAAY;QAC5B,MAAMC,YAAYD,OAAO,KAAK,CAAC,GAAG;QAClC,MAAME,MAAMH,aAAaE;QACzBT,MAAMI,MAAM,OAAO,CAACM,OAAOA,IAAI,MAAM,GAAG;IAC5C,OACIV,MAAMO,aAAaC;IAGvB,OAAOV,cAAcC,UAAUC,KAAKC;AACxC"}
1
+ {"version":3,"file":"Fields/evaluateExpression.js","sources":["../../src/Fields/evaluateExpression.ts"],"sourcesContent":["export type Operator =\n | \"==\"\n | \"!=\"\n | \">\"\n | \"<\"\n | \">=\"\n | \"<=\"\n | \"contains\"\n | \"startsWith\"\n | \"endsWith\"\n | \"isEmpty\"\n | \"isNotEmpty\";\n\nexport interface ParsedExpression {\n target: string;\n operator: Operator;\n value: string | number | boolean | null;\n}\n\n/**\n * Resolve a fieldPath that may contain `$` placeholders using the bindParentName.\n *\n * The bindParentName gives us the concrete indices for the current list context.\n * For example, if fieldPath is `panorama.hotspots.$.title` and bindParentName\n * is `panorama.hotspots.2`, the result is `panorama.hotspots.2.title`.\n *\n * Supports multiple nested `$` segments for deeply nested list objects.\n */\nexport function resolveFieldPath(fieldPath: string, bindParentName?: string): string {\n if (!fieldPath.includes(\"$\")) {\n return fieldPath;\n }\n\n if (fieldPath.startsWith(\"$.\")) {\n const relative = fieldPath.slice(2);\n return bindParentName ? `${bindParentName}.${relative}` : relative;\n }\n\n if (!bindParentName) {\n // No parent context, replace $ with 0 as fallback\n return fieldPath.replace(/\\$/g, \"0\");\n }\n\n const pathParts = fieldPath.split(\".\");\n const parentParts = bindParentName.split(\".\");\n\n // Build a map of prefix -> index from the parent path.\n // E.g., parentName \"panorama.hotspots.2.items.1\" gives us:\n // \"panorama.hotspots\" -> \"2\"\n // \"panorama.hotspots.2.items\" -> \"1\"\n const indexMap = new Map<string, string>();\n const prefixParts: string[] = [];\n for (const part of parentParts) {\n if (/^\\d+$/.test(part)) {\n indexMap.set(prefixParts.join(\".\"), part);\n } else {\n prefixParts.push(part);\n }\n }\n\n // Walk through pathParts and replace each `$` with the corresponding index\n const resolved: string[] = [];\n const currentPrefix: string[] = [];\n for (const part of pathParts) {\n if (part === \"$\") {\n const key = currentPrefix.join(\".\");\n const index = indexMap.get(key) ?? \"0\";\n resolved.push(index);\n } else {\n currentPrefix.push(part);\n resolved.push(part);\n }\n }\n\n return resolved.join(\".\");\n}\n\nfunction compareValues(\n operator: string,\n val: unknown,\n rhs: string | number | boolean | null\n): boolean {\n switch (operator) {\n case \"==\":\n return val == rhs;\n case \"!=\":\n return val != rhs;\n case \">\":\n return Number(val) > Number(rhs);\n case \"<\":\n return Number(val) < Number(rhs);\n case \">=\":\n return Number(val) >= Number(rhs);\n case \"<=\":\n return Number(val) <= Number(rhs);\n case \"contains\":\n return String(val ?? \"\").includes(String(rhs ?? \"\"));\n case \"startsWith\":\n return String(val ?? \"\").startsWith(String(rhs ?? \"\"));\n case \"endsWith\":\n return String(val ?? \"\").endsWith(String(rhs ?? \"\"));\n case \"isEmpty\":\n return val == null || val === \"\" || (Array.isArray(val) && val.length === 0);\n case \"isNotEmpty\":\n return val != null && val !== \"\" && !(Array.isArray(val) && val.length === 0);\n default:\n return false;\n }\n}\n\n/**\n * Evaluate a parsed expression against form values.\n *\n * If the resolved fieldPath ends with `.length`, it reads the array at the parent\n * path and uses its length as the left-hand value.\n */\nexport function evaluateExpression(\n parsed: ParsedExpression,\n getFormValue: (path: string) => unknown\n): boolean {\n const { target, operator, value: rhs } = parsed;\n\n let val: unknown;\n if (target.endsWith(\".length\")) {\n const arrayPath = target.slice(0, -\".length\".length);\n const arr = getFormValue(arrayPath);\n val = Array.isArray(arr) ? arr.length : 0;\n } else {\n val = getFormValue(target);\n }\n\n return compareValues(operator, val, rhs);\n}\n"],"names":["resolveFieldPath","fieldPath","bindParentName","relative","pathParts","parentParts","indexMap","Map","prefixParts","part","resolved","currentPrefix","key","index","compareValues","operator","val","rhs","Number","String","Array","evaluateExpression","parsed","getFormValue","target","arrayPath","arr"],"mappings":"AA4BO,SAASA,iBAAiBC,SAAiB,EAAEC,cAAuB;IACvE,IAAI,CAACD,UAAU,QAAQ,CAAC,MACpB,OAAOA;IAGX,IAAIA,UAAU,UAAU,CAAC,OAAO;QAC5B,MAAME,WAAWF,UAAU,KAAK,CAAC;QACjC,OAAOC,iBAAiB,GAAGA,eAAe,CAAC,EAAEC,UAAU,GAAGA;IAC9D;IAEA,IAAI,CAACD,gBAED,OAAOD,UAAU,OAAO,CAAC,OAAO;IAGpC,MAAMG,YAAYH,UAAU,KAAK,CAAC;IAClC,MAAMI,cAAcH,eAAe,KAAK,CAAC;IAMzC,MAAMI,WAAW,IAAIC;IACrB,MAAMC,cAAwB,EAAE;IAChC,KAAK,MAAMC,QAAQJ,YACf,IAAI,QAAQ,IAAI,CAACI,OACbH,SAAS,GAAG,CAACE,YAAY,IAAI,CAAC,MAAMC;SAEpCD,YAAY,IAAI,CAACC;IAKzB,MAAMC,WAAqB,EAAE;IAC7B,MAAMC,gBAA0B,EAAE;IAClC,KAAK,MAAMF,QAAQL,UACf,IAAIK,AAAS,QAATA,MAAc;QACd,MAAMG,MAAMD,cAAc,IAAI,CAAC;QAC/B,MAAME,QAAQP,SAAS,GAAG,CAACM,QAAQ;QACnCF,SAAS,IAAI,CAACG;IAClB,OAAO;QACHF,cAAc,IAAI,CAACF;QACnBC,SAAS,IAAI,CAACD;IAClB;IAGJ,OAAOC,SAAS,IAAI,CAAC;AACzB;AAEA,SAASI,cACLC,QAAgB,EAChBC,GAAY,EACZC,GAAqC;IAErC,OAAQF;QACJ,KAAK;YACD,OAAOC,OAAOC;QAClB,KAAK;YACD,OAAOD,OAAOC;QAClB,KAAK;YACD,OAAOC,OAAOF,OAAOE,OAAOD;QAChC,KAAK;YACD,OAAOC,OAAOF,OAAOE,OAAOD;QAChC,KAAK;YACD,OAAOC,OAAOF,QAAQE,OAAOD;QACjC,KAAK;YACD,OAAOC,OAAOF,QAAQE,OAAOD;QACjC,KAAK;YACD,OAAOE,OAAOH,OAAO,IAAI,QAAQ,CAACG,OAAOF,OAAO;QACpD,KAAK;YACD,OAAOE,OAAOH,OAAO,IAAI,UAAU,CAACG,OAAOF,OAAO;QACtD,KAAK;YACD,OAAOE,OAAOH,OAAO,IAAI,QAAQ,CAACG,OAAOF,OAAO;QACpD,KAAK;YACD,OAAOD,AAAO,QAAPA,OAAeA,AAAQ,OAARA,OAAeI,MAAM,OAAO,CAACJ,QAAQA,AAAe,MAAfA,IAAI,MAAM;QACzE,KAAK;YACD,OAAOA,AAAO,QAAPA,OAAeA,AAAQ,OAARA,OAAc,CAAEI,CAAAA,MAAM,OAAO,CAACJ,QAAQA,AAAe,MAAfA,IAAI,MAAM,AAAK;QAC/E;YACI,OAAO;IACf;AACJ;AAQO,SAASK,mBACZC,MAAwB,EACxBC,YAAuC;IAEvC,MAAM,EAAEC,MAAM,EAAET,QAAQ,EAAE,OAAOE,GAAG,EAAE,GAAGK;IAEzC,IAAIN;IACJ,IAAIQ,OAAO,QAAQ,CAAC,YAAY;QAC5B,MAAMC,YAAYD,OAAO,KAAK,CAAC,GAAG;QAClC,MAAME,MAAMH,aAAaE;QACzBT,MAAMI,MAAM,OAAO,CAACM,OAAOA,IAAI,MAAM,GAAG;IAC5C,OACIV,MAAMO,aAAaC;IAGvB,OAAOV,cAAcC,UAAUC,KAAKC;AACxC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/app-headless-cms-common",
3
- "version": "6.4.4-beta.0",
3
+ "version": "6.4.4-beta.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -21,13 +21,13 @@
21
21
  "@emotion/styled": "11.14.1",
22
22
  "@fortawesome/fontawesome-svg-core": "7.2.0",
23
23
  "@fortawesome/react-fontawesome": "3.3.1",
24
- "@webiny/admin-ui": "6.4.4-beta.0",
25
- "@webiny/app": "6.4.4-beta.0",
26
- "@webiny/app-admin": "6.4.4-beta.0",
27
- "@webiny/form": "6.4.4-beta.0",
28
- "@webiny/plugins": "6.4.4-beta.0",
29
- "@webiny/react-composition": "6.4.4-beta.0",
30
- "@webiny/validation": "6.4.4-beta.0",
24
+ "@webiny/admin-ui": "6.4.4-beta.2",
25
+ "@webiny/app": "6.4.4-beta.2",
26
+ "@webiny/app-admin": "6.4.4-beta.2",
27
+ "@webiny/form": "6.4.4-beta.2",
28
+ "@webiny/plugins": "6.4.4-beta.2",
29
+ "@webiny/react-composition": "6.4.4-beta.2",
30
+ "@webiny/validation": "6.4.4-beta.2",
31
31
  "dnd-core": "16.0.1",
32
32
  "graphql": "16.14.2",
33
33
  "graphql-tag": "2.12.6",
@@ -36,7 +36,7 @@
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/react": "18.3.29",
39
- "@webiny/build-tools": "6.4.4-beta.0",
39
+ "@webiny/build-tools": "6.4.4-beta.2",
40
40
  "rimraf": "6.1.3",
41
41
  "typescript": "6.0.3"
42
42
  },