@dxos/effect 0.8.4-main.b97322e → 0.8.4-main.bc2380dfbc

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 (86) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/chunk-CGS2ULMK.mjs +11 -0
  4. package/dist/lib/browser/chunk-CGS2ULMK.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +519 -293
  6. package/dist/lib/browser/index.mjs.map +4 -4
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/testing.mjs +31 -0
  9. package/dist/lib/browser/testing.mjs.map +7 -0
  10. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  11. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  12. package/dist/lib/node-esm/index.mjs +519 -293
  13. package/dist/lib/node-esm/index.mjs.map +4 -4
  14. package/dist/lib/node-esm/meta.json +1 -1
  15. package/dist/lib/node-esm/testing.mjs +31 -0
  16. package/dist/lib/node-esm/testing.mjs.map +7 -0
  17. package/dist/types/src/Performance.d.ts +25 -0
  18. package/dist/types/src/Performance.d.ts.map +1 -0
  19. package/dist/types/src/RuntimeProvider.d.ts +21 -0
  20. package/dist/types/src/RuntimeProvider.d.ts.map +1 -0
  21. package/dist/types/src/ast.d.ts +42 -22
  22. package/dist/types/src/ast.d.ts.map +1 -1
  23. package/dist/types/src/async-task-tagging.d.ts +6 -0
  24. package/dist/types/src/async-task-tagging.d.ts.map +1 -0
  25. package/dist/types/src/atom-kvs.d.ts +19 -0
  26. package/dist/types/src/atom-kvs.d.ts.map +1 -0
  27. package/dist/types/src/context.d.ts +2 -1
  28. package/dist/types/src/context.d.ts.map +1 -1
  29. package/dist/types/src/dynamic-runtime.d.ts +56 -0
  30. package/dist/types/src/dynamic-runtime.d.ts.map +1 -0
  31. package/dist/types/src/dynamic-runtime.test.d.ts +2 -0
  32. package/dist/types/src/dynamic-runtime.test.d.ts.map +1 -0
  33. package/dist/types/src/errors.d.ts +43 -1
  34. package/dist/types/src/errors.d.ts.map +1 -1
  35. package/dist/types/src/index.d.ts +8 -3
  36. package/dist/types/src/index.d.ts.map +1 -1
  37. package/dist/types/src/interrupt.test.d.ts +2 -0
  38. package/dist/types/src/interrupt.test.d.ts.map +1 -0
  39. package/dist/types/src/{jsonPath.d.ts → json-path.d.ts} +12 -4
  40. package/dist/types/src/json-path.d.ts.map +1 -0
  41. package/dist/types/src/json-path.test.d.ts +2 -0
  42. package/dist/types/src/json-path.test.d.ts.map +1 -0
  43. package/dist/types/src/layers.test.d.ts +2 -0
  44. package/dist/types/src/layers.test.d.ts.map +1 -0
  45. package/dist/types/src/otel.d.ts +17 -0
  46. package/dist/types/src/otel.d.ts.map +1 -0
  47. package/dist/types/src/otel.test.d.ts +2 -0
  48. package/dist/types/src/otel.test.d.ts.map +1 -0
  49. package/dist/types/src/resource.d.ts +6 -2
  50. package/dist/types/src/resource.d.ts.map +1 -1
  51. package/dist/types/src/testing.d.ts +26 -3
  52. package/dist/types/src/testing.d.ts.map +1 -1
  53. package/dist/types/src/types.d.ts +8 -0
  54. package/dist/types/src/types.d.ts.map +1 -0
  55. package/dist/types/src/url.d.ts +3 -1
  56. package/dist/types/src/url.d.ts.map +1 -1
  57. package/dist/types/tsconfig.tsbuildinfo +1 -1
  58. package/package.json +34 -13
  59. package/src/Performance.ts +45 -0
  60. package/src/RuntimeProvider.ts +35 -0
  61. package/src/ast.test.ts +39 -11
  62. package/src/ast.ts +149 -96
  63. package/src/async-task-tagging.ts +51 -0
  64. package/src/atom-kvs.ts +35 -0
  65. package/src/context.ts +2 -1
  66. package/src/dynamic-runtime.test.ts +465 -0
  67. package/src/dynamic-runtime.ts +195 -0
  68. package/src/errors.test.ts +1 -1
  69. package/src/errors.ts +142 -28
  70. package/src/index.ts +8 -3
  71. package/src/interrupt.test.ts +35 -0
  72. package/src/{jsonPath.test.ts → json-path.test.ts} +47 -8
  73. package/src/{jsonPath.ts → json-path.ts} +29 -4
  74. package/src/layers.test.ts +112 -0
  75. package/src/otel.test.ts +126 -0
  76. package/src/otel.ts +45 -0
  77. package/src/resource.test.ts +5 -4
  78. package/src/resource.ts +10 -5
  79. package/src/sanity.test.ts +30 -15
  80. package/src/testing.ts +31 -3
  81. package/src/types.ts +11 -0
  82. package/src/url.test.ts +1 -1
  83. package/src/url.ts +5 -2
  84. package/dist/types/src/jsonPath.d.ts.map +0 -1
  85. package/dist/types/src/jsonPath.test.d.ts +0 -2
  86. package/dist/types/src/jsonPath.test.d.ts.map +0 -1
@@ -1,70 +1,72 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ __export
4
+ } from "./chunk-HSLMI22Q.mjs";
2
5
 
3
6
  // src/ast.ts
4
- import { Option, pipe, SchemaAST, Schema } from "effect";
5
- import { isUndefinedKeyword } from "effect/SchemaAST";
7
+ import * as Function from "effect/Function";
8
+ import * as Option from "effect/Option";
9
+ import * as Schema from "effect/Schema";
10
+ import * as SchemaAST from "effect/SchemaAST";
6
11
  import { invariant } from "@dxos/invariant";
7
12
  import { isNonNullable } from "@dxos/util";
8
- var __dxlog_file = "/__w/dxos/dxos/packages/common/effect/src/ast.ts";
9
- var getSimpleType = (node) => {
10
- if (SchemaAST.isDeclaration(node) || SchemaAST.isObjectKeyword(node) || SchemaAST.isTypeLiteral(node) || isDiscriminatedUnion(node)) {
11
- return "object";
12
- }
13
- if (SchemaAST.isStringKeyword(node)) {
14
- return "string";
15
- }
16
- if (SchemaAST.isNumberKeyword(node)) {
17
- return "number";
18
- }
19
- if (SchemaAST.isBooleanKeyword(node)) {
20
- return "boolean";
21
- }
22
- if (SchemaAST.isEnums(node)) {
23
- return "enum";
24
- }
25
- if (SchemaAST.isLiteral(node)) {
26
- return "literal";
13
+ var reduceRefinements = (type, refinements = []) => {
14
+ if (SchemaAST.isRefinement(type)) {
15
+ const filter = type.filter;
16
+ const nextType = {
17
+ ...type.from,
18
+ annotations: {
19
+ ...type.from.annotations,
20
+ ...type.annotations
21
+ }
22
+ };
23
+ return reduceRefinements(nextType, [
24
+ ...refinements,
25
+ filter
26
+ ]);
27
27
  }
28
+ return {
29
+ type,
30
+ refinements
31
+ };
28
32
  };
29
- var isSimpleType = (node) => !!getSimpleType(node);
30
- (function(SimpleType2) {
31
- SimpleType2.getDefaultValue = (type) => {
32
- switch (type) {
33
- case "string": {
34
- return "";
35
- }
36
- case "number": {
37
- return 0;
38
- }
39
- case "boolean": {
40
- return false;
41
- }
42
- case "object": {
43
- return {};
44
- }
45
- default: {
46
- throw new Error(`Unsupported type for default value: ${type}`);
33
+ var getBaseType = (prop) => {
34
+ const encoded = SchemaAST.encodedBoundAST(prop.type);
35
+ const unwrapped = prop.isOptional && encoded._tag === "Union" ? encoded.types[0] : encoded;
36
+ return reduceRefinements(unwrapped);
37
+ };
38
+ var getProperties = (ast) => {
39
+ const properties = SchemaAST.getPropertySignatures(ast);
40
+ return properties.map((prop) => {
41
+ const { type, refinements } = getBaseType(prop);
42
+ const mergedType = prop.annotations && Reflect.ownKeys(prop.annotations).length > 0 ? {
43
+ ...type,
44
+ annotations: {
45
+ ...type.annotations,
46
+ ...prop.annotations
47
47
  }
48
- }
49
- };
50
- })(SimpleType || (SimpleType = {}));
51
- var VisitResult = /* @__PURE__ */ function(VisitResult2) {
48
+ } : type;
49
+ return {
50
+ type: mergedType,
51
+ refinements,
52
+ name: prop.name,
53
+ isOptional: prop.isOptional,
54
+ isReadonly: prop.isReadonly
55
+ };
56
+ });
57
+ };
58
+ var VisitResult = /* @__PURE__ */ (function(VisitResult2) {
52
59
  VisitResult2[VisitResult2["CONTINUE"] = 0] = "CONTINUE";
53
60
  VisitResult2[VisitResult2["SKIP"] = 1] = "SKIP";
54
61
  VisitResult2[VisitResult2["EXIT"] = 2] = "EXIT";
55
62
  return VisitResult2;
56
- }({});
57
- var defaultTest = isSimpleType;
63
+ })({});
58
64
  var visit = (node, testOrVisitor, visitor) => {
59
- if (!visitor) {
60
- visitNode(node, defaultTest, testOrVisitor);
61
- } else {
62
- visitNode(node, testOrVisitor, visitor);
63
- }
65
+ visitNode(node, testOrVisitor, visitor);
64
66
  };
65
67
  var visitNode = (node, test, visitor, path = [], depth = 0) => {
66
- const _result = test?.(node, path, depth);
67
- const result = _result === void 0 ? 0 : typeof _result === "boolean" ? _result ? 0 : 1 : _result;
68
+ const $result = test?.(node, path, depth);
69
+ const result = $result === void 0 ? 0 : typeof $result === "boolean" ? $result ? 0 : 1 : $result;
68
70
  if (result === 2) {
69
71
  return result;
70
72
  }
@@ -117,6 +119,12 @@ var findNode = (node, test) => {
117
119
  return child;
118
120
  }
119
121
  }
122
+ for (const prop of getIndexSignatures(node)) {
123
+ const child = findNode(prop.type, test);
124
+ if (child) {
125
+ return child;
126
+ }
127
+ }
120
128
  } else if (SchemaAST.isTupleType(node)) {
121
129
  for (const [_, element] of node.elements.entries()) {
122
130
  const child = findNode(element.type, test);
@@ -125,12 +133,13 @@ var findNode = (node, test) => {
125
133
  }
126
134
  }
127
135
  } else if (SchemaAST.isUnion(node)) {
128
- if (isOption(node)) {
129
- for (const type of node.types) {
130
- const child = findNode(type, test);
131
- if (child) {
132
- return child;
133
- }
136
+ if (isLiteralUnion(node)) {
137
+ return void 0;
138
+ }
139
+ for (const type of node.types) {
140
+ const child = findNode(type, test);
141
+ if (child) {
142
+ return child;
134
143
  }
135
144
  }
136
145
  } else if (SchemaAST.isRefinement(node)) {
@@ -141,15 +150,7 @@ var findProperty = (schema, path) => {
141
150
  const getProp = (node, path2) => {
142
151
  const [name, ...rest] = path2;
143
152
  const typeNode = findNode(node, SchemaAST.isTypeLiteral);
144
- invariant(typeNode, void 0, {
145
- F: __dxlog_file,
146
- L: 247,
147
- S: void 0,
148
- A: [
149
- "typeNode",
150
- ""
151
- ]
152
- });
153
+ invariant(typeNode);
153
154
  for (const prop of SchemaAST.getPropertySignatures(typeNode)) {
154
155
  if (prop.name === name) {
155
156
  if (rest.length) {
@@ -163,21 +164,21 @@ var findProperty = (schema, path) => {
163
164
  return getProp(schema.ast, path.split("."));
164
165
  };
165
166
  var defaultAnnotations = {
166
- ["ObjectKeyword"]: SchemaAST.objectKeyword,
167
- ["StringKeyword"]: SchemaAST.stringKeyword,
168
- ["NumberKeyword"]: SchemaAST.numberKeyword,
169
- ["BooleanKeyword"]: SchemaAST.booleanKeyword
170
- };
171
- var getAnnotation = (annotationId, noDefault = true) => (node) => {
172
- const id = pipe(SchemaAST.getIdentifierAnnotation(node), Option.getOrUndefined);
173
- const value = pipe(SchemaAST.getAnnotation(annotationId)(node), Option.getOrUndefined);
167
+ ObjectKeyword: SchemaAST.objectKeyword,
168
+ StringKeyword: SchemaAST.stringKeyword,
169
+ NumberKeyword: SchemaAST.numberKeyword,
170
+ BooleanKeyword: SchemaAST.booleanKeyword
171
+ };
172
+ var getAnnotation2 = (annotationId, noDefault = true) => (node) => {
173
+ const id = Function.pipe(SchemaAST.getIdentifierAnnotation(node), Option.getOrUndefined);
174
+ const value = Function.pipe(SchemaAST.getAnnotation(annotationId)(node), Option.getOrUndefined);
174
175
  if (noDefault && (value === defaultAnnotations[node._tag]?.annotations[annotationId] || value === id)) {
175
176
  return void 0;
176
177
  }
177
178
  return value;
178
179
  };
179
180
  var findAnnotation = (node, annotationId, noDefault = true) => {
180
- const getAnnotationById = getAnnotation(annotationId, noDefault);
181
+ const getAnnotationById = getAnnotation2(annotationId, noDefault);
181
182
  const getBaseAnnotation = (node2) => {
182
183
  const value = getAnnotationById(node2);
183
184
  if (value !== void 0) {
@@ -197,19 +198,26 @@ var isOption = (node) => {
197
198
  var isLiteralUnion = (node) => {
198
199
  return SchemaAST.isUnion(node) && node.types.every(SchemaAST.isLiteral);
199
200
  };
201
+ var getLiteralValues = (schema) => {
202
+ if (!isLiteralUnion(schema.ast)) {
203
+ return [];
204
+ }
205
+ return schema.ast.types.map((node) => node.literal);
206
+ };
207
+ var isArrayType = (node) => {
208
+ return SchemaAST.isTupleType(node) && node.elements.length === 0 && node.rest.length === 1;
209
+ };
210
+ var getArrayElementType = (node) => {
211
+ return isArrayType(node) ? node.rest.at(0)?.type : void 0;
212
+ };
213
+ var isTupleType2 = (node) => {
214
+ return SchemaAST.isTupleType(node) && node.elements.length > 0;
215
+ };
200
216
  var isDiscriminatedUnion = (node) => {
201
217
  return SchemaAST.isUnion(node) && !!getDiscriminatingProps(node)?.length;
202
218
  };
203
219
  var getDiscriminatingProps = (node) => {
204
- invariant(SchemaAST.isUnion(node), void 0, {
205
- F: __dxlog_file,
206
- L: 344,
207
- S: void 0,
208
- A: [
209
- "SchemaAST.isUnion(node)",
210
- ""
211
- ]
212
- });
220
+ invariant(SchemaAST.isUnion(node));
213
221
  if (isOption(node)) {
214
222
  return;
215
223
  }
@@ -219,39 +227,15 @@ var getDiscriminatingProps = (node) => {
219
227
  }, []);
220
228
  };
221
229
  var getDiscriminatedType = (node, value = {}) => {
222
- invariant(SchemaAST.isUnion(node), void 0, {
223
- F: __dxlog_file,
224
- L: 368,
225
- S: void 0,
226
- A: [
227
- "SchemaAST.isUnion(node)",
228
- ""
229
- ]
230
- });
231
- invariant(value, void 0, {
232
- F: __dxlog_file,
233
- L: 369,
234
- S: void 0,
235
- A: [
236
- "value",
237
- ""
238
- ]
239
- });
230
+ invariant(SchemaAST.isUnion(node));
231
+ invariant(value);
240
232
  const props = getDiscriminatingProps(node);
241
233
  if (!props?.length) {
242
234
  return;
243
235
  }
244
236
  for (const type of node.types) {
245
237
  const match = SchemaAST.getPropertySignatures(type).filter((prop) => props?.includes(prop.name.toString())).every((prop) => {
246
- invariant(SchemaAST.isLiteral(prop.type), void 0, {
247
- F: __dxlog_file,
248
- L: 380,
249
- S: void 0,
250
- A: [
251
- "SchemaAST.isLiteral(prop.type)",
252
- ""
253
- ]
254
- });
238
+ invariant(SchemaAST.isLiteral(prop.type));
255
239
  return prop.type.literal === value[prop.name.toString()];
256
240
  });
257
241
  if (match) {
@@ -261,15 +245,7 @@ var getDiscriminatedType = (node, value = {}) => {
261
245
  const fields = Object.fromEntries(props.map((prop) => {
262
246
  const literals = node.types.map((type) => {
263
247
  const literal = SchemaAST.getPropertySignatures(type).find((p) => p.name.toString() === prop);
264
- invariant(SchemaAST.isLiteral(literal.type), void 0, {
265
- F: __dxlog_file,
266
- L: 398,
267
- S: void 0,
268
- A: [
269
- "SchemaAST.isLiteral(literal.type)",
270
- ""
271
- ]
272
- });
248
+ invariant(SchemaAST.isLiteral(literal.type));
273
249
  return literal.type.literal;
274
250
  }).filter(isNonNullable);
275
251
  return literals.length ? [
@@ -280,10 +256,14 @@ var getDiscriminatedType = (node, value = {}) => {
280
256
  const schema = Schema.Struct(fields);
281
257
  return schema.ast;
282
258
  };
259
+ var isNestedType = (node) => {
260
+ return SchemaAST.isDeclaration(node) || SchemaAST.isObjectKeyword(node) || SchemaAST.isTypeLiteral(node) || // TODO(wittjosiah): Tuples are actually arrays.
261
+ isTupleType2(node) || isDiscriminatedUnion(node);
262
+ };
283
263
  var mapAst = (ast, f) => {
284
264
  switch (ast._tag) {
285
265
  case "TypeLiteral": {
286
- return new SchemaAST.TypeLiteral(ast.propertySignatures.map((prop) => new SchemaAST.PropertySignature(prop.name, f(prop.type, prop.name), prop.isOptional, prop.isReadonly, prop.annotations)), ast.indexSignatures);
266
+ return new SchemaAST.TypeLiteral(ast.propertySignatures.map((prop) => new SchemaAST.PropertySignature(prop.name, f(prop.type, prop.name), prop.isOptional, prop.isReadonly, prop.annotations)), ast.indexSignatures, ast.annotations);
287
267
  }
288
268
  case "Union": {
289
269
  return SchemaAST.Union.make(ast.types.map(f), ast.annotations);
@@ -300,151 +280,75 @@ var mapAst = (ast, f) => {
300
280
  }
301
281
  }
302
282
  };
303
- var isArrayType = (node) => {
304
- return SchemaAST.isTupleType(node) || SchemaAST.isUnion(node) && node.types.some(isArrayType) && node.types.some(isUndefinedKeyword) && node.types.length === 2;
305
- };
306
- var SimpleType;
307
-
308
- // src/jsonPath.ts
309
- import { Schema as Schema2, Option as Option2 } from "effect";
310
- import { JSONPath } from "jsonpath-plus";
311
- import { invariant as invariant2 } from "@dxos/invariant";
312
- var __dxlog_file2 = "/__w/dxos/dxos/packages/common/effect/src/jsonPath.ts";
313
- var PATH_REGEX = /^($|[a-zA-Z_$][\w$]*(?:\.[a-zA-Z_$][\w$]*|\[\d+\](?:\.)?)*$)/;
314
- var PROP_REGEX = /^\w+$/;
315
- var JsonPath = Schema2.String.pipe(Schema2.pattern(PATH_REGEX)).annotations({
316
- title: "JSON path",
317
- description: "JSON path to a property"
318
- });
319
- var JsonProp = Schema2.NonEmptyString.pipe(Schema2.pattern(PROP_REGEX, {
320
- message: () => "Property name must contain only letters, numbers, and underscores"
321
- }));
322
- var isJsonPath = (value) => {
323
- return Option2.isSome(Schema2.validateOption(JsonPath)(value));
324
- };
325
- var createJsonPath = (path) => {
326
- const candidatePath = path.map((p, i) => {
327
- if (typeof p === "number") {
328
- return `[${p}]`;
329
- } else {
330
- return i === 0 ? p : `.${p}`;
331
- }
332
- }).join("");
333
- invariant2(isJsonPath(candidatePath), `Invalid JsonPath: ${candidatePath}`, {
334
- F: __dxlog_file2,
335
- L: 63,
336
- S: void 0,
337
- A: [
338
- "isJsonPath(candidatePath)",
339
- "`Invalid JsonPath: ${candidatePath}`"
340
- ]
341
- });
342
- return candidatePath;
343
- };
344
- var fromEffectValidationPath = (effectPath) => {
345
- const jsonPath = effectPath.replace(/\.\[(\d+)\]/g, "[$1]");
346
- invariant2(isJsonPath(jsonPath), `Invalid JsonPath: ${jsonPath}`, {
347
- F: __dxlog_file2,
348
- L: 74,
349
- S: void 0,
350
- A: [
351
- "isJsonPath(jsonPath)",
352
- "`Invalid JsonPath: ${jsonPath}`"
353
- ]
354
- });
355
- return jsonPath;
356
- };
357
- var splitJsonPath = (path) => {
358
- if (!isJsonPath(path)) {
359
- return [];
283
+ var getIndexSignatures = (ast) => {
284
+ const annotation = SchemaAST.getSurrogateAnnotation(ast);
285
+ if (Option.isSome(annotation)) {
286
+ return getIndexSignatures(annotation.value);
360
287
  }
361
- return path.match(/[a-zA-Z_$][\w$]*|\[\d+\]/g)?.map((part) => part.startsWith("[") ? part.replace(/[[\]]/g, "") : part) ?? [];
362
- };
363
- var getField = (object, path) => {
364
- return JSONPath({
365
- path,
366
- json: object
367
- })[0];
288
+ switch (ast._tag) {
289
+ case "TypeLiteral":
290
+ return ast.indexSignatures.slice();
291
+ case "Suspend":
292
+ return getIndexSignatures(ast.f());
293
+ case "Refinement":
294
+ return getIndexSignatures(ast.from);
295
+ }
296
+ return [];
368
297
  };
369
298
 
370
- // src/url.ts
371
- import { SchemaAST as SchemaAST2, Option as Option3, pipe as pipe2 } from "effect";
372
- import { decamelize } from "@dxos/util";
373
- var ParamKeyAnnotationId = Symbol.for("@dxos/schema/annotation/ParamKey");
374
- var getParamKeyAnnotation = SchemaAST2.getAnnotation(ParamKeyAnnotationId);
375
- var ParamKeyAnnotation = (value) => (self) => self.annotations({
376
- [ParamKeyAnnotationId]: value
377
- });
378
- var UrlParser = class {
379
- constructor(_schema) {
380
- this._schema = _schema;
381
- }
382
- /**
383
- * Parse URL params.
384
- */
385
- parse(_url) {
386
- const url = new URL(_url);
387
- return Object.entries(this._schema.fields).reduce((params, [key, type]) => {
388
- let value = url.searchParams.get(decamelize(key));
389
- if (value == null) {
390
- value = url.searchParams.get(key);
391
- }
392
- if (value != null) {
393
- if (SchemaAST2.isNumberKeyword(type.ast)) {
394
- params[key] = parseInt(value);
395
- } else if (SchemaAST2.isBooleanKeyword(type.ast)) {
396
- params[key] = value === "true" || value === "1";
397
- } else {
398
- params[key] = value;
399
- }
400
- }
401
- return params;
402
- }, {});
403
- }
404
- /**
405
- * Return URL with encoded params.
406
- */
407
- create(_url, params) {
408
- const url = new URL(_url);
409
- Object.entries(params).forEach(([key, value]) => {
410
- if (value !== void 0) {
411
- const field = this._schema.fields[key];
412
- if (field) {
413
- const { key: serializedKey } = pipe2(getParamKeyAnnotation(field.ast), Option3.getOrElse(() => ({
414
- key: decamelize(key)
415
- })));
416
- url.searchParams.set(serializedKey, String(value));
417
- }
418
- }
419
- });
420
- return url;
421
- }
299
+ // src/atom-kvs.ts
300
+ import { Atom } from "@effect-atom/atom-react";
301
+ import * as BrowserKeyValueStore from "@effect/platform-browser/BrowserKeyValueStore";
302
+ var defaultRuntime = Atom.runtime(BrowserKeyValueStore.layerLocalStorage);
303
+ var createKvsStore = (options) => {
304
+ const runtime2 = options.runtime ?? defaultRuntime;
305
+ return Atom.kvs({
306
+ runtime: runtime2,
307
+ key: options.key,
308
+ schema: options.schema,
309
+ defaultValue: options.defaultValue
310
+ }).pipe(Atom.keepAlive);
422
311
  };
423
312
 
424
313
  // src/context.ts
425
- import { Effect } from "effect";
314
+ import * as Effect from "effect/Effect";
426
315
  import { Context } from "@dxos/context";
427
- var __dxlog_file3 = "/__w/dxos/dxos/packages/common/effect/src/context.ts";
428
316
  var contextFromScope = () => Effect.gen(function* () {
429
- const ctx = new Context(void 0, {
430
- F: __dxlog_file3,
431
- L: 12
432
- });
317
+ const ctx = new Context();
433
318
  yield* Effect.addFinalizer(() => Effect.promise(() => ctx.dispose()));
434
319
  return ctx;
435
320
  });
436
321
 
322
+ // src/dynamic-runtime.ts
323
+ var dynamic_runtime_exports = {};
324
+ __export(dynamic_runtime_exports, {
325
+ make: () => make
326
+ });
327
+ import * as Context2 from "effect/Context";
328
+ import * as Effect3 from "effect/Effect";
329
+ import * as Exit2 from "effect/Exit";
330
+ import * as Option3 from "effect/Option";
331
+ import * as Runtime2 from "effect/Runtime";
332
+
437
333
  // src/errors.ts
438
- import { Cause, Chunk, Effect as Effect2, Exit, GlobalValue, Option as Option4 } from "effect";
439
- var spanSymbol = Symbol.for("effect/SpanAnnotation");
440
- var originalSymbol = Symbol.for("effect/OriginalAnnotation");
334
+ import * as Cause from "effect/Cause";
335
+ import * as Chunk from "effect/Chunk";
336
+ import * as Effect2 from "effect/Effect";
337
+ import * as Exit from "effect/Exit";
338
+ import * as GlobalValue from "effect/GlobalValue";
339
+ import * as Option2 from "effect/Option";
340
+ import * as Runtime from "effect/Runtime";
341
+ var spanSymbol = /* @__PURE__ */ Symbol.for("effect/SpanAnnotation");
441
342
  var spanToTrace = GlobalValue.globalValue("effect/Tracer/spanToTrace", () => /* @__PURE__ */ new WeakMap());
442
343
  var locationRegex = /\((.*)\)/g;
443
344
  var prettyErrorStack = (error, appendStacks = []) => {
345
+ if (typeof error !== "object" || error === null) {
346
+ return error;
347
+ }
444
348
  const span = error[spanSymbol];
445
349
  const lines = typeof error.stack === "string" ? error.stack.split("\n") : [];
446
350
  const out = [];
447
- let atStack = false;
351
+ let atStack = false, inCore = false, passedScheduler = false;
448
352
  for (let i = 0; i < lines.length; i++) {
449
353
  if (!atStack && !lines[i].startsWith(" at ")) {
450
354
  out.push(lines[i]);
@@ -461,6 +365,26 @@ var prettyErrorStack = (error, appendStacks = []) => {
461
365
  if (lines[i].includes("effect_internal_function")) {
462
366
  break;
463
367
  }
368
+ const filename = lines[i].match(/\/([a-zA-Z0-9_\-.]+):\d+:\d+\)$/)?.[1];
369
+ if (!inCore && [
370
+ "core-effect.ts"
371
+ ].includes(filename)) {
372
+ inCore = true;
373
+ }
374
+ if (inCore && !passedScheduler && [
375
+ "Scheduler.ts"
376
+ ].includes(filename)) {
377
+ passedScheduler = true;
378
+ continue;
379
+ }
380
+ if (passedScheduler && ![
381
+ "Scheduler.ts"
382
+ ].includes(filename)) {
383
+ inCore = false;
384
+ }
385
+ if (inCore) {
386
+ continue;
387
+ }
464
388
  out.push(lines[i].replace(/at .*effect_instruction_i.*\((.*)\)/, "at $1").replace(/EffectPrimitive\.\w+/, "<anonymous>").replace(/at Arguments\./, "at "));
465
389
  }
466
390
  if (span) {
@@ -486,14 +410,12 @@ var prettyErrorStack = (error, appendStacks = []) => {
486
410
  } else {
487
411
  out.push(` at ${current.name}`);
488
412
  }
489
- current = Option4.getOrUndefined(current.parent);
413
+ current = Option2.getOrUndefined(current.parent);
490
414
  i++;
491
415
  }
492
416
  }
493
417
  out.push(...appendStacks);
494
- if (error[originalSymbol]) {
495
- error = error[originalSymbol];
496
- }
418
+ error = Cause.originalError(error);
497
419
  if (error.cause) {
498
420
  error.cause = prettyErrorStack(error.cause);
499
421
  }
@@ -505,98 +427,402 @@ var prettyErrorStack = (error, appendStacks = []) => {
505
427
  });
506
428
  return error;
507
429
  };
508
- var runAndForwardErrors = async (effect, options) => {
509
- const exit = await Effect2.runPromiseExit(effect, options);
510
- if (Exit.isSuccess(exit)) {
511
- return exit.value;
512
- }
513
- if (Cause.isEmpty(exit.cause)) {
514
- throw new Error("Fiber failed without a cause");
515
- } else if (Cause.isInterrupted(exit.cause)) {
516
- throw new Error("Fiber was interrupted");
430
+ var causeToError = (cause) => {
431
+ if (Cause.isEmpty(cause)) {
432
+ return new Error("Fiber failed without a cause");
433
+ } else if (Cause.isInterruptedOnly(cause)) {
434
+ return new Error("Fiber was interrupted");
517
435
  } else {
518
436
  const errors = [
519
- ...Chunk.toArray(Cause.failures(exit.cause)),
520
- ...Chunk.toArray(Cause.defects(exit.cause))
437
+ ...Chunk.toArray(Cause.failures(cause)),
438
+ ...Chunk.toArray(Cause.defects(cause))
521
439
  ];
522
440
  const getStackFrames = () => {
523
- const o = {};
524
- Error.captureStackTrace(o, getStackFrames);
441
+ const o = new Error();
442
+ Error.captureStackTrace(o, causeToError);
525
443
  return o.stack.split("\n").slice(1);
526
444
  };
527
445
  const stackFrames = getStackFrames();
528
446
  const newErrors = errors.map((error) => prettyErrorStack(error, stackFrames));
529
447
  if (newErrors.length === 1) {
530
- throw newErrors[0];
448
+ return newErrors[0];
531
449
  } else {
532
- throw new AggregateError(newErrors);
450
+ return new AggregateError(newErrors);
533
451
  }
534
452
  }
535
453
  };
454
+ var throwCause = (cause) => {
455
+ throw causeToError(cause);
456
+ };
457
+ var unwrapExit = (exit2) => {
458
+ if (Exit.isSuccess(exit2)) {
459
+ return exit2.value;
460
+ }
461
+ return throwCause(exit2.cause);
462
+ };
463
+ var runAndForwardErrors = async (effect, options) => {
464
+ const exit2 = await Effect2.runPromiseExit(effect, options);
465
+ return unwrapExit(exit2);
466
+ };
467
+ var runInRuntime = (...args) => {
468
+ if (args.length === 1) {
469
+ const [runtime2] = args;
470
+ return async (effect, options) => {
471
+ const exit2 = await Runtime.runPromiseExit(runtime2, effect, options);
472
+ return unwrapExit(exit2);
473
+ };
474
+ } else {
475
+ const [runtime2, effect, options] = args;
476
+ return (async () => {
477
+ const exit2 = await Runtime.runPromiseExit(runtime2, effect, options);
478
+ return unwrapExit(exit2);
479
+ })();
480
+ }
481
+ };
482
+ var promiseWithCauseCapture = (evaluate) => Effect2.promise(async (signal) => {
483
+ try {
484
+ const result = await evaluate(signal);
485
+ return Effect2.succeed(result);
486
+ } catch (err) {
487
+ return Effect2.die(err);
488
+ }
489
+ }).pipe(Effect2.flatten);
536
490
 
537
- // src/testing.ts
538
- import { Effect as Effect3 } from "effect";
539
- (function(TestHelpers2) {
540
- TestHelpers2.runIf = (condition) => (effect, ctx) => Effect3.gen(function* () {
541
- if (!condition) {
542
- ctx.skip();
543
- } else {
544
- return yield* effect;
491
+ // src/dynamic-runtime.ts
492
+ var validateTags = (context, tags) => Effect3.gen(function* () {
493
+ const missingTags = [];
494
+ for (const tag of tags) {
495
+ const option = Context2.getOption(context, tag);
496
+ if (Option3.isNone(option)) {
497
+ missingTags.push(tag.key);
545
498
  }
546
- });
547
- TestHelpers2.skipIf = (condition) => (effect, ctx) => Effect3.gen(function* () {
548
- if (condition) {
549
- ctx.skip();
499
+ }
500
+ if (missingTags.length > 0) {
501
+ return yield* Effect3.die(new Error(`Missing required tags in runtime: ${missingTags.join(", ")}`));
502
+ }
503
+ });
504
+ function make(managedRuntime, tags) {
505
+ const managedRuntimeAny = managedRuntime;
506
+ let cachedRuntime;
507
+ let validatedRuntimePromise;
508
+ const getValidatedRuntimeAsync = async () => {
509
+ if (!validatedRuntimePromise) {
510
+ validatedRuntimePromise = managedRuntimeAny.runPromise(Effect3.gen(function* () {
511
+ const rt = yield* managedRuntimeAny.runtimeEffect;
512
+ yield* validateTags(rt.context, tags);
513
+ return rt;
514
+ }));
515
+ }
516
+ return validatedRuntimePromise;
517
+ };
518
+ const getValidatedRuntime = () => {
519
+ const validationExit = managedRuntimeAny.runSyncExit(Effect3.gen(function* () {
520
+ const rt = yield* managedRuntimeAny.runtimeEffect;
521
+ yield* validateTags(rt.context, tags);
522
+ return rt;
523
+ }));
524
+ return unwrapExit(validationExit);
525
+ };
526
+ return {
527
+ managedRuntime: managedRuntimeAny,
528
+ runPromise: async (effect) => {
529
+ const runtime2 = await getValidatedRuntimeAsync();
530
+ return Runtime2.runPromise(runtime2)(effect);
531
+ },
532
+ runSync: (effect) => {
533
+ const runtime2 = getValidatedRuntime();
534
+ return Runtime2.runSync(runtime2)(effect);
535
+ },
536
+ runSyncExit: (effect) => {
537
+ const validationExit = managedRuntimeAny.runSyncExit(Effect3.gen(function* () {
538
+ const rt = yield* managedRuntimeAny.runtimeEffect;
539
+ yield* validateTags(rt.context, tags);
540
+ return rt;
541
+ }));
542
+ if (Exit2.isSuccess(validationExit)) {
543
+ const runtime2 = validationExit.value;
544
+ return Runtime2.runSyncExit(runtime2)(effect);
545
+ }
546
+ return validationExit;
547
+ },
548
+ runPromiseExit: async (effect) => {
549
+ try {
550
+ const runtime2 = await getValidatedRuntimeAsync();
551
+ return Runtime2.runPromiseExit(runtime2)(effect);
552
+ } catch (error) {
553
+ return Exit2.die(error);
554
+ }
555
+ },
556
+ runFork: (effect) => {
557
+ const runtime2 = getValidatedRuntime();
558
+ return Runtime2.runFork(runtime2)(effect);
559
+ },
560
+ runtimeEffect: Effect3.gen(function* () {
561
+ if (cachedRuntime) {
562
+ return cachedRuntime;
563
+ }
564
+ const rt = yield* managedRuntimeAny.runtimeEffect;
565
+ yield* validateTags(rt.context, tags);
566
+ const runtime2 = rt;
567
+ cachedRuntime = runtime2;
568
+ return runtime2;
569
+ }).pipe(Effect3.catchAll(() => (
570
+ // This should never happen since validateTags uses Effect.die
571
+ Effect3.die(new Error("Unexpected error in runtimeEffect validation"))
572
+ ))),
573
+ dispose: async () => {
574
+ await managedRuntimeAny.dispose();
575
+ }
576
+ };
577
+ }
578
+
579
+ // src/json-path.ts
580
+ import * as Option4 from "effect/Option";
581
+ import * as Schema2 from "effect/Schema";
582
+ import { JSONPath } from "jsonpath-plus";
583
+ import { invariant as invariant2 } from "@dxos/invariant";
584
+ import { getDeep, setDeep } from "@dxos/util";
585
+ var PATH_REGEX = /^($|[a-zA-Z_$][\w$]*(?:\.[a-zA-Z_$][\w$]*|\[\d+\](?:\.)?)*$)/;
586
+ var PROP_REGEX = /^\w+$/;
587
+ var JsonPath = Schema2.String.pipe(Schema2.pattern(PATH_REGEX)).annotations({
588
+ title: "JSON path",
589
+ description: "JSON path to a property"
590
+ });
591
+ var JsonProp = Schema2.NonEmptyString.pipe(Schema2.pattern(PROP_REGEX, {
592
+ message: () => "Property name must contain only letters, numbers, and underscores"
593
+ }));
594
+ var isJsonPath = (value) => {
595
+ return Option4.isSome(Schema2.validateOption(JsonPath)(value));
596
+ };
597
+ var createJsonPath = (path) => {
598
+ const candidatePath = path.map((p, i) => {
599
+ if (typeof p === "number") {
600
+ return `[${p}]`;
550
601
  } else {
551
- return yield* effect;
602
+ return i === 0 ? p : `.${p}`;
552
603
  }
553
- });
554
- })(TestHelpers || (TestHelpers = {}));
555
- var TestHelpers;
604
+ }).join("");
605
+ invariant2(isJsonPath(candidatePath), `Invalid JsonPath: ${candidatePath}`);
606
+ return candidatePath;
607
+ };
608
+ var fromEffectValidationPath = (effectPath) => {
609
+ const jsonPath = effectPath.replace(/\.\[(\d+)\]/g, "[$1]");
610
+ invariant2(isJsonPath(jsonPath), `Invalid JsonPath: ${jsonPath}`);
611
+ return jsonPath;
612
+ };
613
+ var splitJsonPath = (path) => {
614
+ if (!isJsonPath(path)) {
615
+ return [];
616
+ }
617
+ return path.match(/[a-zA-Z_$][\w$]*|\[\d+\]/g)?.map((part) => part.replace(/[[\]]/g, "")).map((part) => {
618
+ const parsed = Number.parseInt(part, 10);
619
+ return Number.isNaN(parsed) ? part : parsed;
620
+ }) ?? [];
621
+ };
622
+ var getField = (object, path) => {
623
+ return JSONPath({
624
+ path,
625
+ json: object
626
+ })[0];
627
+ };
628
+ var getValue = (obj, path) => {
629
+ return getDeep(obj, splitJsonPath(path));
630
+ };
631
+ var setValue = (obj, path, value) => {
632
+ return setDeep(obj, splitJsonPath(path), value);
633
+ };
556
634
 
557
635
  // src/resource.ts
558
- import { Effect as Effect4 } from "effect";
559
- var accuireReleaseResource = (getResource) => Effect4.acquireRelease(Effect4.gen(function* () {
636
+ import * as Effect4 from "effect/Effect";
637
+ var acquireReleaseResource = (getResource) => Effect4.acquireRelease(Effect4.gen(function* () {
560
638
  const resource = getResource();
561
639
  yield* Effect4.promise(async () => {
562
- resource.open?.();
640
+ await resource.open?.();
563
641
  return void 0;
564
642
  });
565
643
  return resource;
566
644
  }), (resource) => Effect4.promise(async () => {
567
- resource.close?.();
645
+ await resource.close?.();
568
646
  return void 0;
569
647
  }));
648
+
649
+ // src/url.ts
650
+ import * as Function2 from "effect/Function";
651
+ import * as Option5 from "effect/Option";
652
+ import * as SchemaAST2 from "effect/SchemaAST";
653
+ import { decamelize } from "@dxos/util";
654
+ var ParamKeyAnnotationId = /* @__PURE__ */ Symbol.for("@dxos/schema/annotation/ParamKey");
655
+ var getParamKeyAnnotation = SchemaAST2.getAnnotation(ParamKeyAnnotationId);
656
+ var ParamKeyAnnotation = (value) => (self) => self.annotations({
657
+ [ParamKeyAnnotationId]: value
658
+ });
659
+ var UrlParser = class {
660
+ _schema;
661
+ constructor(_schema) {
662
+ this._schema = _schema;
663
+ }
664
+ /**
665
+ * Parse URL params.
666
+ */
667
+ parse(_url) {
668
+ const url = new URL(_url);
669
+ return Object.entries(this._schema.fields).reduce((params, [key, type]) => {
670
+ let value = url.searchParams.get(decamelize(key));
671
+ if (value == null) {
672
+ value = url.searchParams.get(key);
673
+ }
674
+ if (value != null) {
675
+ if (SchemaAST2.isNumberKeyword(type.ast)) {
676
+ params[key] = parseInt(value);
677
+ } else if (SchemaAST2.isBooleanKeyword(type.ast)) {
678
+ params[key] = value === "true" || value === "1";
679
+ } else {
680
+ params[key] = value;
681
+ }
682
+ }
683
+ return params;
684
+ }, {});
685
+ }
686
+ /**
687
+ * Return URL with encoded params.
688
+ */
689
+ create(_url, params) {
690
+ const url = new URL(_url);
691
+ Object.entries(params).forEach(([key, value]) => {
692
+ if (value !== void 0) {
693
+ const field = this._schema.fields[key];
694
+ if (field) {
695
+ const { key: serializedKey } = Function2.pipe(getParamKeyAnnotation(field.ast), Option5.getOrElse(() => ({
696
+ key: decamelize(key)
697
+ })));
698
+ url.searchParams.set(serializedKey, String(value));
699
+ }
700
+ }
701
+ });
702
+ return url;
703
+ }
704
+ };
705
+
706
+ // src/RuntimeProvider.ts
707
+ var RuntimeProvider_exports = {};
708
+ __export(RuntimeProvider_exports, {
709
+ currentRuntime: () => currentRuntime,
710
+ provide: () => provide2,
711
+ runPromise: () => runPromise2
712
+ });
713
+ import * as Effect5 from "effect/Effect";
714
+ import * as Runtime3 from "effect/Runtime";
715
+ var currentRuntime = () => Effect5.runtime().pipe(Effect5.map(Effect5.succeed));
716
+ var runPromise2 = (provider) => async (effect) => {
717
+ const runtime2 = await runAndForwardErrors(provider);
718
+ return unwrapExit(await effect.pipe(Runtime3.runPromiseExit(runtime2)));
719
+ };
720
+ var provide2 = (runtimeProvider) => (effect) => Effect5.flatMap(runtimeProvider, (runtime2) => Effect5.provide(effect, runtime2));
721
+
722
+ // src/Performance.ts
723
+ var Performance_exports = {};
724
+ __export(Performance_exports, {
725
+ addTrackEntry: () => addTrackEntry
726
+ });
727
+ import * as Effect6 from "effect/Effect";
728
+ var addTrackEntry = (options) => (effect) => Effect6.gen(function* () {
729
+ const start = performance.now();
730
+ const exit2 = yield* Effect6.exit(effect);
731
+ const resolvedOptions = typeof options === "function" ? options(exit2) : options;
732
+ performance.measure(resolvedOptions.name, {
733
+ start,
734
+ detail: {
735
+ ...resolvedOptions.detail,
736
+ devtools: resolvedOptions.devtools
737
+ }
738
+ });
739
+ return yield* exit2;
740
+ });
741
+
742
+ // src/async-task-tagging.ts
743
+ import * as Context3 from "effect/Context";
744
+ import * as Effect7 from "effect/Effect";
745
+ import { pipe as pipe3 } from "effect/Function";
746
+ import * as Layer from "effect/Layer";
747
+ import * as Predicate from "effect/Predicate";
748
+ import * as Tracer from "effect/Tracer";
749
+ var runInTask = /* @__PURE__ */ Symbol("runInTask");
750
+ var asyncTaskTaggingLayer = () => {
751
+ if (Predicate.hasProperty(console, "createTask") === false) {
752
+ return Layer.empty;
753
+ }
754
+ const makeTracer = Effect7.gen(function* () {
755
+ const oldTracer = yield* Effect7.tracer;
756
+ return Tracer.make({
757
+ span: (name, ...args) => {
758
+ const span = oldTracer.span(name, ...args);
759
+ const trace = console.createTask(name);
760
+ span[runInTask] = (f) => trace.run(f);
761
+ return span;
762
+ },
763
+ context: (f, fiber) => {
764
+ const maybeParentSpan = Context3.getOption(Tracer.ParentSpan)(fiber.currentContext);
765
+ if (maybeParentSpan._tag === "None") {
766
+ return oldTracer.context(f, fiber);
767
+ }
768
+ const parentSpan = maybeParentSpan.value;
769
+ if (parentSpan._tag === "ExternalSpan") {
770
+ return oldTracer.context(f, fiber);
771
+ }
772
+ const span = parentSpan;
773
+ if (runInTask in span && typeof span[runInTask] === "function") {
774
+ return span[runInTask](() => oldTracer.context(f, fiber));
775
+ }
776
+ return oldTracer.context(f, fiber);
777
+ }
778
+ });
779
+ });
780
+ return pipe3(makeTracer, Effect7.map(Layer.setTracer), Layer.unwrapEffect);
781
+ };
570
782
  export {
783
+ dynamic_runtime_exports as DynamicRuntime,
571
784
  JsonPath,
572
785
  JsonProp,
573
786
  ParamKeyAnnotation,
574
- SimpleType,
575
- TestHelpers,
787
+ Performance_exports as Performance,
788
+ RuntimeProvider_exports as RuntimeProvider,
576
789
  UrlParser,
577
790
  VisitResult,
578
- accuireReleaseResource,
791
+ acquireReleaseResource,
792
+ asyncTaskTaggingLayer,
793
+ causeToError,
579
794
  contextFromScope,
580
795
  createJsonPath,
796
+ createKvsStore,
581
797
  findAnnotation,
582
798
  findNode,
583
799
  findProperty,
584
800
  fromEffectValidationPath,
585
- getAnnotation,
801
+ getAnnotation2 as getAnnotation,
802
+ getArrayElementType,
803
+ getBaseType,
586
804
  getDiscriminatedType,
587
805
  getDiscriminatingProps,
588
806
  getField,
807
+ getLiteralValues,
589
808
  getParamKeyAnnotation,
590
- getSimpleType,
809
+ getProperties,
810
+ getValue,
591
811
  isArrayType,
592
812
  isDiscriminatedUnion,
593
813
  isJsonPath,
594
814
  isLiteralUnion,
815
+ isNestedType,
595
816
  isOption,
596
- isSimpleType,
817
+ isTupleType2 as isTupleType,
597
818
  mapAst,
819
+ promiseWithCauseCapture,
598
820
  runAndForwardErrors,
821
+ runInRuntime,
822
+ setValue,
599
823
  splitJsonPath,
824
+ throwCause,
825
+ unwrapExit,
600
826
  visit
601
827
  };
602
828
  //# sourceMappingURL=index.mjs.map