@arpproject/recrate 0.1.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.
Files changed (286) hide show
  1. package/.eslintrc.json +37 -0
  2. package/.storybook/main.ts +40 -0
  3. package/.storybook/preview.tsx +46 -0
  4. package/LICENCE +18 -0
  5. package/README.md +83 -0
  6. package/babel.config.json +5 -0
  7. package/dist/app/App.d.ts +2 -0
  8. package/dist/app/EmbeddedComponent.d.ts +3 -0
  9. package/dist/app/index.d.ts +0 -0
  10. package/dist/app/lookup.d.ts +82 -0
  11. package/dist/crate-builder/CrateManager/contexts.d.ts +6 -0
  12. package/dist/crate-builder/CrateManager/crate-manager-benchmarking.spec.d.ts +1 -0
  13. package/dist/crate-builder/CrateManager/crate-manager-loading-exporting.spec.d.ts +1 -0
  14. package/dist/crate-builder/CrateManager/crate-manager-operations.spec.d.ts +0 -0
  15. package/dist/crate-builder/CrateManager/crate-manager.d.ts +641 -0
  16. package/dist/crate-builder/CrateManager/crate-manager.spec.d.ts +1 -0
  17. package/dist/crate-builder/CrateManager/lib.d.ts +26 -0
  18. package/dist/crate-builder/CrateManager/lib.spec.d.ts +1 -0
  19. package/dist/crate-builder/CrateManager/profile-manager.d.ts +143 -0
  20. package/dist/crate-builder/CrateManager/profile-manager.spec.d.ts +1 -0
  21. package/dist/crate-builder/CrateManager/schema-type-definitions.json.d.ts +35125 -0
  22. package/dist/crate-builder/CrateManager/validate-identifier.d.ts +10 -0
  23. package/dist/crate-builder/CrateManager/validate-identifier.spec.d.ts +1 -0
  24. package/dist/crate-builder/RenderEntity/Add.d.ts +26 -0
  25. package/dist/crate-builder/RenderEntity/AddControl.d.ts +14 -0
  26. package/dist/crate-builder/RenderEntity/AddControl.stories.d.ts +29 -0
  27. package/dist/crate-builder/RenderEntity/AutoComplete.d.ts +12 -0
  28. package/dist/crate-builder/RenderEntity/BulkAdd.d.ts +10 -0
  29. package/dist/crate-builder/RenderEntity/DeleteProperty.d.ts +8 -0
  30. package/dist/crate-builder/RenderEntity/DialogAddProperty.d.ts +9 -0
  31. package/dist/crate-builder/RenderEntity/DialogBrowseEntities.d.ts +8 -0
  32. package/dist/crate-builder/RenderEntity/DialogEditContext.d.ts +8 -0
  33. package/dist/crate-builder/RenderEntity/DialogPreviewCrate.d.ts +7 -0
  34. package/dist/crate-builder/RenderEntity/DialogSaveCrateAsTemplate.d.ts +13 -0
  35. package/dist/crate-builder/RenderEntity/DialogSaveEntityTemplate.d.ts +14 -0
  36. package/dist/crate-builder/RenderEntity/DisplayPropertyName.d.ts +8 -0
  37. package/dist/crate-builder/RenderEntity/DisplayPropertyName.stories.d.ts +6 -0
  38. package/dist/crate-builder/RenderEntity/EntityId.d.ts +13 -0
  39. package/dist/crate-builder/RenderEntity/EntityName.d.ts +13 -0
  40. package/dist/crate-builder/RenderEntity/EntityProperty.d.ts +19 -0
  41. package/dist/crate-builder/RenderEntity/EntityPropertyInstance.d.ts +25 -0
  42. package/dist/crate-builder/RenderEntity/EntityType.d.ts +12 -0
  43. package/dist/crate-builder/RenderEntity/ItemLink.d.ts +14 -0
  44. package/dist/crate-builder/RenderEntity/PaginateLinkedEntities.d.ts +23 -0
  45. package/dist/crate-builder/RenderEntity/PaginateLinkedEntities.stories.d.ts +7 -0
  46. package/dist/crate-builder/RenderEntity/PropertyHelp.d.ts +6 -0
  47. package/dist/crate-builder/RenderEntity/RenderControls.d.ts +22 -0
  48. package/dist/crate-builder/RenderEntity/RenderLinkedItem.d.ts +20 -0
  49. package/dist/crate-builder/RenderEntity/RenderPropertyHelp.d.ts +6 -0
  50. package/dist/crate-builder/RenderEntity/RenderReverseConnections.d.ts +16 -0
  51. package/dist/crate-builder/RenderEntity/RenderTypes.d.ts +6 -0
  52. package/dist/crate-builder/RenderEntity/Shell2.d.ts +14 -0
  53. package/dist/crate-builder/RenderEntity/UnlinkEntity.d.ts +14 -0
  54. package/dist/crate-builder/RenderEntity/auto-complete.lib.d.ts +25 -0
  55. package/dist/crate-builder/RenderEntity/keys.d.ts +4 -0
  56. package/dist/crate-builder/RenderEntity/layout.d.ts +14 -0
  57. package/dist/crate-builder/RenderEntity/layout.spec.d.ts +1 -0
  58. package/dist/crate-builder/Shell.d.ts +40 -0
  59. package/dist/crate-builder/editor-state.d.ts +72 -0
  60. package/dist/crate-builder/helpers.d.ts +9 -0
  61. package/dist/crate-builder/i18n.d.ts +2 -0
  62. package/dist/crate-builder/lib/validate-iri.d.ts +6 -0
  63. package/dist/crate-builder/locales/en.d.ts +79 -0
  64. package/dist/crate-builder/locales/hu.d.ts +79 -0
  65. package/dist/crate-builder/primitives/Boolean.d.ts +11 -0
  66. package/dist/crate-builder/primitives/Boolean.stories.d.ts +7 -0
  67. package/dist/crate-builder/primitives/Date.d.ts +11 -0
  68. package/dist/crate-builder/primitives/Date.stories.d.ts +5 -0
  69. package/dist/crate-builder/primitives/DateTime.d.ts +11 -0
  70. package/dist/crate-builder/primitives/DateTime.stories.d.ts +5 -0
  71. package/dist/crate-builder/primitives/Geo.d.ts +12 -0
  72. package/dist/crate-builder/primitives/Geo.stories.d.ts +26 -0
  73. package/dist/crate-builder/primitives/Map.SelectArea.d.ts +9 -0
  74. package/dist/crate-builder/primitives/Map.d.ts +15 -0
  75. package/dist/crate-builder/primitives/Map.stories.d.ts +6 -0
  76. package/dist/crate-builder/primitives/Number.d.ts +16 -0
  77. package/dist/crate-builder/primitives/Number.stories.d.ts +10 -0
  78. package/dist/crate-builder/primitives/Select.d.ts +15 -0
  79. package/dist/crate-builder/primitives/Select.stories.d.ts +9 -0
  80. package/dist/crate-builder/primitives/SelectObject.d.ts +13 -0
  81. package/dist/crate-builder/primitives/SelectObject.stories.d.ts +5 -0
  82. package/dist/crate-builder/primitives/SelectUrl.d.ts +14 -0
  83. package/dist/crate-builder/primitives/SelectUrl.stories.d.ts +7 -0
  84. package/dist/crate-builder/primitives/Text.d.ts +19 -0
  85. package/dist/crate-builder/primitives/Text.stories.d.ts +13 -0
  86. package/dist/crate-builder/primitives/Time.d.ts +11 -0
  87. package/dist/crate-builder/primitives/Time.stories.d.ts +7 -0
  88. package/dist/crate-builder/primitives/Url.d.ts +11 -0
  89. package/dist/crate-builder/primitives/Url.stories.d.ts +7 -0
  90. package/dist/crate-builder/primitives/Value.d.ts +7 -0
  91. package/dist/crate-builder/primitives/Value.stories.d.ts +7 -0
  92. package/dist/crate-builder/primitives/date-libs.d.ts +1 -0
  93. package/dist/crate-builder/property-definitions.d.ts +78 -0
  94. package/dist/crate-builder/store.d.ts +8 -0
  95. package/dist/favicon.ico +0 -0
  96. package/dist/index.d.ts +3 -0
  97. package/dist/index.html +43 -0
  98. package/dist/logo192.png +0 -0
  99. package/dist/logo512.png +0 -0
  100. package/dist/manifest.json +25 -0
  101. package/dist/marker-icon.png +0 -0
  102. package/dist/marker-shadow.png +0 -0
  103. package/dist/recrate.es.js +158699 -0
  104. package/dist/recrate.umd.js +158717 -0
  105. package/dist/robots.txt +3 -0
  106. package/dist/style.css +1721 -0
  107. package/dist/types.d.ts +42 -0
  108. package/docker-compose.yml +30 -0
  109. package/docs/.nojekyll +1 -0
  110. package/docs/assets/highlight.css +99 -0
  111. package/docs/assets/icons.js +18 -0
  112. package/docs/assets/icons.svg +1 -0
  113. package/docs/assets/main.js +60 -0
  114. package/docs/assets/navigation.js +1 -0
  115. package/docs/assets/search.js +1 -0
  116. package/docs/assets/style.css +1448 -0
  117. package/docs/classes/src_crate_builder_CrateManager_crate_manager.CrateManager.html +240 -0
  118. package/docs/classes/src_crate_builder_CrateManager_profile_manager.ProfileManager.html +42 -0
  119. package/docs/classes/src_crate_builder_editor_state.EditorState.html +28 -0
  120. package/docs/classes/src_crate_builder_types.CrateManagerType.html +57 -0
  121. package/docs/classes/src_crate_builder_types.ProfileManagerType.html +13 -0
  122. package/docs/functions/src_crate_builder_CrateManager_lib.isURL.html +2 -0
  123. package/docs/functions/src_crate_builder_CrateManager_lib.mintNewCrate.html +3 -0
  124. package/docs/functions/src_crate_builder_CrateManager_lib.normalise.html +5 -0
  125. package/docs/functions/src_crate_builder_CrateManager_lib.normaliseEntityType.html +1 -0
  126. package/docs/index.html +58 -0
  127. package/docs/interfaces/src_crate_builder_types.NormalisedCrate.html +3 -0
  128. package/docs/interfaces/src_crate_builder_types.NormalisedEntityDefinition.html +4 -0
  129. package/docs/interfaces/src_crate_builder_types.NormalisedProfile.html +9 -0
  130. package/docs/interfaces/src_crate_builder_types.ProfileLayout.html +2 -0
  131. package/docs/interfaces/src_crate_builder_types.ProfileLayoutGroup.html +9 -0
  132. package/docs/interfaces/src_crate_builder_types.UnverifiedCrate.html +3 -0
  133. package/docs/interfaces/src_crate_builder_types.UnverifiedEntityDefinition.html +4 -0
  134. package/docs/modules/src_crate_builder_CrateManager_crate_manager.html +2 -0
  135. package/docs/modules/src_crate_builder_CrateManager_lib.html +6 -0
  136. package/docs/modules/src_crate_builder_CrateManager_profile_manager.html +2 -0
  137. package/docs/modules/src_crate_builder_editor_state.html +2 -0
  138. package/docs/modules/src_crate_builder_types.html +16 -0
  139. package/docs/types/src_crate_builder_types.EntityReference.html +1 -0
  140. package/docs/types/src_crate_builder_types.NormalisedContext.html +1 -0
  141. package/docs/types/src_crate_builder_types.PrimitiveType.html +1 -0
  142. package/docs/types/src_crate_builder_types.ProfileAssociation.html +1 -0
  143. package/docs/types/src_crate_builder_types.ProfileInput.html +1 -0
  144. package/docs/types/src_crate_builder_types.UnverifiedContext.html +1 -0
  145. package/docs/variables/src_crate_builder_CrateManager_lib.urlProtocols.html +1 -0
  146. package/index.html +13 -0
  147. package/load-data-packs.cjs +38 -0
  148. package/package.json +135 -0
  149. package/postcss.config.cjs +6 -0
  150. package/public/favicon.ico +0 -0
  151. package/public/index.html +43 -0
  152. package/public/logo192.png +0 -0
  153. package/public/logo512.png +0 -0
  154. package/public/manifest.json +25 -0
  155. package/public/marker-icon.png +0 -0
  156. package/public/marker-shadow.png +0 -0
  157. package/public/robots.txt +3 -0
  158. package/react-app-env.d.ts +1 -0
  159. package/rollup.config.js +26 -0
  160. package/src/app/App.tsx +13 -0
  161. package/src/app/EmbeddedComponent.tsx +432 -0
  162. package/src/app/index.html +20 -0
  163. package/src/app/index.tsx +19 -0
  164. package/src/app/lookup.ts +141 -0
  165. package/src/app/override-styles.css +96 -0
  166. package/src/crate-builder/CrateManager/contexts/1.1-context.jsonld +2660 -0
  167. package/src/crate-builder/CrateManager/contexts/1.2-DRAFT-context.jsonld +2918 -0
  168. package/src/crate-builder/CrateManager/contexts.ts +42 -0
  169. package/src/crate-builder/CrateManager/crate-manager-benchmarking.spec.ts +31 -0
  170. package/src/crate-builder/CrateManager/crate-manager-loading-exporting.spec.ts +431 -0
  171. package/src/crate-builder/CrateManager/crate-manager-operations.spec.ts +298 -0
  172. package/src/crate-builder/CrateManager/crate-manager.spec.ts +2336 -0
  173. package/src/crate-builder/CrateManager/crate-manager.ts +2111 -0
  174. package/src/crate-builder/CrateManager/lib.spec.ts +133 -0
  175. package/src/crate-builder/CrateManager/lib.ts +170 -0
  176. package/src/crate-builder/CrateManager/profile-manager.spec.ts +593 -0
  177. package/src/crate-builder/CrateManager/profile-manager.ts +367 -0
  178. package/src/crate-builder/CrateManager/schema-type-definitions.json +35122 -0
  179. package/src/crate-builder/CrateManager/validate-identifier.spec.ts +82 -0
  180. package/src/crate-builder/CrateManager/validate-identifier.ts +65 -0
  181. package/src/crate-builder/RenderEntity/Add.tsx +249 -0
  182. package/src/crate-builder/RenderEntity/AddControl.stories.tsx +126 -0
  183. package/src/crate-builder/RenderEntity/AddControl.tsx +84 -0
  184. package/src/crate-builder/RenderEntity/AutoComplete.tsx +215 -0
  185. package/src/crate-builder/RenderEntity/BulkAdd.tsx +136 -0
  186. package/src/crate-builder/RenderEntity/DeleteProperty.tsx +33 -0
  187. package/src/crate-builder/RenderEntity/DialogAddProperty.tsx +83 -0
  188. package/src/crate-builder/RenderEntity/DialogBrowseEntities.tsx +136 -0
  189. package/src/crate-builder/RenderEntity/DialogEditContext.tsx +107 -0
  190. package/src/crate-builder/RenderEntity/DialogPreviewCrate.tsx +54 -0
  191. package/src/crate-builder/RenderEntity/DialogSaveCrateAsTemplate.tsx +65 -0
  192. package/src/crate-builder/RenderEntity/DialogSaveEntityTemplate.tsx +87 -0
  193. package/src/crate-builder/RenderEntity/DisplayPropertyName.stories.tsx +30 -0
  194. package/src/crate-builder/RenderEntity/DisplayPropertyName.tsx +21 -0
  195. package/src/crate-builder/RenderEntity/EntityId.tsx +75 -0
  196. package/src/crate-builder/RenderEntity/EntityName.tsx +49 -0
  197. package/src/crate-builder/RenderEntity/EntityProperty.tsx +188 -0
  198. package/src/crate-builder/RenderEntity/EntityPropertyInstance.tsx +255 -0
  199. package/src/crate-builder/RenderEntity/EntityType.tsx +95 -0
  200. package/src/crate-builder/RenderEntity/ItemLink.tsx +37 -0
  201. package/src/crate-builder/RenderEntity/PaginateLinkedEntities.stories.tsx +43 -0
  202. package/src/crate-builder/RenderEntity/PaginateLinkedEntities.tsx +141 -0
  203. package/src/crate-builder/RenderEntity/PropertyHelp.tsx +39 -0
  204. package/src/crate-builder/RenderEntity/RenderControls.tsx +278 -0
  205. package/src/crate-builder/RenderEntity/RenderLinkedItem.tsx +139 -0
  206. package/src/crate-builder/RenderEntity/RenderPropertyHelp.tsx +41 -0
  207. package/src/crate-builder/RenderEntity/RenderReverseConnections.tsx +150 -0
  208. package/src/crate-builder/RenderEntity/RenderTypes.tsx +102 -0
  209. package/src/crate-builder/RenderEntity/Shell2.tsx +576 -0
  210. package/src/crate-builder/RenderEntity/UnlinkEntity.tsx +30 -0
  211. package/src/crate-builder/RenderEntity/auto-complete.lib.ts +184 -0
  212. package/src/crate-builder/RenderEntity/keys.ts +4 -0
  213. package/src/crate-builder/RenderEntity/layout.spec.js +593 -0
  214. package/src/crate-builder/RenderEntity/layout.ts +220 -0
  215. package/src/crate-builder/Shell.tsx +323 -0
  216. package/src/crate-builder/component.css +65 -0
  217. package/src/crate-builder/editor-state.ts +114 -0
  218. package/src/crate-builder/helpers.ts +16 -0
  219. package/src/crate-builder/i18n.ts +22 -0
  220. package/src/crate-builder/lib/validate-iri.js +69 -0
  221. package/src/crate-builder/lib/validate-iri.ts +57 -0
  222. package/src/crate-builder/locales/en.js +149 -0
  223. package/src/crate-builder/locales/hu.js +147 -0
  224. package/src/crate-builder/primitives/Boolean.stories.tsx +33 -0
  225. package/src/crate-builder/primitives/Boolean.tsx +67 -0
  226. package/src/crate-builder/primitives/Date.stories.tsx +32 -0
  227. package/src/crate-builder/primitives/Date.tsx +58 -0
  228. package/src/crate-builder/primitives/DateTime.stories.tsx +32 -0
  229. package/src/crate-builder/primitives/DateTime.tsx +64 -0
  230. package/src/crate-builder/primitives/Geo.stories.tsx +57 -0
  231. package/src/crate-builder/primitives/Geo.tsx +225 -0
  232. package/src/crate-builder/primitives/Map.SelectArea.js +359 -0
  233. package/src/crate-builder/primitives/Map.stories.tsx +61 -0
  234. package/src/crate-builder/primitives/Map.tsx +124 -0
  235. package/src/crate-builder/primitives/Number.stories.tsx +74 -0
  236. package/src/crate-builder/primitives/Number.tsx +166 -0
  237. package/src/crate-builder/primitives/Select.stories.tsx +66 -0
  238. package/src/crate-builder/primitives/Select.tsx +122 -0
  239. package/src/crate-builder/primitives/SelectObject.stories.tsx +29 -0
  240. package/src/crate-builder/primitives/SelectObject.tsx +105 -0
  241. package/src/crate-builder/primitives/SelectUrl.stories.tsx +42 -0
  242. package/src/crate-builder/primitives/SelectUrl.tsx +110 -0
  243. package/src/crate-builder/primitives/Text.stories.tsx +106 -0
  244. package/src/crate-builder/primitives/Text.tsx +197 -0
  245. package/src/crate-builder/primitives/Time.stories.tsx +38 -0
  246. package/src/crate-builder/primitives/Time.tsx +71 -0
  247. package/src/crate-builder/primitives/Url.stories.tsx +43 -0
  248. package/src/crate-builder/primitives/Url.tsx +75 -0
  249. package/src/crate-builder/primitives/Value.stories.tsx +37 -0
  250. package/src/crate-builder/primitives/Value.tsx +30 -0
  251. package/src/crate-builder/primitives/date-libs.ts +12 -0
  252. package/src/crate-builder/profile-schema.json +145 -0
  253. package/src/crate-builder/property-definitions.ts +78 -0
  254. package/src/crate-builder/store.ts +14 -0
  255. package/src/crate-builder/tailwind.css +7 -0
  256. package/src/crate-builder/types.d.ts +318 -0
  257. package/src/examples/collection/collections-entity-example.json +131 -0
  258. package/src/examples/collection/crate-builder-entity-example.json +33 -0
  259. package/src/examples/item/complex-collection/ro-crate-metadata.json +174 -0
  260. package/src/examples/item/complex-item/ro-crate-metadata.json +769 -0
  261. package/src/examples/item/crate-with-language.json +38 -0
  262. package/src/examples/item/empty/ro-crate-metadata.json +20 -0
  263. package/src/examples/item/item-with-relationship-and-action/ro-crate-metadata.json +66 -0
  264. package/src/examples/item/large-crate/ro-crate-metadata.json +5762 -0
  265. package/src/examples/item/multiple-types/ro-crate-metadata.json +20 -0
  266. package/src/examples/item/ridiculously-big-collection/ro-crate-metadata.json +162977 -0
  267. package/src/examples/profile/aroma.complex.profile.json +11098 -0
  268. package/src/examples/profile/aroma.profile.json +9158 -0
  269. package/src/examples/profile/nyingarn-item-profile.json +426 -0
  270. package/src/examples/profile/profile-to-test-inverse-associations.json +73 -0
  271. package/src/examples/profile/profile-to-test-multiple-types.json +31 -0
  272. package/src/examples/profile/profile-with-all-primitives-and-groups.json +207 -0
  273. package/src/examples/profile/profile-with-all-primitives.json +244 -0
  274. package/src/examples/profile/profile-with-constraints.json +446 -0
  275. package/src/examples/profile/profile-with-resolve.json +57 -0
  276. package/src/examples/profile/vocabulary-creation-profile.json +231 -0
  277. package/src/images.d.ts +5 -0
  278. package/src/index.ts +10 -0
  279. package/src/types.ts +104 -0
  280. package/tailwind.config.js +20 -0
  281. package/tsconfig.app.json +31 -0
  282. package/tsconfig.json +26 -0
  283. package/typedoc.json +11 -0
  284. package/update-deps.sh +4 -0
  285. package/vite-env.d.ts +1 -0
  286. package/vite.config.ts +41 -0
@@ -0,0 +1,367 @@
1
+ import schemaOrgTypeDefinitions from "./schema-type-definitions.json";
2
+ import isArray from "lodash/isArray";
3
+ import isEmpty from "lodash/isEmpty";
4
+ import flattenDeep from "lodash/flattenDeep";
5
+ import cloneDeep from "lodash/cloneDeep";
6
+ import orderBy from "lodash/orderBy";
7
+ import has from "lodash/has";
8
+ import compact from "lodash/compact";
9
+ import uniq from "lodash/uniq";
10
+ import uniqBy from "lodash/uniqBy";
11
+ import intersection from "lodash/intersection";
12
+ import type {
13
+ NormalisedProfile,
14
+ NormalisedEntityDefinition,
15
+ ProfileLayout,
16
+ ProfileInput,
17
+ EntityReference,
18
+ } from "../types";
19
+
20
+ /**
21
+ * @class
22
+ *
23
+ * ProfileManager
24
+ *
25
+ * A class to work with Describo Profiles
26
+ *
27
+ * @param {profile} - profile to handle
28
+ */
29
+ export class ProfileManager {
30
+ profile?: NormalisedProfile;
31
+ $key?: number;
32
+ context?: any;
33
+
34
+ constructor({ profile }: { profile?: NormalisedProfile }) {
35
+ if (profile) {
36
+ this.profile = profile;
37
+ this.__processInputs();
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Process input definitions for certain types.
43
+ *
44
+ * For now it takes care of setting 'handlesMultipleValues' for input types, which can have multiple values
45
+ * but handle all values themselves and not require a new render property added for each new value. This is the
46
+ * case for checbox style selects. It provides the same functionality as a normal select but all values are
47
+ * visible and selectable at once and not one by one.
48
+ *
49
+ * It also makes sure that for radio style selects "multiple" is always set to "false", as radio input only
50
+ * provides a single value selected form many.
51
+ *
52
+ * @private
53
+ */
54
+ private __processInputs() {
55
+ if (!this.profile?.classes) return;
56
+
57
+ for (const className in this.profile.classes) {
58
+ const classDefinition = this.profile.classes[className];
59
+ if (!classDefinition.inputs) continue;
60
+
61
+ classDefinition.inputs = classDefinition.inputs.map(input => {
62
+ if (input.type.includes("Select") && input.style === "checkbox") {
63
+ return {
64
+ ...input,
65
+ multiple: false, // must set explicitly, otherwise will be set to true implicitly later
66
+ handlesMultipleValues: true
67
+ };
68
+ } else if (input.type.includes("Select") && input.style === "radio") {
69
+ return {
70
+ ...input,
71
+ multiple: false, // on case of radio, it must always be false
72
+ };
73
+ }
74
+
75
+ return input;
76
+ });
77
+ }
78
+ }
79
+
80
+ /**
81
+ *
82
+ * Get the layout for an entity from the profile
83
+ *
84
+ * Returns the first matching layout from the profile
85
+ *
86
+ * @param { Object } options
87
+ * @param { Object } options.entity - the entity whose layout is required
88
+ *
89
+ */
90
+ getLayout({
91
+ entity,
92
+ }: {
93
+ entity: NormalisedEntityDefinition | EntityReference;
94
+ }): ProfileLayout | null {
95
+ // no layout defined in profile
96
+ if (!this.profile?.layouts || !this.profile.layouts.length) return null;
97
+ let layouts = this.profile.layouts;
98
+ let layout = layouts.filter((layout) => {
99
+ return intersection(layout.appliesTo, (entity as any)["@type"]).length;
100
+ });
101
+
102
+ // no matching layout found
103
+ if (!layout.length) return null;
104
+
105
+ // match found - make sure it has about and overflow placeholders
106
+ let firstMatchingLayout = layout[0];
107
+ if (!firstMatchingLayout.about) {
108
+ firstMatchingLayout.about = {
109
+ name: "about",
110
+ label: "About",
111
+ inputs: [],
112
+ order: 0,
113
+ };
114
+ }
115
+ if (!firstMatchingLayout.overflow) {
116
+ firstMatchingLayout.overflow = {
117
+ name: "overflow",
118
+ label: "...",
119
+ inputs: [],
120
+ order: Object.keys(layout).length,
121
+ };
122
+ }
123
+
124
+ // return it
125
+ return firstMatchingLayout;
126
+ }
127
+
128
+ /**
129
+ * Get inverse associations from the profile if any are defined
130
+ */
131
+ getPropertyAssociations(): { [key: string]: { property: string; propertyId: string } } {
132
+ if (!this.profile?.propertyAssociations) return {};
133
+
134
+ // create the associations both ways and return
135
+ const associations: { [key: string]: { property: string; propertyId: string } } = {};
136
+ this.profile.propertyAssociations.forEach((a) => {
137
+ associations[a.property] = a.inverse;
138
+ associations[a.inverse.property] = { property: a.property, propertyId: a.propertyId };
139
+ });
140
+ return associations;
141
+ }
142
+
143
+ /**
144
+ *
145
+ * Get the available classes
146
+ * if a profile is defined, get those
147
+ *
148
+ * Returns the classes defined in the profile if one is applied
149
+ * or all of the classes built into the base, schema.org profile
150
+ *
151
+ */
152
+ getClasses() {
153
+ if (this.profile?.classes) {
154
+ return Object.keys(this.profile?.classes).sort();
155
+ } else {
156
+ return Object.keys(schemaOrgTypeDefinitions).sort();
157
+ }
158
+ }
159
+
160
+ /**
161
+ *
162
+ * Return the type hierarchy for the given entity
163
+ *
164
+ * @param { Object } options
165
+ * @param { Object } options.entity - the entity whose hierarchy is required
166
+ *
167
+ *
168
+ */
169
+ getEntityTypeHierarchy({ entity }: { entity: NormalisedEntityDefinition }) {
170
+ let types = entity["@type"];
171
+ types = this.mapTypeHierarchies({ types });
172
+ return types;
173
+ }
174
+
175
+ /**
176
+ *
177
+ * Given an entity, try to find a definition for the property in the profile or
178
+ * right across the hierarchy
179
+ *
180
+ * @param { Object } options
181
+ * @param { Object } options.property - the property to define
182
+ * @param { Object } options.entity - the entity this property is a part of
183
+ *
184
+ */
185
+ getPropertyDefinition({
186
+ property,
187
+ entity,
188
+ }: {
189
+ property: string;
190
+ entity: NormalisedEntityDefinition;
191
+ }) {
192
+ let propertyDefinition = {} as ProfileInput;
193
+ let inputs = this.getInputsFromProfile({ entity });
194
+ if (inputs.length) {
195
+ // we found an entity definition in the profile - do we have a property definition?
196
+ let definition = inputs.filter((p) => p.name.toLowerCase() === property.toLowerCase());
197
+ if (definition.length) {
198
+ // console.debug(
199
+ // "PROFILE property definition:",
200
+ // JSON.stringify(propertyDefinition, null, 2)
201
+ // );
202
+ propertyDefinition = cloneDeep(definition[0]);
203
+ }
204
+ }
205
+ // unable to locate a property definition in the profile - look in schema.org
206
+ if (isEmpty(propertyDefinition)) {
207
+ let { inputs } = this.getAllInputs({ entity });
208
+ let definition = inputs.filter((p) => p.name.toLowerCase() === property.toLowerCase());
209
+ if (definition.length) {
210
+ // console.debug(
211
+ // "SCHEMA ORG property definition:",
212
+ // JSON.stringify(propertyDefinition, null, 2)
213
+ // );
214
+ propertyDefinition = cloneDeep(definition[0]);
215
+ }
216
+ }
217
+
218
+ // unable to locate a property definition in schema.org - create a default one
219
+ if (isEmpty(propertyDefinition)) {
220
+ // console.debug(
221
+ // "DEFAULT property definition:",
222
+ // JSON.stringify(propertyDefinition, null, 2)
223
+ // );
224
+ propertyDefinition = {
225
+ id: "",
226
+ name: "",
227
+ type: ["Text"],
228
+ help: "",
229
+ multiple: true,
230
+ };
231
+ }
232
+
233
+ if (!isArray(propertyDefinition.type)) {
234
+ propertyDefinition.type = [propertyDefinition.type];
235
+ }
236
+ if (!has(propertyDefinition, "multiple")) propertyDefinition.multiple = true;
237
+
238
+ return { propertyDefinition };
239
+ }
240
+
241
+ /**
242
+ *
243
+ * Given a set of types, figure out the type hierarchy taking into account
244
+ * the parent types that this is a subClassOf
245
+ */
246
+ mapTypeHierarchies({ types }: { types: string[] }) {
247
+ types = cloneDeep(types);
248
+ if (!types.includes("Thing")) types.push("Thing");
249
+
250
+ types = flattenDeep(
251
+ types.map((type) => [type, this.profile?.classes?.[type]?.subClassOf ?? []])
252
+ );
253
+ types = compact(types);
254
+
255
+ types = flattenDeep(
256
+ types.map((type) => {
257
+ return [
258
+ type,
259
+ (schemaOrgTypeDefinitions as { [key: string]: { hierarchy: string[] } })[type]
260
+ ?.hierarchy ?? ["Thing"],
261
+ ];
262
+ })
263
+ );
264
+ types = uniq(types);
265
+ return types;
266
+ }
267
+
268
+ /**
269
+ *
270
+ * Given an entity, get the inputs defined in the profile
271
+ *
272
+ * @param { Object } options
273
+ * @param { Object } options.entity - the entity
274
+ *
275
+ */
276
+ getInputsFromProfile({ entity }: { entity: NormalisedEntityDefinition }): ProfileInput[] {
277
+ let types = entity["@type"];
278
+
279
+ let inputs: ProfileInput[] = [];
280
+ for (let type of types) {
281
+ if (this.profile?.classes?.[type]) {
282
+ // yes - get it
283
+ inputs = [...inputs, ...cloneDeep(this.profile?.classes?.[type].inputs)];
284
+ }
285
+
286
+ // if the definition is set to inherit, and this class is a subclass of others,
287
+ // go and get those inputs as well
288
+ if (
289
+ this.profile?.classes?.[type]?.definition === "inherit" &&
290
+ this.profile?.classes?.[type]?.subClassOf
291
+ ) {
292
+ for (let parentClass of this.profile?.classes?.[type]?.subClassOf) {
293
+ inputs = [
294
+ ...inputs,
295
+ ...cloneDeep(this.profile?.classes?.[parentClass]?.inputs ?? []),
296
+ ];
297
+ }
298
+ }
299
+ }
300
+ return uniqBy(inputs, "id");
301
+ }
302
+
303
+ /**
304
+ *
305
+ * Given an entity, get all available inputs by joining the profile with schema.org
306
+ *
307
+ * @param { Object } options
308
+ * @param { Object } options.entity - the entity
309
+ */
310
+ getAllInputs({ entity }: { entity: NormalisedEntityDefinition }): { inputs: ProfileInput[] } {
311
+ // let getInputsFunction = getInputs.bind(this);
312
+ const hierarchy = this.getEntityTypeHierarchy({ entity });
313
+ let inputs = [];
314
+
315
+ const getInputs = (type: string) => {
316
+ let inputs = [];
317
+ if (this.profile?.classes?.[type]) {
318
+ // type defined in profile - get those inputs
319
+ inputs.push(this.profile.classes[type].inputs);
320
+ }
321
+ if (this.profile?.classes?.[type]?.definition === "inherit") {
322
+ // profile type definition set to inherit - collect schema.org inputs
323
+ inputs.push((schemaOrgTypeDefinitions as any)[type].inputs);
324
+ }
325
+ if (!this.profile?.classes?.[type]) {
326
+ // no definition in profile - collect schema.org inputs
327
+ inputs.push((schemaOrgTypeDefinitions as any)?.[type]?.inputs);
328
+ }
329
+ return inputs;
330
+ };
331
+
332
+ for (let type of hierarchy) {
333
+ inputs.push(getInputs(type));
334
+ }
335
+ inputs = flattenDeep(inputs);
336
+ inputs = compact(inputs);
337
+ inputs = uniqBy(inputs, "id");
338
+ inputs = orderBy(inputs, "name");
339
+ return { inputs };
340
+ }
341
+
342
+ /**
343
+ *
344
+ * Try to get a definition from the profile and see if it's override or inherit
345
+ *
346
+ * If there's an override then return override - otherwise inherit. Exclusive rather than inclusive.
347
+ *
348
+ * @param { Object } options
349
+ * @param { Object } options.entity - the entity
350
+ * if there's an override then set to override - otherwise inherit
351
+ * be exclusive rather than inclusive
352
+ */
353
+ getTypeDefinition({ entity }: { entity: NormalisedEntityDefinition }) {
354
+ let types = entity["@type"];
355
+ let directive = types.map((type) => this.profile?.classes?.[type]?.definition);
356
+ return directive.includes("override") ? "override" : "inherit";
357
+ }
358
+
359
+ /**
360
+ * Get an entity label if defined
361
+ *
362
+ * @property the type name to localise
363
+ */
364
+ getTypeLabel(type: string) {
365
+ return this.profile?.localisation?.[type] ?? type;
366
+ }
367
+ }