@effect-app/vue-components 3.0.4 → 3.0.6

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.
@@ -1,6 +1,13 @@
1
- (function(){"use strict";try{if(typeof document<"u"){var i=document.createElement("style");if(i.appendChild(document.createTextNode(".omega-input .v-input__details:has(.v-messages:empty){grid-template-rows:0fr;transition:all .2s}.omega-input .v-messages:empty{min-height:0}.omega-input .v-input__details:has(.v-messages){transition:all .2s;overflow:hidden;min-height:0;display:grid;grid-template-rows:1fr}.omega-input .v-messages{transition:all .2s}.omega-input .v-messages>*{transition-duration:0s!important}.omega-input [role=alert]:has(.v-messages:empty){padding:0}.omega-input .v-btn{cursor:pointer;width:auto;appearance:none;box-shadow:none;display:block;min-width:auto;height:auto;padding:.5em .5em .5em 1em}")),document.head.appendChild(i),window.customElements){const e=window.customElements.define;window.customElements.define=function(s,t){const n=t.prototype.connectedCallback;return t.prototype.connectedCallback=function(){if(n&&n.call(this),this.shadowRoot){const a=document.createElement("style");a.appendChild(document.createTextNode(".omega-input .v-input__details:has(.v-messages:empty){grid-template-rows:0fr;transition:all .2s}.omega-input .v-messages:empty{min-height:0}.omega-input .v-input__details:has(.v-messages){transition:all .2s;overflow:hidden;min-height:0;display:grid;grid-template-rows:1fr}.omega-input .v-messages{transition:all .2s}.omega-input .v-messages>*{transition-duration:0s!important}.omega-input [role=alert]:has(.v-messages:empty){padding:0}.omega-input .v-btn{cursor:pointer;width:auto;appearance:none;box-shadow:none;display:block;min-width:auto;height:auto;padding:.5em .5em .5em 1em}")),this.shadowRoot.appendChild(a)}},e.call(window.customElements,s,t)}}}}catch(e){console.error("vite-plugin-css-injected-by-js",e)}})();
2
- import o from "./vue-components.es38.js";
3
-
1
+ import { useStore as u } from "@tanstack/vue-form";
2
+ import { computed as f } from "vue";
3
+ function c(o, t) {
4
+ return f(() => t ? u(o.store, (n) => {
5
+ const r = {};
6
+ for (const e of t)
7
+ r[e] = n[e];
8
+ return r;
9
+ }).value : {});
10
+ }
4
11
  export {
5
- o as default
12
+ c as getOmegaStore
6
13
  };
@@ -1,6 +1,6 @@
1
1
  import { DiagComponentLogger as m } from "./vue-components.es55.js";
2
2
  import { createLogLevelDiagLogger as y } from "./vue-components.es56.js";
3
- import { DiagLogLevel as d } from "./vue-components.es41.js";
3
+ import { DiagLogLevel as d } from "./vue-components.es42.js";
4
4
  import { unregisterGlobal as p, getGlobal as v, registerGlobal as w } from "./vue-components.es57.js";
5
5
  var b = function(i, n) {
6
6
  var r = typeof Symbol == "function" && i[Symbol.iterator];
@@ -1,4 +1,4 @@
1
- import { DiagLogLevel as r } from "./vue-components.es41.js";
1
+ import { DiagLogLevel as r } from "./vue-components.es42.js";
2
2
  function c(n, o) {
3
3
  n < r.NONE ? n = r.NONE : n > r.ALL && (n = r.ALL), o = o || {};
4
4
  function i(t, f) {
@@ -1,6 +1,6 @@
1
- import { createContextKey as o } from "./vue-components.es40.js";
2
- import { NonRecordingSpan as a } from "./vue-components.es49.js";
3
- import { ContextAPI as u } from "./vue-components.es50.js";
1
+ import { createContextKey as o } from "./vue-components.es41.js";
2
+ import { NonRecordingSpan as a } from "./vue-components.es50.js";
3
+ import { ContextAPI as u } from "./vue-components.es51.js";
4
4
  var n = o("OpenTelemetry Context Key SPAN");
5
5
  function r(e) {
6
6
  return e.getValue(n) || void 0;
@@ -1,4 +1,4 @@
1
- import { ROOT_CONTEXT as l } from "./vue-components.es40.js";
1
+ import { ROOT_CONTEXT as l } from "./vue-components.es41.js";
2
2
  var c = function(t, o) {
3
3
  var n = typeof Symbol == "function" && t[Symbol.iterator];
4
4
  if (!n) return t;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-app/vue-components",
3
- "version": "3.0.4",
3
+ "version": "3.0.6",
4
4
  "peerDependencies": {
5
5
  "@mdi/js": "^7.4.47",
6
6
  "effect": "^3.19.3",
@@ -53,7 +53,7 @@
53
53
  "highlight.js": "^11.11.1",
54
54
  "mitt": "^3.0.1",
55
55
  "vue3-highlightjs": "^1.0.5",
56
- "@effect-app/vue": "2.93.7",
56
+ "@effect-app/vue": "2.93.8",
57
57
  "effect-app": "3.15.1"
58
58
  },
59
59
  "scripts": {
@@ -246,7 +246,7 @@ export type StringFieldMeta = BaseFieldMeta & {
246
246
  }
247
247
 
248
248
  export type NumberFieldMeta = BaseFieldMeta & {
249
- type: "number"
249
+ type: "number" | "int"
250
250
  minimum?: number
251
251
  maximum?: number
252
252
  exclusiveMinimum?: number
@@ -346,12 +346,23 @@ export const createMeta = <T = any>(
346
346
  ): MetaRecord<T> | FieldMeta => {
347
347
  // unwraps class (Class are transformations)
348
348
  // this calls createMeta recursively, so wrapped transformations are also unwrapped
349
+ // BUT: check for Int title annotation first - S.Int and branded Int have title "Int" or "int"
350
+ // and we don't want to lose that information by unwrapping
349
351
  if (property && property._tag === "Transformation") {
350
- return createMeta<T>({
351
- parent,
352
- meta,
353
- property: property.from
354
- })
352
+ const titleOnTransform = S
353
+ .AST
354
+ .getAnnotation(property, S.AST.TitleAnnotationId)
355
+ .pipe(Option.getOrElse(() => ""))
356
+
357
+ // only unwrap if this is NOT an Int type
358
+ if (titleOnTransform !== "Int" && titleOnTransform !== "int") {
359
+ return createMeta<T>({
360
+ parent,
361
+ meta,
362
+ property: property.from
363
+ })
364
+ }
365
+ // if it's Int, fall through to process it with the Int type
355
366
  }
356
367
 
357
368
  if (property?._tag === "TypeLiteral" && "propertySignatures" in property) {
@@ -655,24 +666,32 @@ export const createMeta = <T = any>(
655
666
 
656
667
  meta = { ...JSONAnnotation, ...meta }
657
668
 
658
- if ("from" in property) {
669
+ // check the title annotation BEFORE following "from" to detect refinements like S.Int
670
+ const titleType = S
671
+ .AST
672
+ .getAnnotation(
673
+ property,
674
+ S.AST.TitleAnnotationId
675
+ )
676
+ .pipe(
677
+ Option.getOrElse(() => {
678
+ return "unknown"
679
+ })
680
+ )
681
+
682
+ // if this is S.Int (a refinement), set the type and skip following "from"
683
+ // otherwise we'd lose the "Int" information and get "number" instead
684
+ if (titleType === "Int" || titleType === "int") {
685
+ meta["type"] = "int"
686
+ // don't follow "from" for Int refinements
687
+ } else if ("from" in property) {
659
688
  return createMeta<T>({
660
689
  parent,
661
690
  meta,
662
691
  property: property.from
663
692
  })
664
693
  } else {
665
- meta["type"] = S
666
- .AST
667
- .getAnnotation(
668
- property,
669
- S.AST.TitleAnnotationId
670
- )
671
- .pipe(
672
- Option.getOrElse(() => {
673
- return "unknown"
674
- })
675
- )
694
+ meta["type"] = titleType
676
695
  }
677
696
 
678
697
  return meta as FieldMeta
@@ -869,9 +888,59 @@ export const generateInputStandardSchemaFromFieldMeta = (
869
888
  }
870
889
  break
871
890
 
891
+ case "int": {
892
+ // create a custom integer schema with translations
893
+ // S.Number with empty message, then S.int with integer message
894
+ schema = S
895
+ .Number
896
+ .annotations({
897
+ message: () => trans("validation.empty")
898
+ })
899
+ .pipe(
900
+ S.int({ message: (issue) => trans("validation.integer.expected", { actualValue: String(issue.actual) }) })
901
+ )
902
+ if (typeof meta.minimum === "number") {
903
+ schema = schema.pipe(S.greaterThanOrEqualTo(meta.minimum)).annotations({
904
+ message: () =>
905
+ trans(meta.minimum === 0 ? "validation.number.positive" : "validation.number.min", {
906
+ minimum: meta.minimum,
907
+ isExclusive: true
908
+ })
909
+ })
910
+ }
911
+ if (typeof meta.maximum === "number") {
912
+ schema = schema.pipe(S.lessThanOrEqualTo(meta.maximum)).annotations({
913
+ message: () =>
914
+ trans("validation.number.max", {
915
+ maximum: meta.maximum,
916
+ isExclusive: true
917
+ })
918
+ })
919
+ }
920
+ if (typeof meta.exclusiveMinimum === "number") {
921
+ schema = schema.pipe(S.greaterThan(meta.exclusiveMinimum)).annotations({
922
+ message: () =>
923
+ trans(meta.exclusiveMinimum === 0 ? "validation.number.positive" : "validation.number.min", {
924
+ minimum: meta.exclusiveMinimum,
925
+ isExclusive: false
926
+ })
927
+ })
928
+ }
929
+ if (typeof meta.exclusiveMaximum === "number") {
930
+ schema = schema.pipe(S.lessThan(meta.exclusiveMaximum)).annotations({
931
+ message: () =>
932
+ trans("validation.number.max", {
933
+ maximum: meta.exclusiveMaximum,
934
+ isExclusive: false
935
+ })
936
+ })
937
+ }
938
+ break
939
+ }
940
+
872
941
  case "number":
873
942
  schema = S.Number.annotations({
874
- message: () => trans("validation.empty")
943
+ message: () => trans("validation.number.expected", { actualValue: "NaN" })
875
944
  })
876
945
 
877
946
  if (meta.required) {
@@ -81,12 +81,12 @@
81
81
  </v-textarea>
82
82
  <component
83
83
  :is="inputProps.type === 'range' ? 'v-slider' : 'v-text-field'"
84
- v-if="inputProps.type === 'number' || inputProps.type === 'range'"
84
+ v-if="inputProps.type === 'number' || inputProps.type === 'int' || inputProps.type === 'range'"
85
85
  :id="inputProps.id"
86
86
  :required="inputProps.required"
87
87
  :min="inputProps.min"
88
88
  :max="inputProps.max"
89
- :type="inputProps.type"
89
+ :type="inputProps.type === 'int' ? 'number' : inputProps.type"
90
90
  :name="field.name"
91
91
  :label="inputProps.label"
92
92
  :error-messages="inputProps.errorMessages"