From 0c0338280a44df7590ebf76710fdb44acb7d361c Mon Sep 17 00:00:00 2001 From: Kevin F Date: Mon, 9 Oct 2023 16:14:37 +0200 Subject: [PATCH 1/6] Start with docs in f# and js :books: --- docs/ARC.md | 128 +++ docs/GettingStarted.md | 72 ++ docs/scripts_fsharp/ARC.fsx | 49 + docs/scripts_js/ARC.js | 45 + docs/scripts_js/package-lock.json | 995 ++++++++++++++++++ docs/scripts_js/package.json | 15 + package-lock.json | 1594 ++++++++++++++++++++++++++++- package.json | 5 +- 8 files changed, 2855 insertions(+), 48 deletions(-) create mode 100644 docs/ARC.md create mode 100644 docs/GettingStarted.md create mode 100644 docs/scripts_fsharp/ARC.fsx create mode 100644 docs/scripts_js/ARC.js create mode 100644 docs/scripts_js/package-lock.json create mode 100644 docs/scripts_js/package.json diff --git a/docs/ARC.md b/docs/ARC.md new file mode 100644 index 00000000..1de14fa2 --- /dev/null +++ b/docs/ARC.md @@ -0,0 +1,128 @@ +# ARC + +🔗 The script files for this documentation can be found here: +- [JavaScript](/scripts_js/ARC.js) +- [F#](/scripts_fsharp/ARC.fsx) + +Table of Content +- [Create ARC](#create) +- [Write ARC](#write) + +## Create + +ARCtrl aims to provide an easy solution to create and manipulate ARCs in memory. + +```fsharp +// F# +#r "nuget: FsSpreadsheet.ExcelIO, 4.1.0" +#r "nuget: ARCtrl, 1.0.0-alpha9" + +open ARCtrl + +/// Init a new empty ARC +let arc = ARC() +``` + +```js +// JavaScript +import {ARC} from "@nfdi4plants/arctrl"; + +let arc = new ARC() +``` + +This will initialize an ARC without metadata but with the basic ARC folder structure in `arc.FileSystem` + +- 📁 ARC root + - 📄 isa.investigation.xlsx + - 📁 workflows + - 📁 runs + - 📁 assays + - 📁 studies + +## Write + +In .NET you can use [ARCtrl.NET][1] to handle any contract based read/write operations. For this documentation we will extract the relevant ARCtrl.NET functions. + +```fsharp +// F# +open ARCtrl.Contract +open FsSpreadsheet +open FsSpreadsheet.ExcelIO + +let arcRootPath = @"path/where/you/want/the/NewTestARC" + +// From ARCtrl.NET +let fulfillWriteContract basePath (c : Contract) = + let ensureDirectory (filePath : string) = + let file = new System.IO.FileInfo(filePath); + file.Directory.Create() + match c.DTO with + | Some (DTO.Spreadsheet wb) -> + let path = System.IO.Path.Combine(basePath, c.Path) + ensureDirectory path + FsWorkbook.toFile path (wb :?> FsWorkbook) + | Some (DTO.Text t) -> + let path = System.IO.Path.Combine(basePath, c.Path) + ensureDirectory path + System.IO.File.WriteAllText(path,t) + | None -> + let path = System.IO.Path.Combine(basePath, c.Path) + ensureDirectory path + System.IO.File.Create(path).Close() + | _ -> + printfn "Contract %s is not an ISA contract" c.Path + +// From ARCtrl.NET +let write (arcPath: string) (arc:ARC) = + arc.GetWriteContracts() + |> Array.iter (fulfillWriteContract arcPath) + +write arcRootPath arc +``` + +```js +// JavaScript +import {ARC} from "@nfdi4plants/arctrl"; +import {Xlsx} from "fsspreadsheet"; +import fs from "fs"; +import path from "path"; + +// Write +const arcRootPath = "C:/Users/Kevin/Desktop/NewTestARCJS" + +async function fulfillWriteContract (basePath, contract) { + function ensureDirectory (filePath) { + let dirPath = path.dirname(filePath) + if (!fs.existsSync(dirPath)){ + fs.mkdirSync(dirPath, { recursive: true }); + } + } + const p = path.join(basePath,contract.Path) + if (contract.Operation = "CREATE") { + if (contract.DTO == undefined) { + ensureDirectory(p) + fs.writeFileSync(p, "") + } else if (contract.DTOType == "ISA_Assay" || contract.DTOType == "ISA_Assay" || "ISA_Investigation") { + ensureDirectory(p) + await Xlsx.toFile(p, contract.DTO) + console.log("ISA", p) + } else if (contract.DTOType == "PlainText") { + ensureDirectory(p) + fs.writeFileSync(p, contract.DTO) + } else { + console.log("Warning: The given contract is not a correct ARC write contract: ", contract) + } + } +} + +async function write(arcPath, arc) { + let contracts = arc.GetWriteContracts() + contracts.forEach(async contract => { + await fulfillWriteContract(arcPath,contract) + }); +} + +await write(arcRootPath,arc) +``` + +[1]: "ARCtrl.NET Nuget" \ No newline at end of file diff --git a/docs/GettingStarted.md b/docs/GettingStarted.md new file mode 100644 index 00000000..d40182fe --- /dev/null +++ b/docs/GettingStarted.md @@ -0,0 +1,72 @@ +# Getting Started + +- [Setup - .NET](#setup---net) +- [Setup - JavaScript](#setup---javascript) + +## Setup - .NET + +1. Install [.NET SDK](https://dotnet.microsoft.com/en-us/download). +2. Get the [ARCtrl nuget package](www.nuget.org/packages/ARCtrl). +3. (*OPTIONAL*) Use [FsSpreadsheet.ExcelIO](https://www.nuget.org/packages/FsSpreadsheet.ExcelIO) to get any xlsx files into the correct format with our supported readers. +4. (*OPTIONAL*) You can use contract handling from [ARCtrl.NET](https://www.nuget.org/packages/ARCtrl.NET). + +Thats it! 🎉 + +For any documentation we assume using ARCtrl from a .fsx file. Verify correct setup by creating a `ARC.fsx` file with the following content + +```fsharp +#r "nuget: FsSpreadsheet.ExcelIO, 4.1.0" +#r "nuget: ARCtrl, 1.0.0-alpha9" + +open ARCtrl + +printfn "%A" <| ARC() +// > printfn "%A" <| ARC();; +// ARCtrl.ARC +// val it: unit = () +``` + +You can open and run this code from [VisualStudio Code](https://code.visualstudio.com) with the [Ionide](https://ionide.io) extension. Running the code should return the result written as comment at the end of the file. + +## Setup - JavaScript + +1. Install [nodejs](https://nodejs.dev/en/download/) +2. Create folder and inside run `npm init`. + - This will trigger a chain of questions creating a `package.json` file. Answer them as you see fit. +3. Edit the `package.json` file to include ``"type": "module"``. This allows us to use `import` syntax ([read more](https://nodejs.org/docs/latest-v13.x/api/esm.html#esm_enabling)). +4. Install the npm package [@nfdi4plants/arctrl](https://www.npmjs.com/package/@nfdi4plants/arctrl) with `npm i @nfdi4plants/arctrl`. +5. (*OPTIONAL*) Install the npm package [fsspreadsheet](https://www.npmjs.com/package/fsspreadsheet) with `npm i fsspreadsheet`. + - This will be moved to the `@fslab` organisation soon! + +Thats it! 🎉 + +Your `package.json` might look similiar to this: + +```json +{ + "name": "docs", + "version": "1.0.0", + "description": "This subproject is only used to create test script used for documentation", + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Kevin Frey", + "license": "MIT", + "dependencies": { + "@nfdi4plants/arctrl": "^1.0.0-alpha9", + "fsspreadsheet": "^4.0.0-alpha2" + } +} +``` + +You can now reference ARCtrl in any `.js` file and run it with `node path/to/Any.js`. + +Verify correct setup by creating `ARC.js` file with the content from below in the same folder, which contains your `package.json`. Then run `node ./Arc.js`. This will print `[class ARC]` into the console. + +```js +// ARC.js +import {ARC} from "@nfdi4plants/arctrl"; + +console.log(ARC) // [class ARC] +``` \ No newline at end of file diff --git a/docs/scripts_fsharp/ARC.fsx b/docs/scripts_fsharp/ARC.fsx new file mode 100644 index 00000000..0a3ed36b --- /dev/null +++ b/docs/scripts_fsharp/ARC.fsx @@ -0,0 +1,49 @@ +#r "nuget: FsSpreadsheet.ExcelIO, 4.1.0" +#r "nuget: ARCtrl, 1.0.0-alpha9" + +// # Create + +open ARCtrl + +/// Init a new empty ARC +let arc = ARC() + +arc.FileSystem + +// # Write + +open ARCtrl.Contract +open FsSpreadsheet +open FsSpreadsheet.ExcelIO + +let arcRootPath = @"C:\Users\Kevin\Desktop\NewTestARC" + +/// From ARCtrl.NET +/// https://github.com/nfdi4plants/ARCtrl.NET/blob/f3eda8e96a3a7791288c1b5975050742c1d803d9/src/ARCtrl.NET/Contract.fs#L24 +let fulfillWriteContract basePath (c : Contract) = + let ensureDirectory (filePath : string) = + let file = new System.IO.FileInfo(filePath); + file.Directory.Create() + match c.DTO with + | Some (DTO.Spreadsheet wb) -> + let path = System.IO.Path.Combine(basePath, c.Path) + ensureDirectory path + FsWorkbook.toFile path (wb :?> FsWorkbook) + | Some (DTO.Text t) -> + let path = System.IO.Path.Combine(basePath, c.Path) + ensureDirectory path + System.IO.File.WriteAllText(path,t) + | None -> + let path = System.IO.Path.Combine(basePath, c.Path) + ensureDirectory path + System.IO.File.Create(path).Close() + | _ -> + printfn "Contract %s is not an ISA contract" c.Path + +/// From ARCtrl.NET +/// https://github.com/nfdi4plants/ARCtrl.NET/blob/f3eda8e96a3a7791288c1b5975050742c1d803d9/src/ARCtrl.NET/Arc.fs#L11 +let write (arcPath: string) (arc:ARC) = + arc.GetWriteContracts() + |> Array.iter (fulfillWriteContract arcPath) + +write arcRootPath arc \ No newline at end of file diff --git a/docs/scripts_js/ARC.js b/docs/scripts_js/ARC.js new file mode 100644 index 00000000..2726cf04 --- /dev/null +++ b/docs/scripts_js/ARC.js @@ -0,0 +1,45 @@ +import {ARC} from "@nfdi4plants/arctrl"; +import {Xlsx} from "fsspreadsheet"; +import fs from "fs"; +import path from "path"; + +// Create + +let arc = new ARC() + +// Write +const arcRootPath = "C:/Users/Kevin/Desktop/NewTestARCJS" + +async function fulfillWriteContract (basePath, contract) { + function ensureDirectory (filePath) { + let dirPath = path.dirname(filePath) + if (!fs.existsSync(dirPath)){ + fs.mkdirSync(dirPath, { recursive: true }); + } + } + const p = path.join(basePath,contract.Path) + if (contract.Operation = "CREATE") { + if (contract.DTO == undefined) { + ensureDirectory(p) + fs.writeFileSync(p, "") + } else if (contract.DTOType == "ISA_Assay" || contract.DTOType == "ISA_Assay" || "ISA_Investigation") { + ensureDirectory(p) + await Xlsx.toFile(p, contract.DTO) + console.log("ISA", p) + } else if (contract.DTOType == "PlainText") { + ensureDirectory(p) + fs.writeFileSync(p, contract.DTO) + } else { + console.log("Warning: The given contract is not a correct ARC write contract: ", contract) + } + } +} + +async function write(arcPath, arc) { + let contracts = arc.GetWriteContracts() + contracts.forEach(async contract => { + await fulfillWriteContract(arcPath,contract) + }); +} + +await write(arcRootPath,arc) \ No newline at end of file diff --git a/docs/scripts_js/package-lock.json b/docs/scripts_js/package-lock.json new file mode 100644 index 00000000..33850f67 --- /dev/null +++ b/docs/scripts_js/package-lock.json @@ -0,0 +1,995 @@ +{ + "name": "docs", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "docs", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@nfdi4plants/arctrl": "^1.0.0-alpha6", + "fsspreadsheet": "^4.0.0-alpha2" + } + }, + "node_modules/@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "node_modules/@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@nfdi4plants/arctrl": { + "version": "1.0.0-alpha9", + "resolved": "https://registry.npmjs.org/@nfdi4plants/arctrl/-/arctrl-1.0.0-alpha9.tgz", + "integrity": "sha512-yY1bq10wkIbMfu/Ho+vKPw3Gg1UnQHVZLiE0gtNdp3elb1KYBuV2PldIKYIor/e+9EOls04HC4tKkDrtSgcTRg==", + "dependencies": { + "fable-library": "^1.1.1", + "isomorphic-fetch": "^3.0.0" + } + }, + "node_modules/@nfdi4plants/exceljs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@nfdi4plants/exceljs/-/exceljs-0.2.0.tgz", + "integrity": "sha512-oGln4qXIDizm+PCGsW2KOL7RGEF2wXPQdF2/uew3xGhMrdhPJnwG0XdrVM5iumJtlU0WAUGBo3M/CDELtQ1gnw==", + "dependencies": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.10.1", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/fable-library": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fable-library/-/fable-library-1.1.1.tgz", + "integrity": "sha512-tGJqNcPMDfDps2rklbzN9PDOSpzbDXqjHcT7FdP6LEOX2Fe0dj7UWnCzpBWdSCstd3HLPwFVC7DYvReiWtobIQ==" + }, + "node_modules/fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "dependencies": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsspreadsheet": { + "version": "4.0.0-alpha2", + "resolved": "https://registry.npmjs.org/fsspreadsheet/-/fsspreadsheet-4.0.0-alpha2.tgz", + "integrity": "sha512-inhygUG7sdRkIlsge3bLeqyz53ap8xyJiVEYnxQyrFFJ8IxQHJbMb/SvlTcZAmI7RiROvPZMdFEBgaqUrs238w==", + "dependencies": { + "@nfdi4plants/exceljs": "0.2.0" + } + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "node_modules/lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "engines": { + "node": "*" + } + }, + "node_modules/unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/unzipper/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/unzipper/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/unzipper/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-fetch": { + "version": "3.6.19", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + } +} diff --git a/docs/scripts_js/package.json b/docs/scripts_js/package.json new file mode 100644 index 00000000..7c2fd5d8 --- /dev/null +++ b/docs/scripts_js/package.json @@ -0,0 +1,15 @@ +{ + "name": "docs", + "version": "1.0.0", + "description": "This subproject is only used to create test script used for documentation", + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Kevin Frey", + "license": "MIT", + "dependencies": { + "@nfdi4plants/arctrl": "^1.0.0-alpha6", + "fsspreadsheet": "^4.0.0-alpha2" + } +} diff --git a/package-lock.json b/package-lock.json index bc539578..dec0e400 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "hasInstallScript": true, "dependencies": { "fable-library": "^1.1.1", + "fsspreadsheet": "^4.0.0-alpha2", "isomorphic-fetch": "^3.0.0" }, "devDependencies": { @@ -15,6 +16,57 @@ "mocha": "^10.2.0" } }, + "node_modules/@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "node_modules/@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@nfdi4plants/exceljs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@nfdi4plants/exceljs/-/exceljs-0.2.0.tgz", + "integrity": "sha512-oGln4qXIDizm+PCGsW2KOL7RGEF2wXPQdF2/uew3xGhMrdhPJnwG0XdrVM5iumJtlU0WAUGBo3M/CDELtQ1gnw==", + "dependencies": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.10.1", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -61,17 +113,124 @@ "node": ">= 8" } }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } }, "node_modules/binary-extensions": { "version": "2.2.0", @@ -82,11 +241,25 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -109,6 +282,53 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "engines": { + "node": ">=0.2.0" + } + }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -121,6 +341,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -205,11 +436,57 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, "node_modules/debug": { "version": "4.3.4", @@ -255,12 +532,55 @@ "node": ">=0.3.1" } }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -287,6 +607,18 @@ "resolved": "https://registry.npmjs.org/fable-library/-/fable-library-1.1.1.tgz", "integrity": "sha512-tGJqNcPMDfDps2rklbzN9PDOSpzbDXqjHcT7FdP6LEOX2Fe0dj7UWnCzpBWdSCstd3HLPwFVC7DYvReiWtobIQ==" }, + "node_modules/fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "dependencies": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -324,11 +656,15 @@ "flat": "cli.js" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", @@ -344,6 +680,50 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/fsspreadsheet": { + "version": "4.0.0-alpha2", + "resolved": "https://registry.npmjs.org/fsspreadsheet/-/fsspreadsheet-4.0.0-alpha2.tgz", + "integrity": "sha512-inhygUG7sdRkIlsge3bLeqyz53ap8xyJiVEYnxQyrFFJ8IxQHJbMb/SvlTcZAmI7RiROvPZMdFEBgaqUrs238w==", + "dependencies": { + "@nfdi4plants/exceljs": "0.2.0" + } + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -357,7 +737,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -389,7 +768,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -399,7 +777,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -407,6 +784,11 @@ "node": "*" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -425,11 +807,34 @@ "he": "bin/he" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -438,8 +843,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -513,6 +917,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/isomorphic-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", @@ -534,6 +943,95 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -549,6 +1047,71 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "node_modules/lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -577,6 +1140,14 @@ "node": ">=10" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mkdirp": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", @@ -673,7 +1244,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -682,7 +1252,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -717,6 +1286,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -730,7 +1304,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -747,6 +1320,11 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -756,6 +1334,38 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -777,12 +1387,25 @@ "node": ">=0.10.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" @@ -797,6 +1420,17 @@ } ] }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -806,6 +1440,19 @@ "randombytes": "^2.1.0" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -859,6 +1506,32 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -876,6 +1549,71 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "engines": { + "node": "*" + } + }, + "node_modules/unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/unzipper/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/unzipper/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/unzipper/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -921,8 +1659,12 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "node_modules/y18n": { "version": "5.0.8", @@ -986,9 +1728,129 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/zip-stream/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/zip-stream/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } } }, "dependencies": { + "@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "requires": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "requires": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "@nfdi4plants/exceljs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@nfdi4plants/exceljs/-/exceljs-0.2.0.tgz", + "integrity": "sha512-oGln4qXIDizm+PCGsW2KOL7RGEF2wXPQdF2/uew3xGhMrdhPJnwG0XdrVM5iumJtlU0WAUGBo3M/CDELtQ1gnw==", + "requires": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.10.1", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + } + }, + "@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -1020,17 +1882,100 @@ "picomatch": "^2.0.4" } }, + "archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } }, "binary-extensions": { "version": "2.2.0", @@ -1038,11 +1983,25 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "requires": { "balanced-match": "^1.0.0" } @@ -1062,12 +2021,44 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" + }, "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1131,11 +2122,45 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, + "crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, + "dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, "debug": { "version": "4.3.4", @@ -1166,12 +2191,57 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -1189,6 +2259,15 @@ "resolved": "https://registry.npmjs.org/fable-library/-/fable-library-1.1.1.tgz", "integrity": "sha512-tGJqNcPMDfDps2rklbzN9PDOSpzbDXqjHcT7FdP6LEOX2Fe0dj7UWnCzpBWdSCstd3HLPwFVC7DYvReiWtobIQ==" }, + "fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "requires": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1214,11 +2293,15 @@ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.2", @@ -1227,6 +2310,43 @@ "dev": true, "optional": true }, + "fsspreadsheet": { + "version": "4.0.0-alpha2", + "resolved": "https://registry.npmjs.org/fsspreadsheet/-/fsspreadsheet-4.0.0-alpha2.tgz", + "integrity": "sha512-inhygUG7sdRkIlsge3bLeqyz53ap8xyJiVEYnxQyrFFJ8IxQHJbMb/SvlTcZAmI7RiROvPZMdFEBgaqUrs238w==", + "requires": { + "@nfdi4plants/exceljs": "0.2.0" + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1237,7 +2357,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1251,7 +2370,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1261,7 +2379,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1277,6 +2394,11 @@ "is-glob": "^4.0.1" } }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1289,11 +2411,20 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -1302,8 +2433,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "is-binary-path": { "version": "2.1.0", @@ -1353,6 +2483,11 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "isomorphic-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", @@ -1371,6 +2506,96 @@ "argparse": "^2.0.1" } }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -1380,6 +2605,71 @@ "p-locate": "^5.0.0" } }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -1399,6 +2689,11 @@ "brace-expansion": "^2.0.1" } }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, "mkdirp": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", @@ -1457,14 +2752,12 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "requires": { "wrappy": "1" } @@ -1487,6 +2780,11 @@ "p-limit": "^3.0.2" } }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -1496,8 +2794,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "picomatch": { "version": "2.3.1", @@ -1505,6 +2802,11 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -1514,6 +2816,34 @@ "safe-buffer": "^5.1.0" } }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1529,11 +2859,26 @@ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } }, "serialize-javascript": { "version": "6.0.0", @@ -1544,6 +2889,19 @@ "randombytes": "^2.1.0" } }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -1579,6 +2937,26 @@ "has-flag": "^4.0.0" } }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1593,6 +2971,67 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" + }, + "unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -1632,8 +3071,12 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "y18n": { "version": "5.0.8", @@ -1679,6 +3122,65 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "requires": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "requires": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } } } } diff --git a/package.json b/package.json index 706fa16b..fb9d0b02 100644 --- a/package.json +++ b/package.json @@ -28,10 +28,11 @@ ], "dependencies": { "fable-library": "^1.1.1", + "fsspreadsheet": "^4.0.0-alpha2", "isomorphic-fetch": "^3.0.0" }, "devDependencies": { - "mocha": "^10.2.0", - "mkdirp": "3.0.1" + "mkdirp": "3.0.1", + "mocha": "^10.2.0" } } From 4aaf7724c4fc777995ef1e78ccccb1bc17c5eaa2 Mon Sep 17 00:00:00 2001 From: Kevin F Date: Wed, 25 Oct 2023 08:02:23 +0200 Subject: [PATCH 2/6] :constrcution: #223 --- README.md | 3 + docs/ARC.md | 68 +++++++++++++++++- docs/Contracts.md | 115 ++++++++++++++++++++++++++++++ docs/GettingStarted.md | 2 +- docs/scripts_fsharp/ARC.fsx | 58 +++++++-------- docs/scripts_fsharp/Contracts.fsx | 65 +++++++++++++++++ docs/scripts_js/ARC.js | 108 ++++++++++++++++++++-------- docs/scripts_js/Contracts.js | 27 +++++++ package-lock.json | 36 ++++++++++ package.json | 1 + src/Contract/Contract.fs | 4 ++ src/Contract/README.md | 3 +- 12 files changed, 428 insertions(+), 62 deletions(-) create mode 100644 docs/Contracts.md create mode 100644 docs/scripts_fsharp/Contracts.fsx create mode 100644 docs/scripts_js/Contracts.js diff --git a/README.md b/README.md index 2f41e7a2..f9d4e00f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # ARCtrl Top level ARC DataModel and API function descriptions. +![Nuget](https://img.shields.io/nuget/dt/ARCtrl?label=nuget&link=https%3A%2F%2Fwww.nuget.org%2Fpackages%2FARCtrl) +![npm](https://img.shields.io/npm/dt/%40nfdi4plants%2Farctrl?label=npm&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2F%40nfdi4plants%2Farctrl) + - [ARCtrl](#arctrl) - [Jargon/Nomenclature](#jargonnomenclature) - [API Design](#api-design) diff --git a/docs/ARC.md b/docs/ARC.md index 1de14fa2..dcecb172 100644 --- a/docs/ARC.md +++ b/docs/ARC.md @@ -7,6 +7,7 @@ Table of Content - [Create ARC](#create) - [Write ARC](#write) +- [Read ARC](#read) ## Create @@ -87,7 +88,6 @@ import {Xlsx} from "fsspreadsheet"; import fs from "fs"; import path from "path"; -// Write const arcRootPath = "C:/Users/Kevin/Desktop/NewTestARCJS" async function fulfillWriteContract (basePath, contract) { @@ -102,7 +102,7 @@ async function fulfillWriteContract (basePath, contract) { if (contract.DTO == undefined) { ensureDirectory(p) fs.writeFileSync(p, "") - } else if (contract.DTOType == "ISA_Assay" || contract.DTOType == "ISA_Assay" || "ISA_Investigation") { + } else if (contract.DTOType == "ISA_Assay" || contract.DTOType == "ISA_Assay" || contract.DTOType == "ISA_Investigation") { ensureDirectory(p) await Xlsx.toFile(p, contract.DTO) console.log("ISA", p) @@ -125,4 +125,68 @@ async function write(arcPath, arc) { await write(arcRootPath,arc) ``` +## Read + +Read may look intimidating at first, until you notice that most of this is just setup which can be reused for any read you do. + +Setup will be placed on top, with the actual read below. + +```fsharp +// F# +open System.IO + +// Setup + +let normalizePathSeparators (str:string) = str.Replace("\\","/") + +let getAllFilePaths (basePath: string) = + let options = EnumerationOptions() + options.RecurseSubdirectories <- true + Directory.EnumerateFiles(basePath, "*", options) + |> Seq.map (fun fp -> + Path.GetRelativePath(basePath, fp) + |> normalizePathSeparators + ) + |> Array.ofSeq + +// from ARCtrl.NET +// https://github.com/nfdi4plants/ARCtrl.NET/blob/ba3d2fabe007d9ca2c8e07b62d02ddc5264306d0/src/ARCtrl.NET/Contract.fs#L7 +let fulfillReadContract basePath (c : Contract) = + match c.DTOType with + | Some DTOType.ISA_Assay + | Some DTOType.ISA_Investigation + | Some DTOType.ISA_Study -> + let path = System.IO.Path.Combine(basePath, c.Path) + let wb = FsWorkbook.fromXlsxFile path |> box |> DTO.Spreadsheet + {c with DTO = Some wb} + | Some DTOType.PlainText -> + let path = System.IO.Path.Combine(basePath, c.Path) + let text = System.IO.File.ReadAllText(path) |> DTO.Text + {c with DTO = Some text} + | _ -> + printfn "Contract %s is not an ISA contract" c.Path + c + +// put it all together +let readARC(basePath: string) = + let allFilePaths = getAllFilePaths basePath + // Initiates an ARC from FileSystem but no ISA info. + let arcRead = ARC.fromFilePaths allFilePaths + // Read contracts will tell us what we need to read from disc. + let readContracts = arcRead.GetReadContracts() + let fulfilledContracts = + readContracts + |> Array.map (fulfillReadContract basePath) + arcRead.SetISAFromContracts(fulfilledContracts) + arcRead + +// execution + +readARC arcRootPath +``` + +```js + +``` + [1]: "ARCtrl.NET Nuget" \ No newline at end of file diff --git a/docs/Contracts.md b/docs/Contracts.md new file mode 100644 index 00000000..036eccf1 --- /dev/null +++ b/docs/Contracts.md @@ -0,0 +1,115 @@ +# Contracts - from a code perspective + +**Table of contents** +- [WRITE](#write-contracts) +- [READ](#read-contracts) + +**Code can be found here** +- [F#](/docs/scripts_fsharp/Contracts.fsx) +- [JavaScript](/docs/scripts_js/Contracts.js) + + +Contracts in ARCtrl are used to delegate *IO operations* to the api consumer to allow interoperability with any environment (.NET, Node, Browser..). Contracts use *Data Transfer Object"s* (DTOs) instead of the ARCtrl types to provide a higher interoperability. + +A Contract object consists of the following fields: + +```fsharp +// F# +// Using F# discriminate union types it is very easy to match for differen cases. +type Contract = + { + /// Determines what io operation should be done: CREATE, READ, DELETE, ... + Operation : Operation + /// The path where the io operation should be executed. The path is relative to ARC root. + Path: string + /// The type of DTO that is expected: JSON, PlainText, ISA_Assay, ISA_Study, ISA_Investigation,.. + DTOType : DTOType option + /// The actual DTO, as discriminate union. + DTO: DTO option + } +``` + +```js +// JavaScript +export class Contract extends Record { + constructor(Operation, Path, DTOType, DTO) { + super(); + // Can be any of: "CREATE", "UPDATE", "DELETE", "READ", "EXECUTE" + this.Operation = Operation; + // string, the path where the io operation should be executed. The path is relative to ARC root + this.Path = Path; + // Can be undefined or any of: "ISA_Assay", "ISA_Study", "ISA_Investigation", "JSON", "Markdown", "CWL", "PlainText", "Cli". + this.DTOType = DTOType; + // Can be undefined or any of: `FsWorkbook` (from fsspreadsheet), string (e.g. json,..), or a `CLITool`. + this.DTO = DTO; + } +``` + +Handling contracts can be generalized in a few functions. + +## WRITE contracts + +```fsharp +#r "nuget: FsSpreadsheet.ExcelIO, 4.1.0" +#r "nuget: ARCtrl, 1.0.0-alpha9" + +open ARCtrl +open ARCtrl.Contract +open FsSpreadsheet +open FsSpreadsheet.ExcelIO + +/// From ARCtrl.NET +let fulfillWriteContract basePath (c : Contract) = + let ensureDirectory (filePath : string) = + let file = new System.IO.FileInfo(filePath); + file.Directory.Create() + match c.DTO with + | Some (DTO.Spreadsheet wb) -> + let path = System.IO.Path.Combine(basePath, c.Path) + ensureDirectory path + FsWorkbook.toFile path (wb :?> FsWorkbook) + | Some (DTO.Text t) -> + let path = System.IO.Path.Combine(basePath, c.Path) + ensureDirectory path + System.IO.File.WriteAllText(path,t) + | None -> + let path = System.IO.Path.Combine(basePath, c.Path) + ensureDirectory path + System.IO.File.Create(path).Close() + | _ -> + printfn "Contract %s is not an ISA contract" c.Path +``` + +```js +import {Xlsx} from "fsspreadsheet"; +import fs from "fs"; +import path from "path"; + +export async function fulfillWriteContract (basePath, contract) { + function ensureDirectory (filePath) { + let dirPath = path.dirname(filePath) + if (!fs.existsSync(dirPath)){ + fs.mkdirSync(dirPath, { recursive: true }); + } + } + const p = path.join(basePath,contract.Path) + if (contract.Operation = "CREATE") { + if (contract.DTO == undefined) { + ensureDirectory(p) + fs.writeFileSync(p, "") + } else if (contract.DTOType == "ISA_Assay" || contract.DTOType == "ISA_Assay" || contract.DTOType == "ISA_Investigation") { + ensureDirectory(p) + await Xlsx.toFile(p, contract.DTO) + console.log("ISA", p) + } else if (contract.DTOType == "PlainText") { + ensureDirectory(p) + fs.writeFileSync(p, contract.DTO) + } else { + console.log("Warning: The given contract is not a correct ARC write contract: ", contract) + } + } +} +``` + + +## READ contracts diff --git a/docs/GettingStarted.md b/docs/GettingStarted.md index d40182fe..5ee6e738 100644 --- a/docs/GettingStarted.md +++ b/docs/GettingStarted.md @@ -8,7 +8,7 @@ 1. Install [.NET SDK](https://dotnet.microsoft.com/en-us/download). 2. Get the [ARCtrl nuget package](www.nuget.org/packages/ARCtrl). 3. (*OPTIONAL*) Use [FsSpreadsheet.ExcelIO](https://www.nuget.org/packages/FsSpreadsheet.ExcelIO) to get any xlsx files into the correct format with our supported readers. -4. (*OPTIONAL*) You can use contract handling from [ARCtrl.NET](https://www.nuget.org/packages/ARCtrl.NET). +4. (*OPTIONAL*) You can use contract handling from [ARCtrl.NET](https://www.nuget.org/packages/ARCtrl.NET). This documentation will avoid using ARCtrl.NET and extract the relevant functions. Thats it! 🎉 diff --git a/docs/scripts_fsharp/ARC.fsx b/docs/scripts_fsharp/ARC.fsx index 0a3ed36b..c825405c 100644 --- a/docs/scripts_fsharp/ARC.fsx +++ b/docs/scripts_fsharp/ARC.fsx @@ -1,5 +1,6 @@ #r "nuget: FsSpreadsheet.ExcelIO, 4.1.0" #r "nuget: ARCtrl, 1.0.0-alpha9" +#load "Contracts.fsx" // # Create @@ -16,34 +17,33 @@ open ARCtrl.Contract open FsSpreadsheet open FsSpreadsheet.ExcelIO -let arcRootPath = @"C:\Users\Kevin\Desktop\NewTestARC" - -/// From ARCtrl.NET -/// https://github.com/nfdi4plants/ARCtrl.NET/blob/f3eda8e96a3a7791288c1b5975050742c1d803d9/src/ARCtrl.NET/Contract.fs#L24 -let fulfillWriteContract basePath (c : Contract) = - let ensureDirectory (filePath : string) = - let file = new System.IO.FileInfo(filePath); - file.Directory.Create() - match c.DTO with - | Some (DTO.Spreadsheet wb) -> - let path = System.IO.Path.Combine(basePath, c.Path) - ensureDirectory path - FsWorkbook.toFile path (wb :?> FsWorkbook) - | Some (DTO.Text t) -> - let path = System.IO.Path.Combine(basePath, c.Path) - ensureDirectory path - System.IO.File.WriteAllText(path,t) - | None -> - let path = System.IO.Path.Combine(basePath, c.Path) - ensureDirectory path - System.IO.File.Create(path).Close() - | _ -> - printfn "Contract %s is not an ISA contract" c.Path - -/// From ARCtrl.NET -/// https://github.com/nfdi4plants/ARCtrl.NET/blob/f3eda8e96a3a7791288c1b5975050742c1d803d9/src/ARCtrl.NET/Arc.fs#L11 +let arcRootPath = @"C:\Users\Kevin\Desktop\NewTestARCNET" + let write (arcPath: string) (arc:ARC) = arc.GetWriteContracts() - |> Array.iter (fulfillWriteContract arcPath) - -write arcRootPath arc \ No newline at end of file + // `Contracts.fulfillWriteContract` from Contracts.fsx docs + |> Array.iter (Contracts.fulfillWriteContract arcPath) + +write arcRootPath arc + +// # Read +open System.IO + +// put it all together +let readARC(basePath: string) = + // `Contracts.getAllFilePaths` from Contracts.fsx docs + let allFilePaths = Contracts.getAllFilePaths basePath + // Initiates an ARC from FileSystem but no ISA info. + let arcRead = ARC.fromFilePaths allFilePaths + // Read contracts will tell us what we need to read from disc. + let readContracts = arcRead.GetReadContracts() + let fulfilledContracts = + readContracts + // `Contracts.fulfillReadContract` from Contracts.fsx docs + |> Array.map (Contracts.fulfillReadContract basePath) + arcRead.SetISAFromContracts(fulfilledContracts) + arcRead + +// execution + +readARC arcRootPath \ No newline at end of file diff --git a/docs/scripts_fsharp/Contracts.fsx b/docs/scripts_fsharp/Contracts.fsx new file mode 100644 index 00000000..5307d68d --- /dev/null +++ b/docs/scripts_fsharp/Contracts.fsx @@ -0,0 +1,65 @@ +#r "nuget: FsSpreadsheet.ExcelIO, 4.1.0" +#r "nuget: ARCtrl, 1.0.0-alpha9" + +open ARCtrl +open ARCtrl.Contract +open FsSpreadsheet +open FsSpreadsheet.ExcelIO + +// # Write + +/// From ARCtrl.NET +/// https://github.com/nfdi4plants/ARCtrl.NET/blob/f3eda8e96a3a7791288c1b5975050742c1d803d9/src/ARCtrl.NET/Contract.fs#L24 +let fulfillWriteContract basePath (c : Contract) = + let ensureDirectory (filePath : string) = + let file = new System.IO.FileInfo(filePath); + file.Directory.Create() + match c.DTO with + | Some (DTO.Spreadsheet wb) -> + let path = System.IO.Path.Combine(basePath, c.Path) + ensureDirectory path + FsWorkbook.toFile path (wb :?> FsWorkbook) + | Some (DTO.Text t) -> + let path = System.IO.Path.Combine(basePath, c.Path) + ensureDirectory path + System.IO.File.WriteAllText(path,t) + | None -> + let path = System.IO.Path.Combine(basePath, c.Path) + ensureDirectory path + System.IO.File.Create(path).Close() + | _ -> + printfn "Contract %s is not an ISA contract" c.Path + +// # Read + +open System.IO + +let normalizePathSeparators (str:string) = str.Replace("\\","/") + +let getAllFilePaths (basePath: string) = + let options = EnumerationOptions() + options.RecurseSubdirectories <- true + Directory.EnumerateFiles(basePath, "*", options) + |> Seq.map (fun fp -> + Path.GetRelativePath(basePath, fp) + |> normalizePathSeparators + ) + |> Array.ofSeq + +// from ARCtrl.NET +// https://github.com/nfdi4plants/ARCtrl.NET/blob/ba3d2fabe007d9ca2c8e07b62d02ddc5264306d0/src/ARCtrl.NET/Contract.fs#L7 +let fulfillReadContract basePath (c : Contract) = + match c.DTOType with + | Some DTOType.ISA_Assay + | Some DTOType.ISA_Investigation + | Some DTOType.ISA_Study -> + let path = System.IO.Path.Combine(basePath, c.Path) + let wb = FsWorkbook.fromXlsxFile path |> box |> DTO.Spreadsheet + {c with DTO = Some wb} + | Some DTOType.PlainText -> + let path: string = System.IO.Path.Combine(basePath, c.Path) + let text = System.IO.File.ReadAllText(path) |> DTO.Text + {c with DTO = Some text} + | _ -> + printfn "Contract %s is not an ISA contract" c.Path + c \ No newline at end of file diff --git a/docs/scripts_js/ARC.js b/docs/scripts_js/ARC.js index 2726cf04..fa9e8c92 100644 --- a/docs/scripts_js/ARC.js +++ b/docs/scripts_js/ARC.js @@ -1,45 +1,97 @@ import {ARC} from "@nfdi4plants/arctrl"; -import {Xlsx} from "fsspreadsheet"; +import {fulfillWriteContract} from "./Contracts.js"; import fs from "fs"; import path from "path"; +import { Xlsx } from "fsspreadsheet"; +import ExcelJs from "exceljs" -// Create +// # Create let arc = new ARC() -// Write +// # Write const arcRootPath = "C:/Users/Kevin/Desktop/NewTestARCJS" -async function fulfillWriteContract (basePath, contract) { - function ensureDirectory (filePath) { - let dirPath = path.dirname(filePath) - if (!fs.existsSync(dirPath)){ - fs.mkdirSync(dirPath, { recursive: true }); +async function write(arcPath, arc) { + let contracts = arc.GetWriteContracts() + contracts.forEach(async contract => { + // from Contracts.js docs + await fulfillWriteContract(arcPath,contract) + }); +} + +// await write(arcRootPath, arc) + +// # Read + +function normalizePathSeparators (str) { + const normalizedPath = path.normalize(str) + return normalizedPath.replace(/\\/g, '/'); +} + +function getAllFilePaths(basePath) { + const filesList = [] + function loop (dir) { + const files = fs.readdirSync(dir); + for (const file of files) { + const filePath = path.join(dir, file); + + if (fs.statSync(filePath).isDirectory()) { + // If it's a directory, recursively call the function on that directory + loop(filePath); + } else { + // If it's a file, calculate the relative path and add it to the list + const relativePath = path.relative(basePath, filePath); + const normalizePath = normalizePathSeparators(relativePath) + filesList.push(normalizePath); + } } + } - const p = path.join(basePath,contract.Path) - if (contract.Operation = "CREATE") { - if (contract.DTO == undefined) { - ensureDirectory(p) - fs.writeFileSync(p, "") - } else if (contract.DTOType == "ISA_Assay" || contract.DTOType == "ISA_Assay" || "ISA_Investigation") { - ensureDirectory(p) - await Xlsx.toFile(p, contract.DTO) - console.log("ISA", p) - } else if (contract.DTOType == "PlainText") { - ensureDirectory(p) - fs.writeFileSync(p, contract.DTO) - } else { - console.log("Warning: The given contract is not a correct ARC write contract: ", contract) + loop(basePath) + return filesList; +} + +export async function fulfillReadContract (basePath, contract) { + async function fulfill() { + const normalizedPath = normalizePathSeparators(path.join(basePath, contract.Path)) + switch (contract.DTOType) { + case "ISA_Assay": + case "ISA_Study": + case "ISA_Investigation": + let fswb = await Xlsx.fromXlsxFile(normalizedPath) + return fswb + break; + case "PlainText": + let content = fs.readFile(normalizedPath) + return content + break; + default: + console.log(`Handling of ${contract.DTOType} in a READ contract is not yet implemented`) } } + if (contract.Operation == "READ") { + return await fulfill() + } else { + console.error(`Error (fulfillReadContract): "${contract}" is not a READ contract`) + } } -async function write(arcPath, arc) { - let contracts = arc.GetWriteContracts() - contracts.forEach(async contract => { - await fulfillWriteContract(arcPath,contract) - }); +async function read(basePath) { + let allFilePaths = getAllFilePaths(basePath) + // Initiates an ARC from FileSystem but no ISA info. + let arc = ARC.fromFilePaths(allFilePaths) + // Read contracts will tell us what we need to read from disc. + let readContracts = arc.GetReadContracts() + let fcontracts = await Promise.all( + readContracts.map(async (contract) => { + let content = await fulfillReadContract(basePath, contract) + contract.DTO = content + return (contract) + }) + ) + arc.SetISAFromContracts(fcontracts) + return arc } -await write(arcRootPath,arc) \ No newline at end of file +read(arcRootPath).then(arc => console.log(arc)) diff --git a/docs/scripts_js/Contracts.js b/docs/scripts_js/Contracts.js new file mode 100644 index 00000000..6ed07d41 --- /dev/null +++ b/docs/scripts_js/Contracts.js @@ -0,0 +1,27 @@ +import {Xlsx} from "fsspreadsheet"; +import fs from "fs"; +import path from "path"; + +export async function fulfillWriteContract (basePath, contract) { + function ensureDirectory (filePath) { + let dirPath = path.dirname(filePath) + if (!fs.existsSync(dirPath)){ + fs.mkdirSync(dirPath, { recursive: true }); + } + } + const p = path.join(basePath,contract.Path) + if (contract.Operation = "CREATE") { + if (contract.DTO == undefined) { + ensureDirectory(p) + fs.writeFileSync(p, "") + } else if (contract.DTOType == "ISA_Assay" || contract.DTOType == "ISA_Assay" || contract.DTOType == "ISA_Investigation") { + ensureDirectory(p) + await Xlsx.toFile(p, contract.DTO) + } else if (contract.DTOType == "PlainText") { + ensureDirectory(p) + fs.writeFileSync(p, contract.DTO) + } else { + console.log("Warning: The given contract is not a correct ARC write contract: ", contract) + } + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index dec0e400..04bec9b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "hasInstallScript": true, "dependencies": { + "exceljs": "^4.3.0", "fable-library": "^1.1.1", "fsspreadsheet": "^4.0.0-alpha2", "isomorphic-fetch": "^3.0.0" @@ -602,6 +603,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/exceljs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", + "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", + "dependencies": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.5.0", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, "node_modules/fable-library": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/fable-library/-/fable-library-1.1.1.tgz", @@ -2254,6 +2274,22 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, + "exceljs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", + "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", + "requires": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.5.0", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + } + }, "fable-library": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/fable-library/-/fable-library-1.1.1.tgz", diff --git a/package.json b/package.json index fb9d0b02..ceeee0c7 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "Kevin Frey (https://github.com/Freymaurer)" ], "dependencies": { + "exceljs": "^4.3.0", "fable-library": "^1.1.1", "fsspreadsheet": "^4.0.0-alpha2", "isomorphic-fetch": "^3.0.0" diff --git a/src/Contract/Contract.fs b/src/Contract/Contract.fs index 020d8fcf..7dbff9db 100644 --- a/src/Contract/Contract.fs +++ b/src/Contract/Contract.fs @@ -61,9 +61,13 @@ type Operation = [] type Contract = { + /// Determines what io operation should be done: CREATE, READ, DELETE, ... Operation : Operation + /// The path where the io operation should be executed. The path is relative to ARC root. Path: string + /// The type of DTO that is expected: json, plaintext, isa_study, isa_assay, isa_investigation DTOType : DTOType option + /// The actual DTO, as discriminate union. DTO: DTO option } [] diff --git a/src/Contract/README.md b/src/Contract/README.md index c6bde30d..d2d1022f 100644 --- a/src/Contract/README.md +++ b/src/Contract/README.md @@ -3,8 +3,7 @@ The ARC stack exclusively works with the in-memory representations of the ARC. In order to keep the in-memory ARC datamodel and the filesystem synchronized, the ARC.Core stack uses the concept of `Contracts`. -Each contract is a single IO operation representing one change to the ARC. -The operation contained in a contract does not use the datamodel objects, but rather uses `data transfer objects`, which include for example the `json` representation as string and the `FsSpreadsheet` representation of the ISA.xlsx files. +Each contract is a single IO operation. The operation contained in a contract does not use the datamodel objects, but rather uses `data transfer objects`, which include for example the `json` representation as string and the `FsSpreadsheet` representation of the ISA.xlsx files. This intermediate conversion from the datamodel object to the data transfer object is important, as this step is the most complex and variable. From 2606865916f7b6857a2faf54ffb5d915ab55f57d Mon Sep 17 00:00:00 2001 From: Kevin F Date: Fri, 27 Oct 2023 06:57:47 +0200 Subject: [PATCH 3/6] Remove unused logging flag #231 --- src/ARCtrl/ARC.fs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ARCtrl/ARC.fs b/src/ARCtrl/ARC.fs index 155420c4..f8d7fb0f 100644 --- a/src/ARCtrl/ARC.fs +++ b/src/ARCtrl/ARC.fs @@ -157,8 +157,7 @@ type ARC(?isa : ISA.ArcInvestigation, ?cwl : CWL.CWL, ?fs : FileSystem.FileSyste /// /// The fullfilled READ contracts. /// If this flag is set true, the function will print any missing/found assays/studies to the console. *Default* = false - member this.SetISAFromContracts (contracts: Contract [], ?enableLogging: bool) = - let enableLogging = defaultArg enableLogging false + member this.SetISAFromContracts (contracts: Contract []) = /// get investigation from xlsx let investigation = ARCAux.getArcInvestigationFromContracts contracts /// get studies from xlsx From f40d5389df3f2f7cd429b81abc40d6ce13e2c5a8 Mon Sep 17 00:00:00 2001 From: Kevin F Date: Fri, 27 Oct 2023 06:58:59 +0200 Subject: [PATCH 4/6] Remove reference to developer branch from gh-action #233 --- .github/workflows/build-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 6338ec43..bc5bd9d1 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -4,7 +4,7 @@ on: push: branches: [ main ] pull_request: - branches: [ main, developer ] + branches: [ main ] jobs: build-and-test-linux: From 0ca715a14a4e86b5568d574ca7a96451fe46a840 Mon Sep 17 00:00:00 2001 From: Kevin F Date: Fri, 27 Oct 2023 07:14:10 +0200 Subject: [PATCH 5/6] improve error msgs in Template.Spreadsheet #234 --- src/ARCtrl/Templates/Template.Spreadsheet.fs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/ARCtrl/Templates/Template.Spreadsheet.fs b/src/ARCtrl/Templates/Template.Spreadsheet.fs index 1d845c86..797baf5e 100644 --- a/src/ARCtrl/Templates/Template.Spreadsheet.fs +++ b/src/ARCtrl/Templates/Template.Spreadsheet.fs @@ -6,6 +6,8 @@ open ARCtrl.ISA.Spreadsheet open ARCtrl.ISA open System.Collections.Generic +exception TemplateReadError of string + module Metadata = @@ -274,18 +276,21 @@ module Template = let sheets = doc.GetWorksheets() let table = + // find worksheet by table = template.table.name match sheets |> Seq.tryPick tryTableNameMatches with | Some ws -> + // convert worksheet to ArcTable match ArcTable.tryFromFsWorksheet ws with | Some t -> t - | None -> failwithf "Ws with name %s could not be converted to a table" ws.Name + | None -> raise (TemplateReadError $"Ws with name `{ws.Name}` could not be converted to a table") | None -> + // Fallback find worksheet by worksheet.name = template.table.name match sheets |> Seq.tryPick tryWSNameMatches with - | Some ws -> - match ArcTable.tryFromFsWorksheet ws with - | Some t -> t - | None -> failwithf "Ws with name %s could not be converted to a table" ws.Name - | None -> failwithf "No worksheet with name %s found" templateInfo.Table + | Some ws -> + match ArcTable.tryFromFsWorksheet ws with + | Some t -> t + | None -> raise (TemplateReadError <| $"Ws with name `{ws.Name}` could not be converted to a table") + | None -> raise (TemplateReadError $"No worksheet or table with name `{templateInfo.Table}` found") fromParts templateInfo ers tags authors table (System.DateTime.Now) From bde87f58695701aab5ce44b8afb4217e4c13e31d Mon Sep 17 00:00:00 2001 From: Kevin F Date: Fri, 27 Oct 2023 11:30:30 +0200 Subject: [PATCH 6/6] inherit ArcTables in assay and study #232 :white_check_mark: --- src/ARCtrl/Templates/Template.Json.fs | 2 +- src/ISA/ISA.Spreadsheet/ArcAssay.fs | 10 +- src/ISA/ISA/ArcTypes/ArcTables.fs | 102 +++++----- src/ISA/ISA/ArcTypes/ArcTypes.fs | 187 +----------------- tests/ARCtrl/ARCtrl.Tests.fs | 2 +- .../ISA.Spreadsheet.Tests/AssayFileTests.fs | 42 ++++ tests/ISA/ISA.Tests/ArcJsonConversionTests.fs | 18 +- tests/ISA/ISA.Tests/ArcStudy.Tests.fs | 2 +- tests/ISA/ISA.Tests/ArcTables.Tests.fs | 92 +++++++-- .../TestingUtils/TestObjects.Contract/ISA.fs | 5 + 10 files changed, 195 insertions(+), 267 deletions(-) diff --git a/src/ARCtrl/Templates/Template.Json.fs b/src/ARCtrl/Templates/Template.Json.fs index 9fab9b32..18be41db 100644 --- a/src/ARCtrl/Templates/Template.Json.fs +++ b/src/ARCtrl/Templates/Template.Json.fs @@ -93,7 +93,7 @@ module Template = Decode.object(fun get -> Template.create( get.Required.Field "id" Decode.guid, - get.Required.Field "table" (Decode.list (Process.decoder (ConverterOptions()) ) |> Decode.map (fun ps -> ArcTables.fromProcesses ps |> fun arctbls -> arctbls.[0])), + get.Required.Field "table" (Decode.list (Process.decoder (ConverterOptions()) ) |> Decode.map (fun ps -> ArcTables.fromProcesses ps |> fun arctbls -> arctbls.Tables.[0])), get.Required.Field "name" Decode.string, get.Required.Field "description" Decode.string, get.Required.Field "organisation" Organisation.decode, diff --git a/src/ISA/ISA.Spreadsheet/ArcAssay.fs b/src/ISA/ISA.Spreadsheet/ArcAssay.fs index 5dfbc93f..91fe9e68 100644 --- a/src/ISA/ISA.Spreadsheet/ArcAssay.fs +++ b/src/ISA/ISA.Spreadsheet/ArcAssay.fs @@ -85,14 +85,12 @@ let fromFsWorkbook (doc:FsWorkbook) = | None -> printfn "Cannot retrieve metadata: Assay file does not contain \"%s\" or \"%s\" sheet." metaDataSheetName obsoleteMetaDataSheetName ArcAssay.create(Identifier.createMissingIdentifier()) - let sheets = + let tables = doc.GetWorksheets() |> Seq.choose ArcTable.tryFromFsWorksheet - if sheets |> Seq.isEmpty then - assayMetaData - else - assayMetaData.Tables <- ResizeArray(sheets) - assayMetaData + if tables |> Seq.isEmpty |> not then + assayMetaData.Tables <- ResizeArray(tables) + assayMetaData let toFsWorkbook (assay : ArcAssay) = let doc = new FsWorkbook() diff --git a/src/ISA/ISA/ArcTypes/ArcTables.fs b/src/ISA/ISA/ArcTypes/ArcTables.fs index edd5934e..2fcf0d0e 100644 --- a/src/ISA/ISA/ArcTypes/ArcTables.fs +++ b/src/ISA/ISA/ArcTypes/ArcTables.fs @@ -139,120 +139,128 @@ module ArcTablesAux = open ArcTablesAux open ArcTableAux +open Fable.Core + /// This type only includes mutable options and only static members, the MUST be referenced and used in all record types implementing `ResizeArray` -type ArcTables(thisTables:ResizeArray) = +[] +type ArcTables(initTables:ResizeArray) = + + interface IEnumerable with + member this.GetEnumerator() : IEnumerator = + this.Tables.GetEnumerator() + member this.GetEnumerator(): System.Collections.IEnumerator = + this.Tables.GetEnumerator() - member this.Count - with get() = thisTables.Count + member val Tables = initTables with get, set + + //member this.Item + // with get(index) = + // this.Tables.[index] member this.TableNames with get() = - [for s in thisTables do yield s.Name] - - member this.Tables = - thisTables + [for s in this.Tables do yield s.Name] - member this.Item - with get(index) = - thisTables.[index] + member this.TableCount + with get() = this.Tables.Count // - Table API - // member this.AddTable(table:ArcTable, ?index: int) = - let index = defaultArg index this.Count - SanityChecks.validateSheetIndex index true thisTables + let index = defaultArg index this.TableCount + SanityChecks.validateSheetIndex index true this.Tables SanityChecks.validateNewNameUnique table.Name this.TableNames - thisTables.Insert(index, table) + this.Tables.Insert(index, table) // - Table API - // member this.AddTables(tables:seq, ?index: int) = - let index = defaultArg index this.Count - SanityChecks.validateSheetIndex index true thisTables + let index = defaultArg index this.TableCount + SanityChecks.validateSheetIndex index true this.Tables SanityChecks.validateNewNamesUnique (tables |> Seq.map (fun x -> x.Name)) this.TableNames - thisTables.InsertRange(index, tables) + this.Tables.InsertRange(index, tables) // - Table API - // member this.InitTable(tableName:string, ?index: int) = - let index = defaultArg index this.Count + let index = defaultArg index this.TableCount let table = ArcTable.init(tableName) - SanityChecks.validateSheetIndex index true thisTables + SanityChecks.validateSheetIndex index true this.Tables SanityChecks.validateNewNameUnique table.Name this.TableNames - thisTables.Insert(index, table) + this.Tables.Insert(index, table) table // - Table API - // member this.InitTables(tableNames:seq, ?index: int) = - let index = defaultArg index this.Count + let index = defaultArg index this.TableCount let tables = tableNames |> Seq.map (fun x -> ArcTable.init(x)) - SanityChecks.validateSheetIndex index true thisTables + SanityChecks.validateSheetIndex index true this.Tables SanityChecks.validateNewNamesUnique (tables |> Seq.map (fun x -> x.Name)) this.TableNames - thisTables.InsertRange(index, tables) + this.Tables.InsertRange(index, tables) // - Table API - // member this.GetTableAt(index:int) : ArcTable = - SanityChecks.validateSheetIndex index false thisTables - thisTables.[index] + SanityChecks.validateSheetIndex index false this.Tables + this.Tables.[index] // - Table API - // member this.GetTable(name: string) : ArcTable = - findIndexByTableName name thisTables + findIndexByTableName name this.Tables |> this.GetTableAt // - Table API - // member this.UpdateTableAt(index:int, table:ArcTable) = - SanityChecks.validateSheetIndex index false thisTables + SanityChecks.validateSheetIndex index false this.Tables SanityChecks.validateNewNameAtUnique index table.Name this.TableNames - thisTables.[index] <- table + this.Tables.[index] <- table // - Table API - // member this.UpdateTable(name: string, table:ArcTable) : unit = - (findIndexByTableName name thisTables, table) + (findIndexByTableName name this.Tables, table) |> this.UpdateTableAt // - Table API - // member this.SetTableAt(index:int, table:ArcTable) = - SanityChecks.validateSheetIndex index true thisTables + SanityChecks.validateSheetIndex index true this.Tables SanityChecks.validateNewNameAtUnique index table.Name this.TableNames - thisTables.[index] <- table + this.Tables.[index] <- table // - Table API - // member this.SetTable(name: string, table:ArcTable) : unit = - match tryFindIndexByTableName name thisTables with + match tryFindIndexByTableName name this.Tables with | Some index -> this.SetTableAt(index, table) | None -> this.AddTable(table) // - Table API - // member this.RemoveTableAt(index:int) : unit = - SanityChecks.validateSheetIndex index false thisTables - thisTables.RemoveAt(index) + SanityChecks.validateSheetIndex index false this.Tables + this.Tables.RemoveAt(index) // - Table API - // member this.RemoveTable(name: string) : unit = - findIndexByTableName name thisTables + findIndexByTableName name this.Tables |> this.RemoveTableAt // - Table API - // // Remark: This must stay `ArcTable -> unit` so name cannot be changed here. member this.MapTableAt(index: int, updateFun: ArcTable -> unit) = - SanityChecks.validateSheetIndex index false thisTables - let table = thisTables.[index] + SanityChecks.validateSheetIndex index false this.Tables + let table = this.Tables.[index] updateFun table // - Table API - // member this.MapTable(name: string, updateFun: ArcTable -> unit) : unit = - (findIndexByTableName name thisTables, updateFun) + (findIndexByTableName name this.Tables, updateFun) |> this.MapTableAt // - Table API - // member this.RenameTableAt(index: int, newName: string) : unit = - SanityChecks.validateSheetIndex index false thisTables + SanityChecks.validateSheetIndex index false this.Tables SanityChecks.validateNewNameUnique newName this.TableNames let table = this.GetTableAt index table.Name <- newName // - Table API - // member this.RenameTable(name: string, newName: string) : unit = - (findIndexByTableName name thisTables, newName) + (findIndexByTableName name this.Tables, newName) |> this.RenameTableAt // - Column CRUD API - // @@ -263,7 +271,7 @@ type ArcTables(thisTables:ResizeArray) = // - Column CRUD API - // member this.AddColumn(tableName: string, header: CompositeHeader, ?cells: CompositeCell [], ?columnIndex: int, ?forceReplace: bool) = - findIndexByTableName tableName thisTables + findIndexByTableName tableName this.Tables |> fun i -> this.AddColumnAt(i, header, ?cells=cells, ?columnIndex=columnIndex, ?forceReplace=forceReplace) // - Column CRUD API - // @@ -274,7 +282,7 @@ type ArcTables(thisTables:ResizeArray) = // - Column CRUD API - // member this.RemoveColumn(tableName: string, columnIndex: int) : unit = - (findIndexByTableName tableName thisTables, columnIndex) + (findIndexByTableName tableName this.Tables, columnIndex) |> this.RemoveColumnAt // - Column CRUD API - // @@ -285,7 +293,7 @@ type ArcTables(thisTables:ResizeArray) = // - Column CRUD API - // member this.UpdateColumn(tableName: string, columnIndex: int, header: CompositeHeader, ?cells: CompositeCell []) = - findIndexByTableName tableName thisTables + findIndexByTableName tableName this.Tables |> fun tableIndex -> this.UpdateColumnAt(tableIndex, columnIndex, header, ?cells=cells) // - Column CRUD API - // @@ -295,7 +303,7 @@ type ArcTables(thisTables:ResizeArray) = // - Column CRUD API - // member this.GetColumn(tableName: string, columnIndex: int) = - (findIndexByTableName tableName thisTables, columnIndex) + (findIndexByTableName tableName this.Tables, columnIndex) |> this.GetColumnAt // - Row CRUD API - // @@ -306,7 +314,7 @@ type ArcTables(thisTables:ResizeArray) = // - Row CRUD API - // member this.AddRow(tableName: string, ?cells: CompositeCell [], ?rowIndex: int) = - findIndexByTableName tableName thisTables + findIndexByTableName tableName this.Tables |> fun i -> this.AddRowAt(i, ?cells=cells, ?rowIndex=rowIndex) // - Row CRUD API - // @@ -317,7 +325,7 @@ type ArcTables(thisTables:ResizeArray) = // - Row CRUD API - // member this.RemoveRow(tableName: string, rowIndex: int) : unit = - (findIndexByTableName tableName thisTables, rowIndex) + (findIndexByTableName tableName this.Tables, rowIndex) |> this.RemoveRowAt // - Row CRUD API - // @@ -328,7 +336,7 @@ type ArcTables(thisTables:ResizeArray) = // - Row CRUD API - // member this.UpdateRow(tableName: string, rowIndex: int, cells: CompositeCell []) = - (findIndexByTableName tableName thisTables, rowIndex, cells) + (findIndexByTableName tableName this.Tables, rowIndex, cells) |> this.UpdateRowAt // - Row CRUD API - // @@ -338,7 +346,7 @@ type ArcTables(thisTables:ResizeArray) = // - Row CRUD API - // member this.GetRow(tableName: string, rowIndex: int) = - (findIndexByTableName tableName thisTables, rowIndex) + (findIndexByTableName tableName this.Tables, rowIndex) |> this.GetRowAt /// Return a list of all the processes in all the tables. diff --git a/src/ISA/ISA/ArcTypes/ArcTypes.fs b/src/ISA/ISA/ArcTypes/ArcTypes.fs index ff773493..e4910b76 100644 --- a/src/ISA/ISA/ArcTypes/ArcTypes.fs +++ b/src/ISA/ISA/ArcTypes/ArcTypes.fs @@ -80,7 +80,8 @@ module ArcTypesAux = [] type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?technologyType : OntologyAnnotation, ?technologyPlatform : OntologyAnnotation, ?tables: ResizeArray, ?performers : Person [], ?comments : Comment []) = - let tables = defaultArg tables <| ResizeArray() + inherit ArcTables(defaultArg tables <| ResizeArray()) + let performers = defaultArg performers [||] let comments = defaultArg comments [||] let mutable identifier : string = identifier @@ -101,7 +102,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno member val MeasurementType : OntologyAnnotation option = measurementType with get, set member val TechnologyType : OntologyAnnotation option = technologyType with get, set member val TechnologyPlatform : OntologyAnnotation option = technologyPlatform with get, set - member val Tables : ResizeArray = tables with get, set member val Performers : Person [] = performers with get, set member val Comments : Comment [] = comments with get, set @@ -119,12 +119,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno (comments : Comment []) = ArcAssay(identifier = identifier, ?measurementType = measurementType, ?technologyType = technologyType, ?technologyPlatform = technologyPlatform, tables =tables, performers = performers, comments = comments) - member this.TableCount - with get() = ArcTables(this.Tables).Count - - member this.TableNames - with get() = ArcTables(this.Tables).TableNames - member this.StudiesRegisteredIn with get () = match this.Investigation with @@ -134,11 +128,7 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno |> Seq.toArray | None -> [||] - // - Table API - // - // remark should this return ArcTable? - member this.AddTable(table:ArcTable, ?index: int) : unit = ArcTables(this.Tables).AddTable(table, ?index = index) - static member addTable(table:ArcTable, ?index: int) = fun (assay:ArcAssay) -> let c = assay.Copy() @@ -146,8 +136,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno c // - Table API - // - member this.AddTables(tables:seq, ?index: int) = ArcTables(this.Tables).AddTables(tables, ?index = index) - static member addTables(tables:seq, ?index: int) = fun (assay:ArcAssay) -> let c = assay.Copy() @@ -155,17 +143,12 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno c // - Table API - // - member this.InitTable(tableName:string, ?index: int) = ArcTables(this.Tables).InitTable(tableName, ?index = index) - static member initTable(tableName: string, ?index: int) = fun (assay:ArcAssay) -> let c = assay.Copy() c,c.InitTable(tableName, ?index=index) - // - Table API - // - member this.InitTables(tableNames:seq, ?index: int) = ArcTables(this.Tables).InitTables(tableNames, ?index = index) - static member initTables(tableNames:seq, ?index: int) = fun (assay:ArcAssay) -> let c = assay.Copy() @@ -173,8 +156,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno c // - Table API - // - member this.GetTableAt(index:int) : ArcTable = ArcTables(this.Tables).GetTableAt(index) - /// Receive **copy** of table at `index` static member getTableAt(index:int) : ArcAssay -> ArcTable = fun (assay:ArcAssay) -> @@ -182,8 +163,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay.GetTableAt(index) // - Table API - // - member this.GetTable(name: string) : ArcTable = ArcTables(this.Tables).GetTable(name) - /// Receive **copy** of table with `name` = `ArcTable.Name` static member getTable(name: string) : ArcAssay -> ArcTable = fun (assay:ArcAssay) -> @@ -191,8 +170,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay.GetTable(name) // - Table API - // - member this.UpdateTableAt(index:int, table:ArcTable) = ArcTables(this.Tables).UpdateTableAt(index, table) - static member updateTableAt(index:int, table:ArcTable) : ArcAssay -> ArcAssay = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -200,8 +177,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Table API - // - member this.UpdateTable(name: string, table:ArcTable) : unit = ArcTables(this.Tables).UpdateTable(name, table) - static member updateTable(name: string, table:ArcTable) : ArcAssay -> ArcAssay = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -209,8 +184,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Table API - // - member this.SetTableAt(index:int, table:ArcTable) = ArcTables(this.Tables).SetTableAt(index, table) - static member setTableAt(index:int, table:ArcTable) : ArcAssay -> ArcAssay = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -218,8 +191,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Table API - // - member this.SetTable(name: string, table:ArcTable) : unit = ArcTables(this.Tables).SetTable(name, table) - static member setTable(name: string, table:ArcTable) : ArcAssay -> ArcAssay = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -227,8 +198,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Table API - // - member this.RemoveTableAt(index:int) : unit = ArcTables(this.Tables).RemoveTableAt(index) - static member removeTableAt(index:int) : ArcAssay -> ArcAssay = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -236,8 +205,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Table API - // - member this.RemoveTable(name: string) : unit = ArcTables(this.Tables).RemoveTable(name) - static member removeTable(name: string) : ArcAssay -> ArcAssay = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -245,9 +212,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Table API - // - // Remark: This must stay `ArcTable -> unit` so name cannot be changed here. - member this.MapTableAt(index: int, updateFun: ArcTable -> unit) = ArcTables(this.Tables).MapTableAt(index, updateFun) - static member mapTableAt(index:int, updateFun: ArcTable -> unit) = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -255,8 +219,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Table API - // - member this.MapTable(name: string, updateFun: ArcTable -> unit) : unit = ArcTables(this.Tables).MapTable(name, updateFun) - static member updateTable(name: string, updateFun: ArcTable -> unit) : ArcAssay -> ArcAssay = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -264,8 +226,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Table API - // - member this.RenameTableAt(index: int, newName: string) : unit = ArcTables(this.Tables).RenameTableAt(index, newName) - static member renameTableAt(index: int, newName: string) : ArcAssay -> ArcAssay = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -273,8 +233,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Table API - // - member this.RenameTable(name: string, newName: string) : unit = ArcTables(this.Tables).RenameTable(name, newName) - static member renameTable(name: string, newName: string) : ArcAssay -> ArcAssay = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -282,9 +240,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Column CRUD API - // - member this.AddColumnAt(tableIndex:int, header: CompositeHeader, ?cells: CompositeCell [], ?columnIndex: int, ?forceReplace: bool) = - ArcTables(this.Tables).AddColumnAt(tableIndex, header, ?cells=cells, ?columnIndex = columnIndex, ?forceReplace = forceReplace) - static member addColumnAt(tableIndex:int, header: CompositeHeader, ?cells: CompositeCell [], ?columnIndex: int, ?forceReplace: bool) : ArcAssay -> ArcAssay = fun (assay: ArcAssay) -> let newAssay = assay.Copy() @@ -292,9 +247,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Column CRUD API - // - member this.AddColumn(tableName: string, header: CompositeHeader, ?cells: CompositeCell [], ?columnIndex: int, ?forceReplace: bool) = - ArcTables(this.Tables).AddColumn(tableName, header, ?cells=cells, ?columnIndex = columnIndex, ?forceReplace = forceReplace) - static member addColumn(tableName: string, header: CompositeHeader, ?cells: CompositeCell [], ?columnIndex: int, ?forceReplace: bool) : ArcAssay -> ArcAssay = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -302,9 +254,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Column CRUD API - // - member this.RemoveColumnAt(tableIndex: int, columnIndex: int) = - ArcTables(this.Tables).RemoveColumnAt(tableIndex, columnIndex) - static member removeColumnAt(tableIndex: int, columnIndex: int) = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -312,9 +261,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Column CRUD API - // - member this.RemoveColumn(tableName: string, columnIndex: int) : unit = - ArcTables(this.Tables).RemoveColumn(tableName, columnIndex) - static member removeColumn(tableName: string, columnIndex: int) : ArcAssay -> ArcAssay = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -322,9 +268,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Column CRUD API - // - member this.UpdateColumnAt(tableIndex: int, columnIndex: int, header: CompositeHeader, ?cells: CompositeCell []) = - ArcTables(this.Tables).UpdateColumnAt(tableIndex, columnIndex, header, ?cells = cells) - static member updateColumnAt(tableIndex: int, columnIndex: int, header: CompositeHeader, ?cells: CompositeCell []) = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -332,9 +275,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Column CRUD API - // - member this.UpdateColumn(tableName: string, columnIndex: int, header: CompositeHeader, ?cells: CompositeCell []) = - ArcTables(this.Tables).UpdateColumn(tableName, columnIndex, header, ?cells=cells) - static member updateColumn(tableName: string, columnIndex: int, header: CompositeHeader, ?cells: CompositeCell []) = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -342,27 +282,18 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Column CRUD API - // - member this.GetColumnAt(tableIndex: int, columnIndex: int) = - ArcTables(this.Tables).GetColumnAt(tableIndex, columnIndex) - static member getColumnAt(tableIndex: int, columnIndex: int) = fun (assay:ArcAssay) -> let newAssay = assay.Copy() newAssay.GetColumnAt(tableIndex, columnIndex) // - Column CRUD API - // - member this.GetColumn(tableName: string, columnIndex: int) = - ArcTables(this.Tables).GetColumn(tableName, columnIndex) - static member getColumn(tableName: string, columnIndex: int) = fun (assay: ArcAssay) -> let newAssay = assay.Copy() newAssay.GetColumn(tableName, columnIndex) // - Row CRUD API - // - member this.AddRowAt(tableIndex:int, ?cells: CompositeCell [], ?rowIndex: int) = - ArcTables(this.Tables).AddRowAt(tableIndex, ?cells=cells, ?rowIndex = rowIndex) - static member addRowAt(tableIndex:int, ?cells: CompositeCell [], ?rowIndex: int) : ArcAssay -> ArcAssay = fun (assay: ArcAssay) -> let newAssay = assay.Copy() @@ -370,9 +301,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Row CRUD API - // - member this.AddRow(tableName: string, ?cells: CompositeCell [], ?rowIndex: int) = - ArcTables(this.Tables).AddRow(tableName, ?cells=cells, ?rowIndex = rowIndex) - static member addRow(tableName: string, ?cells: CompositeCell [], ?rowIndex: int) : ArcAssay -> ArcAssay = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -380,9 +308,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Row CRUD API - // - member this.RemoveRowAt(tableIndex: int, rowIndex: int) = - ArcTables(this.Tables).RemoveRowAt(tableIndex, rowIndex) - static member removeRowAt(tableIndex: int, rowIndex: int) = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -390,9 +315,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Row CRUD API - // - member this.RemoveRow(tableName: string, rowIndex: int) : unit = - ArcTables(this.Tables).RemoveRow(tableName, rowIndex) - static member removeRow(tableName: string, rowIndex: int) : ArcAssay -> ArcAssay = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -400,9 +322,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Row CRUD API - // - member this.UpdateRowAt(tableIndex: int, rowIndex: int, cells: CompositeCell []) = - ArcTables(this.Tables).UpdateRowAt(tableIndex, rowIndex, cells) - static member updateRowAt(tableIndex: int, rowIndex: int, cells: CompositeCell []) = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -410,9 +329,6 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Row CRUD API - // - member this.UpdateRow(tableName: string, rowIndex: int, cells: CompositeCell []) = - ArcTables(this.Tables).UpdateRow(tableName, rowIndex, cells) - static member updateRow(tableName: string, rowIndex: int, cells: CompositeCell []) = fun (assay:ArcAssay) -> let newAssay = assay.Copy() @@ -420,18 +336,12 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno newAssay // - Row CRUD API - // - member this.GetRowAt(tableIndex: int, rowIndex: int) = - ArcTables(this.Tables).GetRowAt(tableIndex, rowIndex) - static member getRowAt(tableIndex: int, rowIndex: int) = fun (assay:ArcAssay) -> let newAssay = assay.Copy() newAssay.GetRowAt(tableIndex, rowIndex) // - Row CRUD API - // - member this.GetRow(tableName: string, rowIndex: int) = - ArcTables(this.Tables).GetRow(tableName, rowIndex) - static member getRow(tableName: string, rowIndex: int) = fun (assay: ArcAssay) -> let newAssay = assay.Copy() @@ -642,10 +552,11 @@ type ArcAssay(identifier: string, ?measurementType : OntologyAnnotation, ?techno [] type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publicReleaseDate, ?publications, ?contacts, ?studyDesignDescriptors, ?tables, ?registeredAssayIdentifiers: ResizeArray, ?factors, ?comments) = + inherit ArcTables(defaultArg tables <| ResizeArray()) + let publications = defaultArg publications [||] let contacts = defaultArg contacts [||] let studyDesignDescriptors = defaultArg studyDesignDescriptors [||] - let tables = defaultArg tables <| ResizeArray() let registeredAssayIdentifiers = defaultArg registeredAssayIdentifiers <| ResizeArray() let factors = defaultArg factors [||] let comments = defaultArg comments [||] @@ -668,7 +579,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi member val Publications : Publication [] = publications with get, set member val Contacts : Person [] = contacts with get, set member val StudyDesignDescriptors : OntologyAnnotation [] = studyDesignDescriptors with get, set - member val Tables : ResizeArray = tables with get, set member val RegisteredAssayIdentifiers : ResizeArray = registeredAssayIdentifiers with get, set member val Factors : Factor [] = factors with get, set member val Comments : Comment []= comments with get, set @@ -803,17 +713,9 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi //////////////////////////////////// // - Copy & Paste from ArcAssay - // //////////////////////////////////// - - member this.TableCount - with get() = ArcTables(this.Tables).Count - member this.TableNames - with get() = ArcTables(this.Tables).TableNames - - // - Table API - // + // - Table API - // // remark should this return ArcTable? - member this.AddTable(table:ArcTable, ?index: int) = ArcTables(this.Tables).AddTable(table, ?index = index) - static member addTable(table:ArcTable, ?index: int) = fun (study:ArcStudy) -> let c = study.Copy() @@ -821,8 +723,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi c // - Table API - // - member this.AddTables(tables:seq, ?index: int) = ArcTables(this.Tables).AddTables(tables, ?index = index) - static member addTables(tables:seq, ?index: int) = fun (study:ArcStudy) -> let c = study.Copy() @@ -830,8 +730,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi c // - Table API - // - member this.InitTable(tableName:string, ?index: int) = ArcTables(this.Tables).InitTable(tableName, ?index = index) - static member initTable(tableName: string, ?index: int) = fun (study:ArcStudy) -> let c = study.Copy() @@ -839,8 +737,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi // - Table API - // - member this.InitTables(tableNames:seq, ?index: int) = ArcTables(this.Tables).InitTables(tableNames, ?index = index) - static member initTables(tableNames:seq, ?index: int) = fun (study:ArcStudy) -> let c = study.Copy() @@ -848,8 +744,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi c // - Table API - // - member this.GetTableAt(index:int) : ArcTable = ArcTables(this.Tables).GetTableAt(index) - /// Receive **copy** of table at `index` static member getTableAt(index:int) : ArcStudy -> ArcTable = fun (study:ArcStudy) -> @@ -857,8 +751,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay.GetTableAt(index) // - Table API - // - member this.GetTable(name: string) : ArcTable = ArcTables(this.Tables).GetTable(name) - /// Receive **copy** of table with `name` = `ArcTable.Name` static member getTable(name: string) : ArcStudy -> ArcTable = fun (study:ArcStudy) -> @@ -866,8 +758,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay.GetTable(name) // - Table API - // - member this.UpdateTableAt(index:int, table:ArcTable) = ArcTables(this.Tables).UpdateTableAt(index, table) - static member updateTableAt(index:int, table:ArcTable) : ArcStudy -> ArcStudy = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -875,8 +765,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Table API - // - member this.UpdateTable(name: string, table:ArcTable) : unit = ArcTables(this.Tables).UpdateTable(name, table) - static member updateTable(name: string, table:ArcTable) : ArcStudy -> ArcStudy = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -885,8 +773,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi // - Table API - // - member this.SetTableAt(index:int, table:ArcTable) = ArcTables(this.Tables).SetTableAt(index, table) - static member setTableAt(index:int, table:ArcTable) : ArcStudy -> ArcStudy = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -894,8 +780,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Table API - // - member this.SetTable(name: string, table:ArcTable) : unit = ArcTables(this.Tables).SetTable(name, table) - static member setTable(name: string, table:ArcTable) : ArcStudy -> ArcStudy = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -903,8 +787,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Table API - // - member this.RemoveTableAt(index:int) : unit = ArcTables(this.Tables).RemoveTableAt(index) - static member removeTableAt(index:int) : ArcStudy -> ArcStudy = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -912,8 +794,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Table API - // - member this.RemoveTable(name: string) : unit = ArcTables(this.Tables).RemoveTable(name) - static member removeTable(name: string) : ArcStudy -> ArcStudy = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -922,8 +802,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi // - Table API - // // Remark: This must stay `ArcTable -> unit` so name cannot be changed here. - member this.MapTableAt(index: int, updateFun: ArcTable -> unit) = ArcTables(this.Tables).MapTableAt(index, updateFun) - static member mapTableAt(index:int, updateFun: ArcTable -> unit) = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -931,8 +809,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Table API - // - member this.MapTable(name: string, updateFun: ArcTable -> unit) : unit = ArcTables(this.Tables).MapTable(name, updateFun) - static member mapTable(name: string, updateFun: ArcTable -> unit) : ArcStudy -> ArcStudy = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -940,8 +816,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Table API - // - member this.RenameTableAt(index: int, newName: string) : unit = ArcTables(this.Tables).RenameTableAt(index, newName) - static member renameTableAt(index: int, newName: string) : ArcStudy -> ArcStudy = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -949,8 +823,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Table API - // - member this.RenameTable(name: string, newName: string) : unit = ArcTables(this.Tables).RenameTable(name, newName) - static member renameTable(name: string, newName: string) : ArcStudy -> ArcStudy = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -958,9 +830,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Column CRUD API - // - member this.AddColumnAt(tableIndex:int, header: CompositeHeader, ?cells: CompositeCell [], ?columnIndex: int, ?forceReplace: bool) = - ArcTables(this.Tables).AddColumnAt(tableIndex, header, ?cells=cells, ?columnIndex = columnIndex, ?forceReplace = forceReplace) - static member addColumnAt(tableIndex:int, header: CompositeHeader, ?cells: CompositeCell [], ?columnIndex: int, ?forceReplace: bool) : ArcStudy -> ArcStudy = fun (study: ArcStudy) -> let newAssay = study.Copy() @@ -968,9 +837,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Column CRUD API - // - member this.AddColumn(tableName: string, header: CompositeHeader, ?cells: CompositeCell [], ?columnIndex: int, ?forceReplace: bool) = - ArcTables(this.Tables).AddColumn(tableName, header, ?cells=cells, ?columnIndex = columnIndex, ?forceReplace = forceReplace) - static member addColumn(tableName: string, header: CompositeHeader, ?cells: CompositeCell [], ?columnIndex: int, ?forceReplace: bool) : ArcStudy -> ArcStudy = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -978,9 +844,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Column CRUD API - // - member this.RemoveColumnAt(tableIndex: int, columnIndex: int) = - ArcTables(this.Tables).RemoveColumnAt(tableIndex, columnIndex) - static member removeColumnAt(tableIndex: int, columnIndex: int) = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -988,9 +851,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Column CRUD API - // - member this.RemoveColumn(tableName: string, columnIndex: int) : unit = - ArcTables(this.Tables).RemoveColumn(tableName, columnIndex) - static member removeColumn(tableName: string, columnIndex: int) : ArcStudy -> ArcStudy = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -998,9 +858,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Column CRUD API - // - member this.UpdateColumnAt(tableIndex: int, columnIndex: int, header: CompositeHeader, ?cells: CompositeCell []) = - ArcTables(this.Tables).UpdateColumnAt(tableIndex, columnIndex, header, ?cells = cells) - static member updateColumnAt(tableIndex: int, columnIndex: int, header: CompositeHeader, ?cells: CompositeCell []) = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -1008,9 +865,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Column CRUD API - // - member this.UpdateColumn(tableName: string, columnIndex: int, header: CompositeHeader, ?cells: CompositeCell []) = - ArcTables(this.Tables).UpdateColumn(tableName, columnIndex, header, ?cells=cells) - static member updateColumn(tableName: string, columnIndex: int, header: CompositeHeader, ?cells: CompositeCell []) = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -1018,27 +872,18 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Column CRUD API - // - member this.GetColumnAt(tableIndex: int, columnIndex: int) = - ArcTables(this.Tables).GetColumnAt(tableIndex, columnIndex) - static member getColumnAt(tableIndex: int, columnIndex: int) = fun (study:ArcStudy) -> let newAssay = study.Copy() newAssay.GetColumnAt(tableIndex, columnIndex) // - Column CRUD API - // - member this.GetColumn(tableName: string, columnIndex: int) = - ArcTables(this.Tables).GetColumn(tableName, columnIndex) - static member getColumn(tableName: string, columnIndex: int) = fun (study: ArcStudy) -> let newAssay = study.Copy() newAssay.GetColumn(tableName, columnIndex) // - Row CRUD API - // - member this.AddRowAt(tableIndex:int, ?cells: CompositeCell [], ?rowIndex: int) = - ArcTables(this.Tables).AddRowAt(tableIndex, ?cells=cells, ?rowIndex = rowIndex) - static member addRowAt(tableIndex:int, ?cells: CompositeCell [], ?rowIndex: int) : ArcStudy -> ArcStudy = fun (study: ArcStudy) -> let newAssay = study.Copy() @@ -1046,9 +891,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Row CRUD API - // - member this.AddRow(tableName: string, ?cells: CompositeCell [], ?rowIndex: int) = - ArcTables(this.Tables).AddRow(tableName, ?cells=cells, ?rowIndex = rowIndex) - static member addRow(tableName: string, ?cells: CompositeCell [], ?rowIndex: int) : ArcStudy -> ArcStudy = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -1056,9 +898,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Row CRUD API - // - member this.RemoveRowAt(tableIndex: int, rowIndex: int) = - ArcTables(this.Tables).RemoveRowAt(tableIndex, rowIndex) - static member removeRowAt(tableIndex: int, rowIndex: int) = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -1066,9 +905,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Row CRUD API - // - member this.RemoveRow(tableName: string, rowIndex: int) : unit = - ArcTables(this.Tables).RemoveRow(tableName, rowIndex) - static member removeRow(tableName: string, rowIndex: int) : ArcStudy -> ArcStudy = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -1076,9 +912,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Row CRUD API - // - member this.UpdateRowAt(tableIndex: int, rowIndex: int, cells: CompositeCell []) = - ArcTables(this.Tables).UpdateRowAt(tableIndex, rowIndex, cells) - static member updateRowAt(tableIndex: int, rowIndex: int, cells: CompositeCell []) = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -1086,9 +919,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Row CRUD API - // - member this.UpdateRow(tableName: string, rowIndex: int, cells: CompositeCell []) = - ArcTables(this.Tables).UpdateRow(tableName, rowIndex, cells) - static member updateRow(tableName: string, rowIndex: int, cells: CompositeCell []) = fun (study:ArcStudy) -> let newAssay = study.Copy() @@ -1096,18 +926,12 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi newAssay // - Row CRUD API - // - member this.GetRowAt(tableIndex: int, rowIndex: int) = - ArcTables(this.Tables).GetRowAt(tableIndex, rowIndex) - static member getRowAt(tableIndex: int, rowIndex: int) = fun (study:ArcStudy) -> let newAssay = study.Copy() newAssay.GetRowAt(tableIndex, rowIndex) // - Row CRUD API - // - member this.GetRow(tableName: string, rowIndex: int) = - ArcTables(this.Tables).GetRow(tableName, rowIndex) - static member getRow(tableName: string, rowIndex: int) = fun (study: ArcStudy) -> let newAssay = study.Copy() @@ -1119,7 +943,6 @@ type ArcStudy(identifier : string, ?title, ?description, ?submissionDate, ?publi member internal this.RemoveFromInvestigation () = this.Investigation <- None - /// Copies ArcStudy object without the pointer to the parent ArcInvestigation /// /// This copy does only contain the identifiers of the registered ArcAssays and not the actual objects. diff --git a/tests/ARCtrl/ARCtrl.Tests.fs b/tests/ARCtrl/ARCtrl.Tests.fs index 129daace..837fa299 100644 --- a/tests/ARCtrl/ARCtrl.Tests.fs +++ b/tests/ARCtrl/ARCtrl.Tests.fs @@ -451,7 +451,7 @@ let private ``payload_file_filters`` = } ] -let main = testList "main" [ +let main = testList "ARCtrl" [ test_model test_updateFileSystem test_isaFromContracts diff --git a/tests/ISA/ISA.Spreadsheet.Tests/AssayFileTests.fs b/tests/ISA/ISA.Spreadsheet.Tests/AssayFileTests.fs index c004fbb8..7d24cc79 100644 --- a/tests/ISA/ISA.Spreadsheet.Tests/AssayFileTests.fs +++ b/tests/ISA/ISA.Spreadsheet.Tests/AssayFileTests.fs @@ -492,8 +492,50 @@ let testAssayFileReader = //) ] +let tests_ArcTable = testList "ArcTable" [ + testList "Read/Write" [ + let assayIdentifier = "MyAssay" + let tableName = "AssayProtocol" + let protocolName = "MyProtocol" + let inputHeader = CompositeHeader.Input IOType.Sample + let inputCell = (CompositeCell.createFreeText "inputValueName") + let createTestAssay() = + let assay = ArcAssay(assayIdentifier) + let t = ArcTable.init(tableName) + t.AddProtocolNameColumn(Array.create 2 protocolName) + t.AddColumn(inputHeader, Array.create 2 inputCell) + assay.AddTable t + assay + let ensureTestAssay (assay: ArcAssay) = + Expect.equal assay.Identifier assayIdentifier "identifier" + Expect.equal assay.TableCount 1 "tablecount" + Expect.equal assay.Tables.[0].Name tableName "table.name" + Expect.equal assay.Tables.[0].ColumnCount 2 "table.columncount" + testCase "ensure test assay" <| fun _ -> + let assay = createTestAssay() + ensureTestAssay assay + testCase "ArcAssay.toFsWorkbook" <| fun _ -> + let assay = createTestAssay() + let wb = ArcAssay.toFsWorkbook assay + let wss = wb.GetWorksheets() + Expect.hasLength wss 2 "worksheets count" + let metadata = wss.[0] + let tableWorksheet = wss.[1] + Expect.hasLength metadata.Tables 0 "no tables in metadata sheet" + Expect.hasLength tableWorksheet.Tables 1 "1 table in protocol sheet" + Expect.equal tableWorksheet.Name tableName "worksheet.name" + let table = tableWorksheet.Tables.[0] + Expect.equal (table.ColumnCount()) 2 "table.columncount" + testCase "roundabout" <| fun _ -> + let assay = createTestAssay() + let wb = ArcAssay.toFsWorkbook assay + let actual = ArcAssay.fromFsWorkbook wb + ensureTestAssay actual + ] +] let main = testList "AssayFile" [ testMetaDataFunctions + tests_ArcTable ] \ No newline at end of file diff --git a/tests/ISA/ISA.Tests/ArcJsonConversionTests.fs b/tests/ISA/ISA.Tests/ArcJsonConversionTests.fs index 65e18e27..ef70d2c7 100644 --- a/tests/ISA/ISA.Tests/ArcJsonConversionTests.fs +++ b/tests/ISA/ISA.Tests/ArcJsonConversionTests.fs @@ -296,7 +296,7 @@ let private tests_arcTablesProcessSeq = let t = ArcTables(ResizeArray()) let processes = t.GetProcesses() let resultTables = ArcTables.fromProcesses processes - Expect.equal resultTables.Count 0 "Should have 0 tables" + Expect.equal resultTables.TableCount 0 "Should have 0 tables" ) testCase "EmptyTable GetProcesses" (fun () -> @@ -318,8 +318,8 @@ let private tests_arcTablesProcessSeq = let tables = ArcTables(ResizeArray([t])) let processes = tables.GetProcesses() let table = ArcTables.fromProcesses processes - Expect.equal table.Count 1 "Should have 1 table" - Expect.arcTableEqual table.[0] t "Table should be equal" + Expect.equal table.TableCount 1 "Should have 1 table" + Expect.arcTableEqual table.Tables.[0] t "Table should be equal" ) testCase "SimpleTables GetAndFromProcesses" (fun () -> @@ -333,9 +333,9 @@ let private tests_arcTablesProcessSeq = let expectedTables = [ t1;t2 ] - Expect.equal resultTables.Count 2 "2 Tables should have been created" - Expect.arcTableEqual resultTables.[0] expectedTables.[0] "Table 1 should be equal" - Expect.arcTableEqual resultTables.[1] expectedTables.[1] "Table 2 should be equal" + Expect.equal resultTables.TableCount 2 "2 Tables should have been created" + Expect.arcTableEqual resultTables.Tables.[0] expectedTables.[0] "Table 1 should be equal" + Expect.arcTableEqual resultTables.Tables.[1] expectedTables.[1] "Table 2 should be equal" ) testCase "OneWithDifferentParamVals GetAndFromProcesses" (fun () -> @@ -353,9 +353,9 @@ let private tests_arcTablesProcessSeq = t2 ] - Expect.equal resultTables.Count 2 "2 Tables should have been created" - Expect.arcTableEqual resultTables.[0] expectedTables.[0] "Table 1 should be equal" - Expect.arcTableEqual resultTables.[1] expectedTables.[1] "Table 2 should be equal" + Expect.equal resultTables.TableCount 2 "2 Tables should have been created" + Expect.arcTableEqual resultTables.Tables.[0] expectedTables.[0] "Table 1 should be equal" + Expect.arcTableEqual resultTables.Tables.[1] expectedTables.[1] "Table 2 should be equal" ) ] diff --git a/tests/ISA/ISA.Tests/ArcStudy.Tests.fs b/tests/ISA/ISA.Tests/ArcStudy.Tests.fs index f16c6e78..5eaef149 100644 --- a/tests/ISA/ISA.Tests/ArcStudy.Tests.fs +++ b/tests/ISA/ISA.Tests/ArcStudy.Tests.fs @@ -366,7 +366,7 @@ let tests_UpdateBy = testList "UpdateReferenceByStudyFile" [ Expect.notEqual actual.Identifier next.Identifier "Identifier" let result = actual.Tables - Expect.equal result.Count tables.Count "Should be same number of tables" + Expect.equal result.Count tables.TableCount "Should be same number of tables" let resultTable = result.[0] Expect.equal resultTable.Name tableOfInterest.Name "Should be same table name" Expect.equal resultTable.ColumnCount (tableOfInterest.ColumnCount + 1) "Should be same number of columns" diff --git a/tests/ISA/ISA.Tests/ArcTables.Tests.fs b/tests/ISA/ISA.Tests/ArcTables.Tests.fs index 7c070eed..f8178de8 100644 --- a/tests/ISA/ISA.Tests/ArcTables.Tests.fs +++ b/tests/ISA/ISA.Tests/ArcTables.Tests.fs @@ -122,6 +122,55 @@ module TestObjects = open TestObjects +let tests_Item = testList "Item" [ + // update test as soon as https://github.com/fable-compiler/Fable/issues/3571 is fixed + ptestCase "simple" <| fun _ -> + let table1 = ArcTable.init("Table 1") + let table2 = ArcTable.init("Table 2") + let tableSeq = [table1; table2] + let arctables = ArcTables(ResizeArray tableSeq) + //Expect.equal arctables.[0] table1 "table1" + //Expect.equal arctables.[1] table2 "table2" + Expect.isTrue true "" +] + +let tests_IEnumberable = testList "IEnumerable" [ + let createTestTables() = + let table1 = ArcTable.init("Table 1") + let table2 = ArcTable.init("Table 2") + ArcTables(ResizeArray [table1; table2]) + testCase "Seq.length" <| fun _ -> + let tables = createTestTables() + let actual = Seq.length tables + Expect.equal actual 2 "" + testCase "Seq.map" <| fun _ -> + let tables = createTestTables() + let actual = tables |> Seq.map (fun t -> t.Name) + let expected = ["Table 1"; "Table 2"] + Expect.sequenceEqual actual expected "" +] + +let tests_member = testList "member" [ + testCase "TableCount init" <| fun _ -> + let tableSeq = [ArcTable.init("Table 1"); ArcTable.init("Table 2")] + let arctables = ArcTables(ResizeArray tableSeq) + Expect.equal arctables.TableCount 2 "TableCount" + testCase "TableCount addedTable" <| fun _ -> + let tableSeq = [ArcTable.init("Table 1"); ArcTable.init("Table 2")] + let arctables = ArcTables(ResizeArray tableSeq) + let _ = arctables.InitTable("New Table!") + Expect.equal arctables.TableCount 3 "TableCount should increase to 3" + testCase "TableNames init" <| fun _ -> + let tableSeq = [ArcTable.init("Table 1"); ArcTable.init("Table 2")] + let arctables = ArcTables(ResizeArray tableSeq) + Expect.sequenceEqual arctables.TableNames ["Table 1"; "Table 2"] "TableNames" + testCase "TableNames addedTable" <| fun _ -> + let tableSeq = [ArcTable.init("Table 1"); ArcTable.init("Table 2")] + let arctables = ArcTables(ResizeArray tableSeq) + let _ = arctables.InitTable("New Table!") + Expect.sequenceEqual arctables.TableNames ["Table 1"; "Table 2"; "New Table!"] "TableNames" +] + let updateReferenceWithSheet = testList "UpdateReferenceWithSheet" [ @@ -132,8 +181,8 @@ let updateReferenceWithSheet = let refTables = ArcTables.ofSeq [] let result = ArcTables.updateReferenceTablesBySheets(refTables,tables) - Expect.equal result.Count tables.Count "Should be same number of tables" - let resultTable = result.[0] + Expect.equal result.TableCount tables.TableCount "Should be same number of tables" + let resultTable = result.Tables.[0] Expect.equal resultTable.Name tableOfInterest.Name "Should be same table name" Expect.equal resultTable.ColumnCount tableOfInterest.ColumnCount "Should be same number of columns" Expect.equal resultTable.RowCount tableOfInterest.RowCount "Should be same number of rows" @@ -145,8 +194,8 @@ let updateReferenceWithSheet = let refTables = ArcTables.ofSeq [descriptionRefTable2()] let result = ArcTables.updateReferenceTablesBySheets(refTables,tables) - Expect.equal result.Count tables.Count "Should be same number of tables" - let resultTable = result.[0] + Expect.equal result.TableCount tables.TableCount "Should be same number of tables" + let resultTable = result.Tables.[0] Expect.equal resultTable.Name tableOfInterest.Name "Should be same table name" Expect.equal resultTable.ColumnCount tableOfInterest.ColumnCount "Should be same number of columns" Expect.equal resultTable.RowCount tableOfInterest.RowCount "Should be same number of rows" @@ -159,13 +208,13 @@ let updateReferenceWithSheet = let refTables = ArcTables.ofSeq [refTable] let result = ArcTables.updateReferenceTablesBySheets(refTables,tables,true) - Expect.equal result.Count (tables.Count + 1) "Should be same number of tables" - let resultRefTable = result.[0] + Expect.equal result.TableCount (tables.TableCount + 1) "Should be same number of tables" + let resultRefTable = result.Tables.[0] Expect.equal resultRefTable.Name refTable.Name "Should be same table name" Expect.equal resultRefTable.ColumnCount refTable.ColumnCount "Should be same number of columns" Expect.equal resultRefTable.RowCount refTable.RowCount "Should be same number of rows" - let resultTable = result.[1] + let resultTable = result.Tables.[1] Expect.equal resultTable.Name tableOfInterest.Name "Should be same table name" Expect.equal resultTable.ColumnCount tableOfInterest.ColumnCount "Should be same number of columns" Expect.equal resultTable.RowCount tableOfInterest.RowCount "Should be same number of rows" @@ -177,8 +226,8 @@ let updateReferenceWithSheet = let refTables = ArcTables.ofSeq [descriptionRefTable()] let result = ArcTables.updateReferenceTablesBySheets(refTables,tables) - Expect.equal result.Count tables.Count "Should be same number of tables" - let resultTable = result.[0] + Expect.equal result.TableCount tables.TableCount "Should be same number of tables" + let resultTable = result.Tables.[0] Expect.equal resultTable.Name tableOfInterest.Name "Should be same table name" Expect.equal resultTable.ColumnCount (tableOfInterest.ColumnCount + 1) "Should be same number of columns" Expect.equal resultTable.RowCount tableOfInterest.RowCount "Should be same number of rows" @@ -193,8 +242,8 @@ let updateReferenceWithSheet = let refTables = ArcTables.ofSeq [descriptionRefTable()] let result = ArcTables.updateReferenceTablesBySheets(refTables,tables) - Expect.equal result.Count tables.Count "Should be same number of tables" - let resultTable = result.[0] + Expect.equal result.TableCount tables.TableCount "Should be same number of tables" + let resultTable = result.Tables.[0] Expect.equal resultTable.Name tableOfInterest.Name "Should be same table name" Expect.equal resultTable.ColumnCount (tableOfInterest.ColumnCount + 2) "Should be same number of columns" Expect.equal resultTable.RowCount tableOfInterest.RowCount "Should be same number of rows" @@ -209,8 +258,8 @@ let updateReferenceWithSheet = let refTables = ArcTables.ofSeq [sheetWithNoREF()] let result = ArcTables.updateReferenceTablesBySheets(refTables,tables) - Expect.equal result.Count tables.Count "Should be same number of tables" - let resultTable = result.[0] + Expect.equal result.TableCount tables.TableCount "Should be same number of tables" + let resultTable = result.Tables.[0] Expect.equal resultTable.Name tableOfInterest.Name "Should be same table name" Expect.equal resultTable.ColumnCount (tableOfInterest.ColumnCount) "Should have same number of columns as before" Expect.equal resultTable.RowCount tableOfInterest.RowCount "Should be same number of columns as before" @@ -223,9 +272,9 @@ let updateReferenceWithSheet = let refTables = ArcTables.ofSeq [descriptionRefTable()] let result = ArcTables.updateReferenceTablesBySheets(refTables,tables) - Expect.equal result.Count tables.Count "Should be same number of tables" + Expect.equal result.TableCount tables.TableCount "Should be same number of tables" - let resultTable1 = result.[0] + let resultTable1 = result.Tables.[0] Expect.equal resultTable1.Name tableOfInterest1.Name "Should be same table name" Expect.equal resultTable1.ColumnCount (tableOfInterest1.ColumnCount + 1) "Should be same number of columns" Expect.equal tableOfInterest1.RowCount tableOfInterest1.RowCount "Should be same number of rows" @@ -238,7 +287,7 @@ let updateReferenceWithSheet = (Array.create 2 (CompositeCell.createTerm oa_chlamy)) "Check for previous param correctness" - let resultTable2 = result.[1] + let resultTable2 = result.Tables.[1] Expect.equal resultTable2.Name tableOfInterest2.Name "Should be same table name" Expect.equal resultTable2.ColumnCount (tableOfInterest2.ColumnCount + 1) "Should be same number of columns" Expect.equal tableOfInterest2.RowCount tableOfInterest2.RowCount "Should be same number of rows" @@ -258,8 +307,8 @@ let updateReferenceWithSheet = let refTables = ArcTables.ofSeq [descriptionRefTable();descriptionRefTable2()] let result = ArcTables.updateReferenceTablesBySheets(refTables,tables) - Expect.equal result.Count tables.Count "Should be same number of tables" - let resultTable = result.[0] + Expect.equal result.TableCount tables.TableCount "Should be same number of tables" + let resultTable = result.Tables.[0] Expect.equal resultTable.Name tableOfInterest.Name "Should be same table name" Expect.equal resultTable.ColumnCount (tableOfInterest.ColumnCount + 1) "Should be same number of columns" Expect.equal resultTable.RowCount tableOfInterest.RowCount "Should be same number of rows" @@ -283,8 +332,8 @@ let updateReferenceWithSheet = let refTables = ArcTables.ofSeq [descriptionRefTable();descriptionRefTable2()] let result = ArcTables.updateReferenceTablesBySheets(refTables,tables) - Expect.equal result.Count tables.Count "Should be same number of tables" - let resultTable = result.[0] + Expect.equal result.TableCount tables.TableCount "Should be same number of tables" + let resultTable = result.Tables.[0] Expect.equal resultTable.Name tableOfInterest.Name "Should be same table name" Expect.equal resultTable.ColumnCount (tableOfInterest.ColumnCount + 1) "Should be same number of columns" Expect.equal resultTable.RowCount tableOfInterest.RowCount "Should be same number of rows" @@ -305,5 +354,8 @@ let updateReferenceWithSheet = let main = testList "ArcTablesTests" [ + tests_Item + tests_IEnumberable + tests_member updateReferenceWithSheet ] \ No newline at end of file diff --git a/tests/TestingUtils/TestObjects.Contract/ISA.fs b/tests/TestingUtils/TestObjects.Contract/ISA.fs index 7c6d6ddc..f5e267ef 100644 --- a/tests/TestingUtils/TestObjects.Contract/ISA.fs +++ b/tests/TestingUtils/TestObjects.Contract/ISA.fs @@ -107,6 +107,11 @@ module UpdateAssayWithStudyProtocol = study.AddTable refT let assayWB = ArcAssay.toFsWorkbook assay + + let retAssay = ArcAssay.fromFsWorkbook assayWB + + printfn "%A" ("retAssay.TableCount)", retAssay.TableCount) + let assayReadContract = Contract.create( Operation.READ,