@reykjavik/webtools 0.3.2 → 0.3.4

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/CHANGELOG.md CHANGED
@@ -4,13 +4,28 @@
4
4
 
5
5
  - ... <!-- Add new lines here. -->
6
6
 
7
+ ## 0.3.4
8
+
9
+ _2026-02-17_
10
+
11
+ - `@reykjavik/webtools/errorhandling`:
12
+ - feat: Add type `Result.ErrorOf<T>` to extract the error type of a
13
+ `ResultTuple<T>` or a `ResultTuple`-returning function
14
+
15
+ ## 0.3.3
16
+
17
+ _2026-02-13_
18
+
19
+ - `@reykjavik/webtools/errorhandling`:
20
+ - feat: Make `ResultFail` better infer its error type from the argument
21
+
7
22
  ## 0.3.2
8
23
 
9
24
  _2025-12-01_
10
25
 
11
26
  - `@reykjavik/webtools/errorhandling`:
12
27
  - feat: Add type `Result.PayloadOf<T>` to extract the successful payload
13
- type from a `ResultTuple<T>` or a `ResultTuple`-returning function.
28
+ type from a `ResultTuple<T>` or a `ResultTuple`-returning functions
14
29
 
15
30
  ## 0.3.0 – 0.3.1
16
31
 
@@ -28,7 +43,7 @@ _2025-09-30_
28
43
 
29
44
  - `@reykjavik/webtools/next/vanillaExtract`:
30
45
  - feat: Make `vanillaVars` return a type-safe `setVars()` helper to avoid
31
- offending VSCode's CSS syntax parser too much.
46
+ offending VSCode's CSS syntax parser too much
32
47
 
33
48
  ## 0.2.8
34
49
 
package/README.md CHANGED
@@ -47,6 +47,7 @@ bun add @reykjavik/webtools
47
47
  - [`Result.Fail`](#resultfail)
48
48
  - [`Result.throw`](#resultthrow)
49
49
  - [Type `Result.PayloadOf`](#type-resultpayloadof)
50
+ - [Type `Result.ErrorOf`](#type-resulterrorof)
50
51
  - [`@reykjavik/webtools/SiteImprove`](#reykjavikwebtoolssiteimprove)
51
52
  - [`SiteImprove` component](#siteimprove-component)
52
53
  - [`pingSiteImprove` helper](#pingsiteimprove-helper)
@@ -864,6 +865,32 @@ type Payload4 = Result.PayloadOf<ResTplPromiseFn>; // Date
864
865
 
865
866
  ---
866
867
 
868
+ ### Type `Result.ErrorOf`
869
+
870
+ **Syntax:**
871
+ `Result.ErrorOf<T extends | ResultTuple<unknown> | Promise<ResultTuple<unknown>> | ((...args: Array<any>) => ResultTuple<unknown> | Promise<ResultTuple<unknown>>)>`
872
+
873
+ This utility type extracts the error type `E` from a `Result.Tuple<T>`-like
874
+ type, a `Promise` of such type, or a function returning either of those.
875
+
876
+ ```ts
877
+ import { Result } from '@reykjavik/webtools/errorhandling';
878
+
879
+ type ResTpl = Result.Tuple<string, RangeError>;
880
+ type ResTplPromise = Promise<Result.Tuple<number, RangeError>>;
881
+ type ResTplFn = (arg: unknown) => Result.Tuple<boolean, RangeError>;
882
+ type ResTplPromiseFn = (
883
+ arg: unknown
884
+ ) => Promise<Result.Tuple<Date, RangeError>>;
885
+
886
+ type Error1 = Result.ErrorOf<ResTpl>; // RangeError
887
+ type Error2 = Result.ErrorOf<ResTplPromise>; // RangeError
888
+ type Error3 = Result.ErrorOf<ResTplFn>; // RangeError
889
+ type Error4 = Result.ErrorOf<ResTplPromiseFn>; // RangeError
890
+ ```
891
+
892
+ ---
893
+
867
894
  ## `@reykjavik/webtools/SiteImprove`
868
895
 
869
896
  Contains React helpers for loading SiteImprove's analytics scripts, and
@@ -1216,11 +1243,15 @@ const myStyle = style({
1216
1243
  ### `vanillaVars`
1217
1244
 
1218
1245
  **Syntax:**
1219
- `` vanillaVars(...varNames: Array<T>): Record <`var${Capitalize<T>}`, string> ``
1246
+ `` vanillaVars(...varNames: Array<T>): Record <`var${Capitalize<T>}`, string> & { setVars: (Partial<Record<`var${Capitalize<T>}`, unknown>>) => string} ``
1220
1247
 
1221
1248
  Returns an object with privately scoped CSS variables props. Pass them around
1222
1249
  and use them in your CSS.
1223
1250
 
1251
+ The object also has a `setVars` method for generating a CSS string that sets
1252
+ all or some of the variables in CSS, without offending VSCode's CSS syntax
1253
+ parser too much.
1254
+
1224
1255
  ```ts
1225
1256
  // MyComponent.css.ts
1226
1257
  import {
@@ -51,6 +51,8 @@ export type ResultTuple<T, E extends Error = Error> = [error: undefined, result:
51
51
  * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#type-resulttupleobj
52
52
  */
53
53
  export type ResultTupleObj<T, E extends Error = Error> = SuccessResult<T> | FailResult<E>;
54
+ declare function Fail<E extends Error = Error>(e: E): FailResult<E>;
55
+ declare function Fail<E extends Error = Error>(e: unknown): FailResult<E>;
54
56
  /**
55
57
  * Error handling utility that wraps a promise or a callback function.
56
58
  *
@@ -82,7 +84,7 @@ export declare const Result: {
82
84
  *
83
85
  * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#resultsfail
84
86
  */
85
- Fail: <E extends Error = Error>(e: unknown) => FailResult<E>;
87
+ Fail: typeof Fail;
86
88
  catch: typeof catch_;
87
89
  ify: typeof catch_;
88
90
  /**
@@ -113,5 +115,60 @@ export declare namespace Result {
113
115
  * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#type-resultpayloadof
114
116
  */
115
117
  type PayloadOf<T extends ResultTuple<unknown> | Promise<ResultTuple<unknown>> | ((...args: Array<any>) => ResultTuple<unknown> | Promise<ResultTuple<unknown>>)> = T extends [undefined, infer P] | Promise<ResultTuple<infer P>> | ((...args: Array<any>) => ResultTuple<infer P> | Promise<ResultTuple<infer P>>) ? P : never;
118
+ /**
119
+ * Extracts the error type `E` from a `Result.Tuple<T, E>`-like
120
+ * type, a `Promise` of such type, or a function returning either of those.
121
+ *
122
+ * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#type-resultpayloadof
123
+ */
124
+ type ErrorOf<T extends ResultTuple<unknown> | Promise<ResultTuple<unknown>> | ((...args: Array<any>) => ResultTuple<unknown> | Promise<ResultTuple<unknown>>)> = T extends [infer E, undefined?] ? E : T extends Promise<infer P> ? P extends [infer E, undefined?] ? E : never : T extends () => infer R ? R extends [infer E, undefined?] ? E : R extends Promise<infer P> ? P extends [infer E, undefined?] ? E : never : never : never;
116
125
  }
117
126
  export {};
127
+ /** /
128
+ // ---------------------------------------------------------------------------
129
+ // Tests for the Result.ErrorOf type helper:
130
+ // Should all extract the `X_Error` type as the error type from the various `Result.Tuple`-like types below:
131
+ let _e1: Result.ErrorOf<Result.Tuple<P, X_Error>>;
132
+ // ^?
133
+ let _e2: Result.ErrorOf<Result.TupleObj<P, X_Error>>;
134
+ // ^?
135
+ let _e3: Result.ErrorOf<ResultTupleObj<P, X_Error>>;
136
+ // ^?
137
+ let _e4: Result.ErrorOf<ResultTuple<P, X_Error>>;
138
+ // ^?
139
+
140
+ let _e5: Result.ErrorOf<Promise<Result.Tuple<P, X_Error>>>;
141
+ // ^?
142
+ let _e6: Result.ErrorOf<Promise<Result.TupleObj<P, X_Error>>>;
143
+ // ^?
144
+ let _e7: Result.ErrorOf<Promise<ResultTuple<P, X_Error>>>;
145
+ // ^?
146
+ let _e8: Result.ErrorOf<Promise<ResultTupleObj<P, X_Error>>>;
147
+ // ^?
148
+
149
+ let _E1: Result.ErrorOf<() => Result.Tuple<P, X_Error>>;
150
+ // ^?
151
+ let _E2: Result.ErrorOf<() => Result.TupleObj<P, X_Error>>;
152
+ // ^?
153
+ let _E3: Result.ErrorOf<() => ResultTupleObj<P, X_Error>>;
154
+ // ^?
155
+ let _E4: Result.ErrorOf<() => ResultTuple<P, X_Error>>;
156
+ // ^?
157
+
158
+ let _E5: Result.ErrorOf<() => Promise<Result.Tuple<P, X_Error>>>;
159
+ // ^?
160
+ let _E6: Result.ErrorOf<() => Promise<Result.TupleObj<P, X_Error>>>;
161
+ // ^?
162
+ let _E7: Result.ErrorOf<() => Promise<ResultTuple<P, X_Error>>>;
163
+ // ^?
164
+ let _E8: Result.ErrorOf<() => Promise<ResultTupleObj<P, X_Error>>>;
165
+ // ^?
166
+
167
+ type P = string;
168
+ class X_Error extends Error {
169
+ skilabod = 'fooo';
170
+ constructor() {
171
+ super('FormData validation error');
172
+ }
173
+ }
174
+ /**/
package/errorhandling.js CHANGED
@@ -48,12 +48,12 @@ const Success = (result) => {
48
48
  return tuple;
49
49
  };
50
50
  /*#__NO_SIDE_EFFECTS__*/
51
- const Fail = (e) => {
51
+ function Fail(e) {
52
52
  const tuple = [(0, exports.asError)(e)];
53
53
  tuple.error = tuple[0];
54
54
  tuple.mapTo = () => tuple;
55
55
  return tuple;
56
- };
56
+ }
57
57
  /*#__NO_SIDE_EFFECTS__*/
58
58
  function catch_(something) {
59
59
  if (something instanceof Promise) {
@@ -126,3 +126,51 @@ exports.Result = {
126
126
  return result[1];
127
127
  },
128
128
  };
129
+ /** /
130
+ // ---------------------------------------------------------------------------
131
+ // Tests for the Result.ErrorOf type helper:
132
+ // Should all extract the `X_Error` type as the error type from the various `Result.Tuple`-like types below:
133
+ let _e1: Result.ErrorOf<Result.Tuple<P, X_Error>>;
134
+ // ^?
135
+ let _e2: Result.ErrorOf<Result.TupleObj<P, X_Error>>;
136
+ // ^?
137
+ let _e3: Result.ErrorOf<ResultTupleObj<P, X_Error>>;
138
+ // ^?
139
+ let _e4: Result.ErrorOf<ResultTuple<P, X_Error>>;
140
+ // ^?
141
+
142
+ let _e5: Result.ErrorOf<Promise<Result.Tuple<P, X_Error>>>;
143
+ // ^?
144
+ let _e6: Result.ErrorOf<Promise<Result.TupleObj<P, X_Error>>>;
145
+ // ^?
146
+ let _e7: Result.ErrorOf<Promise<ResultTuple<P, X_Error>>>;
147
+ // ^?
148
+ let _e8: Result.ErrorOf<Promise<ResultTupleObj<P, X_Error>>>;
149
+ // ^?
150
+
151
+ let _E1: Result.ErrorOf<() => Result.Tuple<P, X_Error>>;
152
+ // ^?
153
+ let _E2: Result.ErrorOf<() => Result.TupleObj<P, X_Error>>;
154
+ // ^?
155
+ let _E3: Result.ErrorOf<() => ResultTupleObj<P, X_Error>>;
156
+ // ^?
157
+ let _E4: Result.ErrorOf<() => ResultTuple<P, X_Error>>;
158
+ // ^?
159
+
160
+ let _E5: Result.ErrorOf<() => Promise<Result.Tuple<P, X_Error>>>;
161
+ // ^?
162
+ let _E6: Result.ErrorOf<() => Promise<Result.TupleObj<P, X_Error>>>;
163
+ // ^?
164
+ let _E7: Result.ErrorOf<() => Promise<ResultTuple<P, X_Error>>>;
165
+ // ^?
166
+ let _E8: Result.ErrorOf<() => Promise<ResultTupleObj<P, X_Error>>>;
167
+ // ^?
168
+
169
+ type P = string;
170
+ class X_Error extends Error {
171
+ skilabod = 'fooo';
172
+ constructor() {
173
+ super('FormData validation error');
174
+ }
175
+ }
176
+ /**/
@@ -51,6 +51,8 @@ export type ResultTuple<T, E extends Error = Error> = [error: undefined, result:
51
51
  * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#type-resulttupleobj
52
52
  */
53
53
  export type ResultTupleObj<T, E extends Error = Error> = SuccessResult<T> | FailResult<E>;
54
+ declare function Fail<E extends Error = Error>(e: E): FailResult<E>;
55
+ declare function Fail<E extends Error = Error>(e: unknown): FailResult<E>;
54
56
  /**
55
57
  * Error handling utility that wraps a promise or a callback function.
56
58
  *
@@ -82,7 +84,7 @@ export declare const Result: {
82
84
  *
83
85
  * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#resultsfail
84
86
  */
85
- Fail: <E extends Error = Error>(e: unknown) => FailResult<E>;
87
+ Fail: typeof Fail;
86
88
  catch: typeof catch_;
87
89
  ify: typeof catch_;
88
90
  /**
@@ -113,5 +115,60 @@ export declare namespace Result {
113
115
  * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#type-resultpayloadof
114
116
  */
115
117
  type PayloadOf<T extends ResultTuple<unknown> | Promise<ResultTuple<unknown>> | ((...args: Array<any>) => ResultTuple<unknown> | Promise<ResultTuple<unknown>>)> = T extends [undefined, infer P] | Promise<ResultTuple<infer P>> | ((...args: Array<any>) => ResultTuple<infer P> | Promise<ResultTuple<infer P>>) ? P : never;
118
+ /**
119
+ * Extracts the error type `E` from a `Result.Tuple<T, E>`-like
120
+ * type, a `Promise` of such type, or a function returning either of those.
121
+ *
122
+ * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#type-resultpayloadof
123
+ */
124
+ type ErrorOf<T extends ResultTuple<unknown> | Promise<ResultTuple<unknown>> | ((...args: Array<any>) => ResultTuple<unknown> | Promise<ResultTuple<unknown>>)> = T extends [infer E, undefined?] ? E : T extends Promise<infer P> ? P extends [infer E, undefined?] ? E : never : T extends () => infer R ? R extends [infer E, undefined?] ? E : R extends Promise<infer P> ? P extends [infer E, undefined?] ? E : never : never : never;
116
125
  }
117
126
  export {};
127
+ /** /
128
+ // ---------------------------------------------------------------------------
129
+ // Tests for the Result.ErrorOf type helper:
130
+ // Should all extract the `X_Error` type as the error type from the various `Result.Tuple`-like types below:
131
+ let _e1: Result.ErrorOf<Result.Tuple<P, X_Error>>;
132
+ // ^?
133
+ let _e2: Result.ErrorOf<Result.TupleObj<P, X_Error>>;
134
+ // ^?
135
+ let _e3: Result.ErrorOf<ResultTupleObj<P, X_Error>>;
136
+ // ^?
137
+ let _e4: Result.ErrorOf<ResultTuple<P, X_Error>>;
138
+ // ^?
139
+
140
+ let _e5: Result.ErrorOf<Promise<Result.Tuple<P, X_Error>>>;
141
+ // ^?
142
+ let _e6: Result.ErrorOf<Promise<Result.TupleObj<P, X_Error>>>;
143
+ // ^?
144
+ let _e7: Result.ErrorOf<Promise<ResultTuple<P, X_Error>>>;
145
+ // ^?
146
+ let _e8: Result.ErrorOf<Promise<ResultTupleObj<P, X_Error>>>;
147
+ // ^?
148
+
149
+ let _E1: Result.ErrorOf<() => Result.Tuple<P, X_Error>>;
150
+ // ^?
151
+ let _E2: Result.ErrorOf<() => Result.TupleObj<P, X_Error>>;
152
+ // ^?
153
+ let _E3: Result.ErrorOf<() => ResultTupleObj<P, X_Error>>;
154
+ // ^?
155
+ let _E4: Result.ErrorOf<() => ResultTuple<P, X_Error>>;
156
+ // ^?
157
+
158
+ let _E5: Result.ErrorOf<() => Promise<Result.Tuple<P, X_Error>>>;
159
+ // ^?
160
+ let _E6: Result.ErrorOf<() => Promise<Result.TupleObj<P, X_Error>>>;
161
+ // ^?
162
+ let _E7: Result.ErrorOf<() => Promise<ResultTuple<P, X_Error>>>;
163
+ // ^?
164
+ let _E8: Result.ErrorOf<() => Promise<ResultTupleObj<P, X_Error>>>;
165
+ // ^?
166
+
167
+ type P = string;
168
+ class X_Error extends Error {
169
+ skilabod = 'fooo';
170
+ constructor() {
171
+ super('FormData validation error');
172
+ }
173
+ }
174
+ /**/
@@ -43,12 +43,12 @@ const Success = (result) => {
43
43
  return tuple;
44
44
  };
45
45
  /*#__NO_SIDE_EFFECTS__*/
46
- const Fail = (e) => {
46
+ function Fail(e) {
47
47
  const tuple = [asError(e)];
48
48
  tuple.error = tuple[0];
49
49
  tuple.mapTo = () => tuple;
50
50
  return tuple;
51
- };
51
+ }
52
52
  /*#__NO_SIDE_EFFECTS__*/
53
53
  function catch_(something) {
54
54
  if (something instanceof Promise) {
@@ -121,3 +121,51 @@ export const Result = {
121
121
  return result[1];
122
122
  },
123
123
  };
124
+ /** /
125
+ // ---------------------------------------------------------------------------
126
+ // Tests for the Result.ErrorOf type helper:
127
+ // Should all extract the `X_Error` type as the error type from the various `Result.Tuple`-like types below:
128
+ let _e1: Result.ErrorOf<Result.Tuple<P, X_Error>>;
129
+ // ^?
130
+ let _e2: Result.ErrorOf<Result.TupleObj<P, X_Error>>;
131
+ // ^?
132
+ let _e3: Result.ErrorOf<ResultTupleObj<P, X_Error>>;
133
+ // ^?
134
+ let _e4: Result.ErrorOf<ResultTuple<P, X_Error>>;
135
+ // ^?
136
+
137
+ let _e5: Result.ErrorOf<Promise<Result.Tuple<P, X_Error>>>;
138
+ // ^?
139
+ let _e6: Result.ErrorOf<Promise<Result.TupleObj<P, X_Error>>>;
140
+ // ^?
141
+ let _e7: Result.ErrorOf<Promise<ResultTuple<P, X_Error>>>;
142
+ // ^?
143
+ let _e8: Result.ErrorOf<Promise<ResultTupleObj<P, X_Error>>>;
144
+ // ^?
145
+
146
+ let _E1: Result.ErrorOf<() => Result.Tuple<P, X_Error>>;
147
+ // ^?
148
+ let _E2: Result.ErrorOf<() => Result.TupleObj<P, X_Error>>;
149
+ // ^?
150
+ let _E3: Result.ErrorOf<() => ResultTupleObj<P, X_Error>>;
151
+ // ^?
152
+ let _E4: Result.ErrorOf<() => ResultTuple<P, X_Error>>;
153
+ // ^?
154
+
155
+ let _E5: Result.ErrorOf<() => Promise<Result.Tuple<P, X_Error>>>;
156
+ // ^?
157
+ let _E6: Result.ErrorOf<() => Promise<Result.TupleObj<P, X_Error>>>;
158
+ // ^?
159
+ let _E7: Result.ErrorOf<() => Promise<ResultTuple<P, X_Error>>>;
160
+ // ^?
161
+ let _E8: Result.ErrorOf<() => Promise<ResultTupleObj<P, X_Error>>>;
162
+ // ^?
163
+
164
+ type P = string;
165
+ class X_Error extends Error {
166
+ skilabod = 'fooo';
167
+ constructor() {
168
+ super('FormData validation error');
169
+ }
170
+ }
171
+ /**/
@@ -35,7 +35,7 @@ export declare function vanillaClass(debugId: string, css: string | ClassNameCal
35
35
  * Returns an object with privately scoped CSS variables props.
36
36
  * Pass them around and use them in your CSS.
37
37
  *
38
- * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#vanillacvars
38
+ * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#vanillavars
39
39
  */
40
40
  export declare const vanillaVars: <T extends string>(...varNames: Array<T>) => Record<`var${Capitalize<T>}`, string> & {
41
41
  /** Allows initializing all or some of the variables in CSS, without offending VSCode's CSS syntax parser too much. */
@@ -31,7 +31,7 @@ export function vanillaClass(cssOrDebugId, css) {
31
31
  * Returns an object with privately scoped CSS variables props.
32
32
  * Pass them around and use them in your CSS.
33
33
  *
34
- * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#vanillacvars
34
+ * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#vanillavars
35
35
  */
36
36
  export const vanillaVars = (...varNames) => {
37
37
  const id = vanillaClass(``);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reykjavik/webtools",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "Misc. JS/TS helpers used by Reykjavík City's web dev teams.",
5
5
  "main": "index.js",
6
6
  "repository": "ssh://git@github.com:reykjavikcity/webtools.git",
@@ -35,7 +35,7 @@ export declare function vanillaClass(debugId: string, css: string | ClassNameCal
35
35
  * Returns an object with privately scoped CSS variables props.
36
36
  * Pass them around and use them in your CSS.
37
37
  *
38
- * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#vanillacvars
38
+ * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#vanillavars
39
39
  */
40
40
  export declare const vanillaVars: <T extends string>(...varNames: Array<T>) => Record<`var${Capitalize<T>}`, string> & {
41
41
  /** Allows initializing all or some of the variables in CSS, without offending VSCode's CSS syntax parser too much. */
package/vanillaExtract.js CHANGED
@@ -37,7 +37,7 @@ function vanillaClass(cssOrDebugId, css) {
37
37
  * Returns an object with privately scoped CSS variables props.
38
38
  * Pass them around and use them in your CSS.
39
39
  *
40
- * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#vanillacvars
40
+ * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#vanillavars
41
41
  */
42
42
  const vanillaVars = (...varNames) => {
43
43
  const id = vanillaClass(``);