tsondb 0.1.3

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 (170) hide show
  1. package/README.md +3 -0
  2. package/lib/ModelContainer.d.ts +17 -0
  3. package/lib/ModelContainer.js +63 -0
  4. package/lib/Schema.d.ts +8 -0
  5. package/lib/Schema.js +72 -0
  6. package/lib/client/api.d.ts +11 -0
  7. package/lib/client/api.js +83 -0
  8. package/lib/client/components/Layout.d.ts +10 -0
  9. package/lib/client/components/Layout.js +4 -0
  10. package/lib/client/components/Select.d.ts +3 -0
  11. package/lib/client/components/Select.js +2 -0
  12. package/lib/client/components/typeInputs/ArrayTypeInput.d.ts +13 -0
  13. package/lib/client/components/typeInputs/ArrayTypeInput.js +10 -0
  14. package/lib/client/components/typeInputs/BooleanTypeInput.d.ts +9 -0
  15. package/lib/client/components/typeInputs/BooleanTypeInput.js +6 -0
  16. package/lib/client/components/typeInputs/DateTypeInput.d.ts +9 -0
  17. package/lib/client/components/typeInputs/DateTypeInput.js +9 -0
  18. package/lib/client/components/typeInputs/FloatTypeInput.d.ts +9 -0
  19. package/lib/client/components/typeInputs/FloatTypeInput.js +15 -0
  20. package/lib/client/components/typeInputs/GenericTypeArgumentIdentifierTypeInput.d.ts +7 -0
  21. package/lib/client/components/typeInputs/GenericTypeArgumentIdentifierTypeInput.js +4 -0
  22. package/lib/client/components/typeInputs/IncludeIdentifierTypeInput.d.ts +13 -0
  23. package/lib/client/components/typeInputs/IncludeIdentifierTypeInput.js +18 -0
  24. package/lib/client/components/typeInputs/IntegerTypeInput.d.ts +9 -0
  25. package/lib/client/components/typeInputs/IntegerTypeInput.js +15 -0
  26. package/lib/client/components/typeInputs/NestedEntityMapTypeInput.d.ts +13 -0
  27. package/lib/client/components/typeInputs/NestedEntityMapTypeInput.js +25 -0
  28. package/lib/client/components/typeInputs/ObjectTypeInput.d.ts +13 -0
  29. package/lib/client/components/typeInputs/ObjectTypeInput.js +20 -0
  30. package/lib/client/components/typeInputs/ReferenceIdentifierTypeInput.d.ts +11 -0
  31. package/lib/client/components/typeInputs/ReferenceIdentifierTypeInput.js +9 -0
  32. package/lib/client/components/typeInputs/StringTypeInput.d.ts +9 -0
  33. package/lib/client/components/typeInputs/StringTypeInput.js +10 -0
  34. package/lib/client/components/typeInputs/TypeInput.d.ts +13 -0
  35. package/lib/client/components/typeInputs/TypeInput.js +87 -0
  36. package/lib/client/components/typeInputs/utils/EnumDeclField.d.ts +13 -0
  37. package/lib/client/components/typeInputs/utils/EnumDeclField.js +38 -0
  38. package/lib/client/components/typeInputs/utils/MismatchingTypeError.d.ts +7 -0
  39. package/lib/client/components/typeInputs/utils/MismatchingTypeError.js +4 -0
  40. package/lib/client/components/typeInputs/utils/ValidationErrors.d.ts +6 -0
  41. package/lib/client/components/typeInputs/utils/ValidationErrors.js +4 -0
  42. package/lib/client/hooks/useEntityFromRoute.d.ts +5 -0
  43. package/lib/client/hooks/useEntityFromRoute.js +20 -0
  44. package/lib/client/hooks/useInstanceNamesByEntity.d.ts +3 -0
  45. package/lib/client/hooks/useInstanceNamesByEntity.js +18 -0
  46. package/lib/client/hooks/useSecondaryDeclarations.d.ts +3 -0
  47. package/lib/client/hooks/useSecondaryDeclarations.js +18 -0
  48. package/lib/client/index.d.ts +1 -0
  49. package/lib/client/index.js +11 -0
  50. package/lib/client/routes/CreateInstance.d.ts +2 -0
  51. package/lib/client/routes/CreateInstance.js +68 -0
  52. package/lib/client/routes/Entity.d.ts +2 -0
  53. package/lib/client/routes/Entity.js +47 -0
  54. package/lib/client/routes/Home.d.ts +2 -0
  55. package/lib/client/routes/Home.js +18 -0
  56. package/lib/client/routes/Instance.d.ts +2 -0
  57. package/lib/client/routes/Instance.js +73 -0
  58. package/lib/client/routes/NotFound.d.ts +2 -0
  59. package/lib/client/routes/NotFound.js +5 -0
  60. package/lib/client/utils/typeSkeleton.d.ts +3 -0
  61. package/lib/client/utils/typeSkeleton.js +51 -0
  62. package/lib/index.d.ts +1 -0
  63. package/lib/index.js +1 -0
  64. package/lib/renderers/Output.d.ts +4 -0
  65. package/lib/renderers/Output.js +1 -0
  66. package/lib/renderers/jsonschema/index.d.ts +6 -0
  67. package/lib/renderers/jsonschema/index.js +12 -0
  68. package/lib/renderers/jsonschema/render.d.ts +5 -0
  69. package/lib/renderers/jsonschema/render.js +156 -0
  70. package/lib/renderers/ts/index.d.ts +6 -0
  71. package/lib/renderers/ts/index.js +11 -0
  72. package/lib/renderers/ts/render.d.ts +5 -0
  73. package/lib/renderers/ts/render.js +109 -0
  74. package/lib/schema/Node.d.ts +37 -0
  75. package/lib/schema/Node.js +79 -0
  76. package/lib/schema/declarations/Declaration.d.ts +44 -0
  77. package/lib/schema/declarations/Declaration.js +98 -0
  78. package/lib/schema/declarations/EntityDecl.d.ts +73 -0
  79. package/lib/schema/declarations/EntityDecl.js +57 -0
  80. package/lib/schema/declarations/EnumDecl.d.ts +33 -0
  81. package/lib/schema/declarations/EnumDecl.js +104 -0
  82. package/lib/schema/declarations/TypeAliasDecl.d.ts +33 -0
  83. package/lib/schema/declarations/TypeAliasDecl.js +49 -0
  84. package/lib/schema/index.d.ts +20 -0
  85. package/lib/schema/index.js +20 -0
  86. package/lib/schema/parameters/TypeParameter.d.ts +14 -0
  87. package/lib/schema/parameters/TypeParameter.js +11 -0
  88. package/lib/schema/types/Type.d.ts +42 -0
  89. package/lib/schema/types/Type.js +177 -0
  90. package/lib/schema/types/generic/ArrayType.d.ts +30 -0
  91. package/lib/schema/types/generic/ArrayType.js +38 -0
  92. package/lib/schema/types/generic/ObjectType.d.ts +47 -0
  93. package/lib/schema/types/generic/ObjectType.js +70 -0
  94. package/lib/schema/types/primitives/BooleanType.d.ts +15 -0
  95. package/lib/schema/types/primitives/BooleanType.js +15 -0
  96. package/lib/schema/types/primitives/DateType.d.ts +16 -0
  97. package/lib/schema/types/primitives/DateType.js +17 -0
  98. package/lib/schema/types/primitives/FloatType.d.ts +26 -0
  99. package/lib/schema/types/primitives/FloatType.js +17 -0
  100. package/lib/schema/types/primitives/IntegerType.d.ts +26 -0
  101. package/lib/schema/types/primitives/IntegerType.js +21 -0
  102. package/lib/schema/types/primitives/NumericType.d.ts +6 -0
  103. package/lib/schema/types/primitives/NumericType.js +2 -0
  104. package/lib/schema/types/primitives/PrimitiveType.d.ts +6 -0
  105. package/lib/schema/types/primitives/PrimitiveType.js +1 -0
  106. package/lib/schema/types/primitives/StringType.d.ts +25 -0
  107. package/lib/schema/types/primitives/StringType.js +20 -0
  108. package/lib/schema/types/references/GenericArgumentIdentifierType.d.ts +21 -0
  109. package/lib/schema/types/references/GenericArgumentIdentifierType.js +18 -0
  110. package/lib/schema/types/references/IncludeIdentifierType.d.ts +28 -0
  111. package/lib/schema/types/references/IncludeIdentifierType.js +25 -0
  112. package/lib/schema/types/references/NestedEntityMapType.d.ts +36 -0
  113. package/lib/schema/types/references/NestedEntityMapType.js +67 -0
  114. package/lib/schema/types/references/ReferenceIdentifierType.d.ts +23 -0
  115. package/lib/schema/types/references/ReferenceIdentifierType.js +21 -0
  116. package/lib/schema/validation/options.d.ts +4 -0
  117. package/lib/schema/validation/options.js +12 -0
  118. package/lib/schema/validation/type.d.ts +4 -0
  119. package/lib/schema/validation/type.js +1 -0
  120. package/lib/server/index.d.ts +8 -0
  121. package/lib/server/index.js +207 -0
  122. package/lib/server/instanceOperations.d.ts +7 -0
  123. package/lib/server/instanceOperations.js +67 -0
  124. package/lib/shared/api.d.ts +42 -0
  125. package/lib/shared/api.js +1 -0
  126. package/lib/shared/enum.d.ts +1 -0
  127. package/lib/shared/enum.js +1 -0
  128. package/lib/shared/utils/compare.d.ts +13 -0
  129. package/lib/shared/utils/compare.js +24 -0
  130. package/lib/shared/utils/displayName.d.ts +2 -0
  131. package/lib/shared/utils/displayName.js +31 -0
  132. package/lib/shared/utils/instances.d.ts +6 -0
  133. package/lib/shared/utils/instances.js +1 -0
  134. package/lib/shared/utils/object.d.ts +2 -0
  135. package/lib/shared/utils/object.js +2 -0
  136. package/lib/shared/utils/string.d.ts +6 -0
  137. package/lib/shared/utils/string.js +52 -0
  138. package/lib/shared/utils/typeSafety.d.ts +1 -0
  139. package/lib/shared/utils/typeSafety.js +3 -0
  140. package/lib/shared/utils/validation.d.ts +3 -0
  141. package/lib/shared/utils/validation.js +14 -0
  142. package/lib/shared/validation/array.d.ts +6 -0
  143. package/lib/shared/validation/array.js +29 -0
  144. package/lib/shared/validation/date.d.ts +4 -0
  145. package/lib/shared/validation/date.js +13 -0
  146. package/lib/shared/validation/identifier.d.ts +1 -0
  147. package/lib/shared/validation/identifier.js +7 -0
  148. package/lib/shared/validation/number.d.ts +12 -0
  149. package/lib/shared/validation/number.js +34 -0
  150. package/lib/shared/validation/object.d.ts +6 -0
  151. package/lib/shared/validation/object.js +13 -0
  152. package/lib/shared/validation/string.d.ts +6 -0
  153. package/lib/shared/validation/string.js +15 -0
  154. package/lib/tsconfig.tsbuildinfo +1 -0
  155. package/lib/utils/enum.d.ts +6 -0
  156. package/lib/utils/enum.js +1 -0
  157. package/lib/utils/error.d.ts +2 -0
  158. package/lib/utils/error.js +18 -0
  159. package/lib/utils/instances.d.ts +4 -0
  160. package/lib/utils/instances.js +12 -0
  161. package/lib/utils/lazy.d.ts +16 -0
  162. package/lib/utils/lazy.js +32 -0
  163. package/lib/utils/object.d.ts +3 -0
  164. package/lib/utils/object.js +1 -0
  165. package/lib/utils/render.d.ts +4 -0
  166. package/lib/utils/render.js +8 -0
  167. package/lib/utils/result.d.ts +57 -0
  168. package/lib/utils/result.js +48 -0
  169. package/package.json +46 -0
  170. package/public/css/styles.css +418 -0
@@ -0,0 +1,57 @@
1
+ import { Lazy } from "../../utils/lazy.js";
2
+ import { NodeKind } from "../Node.js";
3
+ import { getNestedDeclarationsInObjectType, getReferencesForObjectType, Required, resolveTypeArgumentsInObjectType, serializeObjectType, } from "../types/generic/ObjectType.js";
4
+ import { StringType } from "../types/primitives/StringType.js";
5
+ import { validate } from "../types/Type.js";
6
+ import { validateDeclName, } from "./Declaration.js";
7
+ import { TypeAliasDecl } from "./TypeAliasDecl.js";
8
+ export const EntityDecl = (sourceUrl, options) => {
9
+ validateDeclName(options.name);
10
+ const decl = {
11
+ ...options,
12
+ kind: NodeKind.EntityDecl,
13
+ sourceUrl,
14
+ parameters: [],
15
+ type: Lazy.of(() => {
16
+ const type = options.type();
17
+ Object.keys(type.properties).forEach(key => {
18
+ if (key === "id") {
19
+ throw new TypeError(`Invalid object key "${key}" for entity "${options.name}". The key "id" is reserved for the entity identifier.`);
20
+ }
21
+ });
22
+ type.parent = decl;
23
+ return type;
24
+ }),
25
+ };
26
+ return decl;
27
+ };
28
+ export { EntityDecl as Entity };
29
+ export const isEntityDecl = (node) => node.kind === NodeKind.EntityDecl;
30
+ export const getNestedDeclarationsInEntityDecl = (isDeclAdded, decl) => getNestedDeclarationsInObjectType(isDeclAdded, decl.type.value);
31
+ export const validateEntityDecl = (helpers, decl, value) => validate(helpers, decl.type.value, value);
32
+ export const resolveTypeArgumentsInEntityDecl = (decl) => EntityDecl(decl.sourceUrl, {
33
+ ...decl,
34
+ type: () => resolveTypeArgumentsInObjectType({}, decl.type.value),
35
+ });
36
+ const createEntityIdentifierComment = () => "The entity’s identifier. A UUID or a locale code if it is registered as the locale entity.";
37
+ export const addEphemeralUUIDToType = (decl) => ({
38
+ ...decl.type.value,
39
+ properties: {
40
+ id: Required({
41
+ comment: createEntityIdentifierComment(),
42
+ type: createEntityIdentifierType(),
43
+ }),
44
+ ...Object.fromEntries(Object.entries(decl.type.value.properties).filter(([key]) => key !== "id")),
45
+ },
46
+ });
47
+ export const createEntityIdentifierType = () => StringType();
48
+ export const createEntityIdentifierTypeAsDecl = (decl) => TypeAliasDecl(decl.sourceUrl, {
49
+ comment: createEntityIdentifierComment(),
50
+ name: (decl.name + "_ID"),
51
+ type: createEntityIdentifierType,
52
+ });
53
+ export const serializeEntityDecl = type => ({
54
+ ...type,
55
+ type: serializeObjectType(type.type.value),
56
+ });
57
+ export const getReferencesForEntityDecl = (decl, value) => getReferencesForObjectType(decl.type.value, value);
@@ -0,0 +1,33 @@
1
+ import { Lazy } from "../../utils/lazy.js";
2
+ import { GetReferences, Node, NodeKind, Serializer } from "../Node.js";
3
+ import { SerializedTypeParameter, TypeParameter } from "../parameters/TypeParameter.js";
4
+ import { SerializedType, Type } from "../types/Type.js";
5
+ import { ValidatorHelpers } from "../validation/type.js";
6
+ import { BaseDecl, GetNestedDeclarations, SerializedBaseDecl, TypeArguments } from "./Declaration.js";
7
+ export interface EnumDecl<Name extends string = string, T extends Record<string, Type | null> = Record<string, Type | null>, Params extends TypeParameter[] = TypeParameter[]> extends BaseDecl<Name, Params> {
8
+ kind: NodeKind["EnumDecl"];
9
+ values: Lazy<T>;
10
+ }
11
+ export interface SerializedEnumDecl<Name extends string = string, T extends Record<string, SerializedType | null> = Record<string, SerializedType | null>, Params extends SerializedTypeParameter[] = SerializedTypeParameter[]> extends SerializedBaseDecl<Name, Params> {
12
+ kind: NodeKind["EnumDecl"];
13
+ values: T;
14
+ }
15
+ export declare const GenEnumDecl: <Name extends string, T extends Record<string, Type | null>, Params extends TypeParameter[]>(sourceUrl: string, options: {
16
+ name: Name;
17
+ comment?: string;
18
+ parameters: Params;
19
+ values: (...args: Params) => T;
20
+ }) => EnumDecl<Name, T, Params>;
21
+ export { GenEnumDecl as GenEnum };
22
+ export declare const EnumDecl: <Name extends string, T extends Record<string, Type | null>>(sourceUrl: string, options: {
23
+ name: Name;
24
+ comment?: string;
25
+ values: () => T;
26
+ }) => EnumDecl<Name, T, []>;
27
+ export { EnumDecl as Enum };
28
+ export declare const isEnumDecl: (node: Node) => node is EnumDecl;
29
+ export declare const getNestedDeclarationsInEnumDecl: GetNestedDeclarations<EnumDecl>;
30
+ export declare const validateEnumDecl: (helpers: ValidatorHelpers, decl: EnumDecl, args: Type[], value: unknown) => Error[];
31
+ export declare const resolveTypeArgumentsInEnumDecl: <Params extends TypeParameter[]>(decl: EnumDecl<string, Record<string, Type | null>, Params>, args: TypeArguments<Params>) => EnumDecl<string, Record<string, Type | null>, []>;
32
+ export declare const serializeEnumDecl: Serializer<EnumDecl, SerializedEnumDecl>;
33
+ export declare const getReferencesForEnumDecl: GetReferences<EnumDecl>;
@@ -0,0 +1,104 @@
1
+ import { discriminatorKey } from "../../shared/enum.js";
2
+ import { Lazy } from "../../utils/lazy.js";
3
+ import { NodeKind } from "../Node.js";
4
+ import { serializeTypeParameter, } from "../parameters/TypeParameter.js";
5
+ import { getReferencesForType, resolveTypeArgumentsInType, serializeType, validate, } from "../types/Type.js";
6
+ import { getNestedDeclarations, getTypeArgumentsRecord, validateDeclName, } from "./Declaration.js";
7
+ export const GenEnumDecl = (sourceUrl, options) => {
8
+ validateDeclName(options.name);
9
+ const decl = {
10
+ ...options,
11
+ kind: NodeKind.EnumDecl,
12
+ sourceUrl,
13
+ values: Lazy.of(() => {
14
+ const type = options.values(...options.parameters);
15
+ Object.values(type).forEach(type => {
16
+ if (type) {
17
+ type.parent = decl;
18
+ }
19
+ });
20
+ return type;
21
+ }),
22
+ };
23
+ return decl;
24
+ };
25
+ export { GenEnumDecl as GenEnum };
26
+ export const EnumDecl = (sourceUrl, options) => {
27
+ validateDeclName(options.name);
28
+ const decl = {
29
+ ...options,
30
+ kind: NodeKind.EnumDecl,
31
+ sourceUrl,
32
+ parameters: [],
33
+ values: Lazy.of(() => {
34
+ const type = options.values();
35
+ Object.values(type).forEach(type => {
36
+ if (type) {
37
+ type.parent = decl;
38
+ }
39
+ });
40
+ return type;
41
+ }),
42
+ };
43
+ return decl;
44
+ };
45
+ export { EnumDecl as Enum };
46
+ export const isEnumDecl = (node) => node.kind === NodeKind.EnumDecl;
47
+ export const getNestedDeclarationsInEnumDecl = (isDeclAdded, decl) => Object.values(decl.values.value).flatMap(caseDef => caseDef === null ? [] : getNestedDeclarations(isDeclAdded, caseDef));
48
+ export const validateEnumDecl = (helpers, decl, args, value) => {
49
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
50
+ return [TypeError(`expected an object, but got ${JSON.stringify(value)}`)];
51
+ }
52
+ const actualKeys = Object.keys(value);
53
+ if (!(discriminatorKey in value) || typeof value[discriminatorKey] !== "string") {
54
+ return [
55
+ TypeError(`missing required discriminator value at key "${discriminatorKey}" of type string`),
56
+ ];
57
+ }
58
+ const caseName = value[discriminatorKey];
59
+ if (!(caseName in decl.values.value)) {
60
+ return [TypeError(`discriminator "${caseName}" is not a valid enum case`)];
61
+ }
62
+ const unknownKeyErrors = actualKeys.flatMap(actualKey => actualKey === discriminatorKey || actualKey in decl.values.value
63
+ ? []
64
+ : [TypeError(`key "${actualKey}" is not the discriminator key or a valid enum case`)]);
65
+ if (unknownKeyErrors.length > 0) {
66
+ return unknownKeyErrors;
67
+ }
68
+ const associatedType = decl.values.value[caseName];
69
+ if (associatedType != null) {
70
+ if (!(caseName in value)) {
71
+ return [TypeError(`missing required associated value for case "${caseName}"`)];
72
+ }
73
+ return validate(helpers, resolveTypeArgumentsInType(getTypeArgumentsRecord(decl, args), associatedType), value[caseName]);
74
+ }
75
+ return [];
76
+ };
77
+ export const resolveTypeArgumentsInEnumDecl = (decl, args) => {
78
+ const resolvedArgs = getTypeArgumentsRecord(decl, args);
79
+ return EnumDecl(decl.sourceUrl, {
80
+ ...decl,
81
+ values: () => Object.fromEntries(Object.entries(decl.values.value).map(([key, value]) => [
82
+ key,
83
+ value === null ? null : resolveTypeArgumentsInType(resolvedArgs, value),
84
+ ])),
85
+ });
86
+ };
87
+ export const serializeEnumDecl = type => ({
88
+ ...type,
89
+ values: Object.fromEntries(Object.entries(type.values.value).map(([key, value]) => [
90
+ key,
91
+ value === null ? null : serializeType(value),
92
+ ])),
93
+ parameters: type.parameters.map(param => serializeTypeParameter(param)),
94
+ });
95
+ export const getReferencesForEnumDecl = (decl, value) => typeof value === "object" &&
96
+ value !== null &&
97
+ !Array.isArray(value) &&
98
+ discriminatorKey in value &&
99
+ typeof value[discriminatorKey] === "string" &&
100
+ value[discriminatorKey] in decl.values.value &&
101
+ decl.values.value[value[discriminatorKey]] !== null &&
102
+ value[discriminatorKey] in value
103
+ ? getReferencesForType(decl.values.value[value[discriminatorKey]], value[value[discriminatorKey]])
104
+ : [];
@@ -0,0 +1,33 @@
1
+ import { Lazy } from "../../utils/lazy.js";
2
+ import { GetReferences, Node, NodeKind, Serializer } from "../Node.js";
3
+ import { SerializedTypeParameter, TypeParameter } from "../parameters/TypeParameter.js";
4
+ import { SerializedType, Type } from "../types/Type.js";
5
+ import { ValidatorHelpers } from "../validation/type.js";
6
+ import { BaseDecl, GetNestedDeclarations, SerializedBaseDecl, TypeArguments } from "./Declaration.js";
7
+ export interface TypeAliasDecl<Name extends string = string, T extends Type = Type, Params extends TypeParameter[] = TypeParameter[]> extends BaseDecl<Name, Params> {
8
+ kind: NodeKind["TypeAliasDecl"];
9
+ type: Lazy<T>;
10
+ }
11
+ export interface SerializedTypeAliasDecl<Name extends string = string, T extends SerializedType = SerializedType, Params extends SerializedTypeParameter[] = SerializedTypeParameter[]> extends SerializedBaseDecl<Name, Params> {
12
+ kind: NodeKind["TypeAliasDecl"];
13
+ type: T;
14
+ }
15
+ export declare const GenTypeAliasDecl: <Name extends string, T extends Type, Params extends TypeParameter[]>(sourceUrl: string, options: {
16
+ name: Name;
17
+ comment?: string;
18
+ parameters: Params;
19
+ type: (...args: Params) => T;
20
+ }) => TypeAliasDecl<Name, T, Params>;
21
+ export { GenTypeAliasDecl as GenTypeAlias };
22
+ export declare const TypeAliasDecl: <Name extends string, T extends Type>(sourceUrl: string, options: {
23
+ name: Name;
24
+ comment?: string;
25
+ type: () => T;
26
+ }) => TypeAliasDecl<Name, T, []>;
27
+ export { TypeAliasDecl as TypeAlias };
28
+ export declare const isTypeAliasDecl: (node: Node) => node is TypeAliasDecl<string, Type, TypeParameter[]>;
29
+ export declare const getNestedDeclarationsInTypeAliasDecl: GetNestedDeclarations<TypeAliasDecl>;
30
+ export declare const validateTypeAliasDecl: <Params extends TypeParameter[]>(helpers: ValidatorHelpers, decl: TypeAliasDecl<string, Type, Params>, args: TypeArguments<Params>, value: unknown) => Error[];
31
+ export declare const resolveTypeArgumentsInTypeAliasDecl: <Params extends TypeParameter[]>(decl: TypeAliasDecl<string, Type, Params>, args: TypeArguments<Params>) => TypeAliasDecl<string, Type, []>;
32
+ export declare const serializeTypeAliasDecl: Serializer<TypeAliasDecl, SerializedTypeAliasDecl>;
33
+ export declare const getReferencesForTypeAliasDecl: GetReferences<TypeAliasDecl>;
@@ -0,0 +1,49 @@
1
+ import { Lazy } from "../../utils/lazy.js";
2
+ import { NodeKind } from "../Node.js";
3
+ import { serializeTypeParameter, } from "../parameters/TypeParameter.js";
4
+ import { getReferencesForType, resolveTypeArgumentsInType, serializeType, validate, } from "../types/Type.js";
5
+ import { getNestedDeclarations, getTypeArgumentsRecord, validateDeclName, } from "./Declaration.js";
6
+ export const GenTypeAliasDecl = (sourceUrl, options) => {
7
+ validateDeclName(options.name);
8
+ const decl = {
9
+ ...options,
10
+ kind: NodeKind.TypeAliasDecl,
11
+ sourceUrl,
12
+ type: Lazy.of(() => {
13
+ const type = options.type(...options.parameters);
14
+ type.parent = decl;
15
+ return type;
16
+ }),
17
+ };
18
+ return decl;
19
+ };
20
+ export { GenTypeAliasDecl as GenTypeAlias };
21
+ export const TypeAliasDecl = (sourceUrl, options) => {
22
+ validateDeclName(options.name);
23
+ const decl = {
24
+ ...options,
25
+ kind: NodeKind.TypeAliasDecl,
26
+ sourceUrl,
27
+ parameters: [],
28
+ type: Lazy.of(() => {
29
+ const type = options.type();
30
+ type.parent = decl;
31
+ return type;
32
+ }),
33
+ };
34
+ return decl;
35
+ };
36
+ export { TypeAliasDecl as TypeAlias };
37
+ export const isTypeAliasDecl = (node) => node.kind === NodeKind.TypeAliasDecl;
38
+ export const getNestedDeclarationsInTypeAliasDecl = (isDeclAdded, decl) => getNestedDeclarations(isDeclAdded, decl.type.value);
39
+ export const validateTypeAliasDecl = (helpers, decl, args, value) => validate(helpers, resolveTypeArgumentsInType(getTypeArgumentsRecord(decl, args), decl.type.value), value);
40
+ export const resolveTypeArgumentsInTypeAliasDecl = (decl, args) => TypeAliasDecl(decl.sourceUrl, {
41
+ ...decl,
42
+ type: () => resolveTypeArgumentsInType(getTypeArgumentsRecord(decl, args), decl.type.value),
43
+ });
44
+ export const serializeTypeAliasDecl = type => ({
45
+ ...type,
46
+ type: serializeType(type.type.value),
47
+ parameters: type.parameters.map(param => serializeTypeParameter(param)),
48
+ });
49
+ export const getReferencesForTypeAliasDecl = (decl, value) => getReferencesForType(decl.type.value, value);
@@ -0,0 +1,20 @@
1
+ export * from "./declarations/Declaration.js";
2
+ export * from "./declarations/EntityDecl.js";
3
+ export * from "./declarations/EnumDecl.js";
4
+ export * from "./declarations/TypeAliasDecl.js";
5
+ export * from "./Node.js";
6
+ export * from "./parameters/TypeParameter.js";
7
+ export * from "./types/generic/ArrayType.js";
8
+ export * from "./types/generic/ObjectType.js";
9
+ export * from "./types/primitives/BooleanType.js";
10
+ export * from "./types/primitives/DateType.js";
11
+ export * from "./types/primitives/FloatType.js";
12
+ export * from "./types/primitives/IntegerType.js";
13
+ export * from "./types/primitives/NumericType.js";
14
+ export * from "./types/primitives/PrimitiveType.js";
15
+ export * from "./types/primitives/StringType.js";
16
+ export * from "./types/references/GenericArgumentIdentifierType.js";
17
+ export * from "./types/references/IncludeIdentifierType.js";
18
+ export * from "./types/references/NestedEntityMapType.js";
19
+ export * from "./types/references/ReferenceIdentifierType.js";
20
+ export * from "./types/Type.js";
@@ -0,0 +1,20 @@
1
+ export * from "./declarations/Declaration.js";
2
+ export * from "./declarations/EntityDecl.js";
3
+ export * from "./declarations/EnumDecl.js";
4
+ export * from "./declarations/TypeAliasDecl.js";
5
+ export * from "./Node.js";
6
+ export * from "./parameters/TypeParameter.js";
7
+ export * from "./types/generic/ArrayType.js";
8
+ export * from "./types/generic/ObjectType.js";
9
+ export * from "./types/primitives/BooleanType.js";
10
+ export * from "./types/primitives/DateType.js";
11
+ export * from "./types/primitives/FloatType.js";
12
+ export * from "./types/primitives/IntegerType.js";
13
+ export * from "./types/primitives/NumericType.js";
14
+ export * from "./types/primitives/PrimitiveType.js";
15
+ export * from "./types/primitives/StringType.js";
16
+ export * from "./types/references/GenericArgumentIdentifierType.js";
17
+ export * from "./types/references/IncludeIdentifierType.js";
18
+ export * from "./types/references/NestedEntityMapType.js";
19
+ export * from "./types/references/ReferenceIdentifierType.js";
20
+ export * from "./types/Type.js";
@@ -0,0 +1,14 @@
1
+ import { NodeKind, Serializer } from "../Node.js";
2
+ import { SerializedBaseType, SerializedType, Type } from "../types/Type.js";
3
+ export interface TypeParameter<N extends string = string, T extends Type = Type> {
4
+ kind: NodeKind["GenericParameter"];
5
+ name: N;
6
+ constraint?: T;
7
+ }
8
+ export interface SerializedTypeParameter<N extends string = string, T extends SerializedType = SerializedType> extends SerializedBaseType {
9
+ kind: NodeKind["GenericParameter"];
10
+ name: N;
11
+ constraint?: T;
12
+ }
13
+ export declare const Param: <N extends string = string, T extends Type = Type>(name: N, constraint?: T) => TypeParameter<N, T>;
14
+ export declare const serializeTypeParameter: Serializer<TypeParameter, SerializedTypeParameter>;
@@ -0,0 +1,11 @@
1
+ import { NodeKind } from "../Node.js";
2
+ import { removeParentKey, serializeType, } from "../types/Type.js";
3
+ export const Param = (name, constraint) => ({
4
+ kind: NodeKind.GenericParameter,
5
+ name,
6
+ constraint,
7
+ });
8
+ export const serializeTypeParameter = type => ({
9
+ ...removeParentKey(type),
10
+ constraint: type.constraint ? serializeType(type.constraint) : undefined,
11
+ });
@@ -0,0 +1,42 @@
1
+ import { Decl } from "../declarations/Declaration.js";
2
+ import { BaseNode, GetReferences, Serializer } from "../Node.js";
3
+ import { Validator } from "../validation/type.js";
4
+ import { ArrayType, SerializedArrayType } from "./generic/ArrayType.js";
5
+ import { MemberDecl, ObjectType, SerializedMemberDecl, SerializedObjectType } from "./generic/ObjectType.js";
6
+ import { BooleanType, SerializedBooleanType } from "./primitives/BooleanType.js";
7
+ import { DateType, SerializedDateType } from "./primitives/DateType.js";
8
+ import { FloatType, SerializedFloatType } from "./primitives/FloatType.js";
9
+ import { IntegerType, SerializedIntegerType } from "./primitives/IntegerType.js";
10
+ import { PrimitiveType, SerializedPrimitiveType } from "./primitives/PrimitiveType.js";
11
+ import { SerializedStringType, StringType } from "./primitives/StringType.js";
12
+ import { GenericArgumentIdentifierType, SerializedGenericArgumentIdentifierType } from "./references/GenericArgumentIdentifierType.js";
13
+ import { IncludeIdentifierType, SerializedIncludeIdentifierType } from "./references/IncludeIdentifierType.js";
14
+ import { NestedEntityMapType, SerializedNestedEntityMapType } from "./references/NestedEntityMapType.js";
15
+ import { ReferenceIdentifierType, SerializedReferenceIdentifierType } from "./references/ReferenceIdentifierType.js";
16
+ export interface BaseType extends BaseNode {
17
+ /**
18
+ * The parent node of this type will be set when the type is used in a declaration or nested in another type.
19
+ */
20
+ parent?: Type | Decl;
21
+ }
22
+ export interface SerializedBaseType extends BaseNode {
23
+ }
24
+ export type Type = PrimitiveType | ArrayType | ObjectType | GenericArgumentIdentifierType | ReferenceIdentifierType | IncludeIdentifierType | NestedEntityMapType;
25
+ export type SerializedType = SerializedPrimitiveType | SerializedArrayType | SerializedObjectType | SerializedGenericArgumentIdentifierType | SerializedReferenceIdentifierType | SerializedIncludeIdentifierType | SerializedNestedEntityMapType;
26
+ export declare const validate: Validator<Type>;
27
+ export declare const resolveTypeArgumentsInType: <Args extends Record<string, Type>>(args: Args, type: Type) => Type;
28
+ export declare function walkTypeNodeTree(callbackFn: (type: Type) => void, type: Type): void;
29
+ export type AsType<T extends Type> = T extends ArrayType<infer I> ? AsType<I>[] : T extends ObjectType<infer P> ? {
30
+ [K in keyof P]: P[K] extends MemberDecl<Type, true> ? AsType<P[K]["type"]> : AsType<P[K]["type"]> | undefined;
31
+ } : T extends BooleanType ? boolean : T extends DateType ? Date : T extends FloatType ? number : T extends IntegerType ? number : T extends StringType ? string : T extends GenericArgumentIdentifierType ? unknown : T extends IncludeIdentifierType ? unknown : T extends NestedEntityMapType ? unknown : T extends ReferenceIdentifierType ? unknown : never;
32
+ export type SerializedAsType<T extends SerializedType> = T extends SerializedArrayType<infer I> ? SerializedAsType<I>[] : T extends SerializedObjectType<infer P> ? {
33
+ [K in keyof P]: P[K] extends SerializedMemberDecl<SerializedType, true> ? SerializedAsType<P[K]["type"]> : SerializedAsType<P[K]["type"]> | undefined;
34
+ } : T extends SerializedBooleanType ? boolean : T extends SerializedDateType ? Date : T extends SerializedFloatType ? number : T extends SerializedIntegerType ? number : T extends SerializedStringType ? string : T extends SerializedGenericArgumentIdentifierType ? unknown : T extends SerializedIncludeIdentifierType ? unknown : T extends SerializedNestedEntityMapType ? unknown : T extends SerializedReferenceIdentifierType ? unknown : never;
35
+ export type AsNode<T> = T extends (infer I)[] ? ArrayType<AsNode<I>> : T extends Record<string, any> ? ObjectType<{
36
+ [K in keyof T]: T[K] extends MemberDecl<Type, boolean> ? T[K] : T extends null | undefined ? MemberDecl<AsNode<NonNullable<T[K]>>, false> : MemberDecl<AsNode<T[K]>, true>;
37
+ }> : T extends string ? StringType : T extends number ? FloatType : T extends boolean ? BooleanType : never;
38
+ export declare const getParentDecl: (type: Type) => Decl | undefined;
39
+ export declare const findTypeAtPath: (type: Type, path: string[]) => Type | undefined;
40
+ export declare const serializeType: Serializer<Type, SerializedType>;
41
+ export declare const removeParentKey: <T extends BaseType>(type: T) => Omit<T, "parent">;
42
+ export declare const getReferencesForType: GetReferences<Type>;
@@ -0,0 +1,177 @@
1
+ import { assertExhaustive } from "../../shared/utils/typeSafety.js";
2
+ import { isDecl } from "../declarations/Declaration.js";
3
+ import { NodeKind } from "../Node.js";
4
+ import { getReferencesForArrayType, resolveTypeArgumentsInArrayType, serializeArrayType, validateArrayType, } from "./generic/ArrayType.js";
5
+ import { getReferencesForObjectType, resolveTypeArgumentsInObjectType, serializeObjectType, validateObjectType, } from "./generic/ObjectType.js";
6
+ import { getReferencesForBooleanType, serializeBooleanType, validateBooleanType, } from "./primitives/BooleanType.js";
7
+ import { getReferencesForDateType, serializeDateType, validateDateType, } from "./primitives/DateType.js";
8
+ import { getReferencesForFloatType, serializeFloatType, validateFloatType, } from "./primitives/FloatType.js";
9
+ import { getReferencesForIntegerType, serializeIntegerType, validateIntegerType, } from "./primitives/IntegerType.js";
10
+ import { getReferencesForStringType, serializeStringType, validateStringType, } from "./primitives/StringType.js";
11
+ import { getReferencesForGenericArgumentIdentifierType, resolveTypeArgumentsInGenericArgumentIdentifierType, serializeGenericArgumentIdentifierType, validateGenericArgumentIdentifierType, } from "./references/GenericArgumentIdentifierType.js";
12
+ import { getReferencesForIncludeIdentifierType, resolveTypeArgumentsInIncludeIdentifierType, serializeIncludeIdentifierType, validateIncludeIdentifierType, } from "./references/IncludeIdentifierType.js";
13
+ import { getReferencesForNestedEntityMapType, resolveTypeArgumentsInNestedEntityMapType, serializeNestedEntityMapType, validateNestedEntityMapType, } from "./references/NestedEntityMapType.js";
14
+ import { getReferencesForReferenceIdentifierType, resolveTypeArgumentsInReferenceIdentifierType, serializeReferenceIdentifierType, validateReferenceIdentifierType, } from "./references/ReferenceIdentifierType.js";
15
+ export const validate = (helpers, type, value) => {
16
+ switch (type.kind) {
17
+ case NodeKind.ArrayType:
18
+ return validateArrayType(helpers, type, value);
19
+ case NodeKind.ObjectType:
20
+ return validateObjectType(helpers, type, value);
21
+ case NodeKind.BooleanType:
22
+ return validateBooleanType(helpers, type, value);
23
+ case NodeKind.DateType:
24
+ return validateDateType(helpers, type, value);
25
+ case NodeKind.FloatType:
26
+ return validateFloatType(helpers, type, value);
27
+ case NodeKind.IntegerType:
28
+ return validateIntegerType(helpers, type, value);
29
+ case NodeKind.StringType:
30
+ return validateStringType(helpers, type, value);
31
+ case NodeKind.GenericArgumentIdentifierType:
32
+ return validateGenericArgumentIdentifierType(helpers, type, value);
33
+ case NodeKind.ReferenceIdentifierType:
34
+ return validateReferenceIdentifierType(helpers, type, value);
35
+ case NodeKind.IncludeIdentifierType:
36
+ return validateIncludeIdentifierType(helpers, type, value);
37
+ case NodeKind.NestedEntityMapType:
38
+ return validateNestedEntityMapType(helpers, type, value);
39
+ default:
40
+ return assertExhaustive(type);
41
+ }
42
+ };
43
+ export const resolveTypeArgumentsInType = (args, type) => {
44
+ switch (type.kind) {
45
+ case NodeKind.ArrayType:
46
+ return resolveTypeArgumentsInArrayType(args, type);
47
+ case NodeKind.ObjectType:
48
+ return resolveTypeArgumentsInObjectType(args, type);
49
+ case NodeKind.BooleanType:
50
+ case NodeKind.DateType:
51
+ case NodeKind.FloatType:
52
+ case NodeKind.IntegerType:
53
+ case NodeKind.StringType:
54
+ return type;
55
+ case NodeKind.GenericArgumentIdentifierType:
56
+ return resolveTypeArgumentsInGenericArgumentIdentifierType(args, type);
57
+ case NodeKind.ReferenceIdentifierType:
58
+ return resolveTypeArgumentsInReferenceIdentifierType(args, type);
59
+ case NodeKind.IncludeIdentifierType:
60
+ return resolveTypeArgumentsInIncludeIdentifierType(args, type);
61
+ case NodeKind.NestedEntityMapType:
62
+ return resolveTypeArgumentsInNestedEntityMapType(args, type);
63
+ default:
64
+ return assertExhaustive(type);
65
+ }
66
+ };
67
+ export function walkTypeNodeTree(callbackFn, type) {
68
+ switch (type.kind) {
69
+ case NodeKind.ArrayType:
70
+ callbackFn(type);
71
+ return walkTypeNodeTree(callbackFn, type.items);
72
+ case NodeKind.ObjectType:
73
+ callbackFn(type);
74
+ return Object.values(type.properties).forEach(prop => walkTypeNodeTree(callbackFn, prop.type));
75
+ case NodeKind.NestedEntityMapType:
76
+ callbackFn(type);
77
+ return walkTypeNodeTree(callbackFn, type.type.value);
78
+ case NodeKind.BooleanType:
79
+ case NodeKind.DateType:
80
+ case NodeKind.FloatType:
81
+ case NodeKind.IntegerType:
82
+ case NodeKind.StringType:
83
+ case NodeKind.GenericArgumentIdentifierType:
84
+ case NodeKind.ReferenceIdentifierType:
85
+ case NodeKind.IncludeIdentifierType:
86
+ return callbackFn(type);
87
+ default:
88
+ return assertExhaustive(type);
89
+ }
90
+ }
91
+ export const getParentDecl = (type) => {
92
+ if (type.parent === undefined) {
93
+ return undefined;
94
+ }
95
+ else if (isDecl(type.parent)) {
96
+ return type.parent;
97
+ }
98
+ else {
99
+ return getParentDecl(type.parent);
100
+ }
101
+ };
102
+ export const findTypeAtPath = (type, path) => {
103
+ if (path.length === 0) {
104
+ return type;
105
+ }
106
+ const [head, ...tail] = path;
107
+ if (type.kind === NodeKind.ObjectType) {
108
+ const prop = type.properties[head];
109
+ if (prop) {
110
+ return findTypeAtPath(prop.type, tail);
111
+ }
112
+ }
113
+ else if (type.kind === NodeKind.ArrayType && head === "0") {
114
+ return findTypeAtPath(type.items, path);
115
+ }
116
+ return undefined;
117
+ };
118
+ export const serializeType = type => {
119
+ switch (type.kind) {
120
+ case NodeKind.ArrayType:
121
+ return serializeArrayType(type);
122
+ case NodeKind.ObjectType:
123
+ return serializeObjectType(type);
124
+ case NodeKind.BooleanType:
125
+ return serializeBooleanType(type);
126
+ case NodeKind.DateType:
127
+ return serializeDateType(type);
128
+ case NodeKind.FloatType:
129
+ return serializeFloatType(type);
130
+ case NodeKind.IntegerType:
131
+ return serializeIntegerType(type);
132
+ case NodeKind.StringType:
133
+ return serializeStringType(type);
134
+ case NodeKind.GenericArgumentIdentifierType:
135
+ return serializeGenericArgumentIdentifierType(type);
136
+ case NodeKind.ReferenceIdentifierType:
137
+ return serializeReferenceIdentifierType(type);
138
+ case NodeKind.IncludeIdentifierType:
139
+ return serializeIncludeIdentifierType(type);
140
+ case NodeKind.NestedEntityMapType:
141
+ return serializeNestedEntityMapType(type);
142
+ default:
143
+ return assertExhaustive(type);
144
+ }
145
+ };
146
+ export const removeParentKey = (type) => {
147
+ const { parent: _parent, ...rest } = type;
148
+ return rest;
149
+ };
150
+ export const getReferencesForType = (type, value) => {
151
+ switch (type.kind) {
152
+ case NodeKind.ArrayType:
153
+ return getReferencesForArrayType(type, value);
154
+ case NodeKind.ObjectType:
155
+ return getReferencesForObjectType(type, value);
156
+ case NodeKind.BooleanType:
157
+ return getReferencesForBooleanType(type, value);
158
+ case NodeKind.DateType:
159
+ return getReferencesForDateType(type, value);
160
+ case NodeKind.FloatType:
161
+ return getReferencesForFloatType(type, value);
162
+ case NodeKind.IntegerType:
163
+ return getReferencesForIntegerType(type, value);
164
+ case NodeKind.StringType:
165
+ return getReferencesForStringType(type, value);
166
+ case NodeKind.GenericArgumentIdentifierType:
167
+ return getReferencesForGenericArgumentIdentifierType(type, value);
168
+ case NodeKind.ReferenceIdentifierType:
169
+ return getReferencesForReferenceIdentifierType(type, value);
170
+ case NodeKind.IncludeIdentifierType:
171
+ return getReferencesForIncludeIdentifierType(type, value);
172
+ case NodeKind.NestedEntityMapType:
173
+ return getReferencesForNestedEntityMapType(type, value);
174
+ default:
175
+ return assertExhaustive(type);
176
+ }
177
+ };
@@ -0,0 +1,30 @@
1
+ import { GetNestedDeclarations } from "../../declarations/Declaration.js";
2
+ import { GetReferences, Node, NodeKind, Serializer } from "../../Node.js";
3
+ import { Validator } from "../../validation/type.js";
4
+ import { BaseType, SerializedBaseType, SerializedType, Type } from "../Type.js";
5
+ export interface ArrayType<T extends Type = Type> extends BaseType {
6
+ kind: NodeKind["ArrayType"];
7
+ minItems?: number;
8
+ maxItems?: number;
9
+ uniqueItems?: boolean;
10
+ items: T;
11
+ }
12
+ export interface SerializedArrayType<T extends SerializedType = SerializedType> extends SerializedBaseType {
13
+ kind: NodeKind["ArrayType"];
14
+ minItems?: number;
15
+ maxItems?: number;
16
+ uniqueItems?: boolean;
17
+ items: T;
18
+ }
19
+ export declare const ArrayType: <T extends Type>(items: T, options?: {
20
+ minItems?: number;
21
+ maxItems?: number;
22
+ uniqueItems?: boolean;
23
+ }) => ArrayType<T>;
24
+ export { ArrayType as Array };
25
+ export declare const isArrayType: (node: Node) => node is ArrayType;
26
+ export declare const getNestedDeclarationsInArrayType: GetNestedDeclarations<ArrayType>;
27
+ export declare const validateArrayType: Validator<ArrayType>;
28
+ export declare const resolveTypeArgumentsInArrayType: (args: Record<string, Type>, type: ArrayType) => ArrayType;
29
+ export declare const serializeArrayType: Serializer<ArrayType, SerializedArrayType>;
30
+ export declare const getReferencesForArrayType: GetReferences<ArrayType>;
@@ -0,0 +1,38 @@
1
+ import { parallelizeErrors } from "../../../shared/utils/validation.js";
2
+ import { validateArrayConstraints } from "../../../shared/validation/array.js";
3
+ import { wrapErrorsIfAny } from "../../../utils/error.js";
4
+ import { getNestedDeclarations } from "../../declarations/Declaration.js";
5
+ import { NodeKind } from "../../Node.js";
6
+ import { validateOption } from "../../validation/options.js";
7
+ import { getReferencesForType, removeParentKey, resolveTypeArgumentsInType, serializeType, validate, } from "../Type.js";
8
+ export const ArrayType = (items, options = {}) => {
9
+ const type = {
10
+ ...options,
11
+ kind: NodeKind.ArrayType,
12
+ minItems: validateOption(options.minItems, "minItems", option => Number.isInteger(option) && option >= 0),
13
+ maxItems: validateOption(options.maxItems, "maxItems", option => Number.isInteger(option) && option >= 0),
14
+ items,
15
+ };
16
+ items.parent = type;
17
+ return type;
18
+ };
19
+ export { ArrayType as Array };
20
+ export const isArrayType = (node) => node.kind === NodeKind.ArrayType;
21
+ export const getNestedDeclarationsInArrayType = (isDeclAdded, type) => getNestedDeclarations(isDeclAdded, type.items);
22
+ export const validateArrayType = (helpers, type, value) => {
23
+ if (!Array.isArray(value)) {
24
+ return [TypeError(`expected an array, but got ${JSON.stringify(value)}`)];
25
+ }
26
+ return parallelizeErrors([
27
+ ...validateArrayConstraints(type, value),
28
+ ...value.map((item, index) => wrapErrorsIfAny(`at index ${index}`, validate(helpers, type.items, item))),
29
+ ]);
30
+ };
31
+ export const resolveTypeArgumentsInArrayType = (args, type) => ArrayType(resolveTypeArgumentsInType(args, type.items), {
32
+ ...type,
33
+ });
34
+ export const serializeArrayType = type => ({
35
+ ...removeParentKey(type),
36
+ items: serializeType(type.items),
37
+ });
38
+ export const getReferencesForArrayType = (type, value) => Array.isArray(value) ? value.flatMap(item => getReferencesForType(type.items, item)) : [];