@flink-app/ts-source-to-json-schema 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,192 @@
1
+ // ============================================================================
2
+ // Tokenizer - Breaks TypeScript source into a stream of tokens
3
+ // ============================================================================
4
+ const KEYWORDS = new Set([
5
+ "interface", "type", "export", "extends", "enum", "const", "readonly",
6
+ "import", "from", "as",
7
+ ]);
8
+ const PRIMITIVES = new Set([
9
+ "string", "number", "boolean", "null", "undefined",
10
+ "any", "unknown", "never", "void", "object", "bigint",
11
+ "true", "false",
12
+ ]);
13
+ const PUNCTUATION = new Set([
14
+ "{", "}", "(", ")", "[", "]", ":", ";", ",", "?", "|", "&", "=", "<", ">", ".", "*",
15
+ ]);
16
+ export function tokenize(source) {
17
+ const tokens = [];
18
+ let i = 0;
19
+ let line = 1;
20
+ let col = 1;
21
+ function peek(offset = 0) {
22
+ return source[i + offset] ?? "";
23
+ }
24
+ function advance(count = 1) {
25
+ let result = "";
26
+ for (let j = 0; j < count; j++) {
27
+ const ch = source[i];
28
+ if (ch === "\n") {
29
+ line++;
30
+ col = 1;
31
+ }
32
+ else {
33
+ col++;
34
+ }
35
+ result += ch;
36
+ i++;
37
+ }
38
+ return result;
39
+ }
40
+ function skipWhitespace() {
41
+ while (i < source.length && /[ \t\r]/.test(peek())) {
42
+ advance();
43
+ }
44
+ }
45
+ function readString(quote) {
46
+ advance(); // opening quote
47
+ let value = "";
48
+ while (i < source.length && peek() !== quote) {
49
+ if (peek() === "\\") {
50
+ advance(); // backslash
51
+ value += advance(); // escaped char
52
+ }
53
+ else {
54
+ value += advance();
55
+ }
56
+ }
57
+ if (i < source.length)
58
+ advance(); // closing quote
59
+ return value;
60
+ }
61
+ function readJSDoc() {
62
+ // We're at '/', next is '*', then '*'
63
+ let value = "";
64
+ advance(); // /
65
+ advance(); // *
66
+ advance(); // *
67
+ while (i < source.length) {
68
+ if (peek() === "*" && peek(1) === "/") {
69
+ advance(); // *
70
+ advance(); // /
71
+ break;
72
+ }
73
+ value += advance();
74
+ }
75
+ return value.trim();
76
+ }
77
+ function readLineComment() {
78
+ // Skip // comments
79
+ while (i < source.length && peek() !== "\n") {
80
+ advance();
81
+ }
82
+ }
83
+ function readBlockComment() {
84
+ advance(); // /
85
+ advance(); // *
86
+ while (i < source.length) {
87
+ if (peek() === "*" && peek(1) === "/") {
88
+ advance(); // *
89
+ advance(); // /
90
+ return;
91
+ }
92
+ advance();
93
+ }
94
+ }
95
+ function readWord() {
96
+ let word = "";
97
+ while (i < source.length && /[a-zA-Z0-9_$]/.test(peek())) {
98
+ word += advance();
99
+ }
100
+ return word;
101
+ }
102
+ function readNumber() {
103
+ let num = "";
104
+ // Handle negative numbers
105
+ if (peek() === "-") {
106
+ num += advance();
107
+ }
108
+ while (i < source.length && /[0-9.]/.test(peek())) {
109
+ num += advance();
110
+ }
111
+ return num;
112
+ }
113
+ while (i < source.length) {
114
+ skipWhitespace();
115
+ if (i >= source.length)
116
+ break;
117
+ const startLine = line;
118
+ const startCol = col;
119
+ const ch = peek();
120
+ // Newlines
121
+ if (ch === "\n") {
122
+ advance();
123
+ tokens.push({ type: "newline", value: "\n", line: startLine, col: startCol });
124
+ continue;
125
+ }
126
+ // JSDoc comments: /** ... */
127
+ if (ch === "/" && peek(1) === "*" && peek(2) === "*" && peek(3) !== "/") {
128
+ const value = readJSDoc();
129
+ tokens.push({ type: "jsdoc", value, line: startLine, col: startCol });
130
+ continue;
131
+ }
132
+ // Block comments: /* ... */
133
+ if (ch === "/" && peek(1) === "*") {
134
+ readBlockComment();
135
+ continue;
136
+ }
137
+ // Line comments: // ...
138
+ if (ch === "/" && peek(1) === "/") {
139
+ readLineComment();
140
+ continue;
141
+ }
142
+ // Strings
143
+ if (ch === '"' || ch === "'") {
144
+ const value = readString(ch);
145
+ tokens.push({ type: "string", value, line: startLine, col: startCol });
146
+ continue;
147
+ }
148
+ // Template literal (backtick) - read as string for now
149
+ if (ch === "`") {
150
+ advance(); // opening backtick
151
+ let value = "";
152
+ while (i < source.length && peek() !== "`") {
153
+ value += advance();
154
+ }
155
+ if (i < source.length)
156
+ advance(); // closing backtick
157
+ tokens.push({ type: "string", value, line: startLine, col: startCol });
158
+ continue;
159
+ }
160
+ // Numbers
161
+ if (/[0-9]/.test(ch) || (ch === "-" && /[0-9]/.test(peek(1)))) {
162
+ const value = readNumber();
163
+ tokens.push({ type: "number", value, line: startLine, col: startCol });
164
+ continue;
165
+ }
166
+ // Words (keywords, primitives, identifiers)
167
+ if (/[a-zA-Z_$]/.test(ch)) {
168
+ const word = readWord();
169
+ if (PRIMITIVES.has(word)) {
170
+ tokens.push({ type: "primitive", value: word, line: startLine, col: startCol });
171
+ }
172
+ else if (KEYWORDS.has(word)) {
173
+ tokens.push({ type: "keyword", value: word, line: startLine, col: startCol });
174
+ }
175
+ else {
176
+ tokens.push({ type: "identifier", value: word, line: startLine, col: startCol });
177
+ }
178
+ continue;
179
+ }
180
+ // Punctuation
181
+ if (PUNCTUATION.has(ch)) {
182
+ advance();
183
+ tokens.push({ type: "punctuation", value: ch, line: startLine, col: startCol });
184
+ continue;
185
+ }
186
+ // Unknown character - skip
187
+ advance();
188
+ }
189
+ tokens.push({ type: "eof", value: "", line, col });
190
+ return tokens;
191
+ }
192
+ //# sourceMappingURL=tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../src/tokenizer.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@flink-app/ts-source-to-json-schema",
3
+ "version": "0.1.0",
4
+ "description": "A zero-dependency TypeScript-to-JSON Schema converter that uses its own mini-parser",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "ts-source-to-json-schema": "./dist/cli.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.js",
15
+ "types": "./dist/index.d.ts"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist/**/*",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc",
25
+ "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
26
+ "test:watch": "npm test -- --watch",
27
+ "test:coverage": "npm test -- --coverage",
28
+ "test:legacy": "tsx src/test.ts",
29
+ "dev": "tsx src/index.ts",
30
+ "clean": "rm -rf dist coverage",
31
+ "prepublishOnly": "npm run clean && npm run build && npm test"
32
+ },
33
+ "keywords": [
34
+ "typescript",
35
+ "json-schema",
36
+ "parser",
37
+ "converter",
38
+ "validation"
39
+ ],
40
+ "author": "",
41
+ "license": "MIT",
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "git+https://github.com/yourusername/ts-source-to-json-schema.git"
45
+ },
46
+ "bugs": {
47
+ "url": "https://github.com/yourusername/ts-source-to-json-schema/issues"
48
+ },
49
+ "homepage": "https://github.com/yourusername/ts-source-to-json-schema#readme",
50
+ "devDependencies": {
51
+ "@jest/globals": "^30.2.0",
52
+ "@types/jest": "^30.0.0",
53
+ "@types/node": "^25.3.0",
54
+ "jest": "^30.2.0",
55
+ "ts-jest": "^29.4.6",
56
+ "tsx": "^4.7.0",
57
+ "typescript": "^5.3.3"
58
+ }
59
+ }