{"bugs":{"url":"https://github.com/gvergnaud/HOTScript/issues"},"dist":{"shasum":"cdb06bb7d6a0bb7fecfbe2813ced3571dca9fc91","tarball":"https://registry.npmjs.org/hotscript/-/hotscript-1.0.13-test.0.tgz","fileCount":79,"integrity":"sha512-Ah6gE7bM/aLPWXZ0pI+RoD6FrN9E6/6vGsf7nalUdt4lZqoHiXbFj6Cl/OzD4ZKIEDYbIOOCzppQIr588p/9Qw==","signatures":[{"sig":"MEYCIQDNso3OHgvwdAy/xeEjzSL25fwUAB5xFVB0qCmdWWt74wIhAPy8DWxIFqMdIHEo21V67KSv4nxpJQyk8C9n3La3oweo","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":169006},"main":"./dist/index.cjs","name":"hotscript","types":"dist/index.d.ts","author":{"name":"Gabriel Vergnaud"},"module":"./dist/index.js","readme":"# Higher-Order TypeScript (HOTScript)\n\nA library of composable functions for the type level!\n\nTransform your TypeScript types in any way you want using functions you already know.\n\n![image](https://user-images.githubusercontent.com/9265418/223854503-b54f6a62-9f21-4953-aaa3-5d54699516a7.png)\n\n## Features\n\n- Type-level higher-order functions (`Tuples.Map`, `Tuples.Filter`, `Objects.MapValues`, etc).\n- Type-level pattern matching with `Match`.\n- Performant math operations (`Numbers.Add`, `Numbers.Sub`, `Numbers.Mul`, `Numbers.Div`, etc).\n- Custom \"lambda\" functions.\n\n🚧 work in progress 🚧\n\n## Installation\n\nYou can find HotScript on npm:\n\n```ts\nnpm install -D hotscript\n```\n\nHotScript is a work-in-progress library, so expect **breaking changes** in its API.\n\n## Examples\n\n#### Transforming a list\n\n[Run this as a TypeScript Playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgBWGApgGjgFQK5gA26AztgMoxTAB2A5mXAHJ4gBG6UJcAvnAGZQIIOACIAFhBgkAxtTAxRAbgBQKmAE8McKKQCMcALwo06ADwq4cAPTWrAPQD8cAGwAmS3ADae7G+wAzNgALAC6mJ5enlb4RKQAdACyAIZgZizsnCTxAIIAJnlmAQB8xdhWFTZ2XsHYAKzYLtgA7KHRuATE2QBSELRmovGiZZWjY1a2YsHxdfEu8c2i7ZTU9NnkRMAwA0Mj4+OTXqLBotiidadiLpeii22VsV1JqWYrtAzxyLoYNIWiesMRod-icznoLmDrmC7u1HgkUmk3mt4jgIBkOFA9hVDnpanBwdg9E18a1YZ0EuRWPtqQc7O5PG1ikogA)\n\n<!-- prettier-ignore -->\n```ts\nimport { Pipe, Tuples, Strings, Numbers } from \"hotscript\";\n\ntype res1 = Pipe<\n  //  ^? 62\n  [1, 2, 3, 4],\n  [\n    Tuples.Map<Numbers.Add<3>>,       // [4, 5, 6, 7]\n    Tuples.Join<\".\">,                 // \"4.5.6.7\"\n    Strings.Split<\".\">,               // [\"4\", \"5\", \"6\", \"7\"]\n    Tuples.Map<Strings.Prepend<\"1\">>, // [\"14\", \"15\", \"16\", \"17\"]\n    Tuples.Map<Strings.ToNumber>,     // [14, 15, 16, 17]\n    Tuples.Sum                        // 62\n  ]\n>;\n```\n\n#### Defining a first-class function\n\n[Run this as a TypeScript Playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgYQIYBt0Bo4DEB2OAKgK5joCmAznAL5wBmUEIcARABYQxUDGUwMDDYBuAFBiA9JLhEOwGgrio4MAJ5gKAWkoA3CunbpUIAEYATVGwCEY4PhgUoDVLwpwAImXTBeqR3AUAB6O+OY0BIhicHBQFDAkUPgAXHAA2jDyVGlsqFAA5gAMbAC6OJkKOXlFpSXitBLqmrHUJOgwAIxwALwoGOgAPKTk1AB0ALKoYANe5L7+FAB8OGkdOABMOADMOAAsJYvi0jEnAHoA-I0a7nFUbTDrPX2YQ95juMYwk9OzPn6Oy3SazgmzgOzg+0OUhkJzgFyAA)\n\n```ts\nimport { Call, Fn, Tuples } from \"hotscript\";\n\n// This is a type-level \"lambda\"!\ninterface Duplicate extends Fn {\n  return: [this[\"arg0\"], this[\"arg0\"]];\n}\n\ntype result1 = Call<Tuples.Map<Duplicate>, [1, 2, 3, 4]>;\n//     ^? [[1, 1], [2, 2], [3, 3], [4, 4]]\n\ntype result2 = Call<Tuples.FlatMap<Duplicate>, [1, 2, 3, 4]>;\n//     ^? [1, 1, 2, 2, 3, 3, 4, 4]\n```\n\n#### Transforming an object type\n\n[Run this as a TypeScript Playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgBWGApgGjgeQEYBW6AxjAM7YBCEEANugIYB2ZcAvnAGZQQhwBEACwjliUNDH4BuAFAyA9PLgAZdDADkrYr0hl0cMr32cArk1LAILODAg2ozMp2h9mcCIRLwYATwwAuGV8MOAAVCABBZABJZAYfWggGABMAHlCAPjgAXhQ0dFSZODDMIrgAbTLi-CJSMgA6HBBgGEofVOo6RhZ6gFEARxMGWjJUsh8QPDoMjNLi6s86+oiyMmAAcyZUpBA1FIYYBn9EOCZ0AHcAVT0oY5goE30ONlmq3EXyeoBlJgYAa3QAGEGHoACLodBgObzGpeBorNabbZwYDJY5ke7AJjrdgZMoAXRkGVkwX0UWi13QUByYUiMTiCSSaQQZUU8wAegB+Mqo9ETKa0WTFTjAKAYgByDF26Mx2KFcFoIJgkulBll61kL1kbIASmoTFAWIFSWEaSziry1eI5WVdodkgcjiczucAPomG53B5PeUisUwV2-VUY60asqKjGBqXoGWhzVSIA)\n\n```ts\nimport { Pipe, Objects, Booleans } from \"hotscript\";\n\n// Let's compose some functions to transform an object type:\ntype ToAPIPayload<T> = Pipe<\n  T,\n  [\n    Objects.OmitBy<Booleans.Equals<symbol>>,\n    Objects.Assign<{ metadata: { newUser: true } }>,\n    Objects.SnakeCaseDeep,\n    Objects.Assign<{ id: string }>\n  ]\n>;\ntype T = ToAPIPayload<{\n  id: symbol;\n  firstName: string;\n  lastName: string;\n}>;\n// Returns:\ntype T = {\n  id: string;\n  metadata: { new_user: true };\n  first_name: string;\n  last_name: string;\n};\n```\n\n#### Parsing a route path\n\n[Run this as a TypeScript Playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgBWGApgGjgeQEYBW6AxjAM7YDKMUwAdgOYVwDCE4EZ6AMugGYxsAFQCuYADbpmAWQCGMYgAs4AXzh8o7OACJFEcsVpgY2gNwAoczACeGOFCkBWOAF4UadAB5zcOAHo-X18APQB+Hx0-ES4oMj9PYAATAC4yGnoGAD4-SDS4hLpE9AAPZLoREDx0KEztTAiAbQjfalpGMgA6SglgGE9tP21M+qC4UQkpDoAxYHEYas9WjM7qWVgyAHVexX7+zOHmsbFJTrkwb1HfNg4uXgFPJsugpfaOoVoQXe04AB8dWoOTxa6Ve3XEvX6ySGI0uAF1ModAUFxic3hAAKp0YAQOgw3z4IikTpTTQgACidHSUjxuEIJHIHTOADVZOIRFILpc5Aodo8gdylB0tjAdto0m0GHU4OKMkingLFELtv1ypVqlLVVUaodfPDERFYeZMqYgA)\n\nhttps://user-images.githubusercontent.com/2315749/222081717-96217cd2-ac89-4e06-a942-17fbda717cd2.mp4\n\n```ts\nimport { Pipe, Objects, Strings, ComposeLeft, Tuples, Match } from \"hotscript\";\n\ntype res5 = Pipe<\n  //    ^? { id: string, index: number }\n  \"/users/<id:string>/posts/<index:number>\",\n  [\n    Strings.Split<\"/\">,\n    Tuples.Filter<Strings.StartsWith<\"<\">>,\n    Tuples.Map<ComposeLeft<[Strings.Trim<\"<\" | \">\">, Strings.Split<\":\">]>>,\n    Tuples.ToUnion,\n    Objects.FromEntries,\n    Objects.MapValues<\n      Match<[Match.With<\"string\", string>, Match.With<\"number\", number>]>\n    >\n  ]\n>;\n```\n\n## API\n\n- [x] Core\n  - [x] `Pipe<Input, Fn[]>`\n  - [x] `PipeRight<Fn[], Input>`\n  - [x] `Call<Fn, ...Arg>`\n  - [x] `Apply<Fn, Arg[]>`\n  - [x] `PartialApply<Fn, Arg[]>`\n  - [x] `Compose<Fn[]>`\n  - [x] `ComposeLeft<Fn[]>`\n- [x] Function\n  - [x] `ReturnType<Fn>`\n  - [x] `Parameters<Fn>`\n  - [x] `Parameter<N, Fn>`\n- [ ] Tuples\n  - [x] `Create<X> -> [X]`\n  - [x] `Partition<Tuple>`\n  - [x] `IsEmpty<Tuple>`\n  - [x] `Zip<...Tuple[]>`\n  - [x] `ZipWith<Fn, ...Tuple[]>`\n  - [x] `Sort<Tuple>`\n  - [x] `Head<Tuple>`\n  - [x] `Tail<Tuple>`\n  - [x] `At<N, Tuple>`\n  - [x] `Last<Tuple>`\n  - [x] `FlatMap<Fn, Tuple>`\n  - [x] `Find<Fn, Tuple>`\n  - [x] `Drop<N, Tuple>`\n  - [x] `Take<N, Tuple>`\n  - [x] `TakeWhile<Fn, Tuple>`\n  - [x] `GroupBy<Fn, Tuple>`\n  - [x] `Join<Str, Tuple>`\n  - [x] `Map<Fn, Tuple>`\n  - [x] `Filter<Fn, Tuple>`\n  - [x] `Reduce<Fn, Init, Tuple>`\n  - [x] `ReduceRight<Fn, Init, Tuple>`\n  - [x] `Reverse<Tuple>`\n  - [x] `Every<Fn, Tuple>`\n  - [x] `Some<Fn, Tuple>`\n  - [x] `SplitAt<N, Tuple>`\n  - [x] `ToUnion<Tuple>`\n  - [x] `ToIntersection<Tuple>`\n  - [x] `Prepend<X, Tuple>`\n  - [x] `Append<X, Tuple>`\n  - [x] `Concat<T1, T2>`\n  - [x] `Min<Tuple>`\n  - [x] `Max<Tuple>`\n  - [x] `Sum<Tuple>`\n- [ ] Object\n  - [x] `Readonly<Obj>`\n  - [x] `Mutable<Obj>`\n  - [x] `Required<Obj>`\n  - [x] `Partial<Obj>`\n  - [x] `ReadonlyDeep<Obj>`\n  - [x] `MutableDeep<Obj>`\n  - [x] `RequiredDeep<Obj>`\n  - [x] `PartialDeep<Obj>`\n  - [x] `Update<Path, Fn | V, Obj>`\n  - [x] `Record<Key, Value>`\n  - [x] `Keys<Obj>`\n  - [x] `Values<Obj>`\n  - [x] `AllPaths<Obj>`\n  - [x] `Create<Pattern, X>`\n  - [x] `Get<Path, Obj>`\n  - [x] `FromEntries<[Key, Value]>`\n  - [x] `Entries<Obj>`\n  - [x] `MapValues<Fn, Obj>`\n  - [x] `MapKeys<Fn, Obj>`\n  - [x] `Assign<...Obj>`\n  - [x] `Pick<Key, Obj>`\n  - [x] `PickBy<Fn, Obj>`\n  - [x] `Omit<Key, Obj>`\n  - [x] `OmitBy<Fn, Obj>`\n  - [x] `CamelCase<Obj>`\n  - [x] `CamelCaseDeep<Obj>`\n  - [x] `SnakeCase<Obj>`\n  - [x] `SnakeCaseDeep<Obj>`\n  - [x] `KebabCase<Obj>`\n  - [x] `KebabCaseDeep<Obj>`\n- [ ] Union\n  - [x] `Map<Fn, U>`\n  - [x] `Extract<T, U>`\n  - [x] `ExtractBy<Fn, U>`\n  - [x] `Exclude<T, U>`\n  - [x] `ExcludeBy<Fn, U>`\n  - [x] `NonNullable<U>`\n  - [x] `ToTuple<U>`\n  - [x] `ToIntersection<U>`\n- [ ] String\n  - [x] `Length<Str>`\n  - [x] `TrimLeft<Str>`\n  - [x] `TrimRight<Str>`\n  - [x] `Trim<Str>`\n  - [x] `Join<Sep, Str>`\n  - [x] `Replace<From, To, Str>`\n  - [x] `Slice<Start, End, Str>`\n  - [x] `Split<Sep, Str>`\n  - [x] `Repeat<N, Str>`\n  - [x] `StartsWith<S, Str>`\n  - [x] `EndsWith<E, Str>`\n  - [x] `ToTuple<Str>`\n  - [x] `ToNumber<Str>`\n  - [x] `ToString<Str>`\n  - [x] `Prepend<Start, Str>`\n  - [x] `Append<End, Str>`\n  - [x] `Uppercase<Str>`\n  - [x] `Lowercase<Str>`\n  - [x] `Capitalize<Str>`\n  - [x] `Uncapitalize<Str>`\n  - [x] `SnakeCase<Str>`\n  - [x] `CamelCase<Str>`\n  - [x] `KebabCase<Str>`\n  - [x] `Compare<Str, Str>`\n  - [x] `Equal<Str, Str>`\n  - [x] `NotEqual<Str, Str>`\n  - [x] `LessThan<Str, Str>`\n  - [x] `LessThanOrEqual<Str, Str>`\n  - [x] `GreaterThan<Str, Str>`\n  - [x] `GreaterThanOrEqual<Str, Str>`\n- [ ] Number\n  - [x] `Add<N, M>`\n  - [x] `Multiply<N, M>`\n  - [x] `Subtract<N, M>`\n  - [x] `Negate<N>`\n  - [x] `Power<N, M>`\n  - [x] `Div<N, M>`\n  - [x] `Mod<N, M>`\n  - [x] `Abs<N>`\n  - [x] `Compare<N, M>`\n  - [x] `GreaterThan<N, M>`\n  - [x] `GreaterThanOrEqual<N, M>`\n  - [x] `LessThan<N, M>`\n  - [x] `LessThanOrEqual<N, M>`\n- [ ] Boolean\n  - [x] `And<Bool, Bool>`\n  - [x] `Or<Bool, Bool>`\n  - [x] `XOr<Bool, Bool>`\n  - [x] `Not<Bool>`\n  - [x] `Extends<A, B>`\n  - [x] `Equals<A, B>`\n  - [x] `DoesNotExtend<A, B>`\n","gitHead":"a7b605f1321d63a819693fd1694fe06f40c3c765","license":"ISC","scripts":{"fmt":"prettier ./src/** ./test/** -w","perf":"tsc --project test/tsconfig.json --noEmit --extendedDiagnostics","test":"jest","build":"tsc src/index.ts --declaration --outDir dist","check":"tsc --strict --noEmit --extendedDiagnostics","clear-test":"jest --clearCache","prepublishOnly":"npm run test && npm run build"},"_npmUser":{"name":"gabrielvergnaud","email":"gabriel.vergnaud@gmail.com"},"homepage":"https://github.com/gvergnaud/HOTScript#readme","repository":{"url":"git+https://github.com/gvergnaud/HOTScript.git","type":"git"},"_npmVersion":"9.1.2","description":"A library of composable functions for the type-level! Transform your TypeScript types in any way you want using functions you already know.","directories":{},"maintainers":[{"name":"gabrielvergnaud","email":"gabriel.vergnaud@gmail.com"}],"_nodeVersion":"18.12.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.4.2","ts-jest":"^29.0.5","prettier":"^2.8.4","typescript":"^4.9.5","@types/jest":"^29.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hotscript_1.0.13-test.0_1683378857181_0.14247409303934533","host":"s3://npm-registry-packages"},"_id":"hotscript@1.0.13-test.0","version":"1.0.13-test.0"}