From 1a076680587ade77048318a9fd347c3190e65e22 Mon Sep 17 00:00:00 2001 From: Johannes Luff Date: Tue, 17 Sep 2024 17:03:50 +0200 Subject: [PATCH 1/6] added gas type dependency updating jest version was necessary --- package-lock.json | 574 +++++----------------------------------------- package.json | 3 +- tsconfig.json | 11 +- 3 files changed, 64 insertions(+), 524 deletions(-) diff --git a/package-lock.json b/package-lock.json index e9a69dd..5aea494 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "1.5.2", "license": "BSD-3-Clause", "devDependencies": { - "@types/jest": "^26.0.19", + "@types/google-apps-script": "^1.0.83", + "@types/jest": "^27.5.2", "gasmask": "^1.3.8", "jest": "^27.5.1", "ts-jest": "^27.1.3", @@ -966,22 +967,6 @@ "@types/yargs-parser": "*" } }, - "node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, "node_modules/@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -1050,6 +1035,13 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/google-apps-script": { + "version": "1.0.83", + "resolved": "https://registry.npmjs.org/@types/google-apps-script/-/google-apps-script-1.0.83.tgz", + "integrity": "sha512-o+QNeNZxPAfYHzRiLHjub9qF0IILg21r9MzYlnrIHUT+/wcC70aqDfedmzKTgtzsj79zvoTZD0cjGgy46+1Ynw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -1084,13 +1076,14 @@ } }, "node_modules/@types/jest": { - "version": "26.0.20", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.20.tgz", - "integrity": "sha512-9zi2Y+5USJRxd0FsahERhBwlcvFh6D2GLQnY2FH2BzK8J9s9omvNHIbvABwIluXa0fD8XVKMLTO0aOEuUfACAA==", + "version": "27.5.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz", + "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==", "dev": true, + "license": "MIT", "dependencies": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" + "jest-matcher-utils": "^27.0.0", + "pretty-format": "^27.0.0" } }, "node_modules/@types/node": { @@ -1111,15 +1104,6 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, - "node_modules/@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/@types/yargs-parser": { "version": "20.2.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", @@ -1693,15 +1677,6 @@ "node": ">=8" } }, - "node_modules/diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "dev": true, - "engines": { - "node": ">= 10.14.2" - } - }, "node_modules/domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -2465,32 +2440,6 @@ "@types/yargs-parser": "*" } }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/jest-cli": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", @@ -2618,18 +2567,6 @@ "@types/yargs-parser": "*" } }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-config/node_modules/jest-get-type": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", @@ -2639,35 +2576,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-config/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, "node_modules/jest-docblock": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", @@ -2721,18 +2629,6 @@ "@types/yargs-parser": "*" } }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-each/node_modules/jest-get-type": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", @@ -2742,20 +2638,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-each/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/jest-environment-jsdom": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", @@ -2841,15 +2723,6 @@ "@types/yargs-parser": "*" } }, - "node_modules/jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true, - "engines": { - "node": ">= 10.14.2" - } - }, "node_modules/jest-haste-map": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", @@ -2954,32 +2827,6 @@ "@types/yargs-parser": "*" } }, - "node_modules/jest-jasmine2/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-jasmine2/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/jest-leak-detector": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", @@ -2993,18 +2840,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-leak-detector/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-leak-detector/node_modules/jest-get-type": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", @@ -3014,20 +2849,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/jest-matcher-utils": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", @@ -3043,18 +2864,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-matcher-utils/node_modules/diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -3088,20 +2897,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/jest-message-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", @@ -3147,32 +2942,6 @@ "@types/yargs-parser": "*" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/jest-mock": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", @@ -3508,18 +3277,6 @@ "@types/yargs-parser": "*" } }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-snapshot/node_modules/diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -3553,20 +3310,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/jest-snapshot/node_modules/semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -3666,18 +3409,6 @@ "@types/yargs-parser": "*" } }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -3699,20 +3430,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/jest-watcher": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", @@ -4281,18 +3998,31 @@ } }, "node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, "engines": { - "node": ">= 10" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/prompts": { @@ -5893,19 +5623,6 @@ } } }, - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -5971,6 +5688,12 @@ "@babel/types": "^7.3.0" } }, + "@types/google-apps-script": { + "version": "1.0.83", + "resolved": "https://registry.npmjs.org/@types/google-apps-script/-/google-apps-script-1.0.83.tgz", + "integrity": "sha512-o+QNeNZxPAfYHzRiLHjub9qF0IILg21r9MzYlnrIHUT+/wcC70aqDfedmzKTgtzsj79zvoTZD0cjGgy46+1Ynw==", + "dev": true + }, "@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -6005,13 +5728,13 @@ } }, "@types/jest": { - "version": "26.0.20", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.20.tgz", - "integrity": "sha512-9zi2Y+5USJRxd0FsahERhBwlcvFh6D2GLQnY2FH2BzK8J9s9omvNHIbvABwIluXa0fD8XVKMLTO0aOEuUfACAA==", + "version": "27.5.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz", + "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==", "dev": true, "requires": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" + "jest-matcher-utils": "^27.0.0", + "pretty-format": "^27.0.0" } }, "@types/node": { @@ -6032,15 +5755,6 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, - "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, "@types/yargs-parser": { "version": "20.2.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", @@ -6508,12 +6222,6 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, - "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "dev": true - }, "domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -7092,23 +6800,6 @@ "requires": { "@types/yargs-parser": "*" } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - } } } }, @@ -7210,43 +6901,14 @@ "@types/yargs-parser": "*" } }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, "jest-get-type": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "dev": true - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - } } } }, - "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, "jest-docblock": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", @@ -7291,28 +6953,11 @@ "@types/yargs-parser": "*" } }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, "jest-get-type": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "dev": true - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - } } } }, @@ -7393,12 +7038,6 @@ } } }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true - }, "jest-haste-map": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", @@ -7490,23 +7129,6 @@ "requires": { "@types/yargs-parser": "*" } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - } } } }, @@ -7520,28 +7142,11 @@ "pretty-format": "^27.5.1" }, "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, "jest-get-type": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "dev": true - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - } } } }, @@ -7557,12 +7162,6 @@ "pretty-format": "^27.5.1" }, "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, "diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -7586,17 +7185,6 @@ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "dev": true - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - } } } }, @@ -7638,23 +7226,6 @@ "requires": { "@types/yargs-parser": "*" } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - } } } }, @@ -7951,12 +7522,6 @@ "@types/yargs-parser": "*" } }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, "diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -7981,17 +7546,6 @@ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "dev": true }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - } - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -8077,12 +7631,6 @@ "@types/yargs-parser": "*" } }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -8094,17 +7642,6 @@ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "dev": true - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - } } } }, @@ -8546,15 +8083,22 @@ "dev": true }, "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } } }, "prompts": { diff --git a/package.json b/package.json index d711ddc..09dc81e 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "license": "BSD-3-Clause", "homepage": "https://github.com/vlucas/sheetquery", "devDependencies": { - "@types/jest": "^26.0.19", + "@types/google-apps-script": "^1.0.83", + "@types/jest": "^27.5.2", "gasmask": "^1.3.8", "jest": "^27.5.1", "ts-jest": "^27.1.3", diff --git a/tsconfig.json b/tsconfig.json index 97e57b9..92ce700 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,21 +1,16 @@ { "compileOnSave": true, "compilerOptions": { + "types": ["jest", "google-apps-script"], "rootDir": "src", "outDir": "dist", "target": "es2019", - "lib": [ - "es2019", - "dom" - ], + "lib": ["es2019", "dom"], "module": "commonjs", "esModuleInterop": true, "strict": true, "declaration": true, "sourceMap": true }, - "exclude": [ - "node_modules", - "__tests__" - ] + "exclude": ["node_modules", "__tests__"] } From 647690d0843a9fe5593288a93d5a5099717aed51 Mon Sep 17 00:00:00 2001 From: Johannes Luff Date: Wed, 18 Sep 2024 13:00:42 +0200 Subject: [PATCH 2/6] Implemented BAD unit test test explicitly overwrites private _sheet and doesn't mock spreadsheet behaviour for ranges and setting values on ranges --- __tests__/sheetquery.test.ts | 45 ++++++++++++++++++++++++++++++++++++ src/index.ts | 43 +++++++++++++++++++++++----------- 2 files changed, 74 insertions(+), 14 deletions(-) diff --git a/__tests__/sheetquery.test.ts b/__tests__/sheetquery.test.ts index fb4823e..26fb572 100644 --- a/__tests__/sheetquery.test.ts +++ b/__tests__/sheetquery.test.ts @@ -290,6 +290,51 @@ describe('SheetQuery', () => { const query = sheetQuery(ss).from(SHEET_NAME); const rows = query.getRows(); + expect(rows.length).toEqual(defaultSheetData.length); + }); + it('should not error with many rows.', () => { + setupSpreadsheet(defaultSheetData); + + const newRows: DictObject[] = ((multiply) => [...multiply, ...multiply])([ + { + Date: '2021-01-02', + Amount: -554.23, + Name: 'BigBox, inc. __INSERT_TEST__', + XtraCol: 'whatever', + }, + { + Date: '2021-01-02', + Amount: -29.74, + Name: 'Fast-n-greasy Food, Inc. __INSERT_TEST__', + XtraCol: 'nope', + }, + ]); + + // Insert rows + const sq = sheetQuery(ss).from(SHEET_NAME); + sq._sheet = { + values: [...defaultSheetData], + appendRow: () => {}, //not needed + getLastRow: () => sq._sheet.values.length, + getLastColumn: () => sq._sheet.values[0].length, + insertRowsAfter: () => {}, + getRange: () => ({ + //@ts-ignore + setValues: (range: any) => { + //@ts-ignore + sq._sheet.values = sq._sheet.values.concat(range); + }, + }), + } as unknown as GoogleAppsScript.Spreadsheet.Sheet; + //@ts-ignore + sq._sheetHeadings = defaultSheetData[0]; + + //@ts-ignore + sq.insertRows(newRows); + + const query = sheetQuery(ss).from(SHEET_NAME); + const rows = query.getRows(); + expect(rows.length).toEqual(defaultSheetData.length); }); }); diff --git a/src/index.ts b/src/index.ts index 94d89d7..68e25f0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,5 @@ +import Spreadsheet from 'gasmask/src/SpreadsheetApp/Spreadsheet'; + export type { Spreadsheet, Sheet } from 'gasmask/src/SpreadsheetApp'; /** @@ -76,7 +78,7 @@ export class SheetQueryBuilder { * * @return {Sheet} */ - getSheet() { + getSheet(): GoogleAppsScript.Spreadsheet.Sheet { if (!this.sheetName) { throw new Error('SheetQuery: No sheet selected. Select sheet with .from(sheetName) method'); } @@ -211,22 +213,35 @@ export class SheetQueryBuilder { const sheet = this.getSheet(); const headings = this.getHeadings(); - newRows.forEach((row) => { - if (!row) { - return; - } + if (headings.length === 0) { + return this; + } - const rowValues = headings.map((heading) => { - const val = row[heading]; - return val === undefined || val === null || val === false ? '' : val; - }); + const range = newRows + .filter((row) => !!row) + .map((row) => + headings.map((heading) => { + let val = row[heading]; + return val === undefined || val === null || val === false ? '' : val; + }) + ); - // appendRow() will throw if array is empty, so we check to prevent that - if (rowValues && rowValues.length !== 0) { - sheet.appendRow(rowValues); - } - }); + const numberOfNewRows = range.length; + + if (numberOfNewRows === 0) { + return this; + } + + const lastRowIndex = sheet.getLastRow(); + const numberOfColumns = headings.length; + //fast insert + if (numberOfNewRows > 3) { + sheet.insertRowsAfter(lastRowIndex, range.length); + sheet.getRange(lastRowIndex + 1, 1, numberOfNewRows, numberOfColumns).setValues(range); + return this; + } + range.forEach((row) => sheet.appendRow(row)); return this; } From caa7ca050426bc4b5e5392fdaf632e6e2aa74ff2 Mon Sep 17 00:00:00 2001 From: Johannes Luff Date: Wed, 18 Sep 2024 13:02:48 +0200 Subject: [PATCH 3/6] Removed unnecessary import --- src/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 68e25f0..ce71bf5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,3 @@ -import Spreadsheet from 'gasmask/src/SpreadsheetApp/Spreadsheet'; - export type { Spreadsheet, Sheet } from 'gasmask/src/SpreadsheetApp'; /** From 481591c641b59ad4b62175d612ccb119e48083f5 Mon Sep 17 00:00:00 2001 From: Johannes Luff Date: Wed, 18 Sep 2024 13:04:00 +0200 Subject: [PATCH 4/6] added comment --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index ce71bf5..854731f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -211,6 +211,7 @@ export class SheetQueryBuilder { const sheet = this.getSheet(); const headings = this.getHeadings(); + //empty spreadsheet if (headings.length === 0) { return this; } From f2146f6895ff02db9fe69ed25bdd42d5a682e1b9 Mon Sep 17 00:00:00 2001 From: Johannes Luff Date: Wed, 18 Sep 2024 13:32:08 +0200 Subject: [PATCH 5/6] Changed lib so that typescript There was a type resolution conflict for type Mimetype for gas types. This default should work according to clasp documentation: https://github.com/google/clasp/blob/master/docs/typescript.md#typescript-configuration --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 92ce700..b93c9af 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,7 @@ "rootDir": "src", "outDir": "dist", "target": "es2019", - "lib": ["es2019", "dom"], + "lib": ["esnext"], "module": "commonjs", "esModuleInterop": true, "strict": true, From e38d1fedf5856b18ebb65ce03d64848d5cbcd2e9 Mon Sep 17 00:00:00 2001 From: Johannes Luff Date: Wed, 18 Sep 2024 13:32:22 +0200 Subject: [PATCH 6/6] Added compiled JS code --- dist/index.d.ts | 3 +- dist/index.js | 470 ++++++++++++++++++++++++---------------------- dist/index.js.map | 2 +- 3 files changed, 246 insertions(+), 229 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index 73ab5a9..f393a67 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,3 +1,4 @@ +/// export type { Spreadsheet, Sheet } from 'gasmask/src/SpreadsheetApp'; /** * Run new sheet query @@ -52,7 +53,7 @@ export declare class SheetQueryBuilder { * * @return {Sheet} */ - getSheet(): any; + getSheet(): GoogleAppsScript.Spreadsheet.Sheet; /** * Get values in sheet from current query + where condition */ diff --git a/dist/index.js b/dist/index.js index 7f030c2..9259437 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,3 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SheetQueryBuilder = exports.sheetQuery = void 0; /** * Run new sheet query * @@ -5,243 +8,256 @@ * @return {SheetQueryBuilder} */ function sheetQuery(activeSpreadsheet) { - return new SheetQueryBuilder(activeSpreadsheet); + return new SheetQueryBuilder(activeSpreadsheet); } - +exports.sheetQuery = sheetQuery; /** * SheetQueryBuilder class - Kind of an ORM for Google Sheets */ class SheetQueryBuilder { - constructor(activeSpreadsheet) { - this.columnNames = []; - this.headingRow = 1; - this._sheetHeadings = []; - this.activeSpreadsheet = activeSpreadsheet || SpreadsheetApp.getActiveSpreadsheet(); - } - select(columnNames) { - this.columnNames = Array.isArray(columnNames) ? columnNames : [columnNames]; - return this; - } - /** - * Name of spreadsheet to perform operations on - * - * @param {string} sheetName - * @param {number} headingRow - * @return {SheetQueryBuilder} - */ - from(sheetName, headingRow = 1) { - this.sheetName = sheetName; - this.headingRow = headingRow; - return this; - } - /** - * Apply a filtering function on rows in a spreadsheet before performing an operation on them - * - * @param {Function} fn - * @return {SheetQueryBuilder} - */ - where(fn) { - this.whereFn = fn; - return this; - } - /** - * Get Sheet object that is referenced by the current query from() method - * - * @return {Sheet} - */ - getSheet() { - if (!this.sheetName) { - throw new Error('SheetQuery: No sheet selected. Select sheet with .from(sheetName) method'); + constructor(activeSpreadsheet) { + this.columnNames = []; + this.headingRow = 1; + this._sheetHeadings = []; + this.activeSpreadsheet = activeSpreadsheet || SpreadsheetApp.getActiveSpreadsheet(); } - if (!this._sheet) { - this._sheet = this.activeSpreadsheet.getSheetByName(this.sheetName); + select(columnNames) { + this.columnNames = Array.isArray(columnNames) ? columnNames : [columnNames]; + return this; } - return this._sheet; - } - /** - * Get values in sheet from current query + where condition - */ - getValues() { - if (!this._sheetValues) { - const zh = this.headingRow - 1; - const sheet = this.getSheet(); - if (!sheet) { - return []; - } - const rowValues = []; - const sheetValues = sheet.getDataRange().getValues(); - const numCols = sheetValues[0] ? sheetValues[0].length : 0; - const numRows = sheetValues.length; - const headings = (this._sheetHeadings = sheetValues[zh] || []); - for (let r = 0; r < numRows; r++) { - const obj = { __meta: { row: r + 1, cols: numCols } }; - for (let c = 0; c < numCols; c++) { - // @ts-expect-error: Headings are set already above, so possibility of an error here is nil - obj[headings[c]] = sheetValues[r][c]; // @ts-ignore + /** + * Name of spreadsheet to perform operations on + * + * @param {string} sheetName + * @param {number} headingRow + * @return {SheetQueryBuilder} + */ + from(sheetName, headingRow = 1) { + this.sheetName = sheetName; + this.headingRow = headingRow; + return this; + } + /** + * Apply a filtering function on rows in a spreadsheet before performing an operation on them + * + * @param {Function} fn + * @return {SheetQueryBuilder} + */ + where(fn) { + this.whereFn = fn; + return this; + } + /** + * Get Sheet object that is referenced by the current query from() method + * + * @return {Sheet} + */ + getSheet() { + if (!this.sheetName) { + throw new Error('SheetQuery: No sheet selected. Select sheet with .from(sheetName) method'); + } + if (!this._sheet) { + this._sheet = this.activeSpreadsheet.getSheetByName(this.sheetName); + } + return this._sheet; + } + /** + * Get values in sheet from current query + where condition + */ + getValues() { + if (!this._sheetValues) { + const zh = this.headingRow - 1; + const sheet = this.getSheet(); + if (!sheet) { + return []; + } + const rowValues = []; + const sheetValues = sheet.getDataRange().getValues(); + const numCols = sheetValues[0] ? sheetValues[0].length : 0; + const numRows = sheetValues.length; + const headings = (this._sheetHeadings = sheetValues[zh] || []); + for (let r = 0; r < numRows; r++) { + const obj = { __meta: { row: r + 1, cols: numCols } }; + for (let c = 0; c < numCols; c++) { + // @ts-expect-error: Headings are set already above, so possibility of an error here is nil + obj[headings[c]] = sheetValues[r][c]; // @ts-ignore + } + rowValues.push(obj); + } + this._sheetValues = rowValues; } - rowValues.push(obj); - } - this._sheetValues = rowValues; + return this._sheetValues; + } + /** + * Return matching rows from sheet query + * + * @return {RowObject[]} + */ + getRows() { + const sheetValues = this.getValues(); + return this.whereFn ? sheetValues.filter(this.whereFn) : sheetValues; + } + /** + * Get array of headings in current sheet from() + * + * @return {string[]} + */ + getHeadings() { + if (!this._sheetHeadings || !this._sheetHeadings.length) { + const zh = this.headingRow - 1; + const sheet = this.getSheet(); + const numCols = sheet.getLastColumn(); + this._sheetHeadings = sheet.getSheetValues(1, 1, this.headingRow, numCols)[zh] || []; + this._sheetHeadings = this._sheetHeadings + .map((s) => (typeof s === 'string' ? s.trim() : '')) + .filter(Boolean); + } + return this._sheetHeadings || []; + } + /** + * Get all cells from a query + where condition + * @returns {any[]} + */ + getCells() { + const rows = this.getRows(); + const cellArray = []; + rows.forEach((row) => { + cellArray.push(this._sheet.getRange(row.__meta.row, 1, 1, row.__meta.cols)); + }); + return cellArray; } - return this._sheetValues; - } - /** - * Return matching rows from sheet query - * - * @return {RowObject[]} - */ - getRows() { - const sheetValues = this.getValues(); - return this.whereFn ? sheetValues.filter(this.whereFn) : sheetValues; - } - /** - * Get array of headings in current sheet from() - * - * @return {string[]} - */ - getHeadings() { - if (!this._sheetHeadings || !this._sheetHeadings.length) { - const zh = this.headingRow - 1; - const sheet = this.getSheet(); - const numCols = sheet.getLastColumn(); - this._sheetHeadings = sheet.getSheetValues(1, 1, this.headingRow, numCols)[zh] || []; - this._sheetHeadings = this._sheetHeadings - .map((s) => (typeof s === 'string' ? s.trim() : '')) - .filter(Boolean); + /** + * Get cells in sheet from current query + where condition and from specific header + * @param {string} key name of the column + * @param {Array} [keys] optionnal names of columns use to select more columns than one + * @returns {any[]} all the colum cells from the query's rows + */ + getCellsWithHeadings(key, headings) { + let rows = this.getRows(); + let indexColumn = 1; + const arrayCells = []; + for (const elem of this._sheetHeadings) { + if (elem == key) + break; + indexColumn++; + } + rows.forEach((row) => { + arrayCells.push(this._sheet.getRange(row.__meta.row, indexColumn)); + }); + //If we got more thant one param + headings.forEach((col) => { + let indexColumn = 1; + for (const elem of this._sheetHeadings) { + if (elem == col) + break; + indexColumn++; + } + rows.forEach((row) => { + arrayCells.push(this._sheet.getRange(row.__meta.row, indexColumn)); + }); + }); + return arrayCells; + } + /** + * Insert new rows into the spreadsheet + * Arrays of objects like { Heading: Value } + * + * @param {DictObject[]} newRows - Array of row objects to insert + * @return {SheetQueryBuilder} + */ + insertRows(newRows) { + const sheet = this.getSheet(); + const headings = this.getHeadings(); + //empty spreadsheet + if (headings.length === 0) { + return this; + } + const range = newRows + .filter((row) => !!row) + .map((row) => headings.map((heading) => { + let val = row[heading]; + return val === undefined || val === null || val === false ? '' : val; + })); + const numberOfNewRows = range.length; + if (numberOfNewRows === 0) { + return this; + } + const lastRowIndex = sheet.getLastRow(); + const numberOfColumns = headings.length; + //fast insert + if (numberOfNewRows > 3) { + sheet.insertRowsAfter(lastRowIndex, range.length); + sheet.getRange(lastRowIndex + 1, 1, numberOfNewRows, numberOfColumns).setValues(range); + return this; + } + range.forEach((row) => sheet.appendRow(row)); + return this; + } + /** + * Delete matched rows from spreadsheet + * + * @return {SheetQueryBuilder} + */ + deleteRows() { + const rows = this.getRows(); + let i = 0; + rows.forEach((row) => { + const deleteRowRange = this._sheet.getRange(row.__meta.row - i, 1, 1, row.__meta.cols); + deleteRowRange.deleteCells(SpreadsheetApp.Dimension.ROWS); + i++; + }); + this.clearCache(); + return this; + } + /** + * Update matched rows in spreadsheet with provided function + * + * @param {UpdateFn} updateFn + * @return {SheetQueryBuilder} + */ + updateRows(updateFn) { + const rows = this.getRows(); + for (let i = 0; i < rows.length; i++) { + this.updateRow(rows[i], updateFn); + } + this.clearCache(); + return this; } - return this._sheetHeadings || []; - } - /** - * Get all cells from a query + where condition - * @returns {any[]} - */ - getCells() { - const rows = this.getRows(); - const cellArray = []; - rows.forEach((row) => { - cellArray.push(this._sheet.getRange(row.__meta.row, 1, 1, row.__meta.cols)); - }); - return cellArray; - } - /** - * Get cells in sheet from current query + where condition and from specific header - * @param {string} key name of the column - * @param {Array} [keys] optionnal names of columns use to select more columns than one - * @returns {any[]} all the colum cells from the query's rows - */ - getCellsWithHeadings(key, headings) { - let rows = this.getRows(); - let indexColumn = 1; - const arrayCells = []; - for (const elem of this._sheetHeadings) { - if (elem == key) break; - indexColumn++; + /** + * Update single row + */ + updateRow(row, updateFn) { + const updatedRow = updateFn(row) || row; + const rowMeta = updatedRow.__meta; + const headings = this.getHeadings(); + delete updatedRow.__meta; + // Put new array data in order of headings in sheet + const arrayValues = headings.map((heading) => { + const val = updatedRow[heading]; + return val === undefined || val === null || val === false ? '' : val; + }); + const maxCols = Math.max(rowMeta.cols, arrayValues.length); + const updateRowRange = this.getSheet().getRange(rowMeta.row, 1, 1, maxCols); + const rangeData = updateRowRange.getValues()[0] || []; + // Map over old data in same index order to update it and ensure array length always matches + const newValues = rangeData.map((value, index) => { + const val = arrayValues[index]; + return val === undefined || val === null || val === false ? '' : val; + }); + updateRowRange.setValues([newValues]); + return this; } - rows.forEach((row) => { - arrayCells.push(this._sheet.getRange(row.__meta.row, indexColumn)); - }); - //If we got more thant one param - headings.forEach((col) => { - let indexColumn = 1; - for (const elem of this._sheetHeadings) { - if (elem == col) break; - indexColumn++; - } - rows.forEach((row) => { - arrayCells.push(this._sheet.getRange(row.__meta.row, indexColumn)); - }); - }); - return arrayCells; - } - /** - * Insert new rows into the spreadsheet - * Arrays of objects like { Heading: Value } - * - * @param {DictObject[]} newRows - Array of row objects to insert - * @return {SheetQueryBuilder} - */ - insertRows(newRows) { - const sheet = this.getSheet(); - const headings = this.getHeadings(); - newRows.forEach((row) => { - if (!row) { - return; - } - const rowValues = headings.map((heading) => { - const val = row[heading]; - return val === undefined || val === null || val === false ? '' : val; - }); - // appendRow() will throw if array is empty, so we check to prevent that - if (rowValues && rowValues.length !== 0) { - sheet.appendRow(rowValues); - } - }); - return this; - } - /** - * Delete matched rows from spreadsheet - * - * @return {SheetQueryBuilder} - */ - deleteRows() { - const rows = this.getRows(); - let i = 0; - rows.forEach((row) => { - const deleteRowRange = this._sheet.getRange(row.__meta.row - i, 1, 1, row.__meta.cols); - deleteRowRange.deleteCells(SpreadsheetApp.Dimension.ROWS); - i++; - }); - this.clearCache(); - return this; - } - /** - * Update matched rows in spreadsheet with provided function - * - * @param {UpdateFn} updateFn - * @return {SheetQueryBuilder} - */ - updateRows(updateFn) { - const rows = this.getRows(); - for (let i = 0; i < rows.length; i++) { - this.updateRow(rows[i], updateFn); + /** + * Clear cached values, headings, and flush all operations to sheet + * + * @return {SheetQueryBuilder} + */ + clearCache() { + this._sheetValues = null; + this._sheetHeadings = []; + SpreadsheetApp.flush(); + return this; } - this.clearCache(); - return this; - } - /** - * Update single row - */ - updateRow(row, updateFn) { - const updatedRow = updateFn(row) || row; - const rowMeta = updatedRow.__meta; - const headings = this.getHeadings(); - delete updatedRow.__meta; - // Put new array data in order of headings in sheet - const arrayValues = headings.map((heading) => { - const val = updatedRow[heading]; - return val === undefined || val === null || val === false ? '' : val; - }); - const maxCols = Math.max(rowMeta.cols, arrayValues.length); - const updateRowRange = this.getSheet().getRange(rowMeta.row, 1, 1, maxCols); - const rangeData = updateRowRange.getValues()[0] || []; - // Map over old data in same index order to update it and ensure array length always matches - const newValues = rangeData.map((value, index) => { - const val = arrayValues[index]; - return val === undefined || val === null || val === false ? '' : val; - }); - updateRowRange.setValues([newValues]); - return this; - } - /** - * Clear cached values, headings, and flush all operations to sheet - * - * @return {SheetQueryBuilder} - */ - clearCache() { - this._sheetValues = null; - this._sheetHeadings = []; - SpreadsheetApp.flush(); - return this; - } } - +exports.SheetQueryBuilder = SheetQueryBuilder; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index 9779312..b18a1f6 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file