@dxos/effect 0.7.5-labs.e27f9b9 → 0.7.5-main.2567c87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/index.mjs +15 -66
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +16 -69
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +15 -66
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/ast.d.ts +13 -2
- package/dist/types/src/ast.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +0 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/ast.test.ts +24 -1
- package/src/ast.ts +17 -13
- package/src/index.ts +0 -1
- package/dist/types/src/jsonPath.d.ts +0 -45
- package/dist/types/src/jsonPath.d.ts.map +0 -1
- package/dist/types/src/jsonPath.test.d.ts +0 -2
- package/dist/types/src/jsonPath.test.d.ts.map +0 -1
- package/src/jsonPath.test.ts +0 -96
- package/src/jsonPath.ts +0 -85
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "@dxos/node-std/globals";
|
|
2
2
|
|
|
3
3
|
// packages/common/effect/src/index.ts
|
|
4
|
-
import { AST as AST3, JSONSchema, Schema as
|
|
4
|
+
import { AST as AST3, JSONSchema, Schema as S2 } from "@effect/schema";
|
|
5
5
|
|
|
6
6
|
// packages/common/effect/src/ast.ts
|
|
7
7
|
import { AST, Schema as S } from "@effect/schema";
|
|
@@ -52,6 +52,10 @@ var SimpleType;
|
|
|
52
52
|
}
|
|
53
53
|
};
|
|
54
54
|
})(SimpleType || (SimpleType = {}));
|
|
55
|
+
var PATH_REGEX = /^[a-zA-Z_$][\w$]*(?:\.[a-zA-Z_$][\w$]*|\[\d+\])*$/;
|
|
56
|
+
var PROP_REGEX = /\w+/;
|
|
57
|
+
var JsonPath = S.NonEmptyString.pipe(S.pattern(PATH_REGEX));
|
|
58
|
+
var JsonProp = S.NonEmptyString.pipe(S.pattern(PROP_REGEX));
|
|
55
59
|
var VisitResult;
|
|
56
60
|
(function(VisitResult2) {
|
|
57
61
|
VisitResult2[VisitResult2["CONTINUE"] = 0] = "CONTINUE";
|
|
@@ -147,7 +151,7 @@ var findProperty = (schema, path) => {
|
|
|
147
151
|
const typeNode = findNode(node, AST.isTypeLiteral);
|
|
148
152
|
invariant(typeNode, void 0, {
|
|
149
153
|
F: __dxlog_file,
|
|
150
|
-
L:
|
|
154
|
+
L: 249,
|
|
151
155
|
S: void 0,
|
|
152
156
|
A: [
|
|
153
157
|
"typeNode",
|
|
@@ -207,7 +211,7 @@ var isDiscriminatedUnion = (node) => {
|
|
|
207
211
|
var getDiscriminatingProps = (node) => {
|
|
208
212
|
invariant(AST.isUnion(node), void 0, {
|
|
209
213
|
F: __dxlog_file,
|
|
210
|
-
L:
|
|
214
|
+
L: 346,
|
|
211
215
|
S: void 0,
|
|
212
216
|
A: [
|
|
213
217
|
"AST.isUnion(node)",
|
|
@@ -225,7 +229,7 @@ var getDiscriminatingProps = (node) => {
|
|
|
225
229
|
var getDiscriminatedType = (node, value = {}) => {
|
|
226
230
|
invariant(AST.isUnion(node), void 0, {
|
|
227
231
|
F: __dxlog_file,
|
|
228
|
-
L:
|
|
232
|
+
L: 367,
|
|
229
233
|
S: void 0,
|
|
230
234
|
A: [
|
|
231
235
|
"AST.isUnion(node)",
|
|
@@ -234,7 +238,7 @@ var getDiscriminatedType = (node, value = {}) => {
|
|
|
234
238
|
});
|
|
235
239
|
invariant(value, void 0, {
|
|
236
240
|
F: __dxlog_file,
|
|
237
|
-
L:
|
|
241
|
+
L: 368,
|
|
238
242
|
S: void 0,
|
|
239
243
|
A: [
|
|
240
244
|
"value",
|
|
@@ -249,7 +253,7 @@ var getDiscriminatedType = (node, value = {}) => {
|
|
|
249
253
|
const match = AST.getPropertySignatures(type).filter((prop) => props?.includes(prop.name.toString())).every((prop) => {
|
|
250
254
|
invariant(AST.isLiteral(prop.type), void 0, {
|
|
251
255
|
F: __dxlog_file,
|
|
252
|
-
L:
|
|
256
|
+
L: 379,
|
|
253
257
|
S: void 0,
|
|
254
258
|
A: [
|
|
255
259
|
"AST.isLiteral(prop.type)",
|
|
@@ -267,7 +271,7 @@ var getDiscriminatedType = (node, value = {}) => {
|
|
|
267
271
|
const literal = AST.getPropertySignatures(type).find((p) => p.name.toString() === prop);
|
|
268
272
|
invariant(AST.isLiteral(literal.type), void 0, {
|
|
269
273
|
F: __dxlog_file,
|
|
270
|
-
L:
|
|
274
|
+
L: 397,
|
|
271
275
|
S: void 0,
|
|
272
276
|
A: [
|
|
273
277
|
"AST.isLiteral(literal.type)",
|
|
@@ -287,13 +291,13 @@ var getDiscriminatedType = (node, value = {}) => {
|
|
|
287
291
|
var mapAst = (ast, f) => {
|
|
288
292
|
switch (ast._tag) {
|
|
289
293
|
case "TypeLiteral":
|
|
290
|
-
return new AST.TypeLiteral(ast.propertySignatures.map((prop) => new AST.PropertySignature(prop.name, f(prop.type
|
|
294
|
+
return new AST.TypeLiteral(ast.propertySignatures.map((prop) => new AST.PropertySignature(prop.name, f(prop.type), prop.isOptional, prop.isReadonly, prop.annotations)), ast.indexSignatures);
|
|
291
295
|
case "Union":
|
|
292
296
|
return AST.Union.make(ast.types.map(f), ast.annotations);
|
|
293
297
|
case "TupleType":
|
|
294
|
-
return new AST.TupleType(ast.elements.map((t
|
|
298
|
+
return new AST.TupleType(ast.elements.map((t) => new AST.OptionalType(f(t.type), t.isOptional, t.annotations)), ast.rest.map((t) => new AST.Type(f(t.type), t.annotations)), ast.isReadonly, ast.annotations);
|
|
295
299
|
case "Suspend": {
|
|
296
|
-
const newAst = f(ast.f()
|
|
300
|
+
const newAst = f(ast.f());
|
|
297
301
|
return new AST.Suspend(() => newAst, ast.annotations);
|
|
298
302
|
}
|
|
299
303
|
default:
|
|
@@ -301,57 +305,6 @@ var mapAst = (ast, f) => {
|
|
|
301
305
|
}
|
|
302
306
|
};
|
|
303
307
|
|
|
304
|
-
// packages/common/effect/src/jsonPath.ts
|
|
305
|
-
import { Schema as S2 } from "@effect/schema";
|
|
306
|
-
import { isSome } from "effect/Option";
|
|
307
|
-
import { invariant as invariant2 } from "@dxos/invariant";
|
|
308
|
-
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/common/effect/src/jsonPath.ts";
|
|
309
|
-
var PATH_REGEX = /^($|[a-zA-Z_$][\w$]*(?:\.[a-zA-Z_$][\w$]*|\[\d+\](?:\.)?)*$)/;
|
|
310
|
-
var PROP_REGEX = /\w+/;
|
|
311
|
-
var JsonPath = S2.String.pipe(S2.pattern(PATH_REGEX));
|
|
312
|
-
var JsonProp = S2.NonEmptyString.pipe(S2.pattern(PROP_REGEX));
|
|
313
|
-
var isJsonPath = (value) => {
|
|
314
|
-
return isSome(S2.validateOption(JsonPath)(value));
|
|
315
|
-
};
|
|
316
|
-
var createJsonPath = (path) => {
|
|
317
|
-
const candidatePath = path.map((p, i) => {
|
|
318
|
-
if (typeof p === "number") {
|
|
319
|
-
return `[${p}]`;
|
|
320
|
-
} else {
|
|
321
|
-
return i === 0 ? p : `.${p}`;
|
|
322
|
-
}
|
|
323
|
-
}).join("");
|
|
324
|
-
invariant2(isJsonPath(candidatePath), `Invalid JsonPath: ${candidatePath}`, {
|
|
325
|
-
F: __dxlog_file2,
|
|
326
|
-
L: 56,
|
|
327
|
-
S: void 0,
|
|
328
|
-
A: [
|
|
329
|
-
"isJsonPath(candidatePath)",
|
|
330
|
-
"`Invalid JsonPath: ${candidatePath}`"
|
|
331
|
-
]
|
|
332
|
-
});
|
|
333
|
-
return candidatePath;
|
|
334
|
-
};
|
|
335
|
-
var fromEffectValidationPath = (effectPath) => {
|
|
336
|
-
const jsonPath = effectPath.replace(/\.\[(\d+)\]/g, "[$1]");
|
|
337
|
-
invariant2(isJsonPath(jsonPath), `Invalid JsonPath: ${jsonPath}`, {
|
|
338
|
-
F: __dxlog_file2,
|
|
339
|
-
L: 67,
|
|
340
|
-
S: void 0,
|
|
341
|
-
A: [
|
|
342
|
-
"isJsonPath(jsonPath)",
|
|
343
|
-
"`Invalid JsonPath: ${jsonPath}`"
|
|
344
|
-
]
|
|
345
|
-
});
|
|
346
|
-
return jsonPath;
|
|
347
|
-
};
|
|
348
|
-
var splitJsonPath = (path) => {
|
|
349
|
-
if (!isJsonPath(path)) {
|
|
350
|
-
return [];
|
|
351
|
-
}
|
|
352
|
-
return path.match(/[a-zA-Z_$][\w$]*|\[\d+\]/g)?.map((part) => part.startsWith("[") ? part.replace(/[[\]]/g, "") : part) ?? [];
|
|
353
|
-
};
|
|
354
|
-
|
|
355
308
|
// packages/common/effect/src/url.ts
|
|
356
309
|
import { AST as AST2 } from "@effect/schema";
|
|
357
310
|
import { Option as Option2, pipe as pipe2 } from "effect";
|
|
@@ -412,27 +365,23 @@ export {
|
|
|
412
365
|
JsonPath,
|
|
413
366
|
JsonProp,
|
|
414
367
|
ParamKeyAnnotation,
|
|
415
|
-
|
|
368
|
+
S2 as S,
|
|
416
369
|
SimpleType,
|
|
417
370
|
UrlParser,
|
|
418
371
|
VisitResult,
|
|
419
|
-
createJsonPath,
|
|
420
372
|
findAnnotation,
|
|
421
373
|
findNode,
|
|
422
374
|
findProperty,
|
|
423
|
-
fromEffectValidationPath,
|
|
424
375
|
getAnnotation,
|
|
425
376
|
getDiscriminatedType,
|
|
426
377
|
getDiscriminatingProps,
|
|
427
378
|
getParamKeyAnnotation,
|
|
428
379
|
getSimpleType,
|
|
429
380
|
isDiscriminatedUnion,
|
|
430
|
-
isJsonPath,
|
|
431
381
|
isLiteralUnion,
|
|
432
382
|
isOption,
|
|
433
383
|
isSimpleType,
|
|
434
384
|
mapAst,
|
|
435
|
-
splitJsonPath,
|
|
436
385
|
visit
|
|
437
386
|
};
|
|
438
387
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/index.ts", "../../../src/ast.ts", "../../../src/
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2020 DXOS.org\n//\n\nimport { AST, JSONSchema, Schema as S } from '@effect/schema';\nimport type * as Types from 'effect/Types';\n\n// TODO(dmaretskyi): Remove re-exports.\nexport { AST, JSONSchema, S, Types };\n\nexport * from './ast';\nexport * from './jsonPath';\nexport * from './url';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AST, Schema as S } from '@effect/schema';\nimport { Option, pipe } from 'effect';\n\nimport { invariant } from '@dxos/invariant';\nimport { nonNullable } from '@dxos/util';\n\nimport { type JsonPath, type JsonProp } from './jsonPath';\n\n//\n// Refs\n// https://effect.website/docs/schema/introduction\n// https://www.npmjs.com/package/@effect/schema\n// https://effect-ts.github.io/effect/schema/AST.ts.html\n//\n\nexport type SimpleType = 'object' | 'string' | 'number' | 'boolean' | 'enum' | 'literal';\n\n/**\n * Get the base type; e.g., traverse through refinements.\n */\nexport const getSimpleType = (node: AST.AST): SimpleType | undefined => {\n if (AST.isObjectKeyword(node) || AST.isTypeLiteral(node) || isDiscriminatedUnion(node) || AST.isDeclaration(node)) {\n return 'object';\n }\n\n if (AST.isStringKeyword(node)) {\n return 'string';\n }\n if (AST.isNumberKeyword(node)) {\n return 'number';\n }\n if (AST.isBooleanKeyword(node)) {\n return 'boolean';\n }\n\n if (AST.isEnums(node)) {\n return 'enum';\n }\n\n if (AST.isLiteral(node)) {\n return 'literal';\n }\n};\n\nexport const isSimpleType = (node: AST.AST): boolean => !!getSimpleType(node);\n\nexport namespace SimpleType {\n /**\n * Returns the default empty value for a given SimpleType.\n * Used for initializing new array values etc.\n */\n export const getDefaultValue = (type: SimpleType): any => {\n switch (type) {\n case 'string': {\n return '';\n }\n case 'number': {\n return 0;\n }\n case 'boolean': {\n return false;\n }\n case 'object': {\n return {};\n }\n default: {\n throw new Error(`Unsupported type for default value: ${type}`);\n }\n }\n };\n}\n\n//\n// Branded types\n//\n\nexport enum VisitResult {\n CONTINUE = 0,\n /**\n * Skip visiting children.\n */\n SKIP = 1,\n /**\n * Stop traversing immediately.\n */\n EXIT = 2,\n}\n\nexport type Path = (string | number)[];\n\nexport type TestFn = (node: AST.AST, path: Path, depth: number) => VisitResult | boolean | undefined;\n\nexport type VisitorFn = (node: AST.AST, path: Path, depth: number) => void;\n\nconst defaultTest: TestFn = isSimpleType;\n\n/**\n * Visit leaf nodes.\n * Refs:\n * - https://github.com/syntax-tree/unist-util-visit?tab=readme-ov-file#visitor\n * - https://github.com/syntax-tree/unist-util-is?tab=readme-ov-file#test\n */\nexport const visit: {\n (node: AST.AST, visitor: VisitorFn): void;\n (node: AST.AST, test: TestFn, visitor: VisitorFn): void;\n} = (node: AST.AST, testOrVisitor: TestFn | VisitorFn, visitor?: VisitorFn): void => {\n if (!visitor) {\n visitNode(node, defaultTest, testOrVisitor);\n } else {\n visitNode(node, testOrVisitor as TestFn, visitor);\n }\n};\n\nconst visitNode = (\n node: AST.AST,\n test: TestFn | undefined,\n visitor: VisitorFn,\n path: Path = [],\n depth = 0,\n): VisitResult | undefined => {\n const _result = test?.(node, path, depth);\n const result: VisitResult =\n _result === undefined\n ? VisitResult.CONTINUE\n : typeof _result === 'boolean'\n ? _result\n ? VisitResult.CONTINUE\n : VisitResult.SKIP\n : _result;\n\n if (result === VisitResult.EXIT) {\n return result;\n }\n if (result !== VisitResult.SKIP) {\n visitor(node, path, depth);\n }\n\n // Object.\n if (AST.isTypeLiteral(node)) {\n for (const prop of AST.getPropertySignatures(node)) {\n const currentPath = [...path, prop.name.toString()];\n const result = visitNode(prop.type, test, visitor, currentPath, depth + 1);\n if (result === VisitResult.EXIT) {\n return result;\n }\n }\n }\n\n // Array.\n else if (AST.isTupleType(node)) {\n for (const [i, element] of node.elements.entries()) {\n const currentPath = [...path, i];\n const result = visitNode(element.type, test, visitor, currentPath, depth);\n if (result === VisitResult.EXIT) {\n return result;\n }\n }\n }\n\n // Branching union (e.g., optional, discriminated unions).\n else if (AST.isUnion(node)) {\n for (const type of node.types) {\n const result = visitNode(type, test, visitor, path, depth);\n if (result === VisitResult.EXIT) {\n return result;\n }\n }\n }\n\n // Refinement.\n else if (AST.isRefinement(node)) {\n const result = visitNode(node.from, test, visitor, path, depth);\n if (result === VisitResult.EXIT) {\n return result;\n }\n }\n\n // TODO(burdon): Transforms?\n};\n\n/**\n * Recursively descend into AST to find first node that passes the test.\n */\n// TODO(burdon): Rewrite using visitNode?\nexport const findNode = (node: AST.AST, test: (node: AST.AST) => boolean): AST.AST | undefined => {\n if (test(node)) {\n return node;\n }\n\n // Object.\n else if (AST.isTypeLiteral(node)) {\n for (const prop of AST.getPropertySignatures(node)) {\n const child = findNode(prop.type, test);\n if (child) {\n return child;\n }\n }\n }\n\n // Tuple.\n else if (AST.isTupleType(node)) {\n for (const [_, element] of node.elements.entries()) {\n const child = findNode(element.type, test);\n if (child) {\n return child;\n }\n }\n }\n\n // Branching union (e.g., optional, discriminated unions).\n else if (AST.isUnion(node)) {\n if (isOption(node)) {\n for (const type of node.types) {\n const child = findNode(type, test);\n if (child) {\n return child;\n }\n }\n }\n }\n\n // Refinement.\n else if (AST.isRefinement(node)) {\n return findNode(node.from, test);\n }\n};\n\n/**\n * Get the AST node for the given property (dot-path).\n */\nexport const findProperty = (schema: S.Schema<any>, path: JsonPath | JsonProp): AST.AST | undefined => {\n const getProp = (node: AST.AST, path: JsonProp[]): AST.AST | undefined => {\n const [name, ...rest] = path;\n const typeNode = findNode(node, AST.isTypeLiteral);\n invariant(typeNode);\n for (const prop of AST.getPropertySignatures(typeNode)) {\n if (prop.name === name) {\n if (rest.length) {\n return getProp(prop.type, rest);\n } else {\n return prop.type;\n }\n }\n }\n };\n\n return getProp(schema.ast, path.split('.') as JsonProp[]);\n};\n\n//\n// Annotations\n//\n\nconst defaultAnnotations: Record<string, AST.Annotated> = {\n ['ObjectKeyword' as const]: AST.objectKeyword,\n ['StringKeyword' as const]: AST.stringKeyword,\n ['NumberKeyword' as const]: AST.numberKeyword,\n ['BooleanKeyword' as const]: AST.booleanKeyword,\n};\n\n/**\n * Get annotation or return undefined.\n * @param annotationId\n * @param noDefault If true, then return undefined for effect library defined values.\n */\nexport const getAnnotation =\n <T>(annotationId: symbol, noDefault = true) =>\n (node: AST.AST): T | undefined => {\n // Title fallback seems to be the identifier.\n const id = pipe(AST.getIdentifierAnnotation(node), Option.getOrUndefined);\n const value = pipe(AST.getAnnotation<T>(annotationId)(node), Option.getOrUndefined);\n if (noDefault && (value === defaultAnnotations[node._tag]?.annotations[annotationId] || value === id)) {\n return undefined;\n }\n\n return value;\n };\n\n/**\n * Recursively descend into AST to find first matching annotations.\n * Optionally skips default annotations for basic types (e.g., 'a string').\n */\n// TODO(burdon): Convert to effect pattern (i.e., return operator like getAnnotation).\nexport const findAnnotation = <T>(node: AST.AST, annotationId: symbol, noDefault = true): T | undefined => {\n const getAnnotationById = getAnnotation(annotationId, noDefault);\n\n const getBaseAnnotation = (node: AST.AST): T | undefined => {\n const value = getAnnotationById(node);\n if (value !== undefined) {\n return value as T;\n }\n\n if (AST.isUnion(node)) {\n if (isOption(node)) {\n return getAnnotationById(node.types[0]) as T;\n }\n }\n };\n\n return getBaseAnnotation(node);\n};\n\n//\n// Unions\n//\n\n/**\n * Effect S.optional creates a union type with undefined as the second type.\n */\nexport const isOption = (node: AST.AST): boolean => {\n return AST.isUnion(node) && node.types.length === 2 && AST.isUndefinedKeyword(node.types[1]);\n};\n\n/**\n * Determines if the node is a union of literal types.\n */\nexport const isLiteralUnion = (node: AST.AST): boolean => {\n return AST.isUnion(node) && node.types.every(AST.isLiteral);\n};\n\n/**\n * Determines if the node is a discriminated union.\n */\nexport const isDiscriminatedUnion = (node: AST.AST): boolean => {\n return AST.isUnion(node) && !!getDiscriminatingProps(node)?.length;\n};\n\n/**\n * Get the discriminating properties for the given union type.\n */\nexport const getDiscriminatingProps = (node: AST.AST): string[] | undefined => {\n invariant(AST.isUnion(node));\n if (isOption(node)) {\n return;\n }\n\n // Get common literals across all types.\n return node.types.reduce<string[]>((shared, type) => {\n const props = AST.getPropertySignatures(type)\n // TODO(burdon): Should check each literal is unique.\n .filter((p) => AST.isLiteral(p.type))\n .map((p) => p.name.toString());\n\n // Return common literals.\n return shared.length === 0 ? props : shared.filter((prop) => props.includes(prop));\n }, []);\n};\n\n/**\n * Get the discriminated type for the given value.\n */\nexport const getDiscriminatedType = (node: AST.AST, value: Record<string, any> = {}): AST.AST | undefined => {\n invariant(AST.isUnion(node));\n invariant(value);\n const props = getDiscriminatingProps(node);\n if (!props?.length) {\n return;\n }\n\n // Match provided values.\n for (const type of node.types) {\n const match = AST.getPropertySignatures(type)\n .filter((prop) => props?.includes(prop.name.toString()))\n .every((prop) => {\n invariant(AST.isLiteral(prop.type));\n return prop.type.literal === value[prop.name.toString()];\n });\n\n if (match) {\n return type;\n }\n }\n\n // Create union of discriminating properties.\n // NOTE: This may not work with non-overlapping variants.\n // TODO(burdon): Iterate through props and knock-out variants that don't match.\n const fields = Object.fromEntries(\n props\n .map((prop) => {\n const literals = node.types\n .map((type) => {\n const literal = AST.getPropertySignatures(type).find((p) => p.name.toString() === prop)!;\n invariant(AST.isLiteral(literal.type));\n return literal.type.literal;\n })\n .filter(nonNullable);\n\n return literals.length ? [prop, S.Literal(...literals)] : undefined;\n })\n .filter(nonNullable),\n );\n\n const schema = S.Struct(fields);\n return schema.ast;\n};\n\n/**\n * Maps AST nodes.\n * The user is responsible for recursively calling {@link mapAst} on the AST.\n * NOTE: Will evaluate suspended ASTs.\n */\nexport const mapAst = (ast: AST.AST, f: (ast: AST.AST, key: keyof any | undefined) => AST.AST): AST.AST => {\n switch (ast._tag) {\n case 'TypeLiteral':\n return new AST.TypeLiteral(\n ast.propertySignatures.map(\n (prop) =>\n new AST.PropertySignature(\n prop.name,\n f(prop.type, prop.name),\n prop.isOptional,\n prop.isReadonly,\n prop.annotations,\n ),\n ),\n ast.indexSignatures,\n );\n case 'Union':\n return AST.Union.make(ast.types.map(f), ast.annotations);\n case 'TupleType':\n return new AST.TupleType(\n ast.elements.map((t, index) => new AST.OptionalType(f(t.type, index), t.isOptional, t.annotations)),\n ast.rest.map((t) => new AST.Type(f(t.type, undefined), t.annotations)),\n ast.isReadonly,\n ast.annotations,\n );\n case 'Suspend': {\n const newAst = f(ast.f(), undefined);\n return new AST.Suspend(() => newAst, ast.annotations);\n }\n default:\n // TODO(dmaretskyi): Support more nodes.\n return ast;\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Schema as S } from '@effect/schema';\nimport { isSome } from 'effect/Option';\n\nimport { invariant } from '@dxos/invariant';\n\nexport type JsonProp = string & { __JsonPath: true; __JsonProp: true };\nexport type JsonPath = string & { __JsonPath: true };\n\nconst PATH_REGEX = /^($|[a-zA-Z_$][\\w$]*(?:\\.[a-zA-Z_$][\\w$]*|\\[\\d+\\](?:\\.)?)*$)/;\nconst PROP_REGEX = /\\w+/;\n\n/**\n * https://www.ietf.org/archive/id/draft-goessner-dispatch-jsonpath-00.html\n */\nexport const JsonPath = S.String.pipe(S.pattern(PATH_REGEX)) as any as S.Schema<JsonPath>;\nexport const JsonProp = S.NonEmptyString.pipe(S.pattern(PROP_REGEX)) as any as S.Schema<JsonProp>;\n\nexport const isJsonPath = (value: unknown): value is JsonPath => {\n return isSome(S.validateOption(JsonPath)(value));\n};\n\n/**\n * Creates a JsonPath from an array of path segments.\n *\n * Currently supports:\n * - Simple property access (e.g., 'foo.bar')\n * - Array indexing with non-negative integers (e.g., 'foo[0]')\n * - Identifiers starting with letters, underscore, or $ (e.g., '$foo', '_bar')\n * - Dot notation for nested properties (e.g., 'foo.bar.baz')\n *\n * Does not support (yet?).\n * - Recursive descent (..)\n * - Wildcards (*)\n * - Array slicing\n * - Filters\n * - Negative indices\n *\n * @param path Array of string or number segments\n * @returns Valid JsonPath or undefined if invalid\n */\nexport const createJsonPath = (path: (string | number)[]): JsonPath => {\n const candidatePath = path\n .map((p, i) => {\n if (typeof p === 'number') {\n return `[${p}]`;\n } else {\n return i === 0 ? p : `.${p}`;\n }\n })\n .join('');\n\n invariant(isJsonPath(candidatePath), `Invalid JsonPath: ${candidatePath}`);\n return candidatePath;\n};\n\n/**\n * Converts Effect validation path format (e.g. \"addresses.[0].zip\")\n * to JsonPath format (e.g. \"addresses[0].zip\")\n */\nexport const fromEffectValidationPath = (effectPath: string): JsonPath => {\n // Handle array notation: convert \"prop.[0]\" to \"prop[0]\"\n const jsonPath = effectPath.replace(/\\.\\[(\\d+)\\]/g, '[$1]');\n invariant(isJsonPath(jsonPath), `Invalid JsonPath: ${jsonPath}`);\n return jsonPath;\n};\n\n/**\n * Splits a JsonPath into its constituent parts.\n * Handles property access and array indexing.\n */\nexport const splitJsonPath = (path: JsonPath): string[] => {\n if (!isJsonPath(path)) {\n return [];\n }\n\n return (\n path\n .match(/[a-zA-Z_$][\\w$]*|\\[\\d+\\]/g)\n ?.map((part) => (part.startsWith('[') ? part.replace(/[[\\]]/g, '') : part)) ?? []\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AST, type Schema as S } from '@effect/schema';\nimport { Option, pipe } from 'effect';\n\nimport { decamelize } from '@dxos/util';\n\nconst ParamKeyAnnotationId = Symbol.for('@dxos/schema/annotation/ParamKey');\n\ntype ParamKeyAnnotationValue = { key: string };\n\nexport const getParamKeyAnnotation: (annotated: AST.Annotated) => Option.Option<ParamKeyAnnotationValue> =\n AST.getAnnotation<ParamKeyAnnotationValue>(ParamKeyAnnotationId);\n\nexport const ParamKeyAnnotation =\n (value: ParamKeyAnnotationValue) =>\n <S extends S.Annotable.All>(self: S): S.Annotable.Self<S> =>\n self.annotations({ [ParamKeyAnnotationId]: value });\n\n/**\n * HTTP params parser.\n * Supports custom key serialization.\n */\nexport class UrlParser<T extends Record<string, any>> {\n constructor(private readonly _schema: S.Struct<T>) {}\n\n /**\n * Parse URL params.\n */\n parse(_url: string): T {\n const url = new URL(_url);\n return Object.entries(this._schema.fields).reduce<Record<string, any>>((params, [key, type]) => {\n let value = url.searchParams.get(decamelize(key));\n if (value == null) {\n value = url.searchParams.get(key);\n }\n\n if (value != null) {\n if (AST.isNumberKeyword(type.ast)) {\n params[key] = parseInt(value);\n } else if (AST.isBooleanKeyword(type.ast)) {\n params[key] = value === 'true' || value === '1';\n } else {\n params[key] = value;\n }\n }\n\n return params;\n }, {}) as T;\n }\n\n /**\n * Return URL with encoded params.\n */\n create(_url: string, params: T): URL {\n const url = new URL(_url);\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n const field = this._schema.fields[key];\n if (field) {\n const { key: serializedKey } = pipe(\n getParamKeyAnnotation(field.ast),\n Option.getOrElse(() => ({\n key: decamelize(key),\n })),\n );\n\n url.searchParams.set(serializedKey, String(value));\n }\n }\n });\n\n return url;\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;AAIA,SAASA,OAAAA,MAAKC,YAAYC,UAAUC,UAAS;;;ACA7C,SAASC,KAAKC,UAAUC,SAAS;AACjC,SAASC,QAAQC,YAAY;AAE7B,SAASC,iBAAiB;AAC1B,SAASC,mBAAmB;;
|
|
6
|
-
"names": ["AST", "JSONSchema", "Schema", "S", "AST", "Schema", "S", "Option", "pipe", "invariant", "nonNullable", "getSimpleType", "node", "isObjectKeyword", "isTypeLiteral", "isDiscriminatedUnion", "isDeclaration", "isStringKeyword", "isNumberKeyword", "isBooleanKeyword", "isEnums", "isLiteral", "isSimpleType", "SimpleType", "getDefaultValue", "type", "Error", "VisitResult", "defaultTest", "visit", "testOrVisitor", "visitor", "visitNode", "test", "path", "depth", "_result", "result", "undefined", "prop", "getPropertySignatures", "currentPath", "name", "toString", "isTupleType", "i", "element", "elements", "entries", "isUnion", "types", "isRefinement", "from", "findNode", "child", "_", "isOption", "findProperty", "schema", "getProp", "rest", "typeNode", "length", "ast", "split", "defaultAnnotations", "objectKeyword", "stringKeyword", "numberKeyword", "booleanKeyword", "getAnnotation", "annotationId", "noDefault", "id", "getIdentifierAnnotation", "getOrUndefined", "value", "_tag", "annotations", "findAnnotation", "getAnnotationById", "getBaseAnnotation", "isUndefinedKeyword", "isLiteralUnion", "every", "getDiscriminatingProps", "reduce", "shared", "props", "filter", "p", "map", "includes", "getDiscriminatedType", "match", "literal", "fields", "Object", "fromEntries", "literals", "find", "Literal", "Struct", "mapAst", "f", "TypeLiteral", "propertySignatures", "PropertySignature", "isOptional", "isReadonly", "indexSignatures", "Union", "make", "TupleType", "t", "
|
|
3
|
+
"sources": ["../../../src/index.ts", "../../../src/ast.ts", "../../../src/url.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2020 DXOS.org\n//\n\nimport { AST, JSONSchema, Schema as S } from '@effect/schema';\nimport type * as Types from 'effect/Types';\n\n// TODO(dmaretskyi): Remove re-exports.\nexport { AST, JSONSchema, S, Types };\n\nexport * from './ast';\nexport * from './url';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AST, Schema as S } from '@effect/schema';\nimport { Option, pipe } from 'effect';\n\nimport { invariant } from '@dxos/invariant';\nimport { nonNullable } from '@dxos/util';\n\n//\n// Refs\n// https://effect.website/docs/schema/introduction\n// https://www.npmjs.com/package/@effect/schema\n// https://effect-ts.github.io/effect/schema/AST.ts.html\n//\n\nexport type SimpleType = 'object' | 'string' | 'number' | 'boolean' | 'enum' | 'literal';\n\n/**\n * Get the base type; e.g., traverse through refinements.\n */\nexport const getSimpleType = (node: AST.AST): SimpleType | undefined => {\n if (AST.isObjectKeyword(node) || AST.isTypeLiteral(node) || isDiscriminatedUnion(node) || AST.isDeclaration(node)) {\n return 'object';\n }\n\n if (AST.isStringKeyword(node)) {\n return 'string';\n }\n if (AST.isNumberKeyword(node)) {\n return 'number';\n }\n if (AST.isBooleanKeyword(node)) {\n return 'boolean';\n }\n\n if (AST.isEnums(node)) {\n return 'enum';\n }\n\n if (AST.isLiteral(node)) {\n return 'literal';\n }\n};\n\nexport const isSimpleType = (node: AST.AST): boolean => !!getSimpleType(node);\n\nexport namespace SimpleType {\n /**\n * Returns the default empty value for a given SimpleType.\n * Used for initializing new array values etc.\n */\n export const getDefaultValue = (type: SimpleType): any => {\n switch (type) {\n case 'string': {\n return '';\n }\n case 'number': {\n return 0;\n }\n case 'boolean': {\n return false;\n }\n case 'object': {\n return {};\n }\n default: {\n throw new Error(`Unsupported type for default value: ${type}`);\n }\n }\n };\n}\n\n//\n// Branded types\n//\n\nexport type JsonProp = string & { __JsonPath: true; __JsonProp: true };\nexport type JsonPath = string & { __JsonPath: true };\n\nconst PATH_REGEX = /^[a-zA-Z_$][\\w$]*(?:\\.[a-zA-Z_$][\\w$]*|\\[\\d+\\])*$/;\nconst PROP_REGEX = /\\w+/;\n\n/**\n * https://www.ietf.org/archive/id/draft-goessner-dispatch-jsonpath-00.html\n */\nexport const JsonPath = S.NonEmptyString.pipe(S.pattern(PATH_REGEX)) as any as S.Schema<JsonPath>;\nexport const JsonProp = S.NonEmptyString.pipe(S.pattern(PROP_REGEX)) as any as S.Schema<JsonProp>;\n\nexport enum VisitResult {\n CONTINUE = 0,\n /**\n * Skip visiting children.\n */\n SKIP = 1,\n /**\n * Stop traversing immediately.\n */\n EXIT = 2,\n}\n\nexport type Path = (string | number)[];\n\nexport type TestFn = (node: AST.AST, path: Path, depth: number) => VisitResult | boolean | undefined;\n\nexport type VisitorFn = (node: AST.AST, path: Path, depth: number) => void;\n\nconst defaultTest: TestFn = isSimpleType;\n\n/**\n * Visit leaf nodes.\n * Refs:\n * - https://github.com/syntax-tree/unist-util-visit?tab=readme-ov-file#visitor\n * - https://github.com/syntax-tree/unist-util-is?tab=readme-ov-file#test\n */\nexport const visit: {\n (node: AST.AST, visitor: VisitorFn): void;\n (node: AST.AST, test: TestFn, visitor: VisitorFn): void;\n} = (node: AST.AST, testOrVisitor: TestFn | VisitorFn, visitor?: VisitorFn): void => {\n if (!visitor) {\n visitNode(node, defaultTest, testOrVisitor);\n } else {\n visitNode(node, testOrVisitor as TestFn, visitor);\n }\n};\n\nconst visitNode = (\n node: AST.AST,\n test: TestFn | undefined,\n visitor: VisitorFn,\n path: Path = [],\n depth = 0,\n): VisitResult | undefined => {\n const _result = test?.(node, path, depth);\n const result: VisitResult =\n _result === undefined\n ? VisitResult.CONTINUE\n : typeof _result === 'boolean'\n ? _result\n ? VisitResult.CONTINUE\n : VisitResult.SKIP\n : _result;\n\n if (result === VisitResult.EXIT) {\n return result;\n }\n if (result !== VisitResult.SKIP) {\n visitor(node, path, depth);\n }\n\n // Object.\n if (AST.isTypeLiteral(node)) {\n for (const prop of AST.getPropertySignatures(node)) {\n const currentPath = [...path, prop.name.toString()];\n const result = visitNode(prop.type, test, visitor, currentPath, depth + 1);\n if (result === VisitResult.EXIT) {\n return result;\n }\n }\n }\n\n // Array.\n else if (AST.isTupleType(node)) {\n for (const [i, element] of node.elements.entries()) {\n const currentPath = [...path, i];\n const result = visitNode(element.type, test, visitor, currentPath, depth);\n if (result === VisitResult.EXIT) {\n return result;\n }\n }\n }\n\n // Branching union (e.g., optional, discriminated unions).\n else if (AST.isUnion(node)) {\n for (const type of node.types) {\n const result = visitNode(type, test, visitor, path, depth);\n if (result === VisitResult.EXIT) {\n return result;\n }\n }\n }\n\n // Refinement.\n else if (AST.isRefinement(node)) {\n const result = visitNode(node.from, test, visitor, path, depth);\n if (result === VisitResult.EXIT) {\n return result;\n }\n }\n\n // TODO(burdon): Transforms?\n};\n\n/**\n * Recursively descend into AST to find first node that passes the test.\n */\n// TODO(burdon): Rewrite using visitNode?\nexport const findNode = (node: AST.AST, test: (node: AST.AST) => boolean): AST.AST | undefined => {\n if (test(node)) {\n return node;\n }\n\n // Object.\n else if (AST.isTypeLiteral(node)) {\n for (const prop of AST.getPropertySignatures(node)) {\n const child = findNode(prop.type, test);\n if (child) {\n return child;\n }\n }\n }\n\n // Tuple.\n else if (AST.isTupleType(node)) {\n for (const [_, element] of node.elements.entries()) {\n const child = findNode(element.type, test);\n if (child) {\n return child;\n }\n }\n }\n\n // Branching union (e.g., optional, discriminated unions).\n else if (AST.isUnion(node)) {\n if (isOption(node)) {\n for (const type of node.types) {\n const child = findNode(type, test);\n if (child) {\n return child;\n }\n }\n }\n }\n\n // Refinement.\n else if (AST.isRefinement(node)) {\n return findNode(node.from, test);\n }\n};\n\n/**\n * Get the AST node for the given property (dot-path).\n */\nexport const findProperty = (schema: S.Schema<any>, path: JsonPath | JsonProp): AST.AST | undefined => {\n const getProp = (node: AST.AST, path: JsonProp[]): AST.AST | undefined => {\n const [name, ...rest] = path;\n const typeNode = findNode(node, AST.isTypeLiteral);\n invariant(typeNode);\n for (const prop of AST.getPropertySignatures(typeNode)) {\n if (prop.name === name) {\n if (rest.length) {\n return getProp(prop.type, rest);\n } else {\n return prop.type;\n }\n }\n }\n };\n\n return getProp(schema.ast, path.split('.') as JsonProp[]);\n};\n\n//\n// Annotations\n//\n\nconst defaultAnnotations: Record<string, AST.Annotated> = {\n ['ObjectKeyword' as const]: AST.objectKeyword,\n ['StringKeyword' as const]: AST.stringKeyword,\n ['NumberKeyword' as const]: AST.numberKeyword,\n ['BooleanKeyword' as const]: AST.booleanKeyword,\n};\n\n/**\n * Get annotation or return undefined.\n * @param annotationId\n * @param noDefault If true, then return undefined for effect library defined values.\n */\nexport const getAnnotation =\n <T>(annotationId: symbol, noDefault = true) =>\n (node: AST.AST): T | undefined => {\n // Title fallback seems to be the identifier.\n const id = pipe(AST.getIdentifierAnnotation(node), Option.getOrUndefined);\n const value = pipe(AST.getAnnotation<T>(annotationId)(node), Option.getOrUndefined);\n if (noDefault && (value === defaultAnnotations[node._tag]?.annotations[annotationId] || value === id)) {\n return undefined;\n }\n\n return value;\n };\n\n/**\n * Recursively descend into AST to find first matching annotations.\n * Optionally skips default annotations for basic types (e.g., 'a string').\n */\n// TODO(burdon): Convert to effect pattern (i.e., return operator like getAnnotation).\nexport const findAnnotation = <T>(node: AST.AST, annotationId: symbol, noDefault = true): T | undefined => {\n const getAnnotationById = getAnnotation(annotationId, noDefault);\n\n const getBaseAnnotation = (node: AST.AST): T | undefined => {\n const value = getAnnotationById(node);\n if (value !== undefined) {\n return value as T;\n }\n\n if (AST.isUnion(node)) {\n if (isOption(node)) {\n return getAnnotationById(node.types[0]) as T;\n }\n }\n };\n\n return getBaseAnnotation(node);\n};\n\n//\n// Unions\n//\n\n/**\n * Effect S.optional creates a union type with undefined as the second type.\n */\nexport const isOption = (node: AST.AST): boolean => {\n return AST.isUnion(node) && node.types.length === 2 && AST.isUndefinedKeyword(node.types[1]);\n};\n\n/**\n * Determines if the node is a union of literal types.\n */\nexport const isLiteralUnion = (node: AST.AST): boolean => {\n return AST.isUnion(node) && node.types.every(AST.isLiteral);\n};\n\n/**\n * Determines if the node is a discriminated union.\n */\nexport const isDiscriminatedUnion = (node: AST.AST): boolean => {\n return AST.isUnion(node) && !!getDiscriminatingProps(node)?.length;\n};\n\n/**\n * Get the discriminating properties for the given union type.\n */\nexport const getDiscriminatingProps = (node: AST.AST): string[] | undefined => {\n invariant(AST.isUnion(node));\n if (isOption(node)) {\n return;\n }\n\n // Get common literals across all types.\n return node.types.reduce<string[]>((shared, type) => {\n const props = AST.getPropertySignatures(type)\n // TODO(burdon): Should check each literal is unique.\n .filter((p) => AST.isLiteral(p.type))\n .map((p) => p.name.toString());\n\n // Return common literals.\n return shared.length === 0 ? props : shared.filter((prop) => props.includes(prop));\n }, []);\n};\n\n/**\n * Get the discriminated type for the given value.\n */\nexport const getDiscriminatedType = (node: AST.AST, value: Record<string, any> = {}): AST.AST | undefined => {\n invariant(AST.isUnion(node));\n invariant(value);\n const props = getDiscriminatingProps(node);\n if (!props?.length) {\n return;\n }\n\n // Match provided values.\n for (const type of node.types) {\n const match = AST.getPropertySignatures(type)\n .filter((prop) => props?.includes(prop.name.toString()))\n .every((prop) => {\n invariant(AST.isLiteral(prop.type));\n return prop.type.literal === value[prop.name.toString()];\n });\n\n if (match) {\n return type;\n }\n }\n\n // Create union of discriminating properties.\n // NOTE: This may not work with non-overlapping variants.\n // TODO(burdon): Iterate through props and knock-out variants that don't match.\n const fields = Object.fromEntries(\n props\n .map((prop) => {\n const literals = node.types\n .map((type) => {\n const literal = AST.getPropertySignatures(type).find((p) => p.name.toString() === prop)!;\n invariant(AST.isLiteral(literal.type));\n return literal.type.literal;\n })\n .filter(nonNullable);\n\n return literals.length ? [prop, S.Literal(...literals)] : undefined;\n })\n .filter(nonNullable),\n );\n\n const schema = S.Struct(fields);\n return schema.ast;\n};\n\n/**\n * Maps AST nodes.\n * The user is responsible for recursively calling {@link mapAst} on the AST.\n * NOTE: Will evaluate suspended ASTs.\n */\nexport const mapAst = (ast: AST.AST, f: (ast: AST.AST) => AST.AST): AST.AST => {\n switch (ast._tag) {\n case 'TypeLiteral':\n return new AST.TypeLiteral(\n ast.propertySignatures.map(\n (prop) =>\n new AST.PropertySignature(prop.name, f(prop.type), prop.isOptional, prop.isReadonly, prop.annotations),\n ),\n ast.indexSignatures,\n );\n case 'Union':\n return AST.Union.make(ast.types.map(f), ast.annotations);\n case 'TupleType':\n return new AST.TupleType(\n ast.elements.map((t) => new AST.OptionalType(f(t.type), t.isOptional, t.annotations)),\n ast.rest.map((t) => new AST.Type(f(t.type), t.annotations)),\n ast.isReadonly,\n ast.annotations,\n );\n case 'Suspend': {\n const newAst = f(ast.f());\n return new AST.Suspend(() => newAst, ast.annotations);\n }\n default:\n // TODO(dmaretskyi): Support more nodes.\n return ast;\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AST, type Schema as S } from '@effect/schema';\nimport { Option, pipe } from 'effect';\n\nimport { decamelize } from '@dxos/util';\n\nconst ParamKeyAnnotationId = Symbol.for('@dxos/schema/annotation/ParamKey');\n\ntype ParamKeyAnnotationValue = { key: string };\n\nexport const getParamKeyAnnotation: (annotated: AST.Annotated) => Option.Option<ParamKeyAnnotationValue> =\n AST.getAnnotation<ParamKeyAnnotationValue>(ParamKeyAnnotationId);\n\nexport const ParamKeyAnnotation =\n (value: ParamKeyAnnotationValue) =>\n <S extends S.Annotable.All>(self: S): S.Annotable.Self<S> =>\n self.annotations({ [ParamKeyAnnotationId]: value });\n\n/**\n * HTTP params parser.\n * Supports custom key serialization.\n */\nexport class UrlParser<T extends Record<string, any>> {\n constructor(private readonly _schema: S.Struct<T>) {}\n\n /**\n * Parse URL params.\n */\n parse(_url: string): T {\n const url = new URL(_url);\n return Object.entries(this._schema.fields).reduce<Record<string, any>>((params, [key, type]) => {\n let value = url.searchParams.get(decamelize(key));\n if (value == null) {\n value = url.searchParams.get(key);\n }\n\n if (value != null) {\n if (AST.isNumberKeyword(type.ast)) {\n params[key] = parseInt(value);\n } else if (AST.isBooleanKeyword(type.ast)) {\n params[key] = value === 'true' || value === '1';\n } else {\n params[key] = value;\n }\n }\n\n return params;\n }, {}) as T;\n }\n\n /**\n * Return URL with encoded params.\n */\n create(_url: string, params: T): URL {\n const url = new URL(_url);\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n const field = this._schema.fields[key];\n if (field) {\n const { key: serializedKey } = pipe(\n getParamKeyAnnotation(field.ast),\n Option.getOrElse(() => ({\n key: decamelize(key),\n })),\n );\n\n url.searchParams.set(serializedKey, String(value));\n }\n }\n });\n\n return url;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["AST", "JSONSchema", "Schema", "S", "AST", "Schema", "S", "Option", "pipe", "invariant", "nonNullable", "getSimpleType", "node", "isObjectKeyword", "isTypeLiteral", "isDiscriminatedUnion", "isDeclaration", "isStringKeyword", "isNumberKeyword", "isBooleanKeyword", "isEnums", "isLiteral", "isSimpleType", "SimpleType", "getDefaultValue", "type", "Error", "PATH_REGEX", "PROP_REGEX", "JsonPath", "NonEmptyString", "pattern", "JsonProp", "VisitResult", "defaultTest", "visit", "testOrVisitor", "visitor", "visitNode", "test", "path", "depth", "_result", "result", "undefined", "prop", "getPropertySignatures", "currentPath", "name", "toString", "isTupleType", "i", "element", "elements", "entries", "isUnion", "types", "isRefinement", "from", "findNode", "child", "_", "isOption", "findProperty", "schema", "getProp", "rest", "typeNode", "length", "ast", "split", "defaultAnnotations", "objectKeyword", "stringKeyword", "numberKeyword", "booleanKeyword", "getAnnotation", "annotationId", "noDefault", "id", "getIdentifierAnnotation", "getOrUndefined", "value", "_tag", "annotations", "findAnnotation", "getAnnotationById", "getBaseAnnotation", "isUndefinedKeyword", "isLiteralUnion", "every", "getDiscriminatingProps", "reduce", "shared", "props", "filter", "p", "map", "includes", "getDiscriminatedType", "match", "literal", "fields", "Object", "fromEntries", "literals", "find", "Literal", "Struct", "mapAst", "f", "TypeLiteral", "propertySignatures", "PropertySignature", "isOptional", "isReadonly", "indexSignatures", "Union", "make", "TupleType", "t", "OptionalType", "Type", "newAst", "Suspend", "AST", "Option", "pipe", "decamelize", "ParamKeyAnnotationId", "Symbol", "for", "getParamKeyAnnotation", "AST", "getAnnotation", "ParamKeyAnnotation", "value", "self", "annotations", "UrlParser", "constructor", "_schema", "parse", "_url", "url", "URL", "Object", "entries", "fields", "reduce", "params", "key", "type", "searchParams", "get", "decamelize", "isNumberKeyword", "ast", "parseInt", "isBooleanKeyword", "create", "forEach", "undefined", "field", "serializedKey", "pipe", "Option", "getOrElse", "set", "String"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/common/effect/src/ast.ts":{"bytes":
|
|
1
|
+
{"inputs":{"packages/common/effect/src/ast.ts":{"bytes":41585,"imports":[{"path":"@effect/schema","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/common/effect/src/url.ts":{"bytes":7711,"imports":[{"path":"@effect/schema","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/common/effect/src/index.ts":{"bytes":1150,"imports":[{"path":"@effect/schema","kind":"import-statement","external":true},{"path":"packages/common/effect/src/ast.ts","kind":"import-statement","original":"./ast"},{"path":"packages/common/effect/src/url.ts","kind":"import-statement","original":"./url"}],"format":"esm"}},"outputs":{"packages/common/effect/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":25575},"packages/common/effect/dist/lib/browser/index.mjs":{"imports":[{"path":"@effect/schema","kind":"import-statement","external":true},{"path":"@effect/schema","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@effect/schema","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["AST","JSONSchema","JsonPath","JsonProp","ParamKeyAnnotation","S","SimpleType","UrlParser","VisitResult","findAnnotation","findNode","findProperty","getAnnotation","getDiscriminatedType","getDiscriminatingProps","getParamKeyAnnotation","getSimpleType","isDiscriminatedUnion","isLiteralUnion","isOption","isSimpleType","mapAst","visit"],"entryPoint":"packages/common/effect/src/index.ts","inputs":{"packages/common/effect/src/index.ts":{"bytesInOutput":72},"packages/common/effect/src/ast.ts":{"bytesInOutput":8684},"packages/common/effect/src/url.ts":{"bytesInOutput":1624}},"bytes":10947}}}
|
package/dist/lib/node/index.cjs
CHANGED
|
@@ -27,23 +27,19 @@ __export(node_exports, {
|
|
|
27
27
|
SimpleType: () => SimpleType,
|
|
28
28
|
UrlParser: () => UrlParser,
|
|
29
29
|
VisitResult: () => VisitResult,
|
|
30
|
-
createJsonPath: () => createJsonPath,
|
|
31
30
|
findAnnotation: () => findAnnotation,
|
|
32
31
|
findNode: () => findNode,
|
|
33
32
|
findProperty: () => findProperty,
|
|
34
|
-
fromEffectValidationPath: () => fromEffectValidationPath,
|
|
35
33
|
getAnnotation: () => getAnnotation,
|
|
36
34
|
getDiscriminatedType: () => getDiscriminatedType,
|
|
37
35
|
getDiscriminatingProps: () => getDiscriminatingProps,
|
|
38
36
|
getParamKeyAnnotation: () => getParamKeyAnnotation,
|
|
39
37
|
getSimpleType: () => getSimpleType,
|
|
40
38
|
isDiscriminatedUnion: () => isDiscriminatedUnion,
|
|
41
|
-
isJsonPath: () => isJsonPath,
|
|
42
39
|
isLiteralUnion: () => isLiteralUnion,
|
|
43
40
|
isOption: () => isOption,
|
|
44
41
|
isSimpleType: () => isSimpleType,
|
|
45
42
|
mapAst: () => mapAst,
|
|
46
|
-
splitJsonPath: () => splitJsonPath,
|
|
47
43
|
visit: () => visit
|
|
48
44
|
});
|
|
49
45
|
module.exports = __toCommonJS(node_exports);
|
|
@@ -53,9 +49,6 @@ var import_effect = require("effect");
|
|
|
53
49
|
var import_invariant = require("@dxos/invariant");
|
|
54
50
|
var import_util = require("@dxos/util");
|
|
55
51
|
var import_schema3 = require("@effect/schema");
|
|
56
|
-
var import_Option = require("effect/Option");
|
|
57
|
-
var import_invariant2 = require("@dxos/invariant");
|
|
58
|
-
var import_schema4 = require("@effect/schema");
|
|
59
52
|
var import_effect2 = require("effect");
|
|
60
53
|
var import_util2 = require("@dxos/util");
|
|
61
54
|
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/common/effect/src/ast.ts";
|
|
@@ -102,6 +95,10 @@ var SimpleType;
|
|
|
102
95
|
}
|
|
103
96
|
};
|
|
104
97
|
})(SimpleType || (SimpleType = {}));
|
|
98
|
+
var PATH_REGEX = /^[a-zA-Z_$][\w$]*(?:\.[a-zA-Z_$][\w$]*|\[\d+\])*$/;
|
|
99
|
+
var PROP_REGEX = /\w+/;
|
|
100
|
+
var JsonPath = import_schema2.Schema.NonEmptyString.pipe(import_schema2.Schema.pattern(PATH_REGEX));
|
|
101
|
+
var JsonProp = import_schema2.Schema.NonEmptyString.pipe(import_schema2.Schema.pattern(PROP_REGEX));
|
|
105
102
|
var VisitResult;
|
|
106
103
|
(function(VisitResult2) {
|
|
107
104
|
VisitResult2[VisitResult2["CONTINUE"] = 0] = "CONTINUE";
|
|
@@ -197,7 +194,7 @@ var findProperty = (schema, path) => {
|
|
|
197
194
|
const typeNode = findNode(node, import_schema2.AST.isTypeLiteral);
|
|
198
195
|
(0, import_invariant.invariant)(typeNode, void 0, {
|
|
199
196
|
F: __dxlog_file,
|
|
200
|
-
L:
|
|
197
|
+
L: 249,
|
|
201
198
|
S: void 0,
|
|
202
199
|
A: [
|
|
203
200
|
"typeNode",
|
|
@@ -257,7 +254,7 @@ var isDiscriminatedUnion = (node) => {
|
|
|
257
254
|
var getDiscriminatingProps = (node) => {
|
|
258
255
|
(0, import_invariant.invariant)(import_schema2.AST.isUnion(node), void 0, {
|
|
259
256
|
F: __dxlog_file,
|
|
260
|
-
L:
|
|
257
|
+
L: 346,
|
|
261
258
|
S: void 0,
|
|
262
259
|
A: [
|
|
263
260
|
"AST.isUnion(node)",
|
|
@@ -275,7 +272,7 @@ var getDiscriminatingProps = (node) => {
|
|
|
275
272
|
var getDiscriminatedType = (node, value = {}) => {
|
|
276
273
|
(0, import_invariant.invariant)(import_schema2.AST.isUnion(node), void 0, {
|
|
277
274
|
F: __dxlog_file,
|
|
278
|
-
L:
|
|
275
|
+
L: 367,
|
|
279
276
|
S: void 0,
|
|
280
277
|
A: [
|
|
281
278
|
"AST.isUnion(node)",
|
|
@@ -284,7 +281,7 @@ var getDiscriminatedType = (node, value = {}) => {
|
|
|
284
281
|
});
|
|
285
282
|
(0, import_invariant.invariant)(value, void 0, {
|
|
286
283
|
F: __dxlog_file,
|
|
287
|
-
L:
|
|
284
|
+
L: 368,
|
|
288
285
|
S: void 0,
|
|
289
286
|
A: [
|
|
290
287
|
"value",
|
|
@@ -299,7 +296,7 @@ var getDiscriminatedType = (node, value = {}) => {
|
|
|
299
296
|
const match = import_schema2.AST.getPropertySignatures(type).filter((prop) => props?.includes(prop.name.toString())).every((prop) => {
|
|
300
297
|
(0, import_invariant.invariant)(import_schema2.AST.isLiteral(prop.type), void 0, {
|
|
301
298
|
F: __dxlog_file,
|
|
302
|
-
L:
|
|
299
|
+
L: 379,
|
|
303
300
|
S: void 0,
|
|
304
301
|
A: [
|
|
305
302
|
"AST.isLiteral(prop.type)",
|
|
@@ -317,7 +314,7 @@ var getDiscriminatedType = (node, value = {}) => {
|
|
|
317
314
|
const literal = import_schema2.AST.getPropertySignatures(type).find((p) => p.name.toString() === prop);
|
|
318
315
|
(0, import_invariant.invariant)(import_schema2.AST.isLiteral(literal.type), void 0, {
|
|
319
316
|
F: __dxlog_file,
|
|
320
|
-
L:
|
|
317
|
+
L: 397,
|
|
321
318
|
S: void 0,
|
|
322
319
|
A: [
|
|
323
320
|
"AST.isLiteral(literal.type)",
|
|
@@ -337,67 +334,21 @@ var getDiscriminatedType = (node, value = {}) => {
|
|
|
337
334
|
var mapAst = (ast, f) => {
|
|
338
335
|
switch (ast._tag) {
|
|
339
336
|
case "TypeLiteral":
|
|
340
|
-
return new import_schema2.AST.TypeLiteral(ast.propertySignatures.map((prop) => new import_schema2.AST.PropertySignature(prop.name, f(prop.type
|
|
337
|
+
return new import_schema2.AST.TypeLiteral(ast.propertySignatures.map((prop) => new import_schema2.AST.PropertySignature(prop.name, f(prop.type), prop.isOptional, prop.isReadonly, prop.annotations)), ast.indexSignatures);
|
|
341
338
|
case "Union":
|
|
342
339
|
return import_schema2.AST.Union.make(ast.types.map(f), ast.annotations);
|
|
343
340
|
case "TupleType":
|
|
344
|
-
return new import_schema2.AST.TupleType(ast.elements.map((t
|
|
341
|
+
return new import_schema2.AST.TupleType(ast.elements.map((t) => new import_schema2.AST.OptionalType(f(t.type), t.isOptional, t.annotations)), ast.rest.map((t) => new import_schema2.AST.Type(f(t.type), t.annotations)), ast.isReadonly, ast.annotations);
|
|
345
342
|
case "Suspend": {
|
|
346
|
-
const newAst = f(ast.f()
|
|
343
|
+
const newAst = f(ast.f());
|
|
347
344
|
return new import_schema2.AST.Suspend(() => newAst, ast.annotations);
|
|
348
345
|
}
|
|
349
346
|
default:
|
|
350
347
|
return ast;
|
|
351
348
|
}
|
|
352
349
|
};
|
|
353
|
-
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/common/effect/src/jsonPath.ts";
|
|
354
|
-
var PATH_REGEX = /^($|[a-zA-Z_$][\w$]*(?:\.[a-zA-Z_$][\w$]*|\[\d+\](?:\.)?)*$)/;
|
|
355
|
-
var PROP_REGEX = /\w+/;
|
|
356
|
-
var JsonPath = import_schema3.Schema.String.pipe(import_schema3.Schema.pattern(PATH_REGEX));
|
|
357
|
-
var JsonProp = import_schema3.Schema.NonEmptyString.pipe(import_schema3.Schema.pattern(PROP_REGEX));
|
|
358
|
-
var isJsonPath = (value) => {
|
|
359
|
-
return (0, import_Option.isSome)(import_schema3.Schema.validateOption(JsonPath)(value));
|
|
360
|
-
};
|
|
361
|
-
var createJsonPath = (path) => {
|
|
362
|
-
const candidatePath = path.map((p, i) => {
|
|
363
|
-
if (typeof p === "number") {
|
|
364
|
-
return `[${p}]`;
|
|
365
|
-
} else {
|
|
366
|
-
return i === 0 ? p : `.${p}`;
|
|
367
|
-
}
|
|
368
|
-
}).join("");
|
|
369
|
-
(0, import_invariant2.invariant)(isJsonPath(candidatePath), `Invalid JsonPath: ${candidatePath}`, {
|
|
370
|
-
F: __dxlog_file2,
|
|
371
|
-
L: 56,
|
|
372
|
-
S: void 0,
|
|
373
|
-
A: [
|
|
374
|
-
"isJsonPath(candidatePath)",
|
|
375
|
-
"`Invalid JsonPath: ${candidatePath}`"
|
|
376
|
-
]
|
|
377
|
-
});
|
|
378
|
-
return candidatePath;
|
|
379
|
-
};
|
|
380
|
-
var fromEffectValidationPath = (effectPath) => {
|
|
381
|
-
const jsonPath = effectPath.replace(/\.\[(\d+)\]/g, "[$1]");
|
|
382
|
-
(0, import_invariant2.invariant)(isJsonPath(jsonPath), `Invalid JsonPath: ${jsonPath}`, {
|
|
383
|
-
F: __dxlog_file2,
|
|
384
|
-
L: 67,
|
|
385
|
-
S: void 0,
|
|
386
|
-
A: [
|
|
387
|
-
"isJsonPath(jsonPath)",
|
|
388
|
-
"`Invalid JsonPath: ${jsonPath}`"
|
|
389
|
-
]
|
|
390
|
-
});
|
|
391
|
-
return jsonPath;
|
|
392
|
-
};
|
|
393
|
-
var splitJsonPath = (path) => {
|
|
394
|
-
if (!isJsonPath(path)) {
|
|
395
|
-
return [];
|
|
396
|
-
}
|
|
397
|
-
return path.match(/[a-zA-Z_$][\w$]*|\[\d+\]/g)?.map((part) => part.startsWith("[") ? part.replace(/[[\]]/g, "") : part) ?? [];
|
|
398
|
-
};
|
|
399
350
|
var ParamKeyAnnotationId = Symbol.for("@dxos/schema/annotation/ParamKey");
|
|
400
|
-
var getParamKeyAnnotation =
|
|
351
|
+
var getParamKeyAnnotation = import_schema3.AST.getAnnotation(ParamKeyAnnotationId);
|
|
401
352
|
var ParamKeyAnnotation = (value) => (self) => self.annotations({
|
|
402
353
|
[ParamKeyAnnotationId]: value
|
|
403
354
|
});
|
|
@@ -416,9 +367,9 @@ var UrlParser = class {
|
|
|
416
367
|
value = url.searchParams.get(key);
|
|
417
368
|
}
|
|
418
369
|
if (value != null) {
|
|
419
|
-
if (
|
|
370
|
+
if (import_schema3.AST.isNumberKeyword(type.ast)) {
|
|
420
371
|
params[key] = parseInt(value);
|
|
421
|
-
} else if (
|
|
372
|
+
} else if (import_schema3.AST.isBooleanKeyword(type.ast)) {
|
|
422
373
|
params[key] = value === "true" || value === "1";
|
|
423
374
|
} else {
|
|
424
375
|
params[key] = value;
|
|
@@ -457,23 +408,19 @@ var UrlParser = class {
|
|
|
457
408
|
SimpleType,
|
|
458
409
|
UrlParser,
|
|
459
410
|
VisitResult,
|
|
460
|
-
createJsonPath,
|
|
461
411
|
findAnnotation,
|
|
462
412
|
findNode,
|
|
463
413
|
findProperty,
|
|
464
|
-
fromEffectValidationPath,
|
|
465
414
|
getAnnotation,
|
|
466
415
|
getDiscriminatedType,
|
|
467
416
|
getDiscriminatingProps,
|
|
468
417
|
getParamKeyAnnotation,
|
|
469
418
|
getSimpleType,
|
|
470
419
|
isDiscriminatedUnion,
|
|
471
|
-
isJsonPath,
|
|
472
420
|
isLiteralUnion,
|
|
473
421
|
isOption,
|
|
474
422
|
isSimpleType,
|
|
475
423
|
mapAst,
|
|
476
|
-
splitJsonPath,
|
|
477
424
|
visit
|
|
478
425
|
});
|
|
479
426
|
//# sourceMappingURL=index.cjs.map
|