runtypex 0.1.3 → 0.1.5
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.
- package/dist/esm/core/index.js +5 -5
- package/dist/esm/index.js +3 -3
- package/dist/esm/transformer/ts-transformer.js +1 -1
- package/dist/esm/transformer/vite-plugin.js +1 -1
- package/package.json +20 -21
- package/dist/cjs/core/emitArrayOrTuple.d.ts +0 -6
- package/dist/cjs/core/emitArrayOrTuple.js +0 -40
- package/dist/cjs/core/emitLiteralOrEnum.d.ts +0 -4
- package/dist/cjs/core/emitLiteralOrEnum.js +0 -47
- package/dist/cjs/core/emitObject.d.ts +0 -6
- package/dist/cjs/core/emitObject.js +0 -28
- package/dist/cjs/core/emitPrimitive.d.ts +0 -6
- package/dist/cjs/core/emitPrimitive.js +0 -29
- package/dist/cjs/core/emitUnionOrIntersection.d.ts +0 -6
- package/dist/cjs/core/emitUnionOrIntersection.js +0 -15
- package/dist/cjs/core/index.d.ts +0 -17
- package/dist/cjs/core/index.js +0 -41
- package/dist/cjs/index.d.ts +0 -3
- package/dist/cjs/index.js +0 -13
- package/dist/cjs/runtime/validate.d.ts +0 -10
- package/dist/cjs/runtime/validate.js +0 -18
- package/dist/cjs/transformer/ts-transformer.d.ts +0 -25
- package/dist/cjs/transformer/ts-transformer.js +0 -103
- package/dist/cjs/transformer/vite-plugin.d.ts +0 -18
- package/dist/cjs/transformer/vite-plugin.js +0 -137
- package/dist/core/emitArrayOrTuple.d.ts +0 -6
- package/dist/core/emitArrayOrTuple.js +0 -38
- package/dist/core/emitArrayOrTuple.js.map +0 -1
- package/dist/core/emitLiteralOrEnum.d.ts +0 -4
- package/dist/core/emitLiteralOrEnum.js +0 -42
- package/dist/core/emitLiteralOrEnum.js.map +0 -1
- package/dist/core/emitObject.d.ts +0 -6
- package/dist/core/emitObject.js +0 -23
- package/dist/core/emitObject.js.map +0 -1
- package/dist/core/emitPrimitive.d.ts +0 -6
- package/dist/core/emitPrimitive.js +0 -24
- package/dist/core/emitPrimitive.js.map +0 -1
- package/dist/core/emitUnionOrIntersection.d.ts +0 -6
- package/dist/core/emitUnionOrIntersection.js +0 -13
- package/dist/core/emitUnionOrIntersection.js.map +0 -1
- package/dist/core/index.d.ts +0 -17
- package/dist/core/index.js +0 -37
- package/dist/core/index.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.js +0 -4
- package/dist/index.js.map +0 -1
- package/dist/runtime/validate.d.ts +0 -10
- package/dist/runtime/validate.js +0 -15
- package/dist/runtime/validate.js.map +0 -1
- package/dist/transformer/ts-transformer.d.ts +0 -25
- package/dist/transformer/ts-transformer.js +0 -98
- package/dist/transformer/ts-transformer.js.map +0 -1
- package/dist/transformer/vite-plugin.d.ts +0 -18
- package/dist/transformer/vite-plugin.js +0 -132
- package/dist/transformer/vite-plugin.js.map +0 -1
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import ts from "typescript";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { emitGuardFromType } from "../core";
|
|
4
|
-
/**
|
|
5
|
-
* 🧩 vitePluginRuntypex
|
|
6
|
-
* A Vite plugin that performs build-time type → runtime validation transformation.
|
|
7
|
-
*
|
|
8
|
-
* 📘 Purpose
|
|
9
|
-
* - Replace calls like:
|
|
10
|
-
* makeValidate<T>(), makeAssert<T>()
|
|
11
|
-
* with *inline JavaScript guard functions* derived from TypeScript types.
|
|
12
|
-
*
|
|
13
|
-
* 💡 Features
|
|
14
|
-
* - Works in both dev & build mode
|
|
15
|
-
* - Optional: remove validation code in production (`removeInProd`)
|
|
16
|
-
* - Compatible with Rollup / Webpack (via Vite plugin API)
|
|
17
|
-
*/
|
|
18
|
-
export default function vitePluginRuntypex(options) {
|
|
19
|
-
const removeInProd = !!options?.removeInProd;
|
|
20
|
-
const prod = process.env.NODE_ENV === "production";
|
|
21
|
-
return {
|
|
22
|
-
name: "vite-plugin-runtypex",
|
|
23
|
-
enforce: "pre",
|
|
24
|
-
transform(code, id) {
|
|
25
|
-
const isTS = id.endsWith(".ts") || id.endsWith(".tsx");
|
|
26
|
-
const isTargetFunction = /make(?:Validate|Assert)</.test(code);
|
|
27
|
-
if (!isTS || !isTargetFunction)
|
|
28
|
-
return;
|
|
29
|
-
const { program, checker } = _createProgramFor(id);
|
|
30
|
-
const sf = program.getSourceFile(id);
|
|
31
|
-
if (!sf)
|
|
32
|
-
return;
|
|
33
|
-
let mutated = code;
|
|
34
|
-
// ② makeAssert<T>()
|
|
35
|
-
mutated = mutated.replace(/makeAssert<\s*([^>]+)\s*>\s*\(\s*\)/g, (_m, typeName) => _emitMakeAssert({ program, checker, sf, typeName, prod, removeInProd }) ?? _m);
|
|
36
|
-
// ③ makeValidate<T>()
|
|
37
|
-
mutated = mutated.replace(/makeValidate<\s*([^>]+)\s*>\s*\(\s*\)/g, (_m, typeName) => _emitMakeValidate({ program, checker, sf, typeName, prod, removeInProd }) ?? _m);
|
|
38
|
-
return mutated === code ? null : { code: mutated, map: null };
|
|
39
|
-
},
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
// ──────────────────────────────────────────────
|
|
43
|
-
// ① createProgram & TypeChecker
|
|
44
|
-
// ──────────────────────────────────────────────
|
|
45
|
-
function _createProgramFor(file) {
|
|
46
|
-
const tsconfig = _findNearestTsconfig(path.dirname(file));
|
|
47
|
-
const cfg = ts.readConfigFile(tsconfig, ts.sys.readFile);
|
|
48
|
-
if (cfg.error) {
|
|
49
|
-
throw new Error(ts.flattenDiagnosticMessageText(cfg.error.messageText, "\n"));
|
|
50
|
-
}
|
|
51
|
-
const parsed = ts.parseJsonConfigFileContent(cfg.config, ts.sys, path.dirname(tsconfig));
|
|
52
|
-
const program = ts.createProgram({ rootNames: parsed.fileNames, options: parsed.options });
|
|
53
|
-
const checker = program.getTypeChecker();
|
|
54
|
-
return { program, checker };
|
|
55
|
-
}
|
|
56
|
-
function _findNearestTsconfig(start) {
|
|
57
|
-
let dir = start;
|
|
58
|
-
while (true) {
|
|
59
|
-
const candidate = path.join(dir, "tsconfig.json");
|
|
60
|
-
if (ts.sys.fileExists(candidate))
|
|
61
|
-
return candidate;
|
|
62
|
-
const parent = path.dirname(dir);
|
|
63
|
-
if (parent === dir)
|
|
64
|
-
break;
|
|
65
|
-
dir = parent;
|
|
66
|
-
}
|
|
67
|
-
const fallback = path.join(process.cwd(), "tsconfig.json");
|
|
68
|
-
if (ts.sys.fileExists(fallback))
|
|
69
|
-
return fallback;
|
|
70
|
-
throw new Error("tsconfig.json not found");
|
|
71
|
-
}
|
|
72
|
-
function _emitMakeValidate({ program, checker, sf, typeName, prod, removeInProd, }) {
|
|
73
|
-
if (removeInProd && prod)
|
|
74
|
-
return `((_)=>true)`;
|
|
75
|
-
const type = _resolveTypeByName(program, sf, checker, typeName.trim());
|
|
76
|
-
if (!type)
|
|
77
|
-
return null;
|
|
78
|
-
return emitGuardFromType(checker, type);
|
|
79
|
-
}
|
|
80
|
-
function _emitMakeAssert({ program, checker, sf, typeName, prod, removeInProd, }) {
|
|
81
|
-
if (removeInProd && prod)
|
|
82
|
-
return `((_)=>{})`;
|
|
83
|
-
const type = _resolveTypeByName(program, sf, checker, typeName.trim());
|
|
84
|
-
if (!type)
|
|
85
|
-
return null;
|
|
86
|
-
const guard = emitGuardFromType(checker, type);
|
|
87
|
-
return `(function(){const G=${guard};return(i)=>{if(!G(i))throw new TypeError("[runtypex] Validation failed.");};})()`;
|
|
88
|
-
}
|
|
89
|
-
// ──────────────────────────────────────────────
|
|
90
|
-
// ③ Type Resolution (support interface/type/enum)
|
|
91
|
-
// ──────────────────────────────────────────────
|
|
92
|
-
function _resolveTypeByName(program, sf, checker, name) {
|
|
93
|
-
// scan all source files for local declaration
|
|
94
|
-
for (const file of program.getSourceFiles()) {
|
|
95
|
-
const decl = _findLocalDeclaration(file, name);
|
|
96
|
-
if (!decl)
|
|
97
|
-
continue;
|
|
98
|
-
// interface / class / enum
|
|
99
|
-
if (ts.isInterfaceDeclaration(decl) || ts.isClassDeclaration(decl) || ts.isEnumDeclaration(decl)) {
|
|
100
|
-
// @ts-ignore
|
|
101
|
-
const symbol = checker.getSymbolAtLocation(decl.name);
|
|
102
|
-
if (symbol)
|
|
103
|
-
return checker.getDeclaredTypeOfSymbol(symbol);
|
|
104
|
-
}
|
|
105
|
-
// type alias
|
|
106
|
-
if (ts.isTypeAliasDeclaration(decl)) {
|
|
107
|
-
return checker.getTypeFromTypeNode(decl.type);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
// Scope-based fallback
|
|
111
|
-
const symbol = checker
|
|
112
|
-
.getSymbolsInScope(sf, ts.SymbolFlags.Type | ts.SymbolFlags.Alias | ts.SymbolFlags.Interface)
|
|
113
|
-
.find((s) => s.name === name);
|
|
114
|
-
return symbol ? checker.getDeclaredTypeOfSymbol(symbol) : null;
|
|
115
|
-
}
|
|
116
|
-
function _findLocalDeclaration(sf, name) {
|
|
117
|
-
let found;
|
|
118
|
-
(function walk(node) {
|
|
119
|
-
if ((ts.isInterfaceDeclaration(node) ||
|
|
120
|
-
ts.isTypeAliasDeclaration(node) ||
|
|
121
|
-
ts.isEnumDeclaration(node) ||
|
|
122
|
-
ts.isClassDeclaration(node)) &&
|
|
123
|
-
node.name?.text === name) {
|
|
124
|
-
found = node;
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
if (!found)
|
|
128
|
-
node.forEachChild(walk);
|
|
129
|
-
})(sf);
|
|
130
|
-
return found;
|
|
131
|
-
}
|
|
132
|
-
//# sourceMappingURL=vite-plugin.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../../src/transformer/vite-plugin.ts"],"names":[],"mappings":"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"}
|