@muze-nl/assert 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,9 +4,24 @@
4
4
 
5
5
  This is a light-weight library to do optional assertion checking. By default any assertions made are not tested. Assertion code is not run. Unless you toggle assertion checking, usually in developer mode, by calling `enable`. Now your assertions are run, and if any assertions fail, an error is thrown with information about the specific failure.
6
6
 
7
- ## Asserting preconditions
7
+ _Note:_ This library was created as part of the [@muze-nl/metro](https://github.com/muze-nl/metro/) package initially, but has escaped its confines. In the rest of the documentation, when referring to 'middleware', we mean middleware modules for the metro http client in the browser.
8
+
9
+ ## Installation
10
+
11
+ Using NPM:
12
+
13
+ ```shell
14
+ npm install @muze-nl/assert
15
+ ```
8
16
 
9
- This library was created as part of the [@muze-nl/metro](https://github.com/muze-nl/metro/) package initially, but has escaped its confines.
17
+ Using a CDN like jsdelivr
18
+ ```html
19
+ <script src="https://cdn.jsdelivr.net/npm/@muze-nl/assert@0.1.1/dist/browser.js" integrity="sha384-UzlYv+OL1tl0rZiZQAkX+6yECgjFWtCU/PCgShtCv41A1Vm75JgT1s05iAUUs/di" crossorigin="anonymous"></script>
20
+ ```
21
+
22
+ _Note_: jsdelivr.com doesn't calculate the integrity hash for you, I've used https://www.srihash.org here.
23
+
24
+ ## Asserting preconditions
10
25
 
11
26
  When writing middleware there is usually quite a lot of preconditions to check. When a developer wants to use your middleware, it is nice to have explicit feedback about what he or she is doing wrong. However this is only useful during development. Once in production you should assume that there are no developer mistakes anymore... or at least that the end user has no use for detailed error reports about your middleware.
12
27
 
@@ -0,0 +1,2 @@
1
+ function t(t,e,n,a){Object.defineProperty(t,e,{get:n,set:a,enumerable:!0,configurable:!0})}var e={};function n(){globalThis.assertEnabled=!0}function a(){globalThis.assertEnabled=!1}function r(t,e,n){return{message:t,found:e,expected:n}}function o(t,e,n){let a=[];if(e===Boolean)"boolean"!=typeof t&&a.push(r("data is not a boolean",t,e));else if(e===Number)"number"!=typeof t&&a.push(r("data is not a number",t,e));else if(e instanceof RegExp){if(Array.isArray(t)){let n=t.findIndex(t=>o(t,e));n>-1&&a.push(r("data["+n+"] does not match pattern",t[n],e))}else e.test(t)||a.push(r("data does not match pattern",t,e))}else if(e instanceof Function)e(t,n)&&a.push(r("data does not match function",t,e));else if(Array.isArray(e))for(p of(Array.isArray(t)||a.push(r("data is not an array",t,[])),e)){let e=o(t,p);Array.isArray(e)?a.concat(e):e&&a.push(e)}else if(e&&"object"==typeof e){if(Array.isArray(t)){let n=t.findIndex(t=>o(t,e));n>-1&&a.push(r("data["+n+"] does not match pattern",t[n],e))}else if(t&&"object"==typeof t){t instanceof URLSearchParams&&(t=Object.fromEntries(t));let n=a[a.length-1];for(let[i,s]of Object.entries(e)){let e=o(t[i],s,t);e&&(n&&"string"!=typeof n||(n={},a.push(r(n,t[i],s))),n[i]=e.problems)}}else a.push(r("data is not an object, pattern is",t,e))}else e!=t&&a.push(r("data and pattern are not equal",t,e));return!!a.length&&a}function i(t,e){if(!globalThis.assertEnabled)return;let n=o(t,e);if(n)throw new y(n,t)}function s(t){return function(e){return null!=e&&void 0!==e&&o(e,t)}}function u(t){return function(e){return o(e,t)}}function f(t){return null==data||"undefined"==typeof data?(console.warning("data does not contain recommended value",data,t),!1):o(data,t)}function l(...t){return function(e){for(let n of t)if(!o(e,n))return!1;return r("data does not match oneOf patterns",e,t)}}function c(...t){return function(e){if(!Array.isArray(e))return r("data is not an array",e,"anyOf");for(let n of e)if(l(...t)(n))return r("data does not match anyOf patterns",n,t);return!1}}function d(t){try{if(new URL(t).href!=t)return r("data is not a fully qualified url",t,"validURL")}catch(e){return r("data is not a valid url",t,"validURL")}return!1}function h(t){return function(e){return!(e instanceof t)&&r("data is not an instanceof pattern",e,t)}}function b(t){return function(e){return!o(e,t)&&r("data matches pattern, when required not to",e,t)}}t(e,"enable",()=>n),t(e,"disable",()=>a),t(e,"error",()=>r),t(e,"fails",()=>o),t(e,"assert",()=>i),t(e,"Optional",()=>s),t(e,"Required",()=>u),t(e,"Recommended",()=>f),t(e,"oneOf",()=>l),t(e,"anyOf",()=>c),t(e,"validURL",()=>d),t(e,"instanceOf",()=>h),t(e,"not",()=>b),globalThis.assertEnabled=!1;class y{constructor(t,...e){this.problems=t,this.details=e,console.trace()}}globalThis.assert=e;
2
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["<anon>","src/browser.mjs","src/assert.mjs"],"sourcesContent":["\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $2ddd80d1adc2ea42$exports = {};\n\n$parcel$export($2ddd80d1adc2ea42$exports, \"enable\", () => $2ddd80d1adc2ea42$export$d7c4a0dd6a4567e5);\n$parcel$export($2ddd80d1adc2ea42$exports, \"disable\", () => $2ddd80d1adc2ea42$export$e20fbacbb41798b);\n$parcel$export($2ddd80d1adc2ea42$exports, \"error\", () => $2ddd80d1adc2ea42$export$a3bc9b8ed74fc);\n$parcel$export($2ddd80d1adc2ea42$exports, \"fails\", () => $2ddd80d1adc2ea42$export$478159de811fd37d);\n$parcel$export($2ddd80d1adc2ea42$exports, \"assert\", () => $2ddd80d1adc2ea42$export$a7a9523472993e97);\n$parcel$export($2ddd80d1adc2ea42$exports, \"Optional\", () => $2ddd80d1adc2ea42$export$7acb7b24c478f9c6);\n$parcel$export($2ddd80d1adc2ea42$exports, \"Required\", () => $2ddd80d1adc2ea42$export$1788c381af06add2);\n$parcel$export($2ddd80d1adc2ea42$exports, \"Recommended\", () => $2ddd80d1adc2ea42$export$a83bcf183f49ea9);\n$parcel$export($2ddd80d1adc2ea42$exports, \"oneOf\", () => $2ddd80d1adc2ea42$export$a9a18ae5ba42aeab);\n$parcel$export($2ddd80d1adc2ea42$exports, \"anyOf\", () => $2ddd80d1adc2ea42$export$b26c150f612c10f7);\n$parcel$export($2ddd80d1adc2ea42$exports, \"validURL\", () => $2ddd80d1adc2ea42$export$c6f1a4382426409f);\n$parcel$export($2ddd80d1adc2ea42$exports, \"instanceOf\", () => $2ddd80d1adc2ea42$export$ca03416d6c9e029e);\n$parcel$export($2ddd80d1adc2ea42$exports, \"not\", () => $2ddd80d1adc2ea42$export$6003a5f097c73977);\n// global state switch to enable/disable assert\n// uses globalThis so that even if npm installs multiple\n// versions of this library, all use this same state\nglobalThis.assertEnabled = false;\nfunction $2ddd80d1adc2ea42$export$d7c4a0dd6a4567e5() {\n globalThis.assertEnabled = true;\n}\nfunction $2ddd80d1adc2ea42$export$e20fbacbb41798b() {\n globalThis.assertEnabled = false;\n}\nfunction $2ddd80d1adc2ea42$export$a3bc9b8ed74fc(message, found, expected) {\n return {\n message: message,\n found: found,\n expected: expected\n };\n}\nfunction $2ddd80d1adc2ea42$export$478159de811fd37d(data1, pattern, container) {\n let problems = [];\n if (pattern === Boolean) {\n if (typeof data1 != \"boolean\") problems.push($2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data is not a boolean\", data1, pattern));\n } else if (pattern === Number) {\n if (typeof data1 != \"number\") problems.push($2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data is not a number\", data1, pattern));\n } else if (pattern instanceof RegExp) {\n if (Array.isArray(data1)) {\n let index = data1.findIndex((element)=>$2ddd80d1adc2ea42$export$478159de811fd37d(element, pattern));\n if (index > -1) problems.push($2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data[\" + index + \"] does not match pattern\", data1[index], pattern));\n } else if (!pattern.test(data1)) problems.push($2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data does not match pattern\", data1, pattern));\n } else if (pattern instanceof Function) {\n if (pattern(data1, container)) problems.push($2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data does not match function\", data1, pattern));\n } else if (Array.isArray(pattern)) {\n if (!Array.isArray(data1)) problems.push($2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data is not an array\", data1, []));\n for (p of pattern){\n let problem = $2ddd80d1adc2ea42$export$478159de811fd37d(data1, p);\n if (Array.isArray(problem)) problems.concat(problem);\n else if (problem) problems.push(problem);\n }\n } else if (pattern && typeof pattern == \"object\") {\n if (Array.isArray(data1)) {\n let index = data1.findIndex((element)=>$2ddd80d1adc2ea42$export$478159de811fd37d(element, pattern));\n if (index > -1) problems.push($2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data[\" + index + \"] does not match pattern\", data1[index], pattern));\n } else if (!data1 || typeof data1 != \"object\") problems.push($2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data is not an object, pattern is\", data1, pattern));\n else {\n if (data1 instanceof URLSearchParams) data1 = Object.fromEntries(data1);\n let p1 = problems[problems.length - 1];\n for (const [wKey, wVal] of Object.entries(pattern)){\n let result = $2ddd80d1adc2ea42$export$478159de811fd37d(data1[wKey], wVal, data1);\n if (result) {\n if (!p1 || typeof p1 == \"string\") {\n p1 = {};\n problems.push($2ddd80d1adc2ea42$export$a3bc9b8ed74fc(p1, data1[wKey], wVal));\n }\n p1[wKey] = result.problems;\n }\n }\n }\n } else if (pattern != data1) problems.push($2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data and pattern are not equal\", data1, pattern));\n if (problems.length) return problems;\n return false;\n}\nfunction $2ddd80d1adc2ea42$export$a7a9523472993e97(source, test) {\n if (!globalThis.assertEnabled) return;\n let result = $2ddd80d1adc2ea42$export$478159de811fd37d(source, test);\n if (result) throw new $2ddd80d1adc2ea42$var$assertError(result, source);\n}\nfunction $2ddd80d1adc2ea42$export$7acb7b24c478f9c6(pattern) {\n return function(data1) {\n if (data1 == null || typeof data1 == \"undefined\") return false;\n return $2ddd80d1adc2ea42$export$478159de811fd37d(data1, pattern);\n };\n}\nfunction $2ddd80d1adc2ea42$export$1788c381af06add2(pattern) {\n return function(data1) {\n return $2ddd80d1adc2ea42$export$478159de811fd37d(data1, pattern);\n };\n}\nfunction $2ddd80d1adc2ea42$export$a83bcf183f49ea9(pattern) {\n if (data == null || typeof data == \"undefined\") {\n console.warning(\"data does not contain recommended value\", data, pattern);\n return false;\n }\n return $2ddd80d1adc2ea42$export$478159de811fd37d(data, pattern);\n}\nfunction $2ddd80d1adc2ea42$export$a9a18ae5ba42aeab(...patterns) {\n return function(data1) {\n for (let pattern of patterns){\n if (!$2ddd80d1adc2ea42$export$478159de811fd37d(data1, pattern)) return false;\n }\n return $2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data does not match oneOf patterns\", data1, patterns);\n };\n}\nfunction $2ddd80d1adc2ea42$export$b26c150f612c10f7(...patterns) {\n return function(data1) {\n if (!Array.isArray(data1)) return $2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data is not an array\", data1, \"anyOf\");\n for (let value of data1){\n if ($2ddd80d1adc2ea42$export$a9a18ae5ba42aeab(...patterns)(value)) return $2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data does not match anyOf patterns\", value, patterns);\n }\n return false;\n };\n}\nfunction $2ddd80d1adc2ea42$export$c6f1a4382426409f(data1) {\n try {\n let url = new URL(data1);\n if (url.href != data1) return $2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data is not a fully qualified url\", data1, \"validURL\");\n } catch (e) {\n return $2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data is not a valid url\", data1, \"validURL\");\n }\n return false;\n}\nfunction $2ddd80d1adc2ea42$export$ca03416d6c9e029e(constructor) {\n return function(data1) {\n if (!(data1 instanceof constructor)) return $2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data is not an instanceof pattern\", data1, constructor);\n return false;\n };\n}\nfunction $2ddd80d1adc2ea42$export$6003a5f097c73977(pattern) {\n return function(data1) {\n let problem = $2ddd80d1adc2ea42$export$478159de811fd37d(data1, pattern);\n if (problem) return false;\n return $2ddd80d1adc2ea42$export$a3bc9b8ed74fc(\"data matches pattern, when required not to\", data1, pattern);\n };\n}\nclass $2ddd80d1adc2ea42$var$assertError {\n constructor(problems, ...details){\n this.problems = problems;\n this.details = details;\n console.trace();\n }\n}\n\n\nglobalThis.assert = $2ddd80d1adc2ea42$exports;\n\n\n//# sourceMappingURL=browser.js.map\n","import * as assert from './assert.mjs'\n\nglobalThis.assert = assert\n","// global state switch to enable/disable assert\n// uses globalThis so that even if npm installs multiple\n// versions of this library, all use this same state\nglobalThis.assertEnabled = false\n\nexport function enable() {\n\tglobalThis.assertEnabled = true\n}\n\nexport function disable() {\n\tglobalThis.assertEnabled = false\n}\n\nexport function error(message, found, expected) {\n\treturn {\n\t\tmessage,\n\t\tfound,\n\t\texpected\n\t}\n}\n\n/**\n * returns new Boolean(true) if data does not match pattern\n * you can't return new Boolean(false), or at least that evaluates\n * to true, so if the data does match, it returns a primitive false\n * the Boolean(true) has an extra property called 'problems', which is\n * an array with a list of all fields that do not match, and why\n * @param {any} data The data to match\n * @param {any} pattern The pattern to match\n * @return {Array|false} Array with problems if the pattern fails, false\n */\nexport function fails(data, pattern, container) {\n\tlet problems = []\n\tif (pattern === Boolean) {\n\t\tif (typeof data != 'boolean') {\n\t\t\tproblems.push(error('data is not a boolean', data, pattern))\n\t\t}\t\t\n\t} else if (pattern === Number) {\n\t\tif (typeof data != 'number') {\n\t\t\tproblems.push(error('data is not a number', data, pattern))\n\t\t}\n\t} else if (pattern instanceof RegExp) {\n \tif (Array.isArray(data)) {\n\t\t\tlet index = data.findIndex(element => fails(element,pattern))\n if (index>-1) {\n \tproblems.push(error('data['+index+'] does not match pattern', data[index], pattern))\n }\n \t} else if (!pattern.test(data)) {\n \tproblems.push(error('data does not match pattern', data, pattern))\n }\n } else if (pattern instanceof Function) {\n if (pattern(data, container)) {\n \tproblems.push(error('data does not match function', data, pattern))\n }\n } else if (Array.isArray(pattern)) {\n\t\tif (!Array.isArray(data)) {\n\t\t\tproblems.push(error('data is not an array',data,[]))\n\t\t}\n\t\tfor (p of pattern) {\n\t\t\tlet problem = fails(data, p)\n\t\t\tif (Array.isArray(problem)) {\n\t\t\t\tproblems.concat(problem)\n\t\t\t} else if (problem) {\n\t\t\t\tproblems.push(problem)\n\t\t\t}\n \t}\n } else if (pattern && typeof pattern == 'object') {\n if (Array.isArray(data)) {\n let index = data.findIndex(element => fails(element,pattern))\n if (index>-1) {\n \tproblems.push(error('data['+index+'] does not match pattern', data[index], pattern))\n }\n } else if (!data || typeof data != 'object') {\n \tproblems.push(error('data is not an object, pattern is', data, pattern))\n } else {\n \tif (data instanceof URLSearchParams) {\n \t\tdata = Object.fromEntries(data)\n \t}\n\t let p = problems[problems.length-1]\n\t for (const [wKey, wVal] of Object.entries(pattern)) {\n\t let result = fails(data[wKey], wVal, data)\n\t if (result) {\n\t \tif (!p || typeof p == 'string') {\n\t \t\tp = {}\n\t \t\tproblems.push(error(p, data[wKey], wVal))\n\t \t}\n\t \tp[wKey] = result.problems\n\t }\n\t }\n\t }\n } else {\n \tif (pattern!=data) {\n \t\tproblems.push(error('data and pattern are not equal', data, pattern))\n \t}\n }\n if (problems.length) {\n \treturn problems\n }\n return false\n}\n\nexport function assert(source, test) {\n\tif (!globalThis.assertEnabled) {\n\t\treturn\n\t}\n\tlet result = fails(source,test)\n\tif (result) {\n\t\tthrow new assertError(result,source)\n\t}\n}\n\nexport function Optional(pattern) {\n\treturn function(data) {\n\t\tif (data==null || typeof data == 'undefined') {\n\t\t\treturn false\n\t\t}\n\t\treturn fails(data, pattern)\n\t}\n}\n\nexport function Required(pattern) {\n\treturn function(data) {\n\t\treturn fails(data, pattern)\n\t}\n}\n\nexport function Recommended(pattern) {\n\tif (data==null || typeof data == 'undefined') {\n\t\tconsole.warning('data does not contain recommended value', data, pattern)\n\t\treturn false\n\t}\n\treturn fails(data, pattern)\n}\n\nexport function oneOf(...patterns) {\n\treturn function(data) {\n\t\tfor(let pattern of patterns) {\n\t\t\tif (!fails(data, pattern)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\treturn error('data does not match oneOf patterns',data,patterns)\n\t}\n}\n\nexport function anyOf(...patterns) {\n\treturn function(data) {\n\t\tif (!Array.isArray(data)) {\n\t\t\treturn error('data is not an array',data,'anyOf')\n\t\t}\n\t\tfor (let value of data) {\n\t\t\tif (oneOf(...patterns)(value)) {\n\t\t\t\treturn error('data does not match anyOf patterns',value,patterns)\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n}\n\nexport function validURL(data) {\n\ttry {\n\t\tlet url = new URL(data)\n\t\tif (url.href!=data) {\n\t\t\treturn error('data is not a fully qualified url',data,'validURL')\n\t\t}\n\t} catch(e) {\n\t\treturn error('data is not a valid url',data,'validURL')\n\t}\n\treturn false\n}\n\nexport function instanceOf(constructor) {\n\treturn function(data) {\n\t\tif (!(data instanceof constructor)) {\n\t\t\treturn error('data is not an instanceof pattern',data,constructor)\n\t\t}\n\t\treturn false\n\t}\n}\n\nexport function not(pattern) {\n\treturn function(data) {\n\t\tlet problem = fails(data, pattern)\n\t\tif (problem) {\n\t\t\treturn false\n\t\t}\n\t\treturn error('data matches pattern, when required not to', data, pattern)\n\t}\n}\n\nclass assertError {\n\tconstructor(problems, ...details) {\n\t\tthis.problems = problems\n\t\tthis.details = details\n\t\tconsole.trace()\n\t}\n}\n"],"names":["$parcel$export","e","n","v","s","Object","defineProperty","get","set","enumerable","configurable","$2ddd80d1adc2ea42$exports","$2ddd80d1adc2ea42$export$d7c4a0dd6a4567e5","globalThis","assertEnabled","$2ddd80d1adc2ea42$export$e20fbacbb41798b","$2ddd80d1adc2ea42$export$a3bc9b8ed74fc","message","found","expected","$2ddd80d1adc2ea42$export$478159de811fd37d","data1","pattern","container","problems","Boolean","push","Number","RegExp","Array","isArray","index","findIndex","element","test","Function","p","problem","concat","URLSearchParams","fromEntries","p1","length","wKey","wVal","entries","result","$2ddd80d1adc2ea42$export$a7a9523472993e97","source","$2ddd80d1adc2ea42$var$assertError","$2ddd80d1adc2ea42$export$7acb7b24c478f9c6","$2ddd80d1adc2ea42$export$1788c381af06add2","$2ddd80d1adc2ea42$export$a83bcf183f49ea9","data","console","warning","$2ddd80d1adc2ea42$export$a9a18ae5ba42aeab","patterns","$2ddd80d1adc2ea42$export$b26c150f612c10f7","value","$2ddd80d1adc2ea42$export$c6f1a4382426409f","url","URL","href","$2ddd80d1adc2ea42$export$ca03416d6c9e029e","constructor","$2ddd80d1adc2ea42$export$6003a5f097c73977","details","trace","assert"],"version":3,"file":"browser.js.map","sourceRoot":"../"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@muze-nl/assert",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "light optional assert library",
5
5
  "type": "module",
6
6
  "main": "src/assert.mjs",
@@ -26,7 +26,16 @@
26
26
  },
27
27
  "files": [
28
28
  "/src",
29
+ "/dist",
29
30
  "/LICENSE",
30
31
  "/README.md"
31
- ]
32
+ ],
33
+ "source": [ "src/browser.mjs" ],
34
+ "targets": {
35
+ "default": {
36
+ "distDir": "./dist",
37
+ "optimize": true
38
+ },
39
+ "main": false
40
+ }
32
41
  }
@@ -0,0 +1,3 @@
1
+ import * as assert from './assert.mjs'
2
+
3
+ globalThis.assert = assert