aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2023-01-09 19:38:28 +0530
committerAkshay Nair <phenax5@gmail.com>2023-01-09 19:38:28 +0530
commit2af211f1bd6a5c81ee7acd2ded2bfacf4dcfb2a4 (patch)
treeb1face34438aab4a702ace78c027b280e967f388
parent592f866637bfb8ef8a4a5c31e0984abf6df82532 (diff)
downloadts-types-lang-2af211f1bd6a5c81ee7acd2ded2bfacf4dcfb2a4.tar.gz
ts-types-lang-2af211f1bd6a5c81ee7acd2ded2bfacf4dcfb2a4.zip
feat: cli donezy
-rw-r--r--package.json3
-rw-r--r--src/context.ts14
-rw-r--r--src/eval.ts4
-rw-r--r--src/index.ts32
-rw-r--r--yarn.lock5
5 files changed, 39 insertions, 19 deletions
diff --git a/package.json b/package.json
index c63d733..8ec042a 100644
--- a/package.json
+++ b/package.json
@@ -12,11 +12,12 @@
"scripts": {
"build": "tsc",
"postinstall": "yarn build",
- "dev": "ts-node src/index.ts"
+ "cli": "ts-node src/index.ts"
},
"dependencies": {
"@types/node": "^18.11.18",
"@types/uuid": "^9.0.0",
+ "commander": "^9.5.0",
"ts-morph": "^17.0.1",
"typescript": "^4.9.4",
"uuid": "^9.0.0"
diff --git a/src/context.ts b/src/context.ts
index 7759215..e0c0fa5 100644
--- a/src/context.ts
+++ b/src/context.ts
@@ -5,7 +5,11 @@ import { Ctx } from './types'
const RESULT_TYPE_NAME = '__$result'
-export const createContext = (): Ctx => {
+export interface CtxOptions {
+ filePath: string
+}
+
+export const createContext = (options: CtxOptions): Ctx => {
const project = new Project({
compilerOptions: {
target: ScriptTarget.ES3,
@@ -14,13 +18,7 @@ export const createContext = (): Ctx => {
const typeChecker = project.getTypeChecker()
- const [filePath] = process.argv.slice(2)
-
- if (!filePath) {
- throw new Error('Must specify ts file to run')
- }
-
- const sourceFile = project.addSourceFileAtPath(path.resolve(filePath))
+ const sourceFile = project.addSourceFileAtPath(path.resolve(options.filePath))
const entryPoint = sourceFile.getExportedDeclarations().get('main')?.[0]
diff --git a/src/eval.ts b/src/eval.ts
index dc33fbe..6b9ade0 100644
--- a/src/eval.ts
+++ b/src/eval.ts
@@ -11,6 +11,10 @@ const rl = readline.createInterface({
terminal: false,
})
+export const cleanup = () => {
+ rl.close()
+}
+
const readLineFromStdin = (): Promise<string> =>
new Promise((res) => rl.on('line', res))
diff --git a/src/index.ts b/src/index.ts
index 65349fc..01420c8 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,15 +1,27 @@
+import { program } from 'commander'
import { createContext } from './context'
-import { evalList } from './eval'
+import { cleanup, evalList } from './eval'
-const main = async () => {
- const ctx = createContext()
- const resultType = ctx.entryPoint.getType()
- const effects = resultType.isTuple()
- ? resultType.getTupleElements()
- : [resultType]
- await evalList(ctx, effects)
+const main = () => {
+ program
+ .name('ts-types-lang')
+ .description(`A runtime for typescript's type system that turns it into a general purpose, purely functional programming language!`)
+
+ program
+ .command('run')
+ .description('Run a typescript .ts file')
+ .argument('<file>', 'Typescript file to run')
+ .action(async (filePath) => {
+ const ctx = createContext({ filePath })
+ const resultType = ctx.entryPoint.getType()
+ const effects = resultType.isTuple()
+ ? resultType.getTupleElements()
+ : [resultType]
+ await evalList(ctx, effects)
+ })
+
+ return program.parseAsync()
}
main()
- .then(() => process.exit(0))
- .catch((e) => (console.error(e), process.exit(1)))
+ .finally(() => cleanup())
diff --git a/yarn.lock b/yarn.lock
index d5a4858..ddf2f69 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -127,6 +127,11 @@ code-block-writer@^11.0.3:
resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-11.0.3.tgz#9eec2993edfb79bfae845fbc093758c0a0b73b76"
integrity sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==
+commander@^9.5.0:
+ version "9.5.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30"
+ integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==
+
create-require@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"