typesea 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.
Files changed (271) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +21 -0
  3. package/README.md +320 -0
  4. package/dist/adapters/index.d.ts +152 -0
  5. package/dist/adapters/index.d.ts.map +1 -0
  6. package/dist/adapters/index.js +396 -0
  7. package/dist/aot/index.d.ts +33 -0
  8. package/dist/aot/index.d.ts.map +1 -0
  9. package/dist/aot/index.js +295 -0
  10. package/dist/async/index.d.ts +111 -0
  11. package/dist/async/index.d.ts.map +1 -0
  12. package/dist/async/index.js +221 -0
  13. package/dist/builders/composite.d.ts +31 -0
  14. package/dist/builders/composite.d.ts.map +1 -0
  15. package/dist/builders/composite.js +165 -0
  16. package/dist/builders/index.d.ts +11 -0
  17. package/dist/builders/index.d.ts.map +1 -0
  18. package/dist/builders/index.js +9 -0
  19. package/dist/builders/modifier.d.ts +26 -0
  20. package/dist/builders/modifier.d.ts.map +1 -0
  21. package/dist/builders/modifier.js +67 -0
  22. package/dist/builders/object/guard.d.ts +62 -0
  23. package/dist/builders/object/guard.d.ts.map +1 -0
  24. package/dist/builders/object/guard.js +113 -0
  25. package/dist/builders/object/index.d.ts +7 -0
  26. package/dist/builders/object/index.d.ts.map +1 -0
  27. package/dist/builders/object/index.js +5 -0
  28. package/dist/builders/object/schema.d.ts +44 -0
  29. package/dist/builders/object/schema.d.ts.map +1 -0
  30. package/dist/builders/object/schema.js +257 -0
  31. package/dist/builders/object/types.d.ts +63 -0
  32. package/dist/builders/object/types.d.ts.map +1 -0
  33. package/dist/builders/object/types.js +5 -0
  34. package/dist/builders/scalar.d.ts +39 -0
  35. package/dist/builders/scalar.d.ts.map +1 -0
  36. package/dist/builders/scalar.js +63 -0
  37. package/dist/builders/table.d.ts +53 -0
  38. package/dist/builders/table.d.ts.map +1 -0
  39. package/dist/builders/table.js +48 -0
  40. package/dist/builders/types.d.ts +26 -0
  41. package/dist/builders/types.d.ts.map +1 -0
  42. package/dist/builders/types.js +5 -0
  43. package/dist/compile/check-composite.d.ts +34 -0
  44. package/dist/compile/check-composite.d.ts.map +1 -0
  45. package/dist/compile/check-composite.js +117 -0
  46. package/dist/compile/check-scalar.d.ts +24 -0
  47. package/dist/compile/check-scalar.d.ts.map +1 -0
  48. package/dist/compile/check-scalar.js +73 -0
  49. package/dist/compile/check.d.ts +15 -0
  50. package/dist/compile/check.d.ts.map +1 -0
  51. package/dist/compile/check.js +98 -0
  52. package/dist/compile/context.d.ts +35 -0
  53. package/dist/compile/context.d.ts.map +1 -0
  54. package/dist/compile/context.js +72 -0
  55. package/dist/compile/graph-predicate.d.ts +19 -0
  56. package/dist/compile/graph-predicate.d.ts.map +1 -0
  57. package/dist/compile/graph-predicate.js +460 -0
  58. package/dist/compile/guard.d.ts +41 -0
  59. package/dist/compile/guard.d.ts.map +1 -0
  60. package/dist/compile/guard.js +180 -0
  61. package/dist/compile/index.d.ts +8 -0
  62. package/dist/compile/index.d.ts.map +1 -0
  63. package/dist/compile/index.js +6 -0
  64. package/dist/compile/issue.d.ts +18 -0
  65. package/dist/compile/issue.d.ts.map +1 -0
  66. package/dist/compile/issue.js +28 -0
  67. package/dist/compile/names.d.ts +16 -0
  68. package/dist/compile/names.d.ts.map +1 -0
  69. package/dist/compile/names.js +82 -0
  70. package/dist/compile/predicate.d.ts +23 -0
  71. package/dist/compile/predicate.d.ts.map +1 -0
  72. package/dist/compile/predicate.js +317 -0
  73. package/dist/compile/runtime.d.ts +55 -0
  74. package/dist/compile/runtime.d.ts.map +1 -0
  75. package/dist/compile/runtime.js +63 -0
  76. package/dist/compile/source.d.ts +11 -0
  77. package/dist/compile/source.d.ts.map +1 -0
  78. package/dist/compile/source.js +51 -0
  79. package/dist/compile/types.d.ts +52 -0
  80. package/dist/compile/types.d.ts.map +1 -0
  81. package/dist/compile/types.js +5 -0
  82. package/dist/decoder/index.d.ts +106 -0
  83. package/dist/decoder/index.d.ts.map +1 -0
  84. package/dist/decoder/index.js +262 -0
  85. package/dist/evaluate/check-composite.d.ts +39 -0
  86. package/dist/evaluate/check-composite.d.ts.map +1 -0
  87. package/dist/evaluate/check-composite.js +184 -0
  88. package/dist/evaluate/check-scalar.d.ts +20 -0
  89. package/dist/evaluate/check-scalar.d.ts.map +1 -0
  90. package/dist/evaluate/check-scalar.js +81 -0
  91. package/dist/evaluate/check.d.ts +11 -0
  92. package/dist/evaluate/check.d.ts.map +1 -0
  93. package/dist/evaluate/check.js +126 -0
  94. package/dist/evaluate/index.d.ts +7 -0
  95. package/dist/evaluate/index.d.ts.map +1 -0
  96. package/dist/evaluate/index.js +6 -0
  97. package/dist/evaluate/issue.d.ts +10 -0
  98. package/dist/evaluate/issue.d.ts.map +1 -0
  99. package/dist/evaluate/issue.js +11 -0
  100. package/dist/evaluate/predicate.d.ts +26 -0
  101. package/dist/evaluate/predicate.d.ts.map +1 -0
  102. package/dist/evaluate/predicate.js +37 -0
  103. package/dist/evaluate/shared.d.ts +59 -0
  104. package/dist/evaluate/shared.d.ts.map +1 -0
  105. package/dist/evaluate/shared.js +96 -0
  106. package/dist/evaluate/state.d.ts +65 -0
  107. package/dist/evaluate/state.d.ts.map +1 -0
  108. package/dist/evaluate/state.js +66 -0
  109. package/dist/guard/base.d.ts +72 -0
  110. package/dist/guard/base.d.ts.map +1 -0
  111. package/dist/guard/base.js +136 -0
  112. package/dist/guard/error.d.ts +19 -0
  113. package/dist/guard/error.d.ts.map +1 -0
  114. package/dist/guard/error.js +22 -0
  115. package/dist/guard/index.d.ts +10 -0
  116. package/dist/guard/index.d.ts.map +1 -0
  117. package/dist/guard/index.js +8 -0
  118. package/dist/guard/number.d.ts +32 -0
  119. package/dist/guard/number.d.ts.map +1 -0
  120. package/dist/guard/number.js +71 -0
  121. package/dist/guard/props.d.ts +18 -0
  122. package/dist/guard/props.d.ts.map +1 -0
  123. package/dist/guard/props.js +35 -0
  124. package/dist/guard/read.d.ts +42 -0
  125. package/dist/guard/read.d.ts.map +1 -0
  126. package/dist/guard/read.js +114 -0
  127. package/dist/guard/registry.d.ts +15 -0
  128. package/dist/guard/registry.d.ts.map +1 -0
  129. package/dist/guard/registry.js +21 -0
  130. package/dist/guard/string.d.ts +36 -0
  131. package/dist/guard/string.d.ts.map +1 -0
  132. package/dist/guard/string.js +95 -0
  133. package/dist/guard/types.d.ts +103 -0
  134. package/dist/guard/types.d.ts.map +1 -0
  135. package/dist/guard/types.js +5 -0
  136. package/dist/index.d.ts +14 -0
  137. package/dist/index.d.ts.map +1 -0
  138. package/dist/index.js +10 -0
  139. package/dist/internal/index.d.ts +34 -0
  140. package/dist/internal/index.d.ts.map +1 -0
  141. package/dist/internal/index.js +56 -0
  142. package/dist/ir/builder.d.ts +173 -0
  143. package/dist/ir/builder.d.ts.map +1 -0
  144. package/dist/ir/builder.js +481 -0
  145. package/dist/ir/freeze.d.ts +10 -0
  146. package/dist/ir/freeze.d.ts.map +1 -0
  147. package/dist/ir/freeze.js +102 -0
  148. package/dist/ir/index.d.ts +9 -0
  149. package/dist/ir/index.d.ts.map +1 -0
  150. package/dist/ir/index.js +7 -0
  151. package/dist/ir/regexp.d.ts +6 -0
  152. package/dist/ir/regexp.d.ts.map +1 -0
  153. package/dist/ir/regexp.js +12 -0
  154. package/dist/ir/types.d.ts +215 -0
  155. package/dist/ir/types.d.ts.map +1 -0
  156. package/dist/ir/types.js +5 -0
  157. package/dist/ir/validate.d.ts +10 -0
  158. package/dist/ir/validate.d.ts.map +1 -0
  159. package/dist/ir/validate.js +271 -0
  160. package/dist/issue/index.d.ts +44 -0
  161. package/dist/issue/index.d.ts.map +1 -0
  162. package/dist/issue/index.js +152 -0
  163. package/dist/json-schema/emit-combinator.d.ts +28 -0
  164. package/dist/json-schema/emit-combinator.d.ts.map +1 -0
  165. package/dist/json-schema/emit-combinator.js +96 -0
  166. package/dist/json-schema/emit-composite.d.ts +28 -0
  167. package/dist/json-schema/emit-composite.d.ts.map +1 -0
  168. package/dist/json-schema/emit-composite.js +127 -0
  169. package/dist/json-schema/emit-scalar.d.ts +25 -0
  170. package/dist/json-schema/emit-scalar.d.ts.map +1 -0
  171. package/dist/json-schema/emit-scalar.js +104 -0
  172. package/dist/json-schema/emit-types.d.ts +12 -0
  173. package/dist/json-schema/emit-types.d.ts.map +1 -0
  174. package/dist/json-schema/emit-types.js +5 -0
  175. package/dist/json-schema/emit.d.ts +12 -0
  176. package/dist/json-schema/emit.d.ts.map +1 -0
  177. package/dist/json-schema/emit.js +62 -0
  178. package/dist/json-schema/freeze.d.ts +14 -0
  179. package/dist/json-schema/freeze.d.ts.map +1 -0
  180. package/dist/json-schema/freeze.js +114 -0
  181. package/dist/json-schema/index.d.ts +20 -0
  182. package/dist/json-schema/index.d.ts.map +1 -0
  183. package/dist/json-schema/index.js +76 -0
  184. package/dist/json-schema/issue.d.ts +11 -0
  185. package/dist/json-schema/issue.d.ts.map +1 -0
  186. package/dist/json-schema/issue.js +14 -0
  187. package/dist/json-schema/read.d.ts +29 -0
  188. package/dist/json-schema/read.d.ts.map +1 -0
  189. package/dist/json-schema/read.js +87 -0
  190. package/dist/json-schema/types.d.ts +106 -0
  191. package/dist/json-schema/types.d.ts.map +1 -0
  192. package/dist/json-schema/types.js +5 -0
  193. package/dist/kind/index.d.ts +119 -0
  194. package/dist/kind/index.d.ts.map +1 -0
  195. package/dist/kind/index.js +94 -0
  196. package/dist/lower/index.d.ts +7 -0
  197. package/dist/lower/index.d.ts.map +1 -0
  198. package/dist/lower/index.js +199 -0
  199. package/dist/message/index.d.ts +51 -0
  200. package/dist/message/index.d.ts.map +1 -0
  201. package/dist/message/index.js +269 -0
  202. package/dist/optimize/compact.d.ts +10 -0
  203. package/dist/optimize/compact.d.ts.map +1 -0
  204. package/dist/optimize/compact.js +60 -0
  205. package/dist/optimize/fold-boolean.d.ts +15 -0
  206. package/dist/optimize/fold-boolean.d.ts.map +1 -0
  207. package/dist/optimize/fold-boolean.js +75 -0
  208. package/dist/optimize/fold-common.d.ts +45 -0
  209. package/dist/optimize/fold-common.d.ts.map +1 -0
  210. package/dist/optimize/fold-common.js +71 -0
  211. package/dist/optimize/fold-scalar.d.ts +59 -0
  212. package/dist/optimize/fold-scalar.d.ts.map +1 -0
  213. package/dist/optimize/fold-scalar.js +174 -0
  214. package/dist/optimize/fold.d.ts +10 -0
  215. package/dist/optimize/fold.d.ts.map +1 -0
  216. package/dist/optimize/fold.js +103 -0
  217. package/dist/optimize/index.d.ts +10 -0
  218. package/dist/optimize/index.d.ts.map +1 -0
  219. package/dist/optimize/index.js +23 -0
  220. package/dist/optimize/map-node.d.ts +21 -0
  221. package/dist/optimize/map-node.d.ts.map +1 -0
  222. package/dist/optimize/map-node.js +222 -0
  223. package/dist/optimize/remap.d.ts +30 -0
  224. package/dist/optimize/remap.d.ts.map +1 -0
  225. package/dist/optimize/remap.js +46 -0
  226. package/dist/optimize/rewrite.d.ts +22 -0
  227. package/dist/optimize/rewrite.d.ts.map +1 -0
  228. package/dist/optimize/rewrite.js +34 -0
  229. package/dist/plan/cache.d.ts +20 -0
  230. package/dist/plan/cache.d.ts.map +1 -0
  231. package/dist/plan/cache.js +122 -0
  232. package/dist/plan/index.d.ts +8 -0
  233. package/dist/plan/index.d.ts.map +1 -0
  234. package/dist/plan/index.js +6 -0
  235. package/dist/plan/predicate.d.ts +27 -0
  236. package/dist/plan/predicate.d.ts.map +1 -0
  237. package/dist/plan/predicate.js +415 -0
  238. package/dist/plan/schema-predicate.d.ts +15 -0
  239. package/dist/plan/schema-predicate.d.ts.map +1 -0
  240. package/dist/plan/schema-predicate.js +277 -0
  241. package/dist/plan/types.d.ts +18 -0
  242. package/dist/plan/types.d.ts.map +1 -0
  243. package/dist/plan/types.js +5 -0
  244. package/dist/result/index.d.ts +27 -0
  245. package/dist/result/index.d.ts.map +1 -0
  246. package/dist/result/index.js +20 -0
  247. package/dist/schema/common.d.ts +30 -0
  248. package/dist/schema/common.d.ts.map +1 -0
  249. package/dist/schema/common.js +102 -0
  250. package/dist/schema/freeze.d.ts +10 -0
  251. package/dist/schema/freeze.d.ts.map +1 -0
  252. package/dist/schema/freeze.js +163 -0
  253. package/dist/schema/index.d.ts +11 -0
  254. package/dist/schema/index.d.ts.map +1 -0
  255. package/dist/schema/index.js +9 -0
  256. package/dist/schema/lazy.d.ts +10 -0
  257. package/dist/schema/lazy.d.ts.map +1 -0
  258. package/dist/schema/lazy.js +25 -0
  259. package/dist/schema/literal.d.ts +10 -0
  260. package/dist/schema/literal.d.ts.map +1 -0
  261. package/dist/schema/literal.js +17 -0
  262. package/dist/schema/types.d.ts +243 -0
  263. package/dist/schema/types.d.ts.map +1 -0
  264. package/dist/schema/types.js +9 -0
  265. package/dist/schema/validate.d.ts +10 -0
  266. package/dist/schema/validate.d.ts.map +1 -0
  267. package/dist/schema/validate.js +268 -0
  268. package/docs/api.md +301 -0
  269. package/docs/engine-notes.md +153 -0
  270. package/docs/index.html +1242 -0
  271. package/package.json +68 -0
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @file freeze.ts
3
+ * @brief Immutable graph finalization.
4
+ */
5
+ import { NodeTag } from "../kind/index.js";
6
+ import { freezeSchema } from "../schema/index.js";
7
+ import { isPlainRegExp } from "./regexp.js";
8
+ /**
9
+ * @brief freeze graph.
10
+ */
11
+ export function freezeGraph(graph) {
12
+ for (let index = 0; index < graph.nodes.length; index += 1) {
13
+ const node = graph.nodes[index];
14
+ if (node !== undefined) {
15
+ freezeGraphNode(node);
16
+ }
17
+ }
18
+ Object.freeze(graph.nodes);
19
+ return Object.freeze(graph);
20
+ }
21
+ /**
22
+ * @brief freeze graph node.
23
+ */
24
+ function freezeGraphNode(node) {
25
+ Object.freeze(node.deps);
26
+ switch (node.tag) {
27
+ case NodeTag.StrictKeys:
28
+ Object.freeze(node.keys);
29
+ break;
30
+ case NodeTag.Regex:
31
+ freezeRegexNode(node);
32
+ break;
33
+ case NodeTag.ArrayEvery:
34
+ freezeSchema(node.item);
35
+ break;
36
+ case NodeTag.TupleItems:
37
+ for (let index = 0; index < node.items.length; index += 1) {
38
+ const item = node.items[index];
39
+ if (item !== undefined) {
40
+ freezeSchema(item);
41
+ }
42
+ }
43
+ Object.freeze(node.items);
44
+ break;
45
+ case NodeTag.RecordEvery:
46
+ freezeSchema(node.item);
47
+ break;
48
+ case NodeTag.DiscriminantDispatch:
49
+ Object.freeze(node.literals);
50
+ for (let index = 0; index < node.schemas.length; index += 1) {
51
+ const schema = node.schemas[index];
52
+ if (schema !== undefined) {
53
+ freezeSchema(schema);
54
+ }
55
+ }
56
+ Object.freeze(node.schemas);
57
+ Object.freeze(node.lookup);
58
+ break;
59
+ case NodeTag.SchemaCheck:
60
+ freezeSchema(node.schema);
61
+ break;
62
+ case NodeTag.And:
63
+ case NodeTag.Or:
64
+ Object.freeze(node.values);
65
+ break;
66
+ default:
67
+ break;
68
+ }
69
+ Object.freeze(node);
70
+ }
71
+ /**
72
+ * @brief freeze regex node.
73
+ */
74
+ function freezeRegexNode(node) {
75
+ const regex = node.regex;
76
+ if (!isPlainRegExp(regex)) {
77
+ throw new TypeError("regex node must use a plain RegExp");
78
+ }
79
+ if (Object.isFrozen(node)) {
80
+ if (Object.isExtensible(regex)) {
81
+ throw new TypeError("frozen regex node must contain a non-extensible RegExp");
82
+ }
83
+ return;
84
+ }
85
+ if (!Object.isExtensible(regex)) {
86
+ return;
87
+ }
88
+ Object.defineProperty(node, "regex", {
89
+ configurable: false,
90
+ enumerable: true,
91
+ value: cloneGraphRegExp(regex),
92
+ writable: false
93
+ });
94
+ }
95
+ /**
96
+ * @brief clone graph reg exp.
97
+ */
98
+ function cloneGraphRegExp(regex) {
99
+ const cloned = new RegExp(regex.source, regex.flags);
100
+ Object.preventExtensions(cloned);
101
+ return cloned;
102
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @file index.ts
3
+ * @brief Public IR module aggregation.
4
+ */
5
+ export { GraphBuilder } from "./builder.js";
6
+ export { freezeGraph } from "./freeze.js";
7
+ export { isGraphValue } from "./validate.js";
8
+ export type { ArrayEveryNode, BooleanFoldNode, ConstNode, DiscriminantDispatchLookup, DiscriminantDispatchNode, EqualsNode, GetPropNode, Graph, GraphNode, HasOwnDataNode, HasOwnNode, NodeId, NumericCompareNode, ParamNode, RecordEveryNode, RegexNode, ReturnNode, SchemaCheckNode, StartNode, StrictKeysNode, StringBoundNode, TupleItemsNode, UnaryPredicateNode } from "./types.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ir/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EACV,cAAc,EACd,eAAe,EACf,SAAS,EACT,0BAA0B,EAC1B,wBAAwB,EACxB,UAAU,EACV,WAAW,EACX,KAAK,EACL,SAAS,EACT,cAAc,EACd,UAAU,EACV,MAAM,EACN,kBAAkB,EAClB,SAAS,EACT,eAAe,EACf,SAAS,EACT,UAAU,EACV,eAAe,EACf,SAAS,EACT,cAAc,EACd,eAAe,EACf,cAAc,EACd,kBAAkB,EACnB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @file index.ts
3
+ * @brief Public IR module aggregation.
4
+ */
5
+ export { GraphBuilder } from "./builder.js";
6
+ export { freezeGraph } from "./freeze.js";
7
+ export { isGraphValue } from "./validate.js";
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @file regexp.ts
3
+ * @brief RegExp shape guard for graph nodes.
4
+ */
5
+ export declare function isPlainRegExp(value: unknown): value is RegExp;
6
+ //# sourceMappingURL=regexp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regexp.d.ts","sourceRoot":"","sources":["../../src/ir/regexp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAO7D"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @file regexp.ts
3
+ * @brief RegExp shape guard for graph nodes.
4
+ */
5
+ export function isPlainRegExp(value) {
6
+ return value instanceof RegExp &&
7
+ Object.getPrototypeOf(value) === RegExp.prototype &&
8
+ !Object.prototype.hasOwnProperty.call(value, "exec") &&
9
+ !Object.prototype.hasOwnProperty.call(value, "test") &&
10
+ !Object.prototype.hasOwnProperty.call(value, "source") &&
11
+ !Object.prototype.hasOwnProperty.call(value, "flags");
12
+ }
@@ -0,0 +1,215 @@
1
+ /**
2
+ * @file types.ts
3
+ * @brief Sea-of-Nodes graph value model.
4
+ */
5
+ import { NodeTag } from "../kind/index.js";
6
+ import type { LiteralValue, Schema } from "../schema/index.js";
7
+ /**
8
+ * @brief node id.
9
+ */
10
+ export type NodeId = number;
11
+ /**
12
+ * @brief graph node.
13
+ */
14
+ export type GraphNode = StartNode | ParamNode | ConstNode | GetPropNode | UnaryPredicateNode | EqualsNode | NumericCompareNode | StringBoundNode | RegexNode | HasOwnNode | HasOwnDataNode | StrictKeysNode | ArrayEveryNode | TupleItemsNode | RecordEveryNode | DiscriminantDispatchNode | SchemaCheckNode | BooleanFoldNode | ReturnNode;
15
+ /**
16
+ * @brief graph.
17
+ */
18
+ export interface Graph {
19
+ readonly nodes: readonly GraphNode[];
20
+ readonly entry: NodeId;
21
+ readonly result: NodeId;
22
+ }
23
+ /**
24
+ * @brief start node.
25
+ */
26
+ export interface StartNode {
27
+ readonly id: NodeId;
28
+ readonly tag: typeof NodeTag.Start;
29
+ readonly deps: readonly [];
30
+ }
31
+ /**
32
+ * @brief param node.
33
+ */
34
+ export interface ParamNode {
35
+ readonly id: NodeId;
36
+ readonly tag: typeof NodeTag.Param;
37
+ readonly deps: readonly [];
38
+ readonly name: string;
39
+ }
40
+ /**
41
+ * @brief const node.
42
+ */
43
+ export interface ConstNode {
44
+ readonly id: NodeId;
45
+ readonly tag: typeof NodeTag.Const;
46
+ readonly deps: readonly [];
47
+ readonly value: LiteralValue;
48
+ }
49
+ /**
50
+ * @brief get prop node.
51
+ */
52
+ export interface GetPropNode {
53
+ readonly id: NodeId;
54
+ readonly tag: typeof NodeTag.GetProp;
55
+ readonly deps: readonly [NodeId];
56
+ readonly object: NodeId;
57
+ readonly key: string;
58
+ }
59
+ /**
60
+ * @brief unary predicate node.
61
+ */
62
+ export interface UnaryPredicateNode {
63
+ readonly id: NodeId;
64
+ readonly tag: typeof NodeTag.IsString | typeof NodeTag.IsNumber | typeof NodeTag.IsBoolean | typeof NodeTag.IsBigInt | typeof NodeTag.IsSymbol | typeof NodeTag.IsObject | typeof NodeTag.IsArray | typeof NodeTag.IsUndefined | typeof NodeTag.IsNull | typeof NodeTag.IsInteger | typeof NodeTag.Not;
65
+ readonly deps: readonly [NodeId];
66
+ readonly value: NodeId;
67
+ }
68
+ /**
69
+ * @brief equals node.
70
+ */
71
+ export interface EqualsNode {
72
+ readonly id: NodeId;
73
+ readonly tag: typeof NodeTag.Equals;
74
+ readonly deps: readonly [NodeId, NodeId];
75
+ readonly left: NodeId;
76
+ readonly right: NodeId;
77
+ }
78
+ /**
79
+ * @brief numeric compare node.
80
+ */
81
+ export interface NumericCompareNode {
82
+ readonly id: NodeId;
83
+ readonly tag: typeof NodeTag.Gte | typeof NodeTag.Lte;
84
+ readonly deps: readonly [NodeId, NodeId];
85
+ readonly left: NodeId;
86
+ readonly right: NodeId;
87
+ }
88
+ /**
89
+ * @brief string bound node.
90
+ */
91
+ export interface StringBoundNode {
92
+ readonly id: NodeId;
93
+ readonly tag: typeof NodeTag.StringMin | typeof NodeTag.StringMax;
94
+ readonly deps: readonly [NodeId];
95
+ readonly value: NodeId;
96
+ readonly bound: number;
97
+ }
98
+ /**
99
+ * @brief regex node.
100
+ */
101
+ export interface RegexNode {
102
+ readonly id: NodeId;
103
+ readonly tag: typeof NodeTag.Regex;
104
+ readonly deps: readonly [NodeId];
105
+ readonly value: NodeId;
106
+ readonly regex: RegExp;
107
+ readonly name: string;
108
+ }
109
+ /**
110
+ * @brief has own node.
111
+ */
112
+ export interface HasOwnNode {
113
+ readonly id: NodeId;
114
+ readonly tag: typeof NodeTag.HasOwn;
115
+ readonly deps: readonly [NodeId];
116
+ readonly object: NodeId;
117
+ readonly key: string;
118
+ }
119
+ /**
120
+ * @brief has own data node.
121
+ */
122
+ export interface HasOwnDataNode {
123
+ readonly id: NodeId;
124
+ readonly tag: typeof NodeTag.HasOwnData;
125
+ readonly deps: readonly [NodeId];
126
+ readonly object: NodeId;
127
+ readonly key: string;
128
+ }
129
+ /**
130
+ * @brief strict keys node.
131
+ */
132
+ export interface StrictKeysNode {
133
+ readonly id: NodeId;
134
+ readonly tag: typeof NodeTag.StrictKeys;
135
+ readonly deps: readonly [NodeId];
136
+ readonly object: NodeId;
137
+ readonly keys: readonly string[];
138
+ }
139
+ /**
140
+ * @brief array every node.
141
+ */
142
+ export interface ArrayEveryNode {
143
+ readonly id: NodeId;
144
+ readonly tag: typeof NodeTag.ArrayEvery;
145
+ readonly deps: readonly [NodeId];
146
+ readonly value: NodeId;
147
+ readonly item: Schema;
148
+ }
149
+ /**
150
+ * @brief tuple items node.
151
+ */
152
+ export interface TupleItemsNode {
153
+ readonly id: NodeId;
154
+ readonly tag: typeof NodeTag.TupleItems;
155
+ readonly deps: readonly [NodeId];
156
+ readonly value: NodeId;
157
+ readonly items: readonly Schema[];
158
+ }
159
+ /**
160
+ * @brief record every node.
161
+ */
162
+ export interface RecordEveryNode {
163
+ readonly id: NodeId;
164
+ readonly tag: typeof NodeTag.RecordEvery;
165
+ readonly deps: readonly [NodeId];
166
+ readonly value: NodeId;
167
+ readonly item: Schema;
168
+ }
169
+ /**
170
+ * @brief discriminant dispatch lookup.
171
+ */
172
+ export type DiscriminantDispatchLookup = Readonly<Record<string, number>>;
173
+ /**
174
+ * @brief discriminant dispatch node.
175
+ */
176
+ export interface DiscriminantDispatchNode {
177
+ readonly id: NodeId;
178
+ readonly tag: typeof NodeTag.DiscriminantDispatch;
179
+ readonly deps: readonly [NodeId];
180
+ readonly value: NodeId;
181
+ readonly key: string;
182
+ readonly literals: readonly string[];
183
+ readonly schemas: readonly Schema[];
184
+ readonly lookup: DiscriminantDispatchLookup;
185
+ }
186
+ /**
187
+ * @brief schema check node.
188
+ */
189
+ export interface SchemaCheckNode {
190
+ readonly id: NodeId;
191
+ readonly tag: typeof NodeTag.SchemaCheck;
192
+ readonly deps: readonly [NodeId];
193
+ readonly value: NodeId;
194
+ readonly schema: Schema;
195
+ }
196
+ /**
197
+ * @brief boolean fold node.
198
+ */
199
+ export interface BooleanFoldNode {
200
+ readonly id: NodeId;
201
+ readonly tag: typeof NodeTag.And | typeof NodeTag.Or;
202
+ readonly deps: readonly NodeId[];
203
+ readonly values: readonly NodeId[];
204
+ }
205
+ /**
206
+ * @brief return node.
207
+ */
208
+ export interface ReturnNode {
209
+ readonly id: NodeId;
210
+ readonly tag: typeof NodeTag.Return;
211
+ readonly deps: readonly [NodeId, NodeId];
212
+ readonly control: NodeId;
213
+ readonly value: NodeId;
214
+ }
215
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ir/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @file types.ts
3
+ * @brief Sea-of-Nodes graph value model.
4
+ */
5
+ import { NodeTag } from "../kind/index.js";
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @file validate.ts
3
+ * @brief Runtime validation for graph objects.
4
+ */
5
+ import type { Graph } from "./types.js";
6
+ /**
7
+ * @brief is graph value.
8
+ */
9
+ export declare function isGraphValue(value: unknown): value is Graph;
10
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/ir/validate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,KAAK,EAAqB,MAAM,YAAY,CAAC;AAE3D;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAqB3D"}
@@ -0,0 +1,271 @@
1
+ /**
2
+ * @file validate.ts
3
+ * @brief Runtime validation for graph objects.
4
+ */
5
+ import { NodeTag } from "../kind/index.js";
6
+ import { isLiteralValue, isSchemaValue } from "../schema/index.js";
7
+ import { isPlainRegExp } from "./regexp.js";
8
+ /**
9
+ * @brief is graph value.
10
+ */
11
+ export function isGraphValue(value) {
12
+ if (!isRecord(value)) {
13
+ return false;
14
+ }
15
+ const nodes = value["nodes"];
16
+ if (!isUnknownArray(nodes)) {
17
+ return false;
18
+ }
19
+ if (!isNodeId(value["entry"], nodes.length) ||
20
+ !isNodeId(value["result"], nodes.length)) {
21
+ return false;
22
+ }
23
+ for (let index = 0; index < nodes.length; index += 1) {
24
+ if (!isGraphNodeValue(nodes[index], index, nodes.length)) {
25
+ return false;
26
+ }
27
+ }
28
+ const entry = nodes[value["entry"]];
29
+ const result = nodes[value["result"]];
30
+ return isRecord(entry) && entry["tag"] === NodeTag.Start &&
31
+ isRecord(result) && result["tag"] === NodeTag.Return;
32
+ }
33
+ /**
34
+ * @brief is graph node value.
35
+ */
36
+ function isGraphNodeValue(value, index, nodeCount) {
37
+ if (!isRecord(value) || value["id"] !== index) {
38
+ return false;
39
+ }
40
+ const deps = value["deps"];
41
+ if (!isNodeIdArray(deps, nodeCount)) {
42
+ return false;
43
+ }
44
+ switch (value["tag"]) {
45
+ case NodeTag.Start:
46
+ case NodeTag.Param:
47
+ case NodeTag.Const:
48
+ return isLeafNodeValue(value, deps);
49
+ case NodeTag.GetProp:
50
+ return typeof value["key"] === "string" &&
51
+ isSingleDepNode(value, deps, "object", nodeCount);
52
+ case NodeTag.IsString:
53
+ case NodeTag.IsNumber:
54
+ case NodeTag.IsBoolean:
55
+ case NodeTag.IsBigInt:
56
+ case NodeTag.IsSymbol:
57
+ case NodeTag.IsObject:
58
+ case NodeTag.IsArray:
59
+ case NodeTag.IsUndefined:
60
+ case NodeTag.IsNull:
61
+ case NodeTag.IsInteger:
62
+ case NodeTag.Not:
63
+ return isSingleDepNode(value, deps, "value", nodeCount);
64
+ case NodeTag.Equals:
65
+ case NodeTag.Gte:
66
+ case NodeTag.Lte:
67
+ return isTwoDepNode(value, deps, "left", "right", nodeCount);
68
+ case NodeTag.StringMin:
69
+ case NodeTag.StringMax:
70
+ return typeof value["bound"] === "number" &&
71
+ Number.isInteger(value["bound"]) &&
72
+ value["bound"] >= 0 &&
73
+ isSingleDepNode(value, deps, "value", nodeCount);
74
+ case NodeTag.Regex:
75
+ return isPlainRegExp(value["regex"]) &&
76
+ typeof value["name"] === "string" &&
77
+ isSingleDepNode(value, deps, "value", nodeCount);
78
+ case NodeTag.HasOwn:
79
+ case NodeTag.HasOwnData:
80
+ return typeof value["key"] === "string" &&
81
+ isSingleDepNode(value, deps, "object", nodeCount);
82
+ case NodeTag.StrictKeys:
83
+ return isStringArray(value["keys"]) &&
84
+ isSingleDepNode(value, deps, "object", nodeCount);
85
+ case NodeTag.ArrayEvery:
86
+ return isSchemaValue(value["item"]) &&
87
+ isSingleDepNode(value, deps, "value", nodeCount);
88
+ case NodeTag.TupleItems:
89
+ return isSchemaArray(value["items"]) &&
90
+ isSingleDepNode(value, deps, "value", nodeCount);
91
+ case NodeTag.RecordEvery:
92
+ return isSchemaValue(value["item"]) &&
93
+ isSingleDepNode(value, deps, "value", nodeCount);
94
+ case NodeTag.DiscriminantDispatch:
95
+ return typeof value["key"] === "string" &&
96
+ isStringArray(value["literals"]) &&
97
+ isSchemaArray(value["schemas"]) &&
98
+ isDiscriminantLookup(value["lookup"], value["literals"]) &&
99
+ value["literals"].length === value["schemas"].length &&
100
+ isSingleDepNode(value, deps, "value", nodeCount);
101
+ case NodeTag.SchemaCheck:
102
+ return isSchemaValue(value["schema"]) &&
103
+ isSingleDepNode(value, deps, "value", nodeCount);
104
+ case NodeTag.And:
105
+ case NodeTag.Or:
106
+ return isNodeIdArray(value["values"], nodeCount) &&
107
+ sameNodeIds(deps, value["values"]);
108
+ case NodeTag.Return:
109
+ return isTwoDepNode(value, deps, "control", "value", nodeCount);
110
+ default:
111
+ return false;
112
+ }
113
+ }
114
+ /**
115
+ * @brief is leaf node value.
116
+ */
117
+ function isLeafNodeValue(value, deps) {
118
+ if (deps.length !== 0) {
119
+ return false;
120
+ }
121
+ switch (value["tag"]) {
122
+ case NodeTag.Start:
123
+ return true;
124
+ case NodeTag.Param:
125
+ return typeof value["name"] === "string";
126
+ case NodeTag.Const:
127
+ return isLiteralValue(value["value"]);
128
+ default:
129
+ return false;
130
+ }
131
+ }
132
+ /**
133
+ * @brief is single dep node.
134
+ */
135
+ function isSingleDepNode(value, deps, field, nodeCount) {
136
+ return deps.length === 1 &&
137
+ isNodeId(value[field], nodeCount) &&
138
+ deps[0] === value[field];
139
+ }
140
+ /**
141
+ * @brief is two dep node.
142
+ */
143
+ function isTwoDepNode(value, deps, leftField, rightField, nodeCount) {
144
+ return deps.length === 2 &&
145
+ isNodeId(value[leftField], nodeCount) &&
146
+ isNodeId(value[rightField], nodeCount) &&
147
+ deps[0] === value[leftField] &&
148
+ deps[1] === value[rightField];
149
+ }
150
+ /**
151
+ * @brief is node id.
152
+ */
153
+ function isNodeId(value, nodeCount) {
154
+ return typeof value === "number" &&
155
+ Number.isSafeInteger(value) &&
156
+ value >= 0 &&
157
+ value < nodeCount;
158
+ }
159
+ /**
160
+ * @brief is node id array.
161
+ */
162
+ function isNodeIdArray(value, nodeCount) {
163
+ if (!isUnknownArray(value)) {
164
+ return false;
165
+ }
166
+ for (let index = 0; index < value.length; index += 1) {
167
+ if (!isNodeId(value[index], nodeCount)) {
168
+ return false;
169
+ }
170
+ }
171
+ return true;
172
+ }
173
+ /**
174
+ * @brief same node ids.
175
+ */
176
+ function sameNodeIds(left, right) {
177
+ if (left.length !== right.length) {
178
+ return false;
179
+ }
180
+ for (let index = 0; index < left.length; index += 1) {
181
+ if (left[index] !== right[index]) {
182
+ return false;
183
+ }
184
+ }
185
+ return true;
186
+ }
187
+ /**
188
+ * @brief is string array.
189
+ */
190
+ function isStringArray(value) {
191
+ if (!isUnknownArray(value)) {
192
+ return false;
193
+ }
194
+ for (let index = 0; index < value.length; index += 1) {
195
+ if (typeof value[index] !== "string") {
196
+ return false;
197
+ }
198
+ }
199
+ return true;
200
+ }
201
+ /**
202
+ * @brief is schema array.
203
+ */
204
+ function isSchemaArray(value) {
205
+ if (!isUnknownArray(value)) {
206
+ return false;
207
+ }
208
+ for (let index = 0; index < value.length; index += 1) {
209
+ if (!isSchemaValue(value[index])) {
210
+ return false;
211
+ }
212
+ }
213
+ return true;
214
+ }
215
+ /**
216
+ * @brief is discriminant lookup.
217
+ */
218
+ function isDiscriminantLookup(value, literals) {
219
+ if (!isRecord(value)) {
220
+ return false;
221
+ }
222
+ const keys = Reflect.ownKeys(value);
223
+ if (keys.length !== literals.length) {
224
+ return false;
225
+ }
226
+ for (let index = 0; index < literals.length; index += 1) {
227
+ const literal = literals[index];
228
+ if (typeof literal !== "string" ||
229
+ value[literal] !== index) {
230
+ return false;
231
+ }
232
+ }
233
+ return true;
234
+ }
235
+ /**
236
+ * @brief is record.
237
+ */
238
+ function isRecord(value) {
239
+ return typeof value === "object" &&
240
+ value !== null &&
241
+ !Array.isArray(value) &&
242
+ hasOnlyDataProperties(value);
243
+ }
244
+ /**
245
+ * @brief is unknown array.
246
+ */
247
+ function isUnknownArray(value) {
248
+ return Array.isArray(value) && hasOnlyDataProperties(value);
249
+ }
250
+ /**
251
+ * @brief has only data properties.
252
+ * @details Rejects accessor descriptors before graph internals read fields by key.
253
+ * @returns True when every own property is backed by a data slot.
254
+ */
255
+ function hasOnlyDataProperties(value) {
256
+ const descriptors = Object.getOwnPropertyDescriptors(value);
257
+ const descriptorMap = descriptors;
258
+ const keys = Reflect.ownKeys(descriptors);
259
+ for (let index = 0; index < keys.length; index += 1) {
260
+ const key = keys[index];
261
+ if (key === undefined) {
262
+ continue;
263
+ }
264
+ const descriptor = descriptorMap[key];
265
+ if (descriptor === undefined ||
266
+ !Object.prototype.hasOwnProperty.call(descriptor, "value")) {
267
+ return false;
268
+ }
269
+ }
270
+ return true;
271
+ }