{"name":"ts-simple-type","version":"2.0.0-next.0","description":"Relationship type checker functions for Typescript types.","author":{"name":"runem"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/runem/ts-simple-type.git"},"keywords":["typescript","ast","typechecker","type"],"scripts":{"playground":"ts-node run-playground.ts","prepare":"npm run clean & npm run build","clean":"rimraf lib","test":"ava --color","test:watch":"ava --color --watch","build":"rollup -c","watch":"rollup -c --watch","lint":"eslint src --ext ts","prettier:check":"prettier --check \"src/**/*.{ts,tsx}\"","prettier:write":"prettier --write \"src/**/*.{ts,tsx}\""},"main":"lib/index.cjs.js","typings":"lib/index.cjs.d.ts","devDependencies":{"@types/node":"^14.6.2","@typescript-eslint/eslint-plugin":"^4.0.1","@typescript-eslint/parser":"^4.0.1","@wessberg/rollup-plugin-ts":"^1.3.3","ava":"^3.12.1","eslint":"^7.8.1","eslint-config-prettier":"^6.11.0","husky":"^4.2.5","lint-staged":"^10.2.13","prettier":"^2.1.1","rimraf":"^3.0.2","rollup":"^2.26.9","ts-node":"^9.0.0","typescript":"^4.3.5"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"lint-staged":{"*.{ts,js}":"eslint --fix","*.{ts,js,md,json}":"prettier --write"},"ava":{"cache":true,"timeout":"120s","extensions":["ts"],"require":["ts-node/register/transpile-only"],"files":["test/**/*.ts","!test/helpers/**/*"]},"readme":"# ts-simple-type\n\n<a href=\"https://npmcharts.com/compare/ts-simple-type?minimal=true\"><img alt=\"Downloads per month\" src=\"https://img.shields.io/npm/dm/ts-simple-type.svg\" height=\"20\"></img></a>\n<a href=\"https://www.npmjs.com/package/ts-simple-type\"><img alt=\"NPM Version\" src=\"https://badge.fury.io/js/ts-simple-type.svg\" height=\"20\"></img></a>\n<a href=\"https://github.com/runem/ts-simple-type/graphs/contributors\"><img alt=\"Contributors\" src=\"https://img.shields.io/github/contributors/runem/ts-simple-type.svg\" height=\"20\"></img></a>\n<a href=\"https://opensource.org/licenses/MIT\"><img alt=\"MIT License\" src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" height=\"20\"></img></a>\n\n## What is this?\n\nRight now the type checker for Typescript API doesn't expose methods for checking assignability and building types. See issue [#9879](https://github.com/Microsoft/TypeScript/issues/9879) and [#29432](https://github.com/Microsoft/TypeScript/issues/29432) on the Typescript github repository.\n\nTo fill in the gap while this issue is being discussed this library aims to provide the most essential helper functions for working with types in Typescript.\n\nFurthermore, this library can help you construct types (called `SimpleType`) which can be serialized and easy analyzed. \n\nThis library has more than 35000 tests comparing results to actual Typescript diagnostics (see [test-types.ts](https://github.com/runem/ts-simple-type/blob/master/test-types/test-types.ts)).\n\n## Installation\n\n```bash\nnpm install ts-simple-type\n```\n\n## How to use\n\nThe API is very simple. For example if you want to check if Typescript type `typeB` is assignable to `typeA`, you can use the following function.\n\n```typescript\nimport { isAssignableToType } from \"ts-simple-type\";\n\nconst isAssignable = isAssignableToType(typeA, typeB, typeChecker);\n```\n\n## SimpleType\n\nTo make it easier to work with typescript types this library works by (behind the curtain) converting them to the interface `SimpleType`. Most functions in this library work with both `SimpleType` and the known and loved Typescript-provided `Type` interface. This means that you can easily create a complex type yourself and compare it to a native Typescript type. It also means that you can use this library to serialize types and even compare them in the browser.\n\nThe `SimpleType` interface can be used to construct your own types for typechecking.\n\n```typescript\nimport { SimpleType, typeToString, isAssignableToType, isAssignableToValue } from \"ts-simple-type\";\n\nconst colors: SimpleType = {\n  kind: \"UNION\",\n  types: [\n    { kind: \"STRING_LITERAL\", value: \"RED\" },\n    { kind: \"STRING_LITERAL\", value: \"GREEN\" },\n    { kind: \"STRING_LITERAL\", value: \"BLUE\" }\n  ]\n};\n\ntypeToString(colors)\n> \"RED\" | \"GREEN\" | \"BLUE\"\n\nisAssignableToType(colors, { kind: \"STRING_LITERAL\", value: \"YELLOW\" })\n> false;\n\nisAssignableToValue(colors, \"BLUE\")\n> true;\n\nisAssignableToValue(colors, \"PINK\")\n> false;\n```\n\n## More examples\n\n```typescript\nconst typeA = checker.getTypeAtLocation(nodeA);\nconst typeB = checker.getTypeAtLocation(nodeB);\n\n/*\n  For this example, let's say:\n  - typeA is number\n  - typeB is string[]\n*/\n\n// typeToString\ntypeToString(typeA)\n> \"number\"\n\ntypeToString(typeB)\n> \"string[]\"\n\n\n// isAssignableToType\nisAssignableToType(typeA, typeB, checker)\n> false\n\nisAssignableToType(typeA, { kind: \"NUMBER\" }, checker)\n> true\n\nisAssignableToType(typeB, { kind: \"ARRAY\", type: {kind: \"STRING\"}}, checker)\n> true\n\nisAssignableToType(\n  { kind: \"STRING\" },\n  { kind: \"STRING_LITERAL\", value: \"hello\"})\n> true\n\n\n// isAssignableToPrimitiveType\nisAssignableToPrimitiveType(typeA, checker)\n> true\n\nisAssignableToPrimitiveType(typeB, checker)\n> false\n\nisAssignableToPrimitiveType({ kind: \"ARRAY\", type: {kind: \"STRING\"} })\n> false\n\n\n// isAssignableToSimpleTypeKind\nisAssignableToSimpleTypeKind(typeA, \"NUMBER\", checker)\n> true\n\nisAssignableToSimpleTypeKind(typeB, \"BOOLEAN\", checker)\n> false\n\nisAssignableToSimpleTypeKind(typeB, [\"STRING\", \"UNDEFINED\"], checker)\n> true\n\n\n// isAssignableToValue\nisAssignableToValue(typeA, 123, checker)\n> true\n\nisAssignableToValue(typeA, \"hello\", checker)\n> false\n\nisAssignableToValue(typeB, true, checker)\n> false\n\n\n// toSimpleType\ntoSimpleType(typeA, {checker})\n> { kind: \"NUMBER\" }\n\ntoSimpleType(typeB, {checker})\n> { kind: \"ARRAY\", type: { kind: \"NUMBER\" } }\n\n```\n\n## API Documentation\n\nFor functions that take either a native Typescript `Type` or a `SimpleType` the `TypeChecker` is only required if a Typescript `Type` has been given to the function.\n\n### isAssignableToType\n> isAssignableToType(typeA: Type | SimpleType, typeB: Type | SimpleType, checker?: TypeChecker): boolean\n\nReturns true if `typeB` is assignable to `typeA`.\n\n### isAssignableToPrimitiveType\n> isAssignableToPrimitiveType(type: Type | SimpleType, checker?: TypeChecker): boolean\n\nReturns true if `type` is assignable to a primitive type like `string`, `number`, `boolean`, `bigint`, `null` or `undefined`.\n\n### isAssignableToSimpleTypeKind\n> isAssignableToSimpleTypeKind(type: Type | SimpleType, kind: SimpleTypeKind | SimpleTypeKind[], checker?: TypeChecker, options?: Options): boolean\n\nReturns true if `type` is assignable to a `SimpleTypeKind`.\n- `options.matchAny` (boolean): Can be used to allow the \"any\" type to match everything.\n\n### isAssignableToValue\n> isAssignableToValue(type: SimpleType | Type, value: any, checker?: TypeChecker): boolean\n\nReturns true if the type of the value is assignable to `type`.\n\n### typeToString\n> typeToString(type: SimpleType): string\n\nReturns a string representation of the simple type. The string representation matches the one that Typescript generates.\n\n### toSimpleType\n> toSimpleType(type: Type | Node, checker: TypeChecker): SimpleType\n\nReturns a `SimpleType` that represents a native Typescript `Type`.\n\n","readmeFilename":"README.md","gitHead":"4ac2604f1fddcd11e9b9ee3def9e28403f1624ae","bugs":{"url":"https://github.com/runem/ts-simple-type/issues"},"homepage":"https://github.com/runem/ts-simple-type#readme","_id":"ts-simple-type@2.0.0-next.0","_nodeVersion":"16.4.0","_npmVersion":"7.19.0","dist":{"integrity":"sha512-A+hLX83gS+yH6DtzNAhzZbPfU+D9D8lHlTSd7GeoMRBjOt3GRylDqLTYbdmjA4biWvq2xSfpqfIDj2l0OA/BVg==","shasum":"262a321ba2a17aa57f88ef31e30453beff5be246","tarball":"https://registry.npmjs.org/ts-simple-type/-/ts-simple-type-2.0.0-next.0.tgz","fileCount":6,"unpackedSize":119627,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg8b5/CRA9TVsSAnZWagAAaTkP/2h/JXKe/qdtuSGiwFVZ\n4qJ2Tlc/QWcKsDgVI0aHYg/b3fJ1Zun+v2OI5xUhYI1asXPrN4168cnKGpwx\nmoe02jok94KkrFjDvUpworYDlliDS1eT6shpBQoKVbAr2PKwvBpw7dKr2Bud\nVexbFXC+6obdNZLYh4TFonZsqodmTrxurpJxzpopIutxlQEDNOCZ8W59sSlC\nac+h9CuFM5XYMKgBUU4zSWxAaKmMwziRreIOtTk5vsWHaEGuGSc1Ch40DP5v\nG93Wq3yZzgllPPWOIIrVcVq06yaDpdVAZbzUBQjepQMjW4+xCpkISN8Atrqn\n9IiyEHm60mkwehbKwLxsShphz3VzZj/6gjMef/XAixqOskNZyUuynoDGWSUD\nt0KLqOFxgSfxqv8DEF4e4eC0fDuLuveAVN3exld2qzpDtLU5TP1olMcw2KHB\n0BRAYXnFHLtyRf0pgOx0AJeCxWz2aXajdEcPri7YSh0aKUQA3kKPRVe/ssrK\n6meqCaWL0ZsyHQsNPDxdq9mWDKdlK8IbAvrB9V6pDVXsCosd6ZOrtzs71tZh\nniRIAZkf6THPKxG3eX3Di9V3IMMCdVR4qHAToOp7YPilCWLyzrXy2yMPeFxJ\n8eyF/7S6jQIp0PdRrKQdE7QFVtRIa9Zjg0ppxLHSvKoIHMfKc9GewmFSgyBo\nngHw\r\n=aYXE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGwbG+M6Bc/9z0rcRA0SDawAYwlfwyu7wWc4uKs49jnpAiACx9RW2eyLf4vZCGo0rXjkIzayqK+C+CbX1RrDXbYMag=="}]},"_npmUser":{"name":"justinfagnani","email":"justin@fagnani.com"},"directories":{},"maintainers":[{"name":"rictic","email":"rictic@gmail.com"},{"name":"justinfagnani","email":"justin@fagnani.com"},{"name":"runebm","email":"runemehlsen@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ts-simple-type_2.0.0-next.0_1626455679524_0.04342678896637642"},"_hasShrinkwrap":false}