@twin.org/standards-schema-org 0.0.2-next.9 → 0.0.3-next.10

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,190 +1,16 @@
1
- import { Validation, Is, Coerce, Url } from '@twin.org/core';
2
- import { DataTypeHandlerFactory } from '@twin.org/data-core';
3
- import { JsonLdProcessor } from '@twin.org/data-json-ld';
4
-
5
- // Copyright 2024 IOTA Stiftung.
6
- // SPDX-License-Identifier: Apache-2.0.
7
- /**
8
- * The contexts of schema.org data.
9
- */
10
- // eslint-disable-next-line @typescript-eslint/naming-convention
11
- const SchemaOrgContexts = {
12
- /**
13
- * Context Root.
14
- */
15
- ContextRoot: "https://schema.org",
16
- /**
17
- * The redirect for the JSON-LD definition.
18
- */
19
- ContextRedirect: "https://schema.org/docs/jsonldcontext.json"
20
- };
21
-
22
- // Copyright 2024 IOTA Stiftung.
23
- // SPDX-License-Identifier: Apache-2.0.
24
- /**
25
- * The types of schema.org data.
26
- */
27
- // eslint-disable-next-line @typescript-eslint/naming-convention
28
- const SchemaOrgTypes = {
29
- /**
30
- * Represents text storage.
31
- */
32
- Text: "Text",
33
- /**
34
- * Represents integer number values.
35
- */
36
- Integer: "Integer",
37
- /**
38
- * Represents floating point numbers.
39
- */
40
- Float: "Float",
41
- /**
42
- * Represents a boolean.
43
- */
44
- Boolean: "Boolean",
45
- /**
46
- * Represents a url.
47
- */
48
- URL: "URL",
49
- /**
50
- * Represents a date as an ISO format string.
51
- */
52
- Date: "Date",
53
- /**
54
- * Represents a date time as an ISO format string.
55
- */
56
- DateTime: "DateTime",
57
- /**
58
- * Represents a time as an ISO format string.
59
- */
60
- Time: "Time",
61
- /**
62
- * Represents a url which points to an image.
63
- */
64
- Image: "image",
65
- /**
66
- * Represents a location.
67
- */
68
- GeoCoordinates: "GeoCoordinates",
69
- /**
70
- * Represents a structured value.
71
- */
72
- StructuredValue: "StructuredValue",
73
- /**
74
- * Represents an item list.
75
- */
76
- ItemList: "ItemList",
77
- /**
78
- * Represents an item list element.
79
- */
80
- ItemListElement: "itemListElement",
81
- /**
82
- * Represents a next item (can be used as a cursor).
83
- */
84
- NextItem: "nextItem"
85
- };
86
-
87
- var type = "object";
88
- var required = [
89
- "latitude",
90
- "longitude"
91
- ];
92
- var properties = {
93
- latitude: {
94
- type: [
95
- "number",
96
- "string"
97
- ],
98
- minimum: -90,
99
- maximum: 90
100
- },
101
- longitude: {
102
- type: [
103
- "number",
104
- "string"
105
- ],
106
- minimum: -180,
107
- maximum: 180
108
- }
109
- };
110
- var GeoCoordinatesSchema = {
111
- type: type,
112
- required: required,
113
- properties: properties
114
- };
115
-
116
- // Copyright 2024 IOTA Stiftung.
117
- // SPDX-License-Identifier: Apache-2.0.
118
- /**
119
- * Handle validation for schema.org.
120
- */
121
- class SchemaOrgValidation {
122
- /**
123
- * Validate if the property is valid geo-coordinates.
124
- * @param propertyName The name of the property being validated.
125
- * @param value The value to test.
126
- * @param failures The list of failures to add to.
127
- * @returns True if the value is geo-coordinates.
128
- */
129
- static geoCoordinates(propertyName, value, failures) {
130
- const is = Validation.object(propertyName, value, failures);
131
- if (is) {
132
- // This is only a partial validation at the moment we should also support
133
- // address, addressCountry, elevation, postalCode as alternative
134
- // to gps coords
135
- let lat;
136
- if (Is.number(value.latitude)) {
137
- lat = value.latitude;
138
- }
139
- else if (Is.stringValue(value.latitude)) {
140
- lat = Coerce.number(value.latitude);
141
- }
142
- if (Is.number(lat)) {
143
- if (lat < -90 || lat > 90) {
144
- failures.push({
145
- property: propertyName + ".latitude",
146
- reason: "validation.geo.coordinatesLatitudeRange"
147
- });
148
- }
149
- }
150
- else {
151
- failures.push({
152
- property: propertyName + ".latitude",
153
- reason: "validation.geo.coordinatesLatitudeNumber"
154
- });
155
- }
156
- let lng;
157
- if (Is.number(value.longitude)) {
158
- lng = value.longitude;
159
- }
160
- else if (Is.stringValue(value.longitude)) {
161
- lng = Coerce.number(value.longitude);
162
- }
163
- if (Is.number(lng)) {
164
- if (lng < -180 || lng > 180) {
165
- failures.push({
166
- property: propertyName + ".longitude",
167
- reason: "validation.geo.coordinatesLongitudeRange"
168
- });
169
- }
170
- }
171
- else {
172
- failures.push({
173
- property: propertyName + ".longitude",
174
- reason: "validation.geo.coordinatesLongitudeNumber"
175
- });
176
- }
177
- }
178
- return is;
179
- }
180
- }
181
-
182
1
  // Copyright 2024 IOTA Stiftung.
183
2
  // SPDX-License-Identifier: Apache-2.0.
3
+ import { Url, Validation } from "@twin.org/core";
4
+ import { DataTypeHandlerFactory } from "@twin.org/data-core";
5
+ import { JsonLdProcessor } from "@twin.org/data-json-ld";
6
+ import { SchemaOrgContexts } from "../models/schemaOrgContexts.js";
7
+ import { SchemaOrgTypes } from "../models/schemaOrgTypes.js";
8
+ import GeoCoordinatesSchema from "../schemas/GeoCoordinates.json" with { type: "json" };
9
+ import { SchemaOrgValidation } from "../utils/schemaOrgValidation.js";
184
10
  /**
185
11
  * Handle all the data types for schema.org.
186
12
  */
187
- class SchemaOrgDataTypes {
13
+ export class SchemaOrgDataTypes {
188
14
  /**
189
15
  * Register the JSON-LD Redirects.
190
16
  */
@@ -290,5 +116,4 @@ class SchemaOrgDataTypes {
290
116
  }));
291
117
  }
292
118
  }
293
-
294
- export { SchemaOrgContexts, SchemaOrgDataTypes, SchemaOrgTypes, SchemaOrgValidation };
119
+ //# sourceMappingURL=schemaOrgDataTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaOrgDataTypes.js","sourceRoot":"","sources":["../../../src/dataTypes/schemaOrgDataTypes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Url, Validation } from \"@twin.org/core\";\nimport { DataTypeHandlerFactory, type IJsonSchema } from \"@twin.org/data-core\";\nimport { JsonLdProcessor } from \"@twin.org/data-json-ld\";\nimport { SchemaOrgContexts } from \"../models/schemaOrgContexts.js\";\nimport { SchemaOrgTypes } from \"../models/schemaOrgTypes.js\";\nimport GeoCoordinatesSchema from \"../schemas/GeoCoordinates.json\" with { type: \"json\" };\nimport { SchemaOrgValidation } from \"../utils/schemaOrgValidation.js\";\n\n/**\n * Handle all the data types for schema.org.\n */\nexport class SchemaOrgDataTypes {\n\t/**\n\t * Register the JSON-LD Redirects.\n\t */\n\tpublic static registerRedirects(): void {\n\t\tJsonLdProcessor.addRedirect(/https?:\\/\\/schema.org\\/?/, SchemaOrgContexts.ContextRedirect);\n\t}\n\n\t/**\n\t * Register all the data types.\n\t */\n\tpublic static registerTypes(): void {\n\t\tDataTypeHandlerFactory.register(\n\t\t\t`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.Text}`,\n\t\t\t() => ({\n\t\t\t\tcontext: SchemaOrgContexts.ContextRoot,\n\t\t\t\ttype: SchemaOrgTypes.Text,\n\t\t\t\tdefaultValue: \"\",\n\t\t\t\tjsonSchema: async () => ({\n\t\t\t\t\ttype: \"string\"\n\t\t\t\t}),\n\t\t\t\tvalidate: async (propertyName, value, failures, container) =>\n\t\t\t\t\tValidation.string(propertyName, value, failures)\n\t\t\t})\n\t\t);\n\n\t\tDataTypeHandlerFactory.register(\n\t\t\t`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.Integer}`,\n\t\t\t() => ({\n\t\t\t\tcontext: SchemaOrgContexts.ContextRoot,\n\t\t\t\ttype: SchemaOrgTypes.Integer,\n\t\t\t\tdefaultValue: 0,\n\t\t\t\tjsonSchema: async () => ({\n\t\t\t\t\ttype: \"integer\"\n\t\t\t\t}),\n\t\t\t\tvalidate: async (propertyName, value, failures, container) =>\n\t\t\t\t\tValidation.integer(propertyName, value, failures)\n\t\t\t})\n\t\t);\n\n\t\tDataTypeHandlerFactory.register(\n\t\t\t`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.Float}`,\n\t\t\t() => ({\n\t\t\t\tcontext: SchemaOrgContexts.ContextRoot,\n\t\t\t\ttype: SchemaOrgTypes.Float,\n\t\t\t\tdefaultValue: 0,\n\t\t\t\tjsonSchema: async () => ({\n\t\t\t\t\ttype: \"number\"\n\t\t\t\t}),\n\t\t\t\tvalidate: async (propertyName, value, failures, container) =>\n\t\t\t\t\tValidation.number(propertyName, value, failures)\n\t\t\t})\n\t\t);\n\n\t\tDataTypeHandlerFactory.register(\n\t\t\t`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.Boolean}`,\n\t\t\t() => ({\n\t\t\t\tcontext: SchemaOrgContexts.ContextRoot,\n\t\t\t\ttype: SchemaOrgTypes.Boolean,\n\t\t\t\tdefaultValue: true,\n\t\t\t\tjsonSchema: async () => ({\n\t\t\t\t\ttype: \"boolean\"\n\t\t\t\t}),\n\t\t\t\tvalidate: async (propertyName, value, failures, container) =>\n\t\t\t\t\tValidation.boolean(propertyName, value, failures)\n\t\t\t})\n\t\t);\n\n\t\tDataTypeHandlerFactory.register(\n\t\t\t`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.URL}`,\n\t\t\t() => ({\n\t\t\t\tcontext: SchemaOrgContexts.ContextRoot,\n\t\t\t\ttype: SchemaOrgTypes.URL,\n\t\t\t\tdefaultValue: \"\",\n\t\t\t\tjsonSchema: async () => ({\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tformat: \"uri\"\n\t\t\t\t}),\n\t\t\t\tvalidate: async (propertyName, value, failures, container) =>\n\t\t\t\t\tUrl.validate(propertyName, value, failures)\n\t\t\t})\n\t\t);\n\n\t\tDataTypeHandlerFactory.register(\n\t\t\t`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.Date}`,\n\t\t\t() => ({\n\t\t\t\tcontext: SchemaOrgContexts.ContextRoot,\n\t\t\t\ttype: SchemaOrgTypes.Date,\n\t\t\t\tdefaultValue: new Date(),\n\t\t\t\tjsonSchema: async () => ({\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tformat: \"date\"\n\t\t\t\t}),\n\t\t\t\tvalidate: async (propertyName, value, failures, container) =>\n\t\t\t\t\tValidation.dateString(propertyName, value, failures)\n\t\t\t})\n\t\t);\n\n\t\tDataTypeHandlerFactory.register(\n\t\t\t`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.DateTime}`,\n\t\t\t() => ({\n\t\t\t\tcontext: SchemaOrgContexts.ContextRoot,\n\t\t\t\ttype: SchemaOrgTypes.DateTime,\n\t\t\t\tdefaultValue: new Date(),\n\t\t\t\tjsonSchema: async () => ({\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tformat: \"date-time\"\n\t\t\t\t}),\n\t\t\t\tvalidate: async (propertyName, value, failures, container) =>\n\t\t\t\t\tValidation.dateTimeString(propertyName, value, failures)\n\t\t\t})\n\t\t);\n\n\t\tDataTypeHandlerFactory.register(\n\t\t\t`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.Time}`,\n\t\t\t() => ({\n\t\t\t\tcontext: SchemaOrgContexts.ContextRoot,\n\t\t\t\ttype: SchemaOrgTypes.Time,\n\t\t\t\tdefaultValue: new Date(),\n\t\t\t\tjsonSchema: async () => ({\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tformat: \"time\"\n\t\t\t\t}),\n\t\t\t\tvalidate: async (propertyName, value, failures, container) =>\n\t\t\t\t\tValidation.timeString(propertyName, value, failures)\n\t\t\t})\n\t\t);\n\n\t\tDataTypeHandlerFactory.register(\n\t\t\t`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.Image}`,\n\t\t\t() => ({\n\t\t\t\tcontext: SchemaOrgContexts.ContextRoot,\n\t\t\t\ttype: SchemaOrgTypes.Image,\n\t\t\t\tdefaultValue: \"\",\n\t\t\t\tjsonSchema: async () => ({\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tformat: \"uri\"\n\t\t\t\t}),\n\t\t\t\tvalidate: async (propertyName, value, failures, container) =>\n\t\t\t\t\tUrl.validate(propertyName, value, failures)\n\t\t\t})\n\t\t);\n\n\t\tDataTypeHandlerFactory.register(\n\t\t\t`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.GeoCoordinates}`,\n\t\t\t() => ({\n\t\t\t\tcontext: SchemaOrgContexts.ContextRoot,\n\t\t\t\ttype: SchemaOrgTypes.GeoCoordinates,\n\t\t\t\tdefaultValue: { longitude: 0, latitude: 0 },\n\t\t\t\tjsonSchema: async () => GeoCoordinatesSchema as IJsonSchema,\n\t\t\t\tvalidate: async (propertyName, value, failures, container) =>\n\t\t\t\t\tSchemaOrgValidation.geoCoordinates(propertyName, value, failures)\n\t\t\t})\n\t\t);\n\t}\n}\n"]}
@@ -0,0 +1,7 @@
1
+ // Copyright 2024 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ export * from "./dataTypes/schemaOrgDataTypes.js";
4
+ export * from "./models/schemaOrgContexts.js";
5
+ export * from "./models/schemaOrgTypes.js";
6
+ export * from "./utils/schemaOrgValidation.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nexport * from \"./dataTypes/schemaOrgDataTypes.js\";\nexport * from \"./models/schemaOrgContexts.js\";\nexport * from \"./models/schemaOrgTypes.js\";\nexport * from \"./utils/schemaOrgValidation.js\";\n"]}
@@ -0,0 +1,17 @@
1
+ // Copyright 2024 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ /**
4
+ * The contexts of schema.org data.
5
+ */
6
+ // eslint-disable-next-line @typescript-eslint/naming-convention
7
+ export const SchemaOrgContexts = {
8
+ /**
9
+ * Context Root.
10
+ */
11
+ ContextRoot: "https://schema.org",
12
+ /**
13
+ * The redirect for the JSON-LD definition.
14
+ */
15
+ ContextRedirect: "https://schema.org/docs/jsonldcontext.json"
16
+ };
17
+ //# sourceMappingURL=schemaOrgContexts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaOrgContexts.js","sourceRoot":"","sources":["../../../src/models/schemaOrgContexts.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AAEvC;;GAEG;AACH,gEAAgE;AAChE,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAChC;;OAEG;IACH,WAAW,EAAE,oBAAoB;IAEjC;;OAEG;IACH,eAAe,EAAE,4CAA4C;CACpD,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * The contexts of schema.org data.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const SchemaOrgContexts = {\n\t/**\n\t * Context Root.\n\t */\n\tContextRoot: \"https://schema.org\",\n\n\t/**\n\t * The redirect for the JSON-LD definition.\n\t */\n\tContextRedirect: \"https://schema.org/docs/jsonldcontext.json\"\n} as const;\n\n/**\n * The contexts of schema.org data.\n */\nexport type SchemaOrgContexts = (typeof SchemaOrgContexts)[keyof typeof SchemaOrgContexts];\n"]}
@@ -0,0 +1,65 @@
1
+ // Copyright 2024 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ /**
4
+ * The types of schema.org data.
5
+ */
6
+ // eslint-disable-next-line @typescript-eslint/naming-convention
7
+ export const SchemaOrgTypes = {
8
+ /**
9
+ * Represents text storage.
10
+ */
11
+ Text: "Text",
12
+ /**
13
+ * Represents integer number values.
14
+ */
15
+ Integer: "Integer",
16
+ /**
17
+ * Represents floating point numbers.
18
+ */
19
+ Float: "Float",
20
+ /**
21
+ * Represents a boolean.
22
+ */
23
+ Boolean: "Boolean",
24
+ /**
25
+ * Represents a url.
26
+ */
27
+ URL: "URL",
28
+ /**
29
+ * Represents a date as an ISO format string.
30
+ */
31
+ Date: "Date",
32
+ /**
33
+ * Represents a date time as an ISO format string.
34
+ */
35
+ DateTime: "DateTime",
36
+ /**
37
+ * Represents a time as an ISO format string.
38
+ */
39
+ Time: "Time",
40
+ /**
41
+ * Represents a url which points to an image.
42
+ */
43
+ Image: "image",
44
+ /**
45
+ * Represents a location.
46
+ */
47
+ GeoCoordinates: "GeoCoordinates",
48
+ /**
49
+ * Represents a structured value.
50
+ */
51
+ StructuredValue: "StructuredValue",
52
+ /**
53
+ * Represents an item list.
54
+ */
55
+ ItemList: "ItemList",
56
+ /**
57
+ * Represents an item list element.
58
+ */
59
+ ItemListElement: "itemListElement",
60
+ /**
61
+ * Represents a next item (can be used as a cursor).
62
+ */
63
+ NextItem: "nextItem"
64
+ };
65
+ //# sourceMappingURL=schemaOrgTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaOrgTypes.js","sourceRoot":"","sources":["../../../src/models/schemaOrgTypes.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AAEvC;;GAEG;AACH,gEAAgE;AAChE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B;;OAEG;IACH,IAAI,EAAE,MAAM;IAEZ;;OAEG;IACH,OAAO,EAAE,SAAS;IAElB;;OAEG;IACH,KAAK,EAAE,OAAO;IAEd;;OAEG;IACH,OAAO,EAAE,SAAS;IAElB;;OAEG;IACH,GAAG,EAAE,KAAK;IAEV;;OAEG;IACH,IAAI,EAAE,MAAM;IAEZ;;OAEG;IACH,QAAQ,EAAE,UAAU;IAEpB;;OAEG;IACH,IAAI,EAAE,MAAM;IAEZ;;OAEG;IACH,KAAK,EAAE,OAAO;IAEd;;OAEG;IACH,cAAc,EAAE,gBAAgB;IAEhC;;OAEG;IACH,eAAe,EAAE,iBAAiB;IAElC;;OAEG;IACH,QAAQ,EAAE,UAAU;IAEpB;;OAEG;IACH,eAAe,EAAE,iBAAiB;IAElC;;OAEG;IACH,QAAQ,EAAE,UAAU;CACX,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * The types of schema.org data.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const SchemaOrgTypes = {\n\t/**\n\t * Represents text storage.\n\t */\n\tText: \"Text\",\n\n\t/**\n\t * Represents integer number values.\n\t */\n\tInteger: \"Integer\",\n\n\t/**\n\t * Represents floating point numbers.\n\t */\n\tFloat: \"Float\",\n\n\t/**\n\t * Represents a boolean.\n\t */\n\tBoolean: \"Boolean\",\n\n\t/**\n\t * Represents a url.\n\t */\n\tURL: \"URL\",\n\n\t/**\n\t * Represents a date as an ISO format string.\n\t */\n\tDate: \"Date\",\n\n\t/**\n\t * Represents a date time as an ISO format string.\n\t */\n\tDateTime: \"DateTime\",\n\n\t/**\n\t * Represents a time as an ISO format string.\n\t */\n\tTime: \"Time\",\n\n\t/**\n\t * Represents a url which points to an image.\n\t */\n\tImage: \"image\",\n\n\t/**\n\t * Represents a location.\n\t */\n\tGeoCoordinates: \"GeoCoordinates\",\n\n\t/**\n\t * Represents a structured value.\n\t */\n\tStructuredValue: \"StructuredValue\",\n\n\t/**\n\t * Represents an item list.\n\t */\n\tItemList: \"ItemList\",\n\n\t/**\n\t * Represents an item list element.\n\t */\n\tItemListElement: \"itemListElement\",\n\n\t/**\n\t * Represents a next item (can be used as a cursor).\n\t */\n\tNextItem: \"nextItem\"\n} as const;\n\n/**\n * The types of schema.org data.\n */\nexport type SchemaOrgTypes = (typeof SchemaOrgTypes)[keyof typeof SchemaOrgTypes];\n"]}
@@ -0,0 +1,16 @@
1
+ {
2
+ "type": "object",
3
+ "required": ["latitude", "longitude"],
4
+ "properties": {
5
+ "latitude": {
6
+ "type": ["number", "string"],
7
+ "minimum": -90,
8
+ "maximum": 90
9
+ },
10
+ "longitude": {
11
+ "type": ["number", "string"],
12
+ "minimum": -180,
13
+ "maximum": 180
14
+ }
15
+ }
16
+ }
@@ -0,0 +1,67 @@
1
+ // Copyright 2024 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ import { Coerce, Is, Validation } from "@twin.org/core";
4
+ /**
5
+ * Handle validation for schema.org.
6
+ */
7
+ export class SchemaOrgValidation {
8
+ /**
9
+ * Validate if the property is valid geo-coordinates.
10
+ * @param propertyName The name of the property being validated.
11
+ * @param value The value to test.
12
+ * @param failures The list of failures to add to.
13
+ * @returns True if the value is geo-coordinates.
14
+ */
15
+ static geoCoordinates(propertyName, value, failures) {
16
+ const is = Validation.object(propertyName, value, failures);
17
+ if (is) {
18
+ // This is only a partial validation at the moment we should also support
19
+ // address, addressCountry, elevation, postalCode as alternative
20
+ // to gps coords
21
+ let lat;
22
+ if (Is.number(value.latitude)) {
23
+ lat = value.latitude;
24
+ }
25
+ else if (Is.stringValue(value.latitude)) {
26
+ lat = Coerce.number(value.latitude);
27
+ }
28
+ if (Is.number(lat)) {
29
+ if (lat < -90 || lat > 90) {
30
+ failures.push({
31
+ property: propertyName + ".latitude",
32
+ reason: "validation.geo.coordinatesLatitudeRange"
33
+ });
34
+ }
35
+ }
36
+ else {
37
+ failures.push({
38
+ property: propertyName + ".latitude",
39
+ reason: "validation.geo.coordinatesLatitudeNumber"
40
+ });
41
+ }
42
+ let lng;
43
+ if (Is.number(value.longitude)) {
44
+ lng = value.longitude;
45
+ }
46
+ else if (Is.stringValue(value.longitude)) {
47
+ lng = Coerce.number(value.longitude);
48
+ }
49
+ if (Is.number(lng)) {
50
+ if (lng < -180 || lng > 180) {
51
+ failures.push({
52
+ property: propertyName + ".longitude",
53
+ reason: "validation.geo.coordinatesLongitudeRange"
54
+ });
55
+ }
56
+ }
57
+ else {
58
+ failures.push({
59
+ property: propertyName + ".longitude",
60
+ reason: "validation.geo.coordinatesLongitudeNumber"
61
+ });
62
+ }
63
+ }
64
+ return is;
65
+ }
66
+ }
67
+ //# sourceMappingURL=schemaOrgValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaOrgValidation.js","sourceRoot":"","sources":["../../../src/utils/schemaOrgValidation.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAA2B,MAAM,gBAAgB,CAAC;AAIjF;;GAEG;AACH,MAAM,OAAO,mBAAmB;IAC/B;;;;;;OAMG;IACI,MAAM,CAAC,cAAc,CAC3B,YAAoB,EACpB,KAAc,EACd,QAA8B;QAE9B,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAiB,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAE5E,IAAI,EAAE,EAAE,CAAC;YACR,yEAAyE;YACzE,gEAAgE;YAChE,gBAAgB;YAChB,IAAI,GAAuB,CAAC;YAC5B,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC;YACtB,CAAC;iBAAM,IAAI,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3C,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;YAED,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC;oBAC3B,QAAQ,CAAC,IAAI,CAAC;wBACb,QAAQ,4BAAsC;wBAC9C,MAAM,EAAE,yCAAyC;qBACjD,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,QAAQ,CAAC,IAAI,CAAC;oBACb,QAAQ,4BAAsC;oBAC9C,MAAM,EAAE,0CAA0C;iBAClD,CAAC,CAAC;YACJ,CAAC;YAED,IAAI,GAAuB,CAAC;YAC5B,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;YACvB,CAAC;iBAAM,IAAI,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5C,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;YAED,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;oBAC7B,QAAQ,CAAC,IAAI,CAAC;wBACb,QAAQ,6BAAuC;wBAC/C,MAAM,EAAE,0CAA0C;qBAClD,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,QAAQ,CAAC,IAAI,CAAC;oBACb,QAAQ,6BAAuC;oBAC/C,MAAM,EAAE,2CAA2C;iBACnD,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QAED,OAAO,EAAE,CAAC;IACX,CAAC;CACD","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Coerce, Is, Validation, type IValidationFailure } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { GeoCoordinates } from \"schema-dts\";\n\n/**\n * Handle validation for schema.org.\n */\nexport class SchemaOrgValidation {\n\t/**\n\t * Validate if the property is valid geo-coordinates.\n\t * @param propertyName The name of the property being validated.\n\t * @param value The value to test.\n\t * @param failures The list of failures to add to.\n\t * @returns True if the value is geo-coordinates.\n\t */\n\tpublic static geoCoordinates(\n\t\tpropertyName: string,\n\t\tvalue: unknown,\n\t\tfailures: IValidationFailure[]\n\t): value is GeoCoordinates {\n\t\tconst is = Validation.object<GeoCoordinates>(propertyName, value, failures);\n\n\t\tif (is) {\n\t\t\t// This is only a partial validation at the moment we should also support\n\t\t\t// address, addressCountry, elevation, postalCode as alternative\n\t\t\t// to gps coords\n\t\t\tlet lat: number | undefined;\n\t\t\tif (Is.number(value.latitude)) {\n\t\t\t\tlat = value.latitude;\n\t\t\t} else if (Is.stringValue(value.latitude)) {\n\t\t\t\tlat = Coerce.number(value.latitude);\n\t\t\t}\n\n\t\t\tif (Is.number(lat)) {\n\t\t\t\tif (lat < -90 || lat > 90) {\n\t\t\t\t\tfailures.push({\n\t\t\t\t\t\tproperty: nameof(value.latitude, propertyName),\n\t\t\t\t\t\treason: \"validation.geo.coordinatesLatitudeRange\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfailures.push({\n\t\t\t\t\tproperty: nameof(value.latitude, propertyName),\n\t\t\t\t\treason: \"validation.geo.coordinatesLatitudeNumber\"\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet lng: number | undefined;\n\t\t\tif (Is.number(value.longitude)) {\n\t\t\t\tlng = value.longitude;\n\t\t\t} else if (Is.stringValue(value.longitude)) {\n\t\t\t\tlng = Coerce.number(value.longitude);\n\t\t\t}\n\n\t\t\tif (Is.number(lng)) {\n\t\t\t\tif (lng < -180 || lng > 180) {\n\t\t\t\t\tfailures.push({\n\t\t\t\t\t\tproperty: nameof(value.longitude, propertyName),\n\t\t\t\t\t\treason: \"validation.geo.coordinatesLongitudeRange\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfailures.push({\n\t\t\t\t\tproperty: nameof(value.longitude, propertyName),\n\t\t\t\t\treason: \"validation.geo.coordinatesLongitudeNumber\"\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn is;\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
- export * from "./dataTypes/schemaOrgDataTypes";
2
- export * from "./models/schemaOrgContexts";
3
- export * from "./models/schemaOrgTypes";
4
- export * from "./utils/schemaOrgValidation";
1
+ export * from "./dataTypes/schemaOrgDataTypes.js";
2
+ export * from "./models/schemaOrgContexts.js";
3
+ export * from "./models/schemaOrgTypes.js";
4
+ export * from "./utils/schemaOrgValidation.js";
package/docs/changelog.md CHANGED
@@ -1,5 +1,134 @@
1
1
  # @twin.org/standards-schema-org - Changelog
2
2
 
3
+ ## [0.0.3-next.10](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.3-next.9...standards-schema-org-v0.0.3-next.10) (2026-01-13)
4
+
5
+
6
+ ### Miscellaneous Chores
7
+
8
+ * **standards-schema-org:** Synchronize repo versions
9
+
10
+ ## [0.0.3-next.9](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.3-next.8...standards-schema-org-v0.0.3-next.9) (2026-01-09)
11
+
12
+
13
+ ### Miscellaneous Chores
14
+
15
+ * **standards-schema-org:** Synchronize repo versions
16
+
17
+ ## [0.0.3-next.8](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.3-next.7...standards-schema-org-v0.0.3-next.8) (2026-01-08)
18
+
19
+
20
+ ### Miscellaneous Chores
21
+
22
+ * **standards-schema-org:** Synchronize repo versions
23
+
24
+ ## [0.0.3-next.7](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.3-next.6...standards-schema-org-v0.0.3-next.7) (2026-01-06)
25
+
26
+
27
+ ### Miscellaneous Chores
28
+
29
+ * **standards-schema-org:** Synchronize repo versions
30
+
31
+ ## [0.0.3-next.6](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.3-next.5...standards-schema-org-v0.0.3-next.6) (2025-12-03)
32
+
33
+
34
+ ### Miscellaneous Chores
35
+
36
+ * **standards-schema-org:** Synchronize repo versions
37
+
38
+ ## [0.0.3-next.5](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.3-next.4...standards-schema-org-v0.0.3-next.5) (2025-11-28)
39
+
40
+
41
+ ### Miscellaneous Chores
42
+
43
+ * **standards-schema-org:** Synchronize repo versions
44
+
45
+ ## [0.0.3-next.4](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.3-next.3...standards-schema-org-v0.0.3-next.4) (2025-11-18)
46
+
47
+
48
+ ### Miscellaneous Chores
49
+
50
+ * **standards-schema-org:** Synchronize repo versions
51
+
52
+ ## [0.0.3-next.3](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.3-next.2...standards-schema-org-v0.0.3-next.3) (2025-11-18)
53
+
54
+
55
+ ### Miscellaneous Chores
56
+
57
+ * **standards-schema-org:** Synchronize repo versions
58
+
59
+ ## [0.0.3-next.2](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.3-next.1...standards-schema-org-v0.0.3-next.2) (2025-11-11)
60
+
61
+
62
+ ### Miscellaneous Chores
63
+
64
+ * **standards-schema-org:** Synchronize repo versions
65
+
66
+ ## [0.0.3-next.1](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.3-next.0...standards-schema-org-v0.0.3-next.1) (2025-11-10)
67
+
68
+
69
+ ### Features
70
+
71
+ * add context id features ([#64](https://github.com/twinfoundation/standards/issues/64)) ([e68bb87](https://github.com/twinfoundation/standards/commit/e68bb87a215f3c3956cfd6400a5e1e2a16256085))
72
+ * add ItemList, ItemListElement and NextItem types ([19d7baf](https://github.com/twinfoundation/standards/commit/19d7baf31a3e6385c68051da75835d917d134deb))
73
+ * add ItemList, ItemListElement and NextItem types ([fb40e25](https://github.com/twinfoundation/standards/commit/fb40e25bd3552760452cc31d654d3f0596482ae9))
74
+ * add validate-locales ([838389c](https://github.com/twinfoundation/standards/commit/838389c1daf62ed42397d5758d267c3d1a37fa4d))
75
+ * data types registered with full qualified names ([d64bd08](https://github.com/twinfoundation/standards/commit/d64bd082084172da543e9bfaffb78cdc34e6641d))
76
+ * eslint migration to flat config ([648c1a1](https://github.com/twinfoundation/standards/commit/648c1a1e69d99b6b0cf69358ec6bdeecdbe3a5ea))
77
+ * normalise type outputs ([0b3aed7](https://github.com/twinfoundation/standards/commit/0b3aed7df0802cd609423bbd7fda6bde601d3ceb))
78
+ * unused dependencies ([f8bc5bf](https://github.com/twinfoundation/standards/commit/f8bc5bfbccdc6036cbac9a3b3ff91e3de90c8a9b))
79
+ * update framework core ([58c0c3d](https://github.com/twinfoundation/standards/commit/58c0c3dd6cea0e4c2393dc0e3e1eb33a6d06f617))
80
+ * update to latest JSON schema spec ([7a23930](https://github.com/twinfoundation/standards/commit/7a2393032d7f48bfb20d3a484f981fb6dd83a92c))
81
+ * use shared store mechanism ([#11](https://github.com/twinfoundation/standards/issues/11)) ([96fa237](https://github.com/twinfoundation/standards/commit/96fa23735f69c1fc7e3d0019b527634fa0a042d9))
82
+
83
+ ## [0.0.2-next.16](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.2-next.15...standards-schema-org-v0.0.2-next.16) (2025-10-09)
84
+
85
+
86
+ ### Miscellaneous Chores
87
+
88
+ * **standards-schema-org:** Synchronize repo versions
89
+
90
+ ## [0.0.2-next.15](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.2-next.14...standards-schema-org-v0.0.2-next.15) (2025-10-09)
91
+
92
+
93
+ ### Features
94
+
95
+ * add validate-locales ([838389c](https://github.com/twinfoundation/standards/commit/838389c1daf62ed42397d5758d267c3d1a37fa4d))
96
+
97
+ ## [0.0.2-next.14](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.2-next.13...standards-schema-org-v0.0.2-next.14) (2025-10-02)
98
+
99
+
100
+ ### Miscellaneous Chores
101
+
102
+ * **standards-schema-org:** Synchronize repo versions
103
+
104
+ ## [0.0.2-next.13](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.2-next.12...standards-schema-org-v0.0.2-next.13) (2025-09-22)
105
+
106
+
107
+ ### Miscellaneous Chores
108
+
109
+ * **standards-schema-org:** Synchronize repo versions
110
+
111
+ ## [0.0.2-next.12](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.2-next.11...standards-schema-org-v0.0.2-next.12) (2025-09-16)
112
+
113
+
114
+ ### Miscellaneous Chores
115
+
116
+ * **standards-schema-org:** Synchronize repo versions
117
+
118
+ ## [0.0.2-next.11](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.2-next.10...standards-schema-org-v0.0.2-next.11) (2025-09-16)
119
+
120
+
121
+ ### Miscellaneous Chores
122
+
123
+ * **standards-schema-org:** Synchronize repo versions
124
+
125
+ ## [0.0.2-next.10](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.2-next.9...standards-schema-org-v0.0.2-next.10) (2025-09-16)
126
+
127
+
128
+ ### Miscellaneous Chores
129
+
130
+ * **standards-schema-org:** Synchronize repo versions
131
+
3
132
  ## [0.0.2-next.9](https://github.com/twinfoundation/standards/compare/standards-schema-org-v0.0.2-next.8...standards-schema-org-v0.0.2-next.9) (2025-09-15)
4
133
 
5
134
 
package/locales/en.json CHANGED
@@ -1,21 +1,7 @@
1
1
  {
2
- "data-type-names": {
3
- "https://schema.org/Text": "Text",
4
- "https://schema.org/URL": "Url",
5
- "https://schema.org/Integer": "Integer",
6
- "https://schema.org/Float": "Float",
7
- "https://schema.org/Boolean": "Boolean",
8
- "https://schema.org/Date": "ISO Date",
9
- "https://schema.org/DateTime": "ISO Date Time",
10
- "https://schema.org/Time": "ISO Time",
11
- "https://schema.org/image": "Image",
12
- "https://schema.org/GeoCoordinates": "Geo Coordinates",
13
- "https://schema.org/StructuredValue": "Structured Value"
14
- },
15
2
  "error": {
16
3
  "validation": {
17
4
  "geo": {
18
- "coordinatesNotObject": "The geo coordinates must be an object",
19
5
  "coordinatesLatitudeNumber": "The latitude value must be a number",
20
6
  "coordinatesLatitudeRange": "The latitude value must be between -90 and 90",
21
7
  "coordinatesLongitudeNumber": "The longitude value must be a number",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twin.org/standards-schema-org",
3
- "version": "0.0.2-next.9",
3
+ "version": "0.0.3-next.10",
4
4
  "description": "Models which define the structure of schema.org Standard",
5
5
  "repository": {
6
6
  "type": "git",
@@ -21,22 +21,37 @@
21
21
  "@twin.org/nameof": "next",
22
22
  "schema-dts": "1.1.5"
23
23
  },
24
- "main": "./dist/cjs/index.cjs",
25
- "module": "./dist/esm/index.mjs",
24
+ "main": "./dist/es/index.js",
26
25
  "types": "./dist/types/index.d.ts",
27
26
  "exports": {
28
27
  ".": {
29
28
  "types": "./dist/types/index.d.ts",
30
- "require": "./dist/cjs/index.cjs",
31
- "import": "./dist/esm/index.mjs"
29
+ "import": "./dist/es/index.js",
30
+ "default": "./dist/es/index.js"
32
31
  },
33
32
  "./locales/*.json": "./locales/*.json"
34
33
  },
35
34
  "files": [
36
- "dist/cjs",
37
- "dist/esm",
35
+ "dist/es",
38
36
  "dist/types",
39
37
  "locales",
40
38
  "docs"
41
- ]
39
+ ],
40
+ "keywords": [
41
+ "twin",
42
+ "trade",
43
+ "iota",
44
+ "framework",
45
+ "blockchain",
46
+ "standards",
47
+ "schema",
48
+ "specification",
49
+ "schema.org",
50
+ "linked-data",
51
+ "seo"
52
+ ],
53
+ "bugs": {
54
+ "url": "git+https://github.com/twinfoundation/standards/issues"
55
+ },
56
+ "homepage": "https://twindev.org"
42
57
  }
@@ -1,299 +0,0 @@
1
- 'use strict';
2
-
3
- var core = require('@twin.org/core');
4
- var dataCore = require('@twin.org/data-core');
5
- var dataJsonLd = require('@twin.org/data-json-ld');
6
-
7
- // Copyright 2024 IOTA Stiftung.
8
- // SPDX-License-Identifier: Apache-2.0.
9
- /**
10
- * The contexts of schema.org data.
11
- */
12
- // eslint-disable-next-line @typescript-eslint/naming-convention
13
- const SchemaOrgContexts = {
14
- /**
15
- * Context Root.
16
- */
17
- ContextRoot: "https://schema.org",
18
- /**
19
- * The redirect for the JSON-LD definition.
20
- */
21
- ContextRedirect: "https://schema.org/docs/jsonldcontext.json"
22
- };
23
-
24
- // Copyright 2024 IOTA Stiftung.
25
- // SPDX-License-Identifier: Apache-2.0.
26
- /**
27
- * The types of schema.org data.
28
- */
29
- // eslint-disable-next-line @typescript-eslint/naming-convention
30
- const SchemaOrgTypes = {
31
- /**
32
- * Represents text storage.
33
- */
34
- Text: "Text",
35
- /**
36
- * Represents integer number values.
37
- */
38
- Integer: "Integer",
39
- /**
40
- * Represents floating point numbers.
41
- */
42
- Float: "Float",
43
- /**
44
- * Represents a boolean.
45
- */
46
- Boolean: "Boolean",
47
- /**
48
- * Represents a url.
49
- */
50
- URL: "URL",
51
- /**
52
- * Represents a date as an ISO format string.
53
- */
54
- Date: "Date",
55
- /**
56
- * Represents a date time as an ISO format string.
57
- */
58
- DateTime: "DateTime",
59
- /**
60
- * Represents a time as an ISO format string.
61
- */
62
- Time: "Time",
63
- /**
64
- * Represents a url which points to an image.
65
- */
66
- Image: "image",
67
- /**
68
- * Represents a location.
69
- */
70
- GeoCoordinates: "GeoCoordinates",
71
- /**
72
- * Represents a structured value.
73
- */
74
- StructuredValue: "StructuredValue",
75
- /**
76
- * Represents an item list.
77
- */
78
- ItemList: "ItemList",
79
- /**
80
- * Represents an item list element.
81
- */
82
- ItemListElement: "itemListElement",
83
- /**
84
- * Represents a next item (can be used as a cursor).
85
- */
86
- NextItem: "nextItem"
87
- };
88
-
89
- var type = "object";
90
- var required = [
91
- "latitude",
92
- "longitude"
93
- ];
94
- var properties = {
95
- latitude: {
96
- type: [
97
- "number",
98
- "string"
99
- ],
100
- minimum: -90,
101
- maximum: 90
102
- },
103
- longitude: {
104
- type: [
105
- "number",
106
- "string"
107
- ],
108
- minimum: -180,
109
- maximum: 180
110
- }
111
- };
112
- var GeoCoordinatesSchema = {
113
- type: type,
114
- required: required,
115
- properties: properties
116
- };
117
-
118
- // Copyright 2024 IOTA Stiftung.
119
- // SPDX-License-Identifier: Apache-2.0.
120
- /**
121
- * Handle validation for schema.org.
122
- */
123
- class SchemaOrgValidation {
124
- /**
125
- * Validate if the property is valid geo-coordinates.
126
- * @param propertyName The name of the property being validated.
127
- * @param value The value to test.
128
- * @param failures The list of failures to add to.
129
- * @returns True if the value is geo-coordinates.
130
- */
131
- static geoCoordinates(propertyName, value, failures) {
132
- const is = core.Validation.object(propertyName, value, failures);
133
- if (is) {
134
- // This is only a partial validation at the moment we should also support
135
- // address, addressCountry, elevation, postalCode as alternative
136
- // to gps coords
137
- let lat;
138
- if (core.Is.number(value.latitude)) {
139
- lat = value.latitude;
140
- }
141
- else if (core.Is.stringValue(value.latitude)) {
142
- lat = core.Coerce.number(value.latitude);
143
- }
144
- if (core.Is.number(lat)) {
145
- if (lat < -90 || lat > 90) {
146
- failures.push({
147
- property: propertyName + ".latitude",
148
- reason: "validation.geo.coordinatesLatitudeRange"
149
- });
150
- }
151
- }
152
- else {
153
- failures.push({
154
- property: propertyName + ".latitude",
155
- reason: "validation.geo.coordinatesLatitudeNumber"
156
- });
157
- }
158
- let lng;
159
- if (core.Is.number(value.longitude)) {
160
- lng = value.longitude;
161
- }
162
- else if (core.Is.stringValue(value.longitude)) {
163
- lng = core.Coerce.number(value.longitude);
164
- }
165
- if (core.Is.number(lng)) {
166
- if (lng < -180 || lng > 180) {
167
- failures.push({
168
- property: propertyName + ".longitude",
169
- reason: "validation.geo.coordinatesLongitudeRange"
170
- });
171
- }
172
- }
173
- else {
174
- failures.push({
175
- property: propertyName + ".longitude",
176
- reason: "validation.geo.coordinatesLongitudeNumber"
177
- });
178
- }
179
- }
180
- return is;
181
- }
182
- }
183
-
184
- // Copyright 2024 IOTA Stiftung.
185
- // SPDX-License-Identifier: Apache-2.0.
186
- /**
187
- * Handle all the data types for schema.org.
188
- */
189
- class SchemaOrgDataTypes {
190
- /**
191
- * Register the JSON-LD Redirects.
192
- */
193
- static registerRedirects() {
194
- dataJsonLd.JsonLdProcessor.addRedirect(/https?:\/\/schema.org\/?/, SchemaOrgContexts.ContextRedirect);
195
- }
196
- /**
197
- * Register all the data types.
198
- */
199
- static registerTypes() {
200
- dataCore.DataTypeHandlerFactory.register(`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.Text}`, () => ({
201
- context: SchemaOrgContexts.ContextRoot,
202
- type: SchemaOrgTypes.Text,
203
- defaultValue: "",
204
- jsonSchema: async () => ({
205
- type: "string"
206
- }),
207
- validate: async (propertyName, value, failures, container) => core.Validation.string(propertyName, value, failures)
208
- }));
209
- dataCore.DataTypeHandlerFactory.register(`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.Integer}`, () => ({
210
- context: SchemaOrgContexts.ContextRoot,
211
- type: SchemaOrgTypes.Integer,
212
- defaultValue: 0,
213
- jsonSchema: async () => ({
214
- type: "integer"
215
- }),
216
- validate: async (propertyName, value, failures, container) => core.Validation.integer(propertyName, value, failures)
217
- }));
218
- dataCore.DataTypeHandlerFactory.register(`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.Float}`, () => ({
219
- context: SchemaOrgContexts.ContextRoot,
220
- type: SchemaOrgTypes.Float,
221
- defaultValue: 0,
222
- jsonSchema: async () => ({
223
- type: "number"
224
- }),
225
- validate: async (propertyName, value, failures, container) => core.Validation.number(propertyName, value, failures)
226
- }));
227
- dataCore.DataTypeHandlerFactory.register(`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.Boolean}`, () => ({
228
- context: SchemaOrgContexts.ContextRoot,
229
- type: SchemaOrgTypes.Boolean,
230
- defaultValue: true,
231
- jsonSchema: async () => ({
232
- type: "boolean"
233
- }),
234
- validate: async (propertyName, value, failures, container) => core.Validation.boolean(propertyName, value, failures)
235
- }));
236
- dataCore.DataTypeHandlerFactory.register(`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.URL}`, () => ({
237
- context: SchemaOrgContexts.ContextRoot,
238
- type: SchemaOrgTypes.URL,
239
- defaultValue: "",
240
- jsonSchema: async () => ({
241
- type: "string",
242
- format: "uri"
243
- }),
244
- validate: async (propertyName, value, failures, container) => core.Url.validate(propertyName, value, failures)
245
- }));
246
- dataCore.DataTypeHandlerFactory.register(`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.Date}`, () => ({
247
- context: SchemaOrgContexts.ContextRoot,
248
- type: SchemaOrgTypes.Date,
249
- defaultValue: new Date(),
250
- jsonSchema: async () => ({
251
- type: "string",
252
- format: "date"
253
- }),
254
- validate: async (propertyName, value, failures, container) => core.Validation.dateString(propertyName, value, failures)
255
- }));
256
- dataCore.DataTypeHandlerFactory.register(`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.DateTime}`, () => ({
257
- context: SchemaOrgContexts.ContextRoot,
258
- type: SchemaOrgTypes.DateTime,
259
- defaultValue: new Date(),
260
- jsonSchema: async () => ({
261
- type: "string",
262
- format: "date-time"
263
- }),
264
- validate: async (propertyName, value, failures, container) => core.Validation.dateTimeString(propertyName, value, failures)
265
- }));
266
- dataCore.DataTypeHandlerFactory.register(`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.Time}`, () => ({
267
- context: SchemaOrgContexts.ContextRoot,
268
- type: SchemaOrgTypes.Time,
269
- defaultValue: new Date(),
270
- jsonSchema: async () => ({
271
- type: "string",
272
- format: "time"
273
- }),
274
- validate: async (propertyName, value, failures, container) => core.Validation.timeString(propertyName, value, failures)
275
- }));
276
- dataCore.DataTypeHandlerFactory.register(`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.Image}`, () => ({
277
- context: SchemaOrgContexts.ContextRoot,
278
- type: SchemaOrgTypes.Image,
279
- defaultValue: "",
280
- jsonSchema: async () => ({
281
- type: "string",
282
- format: "uri"
283
- }),
284
- validate: async (propertyName, value, failures, container) => core.Url.validate(propertyName, value, failures)
285
- }));
286
- dataCore.DataTypeHandlerFactory.register(`${SchemaOrgContexts.ContextRoot}${SchemaOrgTypes.GeoCoordinates}`, () => ({
287
- context: SchemaOrgContexts.ContextRoot,
288
- type: SchemaOrgTypes.GeoCoordinates,
289
- defaultValue: { longitude: 0, latitude: 0 },
290
- jsonSchema: async () => GeoCoordinatesSchema,
291
- validate: async (propertyName, value, failures, container) => SchemaOrgValidation.geoCoordinates(propertyName, value, failures)
292
- }));
293
- }
294
- }
295
-
296
- exports.SchemaOrgContexts = SchemaOrgContexts;
297
- exports.SchemaOrgDataTypes = SchemaOrgDataTypes;
298
- exports.SchemaOrgTypes = SchemaOrgTypes;
299
- exports.SchemaOrgValidation = SchemaOrgValidation;