diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2025-11-08 17:30:19 -0800 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2025-11-08 17:32:01 -0800 |
| commit | 8442ed67628e5d51e02b876d0f27479f9215bf0a (patch) | |
| tree | e63c4afce5c29bb2e1edbf5899291508e211d1fe | |
| parent | b32604eef0cec59798cdfea53b82766819429717 (diff) | |
add more tests, fix issues, add support for booleans
| -rw-r--r-- | package.json | 7 | ||||
| -rw-r--r-- | src/lang/js-lang/core/lexer.ts | 7 | ||||
| -rw-r--r-- | src/lang/js-lang/core/parser.ts | 16 | ||||
| -rw-r--r-- | src/lang/ts-lang/core/parser.ts | 8 | ||||
| -rw-r--r-- | tests/type-consistency/spec/index.ts | 3 | ||||
| -rw-r--r-- | tests/type-consistency/spec/types.ts | 22 | ||||
| -rw-r--r-- | tests/type-consistency/tsconfig.json | 15 |
7 files changed, 72 insertions, 6 deletions
diff --git a/package.json b/package.json index da58a1a..96d70b6 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,16 @@ { "name": "@aberrantflux/kai-script", "description": "A type safe framework for TypeScript", - "version": "0.2.3", + "version": "0.2.4", "repository": { "type": "git", "url": "git+https://git.aberrantflux.xyz/kai-script.git/" }, "scripts": { - "build": "tsc", + "build": "tsc --declaration", "generate-tests": "rm -f tests/type-consistency/generated/*.test.ts && tsx tests/type-consistency/generateAll.ts", - "test": "pnpm run generate-tests && vitest run --reporter verbose" + "test": "pnpm run generate-tests && vitest run --reporter verbose && tsc --noEmit --project tests/type-consistency/tsconfig.json", + "safe-publish": "rm -rf dist && pnpm build && pnpm test && npm publish" }, "exports": { "types": "./dist/index.d.ts", diff --git a/src/lang/js-lang/core/lexer.ts b/src/lang/js-lang/core/lexer.ts index 95e0e19..e47844a 100644 --- a/src/lang/js-lang/core/lexer.ts +++ b/src/lang/js-lang/core/lexer.ts @@ -6,7 +6,7 @@ const WHITESPACE_TOKENS = [ TokenType.SEMICOLON, ] as string[]; -export const lex = <const Raw extends string>(raw: Raw): Lex<Raw> => { +const _lex = (raw: string): Token[] => { let _raw: string = raw; let nameCollection = ""; const tokens: Token[] = []; @@ -42,5 +42,8 @@ export const lex = <const Raw extends string>(raw: Raw): Lex<Raw> => { nameCollection += head; } - return tokens as Lex<Raw>; + return tokens; }; + +export const lex = <const Raw extends string>(raw: Raw): Lex<Raw> => + _lex(`${raw};`) as Lex<Raw>; diff --git a/src/lang/js-lang/core/parser.ts b/src/lang/js-lang/core/parser.ts index f193d6a..9078f06 100644 --- a/src/lang/js-lang/core/parser.ts +++ b/src/lang/js-lang/core/parser.ts @@ -11,6 +11,22 @@ const resolveNodeFromToken = (token: Token): ASTNode => { children: [], }; } + if (token.name === "true") { + return { + type: NodeType.INT, + name: "", + value: true, + children: [], + }; + } + if (token.name === "false") { + return { + type: NodeType.INT, + name: "", + value: false, + children: [], + }; + } if (token.name[0] === '"' && token.name[token.name.length - 1] === '"') { return { type: NodeType.INT, diff --git a/src/lang/ts-lang/core/parser.ts b/src/lang/ts-lang/core/parser.ts index db6f3aa..3a497a2 100644 --- a/src/lang/ts-lang/core/parser.ts +++ b/src/lang/ts-lang/core/parser.ts @@ -64,10 +64,18 @@ export type ParseNumberLiteral<T extends string> = export type ParseStringLiteral<T extends string> = T extends `"${infer Inner extends string}"` ? Inner : NULL_SENTINEL; +export type ParseBooleanLiteral<T extends string> = T extends `true` + ? true + : T extends `false` + ? false + : NULL_SENTINEL; + export type ResolveNodeFromToken<_Token extends Token> = ParseNumberLiteral< _Token["name"] > extends number ? ASTNode<NodeType.INT, "", ParseNumberLiteral<_Token["name"]>, []> + : ParseBooleanLiteral<_Token["name"]> extends boolean + ? ASTNode<NodeType.INT, "", ParseBooleanLiteral<_Token["name"]>, []> : ParseStringLiteral<_Token["name"]> extends string ? ASTNode<NodeType.INT, "", ParseStringLiteral<_Token["name"]>, []> : ASTNode<NodeType.EXT, _Token["name"], null, []>; diff --git a/tests/type-consistency/spec/index.ts b/tests/type-consistency/spec/index.ts index 9ef825f..4532493 100644 --- a/tests/type-consistency/spec/index.ts +++ b/tests/type-consistency/spec/index.ts @@ -1,4 +1,5 @@ import array from "./array"; import functions from "./function"; +import types from "./types"; -export default [array, functions]; +export default [array, functions, types]; diff --git a/tests/type-consistency/spec/types.ts b/tests/type-consistency/spec/types.ts new file mode 100644 index 0000000..8bac271 --- /dev/null +++ b/tests/type-consistency/spec/types.ts @@ -0,0 +1,22 @@ +import path from "path"; +import { createTestHarness } from "../harness"; + +export default createTestHarness({ + harnessName: "Types", + generatedPath: path.join(__dirname, "..", "generated"), +}) + .createProgramTest({ + name: "Handles number inputs", + program: "1,2,3", + expected: [1, 2, 3], + }) + .createProgramTest({ + name: "Handles string inputs", + program: `"hello", "world"`, + expected: ["hello", "world"], + }) + .createProgramTest({ + name: "Handles boolean inputs", + program: `true, false`, + expected: [true, false], + }); diff --git a/tests/type-consistency/tsconfig.json b/tests/type-consistency/tsconfig.json new file mode 100644 index 0000000..e1421ab --- /dev/null +++ b/tests/type-consistency/tsconfig.json @@ -0,0 +1,15 @@ +{ + "include": ["generated/**/*.ts"], + "compilerOptions": { + "target": "ES2022", + "module": "nodenext", + "moduleResolution": "nodenext", + "lib": ["ES2022", "dom"], + "outDir": "dist", + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "declarationMap": true + } +} |
