tsondb 0.2.0 → 0.4.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 (228) hide show
  1. package/LICENSE +385 -0
  2. package/README.md +173 -1
  3. package/lib/bin/tsondb.d.ts +8 -0
  4. package/lib/bin/tsondb.js +83 -0
  5. package/lib/index.d.ts +2 -1
  6. package/lib/index.js +1 -1
  7. package/lib/{Schema.d.ts → node/Schema.d.ts} +2 -2
  8. package/lib/{Schema.js → node/Schema.js} +1 -1
  9. package/lib/node/index.d.ts +8 -0
  10. package/lib/node/index.js +62 -0
  11. package/lib/{renderers → node/renderers}/Output.d.ts +1 -1
  12. package/lib/node/renderers/jsonschema/index.d.ts +6 -0
  13. package/lib/node/renderers/jsonschema/index.js +35 -0
  14. package/lib/node/renderers/jsonschema/render.d.ts +9 -0
  15. package/lib/{renderers → node/renderers}/jsonschema/render.js +42 -23
  16. package/lib/node/renderers/ts/index.d.ts +6 -0
  17. package/lib/node/renderers/ts/index.js +42 -0
  18. package/lib/{renderers → node/renderers}/ts/render.d.ts +3 -1
  19. package/lib/node/renderers/ts/render.js +136 -0
  20. package/lib/{schema → node/schema}/Node.d.ts +5 -4
  21. package/lib/{schema → node/schema}/Node.js +11 -6
  22. package/lib/{schema/parameters → node/schema}/TypeParameter.d.ts +3 -2
  23. package/lib/{schema/parameters → node/schema}/TypeParameter.js +2 -2
  24. package/lib/{schema → node/schema}/declarations/Declaration.d.ts +11 -10
  25. package/lib/{schema → node/schema}/declarations/Declaration.js +10 -4
  26. package/lib/{schema → node/schema}/declarations/EntityDecl.d.ts +13 -9
  27. package/lib/{schema → node/schema}/declarations/EntityDecl.js +2 -2
  28. package/lib/{schema → node/schema}/declarations/EnumDecl.d.ts +11 -26
  29. package/lib/node/schema/declarations/EnumDecl.js +52 -0
  30. package/lib/{schema → node/schema}/declarations/TypeAliasDecl.d.ts +8 -7
  31. package/lib/{schema → node/schema}/declarations/TypeAliasDecl.js +3 -3
  32. package/lib/{schema → node/schema}/index.d.ts +4 -3
  33. package/lib/{schema → node/schema}/index.js +3 -3
  34. package/lib/node/schema/types/Type.d.ts +48 -0
  35. package/lib/{schema → node/schema}/types/Type.js +90 -28
  36. package/lib/{schema → node/schema}/types/generic/ArrayType.d.ts +6 -4
  37. package/lib/{schema → node/schema}/types/generic/ArrayType.js +5 -4
  38. package/lib/node/schema/types/generic/EnumType.d.ts +39 -0
  39. package/lib/node/schema/types/generic/EnumType.js +98 -0
  40. package/lib/{schema → node/schema}/types/generic/ObjectType.d.ts +9 -7
  41. package/lib/{schema → node/schema}/types/generic/ObjectType.js +11 -3
  42. package/lib/{schema → node/schema}/types/primitives/BooleanType.d.ts +5 -3
  43. package/lib/{schema → node/schema}/types/primitives/BooleanType.js +1 -0
  44. package/lib/{schema → node/schema}/types/primitives/DateType.d.ts +6 -4
  45. package/lib/{schema → node/schema}/types/primitives/DateType.js +2 -1
  46. package/lib/{schema → node/schema}/types/primitives/FloatType.d.ts +6 -4
  47. package/lib/{schema → node/schema}/types/primitives/FloatType.js +2 -1
  48. package/lib/{schema → node/schema}/types/primitives/IntegerType.d.ts +6 -4
  49. package/lib/{schema → node/schema}/types/primitives/IntegerType.js +2 -1
  50. package/lib/{schema → node/schema}/types/primitives/NumericType.d.ts +2 -2
  51. package/lib/node/schema/types/primitives/PrimitiveType.d.ts +6 -0
  52. package/lib/{schema → node/schema}/types/primitives/StringType.d.ts +6 -4
  53. package/lib/{schema → node/schema}/types/primitives/StringType.js +2 -1
  54. package/lib/{schema → node/schema}/types/references/IncludeIdentifierType.d.ts +11 -8
  55. package/lib/{schema → node/schema}/types/references/IncludeIdentifierType.js +15 -2
  56. package/lib/{schema → node/schema}/types/references/NestedEntityMapType.d.ts +11 -9
  57. package/lib/{schema → node/schema}/types/references/NestedEntityMapType.js +6 -2
  58. package/lib/{schema → node/schema}/types/references/ReferenceIdentifierType.d.ts +8 -6
  59. package/lib/{schema → node/schema}/types/references/ReferenceIdentifierType.js +1 -0
  60. package/lib/node/schema/types/references/TypeArgumentType.d.ts +23 -0
  61. package/lib/node/schema/types/references/TypeArgumentType.js +19 -0
  62. package/lib/node/schema/validation/type.d.ts +4 -0
  63. package/lib/node/server/api/declarations.d.ts +1 -0
  64. package/lib/node/server/api/declarations.js +154 -0
  65. package/lib/node/server/api/git.d.ts +1 -0
  66. package/lib/node/server/api/git.js +178 -0
  67. package/lib/node/server/api/index.d.ts +1 -0
  68. package/lib/node/server/api/index.js +8 -0
  69. package/lib/node/server/api/instanceOperations.d.ts +6 -0
  70. package/lib/node/server/api/instanceOperations.js +91 -0
  71. package/lib/node/server/api/instances.d.ts +1 -0
  72. package/lib/node/server/api/instances.js +27 -0
  73. package/lib/node/server/index.d.ts +28 -0
  74. package/lib/node/server/index.js +53 -0
  75. package/lib/node/server/init.d.ts +5 -0
  76. package/lib/node/server/init.js +56 -0
  77. package/lib/{utils → node/utils}/error.js +4 -1
  78. package/lib/node/utils/git.d.ts +3 -0
  79. package/lib/node/utils/git.js +12 -0
  80. package/lib/node/utils/instances.d.ts +5 -0
  81. package/lib/node/utils/instances.js +21 -0
  82. package/lib/node/utils/path.d.ts +1 -0
  83. package/lib/node/utils/path.js +2 -0
  84. package/lib/node/utils/references.d.ts +7 -0
  85. package/lib/node/utils/references.js +40 -0
  86. package/lib/node/utils/render.d.ts +9 -0
  87. package/lib/node/utils/render.js +34 -0
  88. package/lib/shared/api.d.ts +19 -2
  89. package/lib/shared/utils/array.d.ts +19 -0
  90. package/lib/shared/utils/array.js +30 -0
  91. package/lib/shared/utils/displayName.d.ts +1 -1
  92. package/lib/shared/utils/displayName.js +4 -2
  93. package/lib/shared/utils/git.d.ts +12 -0
  94. package/lib/shared/utils/git.js +98 -0
  95. package/lib/shared/utils/instances.d.ts +10 -0
  96. package/lib/shared/utils/instances.js +8 -1
  97. package/lib/{utils → shared/utils}/lazy.js +1 -1
  98. package/lib/shared/utils/markdown.d.ts +14 -0
  99. package/lib/shared/utils/markdown.js +42 -0
  100. package/lib/shared/utils/object.d.ts +4 -0
  101. package/lib/shared/utils/object.js +5 -0
  102. package/lib/{utils → shared/utils}/result.js +2 -2
  103. package/lib/shared/utils/string.d.ts +1 -0
  104. package/lib/shared/utils/string.js +16 -4
  105. package/lib/shared/utils/validation.js +3 -2
  106. package/lib/shared/validation/number.js +3 -3
  107. package/lib/shared/validation/object.js +4 -3
  108. package/lib/shared/validation/string.js +12 -7
  109. package/lib/web/api.d.ts +24 -0
  110. package/lib/web/api.js +204 -0
  111. package/lib/web/components/Git.d.ts +2 -0
  112. package/lib/web/components/Git.js +160 -0
  113. package/lib/{client → web}/components/Layout.d.ts +1 -1
  114. package/lib/{client → web}/components/Layout.js +2 -1
  115. package/lib/web/components/Select.d.ts +3 -0
  116. package/lib/web/components/Select.js +5 -0
  117. package/lib/web/components/typeInputs/ArrayTypeInput.d.ts +13 -0
  118. package/lib/{client → web}/components/typeInputs/ArrayTypeInput.js +8 -1
  119. package/lib/{client → web}/components/typeInputs/BooleanTypeInput.d.ts +2 -2
  120. package/lib/{client → web}/components/typeInputs/DateTypeInput.d.ts +2 -2
  121. package/lib/web/components/typeInputs/EnumTypeInput.d.ts +13 -0
  122. package/lib/{client/components/typeInputs/utils/EnumDeclField.js → web/components/typeInputs/EnumTypeInput.js} +11 -11
  123. package/lib/{client → web}/components/typeInputs/FloatTypeInput.d.ts +2 -2
  124. package/lib/web/components/typeInputs/GenericTypeArgumentIdentifierTypeInput.d.ts +7 -0
  125. package/lib/{client → web}/components/typeInputs/GenericTypeArgumentIdentifierTypeInput.js +1 -1
  126. package/lib/web/components/typeInputs/IncludeIdentifierTypeInput.d.ts +13 -0
  127. package/lib/web/components/typeInputs/IncludeIdentifierTypeInput.js +9 -0
  128. package/lib/{client → web}/components/typeInputs/IntegerTypeInput.d.ts +2 -2
  129. package/lib/web/components/typeInputs/NestedEntityMapTypeInput.d.ts +13 -0
  130. package/lib/{client → web}/components/typeInputs/NestedEntityMapTypeInput.js +7 -2
  131. package/lib/{client → web}/components/typeInputs/ObjectTypeInput.d.ts +4 -4
  132. package/lib/{client → web}/components/typeInputs/ObjectTypeInput.js +4 -1
  133. package/lib/{client → web}/components/typeInputs/ReferenceIdentifierTypeInput.d.ts +3 -3
  134. package/lib/web/components/typeInputs/ReferenceIdentifierTypeInput.js +11 -0
  135. package/lib/{client → web}/components/typeInputs/StringTypeInput.d.ts +2 -2
  136. package/lib/web/components/typeInputs/TypeInput.d.ts +13 -0
  137. package/lib/{client → web}/components/typeInputs/TypeInput.js +6 -3
  138. package/lib/{client → web}/components/typeInputs/utils/Markdown.d.ts +1 -1
  139. package/lib/web/components/typeInputs/utils/Markdown.js +26 -0
  140. package/lib/{client → web}/components/typeInputs/utils/MismatchingTypeError.d.ts +1 -1
  141. package/lib/{client → web}/components/typeInputs/utils/ValidationErrors.d.ts +1 -1
  142. package/lib/web/hooks/useAPIResource.d.ts +1 -0
  143. package/lib/web/hooks/useAPIResource.js +2 -0
  144. package/lib/{client → web}/hooks/useEntityFromRoute.d.ts +1 -1
  145. package/lib/{client → web}/hooks/useEntityFromRoute.js +1 -1
  146. package/lib/{client → web}/hooks/useInstanceNamesByEntity.d.ts +1 -1
  147. package/lib/{client → web}/hooks/useInstanceNamesByEntity.js +8 -6
  148. package/lib/web/hooks/useMappedAPIResource.d.ts +1 -0
  149. package/lib/web/hooks/useMappedAPIResource.js +17 -0
  150. package/lib/{client → web}/hooks/useSecondaryDeclarations.d.ts +1 -1
  151. package/lib/{client → web}/hooks/useSecondaryDeclarations.js +4 -2
  152. package/lib/{client → web}/routes/CreateInstance.d.ts +1 -1
  153. package/lib/{client → web}/routes/CreateInstance.js +4 -2
  154. package/lib/web/routes/Entity.d.ts +2 -0
  155. package/lib/web/routes/Entity.js +43 -0
  156. package/lib/web/routes/Home.d.ts +2 -0
  157. package/lib/web/routes/Home.js +9 -0
  158. package/lib/{client → web}/routes/Instance.d.ts +1 -1
  159. package/lib/{client → web}/routes/Instance.js +14 -8
  160. package/lib/{client → web}/routes/NotFound.d.ts +1 -1
  161. package/lib/web/utils/typeSkeleton.d.ts +3 -0
  162. package/lib/{client → web}/utils/typeSkeleton.js +14 -17
  163. package/package.json +35 -15
  164. package/public/css/styles.css +200 -1
  165. package/lib/ModelContainer.d.ts +0 -17
  166. package/lib/ModelContainer.js +0 -63
  167. package/lib/client/api.d.ts +0 -11
  168. package/lib/client/api.js +0 -83
  169. package/lib/client/components/Select.d.ts +0 -3
  170. package/lib/client/components/Select.js +0 -2
  171. package/lib/client/components/typeInputs/ArrayTypeInput.d.ts +0 -13
  172. package/lib/client/components/typeInputs/GenericTypeArgumentIdentifierTypeInput.d.ts +0 -7
  173. package/lib/client/components/typeInputs/IncludeIdentifierTypeInput.d.ts +0 -13
  174. package/lib/client/components/typeInputs/IncludeIdentifierTypeInput.js +0 -18
  175. package/lib/client/components/typeInputs/NestedEntityMapTypeInput.d.ts +0 -13
  176. package/lib/client/components/typeInputs/ReferenceIdentifierTypeInput.js +0 -9
  177. package/lib/client/components/typeInputs/TypeInput.d.ts +0 -13
  178. package/lib/client/components/typeInputs/utils/EnumDeclField.d.ts +0 -13
  179. package/lib/client/components/typeInputs/utils/Markdown.js +0 -57
  180. package/lib/client/routes/Entity.d.ts +0 -2
  181. package/lib/client/routes/Entity.js +0 -47
  182. package/lib/client/routes/Home.d.ts +0 -2
  183. package/lib/client/routes/Home.js +0 -18
  184. package/lib/client/utils/typeSkeleton.d.ts +0 -3
  185. package/lib/renderers/jsonschema/index.d.ts +0 -6
  186. package/lib/renderers/jsonschema/index.js +0 -12
  187. package/lib/renderers/jsonschema/render.d.ts +0 -5
  188. package/lib/renderers/ts/index.d.ts +0 -6
  189. package/lib/renderers/ts/index.js +0 -11
  190. package/lib/renderers/ts/render.js +0 -112
  191. package/lib/schema/declarations/EnumDecl.js +0 -115
  192. package/lib/schema/types/Type.d.ts +0 -42
  193. package/lib/schema/types/primitives/PrimitiveType.d.ts +0 -6
  194. package/lib/schema/types/references/GenericArgumentIdentifierType.d.ts +0 -21
  195. package/lib/schema/types/references/GenericArgumentIdentifierType.js +0 -18
  196. package/lib/schema/validation/type.d.ts +0 -4
  197. package/lib/server/index.d.ts +0 -8
  198. package/lib/server/index.js +0 -207
  199. package/lib/server/instanceOperations.d.ts +0 -7
  200. package/lib/server/instanceOperations.js +0 -67
  201. package/lib/tsconfig.tsbuildinfo +0 -1
  202. package/lib/utils/instances.d.ts +0 -4
  203. package/lib/utils/instances.js +0 -12
  204. package/lib/utils/object.d.ts +0 -3
  205. package/lib/utils/object.js +0 -1
  206. package/lib/utils/render.d.ts +0 -4
  207. package/lib/utils/render.js +0 -8
  208. /package/lib/{renderers → node/renderers}/Output.js +0 -0
  209. /package/lib/{schema → node/schema}/types/primitives/NumericType.js +0 -0
  210. /package/lib/{schema → node/schema}/types/primitives/PrimitiveType.js +0 -0
  211. /package/lib/{schema → node/schema}/validation/options.d.ts +0 -0
  212. /package/lib/{schema → node/schema}/validation/options.js +0 -0
  213. /package/lib/{schema → node/schema}/validation/type.js +0 -0
  214. /package/lib/{utils → node/utils}/error.d.ts +0 -0
  215. /package/lib/{utils → shared/utils}/enum.d.ts +0 -0
  216. /package/lib/{utils → shared/utils}/enum.js +0 -0
  217. /package/lib/{utils → shared/utils}/lazy.d.ts +0 -0
  218. /package/lib/{utils → shared/utils}/result.d.ts +0 -0
  219. /package/lib/{client → web}/components/typeInputs/BooleanTypeInput.js +0 -0
  220. /package/lib/{client → web}/components/typeInputs/DateTypeInput.js +0 -0
  221. /package/lib/{client → web}/components/typeInputs/FloatTypeInput.js +0 -0
  222. /package/lib/{client → web}/components/typeInputs/IntegerTypeInput.js +0 -0
  223. /package/lib/{client → web}/components/typeInputs/StringTypeInput.js +0 -0
  224. /package/lib/{client → web}/components/typeInputs/utils/MismatchingTypeError.js +0 -0
  225. /package/lib/{client → web}/components/typeInputs/utils/ValidationErrors.js +0 -0
  226. /package/lib/{client → web}/index.d.ts +0 -0
  227. /package/lib/{client → web}/index.js +0 -0
  228. /package/lib/{client → web}/routes/NotFound.js +0 -0
@@ -1,6 +1,6 @@
1
- import { FunctionComponent } from "preact";
2
- import { SerializedReferenceIdentifierType } from "../../../schema/types/references/ReferenceIdentifierType.js";
3
- import { InstanceNamesByEntity } from "../../hooks/useInstanceNamesByEntity.js";
1
+ import type { FunctionComponent } from "preact";
2
+ import type { SerializedReferenceIdentifierType } from "../../../node/schema/types/references/ReferenceIdentifierType.js";
3
+ import type { InstanceNamesByEntity } from "../../hooks/useInstanceNamesByEntity.js";
4
4
  type Props = {
5
5
  type: SerializedReferenceIdentifierType;
6
6
  value: string;
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { Select } from "../Select.js";
3
+ import { ValidationErrors } from "./utils/ValidationErrors.js";
4
+ export const ReferenceIdentifierTypeInput = ({ type, value, instanceNamesByEntity, onChange, }) => {
5
+ const instances = (instanceNamesByEntity[type.entity] ?? [])
6
+ .slice()
7
+ .sort((a, b) => a.name.localeCompare(b.name));
8
+ return (_jsxs("div", { class: "field", children: [_jsxs(Select, { value: value, onInput: event => {
9
+ onChange(event.currentTarget.value);
10
+ }, disabled: instances.length === 0, "aria-invalid": !value, children: [instances.length === 0 ? (_jsx("option", { value: "", disabled: true, children: "No instances available" })) : (_jsx("option", { value: "", disabled: true, children: "No selected instance" })), instances.map(instance => (_jsx("option", { value: instance.id, children: instance.name }, instance.id)))] }), _jsx(ValidationErrors, { errors: !value ? [ReferenceError("no reference provided")] : [] })] }));
11
+ };
@@ -1,5 +1,5 @@
1
- import { FunctionComponent } from "preact";
2
- import { SerializedStringType } from "../../../schema/types/primitives/StringType.js";
1
+ import type { FunctionComponent } from "preact";
2
+ import type { SerializedStringType } from "../../../node/schema/types/primitives/StringType.js";
3
3
  type Props = {
4
4
  type: SerializedStringType;
5
5
  value: string;
@@ -0,0 +1,13 @@
1
+ import type { FunctionComponent } from "preact";
2
+ import type { SerializedType } from "../../../node/schema/types/Type.js";
3
+ import type { InstanceNamesByEntity } from "../../hooks/useInstanceNamesByEntity.js";
4
+ import type { GetDeclFromDeclName } from "../../hooks/useSecondaryDeclarations.js";
5
+ type Props = {
6
+ type: SerializedType;
7
+ value: unknown;
8
+ instanceNamesByEntity: InstanceNamesByEntity;
9
+ getDeclFromDeclName: GetDeclFromDeclName;
10
+ onChange: (value: unknown) => void;
11
+ };
12
+ export declare const TypeInput: FunctionComponent<Props>;
13
+ export {};
@@ -3,8 +3,9 @@ import { assertExhaustive } from "../../../shared/utils/typeSafety.js";
3
3
  import { ArrayTypeInput } from "./ArrayTypeInput.js";
4
4
  import { BooleanTypeInput } from "./BooleanTypeInput.js";
5
5
  import { DateTypeInput } from "./DateTypeInput.js";
6
+ import { EnumTypeInput } from "./EnumTypeInput.js";
6
7
  import { FloatTypeInput } from "./FloatTypeInput.js";
7
- import { GenericArgumentIdentifierTypeInput } from "./GenericTypeArgumentIdentifierTypeInput.js";
8
+ import { TypeArgumentTypeInput } from "./GenericTypeArgumentIdentifierTypeInput.js";
8
9
  import { IncludeIdentifierTypeInput } from "./IncludeIdentifierTypeInput.js";
9
10
  import { IntegerTypeInput } from "./IntegerTypeInput.js";
10
11
  import { NestedEntityMapTypeInput } from "./NestedEntityMapTypeInput.js";
@@ -63,8 +64,8 @@ export const TypeInput = ({ type, value, instanceNamesByEntity, getDeclFromDeclN
63
64
  else {
64
65
  return _jsx(MismatchingTypeError, { expected: "object", actual: value });
65
66
  }
66
- case "GenericArgumentIdentifierType":
67
- return _jsx(GenericArgumentIdentifierTypeInput, { type: type });
67
+ case "TypeArgumentType":
68
+ return _jsx(TypeArgumentTypeInput, { type: type });
68
69
  case "ReferenceIdentifierType":
69
70
  if (typeof value === "string") {
70
71
  return (_jsx(ReferenceIdentifierTypeInput, { type: type, value: value, instanceNamesByEntity: instanceNamesByEntity, onChange: onChange }));
@@ -81,6 +82,8 @@ export const TypeInput = ({ type, value, instanceNamesByEntity, getDeclFromDeclN
81
82
  else {
82
83
  return _jsx(MismatchingTypeError, { expected: "entity map", actual: value });
83
84
  }
85
+ case "EnumType":
86
+ return (_jsx(EnumTypeInput, { type: type, value: value, instanceNamesByEntity: instanceNamesByEntity, getDeclFromDeclName: getDeclFromDeclName, onChange: onChange }));
84
87
  default:
85
88
  return assertExhaustive(type);
86
89
  }
@@ -1,4 +1,4 @@
1
- import { FunctionalComponent } from "preact";
1
+ import type { FunctionalComponent } from "preact";
2
2
  type Props = {
3
3
  string: string;
4
4
  };
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx } from "preact/jsx-runtime";
2
+ import { parseBlockMarkdown } from "../../../../shared/utils/markdown.js";
3
+ export const Markdown = ({ string }) => {
4
+ const blocks = parseBlockMarkdown(string);
5
+ return blocks.map((block, i) => _jsx(BlockMarkdown, { node: block }, `md-block-${i.toString()}`));
6
+ };
7
+ const BlockMarkdown = ({ node }) => {
8
+ switch (node.kind) {
9
+ case "paragraph":
10
+ return (_jsx("p", { children: node.content.map((inline, ii) => (_jsx(InlineMarkdown, { node: inline }, ii))) }));
11
+ case "text":
12
+ return node.content;
13
+ default:
14
+ return null;
15
+ }
16
+ };
17
+ const InlineMarkdown = ({ node }) => {
18
+ switch (node.kind) {
19
+ case "bold":
20
+ return (_jsx("strong", { children: node.content.map((inline, i) => (_jsx(InlineMarkdown, { node: inline }, i))) }));
21
+ case "italic":
22
+ return (_jsx("em", { children: node.content.map((inline, i) => (_jsx(InlineMarkdown, { node: inline }, i))) }));
23
+ case "text":
24
+ return node.content;
25
+ }
26
+ };
@@ -1,4 +1,4 @@
1
- import { FunctionComponent } from "preact";
1
+ import type { FunctionComponent } from "preact";
2
2
  type Props = {
3
3
  expected: string;
4
4
  actual: unknown;
@@ -1,4 +1,4 @@
1
- import { FunctionComponent } from "preact";
1
+ import type { FunctionComponent } from "preact";
2
2
  type Props = {
3
3
  errors: Error[];
4
4
  };
@@ -0,0 +1 @@
1
+ export declare const useAPIResource: <T, A extends unknown[]>(apiFn: (...args: A) => Promise<T>, ...args: A) => [T | undefined, () => Promise<void>];
@@ -0,0 +1,2 @@
1
+ import { useMappedAPIResource } from "./useMappedAPIResource.js";
2
+ export const useAPIResource = (apiFn, ...args) => useMappedAPIResource(apiFn, data => data, ...args);
@@ -1,4 +1,4 @@
1
- import { SerializedEntityDecl } from "../../schema/declarations/EntityDecl.js";
1
+ import type { SerializedEntityDecl } from "../../node/schema/declarations/EntityDecl.js";
2
2
  export declare const useEntityFromRoute: () => {
3
3
  entity: SerializedEntityDecl;
4
4
  isLocaleEntity: boolean;
@@ -10,7 +10,7 @@ export const useEntityFromRoute = () => {
10
10
  .then(data => {
11
11
  setEntityData(data);
12
12
  })
13
- .catch(error => {
13
+ .catch((error) => {
14
14
  console.error("Error fetching data:", error);
15
15
  });
16
16
  }
@@ -1,3 +1,3 @@
1
- import { GetAllInstancesResponseBody } from "../../shared/api.js";
1
+ import type { GetAllInstancesResponseBody } from "../../shared/api.js";
2
2
  export type InstanceNamesByEntity = GetAllInstancesResponseBody["instances"];
3
3
  export declare const useInstanceNamesByEntity: (locales?: string[]) => [InstanceNamesByEntity, () => void];
@@ -1,18 +1,20 @@
1
- import { useEffect, useState } from "preact/hooks";
1
+ import { useCallback, useEffect, useState } from "preact/hooks";
2
2
  import { getAllInstances } from "../api.js";
3
3
  export const useInstanceNamesByEntity = (locales = []) => {
4
4
  const [instanceNamesByEntity, setInstanceNamesByEntity] = useState({});
5
- const updateInstanceNamesByEntity = () => {
5
+ const updateInstanceNamesByEntity = useCallback(() => {
6
6
  getAllInstances(locales)
7
7
  .then(data => {
8
8
  setInstanceNamesByEntity(data.instances);
9
9
  })
10
- .catch(error => {
11
- console.error("Error fetching data:", error);
10
+ .catch((error) => {
11
+ if (error instanceof Error) {
12
+ console.error("Error fetching data:", error.toString());
13
+ }
12
14
  });
13
- };
15
+ }, [locales]);
14
16
  useEffect(() => {
15
17
  updateInstanceNamesByEntity();
16
- }, []);
18
+ }, [updateInstanceNamesByEntity]);
17
19
  return [instanceNamesByEntity, updateInstanceNamesByEntity];
18
20
  };
@@ -0,0 +1 @@
1
+ export declare const useMappedAPIResource: <T, A extends unknown[], U>(apiFn: (...args: A) => Promise<T>, mapFn: (data: T) => U, ...args: A) => [U | undefined, () => Promise<void>];
@@ -0,0 +1,17 @@
1
+ import { useCallback, useEffect, useState } from "preact/hooks";
2
+ export const useMappedAPIResource = (apiFn, mapFn, ...args) => {
3
+ const [data, setData] = useState();
4
+ const fetchData = useCallback(() => apiFn(...args).then(result => {
5
+ setData(mapFn(result));
6
+ }), [apiFn, args, mapFn]);
7
+ useEffect(() => {
8
+ fetchData().catch((err) => {
9
+ console.log(err);
10
+ });
11
+ }, [fetchData]);
12
+ const reload = useCallback(() => {
13
+ setData(undefined);
14
+ return fetchData();
15
+ }, [fetchData]);
16
+ return [data, reload];
17
+ };
@@ -1,3 +1,3 @@
1
- import { SerializedSecondaryDecl } from "../../schema/declarations/Declaration.js";
1
+ import type { SerializedSecondaryDecl } from "../../node/schema/declarations/Declaration.js";
2
2
  export type GetDeclFromDeclName = (name: string) => SerializedSecondaryDecl | undefined;
3
3
  export declare const useGetDeclFromDeclName: () => GetDeclFromDeclName;
@@ -9,8 +9,10 @@ export const useGetDeclFromDeclName = () => {
9
9
  .map(decl => decl.declaration)
10
10
  .filter((decl) => decl.kind === "EnumDecl" || decl.kind === "TypeAliasDecl"));
11
11
  })
12
- .catch(error => {
13
- console.error("Error fetching data:", error);
12
+ .catch((error) => {
13
+ if (error instanceof Error) {
14
+ console.error("Error fetching data:", error.toString());
15
+ }
14
16
  });
15
17
  }, []);
16
18
  const getDeclFromDeclName = useCallback((name) => secondaryDeclarations.find(decl => decl.name === name), [secondaryDeclarations]);
@@ -1,2 +1,2 @@
1
- import { FunctionalComponent } from "preact";
1
+ import type { FunctionalComponent } from "preact";
2
2
  export declare const CreateInstance: FunctionalComponent;
@@ -48,8 +48,10 @@ export const CreateInstance = () => {
48
48
  route(`/entities/${entity.name}?created=${encodeURIComponent(createdInstance.instance.id)}`);
49
49
  }
50
50
  })
51
- .catch(error => {
52
- alert(`Error updating instance:\n\n${error}`);
51
+ .catch((error) => {
52
+ if (error instanceof Error) {
53
+ alert(`Error creating instance:\n\n${error.toString()}`);
54
+ }
53
55
  });
54
56
  }
55
57
  };
@@ -0,0 +1,2 @@
1
+ import type { FunctionalComponent } from "preact";
2
+ export declare const Entity: FunctionalComponent;
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { useRoute } from "preact-iso";
3
+ import { useEffect } from "preact/hooks";
4
+ import { getDisplayNameFromEntityInstance } from "../../shared/utils/displayName.js";
5
+ import { getGitStatusForDisplay, getLabelForGitStatus } from "../../shared/utils/git.js";
6
+ import { deleteInstanceByEntityNameAndId, getEntityByName, getInstancesByEntityName, } from "../api.js";
7
+ import { Layout } from "../components/Layout.js";
8
+ import { useAPIResource } from "../hooks/useAPIResource.js";
9
+ import { useMappedAPIResource } from "../hooks/useMappedAPIResource.js";
10
+ import { NotFound } from "./NotFound.js";
11
+ export const Entity = () => {
12
+ const { params: { name }, query: { created }, } = useRoute();
13
+ const [entity] = useAPIResource(getEntityByName, name ?? "");
14
+ const [instances, reloadInstances] = useMappedAPIResource(getInstancesByEntityName, data => data.instances, name ?? "");
15
+ useEffect(() => {
16
+ if (created) {
17
+ const instanceElement = document.getElementById(`instance-${created}`);
18
+ if (instanceElement) {
19
+ instanceElement.scrollIntoView({ behavior: "smooth", block: "center" });
20
+ }
21
+ }
22
+ }, [created]);
23
+ if (!name) {
24
+ return _jsx(NotFound, {});
25
+ }
26
+ if (!entity || !instances) {
27
+ return (_jsxs("div", { children: [_jsx("h1", { children: name }), _jsx("p", { className: "loading", children: "Loading \u2026" })] }));
28
+ }
29
+ return (_jsxs(Layout, { breadcrumbs: [{ url: "/", label: "Home" }], children: [_jsxs("div", { class: "header-with-btns", children: [_jsx("h1", { children: name }), _jsx("a", { class: "btn btn--primary", href: `/entities/${entity.declaration.name}/instances/create`, children: "Add" })] }), entity.declaration.comment && _jsx("p", { className: "description", children: entity.declaration.comment }), _jsxs("p", { children: [instances.length, " instance", instances.length === 1 ? "" : "s"] }), _jsx("ul", { class: "instances", children: instances.map(instance => {
30
+ const gitStatusForDisplay = getGitStatusForDisplay(instance.gitStatus);
31
+ return (_jsxs("li", { id: `instance-${instance.id}`, class: `instance-item ${created === instance.id ? "instance-item--created" : ""} ${gitStatusForDisplay === undefined ? "" : `git-status--${gitStatusForDisplay}`}`, children: [_jsx("h2", { children: getDisplayNameFromEntityInstance(entity.declaration, instance.content, instance.id) }), _jsx("p", { "aria-hidden": true, class: "id", children: instance.id }), gitStatusForDisplay !== undefined && (_jsx("p", { class: `git-status git-status--${gitStatusForDisplay}`, title: getLabelForGitStatus(gitStatusForDisplay), children: gitStatusForDisplay })), _jsxs("div", { className: "btns", children: [_jsx("a", { href: `/entities/${entity.declaration.name}/instances/${instance.id}`, class: "btn", children: "Edit" }), _jsx("button", { class: "destructive", onClick: () => {
32
+ if (confirm("Are you sure you want to delete this instance?")) {
33
+ deleteInstanceByEntityNameAndId(entity.declaration.name, instance.id)
34
+ .then(() => reloadInstances())
35
+ .catch((error) => {
36
+ if (error instanceof Error) {
37
+ alert("Error deleting instance:\n\n" + error.toString());
38
+ }
39
+ });
40
+ }
41
+ }, children: "Delete" })] })] }, instance.id));
42
+ }) })] }));
43
+ };
@@ -0,0 +1,2 @@
1
+ import type { FunctionalComponent } from "preact";
2
+ export declare const Home: FunctionalComponent;
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { toTitleCase } from "../../shared/utils/string.js";
3
+ import { getAllEntities } from "../api.js";
4
+ import { Layout } from "../components/Layout.js";
5
+ import { useMappedAPIResource } from "../hooks/useMappedAPIResource.js";
6
+ export const Home = () => {
7
+ const [entities] = useMappedAPIResource(getAllEntities, data => data.declarations.sort((a, b) => a.declaration.name.localeCompare(b.declaration.name)));
8
+ return (_jsxs(Layout, { breadcrumbs: [{ url: "/", label: "Home" }], children: [_jsx("h1", { children: "Entities" }), _jsx("ul", { class: "entities", children: (entities ?? []).map(entity => (_jsxs("li", { class: "entity-item", children: [_jsxs("div", { className: "title", children: [_jsx("h2", { children: toTitleCase(entity.declaration.name) }), entity.declaration.comment && _jsx("p", { children: entity.declaration.comment })] }), _jsxs("p", { class: "meta", children: [entity.instanceCount, " instance", entity.instanceCount === 1 ? "" : "s"] }), _jsx("div", { className: "btns", children: _jsx("a", { href: `/entities/${entity.declaration.name}`, class: "btn", children: "View" }) })] }, entity.declaration.name))) })] }));
9
+ };
@@ -1,2 +1,2 @@
1
- import { FunctionalComponent } from "preact";
1
+ import type { FunctionalComponent } from "preact";
2
2
  export declare const Instance: FunctionalComponent;
@@ -26,22 +26,23 @@ export const Instance = () => {
26
26
  setInstance(instanceData.instance);
27
27
  setOriginalInstance(instanceData.instance);
28
28
  })
29
- .catch(error => {
29
+ .catch((error) => {
30
30
  console.error("Error fetching entities:", error);
31
31
  });
32
32
  }
33
- }, []);
33
+ }, [id, name]);
34
34
  const handleSubmit = (event) => {
35
35
  event.preventDefault();
36
36
  if (name && id && instance) {
37
37
  updateInstanceByEntityNameAndId(name, id, instance.content)
38
38
  .then(updatedInstance => {
39
- 0;
40
39
  setInstance(updatedInstance.instance);
41
40
  setOriginalInstance(updatedInstance.instance);
42
41
  })
43
- .catch(error => {
44
- alert(`Error updating instance:\n\n${error}`);
42
+ .catch((error) => {
43
+ if (error instanceof Error) {
44
+ alert(`Error updating instance:\n\n${error}`);
45
+ }
45
46
  });
46
47
  }
47
48
  };
@@ -65,9 +66,14 @@ export const Instance = () => {
65
66
  .then(() => {
66
67
  route(`/entities/${name}`);
67
68
  })
68
- .catch(error => {
69
- alert("Error deleting instance:\n\n" + error);
69
+ .catch((error) => {
70
+ if (error instanceof Error) {
71
+ alert("Error deleting instance:\n\n" + error.toString());
72
+ }
70
73
  });
71
74
  }
72
- }, children: "Delete" })] }), _jsxs("form", { onSubmit: handleSubmit, children: [_jsx(TypeInput, { type: entityFromRoute.entity.type, value: instance.content, instanceNamesByEntity: instanceNamesByEntity, getDeclFromDeclName: getDeclFromDeclName, onChange: value => setInstance(container => ({ ...container, content: value })) }), _jsx("button", { type: "submit", disabled: !hasChanges, class: "primary", children: "Save" })] })] }));
75
+ }, children: "Delete" })] }), _jsxs("form", { onSubmit: handleSubmit, children: [_jsx(TypeInput, { type: entityFromRoute.entity.type, value: instance.content, instanceNamesByEntity: instanceNamesByEntity, getDeclFromDeclName: getDeclFromDeclName, onChange: value => {
76
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
77
+ setInstance(container => ({ ...container, content: value }));
78
+ } }), _jsx("button", { type: "submit", disabled: !hasChanges, class: "primary", children: "Save" })] })] }));
73
79
  };
@@ -1,2 +1,2 @@
1
- import { FunctionalComponent } from "preact";
1
+ import type { FunctionalComponent } from "preact";
2
2
  export declare const NotFound: FunctionalComponent;
@@ -0,0 +1,3 @@
1
+ import type { SerializedType } from "../../node/schema/types/Type.js";
2
+ import type { GetDeclFromDeclName } from "../hooks/useSecondaryDeclarations.js";
3
+ export declare const createTypeSkeleton: (getDeclFromDeclName: GetDeclFromDeclName, type: SerializedType) => unknown;
@@ -17,7 +17,7 @@ export const createTypeSkeleton = (getDeclFromDeclName, type) => {
17
17
  return Object.fromEntries(Object.entries(type.properties).flatMap(([key, memberDecl]) => memberDecl.isRequired
18
18
  ? [[key, createTypeSkeleton(getDeclFromDeclName, memberDecl.type)]]
19
19
  : []));
20
- case "GenericArgumentIdentifierType":
20
+ case "TypeArgumentType":
21
21
  return undefined;
22
22
  case "ReferenceIdentifierType":
23
23
  return "";
@@ -26,25 +26,22 @@ export const createTypeSkeleton = (getDeclFromDeclName, type) => {
26
26
  if (referencedDecl === undefined) {
27
27
  return undefined;
28
28
  }
29
- switch (referencedDecl.kind) {
30
- case "TypeAliasDecl":
31
- return createTypeSkeleton(getDeclFromDeclName, referencedDecl.type);
32
- case "EnumDecl": {
33
- const firstCase = Object.entries(referencedDecl.values)[0];
34
- if (firstCase[1].type === null) {
35
- return { kind: firstCase[0] };
36
- }
37
- return {
38
- kind: firstCase[0],
39
- [firstCase[0]]: createTypeSkeleton(getDeclFromDeclName, firstCase[1].type),
40
- };
41
- }
42
- default:
43
- return assertExhaustive(referencedDecl);
44
- }
29
+ return createTypeSkeleton(getDeclFromDeclName, referencedDecl.type);
45
30
  }
46
31
  case "NestedEntityMapType":
47
32
  return {};
33
+ case "EnumType": {
34
+ const firstCase = Object.entries(type.values)[0];
35
+ if (firstCase === undefined) {
36
+ return {};
37
+ }
38
+ return {
39
+ kind: firstCase[0],
40
+ ...(firstCase[1].type === null
41
+ ? {}
42
+ : { [firstCase[0]]: createTypeSkeleton(getDeclFromDeclName, firstCase[1].type) }),
43
+ };
44
+ }
48
45
  default:
49
46
  return assertExhaustive(type);
50
47
  }
package/package.json CHANGED
@@ -1,45 +1,65 @@
1
1
  {
2
2
  "name": "tsondb",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "Lukas Obermann",
7
7
  "type": "module",
8
8
  "files": [
9
- "lib",
9
+ "lib/**/*.d.ts",
10
+ "lib/**/*.js",
10
11
  "public"
11
12
  ],
13
+ "bin": {
14
+ "tsondb": "lib/bin/tsondb.js"
15
+ },
12
16
  "main": "lib/index.js",
13
17
  "exports": {
14
18
  ".": "./lib/index.js",
15
- "./renderer/jsonschema": "./lib/renderers/jsonschema/index.js",
16
- "./renderer/ts": "./lib/renderers/ts/index.js",
17
- "./modelcontainer": "./lib/ModelContainer.js",
18
- "./schema": "./lib/Schema.js",
19
- "./schema/def": "./lib/schema/index.js"
19
+ "./renderer/jsonschema": "./lib/node/renderers/jsonschema/index.js",
20
+ "./renderer/ts": "./lib/node/renderers/ts/index.js",
21
+ "./schema": "./lib/node/Schema.js",
22
+ "./schema/def": "./lib/node/schema/index.js"
20
23
  },
21
24
  "scripts": {
22
25
  "build": "tsc -b",
23
26
  "watch": "tsc -b -w",
24
- "test": "glob -c \"node --import tsx --test\" \"./test/**/*.ts\"",
27
+ "test": "node --import tsx --test",
28
+ "lint": "eslint",
29
+ "check-format": "prettier \"{src,test}/**/*.{ts,tsx}\" --check",
30
+ "format": "prettier \"{src,test}/**/*.{ts,tsx}\" --write",
25
31
  "release": "commit-and-tag-version"
26
32
  },
27
33
  "devDependencies": {
28
- "@types/express": "^5.0.1",
29
- "@types/node": "^22.13.14",
34
+ "@eslint/js": "^9.30.1",
35
+ "@types/debug": "^4.1.12",
36
+ "@types/express": "^5.0.3",
37
+ "@types/node": "^24.0.12",
30
38
  "commit-and-tag-version": "^12.5.1",
31
- "glob": "^11.0.1",
32
- "tsx": "^4.19.3",
33
- "typescript": "^5.8.2"
39
+ "eslint": "^9.30.1",
40
+ "eslint-plugin-react": "^7.37.5",
41
+ "eslint-plugin-react-hooks": "^5.2.0",
42
+ "globals": "^16.3.0",
43
+ "prettier": "^3.6.2",
44
+ "tsx": "^4.20.3",
45
+ "typescript": "^5.8.3",
46
+ "typescript-eslint": "^8.36.0"
34
47
  },
35
48
  "dependencies": {
49
+ "debug": "^4.4.1",
36
50
  "express": "^5.1.0",
37
- "preact": "^10.26.5",
38
- "preact-iso": "^2.9.1",
51
+ "preact": "^10.26.9",
52
+ "preact-iso": "^2.9.2",
53
+ "simple-cli-args": "^0.1.0",
54
+ "simple-git": "^3.28.0",
55
+ "supports-color": "^10.0.0",
39
56
  "uuid": "^11.1.0"
40
57
  },
41
58
  "repository": "github:elyukai/tsondb",
42
59
  "bugs": {
43
60
  "url": "https://github.com/elyukai/tsondb/issues"
61
+ },
62
+ "engines": {
63
+ "node": ">=23.6.0"
44
64
  }
45
65
  }