@larsgw/formica 0.7.1 → 0.7.3
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/CHANGELOG.md +18 -0
- package/lib/catalog/index.js +1 -0
- package/lib/catalog/tables/author.js +5 -3
- package/lib/catalog/tables/index.js +5 -3
- package/lib/catalog/tables/place.js +3 -1
- package/lib/catalog/tables/publisher.js +5 -3
- package/lib/catalog/tables/taxon.d.ts +4 -0
- package/lib/catalog/tables/taxon.js +37 -0
- package/lib/catalog/tables/work.js +5 -5
- package/lib/catalog/value.d.ts +6 -1
- package/lib/catalog/value.js +6 -1
- package/package.json +1 -1
- package/src/catalog/index.ts +1 -0
- package/src/catalog/tables/author.ts +5 -3
- package/src/catalog/tables/index.ts +5 -3
- package/src/catalog/tables/place.ts +3 -1
- package/src/catalog/tables/publisher.ts +5 -3
- package/src/catalog/tables/taxon.ts +17 -0
- package/src/catalog/tables/work.ts +5 -5
- package/src/catalog/value.ts +6 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
## [0.7.3](https://github.com/identification-resources/formica/compare/v0.7.2...v0.7.3) (2025-04-17)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **catalog:** update validation for identifiers ([156a703](https://github.com/identification-resources/formica/commit/156a7036ab09c411d091bc9d0f628831a30ba3f5))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## [0.7.2](https://github.com/identification-resources/formica/compare/v0.7.1...v0.7.2) (2025-04-02)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
* **catalog:** add validation for taxa.csv ([59cfcf2](https://github.com/identification-resources/formica/commit/59cfcf28ebbef42e28e648e800c178a7d528f37a))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
1
19
|
## [0.7.1](https://github.com/identification-resources/formica/compare/v0.7.0...v0.7.1) (2025-03-25)
|
|
2
20
|
|
|
3
21
|
|
package/lib/catalog/index.js
CHANGED
|
@@ -12,6 +12,7 @@ function getTypeInfo(type) {
|
|
|
12
12
|
case 'authors': return index_1.TYPE_INFO.authors;
|
|
13
13
|
case 'places': return index_1.TYPE_INFO.places;
|
|
14
14
|
case 'publishers': return index_1.TYPE_INFO.publishers;
|
|
15
|
+
case 'taxa': return index_1.TYPE_INFO.taxa;
|
|
15
16
|
case 'catalog': return index_1.TYPE_INFO.catalog;
|
|
16
17
|
default: throw new TypeError("Unknown type \"".concat(type, "\""));
|
|
17
18
|
}
|
|
@@ -22,10 +22,12 @@ var Author = /** @class */ (function (_super) {
|
|
|
22
22
|
__extends(Author, _super);
|
|
23
23
|
function Author(values) {
|
|
24
24
|
return _super.call(this, values, {
|
|
25
|
-
name: { required: true, multiple:
|
|
25
|
+
name: { required: true, multiple: true },
|
|
26
|
+
id: { required: true, multiple: false, format: value_1.FORMATS.AUTHOR_ID },
|
|
26
27
|
qid: { required: false, multiple: false, format: value_1.FORMATS.QID },
|
|
27
|
-
|
|
28
|
-
full_names: { required: false, multiple: true }
|
|
28
|
+
display_name: { required: false, multiple: false },
|
|
29
|
+
full_names: { required: false, multiple: true },
|
|
30
|
+
duplicate_of: { required: false, multiple: false, format: value_1.FORMATS.AUTHOR_ID }
|
|
29
31
|
}) || this;
|
|
30
32
|
}
|
|
31
33
|
return Author;
|
|
@@ -4,10 +4,12 @@ exports.TYPE_INFO = void 0;
|
|
|
4
4
|
var author_1 = require("./author");
|
|
5
5
|
var publisher_1 = require("./publisher");
|
|
6
6
|
var place_1 = require("./place");
|
|
7
|
+
var taxon_1 = require("./taxon");
|
|
7
8
|
var work_1 = require("./work");
|
|
8
9
|
exports.TYPE_INFO = {
|
|
9
|
-
authors: [author_1.Author, '
|
|
10
|
-
publishers: [publisher_1.Publisher, '
|
|
11
|
-
places: [place_1.Place, '
|
|
10
|
+
authors: [author_1.Author, 'id'],
|
|
11
|
+
publishers: [publisher_1.Publisher, 'id'],
|
|
12
|
+
places: [place_1.Place, 'id'],
|
|
13
|
+
taxa: [taxon_1.Taxon, 'id'],
|
|
12
14
|
catalog: [work_1.Work, 'id']
|
|
13
15
|
};
|
|
@@ -23,8 +23,10 @@ var Place = /** @class */ (function (_super) {
|
|
|
23
23
|
function Place(values) {
|
|
24
24
|
return _super.call(this, values, {
|
|
25
25
|
name: { required: true, multiple: false },
|
|
26
|
+
id: { required: true, multiple: false, format: value_1.FORMATS.PLACE_ID },
|
|
26
27
|
qid: { required: false, multiple: false, format: value_1.FORMATS.QID },
|
|
27
|
-
display_name: { required: false, multiple: false }
|
|
28
|
+
display_name: { required: false, multiple: false },
|
|
29
|
+
duplicate_of: { required: false, multiple: false, format: value_1.FORMATS.PLACE_ID }
|
|
28
30
|
}) || this;
|
|
29
31
|
}
|
|
30
32
|
return Place;
|
|
@@ -22,10 +22,12 @@ var Publisher = /** @class */ (function (_super) {
|
|
|
22
22
|
__extends(Publisher, _super);
|
|
23
23
|
function Publisher(values) {
|
|
24
24
|
return _super.call(this, values, {
|
|
25
|
-
name: { required: true, multiple:
|
|
25
|
+
name: { required: true, multiple: true },
|
|
26
|
+
id: { required: true, multiple: false, format: value_1.FORMATS.PUBLISHER_ID },
|
|
26
27
|
qid: { required: false, multiple: false, format: value_1.FORMATS.QID },
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
display_name: { required: false, multiple: false },
|
|
29
|
+
full_names: { required: false, multiple: true },
|
|
30
|
+
duplicate_of: { required: false, multiple: false, format: value_1.FORMATS.PUBLISHER_ID }
|
|
29
31
|
}) || this;
|
|
30
32
|
}
|
|
31
33
|
return Publisher;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.Taxon = void 0;
|
|
19
|
+
var value_1 = require("../value");
|
|
20
|
+
var entity_1 = require("../entity");
|
|
21
|
+
var Taxon = /** @class */ (function (_super) {
|
|
22
|
+
__extends(Taxon, _super);
|
|
23
|
+
function Taxon(values) {
|
|
24
|
+
return _super.call(this, values, {
|
|
25
|
+
name: { required: true, multiple: false },
|
|
26
|
+
id: { required: true, multiple: false, format: value_1.FORMATS.TAXON_ID },
|
|
27
|
+
qid: { required: false, multiple: false, format: value_1.FORMATS.QID },
|
|
28
|
+
rank: { required: false, multiple: false },
|
|
29
|
+
gbif: { required: false, multiple: false, format: value_1.FORMATS.INTEGER },
|
|
30
|
+
children_gbif: { required: false, multiple: true, format: value_1.FORMATS.INTEGER },
|
|
31
|
+
ancestors_gbif: { required: false, multiple: true, format: value_1.FORMATS.INTEGER },
|
|
32
|
+
duplicate_of: { required: false, multiple: false, format: value_1.FORMATS.TAXON_ID }
|
|
33
|
+
}) || this;
|
|
34
|
+
}
|
|
35
|
+
return Taxon;
|
|
36
|
+
}(entity_1.Entity));
|
|
37
|
+
exports.Taxon = Taxon;
|
|
@@ -22,7 +22,7 @@ var Work = /** @class */ (function (_super) {
|
|
|
22
22
|
__extends(Work, _super);
|
|
23
23
|
function Work(values) {
|
|
24
24
|
return _super.call(this, values, {
|
|
25
|
-
id: { required: true, multiple: false, format: value_1.FORMATS.
|
|
25
|
+
id: { required: true, multiple: false, format: value_1.FORMATS.WORK_ID },
|
|
26
26
|
title: { required: true, multiple: value_1.CHECK.MULTILANG },
|
|
27
27
|
author: { required: false, multiple: true },
|
|
28
28
|
url: { required: false, multiple: true, format: value_1.FORMATS.URL },
|
|
@@ -49,10 +49,10 @@ var Work = /** @class */ (function (_super) {
|
|
|
49
49
|
region: { required: true, multiple: true },
|
|
50
50
|
complete: { required: false, multiple: false, format: value_1.FORMATS.COMPLETE },
|
|
51
51
|
target_taxa: { required: false, multiple: true },
|
|
52
|
-
listed_in: { required: false, multiple: true, format: value_1.FORMATS.
|
|
53
|
-
part_of: { required: false, multiple: true, format: value_1.FORMATS.
|
|
54
|
-
version_of: { required: false, multiple: true, format: value_1.FORMATS.
|
|
55
|
-
duplicate_of: { required: false, multiple: false, format: value_1.FORMATS.
|
|
52
|
+
listed_in: { required: false, multiple: true, format: value_1.FORMATS.WORK_ID },
|
|
53
|
+
part_of: { required: false, multiple: true, format: value_1.FORMATS.WORK_ID },
|
|
54
|
+
version_of: { required: false, multiple: true, format: value_1.FORMATS.WORK_ID },
|
|
55
|
+
duplicate_of: { required: false, multiple: false, format: value_1.FORMATS.WORK_ID }
|
|
56
56
|
}) || this;
|
|
57
57
|
}
|
|
58
58
|
Work.prototype.deriveFields = function () {
|
package/lib/catalog/value.d.ts
CHANGED
|
@@ -2,13 +2,18 @@ export declare const FORMATS: {
|
|
|
2
2
|
ENTRY_TYPE: string[];
|
|
3
3
|
KEY_TYPE: string[];
|
|
4
4
|
COMPLETE: string[];
|
|
5
|
-
|
|
5
|
+
WORK_ID: RegExp;
|
|
6
|
+
AUTHOR_ID: RegExp;
|
|
7
|
+
PLACE_ID: RegExp;
|
|
8
|
+
PUBLISHER_ID: RegExp;
|
|
9
|
+
TAXON_ID: RegExp;
|
|
6
10
|
EDTF_0: RegExp;
|
|
7
11
|
ISSN_L: RegExp;
|
|
8
12
|
ISBN: RegExp;
|
|
9
13
|
DOI: RegExp;
|
|
10
14
|
QID: RegExp;
|
|
11
15
|
URL: RegExp;
|
|
16
|
+
INTEGER: RegExp;
|
|
12
17
|
LICENSE(value: SingleValue): true;
|
|
13
18
|
LANGUAGE(value: SingleValue): any;
|
|
14
19
|
};
|
package/lib/catalog/value.js
CHANGED
|
@@ -10,13 +10,18 @@ exports.FORMATS = {
|
|
|
10
10
|
ENTRY_TYPE: ['print', 'online', 'cd', 'application'],
|
|
11
11
|
KEY_TYPE: ['key', 'matrix', 'reference', 'gallery', 'checklist', 'supplement', 'collection', 'algorithm'],
|
|
12
12
|
COMPLETE: ['TRUE', 'FALSE'],
|
|
13
|
-
|
|
13
|
+
WORK_ID: /^B[1-9]\d*$/,
|
|
14
|
+
AUTHOR_ID: /^A[1-9]\d*$/,
|
|
15
|
+
PLACE_ID: /^G[1-9]\d*$/,
|
|
16
|
+
PUBLISHER_ID: /^P[1-9]\d*$/,
|
|
17
|
+
TAXON_ID: /^T[1-9]\d*$/,
|
|
14
18
|
EDTF_0: /^(\d{4}(-\d{2}(-\d{2}(T\d{2}:\d{2}:\d{2}(Z|[-+]\d{2}(:\d{2})?))?)?)?|\d{4}(-\d{2}(-\d{2})?)?\/(\d{4}(-\d{2}(-\d{2})?)?|\.\.))$/,
|
|
15
19
|
ISSN_L: /^[0-9]{4}-[0-9]{3}[0-9X]$/,
|
|
16
20
|
ISBN: /^(\d{13}|\d{9}[0-9X])$/,
|
|
17
21
|
DOI: /^10\./,
|
|
18
22
|
QID: /^Q[1-9][0-9]*$/,
|
|
19
23
|
URL: /^(ftp|http|https):\/\/((?:[a-z0-9][a-z0-9-_]*?[a-z0-9]?\.)+(?:xn--)?[a-z0-9]+)(:\d*)?((?:\/(?:%\d\d|[!$&'()*+,\-.0-9";=@A-Z_a-z~])*)*)(\?(?:%\d\d|[!$&'()*+,\-./0-9:;=?@A-Z_a-z~])*)?(#(?:%\d\d|[!$&'()*+,\-./0-9:;=?@A-Z_a-z~])*)?/i,
|
|
24
|
+
INTEGER: /^(0|[1-9]\d*)$/,
|
|
20
25
|
LICENSE: function (value) { return /^<(public domain|.+\?)>$/.test(value) || !!spdxLicenseList[value]; },
|
|
21
26
|
LANGUAGE: function (value) { return ietfTagList.test(value); }
|
|
22
27
|
};
|
package/package.json
CHANGED
package/src/catalog/index.ts
CHANGED
|
@@ -8,6 +8,7 @@ function getTypeInfo (type: string): [typeof Entity, string] {
|
|
|
8
8
|
case 'authors': return TYPE_INFO.authors
|
|
9
9
|
case 'places': return TYPE_INFO.places
|
|
10
10
|
case 'publishers': return TYPE_INFO.publishers
|
|
11
|
+
case 'taxa': return TYPE_INFO.taxa
|
|
11
12
|
case 'catalog': return TYPE_INFO.catalog
|
|
12
13
|
default: throw new TypeError(`Unknown type "${type}"`)
|
|
13
14
|
}
|
|
@@ -4,10 +4,12 @@ import { Entity } from '../entity'
|
|
|
4
4
|
export class Author extends Entity {
|
|
5
5
|
constructor (values: Record<string, string>) {
|
|
6
6
|
super(values, {
|
|
7
|
-
name: { required: true, multiple:
|
|
7
|
+
name: { required: true, multiple: true },
|
|
8
|
+
id: { required: true, multiple: false, format: FORMATS.AUTHOR_ID },
|
|
8
9
|
qid: { required: false, multiple: false, format: FORMATS.QID },
|
|
9
|
-
|
|
10
|
-
full_names: { required: false, multiple: true }
|
|
10
|
+
display_name: { required: false, multiple: false },
|
|
11
|
+
full_names: { required: false, multiple: true },
|
|
12
|
+
duplicate_of: { required: false, multiple: false, format: FORMATS.AUTHOR_ID }
|
|
11
13
|
})
|
|
12
14
|
}
|
|
13
15
|
}
|
|
@@ -2,11 +2,13 @@ import { Entity } from '../entity'
|
|
|
2
2
|
import { Author } from './author'
|
|
3
3
|
import { Publisher } from './publisher'
|
|
4
4
|
import { Place } from './place'
|
|
5
|
+
import { Taxon } from './taxon'
|
|
5
6
|
import { Work } from './work'
|
|
6
7
|
|
|
7
8
|
export const TYPE_INFO: Record<string, [typeof Entity, string]> = {
|
|
8
|
-
authors: [Author, '
|
|
9
|
-
publishers: [Publisher, '
|
|
10
|
-
places: [Place, '
|
|
9
|
+
authors: [Author, 'id'],
|
|
10
|
+
publishers: [Publisher, 'id'],
|
|
11
|
+
places: [Place, 'id'],
|
|
12
|
+
taxa: [Taxon, 'id'],
|
|
11
13
|
catalog: [Work, 'id']
|
|
12
14
|
}
|
|
@@ -5,8 +5,10 @@ export class Place extends Entity {
|
|
|
5
5
|
constructor (values: Record<string, string>) {
|
|
6
6
|
super(values, {
|
|
7
7
|
name: { required: true, multiple: false },
|
|
8
|
+
id: { required: true, multiple: false, format: FORMATS.PLACE_ID },
|
|
8
9
|
qid: { required: false, multiple: false, format: FORMATS.QID },
|
|
9
|
-
display_name: { required: false, multiple: false }
|
|
10
|
+
display_name: { required: false, multiple: false },
|
|
11
|
+
duplicate_of: { required: false, multiple: false, format: FORMATS.PLACE_ID }
|
|
10
12
|
})
|
|
11
13
|
}
|
|
12
14
|
}
|
|
@@ -4,10 +4,12 @@ import { Entity } from '../entity'
|
|
|
4
4
|
export class Publisher extends Entity {
|
|
5
5
|
constructor (values: Record<string, string>) {
|
|
6
6
|
super(values, {
|
|
7
|
-
name: { required: true, multiple:
|
|
7
|
+
name: { required: true, multiple: true },
|
|
8
|
+
id: { required: true, multiple: false, format: FORMATS.PUBLISHER_ID },
|
|
8
9
|
qid: { required: false, multiple: false, format: FORMATS.QID },
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
display_name: { required: false, multiple: false },
|
|
11
|
+
full_names: { required: false, multiple: true },
|
|
12
|
+
duplicate_of: { required: false, multiple: false, format: FORMATS.PUBLISHER_ID }
|
|
11
13
|
})
|
|
12
14
|
}
|
|
13
15
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { FORMATS } from '../value'
|
|
2
|
+
import { Entity } from '../entity'
|
|
3
|
+
|
|
4
|
+
export class Taxon extends Entity {
|
|
5
|
+
constructor (values: Record<string, string>) {
|
|
6
|
+
super(values, {
|
|
7
|
+
name: { required: true, multiple: false },
|
|
8
|
+
id: { required: true, multiple: false, format: FORMATS.TAXON_ID },
|
|
9
|
+
qid: { required: false, multiple: false, format: FORMATS.QID },
|
|
10
|
+
rank: { required: false, multiple: false },
|
|
11
|
+
gbif: { required: false, multiple: false, format: FORMATS.INTEGER },
|
|
12
|
+
children_gbif: { required: false, multiple: true, format: FORMATS.INTEGER },
|
|
13
|
+
ancestors_gbif: { required: false, multiple: true, format: FORMATS.INTEGER },
|
|
14
|
+
duplicate_of: { required: false, multiple: false, format: FORMATS.TAXON_ID }
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -4,7 +4,7 @@ import { Entity } from '../entity'
|
|
|
4
4
|
export class Work extends Entity {
|
|
5
5
|
constructor (values: Record<string, string>) {
|
|
6
6
|
super(values, {
|
|
7
|
-
id: { required: true, multiple: false, format: FORMATS.
|
|
7
|
+
id: { required: true, multiple: false, format: FORMATS.WORK_ID },
|
|
8
8
|
title: { required: true, multiple: CHECK.MULTILANG },
|
|
9
9
|
author: { required: false, multiple: true },
|
|
10
10
|
url: { required: false, multiple: true, format: FORMATS.URL },
|
|
@@ -31,10 +31,10 @@ export class Work extends Entity {
|
|
|
31
31
|
region: { required: true, multiple: true },
|
|
32
32
|
complete: { required: false, multiple: false, format: FORMATS.COMPLETE },
|
|
33
33
|
target_taxa: { required: false, multiple: true },
|
|
34
|
-
listed_in: { required: false, multiple: true, format: FORMATS.
|
|
35
|
-
part_of: { required: false, multiple: true, format: FORMATS.
|
|
36
|
-
version_of: { required: false, multiple: true, format: FORMATS.
|
|
37
|
-
duplicate_of: { required: false, multiple: false, format: FORMATS.
|
|
34
|
+
listed_in: { required: false, multiple: true, format: FORMATS.WORK_ID },
|
|
35
|
+
part_of: { required: false, multiple: true, format: FORMATS.WORK_ID },
|
|
36
|
+
version_of: { required: false, multiple: true, format: FORMATS.WORK_ID },
|
|
37
|
+
duplicate_of: { required: false, multiple: false, format: FORMATS.WORK_ID }
|
|
38
38
|
})
|
|
39
39
|
}
|
|
40
40
|
|
package/src/catalog/value.ts
CHANGED
|
@@ -10,13 +10,18 @@ export const FORMATS = {
|
|
|
10
10
|
KEY_TYPE: ['key', 'matrix', 'reference', 'gallery', 'checklist', 'supplement', 'collection', 'algorithm'],
|
|
11
11
|
COMPLETE: ['TRUE', 'FALSE'],
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
WORK_ID: /^B[1-9]\d*$/,
|
|
14
|
+
AUTHOR_ID: /^A[1-9]\d*$/,
|
|
15
|
+
PLACE_ID: /^G[1-9]\d*$/,
|
|
16
|
+
PUBLISHER_ID: /^P[1-9]\d*$/,
|
|
17
|
+
TAXON_ID: /^T[1-9]\d*$/,
|
|
14
18
|
EDTF_0: /^(\d{4}(-\d{2}(-\d{2}(T\d{2}:\d{2}:\d{2}(Z|[-+]\d{2}(:\d{2})?))?)?)?|\d{4}(-\d{2}(-\d{2})?)?\/(\d{4}(-\d{2}(-\d{2})?)?|\.\.))$/,
|
|
15
19
|
ISSN_L: /^[0-9]{4}-[0-9]{3}[0-9X]$/,
|
|
16
20
|
ISBN: /^(\d{13}|\d{9}[0-9X])$/,
|
|
17
21
|
DOI: /^10\./,
|
|
18
22
|
QID: /^Q[1-9][0-9]*$/,
|
|
19
23
|
URL: /^(ftp|http|https):\/\/((?:[a-z0-9][a-z0-9-_]*?[a-z0-9]?\.)+(?:xn--)?[a-z0-9]+)(:\d*)?((?:\/(?:%\d\d|[!$&'()*+,\-.0-9";=@A-Z_a-z~])*)*)(\?(?:%\d\d|[!$&'()*+,\-./0-9:;=?@A-Z_a-z~])*)?(#(?:%\d\d|[!$&'()*+,\-./0-9:;=?@A-Z_a-z~])*)?/i,
|
|
24
|
+
INTEGER: /^(0|[1-9]\d*)$/,
|
|
20
25
|
|
|
21
26
|
LICENSE (value: SingleValue) { return /^<(public domain|.+\?)>$/.test(value) || !!spdxLicenseList[value] },
|
|
22
27
|
LANGUAGE (value: SingleValue) { return ietfTagList.test(value) }
|