@dxos/effect 0.8.4-main.5ea62a8 → 0.8.4-main.60689f5b1c

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