@autometa/overloaded
Advanced tools
+6
-0
| # Gherkin | ||
| ## 0.3.2 | ||
| ### Patch Changes | ||
| - 04ed85d: feat: added HTP client based on axios | ||
| ## 0.3.1 | ||
@@ -4,0 +10,0 @@ |
+5
-4
| { | ||
| "name": "@autometa/overloaded", | ||
| "version": "0.3.1", | ||
| "version": "0.3.2", | ||
| "main": "dist/index.js", | ||
@@ -29,6 +29,6 @@ "module": "./dist/esm/index.js", | ||
| "rimraf": "^4.1.2", | ||
| "tsconfig": "0.7.0", | ||
| "tsup": "^7.2.0", | ||
| "typescript": "^4.9.5", | ||
| "vitest": "0.33.0", | ||
| "tsconfig": "0.7.0" | ||
| "vitest": "0.34.6" | ||
| }, | ||
@@ -50,3 +50,4 @@ "dependencies": { | ||
| "build:watch": "tsup --watch" | ||
| } | ||
| }, | ||
| "readme": "# Overloaded\n\nOverloads as easy to make as they are to use.\n\nInspired by [zod](https://zod.dev/) and [myzod](https://github.com/davidmdm/myzod)\n\n## Quick Start\n\n### Contrived Example:\n\n```ts\nexport function myFunc(a: string): string;\nexport function myFunc(a: string, b: number): string;\nexport function myFunc(a: string, b: string): string;\nexport function myFunc(a: string, b: { a: string; b: number[] }): string;\nexport function myFunc(a: string, b: MyClassBuilder): MyClass;\nexport function myFunc(...args: unknown) {\n return overloads(\n // optional name 'a' // type of 'a' inferred as 'string'\n def(string(\"a\")).matches((a) => `hello ${a}`),\n\n // simply declare each argument as you expect it. The first match will\n // be executed\n def(string(\"a\"), number(\"b\")).matches((a, b) => `hello ${a}`.repeat(b)),\n\n // Verify complex (even nested) objects, arrays, tuples.\n def(string(\"a\"), shape({ a: string(), arr: array([number()]) })).matches(\n (a, b) => b.arr.map((num) => `${num}: hello ${a}: ${b.a}`)\n ),\n\n // Check for an instance of a class. Optionally provide a 'shape' as above\n def(string(\"a\"), instance(\"b\", MyClassBuilder)).matches(\n (name, myClassBuilder) => myClassBuilder.setName(name).build()\n ),\n\n // validate actual values - useful for configurable, non overloaded functions\n // or implementing the strategy pattern.\n def(\n string(\"a\", { equals: \"admin\" }),\n string(\"b\", { in: [\"buyer\", \"seller\"] })\n ).matches((a) => `hello ${a}`),\n\n // Throw an error if no matching overload, or define a fallback\n fallback((...args: unknown[]) => {\n // .. do some fallback stuff\n })\n ).use(args);\n}\n```\n\n### Install\n\n```sh\nnpm add @autometa/overloaded\n```\n\n```sh\nyarn add @autometa/overloaded\n```\n\n```sh\npnpm add @autometa/overloaded\n```\n\n### Function & Method Overloads\n\nFunction and method overloads are an elegant way to expose multiple definition signatures\nfor a function which help intellisense and display more clear intent about the purpose\nof your function for a given input.\n\nImagine a function with the following requirements\n\n- Accepts two values, `a` and `b`\n- Both `a` and `b` can be either a `string` or a `number`.\n- If `a` is a `string` then `b` must be a `string`.\n- If `a` is a `number` then `b` must be a `number`.\n- When `a` and `b` are string, return a tuple [a, b]\n- When `a` and `b` are numbers, return the sum of the numbers.\n\nThis isn't a terribly useful function but that's okay.\n\nThe 'simplest' approach is to use discriminated unions <sub>(... aren't they all?)</sub>.\n\n```ts\nfunction add(\n a: string | number,\n b: string | number\n): [string, string] | number {\n // ...\n}\n```\n\nThis is fine but unless the above requirements are documented somewhere the consumer\nwill not be able to immediately understand how to use this function.\n\nThe solution is overloads. To make this function better for our consumer we can\nadd two new signatures:\n\n```ts\nfunction add(a: string, b: string): [string, string];\nfunction add(a: number, b: number): number;\nfunction add(\n a: string | number,\n b: string | number\n): [string, string] | number {\n // ...\n}\n```\n\nNow for our consumers this function makes a lot of sense. Once they provide a valid value for `a`, the\ntypes `b` and `return` will automatically be inferred according to our requirements. We can even\ndocument each overload separately.\n\n```ts\n/**\n * blah blah blah\n */\nfunction add(a: string, b: string): [string, string];\n/**\n * blah blah blah\n */\nfunction add(a: number, b: number): number;\nfunction add(\n a: string | number,\n b: string | number\n): [string, string] | number {\n // ...\n}\n```\n\n#### Implementing an overload\n\nWhile our function is nice to use, implementing it is a bit more grueling.\nWe need to check our types and perform the correct behavior, also accounting\nfor error states:\n\n```ts\nfunction add(a: string, b: string): [string, string];\nfunction add(a: number, b: number): number;\nfunction add(\n a: string | number,\n b: string | number\n): [string, string] | number {\n if (typeof a === \"string\") {\n if (typeof b === \"string\") {\n return [a, b];\n } else {\n throw new Error(\"a & b must both be strings\");\n }\n }\n if (typeof a === \"number\") {\n if (typeof b === \"number\") {\n return a + b;\n } else {\n throw new Error(\"a & b must both be numbers\");\n }\n }\n\n throw new Error(\"unknown types a & b must be string or number\");\n}\n```\n\nFor just two variables with two primitive types, this is pretty rough.\nWe can imagine then how it might look if `a` and `b` can be completely different types from each other - including more complex types like objects and arrays which require even more validation.\n\nAt some point the the function parameter list becomes unmaintainable\nat the base level, which is easily resolved with a rest param.\n\n```ts\nfunction add(a: string, b: string): [string, string];\nfunction add(a: number, b: number): number;\nfunction add(a: [string, boolean], b: MyLibOpts): number;\nfunction add(...args: unknown[]): [string, string] | number {}\n```\n\nOkay so how does **_Overloaded_** help?\n\n### Implementing an overload in _Overloaded_\n\nUsing overloaded to build your function and method overloads is simple.\nCall the `overloads` function with your `param` overloads, then pass\nthe real arguments.\n\nOverloaded functions are defined by the function pair `def` and it's child function `match`. Def accepts a rest param array of `BaseArguments`.\nA `BaseArgument` can be created by it's corresponding function. So `StringArgument` has a `string()` factory function, while `BooleanArgument`\nhas the factory function `boolean()`. `def` returns an object\ncontaining a `match` function. `match` accepts a function who's parameter\nsignature will be inferred from the preceding `def`.\n\nI.E. for `def(string(), string())`, the `match` callback\nwill accept exactly 2 arguments which must be strings:\n\n```ts\n// ---------------------- V 'a' and 'b' both inferred as 'string'\ndef(string(), string()).match((a, b)=>}{})\n// okay but redundant\ndef(string(), string()).match((a: string, b: string)=>}{});\n// bad - ts error\ndef(string(), string()).match((a: string, b: number)=>}{});\n```\n\nOverloads can also have a fallback which is executed if no match is found.\n\nSticking with our original 2 overloads:\n\n```ts\nimport { overloads, def, string, number } from \"@autometa/overloaded\";\n\nfunction add(a: string, b: string): [string, string];\nfunction add(a: number, b: number): number;\nfunction add(\n // 'unknown' instead of union is also fine here\n ...args: (string | number)[]\n){\n return overloads(\n def(string(), string()).match((a, b) => [a, b]),\n def(number(), number()).match((a, b) => a + b),\n fallback((a, b) => {\n const types = [typeof a, typeof b];\n const message = `Expected \"a\" and \"b\" to be of the same type, either string or number. Found: ${types}`;\n throw new Error(message);\n })\n ).use(args);\n}\n```\n\nAnd that's it. We now have an equivalent implementation as what we started with.\n\nThe return types for the base function definition will be inferred as a union\nof the return types of each `match`. If no matching overload is found, an error will be thrown\nhighlighting each overload and provided context as to why it was not matched.\n\nIn the above example, the inferred return type is `[string, string] | number `\n\n### Arguments\n\nWe saw Arguments in our above example. They are factory functions\nnamed approximately the same as their corresponding type.\n\nSome like the above can be called with no additional arguments. Some require additional context.\nAll argument factories can be named. It is suggested these names match the name\nin the corresponding overload. Rewriting the above example:\n\n```ts\nimport { overloads, def, string, number } from \"@autometa/overloaded\";\nfunction add(a: string, b: string): [string, string];\nfunction add(a: number, b: number): number;\nfunction add(\n ...args: (string | number)[]\n // ...args: unknown[] // generalized alternative\n){\n return overloads(\n def(string('a'), string('b')).match((a, b) => [a, b])\n def(number('a'), number('b')).match((a, b) => a + b)\n // // if using individual args like (a: string, b: string) pass an array [a, b] to `use`\n ).use(args);\n}\n```\n\n**Note:** It is not necessary for all overload parameters to share the same names. Likewise it is not necessary overloaded argument factories to share the same name across overloads.\n\nThe name is optional, and is used primarily for context when an error is thrown. If no\nname is provided, the arguments index in the parameter list will be used instead.\n\n### Assertions\n\nAssertions are an additional layer of overload matching which can be employed. Validations\nmean that Overloaded can have useful applications in non-overloaded functions also. Each\ntype factory has its own set of validations which can be used. Using string here as an example:\n\n```ts\nimport { admin, buyer, seller } from \"./user-actions\";\n\ntype UserTypes = \"admin\" | \"buyer\" | \"seller\";\n\nfunction performUserAction(userType: UserTypes, data: unknown) {\n return overloads(\n def(string(\"userType\", { equals: \"admin\" }), unknown(\"data\")).match(\n (_userType, data) => {\n return admin.action(data);\n }\n ),\n def(string(\"userType\", { equals: \"buyer\" }), unknown(\"data\")).match(\n (_userType, data) => {\n return buyer.action(data);\n }\n ),\n def(string(\"userType\", { equals: \"seller\" }), unknown(\"data\")).match(\n (_userType, data) => {\n return seller.action(data);\n }\n )\n ).use([userType]);\n}\n```\n\nCongratulations. You have implemented... an over-engineered switch statement!\n\nHowever there are other checks like 'minLength', 'maxLength', 'startsWith' etc which can be composed together to simplify filtering logic for some domains. Each argument type has it's own assertions.\n\nAssertions can of course also be used within an overloaded function or method to\nprovide additional filtering.\n\nAssertions are used for filtering, and do not throw errors by themselves.\n\n**Note** Some assertions are ignored if an invalid type is passed. For example,\nmost string assertions will not be executed if a number or boolean or object is\npassed. In that case the assertion executed will be on the type itself.\n\n### Fallback\n\nIf no overloads match the provided argument an Error will be thrown\ndetailing why each overload failed to match.\n\nAlternatively it is possible to provide a 'fallback' which\nwill be executed instead of an error being thrown. The fallback\nwill receive a rest param of arguments with types being `unknown`\n\nA Fallback is defined with the `fallback` function.\n\n```ts\nimport { overloads, def, string, number } from \"@autometa/overloaded\";\n\nfunction add(a: string, b: string): [string, string];\nfunction add(a: number, b: number): number;\n\nfunction add(\n ...args: (string | number)[] // 'unknown' is a union is also fine here\n) {\n return overloads(\n def(string(), string()).match((a, b) => [a, b]),\n def(number(), number()).match((a, b) => a + b),\n fallback((...args: unknown[]) => console.log(args))\n ).use(args);\n}\n```\n\n## Normalize Constructor or function arguments\n\n```ts\ndeclare class MyObject {\n constructor(name: string | undefined, widgets: string[] | undefined);\n}\nfunction makeMyClass(name: string): MyObject;\nfunction makeMyClass(widgets: string[]): MyObject;\nfunction makeMyClass(name: string, widgets: string[]): MyObject;\nfunction makeMyClass(...args: (string | string[])[]) {\n return overloads(\n // Create an instance with only a name\n def(string(\"name\")).matches((name) => new MyObject(name, undefined)),\n // Create an instance with only its list of widgets\n def(array(\"widgets\", [string()])).matches(\n (name, widgets) => new MyObject(undefined, widgets)\n ),\n // Create an instance with both a name and its list of widgets\n def(string(\"name\"), array(\"widgets\", [string()])).matches(\n (name, widgets) => new MyObject(name, widgets)\n ),\n // No match - Throw an error\n fallback((...args) => {\n throw new Error(\n `A 'MyObject' instance requires either a name, a list of widgets or both. Received: ${args}`\n );\n })\n ).use(args);\n}\n```\n\n## Factory Function\n\nConvert a plain javascript object to a DTO instance. Pretend\nwe have a `plainToDto` function which creates a new instance of a class\nand assigns the values from a raw object to its instance properties\n\n```ts\nabstract class User {\n name: string;\n registered: Date;\n}\nclass AdminUser extends User {\n permissions: (\"read\" | \"write\" | \"ban\" | \"unban\" | \"sticky\")[];\n}\nclass HobbyUser extends User {\n interests: string[];\n}\nclass PaidUser extends User {\n interests: string[];\n tier: number;\n badges: number[];\n}\n\n// return type inferred as\n// AdminUser | HobbyUser | PaidUser\n// Throws an error if no match found.\nfunction createUserDto(user: unknown) {\n return overloads(\n def(shape({ permissions: array([string()]) })).matches((user) => {\n return plainToDto(AdminUser, user);\n }),\n def(shape({ interests: array([string()]) })).matches((user) => {\n return plainToDto(HobbyUser, user);\n }),\n def(shape({ tier: number() })).matches((user) => {\n return plainToDto(PaidUser, user);\n })\n ).use([user]);\n}\n```\n\n## Overload Descriptions\n\nOverloads can take an optional description. Simply provide a string as the\nfirst parameter of an overload. This can be used to document the purpose\nof this particular overload, but won't get lost if things move around\nlike a comment.\n\n```ts\nfunction myOverloadedFunction(...args: unknown[]) {\n return overloads(\n param(\n \"return a FooWidgetWrapper when the first argument is a FooWidget\",\n instance(FooWidget)\n ).matches((widget) => {\n // ... do stuff\n return myNewFooWidgetWrapper;\n })\n ).use(args);\n}\n```\n\n## Naming overloads with `String Templates`\n\n_Please be aware the following is kind of cursed_\n\nIt is possible to name an overload by providing a template string\nliteral before the function call. This can be used in addition to or instead\nof the description.\n\nNames let you produce overloads that vaguely resemble a function definition.\n\n```ts\nreturn overloads(\n def`doThingA`(string(), number()).matches((a, b) => {\n return a.repeat(b);\n }),\n def`doThingB`(string(), string()).matches((a, b) => {\n return `${a} ${b}`;\n })\n);\n\n// Using description\nreturn overloads(\n def`doThingA`(\n \"some additional context about doing thing A\",\n string(),\n number()\n ).matches((a, b) => {\n return a.repeat(b);\n }),\n def`doThingB`(\n \"some other context about doing thing B\",\n string(),\n string()\n ).matches((a, b) => {\n return `${a} ${b}`;\n })\n);\n```\n\n## Argument Types\n\n### Primitives\n\nThe \"primitives\", `string`, `number` and `boolean` are represented by factories\nof matching name. Each accepts a name and assertion options.\n\n#### **String**\n\nMatches an argument in the same position which is a string.\n\n```ts\ndef(string(\"a\")).matches((a) => `Foo: ${a}`);\n```\n\nAssertions:\n\n_equals_: Asserts that two strings are exactly equal\n\n```ts\ndef(string(\"a\", { equals: \"user\" })).matches((a) => UserFactory);\n```\n\n_minLength_: Asserts that any string passed will have at _least_ `n` characters (inclusive), where `n` is the value passed to `minLength`\n\n```ts\ndef(string(\"a\", { minLength: 10 })).matches((a) => `Foo: ${a}`);\n// name is optional\ndef(string({ minLength: 10 })).matches((a) => `Foo: ${a}`);\n```\n\n_maxLength_: Asserts that any string passed will have at _most_ `n` characters (inclusive),\nwhere `n` is the value passed to `minLength`\n\n```ts\ndef(string(\"a\", { maxLength: 10 })).matches((a) => `Foo: ${a}`);\n```\n\n_includes_: Asserts that any string passed includes some substring.\n\n```ts\ndef(string(\"a\", { includes: \"users\" })).matches((a) => usersFactory(a));\n```\n\n_startsWith_: Asserts that a string starts with a specific substring.\n\n```ts\ndef(string(\"a\", { startsWith: \"users\" })).matches((a) => mySettings[a]);\n```\n\n_endsWith_: Asserts that a string ends with a specific substring.\n\n```ts\ndef(string(\"a\", { endsWith: \"users\" })).matches((a) => mySettings[a]);\n```\n\n_in_: Asserts that a string is part of an array.\n\n```ts\ndef(string(\"a\", { in: [\"group1\", \"group2\"] })).matches((a) => this.getGroup(a));\n```\n\n#### **Number**\n\nMatches a parameter which of type `number`.\n\nAssertions:\n\n_min_: Asserts that a number has at least some minimum value (inclusive)\n\n```ts\ndef(number(\"a\", { min: 0 })).matches((a) => myArray[a]);\n```\n\n_max_: Asserts that a number has at most some maximum value (inclusive)\n\n```ts\ndef(number(\"a\", { max: 0 })).matches((a) => throw new Error(`'a' must be positive`));\n```\n\n_in_: Asserts that a number is part of an array.\n\n```ts\ndef(string(\"a\", { in: [101, 102] })).matches((a) =>\n this.courses.enroll.math(a)\n);\n```\n\n_equals_: Asserts that the provided number is exactly equal to the expected.\n\n```ts\ndef(string(\"a\", { equals: 101 })).matches((a) => DalmatianCoatFactory);\n```\n\n_types_: Asserts that the provided value is either an integer\nor a float value.\n\n```ts\ndef(string(\"a\", { type: \"float\" })).matches((a) => a * MY_CONST);\ndef(string(\"a\", { type: \"int\" })).matches((a) => MY_ENUM[a]);\n```\n\n**boolean** assertions\n\n- equals\n\n### Arrays and Tuples\n\nArrays and tuples are similar to each other, but arrays\naccept a list of possible type options with indeterminate\nlength (unless asserted against), while a tuple is an array\nof fixed length with deterministic type options.\n\n**array**\n\n```ts\ndef(array([string(), number()])).match((a: (string | number)[]) => {\n // ...\n});\n```\n\n**Assertions**\n\n- minLength\n- maxLength\n- includes\n\n**tuple**\n\n```ts\ndef(tuple([string(), number()])).match((a: [string, number]) => {\n // ...\n});\n```\n\n**Assertions**\n\n- includes\n\n### Shapes\n\nShapes represent anonymous objects and class instances. It accepts\nan object whose keys match the expected object and whose values\nare Argument types. By default, only properties with keys defined in the `shape`\nwill be used to match.\nIf the real value passed to the overloaded function contains additional\nkeys, they will not be considered for validation, unless the `exhaustive` option is set to true.\n\n```ts\ndef(shape({ a: string(), b: tuple([number(), boolean()]) })).match(\n ({ a, b }) => {\n console.log(a);\n console.log(b[0]);\n console.log(b[1]);\n }\n);\n```\n\n**Assertions**\n\n- exhaustive\n - If true, validation of an overload will fail if the received argument has keys which are not defined by the overload.\n- instance\n - A Class blueprint/prototype from which the provided value should be extended.\n\n### Function\n\nFunctions have minimal validation, providing only a shape\nand an optional argument list length.\n\n```ts\ndef(func<(a: string) => void>()).match((fn) => fn(\"hi\"));\n```\n\n**Assertions**\n\n- length\n - The expected length of the parameter list.\n\n### Unknown\n\nCatch-all/wildcard argument with no typing. Will check if the value\nis defined, which can be overwritten.\n\n```ts\ndef(string(), unknown(), number()).match((a: string, b: unknown, c: number) => {\n // ...\n});\n```\n\n### Date\n\nMatches an instance of the Node `Date` class.\n\n```ts\nimport { yesterdayDate } from \"./my-date-utils\";\n\ndef(date({ before: yesterdayDate() })).match((a: Date) => {\n // ...\n});\n```\n\n**Assertions**\n\n- before\n - Checks that this provided date is chronologically earlier than the configured date\n- after\n - Checks that this provided date is chronologically later than the configured date\n- equal\n - Checks that this provided date is chronologically equal to the configured date\n\n### Instance\n\nMatches an argument which is an instance of a provided class (also referred to here as a blueprint). Optionally accepts a `shape`, which is used to validate the individual\nproperties of the instance.\n\n```ts\ndef(instance(MyClass, shape({ name: string(), age: number() }))).match(\n (a: MyClass) => {\n // ...\n }\n);\n```\n\nInstance assertions can be defined in the `shape` argument.\n" | ||
| } |
| > @autometa/overloaded@0.2.9 build:dts:tsc /Users/ben.aherne/Documents/GitHub/autometa/libraries/overloaded | ||
| > tsc | ||
| ELIFECYCLE Command failed. |
| > @autometa/overloaded@0.2.9 build:dts /Users/ben.aherne/Documents/GitHub/autometa/libraries/overloaded | ||
| > tsup --dts-only | ||
| CLI Building entry: src/index.ts | ||
| CLI Using tsconfig: tsconfig.json | ||
| CLI tsup v6.7.0 | ||
| CLI Using tsup config: /Users/ben.aherne/Documents/GitHub/autometa/libraries/overloaded/tsup.config.ts | ||
| DTS Build start | ||
| ELIFECYCLE Command failed. |
| > @autometa/overloaded@0.2.9 build /Users/ben.aherne/Documents/GitHub/autometa/libraries/overloaded | ||
| > tsup | ||
| CLI Building entry: src/index.ts | ||
| CLI Using tsconfig: tsconfig.json | ||
| CLI tsup v6.7.0 | ||
| CLI Using tsup config: /Users/ben.aherne/Documents/GitHub/autometa/libraries/overloaded/tsup.config.ts | ||
| CLI Target: es2020 | ||
| CLI Cleaning output folder | ||
| CJS Build start | ||
| ESM Build start | ||
| CJS You have emitDecoratorMetadata enabled but @swc/core was not installed, skipping swc plugin | ||
| ESM You have emitDecoratorMetadata enabled but @swc/core was not installed, skipping swc plugin | ||
| ESM dist/esm/index.js 35.00 KB | ||
| ESM ⚡️ Build success in 17ms | ||
| CJS dist/index.js 37.86 KB | ||
| CJS ⚡️ Build success in 18ms | ||
| DTS Build start | ||
| DTS ⚡️ Build success in 1050ms | ||
| DTS dist/index.d.ts 22.50 KB |
| > @autometa/overloaded@0.2.9 clean /Users/ben.aherne/Documents/GitHub/autometa/libraries/overloaded | ||
| > rimraf dist | ||
| > @autometa/overloaded@0.3.0 coverage /Users/ben.aherne/Documents/GitHub/autometa/libraries/overloaded | ||
| > vitest run --coverage | ||
| RUN v0.33.0 /Users/ben.aherne/Documents/GitHub/autometa/libraries/overloaded | ||
| Coverage enabled with istanbul | ||
| ✓ src/types.spec.ts (4 tests) 190ms | ||
| ✓ src/arguments/type-argument.spec.ts (2 tests) 6ms | ||
| ✓ src/arguments/number-argument.spec.ts (11 tests) 6ms | ||
| ✓ src/arguments/string-argument.spec.ts (20 tests) 178ms | ||
| ✓ src/arguments/array-argument.spec.ts (18 tests) 10ms | ||
| ✓ src/arguments/shape-argument.spec.ts (11 tests) 19ms | ||
| ✓ src/arguments/tuple-argument.spec.ts (8 tests) 6ms | ||
| ✓ src/def.spec.ts (3 tests) 6ms | ||
| ✓ src/overloads.spec.ts (4 tests) 43ms | ||
| ✓ src/arguments/instance-argument.spec.ts (5 tests) 32ms | ||
| ✓ src/arguments/date-argument.spec.ts (6 tests) 21ms | ||
| ✓ src/__integration__/overloaded-function.test.ts (7 tests) 14ms | ||
| ✓ src/overload.spec.ts (5 tests) 17ms | ||
| Test Files 13 passed (13) | ||
| Tests 104 passed (104) | ||
| Start at 16:39:00 | ||
| Duration 4.45s (transform 5.49s, setup 1ms, collect 18.57s, tests 548ms, environment 12ms, prepare 9.26s) | ||
| % Coverage report from istanbul |
| > @autometa/overloaded@0.2.9 lint:fix /Users/ben.aherne/Documents/GitHub/autometa/libraries/overloaded | ||
| > eslint . --fix "--max-warnings=0" | ||
| > @autometa/overloaded@0.2.9 lint /Users/ben.aherne/Documents/GitHub/autometa/libraries/overloaded | ||
| > eslint . --max-warnings 0 | ||
| > @autometa/overloaded@0.2.9 prettify /Users/ben.aherne/Documents/GitHub/autometa/libraries/overloaded | ||
| > prettier --config .prettierrc 'src/**/*.ts' --write | ||
| ELIFECYCLE Command failed. |
| > @autometa/overloaded@0.3.0 test /Users/ben.aherne/Documents/GitHub/autometa/libraries/overloaded | ||
| > vitest run --passWithNoTests | ||
| RUN v0.33.0 /Users/ben.aherne/Documents/GitHub/autometa/libraries/overloaded | ||
| ✓ src/types.spec.ts (4 tests) 23ms | ||
| ✓ src/arguments/date-argument.spec.ts (6 tests) 15ms | ||
| ✓ src/arguments/tuple-argument.spec.ts (8 tests) 6ms | ||
| ✓ src/arguments/array-argument.spec.ts (18 tests) 41ms | ||
| ✓ src/arguments/shape-argument.spec.ts (11 tests) 6ms | ||
| ✓ src/arguments/string-argument.spec.ts (20 tests) 219ms | ||
| ✓ src/overload.spec.ts (5 tests) 8ms | ||
| ✓ src/overloads.spec.ts (4 tests) 10ms | ||
| ✓ src/__integration__/overloaded-function.test.ts (7 tests) 21ms | ||
| ✓ src/arguments/instance-argument.spec.ts (5 tests) 5ms | ||
| ✓ src/arguments/type-argument.spec.ts (2 tests) 3ms | ||
| ✓ src/def.spec.ts (3 tests) 5ms | ||
| ✓ src/arguments/number-argument.spec.ts (11 tests) 12ms | ||
| Test Files 13 passed (13) | ||
| Tests 104 passed (104) | ||
| Start at 15:45:53 | ||
| Duration 2.82s (transform 1.20s, setup 1ms, collect 5.47s, tests 374ms, environment 2ms, prepare 6.97s) | ||
| body, html { | ||
| margin:0; padding: 0; | ||
| height: 100%; | ||
| } | ||
| body { | ||
| font-family: Helvetica Neue, Helvetica, Arial; | ||
| font-size: 14px; | ||
| color:#333; | ||
| } | ||
| .small { font-size: 12px; } | ||
| *, *:after, *:before { | ||
| -webkit-box-sizing:border-box; | ||
| -moz-box-sizing:border-box; | ||
| box-sizing:border-box; | ||
| } | ||
| h1 { font-size: 20px; margin: 0;} | ||
| h2 { font-size: 14px; } | ||
| pre { | ||
| font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; | ||
| margin: 0; | ||
| padding: 0; | ||
| -moz-tab-size: 2; | ||
| -o-tab-size: 2; | ||
| tab-size: 2; | ||
| } | ||
| a { color:#0074D9; text-decoration:none; } | ||
| a:hover { text-decoration:underline; } | ||
| .strong { font-weight: bold; } | ||
| .space-top1 { padding: 10px 0 0 0; } | ||
| .pad2y { padding: 20px 0; } | ||
| .pad1y { padding: 10px 0; } | ||
| .pad2x { padding: 0 20px; } | ||
| .pad2 { padding: 20px; } | ||
| .pad1 { padding: 10px; } | ||
| .space-left2 { padding-left:55px; } | ||
| .space-right2 { padding-right:20px; } | ||
| .center { text-align:center; } | ||
| .clearfix { display:block; } | ||
| .clearfix:after { | ||
| content:''; | ||
| display:block; | ||
| height:0; | ||
| clear:both; | ||
| visibility:hidden; | ||
| } | ||
| .fl { float: left; } | ||
| @media only screen and (max-width:640px) { | ||
| .col3 { width:100%; max-width:100%; } | ||
| .hide-mobile { display:none!important; } | ||
| } | ||
| .quiet { | ||
| color: #7f7f7f; | ||
| color: rgba(0,0,0,0.5); | ||
| } | ||
| .quiet a { opacity: 0.7; } | ||
| .fraction { | ||
| font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; | ||
| font-size: 10px; | ||
| color: #555; | ||
| background: #E8E8E8; | ||
| padding: 4px 5px; | ||
| border-radius: 3px; | ||
| vertical-align: middle; | ||
| } | ||
| div.path a:link, div.path a:visited { color: #333; } | ||
| table.coverage { | ||
| border-collapse: collapse; | ||
| margin: 10px 0 0 0; | ||
| padding: 0; | ||
| } | ||
| table.coverage td { | ||
| margin: 0; | ||
| padding: 0; | ||
| vertical-align: top; | ||
| } | ||
| table.coverage td.line-count { | ||
| text-align: right; | ||
| padding: 0 5px 0 20px; | ||
| } | ||
| table.coverage td.line-coverage { | ||
| text-align: right; | ||
| padding-right: 10px; | ||
| min-width:20px; | ||
| } | ||
| table.coverage td span.cline-any { | ||
| display: inline-block; | ||
| padding: 0 5px; | ||
| width: 100%; | ||
| } | ||
| .missing-if-branch { | ||
| display: inline-block; | ||
| margin-right: 5px; | ||
| border-radius: 3px; | ||
| position: relative; | ||
| padding: 0 4px; | ||
| background: #333; | ||
| color: yellow; | ||
| } | ||
| .skip-if-branch { | ||
| display: none; | ||
| margin-right: 10px; | ||
| position: relative; | ||
| padding: 0 4px; | ||
| background: #ccc; | ||
| color: white; | ||
| } | ||
| .missing-if-branch .typ, .skip-if-branch .typ { | ||
| color: inherit !important; | ||
| } | ||
| .coverage-summary { | ||
| border-collapse: collapse; | ||
| width: 100%; | ||
| } | ||
| .coverage-summary tr { border-bottom: 1px solid #bbb; } | ||
| .keyline-all { border: 1px solid #ddd; } | ||
| .coverage-summary td, .coverage-summary th { padding: 10px; } | ||
| .coverage-summary tbody { border: 1px solid #bbb; } | ||
| .coverage-summary td { border-right: 1px solid #bbb; } | ||
| .coverage-summary td:last-child { border-right: none; } | ||
| .coverage-summary th { | ||
| text-align: left; | ||
| font-weight: normal; | ||
| white-space: nowrap; | ||
| } | ||
| .coverage-summary th.file { border-right: none !important; } | ||
| .coverage-summary th.pct { } | ||
| .coverage-summary th.pic, | ||
| .coverage-summary th.abs, | ||
| .coverage-summary td.pct, | ||
| .coverage-summary td.abs { text-align: right; } | ||
| .coverage-summary td.file { white-space: nowrap; } | ||
| .coverage-summary td.pic { min-width: 120px !important; } | ||
| .coverage-summary tfoot td { } | ||
| .coverage-summary .sorter { | ||
| height: 10px; | ||
| width: 7px; | ||
| display: inline-block; | ||
| margin-left: 0.5em; | ||
| background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; | ||
| } | ||
| .coverage-summary .sorted .sorter { | ||
| background-position: 0 -20px; | ||
| } | ||
| .coverage-summary .sorted-desc .sorter { | ||
| background-position: 0 -10px; | ||
| } | ||
| .status-line { height: 10px; } | ||
| /* yellow */ | ||
| .cbranch-no { background: yellow !important; color: #111; } | ||
| /* dark red */ | ||
| .red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } | ||
| .low .chart { border:1px solid #C21F39 } | ||
| .highlighted, | ||
| .highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ | ||
| background: #C21F39 !important; | ||
| } | ||
| /* medium red */ | ||
| .cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } | ||
| /* light red */ | ||
| .low, .cline-no { background:#FCE1E5 } | ||
| /* light green */ | ||
| .high, .cline-yes { background:rgb(230,245,208) } | ||
| /* medium green */ | ||
| .cstat-yes { background:rgb(161,215,106) } | ||
| /* dark green */ | ||
| .status-line.high, .high .cover-fill { background:rgb(77,146,33) } | ||
| .high .chart { border:1px solid rgb(77,146,33) } | ||
| /* dark yellow (gold) */ | ||
| .status-line.medium, .medium .cover-fill { background: #f9cd0b; } | ||
| .medium .chart { border:1px solid #f9cd0b; } | ||
| /* light yellow */ | ||
| .medium { background: #fff4c2; } | ||
| .cstat-skip { background: #ddd; color: #111; } | ||
| .fstat-skip { background: #ddd; color: #111 !important; } | ||
| .cbranch-skip { background: #ddd !important; color: #111; } | ||
| span.cline-neutral { background: #eaeaea; } | ||
| .coverage-summary td.empty { | ||
| opacity: .5; | ||
| padding-top: 4px; | ||
| padding-bottom: 4px; | ||
| line-height: 1; | ||
| color: #888; | ||
| } | ||
| .cover-fill, .cover-empty { | ||
| display:inline-block; | ||
| height: 12px; | ||
| } | ||
| .chart { | ||
| line-height: 0; | ||
| } | ||
| .cover-empty { | ||
| background: white; | ||
| } | ||
| .cover-full { | ||
| border-right: none !important; | ||
| } | ||
| pre.prettyprint { | ||
| border: none !important; | ||
| padding: 0 !important; | ||
| margin: 0 !important; | ||
| } | ||
| .com { color: #999 !important; } | ||
| .ignore-none { color: #999; font-weight: normal; } | ||
| .wrapper { | ||
| min-height: 100%; | ||
| height: auto !important; | ||
| height: 100%; | ||
| margin: 0 auto -48px; | ||
| } | ||
| .footer, .push { | ||
| height: 48px; | ||
| } |
| /* eslint-disable */ | ||
| var jumpToCode = (function init() { | ||
| // Classes of code we would like to highlight in the file view | ||
| var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; | ||
| // Elements to highlight in the file listing view | ||
| var fileListingElements = ['td.pct.low']; | ||
| // We don't want to select elements that are direct descendants of another match | ||
| var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` | ||
| // Selecter that finds elements on the page to which we can jump | ||
| var selector = | ||
| fileListingElements.join(', ') + | ||
| ', ' + | ||
| notSelector + | ||
| missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` | ||
| // The NodeList of matching elements | ||
| var missingCoverageElements = document.querySelectorAll(selector); | ||
| var currentIndex; | ||
| function toggleClass(index) { | ||
| missingCoverageElements | ||
| .item(currentIndex) | ||
| .classList.remove('highlighted'); | ||
| missingCoverageElements.item(index).classList.add('highlighted'); | ||
| } | ||
| function makeCurrent(index) { | ||
| toggleClass(index); | ||
| currentIndex = index; | ||
| missingCoverageElements.item(index).scrollIntoView({ | ||
| behavior: 'smooth', | ||
| block: 'center', | ||
| inline: 'center' | ||
| }); | ||
| } | ||
| function goToPrevious() { | ||
| var nextIndex = 0; | ||
| if (typeof currentIndex !== 'number' || currentIndex === 0) { | ||
| nextIndex = missingCoverageElements.length - 1; | ||
| } else if (missingCoverageElements.length > 1) { | ||
| nextIndex = currentIndex - 1; | ||
| } | ||
| makeCurrent(nextIndex); | ||
| } | ||
| function goToNext() { | ||
| var nextIndex = 0; | ||
| if ( | ||
| typeof currentIndex === 'number' && | ||
| currentIndex < missingCoverageElements.length - 1 | ||
| ) { | ||
| nextIndex = currentIndex + 1; | ||
| } | ||
| makeCurrent(nextIndex); | ||
| } | ||
| return function jump(event) { | ||
| if ( | ||
| document.getElementById('fileSearch') === document.activeElement && | ||
| document.activeElement != null | ||
| ) { | ||
| // if we're currently focused on the search input, we don't want to navigate | ||
| return; | ||
| } | ||
| switch (event.which) { | ||
| case 78: // n | ||
| case 74: // j | ||
| goToNext(); | ||
| break; | ||
| case 66: // b | ||
| case 75: // k | ||
| case 80: // p | ||
| goToPrevious(); | ||
| break; | ||
| } | ||
| }; | ||
| })(); | ||
| window.addEventListener('keydown', jumpToCode); |
Sorry, the diff of this file is not supported yet
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for All files</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1>All files</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">77.27% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>476/616</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">70.48% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>351/498</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">81.95% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>109/133</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">77.1% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>468/607</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line medium'></div> | ||
| <div class="pad1"> | ||
| <table class="coverage-summary"> | ||
| <thead> | ||
| <tr> | ||
| <th data-col="file" data-fmt="html" data-html="true" class="file">File</th> | ||
| <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th> | ||
| <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th> | ||
| <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th> | ||
| <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th> | ||
| <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th> | ||
| <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| </tr> | ||
| </thead> | ||
| <tbody><tr> | ||
| <td class="file high" data-value="src"><a href="src/index.html">src</a></td> | ||
| <td data-value="94.73" class="pic high"> | ||
| <div class="chart"><div class="cover-fill" style="width: 94%"></div><div class="cover-empty" style="width: 6%"></div></div> | ||
| </td> | ||
| <td data-value="94.73" class="pct high">94.73%</td> | ||
| <td data-value="76" class="abs high">72/76</td> | ||
| <td data-value="75.75" class="pct medium">75.75%</td> | ||
| <td data-value="33" class="abs medium">25/33</td> | ||
| <td data-value="95.83" class="pct high">95.83%</td> | ||
| <td data-value="24" class="abs high">23/24</td> | ||
| <td data-value="94.36" class="pct high">94.36%</td> | ||
| <td data-value="71" class="abs high">67/71</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file medium" data-value="src/arguments"><a href="src/arguments/index.html">src/arguments</a></td> | ||
| <td data-value="74.81" class="pic medium"> | ||
| <div class="chart"><div class="cover-fill" style="width: 74%"></div><div class="cover-empty" style="width: 26%"></div></div> | ||
| </td> | ||
| <td data-value="74.81" class="pct medium">74.81%</td> | ||
| <td data-value="540" class="abs medium">404/540</td> | ||
| <td data-value="70.1" class="pct medium">70.1%</td> | ||
| <td data-value="465" class="abs medium">326/465</td> | ||
| <td data-value="78.89" class="pct medium">78.89%</td> | ||
| <td data-value="109" class="abs medium">86/109</td> | ||
| <td data-value="74.81" class="pct medium">74.81%</td> | ||
| <td data-value="536" class="abs medium">401/536</td> | ||
| </tr> | ||
| </tbody> | ||
| </table> | ||
| </div> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| .pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} |
| /* eslint-disable */ | ||
| window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); |
Sorry, the diff of this file is not supported yet
| /* eslint-disable */ | ||
| var addSorting = (function() { | ||
| 'use strict'; | ||
| var cols, | ||
| currentSort = { | ||
| index: 0, | ||
| desc: false | ||
| }; | ||
| // returns the summary table element | ||
| function getTable() { | ||
| return document.querySelector('.coverage-summary'); | ||
| } | ||
| // returns the thead element of the summary table | ||
| function getTableHeader() { | ||
| return getTable().querySelector('thead tr'); | ||
| } | ||
| // returns the tbody element of the summary table | ||
| function getTableBody() { | ||
| return getTable().querySelector('tbody'); | ||
| } | ||
| // returns the th element for nth column | ||
| function getNthColumn(n) { | ||
| return getTableHeader().querySelectorAll('th')[n]; | ||
| } | ||
| function onFilterInput() { | ||
| const searchValue = document.getElementById('fileSearch').value; | ||
| const rows = document.getElementsByTagName('tbody')[0].children; | ||
| for (let i = 0; i < rows.length; i++) { | ||
| const row = rows[i]; | ||
| if ( | ||
| row.textContent | ||
| .toLowerCase() | ||
| .includes(searchValue.toLowerCase()) | ||
| ) { | ||
| row.style.display = ''; | ||
| } else { | ||
| row.style.display = 'none'; | ||
| } | ||
| } | ||
| } | ||
| // loads the search box | ||
| function addSearchBox() { | ||
| var template = document.getElementById('filterTemplate'); | ||
| var templateClone = template.content.cloneNode(true); | ||
| templateClone.getElementById('fileSearch').oninput = onFilterInput; | ||
| template.parentElement.appendChild(templateClone); | ||
| } | ||
| // loads all columns | ||
| function loadColumns() { | ||
| var colNodes = getTableHeader().querySelectorAll('th'), | ||
| colNode, | ||
| cols = [], | ||
| col, | ||
| i; | ||
| for (i = 0; i < colNodes.length; i += 1) { | ||
| colNode = colNodes[i]; | ||
| col = { | ||
| key: colNode.getAttribute('data-col'), | ||
| sortable: !colNode.getAttribute('data-nosort'), | ||
| type: colNode.getAttribute('data-type') || 'string' | ||
| }; | ||
| cols.push(col); | ||
| if (col.sortable) { | ||
| col.defaultDescSort = col.type === 'number'; | ||
| colNode.innerHTML = | ||
| colNode.innerHTML + '<span class="sorter"></span>'; | ||
| } | ||
| } | ||
| return cols; | ||
| } | ||
| // attaches a data attribute to every tr element with an object | ||
| // of data values keyed by column name | ||
| function loadRowData(tableRow) { | ||
| var tableCols = tableRow.querySelectorAll('td'), | ||
| colNode, | ||
| col, | ||
| data = {}, | ||
| i, | ||
| val; | ||
| for (i = 0; i < tableCols.length; i += 1) { | ||
| colNode = tableCols[i]; | ||
| col = cols[i]; | ||
| val = colNode.getAttribute('data-value'); | ||
| if (col.type === 'number') { | ||
| val = Number(val); | ||
| } | ||
| data[col.key] = val; | ||
| } | ||
| return data; | ||
| } | ||
| // loads all row data | ||
| function loadData() { | ||
| var rows = getTableBody().querySelectorAll('tr'), | ||
| i; | ||
| for (i = 0; i < rows.length; i += 1) { | ||
| rows[i].data = loadRowData(rows[i]); | ||
| } | ||
| } | ||
| // sorts the table using the data for the ith column | ||
| function sortByIndex(index, desc) { | ||
| var key = cols[index].key, | ||
| sorter = function(a, b) { | ||
| a = a.data[key]; | ||
| b = b.data[key]; | ||
| return a < b ? -1 : a > b ? 1 : 0; | ||
| }, | ||
| finalSorter = sorter, | ||
| tableBody = document.querySelector('.coverage-summary tbody'), | ||
| rowNodes = tableBody.querySelectorAll('tr'), | ||
| rows = [], | ||
| i; | ||
| if (desc) { | ||
| finalSorter = function(a, b) { | ||
| return -1 * sorter(a, b); | ||
| }; | ||
| } | ||
| for (i = 0; i < rowNodes.length; i += 1) { | ||
| rows.push(rowNodes[i]); | ||
| tableBody.removeChild(rowNodes[i]); | ||
| } | ||
| rows.sort(finalSorter); | ||
| for (i = 0; i < rows.length; i += 1) { | ||
| tableBody.appendChild(rows[i]); | ||
| } | ||
| } | ||
| // removes sort indicators for current column being sorted | ||
| function removeSortIndicators() { | ||
| var col = getNthColumn(currentSort.index), | ||
| cls = col.className; | ||
| cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); | ||
| col.className = cls; | ||
| } | ||
| // adds sort indicators for current column being sorted | ||
| function addSortIndicators() { | ||
| getNthColumn(currentSort.index).className += currentSort.desc | ||
| ? ' sorted-desc' | ||
| : ' sorted'; | ||
| } | ||
| // adds event listeners for all sorter widgets | ||
| function enableUI() { | ||
| var i, | ||
| el, | ||
| ithSorter = function ithSorter(i) { | ||
| var col = cols[i]; | ||
| return function() { | ||
| var desc = col.defaultDescSort; | ||
| if (currentSort.index === i) { | ||
| desc = !currentSort.desc; | ||
| } | ||
| sortByIndex(i, desc); | ||
| removeSortIndicators(); | ||
| currentSort.index = i; | ||
| currentSort.desc = desc; | ||
| addSortIndicators(); | ||
| }; | ||
| }; | ||
| for (i = 0; i < cols.length; i += 1) { | ||
| if (cols[i].sortable) { | ||
| // add the click event handler on the th so users | ||
| // dont have to click on those tiny arrows | ||
| el = getNthColumn(i).querySelector('.sorter').parentElement; | ||
| if (el.addEventListener) { | ||
| el.addEventListener('click', ithSorter(i)); | ||
| } else { | ||
| el.attachEvent('onclick', ithSorter(i)); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| // adds sorting functionality to the UI | ||
| return function() { | ||
| if (!getTable()) { | ||
| return; | ||
| } | ||
| cols = loadColumns(); | ||
| loadData(); | ||
| addSearchBox(); | ||
| addSortIndicators(); | ||
| enableUI(); | ||
| }; | ||
| })(); | ||
| window.addEventListener('load', addSorting); |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/arguments/accumulator.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../../index.html">All files</a> / <a href="index.html">src/arguments</a> accumulator.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>7/7</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>5/5</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>1/1</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>7/7</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">12x</span> | ||
| <span class="cline-any cline-yes">12x</span> | ||
| <span class="cline-any cline-yes">16x</span> | ||
| <span class="cline-any cline-yes">12x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">16x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">12x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">export class Accumulator<T> extends Array<T | Accumulator<T>> { | ||
| asString(depth = 0) { | ||
| let str = ""; | ||
| for (const value of this) { | ||
| if (typeof value === "string") { | ||
| str += " ".repeat(depth) + value + "\n"; | ||
| } | ||
| if (value instanceof Accumulator) { | ||
| str += value.asString(depth + 1) + "\n"; | ||
| } | ||
| } | ||
| return str; | ||
| } | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/arguments/array-argument.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../../index.html">All files</a> / <a href="index.html">src/arguments</a> array-argument.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">87.83% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>65/74</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">90.9% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>60/66</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">84.61% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>11/13</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">88.88% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>64/72</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a> | ||
| <a name='L86'></a><a href='#L86'>86</a> | ||
| <a name='L87'></a><a href='#L87'>87</a> | ||
| <a name='L88'></a><a href='#L88'>88</a> | ||
| <a name='L89'></a><a href='#L89'>89</a> | ||
| <a name='L90'></a><a href='#L90'>90</a> | ||
| <a name='L91'></a><a href='#L91'>91</a> | ||
| <a name='L92'></a><a href='#L92'>92</a> | ||
| <a name='L93'></a><a href='#L93'>93</a> | ||
| <a name='L94'></a><a href='#L94'>94</a> | ||
| <a name='L95'></a><a href='#L95'>95</a> | ||
| <a name='L96'></a><a href='#L96'>96</a> | ||
| <a name='L97'></a><a href='#L97'>97</a> | ||
| <a name='L98'></a><a href='#L98'>98</a> | ||
| <a name='L99'></a><a href='#L99'>99</a> | ||
| <a name='L100'></a><a href='#L100'>100</a> | ||
| <a name='L101'></a><a href='#L101'>101</a> | ||
| <a name='L102'></a><a href='#L102'>102</a> | ||
| <a name='L103'></a><a href='#L103'>103</a> | ||
| <a name='L104'></a><a href='#L104'>104</a> | ||
| <a name='L105'></a><a href='#L105'>105</a> | ||
| <a name='L106'></a><a href='#L106'>106</a> | ||
| <a name='L107'></a><a href='#L107'>107</a> | ||
| <a name='L108'></a><a href='#L108'>108</a> | ||
| <a name='L109'></a><a href='#L109'>109</a> | ||
| <a name='L110'></a><a href='#L110'>110</a> | ||
| <a name='L111'></a><a href='#L111'>111</a> | ||
| <a name='L112'></a><a href='#L112'>112</a> | ||
| <a name='L113'></a><a href='#L113'>113</a> | ||
| <a name='L114'></a><a href='#L114'>114</a> | ||
| <a name='L115'></a><a href='#L115'>115</a> | ||
| <a name='L116'></a><a href='#L116'>116</a> | ||
| <a name='L117'></a><a href='#L117'>117</a> | ||
| <a name='L118'></a><a href='#L118'>118</a> | ||
| <a name='L119'></a><a href='#L119'>119</a> | ||
| <a name='L120'></a><a href='#L120'>120</a> | ||
| <a name='L121'></a><a href='#L121'>121</a> | ||
| <a name='L122'></a><a href='#L122'>122</a> | ||
| <a name='L123'></a><a href='#L123'>123</a> | ||
| <a name='L124'></a><a href='#L124'>124</a> | ||
| <a name='L125'></a><a href='#L125'>125</a> | ||
| <a name='L126'></a><a href='#L126'>126</a> | ||
| <a name='L127'></a><a href='#L127'>127</a> | ||
| <a name='L128'></a><a href='#L128'>128</a> | ||
| <a name='L129'></a><a href='#L129'>129</a> | ||
| <a name='L130'></a><a href='#L130'>130</a> | ||
| <a name='L131'></a><a href='#L131'>131</a> | ||
| <a name='L132'></a><a href='#L132'>132</a> | ||
| <a name='L133'></a><a href='#L133'>133</a> | ||
| <a name='L134'></a><a href='#L134'>134</a> | ||
| <a name='L135'></a><a href='#L135'>135</a> | ||
| <a name='L136'></a><a href='#L136'>136</a> | ||
| <a name='L137'></a><a href='#L137'>137</a> | ||
| <a name='L138'></a><a href='#L138'>138</a> | ||
| <a name='L139'></a><a href='#L139'>139</a> | ||
| <a name='L140'></a><a href='#L140'>140</a> | ||
| <a name='L141'></a><a href='#L141'>141</a> | ||
| <a name='L142'></a><a href='#L142'>142</a> | ||
| <a name='L143'></a><a href='#L143'>143</a> | ||
| <a name='L144'></a><a href='#L144'>144</a> | ||
| <a name='L145'></a><a href='#L145'>145</a> | ||
| <a name='L146'></a><a href='#L146'>146</a> | ||
| <a name='L147'></a><a href='#L147'>147</a> | ||
| <a name='L148'></a><a href='#L148'>148</a> | ||
| <a name='L149'></a><a href='#L149'>149</a> | ||
| <a name='L150'></a><a href='#L150'>150</a> | ||
| <a name='L151'></a><a href='#L151'>151</a> | ||
| <a name='L152'></a><a href='#L152'>152</a> | ||
| <a name='L153'></a><a href='#L153'>153</a> | ||
| <a name='L154'></a><a href='#L154'>154</a> | ||
| <a name='L155'></a><a href='#L155'>155</a> | ||
| <a name='L156'></a><a href='#L156'>156</a> | ||
| <a name='L157'></a><a href='#L157'>157</a> | ||
| <a name='L158'></a><a href='#L158'>158</a> | ||
| <a name='L159'></a><a href='#L159'>159</a> | ||
| <a name='L160'></a><a href='#L160'>160</a> | ||
| <a name='L161'></a><a href='#L161'>161</a> | ||
| <a name='L162'></a><a href='#L162'>162</a> | ||
| <a name='L163'></a><a href='#L163'>163</a> | ||
| <a name='L164'></a><a href='#L164'>164</a> | ||
| <a name='L165'></a><a href='#L165'>165</a> | ||
| <a name='L166'></a><a href='#L166'>166</a> | ||
| <a name='L167'></a><a href='#L167'>167</a> | ||
| <a name='L168'></a><a href='#L168'>168</a> | ||
| <a name='L169'></a><a href='#L169'>169</a> | ||
| <a name='L170'></a><a href='#L170'>170</a> | ||
| <a name='L171'></a><a href='#L171'>171</a> | ||
| <a name='L172'></a><a href='#L172'>172</a> | ||
| <a name='L173'></a><a href='#L173'>173</a> | ||
| <a name='L174'></a><a href='#L174'>174</a> | ||
| <a name='L175'></a><a href='#L175'>175</a> | ||
| <a name='L176'></a><a href='#L176'>176</a> | ||
| <a name='L177'></a><a href='#L177'>177</a> | ||
| <a name='L178'></a><a href='#L178'>178</a> | ||
| <a name='L179'></a><a href='#L179'>179</a> | ||
| <a name='L180'></a><a href='#L180'>180</a> | ||
| <a name='L181'></a><a href='#L181'>181</a> | ||
| <a name='L182'></a><a href='#L182'>182</a> | ||
| <a name='L183'></a><a href='#L183'>183</a> | ||
| <a name='L184'></a><a href='#L184'>184</a> | ||
| <a name='L185'></a><a href='#L185'>185</a> | ||
| <a name='L186'></a><a href='#L186'>186</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">31x</span> | ||
| <span class="cline-any cline-yes">31x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">31x</span> | ||
| <span class="cline-any cline-yes">31x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">31x</span> | ||
| <span class="cline-any cline-yes">22x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">31x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">31x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">31x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">31x</span> | ||
| <span class="cline-any cline-yes">61x</span> | ||
| <span class="cline-any cline-yes">59x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">11x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">32x</span> | ||
| <span class="cline-any cline-yes">31x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { | ||
| object, | ||
| number as num, | ||
| Infer, | ||
| array as arr, | ||
| unknown, | ||
| string, | ||
| } from "myzod"; | ||
| import { AnyArg, ArgumentTypes } from "../types"; | ||
| import { BaseArgument, BaseArgumentSchema } from "./base-argument"; | ||
| export type FromArray<T> = T extends infer TArray | ||
| ? TArray extends BaseArgument<infer TArg>[] | ||
| ? TArg[] | ||
| : never | ||
| : never; | ||
| export type ArrayType = AnyArg[]; | ||
| | ||
| export const ArrayValidationSchema = object({ | ||
| maxLength: num().optional(), | ||
| minLength: num().optional(), | ||
| length: num().optional(), | ||
| includes: unknown().optional(), | ||
| }).and(BaseArgumentSchema); | ||
| | ||
| export type ArrayValidatorOpts = Infer<typeof ArrayValidationSchema>; | ||
| const ArrayArgumentParamSchema = arr( | ||
| string().or(arr(unknown())).or(ArrayValidationSchema) | ||
| ); | ||
| export class ArrayArgument< | ||
| T extends ArrayType, | ||
| TRaw extends FromArray<T> | ||
| > extends BaseArgument<TRaw> { | ||
| typeName = "Array"; | ||
| types: string[] = []; | ||
| declare options: ArrayValidatorOpts; | ||
| reference: T; | ||
| constructor(args: (string | T | ArrayValidatorOpts)[]) { | ||
| super(); | ||
| if (typeof args[0] === "string") { | ||
| this.argName = args[0]; | ||
| } | ||
| if (typeof args[0] === "object" && Array.isArray(args[0])) { | ||
| this.reference = args[0]; | ||
| } | ||
| if (typeof args[1] === "object" && Array.isArray(args[1])) { | ||
| this.reference = args[1]; | ||
| } | ||
| if (typeof args[1] === "object" && !Array.isArray(args[1])) { | ||
| this.options = args[1]; | ||
| } | ||
| if (typeof args[2] === "object" && !Array.isArray(args[2])) { | ||
| this.options = args[2]; | ||
| } | ||
| for (const value of this.reference) { | ||
| if (!this.types.includes(value.typeName)) { | ||
| this.types.push(value.typeName); | ||
| } | ||
| } | ||
| } | ||
| assertIsArray(values: unknown) { | ||
| if (!Array.isArray(values)) { | ||
| const message = `Expected value to be an array but found ${typeof values}`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| <span class="fstat-no" title="function not covered" > isTypeMatch(t</span>ype: unknown): boolean { | ||
| <span class="cstat-no" title="statement not covered" > return Array.isArray(type);</span> | ||
| } | ||
| assertLengthLessThanMax(values: unknown, length = this.options?.maxLength) { | ||
| if (values === undefined) { | ||
| return; | ||
| } | ||
| if (Array.isArray(values)) { | ||
| if (length && values?.length > length) { | ||
| const message = `Expected value to be an array with max length ${length} but was ${values?.length}`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| } | ||
| assertLengthGreaterThanMin( | ||
| values: unknown, | ||
| length = this.options?.minLength | ||
| ) { | ||
| if (values === undefined) { | ||
| return; | ||
| } | ||
| if (Array.isArray(values)) { | ||
| if (length && values?.length < length) { | ||
| const message = `Expected value to be an array with min length ${length} but was ${values?.length}`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| } | ||
| assertLengthEquals(values: unknown, length = this.options?.length) { | ||
| if (length && Array.isArray(values)) { | ||
| if (length !== values?.length) { | ||
| const message = `Expected array to have length ${length} but was ${values?.length}`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| } | ||
| assertIncludes(values: unknown, item = this.options?.includes) { | ||
| if (values === undefined) { | ||
| return; | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (item && <span class="branch-1 cbranch-no" title="branch not covered" >Array.isArray(values)) {</span> | ||
| <span class="cstat-no" title="statement not covered" > if (!values.includes(item)) {</span> | ||
| const message = <span class="cstat-no" title="statement not covered" >`Expected array to have length ${length} but was ${values?.length}`;</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(this.fmt(message));</span> | ||
| } | ||
| } | ||
| } | ||
| assertPermittedType(values: unknown) { | ||
| if (!Array.isArray(values)) { | ||
| return; | ||
| } | ||
| for (const value of values) { | ||
| if (!this.types.includes(typeof value)) { | ||
| const index = values.indexOf(value); | ||
| const message = `Expected array to contain only known types ${ | ||
| this.types | ||
| } but index [${index}] contains ${typeof value}: '${JSON.stringify( | ||
| value | ||
| )}'; ${JSON.stringify(values)}`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| } | ||
| | ||
| assertChildValidations(values: unknown) { | ||
| if (!Array.isArray(values)) { | ||
| return; | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (values === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| for (const value of values) { | ||
| const matching = this.reference.find((it) => it.isTypeMatch(value)); | ||
| | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (!matching) { | ||
| const message = <span class="cstat-no" title="statement not covered" >`Expected array value to be one of ${</span> | ||
| this.types | ||
| } but found ${typeof value}:`; | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(this.fmt(message));</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(...this.reference.map(<span class="fstat-no" title="function not covered" >(i</span>t) => <span class="cstat-no" title="statement not covered" >it.accumulator)</span>);</span> | ||
| } | ||
| } | ||
| } | ||
| | ||
| validate(value: unknown): boolean { | ||
| this.baseAssertions(value); | ||
| this.assertIsArray(value); | ||
| this.assertLengthEquals(value); | ||
| this.assertLengthGreaterThanMin(value); | ||
| this.assertLengthLessThanMax(value); | ||
| this.assertPermittedType(value); | ||
| this.assertIncludes(value); | ||
| this.assertChildValidations(value); | ||
| return this.accumulator.length === 0; | ||
| } | ||
| } | ||
| | ||
| export function array<P extends AnyArg[], T extends ArgumentTypes<P>>( | ||
| name: string, | ||
| acceptedTypes: T | ||
| ): ArrayArgument<P, FromArray<T>>; | ||
| export function array<P extends AnyArg[], T extends ArgumentTypes<P>>( | ||
| acceptedTypes: T | ||
| ): ArrayArgument<P, FromArray<T>>; | ||
| export function array<P extends AnyArg[], T extends ArgumentTypes<P>>( | ||
| name: string, | ||
| acceptedTypes: T, | ||
| options: ArrayValidatorOpts | ||
| ): ArrayArgument<P, FromArray<T>>; | ||
| export function array<P extends AnyArg[], T extends ArgumentTypes<P>>( | ||
| acceptedTypes: T, | ||
| options: ArrayValidatorOpts | ||
| ): ArrayArgument<P, FromArray<T>>; | ||
| export function array<P extends AnyArg[], T extends ArgumentTypes<P>>( | ||
| ...args: (string | T | ArrayValidatorOpts)[] | ||
| ) { | ||
| ArrayArgumentParamSchema.parse(args); | ||
| return new ArrayArgument(args); | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/arguments/base-argument.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../../index.html">All files</a> / <a href="index.html">src/arguments</a> base-argument.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">44.23% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>23/52</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">38.18% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>21/55</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">52.94% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>9/17</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">44.23% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>23/52</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line low'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a> | ||
| <a name='L86'></a><a href='#L86'>86</a> | ||
| <a name='L87'></a><a href='#L87'>87</a> | ||
| <a name='L88'></a><a href='#L88'>88</a> | ||
| <a name='L89'></a><a href='#L89'>89</a> | ||
| <a name='L90'></a><a href='#L90'>90</a> | ||
| <a name='L91'></a><a href='#L91'>91</a> | ||
| <a name='L92'></a><a href='#L92'>92</a> | ||
| <a name='L93'></a><a href='#L93'>93</a> | ||
| <a name='L94'></a><a href='#L94'>94</a> | ||
| <a name='L95'></a><a href='#L95'>95</a> | ||
| <a name='L96'></a><a href='#L96'>96</a> | ||
| <a name='L97'></a><a href='#L97'>97</a> | ||
| <a name='L98'></a><a href='#L98'>98</a> | ||
| <a name='L99'></a><a href='#L99'>99</a> | ||
| <a name='L100'></a><a href='#L100'>100</a> | ||
| <a name='L101'></a><a href='#L101'>101</a> | ||
| <a name='L102'></a><a href='#L102'>102</a> | ||
| <a name='L103'></a><a href='#L103'>103</a> | ||
| <a name='L104'></a><a href='#L104'>104</a> | ||
| <a name='L105'></a><a href='#L105'>105</a> | ||
| <a name='L106'></a><a href='#L106'>106</a> | ||
| <a name='L107'></a><a href='#L107'>107</a> | ||
| <a name='L108'></a><a href='#L108'>108</a> | ||
| <a name='L109'></a><a href='#L109'>109</a> | ||
| <a name='L110'></a><a href='#L110'>110</a> | ||
| <a name='L111'></a><a href='#L111'>111</a> | ||
| <a name='L112'></a><a href='#L112'>112</a> | ||
| <a name='L113'></a><a href='#L113'>113</a> | ||
| <a name='L114'></a><a href='#L114'>114</a> | ||
| <a name='L115'></a><a href='#L115'>115</a> | ||
| <a name='L116'></a><a href='#L116'>116</a> | ||
| <a name='L117'></a><a href='#L117'>117</a> | ||
| <a name='L118'></a><a href='#L118'>118</a> | ||
| <a name='L119'></a><a href='#L119'>119</a> | ||
| <a name='L120'></a><a href='#L120'>120</a> | ||
| <a name='L121'></a><a href='#L121'>121</a> | ||
| <a name='L122'></a><a href='#L122'>122</a> | ||
| <a name='L123'></a><a href='#L123'>123</a> | ||
| <a name='L124'></a><a href='#L124'>124</a> | ||
| <a name='L125'></a><a href='#L125'>125</a> | ||
| <a name='L126'></a><a href='#L126'>126</a> | ||
| <a name='L127'></a><a href='#L127'>127</a> | ||
| <a name='L128'></a><a href='#L128'>128</a> | ||
| <a name='L129'></a><a href='#L129'>129</a> | ||
| <a name='L130'></a><a href='#L130'>130</a> | ||
| <a name='L131'></a><a href='#L131'>131</a> | ||
| <a name='L132'></a><a href='#L132'>132</a> | ||
| <a name='L133'></a><a href='#L133'>133</a> | ||
| <a name='L134'></a><a href='#L134'>134</a> | ||
| <a name='L135'></a><a href='#L135'>135</a> | ||
| <a name='L136'></a><a href='#L136'>136</a> | ||
| <a name='L137'></a><a href='#L137'>137</a> | ||
| <a name='L138'></a><a href='#L138'>138</a> | ||
| <a name='L139'></a><a href='#L139'>139</a> | ||
| <a name='L140'></a><a href='#L140'>140</a> | ||
| <a name='L141'></a><a href='#L141'>141</a> | ||
| <a name='L142'></a><a href='#L142'>142</a> | ||
| <a name='L143'></a><a href='#L143'>143</a> | ||
| <a name='L144'></a><a href='#L144'>144</a> | ||
| <a name='L145'></a><a href='#L145'>145</a> | ||
| <a name='L146'></a><a href='#L146'>146</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">12x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">319x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">319x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">287x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">51x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">83x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">157x</span> | ||
| <span class="cline-any cline-yes">157x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">86x</span> | ||
| <span class="cline-any cline-yes">86x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">88x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">87x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">87x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">87x</span> | ||
| <span class="cline-any cline-yes">11x</span> | ||
| <span class="cline-any cline-yes">11x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">86x</span> | ||
| <span class="cline-any cline-yes">12x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">74x</span> | ||
| <span class="cline-any cline-yes">74x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">81x</span> | ||
| <span class="cline-any cline-yes">81x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { object, boolean, Infer, unknown } from "myzod"; | ||
| import { Accumulator } from "./accumulator"; | ||
| import { ArgumentType } from "./types"; | ||
| export const BaseArgumentSchema = object({ | ||
| optional: boolean() | ||
| .or( | ||
| object({ | ||
| undefined: boolean().optional(), | ||
| null: boolean().optional() | ||
| }) | ||
| ) | ||
| .optional(), | ||
| test: unknown().optional() | ||
| }); | ||
| | ||
| export type ArgTestFunction<TArgType> = { | ||
| test?: (arg: TArgType) => boolean; | ||
| }; | ||
| export type ArgumentOptions = Infer<typeof BaseArgumentSchema>; | ||
| // & ArgTestFunction<TArgType>; | ||
| export abstract class BaseArgument<TType> { | ||
| example?: TType; | ||
| abstract typeName: string; | ||
| protected _accumulator: Accumulator<string> = new Accumulator(); | ||
| readonly options?: ArgumentOptions; | ||
| argName?: string; | ||
| argCategory = "Arg"; | ||
| #index: number; | ||
| get accumulator() { | ||
| return this._accumulator; | ||
| } | ||
| get index() { | ||
| return this.#index; | ||
| } | ||
| get identifier() { | ||
| return this.argName ?? this.index ?? "unnamed arg"; | ||
| } | ||
| | ||
| withIndex(index: number) { | ||
| this.#index = index; | ||
| return this; | ||
| } | ||
| abstract isTypeMatch(type: unknown): boolean; | ||
| | ||
| baseAssertions(value?: unknown): asserts value { | ||
| this.assertIsDefined(value); | ||
| this.assertTestSucceeds(value); | ||
| } | ||
| assertIsDefined(value: unknown, optional = this.options?.optional) { | ||
| if (optional === true) { | ||
| return; | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (optional && <span class="branch-1 cbranch-no" title="branch not covered" >optional.null == true && <span class="branch-2 cbranch-no" title="branch not covered" >v</span>alue === null) {</span> | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (optional && <span class="branch-1 cbranch-no" title="branch not covered" >optional.undefined == true && <span class="branch-2 cbranch-no" title="branch not covered" >v</span>alue === undefined) {</span> | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| if (value === undefined || value === null) { | ||
| const message = `Expected ${this.typeName} to be defined but found ${value}`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| assertTestSucceeds(value: unknown, test = this.options?.test) { | ||
| // https://i.imgflip.com/5my6xa.jpg | ||
| // todo: what the hell is this | ||
| if (value === undefined || value === null) { | ||
| return; | ||
| } | ||
| const realTest = test as undefined | ((arg: unknown) => boolean); | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (realTest) { | ||
| const result = <span class="cstat-no" title="statement not covered" >realTest(value);</span> | ||
| <span class="cstat-no" title="statement not covered" > if (result === true) {</span> | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| const message = <span class="cstat-no" title="statement not covered" >`Expected ${value} to evaluate to true but was ${result}.`;</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(this.fmt(message));</span> | ||
| } | ||
| } | ||
| protected <span class="fstat-no" title="function not covered" >shouldAssert(v</span>alue: unknown, optional = <span class="branch-0 cbranch-no" title="branch not covered" >this.options?.optional) {</span> | ||
| <span class="cstat-no" title="statement not covered" > if (optional === true) {</span> | ||
| <span class="cstat-no" title="statement not covered" > return true;</span> | ||
| } | ||
| <span class="cstat-no" title="statement not covered" > if (optional && optional.null === true && value == null) {</span> | ||
| <span class="cstat-no" title="statement not covered" > return true;</span> | ||
| } | ||
| <span class="cstat-no" title="statement not covered" > if (optional && optional.undefined == true && value == undefined) {</span> | ||
| <span class="cstat-no" title="statement not covered" > return true;</span> | ||
| } | ||
| <span class="cstat-no" title="statement not covered" > return false;</span> | ||
| } | ||
| abstract validate( | ||
| value: unknown, | ||
| parent?: BaseArgument<ArgumentType> | ||
| ): boolean; | ||
| protected fmt(message: string, padDepth = 0) { | ||
| const pad = " ".repeat(padDepth); | ||
| return `${pad}${this.argCategory}[${this.identifier}]: ${message}`; | ||
| } | ||
| <span class="fstat-no" title="function not covered" > or<K>(s</span>econd: BaseArgument<K>): BaseArgument<TType | K> { | ||
| <span class="cstat-no" title="statement not covered" > return or(this, second);</span> | ||
| } | ||
| } | ||
| | ||
| export class UnionArgument<T, K> extends BaseArgument<T | K> { | ||
| <span class="fstat-no" title="function not covered" > get t</span>ypeName() { | ||
| <span class="cstat-no" title="statement not covered" > return this.first ? this.first.typeName : this.second.typeName;</span> | ||
| } | ||
| | ||
| <span class="fstat-no" title="function not covered" > constructor(</span> | ||
| readonly <span class="cstat-no" title="statement not covered" >first: BaseArgument<T>,</span> | ||
| readonly <span class="cstat-no" title="statement not covered" >second: BaseArgument<K></span> | ||
| ) { | ||
| <span class="cstat-no" title="statement not covered" > super();</span> | ||
| } | ||
| <span class="fstat-no" title="function not covered" > assertUnion(a</span>ctual: T | K) { | ||
| <span class="cstat-no" title="statement not covered" > if (!this.first.isTypeMatch(actual) && !this.second.isTypeMatch(actual)) {</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(</span> | ||
| `Arg[${this.identifier}]:Expected ${actual} to be one of ${this.first.typeName} or ${this.second.typeName}.` | ||
| ); | ||
| } | ||
| } | ||
| | ||
| <span class="fstat-no" title="function not covered" > isTypeMatch(t</span>ype: unknown): boolean { | ||
| <span class="cstat-no" title="statement not covered" > return typeof type === this.typeName;</span> | ||
| } | ||
| | ||
| <span class="fstat-no" title="function not covered" > validate(v</span>alue: T | K): boolean { | ||
| <span class="cstat-no" title="statement not covered" > this.assertUnion(value);</span> | ||
| <span class="cstat-no" title="statement not covered" > if (this.first) {</span> | ||
| <span class="cstat-no" title="statement not covered" > this.first.validate(value);</span> | ||
| } | ||
| <span class="cstat-no" title="statement not covered" > if (this.second && !this.first) {</span> | ||
| <span class="cstat-no" title="statement not covered" > this.second.validate(value);</span> | ||
| } | ||
| <span class="cstat-no" title="statement not covered" > return this.accumulator.length === 0;</span> | ||
| } | ||
| } | ||
| | ||
| export function <span class="fstat-no" title="function not covered" >or<T, K>(</span> | ||
| first: BaseArgument<T>, | ||
| second: BaseArgument<K> | ||
| ): BaseArgument<T | K> { | ||
| <span class="cstat-no" title="statement not covered" > return new UnionArgument(first, second);</span> | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/arguments/boolean-argument.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../../index.html">All files</a> / <a href="index.html">src/arguments</a> boolean-argument.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">75% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>21/28</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">66.66% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>14/21</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">83.33% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>5/6</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">75% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>21/28</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line medium'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">15x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">15x</span> | ||
| <span class="cline-any cline-yes">15x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">15x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">15x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">15x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">15x</span> | ||
| <span class="cline-any cline-yes">15x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Infer, object, string, boolean as bool, array } from "myzod"; | ||
| import { BaseArgument, BaseArgumentSchema } from "./base-argument"; | ||
| | ||
| export const BooleaValidationSchema = object({ | ||
| equals: bool().optional(), | ||
| // "not" equals property | ||
| }).and(BaseArgumentSchema); | ||
| | ||
| const BooleanArgumentConstructorSchema = array( | ||
| string().or(BooleaValidationSchema) | ||
| ); | ||
| | ||
| export type BooleanValidatorOpts = Infer<typeof BooleaValidationSchema>; | ||
| | ||
| export class BooleanArgument< | ||
| T extends boolean = boolean | ||
| > extends BaseArgument<T> { | ||
| typeName = "boolean"; | ||
| declare options?: BooleanValidatorOpts; | ||
| | ||
| constructor(args: (BooleanValidatorOpts | string)[]) { | ||
| super(); | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (!args) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof args[0] === "string") { | ||
| <span class="cstat-no" title="statement not covered" > this.argName = args[0];</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof args[0] === "object") { | ||
| <span class="cstat-no" title="statement not covered" > this.options = args[0];</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof args[1] === "object") { | ||
| <span class="cstat-no" title="statement not covered" > this.options = args[1];</span> | ||
| } | ||
| } | ||
| | ||
| assertBoolean(actual?: boolean): asserts actual { | ||
| if (actual === undefined) { | ||
| return; | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (actual !== undefined && typeof actual !== "boolean") { | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(</span> | ||
| `Arg[${ | ||
| this.identifier | ||
| }]: Expected boolean but found [type: ${typeof actual}]${actual}` | ||
| ); | ||
| } | ||
| } | ||
| assertEquals(actual: boolean) { | ||
| if (actual === undefined) { | ||
| return; | ||
| } | ||
| const equals = this.options?.equals; | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (actual !== undefined && equals !== undefined && <span class="branch-2 cbranch-no" title="branch not covered" >actual !== equals) {</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(</span> | ||
| `Arg[${this.identifier}]:Expected ${actual} to equal ${boolean} but did not.` | ||
| ); | ||
| } | ||
| } | ||
| <span class="fstat-no" title="function not covered" > isTypeMatch(t</span>ype: unknown): boolean { | ||
| <span class="cstat-no" title="statement not covered" > return typeof type === this.typeName;</span> | ||
| } | ||
| | ||
| validate(value: boolean): boolean { | ||
| this.baseAssertions(value); | ||
| this.assertBoolean(value); | ||
| this.assertEquals(value); | ||
| return this.accumulator.length === 0; | ||
| } | ||
| } | ||
| | ||
| export function boolean(): BooleanArgument<boolean>; | ||
| export function boolean(opts: BooleanValidatorOpts): BooleanArgument<boolean>; | ||
| export function boolean(name: string): BooleanArgument<boolean>; | ||
| export function boolean( | ||
| name: string, | ||
| opts: BooleanValidatorOpts | ||
| ): BaseArgument<boolean>; | ||
| export function boolean( | ||
| ...args: (BooleanValidatorOpts | string)[] | ||
| ): BooleanArgument { | ||
| BooleanArgumentConstructorSchema.parse(args); | ||
| return new BooleanArgument(args); | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/arguments/date-argument.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../../index.html">All files</a> / <a href="index.html">src/arguments</a> date-argument.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">65.62% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>21/32</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">77.77% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>21/27</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">71.42% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>5/7</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">65.62% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>21/32</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line medium'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a> | ||
| <a name='L86'></a><a href='#L86'>86</a> | ||
| <a name='L87'></a><a href='#L87'>87</a> | ||
| <a name='L88'></a><a href='#L88'>88</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { date as dt, Infer, object, string, array } from "myzod"; | ||
| import { BaseArgument, BaseArgumentSchema } from "./base-argument"; | ||
| | ||
| export const DateValidationOptsSchema = object({ | ||
| before: dt().optional(), | ||
| after: dt().optional(), | ||
| equals: dt().optional(), | ||
| }).and(BaseArgumentSchema); | ||
| | ||
| export type DateValidatorOpts = Infer<typeof DateValidationOptsSchema>; | ||
| | ||
| const DateConstructorArgumentSchema = array( | ||
| string().or(DateValidationOptsSchema.optional()) | ||
| ); | ||
| | ||
| export type DateArguments = Infer<typeof DateConstructorArgumentSchema>; | ||
| | ||
| export class DateArgument<T extends Date> extends BaseArgument<T> { | ||
| typeName = "Date"; | ||
| <span class="fstat-no" title="function not covered" > isTypeMatch(t</span>ype: unknown): boolean { | ||
| <span class="cstat-no" title="statement not covered" > return type instanceof DateArgument;</span> | ||
| } | ||
| declare options?: DateValidatorOpts; | ||
| | ||
| constructor(args: DateArguments) { | ||
| super(); | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof args[0] === "string") { | ||
| <span class="cstat-no" title="statement not covered" > this.argName = args[0];</span> | ||
| } | ||
| | ||
| <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof args[0] === "object") { | ||
| this.options = args[0]; | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof args[1] === "object") { | ||
| <span class="cstat-no" title="statement not covered" > this.options = args[1];</span> | ||
| } | ||
| } | ||
| | ||
| assertBefore(value: unknown, before = this.options?.before) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (!before || !(value instanceof Date)) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| if (value >= before) { | ||
| const message = `Expected date '${value}' to be earlier than '${before}'`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| | ||
| assertAfter(value: unknown, after = this.options?.after) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (!after || !(value instanceof Date)) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| if (value <= after) { | ||
| const message = `Expected date '${value}' to be later than '${after}'`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| | ||
| assertEquals(value: unknown, equals = this.options?.equals) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (!equals || !(value instanceof Date)) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| if (value !== equals) { | ||
| const message = `Expected date '${value}' to be equal to '${equals}'`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| | ||
| <span class="fstat-no" title="function not covered" > validate(v</span>alue: unknown): boolean { | ||
| <span class="cstat-no" title="statement not covered" > this.baseAssertions(value);</span> | ||
| <span class="cstat-no" title="statement not covered" > this.assertBefore(value);</span> | ||
| <span class="cstat-no" title="statement not covered" > this.assertAfter(value);</span> | ||
| <span class="cstat-no" title="statement not covered" > this.assertEquals(value);</span> | ||
| <span class="cstat-no" title="statement not covered" > return this.accumulator.length === 0;</span> | ||
| } | ||
| } | ||
| | ||
| export function date(): DateArgument<Date>; | ||
| export function date(name: string): DateArgument<Date>; | ||
| export function date( | ||
| name: string, | ||
| options: DateValidatorOpts | ||
| ): DateArgument<Date>; | ||
| export function date(options: DateValidatorOpts): DateArgument<Date>; | ||
| export function date(...args: DateArguments): DateArgument<Date> { | ||
| return new DateArgument(args); | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/arguments/function-argument.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../../index.html">All files</a> / <a href="index.html">src/arguments</a> function-argument.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">49.05% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>26/53</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">40% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>20/50</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">77.77% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>7/9</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">49.05% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>26/53</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line low'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a> | ||
| <a name='L86'></a><a href='#L86'>86</a> | ||
| <a name='L87'></a><a href='#L87'>87</a> | ||
| <a name='L88'></a><a href='#L88'>88</a> | ||
| <a name='L89'></a><a href='#L89'>89</a> | ||
| <a name='L90'></a><a href='#L90'>90</a> | ||
| <a name='L91'></a><a href='#L91'>91</a> | ||
| <a name='L92'></a><a href='#L92'>92</a> | ||
| <a name='L93'></a><a href='#L93'>93</a> | ||
| <a name='L94'></a><a href='#L94'>94</a> | ||
| <a name='L95'></a><a href='#L95'>95</a> | ||
| <a name='L96'></a><a href='#L96'>96</a> | ||
| <a name='L97'></a><a href='#L97'>97</a> | ||
| <a name='L98'></a><a href='#L98'>98</a> | ||
| <a name='L99'></a><a href='#L99'>99</a> | ||
| <a name='L100'></a><a href='#L100'>100</a> | ||
| <a name='L101'></a><a href='#L101'>101</a> | ||
| <a name='L102'></a><a href='#L102'>102</a> | ||
| <a name='L103'></a><a href='#L103'>103</a> | ||
| <a name='L104'></a><a href='#L104'>104</a> | ||
| <a name='L105'></a><a href='#L105'>105</a> | ||
| <a name='L106'></a><a href='#L106'>106</a> | ||
| <a name='L107'></a><a href='#L107'>107</a> | ||
| <a name='L108'></a><a href='#L108'>108</a> | ||
| <a name='L109'></a><a href='#L109'>109</a> | ||
| <a name='L110'></a><a href='#L110'>110</a> | ||
| <a name='L111'></a><a href='#L111'>111</a> | ||
| <a name='L112'></a><a href='#L112'>112</a> | ||
| <a name='L113'></a><a href='#L113'>113</a> | ||
| <a name='L114'></a><a href='#L114'>114</a> | ||
| <a name='L115'></a><a href='#L115'>115</a> | ||
| <a name='L116'></a><a href='#L116'>116</a> | ||
| <a name='L117'></a><a href='#L117'>117</a> | ||
| <a name='L118'></a><a href='#L118'>118</a> | ||
| <a name='L119'></a><a href='#L119'>119</a> | ||
| <a name='L120'></a><a href='#L120'>120</a> | ||
| <a name='L121'></a><a href='#L121'>121</a> | ||
| <a name='L122'></a><a href='#L122'>122</a> | ||
| <a name='L123'></a><a href='#L123'>123</a> | ||
| <a name='L124'></a><a href='#L124'>124</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { object, number as num, string as str, Infer } from "myzod"; | ||
| import { BaseArgument, BaseArgumentSchema } from "./base-argument"; | ||
| import { FunctionType } from "./types"; | ||
| | ||
| export const FunctionValidationSchema = object({ | ||
| maxArgLength: num().optional(), | ||
| minArgLength: num().optional(), | ||
| argLength: num().optional(), | ||
| name: str().optional(), | ||
| }).and(BaseArgumentSchema); | ||
| | ||
| export type FunctionValidatorOptions = Infer<typeof FunctionValidationSchema>; | ||
| | ||
| export class FunctionArgument<T extends FunctionType> extends BaseArgument<T> { | ||
| typeName = "function"; | ||
| types: string[] = []; | ||
| readonly name?: string; | ||
| declare readonly options?: FunctionValidatorOptions; | ||
| constructor(args: (string | FunctionValidatorOptions | undefined)[]) { | ||
| super(); | ||
| <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof args[0] === "string") { | ||
| this.name = args[0]; | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof args[0] === "object") { | ||
| <span class="cstat-no" title="statement not covered" > this.options = args[0];</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof args[1] === "object") { | ||
| <span class="cstat-no" title="statement not covered" > this.options = args[1];</span> | ||
| } | ||
| } | ||
| | ||
| <span class="fstat-no" title="function not covered" > isTypeMatch(t</span>ype: unknown): boolean { | ||
| <span class="cstat-no" title="statement not covered" > return type === this.typeName || typeof type === this.typeName;</span> | ||
| } | ||
| | ||
| assertIsFunction(value: unknown): asserts value is T { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (value === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof value !== "function") { | ||
| const message = <span class="cstat-no" title="statement not covered" >`Expected function arguments to be a function but found ${typeof value}`;</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(this.fmt(message));</span> | ||
| } | ||
| } | ||
| assertLengthLessThanMax(value: unknown, length = this.options?.maxArgLength) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (value === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof value !== "function") { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (length && <span class="branch-1 cbranch-no" title="branch not covered" >value?.length <= length) {</span> | ||
| const message = <span class="cstat-no" title="statement not covered" >`Expected function arguments to be an array with max length ${length} but was ${value?.length}`;</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(this.fmt(message));</span> | ||
| } | ||
| } | ||
| assertLengthGreaterThanMin( | ||
| value: unknown, | ||
| length = this.options?.maxArgLength | ||
| ) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (value === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof value !== "function") { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (length && <span class="branch-1 cbranch-no" title="branch not covered" >value?.length >= length) {</span> | ||
| const message = <span class="cstat-no" title="statement not covered" >`Expected function arguments to be an array with min length ${length} but was ${value?.length}`;</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(this.fmt(message));</span> | ||
| } | ||
| } | ||
| assertLengthEquals(value: unknown, length = this.options?.argLength) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (value === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof value !== "function") { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (length !== undefined && <span class="branch-1 cbranch-no" title="branch not covered" >length !== value?.length) {</span> | ||
| const message = <span class="cstat-no" title="statement not covered" >`Expected function arguments to have length ${length} but was ${value?.length}`;</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(this.fmt(message));</span> | ||
| } | ||
| } | ||
| <span class="fstat-no" title="function not covered" > assertName(v</span>alue: unknown, name = <span class="branch-0 cbranch-no" title="branch not covered" >this.options?.name) {</span> | ||
| <span class="cstat-no" title="statement not covered" > if (value === undefined) {</span> | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="cstat-no" title="statement not covered" > if (value === undefined) {</span> | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="cstat-no" title="statement not covered" > if (typeof value !== "function") {</span> | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="cstat-no" title="statement not covered" > if (name && value.name === name) {</span> | ||
| const message = <span class="cstat-no" title="statement not covered" >`Expected function to have name ${name} but was ${value?.name}`;</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(this.fmt(message));</span> | ||
| } | ||
| } | ||
| | ||
| validate(value: unknown): boolean { | ||
| this.baseAssertions(value); | ||
| this.assertIsFunction(value); | ||
| this.assertLengthEquals(value); | ||
| this.assertLengthGreaterThanMin(value); | ||
| this.assertLengthLessThanMax(value); | ||
| return this.accumulator.length === 0; | ||
| } | ||
| } | ||
| | ||
| export function func<T extends FunctionType>(): FunctionArgument<T>; | ||
| export function func<T extends FunctionType>(name: string): FunctionArgument<T>; | ||
| export function func<T extends FunctionType>( | ||
| name: string, | ||
| options?: FunctionValidatorOptions | ||
| ): FunctionArgument<T>; | ||
| export function func<T extends FunctionType>( | ||
| options: FunctionValidatorOptions | ||
| ): FunctionArgument<T>; | ||
| export function func<T extends FunctionType>( | ||
| ...args: (string | FunctionValidatorOptions | undefined)[] | ||
| ) { | ||
| return new FunctionArgument<T>(args); | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/arguments</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../../index.html">All files</a> src/arguments</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">74.81% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>404/540</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">70.1% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>326/465</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">78.89% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>86/109</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">74.81% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>401/536</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line medium'></div> | ||
| <div class="pad1"> | ||
| <table class="coverage-summary"> | ||
| <thead> | ||
| <tr> | ||
| <th data-col="file" data-fmt="html" data-html="true" class="file">File</th> | ||
| <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th> | ||
| <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th> | ||
| <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th> | ||
| <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th> | ||
| <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th> | ||
| <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| </tr> | ||
| </thead> | ||
| <tbody><tr> | ||
| <td class="file high" data-value="accumulator.ts"><a href="accumulator.ts.html">accumulator.ts</a></td> | ||
| <td data-value="100" class="pic high"> | ||
| <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div> | ||
| </td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="7" class="abs high">7/7</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="5" class="abs high">5/5</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="1" class="abs high">1/1</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="7" class="abs high">7/7</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="array-argument.ts"><a href="array-argument.ts.html">array-argument.ts</a></td> | ||
| <td data-value="87.83" class="pic high"> | ||
| <div class="chart"><div class="cover-fill" style="width: 87%"></div><div class="cover-empty" style="width: 13%"></div></div> | ||
| </td> | ||
| <td data-value="87.83" class="pct high">87.83%</td> | ||
| <td data-value="74" class="abs high">65/74</td> | ||
| <td data-value="90.9" class="pct high">90.9%</td> | ||
| <td data-value="66" class="abs high">60/66</td> | ||
| <td data-value="84.61" class="pct high">84.61%</td> | ||
| <td data-value="13" class="abs high">11/13</td> | ||
| <td data-value="88.88" class="pct high">88.88%</td> | ||
| <td data-value="72" class="abs high">64/72</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file low" data-value="base-argument.ts"><a href="base-argument.ts.html">base-argument.ts</a></td> | ||
| <td data-value="44.23" class="pic low"> | ||
| <div class="chart"><div class="cover-fill" style="width: 44%"></div><div class="cover-empty" style="width: 56%"></div></div> | ||
| </td> | ||
| <td data-value="44.23" class="pct low">44.23%</td> | ||
| <td data-value="52" class="abs low">23/52</td> | ||
| <td data-value="38.18" class="pct low">38.18%</td> | ||
| <td data-value="55" class="abs low">21/55</td> | ||
| <td data-value="52.94" class="pct medium">52.94%</td> | ||
| <td data-value="17" class="abs medium">9/17</td> | ||
| <td data-value="44.23" class="pct low">44.23%</td> | ||
| <td data-value="52" class="abs low">23/52</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file medium" data-value="boolean-argument.ts"><a href="boolean-argument.ts.html">boolean-argument.ts</a></td> | ||
| <td data-value="75" class="pic medium"> | ||
| <div class="chart"><div class="cover-fill" style="width: 75%"></div><div class="cover-empty" style="width: 25%"></div></div> | ||
| </td> | ||
| <td data-value="75" class="pct medium">75%</td> | ||
| <td data-value="28" class="abs medium">21/28</td> | ||
| <td data-value="66.66" class="pct medium">66.66%</td> | ||
| <td data-value="21" class="abs medium">14/21</td> | ||
| <td data-value="83.33" class="pct high">83.33%</td> | ||
| <td data-value="6" class="abs high">5/6</td> | ||
| <td data-value="75" class="pct medium">75%</td> | ||
| <td data-value="28" class="abs medium">21/28</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file medium" data-value="date-argument.ts"><a href="date-argument.ts.html">date-argument.ts</a></td> | ||
| <td data-value="65.62" class="pic medium"> | ||
| <div class="chart"><div class="cover-fill" style="width: 65%"></div><div class="cover-empty" style="width: 35%"></div></div> | ||
| </td> | ||
| <td data-value="65.62" class="pct medium">65.62%</td> | ||
| <td data-value="32" class="abs medium">21/32</td> | ||
| <td data-value="77.77" class="pct medium">77.77%</td> | ||
| <td data-value="27" class="abs medium">21/27</td> | ||
| <td data-value="71.42" class="pct medium">71.42%</td> | ||
| <td data-value="7" class="abs medium">5/7</td> | ||
| <td data-value="65.62" class="pct medium">65.62%</td> | ||
| <td data-value="32" class="abs medium">21/32</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file low" data-value="function-argument.ts"><a href="function-argument.ts.html">function-argument.ts</a></td> | ||
| <td data-value="49.05" class="pic low"> | ||
| <div class="chart"><div class="cover-fill" style="width: 49%"></div><div class="cover-empty" style="width: 51%"></div></div> | ||
| </td> | ||
| <td data-value="49.05" class="pct low">49.05%</td> | ||
| <td data-value="53" class="abs low">26/53</td> | ||
| <td data-value="40" class="pct low">40%</td> | ||
| <td data-value="50" class="abs low">20/50</td> | ||
| <td data-value="77.77" class="pct medium">77.77%</td> | ||
| <td data-value="9" class="abs medium">7/9</td> | ||
| <td data-value="49.05" class="pct low">49.05%</td> | ||
| <td data-value="53" class="abs low">26/53</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file medium" data-value="instance-argument.ts"><a href="instance-argument.ts.html">instance-argument.ts</a></td> | ||
| <td data-value="73.33" class="pic medium"> | ||
| <div class="chart"><div class="cover-fill" style="width: 73%"></div><div class="cover-empty" style="width: 27%"></div></div> | ||
| </td> | ||
| <td data-value="73.33" class="pct medium">73.33%</td> | ||
| <td data-value="30" class="abs medium">22/30</td> | ||
| <td data-value="79.16" class="pct medium">79.16%</td> | ||
| <td data-value="24" class="abs medium">19/24</td> | ||
| <td data-value="66.66" class="pct medium">66.66%</td> | ||
| <td data-value="6" class="abs medium">4/6</td> | ||
| <td data-value="73.33" class="pct medium">73.33%</td> | ||
| <td data-value="30" class="abs medium">22/30</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file medium" data-value="number-argument.ts"><a href="number-argument.ts.html">number-argument.ts</a></td> | ||
| <td data-value="79.68" class="pic medium"> | ||
| <div class="chart"><div class="cover-fill" style="width: 79%"></div><div class="cover-empty" style="width: 21%"></div></div> | ||
| </td> | ||
| <td data-value="79.68" class="pct medium">79.68%</td> | ||
| <td data-value="64" class="abs medium">51/64</td> | ||
| <td data-value="78.46" class="pct medium">78.46%</td> | ||
| <td data-value="65" class="abs medium">51/65</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="10" class="abs high">10/10</td> | ||
| <td data-value="79.68" class="pct medium">79.68%</td> | ||
| <td data-value="64" class="abs medium">51/64</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="shape-argument.ts"><a href="shape-argument.ts.html">shape-argument.ts</a></td> | ||
| <td data-value="90.16" class="pic high"> | ||
| <div class="chart"><div class="cover-fill" style="width: 90%"></div><div class="cover-empty" style="width: 10%"></div></div> | ||
| </td> | ||
| <td data-value="90.16" class="pct high">90.16%</td> | ||
| <td data-value="61" class="abs high">55/61</td> | ||
| <td data-value="78.04" class="pct medium">78.04%</td> | ||
| <td data-value="41" class="abs medium">32/41</td> | ||
| <td data-value="88.88" class="pct high">88.88%</td> | ||
| <td data-value="9" class="abs high">8/9</td> | ||
| <td data-value="90.16" class="pct high">90.16%</td> | ||
| <td data-value="61" class="abs high">55/61</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="string-argument.ts"><a href="string-argument.ts.html">string-argument.ts</a></td> | ||
| <td data-value="91.83" class="pic high"> | ||
| <div class="chart"><div class="cover-fill" style="width: 91%"></div><div class="cover-empty" style="width: 9%"></div></div> | ||
| </td> | ||
| <td data-value="91.83" class="pct high">91.83%</td> | ||
| <td data-value="49" class="abs high">45/49</td> | ||
| <td data-value="92.85" class="pct high">92.85%</td> | ||
| <td data-value="56" class="abs high">52/56</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="12" class="abs high">12/12</td> | ||
| <td data-value="91.83" class="pct high">91.83%</td> | ||
| <td data-value="49" class="abs high">45/49</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file medium" data-value="tuple-argument.ts"><a href="tuple-argument.ts.html">tuple-argument.ts</a></td> | ||
| <td data-value="77.19" class="pic medium"> | ||
| <div class="chart"><div class="cover-fill" style="width: 77%"></div><div class="cover-empty" style="width: 23%"></div></div> | ||
| </td> | ||
| <td data-value="77.19" class="pct medium">77.19%</td> | ||
| <td data-value="57" class="abs medium">44/57</td> | ||
| <td data-value="57.89" class="pct medium">57.89%</td> | ||
| <td data-value="38" class="abs medium">22/38</td> | ||
| <td data-value="80" class="pct high">80%</td> | ||
| <td data-value="10" class="abs high">8/10</td> | ||
| <td data-value="76.36" class="pct medium">76.36%</td> | ||
| <td data-value="55" class="abs medium">42/55</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file medium" data-value="type-argument.ts"><a href="type-argument.ts.html">type-argument.ts</a></td> | ||
| <td data-value="73.68" class="pic medium"> | ||
| <div class="chart"><div class="cover-fill" style="width: 73%"></div><div class="cover-empty" style="width: 27%"></div></div> | ||
| </td> | ||
| <td data-value="73.68" class="pct medium">73.68%</td> | ||
| <td data-value="19" class="abs medium">14/19</td> | ||
| <td data-value="54.54" class="pct medium">54.54%</td> | ||
| <td data-value="11" class="abs medium">6/11</td> | ||
| <td data-value="60" class="pct medium">60%</td> | ||
| <td data-value="5" class="abs medium">3/5</td> | ||
| <td data-value="73.68" class="pct medium">73.68%</td> | ||
| <td data-value="19" class="abs medium">14/19</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file medium" data-value="unknown-argument.ts"><a href="unknown-argument.ts.html">unknown-argument.ts</a></td> | ||
| <td data-value="71.42" class="pic medium"> | ||
| <div class="chart"><div class="cover-fill" style="width: 71%"></div><div class="cover-empty" style="width: 29%"></div></div> | ||
| </td> | ||
| <td data-value="71.42" class="pct medium">71.42%</td> | ||
| <td data-value="14" class="abs medium">10/14</td> | ||
| <td data-value="50" class="pct medium">50%</td> | ||
| <td data-value="6" class="abs medium">3/6</td> | ||
| <td data-value="75" class="pct medium">75%</td> | ||
| <td data-value="4" class="abs medium">3/4</td> | ||
| <td data-value="71.42" class="pct medium">71.42%</td> | ||
| <td data-value="14" class="abs medium">10/14</td> | ||
| </tr> | ||
| </tbody> | ||
| </table> | ||
| </div> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/arguments/instance-argument.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../../index.html">All files</a> / <a href="index.html">src/arguments</a> instance-argument.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">73.33% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>22/30</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">79.16% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>19/24</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">66.66% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>4/6</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">73.33% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>22/30</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line medium'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a> | ||
| <a name='L86'></a><a href='#L86'>86</a> | ||
| <a name='L87'></a><a href='#L87'>87</a> | ||
| <a name='L88'></a><a href='#L88'>88</a> | ||
| <a name='L89'></a><a href='#L89'>89</a> | ||
| <a name='L90'></a><a href='#L90'>90</a> | ||
| <a name='L91'></a><a href='#L91'>91</a> | ||
| <a name='L92'></a><a href='#L92'>92</a> | ||
| <a name='L93'></a><a href='#L93'>93</a> | ||
| <a name='L94'></a><a href='#L94'>94</a> | ||
| <a name='L95'></a><a href='#L95'>95</a> | ||
| <a name='L96'></a><a href='#L96'>96</a> | ||
| <a name='L97'></a><a href='#L97'>97</a> | ||
| <a name='L98'></a><a href='#L98'>98</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Infer, object } from "myzod"; | ||
| import { ShapeArgument } from "./shape-argument"; | ||
| import { BaseArgument, BaseArgumentSchema } from "./base-argument"; | ||
| import { AbstractClass, Class } from "./types"; | ||
| export const InstanceConstructorArgumentSchema = object({}); | ||
| export const InstanceOptionsArgumentSchema = object({}).and(BaseArgumentSchema); | ||
| export type InstanceOptions = Infer<typeof InstanceOptionsArgumentSchema>; | ||
| export class InstanceArgument< | ||
| TClass extends { constructor: unknown }, | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| TShape extends ShapeArgument<any, Partial<TClass>> | ||
| > extends BaseArgument<TClass> { | ||
| typeName = "object"; | ||
| blueprint: Class<TClass>; | ||
| declare options?: InstanceOptions; | ||
| shape: TShape; | ||
| constructor(args: (string | Class<TClass> | TShape)[]) { | ||
| super(); | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof args[0] === "string") { | ||
| <span class="cstat-no" title="statement not covered" > this.argName = args.shift() as string;</span> | ||
| } | ||
| | ||
| <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof args[0] === "function") { | ||
| this.blueprint = args.shift() as Class<TClass>; | ||
| } | ||
| | ||
| if (typeof args[0] === "object") { | ||
| this.shape = args.shift() as TShape; | ||
| } | ||
| <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof args[0] === "undefined") { | ||
| args.shift(); | ||
| } | ||
| if (typeof args[0] === "object") { | ||
| this.options = args.shift() as InstanceOptions; | ||
| } | ||
| } | ||
| <span class="fstat-no" title="function not covered" > isTypeMatch(t</span>ype: unknown): boolean { | ||
| <span class="cstat-no" title="statement not covered" > return type instanceof this.blueprint;</span> | ||
| } | ||
| | ||
| assertIsInstance(value: unknown) { | ||
| if ( | ||
| value !== undefined && | ||
| this.blueprint && | ||
| !(value instanceof this.blueprint) | ||
| ) { | ||
| const message = `Expected value of ${value} to be an instance of ${this.blueprint.name} but it was not.`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| | ||
| assertShapeArguments(value: unknown) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.shape) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (!value || !this.blueprint || !(value instanceof this.blueprint)) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| this.shape.validate(value); | ||
| if (this.shape.accumulator.length > 0) { | ||
| this.accumulator.push(this.shape.accumulator); | ||
| } | ||
| } | ||
| <span class="fstat-no" title="function not covered" > validate(v</span>alue: unknown): boolean { | ||
| <span class="cstat-no" title="statement not covered" > this.baseAssertions(value);</span> | ||
| <span class="cstat-no" title="statement not covered" > this.assertIsInstance(value);</span> | ||
| <span class="cstat-no" title="statement not covered" > this.assertShapeArguments(value);</span> | ||
| <span class="cstat-no" title="statement not covered" > return this.accumulator.length === 0;</span> | ||
| } | ||
| } | ||
| | ||
| export function instance< | ||
| TClass extends { constructor: unknown }, | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| TShape extends ShapeArgument<any, Partial<TClass>> | ||
| >( | ||
| blueprint: Class<TClass> | AbstractClass<TClass>, | ||
| shape?: TShape | null, | ||
| options?: InstanceOptions | ||
| ): InstanceArgument<TClass, TShape>; | ||
| export function instance< | ||
| TClass extends { constructor: unknown }, | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| TShape extends ShapeArgument<any, Partial<TClass>> | ||
| >( | ||
| name: string, | ||
| blueprint: Class<TClass> | AbstractClass<TClass>, | ||
| shape?: TShape | null, | ||
| options?: InstanceOptions | ||
| ): InstanceArgument<TClass, TShape>; | ||
| export function instance< | ||
| TClass extends { constructor: unknown }, | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| TShape extends ShapeArgument<any, Partial<TClass>> | ||
| >(...args: (string | Class<TClass> | TShape)[]) { | ||
| return new InstanceArgument<TClass, TShape>(args); | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/arguments/number-argument.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../../index.html">All files</a> / <a href="index.html">src/arguments</a> number-argument.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">79.68% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>51/64</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">78.46% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>51/65</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>10/10</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">79.68% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>51/64</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line medium'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a> | ||
| <a name='L86'></a><a href='#L86'>86</a> | ||
| <a name='L87'></a><a href='#L87'>87</a> | ||
| <a name='L88'></a><a href='#L88'>88</a> | ||
| <a name='L89'></a><a href='#L89'>89</a> | ||
| <a name='L90'></a><a href='#L90'>90</a> | ||
| <a name='L91'></a><a href='#L91'>91</a> | ||
| <a name='L92'></a><a href='#L92'>92</a> | ||
| <a name='L93'></a><a href='#L93'>93</a> | ||
| <a name='L94'></a><a href='#L94'>94</a> | ||
| <a name='L95'></a><a href='#L95'>95</a> | ||
| <a name='L96'></a><a href='#L96'>96</a> | ||
| <a name='L97'></a><a href='#L97'>97</a> | ||
| <a name='L98'></a><a href='#L98'>98</a> | ||
| <a name='L99'></a><a href='#L99'>99</a> | ||
| <a name='L100'></a><a href='#L100'>100</a> | ||
| <a name='L101'></a><a href='#L101'>101</a> | ||
| <a name='L102'></a><a href='#L102'>102</a> | ||
| <a name='L103'></a><a href='#L103'>103</a> | ||
| <a name='L104'></a><a href='#L104'>104</a> | ||
| <a name='L105'></a><a href='#L105'>105</a> | ||
| <a name='L106'></a><a href='#L106'>106</a> | ||
| <a name='L107'></a><a href='#L107'>107</a> | ||
| <a name='L108'></a><a href='#L108'>108</a> | ||
| <a name='L109'></a><a href='#L109'>109</a> | ||
| <a name='L110'></a><a href='#L110'>110</a> | ||
| <a name='L111'></a><a href='#L111'>111</a> | ||
| <a name='L112'></a><a href='#L112'>112</a> | ||
| <a name='L113'></a><a href='#L113'>113</a> | ||
| <a name='L114'></a><a href='#L114'>114</a> | ||
| <a name='L115'></a><a href='#L115'>115</a> | ||
| <a name='L116'></a><a href='#L116'>116</a> | ||
| <a name='L117'></a><a href='#L117'>117</a> | ||
| <a name='L118'></a><a href='#L118'>118</a> | ||
| <a name='L119'></a><a href='#L119'>119</a> | ||
| <a name='L120'></a><a href='#L120'>120</a> | ||
| <a name='L121'></a><a href='#L121'>121</a> | ||
| <a name='L122'></a><a href='#L122'>122</a> | ||
| <a name='L123'></a><a href='#L123'>123</a> | ||
| <a name='L124'></a><a href='#L124'>124</a> | ||
| <a name='L125'></a><a href='#L125'>125</a> | ||
| <a name='L126'></a><a href='#L126'>126</a> | ||
| <a name='L127'></a><a href='#L127'>127</a> | ||
| <a name='L128'></a><a href='#L128'>128</a> | ||
| <a name='L129'></a><a href='#L129'>129</a> | ||
| <a name='L130'></a><a href='#L130'>130</a> | ||
| <a name='L131'></a><a href='#L131'>131</a> | ||
| <a name='L132'></a><a href='#L132'>132</a> | ||
| <a name='L133'></a><a href='#L133'>133</a> | ||
| <a name='L134'></a><a href='#L134'>134</a> | ||
| <a name='L135'></a><a href='#L135'>135</a> | ||
| <a name='L136'></a><a href='#L136'>136</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">85x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">85x</span> | ||
| <span class="cline-any cline-yes">85x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">85x</span> | ||
| <span class="cline-any cline-yes">22x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">85x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">85x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">21x</span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">21x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">14x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">21x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">21x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">14x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">21x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">21x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">14x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">19x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">19x</span> | ||
| <span class="cline-any cline-yes">19x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">22x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">22x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">15x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">15x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">19x</span> | ||
| <span class="cline-any cline-yes">19x</span> | ||
| <span class="cline-any cline-yes">19x</span> | ||
| <span class="cline-any cline-yes">19x</span> | ||
| <span class="cline-any cline-yes">19x</span> | ||
| <span class="cline-any cline-yes">19x</span> | ||
| <span class="cline-any cline-yes">19x</span> | ||
| <span class="cline-any cline-yes">19x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">85x</span> | ||
| <span class="cline-any cline-yes">85x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Infer, string, object, number as num, literal, array } from "myzod"; | ||
| import { BaseArgument, BaseArgumentSchema } from "./base-argument"; | ||
| | ||
| export const NumberValidationSchema = object({ | ||
| max: num().optional(), | ||
| min: num().optional(), | ||
| equals: num().optional(), | ||
| type: literal("int").or(literal("float")).optional(), | ||
| in: array(num()).optional(), | ||
| }).and(BaseArgumentSchema); | ||
| | ||
| const NumberArgumentParamsSchema = array(string().or(NumberValidationSchema)); | ||
| | ||
| export type NumberValidatorOpts = Infer<typeof NumberValidationSchema> & { | ||
| test: (arg: number) => boolean; | ||
| }; | ||
| | ||
| export class NumberArgument<T extends number> extends BaseArgument<T> { | ||
| typeName = "number"; | ||
| declare options?: NumberValidatorOpts | undefined; | ||
| constructor(args: (NumberValidatorOpts | string)[]) { | ||
| super(); | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (!args) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| if (typeof args[0] === "string") { | ||
| this.argName = args[0]; | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof args[0] === "object") { | ||
| <span class="cstat-no" title="statement not covered" > this.options = args[0];</span> | ||
| } | ||
| if (typeof args[1] === "object") { | ||
| this.options = args[1]; | ||
| } | ||
| } | ||
| isTypeMatch(type: unknown): boolean { | ||
| return typeof type === this.typeName; | ||
| } | ||
| assertNumber(num?: unknown) { | ||
| if (typeof num !== "number") { | ||
| const message = `Expected value to be a number but was [${typeof num}]: ${num}`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| | ||
| assertNumberEquals(num: unknown, equals = this.options?.equals) { | ||
| if (typeof num !== "number" && typeof num !== "bigint") { | ||
| return; | ||
| } | ||
| if (equals !== undefined && num !== equals) { | ||
| const message = `Expected ${num} to equal ${equals} but did not.`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| | ||
| assertNumberLessThanMax(num: unknown, max = this.options?.max) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (num === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| if (typeof num !== "number" && typeof num !== "bigint") { | ||
| return; | ||
| } | ||
| if (max !== undefined && num > max) { | ||
| const message = `Expected number ${num} to be less than max value ${max}`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| | ||
| assertNumberGreaterThanMin(num: unknown, min = this.options?.min) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (num === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| if (typeof num !== "number" && typeof num !== "bigint") { | ||
| return; | ||
| } | ||
| if (min !== undefined && num < min) { | ||
| const message = `Expected number to be greater than minimum value ${min}`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| assertInArray(val: unknown, value?: number) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (num === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof num !== "number" && typeof num !== "bigint") { | ||
| return; | ||
| } | ||
| <span class="cstat-no" title="statement not covered" > if (value && Array.isArray(value) && !value.includes(val)) {</span> | ||
| const message = <span class="cstat-no" title="statement not covered" >`Expected ${value} to include ${val} but it was not`;</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(this.fmt(message));</span> | ||
| <span class="cstat-no" title="statement not covered" > return false;</span> | ||
| } | ||
| <span class="cstat-no" title="statement not covered" > return true;</span> | ||
| } | ||
| assertType(value: unknown, type = this.options?.type) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (num === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| if (typeof value !== "number") { | ||
| return; | ||
| } | ||
| if (type === "float" && Number.isInteger(value)) { | ||
| const message = `Expected number '${value}' to be a float but was an integer`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (type === "int" && <span class="branch-1 cbranch-no" title="branch not covered" >!Number.isInteger(value)) {</span> | ||
| const message = <span class="cstat-no" title="statement not covered" >`Expected number '${value}' to be an integer but was a float`;</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(this.fmt(message));</span> | ||
| } | ||
| } | ||
| validate(value: number): boolean { | ||
| this.baseAssertions(value); | ||
| this.assertNumber(value); | ||
| this.assertNumberEquals(value); | ||
| this.assertInArray(value); | ||
| this.assertNumberGreaterThanMin(value); | ||
| this.assertNumberLessThanMax(value); | ||
| this.assertType(value); | ||
| return this.accumulator.length === 0; | ||
| } | ||
| } | ||
| | ||
| export function number(): NumberArgument<number>; | ||
| export function number(opts: NumberValidatorOpts): NumberArgument<number>; | ||
| export function number(name: string): NumberArgument<number>; | ||
| export function number( | ||
| name: string, | ||
| opts: NumberValidatorOpts | ||
| ): NumberArgument<number>; | ||
| export function number( | ||
| ...args: (NumberValidatorOpts | string)[] | ||
| ): NumberArgument<number> { | ||
| NumberArgumentParamsSchema.parse(args); | ||
| return new NumberArgument(args); | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/arguments/shape-argument.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../../index.html">All files</a> / <a href="index.html">src/arguments</a> shape-argument.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">90.16% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>55/61</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">78.04% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>32/41</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">88.88% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>8/9</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">90.16% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>55/61</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a> | ||
| <a name='L86'></a><a href='#L86'>86</a> | ||
| <a name='L87'></a><a href='#L87'>87</a> | ||
| <a name='L88'></a><a href='#L88'>88</a> | ||
| <a name='L89'></a><a href='#L89'>89</a> | ||
| <a name='L90'></a><a href='#L90'>90</a> | ||
| <a name='L91'></a><a href='#L91'>91</a> | ||
| <a name='L92'></a><a href='#L92'>92</a> | ||
| <a name='L93'></a><a href='#L93'>93</a> | ||
| <a name='L94'></a><a href='#L94'>94</a> | ||
| <a name='L95'></a><a href='#L95'>95</a> | ||
| <a name='L96'></a><a href='#L96'>96</a> | ||
| <a name='L97'></a><a href='#L97'>97</a> | ||
| <a name='L98'></a><a href='#L98'>98</a> | ||
| <a name='L99'></a><a href='#L99'>99</a> | ||
| <a name='L100'></a><a href='#L100'>100</a> | ||
| <a name='L101'></a><a href='#L101'>101</a> | ||
| <a name='L102'></a><a href='#L102'>102</a> | ||
| <a name='L103'></a><a href='#L103'>103</a> | ||
| <a name='L104'></a><a href='#L104'>104</a> | ||
| <a name='L105'></a><a href='#L105'>105</a> | ||
| <a name='L106'></a><a href='#L106'>106</a> | ||
| <a name='L107'></a><a href='#L107'>107</a> | ||
| <a name='L108'></a><a href='#L108'>108</a> | ||
| <a name='L109'></a><a href='#L109'>109</a> | ||
| <a name='L110'></a><a href='#L110'>110</a> | ||
| <a name='L111'></a><a href='#L111'>111</a> | ||
| <a name='L112'></a><a href='#L112'>112</a> | ||
| <a name='L113'></a><a href='#L113'>113</a> | ||
| <a name='L114'></a><a href='#L114'>114</a> | ||
| <a name='L115'></a><a href='#L115'>115</a> | ||
| <a name='L116'></a><a href='#L116'>116</a> | ||
| <a name='L117'></a><a href='#L117'>117</a> | ||
| <a name='L118'></a><a href='#L118'>118</a> | ||
| <a name='L119'></a><a href='#L119'>119</a> | ||
| <a name='L120'></a><a href='#L120'>120</a> | ||
| <a name='L121'></a><a href='#L121'>121</a> | ||
| <a name='L122'></a><a href='#L122'>122</a> | ||
| <a name='L123'></a><a href='#L123'>123</a> | ||
| <a name='L124'></a><a href='#L124'>124</a> | ||
| <a name='L125'></a><a href='#L125'>125</a> | ||
| <a name='L126'></a><a href='#L126'>126</a> | ||
| <a name='L127'></a><a href='#L127'>127</a> | ||
| <a name='L128'></a><a href='#L128'>128</a> | ||
| <a name='L129'></a><a href='#L129'>129</a> | ||
| <a name='L130'></a><a href='#L130'>130</a> | ||
| <a name='L131'></a><a href='#L131'>131</a> | ||
| <a name='L132'></a><a href='#L132'>132</a> | ||
| <a name='L133'></a><a href='#L133'>133</a> | ||
| <a name='L134'></a><a href='#L134'>134</a> | ||
| <a name='L135'></a><a href='#L135'>135</a> | ||
| <a name='L136'></a><a href='#L136'>136</a> | ||
| <a name='L137'></a><a href='#L137'>137</a> | ||
| <a name='L138'></a><a href='#L138'>138</a> | ||
| <a name='L139'></a><a href='#L139'>139</a> | ||
| <a name='L140'></a><a href='#L140'>140</a> | ||
| <a name='L141'></a><a href='#L141'>141</a> | ||
| <a name='L142'></a><a href='#L142'>142</a> | ||
| <a name='L143'></a><a href='#L143'>143</a> | ||
| <a name='L144'></a><a href='#L144'>144</a> | ||
| <a name='L145'></a><a href='#L145'>145</a> | ||
| <a name='L146'></a><a href='#L146'>146</a> | ||
| <a name='L147'></a><a href='#L147'>147</a> | ||
| <a name='L148'></a><a href='#L148'>148</a> | ||
| <a name='L149'></a><a href='#L149'>149</a> | ||
| <a name='L150'></a><a href='#L150'>150</a> | ||
| <a name='L151'></a><a href='#L151'>151</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-yes">17x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-yes">25x</span> | ||
| <span class="cline-any cline-yes">25x</span> | ||
| <span class="cline-any cline-yes">18x</span> | ||
| <span class="cline-any cline-yes">18x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { BaseArgument, BaseArgumentSchema } from "./base-argument"; | ||
| import { Infer, string, object, boolean, array } from "myzod"; | ||
| import { FromShape, ShapeType } from "./types"; | ||
| | ||
| export const ShapeValidationSchema = object({ | ||
| exhaustive: boolean().optional(), | ||
| instance: object({}, { allowUnknown: true }).optional(), | ||
| }).and(BaseArgumentSchema); | ||
| | ||
| export type ShapeOptions = Infer<typeof ShapeValidationSchema>; | ||
| export type ShapeValidatorOpts = Infer<typeof ShapeValidationSchema>; | ||
| | ||
| export class ShapeArgument< | ||
| T extends ShapeType, | ||
| TRaw extends FromShape<T> | ||
| > extends BaseArgument<TRaw> { | ||
| typeName = "object"; | ||
| declare options?: ShapeOptions; | ||
| reference: T; | ||
| constructor(args: (string | T | ShapeOptions)[]) { | ||
| super(); | ||
| if (typeof args[0] === "string") { | ||
| this.argName = args.shift() as string; | ||
| } | ||
| <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof args[0] === "object") { | ||
| this.reference = args.shift() as T; | ||
| } | ||
| if (typeof args[0] === "object") { | ||
| this.options = args[0] as unknown as ShapeOptions; | ||
| } | ||
| | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.reference) { | ||
| <span class="cstat-no" title="statement not covered" > throw new Error(`Shape Argument must be provided a reference object`);</span> | ||
| } | ||
| for (const key in this.reference) { | ||
| const name = this.reference[key].argName; | ||
| if (!name) { | ||
| this.reference[key].argName = key; | ||
| this.reference[key].argCategory = "Property"; | ||
| } | ||
| } | ||
| } | ||
| <span class="fstat-no" title="function not covered" > isTypeMatch(t</span>ype: unknown): boolean { | ||
| <span class="cstat-no" title="statement not covered" > return type === this.typeName || typeof type === this.typeName;</span> | ||
| } | ||
| assertObject(value: unknown) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (value === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| if (typeof value !== "object") { | ||
| const message = `Expected value to be an ${ | ||
| this.typeName | ||
| } but was [type: ${typeof value}]: '${value}'`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| | ||
| assertExhaustive(value: unknown) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (value === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| if ( | ||
| this.options?.exhaustive === undefined || | ||
| this.options?.exhaustive === false | ||
| ) { | ||
| return; | ||
| } | ||
| const asObj = value as unknown as Record<string, unknown>; | ||
| const refKeys = Object.keys(this.reference); | ||
| const valKeys = Object.keys(asObj); | ||
| if (refKeys.length != valKeys.length) { | ||
| for (const property of valKeys) { | ||
| if (!(property in this.reference)) { | ||
| const message = `Argument value contains property '${property}' which is not known for object with keys [${refKeys | ||
| .map((it) => `'${it}'`) | ||
| .join()}]`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| | ||
| assertShapeMatches(value: unknown | undefined | null) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (value === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| const refShape: ShapeType = this.reference; | ||
| const asObj = value as unknown as Record<string, unknown>; | ||
| for (const key in refShape) { | ||
| const reference = refShape[key]; | ||
| const actual = value && asObj[key]; | ||
| if (!reference.validate(actual)) { | ||
| const message = `Expected all properties to be valid but found:`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| <span class="missing-if-branch" title="else path not taken" >E</span>if (reference.accumulator.length > 0) { | ||
| this.accumulator.push(reference.accumulator); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| assertIsInstance(value: unknown, instance: any = this.options?.instance) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (value === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| if (instance && !(value instanceof instance)) { | ||
| const message = `Expected shape to be an instance of ${instance} but was not`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| | ||
| validate(value: unknown): boolean { | ||
| this.baseAssertions(value); | ||
| this.assertObject(value); | ||
| this.assertExhaustive(value); | ||
| this.assertShapeMatches(value); | ||
| this.assertIsInstance(value); | ||
| return this._accumulator.length === 0; | ||
| } | ||
| } | ||
| const ShapeArgumentParamsSchema = array( | ||
| string() | ||
| .or(object({}).allowUnknownKeys()) | ||
| .or(ShapeValidationSchema) | ||
| .optional() | ||
| ); | ||
| export function shape<T extends ShapeType>( | ||
| reference: T | ||
| ): ShapeArgument<T, FromShape<T>>; | ||
| export function shape<T extends ShapeType>( | ||
| name: string, | ||
| reference: T | ||
| ): ShapeArgument<T, FromShape<T>>; | ||
| export function shape<T extends ShapeType>( | ||
| name: string, | ||
| reference: T, | ||
| options?: ShapeOptions | ||
| ): ShapeArgument<T, FromShape<T>>; | ||
| export function shape<T extends ShapeType>( | ||
| reference: T, | ||
| options?: ShapeOptions | ||
| ): ShapeArgument<T, FromShape<T>>; | ||
| export function shape<T extends ShapeType>( | ||
| ...args: (string | T | ShapeOptions)[] | ||
| ) { | ||
| ShapeArgumentParamsSchema.parse(args); | ||
| return new ShapeArgument(args); | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/arguments/string-argument.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../../index.html">All files</a> / <a href="index.html">src/arguments</a> string-argument.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">91.83% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>45/49</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">92.85% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>52/56</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>12/12</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">91.83% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>45/49</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a> | ||
| <a name='L86'></a><a href='#L86'>86</a> | ||
| <a name='L87'></a><a href='#L87'>87</a> | ||
| <a name='L88'></a><a href='#L88'>88</a> | ||
| <a name='L89'></a><a href='#L89'>89</a> | ||
| <a name='L90'></a><a href='#L90'>90</a> | ||
| <a name='L91'></a><a href='#L91'>91</a> | ||
| <a name='L92'></a><a href='#L92'>92</a> | ||
| <a name='L93'></a><a href='#L93'>93</a> | ||
| <a name='L94'></a><a href='#L94'>94</a> | ||
| <a name='L95'></a><a href='#L95'>95</a> | ||
| <a name='L96'></a><a href='#L96'>96</a> | ||
| <a name='L97'></a><a href='#L97'>97</a> | ||
| <a name='L98'></a><a href='#L98'>98</a> | ||
| <a name='L99'></a><a href='#L99'>99</a> | ||
| <a name='L100'></a><a href='#L100'>100</a> | ||
| <a name='L101'></a><a href='#L101'>101</a> | ||
| <a name='L102'></a><a href='#L102'>102</a> | ||
| <a name='L103'></a><a href='#L103'>103</a> | ||
| <a name='L104'></a><a href='#L104'>104</a> | ||
| <a name='L105'></a><a href='#L105'>105</a> | ||
| <a name='L106'></a><a href='#L106'>106</a> | ||
| <a name='L107'></a><a href='#L107'>107</a> | ||
| <a name='L108'></a><a href='#L108'>108</a> | ||
| <a name='L109'></a><a href='#L109'>109</a> | ||
| <a name='L110'></a><a href='#L110'>110</a> | ||
| <a name='L111'></a><a href='#L111'>111</a> | ||
| <a name='L112'></a><a href='#L112'>112</a> | ||
| <a name='L113'></a><a href='#L113'>113</a> | ||
| <a name='L114'></a><a href='#L114'>114</a> | ||
| <a name='L115'></a><a href='#L115'>115</a> | ||
| <a name='L116'></a><a href='#L116'>116</a> | ||
| <a name='L117'></a><a href='#L117'>117</a> | ||
| <a name='L118'></a><a href='#L118'>118</a> | ||
| <a name='L119'></a><a href='#L119'>119</a> | ||
| <a name='L120'></a><a href='#L120'>120</a> | ||
| <a name='L121'></a><a href='#L121'>121</a> | ||
| <a name='L122'></a><a href='#L122'>122</a> | ||
| <a name='L123'></a><a href='#L123'>123</a> | ||
| <a name='L124'></a><a href='#L124'>124</a> | ||
| <a name='L125'></a><a href='#L125'>125</a> | ||
| <a name='L126'></a><a href='#L126'>126</a> | ||
| <a name='L127'></a><a href='#L127'>127</a> | ||
| <a name='L128'></a><a href='#L128'>128</a> | ||
| <a name='L129'></a><a href='#L129'>129</a> | ||
| <a name='L130'></a><a href='#L130'>130</a> | ||
| <a name='L131'></a><a href='#L131'>131</a> | ||
| <a name='L132'></a><a href='#L132'>132</a> | ||
| <a name='L133'></a><a href='#L133'>133</a> | ||
| <a name='L134'></a><a href='#L134'>134</a> | ||
| <a name='L135'></a><a href='#L135'>135</a> | ||
| <a name='L136'></a><a href='#L136'>136</a> | ||
| <a name='L137'></a><a href='#L137'>137</a> | ||
| <a name='L138'></a><a href='#L138'>138</a> | ||
| <a name='L139'></a><a href='#L139'>139</a> | ||
| <a name='L140'></a><a href='#L140'>140</a> | ||
| <a name='L141'></a><a href='#L141'>141</a> | ||
| <a name='L142'></a><a href='#L142'>142</a> | ||
| <a name='L143'></a><a href='#L143'>143</a> | ||
| <a name='L144'></a><a href='#L144'>144</a> | ||
| <a name='L145'></a><a href='#L145'>145</a> | ||
| <a name='L146'></a><a href='#L146'>146</a> | ||
| <a name='L147'></a><a href='#L147'>147</a> | ||
| <a name='L148'></a><a href='#L148'>148</a> | ||
| <a name='L149'></a><a href='#L149'>149</a> | ||
| <a name='L150'></a><a href='#L150'>150</a> | ||
| <a name='L151'></a><a href='#L151'>151</a> | ||
| <a name='L152'></a><a href='#L152'>152</a> | ||
| <a name='L153'></a><a href='#L153'>153</a> | ||
| <a name='L154'></a><a href='#L154'>154</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">127x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">127x</span> | ||
| <span class="cline-any cline-yes">127x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">124x</span> | ||
| <span class="cline-any cline-yes">26x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">124x</span> | ||
| <span class="cline-any cline-yes">13x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">124x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">40x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">39x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">39x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">39x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">37x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">39x</span> | ||
| <span class="cline-any cline-yes">19x</span> | ||
| <span class="cline-any cline-yes">19x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">37x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">37x</span> | ||
| <span class="cline-any cline-yes">37x</span> | ||
| <span class="cline-any cline-yes">37x</span> | ||
| <span class="cline-any cline-yes">37x</span> | ||
| <span class="cline-any cline-yes">37x</span> | ||
| <span class="cline-any cline-yes">37x</span> | ||
| <span class="cline-any cline-yes">37x</span> | ||
| <span class="cline-any cline-yes">37x</span> | ||
| <span class="cline-any cline-yes">37x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">109x</span> | ||
| <span class="cline-any cline-yes">108x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import gitDiff from "git-diff"; | ||
| import { Infer, array, string as zstring, object, number, tuple } from "myzod"; | ||
| import { BaseArgument, BaseArgumentSchema } from "./base-argument"; | ||
| export const StringValidatorOpsSchema = object({ | ||
| minLength: number().optional(), | ||
| maxLength: number().optional(), | ||
| includes: zstring().optional(), | ||
| equals: zstring().optional(), | ||
| in: array(zstring()).optional(), | ||
| startsWith: zstring().optional(), | ||
| endsWith: zstring().optional(), | ||
| pattern: object({ source: zstring() }, { allowUnknown: true }).optional(), | ||
| }).and(BaseArgumentSchema); | ||
| | ||
| export type StringValidatorOpts = Infer<typeof StringValidatorOpsSchema> & { | ||
| pattern?: RegExp; | ||
| test?: (arg: string) => boolean; | ||
| }; | ||
| | ||
| const StringArgumentConstructorSchema = tuple([ | ||
| zstring(), | ||
| StringValidatorOpsSchema, | ||
| ]) | ||
| .or(tuple([zstring().or(StringValidatorOpsSchema)])) | ||
| .or(tuple([])); | ||
| | ||
| export class StringArgument<T extends string> extends BaseArgument<T> { | ||
| typeName = "string"; | ||
| declare options?: StringValidatorOpts; | ||
| | ||
| constructor(args?: (string | StringValidatorOpts)[]) { | ||
| super(); | ||
| if (!args) { | ||
| return; | ||
| } | ||
| if (typeof args[0] === "string") { | ||
| this.argName = args[0]; | ||
| } | ||
| if (typeof args[0] === "object") { | ||
| this.options = args[0]; | ||
| } | ||
| if (typeof args[1] === "object") { | ||
| this.options = args[1]; | ||
| } | ||
| } | ||
| isTypeMatch(type: unknown): boolean { | ||
| return type === this.typeName || typeof type === this.typeName; | ||
| } | ||
| assertStringLessThanMax(str: string, max = this.options?.maxLength) { | ||
| if ( | ||
| typeof max === "number" && | ||
| typeof str === "string" && | ||
| str.length > max | ||
| ) { | ||
| const message = `Expected ${str} to have less than ${max} characters but found ${str.length}`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| | ||
| assertStringGreaterThanMin(str: unknown, min = this.options?.minLength) { | ||
| if ( | ||
| typeof min === "number" && | ||
| typeof str === "string" && | ||
| str.length < min | ||
| ) { | ||
| const message = `Expected ${str} to have at least ${min} characters but found ${str.length}`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| assertStringIncludes(str: unknown, value = this.options?.includes) { | ||
| if ( | ||
| typeof str === "string" && | ||
| typeof value === "string" && | ||
| !str.includes(value) | ||
| ) { | ||
| const message = `Expected ${str} to include ${value} but the substring could not be found`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| assertStringIn(str: unknown, value = this.options?.in) { | ||
| if ( | ||
| typeof str === "string" && | ||
| Array.isArray(value) && | ||
| !value.includes(str) | ||
| ) { | ||
| const message = `Expected ${str} to be a member of list ${JSON.stringify( | ||
| value | ||
| )} but the substring could not be found`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| assertStringEquals(str: unknown, value = this.options?.equals) { | ||
| if (typeof str === "string" && typeof value === "string" && str !== value) { | ||
| const diff = gitDiff(str, value); | ||
| const message = `Expected ${str} to equal ${value} but did not. Diff: \n${diff}`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| | ||
| assertStringMatches(str: unknown, pattern = this.options?.pattern) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if ( | ||
| typeof str === "string" && | ||
| pattern instanceof RegExp && | ||
| <span class="branch-2 cbranch-no" title="branch not covered" > !pattern.test(str)</span> | ||
| ) { | ||
| const message = <span class="cstat-no" title="statement not covered" >`Expected ${pattern} to match pattern ${pattern.source} but it did not`;</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(this.fmt(message));</span> | ||
| } | ||
| } | ||
| | ||
| assertString(str?: unknown) { | ||
| if (typeof str !== "string" && !this.options?.optional) { | ||
| const message = `Expected argument to be of type 'string' but was: [${typeof str}] ${str}`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| assertinArray(str: unknown, array = this.options?.in) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if ( | ||
| typeof str === "string" && | ||
| Array.isArray(array) && | ||
| <span class="branch-2 cbranch-no" title="branch not covered" > !array.includes(str)</span> | ||
| ) { | ||
| const message = <span class="cstat-no" title="statement not covered" >`Expected ${array} to include ${str} but it was not`;</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(this.fmt(message));</span> | ||
| } | ||
| } | ||
| | ||
| validate(value: string) { | ||
| this.baseAssertions(value); | ||
| this.assertString(value); | ||
| this.assertStringEquals(value); | ||
| this.assertStringLessThanMax(value); | ||
| this.assertStringGreaterThanMin(value); | ||
| this.assertinArray(value); | ||
| this.assertStringIncludes(value); | ||
| this.assertStringMatches(value); | ||
| return this.accumulator.length === 0; | ||
| } | ||
| } | ||
| | ||
| export function string(): StringArgument<string>; | ||
| export function string(opts: StringValidatorOpts): StringArgument<string>; | ||
| export function string(name: string): StringArgument<string>; | ||
| export function string( | ||
| name: string, | ||
| opts: StringValidatorOpts | ||
| ): BaseArgument<string>; | ||
| export function string( | ||
| ...args: (StringValidatorOpts | string)[] | ||
| ): StringArgument<string> { | ||
| StringArgumentConstructorSchema.parse(args); | ||
| return new StringArgument(args); | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/arguments/tuple-argument.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../../index.html">All files</a> / <a href="index.html">src/arguments</a> tuple-argument.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">77.19% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>44/57</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">57.89% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>22/38</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">80% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>8/10</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">76.36% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>42/55</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line medium'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a> | ||
| <a name='L86'></a><a href='#L86'>86</a> | ||
| <a name='L87'></a><a href='#L87'>87</a> | ||
| <a name='L88'></a><a href='#L88'>88</a> | ||
| <a name='L89'></a><a href='#L89'>89</a> | ||
| <a name='L90'></a><a href='#L90'>90</a> | ||
| <a name='L91'></a><a href='#L91'>91</a> | ||
| <a name='L92'></a><a href='#L92'>92</a> | ||
| <a name='L93'></a><a href='#L93'>93</a> | ||
| <a name='L94'></a><a href='#L94'>94</a> | ||
| <a name='L95'></a><a href='#L95'>95</a> | ||
| <a name='L96'></a><a href='#L96'>96</a> | ||
| <a name='L97'></a><a href='#L97'>97</a> | ||
| <a name='L98'></a><a href='#L98'>98</a> | ||
| <a name='L99'></a><a href='#L99'>99</a> | ||
| <a name='L100'></a><a href='#L100'>100</a> | ||
| <a name='L101'></a><a href='#L101'>101</a> | ||
| <a name='L102'></a><a href='#L102'>102</a> | ||
| <a name='L103'></a><a href='#L103'>103</a> | ||
| <a name='L104'></a><a href='#L104'>104</a> | ||
| <a name='L105'></a><a href='#L105'>105</a> | ||
| <a name='L106'></a><a href='#L106'>106</a> | ||
| <a name='L107'></a><a href='#L107'>107</a> | ||
| <a name='L108'></a><a href='#L108'>108</a> | ||
| <a name='L109'></a><a href='#L109'>109</a> | ||
| <a name='L110'></a><a href='#L110'>110</a> | ||
| <a name='L111'></a><a href='#L111'>111</a> | ||
| <a name='L112'></a><a href='#L112'>112</a> | ||
| <a name='L113'></a><a href='#L113'>113</a> | ||
| <a name='L114'></a><a href='#L114'>114</a> | ||
| <a name='L115'></a><a href='#L115'>115</a> | ||
| <a name='L116'></a><a href='#L116'>116</a> | ||
| <a name='L117'></a><a href='#L117'>117</a> | ||
| <a name='L118'></a><a href='#L118'>118</a> | ||
| <a name='L119'></a><a href='#L119'>119</a> | ||
| <a name='L120'></a><a href='#L120'>120</a> | ||
| <a name='L121'></a><a href='#L121'>121</a> | ||
| <a name='L122'></a><a href='#L122'>122</a> | ||
| <a name='L123'></a><a href='#L123'>123</a> | ||
| <a name='L124'></a><a href='#L124'>124</a> | ||
| <a name='L125'></a><a href='#L125'>125</a> | ||
| <a name='L126'></a><a href='#L126'>126</a> | ||
| <a name='L127'></a><a href='#L127'>127</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">14x</span> | ||
| <span class="cline-any cline-yes">14x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">14x</span> | ||
| <span class="cline-any cline-yes">14x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">14x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">14x</span> | ||
| <span class="cline-any cline-yes">11x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">14x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">14x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">14x</span> | ||
| <span class="cline-any cline-yes">29x</span> | ||
| <span class="cline-any cline-yes">29x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">12x</span> | ||
| <span class="cline-any cline-yes">12x</span> | ||
| <span class="cline-any cline-yes">12x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">15x</span> | ||
| <span class="cline-any cline-yes">14x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { object, Infer, array, string, unknown } from "myzod"; | ||
| import { ArgumentTypes } from "../types"; | ||
| import { BaseArgument, BaseArgumentSchema } from "./base-argument"; | ||
| import type { FromTuple, TupleType } from "./types"; | ||
| | ||
| export const TupleValidationSchema = object({ | ||
| includes: unknown().optional(), | ||
| }).and(BaseArgumentSchema); | ||
| | ||
| export type TupleValidatorOpts = Infer<typeof TupleValidationSchema>; | ||
| const TupleArgumentParamSchema = array( | ||
| string().or(array(unknown())).or(TupleValidationSchema) | ||
| ); | ||
| export class TupleArgument< | ||
| T extends TupleType, | ||
| TRaw extends FromTuple<T> | ||
| > extends BaseArgument<TRaw> { | ||
| declare options?: TupleValidatorOpts; | ||
| typeName = "object"; | ||
| types: string[] = []; | ||
| readonly reference: T; | ||
| constructor(args: (string | T | TupleValidatorOpts)[]) { | ||
| super(); | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (!args) { | ||
| <span class="cstat-no" title="statement not covered" > throw new Error(</span> | ||
| `A TupleArgument requires a reference array of BaseArguments to construct. Provided args: ${args}` | ||
| ); | ||
| } | ||
| if (typeof args[0] === "string") { | ||
| this.argName = args[0]; | ||
| } | ||
| if (Array.isArray(args[0])) { | ||
| this.reference = args[0]; | ||
| } | ||
| if (Array.isArray(args[1])) { | ||
| this.reference = args[1]; | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.reference) { | ||
| <span class="cstat-no" title="statement not covered" > throw new Error(</span> | ||
| `A TupleArgument requires a reference array of BaseArguments to construct. Provided args: ${args}` | ||
| ); | ||
| } | ||
| this.reference.forEach((it, idx) => { | ||
| this.types.push(it.typeName); | ||
| it.withIndex(idx).argCategory = "Element"; | ||
| }); | ||
| } | ||
| <span class="fstat-no" title="function not covered" > isTypeMatch(t</span>ype: unknown): boolean { | ||
| <span class="cstat-no" title="statement not covered" > return Array.isArray(type);</span> | ||
| } | ||
| assertIsTuple(values: unknown): asserts values is T { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (values === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| if (!Array.isArray(values)) { | ||
| const message = `Expected value to be an array but found ${typeof values}`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| } | ||
| } | ||
| assertIncludes(values: unknown, item = this.options?.includes) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (values === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (item && <span class="branch-1 cbranch-no" title="branch not covered" >Array.isArray(values)) {</span> | ||
| <span class="cstat-no" title="statement not covered" > if (!values.includes(item)) {</span> | ||
| const message = <span class="cstat-no" title="statement not covered" >`Expected array to have length ${length} but was ${values?.length}`;</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(this.fmt(message));</span> | ||
| } | ||
| } | ||
| } | ||
| <span class="fstat-no" title="function not covered" > assertLength(v</span>alues: unknown[], length = <span class="branch-0 cbranch-no" title="branch not covered" >this.types.length) {</span> | ||
| <span class="cstat-no" title="statement not covered" > if (values === undefined) {</span> | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| <span class="cstat-no" title="statement not covered" > if (length && values?.length <= length) {</span> | ||
| <span class="cstat-no" title="statement not covered" > this.accumulator.push(</span> | ||
| `Expected value to be an array with max length ${length} but was ${values?.length}` | ||
| ); | ||
| } | ||
| } | ||
| assertPermittedType(values: unknown) { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (values === undefined) { | ||
| <span class="cstat-no" title="statement not covered" > return;</span> | ||
| } | ||
| if (!Array.isArray(values)) { | ||
| return; | ||
| } | ||
| const errors = []; | ||
| for (let i = 0; i < this.types.length; i++) { | ||
| const reference = this.reference[i]; | ||
| const actual = values[i]; | ||
| if (!reference.validate(actual)) { | ||
| errors.push(reference); | ||
| } | ||
| } | ||
| if (errors.length > 0) { | ||
| const message = `Expected all tuple values to be valid but found:`; | ||
| this.accumulator.push(this.fmt(message)); | ||
| errors.forEach((it) => this.accumulator.push(it.accumulator)); | ||
| } | ||
| } | ||
| | ||
| validate(value: unknown): boolean { | ||
| this.baseAssertions(value); | ||
| this.assertIsTuple(value); | ||
| this.assertPermittedType(value); | ||
| this.assertIncludes(value); | ||
| return this.accumulator.length === 0; | ||
| } | ||
| } | ||
| | ||
| export function tuple<P extends TupleType, T extends ArgumentTypes<P>>( | ||
| name: string, | ||
| acceptedTypes: T, | ||
| options?: TupleValidatorOpts | ||
| ): TupleArgument<T, FromTuple<T>>; | ||
| export function tuple<P extends TupleType, T extends ArgumentTypes<P>>( | ||
| acceptedTypes: T, | ||
| options?: TupleValidatorOpts | ||
| ): TupleArgument<T, FromTuple<T>>; | ||
| export function tuple<P extends TupleType, T extends ArgumentTypes<P>>( | ||
| ...args: (string | T | TupleValidatorOpts)[] | ||
| ) { | ||
| TupleArgumentParamSchema.parse(args); | ||
| return new TupleArgument(args); | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/arguments/type-argument.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../../index.html">All files</a> / <a href="index.html">src/arguments</a> type-argument.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">73.68% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>14/19</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">54.54% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>6/11</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">60% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>3/5</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">73.68% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>14/19</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line medium'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { BaseArgument } from "./base-argument"; | ||
| import { AbstractClass, Class } from "./types"; | ||
| | ||
| export class TypeArgument< | ||
| T extends Class<unknown> | AbstractClass<unknown> | ||
| > extends BaseArgument<T> { | ||
| typeName = "function"; | ||
| types: string[] = []; | ||
| readonly name?: string; | ||
| readonly type: T; | ||
| constructor(strOrT: string | T, type?: T) { | ||
| super(); | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (strOrT === "string") { | ||
| <span class="cstat-no" title="statement not covered" > this.name = strOrT;</span> | ||
| <span class="cstat-no" title="statement not covered" > this.type = type as T;</span> | ||
| } | ||
| <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof strOrT === "function") { | ||
| this.type = strOrT; | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof type === "function") { | ||
| <span class="cstat-no" title="statement not covered" > this.type = type;</span> | ||
| } | ||
| } | ||
| | ||
| <span class="fstat-no" title="function not covered" > isTypeMatch(t</span>ype: unknown): boolean { | ||
| <span class="cstat-no" title="statement not covered" > return type === this.typeName || typeof type === this.typeName;</span> | ||
| } | ||
| | ||
| assertType(value: unknown, match = this.type) { | ||
| if (value === match) { | ||
| return; | ||
| } | ||
| this.accumulator.push( | ||
| this.fmt( | ||
| `Expected value of ${value} to be of type ${match.name} but it was not.` | ||
| ) | ||
| ); | ||
| } | ||
| | ||
| validate(value: unknown): boolean { | ||
| this.assertIsDefined(value); | ||
| this.baseAssertions(value); | ||
| this.assertType(value); | ||
| return this.accumulator.length === 0; | ||
| } | ||
| } | ||
| | ||
| export function type<T extends Class<unknown> | AbstractClass<unknown>>( | ||
| type: T | ||
| ): TypeArgument<T>; | ||
| export function type<T extends Class<unknown> | AbstractClass<unknown>>( | ||
| name: string, | ||
| type: Class<T> | ||
| ): TypeArgument<T>; | ||
| export function <span class="fstat-no" title="function not covered" >type<T extends Class<unknown> | AbstractClass<unknown>>(</span> | ||
| nameOrType: string | T, | ||
| type?: T | ||
| ) { | ||
| <span class="cstat-no" title="statement not covered" > return new TypeArgument(nameOrType, type);</span> | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/arguments/unknown-argument.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../../index.html">All files</a> / <a href="index.html">src/arguments</a> unknown-argument.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">71.42% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>10/14</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">50% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>3/6</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">75% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>3/4</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">71.42% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>10/14</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line medium'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { | ||
| BaseArgument, | ||
| ArgumentOptions, | ||
| BaseArgumentSchema, | ||
| } from "./base-argument"; | ||
| import { array, string } from "myzod"; | ||
| const UnknownArgumentParamsSchema = array( | ||
| string().or(BaseArgumentSchema).optional() | ||
| ).max(2); | ||
| // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint | ||
| export class UnknownArgument<T extends unknown> extends BaseArgument<T> { | ||
| typeName = "unknown"; | ||
| options?: ArgumentOptions = { optional: true }; | ||
| constructor(args: (string | ArgumentOptions)[]) { | ||
| super(); | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof args[0] === "string") { | ||
| <span class="cstat-no" title="statement not covered" > this.argName = args[0];</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof args[0] === "object") { | ||
| <span class="cstat-no" title="statement not covered" > this.options = args[0];</span> | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof args[1] === "object") { | ||
| <span class="cstat-no" title="statement not covered" > this.options = args[1];</span> | ||
| } | ||
| } | ||
| <span class="fstat-no" title="function not covered" > isTypeMatch(_</span>type: unknown): boolean { | ||
| <span class="cstat-no" title="statement not covered" > throw true;</span> | ||
| } | ||
| validate(_value: number): boolean { | ||
| return this.accumulator.length === 0; | ||
| } | ||
| } | ||
| | ||
| export function unknown(): UnknownArgument<unknown>; | ||
| export function unknown( | ||
| name: string, | ||
| opts: ArgumentOptions | ||
| ): UnknownArgument<unknown>; | ||
| export function unknown(opts: ArgumentOptions): UnknownArgument<unknown>; | ||
| export function unknown( | ||
| ...args: (string | ArgumentOptions)[] | ||
| ): UnknownArgument<unknown> { | ||
| UnknownArgumentParamsSchema.parse(args); | ||
| return new UnknownArgument(args); | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/def.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../prettify.css" /> | ||
| <link rel="stylesheet" href="../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> def.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">90% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>9/10</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">50% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>2/4</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">80% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>4/5</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">90% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>9/10</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a> | ||
| <a name='L86'></a><a href='#L86'>86</a> | ||
| <a name='L87'></a><a href='#L87'>87</a> | ||
| <a name='L88'></a><a href='#L88'>88</a> | ||
| <a name='L89'></a><a href='#L89'>89</a> | ||
| <a name='L90'></a><a href='#L90'>90</a> | ||
| <a name='L91'></a><a href='#L91'>91</a> | ||
| <a name='L92'></a><a href='#L92'>92</a> | ||
| <a name='L93'></a><a href='#L93'>93</a> | ||
| <a name='L94'></a><a href='#L94'>94</a> | ||
| <a name='L95'></a><a href='#L95'>95</a> | ||
| <a name='L96'></a><a href='#L96'>96</a> | ||
| <a name='L97'></a><a href='#L97'>97</a> | ||
| <a name='L98'></a><a href='#L98'>98</a> | ||
| <a name='L99'></a><a href='#L99'>99</a> | ||
| <a name='L100'></a><a href='#L100'>100</a> | ||
| <a name='L101'></a><a href='#L101'>101</a> | ||
| <a name='L102'></a><a href='#L102'>102</a> | ||
| <a name='L103'></a><a href='#L103'>103</a> | ||
| <a name='L104'></a><a href='#L104'>104</a> | ||
| <a name='L105'></a><a href='#L105'>105</a> | ||
| <a name='L106'></a><a href='#L106'>106</a> | ||
| <a name='L107'></a><a href='#L107'>107</a> | ||
| <a name='L108'></a><a href='#L108'>108</a> | ||
| <a name='L109'></a><a href='#L109'>109</a> | ||
| <a name='L110'></a><a href='#L110'>110</a> | ||
| <a name='L111'></a><a href='#L111'>111</a> | ||
| <a name='L112'></a><a href='#L112'>112</a> | ||
| <a name='L113'></a><a href='#L113'>113</a> | ||
| <a name='L114'></a><a href='#L114'>114</a> | ||
| <a name='L115'></a><a href='#L115'>115</a> | ||
| <a name='L116'></a><a href='#L116'>116</a> | ||
| <a name='L117'></a><a href='#L117'>117</a> | ||
| <a name='L118'></a><a href='#L118'>118</a> | ||
| <a name='L119'></a><a href='#L119'>119</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">54x</span> | ||
| <span class="cline-any cline-yes">54x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">52x</span> | ||
| <span class="cline-any cline-yes">52x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">52x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { | ||
| disposeDescription, | ||
| disposeTaggedTemplate, | ||
| } from "./dispose-description"; | ||
| import { Overload } from "./overload"; | ||
| import type { AnyArg, ArgumentTypes, ValidatorArgumentTuple } from "./types"; | ||
| | ||
| /** | ||
| * Creates a new set of parameters which should match one overloaded | ||
| * function/method implementation. Returns an object containing a matcher | ||
| * function which will be executed when the arguments match the params list | ||
| * | ||
| * ```ts | ||
| * function foo(a: string, b: number): void; | ||
| * function foo(...args: (string | number)[]){ | ||
| * return overloads( | ||
| * def(string(), number()).match((a, b)=>{ | ||
| * const modifiedA = doStringThing(a); | ||
| * const modifiedB = doNumberThing(modifiedA, b); | ||
| * }) | ||
| * ).use(args) | ||
| * } | ||
| * ``` | ||
| * @param args - a rest argument of Arguments, provided by type functions (`string()`, `number()` etc) | ||
| * @returns | ||
| */ | ||
| export function def( | ||
| name: TemplateStringsArray | ||
| ): | ||
| | (<P extends AnyArg[], T extends ArgumentTypes<P>>( | ||
| description: string, | ||
| ...args: T | ||
| ) => ParamReturn<P, T>) & | ||
| (<P extends AnyArg[], T extends ArgumentTypes<P>>( | ||
| ...args: T | ||
| ) => ParamReturn<P, T>); | ||
| | ||
| export function def<P extends AnyArg[], T extends ArgumentTypes<P>>( | ||
| description: string, | ||
| ...args: T | ||
| ): ParamReturn<P, T>; | ||
| export function def<P extends AnyArg[], T extends ArgumentTypes<P>>( | ||
| ...args: T | ||
| ): ParamReturn<P, T>; | ||
| export function def<P extends AnyArg[], T extends ArgumentTypes<P>>( | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| ...args: any | ||
| ): // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| any { | ||
| const [name, isNamed] = disposeTaggedTemplate(args); | ||
| if (isNamed) { | ||
| return (...args: T) => { | ||
| const description = disposeDescription(args); | ||
| return { | ||
| /** | ||
| * Implementation for a specific overload. When the arguments passed match this functions | ||
| * parent overload, the arguments will be passed to this functions parameters. | ||
| * | ||
| * The return value will be used in a union in the final return value of the overloading function/method | ||
| * @param implementation | ||
| * @returns | ||
| */ | ||
| matches: <K>( | ||
| // Typescript doesn't seem to like that this is a tuple type. | ||
| // Otherwise it works fine | ||
| // eslint-disable-next-line @typescript-eslint/ban-ts-comment | ||
| // @ts-expect-error | ||
| implementation: (...implArgs: ValidatorArgumentTuple<T>) => K | ||
| ) => { | ||
| return new Overload(name, description, args, implementation); | ||
| }, | ||
| }; | ||
| }; | ||
| } | ||
| const description = disposeDescription(args); | ||
| return { | ||
| /** | ||
| * Implementation for a specific overload. When the arguments passed match this functions | ||
| * parent overload, the arguments will be passed to this functions parameters. | ||
| * | ||
| * The return value will be used in a union in the final return value of the overloading function/method | ||
| * @param implementation | ||
| * @returns | ||
| */ | ||
| matches: <K>( | ||
| // Typescript doesn't seem to like that this is a tuple type. | ||
| // Otherwise it works fine | ||
| // eslint-disable-next-line @typescript-eslint/ban-ts-comment | ||
| // @ts-expect-error | ||
| implementation: (...implArgs: ValidatorArgumentTuple<T>) => K | ||
| ) => { | ||
| return new Overload(name, description, args, implementation); | ||
| }, | ||
| throws: <span class="fstat-no" title="function not covered" ><T extends Error>(m</span>essage: string, errorType?: T) => { | ||
| <span class="cstat-no" title="statement not covered" > return new Overload(name, description, args, errorType ?? Error);</span> | ||
| }, | ||
| }; | ||
| } | ||
| | ||
| type ParamReturn<P extends AnyArg[], T extends ArgumentTypes<P>> = { | ||
| /** | ||
| * Implementation for a specific overload. When the arguments passed match this functions | ||
| * parent overload, the arguments will be passed to this functions parameters. | ||
| * | ||
| * The return value will be used in a union in the final return value of the overloading function/method | ||
| * @param implementation | ||
| * @returns | ||
| */ | ||
| matches: <K>( | ||
| // Typescript doesn't seem to like that this is a tuple type. | ||
| // Otherwise it works fine | ||
| // eslint-disable-next-line @typescript-eslint/ban-ts-comment | ||
| /** @ts-expect-error This is valid, just isn't being picked up as tuple type for some reason. **/ | ||
| implementation: (...implArgs: ValidatorArgumentTuple<T>) => K | ||
| // eslint-disable-next-line @typescript-eslint/ban-ts-comment | ||
| /** @ts-expect-error This is valid, just isn't being picked up as tuple type for some reason. **/ | ||
| ) => Overload<P, (...implArgs: ValidatorArgumentTuple<T>) => K>; | ||
| }; | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../sorter.js"></script> | ||
| <script src="../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/dispose-description.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../prettify.css" /> | ||
| <link rel="stylesheet" href="../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> dispose-description.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>6/6</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>4/4</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>6/6</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">54x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">53x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">54x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">52x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">export function disposeDescription(args: unknown[]): string { | ||
| if (typeof args[0] === "string") { | ||
| return args.shift() as string; | ||
| } | ||
| return ""; | ||
| } | ||
| | ||
| export function disposeTaggedTemplate(args: unknown[]): [string, boolean] { | ||
| if (Array.isArray(args[0])) { | ||
| return [args[0][0], true] | ||
| } | ||
| return ["", false]; | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../sorter.js"></script> | ||
| <script src="../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/formatting.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../prettify.css" /> | ||
| <link rel="stylesheet" href="../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> formatting.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">94.73% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>18/19</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">66.66% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>4/6</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>3/3</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">94.44% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>17/18</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import cli from "colors-cli"; | ||
| | ||
| export function colorCompareArgStrings(expected: string[], actual: string[]) { | ||
| const maxLength = Math.max(expected.length, actual.length); | ||
| const firstAccumulator: string[] = []; | ||
| const secondAccumulator: string[] = []; | ||
| for (let i = 0; i < maxLength; i++) { | ||
| const firstArg = expected[i]; | ||
| const secondArg = actual[i]; | ||
| if (firstArg !== secondArg) { | ||
| firstAccumulator.push(cli.yellow(firstArg)); | ||
| secondAccumulator.push(cli.red(secondArg)); | ||
| } else { | ||
| firstAccumulator.push(cli.green(firstArg)); | ||
| secondAccumulator.push(cli.green(secondArg)); | ||
| } | ||
| } | ||
| return [firstAccumulator, secondAccumulator]; | ||
| } | ||
| | ||
| export function argStringArray(args: unknown[]) { | ||
| return args.map((arg) => { | ||
| const type = typeof arg; | ||
| const asRecord = arg as Record<string, unknown>; | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof asRecord === "object" && <span class="branch-1 cbranch-no" title="branch not covered" >"constructor" in asRecord) {</span> | ||
| <span class="cstat-no" title="statement not covered" > return asRecord.constructor.name;</span> | ||
| } | ||
| return type; | ||
| }); | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../sorter.js"></script> | ||
| <script src="../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../prettify.css" /> | ||
| <link rel="stylesheet" href="../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../index.html">All files</a> src</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">94.73% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>72/76</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">75.75% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>25/33</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">95.83% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>23/24</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">94.36% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>67/71</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <div class="pad1"> | ||
| <table class="coverage-summary"> | ||
| <thead> | ||
| <tr> | ||
| <th data-col="file" data-fmt="html" data-html="true" class="file">File</th> | ||
| <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th> | ||
| <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th> | ||
| <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th> | ||
| <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th> | ||
| <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th> | ||
| <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| </tr> | ||
| </thead> | ||
| <tbody><tr> | ||
| <td class="file high" data-value="def.ts"><a href="def.ts.html">def.ts</a></td> | ||
| <td data-value="90" class="pic high"> | ||
| <div class="chart"><div class="cover-fill" style="width: 90%"></div><div class="cover-empty" style="width: 10%"></div></div> | ||
| </td> | ||
| <td data-value="90" class="pct high">90%</td> | ||
| <td data-value="10" class="abs high">9/10</td> | ||
| <td data-value="50" class="pct medium">50%</td> | ||
| <td data-value="4" class="abs medium">2/4</td> | ||
| <td data-value="80" class="pct high">80%</td> | ||
| <td data-value="5" class="abs high">4/5</td> | ||
| <td data-value="90" class="pct high">90%</td> | ||
| <td data-value="10" class="abs high">9/10</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="dispose-description.ts"><a href="dispose-description.ts.html">dispose-description.ts</a></td> | ||
| <td data-value="100" class="pic high"> | ||
| <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div> | ||
| </td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="6" class="abs high">6/6</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="4" class="abs high">4/4</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="2" class="abs high">2/2</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="6" class="abs high">6/6</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="formatting.ts"><a href="formatting.ts.html">formatting.ts</a></td> | ||
| <td data-value="94.73" class="pic high"> | ||
| <div class="chart"><div class="cover-fill" style="width: 94%"></div><div class="cover-empty" style="width: 6%"></div></div> | ||
| </td> | ||
| <td data-value="94.73" class="pct high">94.73%</td> | ||
| <td data-value="19" class="abs high">18/19</td> | ||
| <td data-value="66.66" class="pct medium">66.66%</td> | ||
| <td data-value="6" class="abs medium">4/6</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="3" class="abs high">3/3</td> | ||
| <td data-value="94.44" class="pct high">94.44%</td> | ||
| <td data-value="18" class="abs high">17/18</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="overload.ts"><a href="overload.ts.html">overload.ts</a></td> | ||
| <td data-value="100" class="pic high"> | ||
| <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div> | ||
| </td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="24" class="abs high">24/24</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="7" class="abs high">7/7</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="8" class="abs high">8/8</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="21" class="abs high">21/21</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="overloads.ts"><a href="overloads.ts.html">overloads.ts</a></td> | ||
| <td data-value="88.23" class="pic high"> | ||
| <div class="chart"><div class="cover-fill" style="width: 88%"></div><div class="cover-empty" style="width: 12%"></div></div> | ||
| </td> | ||
| <td data-value="88.23" class="pct high">88.23%</td> | ||
| <td data-value="17" class="abs high">15/17</td> | ||
| <td data-value="66.66" class="pct medium">66.66%</td> | ||
| <td data-value="12" class="abs medium">8/12</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="6" class="abs high">6/6</td> | ||
| <td data-value="87.5" class="pct high">87.5%</td> | ||
| <td data-value="16" class="abs high">14/16</td> | ||
| </tr> | ||
| </tbody> | ||
| </table> | ||
| </div> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../sorter.js"></script> | ||
| <script src="../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/overload.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../prettify.css" /> | ||
| <link rel="stylesheet" href="../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> overload.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>24/24</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>7/7</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>21/21</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">65x</span> | ||
| <span class="cline-any cline-yes">65x</span> | ||
| <span class="cline-any cline-yes">65x</span> | ||
| <span class="cline-any cline-yes">65x</span> | ||
| <span class="cline-any cline-yes">65x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">122x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">39x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">39x</span> | ||
| <span class="cline-any cline-yes">55x</span> | ||
| <span class="cline-any cline-yes">55x</span> | ||
| <span class="cline-any cline-yes">55x</span> | ||
| <span class="cline-any cline-yes">28x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">11x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import type { ArgumentType } from "./arguments/types"; | ||
| import { argStringArray, colorCompareArgStrings } from "./formatting"; | ||
| import { OverloadAction } from "./overload-actions"; | ||
| import type{ AnyArg } from "./types"; | ||
| export class Overload< | ||
| TArgs extends AnyArg[], | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| TAction extends OverloadAction | ||
| > { | ||
| constructor( | ||
| readonly name: string | undefined, | ||
| readonly description: string | undefined, | ||
| readonly args: TArgs, | ||
| readonly actionOrError: TAction | Error, | ||
| readonly fallback = false | ||
| ) { | ||
| args.forEach((arg, idx) => arg.withIndex(idx)); | ||
| } | ||
| | ||
| isMatch(args: ArgumentType[]) { | ||
| if (args === undefined || args === null) { | ||
| args = []; | ||
| } | ||
| | ||
| for (let i = 0; i < this.args.length; i++) { | ||
| const argWrapper = this.args[i]; | ||
| const arg = args[i]; | ||
| if (!argWrapper.validate(arg)) { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
| | ||
| | ||
| typeStringArray() { | ||
| return this.args.map((it) => it.typeName); | ||
| } | ||
| | ||
| getReport(index: number, realArgs: unknown[]) { | ||
| const expectedTypeStrings = this.typeStringArray(); | ||
| const actualTypeStrings = argStringArray(realArgs); | ||
| const compare = colorCompareArgStrings( | ||
| expectedTypeStrings, | ||
| actualTypeStrings | ||
| ); | ||
| return `Overload[${index}] did not match because: | ||
| Expected: ${compare[0].join(", ")} | ||
| Actual : ${compare[1].join(", ")} | ||
| | ||
| ${this.args | ||
| .filter((it) => it.accumulator.length > 0) | ||
| .map((it) => it.accumulator.join("\n\n "))}`; | ||
| } | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../sorter.js"></script> | ||
| <script src="../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/overloads.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../prettify.css" /> | ||
| <link rel="stylesheet" href="../base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> overloads.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">88.23% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>15/17</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">66.66% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>8/12</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>6/6</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">87.5% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>14/16</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input oninput="onInput()" type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">11x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">11x</span> | ||
| <span class="cline-any cline-yes">34x</span> | ||
| <span class="cline-any cline-yes">34x</span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">24x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { ArgumentType } from "./arguments/types"; | ||
| import { Overload } from "./overload"; | ||
| import { OverloadAction } from "./overload-actions"; | ||
| import { AnyArg, ReturnTypes } from "./types"; | ||
| | ||
| export class Overloads<T extends Overload<AnyArg[], OverloadAction>[]> { | ||
| constructor(readonly overloads: T) { | ||
| // overloads.forEach((argument, idx) => argument.args[0].withIndex(idx)); | ||
| } | ||
| | ||
| match(args: ArgumentType[]) { | ||
| for (const overload of this.overloads) { | ||
| const match = overload.isMatch(args) | ||
| if (match && overload.actionOrError instanceof Function) { | ||
| return overload.actionOrError(...args); | ||
| } | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (match && <span class="branch-1 cbranch-no" title="branch not covered" >overload.actionOrError instanceof Error) {</span> | ||
| <span class="cstat-no" title="statement not covered" > throw overload.actionOrError;</span> | ||
| } | ||
| } | ||
| const fallback = this.overloads.find((it) => it.fallback === true); | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (fallback && <span class="branch-1 cbranch-no" title="branch not covered" >fallback.actionOrError instanceof Function) {</span> | ||
| <span class="cstat-no" title="statement not covered" > return fallback.actionOrError(...args);</span> | ||
| } | ||
| const reports = this.overloads | ||
| .map((it, idx) => it.getReport(idx, args)) | ||
| .join("\n\n"); | ||
| throw new Error(`No overloaded function implementation was found for | ||
| function(${args.join(", ")}){} | ||
| ${reports}`); | ||
| } | ||
| | ||
| } | ||
| | ||
| /** | ||
| * Entrypoint for overload implementations. Accepts parameter validators and their matching | ||
| * function implementations. Once complete, pass the function args to `.use(args)` to execute | ||
| * your overloads. If none are matching and no fallback is provided, an error will be thrown. | ||
| * | ||
| * ```ts | ||
| * function foo(a: string, b: number): void; | ||
| * function foo(...args: (string | number)[]){ | ||
| * return overloads( | ||
| * def(string(), number()).match((a, b)=>{...}) | ||
| * fallback().match((a, b)=>{...}) | ||
| * ).use(args) | ||
| * } | ||
| * ``` | ||
| * @param args | ||
| * @returns | ||
| */ | ||
| export function overloads<T extends Overload<AnyArg[], OverloadAction>[]>( | ||
| ...args: T | ||
| ) { | ||
| const overloads = new Overloads(args); | ||
| return { | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| use: (actualArgs: unknown[]): ReturnTypes<T> => overloads.match(actualArgs), | ||
| }; | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2023-09-21T15:39:05.441Z | ||
| </div> | ||
| <script src="../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="../sorter.js"></script> | ||
| <script src="../block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
2
-33.33%354580
-47.41%13
-74%3189
-14.46%