@apollo-annotation/shared 0.1.19 → 0.1.21
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 +86 -0
- package/dist/Changes/AddAssemblyAndFeaturesFromFileChange.js.map +1 -0
- package/dist/Changes/AddAssemblyFromExternalChange.d.ts +34 -0
- package/dist/Changes/AddAssemblyFromExternalChange.js +100 -0
- package/dist/Changes/AddAssemblyFromExternalChange.js.map +1 -0
- package/dist/Changes/AddAssemblyFromFileChange.d.ts +43 -0
- package/dist/Changes/AddAssemblyFromFileChange.js +146 -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 +10 -6
- package/src/Changes/AddAssemblyFromExternalChange.ts +4 -1
- package/src/Changes/AddAssemblyFromFileChange.ts +138 -41
- package/src/Changes/ImportJBrowseConfigChange.ts +2 -1
- 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":"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"}
|
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apollo-annotation/shared",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.21",
|
|
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.21",
|
|
14
|
+
"@apollo-annotation/mst": "^0.1.21",
|
|
15
|
+
"@apollo-annotation/schemas": "^0.1.21",
|
|
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
|
}
|
|
@@ -65,10 +65,11 @@ export class AddAssemblyAndFeaturesFromFileChange extends FromFileBaseChange {
|
|
|
65
65
|
* @returns
|
|
66
66
|
*/
|
|
67
67
|
async executeOnServer(backend: ServerDataStore) {
|
|
68
|
-
const { assemblyModel, fileModel, filesService, user } = backend
|
|
68
|
+
const { assemblyModel, checkModel, 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) {
|
|
@@ -88,9 +89,12 @@ export class AddAssemblyAndFeaturesFromFileChange extends FromFileBaseChange {
|
|
|
88
89
|
if (assemblyDoc) {
|
|
89
90
|
throw new Error(`Assembly "${assemblyName}" already exists`)
|
|
90
91
|
}
|
|
92
|
+
// get checks
|
|
93
|
+
const checkDocs = await checkModel.find({ default: true }).exec()
|
|
94
|
+
const checks = checkDocs.map((checkDoc) => checkDoc._id.toHexString())
|
|
91
95
|
// Add assembly
|
|
92
96
|
const [newAssemblyDoc] = await assemblyModel.create([
|
|
93
|
-
{ _id: assembly, name: assemblyName, user, status: -1 },
|
|
97
|
+
{ _id: assembly, name: assemblyName, user, status: -1, fileId, checks },
|
|
94
98
|
])
|
|
95
99
|
logger.debug?.(
|
|
96
100
|
`Added new assembly "${assemblyName}", docId "${newAssemblyDoc._id.toHexString()}"`,
|
|
@@ -67,7 +67,7 @@ export class AddAssemblyFromExternalChange extends AssemblySpecificChange {
|
|
|
67
67
|
* @returns
|
|
68
68
|
*/
|
|
69
69
|
async executeOnServer(backend: ServerDataStore) {
|
|
70
|
-
const { assemblyModel, refSeqModel, user } = backend
|
|
70
|
+
const { assemblyModel, checkModel, refSeqModel, user } = backend
|
|
71
71
|
const { assembly, changes, logger } = this
|
|
72
72
|
const { CHUNK_SIZE } = process.env
|
|
73
73
|
const customChunkSize = CHUNK_SIZE && Number(CHUNK_SIZE)
|
|
@@ -97,6 +97,8 @@ export class AddAssemblyFromExternalChange extends AssemblySpecificChange {
|
|
|
97
97
|
if (assemblyDoc) {
|
|
98
98
|
throw new Error(`Assembly "${assemblyName}" already exists`)
|
|
99
99
|
}
|
|
100
|
+
const checkDocs = await checkModel.find({ default: true }).exec()
|
|
101
|
+
const checks = checkDocs.map((checkDoc) => checkDoc._id.toHexString())
|
|
100
102
|
const [newAssemblyDoc] = await assemblyModel.create([
|
|
101
103
|
{
|
|
102
104
|
_id: assembly,
|
|
@@ -104,6 +106,7 @@ export class AddAssemblyFromExternalChange extends AssemblySpecificChange {
|
|
|
104
106
|
user,
|
|
105
107
|
status: -1,
|
|
106
108
|
externalLocation,
|
|
109
|
+
checks,
|
|
107
110
|
},
|
|
108
111
|
])
|
|
109
112
|
logger.debug?.(
|
|
@@ -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,145 @@ 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 {
|
|
92
|
+
assemblyModel,
|
|
93
|
+
checkModel,
|
|
94
|
+
fileModel,
|
|
95
|
+
filesService,
|
|
96
|
+
refSeqModel,
|
|
97
|
+
user,
|
|
98
|
+
} = backend
|
|
99
|
+
|
|
100
|
+
const faDoc = await fileModel.findById(fa)
|
|
101
|
+
const faChecksum = faDoc?.checksum
|
|
102
|
+
if (!faChecksum) {
|
|
103
|
+
throw new Error(`No checksum for file document ${faDoc}`)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const faiDoc = await fileModel.findById(fai)
|
|
107
|
+
const faiChecksum = faiDoc?.checksum
|
|
108
|
+
if (!faiChecksum) {
|
|
109
|
+
throw new Error(`No checksum for file document ${faiDoc}`)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const gziDoc = await fileModel.findById(gzi)
|
|
113
|
+
const gziChecksum = gziDoc?.checksum
|
|
114
|
+
if (!gziChecksum) {
|
|
115
|
+
throw new Error(`No checksum for file document ${gziDoc}`)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const sequenceAdapter = new BgzipIndexedFasta({
|
|
119
|
+
fasta: filesService.getFileHandle(faDoc),
|
|
120
|
+
fai: filesService.getFileHandle(faiDoc),
|
|
121
|
+
gzi: filesService.getFileHandle(gziDoc),
|
|
122
|
+
})
|
|
123
|
+
const allSequenceSizes = await sequenceAdapter.getSequenceSizes()
|
|
124
|
+
|
|
125
|
+
const assemblyDoc = await assemblyModel
|
|
126
|
+
.findOne({ name: assemblyName })
|
|
127
|
+
.exec()
|
|
128
|
+
if (assemblyDoc) {
|
|
129
|
+
throw new Error(`Assembly "${assemblyName}" already exists`)
|
|
130
|
+
}
|
|
131
|
+
const checkDocs = await checkModel.find({ default: true }).exec()
|
|
132
|
+
const checks = checkDocs.map((checkDoc) => checkDoc._id.toHexString())
|
|
133
|
+
const [newAssemblyDoc] = await assemblyModel.create([
|
|
134
|
+
{
|
|
135
|
+
_id: this.assembly,
|
|
136
|
+
name: assemblyName,
|
|
137
|
+
user,
|
|
138
|
+
status: -1,
|
|
139
|
+
fileIds,
|
|
140
|
+
checks,
|
|
141
|
+
},
|
|
142
|
+
])
|
|
143
|
+
this.logger.debug?.(
|
|
144
|
+
`Added new assembly "${assemblyName}", docId "${newAssemblyDoc._id}"`,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
for (const sequenceName in allSequenceSizes) {
|
|
148
|
+
const [newRefSeqDoc] = await refSeqModel.create([
|
|
149
|
+
{
|
|
150
|
+
name: sequenceName,
|
|
151
|
+
assembly: newAssemblyDoc._id,
|
|
152
|
+
length: allSequenceSizes[sequenceName],
|
|
153
|
+
...(customChunkSize ? { chunkSize: customChunkSize } : null),
|
|
154
|
+
user,
|
|
155
|
+
status: -1,
|
|
156
|
+
},
|
|
94
157
|
])
|
|
95
|
-
logger.debug?.(
|
|
96
|
-
`Added new
|
|
97
|
-
)
|
|
98
|
-
logger.debug?.(
|
|
99
|
-
`File type: "${fileDoc.type}", assemblyId: "${newAssemblyDoc._id}"`,
|
|
158
|
+
this.logger.debug?.(
|
|
159
|
+
`Added new refSeq "${sequenceName}", docId "${newRefSeqDoc._id}"`,
|
|
100
160
|
)
|
|
161
|
+
}
|
|
162
|
+
}
|
|
101
163
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
164
|
+
async executeOnServerFasta(
|
|
165
|
+
backend: ServerDataStore,
|
|
166
|
+
assemblyName: string,
|
|
167
|
+
fileId: string,
|
|
168
|
+
) {
|
|
169
|
+
const { assemblyModel, checkModel, fileModel, user } = backend
|
|
170
|
+
// Get file checksum
|
|
171
|
+
const fileDoc = await fileModel.findById(fileId).exec()
|
|
172
|
+
if (!fileDoc) {
|
|
173
|
+
throw new Error(`File "${fileId}" not found in Mongo`)
|
|
174
|
+
}
|
|
175
|
+
this.logger.debug?.(`FileId "${fileId}", checksum "${fileDoc.checksum}"`)
|
|
176
|
+
|
|
177
|
+
// Check and add new assembly
|
|
178
|
+
const assemblyDoc = await assemblyModel
|
|
179
|
+
.findOne({ name: assemblyName })
|
|
180
|
+
.exec()
|
|
181
|
+
if (assemblyDoc) {
|
|
182
|
+
throw new Error(`Assembly "${assemblyName}" already exists`)
|
|
109
183
|
}
|
|
184
|
+
const checkDocs = await checkModel.find({ default: true }).exec()
|
|
185
|
+
const checks = checkDocs.map((checkDoc) => checkDoc._id.toHexString())
|
|
186
|
+
// Add assembly
|
|
187
|
+
const [newAssemblyDoc] = await assemblyModel.create([
|
|
188
|
+
{
|
|
189
|
+
_id: this.assembly,
|
|
190
|
+
name: assemblyName,
|
|
191
|
+
user,
|
|
192
|
+
status: -1,
|
|
193
|
+
fileIds: { fa: fileId },
|
|
194
|
+
checks,
|
|
195
|
+
},
|
|
196
|
+
])
|
|
197
|
+
this.logger.debug?.(
|
|
198
|
+
`Added new assembly "${assemblyName}", docId "${newAssemblyDoc._id}"`,
|
|
199
|
+
)
|
|
200
|
+
this.logger.debug?.(
|
|
201
|
+
`File type: "${fileDoc.type}", assemblyId: "${newAssemblyDoc._id}"`,
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
// Add refSeqs
|
|
205
|
+
// We cannot use Mongo 'session' / transaction here because Mongo has 16 MB limit for transaction
|
|
206
|
+
await this.addRefSeqIntoDb(fileDoc, newAssemblyDoc._id.toString(), backend)
|
|
110
207
|
}
|
|
111
208
|
|
|
112
209
|
async executeOnLocalGFF3(_backend: LocalGFF3DataStore) {
|
|
@@ -39,7 +39,8 @@ export interface SerializedImportJBrowseConfigChange {
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
export function filterJBrowseConfig(config: JBrowseConfig): JBrowseConfig {
|
|
42
|
-
const { assemblies, internetAccounts, plugins, tracks, ...rest } =
|
|
42
|
+
const { __v, _id, assemblies, internetAccounts, plugins, tracks, ...rest } =
|
|
43
|
+
config
|
|
43
44
|
const filteredAssemblies = assemblies?.filter(
|
|
44
45
|
(a) => a.sequence.adapter.type !== 'ApolloSequenceAdapter',
|
|
45
46
|
)
|