shapedef 1.0.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.
Files changed (149) hide show
  1. package/.gitignore +232 -0
  2. package/CLAUDE.md +41 -0
  3. package/README.md +2 -0
  4. package/dist/cjs/common/guards.d.ts +5 -0
  5. package/dist/cjs/common/guards.d.ts.map +1 -0
  6. package/dist/cjs/common/guards.js +22 -0
  7. package/dist/cjs/common/guards.js.map +1 -0
  8. package/dist/cjs/common/index.d.ts +3 -0
  9. package/dist/cjs/common/index.d.ts.map +1 -0
  10. package/dist/cjs/common/index.js +19 -0
  11. package/dist/cjs/common/index.js.map +1 -0
  12. package/dist/cjs/common/padding.d.ts +2 -0
  13. package/dist/cjs/common/padding.d.ts.map +1 -0
  14. package/dist/cjs/common/padding.js +8 -0
  15. package/dist/cjs/common/padding.js.map +1 -0
  16. package/dist/cjs/common/types.d.ts +8 -0
  17. package/dist/cjs/common/types.d.ts.map +1 -0
  18. package/dist/cjs/common/types.js +3 -0
  19. package/dist/cjs/common/types.js.map +1 -0
  20. package/dist/cjs/index.d.ts +5 -0
  21. package/dist/cjs/index.d.ts.map +1 -0
  22. package/dist/cjs/index.js +21 -0
  23. package/dist/cjs/index.js.map +1 -0
  24. package/dist/cjs/inputs/index.d.ts +2 -0
  25. package/dist/cjs/inputs/index.d.ts.map +1 -0
  26. package/dist/cjs/inputs/index.js +18 -0
  27. package/dist/cjs/inputs/index.js.map +1 -0
  28. package/dist/cjs/inputs/json-schema.d.ts +4 -0
  29. package/dist/cjs/inputs/json-schema.d.ts.map +1 -0
  30. package/dist/cjs/inputs/json-schema.js +306 -0
  31. package/dist/cjs/inputs/json-schema.js.map +1 -0
  32. package/dist/cjs/phantom.d.ts +4 -0
  33. package/dist/cjs/phantom.d.ts.map +1 -0
  34. package/dist/cjs/phantom.js +5 -0
  35. package/dist/cjs/phantom.js.map +1 -0
  36. package/dist/cjs/shape-utils.d.ts +4 -0
  37. package/dist/cjs/shape-utils.d.ts.map +1 -0
  38. package/dist/cjs/shape-utils.js +43 -0
  39. package/dist/cjs/shape-utils.js.map +1 -0
  40. package/dist/cjs/shape.d.ts +169 -0
  41. package/dist/cjs/shape.d.ts.map +1 -0
  42. package/dist/cjs/shape.js +258 -0
  43. package/dist/cjs/shape.js.map +1 -0
  44. package/dist/cjs/translations/index.d.ts +4 -0
  45. package/dist/cjs/translations/index.d.ts.map +1 -0
  46. package/dist/cjs/translations/index.js +20 -0
  47. package/dist/cjs/translations/index.js.map +1 -0
  48. package/dist/cjs/translations/postgres.d.ts +3 -0
  49. package/dist/cjs/translations/postgres.d.ts.map +1 -0
  50. package/dist/cjs/translations/postgres.js +72 -0
  51. package/dist/cjs/translations/postgres.js.map +1 -0
  52. package/dist/cjs/translations/translation.d.ts +3 -0
  53. package/dist/cjs/translations/translation.d.ts.map +1 -0
  54. package/dist/cjs/translations/translation.js +3 -0
  55. package/dist/cjs/translations/translation.js.map +1 -0
  56. package/dist/cjs/translations/typescript.d.ts +3 -0
  57. package/dist/cjs/translations/typescript.d.ts.map +1 -0
  58. package/dist/cjs/translations/typescript.js +122 -0
  59. package/dist/cjs/translations/typescript.js.map +1 -0
  60. package/dist/cjs/validation.d.ts +10 -0
  61. package/dist/cjs/validation.d.ts.map +1 -0
  62. package/dist/cjs/validation.js +101 -0
  63. package/dist/cjs/validation.js.map +1 -0
  64. package/dist/esm/common/guards.d.ts +5 -0
  65. package/dist/esm/common/guards.d.ts.map +1 -0
  66. package/dist/esm/common/guards.js +22 -0
  67. package/dist/esm/common/guards.js.map +1 -0
  68. package/dist/esm/common/index.d.ts +3 -0
  69. package/dist/esm/common/index.d.ts.map +1 -0
  70. package/dist/esm/common/index.js +19 -0
  71. package/dist/esm/common/index.js.map +1 -0
  72. package/dist/esm/common/padding.d.ts +2 -0
  73. package/dist/esm/common/padding.d.ts.map +1 -0
  74. package/dist/esm/common/padding.js +8 -0
  75. package/dist/esm/common/padding.js.map +1 -0
  76. package/dist/esm/common/types.d.ts +8 -0
  77. package/dist/esm/common/types.d.ts.map +1 -0
  78. package/dist/esm/common/types.js +3 -0
  79. package/dist/esm/common/types.js.map +1 -0
  80. package/dist/esm/index.d.ts +5 -0
  81. package/dist/esm/index.d.ts.map +1 -0
  82. package/dist/esm/index.js +21 -0
  83. package/dist/esm/index.js.map +1 -0
  84. package/dist/esm/inputs/index.d.ts +2 -0
  85. package/dist/esm/inputs/index.d.ts.map +1 -0
  86. package/dist/esm/inputs/index.js +18 -0
  87. package/dist/esm/inputs/index.js.map +1 -0
  88. package/dist/esm/inputs/json-schema.d.ts +4 -0
  89. package/dist/esm/inputs/json-schema.d.ts.map +1 -0
  90. package/dist/esm/inputs/json-schema.js +306 -0
  91. package/dist/esm/inputs/json-schema.js.map +1 -0
  92. package/dist/esm/package.json +1 -0
  93. package/dist/esm/phantom.d.ts +4 -0
  94. package/dist/esm/phantom.d.ts.map +1 -0
  95. package/dist/esm/phantom.js +5 -0
  96. package/dist/esm/phantom.js.map +1 -0
  97. package/dist/esm/shape-utils.d.ts +4 -0
  98. package/dist/esm/shape-utils.d.ts.map +1 -0
  99. package/dist/esm/shape-utils.js +43 -0
  100. package/dist/esm/shape-utils.js.map +1 -0
  101. package/dist/esm/shape.d.ts +169 -0
  102. package/dist/esm/shape.d.ts.map +1 -0
  103. package/dist/esm/shape.js +258 -0
  104. package/dist/esm/shape.js.map +1 -0
  105. package/dist/esm/translations/index.d.ts +4 -0
  106. package/dist/esm/translations/index.d.ts.map +1 -0
  107. package/dist/esm/translations/index.js +20 -0
  108. package/dist/esm/translations/index.js.map +1 -0
  109. package/dist/esm/translations/postgres.d.ts +3 -0
  110. package/dist/esm/translations/postgres.d.ts.map +1 -0
  111. package/dist/esm/translations/postgres.js +72 -0
  112. package/dist/esm/translations/postgres.js.map +1 -0
  113. package/dist/esm/translations/translation.d.ts +3 -0
  114. package/dist/esm/translations/translation.d.ts.map +1 -0
  115. package/dist/esm/translations/translation.js +3 -0
  116. package/dist/esm/translations/translation.js.map +1 -0
  117. package/dist/esm/translations/typescript.d.ts +3 -0
  118. package/dist/esm/translations/typescript.d.ts.map +1 -0
  119. package/dist/esm/translations/typescript.js +122 -0
  120. package/dist/esm/translations/typescript.js.map +1 -0
  121. package/dist/esm/validation.d.ts +10 -0
  122. package/dist/esm/validation.d.ts.map +1 -0
  123. package/dist/esm/validation.js +101 -0
  124. package/dist/esm/validation.js.map +1 -0
  125. package/package.json +44 -0
  126. package/pnpm-lock.yaml +969 -0
  127. package/src/common/guards.ts +23 -0
  128. package/src/common/index.ts +2 -0
  129. package/src/common/padding.ts +6 -0
  130. package/src/common/types.ts +21 -0
  131. package/src/index.ts +4 -0
  132. package/src/inputs/index.ts +1 -0
  133. package/src/inputs/json-schema.test.ts +191 -0
  134. package/src/inputs/json-schema.ts +324 -0
  135. package/src/phantom.ts +3 -0
  136. package/src/samples/bank.sample.ts +25 -0
  137. package/src/shape-utils.ts +46 -0
  138. package/src/shape.ts +488 -0
  139. package/src/translations/index.ts +3 -0
  140. package/src/translations/postgres.test.ts +161 -0
  141. package/src/translations/postgres.ts +73 -0
  142. package/src/translations/translation.ts +3 -0
  143. package/src/translations/typescript.test.ts +61 -0
  144. package/src/translations/typescript.ts +142 -0
  145. package/src/validation.test.ts +179 -0
  146. package/src/validation.ts +135 -0
  147. package/tsconfig.cjs.json +10 -0
  148. package/tsconfig.esm.json +10 -0
  149. package/tsconfig.json +22 -0
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.typescript = void 0;
4
+ const padding_1 = require("../common/padding");
5
+ const incDepth = (ctx) => ({ ...ctx, depth: ctx.depth + 1 });
6
+ const maybeTypeAlias = (shape, ctx, out) => {
7
+ if (ctx.depth > 0)
8
+ return out;
9
+ const name = shape.anno.name || shape.anno.title;
10
+ if (name && !name.includes(" "))
11
+ return `export type ${name} = ${out}`;
12
+ return out;
13
+ };
14
+ const toBatched = (arr, batchSize) => {
15
+ const batches = [];
16
+ for (let i = 0; i < arr.length; i += batchSize) {
17
+ batches.push(arr.slice(i, i + batchSize));
18
+ }
19
+ return batches;
20
+ };
21
+ const createComments = (shape) => {
22
+ const parts = [];
23
+ const description = (shape.anno.description || "").trim();
24
+ if (description.length > 0) {
25
+ const chars = Array.from(description.trim());
26
+ const batches = toBatched(chars, 80);
27
+ const lines = batches.map((x) => x.join(""));
28
+ parts.push(...lines);
29
+ }
30
+ if (typeof shape.anno.min === "number") {
31
+ parts.push(`min: ${shape.anno.min}`);
32
+ }
33
+ if (typeof shape.anno.max === "number") {
34
+ parts.push(`max: ${shape.anno.max}`);
35
+ }
36
+ return parts;
37
+ };
38
+ const ts = (shape, ctx) => {
39
+ switch (shape.type) {
40
+ case "vector":
41
+ return "number[]";
42
+ case "number":
43
+ return "number";
44
+ case "int":
45
+ return "number";
46
+ case "float":
47
+ return "number";
48
+ case "str":
49
+ return "string";
50
+ case "bool":
51
+ return "boolean";
52
+ case "date":
53
+ return "Date";
54
+ case "nil":
55
+ return "null";
56
+ case "unknown":
57
+ return "unknown";
58
+ case "literal-number":
59
+ return `${shape.value}`;
60
+ case "literal-int":
61
+ return `${shape.value}`;
62
+ case "literal-float":
63
+ return `${shape.value}`;
64
+ case "literal-str":
65
+ return `'${shape.value}'`;
66
+ case "literal-bool":
67
+ return `${shape.value}`;
68
+ case "ref":
69
+ return shape.name
70
+ .replaceAll("#/definitions/", "")
71
+ .replaceAll("#/$defs/", "")
72
+ .replaceAll("-", "_");
73
+ case "array":
74
+ return maybeTypeAlias(shape, ctx, `Array<${ts(shape.item, incDepth(ctx))}>`);
75
+ case "tuple":
76
+ return `[${shape.tup.map((x) => ts(x, incDepth(ctx))).join(", ")}]`;
77
+ case "union":
78
+ return maybeTypeAlias(shape, ctx, Array.from(new Set(shape.ofs.map((x) => ts(x, incDepth(ctx))))).join(" | "));
79
+ case "mapping": {
80
+ const parts = [];
81
+ const members = [];
82
+ const name = shape.anno.name;
83
+ if (name) {
84
+ const replaced = name.replaceAll("-", "_");
85
+ parts.push(`export interface ${replaced} `);
86
+ }
87
+ parts.push("{");
88
+ parts.push("\n");
89
+ for (const [k, v] of Object.entries(shape.rec)) {
90
+ const member = [];
91
+ const comments = createComments(v);
92
+ if (comments.length > 0) {
93
+ member.push((0, padding_1.mkpad)(ctx.padding + 2) + "/**");
94
+ member.push("\n");
95
+ member.push(comments
96
+ .map((cmt) => `${(0, padding_1.mkpad)(ctx.padding + 2)}* ${cmt}`)
97
+ .join("\n"));
98
+ member.push("\n");
99
+ member.push((0, padding_1.mkpad)(ctx.padding + 2) + "**/");
100
+ member.push("\n");
101
+ }
102
+ member.push((0, padding_1.mkpad)(ctx.padding + 2));
103
+ member.push(k);
104
+ if (v.anno.optional)
105
+ member.push("?");
106
+ member.push(": ");
107
+ member.push(ts(v, incDepth({ ...ctx, padding: ctx.padding + 2 })));
108
+ members.push(member.join(""));
109
+ }
110
+ parts.push(members.join(",\n"));
111
+ parts.push("\n");
112
+ parts.push((0, padding_1.mkpad)(ctx.padding));
113
+ parts.push("}");
114
+ return parts.join("");
115
+ }
116
+ }
117
+ };
118
+ const typescript = (shape) => {
119
+ return ts(shape, { padding: 0, depth: 0 });
120
+ };
121
+ exports.typescript = typescript;
122
+ //# sourceMappingURL=typescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../src/translations/typescript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Shape } from "./shape";
2
+ export type ValidationResult = {
3
+ ok: true;
4
+ } | {
5
+ ok: false;
6
+ error: string;
7
+ path: PropertyKey[];
8
+ };
9
+ export declare function validate(x: unknown, shape: Shape): ValidationResult;
10
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,MAAM,gBAAgB,GACxB;IACE,EAAE,EAAE,IAAI,CAAC;CACV,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB,CAAC;AAkBN,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,gBAAgB,CAyGnE"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validate = validate;
4
+ const common_1 = require("./common");
5
+ const ok = () => ({ ok: true });
6
+ const err = (error, path) => ({
7
+ ok: false,
8
+ error,
9
+ path,
10
+ });
11
+ const maybe = (result, error, path) => (result ? ok() : err(error, path));
12
+ function validate(x, shape) {
13
+ function check(x, shape, path) {
14
+ switch (shape.type) {
15
+ case "literal-bool":
16
+ case "literal-str":
17
+ case "literal-int":
18
+ case "literal-float":
19
+ case "literal-number":
20
+ return maybe(x === shape.value, `expected literal ${shape.value}`, path);
21
+ case "str":
22
+ return maybe(typeof x === "string", "expected a string", path);
23
+ case "bool":
24
+ return maybe(typeof x === "boolean", "expected a boolean", path);
25
+ case "int":
26
+ return maybe(typeof x === "number" && Number.isInteger(x), "expected an integer", path);
27
+ case "float":
28
+ return maybe(typeof x === "number" && !Number.isInteger(x), "expected a float", path);
29
+ case "number":
30
+ return maybe(typeof x === "number", "expected a number", path);
31
+ case "nil":
32
+ return maybe(x === null, "expected null", path);
33
+ case "date":
34
+ return maybe(x instanceof Date, "expected a date", path);
35
+ case "unknown":
36
+ return ok();
37
+ case "array": {
38
+ if (!Array.isArray(x))
39
+ return err("expected an array", path);
40
+ for (let i = 0; i < x.length; i++) {
41
+ const item = x[i];
42
+ const result = check(item, shape.item, [...path, i]);
43
+ if (!result.ok)
44
+ return result;
45
+ }
46
+ return ok();
47
+ }
48
+ case "mapping": {
49
+ if (!(0, common_1.isPlainObject)(x))
50
+ return err("expected a plain object", path);
51
+ for (const [k, v] of Object.entries(shape.rec)) {
52
+ if (!(0, common_1.has)(x, k) || typeof x[k] === "undefined") {
53
+ if (v.anno.optional || v.type === "unknown")
54
+ continue;
55
+ return err(`expected property ${k} to exist`, [...path, k]);
56
+ }
57
+ const result = check(x[k], v, [...path, k]);
58
+ if (!result.ok)
59
+ return result;
60
+ }
61
+ return ok();
62
+ }
63
+ case "ref":
64
+ return err(`cannot validate ref`, path);
65
+ case "tuple": {
66
+ if (!Array.isArray(x))
67
+ return err("expected a tuple / array", path);
68
+ if (x.length !== shape.tup.length)
69
+ return err(`expected a tuple of length ${shape.tup.length} but got a tuple / array of length ${x.length}`, path);
70
+ for (let i = 0; i < shape.tup.length; i++) {
71
+ const v = shape.tup[i];
72
+ const result = check(x[i], v, [...path, i]);
73
+ if (!result.ok)
74
+ return result;
75
+ }
76
+ return ok();
77
+ }
78
+ case "vector": {
79
+ if (!Array.isArray(x))
80
+ return err(`expected an array (vector)`, path);
81
+ if (x.length !== shape.dims)
82
+ return err(`expected a vector with dimension ${shape.dims} but got dimensions ${x.length}`, path);
83
+ if (!x.every((v) => typeof v === "number"))
84
+ return err(`expected a numeric vector but it contained other types`, path);
85
+ return ok();
86
+ }
87
+ case "union": {
88
+ let lastResult = ok();
89
+ for (const v of shape.ofs) {
90
+ const result = check(x, v, path);
91
+ if (result.ok)
92
+ return ok();
93
+ lastResult = result;
94
+ }
95
+ return lastResult;
96
+ }
97
+ }
98
+ }
99
+ return check(x, shape, []);
100
+ }
101
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "shapedef",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "./dist/cjs/index.js",
6
+ "types": "./dist/cjs/index.d.ts",
7
+ "typings": "./dist/cjs/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": {
11
+ "types": "./dist/esm/index.d.ts",
12
+ "default": "./dist/esm/index.js"
13
+ },
14
+ "require": {
15
+ "types": "./dist/cjs/index.d.ts",
16
+ "default": "./dist/cjs/index.js"
17
+ },
18
+ "default": {
19
+ "types": "./dist/cjs/index.d.ts",
20
+ "default": "./dist/cjs/index.js"
21
+ }
22
+ }
23
+ },
24
+ "keywords": [],
25
+ "author": "",
26
+ "license": "ISC",
27
+ "files": [
28
+ "*",
29
+ "./dist/**/*"
30
+ ],
31
+ "devDependencies": {
32
+ "@types/node": "^25.3.0",
33
+ "prettier": "^3.8.1",
34
+ "tsx": "^4.21.0",
35
+ "typescript": "^5.9.3",
36
+ "vitest": "^4.0.18"
37
+ },
38
+ "scripts": {
39
+ "test": "vitest",
40
+ "build": "tsc -p tsconfig.esm.json && echo '{\"type\":\"module\"}' > dist/esm/package.json && tsc -p tsconfig.cjs.json",
41
+ "check": "tsc -p ./tsconfig.json --noEmit",
42
+ "format": "prettier --experimental-ternaries ./src --write"
43
+ }
44
+ }