@dxos/effect 0.8.4-main.72ec0f3 → 0.8.4-main.765dc60934

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 (67) 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 +439 -283
  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 +439 -283
  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 +40 -21
  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/dynamic-runtime.d.ts +56 -0
  28. package/dist/types/src/dynamic-runtime.d.ts.map +1 -0
  29. package/dist/types/src/dynamic-runtime.test.d.ts +2 -0
  30. package/dist/types/src/dynamic-runtime.test.d.ts.map +1 -0
  31. package/dist/types/src/errors.d.ts +12 -0
  32. package/dist/types/src/errors.d.ts.map +1 -1
  33. package/dist/types/src/index.d.ts +8 -3
  34. package/dist/types/src/index.d.ts.map +1 -1
  35. package/dist/types/src/{jsonPath.d.ts → json-path.d.ts} +11 -3
  36. package/dist/types/src/json-path.d.ts.map +1 -0
  37. package/dist/types/src/json-path.test.d.ts +2 -0
  38. package/dist/types/src/json-path.test.d.ts.map +1 -0
  39. package/dist/types/src/resource.d.ts.map +1 -1
  40. package/dist/types/src/testing.d.ts +3 -12
  41. package/dist/types/src/testing.d.ts.map +1 -1
  42. package/dist/types/src/types.d.ts +8 -0
  43. package/dist/types/src/types.d.ts.map +1 -0
  44. package/dist/types/src/url.d.ts.map +1 -1
  45. package/dist/types/tsconfig.tsbuildinfo +1 -1
  46. package/package.json +33 -21
  47. package/src/Performance.ts +45 -0
  48. package/src/RuntimeProvider.ts +35 -0
  49. package/src/ast.test.ts +35 -8
  50. package/src/ast.ts +109 -91
  51. package/src/async-task-tagging.ts +51 -0
  52. package/src/atom-kvs.ts +35 -0
  53. package/src/dynamic-runtime.test.ts +465 -0
  54. package/src/dynamic-runtime.ts +195 -0
  55. package/src/errors.ts +69 -8
  56. package/src/index.ts +8 -3
  57. package/src/interrupt.test.ts +3 -1
  58. package/src/{jsonPath.test.ts → json-path.test.ts} +47 -8
  59. package/src/{jsonPath.ts → json-path.ts} +26 -3
  60. package/src/layers.test.ts +4 -2
  61. package/src/resource.ts +2 -2
  62. package/src/sanity.test.ts +6 -4
  63. package/src/testing.ts +3 -27
  64. package/src/types.ts +11 -0
  65. package/dist/types/src/jsonPath.d.ts.map +0 -1
  66. package/dist/types/src/jsonPath.test.d.ts +0 -2
  67. package/dist/types/src/jsonPath.test.d.ts.map +0 -1
@@ -1,4 +1,7 @@
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
7
  import * as Function from "effect/Function";
@@ -7,66 +10,59 @@ import * as Schema from "effect/Schema";
7
10
  import * as SchemaAST from "effect/SchemaAST";
8
11
  import { invariant } from "@dxos/invariant";
9
12
  import { isNonNullable } from "@dxos/util";
10
- var __dxlog_file = "/__w/dxos/dxos/packages/common/effect/src/ast.ts";
11
- var isTupleType2 = (node) => {
12
- return SchemaAST.isTupleType(node) && node.elements.length > 0;
13
- };
14
- var getSimpleType = (node) => {
15
- if (SchemaAST.isDeclaration(node) || SchemaAST.isObjectKeyword(node) || SchemaAST.isTypeLiteral(node) || // TODO(wittjosiah): Tuples are actually arrays.
16
- isTupleType2(node) || isDiscriminatedUnion(node)) {
17
- return "object";
18
- }
19
- if (SchemaAST.isStringKeyword(node)) {
20
- return "string";
21
- }
22
- if (SchemaAST.isNumberKeyword(node)) {
23
- return "number";
24
- }
25
- if (SchemaAST.isBooleanKeyword(node)) {
26
- return "boolean";
27
- }
28
- if (SchemaAST.isEnums(node)) {
29
- return "enum";
30
- }
31
- if (SchemaAST.isLiteral(node)) {
32
- 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
+ ]);
33
27
  }
28
+ return {
29
+ type,
30
+ refinements
31
+ };
34
32
  };
35
- var isSimpleType = (node) => !!getSimpleType(node);
36
- (function(SimpleType2) {
37
- SimpleType2.getDefaultValue = (type) => {
38
- switch (type) {
39
- case "string": {
40
- return "";
41
- }
42
- case "number": {
43
- return 0;
44
- }
45
- case "boolean": {
46
- return false;
47
- }
48
- case "object": {
49
- return {};
50
- }
51
- default: {
52
- 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
53
47
  }
54
- }
55
- };
56
- })(SimpleType || (SimpleType = {}));
48
+ } : type;
49
+ return {
50
+ type: mergedType,
51
+ refinements,
52
+ name: prop.name,
53
+ isOptional: prop.isOptional,
54
+ isReadonly: prop.isReadonly
55
+ };
56
+ });
57
+ };
57
58
  var VisitResult = /* @__PURE__ */ (function(VisitResult2) {
58
59
  VisitResult2[VisitResult2["CONTINUE"] = 0] = "CONTINUE";
59
60
  VisitResult2[VisitResult2["SKIP"] = 1] = "SKIP";
60
61
  VisitResult2[VisitResult2["EXIT"] = 2] = "EXIT";
61
62
  return VisitResult2;
62
63
  })({});
63
- var defaultTest = isSimpleType;
64
64
  var visit = (node, testOrVisitor, visitor) => {
65
- if (!visitor) {
66
- visitNode(node, defaultTest, testOrVisitor);
67
- } else {
68
- visitNode(node, testOrVisitor, visitor);
69
- }
65
+ visitNode(node, testOrVisitor, visitor);
70
66
  };
71
67
  var visitNode = (node, test, visitor, path = [], depth = 0) => {
72
68
  const $result = test?.(node, path, depth);
@@ -154,15 +150,7 @@ var findProperty = (schema, path) => {
154
150
  const getProp = (node, path2) => {
155
151
  const [name, ...rest] = path2;
156
152
  const typeNode = findNode(node, SchemaAST.isTypeLiteral);
157
- invariant(typeNode, void 0, {
158
- F: __dxlog_file,
159
- L: 265,
160
- S: void 0,
161
- A: [
162
- "typeNode",
163
- ""
164
- ]
165
- });
153
+ invariant(typeNode);
166
154
  for (const prop of SchemaAST.getPropertySignatures(typeNode)) {
167
155
  if (prop.name === name) {
168
156
  if (rest.length) {
@@ -176,10 +164,10 @@ var findProperty = (schema, path) => {
176
164
  return getProp(schema.ast, path.split("."));
177
165
  };
178
166
  var defaultAnnotations = {
179
- ["ObjectKeyword"]: SchemaAST.objectKeyword,
180
- ["StringKeyword"]: SchemaAST.stringKeyword,
181
- ["NumberKeyword"]: SchemaAST.numberKeyword,
182
- ["BooleanKeyword"]: SchemaAST.booleanKeyword
167
+ ObjectKeyword: SchemaAST.objectKeyword,
168
+ StringKeyword: SchemaAST.stringKeyword,
169
+ NumberKeyword: SchemaAST.numberKeyword,
170
+ BooleanKeyword: SchemaAST.booleanKeyword
183
171
  };
184
172
  var getAnnotation2 = (annotationId, noDefault = true) => (node) => {
185
173
  const id = Function.pipe(SchemaAST.getIdentifierAnnotation(node), Option.getOrUndefined);
@@ -210,19 +198,26 @@ var isOption = (node) => {
210
198
  var isLiteralUnion = (node) => {
211
199
  return SchemaAST.isUnion(node) && node.types.every(SchemaAST.isLiteral);
212
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
+ };
213
216
  var isDiscriminatedUnion = (node) => {
214
217
  return SchemaAST.isUnion(node) && !!getDiscriminatingProps(node)?.length;
215
218
  };
216
219
  var getDiscriminatingProps = (node) => {
217
- invariant(SchemaAST.isUnion(node), void 0, {
218
- F: __dxlog_file,
219
- L: 362,
220
- S: void 0,
221
- A: [
222
- "SchemaAST.isUnion(node)",
223
- ""
224
- ]
225
- });
220
+ invariant(SchemaAST.isUnion(node));
226
221
  if (isOption(node)) {
227
222
  return;
228
223
  }
@@ -232,39 +227,15 @@ var getDiscriminatingProps = (node) => {
232
227
  }, []);
233
228
  };
234
229
  var getDiscriminatedType = (node, value = {}) => {
235
- invariant(SchemaAST.isUnion(node), void 0, {
236
- F: __dxlog_file,
237
- L: 386,
238
- S: void 0,
239
- A: [
240
- "SchemaAST.isUnion(node)",
241
- ""
242
- ]
243
- });
244
- invariant(value, void 0, {
245
- F: __dxlog_file,
246
- L: 387,
247
- S: void 0,
248
- A: [
249
- "value",
250
- ""
251
- ]
252
- });
230
+ invariant(SchemaAST.isUnion(node));
231
+ invariant(value);
253
232
  const props = getDiscriminatingProps(node);
254
233
  if (!props?.length) {
255
234
  return;
256
235
  }
257
236
  for (const type of node.types) {
258
237
  const match = SchemaAST.getPropertySignatures(type).filter((prop) => props?.includes(prop.name.toString())).every((prop) => {
259
- invariant(SchemaAST.isLiteral(prop.type), void 0, {
260
- F: __dxlog_file,
261
- L: 398,
262
- S: void 0,
263
- A: [
264
- "SchemaAST.isLiteral(prop.type)",
265
- ""
266
- ]
267
- });
238
+ invariant(SchemaAST.isLiteral(prop.type));
268
239
  return prop.type.literal === value[prop.name.toString()];
269
240
  });
270
241
  if (match) {
@@ -274,15 +245,7 @@ var getDiscriminatedType = (node, value = {}) => {
274
245
  const fields = Object.fromEntries(props.map((prop) => {
275
246
  const literals = node.types.map((type) => {
276
247
  const literal = SchemaAST.getPropertySignatures(type).find((p) => p.name.toString() === prop);
277
- invariant(SchemaAST.isLiteral(literal.type), void 0, {
278
- F: __dxlog_file,
279
- L: 416,
280
- S: void 0,
281
- A: [
282
- "SchemaAST.isLiteral(literal.type)",
283
- ""
284
- ]
285
- });
248
+ invariant(SchemaAST.isLiteral(literal.type));
286
249
  return literal.type.literal;
287
250
  }).filter(isNonNullable);
288
251
  return literals.length ? [
@@ -293,6 +256,10 @@ var getDiscriminatedType = (node, value = {}) => {
293
256
  const schema = Schema.Struct(fields);
294
257
  return schema.ast;
295
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
+ };
296
263
  var mapAst = (ast, f) => {
297
264
  switch (ast._tag) {
298
265
  case "TypeLiteral": {
@@ -313,9 +280,6 @@ var mapAst = (ast, f) => {
313
280
  }
314
281
  }
315
282
  };
316
- var isArrayType = (node) => {
317
- return SchemaAST.isTupleType(node) || SchemaAST.isUnion(node) && node.types.some(isArrayType) && node.types.some(SchemaAST.isUndefinedKeyword) && node.types.length === 2;
318
- };
319
283
  var getIndexSignatures = (ast) => {
320
284
  const annotation = SchemaAST.getSurrogateAnnotation(ast);
321
285
  if (Option.isSome(annotation)) {
@@ -331,157 +295,60 @@ var getIndexSignatures = (ast) => {
331
295
  }
332
296
  return [];
333
297
  };
334
- var SimpleType;
335
-
336
- // src/jsonPath.ts
337
- import * as Option2 from "effect/Option";
338
- import * as Schema2 from "effect/Schema";
339
- import { JSONPath } from "jsonpath-plus";
340
- import { invariant as invariant2 } from "@dxos/invariant";
341
- var __dxlog_file2 = "/__w/dxos/dxos/packages/common/effect/src/jsonPath.ts";
342
- var PATH_REGEX = /^($|[a-zA-Z_$][\w$]*(?:\.[a-zA-Z_$][\w$]*|\[\d+\](?:\.)?)*$)/;
343
- var PROP_REGEX = /^\w+$/;
344
- var JsonPath = Schema2.String.pipe(Schema2.pattern(PATH_REGEX)).annotations({
345
- title: "JSON path",
346
- description: "JSON path to a property"
347
- });
348
- var JsonProp = Schema2.NonEmptyString.pipe(Schema2.pattern(PROP_REGEX, {
349
- message: () => "Property name must contain only letters, numbers, and underscores"
350
- }));
351
- var isJsonPath = (value) => {
352
- return Option2.isSome(Schema2.validateOption(JsonPath)(value));
353
- };
354
- var createJsonPath = (path) => {
355
- const candidatePath = path.map((p, i) => {
356
- if (typeof p === "number") {
357
- return `[${p}]`;
358
- } else {
359
- return i === 0 ? p : `.${p}`;
360
- }
361
- }).join("");
362
- invariant2(isJsonPath(candidatePath), `Invalid JsonPath: ${candidatePath}`, {
363
- F: __dxlog_file2,
364
- L: 65,
365
- S: void 0,
366
- A: [
367
- "isJsonPath(candidatePath)",
368
- "`Invalid JsonPath: ${candidatePath}`"
369
- ]
370
- });
371
- return candidatePath;
372
- };
373
- var fromEffectValidationPath = (effectPath) => {
374
- const jsonPath = effectPath.replace(/\.\[(\d+)\]/g, "[$1]");
375
- invariant2(isJsonPath(jsonPath), `Invalid JsonPath: ${jsonPath}`, {
376
- F: __dxlog_file2,
377
- L: 76,
378
- S: void 0,
379
- A: [
380
- "isJsonPath(jsonPath)",
381
- "`Invalid JsonPath: ${jsonPath}`"
382
- ]
383
- });
384
- return jsonPath;
385
- };
386
- var splitJsonPath = (path) => {
387
- if (!isJsonPath(path)) {
388
- return [];
389
- }
390
- return path.match(/[a-zA-Z_$][\w$]*|\[\d+\]/g)?.map((part) => part.startsWith("[") ? part.replace(/[[\]]/g, "") : part) ?? [];
391
- };
392
- var getField = (object, path) => {
393
- return JSONPath({
394
- path,
395
- json: object
396
- })[0];
397
- };
398
298
 
399
- // src/url.ts
400
- import * as Function2 from "effect/Function";
401
- import * as Option3 from "effect/Option";
402
- import * as SchemaAST2 from "effect/SchemaAST";
403
- import { decamelize } from "@dxos/util";
404
- var ParamKeyAnnotationId = Symbol.for("@dxos/schema/annotation/ParamKey");
405
- var getParamKeyAnnotation = SchemaAST2.getAnnotation(ParamKeyAnnotationId);
406
- var ParamKeyAnnotation = (value) => (self) => self.annotations({
407
- [ParamKeyAnnotationId]: value
408
- });
409
- var UrlParser = class {
410
- _schema;
411
- constructor(_schema) {
412
- this._schema = _schema;
413
- }
414
- /**
415
- * Parse URL params.
416
- */
417
- parse(_url) {
418
- const url = new URL(_url);
419
- return Object.entries(this._schema.fields).reduce((params, [key, type]) => {
420
- let value = url.searchParams.get(decamelize(key));
421
- if (value == null) {
422
- value = url.searchParams.get(key);
423
- }
424
- if (value != null) {
425
- if (SchemaAST2.isNumberKeyword(type.ast)) {
426
- params[key] = parseInt(value);
427
- } else if (SchemaAST2.isBooleanKeyword(type.ast)) {
428
- params[key] = value === "true" || value === "1";
429
- } else {
430
- params[key] = value;
431
- }
432
- }
433
- return params;
434
- }, {});
435
- }
436
- /**
437
- * Return URL with encoded params.
438
- */
439
- create(_url, params) {
440
- const url = new URL(_url);
441
- Object.entries(params).forEach(([key, value]) => {
442
- if (value !== void 0) {
443
- const field = this._schema.fields[key];
444
- if (field) {
445
- const { key: serializedKey } = Function2.pipe(getParamKeyAnnotation(field.ast), Option3.getOrElse(() => ({
446
- key: decamelize(key)
447
- })));
448
- url.searchParams.set(serializedKey, String(value));
449
- }
450
- }
451
- });
452
- return url;
453
- }
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);
454
311
  };
455
312
 
456
313
  // src/context.ts
457
314
  import * as Effect from "effect/Effect";
458
315
  import { Context } from "@dxos/context";
459
- var __dxlog_file3 = "/__w/dxos/dxos/packages/common/effect/src/context.ts";
460
316
  var contextFromScope = () => Effect.gen(function* () {
461
- const ctx = new Context(void 0, {
462
- F: __dxlog_file3,
463
- L: 13
464
- });
317
+ const ctx = new Context();
465
318
  yield* Effect.addFinalizer(() => Effect.promise(() => ctx.dispose()));
466
319
  return ctx;
467
320
  });
468
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
+
469
333
  // src/errors.ts
470
334
  import * as Cause from "effect/Cause";
471
335
  import * as Chunk from "effect/Chunk";
472
336
  import * as Effect2 from "effect/Effect";
473
337
  import * as Exit from "effect/Exit";
474
338
  import * as GlobalValue from "effect/GlobalValue";
475
- import * as Option4 from "effect/Option";
476
- var spanSymbol = Symbol.for("effect/SpanAnnotation");
477
- var originalSymbol = Symbol.for("effect/OriginalAnnotation");
339
+ import * as Option2 from "effect/Option";
340
+ import * as Runtime from "effect/Runtime";
341
+ var spanSymbol = /* @__PURE__ */ Symbol.for("effect/SpanAnnotation");
478
342
  var spanToTrace = GlobalValue.globalValue("effect/Tracer/spanToTrace", () => /* @__PURE__ */ new WeakMap());
479
343
  var locationRegex = /\((.*)\)/g;
480
344
  var prettyErrorStack = (error, appendStacks = []) => {
345
+ if (typeof error !== "object" || error === null) {
346
+ return error;
347
+ }
481
348
  const span = error[spanSymbol];
482
349
  const lines = typeof error.stack === "string" ? error.stack.split("\n") : [];
483
350
  const out = [];
484
- let atStack = false;
351
+ let atStack = false, inCore = false, passedScheduler = false;
485
352
  for (let i = 0; i < lines.length; i++) {
486
353
  if (!atStack && !lines[i].startsWith(" at ")) {
487
354
  out.push(lines[i]);
@@ -498,6 +365,26 @@ var prettyErrorStack = (error, appendStacks = []) => {
498
365
  if (lines[i].includes("effect_internal_function")) {
499
366
  break;
500
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
+ }
501
388
  out.push(lines[i].replace(/at .*effect_instruction_i.*\((.*)\)/, "at $1").replace(/EffectPrimitive\.\w+/, "<anonymous>").replace(/at Arguments\./, "at "));
502
389
  }
503
390
  if (span) {
@@ -523,14 +410,12 @@ var prettyErrorStack = (error, appendStacks = []) => {
523
410
  } else {
524
411
  out.push(` at ${current.name}`);
525
412
  }
526
- current = Option4.getOrUndefined(current.parent);
413
+ current = Option2.getOrUndefined(current.parent);
527
414
  i++;
528
415
  }
529
416
  }
530
417
  out.push(...appendStacks);
531
- if (error[originalSymbol]) {
532
- error = error[originalSymbol];
533
- }
418
+ error = Cause.originalError(error);
534
419
  if (error.cause) {
535
420
  error.cause = prettyErrorStack(error.cause);
536
421
  }
@@ -553,8 +438,8 @@ var causeToError = (cause) => {
553
438
  ...Chunk.toArray(Cause.defects(cause))
554
439
  ];
555
440
  const getStackFrames = () => {
556
- const o = {};
557
- Error.captureStackTrace(o, getStackFrames);
441
+ const o = new Error();
442
+ Error.captureStackTrace(o, causeToError);
558
443
  return o.stack.split("\n").slice(1);
559
444
  };
560
445
  const stackFrames = getStackFrames();
@@ -569,15 +454,30 @@ var causeToError = (cause) => {
569
454
  var throwCause = (cause) => {
570
455
  throw causeToError(cause);
571
456
  };
572
- var unwrapExit = (exit) => {
573
- if (Exit.isSuccess(exit)) {
574
- return exit.value;
457
+ var unwrapExit = (exit2) => {
458
+ if (Exit.isSuccess(exit2)) {
459
+ return exit2.value;
575
460
  }
576
- return throwCause(exit.cause);
461
+ return throwCause(exit2.cause);
577
462
  };
578
463
  var runAndForwardErrors = async (effect, options) => {
579
- const exit = await Effect2.runPromiseExit(effect, options);
580
- return unwrapExit(exit);
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
+ }
581
481
  };
582
482
  var promiseWithCauseCapture = (evaluate) => Effect2.promise(async (signal) => {
583
483
  try {
@@ -588,82 +488,338 @@ var promiseWithCauseCapture = (evaluate) => Effect2.promise(async (signal) => {
588
488
  }
589
489
  }).pipe(Effect2.flatten);
590
490
 
591
- // src/testing.ts
592
- import * as Context2 from "effect/Context";
593
- import * as Effect3 from "effect/Effect";
594
- (function(TestHelpers2) {
595
- TestHelpers2.runIf = (condition) => (effect, ctx) => Effect3.gen(function* () {
596
- if (!condition) {
597
- ctx.skip();
598
- } else {
599
- 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);
600
498
  }
601
- });
602
- TestHelpers2.skipIf = (condition) => (effect, ctx) => Effect3.gen(function* () {
603
- if (condition) {
604
- ctx.skip();
605
- } else {
606
- return yield* effect;
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
+ }));
607
515
  }
608
- });
609
- TestHelpers2.taggedTest = (tag) => (effect, ctx) => Effect3.gen(function* () {
610
- if (!process.env.DX_TEST_TAGS?.includes(tag)) {
611
- ctx.skip();
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}]`;
612
601
  } else {
613
- return yield* effect;
602
+ return i === 0 ? p : `.${p}`;
614
603
  }
615
- });
616
- TestHelpers2.provideTestContext = (effect, ctx) => Effect3.provideService(effect, TestContextService, ctx);
617
- })(TestHelpers || (TestHelpers = {}));
618
- var TestContextService = class extends Context2.Tag("@dxos/effect/TestContextService")() {
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);
619
633
  };
620
- var TestHelpers;
621
634
 
622
635
  // src/resource.ts
623
636
  import * as Effect4 from "effect/Effect";
624
637
  var acquireReleaseResource = (getResource) => Effect4.acquireRelease(Effect4.gen(function* () {
625
638
  const resource = getResource();
626
639
  yield* Effect4.promise(async () => {
627
- resource.open?.();
640
+ await resource.open?.();
628
641
  return void 0;
629
642
  });
630
643
  return resource;
631
644
  }), (resource) => Effect4.promise(async () => {
632
- resource.close?.();
645
+ await resource.close?.();
633
646
  return void 0;
634
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
+ };
635
782
  export {
783
+ dynamic_runtime_exports as DynamicRuntime,
636
784
  JsonPath,
637
785
  JsonProp,
638
786
  ParamKeyAnnotation,
639
- SimpleType,
640
- TestContextService,
641
- TestHelpers,
787
+ Performance_exports as Performance,
788
+ RuntimeProvider_exports as RuntimeProvider,
642
789
  UrlParser,
643
790
  VisitResult,
644
791
  acquireReleaseResource,
792
+ asyncTaskTaggingLayer,
645
793
  causeToError,
646
794
  contextFromScope,
647
795
  createJsonPath,
796
+ createKvsStore,
648
797
  findAnnotation,
649
798
  findNode,
650
799
  findProperty,
651
800
  fromEffectValidationPath,
652
801
  getAnnotation2 as getAnnotation,
802
+ getArrayElementType,
803
+ getBaseType,
653
804
  getDiscriminatedType,
654
805
  getDiscriminatingProps,
655
806
  getField,
807
+ getLiteralValues,
656
808
  getParamKeyAnnotation,
657
- getSimpleType,
809
+ getProperties,
810
+ getValue,
658
811
  isArrayType,
659
812
  isDiscriminatedUnion,
660
813
  isJsonPath,
661
814
  isLiteralUnion,
815
+ isNestedType,
662
816
  isOption,
663
- isSimpleType,
817
+ isTupleType2 as isTupleType,
664
818
  mapAst,
665
819
  promiseWithCauseCapture,
666
820
  runAndForwardErrors,
821
+ runInRuntime,
822
+ setValue,
667
823
  splitJsonPath,
668
824
  throwCause,
669
825
  unwrapExit,