From 9a24f66e2dd11f53a2a97219fc83a00be69e86a2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ond=C5=99ej=20Chrastina?=
Date: Wed, 1 Feb 2023 11:01:55 +0100
Subject: [PATCH 01/19] use local link
---
package-lock.json | 250 +++++++++++++++++-----------------------------
package.json | 3 +-
2 files changed, 95 insertions(+), 158 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 201daae..ee54acd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,6 +11,7 @@
"@kontent-ai/delivery-sdk": "^12.0.2",
"@kontent-ai/react-components": "0.1.1",
"@simply007org/react-spinners": "0.0.3",
+ "kontent-rich-text-to-json-converter": "file:../rich-text-resolver",
"qs": "^6.9.4",
"react": "^17.0.2",
"react-dom": "^17.0.2",
@@ -39,10 +40,25 @@
"typescript": "^4.8.4"
},
"engines": {
- "node": "16 || 17",
+ "node": "16 || 17 || 18",
"npm": "7 || 8"
}
},
+ "../rich-text-resolver": {
+ "version": "1.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "@kontent-ai/delivery-sdk": "^12.4.2",
+ "jest-environment-jsdom": "^29.3.1",
+ "node-html-parser": "^5.3.3"
+ },
+ "devDependencies": {
+ "@types/jest": "^28.1.2",
+ "jest": "^28.1.1",
+ "ts-jest": "^28.0.5",
+ "typescript": "^4.7.4"
+ }
+ },
"node_modules/@ampproject/remapping": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz",
@@ -3109,34 +3125,6 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
- "node_modules/@kentico/kontent-core": {
- "version": "9.5.0",
- "resolved": "https://registry.npmjs.org/@kentico/kontent-core/-/kontent-core-9.5.0.tgz",
- "integrity": "sha512-jYhanUJNfU9Ot9owxA5oIEFU56ULxfbyv1cQpmlhLKzL+DfkVKT73h7aQFIn6Dw8pILqNX9pSxGcsJhfRtoWQw==",
- "deprecated": "Package has been renamed to @kontent-ai/core-sdk. Please update your code to use the latest version.",
- "dev": true,
- "dependencies": {
- "axios": "0.26.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@kentico/kontent-delivery": {
- "version": "11.7.0",
- "resolved": "https://registry.npmjs.org/@kentico/kontent-delivery/-/kontent-delivery-11.7.0.tgz",
- "integrity": "sha512-1NrPeGzBz7+AY62dH1nUAXOibSM+dUPBBToWrUJpsAE/qWRuVGUHprusjpXwR+hY+5tIWSw6pNjKCA06X5PMEw==",
- "deprecated": "Package has been renamed to @kontent-ai/delivery-sdk. Please update your code to use the latest version",
- "dev": true,
- "dependencies": {
- "@kentico/kontent-core": "9.5.0",
- "url-parse": "1.5.10",
- "uuid": "8.3.2"
- },
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/@kontent-ai/core-sdk": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-10.0.0.tgz",
@@ -3383,21 +3371,6 @@
"integrity": "sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw==",
"dev": true
},
- "node_modules/@simply007org/kontent-react-components": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/@simply007org/kontent-react-components/-/kontent-react-components-0.0.8.tgz",
- "integrity": "sha512-rhZJXjhVTAiVxL08Y7WNgTg6WpfMhhaUge2RnHrVyOedSuexW+PiDHF9zCUZ/H3Fyk5fODhEFMtUhEWxWtv98g==",
- "deprecated": "Package has been renamed to @kontent-ai/react-components. Please update your code to use the latest version.",
- "dev": true,
- "dependencies": {
- "@kentico/kontent-delivery": "^11.5.0",
- "@types/react": "^17.0.39",
- "@types/react-dom": "^17.0.11",
- "html-react-parser": "^1.4.8",
- "react": "^17.0.2",
- "react-dom": "^17.0.2"
- }
- },
"node_modules/@simply007org/react-spinners": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/@simply007org/react-spinners/-/react-spinners-0.0.3.tgz",
@@ -5192,15 +5165,6 @@
"node": ">=4"
}
},
- "node_modules/axios": {
- "version": "0.26.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
- "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
- "dev": true,
- "dependencies": {
- "follow-redirects": "^1.14.8"
- }
- },
"node_modules/axobject-query": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
@@ -7048,9 +7012,9 @@
"dev": true
},
"node_modules/decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+ "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
"dev": true,
"engines": {
"node": ">=0.10"
@@ -9027,6 +8991,20 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -12529,9 +12507,9 @@
"dev": true
},
"node_modules/json5": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
- "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true,
"bin": {
"json5": "lib/cli.js"
@@ -12613,6 +12591,10 @@
"node": ">= 8"
}
},
+ "node_modules/kontent-rich-text-to-json-converter": {
+ "resolved": "../rich-text-resolver",
+ "link": true
+ },
"node_modules/language-subtag-registry": {
"version": "0.3.21",
"resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz",
@@ -12857,9 +12839,9 @@
}
},
"node_modules/loader-utils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
- "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dev": true,
"dependencies": {
"big.js": "^5.2.2",
@@ -15980,9 +15962,9 @@
}
},
"node_modules/react-dev-utils/node_modules/loader-utils": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz",
- "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz",
+ "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==",
"dev": true,
"engines": {
"node": ">= 12.13.0"
@@ -16275,27 +16257,15 @@
}
},
"node_modules/recursive-readdir": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
- "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
- "dev": true,
- "dependencies": {
- "minimatch": "3.0.4"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/recursive-readdir/node_modules/minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
+ "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
"dev": true,
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "minimatch": "^3.0.5"
},
"engines": {
- "node": "*"
+ "node": ">=6.0.0"
}
},
"node_modules/redent": {
@@ -18061,9 +18031,9 @@
}
},
"node_modules/tsconfig-paths/node_modules/json5": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
- "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
"dev": true,
"dependencies": {
"minimist": "^1.2.0"
@@ -21571,26 +21541,6 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
- "@kentico/kontent-core": {
- "version": "9.5.0",
- "resolved": "https://registry.npmjs.org/@kentico/kontent-core/-/kontent-core-9.5.0.tgz",
- "integrity": "sha512-jYhanUJNfU9Ot9owxA5oIEFU56ULxfbyv1cQpmlhLKzL+DfkVKT73h7aQFIn6Dw8pILqNX9pSxGcsJhfRtoWQw==",
- "dev": true,
- "requires": {
- "axios": "0.26.1"
- }
- },
- "@kentico/kontent-delivery": {
- "version": "11.7.0",
- "resolved": "https://registry.npmjs.org/@kentico/kontent-delivery/-/kontent-delivery-11.7.0.tgz",
- "integrity": "sha512-1NrPeGzBz7+AY62dH1nUAXOibSM+dUPBBToWrUJpsAE/qWRuVGUHprusjpXwR+hY+5tIWSw6pNjKCA06X5PMEw==",
- "dev": true,
- "requires": {
- "@kentico/kontent-core": "9.5.0",
- "url-parse": "1.5.10",
- "uuid": "8.3.2"
- }
- },
"@kontent-ai/core-sdk": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-10.0.0.tgz",
@@ -21758,19 +21708,6 @@
"integrity": "sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw==",
"dev": true
},
- "@simply007org/kontent-react-components": {
- "version": "https://registry.npmjs.org/@simply007org/kontent-react-components/-/kontent-react-components-0.0.8.tgz",
- "integrity": "sha512-rhZJXjhVTAiVxL08Y7WNgTg6WpfMhhaUge2RnHrVyOedSuexW+PiDHF9zCUZ/H3Fyk5fODhEFMtUhEWxWtv98g==",
- "dev": true,
- "requires": {
- "@kentico/kontent-delivery": "^11.5.0",
- "@types/react": "^17.0.39",
- "@types/react-dom": "^17.0.11",
- "html-react-parser": "^1.4.8",
- "react": "^17.0.2",
- "react-dom": "^17.0.2"
- }
- },
"@simply007org/react-spinners": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/@simply007org/react-spinners/-/react-spinners-0.0.3.tgz",
@@ -23155,15 +23092,6 @@
"integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==",
"dev": true
},
- "axios": {
- "version": "0.26.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
- "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
- "dev": true,
- "requires": {
- "follow-redirects": "^1.14.8"
- }
- },
"axobject-query": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
@@ -24523,9 +24451,9 @@
"dev": true
},
"decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+ "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
"dev": true
},
"dedent": {
@@ -26009,6 +25937,13 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -28620,9 +28555,9 @@
"dev": true
},
"json5": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
- "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true
},
"jsonfile": {
@@ -28675,6 +28610,18 @@
"integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==",
"dev": true
},
+ "kontent-rich-text-to-json-converter": {
+ "version": "file:../rich-text-resolver",
+ "requires": {
+ "@kontent-ai/delivery-sdk": "^12.4.2",
+ "@types/jest": "^28.1.2",
+ "jest": "^28.1.1",
+ "jest-environment-jsdom": "^29.3.1",
+ "node-html-parser": "^5.3.3",
+ "ts-jest": "^28.0.5",
+ "typescript": "^4.7.4"
+ }
+ },
"language-subtag-registry": {
"version": "0.3.21",
"resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz",
@@ -28853,9 +28800,9 @@
"dev": true
},
"loader-utils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
- "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
@@ -31013,9 +30960,9 @@
"dev": true
},
"loader-utils": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz",
- "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz",
+ "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==",
"dev": true
},
"supports-color": {
@@ -31236,23 +31183,12 @@
}
},
"recursive-readdir": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
- "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
+ "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
"dev": true,
"requires": {
- "minimatch": "3.0.4"
- },
- "dependencies": {
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- }
+ "minimatch": "^3.0.5"
}
},
"redent": {
@@ -32615,9 +32551,9 @@
},
"dependencies": {
"json5": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
- "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
"dev": true,
"requires": {
"minimist": "^1.2.0"
diff --git a/package.json b/package.json
index 2e31c24..1ddeb0a 100644
--- a/package.json
+++ b/package.json
@@ -23,6 +23,7 @@
"@kontent-ai/delivery-sdk": "^12.0.2",
"@kontent-ai/react-components": "0.1.1",
"@simply007org/react-spinners": "0.0.3",
+ "kontent-rich-text-to-json-converter": "file:../rich-text-resolver",
"qs": "^6.9.4",
"react": "^17.0.2",
"react-dom": "^17.0.2",
@@ -47,6 +48,6 @@
],
"engines": {
"npm": "7 || 8",
- "node": "16 || 17"
+ "node": "16 || 17 || 18"
}
}
From ba05da3a1cf655c0eccca2ec8866f6433f8f17a5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ond=C5=99ej=20Chrastina?=
Date: Wed, 1 Feb 2023 15:24:57 +0100
Subject: [PATCH 02/19] shocase the rich text reslution possibilities
---
src/Components/RichText.tsx | 98 ++++++++++++++++++++++++++++++++++++-
tsconfig.json | 2 +-
2 files changed, 98 insertions(+), 2 deletions(-)
diff --git a/src/Components/RichText.tsx b/src/Components/RichText.tsx
index 4170548..4c9fcb6 100644
--- a/src/Components/RichText.tsx
+++ b/src/Components/RichText.tsx
@@ -3,7 +3,7 @@ import {
ResolversType,
RichTextElement,
} from '@kontent-ai/react-components';
-import React from 'react';
+import React, { useState } from 'react';
import { Link } from 'react-router-dom';
import { resolveContentLink } from '../Utilities/ContentLinks';
import {
@@ -13,6 +13,10 @@ import {
ILink,
IRichTextImage,
} from '@kontent-ai/delivery-sdk';
+import { RichTextResolver } from 'kontent-rich-text-to-json-converter';
+import { IOutputResult } from 'kontent-rich-text-to-json-converter/src/IResolver';
+import { useEffect } from 'react';
+import { IDomNode } from 'kontent-rich-text-to-json-converter/src/IDomNode';
interface RichTextProps {
element: Elements.RichTextElement;
@@ -20,6 +24,96 @@ interface RichTextProps {
}
const RichText: React.FC = (props) => {
+
+ const [richText, setRichText] = useState | null>(null);
+ const [richTextResolved, setRichTextResolved] = useState(null);
+
+ useEffect(() => {
+ const resolver = new RichTextResolver();
+
+ resolver.resolveAsync({
+ value: props.element.value,
+ // other way of transformation
+ // images: props.element.images.reduce((obj, value) => {
+ // obj[value.imageId] = {
+ // image_id: value.imageId,
+ // description: value.description || "",
+ // url: value.url,
+ // width: value.width || 0,
+ // height: value.height || 0
+ // }
+ // return obj;
+ // }, {})
+ images: Object.fromEntries(props.element.images.map(image => [image.imageId, {
+ image_id: image.imageId,
+ description: image.description,
+ url: image.url,
+ width: image.width || undefined,
+ height: image.height || undefined
+ }])),
+ links: Object.fromEntries(props.element.links.map(link => [link.linkId, {
+ codename: link.codename,
+ type: link.type,
+ url_slug: link.urlSlug
+ }])),
+ modular_content: props.element.linkedItemCodenames
+ }, {}
+ // {
+ // resolveDomNode: ((domNode) => {
+ // let resolvedNode: JSX.Element | string | null = null;
+ // switch (domNode.type) {
+ // case 'tag':
+ // resolvedNode = React.createElement(domNode.tagName, { ...domNode.attributes })
+ // break;
+ // case 'text':
+ // resolvedNode = domNode.content
+ // break
+ // default:
+ // break;
+ // }
+ // if (resolvedNode !== null) {
+ // return Promise.resolve(resolvedNode);
+ // }
+ // else {
+ // return Promise.reject()
+ // }
+ // })
+ // }
+ )
+ .then((value) => {
+ debugger;
+ setRichText(value);
+
+ const link = (domNode: IDomNode): JSX.Element => {
+ if (domNode.type === 'tag') {
+ // TODO "key properies"
+ const childElements = domNode.children.map(node => link(node));
+ // TODO For non-pair element like
to avoid "" error
+ const children = childElements.length === 0 ? undefined : childElements;
+
+ // It is possible to make the resolution here
+ const element = React.createElement(domNode.tagName, { ...domNode.attributes }, children);
+ return element;
+ }
+
+ if (domNode.type === 'text') {
+ // TODO - is there other way that using pseudo element?
+ return <>{domNode.content}>
+ }
+
+ throw new Error("Undefined state")
+ }
+
+ const element = React.createElement("div", undefined, value.childrenNodes.map(link));
+ setRichTextResolved(element);
+
+ });
+ }, [props.element]);
+
+
+
+
+
const resolvers: ResolversType = {
resolveLinkedItem: (
linkedItem: IContentItem | undefined,
@@ -116,6 +210,8 @@ const RichText: React.FC = (props) => {
return (
+
{JSON.stringify(richText, undefined, 2)}
+ {richTextResolved}
);
diff --git a/tsconfig.json b/tsconfig.json
index 7177aec..f0b14a0 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,6 +1,6 @@
{
"compilerOptions": {
- "target": "es5",
+ "target": "es2015",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
From e58beb3abc46ab736521b1c688ca4cceae4a95db Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ond=C5=99ej=20Chrastina?=
Date: Wed, 1 Feb 2023 15:55:38 +0100
Subject: [PATCH 03/19] showcase the template for react
---
src/Components/RichText.tsx | 87 +++++++++++++++++++++++++++----------
1 file changed, 65 insertions(+), 22 deletions(-)
diff --git a/src/Components/RichText.tsx b/src/Components/RichText.tsx
index 4c9fcb6..9987683 100644
--- a/src/Components/RichText.tsx
+++ b/src/Components/RichText.tsx
@@ -28,9 +28,52 @@ const RichText: React.FC = (props) => {
const [richText, setRichText] = useState | null>(null);
const [richTextResolved, setRichTextResolved] = useState(null);
+ // useEffect(() => {
+ // const resolver = new RichTextResolver();
+ // resolver.resolveAsync({
+ // value: "",
+ // images: {},
+ // links: {},
+ // modular_content: []
+ // }).then(result => {
+ // const link = (domNode: IDomNode): any => {
+ // if (domNode.type === 'tag') {
+ // // There could be any resolution
+ // return domNode.children.map(child => link(child));
+ // }
+ // else if (domNode.type === 'text') {
+ // {
+ // // There could be any resolution
+ // }
+ // }
+ // result.childrenNodes.map(child => link(child));
+
+ // }
+ // });
+ // }, [props.element])
+
useEffect(() => {
const resolver = new RichTextResolver();
+ resolver.resolveAsync({
+ value: "",
+ images: {},
+ links: {},
+ modular_content: []
+ }).then(result => {
+
+ const link = (domNode: IDomNode): any => {
+ if (domNode.type === 'tag') {
+ //
+ return domNode.children.map(child => link(child));
+ }
+ else if (domNode.type === 'text') {
+
+ }
+ }
+ result.childrenNodes.map(child => link(child));
+ });
+
resolver.resolveAsync({
value: props.element.value,
// other way of transformation
@@ -58,27 +101,27 @@ const RichText: React.FC = (props) => {
}])),
modular_content: props.element.linkedItemCodenames
}, {}
- // {
- // resolveDomNode: ((domNode) => {
- // let resolvedNode: JSX.Element | string | null = null;
- // switch (domNode.type) {
- // case 'tag':
- // resolvedNode = React.createElement(domNode.tagName, { ...domNode.attributes })
- // break;
- // case 'text':
- // resolvedNode = domNode.content
- // break
- // default:
- // break;
- // }
- // if (resolvedNode !== null) {
- // return Promise.resolve(resolvedNode);
- // }
- // else {
- // return Promise.reject()
- // }
- // })
- // }
+ // {
+ // resolveDomNode: ((domNode) => {
+ // let resolvedNode: JSX.Element | string | null = null;
+ // switch (domNode.type) {
+ // case 'tag':
+ // resolvedNode = React.createElement(domNode.tagName, { ...domNode.attributes })
+ // break;
+ // case 'text':
+ // resolvedNode = domNode.content
+ // break
+ // default:
+ // break;
+ // }
+ // if (resolvedNode !== null) {
+ // return Promise.resolve(resolvedNode);
+ // }
+ // else {
+ // return Promise.reject()
+ // }
+ // })
+ // }
)
.then((value) => {
debugger;
@@ -88,7 +131,7 @@ const RichText: React.FC = (props) => {
if (domNode.type === 'tag') {
// TODO "key properies"
const childElements = domNode.children.map(node => link(node));
- // TODO For non-pair element like
to avoid "" error
+ // TODO For non-pair element like
to avoid error
const children = childElements.length === 0 ? undefined : childElements;
// It is possible to make the resolution here
From 607c80a58f3267f49b6dd67319fe2e4ee58c27c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ond=C5=99ej=20Chrastina?=
Date: Wed, 8 Feb 2023 14:57:08 +0100
Subject: [PATCH 04/19] showcase 2 way traversal with resolution
---
package-lock.json | 1 +
src/Components/RichText.tsx | 288 ++++++++++++------------------------
2 files changed, 96 insertions(+), 193 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index ee54acd..449a4f4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -45,6 +45,7 @@
}
},
"../rich-text-resolver": {
+ "name": "kontent-rich-text-to-json-converter",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
diff --git a/src/Components/RichText.tsx b/src/Components/RichText.tsx
index 9987683..fa242fc 100644
--- a/src/Components/RichText.tsx
+++ b/src/Components/RichText.tsx
@@ -1,79 +1,28 @@
-import {
- DomElementOptionsType,
- ResolversType,
- RichTextElement,
-} from '@kontent-ai/react-components';
import React, { useState } from 'react';
-import { Link } from 'react-router-dom';
-import { resolveContentLink } from '../Utilities/ContentLinks';
import {
ElementModels,
Elements,
- IContentItem,
- ILink,
- IRichTextImage,
} from '@kontent-ai/delivery-sdk';
import { RichTextResolver } from 'kontent-rich-text-to-json-converter';
-import { IOutputResult } from 'kontent-rich-text-to-json-converter/src/IResolver';
import { useEffect } from 'react';
-import { IDomNode } from 'kontent-rich-text-to-json-converter/src/IDomNode';
+import { IDomHtmlNode, IDomNode } from 'kontent-rich-text-to-json-converter/src';
interface RichTextProps {
element: Elements.RichTextElement;
className?: string;
}
-const RichText: React.FC = (props) => {
-
- const [richText, setRichText] = useState | null>(null);
- const [richTextResolved, setRichTextResolved] = useState(null);
+const isLinkedItem = (node: IDomHtmlNode): boolean => (
+ node.tagName === 'object'
+ && node.attributes.type === 'application/kenticocloud'
+);
- // useEffect(() => {
- // const resolver = new RichTextResolver();
- // resolver.resolveAsync({
- // value: "",
- // images: {},
- // links: {},
- // modular_content: []
- // }).then(result => {
- // const link = (domNode: IDomNode): any => {
- // if (domNode.type === 'tag') {
- // // There could be any resolution
- // return domNode.children.map(child => link(child));
- // }
- // else if (domNode.type === 'text') {
- // {
- // // There could be any resolution
- // }
- // }
- // result.childrenNodes.map(child => link(child));
+const RichText: React.FC = (props) => {
- // }
- // });
- // }, [props.element])
+ const [richTextContent, setRichTextContent] = useState(null);
useEffect(() => {
const resolver = new RichTextResolver();
-
- resolver.resolveAsync({
- value: "",
- images: {},
- links: {},
- modular_content: []
- }).then(result => {
-
- const link = (domNode: IDomNode): any => {
- if (domNode.type === 'tag') {
- //
- return domNode.children.map(child => link(child));
- }
- else if (domNode.type === 'text') {
-
- }
- }
- result.childrenNodes.map(child => link(child));
- });
-
resolver.resolveAsync({
value: props.element.value,
// other way of transformation
@@ -100,162 +49,115 @@ const RichText: React.FC = (props) => {
url_slug: link.urlSlug
}])),
modular_content: props.element.linkedItemCodenames
- }, {}
- // {
- // resolveDomNode: ((domNode) => {
- // let resolvedNode: JSX.Element | string | null = null;
- // switch (domNode.type) {
- // case 'tag':
- // resolvedNode = React.createElement(domNode.tagName, { ...domNode.attributes })
- // break;
- // case 'text':
- // resolvedNode = domNode.content
- // break
- // default:
- // break;
- // }
- // if (resolvedNode !== null) {
- // return Promise.resolve(resolvedNode);
- // }
- // else {
- // return Promise.reject()
- // }
- // })
- // }
- )
+ })
.then((value) => {
- debugger;
- setRichText(value);
-
const link = (domNode: IDomNode): JSX.Element => {
if (domNode.type === 'tag') {
- // TODO "key properies"
+
+ // TODO Recursion vs. cycle
const childElements = domNode.children.map(node => link(node));
+
+ // Resolution
+ if (isLinkedItem(domNode)) {
+ const itemCode = domNode.attributes['data-codename'];
+ // TODO Provide a way to get the item by default
+ const linkedItem = props.element.linkedItems.find(item => item.system.codename === itemCode);
+
+ switch (linkedItem?.system.type) {
+ case 'tweet': {
+ // TODO test out external call
+ let tweetLink = linkedItem?.elements.tweetLink.value;
+ let tweetID = tweetLink.match('^.*twitter.com/.*/(\\d+)/?.*$')[1];
+
+ let selectedTheme = linkedItem?.elements.theme.value[0].codename;
+ selectedTheme = selectedTheme ? selectedTheme : 'light';
+
+ setTimeout(() => {
+ window.twttr.widgets.createTweet(
+ tweetID,
+ document.getElementById(`tweet${tweetID}`),
+ {
+ theme: selectedTheme,
+ }
+ );
+ }, 100);
+ return ;
+ }
+ case 'hosted_video': {
+ if (
+ linkedItem?.elements.videoHost.value.find(
+ (item: ElementModels.MultipleChoiceOption) =>
+ item.codename === 'vimeo'
+ )
+ ) {
+ return (
+
+ );
+ } else if (
+ linkedItem?.elements.videoHost.value.find(
+ (item: ElementModels.MultipleChoiceOption) =>
+ item.codename === 'youtube'
+ )
+ ) {
+ return (
+
+ );
+ } else {
+ return Content item not supported
;
+ }
+ }
+ default:
+ return Content item not supported
;
+ }
+ }
+
// TODO For non-pair element like
to avoid error
const children = childElements.length === 0 ? undefined : childElements;
- // It is possible to make the resolution here
- const element = React.createElement(domNode.tagName, { ...domNode.attributes }, children);
+ // Fallback without resolution
+ // TODO think of the key resolution
+ const attributes = { ...domNode.attributes, key: crypto.randomUUID().toString() };
+ const element = React.createElement(domNode.tagName, attributes, children);
+ console.log(element);
+
return element;
}
if (domNode.type === 'text') {
// TODO - is there other way that using pseudo element?
- return <>{domNode.content}>
+ return {domNode.content}
}
throw new Error("Undefined state")
}
- const element = React.createElement("div", undefined, value.childrenNodes.map(link));
- setRichTextResolved(element);
-
+ // TODO keys
+ const result = value.childNodes.map(link);
+ setRichTextContent(result);
});
}, [props.element]);
-
-
-
-
- const resolvers: ResolversType = {
- resolveLinkedItem: (
- linkedItem: IContentItem | undefined,
- domOptions: DomElementOptionsType
- ) => {
- const contentItemType = linkedItem ? linkedItem.system.type : '';
-
- switch (contentItemType) {
- case 'tweet': {
- let tweetLink = linkedItem?.elements.tweetLink.value;
- let tweetID = tweetLink.match('^.*twitter.com/.*/(\\d+)/?.*$')[1];
-
- let selectedTheme = linkedItem?.elements.theme.value[0].codename;
- selectedTheme = selectedTheme ? selectedTheme : 'light';
-
- setTimeout(() => {
- window.twttr.widgets.createTweet(
- tweetID,
- document.getElementById(`tweet${tweetID}`),
- {
- theme: selectedTheme,
- }
- );
- }, 100);
-
- return ;
- }
- case 'hosted_video': {
- if (
- linkedItem?.elements.videoHost.value.find(
- (item: ElementModels.MultipleChoiceOption) =>
- item.codename === 'vimeo'
- )
- ) {
- return (
-
- );
- } else if (
- linkedItem?.elements.videoHost.value.find(
- (item: ElementModels.MultipleChoiceOption) =>
- item.codename === 'youtube'
- )
- ) {
- return (
-
- );
- } else {
- return Content item not supported
;
- }
- }
- default:
- return Content item not supported
;
- }
- },
- resolveLink: (link: ILink, domOptions: DomElementOptionsType) => {
- const path = resolveContentLink(link);
-
- return (
-
- {domOptions.domToReact(domOptions.domElement.children)}
-
- );
- },
- resolveImage: (
- image: IRichTextImage,
- domOptions: DomElementOptionsType
- ) => {
- return (
-
- );
- },
- resolveDomNode: undefined,
- };
-
return (
-
-
{JSON.stringify(richText, undefined, 2)}
- {richTextResolved}
-
+
+ {/*
{JSON.stringify(richTextContent, undefined, 2)} */}
+ {richTextContent}
+ {/*
*/}
);
};
From 35ed61555802c72b3d20660b108afc8a9fc7fd31 Mon Sep 17 00:00:00 2001
From: Jiri Lojda
Date: Fri, 10 Feb 2023 13:31:54 +0100
Subject: [PATCH 05/19] Add missing keys in generated rich-text elements to
prevent missing-key error
---
src/Components/RichText.tsx | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/Components/RichText.tsx b/src/Components/RichText.tsx
index fa242fc..23bd5aa 100644
--- a/src/Components/RichText.tsx
+++ b/src/Components/RichText.tsx
@@ -18,7 +18,6 @@ const isLinkedItem = (node: IDomHtmlNode): boolean => (
);
const RichText: React.FC = (props) => {
-
const [richTextContent, setRichTextContent] = useState(null);
useEffect(() => {
@@ -81,7 +80,7 @@ const RichText: React.FC = (props) => {
}
);
}, 100);
- return ;
+ return ;
}
case 'hosted_video': {
if (
@@ -92,6 +91,7 @@ const RichText: React.FC = (props) => {
) {
return (