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.
Files changed (55) hide show
  1. package/dist/esm/core/index.js +5 -5
  2. package/dist/esm/index.js +3 -3
  3. package/dist/esm/transformer/ts-transformer.js +1 -1
  4. package/dist/esm/transformer/vite-plugin.js +1 -1
  5. package/package.json +20 -21
  6. package/dist/cjs/core/emitArrayOrTuple.d.ts +0 -6
  7. package/dist/cjs/core/emitArrayOrTuple.js +0 -40
  8. package/dist/cjs/core/emitLiteralOrEnum.d.ts +0 -4
  9. package/dist/cjs/core/emitLiteralOrEnum.js +0 -47
  10. package/dist/cjs/core/emitObject.d.ts +0 -6
  11. package/dist/cjs/core/emitObject.js +0 -28
  12. package/dist/cjs/core/emitPrimitive.d.ts +0 -6
  13. package/dist/cjs/core/emitPrimitive.js +0 -29
  14. package/dist/cjs/core/emitUnionOrIntersection.d.ts +0 -6
  15. package/dist/cjs/core/emitUnionOrIntersection.js +0 -15
  16. package/dist/cjs/core/index.d.ts +0 -17
  17. package/dist/cjs/core/index.js +0 -41
  18. package/dist/cjs/index.d.ts +0 -3
  19. package/dist/cjs/index.js +0 -13
  20. package/dist/cjs/runtime/validate.d.ts +0 -10
  21. package/dist/cjs/runtime/validate.js +0 -18
  22. package/dist/cjs/transformer/ts-transformer.d.ts +0 -25
  23. package/dist/cjs/transformer/ts-transformer.js +0 -103
  24. package/dist/cjs/transformer/vite-plugin.d.ts +0 -18
  25. package/dist/cjs/transformer/vite-plugin.js +0 -137
  26. package/dist/core/emitArrayOrTuple.d.ts +0 -6
  27. package/dist/core/emitArrayOrTuple.js +0 -38
  28. package/dist/core/emitArrayOrTuple.js.map +0 -1
  29. package/dist/core/emitLiteralOrEnum.d.ts +0 -4
  30. package/dist/core/emitLiteralOrEnum.js +0 -42
  31. package/dist/core/emitLiteralOrEnum.js.map +0 -1
  32. package/dist/core/emitObject.d.ts +0 -6
  33. package/dist/core/emitObject.js +0 -23
  34. package/dist/core/emitObject.js.map +0 -1
  35. package/dist/core/emitPrimitive.d.ts +0 -6
  36. package/dist/core/emitPrimitive.js +0 -24
  37. package/dist/core/emitPrimitive.js.map +0 -1
  38. package/dist/core/emitUnionOrIntersection.d.ts +0 -6
  39. package/dist/core/emitUnionOrIntersection.js +0 -13
  40. package/dist/core/emitUnionOrIntersection.js.map +0 -1
  41. package/dist/core/index.d.ts +0 -17
  42. package/dist/core/index.js +0 -37
  43. package/dist/core/index.js.map +0 -1
  44. package/dist/index.d.ts +0 -3
  45. package/dist/index.js +0 -4
  46. package/dist/index.js.map +0 -1
  47. package/dist/runtime/validate.d.ts +0 -10
  48. package/dist/runtime/validate.js +0 -15
  49. package/dist/runtime/validate.js.map +0 -1
  50. package/dist/transformer/ts-transformer.d.ts +0 -25
  51. package/dist/transformer/ts-transformer.js +0 -98
  52. package/dist/transformer/ts-transformer.js.map +0 -1
  53. package/dist/transformer/vite-plugin.d.ts +0 -18
  54. package/dist/transformer/vite-plugin.js +0 -132
  55. 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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"}