@effect-app/vue 2.55.9 → 2.56.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.
package/dist/runtime.d.ts CHANGED
@@ -1,45 +1,6 @@
1
- import { Exit, Runtime } from "effect";
1
+ import { ManagedRuntime } from "effect";
2
2
  import { Effect, Layer } from "effect-app";
3
- export declare function makeAppRuntime<A, E, R>(layer: Layer.Layer<A, E, R>): Effect.Effect<{
4
- runtime: Runtime.Runtime<A> & {
5
- runPromise: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>, options?: {
6
- readonly signal?: AbortSignal;
7
- } | undefined) => Promise<A_1>;
8
- runPromiseExit: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>, options?: {
9
- readonly signal?: AbortSignal;
10
- } | undefined) => Promise<Exit.Exit<A_1, E_1>>;
11
- runSync: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>) => A_1;
12
- runSyncExit: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>) => Exit.Exit<A_1, E_1>;
13
- runFork: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>, options?: Runtime.RunForkOptions | undefined) => import("effect/Fiber").RuntimeFiber<A_1, E_1>;
14
- };
15
- clean: Effect.Effect<void, never, never>;
16
- }, E, R>;
17
- export declare function initializeSync<A, E>(layer: Layer.Layer<A, E, never>): {
18
- runtime: Runtime.Runtime<A> & {
19
- runPromise: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>, options?: {
20
- readonly signal?: AbortSignal;
21
- } | undefined) => Promise<A_1>;
22
- runPromiseExit: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>, options?: {
23
- readonly signal?: AbortSignal;
24
- } | undefined) => Promise<Exit.Exit<A_1, E_1>>;
25
- runSync: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>) => A_1;
26
- runSyncExit: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>) => Exit.Exit<A_1, E_1>;
27
- runFork: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>, options?: Runtime.RunForkOptions | undefined) => import("effect/Fiber").RuntimeFiber<A_1, E_1>;
28
- };
29
- clean: () => void;
30
- };
31
- export declare function initializeAsync<A, E>(layer: Layer.Layer<A, E, never>): Promise<{
32
- runtime: Runtime.Runtime<A> & {
33
- runPromise: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>, options?: {
34
- readonly signal?: AbortSignal;
35
- } | undefined) => Promise<A_1>;
36
- runPromiseExit: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>, options?: {
37
- readonly signal?: AbortSignal;
38
- } | undefined) => Promise<Exit.Exit<A_1, E_1>>;
39
- runSync: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>) => A_1;
40
- runSyncExit: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>) => Exit.Exit<A_1, E_1>;
41
- runFork: <A_1, E_1>(effect: Effect.Effect<A_1, E_1, A>, options?: Runtime.RunForkOptions | undefined) => import("effect/Fiber").RuntimeFiber<A_1, E_1>;
42
- };
43
- clean: () => Promise<void>;
44
- }>;
3
+ export declare function makeAppRuntime<A, E>(layer: Layer.Layer<A, E>): Effect.Effect<ManagedRuntime.ManagedRuntime<A, never>, E, never>;
4
+ export declare function initializeSync<A, E>(layer: Layer.Layer<A, E, never>): ManagedRuntime.ManagedRuntime<A, never>;
5
+ export declare function initializeAsync<A, E>(layer: Layer.Layer<A, E, never>): Promise<ManagedRuntime.ManagedRuntime<A, never>>;
45
6
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,YAAY,CAAA;AAGlD,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;;;2BAwC62K,CAAC;;;2BAAu1C,CAAC;;;;;;;SApBxwN;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;;;2BAkB42K,CAAC;;;2BAAu1C,CAAC;;;;;;;EAZxwN;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;;;2BAU22K,CAAC;;;2BAAu1C,CAAC;;;;;;;GADxwN"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,YAAY,CAAA;AAElD,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,oEAS5D;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,2CAGnE;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,oDAGpE"}
package/dist/runtime.js CHANGED
@@ -1,39 +1,19 @@
1
- import { Exit, Runtime } from "effect";
1
+ import { ManagedRuntime } from "effect";
2
2
  import { Effect, Layer, Logger } from "effect-app";
3
- import * as Scope from "effect/Scope";
4
3
  export function makeAppRuntime(layer) {
5
4
  return Effect.gen(function* () {
6
5
  layer = layer.pipe(Layer.provide(Logger.replace(Logger.defaultLogger, Logger.withSpanAnnotations(Logger.prettyLogger()))));
7
- const scope = yield* Scope.make();
8
- const env = yield* layer.pipe(Layer.buildWithScope(scope));
9
- const runtime = yield* Effect.runtime().pipe(Effect.scoped, Effect.provide(env));
10
- return {
11
- runtime: Object.assign(runtime, {
12
- runPromise: Runtime.runPromise(runtime),
13
- runPromiseExit: Runtime.runPromiseExit(runtime),
14
- runSync: Runtime.runSync(runtime),
15
- runSyncExit: Runtime.runSyncExit(runtime),
16
- runFork: Runtime.runFork(runtime)
17
- }),
18
- clean: Scope.close(scope, Exit.void)
19
- };
6
+ const mrt = ManagedRuntime.make(layer);
7
+ yield* mrt.runtimeEffect;
8
+ return mrt; // as we initialise here, there is no more error left.
20
9
  });
21
10
  }
22
11
  export function initializeSync(layer) {
23
- const { clean, runtime } = Effect.runSync(makeAppRuntime(layer));
24
- return {
25
- runtime,
26
- clean: () => Effect.runSync(clean)
27
- };
12
+ const runtime = Effect.runSync(makeAppRuntime(layer));
13
+ return runtime;
28
14
  }
29
15
  export function initializeAsync(layer) {
30
16
  return Effect
31
- .runPromise(makeAppRuntime(layer))
32
- .then(({ clean, runtime }) => {
33
- return {
34
- runtime,
35
- clean: () => Effect.runPromise(clean)
36
- };
37
- });
17
+ .runPromise(makeAppRuntime(layer));
38
18
  }
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNsRCxPQUFPLEtBQUssS0FBSyxNQUFNLGNBQWMsQ0FBQTtBQUVyQyxNQUFNLFVBQVUsY0FBYyxDQUFVLEtBQTJCO0lBQ2pFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDekIsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQ2hCLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ3ZHLENBQUE7UUFDRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDakMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDMUQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUVuRixPQUFPO1lBQ0wsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO2dCQUM5QixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7Z0JBQ3ZDLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztnQkFDL0MsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUNqQyxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7Z0JBQ3pDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQzthQUNsQyxDQUFDO1lBQ0YsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDckMsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQU8sS0FBK0I7SUFDbEUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ2hFLE9BQU87UUFDTCxPQUFPO1FBQ1AsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0tBQ25DLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBTyxLQUErQjtJQUNuRSxPQUFPLE1BQU07U0FDVixVQUFVLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2pDLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7UUFDM0IsT0FBTztZQUNMLE9BQU87WUFDUCxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7U0FDdEMsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyJ9
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRWxELE1BQU0sVUFBVSxjQUFjLENBQU8sS0FBd0I7SUFDM0QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUN6QixLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDaEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDdkcsQ0FBQTtRQUNELE1BQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdEMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQTtRQUN4QixPQUFPLEdBQThDLENBQUEsQ0FBQyxzREFBc0Q7SUFDOUcsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FBTyxLQUErQjtJQUNsRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ3JELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFPLEtBQStCO0lBQ25FLE9BQU8sTUFBTTtTQUNWLFVBQVUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUN0QyxDQUFDIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-app/vue",
3
- "version": "2.55.9",
3
+ "version": "2.56.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "homepage": "https://github.com/effect-ts-app/libs/tree/main/packages/vue",
@@ -60,9 +60,9 @@
60
60
  "types": "./dist/experimental/intl.d.ts",
61
61
  "default": "./dist/experimental/intl.js"
62
62
  },
63
- "./experimental/makeExperimental": {
64
- "types": "./dist/experimental/makeExperimental.d.ts",
65
- "default": "./dist/experimental/makeExperimental.js"
63
+ "./experimental/makeUseCommand": {
64
+ "types": "./dist/experimental/makeUseCommand.d.ts",
65
+ "default": "./dist/experimental/makeUseCommand.js"
66
66
  },
67
67
  "./experimental/toast": {
68
68
  "types": "./dist/experimental/toast.d.ts",
@@ -602,7 +602,9 @@ export class Commander extends Effect.Service<Commander>()("Commander", {
602
602
 
603
603
  return Effect.currentSpan.pipe(
604
604
  Effect.option,
605
- Effect.map((span) => runFork(Option.isSome(span) ? command.pipe(Effect.withParentSpan(span.value)) : command))
605
+ Effect.map((span) =>
606
+ runFork(Option.isSome(span) ? command.pipe(Effect.withParentSpan(span.value)) : command)
607
+ )
606
608
  )
607
609
  }, { action })
608
610
 
@@ -782,16 +784,8 @@ export class Commander extends Effect.Service<Commander>()("Commander", {
782
784
  self: Effect.Effect<A, E, R>
783
785
  ) =>
784
786
  Effect.gen(function*() {
785
- const { action } = yield* CommandContext
787
+ const cc = yield* CommandContext
786
788
 
787
- const defaultWarnMessage = intl.formatMessage(
788
- { id: "handle.with_warnings" },
789
- { action }
790
- )
791
- const defaultErrorMessage = intl.formatMessage(
792
- { id: "handle.with_errors" },
793
- { action }
794
- )
795
789
  function renderError(e: E): string {
796
790
  if (options?.errorRenderer) {
797
791
  const m = options.errorRenderer(e)
@@ -826,19 +820,19 @@ export class Commander extends Effect.Service<Commander>()("Commander", {
826
820
  withToast({
827
821
  onWaiting: options?.onWaiting === null ? null : intl.formatMessage(
828
822
  { id: "handle.waiting" },
829
- { action }
823
+ { action: cc.action }
830
824
  ),
831
825
  onSuccess: options?.onSuccess === null
832
826
  ? null
833
827
  : (a) =>
834
- intl.formatMessage({ id: "handle.success" }, { action })
828
+ intl.formatMessage({ id: "handle.success" }, { action: cc.action })
835
829
  + (S.is(OperationSuccess)(a) && a.message ? "\n" + a.message : ""),
836
830
  onFailure: Option.match({
837
831
  onNone: () =>
838
832
  intl.formatMessage(
839
833
  { id: "handle.unexpected_error2" },
840
834
  {
841
- action,
835
+ action: cc.action,
842
836
  error: "" // TODO consider again Cause.pretty(cause), // will be reported to Sentry/Otel anyway.. and we shouldn't bother users with error dumps?
843
837
  }
844
838
  ),
@@ -846,9 +840,19 @@ export class Commander extends Effect.Service<Commander>()("Commander", {
846
840
  S.is(OperationFailure)(e)
847
841
  ? {
848
842
  level: "warn",
849
- message: defaultWarnMessage + e.message ? "\n" + e.message : ""
843
+ message: intl.formatMessage(
844
+ { id: "handle.with_warnings" },
845
+ { action: cc.action }
846
+ ) + e.message
847
+ ? "\n" + e.message
848
+ : ""
850
849
  }
851
- : `${defaultErrorMessage}:\n` + renderError(e)
850
+ : `${
851
+ intl.formatMessage(
852
+ { id: "handle.with_errors" },
853
+ { action: cc.action }
854
+ )
855
+ }:\n` + renderError(e)
852
856
  })
853
857
  })
854
858
  )
@@ -1,7 +1,7 @@
1
1
  import { Effect } from "effect-app"
2
2
  import { Commander } from "./commander.js"
3
3
 
4
- export const makeExperimental = Effect.fnUntraced(function*<R = never>() {
4
+ export const makeUseCommand = Effect.fnUntraced(function*<R = never>() {
5
5
  const cmndr = yield* Commander
6
6
  const runtime = yield* Effect.runtime<R>()
7
7
 
package/src/form.ts CHANGED
@@ -2,11 +2,11 @@ import { createIntl, type IntlFormatters } from "@formatjs/intl"
2
2
  import * as JSONSchema from "effect/JSONSchema"
3
3
  import type { ParseError } from "effect/ParseResult"
4
4
  import type {} from "intl-messageformat"
5
- import { Either, Option, pipe, S, Struct } from "effect-app"
5
+ import { Either, Option, pipe, S } from "effect-app"
6
6
  import type { Schema } from "effect-app/Schema"
7
7
  import type { Unbranded } from "effect-app/Schema/brand"
8
8
  import type { IsUnion } from "effect-app/utils"
9
- import { capitalize, type Ref, ref, watch } from "vue"
9
+ import { capitalize, ref } from "vue"
10
10
 
11
11
  // type GetSchemaFromProp<T> = T extends Field<infer S, any, any, any> ? S
12
12
  // : never
@@ -381,64 +381,6 @@ function buildFieldInfo(
381
381
  return info as any
382
382
  }
383
383
 
384
- export const buildFormFromSchema = <
385
- From extends Record<PropertyKey, any>,
386
- To extends Record<PropertyKey, any>,
387
- C extends Record<PropertyKey, any>,
388
- OnSubmitA
389
- >(
390
- s:
391
- & Schema<
392
- To,
393
- From,
394
- never
395
- >
396
- & { new(c: C): any; extend: any; fields: S.Struct.Fields },
397
- state: Ref<Omit<From, "_tag">>,
398
- onSubmit: (a: To) => Promise<OnSubmitA>
399
- ) => {
400
- const fields = buildFieldInfoFromFieldsRoot(s).fields
401
- const parse = S.decodeUnknownSync<any, any>(S.Struct(Struct.omit(s.fields, "_tag")) as any)
402
- const isDirty = ref(false)
403
- const isValid = ref(true)
404
- const isLoading = ref(false)
405
-
406
- const submit1 = <A>(onSubmit: (a: To) => Promise<A>) => async <T extends Promise<{ valid: boolean }>>(e: T) => {
407
- isLoading.value = true
408
- try {
409
- const r = await e
410
- if (!r.valid) return
411
- return onSubmit(new s(parse(state.value)))
412
- } finally {
413
- isLoading.value = false
414
- }
415
- }
416
- const submit = submit1(onSubmit)
417
-
418
- watch(
419
- state,
420
- (v) => {
421
- // TODO: do better
422
- isDirty.value = JSON.stringify(v) !== JSON.stringify(state.value)
423
- },
424
- { deep: true }
425
- )
426
-
427
- const submitFromState = () => submit(Promise.resolve({ valid: isValid.value }))
428
-
429
- return {
430
- fields,
431
- /** optimized for Vuetify v-form submit callback */
432
- submit,
433
- /** optimized for Native form submit callback or general use */
434
- submitFromState,
435
- isDirty,
436
- isValid,
437
- /** includes whole submit, including potential asynchronous validation steps */
438
- isLoading
439
- }
440
- }
441
-
442
384
  export function getMetadataFromSchema(
443
385
  ast: S.AST.AST
444
386
  ): {