@apollo-annotation/shared 0.1.19 → 0.1.20
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/Changes/AddAssemblyAndFeaturesFromFileChange.d.ts +33 -0
- package/dist/Changes/AddAssemblyAndFeaturesFromFileChange.js +83 -0
- package/dist/Changes/AddAssemblyAndFeaturesFromFileChange.js.map +1 -0
- package/dist/Changes/AddAssemblyFromExternalChange.d.ts +34 -0
- package/dist/Changes/AddAssemblyFromExternalChange.js +97 -0
- package/dist/Changes/AddAssemblyFromExternalChange.js.map +1 -0
- package/dist/Changes/AddAssemblyFromFileChange.d.ts +43 -0
- package/dist/Changes/AddAssemblyFromFileChange.js +140 -0
- package/dist/Changes/AddAssemblyFromFileChange.js.map +1 -0
- package/dist/Changes/AddFeatureChange.d.ts +35 -0
- package/dist/Changes/AddFeatureChange.js +169 -0
- package/dist/Changes/AddFeatureChange.js.map +1 -0
- package/dist/Changes/AddFeaturesFromFileChange.d.ts +32 -0
- package/dist/Changes/AddFeaturesFromFileChange.js +76 -0
- package/dist/Changes/AddFeaturesFromFileChange.js.map +1 -0
- package/dist/Changes/AddRefSeqAliasesChange.d.ts +20 -0
- package/dist/Changes/AddRefSeqAliasesChange.js +61 -0
- package/dist/Changes/AddRefSeqAliasesChange.js.map +1 -0
- package/dist/Changes/DeleteAssemblyChange.d.ts +18 -0
- package/dist/Changes/DeleteAssemblyChange.js +72 -0
- package/dist/Changes/DeleteAssemblyChange.js.map +1 -0
- package/dist/Changes/DeleteFeatureChange.d.ts +42 -0
- package/dist/Changes/DeleteFeatureChange.js +143 -0
- package/dist/Changes/DeleteFeatureChange.js.map +1 -0
- package/dist/Changes/DeleteUserChange.d.ts +25 -0
- package/dist/Changes/DeleteUserChange.js +53 -0
- package/dist/Changes/DeleteUserChange.js.map +1 -0
- package/dist/Changes/FeatureAttributeChange.d.ts +31 -0
- package/dist/Changes/FeatureAttributeChange.js +112 -0
- package/dist/Changes/FeatureAttributeChange.js.map +1 -0
- package/dist/Changes/FromFileBaseChange.d.ts +9 -0
- package/dist/Changes/FromFileBaseChange.js +187 -0
- package/dist/Changes/FromFileBaseChange.js.map +1 -0
- package/dist/Changes/ImportJBrowseConfigChange.d.ts +43 -0
- package/dist/Changes/ImportJBrowseConfigChange.js +67 -0
- package/dist/Changes/ImportJBrowseConfigChange.js.map +1 -0
- package/dist/Changes/LocationEndChange.d.ts +32 -0
- package/dist/Changes/LocationEndChange.js +129 -0
- package/dist/Changes/LocationEndChange.js.map +1 -0
- package/dist/Changes/LocationStartChange.d.ts +32 -0
- package/dist/Changes/LocationStartChange.js +129 -0
- package/dist/Changes/LocationStartChange.js.map +1 -0
- package/dist/Changes/StrandChange.d.ts +31 -0
- package/dist/Changes/StrandChange.js +114 -0
- package/dist/Changes/StrandChange.js.map +1 -0
- package/dist/Changes/TypeChange.d.ts +31 -0
- package/dist/Changes/TypeChange.js +114 -0
- package/dist/Changes/TypeChange.js.map +1 -0
- package/dist/Changes/UserChange.d.ts +25 -0
- package/dist/Changes/UserChange.js +51 -0
- package/dist/Changes/UserChange.js.map +1 -0
- package/dist/Changes/index.d.ts +50 -0
- package/dist/Changes/index.js +55 -0
- package/dist/Changes/index.js.map +1 -0
- package/dist/Checks/CDSCheck.d.ts +8 -0
- package/dist/Checks/CDSCheck.js +197 -0
- package/dist/Checks/CDSCheck.js.map +1 -0
- package/dist/Checks/index.d.ts +1 -0
- package/dist/Checks/index.js +5 -0
- package/dist/Checks/index.js.map +1 -0
- package/dist/Common/index.d.ts +1 -0
- package/dist/Common/index.js +5 -0
- package/dist/Common/index.js.map +1 -0
- package/dist/Common/jwtPayload.d.ts +12 -0
- package/dist/Common/jwtPayload.js +16 -0
- package/dist/Common/jwtPayload.js.map +1 -0
- package/dist/GFF3/gff3ToAnnotationFeature.d.ts +3 -0
- package/dist/GFF3/gff3ToAnnotationFeature.js +211 -0
- package/dist/GFF3/gff3ToAnnotationFeature.js.map +1 -0
- package/dist/GFF3/gff3ToAnnotationFeature.test.d.ts +1 -0
- package/dist/GFF3/gff3ToAnnotationFeature.test.js +174 -0
- package/dist/GFF3/gff3ToAnnotationFeature.test.js.map +1 -0
- package/dist/GFF3/gffReservedKeys.d.ts +5 -0
- package/dist/GFF3/gffReservedKeys.js +34 -0
- package/dist/GFF3/gffReservedKeys.js.map +1 -0
- package/dist/GFF3/index.d.ts +2 -0
- package/dist/GFF3/index.js +6 -0
- package/dist/GFF3/index.js.map +1 -0
- package/dist/Messages.d.ts +28 -0
- package/dist/Messages.js +3 -0
- package/dist/Messages.js.map +1 -0
- package/dist/Operations/GetAssembliesOperation.d.ts +13 -0
- package/dist/Operations/GetAssembliesOperation.js +20 -0
- package/dist/Operations/GetAssembliesOperation.js.map +1 -0
- package/dist/Operations/GetFeaturesOperation.d.ts +26 -0
- package/dist/Operations/GetFeaturesOperation.js +42 -0
- package/dist/Operations/GetFeaturesOperation.js.map +1 -0
- package/dist/Operations/index.d.ts +8 -0
- package/dist/Operations/index.js +10 -0
- package/dist/Operations/index.js.map +1 -0
- package/dist/Validations/CoreValidation.d.ts +17 -0
- package/dist/Validations/CoreValidation.js +36 -0
- package/dist/Validations/CoreValidation.js.map +1 -0
- package/dist/Validations/ParentChildValidation.d.ts +17 -0
- package/dist/Validations/ParentChildValidation.js +61 -0
- package/dist/Validations/ParentChildValidation.js.map +1 -0
- package/dist/Validations/Validation.d.ts +27 -0
- package/dist/Validations/Validation.js +27 -0
- package/dist/Validations/Validation.js.map +1 -0
- package/dist/Validations/ValidationSet.d.ts +24 -0
- package/dist/Validations/ValidationSet.js +86 -0
- package/dist/Validations/ValidationSet.js.map +1 -0
- package/dist/Validations/index.d.ts +4 -0
- package/dist/Validations/index.js +8 -0
- package/dist/Validations/index.js.map +1 -0
- package/dist/Validations/soSequenceTypes.d.ts +2 -0
- package/dist/Validations/soSequenceTypes.js +1868 -0
- package/dist/Validations/soSequenceTypes.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/util.d.ts +4 -0
- package/dist/util.js +102 -0
- package/dist/util.js.map +1 -0
- package/package.json +8 -5
- package/src/Changes/AddAssemblyAndFeaturesFromFileChange.ts +6 -5
- package/src/Changes/AddAssemblyFromFileChange.ts +126 -41
- package/src/Checks/CDSCheck.ts +202 -252
- package/src/GFF3/gff3ToAnnotationFeature.test.ts +165 -5
- package/src/GFF3/gff3ToAnnotationFeature.ts +16 -16
- package/src/util.ts +1 -0
- package/test_data/braker.gff +13 -0
- package/test_data/example01.gff3 +26 -0
- package/test_data/example01.json +236 -0
- package/test_data/example02.json +225 -0
- package/test_data/example04.json +225 -0
- package/test_data/example05.gff3 +30 -0
- package/test_data/example06.gff3 +30 -0
- package/test_data/example07.gff3 +30 -0
- package/test_data/gene_mrna.gff3 +4 -0
- package/test_data/gene_representations.gff3 +1781 -0
- package/test_data/one_cds.gff3 +9 -0
- package/test_data/one_cds.json +67 -0
- package/test_data/two_cds.gff3 +9 -0
- package/test_data/two_cds.json +67 -0
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { AnnotationFeatureSnapshot } from '@apollo-annotation/mst';
|
|
2
|
+
import { GFF3Feature } from '@gmod/gff';
|
|
3
|
+
export declare function makeGFF3Feature(feature: AnnotationFeatureSnapshot, parentId?: string, refSeqNames?: Record<string, string | undefined>): GFF3Feature;
|
|
4
|
+
export declare function splitStringIntoChunks(input: string, chunkSize: number): string[];
|
package/dist/util.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.makeGFF3Feature = makeGFF3Feature;
|
|
5
|
+
exports.splitStringIntoChunks = splitStringIntoChunks;
|
|
6
|
+
function makeGFF3Feature(feature, parentId, refSeqNames) {
|
|
7
|
+
const locations = [{ start: feature.min, end: feature.max }];
|
|
8
|
+
// const locations = feature.discontinuousLocations?.length
|
|
9
|
+
// ? feature.discontinuousLocations
|
|
10
|
+
// : [{ start: feature.start, end: feature.end, phase: feature.phase }]
|
|
11
|
+
const attributes = JSON.parse(JSON.stringify(feature.attributes));
|
|
12
|
+
const ontologyTerms = [];
|
|
13
|
+
const source = feature.attributes?.source?.[0] ?? null;
|
|
14
|
+
delete attributes.source;
|
|
15
|
+
if (parentId) {
|
|
16
|
+
attributes.Parent = [parentId];
|
|
17
|
+
}
|
|
18
|
+
if (attributes._id) {
|
|
19
|
+
attributes.ID = attributes._id;
|
|
20
|
+
delete attributes._id;
|
|
21
|
+
}
|
|
22
|
+
if (attributes.gff_name) {
|
|
23
|
+
attributes.Name = attributes.gff_name;
|
|
24
|
+
delete attributes.gff_name;
|
|
25
|
+
}
|
|
26
|
+
if (attributes.gff_alias) {
|
|
27
|
+
attributes.Alias = attributes.gff_alias;
|
|
28
|
+
delete attributes.gff_alias;
|
|
29
|
+
}
|
|
30
|
+
if (attributes.gff_target) {
|
|
31
|
+
attributes.Target = attributes.gff_target;
|
|
32
|
+
delete attributes.gff_target;
|
|
33
|
+
}
|
|
34
|
+
if (attributes.gff_gap) {
|
|
35
|
+
attributes.Gap = attributes.gff_gap;
|
|
36
|
+
delete attributes.gff_gap;
|
|
37
|
+
}
|
|
38
|
+
if (attributes.gff_derives_from) {
|
|
39
|
+
attributes.Derives_from = attributes.gff_derives_from;
|
|
40
|
+
delete attributes.gff_derives_from;
|
|
41
|
+
}
|
|
42
|
+
if (attributes.gff_note) {
|
|
43
|
+
attributes.Note = attributes.gff_note;
|
|
44
|
+
delete attributes.gff_note;
|
|
45
|
+
}
|
|
46
|
+
if (attributes.gff_dbxref) {
|
|
47
|
+
attributes.Dbxref = attributes.gff_dbxref;
|
|
48
|
+
delete attributes.gff_dbxref;
|
|
49
|
+
}
|
|
50
|
+
if (attributes.gff_is_circular) {
|
|
51
|
+
attributes.Is_circular = attributes.gff_is_circular;
|
|
52
|
+
delete attributes.gff_is_circular;
|
|
53
|
+
}
|
|
54
|
+
if (attributes.gff_ontology_term) {
|
|
55
|
+
ontologyTerms.push(...attributes.gff_ontology_term);
|
|
56
|
+
delete attributes.gff_ontology_term;
|
|
57
|
+
}
|
|
58
|
+
if (attributes['Gene Ontology']) {
|
|
59
|
+
ontologyTerms.push(...attributes['Gene Ontology']);
|
|
60
|
+
delete attributes['Gene Ontology'];
|
|
61
|
+
}
|
|
62
|
+
if (attributes['Sequence Ontology']) {
|
|
63
|
+
ontologyTerms.push(...attributes['Sequence Ontology']);
|
|
64
|
+
delete attributes['Sequence Ontology'];
|
|
65
|
+
}
|
|
66
|
+
if (ontologyTerms.length > 0) {
|
|
67
|
+
attributes.Ontology_term = ontologyTerms;
|
|
68
|
+
}
|
|
69
|
+
return locations.map((location) => ({
|
|
70
|
+
start: location.start + 1,
|
|
71
|
+
end: location.end,
|
|
72
|
+
seq_id: refSeqNames ? refSeqNames[feature.refSeq] ?? null : feature.refSeq,
|
|
73
|
+
source,
|
|
74
|
+
type: feature.type,
|
|
75
|
+
score: null,
|
|
76
|
+
// score: feature.score ?? null,
|
|
77
|
+
strand: feature.strand ? (feature.strand === 1 ? '+' : '-') : null,
|
|
78
|
+
phase: null,
|
|
79
|
+
// phase:
|
|
80
|
+
// location.phase === 0
|
|
81
|
+
// ? '0'
|
|
82
|
+
// : location.phase === 1
|
|
83
|
+
// ? '1'
|
|
84
|
+
// : location.phase === 2
|
|
85
|
+
// ? '2'
|
|
86
|
+
// : null,
|
|
87
|
+
attributes: Object.keys(attributes).length > 0 ? attributes : null,
|
|
88
|
+
derived_features: [],
|
|
89
|
+
child_features: feature.children
|
|
90
|
+
? Object.values(feature.children).map((child) => makeGFF3Feature(child, attributes.ID?.[0], refSeqNames))
|
|
91
|
+
: [],
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
function splitStringIntoChunks(input, chunkSize) {
|
|
95
|
+
const chunks = [];
|
|
96
|
+
for (let i = 0; i < input.length; i += chunkSize) {
|
|
97
|
+
const chunk = input.slice(i, i + chunkSize);
|
|
98
|
+
chunks.push(chunk);
|
|
99
|
+
}
|
|
100
|
+
return chunks;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";AAAA,4DAA4D;;AAK5D,0CA+FC;AAED,sDAUC;AA3GD,SAAgB,eAAe,CAC7B,OAAkC,EAClC,QAAiB,EACjB,WAAgD;IAEhD,MAAM,SAAS,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC5D,2DAA2D;IAC3D,qCAAqC;IACrC,yEAAyE;IACzE,MAAM,UAAU,GAAyC,IAAI,CAAC,KAAK,CACjE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CACnC,CAAA;IACD,MAAM,aAAa,GAAa,EAAE,CAAA;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;IACtD,OAAO,UAAU,CAAC,MAAM,CAAA;IACxB,IAAI,QAAQ,EAAE,CAAC;QACb,UAAU,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAA;IAChC,CAAC;IACD,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC;QACnB,UAAU,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,CAAA;QAC9B,OAAO,UAAU,CAAC,GAAG,CAAA;IACvB,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAA;QACrC,OAAO,UAAU,CAAC,QAAQ,CAAA;IAC5B,CAAC;IACD,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QACzB,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,SAAS,CAAA;QACvC,OAAO,UAAU,CAAC,SAAS,CAAA;IAC7B,CAAC;IACD,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,UAAU,CAAA;QACzC,OAAO,UAAU,CAAC,UAAU,CAAA;IAC9B,CAAC;IACD,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,UAAU,CAAC,GAAG,GAAG,UAAU,CAAC,OAAO,CAAA;QACnC,OAAO,UAAU,CAAC,OAAO,CAAA;IAC3B,CAAC;IACD,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC;QAChC,UAAU,CAAC,YAAY,GAAG,UAAU,CAAC,gBAAgB,CAAA;QACrD,OAAO,UAAU,CAAC,gBAAgB,CAAA;IACpC,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAA;QACrC,OAAO,UAAU,CAAC,QAAQ,CAAA;IAC5B,CAAC;IACD,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,UAAU,CAAA;QACzC,OAAO,UAAU,CAAC,UAAU,CAAA;IAC9B,CAAC;IACD,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC;QAC/B,UAAU,CAAC,WAAW,GAAG,UAAU,CAAC,eAAe,CAAA;QACnD,OAAO,UAAU,CAAC,eAAe,CAAA;IACnC,CAAC;IACD,IAAI,UAAU,CAAC,iBAAiB,EAAE,CAAC;QACjC,aAAa,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAA;QACnD,OAAO,UAAU,CAAC,iBAAiB,CAAA;IACrC,CAAC;IACD,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAChC,aAAa,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAA;QAClD,OAAO,UAAU,CAAC,eAAe,CAAC,CAAA;IACpC,CAAC;IACD,IAAI,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACpC,aAAa,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAA;QACtD,OAAO,UAAU,CAAC,mBAAmB,CAAC,CAAA;IACxC,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,UAAU,CAAC,aAAa,GAAG,aAAa,CAAA;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClC,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC;QACzB,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM;QAC1E,MAAM;QACN,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,IAAI;QACX,gCAAgC;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QAClE,KAAK,EAAE,IAAI;QACX,SAAS;QACT,yBAAyB;QACzB,YAAY;QACZ,6BAA6B;QAC7B,cAAc;QACd,+BAA+B;QAC/B,gBAAgB;QAChB,kBAAkB;QAClB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;QAClE,gBAAgB,EAAE,EAAE;QACpB,cAAc,EAAE,OAAO,CAAC,QAAQ;YAC9B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC5C,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CACxD;YACH,CAAC,CAAC,EAAE;KACP,CAAC,CAAC,CAAA;AACL,CAAC;AAED,SAAgB,qBAAqB,CACnC,KAAa,EACb,SAAiB;IAEjB,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAA;QAC3C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apollo-annotation/shared",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.20",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"scripts": {
|
|
6
|
-
"start": "tsc --build --watch",
|
|
7
6
|
"build": "yarn clean && tsc --build",
|
|
8
7
|
"clean": "rimraf dist",
|
|
8
|
+
"start": "tsc --build --watch",
|
|
9
9
|
"test": "glob -c \"tsx --test --test-reporter spec \" \"**/*.test.ts\"",
|
|
10
10
|
"test:ci": "NODE_V8_COVERAGE=./coverage glob -c \"tsx --test --test-reporter spec --experimental-test-coverage \" \"**/*.test.ts\""
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@apollo-annotation/common": "^0.1.
|
|
14
|
-
"@apollo-annotation/mst": "^0.1.
|
|
15
|
-
"@apollo-annotation/schemas": "^0.1.
|
|
13
|
+
"@apollo-annotation/common": "^0.1.20",
|
|
14
|
+
"@apollo-annotation/mst": "^0.1.20",
|
|
15
|
+
"@apollo-annotation/schemas": "^0.1.20",
|
|
16
16
|
"@gmod/gff": "1.2.0",
|
|
17
17
|
"@gmod/indexedfasta": "^2.0.4",
|
|
18
18
|
"@jbrowse/core": "^2.13.1",
|
|
@@ -26,8 +26,11 @@
|
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@nestjs/common": "^10.1.0",
|
|
28
28
|
"@nestjs/core": "^10.1.0",
|
|
29
|
+
"@types/chai": "^4.3.19",
|
|
29
30
|
"@types/node": "^18.14.2",
|
|
30
31
|
"@types/rimraf": "^3",
|
|
32
|
+
"chai": "^5.1.1",
|
|
33
|
+
"chai-exclude": "^3.0.0",
|
|
31
34
|
"glob": "^11.0.0",
|
|
32
35
|
"mobx": "^6.6.1",
|
|
33
36
|
"mobx-state-tree": "^5.1.7",
|
|
@@ -18,7 +18,7 @@ export interface SerializedAddAssemblyAndFeaturesFromFileChangeBase
|
|
|
18
18
|
|
|
19
19
|
export interface AddAssemblyAndFeaturesFromFileChangeDetails {
|
|
20
20
|
assemblyName: string
|
|
21
|
-
|
|
21
|
+
fileIds: { fa: string }
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
export interface SerializedAddAssemblyAndFeaturesFromFileChangeSingle
|
|
@@ -53,8 +53,8 @@ export class AddAssemblyAndFeaturesFromFileChange extends FromFileBaseChange {
|
|
|
53
53
|
toJSON(): SerializedAddAssemblyAndFeaturesFromFileChange {
|
|
54
54
|
const { assembly, changes, typeName } = this
|
|
55
55
|
if (changes.length === 1) {
|
|
56
|
-
const [{ assemblyName,
|
|
57
|
-
return { typeName, assembly, assemblyName,
|
|
56
|
+
const [{ assemblyName, fileIds }] = changes
|
|
57
|
+
return { typeName, assembly, assemblyName, fileIds }
|
|
58
58
|
}
|
|
59
59
|
return { typeName, assembly, changes }
|
|
60
60
|
}
|
|
@@ -68,7 +68,8 @@ export class AddAssemblyAndFeaturesFromFileChange extends FromFileBaseChange {
|
|
|
68
68
|
const { assemblyModel, fileModel, filesService, user } = backend
|
|
69
69
|
const { assembly, changes, logger } = this
|
|
70
70
|
for (const change of changes) {
|
|
71
|
-
const { assemblyName,
|
|
71
|
+
const { assemblyName, fileIds } = change
|
|
72
|
+
const fileId = fileIds.fa
|
|
72
73
|
|
|
73
74
|
const { FILE_UPLOAD_FOLDER } = process.env
|
|
74
75
|
if (!FILE_UPLOAD_FOLDER) {
|
|
@@ -90,7 +91,7 @@ export class AddAssemblyAndFeaturesFromFileChange extends FromFileBaseChange {
|
|
|
90
91
|
}
|
|
91
92
|
// Add assembly
|
|
92
93
|
const [newAssemblyDoc] = await assemblyModel.create([
|
|
93
|
-
{ _id: assembly, name: assemblyName, user, status: -1 },
|
|
94
|
+
{ _id: assembly, name: assemblyName, user, status: -1, fileId },
|
|
94
95
|
])
|
|
95
96
|
logger.debug?.(
|
|
96
97
|
`Added new assembly "${assemblyName}", docId "${newAssemblyDoc._id.toHexString()}"`,
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
SerializedAssemblySpecificChange,
|
|
8
8
|
ServerDataStore,
|
|
9
9
|
} from '@apollo-annotation/common'
|
|
10
|
+
import { BgzipIndexedFasta } from '@gmod/indexedfasta'
|
|
10
11
|
|
|
11
12
|
import { FromFileBaseChange } from './FromFileBaseChange'
|
|
12
13
|
|
|
@@ -17,7 +18,7 @@ export interface SerializedAddAssemblyFromFileChangeBase
|
|
|
17
18
|
|
|
18
19
|
export interface AddAssemblyFromFileChangeDetails {
|
|
19
20
|
assemblyName: string
|
|
20
|
-
|
|
21
|
+
fileIds: { fa: string } | { fa: string; fai: string; gzi: string }
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
export interface SerializedAddAssemblyFromFileChangeSingle
|
|
@@ -52,8 +53,8 @@ export class AddAssemblyFromFileChange extends FromFileBaseChange {
|
|
|
52
53
|
toJSON(): SerializedAddAssemblyFromFileChange {
|
|
53
54
|
const { assembly, changes, typeName } = this
|
|
54
55
|
if (changes.length === 1) {
|
|
55
|
-
const [{ assemblyName,
|
|
56
|
-
return { typeName, assembly, assemblyName,
|
|
56
|
+
const [{ assemblyName, fileIds }] = changes
|
|
57
|
+
return { typeName, assembly, assemblyName, fileIds }
|
|
57
58
|
}
|
|
58
59
|
return { typeName, assembly, changes }
|
|
59
60
|
}
|
|
@@ -64,49 +65,133 @@ export class AddAssemblyFromFileChange extends FromFileBaseChange {
|
|
|
64
65
|
* @returns
|
|
65
66
|
*/
|
|
66
67
|
async executeOnServer(backend: ServerDataStore) {
|
|
67
|
-
const {
|
|
68
|
-
const { assembly, changes, logger } = this
|
|
69
|
-
|
|
68
|
+
const { changes } = this
|
|
70
69
|
for (const change of changes) {
|
|
71
|
-
const { assemblyName,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
70
|
+
const { assemblyName, fileIds } = change
|
|
71
|
+
await ('gzi' in fileIds
|
|
72
|
+
? this.executeOnServerIndexed(backend, assemblyName, fileIds)
|
|
73
|
+
: this.executeOnServerFasta(backend, assemblyName, fileIds.fa))
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async executeOnServerIndexed(
|
|
78
|
+
backend: ServerDataStore,
|
|
79
|
+
assemblyName: string,
|
|
80
|
+
fileIds: { fa: string; fai: string; gzi: string },
|
|
81
|
+
) {
|
|
82
|
+
const { CHUNK_SIZE } = process.env
|
|
83
|
+
const customChunkSize = CHUNK_SIZE && Number(CHUNK_SIZE)
|
|
84
|
+
|
|
85
|
+
const { FILE_UPLOAD_FOLDER } = process.env
|
|
86
|
+
if (!FILE_UPLOAD_FOLDER) {
|
|
87
|
+
throw new Error('No FILE_UPLOAD_FOLDER found in .env file')
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const { fa, fai, gzi } = fileIds
|
|
91
|
+
const { assemblyModel, fileModel, filesService, refSeqModel, user } =
|
|
92
|
+
backend
|
|
93
|
+
|
|
94
|
+
const faDoc = await fileModel.findById(fa)
|
|
95
|
+
const faChecksum = faDoc?.checksum
|
|
96
|
+
if (!faChecksum) {
|
|
97
|
+
throw new Error(`No checksum for file document ${faDoc}`)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const faiDoc = await fileModel.findById(fai)
|
|
101
|
+
const faiChecksum = faiDoc?.checksum
|
|
102
|
+
if (!faiChecksum) {
|
|
103
|
+
throw new Error(`No checksum for file document ${faiDoc}`)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const gziDoc = await fileModel.findById(gzi)
|
|
107
|
+
const gziChecksum = gziDoc?.checksum
|
|
108
|
+
if (!gziChecksum) {
|
|
109
|
+
throw new Error(`No checksum for file document ${gziDoc}`)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const sequenceAdapter = new BgzipIndexedFasta({
|
|
113
|
+
fasta: filesService.getFileHandle(faDoc),
|
|
114
|
+
fai: filesService.getFileHandle(faiDoc),
|
|
115
|
+
gzi: filesService.getFileHandle(gziDoc),
|
|
116
|
+
})
|
|
117
|
+
const allSequenceSizes = await sequenceAdapter.getSequenceSizes()
|
|
118
|
+
|
|
119
|
+
const assemblyDoc = await assemblyModel
|
|
120
|
+
.findOne({ name: assemblyName })
|
|
121
|
+
.exec()
|
|
122
|
+
if (assemblyDoc) {
|
|
123
|
+
throw new Error(`Assembly "${assemblyName}" already exists`)
|
|
124
|
+
}
|
|
125
|
+
const [newAssemblyDoc] = await assemblyModel.create([
|
|
126
|
+
{
|
|
127
|
+
_id: this.assembly,
|
|
128
|
+
name: assemblyName,
|
|
129
|
+
user,
|
|
130
|
+
status: -1,
|
|
131
|
+
fileIds,
|
|
132
|
+
},
|
|
133
|
+
])
|
|
134
|
+
this.logger.debug?.(
|
|
135
|
+
`Added new assembly "${assemblyName}", docId "${newAssemblyDoc._id}"`,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
for (const sequenceName in allSequenceSizes) {
|
|
139
|
+
const [newRefSeqDoc] = await refSeqModel.create([
|
|
140
|
+
{
|
|
141
|
+
name: sequenceName,
|
|
142
|
+
assembly: newAssemblyDoc._id,
|
|
143
|
+
length: allSequenceSizes[sequenceName],
|
|
144
|
+
...(customChunkSize ? { chunkSize: customChunkSize } : null),
|
|
145
|
+
user,
|
|
146
|
+
status: -1,
|
|
147
|
+
},
|
|
94
148
|
])
|
|
95
|
-
logger.debug?.(
|
|
96
|
-
`Added new
|
|
97
|
-
)
|
|
98
|
-
logger.debug?.(
|
|
99
|
-
`File type: "${fileDoc.type}", assemblyId: "${newAssemblyDoc._id}"`,
|
|
149
|
+
this.logger.debug?.(
|
|
150
|
+
`Added new refSeq "${sequenceName}", docId "${newRefSeqDoc._id}"`,
|
|
100
151
|
)
|
|
152
|
+
}
|
|
153
|
+
}
|
|
101
154
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
155
|
+
async executeOnServerFasta(
|
|
156
|
+
backend: ServerDataStore,
|
|
157
|
+
assemblyName: string,
|
|
158
|
+
fileId: string,
|
|
159
|
+
) {
|
|
160
|
+
const { assemblyModel, fileModel, user } = backend
|
|
161
|
+
// Get file checksum
|
|
162
|
+
const fileDoc = await fileModel.findById(fileId).exec()
|
|
163
|
+
if (!fileDoc) {
|
|
164
|
+
throw new Error(`File "${fileId}" not found in Mongo`)
|
|
165
|
+
}
|
|
166
|
+
this.logger.debug?.(`FileId "${fileId}", checksum "${fileDoc.checksum}"`)
|
|
167
|
+
|
|
168
|
+
// Check and add new assembly
|
|
169
|
+
const assemblyDoc = await assemblyModel
|
|
170
|
+
.findOne({ name: assemblyName })
|
|
171
|
+
.exec()
|
|
172
|
+
if (assemblyDoc) {
|
|
173
|
+
throw new Error(`Assembly "${assemblyName}" already exists`)
|
|
109
174
|
}
|
|
175
|
+
// Add assembly
|
|
176
|
+
const [newAssemblyDoc] = await assemblyModel.create([
|
|
177
|
+
{
|
|
178
|
+
_id: this.assembly,
|
|
179
|
+
name: assemblyName,
|
|
180
|
+
user,
|
|
181
|
+
status: -1,
|
|
182
|
+
fileIds: { fa: fileId },
|
|
183
|
+
},
|
|
184
|
+
])
|
|
185
|
+
this.logger.debug?.(
|
|
186
|
+
`Added new assembly "${assemblyName}", docId "${newAssemblyDoc._id}"`,
|
|
187
|
+
)
|
|
188
|
+
this.logger.debug?.(
|
|
189
|
+
`File type: "${fileDoc.type}", assemblyId: "${newAssemblyDoc._id}"`,
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
// Add refSeqs
|
|
193
|
+
// We cannot use Mongo 'session' / transaction here because Mongo has 16 MB limit for transaction
|
|
194
|
+
await this.addRefSeqIntoDb(fileDoc, newAssemblyDoc._id.toString(), backend)
|
|
110
195
|
}
|
|
111
196
|
|
|
112
197
|
async executeOnLocalGFF3(_backend: LocalGFF3DataStore) {
|