From 8eab773dc626a69feb00579675a7fbf7f292d403 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Wed, 26 Aug 2020 20:09:23 +0200 Subject: [PATCH 01/18] Update dependency --- package-lock.json | 205 +++++++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 111 insertions(+), 96 deletions(-) diff --git a/package-lock.json b/package-lock.json index faa0a08..56c7d1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -754,6 +754,15 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -866,9 +875,9 @@ "dev": true }, "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -878,42 +887,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "readdirp": "~3.4.0" } }, "clean-stack": { @@ -1700,6 +1674,15 @@ "flat-cache": "^2.0.1" } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-cache-dir": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", @@ -1787,14 +1770,6 @@ "dev": true, "requires": { "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - } } }, "flat-cache": { @@ -2098,6 +2073,12 @@ "binary-extensions": "^2.0.0" } }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + }, "is-callable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", @@ -2137,6 +2118,12 @@ "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -2468,12 +2455,24 @@ "dev": true }, "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "dev": true, "requires": { - "chalk": "^2.4.2" + "chalk": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "loose-envify": { @@ -2529,23 +2528,23 @@ } }, "mocha": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.1.tgz", - "integrity": "sha512-p7FuGlYH8t7gaiodlFreseLxEmxTgvyG9RgPHODFPySNhwUehu8NIb0vdSt3WFckSneswZ0Un5typYcWElk7HQ==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.2.tgz", + "integrity": "sha512-I8FRAcuACNMLQn3lS4qeWLxXqLvGf6r2CaLstDpZmMUUSmvW6Cnm1AuHxgbc7ctZVRcfwspCRbDHymPsi3dkJw==", "dev": true, "requires": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.3.1", - "debug": "3.2.6", + "chokidar": "3.4.2", + "debug": "4.1.1", "diff": "4.0.2", - "escape-string-regexp": "1.0.5", - "find-up": "4.1.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", "glob": "7.1.6", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", "minimatch": "3.0.4", "ms": "2.1.2", "object.assign": "4.1.0", @@ -2561,50 +2560,57 @@ "yargs-unparser": "1.6.1" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "ms": "^2.1.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } }, "p-try": { @@ -2624,15 +2630,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -3166,12 +3163,12 @@ } }, "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "dev": true, "requires": { - "picomatch": "^2.0.7" + "picomatch": "^2.2.1" } }, "regenerator-runtime": { @@ -3560,6 +3557,15 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "tsconfig-paths": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", @@ -3643,6 +3649,15 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", diff --git a/package.json b/package.json index afd5942..3edbd03 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "coffeescript": "2.5.1", "eslint": "7.7.0", "eslint-plugin-coffee": "0.1.12", - "mocha": "8.1.1", + "mocha": "8.1.2", "nock": "13.0.4", "nyc": "15.1.0" }, From 37416ed6dcdc2318247b1bffa878c5f460276b93 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Wed, 26 Aug 2020 20:54:34 +0200 Subject: [PATCH 02/18] TL artefacts should only be allowed in v1.5.0 URLs --- src/utils/url-generator.coffee | 10 +++++++--- test/utils/url-generator.test.coffee | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/utils/url-generator.coffee b/src/utils/url-generator.coffee index 4ccea24..751cb81 100644 --- a/src/utils/url-generator.coffee +++ b/src/utils/url-generator.coffee @@ -1,8 +1,10 @@ {ApiVersion} = require '../utils/api-version' +{ApiResources} = require '../utils/api-version' {isItemScheme} = require '../metadata/metadata-type' {MetadataDetail} = require '../metadata/metadata-detail' {MetadataReferences} = require '../metadata/metadata-references' + itemAllowed = (resource, api) -> api isnt ApiVersion.v1_0_0 and api isnt ApiVersion.v1_0_1 and @@ -174,9 +176,11 @@ checkDetail = (q, s) -> throw Error "#{q.detail} not allowed in #{s.api}" checkResource = (q, s) -> - if (s.api in excluded and (q.resource is 'actualconstraint' or - q.resource is 'allowedconstraint')) - throw Error "#{q.resource} not allowed in #{s.api}" + if s and s.api + api = s.api.replace /\./g, '_' + throw Error "#{q.resource} not allowed in #{s.api}" \ + unless q.resource in ApiResources[api] + handleAvailabilityQuery = (qry, srv, skip) -> if srv.api in excluded diff --git a/test/utils/url-generator.test.coffee b/test/utils/url-generator.test.coffee index c71ca21..730297a 100644 --- a/test/utils/url-generator.test.coffee +++ b/test/utils/url-generator.test.coffee @@ -342,6 +342,26 @@ describe 'URL Generator', -> test = -> new UrlGenerator().getUrl(query, service) should.Throw(test, Error, 'allowedconstraint not allowed in v1.0.2') + it 'supports actualconstraint since v1.3.0', -> + expected = 'http://test.com/actualconstraint' + query = MetadataQuery.from({resource: 'actualconstraint'}) + service = Service.from({url: 'http://test.com'}) + url = new UrlGenerator().getUrl(query, service, true) + url.should.equal expected + + it 'supports VTL artefacts since v1.5.0', -> + expected = 'http://test.com/transformationscheme' + query = MetadataQuery.from({resource: 'transformationscheme'}) + service = Service.from({url: 'http://test.com'}) + url = new UrlGenerator().getUrl(query, service, true) + url.should.equal expected + + it 'does not support VTL artefacts before v1.5.0', -> + query = MetadataQuery.from({resource: 'transformationscheme'}) + service = Service.from({url: 'http://test.com', api: ApiVersion.v1_2_0}) + test = -> new UrlGenerator().getUrl(query, service) + should.Throw(test, Error, 'transformationscheme not allowed in v1.2.0') + describe 'for data queries', -> it 'generates a URL for a full data query', -> From a1305cd0a40bf23a459ffcf1004e509cee8472ab Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Fri, 28 Aug 2020 20:44:10 +0200 Subject: [PATCH 03/18] references is version-dependent --- src/utils/url-generator.coffee | 25 ++++++++++++++++++++++++- test/utils/url-generator.test.coffee | 17 +++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/utils/url-generator.coffee b/src/utils/url-generator.coffee index 751cb81..5e17632 100644 --- a/src/utils/url-generator.coffee +++ b/src/utils/url-generator.coffee @@ -180,7 +180,29 @@ checkResource = (q, s) -> api = s.api.replace /\./g, '_' throw Error "#{q.resource} not allowed in #{s.api}" \ unless q.resource in ApiResources[api] - + +specialRefs = [ + 'none' + 'parents' + 'parentsandsiblings' + 'children' + 'descendants' + 'all' +] + +excludedRefs = [ + 'structure' + 'actualconstraint' + 'allowedconstraint' +] + +checkReferences = (q, s) -> + if s and s.api + api = s.api.replace /\./g, '_' + throw Error "#{q.references} not allowed as reference in #{s.api}" \ + unless (q.references in specialRefs or \ + q.references in ApiResources[api]) and \ + q.references not in excludedRefs handleAvailabilityQuery = (qry, srv, skip) -> if srv.api in excluded @@ -201,6 +223,7 @@ handleMetadataQuery = (qry, srv, skip) -> checkApiVersion(qry, srv) checkDetail(qry, srv) checkResource(qry, srv) + checkReferences(qry, srv) if qry.references if skip createShortMetadataQuery(qry, srv) else diff --git a/test/utils/url-generator.test.coffee b/test/utils/url-generator.test.coffee index 730297a..8162648 100644 --- a/test/utils/url-generator.test.coffee +++ b/test/utils/url-generator.test.coffee @@ -349,19 +349,32 @@ describe 'URL Generator', -> url = new UrlGenerator().getUrl(query, service, true) url.should.equal expected - it 'supports VTL artefacts since v1.5.0', -> + it 'supports VTL artefacts since v1.5.0 (type)', -> expected = 'http://test.com/transformationscheme' query = MetadataQuery.from({resource: 'transformationscheme'}) service = Service.from({url: 'http://test.com'}) url = new UrlGenerator().getUrl(query, service, true) url.should.equal expected - it 'does not support VTL artefacts before v1.5.0', -> + it 'does not support VTL artefacts before v1.5.0 (type)', -> query = MetadataQuery.from({resource: 'transformationscheme'}) service = Service.from({url: 'http://test.com', api: ApiVersion.v1_2_0}) test = -> new UrlGenerator().getUrl(query, service) should.Throw(test, Error, 'transformationscheme not allowed in v1.2.0') + it 'supports VTL artefacts since v1.5.0 (references)', -> + expected = 'http://test.com/codelist?references=transformationscheme' + query = MetadataQuery.from({resource: 'codelist', references: 'transformationscheme'}) + service = Service.from({url: 'http://test.com'}) + url = new UrlGenerator().getUrl(query, service, true) + url.should.equal expected + + it 'does not support VTL artefacts before v1.5.0 (references)', -> + query = MetadataQuery.from({resource: 'codelist', references: 'transformationscheme'}) + service = Service.from({url: 'http://test.com', api: ApiVersion.v1_2_0}) + test = -> new UrlGenerator().getUrl(query, service) + should.Throw(test, Error, 'transformationscheme not allowed as reference in v1.2.0') + describe 'for data queries', -> it 'generates a URL for a full data query', -> From a9d34d635ab0072a79a92ce6a6e831d3b2d93960 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 13:00:53 +0200 Subject: [PATCH 04/18] Upgrade dependencies --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 56c7d1d..c5495e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2528,9 +2528,9 @@ } }, "mocha": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.2.tgz", - "integrity": "sha512-I8FRAcuACNMLQn3lS4qeWLxXqLvGf6r2CaLstDpZmMUUSmvW6Cnm1AuHxgbc7ctZVRcfwspCRbDHymPsi3dkJw==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.3.tgz", + "integrity": "sha512-ZbaYib4hT4PpF4bdSO2DohooKXIn4lDeiYqB+vTmCdr6l2woW0b6H3pf5x4sM5nwQMru9RvjjHYWVGltR50ZBw==", "dev": true, "requires": { "ansi-colors": "4.1.1", diff --git a/package.json b/package.json index 3edbd03..338dcee 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "coffeescript": "2.5.1", "eslint": "7.7.0", "eslint-plugin-coffee": "0.1.12", - "mocha": "8.1.2", + "mocha": "8.1.3", "nock": "13.0.4", "nyc": "15.1.0" }, From cd6fc92ee952c10a0461306c226b412768dabd69 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 13:05:36 +0200 Subject: [PATCH 05/18] Bump version to 2.17.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index c5495e6..95a2a3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sdmx-rest", - "version": "2.16.0", + "version": "2.17.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 338dcee..9cb5c0b 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "node": ">=10" }, "description": "SDMX REST API client for JavaScript", - "version": "2.16.0", + "version": "2.17.0", "main": "./lib/index.js", "scripts": { "prebuild": "rm -rf lib && mkdir lib", From 54c2c1a2b7a1b725469fab972021d63b7a9d029b Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 13:32:59 +0200 Subject: [PATCH 06/18] Consolidate reference definitions --- src/metadata/metadata-references.coffee | 10 +++++-- src/utils/url-generator.coffee | 24 ++++----------- test/metadata/metadata-references.test.coffee | 30 +++++++++++++++++++ 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/metadata/metadata-references.coffee b/src/metadata/metadata-references.coffee index d7ddce5..f05005a 100644 --- a/src/metadata/metadata-references.coffee +++ b/src/metadata/metadata-references.coffee @@ -7,7 +7,7 @@ # definition matching the query), or artefacts that use the matching artefact # (for example, the dataflows that use the data structure definition matching # the query) -references = +special = # No references will be returned NONE: 'none' @@ -36,8 +36,12 @@ excluded = [ # All the predefined SDMX types are valid references, except for the 'catch all' # `structure` +all = {} ( -> - references[key] = val for key, val of MetadataType when val not in excluded + all[k1] = v1 for k1, v1 of MetadataType when v1 not in excluded + all[k2] = v2 for k2, v2 of special )() -exports.MetadataReferences = Object.freeze references +exports.MetadataReferences = Object.freeze all +exports.MetadataReferencesExcluded = Object.freeze excluded +exports.MetadataReferencesSpecial = Object.freeze special diff --git a/src/utils/url-generator.coffee b/src/utils/url-generator.coffee index 5e17632..3f9f190 100644 --- a/src/utils/url-generator.coffee +++ b/src/utils/url-generator.coffee @@ -3,7 +3,8 @@ {isItemScheme} = require '../metadata/metadata-type' {MetadataDetail} = require '../metadata/metadata-detail' {MetadataReferences} = require '../metadata/metadata-references' - +{MetadataReferencesExcluded} = require '../metadata/metadata-references' +{MetadataReferencesSpecial} = require '../metadata/metadata-references' itemAllowed = (resource, api) -> api isnt ApiVersion.v1_0_0 and @@ -181,28 +182,13 @@ checkResource = (q, s) -> throw Error "#{q.resource} not allowed in #{s.api}" \ unless q.resource in ApiResources[api] -specialRefs = [ - 'none' - 'parents' - 'parentsandsiblings' - 'children' - 'descendants' - 'all' -] - -excludedRefs = [ - 'structure' - 'actualconstraint' - 'allowedconstraint' -] - checkReferences = (q, s) -> if s and s.api api = s.api.replace /\./g, '_' throw Error "#{q.references} not allowed as reference in #{s.api}" \ - unless (q.references in specialRefs or \ - q.references in ApiResources[api]) and \ - q.references not in excludedRefs + unless (q.references in ApiResources[api] or \ + q.references in Object.values MetadataReferencesSpecial) and \ + q.references not in MetadataReferencesExcluded handleAvailabilityQuery = (qry, srv, skip) -> if srv.api in excluded diff --git a/test/metadata/metadata-references.test.coffee b/test/metadata/metadata-references.test.coffee index 84aa64a..a27e8a0 100644 --- a/test/metadata/metadata-references.test.coffee +++ b/test/metadata/metadata-references.test.coffee @@ -1,5 +1,7 @@ should = require('chai').should() {MetadataReferences} = require('../../src/metadata/metadata-references') +{MetadataReferencesExcluded} = require('../../src/metadata/metadata-references') +{MetadataReferencesSpecial} = require('../../src/metadata/metadata-references') describe 'Metadata references', -> @@ -38,6 +40,21 @@ describe 'Metadata references', -> 'all' ] + excluded = [ + 'structure' + 'actualconstraint' + 'allowedconstraint' + ] + + special = [ + 'none' + 'parents' + 'parentsandsiblings' + 'children' + 'descendants' + 'all' + ] + it 'contains all the expected references and only those', -> count = 0 for key, value of MetadataReferences @@ -47,3 +64,16 @@ describe 'Metadata references', -> it 'is immutable', -> MetadataReferences.should.be.frozen + + it 'indicates which references are excluded', -> + MetadataReferencesExcluded.should.eql excluded + MetadataReferencesExcluded.should.be.frozen + + it 'indicates which references are the special ones', -> + MetadataReferencesSpecial.should.be.frozen + count = 0 + for key, value of MetadataReferencesSpecial + special.should.contain value + count++ + count.should.equal special.length + From a3cd0fcc1883694db3e96aca7b14b399197bdcc7 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 13:41:04 +0200 Subject: [PATCH 07/18] No unnecessaru double quotes --- .eslintrc | 3 ++- src/index.coffee | 2 +- src/utils/url-generator.coffee | 28 ++++++++++++++-------------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/.eslintrc b/.eslintrc index d20204d..4e8863f 100644 --- a/.eslintrc +++ b/.eslintrc @@ -23,6 +23,7 @@ "coffee/max-len": 2, "coffee/max-depth": 2, "coffee/no-unneeded-ternary": 2, - "coffee/no-negated-condition": 2 + "coffee/no-negated-condition": 2, + "coffee/no-unnecessary-double-quotes": 1 } } \ No newline at end of file diff --git a/src/index.coffee b/src/index.coffee index 518cf00..8ea96e3 100644 --- a/src/index.coffee +++ b/src/index.coffee @@ -25,7 +25,7 @@ fetch = require 'isomorphic-fetch' userAgent = 'sdmx-rest4js (https://github.com/sosna/sdmx-rest4js)' checkStatus = (query, response) -> - throw ReferenceError "Not a valid response" unless response + throw ReferenceError 'Not a valid response' unless response code = response.status unless 100 <= code < 400 or (code is 404 and query.updatedAfter) throw RangeError "Request failed with error code #{code}" diff --git a/src/utils/url-generator.coffee b/src/utils/url-generator.coffee index 3f9f190..121ea9b 100644 --- a/src/utils/url-generator.coffee +++ b/src/utils/url-generator.coffee @@ -40,7 +40,7 @@ handleDataPathParams = (q) -> path = [] path.push q.provider unless q.provider is 'all' path.push q.key if q.key isnt 'all' or path.length - if path.length then "/" + path.reverse().join('/') else "" + if path.length then '/' + path.reverse().join('/') else '' hasHistory = (q, s) -> if (s.api isnt ApiVersion.v1_0_0 and @@ -58,7 +58,7 @@ handleDataQueryParams = (q, s) -> p.push "updatedAfter=#{q.updatedAfter}" if q.updatedAfter p.push "firstNObservations=#{q.firstNObs}" if q.firstNObs p.push "lastNObservations=#{q.lastNObs}" if q.lastNObs - if p.length > 0 then "?" + p.reduceRight (x, y) -> x + "&" + y else "" + if p.length > 0 then '?' + p.reduceRight (x, y) -> x + '&' + y else '' createShortDataQuery = (q, s) -> u = createEntryPoint s @@ -77,16 +77,16 @@ createMetadataQuery = (query, service) -> handleMetaPathParams = (q, s, u) -> path = [] if q.item isnt 'all' and itemAllowed(q.resource, s.api) then path.push q.item - if q.version isnt "latest" or path.length then path.push q.version - if q.id isnt "all" or path.length then path.push q.id - if q.agency isnt "all" or path.length then path.push q.agency - if path.length then u = u + "/" + path.reverse().join('/') + if q.version isnt 'latest' or path.length then path.push q.version + if q.id isnt 'all' or path.length then path.push q.id + if q.agency isnt 'all' or path.length then path.push q.agency + if path.length then u = u + '/' + path.reverse().join('/') u handleMetaQueryParams = (q, u, hd, hr) -> - if hd or hr then u = u + "?" + if hd or hr then u = u + '?' if hd then u = u + "detail=#{q.detail}" - if hd and hr then u = u + "&" + if hd and hr then u = u + '&' if hr then u = u + "references=#{q.references}" u @@ -102,7 +102,7 @@ createShortMetadataQuery = (q, s) -> createAvailabilityQuery = (q, s) -> url = createEntryPoint s - url = url + "availableconstraint" + url = url + 'availableconstraint' url = url + "/#{q.flow}/#{q.key}/#{q.provider}/#{q.component}" url = url + "?mode=#{q.mode}&references=#{q.references}" url = url + "&startPeriod=#{q.start}" if q.start @@ -166,10 +166,10 @@ checkMultipleItems = (i, s, r) -> throw Error "Multiple #{r} not allowed in #{s.api}" checkApiVersion = (q, s) -> - checkMultipleItems(q.agency, s, "agencies") - checkMultipleItems(q.id, s, "IDs") - checkMultipleItems(q.version, s, "versions") - checkMultipleItems(q.item, s, "items") + checkMultipleItems(q.agency, s, 'agencies') + checkMultipleItems(q.id, s, 'IDs') + checkMultipleItems(q.version, s, 'versions') + checkMultipleItems(q.item, s, 'items') checkDetail = (q, s) -> if (s.api in excluded and (q.detail is 'referencepartial' or @@ -199,7 +199,7 @@ handleAvailabilityQuery = (qry, srv, skip) -> createAvailabilityQuery(qry, srv) handleDataQuery = (qry, srv, skip) -> - checkMultipleItems(qry.provider, srv, "providers") + checkMultipleItems(qry.provider, srv, 'providers') if skip createShortDataQuery(qry, srv) else From 35f95555318d61d3597289aec710e669844de45e Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 14:19:26 +0200 Subject: [PATCH 08/18] Consistent use of English operators --- .eslintrc | 7 ++++++- src/avail/availability-query.coffee | 6 +++--- src/data/data-query.coffee | 12 ++++++------ src/index.coffee | 2 +- src/schema/schema-query.coffee | 2 +- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/.eslintrc b/.eslintrc index 4e8863f..42842a3 100644 --- a/.eslintrc +++ b/.eslintrc @@ -24,6 +24,11 @@ "coffee/max-depth": 2, "coffee/no-unneeded-ternary": 2, "coffee/no-negated-condition": 2, - "coffee/no-unnecessary-double-quotes": 1 + "coffee/no-unnecessary-double-quotes": 1, + "coffee/no-private-function-fat-arrows": 1, + "coffee/shorthand-this": 1, + "coffee/empty-func-parens": 1, + "coffee/english-operators": 1 + } } \ No newline at end of file diff --git a/src/avail/availability-query.coffee b/src/avail/availability-query.coffee index 2490d27..2a85dfe 100644 --- a/src/avail/availability-query.coffee +++ b/src/avail/availability-query.coffee @@ -17,9 +17,9 @@ ValidQuery = key: (i, e) -> isValidPattern(i, SeriesKeyType, 'series key', e) provider: (i, e) -> isValidPattern(i, MultipleProviderRefType, 'provider', e) component: (i, e) -> isValidPattern(i, NestedNCNameIDType, 'component', e) - start: (i, e) -> !i or isValidPeriod(i, 'start period', e) - end: (i, e) -> !i or isValidPeriod(i, 'end period', e) - updatedAfter: (i, e) -> !i or isValidDate(i, 'updatedAfter', e) + start: (i, e) -> not i or isValidPeriod(i, 'start period', e) + end: (i, e) -> not i or isValidPeriod(i, 'end period', e) + updatedAfter: (i, e) -> not i or isValidDate(i, 'updatedAfter', e) mode: (i, e) -> isValidEnum(i, AvailabilityMode, 'mode', e) references: (i, e) -> isValidEnum(i, AvailabilityReferences, 'references', e) diff --git a/src/data/data-query.coffee b/src/data/data-query.coffee index 175cab3..eb99847 100644 --- a/src/data/data-query.coffee +++ b/src/data/data-query.coffee @@ -14,13 +14,13 @@ ValidQuery = flow: (i, e) -> isValidPattern(i, FlowRefType, 'flows', e) key: (i, e) -> isValidPattern(i, SeriesKeyType, 'series key', e) provider: (i, e) -> isValidPattern(i, MultipleProviderRefType, 'provider', e) - start: (i, e) -> !i or isValidPeriod(i, 'start period', e) - end: (i, e) -> !i or isValidPeriod(i, 'end period', e) - updatedAfter: (i, e) -> !i or isValidDate(i, 'updatedAfter', e) - firstNObs: (i, e) -> !i or isValidNObs(i, 'firstNObs', e) - lastNObs: (i, e) -> !i or isValidNObs(i, 'lastNObs', e) + start: (i, e) -> not i or isValidPeriod(i, 'start period', e) + end: (i, e) -> not i or isValidPeriod(i, 'end period', e) + updatedAfter: (i, e) -> not i or isValidDate(i, 'updatedAfter', e) + firstNObs: (i, e) -> not i or isValidNObs(i, 'firstNObs', e) + lastNObs: (i, e) -> not i or isValidNObs(i, 'lastNObs', e) obsDimension: (i, e) -> - !i or isValidPattern(i, NCNameIDType, 'obs dimension', e) + not i or isValidPattern(i, NCNameIDType, 'obs dimension', e) detail: (i, e) -> isValidEnum(i, DataDetail, 'details', e) history: (i, e) -> isValidHistory(i, e) diff --git a/src/index.coffee b/src/index.coffee index 8ea96e3..0c857ac 100644 --- a/src/index.coffee +++ b/src/index.coffee @@ -33,7 +33,7 @@ checkStatus = (query, response) -> isFormat = (input, expected) -> out = false for v in Object.values expected - out = true if v == input + out = true if v is input out isDataFormat = (format) -> diff --git a/src/schema/schema-query.coffee b/src/schema/schema-query.coffee index d17c076..eb217b7 100644 --- a/src/schema/schema-query.coffee +++ b/src/schema/schema-query.coffee @@ -15,7 +15,7 @@ ValidQuery = version: (q, i, e) -> isValidPattern(i, SingleVersionType, 'versions', e) explicit: (q, i, e) -> isValidExplicit(i, e) obsDimension: (q, i, e) -> - !i or isValidPattern(i, NCNameIDType, 'obs dimension', e) + not i or isValidPattern(i, NCNameIDType, 'obs dimension', e) isValidExplicit = (input, errors) -> valid = typeof input is 'boolean' From 144310e922faf2a0b7aa0572c71f60235a468228 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 14:32:34 +0200 Subject: [PATCH 09/18] lint: eol-last --- .eslintrc | 14 ++++++++++---- src/schema/schema-format.coffee | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.eslintrc b/.eslintrc index 42842a3..197c129 100644 --- a/.eslintrc +++ b/.eslintrc @@ -17,8 +17,6 @@ "coffee/no-empty-function": 2, "no-eval": 2, "coffee/no-useless-return": 1, - "coffee/array-bracket-spacing": 1, - "coffee/comma-style": 1, "coffee/function-paren-newline": 1, "coffee/max-len": 2, "coffee/max-depth": 2, @@ -28,7 +26,15 @@ "coffee/no-private-function-fat-arrows": 1, "coffee/shorthand-this": 1, "coffee/empty-func-parens": 1, - "coffee/english-operators": 1 - + "coffee/english-operators": 1, + "coffee/no-backticks": 2, + "coffee/array-bracket-newline": 1, + "coffee/array-bracket-spacing": 1, + "coffee/array-element-newline": 1, + "comma-spacing": 1, + "coffee/comma-style": 1, + "computed-property-spacing": 1, + "coffee/consistent-this": 1, + "eol-last": 1 } } \ No newline at end of file diff --git a/src/schema/schema-format.coffee b/src/schema/schema-format.coffee index f661a73..5772e7e 100644 --- a/src/schema/schema-format.coffee +++ b/src/schema/schema-format.coffee @@ -16,4 +16,4 @@ formats = # An XML Schema definition XML_SCHEMA: 'application/xml' -exports.SchemaFormat = Object.freeze formats \ No newline at end of file +exports.SchemaFormat = Object.freeze formats From 2d0e210e1be5847f89af0d018318cc695c9ab0d1 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 15:46:01 +0200 Subject: [PATCH 10/18] Lint: Lines between members --- .eslintrc | 8 ++++++-- src/service/service.coffee | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.eslintrc b/.eslintrc index 197c129..c893218 100644 --- a/.eslintrc +++ b/.eslintrc @@ -17,7 +17,6 @@ "coffee/no-empty-function": 2, "no-eval": 2, "coffee/no-useless-return": 1, - "coffee/function-paren-newline": 1, "coffee/max-len": 2, "coffee/max-depth": 2, "coffee/no-unneeded-ternary": 2, @@ -35,6 +34,11 @@ "coffee/comma-style": 1, "computed-property-spacing": 1, "coffee/consistent-this": 1, - "eol-last": 1 + "eol-last": 1, + "coffee/function-paren-newline": 1, + "key-spacing": 1, + "coffee/keyword-spacing": 1, + "linebreak-style": 2, + "coffee/lines-between-class-members": 1 } } \ No newline at end of file diff --git a/src/service/service.coffee b/src/service/service.coffee index 0ed4d00..86f12ba 100644 --- a/src/service/service.coffee +++ b/src/service/service.coffee @@ -68,7 +68,9 @@ service = class Service url: 'http://wits.worldbank.org/API/V1/SDMX/V21/rest' @ECB_S: createSecureInstance @ECB + @SDMXGR_S: createSecureInstance @SDMXGR + @OECD_S: createSecureInstance @OECD @from: (opts) -> From 0adea46c7ee28a1b9a364282a9a55bfc9d1e4c23 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 16:09:25 +0200 Subject: [PATCH 11/18] Lint: no-trailing-space --- .eslintrc | 20 ++++++++++++++++---- src/avail/availability-query.coffee | 2 +- src/data/data-query.coffee | 2 +- src/index.coffee | 8 ++++---- src/service/service.coffee | 2 +- src/utils/url-generator.coffee | 2 +- 6 files changed, 24 insertions(+), 12 deletions(-) diff --git a/.eslintrc b/.eslintrc index c893218..633a8dc 100644 --- a/.eslintrc +++ b/.eslintrc @@ -17,16 +17,14 @@ "coffee/no-empty-function": 2, "no-eval": 2, "coffee/no-useless-return": 1, - "coffee/max-len": 2, - "coffee/max-depth": 2, "coffee/no-unneeded-ternary": 2, - "coffee/no-negated-condition": 2, "coffee/no-unnecessary-double-quotes": 1, "coffee/no-private-function-fat-arrows": 1, "coffee/shorthand-this": 1, "coffee/empty-func-parens": 1, "coffee/english-operators": 1, "coffee/no-backticks": 2, + "coffee/array-bracket-newline": 1, "coffee/array-bracket-spacing": 1, "coffee/array-element-newline": 1, @@ -39,6 +37,20 @@ "key-spacing": 1, "coffee/keyword-spacing": 1, "linebreak-style": 2, - "coffee/lines-between-class-members": 1 + "coffee/lines-between-class-members": 1, + "coffee/max-depth": 2, + "coffee/max-len": 2, + "max-lines": ["error", {"skipComments": true, "skipBlankLines": true}], + "coffee/max-lines-per-function": 2, + "max-nested-callbacks": 2, + "coffee/newline-per-chained-call": 1, + "no-continue": 1, + "coffee/no-lonely-if": 1, + "coffee/no-mixed-operators": 1, + "coffee/no-multiple-empty-lines": 1, + "coffee/no-negated-condition": 2, + "no-new-object": 1, + "no-tabs": 2, + "no-trailing-spaces": 2 } } \ No newline at end of file diff --git a/src/avail/availability-query.coffee b/src/avail/availability-query.coffee index 2a85dfe..3ac3ca8 100644 --- a/src/avail/availability-query.coffee +++ b/src/avail/availability-query.coffee @@ -31,7 +31,7 @@ isValidQuery = (q) -> break unless isValid {isValid: isValid, errors: errors} -toKeyString = (dims) -> +toKeyString = (dims) -> ((if Array.isArray d then d.join('+') else d ? '') for d in dims).join('.') toProviderString = (p) -> p.join('+') diff --git a/src/data/data-query.coffee b/src/data/data-query.coffee index eb99847..b2462c0 100644 --- a/src/data/data-query.coffee +++ b/src/data/data-query.coffee @@ -19,7 +19,7 @@ ValidQuery = updatedAfter: (i, e) -> not i or isValidDate(i, 'updatedAfter', e) firstNObs: (i, e) -> not i or isValidNObs(i, 'firstNObs', e) lastNObs: (i, e) -> not i or isValidNObs(i, 'lastNObs', e) - obsDimension: (i, e) -> + obsDimension: (i, e) -> not i or isValidPattern(i, NCNameIDType, 'obs dimension', e) detail: (i, e) -> isValidEnum(i, DataDetail, 'details', e) history: (i, e) -> isValidHistory(i, e) diff --git a/src/index.coffee b/src/index.coffee index 0c857ac..e612392 100644 --- a/src/index.coffee +++ b/src/index.coffee @@ -294,11 +294,11 @@ getUrl = (query, service) -> getMetadataQuery query else if query.context? getSchemaQuery query - if q - return new UrlGenerator().getUrl q, s - else + if q + return new UrlGenerator().getUrl q, s + else throw Error 'Not a valid query' - + # # Executes the supplied query against the supplied service and returns a # Promise. diff --git a/src/service/service.coffee b/src/service/service.coffee index 86f12ba..e4d9e83 100644 --- a/src/service/service.coffee +++ b/src/service/service.coffee @@ -70,7 +70,7 @@ service = class Service @ECB_S: createSecureInstance @ECB @SDMXGR_S: createSecureInstance @SDMXGR - + @OECD_S: createSecureInstance @OECD @from: (opts) -> diff --git a/src/utils/url-generator.coffee b/src/utils/url-generator.coffee index 121ea9b..0792627 100644 --- a/src/utils/url-generator.coffee +++ b/src/utils/url-generator.coffee @@ -187,7 +187,7 @@ checkReferences = (q, s) -> api = s.api.replace /\./g, '_' throw Error "#{q.references} not allowed as reference in #{s.api}" \ unless (q.references in ApiResources[api] or \ - q.references in Object.values MetadataReferencesSpecial) and \ + q.references in Object.values MetadataReferencesSpecial) and \ q.references not in MetadataReferencesExcluded handleAvailabilityQuery = (qry, srv, skip) -> From 9d5361d269d2719d1cbe9e0d8ea4a0866612be89 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 16:23:10 +0200 Subject: [PATCH 12/18] Lint: operator-assignment --- .eslintrc | 8 ++-- src/index.coffee | 2 +- src/utils/url-generator.coffee | 70 +++++++++++++++++----------------- 3 files changed, 41 insertions(+), 39 deletions(-) diff --git a/.eslintrc b/.eslintrc index 633a8dc..f1dc6f7 100644 --- a/.eslintrc +++ b/.eslintrc @@ -17,7 +17,6 @@ "coffee/no-empty-function": 2, "no-eval": 2, "coffee/no-useless-return": 1, - "coffee/no-unneeded-ternary": 2, "coffee/no-unnecessary-double-quotes": 1, "coffee/no-private-function-fat-arrows": 1, "coffee/shorthand-this": 1, @@ -36,7 +35,6 @@ "coffee/function-paren-newline": 1, "key-spacing": 1, "coffee/keyword-spacing": 1, - "linebreak-style": 2, "coffee/lines-between-class-members": 1, "coffee/max-depth": 2, "coffee/max-len": 2, @@ -51,6 +49,10 @@ "coffee/no-negated-condition": 2, "no-new-object": 1, "no-tabs": 2, - "no-trailing-spaces": 2 + "no-trailing-spaces": 2, + "coffee/no-unneeded-ternary": 2, + "coffee/no-whitespace-before-property": 1, + "coffee/object-curly-spacing": 1, + "coffee/operator-assignment": 1 } } \ No newline at end of file diff --git a/src/index.coffee b/src/index.coffee index e612392..be9d905 100644 --- a/src/index.coffee +++ b/src/index.coffee @@ -69,7 +69,7 @@ checkMediaType = (requested, response) -> throw RangeError "Wrong format: requested #{requested} but got #{fmt}" addHeaders = (opts, s, type) -> - opts = opts ? {} + opts ?= {} headers = {} headers[key.toLowerCase()] = opts.headers[key] for key of opts.headers unless headers.accept diff --git a/src/utils/url-generator.coffee b/src/utils/url-generator.coffee index 0792627..96d24ee 100644 --- a/src/utils/url-generator.coffee +++ b/src/utils/url-generator.coffee @@ -21,19 +21,19 @@ createEntryPoint = (s) -> createDataQuery = (query, service) -> url = createEntryPoint service - url = url + "data/#{query.flow}/#{query.key}/#{query.provider}?" + url += "data/#{query.flow}/#{query.key}/#{query.provider}?" if query.obsDimension - url = url + "dimensionAtObservation=#{query.obsDimension}&" - url = url + "detail=#{query.detail}" + url += "dimensionAtObservation=#{query.obsDimension}&" + url += "detail=#{query.detail}" if (service.api isnt ApiVersion.v1_0_0 and service.api isnt ApiVersion.v1_0_1 and service.api isnt ApiVersion.v1_0_2) - url = url + "&includeHistory=#{query.history}" - url = url + "&startPeriod=#{query.start}" if query.start - url = url + "&endPeriod=#{query.end}" if query.end - url = url + "&updatedAfter=#{query.updatedAfter}" if query.updatedAfter - url = url + "&firstNObservations=#{query.firstNObs}" if query.firstNObs - url = url + "&lastNObservations=#{query.lastNObs}" if query.lastNObs + url += "&includeHistory=#{query.history}" + url += "&startPeriod=#{query.start}" if query.start + url += "&endPeriod=#{query.end}" if query.end + url += "&updatedAfter=#{query.updatedAfter}" if query.updatedAfter + url += "&firstNObservations=#{query.firstNObs}" if query.firstNObs + url += "&lastNObservations=#{query.lastNObs}" if query.lastNObs url handleDataPathParams = (q) -> @@ -62,16 +62,16 @@ handleDataQueryParams = (q, s) -> createShortDataQuery = (q, s) -> u = createEntryPoint s - u = u + "data/#{q.flow}" - u = u + handleDataPathParams(q) - u = u + handleDataQueryParams(q, s) + u += "data/#{q.flow}" + u += handleDataPathParams(q) + u += handleDataQueryParams(q, s) u createMetadataQuery = (query, service) -> url = createEntryPoint service - url = url + "#{query.resource}/#{query.agency}/#{query.id}/#{query.version}" - url = url + "/#{query.item}" if itemAllowed(query.resource, service.api) - url = url + "?detail=#{query.detail}&references=#{query.references}" + url += "#{query.resource}/#{query.agency}/#{query.id}/#{query.version}" + url += "/#{query.item}" if itemAllowed(query.resource, service.api) + url += "?detail=#{query.detail}&references=#{query.references}" url handleMetaPathParams = (q, s, u) -> @@ -84,15 +84,15 @@ handleMetaPathParams = (q, s, u) -> u handleMetaQueryParams = (q, u, hd, hr) -> - if hd or hr then u = u + '?' - if hd then u = u + "detail=#{q.detail}" - if hd and hr then u = u + '&' - if hr then u = u + "references=#{q.references}" + if hd or hr then u += '?' + if hd then u += "detail=#{q.detail}" + if hd and hr then u += '&' + if hr then u += "references=#{q.references}" u createShortMetadataQuery = (q, s) -> u = createEntryPoint s - u = u + "#{q.resource}" + u += "#{q.resource}" u = handleMetaPathParams(q, s, u) u = handleMetaQueryParams( q, u, q.detail isnt MetadataDetail.FULL, @@ -102,12 +102,12 @@ createShortMetadataQuery = (q, s) -> createAvailabilityQuery = (q, s) -> url = createEntryPoint s - url = url + 'availableconstraint' - url = url + "/#{q.flow}/#{q.key}/#{q.provider}/#{q.component}" - url = url + "?mode=#{q.mode}&references=#{q.references}" - url = url + "&startPeriod=#{q.start}" if q.start - url = url + "&endPeriod=#{q.end}" if q.end - url = url + "&updatedAfter=#{q.updatedAfter}" if q.updatedAfter + url += 'availableconstraint' + url += "/#{q.flow}/#{q.key}/#{q.provider}/#{q.component}" + url += "?mode=#{q.mode}&references=#{q.references}" + url += "&startPeriod=#{q.start}" if q.start + url += "&endPeriod=#{q.end}" if q.end + url += "&updatedAfter=#{q.updatedAfter}" if q.updatedAfter url handleAvailabilityPathParams = (q) -> @@ -128,16 +128,16 @@ handleAvailabilityQueryParams = (q) -> createShortAvailabilityQuery = (q, s) -> u = createEntryPoint s - u = u + "availableconstraint/#{q.flow}" - u = u + handleAvailabilityPathParams(q) - u = u + handleAvailabilityQueryParams(q) + u += "availableconstraint/#{q.flow}" + u += handleAvailabilityPathParams(q) + u += handleAvailabilityQueryParams(q) u createSchemaQuery = (q, s) -> u = createEntryPoint s - u = u + "schema/#{q.context}/#{q.agency}/#{q.id}/#{q.version}" - u = u + "?explicitMeasure=#{q.explicit}" - u = u + "&dimensionAtObservation=#{q.obsDimension}" if q.obsDimension + u += "schema/#{q.context}/#{q.agency}/#{q.id}/#{q.version}" + u += "?explicitMeasure=#{q.explicit}" + u += "&dimensionAtObservation=#{q.obsDimension}" if q.obsDimension u handleSchemaQueryParams = (q) -> @@ -148,9 +148,9 @@ handleSchemaQueryParams = (q) -> createShortSchemaQuery = (q, s) -> u = createEntryPoint s - u = u + "schema/#{q.context}/#{q.agency}/#{q.id}" - u = u + "/#{q.version}" unless q.version is 'latest' - u = u + handleSchemaQueryParams(q) + u += "schema/#{q.context}/#{q.agency}/#{q.id}" + u += "/#{q.version}" unless q.version is 'latest' + u += handleSchemaQueryParams(q) u excluded = [ From f4b670591163c9924461e74d1b99e8dc20a9e338 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 16:27:21 +0200 Subject: [PATCH 13/18] Lint: operator-linebreak --- .eslintrc | 3 ++- src/index.coffee | 18 +++++++++--------- src/utils/validators.coffee | 4 ++-- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/.eslintrc b/.eslintrc index f1dc6f7..cb1458c 100644 --- a/.eslintrc +++ b/.eslintrc @@ -53,6 +53,7 @@ "coffee/no-unneeded-ternary": 2, "coffee/no-whitespace-before-property": 1, "coffee/object-curly-spacing": 1, - "coffee/operator-assignment": 1 + "coffee/operator-assignment": 1, + "coffee/operator-linebreak": 1 } } \ No newline at end of file diff --git a/src/index.coffee b/src/index.coffee index be9d905..db9981b 100644 --- a/src/index.coffee +++ b/src/index.coffee @@ -60,10 +60,10 @@ isRequestedFormat = (requested, received) -> checkMediaType = (requested, response) -> fmt = response.headers.get('content-type') fmt = if fmt then fmt.replace /; version=/, ';version=' else fmt - unless isDataFormat(fmt) \ - or isMetadataFormat(fmt) \ - or isGenericFormat(fmt) \ - or isSchemaFormat(fmt) + unless isDataFormat(fmt) or \ + isMetadataFormat(fmt) or \ + isGenericFormat(fmt) or \ + isSchemaFormat(fmt) throw RangeError "Not an SDMX format: #{fmt}" unless isRequestedFormat(requested, fmt) throw RangeError "Wrong format: requested #{requested} but got #{fmt}" @@ -120,8 +120,8 @@ getService = (input) -> throw ReferenceError "#{input} is not in the list of predefined services" \ unless Service[input] Service[input] - else if input instanceof Object \ - and Object.prototype.toString.call(input) is '[object Object]' + else if input instanceof Object and \ + Object.prototype.toString.call(input) is '[object Object]' Service.from input else throw TypeError "Invalid type of #{input}. Expected an object or a string" @@ -284,9 +284,9 @@ getUrl = (query, service) -> throw ReferenceError 'Not a valid service' unless service throw ReferenceError 'Not a valid query' unless query s = getService service - q = if (query.mode? \ - or (query.flow? and query.references?) \ - or (query.flow? and query.component?)) + q = if (query.mode? or \ + (query.flow? and query.references?) or \ + (query.flow? and query.component?)) getAvailabilityQuery query else if query.flow? getDataQuery query diff --git a/src/utils/validators.coffee b/src/utils/validators.coffee index 9072e97..36a1541 100644 --- a/src/utils/validators.coffee +++ b/src/utils/validators.coffee @@ -29,8 +29,8 @@ validIso8601 = (input, name, errors) -> valid validPeriod = (input, name, errors) -> - valid = validIso8601(input, name, errors) \ - or validPattern(input, ReportingPeriodType, name, errors) + valid = validIso8601(input, name, errors) or \ + validPattern(input, ReportingPeriodType, name, errors) unless valid errors.push "#{name} must be a valid SDMX period or a valid ISO8601 date" valid = false From 653a0c64a6582ae1d55b23e20c45f935dce4c1e2 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 16:30:35 +0200 Subject: [PATCH 14/18] Lint: space-in-parens --- .eslintrc | 3 ++- src/metadata/metadata-references.coffee | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.eslintrc b/.eslintrc index cb1458c..9b03ef8 100644 --- a/.eslintrc +++ b/.eslintrc @@ -54,6 +54,7 @@ "coffee/no-whitespace-before-property": 1, "coffee/object-curly-spacing": 1, "coffee/operator-assignment": 1, - "coffee/operator-linebreak": 1 + "coffee/operator-linebreak": 1, + "space-in-parens": 1 } } \ No newline at end of file diff --git a/src/metadata/metadata-references.coffee b/src/metadata/metadata-references.coffee index f05005a..4737915 100644 --- a/src/metadata/metadata-references.coffee +++ b/src/metadata/metadata-references.coffee @@ -37,7 +37,7 @@ excluded = [ # All the predefined SDMX types are valid references, except for the 'catch all' # `structure` all = {} -( -> +(-> all[k1] = v1 for k1, v1 of MetadataType when v1 not in excluded all[k2] = v2 for k2, v2 of special )() From 3c315903b5b30f1d9ae46ee7037f2d1ce68e0a74 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 17:02:40 +0200 Subject: [PATCH 15/18] Lint: no-use-before-define --- .eslintrc | 32 +++++++++++++---- src/data/data-query.coffee | 24 ++++++------- src/index.coffee | 56 +++++++++++++++--------------- src/metadata/metadata-query.coffee | 12 +++---- src/schema/schema-query.coffee | 12 +++---- 5 files changed, 77 insertions(+), 59 deletions(-) diff --git a/.eslintrc b/.eslintrc index 9b03ef8..96f5cce 100644 --- a/.eslintrc +++ b/.eslintrc @@ -17,12 +17,8 @@ "coffee/no-empty-function": 2, "no-eval": 2, "coffee/no-useless-return": 1, - "coffee/no-unnecessary-double-quotes": 1, - "coffee/no-private-function-fat-arrows": 1, - "coffee/shorthand-this": 1, - "coffee/empty-func-parens": 1, - "coffee/english-operators": 1, - "coffee/no-backticks": 2, + + "coffee/no-use-before-define": 1, "coffee/array-bracket-newline": 1, "coffee/array-bracket-spacing": 1, @@ -55,6 +51,28 @@ "coffee/object-curly-spacing": 1, "coffee/operator-assignment": 1, "coffee/operator-linebreak": 1, - "space-in-parens": 1 + "space-in-parens": 1, + "coffee/space-infix-ops": 1, + "coffee/space-unary-ops": 1, + + "coffee/arrow-spacing": 1, + "no-duplicate-imports": 1, + "coffee/no-useless-computed-key": 1, + + "coffee/no-backticks": 2, + "coffee/english-operators": 1, + "coffee/empty-func-parens": 1, + "coffee/shorthand-this": 1, + "coffee/no-private-function-fat-arrows": 1, + "coffee/no-unnecessary-double-quotes": 1, + + "coffee/no-unused-modules": 1, + + "coffee/export": 1, + "coffee/no-named-as-default-member": 1, + "coffee/no-deprecated--import": 1, + + "coffee/no-default-export": 1, + "coffee/no-anonymous-default-export": 1 } } \ No newline at end of file diff --git a/src/data/data-query.coffee b/src/data/data-query.coffee index b2462c0..2987868 100644 --- a/src/data/data-query.coffee +++ b/src/data/data-query.coffee @@ -10,6 +10,18 @@ defaults = detail: DataDetail.FULL history: false +isValidHistory = (input, errors) -> + valid = typeof input is 'boolean' + errors.push "#{input} is not a valid value for history. Must be true or \ + false" unless valid + valid + +isValidNObs = (input, name, errors) -> + valid = typeof input is 'number' and input > 0 + errors.push "#{input} is not a valid value for #{name}. Must be a positive \ + integer" unless valid + valid + ValidQuery = flow: (i, e) -> isValidPattern(i, FlowRefType, 'flows', e) key: (i, e) -> isValidPattern(i, SeriesKeyType, 'series key', e) @@ -24,18 +36,6 @@ ValidQuery = detail: (i, e) -> isValidEnum(i, DataDetail, 'details', e) history: (i, e) -> isValidHistory(i, e) -isValidHistory = (input, errors) -> - valid = typeof input is 'boolean' - errors.push "#{input} is not a valid value for history. Must be true or \ - false" unless valid - valid - -isValidNObs = (input, name, errors) -> - valid = typeof input is 'number' and input > 0 - errors.push "#{input} is not a valid value for #{name}. Must be a positive \ - integer" unless valid - valid - isValidQuery = (q) -> errors = [] isValid = false diff --git a/src/index.coffee b/src/index.coffee index db9981b..42ab35c 100644 --- a/src/index.coffee +++ b/src/index.coffee @@ -299,6 +299,32 @@ getUrl = (query, service) -> else throw Error 'Not a valid query' +# +# Executes the supplied query against the supplied service and returns a +# Promise. +# +# At the difference with the request() function, request2() will +# include the response headers and additional information such as the status. +# +# @see #request for additional information about the required parameters. +# +request2 = (params...) -> + q = params[0] + s = if typeof q is 'string' then guessService q else getService params[1] + u = if typeof q is 'string' then q else getUrl q, s + o = if typeof q is 'string' then params[1] else params[2] + t = null + if u.indexOf('/data/') > -1 + t = 'data' + else if u.indexOf('/schema/') > -1 + t = 'schema' + else + t = 'structure' + + requestOptions = addHeaders o, s, t + fetch(u, requestOptions) + .then((response) -> response) + # # Executes the supplied query against the supplied service and returns a # Promise. @@ -308,7 +334,7 @@ getUrl = (query, service) -> # # @example Executes the supplied query against the supplied service # sdmxrest.request({flow: 'EXR', key: 'A.CHF.EUR.SP00.A'}, 'ECB') - # .then(function(data) {console.log(data);}) +# .then(function(data) {console.log(data);}) # .catch(function(error) {console.log(error);}); # # @example Executes the supplied query against the supplied service, asking the @@ -323,7 +349,7 @@ getUrl = (query, service) -> # # @example Fetches the supplied URL # sdmxrest.request('http://sdw-wsrest.ecb.europa.eu/service/data/EXR') - # .then(function(data) {console.log(data);}) +# .then(function(data) {console.log(data);}) # .catch(function(error) {console.log(error);}); # # @example Fetches the supplied URL, asking the service to return a compressed @@ -351,32 +377,6 @@ request = (params...) -> checkStatus params[0], response response.text()) -# -# Executes the supplied query against the supplied service and returns a -# Promise. -# -# At the difference with the request() function, request2() will -# include the response headers and additional information such as the status. -# -# @see #request for additional information about the required parameters. -# -request2 = (params...) -> - q = params[0] - s = if typeof q is 'string' then guessService q else getService params[1] - u = if typeof q is 'string' then q else getUrl q, s - o = if typeof q is 'string' then params[1] else params[2] - t = null - if u.indexOf('/data/') > -1 - t = 'data' - else if u.indexOf('/schema/') > -1 - t = 'schema' - else - t = 'structure' - - requestOptions = addHeaders o, s, t - fetch(u, requestOptions) - .then((response) -> response) - module.exports = getService: getService services: services diff --git a/src/metadata/metadata-query.coffee b/src/metadata/metadata-query.coffee index fcb70ae..ed3ab92 100644 --- a/src/metadata/metadata-query.coffee +++ b/src/metadata/metadata-query.coffee @@ -14,6 +14,12 @@ defaults = references: MetadataReferences.NONE item: 'all' +canHaveItem = (query, errors) -> + allowed = query.item is 'all' or isItemScheme query.resource + errors.push "#{query.resource} is not an item scheme and therefore it is \ + not possible to query by item" unless allowed + allowed + ValidQuery = resource: (q, i, e) -> isValidEnum(i, MetadataType, 'resources', e) agency: (q, i, e) -> isValidPattern(i, AgenciesRefType, 'agencies', e) @@ -24,12 +30,6 @@ ValidQuery = item: (q, i, e) -> isValidPattern(i, MultipleNestedIDType, 'items', e) and \ canHaveItem(q, e) -canHaveItem = (query, errors) -> - allowed = query.item is 'all' or isItemScheme query.resource - errors.push "#{query.resource} is not an item scheme and therefore it is \ - not possible to query by item" unless allowed - allowed - isValidQuery = (query) -> errors = [] isValid = false diff --git a/src/schema/schema-query.coffee b/src/schema/schema-query.coffee index eb217b7..fab0d54 100644 --- a/src/schema/schema-query.coffee +++ b/src/schema/schema-query.coffee @@ -8,6 +8,12 @@ defaults = version: 'latest' explicit: false +isValidExplicit = (input, errors) -> + valid = typeof input is 'boolean' + errors.push "#{input} is not a valid value for explicit. Must be true or \ + false" unless valid + valid + ValidQuery = context: (q, i, e) -> isValidEnum(i, SchemaContext, 'context', e) agency: (q, i, e) -> isValidPattern(i, NestedNCNameIDType, 'agency', e) @@ -17,12 +23,6 @@ ValidQuery = obsDimension: (q, i, e) -> not i or isValidPattern(i, NCNameIDType, 'obs dimension', e) -isValidExplicit = (input, errors) -> - valid = typeof input is 'boolean' - errors.push "#{input} is not a valid value for explicit. Must be true or \ - false" unless valid - valid - isValidQuery = (query) -> errors = [] isValid = false From c942a936a09a21619c1956d1c88b8ddd7f60a880 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 17:16:32 +0200 Subject: [PATCH 16/18] Lint: no-else-return --- .eslintrc | 10 +++++++++- src/index.coffee | 6 ++---- src/metadata/metadata-references.coffee | 9 +++++---- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/.eslintrc b/.eslintrc index 96f5cce..7b145e2 100644 --- a/.eslintrc +++ b/.eslintrc @@ -14,10 +14,18 @@ "coffee/block-scoped-var": 1, "coffee/class-methods-use-this": 1, "coffee/complexity": 2, + + "coffee/no-else-return": 1, "coffee/no-empty-function": 2, "no-eval": 2, + "coffee/no-loop-func": 1, + "coffee/no-return-assign": 1, + "coffee/no-self-compare": 1, + "coffee/no-sequences": 1, + "coffee/no-unmodified-loop-condition": 1, + "coffee/no-unused-expressions": 1, + "no-useless-concat": 1, "coffee/no-useless-return": 1, - "coffee/no-use-before-define": 1, "coffee/array-bracket-newline": 1, diff --git a/src/index.coffee b/src/index.coffee index 42ab35c..e5c1dbd 100644 --- a/src/index.coffee +++ b/src/index.coffee @@ -294,10 +294,8 @@ getUrl = (query, service) -> getMetadataQuery query else if query.context? getSchemaQuery query - if q - return new UrlGenerator().getUrl q, s - else - throw Error 'Not a valid query' + throw Error 'Not a valid query' unless q + return new UrlGenerator().getUrl q, s # # Executes the supplied query against the supplied service and returns a diff --git a/src/metadata/metadata-references.coffee b/src/metadata/metadata-references.coffee index 4737915..ba2fd47 100644 --- a/src/metadata/metadata-references.coffee +++ b/src/metadata/metadata-references.coffee @@ -37,10 +37,11 @@ excluded = [ # All the predefined SDMX types are valid references, except for the 'catch all' # `structure` all = {} -(-> - all[k1] = v1 for k1, v1 of MetadataType when v1 not in excluded - all[k2] = v2 for k2, v2 of special -)() +for k1, v1 of MetadataType when v1 not in excluded + all[k1] = v1 + +for k2, v2 of special + all[k2] = v2 exports.MetadataReferences = Object.freeze all exports.MetadataReferencesExcluded = Object.freeze excluded From ba01acd66dbf7522f0c13c81ba511f9f7b1607f3 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 17:20:29 +0200 Subject: [PATCH 17/18] Lint: guard-for-in --- .eslintrc | 1 + src/avail/availability-query.coffee | 2 +- src/data/data-query.coffee | 2 +- src/index.coffee | 2 +- src/metadata/metadata-query.coffee | 2 +- src/metadata/metadata-references.coffee | 4 ++-- src/schema/schema-query.coffee | 2 +- src/service/service.coffee | 2 +- 8 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.eslintrc b/.eslintrc index 7b145e2..cbaa40e 100644 --- a/.eslintrc +++ b/.eslintrc @@ -15,6 +15,7 @@ "coffee/class-methods-use-this": 1, "coffee/complexity": 2, + "coffee/guard-for-in": 1, "coffee/no-else-return": 1, "coffee/no-empty-function": 2, "no-eval": 2, diff --git a/src/avail/availability-query.coffee b/src/avail/availability-query.coffee index 3ac3ca8..e1f0cfc 100644 --- a/src/avail/availability-query.coffee +++ b/src/avail/availability-query.coffee @@ -26,7 +26,7 @@ ValidQuery = isValidQuery = (q) -> errors = [] isValid = false - for k, v of q + for own k, v of q isValid = ValidQuery[k](v, errors) break unless isValid {isValid: isValid, errors: errors} diff --git a/src/data/data-query.coffee b/src/data/data-query.coffee index 2987868..8b8abc8 100644 --- a/src/data/data-query.coffee +++ b/src/data/data-query.coffee @@ -39,7 +39,7 @@ ValidQuery = isValidQuery = (q) -> errors = [] isValid = false - for k, v of q + for own k, v of q isValid = ValidQuery[k](v, errors) break unless isValid {isValid: isValid, errors: errors} diff --git a/src/index.coffee b/src/index.coffee index e5c1dbd..27cc2f6 100644 --- a/src/index.coffee +++ b/src/index.coffee @@ -71,7 +71,7 @@ checkMediaType = (requested, response) -> addHeaders = (opts, s, type) -> opts ?= {} headers = {} - headers[key.toLowerCase()] = opts.headers[key] for key of opts.headers + headers[key.toLowerCase()] = opts.headers[key] for own key of opts.headers unless headers.accept headers.accept = switch type when 'data' then s.format diff --git a/src/metadata/metadata-query.coffee b/src/metadata/metadata-query.coffee index ed3ab92..8d39b6b 100644 --- a/src/metadata/metadata-query.coffee +++ b/src/metadata/metadata-query.coffee @@ -33,7 +33,7 @@ ValidQuery = isValidQuery = (query) -> errors = [] isValid = false - for k, v of query + for own k, v of query isValid = ValidQuery[k](query, v, errors) break unless isValid {isValid: isValid, errors: errors} diff --git a/src/metadata/metadata-references.coffee b/src/metadata/metadata-references.coffee index ba2fd47..a7dba95 100644 --- a/src/metadata/metadata-references.coffee +++ b/src/metadata/metadata-references.coffee @@ -37,10 +37,10 @@ excluded = [ # All the predefined SDMX types are valid references, except for the 'catch all' # `structure` all = {} -for k1, v1 of MetadataType when v1 not in excluded +for own k1, v1 of MetadataType when v1 not in excluded all[k1] = v1 -for k2, v2 of special +for own k2, v2 of special all[k2] = v2 exports.MetadataReferences = Object.freeze all diff --git a/src/schema/schema-query.coffee b/src/schema/schema-query.coffee index fab0d54..4536732 100644 --- a/src/schema/schema-query.coffee +++ b/src/schema/schema-query.coffee @@ -26,7 +26,7 @@ ValidQuery = isValidQuery = (query) -> errors = [] isValid = false - for k, v of query + for own k, v of query isValid = ValidQuery[k](query, v, errors) break unless isValid {isValid: isValid, errors: errors} diff --git a/src/service/service.coffee b/src/service/service.coffee index e4d9e83..b783c36 100644 --- a/src/service/service.coffee +++ b/src/service/service.coffee @@ -20,7 +20,7 @@ isValidService = (q) -> createSecureInstance = (service) -> secure = {} - secure[key] = service[key] for key of service + secure[key] = service[key] for own key of service secure.url = secure.url.replace('http', 'https') secure From 845e6336918c11a961163a84f96da93323302059 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Sat, 29 Aug 2020 17:28:28 +0200 Subject: [PATCH 18/18] Lint: Configure rules --- .eslintrc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.eslintrc b/.eslintrc index cbaa40e..8abed94 100644 --- a/.eslintrc +++ b/.eslintrc @@ -9,12 +9,13 @@ "plugin:coffee/eslint-recommended" ], "rules": { - "coffee/id-length": 0, + "coffee/no-await-in-loop": 1, + "no-console": 1, "coffee/no-template-curly-in-string": 1, "coffee/block-scoped-var": 1, "coffee/class-methods-use-this": 1, "coffee/complexity": 2, - + "coffee/dot-notation": 1, "coffee/guard-for-in": 1, "coffee/no-else-return": 1, "coffee/no-empty-function": 2, @@ -38,6 +39,7 @@ "coffee/consistent-this": 1, "eol-last": 1, "coffee/function-paren-newline": 1, + "coffee/id-length": 0, "key-spacing": 1, "coffee/keyword-spacing": 1, "coffee/lines-between-class-members": 1,