summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2025-11-08 17:30:19 -0800
committerKai Stevenson <kai@kaistevenson.com>2025-11-08 17:32:01 -0800
commit8442ed67628e5d51e02b876d0f27479f9215bf0a (patch)
treee63c4afce5c29bb2e1edbf5899291508e211d1fe
parentb32604eef0cec59798cdfea53b82766819429717 (diff)
add more tests, fix issues, add support for booleans
-rw-r--r--package.json7
-rw-r--r--src/lang/js-lang/core/lexer.ts7
-rw-r--r--src/lang/js-lang/core/parser.ts16
-rw-r--r--src/lang/ts-lang/core/parser.ts8
-rw-r--r--tests/type-consistency/spec/index.ts3
-rw-r--r--tests/type-consistency/spec/types.ts22
-rw-r--r--tests/type-consistency/tsconfig.json15
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
+ }
+}