@opencloning/utils 1.6.0 → 1.7.1
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 +20 -0
- package/package.json +2 -2
- package/src/utils/fileParsers.js +6 -3
- package/src/utils/fileParsers.test.js +19 -0
- package/vitest.config.js +0 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @opencloning/utils
|
|
2
2
|
|
|
3
|
+
## 1.7.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#672](https://github.com/manulera/OpenCloning_frontend/pull/672) [`cfe95f5`](https://github.com/manulera/OpenCloning_frontend/commit/cfe95f5d79a4f147646d46d51b19a155941b2ad8) Thanks [@manulera](https://github.com/manulera)! - Ignore header case when importing primers from tabular file
|
|
8
|
+
|
|
9
|
+
- Updated dependencies []:
|
|
10
|
+
- @opencloning/store@1.7.1
|
|
11
|
+
|
|
12
|
+
## 1.7.0
|
|
13
|
+
|
|
14
|
+
### Minor Changes
|
|
15
|
+
|
|
16
|
+
- [#670](https://github.com/manulera/OpenCloning_frontend/pull/670) [`2943c1c`](https://github.com/manulera/OpenCloning_frontend/commit/2943c1c3a8b29a7081841d8ca9e2b36a2ad14a61) Thanks [@manulera](https://github.com/manulera)! - Fix import structure
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- Updated dependencies [[`2943c1c`](https://github.com/manulera/OpenCloning_frontend/commit/2943c1c3a8b29a7081841d8ca9e2b36a2ad14a61)]:
|
|
21
|
+
- @opencloning/store@1.7.0
|
|
22
|
+
|
|
3
23
|
## 1.6.0
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"license": "MIT",
|
|
3
3
|
"name": "@opencloning/utils",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.7.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./src/utils/index.js",
|
|
7
7
|
"exports": {
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"directory": "packages/utils"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@opencloning/store": "1.
|
|
32
|
+
"@opencloning/store": "1.7.1",
|
|
33
33
|
"@teselagen/bio-parsers": "^0.4.34",
|
|
34
34
|
"@teselagen/sequence-utils": "^0.3.42",
|
|
35
35
|
"@zip.js/zip.js": "^2.7.62",
|
package/src/utils/fileParsers.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { stringIsNotDNA } from '@opencloning/store/cloning_utils';
|
|
2
2
|
import { readSubmittedTextFile } from './readNwrite';
|
|
3
3
|
|
|
4
|
-
export async function delimitedFileToJson(fileUploaded, requiredHeaders = []) {
|
|
4
|
+
export async function delimitedFileToJson(fileUploaded, requiredHeaders = [], ignoreHeaderCase = false) {
|
|
5
5
|
|
|
6
6
|
const fileContent = await readSubmittedTextFile(fileUploaded);
|
|
7
7
|
const allLines = fileContent.split(/\r\n|\r|\n/);
|
|
@@ -26,7 +26,10 @@ export async function delimitedFileToJson(fileUploaded, requiredHeaders = []) {
|
|
|
26
26
|
throw new Error('File is empty');
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
let headers = lines[0].split(delimiter).map((header) => header.trim());
|
|
30
|
+
if (ignoreHeaderCase) {
|
|
31
|
+
headers = headers.map((header) => header.toLowerCase());
|
|
32
|
+
}
|
|
30
33
|
|
|
31
34
|
const missingHeaders = requiredHeaders.filter(
|
|
32
35
|
(header) => !headers.includes(header),
|
|
@@ -51,7 +54,7 @@ export async function delimitedFileToJson(fileUploaded, requiredHeaders = []) {
|
|
|
51
54
|
};
|
|
52
55
|
|
|
53
56
|
export const primersFromTextFile = async (fileUploaded, existingNames) => {
|
|
54
|
-
const primers = await delimitedFileToJson(fileUploaded, ['name', 'sequence']);
|
|
57
|
+
const primers = await delimitedFileToJson(fileUploaded, ['name', 'sequence'], true);
|
|
55
58
|
return primers.map((primer) => {
|
|
56
59
|
if (existingNames.includes(primer.name)) {
|
|
57
60
|
return { ...primer, error: 'existing' };
|
|
@@ -155,6 +155,16 @@ describe('delimitedFileToJson', () => {
|
|
|
155
155
|
{ name: 'primer1', sequence: 'ATGC' }
|
|
156
156
|
]);
|
|
157
157
|
});
|
|
158
|
+
|
|
159
|
+
it('ignores header case if parameter is passed', async () => {
|
|
160
|
+
let file = createFile('Name,Sequence\nprimer1,ATGC', 'test.csv');
|
|
161
|
+
let result = await delimitedFileToJson(file, ['name', 'sequence'], true);
|
|
162
|
+
expect(result).toEqual([
|
|
163
|
+
{ name: 'primer1', sequence: 'ATGC' }
|
|
164
|
+
]);
|
|
165
|
+
file = createFile('Name,Sequence\nprimer1,ATGC', 'test.csv');
|
|
166
|
+
await expect(delimitedFileToJson(file, ['name', 'sequence'])).rejects.toThrow('Headers missing: name, sequence');
|
|
167
|
+
});
|
|
158
168
|
});
|
|
159
169
|
|
|
160
170
|
describe('primersFromTextFile', () => {
|
|
@@ -234,6 +244,15 @@ describe('primersFromTextFile', () => {
|
|
|
234
244
|
|
|
235
245
|
const result = await primersFromTextFile(file, []);
|
|
236
246
|
|
|
247
|
+
expect(result).toEqual([
|
|
248
|
+
{ name: 'primer1', sequence: 'ATGC', error: '' }
|
|
249
|
+
]);
|
|
250
|
+
});
|
|
251
|
+
it('ignores header case', async () => {
|
|
252
|
+
const file = createFile('Name,Sequence\nprimer1,ATGC', 'test.csv');
|
|
253
|
+
|
|
254
|
+
const result = await primersFromTextFile(file, []);
|
|
255
|
+
|
|
237
256
|
expect(result).toEqual([
|
|
238
257
|
{ name: 'primer1', sequence: 'ATGC', error: '' }
|
|
239
258
|
]);
|
package/vitest.config.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { defineConfig } from 'vitest/config';
|
|
2
|
-
import { resolve } from 'path';
|
|
3
2
|
|
|
4
3
|
export default defineConfig({
|
|
5
4
|
test: {
|
|
@@ -8,10 +7,4 @@ export default defineConfig({
|
|
|
8
7
|
setupFiles: '../../tests/setup.js',
|
|
9
8
|
include: ['src/**/*.{test,spec}.{js,jsx}'],
|
|
10
9
|
},
|
|
11
|
-
resolve: {
|
|
12
|
-
alias: {
|
|
13
|
-
'@opencloning/utils': resolve(__dirname, './src/utils'),
|
|
14
|
-
'@opencloning/store': resolve(__dirname, '../store/src'),
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
10
|
});
|