@arpproject/recrate 0.1.7 → 0.1.8
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 +3 -2
- package/dist/recrate.css +4 -4
- package/dist/recrate.es.js +34674 -114061
- package/package.json +41 -32
- package/.eslintrc.json +0 -37
- package/.storybook/main.ts +0 -40
- package/.storybook/preview.tsx +0 -46
- package/babel.config.json +0 -5
- package/docker-compose.yml +0 -30
- package/docs/.nojekyll +0 -1
- package/docs/assets/highlight.css +0 -99
- package/docs/assets/icons.js +0 -18
- package/docs/assets/icons.svg +0 -1
- package/docs/assets/main.js +0 -60
- package/docs/assets/navigation.js +0 -1
- package/docs/assets/search.js +0 -1
- package/docs/assets/style.css +0 -1448
- package/docs/classes/src_crate_builder_CrateManager_crate_manager.CrateManager.html +0 -240
- package/docs/classes/src_crate_builder_CrateManager_profile_manager.ProfileManager.html +0 -42
- package/docs/classes/src_crate_builder_editor_state.EditorState.html +0 -28
- package/docs/classes/src_crate_builder_types.CrateManagerType.html +0 -57
- package/docs/classes/src_crate_builder_types.ProfileManagerType.html +0 -13
- package/docs/functions/src_crate_builder_CrateManager_lib.isURL.html +0 -2
- package/docs/functions/src_crate_builder_CrateManager_lib.mintNewCrate.html +0 -3
- package/docs/functions/src_crate_builder_CrateManager_lib.normalise.html +0 -5
- package/docs/functions/src_crate_builder_CrateManager_lib.normaliseEntityType.html +0 -1
- package/docs/index.html +0 -58
- package/docs/interfaces/src_crate_builder_types.NormalisedCrate.html +0 -3
- package/docs/interfaces/src_crate_builder_types.NormalisedEntityDefinition.html +0 -4
- package/docs/interfaces/src_crate_builder_types.NormalisedProfile.html +0 -9
- package/docs/interfaces/src_crate_builder_types.ProfileLayout.html +0 -2
- package/docs/interfaces/src_crate_builder_types.ProfileLayoutGroup.html +0 -9
- package/docs/interfaces/src_crate_builder_types.UnverifiedCrate.html +0 -3
- package/docs/interfaces/src_crate_builder_types.UnverifiedEntityDefinition.html +0 -4
- package/docs/modules/src_crate_builder_CrateManager_crate_manager.html +0 -2
- package/docs/modules/src_crate_builder_CrateManager_lib.html +0 -6
- package/docs/modules/src_crate_builder_CrateManager_profile_manager.html +0 -2
- package/docs/modules/src_crate_builder_editor_state.html +0 -2
- package/docs/modules/src_crate_builder_types.html +0 -16
- package/docs/types/src_crate_builder_types.EntityReference.html +0 -1
- package/docs/types/src_crate_builder_types.NormalisedContext.html +0 -1
- package/docs/types/src_crate_builder_types.PrimitiveType.html +0 -1
- package/docs/types/src_crate_builder_types.ProfileAssociation.html +0 -1
- package/docs/types/src_crate_builder_types.ProfileInput.html +0 -1
- package/docs/types/src_crate_builder_types.UnverifiedContext.html +0 -1
- package/docs/variables/src_crate_builder_CrateManager_lib.urlProtocols.html +0 -1
- package/index.html +0 -13
- package/load-data-packs.cjs +0 -38
- package/postcss.config.cjs +0 -6
- package/public/favicon.ico +0 -0
- package/public/index.html +0 -43
- package/public/logo192.png +0 -0
- package/public/logo512.png +0 -0
- package/public/manifest.json +0 -25
- package/public/marker-icon.png +0 -0
- package/public/marker-shadow.png +0 -0
- package/public/robots.txt +0 -3
- package/react-app-env.d.ts +0 -1
- package/rollup.config.js +0 -26
- package/src/app/App.tsx +0 -13
- package/src/app/EmbeddedComponent.tsx +0 -432
- package/src/app/index.html +0 -20
- package/src/app/index.tsx +0 -19
- package/src/app/lookup.ts +0 -141
- package/src/app/override-styles.css +0 -96
- package/src/crate-builder/CrateManager/contexts/1.1-context.jsonld +0 -2660
- package/src/crate-builder/CrateManager/contexts/1.2-DRAFT-context.jsonld +0 -2918
- package/src/crate-builder/CrateManager/contexts.ts +0 -42
- package/src/crate-builder/CrateManager/crate-manager-benchmarking.spec.ts +0 -31
- package/src/crate-builder/CrateManager/crate-manager-loading-exporting.spec.ts +0 -431
- package/src/crate-builder/CrateManager/crate-manager-operations.spec.ts +0 -298
- package/src/crate-builder/CrateManager/crate-manager.spec.ts +0 -2336
- package/src/crate-builder/CrateManager/crate-manager.ts +0 -2111
- package/src/crate-builder/CrateManager/lib.spec.ts +0 -133
- package/src/crate-builder/CrateManager/lib.ts +0 -170
- package/src/crate-builder/CrateManager/profile-manager.spec.ts +0 -593
- package/src/crate-builder/CrateManager/profile-manager.ts +0 -367
- package/src/crate-builder/CrateManager/schema-type-definitions.json +0 -35122
- package/src/crate-builder/CrateManager/validate-identifier.spec.ts +0 -82
- package/src/crate-builder/CrateManager/validate-identifier.ts +0 -65
- package/src/crate-builder/RenderEntity/Add.tsx +0 -249
- package/src/crate-builder/RenderEntity/AddControl.stories.tsx +0 -126
- package/src/crate-builder/RenderEntity/AddControl.tsx +0 -84
- package/src/crate-builder/RenderEntity/AutoComplete.tsx +0 -215
- package/src/crate-builder/RenderEntity/BulkAdd.tsx +0 -136
- package/src/crate-builder/RenderEntity/DeleteProperty.tsx +0 -33
- package/src/crate-builder/RenderEntity/DialogAddProperty.tsx +0 -83
- package/src/crate-builder/RenderEntity/DialogBrowseEntities.tsx +0 -136
- package/src/crate-builder/RenderEntity/DialogEditContext.tsx +0 -107
- package/src/crate-builder/RenderEntity/DialogPreviewCrate.tsx +0 -54
- package/src/crate-builder/RenderEntity/DialogSaveCrateAsTemplate.tsx +0 -65
- package/src/crate-builder/RenderEntity/DialogSaveEntityTemplate.tsx +0 -87
- package/src/crate-builder/RenderEntity/DisplayPropertyName.stories.tsx +0 -30
- package/src/crate-builder/RenderEntity/DisplayPropertyName.tsx +0 -21
- package/src/crate-builder/RenderEntity/EntityId.tsx +0 -75
- package/src/crate-builder/RenderEntity/EntityName.tsx +0 -49
- package/src/crate-builder/RenderEntity/EntityProperty.tsx +0 -188
- package/src/crate-builder/RenderEntity/EntityPropertyInstance.tsx +0 -255
- package/src/crate-builder/RenderEntity/EntityType.tsx +0 -95
- package/src/crate-builder/RenderEntity/ItemLink.tsx +0 -37
- package/src/crate-builder/RenderEntity/PaginateLinkedEntities.stories.tsx +0 -43
- package/src/crate-builder/RenderEntity/PaginateLinkedEntities.tsx +0 -141
- package/src/crate-builder/RenderEntity/PropertyHelp.tsx +0 -39
- package/src/crate-builder/RenderEntity/RenderControls.tsx +0 -278
- package/src/crate-builder/RenderEntity/RenderLinkedItem.tsx +0 -139
- package/src/crate-builder/RenderEntity/RenderPropertyHelp.tsx +0 -41
- package/src/crate-builder/RenderEntity/RenderReverseConnections.tsx +0 -150
- package/src/crate-builder/RenderEntity/RenderTypes.tsx +0 -102
- package/src/crate-builder/RenderEntity/Shell2.tsx +0 -576
- package/src/crate-builder/RenderEntity/UnlinkEntity.tsx +0 -30
- package/src/crate-builder/RenderEntity/auto-complete.lib.ts +0 -184
- package/src/crate-builder/RenderEntity/keys.ts +0 -4
- package/src/crate-builder/RenderEntity/layout.spec.js +0 -593
- package/src/crate-builder/RenderEntity/layout.ts +0 -220
- package/src/crate-builder/Shell.tsx +0 -337
- package/src/crate-builder/component.css +0 -65
- package/src/crate-builder/editor-state.ts +0 -114
- package/src/crate-builder/emotionCache.ts +0 -8
- package/src/crate-builder/helpers.ts +0 -16
- package/src/crate-builder/i18n.ts +0 -22
- package/src/crate-builder/lib/validate-iri.js +0 -69
- package/src/crate-builder/lib/validate-iri.ts +0 -57
- package/src/crate-builder/locales/en.js +0 -149
- package/src/crate-builder/locales/hu.js +0 -147
- package/src/crate-builder/primitives/Boolean.stories.tsx +0 -33
- package/src/crate-builder/primitives/Boolean.tsx +0 -67
- package/src/crate-builder/primitives/Date.stories.tsx +0 -32
- package/src/crate-builder/primitives/Date.tsx +0 -58
- package/src/crate-builder/primitives/DateTime.stories.tsx +0 -32
- package/src/crate-builder/primitives/DateTime.tsx +0 -64
- package/src/crate-builder/primitives/Geo.stories.tsx +0 -57
- package/src/crate-builder/primitives/Geo.tsx +0 -225
- package/src/crate-builder/primitives/Map.SelectArea.js +0 -359
- package/src/crate-builder/primitives/Map.stories.tsx +0 -61
- package/src/crate-builder/primitives/Map.tsx +0 -124
- package/src/crate-builder/primitives/Number.stories.tsx +0 -74
- package/src/crate-builder/primitives/Number.tsx +0 -166
- package/src/crate-builder/primitives/Select.stories.tsx +0 -66
- package/src/crate-builder/primitives/Select.tsx +0 -121
- package/src/crate-builder/primitives/SelectObject.stories.tsx +0 -29
- package/src/crate-builder/primitives/SelectObject.tsx +0 -105
- package/src/crate-builder/primitives/SelectUrl.stories.tsx +0 -42
- package/src/crate-builder/primitives/SelectUrl.tsx +0 -110
- package/src/crate-builder/primitives/Text.stories.tsx +0 -106
- package/src/crate-builder/primitives/Text.tsx +0 -197
- package/src/crate-builder/primitives/Time.stories.tsx +0 -38
- package/src/crate-builder/primitives/Time.tsx +0 -71
- package/src/crate-builder/primitives/Url.stories.tsx +0 -43
- package/src/crate-builder/primitives/Url.tsx +0 -75
- package/src/crate-builder/primitives/Value.stories.tsx +0 -37
- package/src/crate-builder/primitives/Value.tsx +0 -30
- package/src/crate-builder/primitives/date-libs.ts +0 -12
- package/src/crate-builder/profile-schema.json +0 -145
- package/src/crate-builder/property-definitions.ts +0 -78
- package/src/crate-builder/recrate.css +0 -3
- package/src/crate-builder/store.ts +0 -14
- package/src/crate-builder/tailwind.css +0 -5
- package/src/crate-builder/types.d.ts +0 -318
- package/src/examples/collection/collections-entity-example.json +0 -131
- package/src/examples/collection/crate-builder-entity-example.json +0 -33
- package/src/examples/item/complex-collection/ro-crate-metadata.json +0 -174
- package/src/examples/item/complex-item/ro-crate-metadata.json +0 -769
- package/src/examples/item/crate-with-language.json +0 -38
- package/src/examples/item/empty/ro-crate-metadata.json +0 -20
- package/src/examples/item/item-with-relationship-and-action/ro-crate-metadata.json +0 -66
- package/src/examples/item/large-crate/ro-crate-metadata.json +0 -5762
- package/src/examples/item/multiple-types/ro-crate-metadata.json +0 -20
- package/src/examples/item/ridiculously-big-collection/ro-crate-metadata.json +0 -162977
- package/src/examples/profile/aroma.complex.profile.json +0 -11098
- package/src/examples/profile/aroma.profile.json +0 -9158
- package/src/examples/profile/nyingarn-item-profile.json +0 -426
- package/src/examples/profile/profile-to-test-inverse-associations.json +0 -73
- package/src/examples/profile/profile-to-test-multiple-types.json +0 -31
- package/src/examples/profile/profile-with-all-primitives-and-groups.json +0 -207
- package/src/examples/profile/profile-with-all-primitives.json +0 -244
- package/src/examples/profile/profile-with-constraints.json +0 -446
- package/src/examples/profile/profile-with-resolve.json +0 -57
- package/src/examples/profile/vocabulary-creation-profile.json +0 -231
- package/src/images.d.ts +0 -5
- package/src/index.ts +0 -12
- package/src/types.ts +0 -104
- package/tailwind.config.js +0 -21
- package/tsconfig.app.json +0 -31
- package/tsconfig.json +0 -26
- package/typedoc.json +0 -11
- package/update-deps.sh +0 -4
- package/vite-env.d.ts +0 -1
- package/vite.config.ts +0 -46
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from "vitest";
|
|
2
|
-
import { isURL, normaliseEntityType, normalise } from "./lib";
|
|
3
|
-
|
|
4
|
-
describe("Test urls are correctly identified", () => {
|
|
5
|
-
test(`expect fail- ''`, () => {
|
|
6
|
-
let url = undefined;
|
|
7
|
-
expect(isURL(url)).toBeFalsy;
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
test(`expect fail - 3`, () => {
|
|
11
|
-
expect(isURL(3)).toBeFalsy;
|
|
12
|
-
});
|
|
13
|
-
test(`expect fail - true`, () => {
|
|
14
|
-
expect(isURL(true)).toBeFalsy;
|
|
15
|
-
});
|
|
16
|
-
test(`expect fail - data://server.name`, () => {
|
|
17
|
-
expect(isURL("data://server.name")).toBeFalsy;
|
|
18
|
-
});
|
|
19
|
-
test(`expect pass - http://schema.org/person`, () => {
|
|
20
|
-
expect(isURL("http://schema.org/person")).toBeTruthy;
|
|
21
|
-
});
|
|
22
|
-
test(`expect pass - https://schema.org/person`, () => {
|
|
23
|
-
expect(isURL("https://schema.org/person")).toBeTruthy;
|
|
24
|
-
});
|
|
25
|
-
test(`expect pass - ftp://server.name`, () => {
|
|
26
|
-
expect(isURL("ftp://server.name")).toBeTruthy;
|
|
27
|
-
});
|
|
28
|
-
test(`expect pass - ftps://server.name`, () => {
|
|
29
|
-
expect(isURL("ftps://server.name")).toBeTruthy;
|
|
30
|
-
});
|
|
31
|
-
test(`arcp://uuid,32a423d6-52ab-47e3-a9cd-54f418a48571/doc.html`, () => {
|
|
32
|
-
expect(isURL("arcp://uuid,32a423d6-52ab-47e3-a9cd-54f418a48571/doc.html")).toBeTruthy;
|
|
33
|
-
});
|
|
34
|
-
test(`arcp://uuid,b7749d0b-0e47-5fc4-999d-f154abe68065/pics/`, () => {
|
|
35
|
-
expect(isURL("arcp://uuid,b7749d0b-0e47-5fc4-999d-f154abe68065/pics/")).toBeTruthy;
|
|
36
|
-
});
|
|
37
|
-
test(`arcp://ni,sha-256;F-34D4TUeOfG0selz7REKRDo4XePkewPeQYtjL3vQs0/`, () => {
|
|
38
|
-
expect(isURL("arcp://ni,sha-256;F-34D4TUeOfG0selz7REKRDo4XePkewPeQYtjL3vQs0/")).toBeTruthy;
|
|
39
|
-
});
|
|
40
|
-
test(`arcp://name,gallery.example.org/`, () => {
|
|
41
|
-
expect(isURL("arcp://name,gallery.example.org/")).toBeTruthy;
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
describe("Test normalising an entity type", () => {
|
|
46
|
-
test(`no type defined - @id = ./`, () => {
|
|
47
|
-
let entity = { "@id": "./" };
|
|
48
|
-
expect(normaliseEntityType({ entity })).toMatchObject(["Thing"]);
|
|
49
|
-
});
|
|
50
|
-
test(`no type defined - @id = http://schema.org/person`, () => {
|
|
51
|
-
let entity = { "@id": "http://schema.org/person" };
|
|
52
|
-
expect(normaliseEntityType({ entity })).toMatchObject(["URL"]);
|
|
53
|
-
});
|
|
54
|
-
test(`type is boolean`, () => {
|
|
55
|
-
let entity = { "@id": "http://schema.org/person", "@type": true };
|
|
56
|
-
expect(normaliseEntityType({ entity })).toMatchObject(["true"]);
|
|
57
|
-
});
|
|
58
|
-
test(`type is number`, () => {
|
|
59
|
-
let entity = { "@id": "http://schema.org/person", "@type": 3 };
|
|
60
|
-
expect(normaliseEntityType({ entity })).toMatchObject(["3"]);
|
|
61
|
-
});
|
|
62
|
-
test(`type is string - 'Dataset'`, () => {
|
|
63
|
-
let entity = { "@id": "http://schema.org/person", "@type": "Dataset" };
|
|
64
|
-
expect(normaliseEntityType({ entity })).toMatchObject(["Dataset"]);
|
|
65
|
-
});
|
|
66
|
-
test(`type is string - 'Dataset, Collection'`, () => {
|
|
67
|
-
let entity = { "@id": "http://schema.org/person", "@type": "Dataset,Collection" };
|
|
68
|
-
expect(normaliseEntityType({ entity })).toMatchObject(["Dataset", "Collection"]);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
describe("Test normalising an entity", () => {
|
|
73
|
-
test(`reject bad @type`, () => {
|
|
74
|
-
try {
|
|
75
|
-
// @ts-expect-error: Intentionally passing incorrect type for testing
|
|
76
|
-
normalise({ "@type": {} }, 1);
|
|
77
|
-
} catch (error) {
|
|
78
|
-
expect((error as Error).message).toEqual(
|
|
79
|
-
`'@type' property must be a string or an array or not defined at all`
|
|
80
|
-
);
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
test(`reject bad @id`, () => {
|
|
84
|
-
try {
|
|
85
|
-
// @ts-expect-error: Intentionally passing incorrect type for testing
|
|
86
|
-
normalise({ "@id": {} }, 1);
|
|
87
|
-
} catch (error) {
|
|
88
|
-
expect((error as Error).message).toEqual(
|
|
89
|
-
`'@id' property must be a string or not defined at all`
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
try {
|
|
94
|
-
// @ts-expect-error: Intentionally passing incorrect type for testing
|
|
95
|
-
normalise({ "@id": 3 }, 1);
|
|
96
|
-
} catch (error) {
|
|
97
|
-
expect((error as Error).message).toEqual(
|
|
98
|
-
`'@id' property must be a string or not defined at all`
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
test(`reject if @type not defined`, () => {
|
|
103
|
-
let entity = { "@id": "./" };
|
|
104
|
-
expect(normalise(entity, 1)).toBeFalsy;
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
test(`no @id set`, () => {
|
|
108
|
-
let entity = { "@type": "Dataset" };
|
|
109
|
-
// console.log(normalise(entity, 1));
|
|
110
|
-
expect(normalise(entity, 1)).toEqual({ "@type": ["Dataset"], "@id": "#e1/", name: "e1/" });
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
test(`Dataset entity`, () => {
|
|
114
|
-
let entity = { "@id": "somewhere", "@type": "Dataset" };
|
|
115
|
-
// console.log(normalise(entity, 1));
|
|
116
|
-
expect(normalise(entity, 1)).toEqual({
|
|
117
|
-
"@type": ["Dataset"],
|
|
118
|
-
"@id": "somewhere/",
|
|
119
|
-
name: "somewhere/",
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
test(`Entity with properties containing numbers`, () => {
|
|
124
|
-
let entity = { "@id": "somewhere", "@type": "Dataset", name: "something", pid: 3 };
|
|
125
|
-
// console.log(normalise(entity, 1));
|
|
126
|
-
expect(normalise(entity, 1)).toEqual({
|
|
127
|
-
"@type": ["Dataset"],
|
|
128
|
-
"@id": "somewhere/",
|
|
129
|
-
name: "something",
|
|
130
|
-
pid: [3],
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
});
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import isArray from "lodash/isArray.js";
|
|
2
|
-
import isNumber from "lodash/isNumber.js";
|
|
3
|
-
import isBoolean from "lodash/isBoolean.js";
|
|
4
|
-
import isString from "lodash/isString.js";
|
|
5
|
-
import isUndefined from "lodash/isUndefined.js";
|
|
6
|
-
import isNull from "lodash/isNull.js";
|
|
7
|
-
import { isURL as validatorIsURL } from "validator";
|
|
8
|
-
import { validateId } from "./validate-identifier";
|
|
9
|
-
import type { UnverifiedEntityDefinition, NormalisedEntityDefinition } from "../types.js";
|
|
10
|
-
import { isEmpty, isObject } from "lodash";
|
|
11
|
-
|
|
12
|
-
export const urlProtocols = ["http", "https", "ftp", "ftps"];
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
*
|
|
16
|
-
* @param {string} value - string to check as a URL: checks 'http','https','ftp', 'arcp'
|
|
17
|
-
*/
|
|
18
|
-
export function isURL(value: string | number | boolean | undefined | null): boolean {
|
|
19
|
-
if (!value) return false;
|
|
20
|
-
if (isNumber(value)) return false;
|
|
21
|
-
if (isBoolean(value)) return false;
|
|
22
|
-
if (isArray(value)) return false;
|
|
23
|
-
if (value.match(/arcp:\/\/name,.*/)) return true;
|
|
24
|
-
if (value.match(/arcp:\/\/uuid,.*/)) return true;
|
|
25
|
-
if (value.match(/arcp:\/\/ni,sha-256;,.*/)) return true;
|
|
26
|
-
return validatorIsURL(value, {
|
|
27
|
-
require_protocol: true,
|
|
28
|
-
protocols: urlProtocols,
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* This method normalises an entity. It checks that the '@type' is sensible, '@id' is valid and sets the name to the '@id' if not set
|
|
34
|
-
*
|
|
35
|
-
* @param {Object} entity - an entity to normalise
|
|
36
|
-
* @param {string} i - if an id is not defined, then it will be set to #e${i}
|
|
37
|
-
*
|
|
38
|
-
* @returns the entity ready for use
|
|
39
|
-
*/
|
|
40
|
-
export function normalise(
|
|
41
|
-
entity: UnverifiedEntityDefinition,
|
|
42
|
-
i: number
|
|
43
|
-
): NormalisedEntityDefinition {
|
|
44
|
-
if (!isString(entity["@type"]) && !isArray(entity["@type"]) && !isUndefined(entity["@type"])) {
|
|
45
|
-
throw new Error(`'@type' property must be a string or an array or not defined at all`);
|
|
46
|
-
}
|
|
47
|
-
if (!isString(entity["@id"]) && !isUndefined(entity["@id"] && !isNull(entity["@id"]))) {
|
|
48
|
-
throw new Error(`'@id' property must be a string or not defined at all`);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const normalisedEntity = {
|
|
52
|
-
"@id": "",
|
|
53
|
-
"@type": "",
|
|
54
|
-
name: "",
|
|
55
|
-
} as any as NormalisedEntityDefinition;
|
|
56
|
-
|
|
57
|
-
if (isUndefined(entity["@id"]) || isNull(entity["@id"])) {
|
|
58
|
-
// set it to the generated id
|
|
59
|
-
normalisedEntity["@id"] = `#e${i}`;
|
|
60
|
-
} else {
|
|
61
|
-
normalisedEntity["@id"] = isEncoded(entity["@id"])
|
|
62
|
-
? entity["@id"]
|
|
63
|
-
: encodeURI(entity["@id"]);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// normalise the entity['@type']
|
|
67
|
-
normalisedEntity["@type"] = normaliseEntityType({ entity });
|
|
68
|
-
|
|
69
|
-
// if it's a dataset, ensure the @id ends with /
|
|
70
|
-
if (
|
|
71
|
-
normalisedEntity["@type"].includes("Dataset") &&
|
|
72
|
-
normalisedEntity["@id"].slice(-1) !== "/"
|
|
73
|
-
) {
|
|
74
|
-
normalisedEntity["@id"] = `${normalisedEntity["@id"]}/`;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// there is an @id - is it valid?
|
|
78
|
-
let { isValid, message } = validateId({
|
|
79
|
-
id: normalisedEntity["@id"],
|
|
80
|
-
type: normalisedEntity["@type"],
|
|
81
|
-
});
|
|
82
|
-
if (
|
|
83
|
-
!isValid &&
|
|
84
|
-
message ===
|
|
85
|
-
"The identifier is not valid according to the RO Crate spec nor is it a valid IRI."
|
|
86
|
-
) {
|
|
87
|
-
// set the id to an internal reference
|
|
88
|
-
normalisedEntity["@id"] = `#${normalisedEntity["@id"]}`;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// is there a name?
|
|
92
|
-
normalisedEntity.name = entity.name ? entity.name : normalisedEntity["@id"].replace(/^#/, "");
|
|
93
|
-
|
|
94
|
-
// if the name is an array join it back into a string
|
|
95
|
-
if (isArray(normalisedEntity.name)) normalisedEntity.name = normalisedEntity.name.join(" ");
|
|
96
|
-
|
|
97
|
-
// set all properties other than core prop's to array
|
|
98
|
-
// and remove any rubbish: undefined, null and empty
|
|
99
|
-
for (let property of Object.keys(entity)) {
|
|
100
|
-
if (["@id", "@type", "name", "@reverse"].includes(property)) continue;
|
|
101
|
-
|
|
102
|
-
// set property data as array
|
|
103
|
-
let propertyData = Array.isArray(entity[property]) ? entity[property] : [entity[property]];
|
|
104
|
-
|
|
105
|
-
// iterate over the property data
|
|
106
|
-
(normalisedEntity as any)[property] = propertyData.filter((entry) => {
|
|
107
|
-
// remove rubbish
|
|
108
|
-
return (
|
|
109
|
-
!isUndefined(entry) &&
|
|
110
|
-
!isNull(entry) &&
|
|
111
|
-
!(isObject(entry) && isEmpty(entry)) &&
|
|
112
|
-
!(isString(entry) && isEmpty(entry))
|
|
113
|
-
);
|
|
114
|
-
});
|
|
115
|
-
if (!normalisedEntity[property].length) delete normalisedEntity[property];
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return normalisedEntity;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export function normaliseEntityType({ entity }: { entity: UnverifiedEntityDefinition }): string[] {
|
|
122
|
-
let type: string[];
|
|
123
|
-
|
|
124
|
-
if (!entity["@type"]) {
|
|
125
|
-
type = isURL(entity["@id"]) ? ["URL"] : ["Thing"];
|
|
126
|
-
} else if (isArray(entity["@type"])) {
|
|
127
|
-
type = entity["@type"].map((t) => "" + t);
|
|
128
|
-
} else if (isBoolean(entity["@type"]) || isNumber(entity["@type"])) {
|
|
129
|
-
type = ["" + entity["@type"]];
|
|
130
|
-
} else if (isString(entity["@type"])) {
|
|
131
|
-
type = entity["@type"].split(",").map((t) => t.trim());
|
|
132
|
-
} else {
|
|
133
|
-
// Handle any other unexpected cases
|
|
134
|
-
type = ["Thing"];
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return type;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
*
|
|
142
|
-
* Mint an empty RO-Crate that conforms to the spec
|
|
143
|
-
*
|
|
144
|
-
* @returns a skeleton crate ready to be used
|
|
145
|
-
*/
|
|
146
|
-
export function mintNewCrate(): {} {
|
|
147
|
-
return {
|
|
148
|
-
"@context": "https://w3id.org/ro/crate/1.1/context",
|
|
149
|
-
"@graph": [
|
|
150
|
-
{
|
|
151
|
-
"@type": "CreativeWork",
|
|
152
|
-
"@id": "ro-crate-metadata.json",
|
|
153
|
-
about: { "@id": "./" },
|
|
154
|
-
conformsTo: { "@id": "https://w3id.org/ro/crate/1.1" },
|
|
155
|
-
},
|
|
156
|
-
|
|
157
|
-
{
|
|
158
|
-
"@id": "./",
|
|
159
|
-
"@type": "Dataset",
|
|
160
|
-
name: "My Research Object Crate",
|
|
161
|
-
},
|
|
162
|
-
],
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
function isEncoded(uri: string) {
|
|
167
|
-
uri = uri || "";
|
|
168
|
-
|
|
169
|
-
return uri !== decodeURIComponent(uri);
|
|
170
|
-
}
|