@apollo-annotation/shared 0.3.6 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/Changes/AddAssemblyAliasesChange.d.ts +16 -0
  2. package/dist/Changes/AddAssemblyAliasesChange.js +50 -0
  3. package/dist/Changes/AddAssemblyAliasesChange.js.map +1 -0
  4. package/dist/Changes/AddAssemblyAndFeaturesFromFileChange.js +1 -1
  5. package/dist/Changes/AddAssemblyAndFeaturesFromFileChange.js.map +1 -1
  6. package/dist/Changes/AddAssemblyFromFileChange.js +1 -1
  7. package/dist/Changes/AddAssemblyFromFileChange.js.map +1 -1
  8. package/dist/Changes/AddFeatureChange.d.ts +1 -0
  9. package/dist/Changes/AddFeatureChange.js +5 -25
  10. package/dist/Changes/AddFeatureChange.js.map +1 -1
  11. package/dist/Changes/AddRefSeqAliasesChange.js +2 -4
  12. package/dist/Changes/AddRefSeqAliasesChange.js.map +1 -1
  13. package/dist/Changes/DeleteFeatureChange.d.ts +9 -8
  14. package/dist/Changes/DeleteFeatureChange.js +37 -32
  15. package/dist/Changes/DeleteFeatureChange.js.map +1 -1
  16. package/dist/Changes/FeatureAttributeChange.d.ts +2 -1
  17. package/dist/Changes/FeatureAttributeChange.js +14 -6
  18. package/dist/Changes/FeatureAttributeChange.js.map +1 -1
  19. package/dist/Changes/ImportJBrowseConfigChange.d.ts +3 -0
  20. package/dist/Changes/ImportJBrowseConfigChange.js +17 -13
  21. package/dist/Changes/ImportJBrowseConfigChange.js.map +1 -1
  22. package/dist/Changes/LocationEndChange.js +40 -37
  23. package/dist/Changes/LocationEndChange.js.map +1 -1
  24. package/dist/Changes/LocationStartChange.js +40 -37
  25. package/dist/Changes/LocationStartChange.js.map +1 -1
  26. package/dist/Changes/MergeExonsChange.d.ts +29 -0
  27. package/dist/Changes/MergeExonsChange.js +114 -0
  28. package/dist/Changes/MergeExonsChange.js.map +1 -0
  29. package/dist/Changes/MergeTranscriptsChange.d.ts +34 -0
  30. package/dist/Changes/MergeTranscriptsChange.js +245 -0
  31. package/dist/Changes/MergeTranscriptsChange.js.map +1 -0
  32. package/dist/Changes/SplitExonChange.d.ts +33 -0
  33. package/dist/Changes/SplitExonChange.js +142 -0
  34. package/dist/Changes/SplitExonChange.js.map +1 -0
  35. package/dist/Changes/UndoMergeExonsChange.d.ts +27 -0
  36. package/dist/Changes/UndoMergeExonsChange.js +104 -0
  37. package/dist/Changes/UndoMergeExonsChange.js.map +1 -0
  38. package/dist/Changes/UndoMergeTranscriptsChange.d.ts +27 -0
  39. package/dist/Changes/UndoMergeTranscriptsChange.js +104 -0
  40. package/dist/Changes/UndoMergeTranscriptsChange.js.map +1 -0
  41. package/dist/Changes/UndoSplitExonChange.d.ts +32 -0
  42. package/dist/Changes/UndoSplitExonChange.js +111 -0
  43. package/dist/Changes/UndoSplitExonChange.js.map +1 -0
  44. package/dist/Changes/index.d.ts +21 -0
  45. package/dist/Changes/index.js +21 -0
  46. package/dist/Changes/index.js.map +1 -1
  47. package/dist/Checks/CDSCheck.d.ts +1 -1
  48. package/dist/Checks/CDSCheck.js +8 -9
  49. package/dist/Checks/CDSCheck.js.map +1 -1
  50. package/dist/Checks/TranscriptCheck.d.ts +9 -0
  51. package/dist/Checks/TranscriptCheck.js +109 -0
  52. package/dist/Checks/TranscriptCheck.js.map +1 -0
  53. package/dist/Checks/index.d.ts +1 -0
  54. package/dist/Checks/index.js +1 -0
  55. package/dist/Checks/index.js.map +1 -1
  56. package/dist/GFF3/annotationFeatureToGFF3.js +7 -1
  57. package/dist/GFF3/annotationFeatureToGFF3.js.map +1 -1
  58. package/dist/GFF3/gff3ToAnnotationFeature.test.js +1 -1
  59. package/dist/GFF3/gff3ToAnnotationFeature.test.js.map +1 -1
  60. package/dist/Validations/ParentChildValidation.js +3 -1
  61. package/dist/Validations/ParentChildValidation.js.map +1 -1
  62. package/dist/tsconfig.tsbuildinfo +1 -1
  63. package/dist/util.d.ts +5 -0
  64. package/dist/util.js +46 -0
  65. package/dist/util.js.map +1 -1
  66. package/package.json +7 -7
  67. package/src/Changes/AddAssemblyAliasesChange.ts +69 -0
  68. package/src/Changes/AddAssemblyAndFeaturesFromFileChange.ts +2 -1
  69. package/src/Changes/AddAssemblyFromFileChange.ts +1 -1
  70. package/src/Changes/AddFeatureChange.ts +5 -29
  71. package/src/Changes/AddRefSeqAliasesChange.ts +2 -4
  72. package/src/Changes/DeleteFeatureChange.ts +42 -36
  73. package/src/Changes/FeatureAttributeChange.ts +16 -7
  74. package/src/Changes/ImportJBrowseConfigChange.ts +33 -18
  75. package/src/Changes/LocationEndChange.ts +41 -50
  76. package/src/Changes/LocationStartChange.ts +41 -50
  77. package/src/Changes/MergeExonsChange.ts +201 -0
  78. package/src/Changes/MergeTranscriptsChange.ts +394 -0
  79. package/src/Changes/SplitExonChange.ts +249 -0
  80. package/src/Changes/UndoMergeExonsChange.ts +149 -0
  81. package/src/Changes/UndoMergeTranscriptsChange.ts +153 -0
  82. package/src/Changes/UndoSplitExonChange.ts +174 -0
  83. package/src/Changes/index.ts +21 -0
  84. package/src/Checks/CDSCheck.ts +10 -10
  85. package/src/Checks/TranscriptCheck.ts +139 -0
  86. package/src/Checks/index.ts +1 -0
  87. package/src/GFF3/annotationFeatureToGFF3.ts +7 -1
  88. package/src/GFF3/gff3ToAnnotationFeature.test.ts +1 -1
  89. package/src/Validations/ParentChildValidation.ts +3 -2
  90. package/src/util.ts +53 -0
  91. package/test_data/example01.json +20 -20
  92. package/test_data/example02.json +38 -38
  93. package/test_data/example04.json +57 -57
  94. package/test_data/gene_representations.gff3 +1054 -276
@@ -0,0 +1,245 @@
1
+ "use strict";
2
+ /* eslint-disable unicorn/prefer-structured-clone */
3
+ /* eslint-disable @typescript-eslint/require-await */
4
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MergeTranscriptsChange = void 0;
7
+ const common_1 = require("@apollo-annotation/common");
8
+ const util_1 = require("@jbrowse/core/util");
9
+ const mobx_state_tree_1 = require("mobx-state-tree");
10
+ const util_2 = require("../util");
11
+ const DeleteFeatureChange_1 = require("./DeleteFeatureChange");
12
+ const UndoMergeTranscriptsChange_1 = require("./UndoMergeTranscriptsChange");
13
+ class MergeTranscriptsChange extends common_1.FeatureChange {
14
+ typeName = 'MergeTranscriptsChange';
15
+ changes;
16
+ constructor(json, options) {
17
+ super(json, options);
18
+ this.changes = 'changes' in json ? json.changes : [json];
19
+ }
20
+ // eslint-disable-next-line @typescript-eslint/class-literal-property-style
21
+ get notification() {
22
+ return 'Transcripts successfully merged';
23
+ }
24
+ toJSON() {
25
+ const { assembly, changedIds, changes, typeName } = this;
26
+ if (changes.length === 1) {
27
+ const [{ firstTranscript, secondTranscript, parentFeatureId }] = changes;
28
+ return {
29
+ typeName,
30
+ changedIds,
31
+ assembly,
32
+ firstTranscript,
33
+ secondTranscript,
34
+ parentFeatureId,
35
+ };
36
+ }
37
+ return { typeName, changedIds, assembly, changes };
38
+ }
39
+ async executeOnServer(backend) {
40
+ const { featureModel, session } = backend;
41
+ const { changes, logger } = this;
42
+ for (const change of changes) {
43
+ const { firstTranscript, secondTranscript } = change;
44
+ const topLevelFeature = await featureModel
45
+ .findOne({ allIds: firstTranscript._id })
46
+ .session(session)
47
+ .exec();
48
+ if (!topLevelFeature) {
49
+ const errMsg = `*** ERROR: The following featureId was not found in database ='${firstTranscript._id}'`;
50
+ logger.error(errMsg);
51
+ throw new Error(errMsg);
52
+ }
53
+ const mergedTranscript = this.getFeatureFromId(topLevelFeature, firstTranscript._id);
54
+ if (!mergedTranscript) {
55
+ const errMsg = 'ERROR when searching feature by featureId';
56
+ logger.error(errMsg);
57
+ throw new Error(errMsg);
58
+ }
59
+ this.mergeTranscriptsOnServer(mergedTranscript, secondTranscript);
60
+ const deletedIds = (0, DeleteFeatureChange_1.findAndDeleteChildFeature)(topLevelFeature, secondTranscript._id, this);
61
+ deletedIds.push(secondTranscript._id);
62
+ topLevelFeature.allIds = topLevelFeature.allIds.filter((id) => !deletedIds.includes(id));
63
+ await topLevelFeature.save();
64
+ }
65
+ }
66
+ mergeTranscriptsOnServer(firstTranscript, secondTranscript) {
67
+ firstTranscript.min = Math.min(firstTranscript.min, secondTranscript.min);
68
+ firstTranscript.max = Math.max(firstTranscript.max, secondTranscript.max);
69
+ const mergedAttributes = firstTranscript.attributes
70
+ ? JSON.parse(JSON.stringify(firstTranscript.attributes))
71
+ : {};
72
+ if (secondTranscript.attributes) {
73
+ if (!Object.keys(mergedAttributes).includes('merged_with')) {
74
+ mergedAttributes.merged_with = [];
75
+ }
76
+ mergedAttributes.merged_with.push((0, util_2.stringifyAttributes)((0, util_2.attributesToRecords)(secondTranscript.attributes)));
77
+ }
78
+ firstTranscript.attributes = mergedAttributes;
79
+ if (secondTranscript.children) {
80
+ for (const [, secondFeatureChild] of Object.entries(secondTranscript.children)) {
81
+ this.mergeFeatureIntoTranscriptOnServer(secondFeatureChild, firstTranscript);
82
+ }
83
+ }
84
+ }
85
+ mergeFeatureIntoTranscriptOnServer(secondFeatureChild, firstTranscript) {
86
+ if (!firstTranscript.children) {
87
+ firstTranscript.children = new Map();
88
+ }
89
+ let merged = false;
90
+ let mrgChild;
91
+ let toDelete;
92
+ for (const [, firstFeatureChild] of firstTranscript.children) {
93
+ if (!merged || !mrgChild) {
94
+ toDelete = false;
95
+ mrgChild = firstFeatureChild;
96
+ }
97
+ else {
98
+ toDelete = true;
99
+ }
100
+ if (mrgChild.type === secondFeatureChild.type &&
101
+ mrgChild.type === firstFeatureChild.type &&
102
+ (0, util_1.doesIntersect2)(secondFeatureChild.min, secondFeatureChild.max, mrgChild.min, mrgChild.max) &&
103
+ (0, util_1.doesIntersect2)(firstFeatureChild.min, firstFeatureChild.max, mrgChild.min, mrgChild.max)) {
104
+ mrgChild.min = Math.min(secondFeatureChild.min, mrgChild.min, firstFeatureChild.min);
105
+ mrgChild.max = Math.max(secondFeatureChild.max, mrgChild.max, firstFeatureChild.max);
106
+ if (!mrgChild.attributes) {
107
+ mrgChild.attributes = {};
108
+ }
109
+ const mrgChildAttr = JSON.parse(JSON.stringify(mrgChild.attributes));
110
+ if (!Object.keys(mrgChildAttr).includes('merged_with')) {
111
+ mrgChildAttr.merged_with = [];
112
+ }
113
+ const mergedWithAttributes = mrgChildAttr.merged_with;
114
+ mergedWithAttributes.push((0, util_2.stringifyAttributes)((0, util_2.attributesToRecords)(secondFeatureChild.attributes)));
115
+ if (toDelete) {
116
+ const recs = firstFeatureChild.attributes
117
+ ? JSON.parse(JSON.stringify(firstFeatureChild.attributes))
118
+ : undefined;
119
+ mergedWithAttributes.push((0, util_2.stringifyAttributes)(recs));
120
+ firstTranscript.children.delete(firstFeatureChild._id.toString());
121
+ }
122
+ mrgChildAttr.merged_with = [...new Set(mergedWithAttributes)];
123
+ mrgChild.attributes = mrgChildAttr;
124
+ merged = true;
125
+ }
126
+ }
127
+ if (merged && mrgChild && secondFeatureChild.children) {
128
+ // Add the children of the source feature
129
+ // (secondFeatureChild.children) to the merged feature (mrgChild)
130
+ Object.entries(secondFeatureChild.children).map(([, child]) => {
131
+ this.addChild(mrgChild, child);
132
+ });
133
+ }
134
+ if (merged && mrgChild) {
135
+ this.addChild(firstTranscript, mrgChild);
136
+ }
137
+ else {
138
+ // This secondFeatureChild has no overlap with any feature in the
139
+ // receiving transcript so we add it as it is to the receiving transcript
140
+ this.addChild(firstTranscript, secondFeatureChild);
141
+ }
142
+ }
143
+ /* --------------------------------- */
144
+ async executeOnClient(dataStore) {
145
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
146
+ if (!dataStore) {
147
+ throw new Error('No data store');
148
+ }
149
+ for (const [idx, changedId] of this.changedIds.entries()) {
150
+ const { firstTranscript, secondTranscript } = this.changes[idx];
151
+ const mergedTranscript = dataStore.getFeature(firstTranscript._id);
152
+ if (!mergedTranscript) {
153
+ throw new Error(`Could not find feature with identifier "${changedId}"`);
154
+ }
155
+ this.mergeTranscriptsOnClient(mergedTranscript, secondTranscript);
156
+ mergedTranscript.parent?.deleteChild(secondTranscript._id);
157
+ }
158
+ }
159
+ mergeTranscriptsOnClient(firstTranscript, secondTranscript) {
160
+ firstTranscript.setMin(Math.min(firstTranscript.min, secondTranscript.min));
161
+ firstTranscript.setMax(Math.max(firstTranscript.max, secondTranscript.max));
162
+ const mrg = firstTranscript.attributes.get('merged_with')?.slice() ?? [];
163
+ const mergedWith = (0, util_2.stringifyAttributes)((0, util_2.attributesToRecords)(secondTranscript.attributes));
164
+ if (!mrg.includes(mergedWith)) {
165
+ // executeOnClient runs twice (?!) so avoid adding this key again
166
+ mrg.push(mergedWith);
167
+ }
168
+ firstTranscript.setAttribute('merged_with', mrg);
169
+ if (secondTranscript.children) {
170
+ for (const [, secondFeatureChild] of Object.entries(secondTranscript.children)) {
171
+ this.mergeFeatureIntoTranscriptOnClient(secondFeatureChild, firstTranscript);
172
+ }
173
+ }
174
+ }
175
+ mergeFeatureIntoTranscriptOnClient(secondFeatureChild, firstTranscript) {
176
+ if (!firstTranscript.children) {
177
+ firstTranscript.children = new Map();
178
+ }
179
+ let merged = false;
180
+ let mrgChild;
181
+ let toDelete;
182
+ for (const [, firstFeatureChild] of firstTranscript.children) {
183
+ if (!merged || !mrgChild) {
184
+ toDelete = false;
185
+ mrgChild = firstFeatureChild;
186
+ }
187
+ else {
188
+ toDelete = true;
189
+ }
190
+ if (mrgChild.type === secondFeatureChild.type &&
191
+ mrgChild.type === firstFeatureChild.type &&
192
+ (0, util_1.doesIntersect2)(secondFeatureChild.min, secondFeatureChild.max, mrgChild.min, mrgChild.max) &&
193
+ (0, util_1.doesIntersect2)(firstFeatureChild.min, firstFeatureChild.max, mrgChild.min, mrgChild.max)) {
194
+ mrgChild.setMin(Math.min(secondFeatureChild.min, mrgChild.min, firstFeatureChild.min));
195
+ mrgChild.setMax(Math.max(secondFeatureChild.max, mrgChild.max, firstFeatureChild.max));
196
+ const mergedWithAttributes = mrgChild.attributes.get('merged_with')?.slice() ?? [];
197
+ mergedWithAttributes.push((0, util_2.stringifyAttributes)((0, util_2.attributesToRecords)(secondFeatureChild.attributes)));
198
+ if (toDelete) {
199
+ mergedWithAttributes.push((0, util_2.stringifyAttributes)((0, mobx_state_tree_1.getSnapshot)(firstFeatureChild).attributes));
200
+ firstTranscript.deleteChild(firstFeatureChild._id);
201
+ }
202
+ mrgChild.setAttribute('merged_with', [...new Set(mergedWithAttributes)]);
203
+ merged = true;
204
+ }
205
+ }
206
+ if (merged && mrgChild && secondFeatureChild.children) {
207
+ Object.entries(secondFeatureChild.children).map(([, child]) => {
208
+ mrgChild.addChild(child);
209
+ });
210
+ }
211
+ if (merged && mrgChild) {
212
+ firstTranscript.addChild((0, mobx_state_tree_1.getSnapshot)(mrgChild));
213
+ }
214
+ else {
215
+ // This secondFeatureChild has no overlap with any feature in the
216
+ // receiving transcript so we add it as it is to the receiving transcript
217
+ firstTranscript.addChild(secondFeatureChild);
218
+ }
219
+ }
220
+ async executeOnLocalGFF3(_backend) {
221
+ throw new Error('executeOnLocalGFF3 not implemented');
222
+ }
223
+ getInverse() {
224
+ const { assembly, changedIds, changes, logger } = this;
225
+ const inverseChangedIds = [...changedIds].reverse();
226
+ const inverseChanges = [...changes]
227
+ .reverse()
228
+ .map((mergeTranscriptChange) => ({
229
+ transcriptsToRestore: [
230
+ mergeTranscriptChange.firstTranscript,
231
+ mergeTranscriptChange.secondTranscript,
232
+ ],
233
+ parentFeatureId: mergeTranscriptChange.parentFeatureId,
234
+ }));
235
+ logger.debug?.(`INVERSE CHANGE '${JSON.stringify(inverseChanges)}'`);
236
+ return new UndoMergeTranscriptsChange_1.UndoMergeTranscriptsChange({
237
+ changedIds: inverseChangedIds,
238
+ typeName: 'UndoMergeTranscriptsChange',
239
+ changes: inverseChanges,
240
+ assembly,
241
+ }, { logger });
242
+ }
243
+ }
244
+ exports.MergeTranscriptsChange = MergeTranscriptsChange;
245
+ //# sourceMappingURL=MergeTranscriptsChange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MergeTranscriptsChange.js","sourceRoot":"","sources":["../../src/Changes/MergeTranscriptsChange.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { type ChangeOptions, type ClientDataStore, FeatureChange, type LocalGFF3DataStore, type SerializedFeatureChange, type ServerDataStore } from '@apollo-annotation/common';
2
+ import { type AnnotationFeatureSnapshot } from '@apollo-annotation/mst';
3
+ import { UndoSplitExonChange } from './UndoSplitExonChange';
4
+ interface SerializedSplitExonChangeBase extends SerializedFeatureChange {
5
+ typeName: 'SplitExonChange';
6
+ }
7
+ export interface SplitExonChangeDetails {
8
+ exonToBeSplit: AnnotationFeatureSnapshot;
9
+ parentFeatureId: string;
10
+ upstreamCut: number;
11
+ downstreamCut: number;
12
+ leftExonId: string;
13
+ rightExonId: string;
14
+ }
15
+ interface SerializedSplitExonChangeSingle extends SerializedSplitExonChangeBase, SplitExonChangeDetails {
16
+ }
17
+ interface SerializedSplitExonChangeMultiple extends SerializedSplitExonChangeBase {
18
+ changes: SplitExonChangeDetails[];
19
+ }
20
+ export type SerializedSplitExonChange = SerializedSplitExonChangeSingle | SerializedSplitExonChangeMultiple;
21
+ export declare class SplitExonChange extends FeatureChange {
22
+ typeName: "SplitExonChange";
23
+ changes: SplitExonChangeDetails[];
24
+ constructor(json: SerializedSplitExonChange, options?: ChangeOptions);
25
+ get notification(): string;
26
+ toJSON(): SerializedSplitExonChange;
27
+ executeOnServer(backend: ServerDataStore): Promise<void>;
28
+ executeOnLocalGFF3(_backend: LocalGFF3DataStore): Promise<void>;
29
+ executeOnClient(dataStore: ClientDataStore): Promise<void>;
30
+ getInverse(): UndoSplitExonChange;
31
+ makeSplitExons(exonToBeSplit: AnnotationFeatureSnapshot, upstreamCut: number, downstreamCut: number, leftExonId: string, rightExonId: string): AnnotationFeatureSnapshot[];
32
+ }
33
+ export {};
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/require-await */
3
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.SplitExonChange = void 0;
6
+ const common_1 = require("@apollo-annotation/common");
7
+ const DeleteFeatureChange_1 = require("./DeleteFeatureChange");
8
+ const UndoSplitExonChange_1 = require("./UndoSplitExonChange");
9
+ class SplitExonChange extends common_1.FeatureChange {
10
+ typeName = 'SplitExonChange';
11
+ changes;
12
+ constructor(json, options) {
13
+ super(json, options);
14
+ this.changes = 'changes' in json ? json.changes : [json];
15
+ }
16
+ // eslint-disable-next-line @typescript-eslint/class-literal-property-style
17
+ get notification() {
18
+ return 'Exon successfully split';
19
+ }
20
+ toJSON() {
21
+ const { assembly, changedIds, changes, typeName } = this;
22
+ if (changes.length === 1) {
23
+ const [{ exonToBeSplit, parentFeatureId, upstreamCut, downstreamCut, leftExonId, rightExonId, },] = changes;
24
+ return {
25
+ typeName,
26
+ changedIds,
27
+ assembly,
28
+ exonToBeSplit,
29
+ parentFeatureId,
30
+ upstreamCut,
31
+ downstreamCut,
32
+ leftExonId,
33
+ rightExonId,
34
+ };
35
+ }
36
+ return { typeName, changedIds, assembly, changes };
37
+ }
38
+ async executeOnServer(backend) {
39
+ const { featureModel, session } = backend;
40
+ const { changes, logger } = this;
41
+ for (const change of changes) {
42
+ const { exonToBeSplit, parentFeatureId, upstreamCut, downstreamCut, leftExonId, rightExonId, } = change;
43
+ const topLevelFeature = await featureModel
44
+ .findOne({ allIds: exonToBeSplit._id })
45
+ .session(session)
46
+ .exec();
47
+ if (!topLevelFeature) {
48
+ const errMsg = `*** ERROR: The following featureId was not found in database ='${exonToBeSplit._id}'`;
49
+ logger.error(errMsg);
50
+ throw new Error(errMsg);
51
+ }
52
+ const tx = this.getFeatureFromId(topLevelFeature, parentFeatureId);
53
+ if (!tx?.children) {
54
+ throw new Error('ERROR: There should be at least one child (i.e. the exon to be split)');
55
+ }
56
+ const [leftExon, rightExon] = this.makeSplitExons(exonToBeSplit, upstreamCut, downstreamCut, leftExonId, rightExonId);
57
+ tx.children.set(leftExon._id, {
58
+ allIds: [],
59
+ ...leftExon,
60
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
61
+ // @ts-expect-error
62
+ _id: leftExon._id,
63
+ });
64
+ tx.children.set(rightExon._id, {
65
+ allIds: [],
66
+ ...rightExon,
67
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
68
+ // @ts-expect-error
69
+ _id: rightExon._id,
70
+ });
71
+ // Child features should be sorted for click and drag of gene glyphs to work properly
72
+ tx.children = new Map([...tx.children.entries()].sort((a, b) => a[1].min - b[1].min));
73
+ const deletedIds = (0, DeleteFeatureChange_1.findAndDeleteChildFeature)(topLevelFeature, exonToBeSplit._id, this);
74
+ deletedIds.push(exonToBeSplit._id);
75
+ topLevelFeature.allIds = topLevelFeature.allIds.filter((id) => !deletedIds.includes(id));
76
+ topLevelFeature.allIds.push(leftExon._id, rightExon._id);
77
+ await topLevelFeature.save();
78
+ }
79
+ }
80
+ async executeOnLocalGFF3(_backend) {
81
+ throw new Error('executeOnLocalGFF3 not implemented');
82
+ }
83
+ async executeOnClient(dataStore) {
84
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
85
+ if (!dataStore) {
86
+ throw new Error('No data store');
87
+ }
88
+ for (const [idx] of this.changedIds.entries()) {
89
+ const { exonToBeSplit, parentFeatureId, upstreamCut, downstreamCut, leftExonId, rightExonId, } = this.changes[idx];
90
+ if (!parentFeatureId) {
91
+ throw new Error('TODO: Split exon without parent');
92
+ }
93
+ const [leftExon, rightExon] = this.makeSplitExons(exonToBeSplit, upstreamCut, downstreamCut, leftExonId, rightExonId);
94
+ const parentFeature = dataStore.getFeature(parentFeatureId);
95
+ if (!parentFeature) {
96
+ throw new Error(`Could not find parent feature "${parentFeatureId}"`);
97
+ }
98
+ parentFeature.addChild(leftExon);
99
+ parentFeature.addChild(rightExon);
100
+ if (dataStore.getFeature(exonToBeSplit._id)) {
101
+ dataStore.deleteFeature(exonToBeSplit._id);
102
+ }
103
+ }
104
+ }
105
+ getInverse() {
106
+ const { assembly, changedIds, changes, logger } = this;
107
+ const inverseChangedIds = [...changedIds].reverse();
108
+ const inverseChanges = [...changes].reverse().map((splitExonChange) => ({
109
+ exonToRestore: splitExonChange.exonToBeSplit,
110
+ parentFeatureId: splitExonChange.parentFeatureId,
111
+ idsToDelete: [splitExonChange.leftExonId, splitExonChange.rightExonId],
112
+ upstreamCut: splitExonChange.upstreamCut,
113
+ downstreamCut: splitExonChange.downstreamCut,
114
+ leftExonId: splitExonChange.leftExonId,
115
+ rightExonId: splitExonChange.rightExonId,
116
+ }));
117
+ logger.debug?.(`INVERSE CHANGE '${JSON.stringify(inverseChanges)}'`);
118
+ return new UndoSplitExonChange_1.UndoSplitExonChange({
119
+ changedIds: inverseChangedIds,
120
+ typeName: 'UndoSplitExonChange',
121
+ changes: inverseChanges,
122
+ assembly,
123
+ }, { logger });
124
+ }
125
+ makeSplitExons(exonToBeSplit, upstreamCut, downstreamCut, leftExonId, rightExonId) {
126
+ // eslint-disable-next-line unicorn/prefer-structured-clone
127
+ const exon = JSON.parse(JSON.stringify(exonToBeSplit));
128
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
129
+ delete exon.attributes._id;
130
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
131
+ delete exon.attributes.gff_id;
132
+ const leftExon = structuredClone(exon);
133
+ leftExon._id = leftExonId;
134
+ leftExon.max = upstreamCut;
135
+ const rightExon = structuredClone(exon);
136
+ rightExon.min = downstreamCut;
137
+ rightExon._id = rightExonId;
138
+ return [leftExon, rightExon];
139
+ }
140
+ }
141
+ exports.SplitExonChange = SplitExonChange;
142
+ //# sourceMappingURL=SplitExonChange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplitExonChange.js","sourceRoot":"","sources":["../../src/Changes/SplitExonChange.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type ChangeOptions, type ClientDataStore, FeatureChange, type LocalGFF3DataStore, type SerializedFeatureChange, type ServerDataStore } from '@apollo-annotation/common';
2
+ import { type AnnotationFeatureSnapshot } from '@apollo-annotation/mst';
3
+ import { MergeExonsChange } from './MergeExonsChange';
4
+ interface SerializedUndoMergeExonsChangeBase extends SerializedFeatureChange {
5
+ typeName: 'UndoMergeExonsChange';
6
+ }
7
+ export interface UndoMergeExonsChangeDetails {
8
+ exonsToRestore: AnnotationFeatureSnapshot[];
9
+ parentFeatureId: string;
10
+ }
11
+ interface SerializedUndoMergeExonsChangeSingle extends SerializedUndoMergeExonsChangeBase, UndoMergeExonsChangeDetails {
12
+ }
13
+ interface SerializedUndoMergeExonsChangeMultiple extends SerializedUndoMergeExonsChangeBase {
14
+ changes: UndoMergeExonsChangeDetails[];
15
+ }
16
+ export type SerializedUndoMergeExonsChange = SerializedUndoMergeExonsChangeSingle | SerializedUndoMergeExonsChangeMultiple;
17
+ export declare class UndoMergeExonsChange extends FeatureChange {
18
+ typeName: "UndoMergeExonsChange";
19
+ changes: UndoMergeExonsChangeDetails[];
20
+ constructor(json: SerializedUndoMergeExonsChange, options?: ChangeOptions);
21
+ toJSON(): SerializedUndoMergeExonsChange;
22
+ executeOnServer(backend: ServerDataStore): Promise<void>;
23
+ executeOnLocalGFF3(_backend: LocalGFF3DataStore): Promise<void>;
24
+ executeOnClient(dataStore: ClientDataStore): Promise<void>;
25
+ getInverse(): MergeExonsChange;
26
+ }
27
+ export {};
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/require-await */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.UndoMergeExonsChange = void 0;
5
+ const common_1 = require("@apollo-annotation/common");
6
+ const MergeExonsChange_1 = require("./MergeExonsChange");
7
+ class UndoMergeExonsChange extends common_1.FeatureChange {
8
+ typeName = 'UndoMergeExonsChange';
9
+ changes;
10
+ constructor(json, options) {
11
+ super(json, options);
12
+ this.changes = 'changes' in json ? json.changes : [json];
13
+ }
14
+ toJSON() {
15
+ const { assembly, changedIds, changes, typeName } = this;
16
+ if (changes.length === 1) {
17
+ const [{ exonsToRestore, parentFeatureId }] = changes;
18
+ return {
19
+ typeName,
20
+ changedIds,
21
+ assembly,
22
+ exonsToRestore,
23
+ parentFeatureId,
24
+ };
25
+ }
26
+ return { typeName, changedIds, assembly, changes };
27
+ }
28
+ async executeOnServer(backend) {
29
+ const { featureModel, session } = backend;
30
+ const { changes } = this;
31
+ for (const change of changes) {
32
+ const { exonsToRestore, parentFeatureId } = change;
33
+ if (exonsToRestore.length !== 2) {
34
+ throw new Error(`Expected exactly two exons to restore. Got :${exonsToRestore.length}`);
35
+ }
36
+ const topLevelFeature = await featureModel
37
+ .findOne({ allIds: parentFeatureId })
38
+ .session(session)
39
+ .exec();
40
+ if (!topLevelFeature) {
41
+ throw new Error(`Could not find feature with ID "${parentFeatureId}"`);
42
+ }
43
+ const parentFeature = this.getFeatureFromId(topLevelFeature, parentFeatureId);
44
+ if (!parentFeature) {
45
+ throw new Error(`Could not find feature with ID "${parentFeatureId}" in feature "${topLevelFeature._id.toString()}"`);
46
+ }
47
+ if (!parentFeature.children) {
48
+ parentFeature.children = new Map();
49
+ }
50
+ for (const exon of exonsToRestore) {
51
+ this.addChild(parentFeature, exon);
52
+ const childIds = this.getChildFeatureIds(exon);
53
+ topLevelFeature.allIds.push(exon._id, ...childIds);
54
+ }
55
+ await topLevelFeature.save();
56
+ }
57
+ }
58
+ async executeOnLocalGFF3(_backend) {
59
+ throw new Error('executeOnLocalGFF3 not implemented');
60
+ }
61
+ async executeOnClient(dataStore) {
62
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
63
+ if (!dataStore) {
64
+ throw new Error('No data store');
65
+ }
66
+ const { changes } = this;
67
+ for (const change of changes) {
68
+ const { exonsToRestore, parentFeatureId } = change;
69
+ if (!parentFeatureId) {
70
+ throw new Error('Parent ID is missing');
71
+ }
72
+ const parentFeature = dataStore.getFeature(parentFeatureId);
73
+ if (!parentFeature) {
74
+ throw new Error(`Could not find parent feature "${parentFeatureId}"`);
75
+ }
76
+ // create an ID for the parent feature if it does not have one
77
+ if (!parentFeature.attributes.get('_id')) {
78
+ parentFeature.setAttribute('_id', [parentFeature._id]);
79
+ }
80
+ for (const exon of exonsToRestore) {
81
+ parentFeature.addChild(exon);
82
+ }
83
+ }
84
+ }
85
+ getInverse() {
86
+ const { assembly, changedIds, changes, logger } = this;
87
+ const inverseChangedIds = [...changedIds].reverse();
88
+ const inverseChanges = [...changes]
89
+ .reverse()
90
+ .map((undoMergeExonsChange) => ({
91
+ firstExon: undoMergeExonsChange.exonsToRestore[0],
92
+ secondExon: undoMergeExonsChange.exonsToRestore[1],
93
+ parentFeatureId: undoMergeExonsChange.parentFeatureId,
94
+ }));
95
+ return new MergeExonsChange_1.MergeExonsChange({
96
+ changedIds: inverseChangedIds,
97
+ typeName: 'MergeExonsChange',
98
+ changes: inverseChanges,
99
+ assembly,
100
+ }, { logger });
101
+ }
102
+ }
103
+ exports.UndoMergeExonsChange = UndoMergeExonsChange;
104
+ //# sourceMappingURL=UndoMergeExonsChange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UndoMergeExonsChange.js","sourceRoot":"","sources":["../../src/Changes/UndoMergeExonsChange.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type ChangeOptions, type ClientDataStore, FeatureChange, type LocalGFF3DataStore, type SerializedFeatureChange, type ServerDataStore } from '@apollo-annotation/common';
2
+ import { type AnnotationFeatureSnapshot } from '@apollo-annotation/mst';
3
+ import { MergeTranscriptsChange } from './MergeTranscriptsChange';
4
+ interface SerializedUndoMergeTranscriptsChangeBase extends SerializedFeatureChange {
5
+ typeName: 'UndoMergeTranscriptsChange';
6
+ }
7
+ export interface UndoMergeTranscriptsChangeDetails {
8
+ transcriptsToRestore: AnnotationFeatureSnapshot[];
9
+ parentFeatureId: string;
10
+ }
11
+ interface SerializedUndoMergeTranscriptsChangeSingle extends SerializedUndoMergeTranscriptsChangeBase, UndoMergeTranscriptsChangeDetails {
12
+ }
13
+ interface SerializedUndoMergeTranscriptsChangeMultiple extends SerializedUndoMergeTranscriptsChangeBase {
14
+ changes: UndoMergeTranscriptsChangeDetails[];
15
+ }
16
+ export type SerializedUndoMergeTranscriptsChange = SerializedUndoMergeTranscriptsChangeSingle | SerializedUndoMergeTranscriptsChangeMultiple;
17
+ export declare class UndoMergeTranscriptsChange extends FeatureChange {
18
+ typeName: "UndoMergeTranscriptsChange";
19
+ changes: UndoMergeTranscriptsChangeDetails[];
20
+ constructor(json: SerializedUndoMergeTranscriptsChange, options?: ChangeOptions);
21
+ toJSON(): SerializedUndoMergeTranscriptsChange;
22
+ executeOnServer(backend: ServerDataStore): Promise<void>;
23
+ executeOnLocalGFF3(_backend: LocalGFF3DataStore): Promise<void>;
24
+ executeOnClient(dataStore: ClientDataStore): Promise<void>;
25
+ getInverse(): MergeTranscriptsChange;
26
+ }
27
+ export {};