@columnus/shared 0.1.47
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/LICENSE +21 -0
- package/dist/apiProfile.d.ts +1072 -0
- package/dist/apiProfile.js +4210 -0
- package/dist/apiProfile.js.map +1 -0
- package/dist/apiProfileSlug.d.ts +11 -0
- package/dist/apiProfileSlug.js +39 -0
- package/dist/apiProfileSlug.js.map +1 -0
- package/dist/apiToken.d.ts +6 -0
- package/dist/apiToken.js +35 -0
- package/dist/apiToken.js.map +1 -0
- package/dist/betterAuthSession.d.ts +8 -0
- package/dist/betterAuthSession.js +57 -0
- package/dist/betterAuthSession.js.map +1 -0
- package/dist/bffHost.d.ts +36 -0
- package/dist/bffHost.js +74 -0
- package/dist/bffHost.js.map +1 -0
- package/dist/bffProtocol.d.ts +1357 -0
- package/dist/bffProtocol.js +4362 -0
- package/dist/bffProtocol.js.map +1 -0
- package/dist/bffRedact.d.ts +30 -0
- package/dist/bffRedact.js +55 -0
- package/dist/bffRedact.js.map +1 -0
- package/dist/ciPreviewEnv.d.ts +49 -0
- package/dist/ciPreviewEnv.js +143 -0
- package/dist/ciPreviewEnv.js.map +1 -0
- package/dist/clipboardTransfer.d.ts +25 -0
- package/dist/clipboardTransfer.js +4862 -0
- package/dist/clipboardTransfer.js.map +1 -0
- package/dist/convexSiteUrl.d.ts +73 -0
- package/dist/convexSiteUrl.js +137 -0
- package/dist/convexSiteUrl.js.map +1 -0
- package/dist/csv.d.ts +54 -0
- package/dist/csv.js +5499 -0
- package/dist/csv.js.map +1 -0
- package/dist/dataTransfer.d.ts +21 -0
- package/dist/dataTransfer.js +74 -0
- package/dist/dataTransfer.js.map +1 -0
- package/dist/dateValues.d.ts +18 -0
- package/dist/dateValues.js +73 -0
- package/dist/dateValues.js.map +1 -0
- package/dist/deployOutput.d.ts +3 -0
- package/dist/deployOutput.js +23 -0
- package/dist/deployOutput.js.map +1 -0
- package/dist/displayLabel.d.ts +13 -0
- package/dist/displayLabel.js +4342 -0
- package/dist/displayLabel.js.map +1 -0
- package/dist/displayTemplateGenerator.d.ts +11 -0
- package/dist/displayTemplateGenerator.js +98 -0
- package/dist/displayTemplateGenerator.js.map +1 -0
- package/dist/displayTypes.d.ts +10 -0
- package/dist/displayTypes.js +3 -0
- package/dist/displayTypes.js.map +1 -0
- package/dist/dotenv.d.ts +8 -0
- package/dist/dotenv.js +61 -0
- package/dist/dotenv.js.map +1 -0
- package/dist/erdLayout.d.ts +27 -0
- package/dist/erdLayout.js +78 -0
- package/dist/erdLayout.js.map +1 -0
- package/dist/fieldTypeFormat.d.ts +5 -0
- package/dist/fieldTypeFormat.js +63 -0
- package/dist/fieldTypeFormat.js.map +1 -0
- package/dist/fieldTypeMeta.d.ts +50 -0
- package/dist/fieldTypeMeta.js +84 -0
- package/dist/fieldTypeMeta.js.map +1 -0
- package/dist/fieldValueEqual.d.ts +4 -0
- package/dist/fieldValueEqual.js +58 -0
- package/dist/fieldValueEqual.js.map +1 -0
- package/dist/importMatch.d.ts +80 -0
- package/dist/importMatch.js +5643 -0
- package/dist/importMatch.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.js +10647 -0
- package/dist/index.js.map +1 -0
- package/dist/inferIdentifier.d.ts +18 -0
- package/dist/inferIdentifier.js +49 -0
- package/dist/inferIdentifier.js.map +1 -0
- package/dist/keyboard.d.ts +16 -0
- package/dist/keyboard.js +71 -0
- package/dist/keyboard.js.map +1 -0
- package/dist/manifestDeploy.d.ts +27 -0
- package/dist/manifestDeploy.js +16 -0
- package/dist/manifestDeploy.js.map +1 -0
- package/dist/manifestHash.d.ts +11 -0
- package/dist/manifestHash.js +35 -0
- package/dist/manifestHash.js.map +1 -0
- package/dist/previewDeployName.d.ts +26 -0
- package/dist/previewDeployName.js +77 -0
- package/dist/previewDeployName.js.map +1 -0
- package/dist/proposePolicy.d.ts +17 -0
- package/dist/proposePolicy.js +33 -0
- package/dist/proposePolicy.js.map +1 -0
- package/dist/queryBetween.d.ts +20 -0
- package/dist/queryBetween.js +28 -0
- package/dist/queryBetween.js.map +1 -0
- package/dist/queryExecution.d.ts +5 -0
- package/dist/queryExecution.js +58 -0
- package/dist/queryExecution.js.map +1 -0
- package/dist/queryFieldOps.d.ts +66 -0
- package/dist/queryFieldOps.js +138 -0
- package/dist/queryFieldOps.js.map +1 -0
- package/dist/queryMerge.d.ts +29 -0
- package/dist/queryMerge.js +4277 -0
- package/dist/queryMerge.js.map +1 -0
- package/dist/queryPlan.d.ts +97 -0
- package/dist/queryPlan.js +4564 -0
- package/dist/queryPlan.js.map +1 -0
- package/dist/queryStudio.d.ts +25 -0
- package/dist/queryStudio.js +4658 -0
- package/dist/queryStudio.js.map +1 -0
- package/dist/queryTypes.d.ts +402 -0
- package/dist/queryTypes.js +4239 -0
- package/dist/queryTypes.js.map +1 -0
- package/dist/queryValidators.d.ts +99 -0
- package/dist/queryValidators.js +76 -0
- package/dist/queryValidators.js.map +1 -0
- package/dist/readApiQuery.d.ts +10 -0
- package/dist/readApiQuery.js +24 -0
- package/dist/readApiQuery.js.map +1 -0
- package/dist/recordTableColumns.d.ts +21 -0
- package/dist/recordTableColumns.js +4469 -0
- package/dist/recordTableColumns.js.map +1 -0
- package/dist/refDisplayRequests.d.ts +17 -0
- package/dist/refDisplayRequests.js +4877 -0
- package/dist/refDisplayRequests.js.map +1 -0
- package/dist/refGraph.d.ts +23 -0
- package/dist/refGraph.js +102 -0
- package/dist/refGraph.js.map +1 -0
- package/dist/refsRecompute.d.ts +8 -0
- package/dist/refsRecompute.js +12 -0
- package/dist/refsRecompute.js.map +1 -0
- package/dist/richDoc.d.ts +67 -0
- package/dist/richDoc.js +4408 -0
- package/dist/richDoc.js.map +1 -0
- package/dist/schemaGenerator.d.ts +31 -0
- package/dist/schemaGenerator.js +198 -0
- package/dist/schemaGenerator.js.map +1 -0
- package/dist/schemaShrink.d.ts +74 -0
- package/dist/schemaShrink.js +132 -0
- package/dist/schemaShrink.js.map +1 -0
- package/dist/schemaShrinkValidators.d.ts +72 -0
- package/dist/schemaShrinkValidators.js +31 -0
- package/dist/schemaShrinkValidators.js.map +1 -0
- package/dist/schemaTypes.d.ts +454 -0
- package/dist/schemaTypes.js +4557 -0
- package/dist/schemaTypes.js.map +1 -0
- package/dist/share.d.ts +8 -0
- package/dist/share.js +4755 -0
- package/dist/share.js.map +1 -0
- package/dist/shareApiBridge.d.ts +18 -0
- package/dist/shareApiBridge.js +4283 -0
- package/dist/shareApiBridge.js.map +1 -0
- package/dist/shareGuestPolicy.d.ts +14 -0
- package/dist/shareGuestPolicy.js +90 -0
- package/dist/shareGuestPolicy.js.map +1 -0
- package/dist/shareProposal.d.ts +113 -0
- package/dist/shareProposal.js +4810 -0
- package/dist/shareProposal.js.map +1 -0
- package/dist/shareProposalDiff.d.ts +13 -0
- package/dist/shareProposalDiff.js +91 -0
- package/dist/shareProposalDiff.js.map +1 -0
- package/dist/shareScopes.d.ts +14 -0
- package/dist/shareScopes.js +223 -0
- package/dist/shareScopes.js.map +1 -0
- package/dist/shareTokenCrypto.d.ts +9 -0
- package/dist/shareTokenCrypto.js +87 -0
- package/dist/shareTokenCrypto.js.map +1 -0
- package/dist/shareTokens.d.ts +6 -0
- package/dist/shareTokens.js +26 -0
- package/dist/shareTokens.js.map +1 -0
- package/dist/shareTypes.d.ts +107 -0
- package/dist/shareTypes.js +3 -0
- package/dist/shareTypes.js.map +1 -0
- package/dist/shareValidators.d.ts +168 -0
- package/dist/shareValidators.js +124 -0
- package/dist/shareValidators.js.map +1 -0
- package/dist/shareWizard.d.ts +14 -0
- package/dist/shareWizard.js +200 -0
- package/dist/shareWizard.js.map +1 -0
- package/dist/spaceBundle.d.ts +67 -0
- package/dist/spaceBundle.js +4664 -0
- package/dist/spaceBundle.js.map +1 -0
- package/dist/storageFieldValues.d.ts +10 -0
- package/dist/storageFieldValues.js +4421 -0
- package/dist/storageFieldValues.js.map +1 -0
- package/dist/studioBoot.d.ts +49 -0
- package/dist/studioBoot.js +167 -0
- package/dist/studioBoot.js.map +1 -0
- package/dist/syncClampMembership.d.ts +22 -0
- package/dist/syncClampMembership.js +74 -0
- package/dist/syncClampMembership.js.map +1 -0
- package/dist/tenantHosts.d.ts +30 -0
- package/dist/tenantHosts.js +60 -0
- package/dist/tenantHosts.js.map +1 -0
- package/dist/tenantSecretsCrypto.d.ts +31 -0
- package/dist/tenantSecretsCrypto.js +145 -0
- package/dist/tenantSecretsCrypto.js.map +1 -0
- package/dist/useDebouncedCommit.d.ts +11 -0
- package/dist/useDebouncedCommit.js +34 -0
- package/dist/useDebouncedCommit.js.map +1 -0
- package/dist/useDebouncedValue.d.ts +1 -0
- package/dist/useDebouncedValue.js +15 -0
- package/dist/useDebouncedValue.js.map +1 -0
- package/dist/useModifierHeld.d.ts +2 -0
- package/dist/useModifierHeld.js +28 -0
- package/dist/useModifierHeld.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { type GenericValidator } from "convex/values";
|
|
2
|
+
export declare const predicateValidator: import("convex/values").VUnion<any, [GenericValidator, GenericValidator, ...GenericValidator[]], "required", any>;
|
|
3
|
+
/** Canonical Convex validator for caller-supplied Query values. */
|
|
4
|
+
export declare const queryValidator: import("convex/values").VObject<{
|
|
5
|
+
predicates?: any[] | undefined;
|
|
6
|
+
order?: {
|
|
7
|
+
field: string;
|
|
8
|
+
direction: "asc" | "desc";
|
|
9
|
+
} | undefined;
|
|
10
|
+
search?: {
|
|
11
|
+
index: string;
|
|
12
|
+
query: string;
|
|
13
|
+
} | undefined;
|
|
14
|
+
vector?: any;
|
|
15
|
+
maxScan?: number | undefined;
|
|
16
|
+
indexHint?: string | undefined;
|
|
17
|
+
}, {
|
|
18
|
+
predicates: import("convex/values").VArray<any[] | undefined, import("convex/values").VUnion<any, [GenericValidator, GenericValidator, ...GenericValidator[]], "required", any>, "optional">;
|
|
19
|
+
order: import("convex/values").VObject<{
|
|
20
|
+
field: string;
|
|
21
|
+
direction: "asc" | "desc";
|
|
22
|
+
} | undefined, {
|
|
23
|
+
field: import("convex/values").VString<string, "required">;
|
|
24
|
+
direction: import("convex/values").VUnion<"asc" | "desc", [import("convex/values").VLiteral<"asc", "required">, import("convex/values").VLiteral<"desc", "required">], "required", never>;
|
|
25
|
+
}, "optional", "field" | "direction">;
|
|
26
|
+
search: import("convex/values").VObject<{
|
|
27
|
+
index: string;
|
|
28
|
+
query: string;
|
|
29
|
+
} | undefined, {
|
|
30
|
+
index: import("convex/values").VString<string, "required">;
|
|
31
|
+
query: import("convex/values").VString<string, "required">;
|
|
32
|
+
}, "optional", "index" | "query">;
|
|
33
|
+
maxScan: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
34
|
+
indexHint: import("convex/values").VString<string | undefined, "optional">;
|
|
35
|
+
vector: import("convex/values").VAny<any, "optional", string>;
|
|
36
|
+
}, "required", "predicates" | "order" | "search" | "vector" | "maxScan" | "indexHint" | "order.field" | "order.direction" | "search.index" | "search.query" | `vector.${string}`>;
|
|
37
|
+
/** Convex validator for profile/share clamp Query (predicates + optional defaults). */
|
|
38
|
+
export declare const clampQueryValidator: import("convex/values").VObject<{
|
|
39
|
+
predicates?: any[] | undefined;
|
|
40
|
+
order?: {
|
|
41
|
+
field: string;
|
|
42
|
+
direction: "asc" | "desc";
|
|
43
|
+
} | undefined;
|
|
44
|
+
search?: {
|
|
45
|
+
index: string;
|
|
46
|
+
query: string;
|
|
47
|
+
} | undefined;
|
|
48
|
+
}, {
|
|
49
|
+
predicates: import("convex/values").VArray<any[] | undefined, import("convex/values").VUnion<any, [GenericValidator, GenericValidator, ...GenericValidator[]], "required", any>, "optional">;
|
|
50
|
+
order: import("convex/values").VObject<{
|
|
51
|
+
field: string;
|
|
52
|
+
direction: "asc" | "desc";
|
|
53
|
+
} | undefined, {
|
|
54
|
+
field: import("convex/values").VString<string, "required">;
|
|
55
|
+
direction: import("convex/values").VUnion<"asc" | "desc", [import("convex/values").VLiteral<"asc", "required">, import("convex/values").VLiteral<"desc", "required">], "required", never>;
|
|
56
|
+
}, "optional", "field" | "direction">;
|
|
57
|
+
search: import("convex/values").VObject<{
|
|
58
|
+
index: string;
|
|
59
|
+
query: string;
|
|
60
|
+
} | undefined, {
|
|
61
|
+
index: import("convex/values").VString<string, "required">;
|
|
62
|
+
query: import("convex/values").VString<string, "required">;
|
|
63
|
+
}, "optional", "index" | "query">;
|
|
64
|
+
}, "required", "predicates" | "order" | "search" | "order.field" | "order.direction" | "search.index" | "search.query">;
|
|
65
|
+
/** Optional Query arg for list endpoints (`query?`). */
|
|
66
|
+
export declare const queryArgValidator: import("convex/values").VObject<{
|
|
67
|
+
predicates?: any[] | undefined;
|
|
68
|
+
order?: {
|
|
69
|
+
field: string;
|
|
70
|
+
direction: "asc" | "desc";
|
|
71
|
+
} | undefined;
|
|
72
|
+
search?: {
|
|
73
|
+
index: string;
|
|
74
|
+
query: string;
|
|
75
|
+
} | undefined;
|
|
76
|
+
vector?: any;
|
|
77
|
+
maxScan?: number | undefined;
|
|
78
|
+
indexHint?: string | undefined;
|
|
79
|
+
} | undefined, {
|
|
80
|
+
predicates: import("convex/values").VArray<any[] | undefined, import("convex/values").VUnion<any, [GenericValidator, GenericValidator, ...GenericValidator[]], "required", any>, "optional">;
|
|
81
|
+
order: import("convex/values").VObject<{
|
|
82
|
+
field: string;
|
|
83
|
+
direction: "asc" | "desc";
|
|
84
|
+
} | undefined, {
|
|
85
|
+
field: import("convex/values").VString<string, "required">;
|
|
86
|
+
direction: import("convex/values").VUnion<"asc" | "desc", [import("convex/values").VLiteral<"asc", "required">, import("convex/values").VLiteral<"desc", "required">], "required", never>;
|
|
87
|
+
}, "optional", "field" | "direction">;
|
|
88
|
+
search: import("convex/values").VObject<{
|
|
89
|
+
index: string;
|
|
90
|
+
query: string;
|
|
91
|
+
} | undefined, {
|
|
92
|
+
index: import("convex/values").VString<string, "required">;
|
|
93
|
+
query: import("convex/values").VString<string, "required">;
|
|
94
|
+
}, "optional", "index" | "query">;
|
|
95
|
+
maxScan: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
96
|
+
indexHint: import("convex/values").VString<string | undefined, "optional">;
|
|
97
|
+
vector: import("convex/values").VAny<any, "optional", string>;
|
|
98
|
+
}, "optional", "predicates" | "order" | "search" | "vector" | "maxScan" | "indexHint" | "order.field" | "order.direction" | "search.index" | "search.query" | `vector.${string}`>;
|
|
99
|
+
export declare const maxScanLimitValidator: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { v } from 'convex/values';
|
|
2
|
+
|
|
3
|
+
// packages/@columnus/shared/src/queryValidators.ts
|
|
4
|
+
|
|
5
|
+
// packages/@columnus/shared/src/queryFieldOps.ts
|
|
6
|
+
var PREDICATE_VARIANTS = [
|
|
7
|
+
{
|
|
8
|
+
value: "unknown",
|
|
9
|
+
ops: [
|
|
10
|
+
{ op: "eq", label: "=" },
|
|
11
|
+
{ op: "neq", label: "\u2260" }
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
{ value: "unknownArray", ops: [{ op: "in", label: "in" }] },
|
|
15
|
+
{
|
|
16
|
+
value: "unknown",
|
|
17
|
+
ops: [
|
|
18
|
+
{ op: "gt", label: ">" },
|
|
19
|
+
{ op: "gte", label: "\u2265" },
|
|
20
|
+
{ op: "lt", label: "<" },
|
|
21
|
+
{ op: "lte", label: "\u2264" }
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
{ value: "between", ops: [{ op: "between", label: "between" }] },
|
|
25
|
+
{
|
|
26
|
+
value: "unknownArray",
|
|
27
|
+
ops: [{ op: "containsAll", label: "contains all" }]
|
|
28
|
+
}
|
|
29
|
+
];
|
|
30
|
+
PREDICATE_VARIANTS.flatMap(
|
|
31
|
+
(variant) => variant.ops.map(({ op }) => op)
|
|
32
|
+
);
|
|
33
|
+
new Map(
|
|
34
|
+
PREDICATE_VARIANTS.flatMap((variant) => variant.ops.map(({ op, label }) => [op, label]))
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
// packages/@columnus/shared/src/queryValidators.ts
|
|
38
|
+
var predicateValidators = PREDICATE_VARIANTS.flatMap(
|
|
39
|
+
(variant) => variant.ops.map(
|
|
40
|
+
({ op }) => v.object({
|
|
41
|
+
field: v.string(),
|
|
42
|
+
op: v.literal(op),
|
|
43
|
+
value: variant.value === "unknownArray" ? v.array(v.any()) : variant.value === "between" ? v.object({ min: v.any(), max: v.any() }) : v.any()
|
|
44
|
+
})
|
|
45
|
+
)
|
|
46
|
+
);
|
|
47
|
+
var predicateValidator = v.union(
|
|
48
|
+
...predicateValidators
|
|
49
|
+
);
|
|
50
|
+
var queryOrderValidator = v.object({
|
|
51
|
+
field: v.string(),
|
|
52
|
+
direction: v.union(v.literal("asc"), v.literal("desc"))
|
|
53
|
+
});
|
|
54
|
+
var querySearchValidator = v.object({
|
|
55
|
+
index: v.string(),
|
|
56
|
+
query: v.string()
|
|
57
|
+
});
|
|
58
|
+
var queryValidator = v.object({
|
|
59
|
+
predicates: v.optional(v.array(predicateValidator)),
|
|
60
|
+
order: v.optional(queryOrderValidator),
|
|
61
|
+
search: v.optional(querySearchValidator),
|
|
62
|
+
maxScan: v.optional(v.number()),
|
|
63
|
+
indexHint: v.optional(v.string()),
|
|
64
|
+
vector: v.optional(v.any())
|
|
65
|
+
});
|
|
66
|
+
var clampQueryValidator = v.object({
|
|
67
|
+
predicates: v.optional(v.array(predicateValidator)),
|
|
68
|
+
order: v.optional(queryOrderValidator),
|
|
69
|
+
search: v.optional(querySearchValidator)
|
|
70
|
+
});
|
|
71
|
+
var queryArgValidator = v.optional(queryValidator);
|
|
72
|
+
var maxScanLimitValidator = v.optional(v.number());
|
|
73
|
+
|
|
74
|
+
export { clampQueryValidator, maxScanLimitValidator, predicateValidator, queryArgValidator, queryValidator };
|
|
75
|
+
//# sourceMappingURL=queryValidators.js.map
|
|
76
|
+
//# sourceMappingURL=queryValidators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/queryFieldOps.ts","../src/queryValidators.ts"],"names":[],"mappings":"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","file":"queryValidators.js","sourcesContent":["import type { FieldType, Table } from \"./schemaTypes.ts\";\n\n/** One edit surface for each predicate operation's wire shape and UI label. */\nexport const PREDICATE_VARIANTS = [\n {\n value: \"unknown\",\n ops: [\n { op: \"eq\", label: \"=\" },\n { op: \"neq\", label: \"≠\" },\n ],\n },\n { value: \"unknownArray\", ops: [{ op: \"in\", label: \"in\" }] },\n {\n value: \"unknown\",\n ops: [\n { op: \"gt\", label: \">\" },\n { op: \"gte\", label: \"≥\" },\n { op: \"lt\", label: \"<\" },\n { op: \"lte\", label: \"≤\" },\n ],\n },\n { value: \"between\", ops: [{ op: \"between\", label: \"between\" }] },\n {\n value: \"unknownArray\",\n ops: [{ op: \"containsAll\", label: \"contains all\" }],\n },\n] as const;\n\ntype PredicateOperator = (typeof PREDICATE_VARIANTS)[number][\"ops\"][number];\nexport type PredicateOp = PredicateOperator[\"op\"];\nexport const PREDICATE_OPS = PREDICATE_VARIANTS.flatMap((variant) =>\n variant.ops.map(({ op }) => op),\n) as PredicateOp[];\n\nconst PREDICATE_OP_LABELS = new Map<PredicateOp, string>(\n PREDICATE_VARIANTS.flatMap((variant) => variant.ops.map(({ op, label }) => [op, label] as const)),\n);\n\nexport function predicateOpLabel(op: PredicateOp): string {\n return PREDICATE_OP_LABELS.get(op) ?? op;\n}\n\nexport type FieldOpSupport = {\n eq: boolean;\n neq: boolean;\n in: boolean;\n ranges: boolean;\n sort: boolean;\n containsAll: boolean;\n};\n\nconst NONE: FieldOpSupport = {\n eq: false,\n neq: false,\n in: false,\n ranges: false,\n sort: false,\n containsAll: false,\n};\n\nconst SCALAR_ORDERED: FieldOpSupport = {\n eq: true,\n neq: true,\n in: true,\n ranges: true,\n sort: true,\n containsAll: false,\n};\n\nconst SCALAR_EQ: FieldOpSupport = {\n eq: true,\n neq: true,\n in: true,\n ranges: false,\n sort: true,\n containsAll: false,\n};\n\n/** Resolve field type for user fields and system fields (`_id`, `_creationTime`). */\nexport function resolveQueryFieldType(\n table: Pick<Table, \"name\" | \"fields\">,\n field: string,\n): FieldType | null {\n if (field === \"_id\") return { kind: \"id\", table: table.name };\n if (field === \"_creationTime\") return { kind: \"number\" };\n return table.fields.find((f) => f.name === field)?.type ?? null;\n}\n\nfunction comparableUnionKind(t: FieldType): FieldType | null {\n if (t.kind !== \"union\" || t.options.length === 0) return null;\n const first = t.options[0]!;\n if (!t.options.every((o) => o.kind === first.kind)) return null;\n if (\n first.kind === \"string\" ||\n first.kind === \"number\" ||\n first.kind === \"bigint\" ||\n first.kind === \"boolean\" ||\n first.kind === \"date\" ||\n first.kind === \"datetime\" ||\n first.kind === \"id\"\n ) {\n return first;\n }\n if (first.kind === \"literal\") {\n const v = first.value;\n if (typeof v === \"string\") return { kind: \"string\" };\n if (typeof v === \"number\") return { kind: \"number\" };\n if (typeof v === \"boolean\") return { kind: \"boolean\" };\n }\n return null;\n}\n\n/** Effective type used for operator eligibility (unwraps homogeneous unions). */\nexport function effectiveQueryFieldType(t: FieldType): FieldType | null {\n if (t.kind === \"union\") return comparableUnionKind(t);\n return t;\n}\n\nexport function fieldOpSupport(type: FieldType): FieldOpSupport {\n const t = effectiveQueryFieldType(type);\n if (!t) return NONE;\n\n switch (t.kind) {\n case \"string\":\n case \"number\":\n case \"bigint\":\n case \"date\":\n case \"datetime\":\n return SCALAR_ORDERED;\n case \"boolean\":\n case \"id\":\n case \"literal\":\n return SCALAR_EQ;\n case \"array\":\n if (\n t.element.kind === \"id\" ||\n t.element.kind === \"string\" ||\n t.element.kind === \"number\" ||\n t.element.kind === \"boolean\" ||\n t.element.kind === \"literal\"\n ) {\n return { ...NONE, containsAll: true };\n }\n return NONE;\n default:\n return NONE;\n }\n}\n\nexport function opAllowedForType(type: FieldType, op: PredicateOp): boolean {\n const support = fieldOpSupport(type);\n switch (op) {\n case \"eq\":\n return support.eq;\n case \"neq\":\n return support.neq;\n case \"in\":\n return support.in;\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n case \"between\":\n return support.ranges;\n case \"containsAll\":\n return support.containsAll;\n default: {\n const _exhaustive: never = op;\n return _exhaustive;\n }\n }\n}\n\nexport function fieldSupportsSort(type: FieldType): boolean {\n return fieldOpSupport(type).sort;\n}\n\nexport function isRangeOp(op: PredicateOp): boolean {\n return op === \"gt\" || op === \"gte\" || op === \"lt\" || op === \"lte\" || op === \"between\";\n}\n","import { type GenericValidator, v } from \"convex/values\";\nimport { PREDICATE_VARIANTS } from \"./queryFieldOps.ts\";\n\nconst predicateValidators = PREDICATE_VARIANTS.flatMap((variant) =>\n variant.ops.map(({ op }) =>\n v.object({\n field: v.string(),\n op: v.literal(op),\n value:\n variant.value === \"unknownArray\"\n ? v.array(v.any())\n : variant.value === \"between\"\n ? v.object({ min: v.any(), max: v.any() })\n : v.any(),\n }),\n ),\n);\n\nexport const predicateValidator = v.union(\n ...(predicateValidators as unknown as [\n GenericValidator,\n GenericValidator,\n ...GenericValidator[],\n ]),\n);\n\nconst queryOrderValidator = v.object({\n field: v.string(),\n direction: v.union(v.literal(\"asc\"), v.literal(\"desc\")),\n});\n\nconst querySearchValidator = v.object({\n index: v.string(),\n query: v.string(),\n});\n\n/** Canonical Convex validator for caller-supplied Query values. */\nexport const queryValidator = v.object({\n predicates: v.optional(v.array(predicateValidator)),\n order: v.optional(queryOrderValidator),\n search: v.optional(querySearchValidator),\n maxScan: v.optional(v.number()),\n indexHint: v.optional(v.string()),\n vector: v.optional(v.any()),\n});\n\n/** Convex validator for profile/share clamp Query (predicates + optional defaults). */\nexport const clampQueryValidator = v.object({\n predicates: v.optional(v.array(predicateValidator)),\n order: v.optional(queryOrderValidator),\n search: v.optional(querySearchValidator),\n});\n\n/** Optional Query arg for list endpoints (`query?`). */\nexport const queryArgValidator = v.optional(queryValidator);\n\nexport const maxScanLimitValidator = v.optional(v.number());\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type ReadApiQueryKind = "list" | "get";
|
|
2
|
+
/** Deploy-generated export name (`listProducts`, `getProducts`, …). */
|
|
3
|
+
export declare function readApiQueryExportName(kind: ReadApiQueryKind, tableName: string): string;
|
|
4
|
+
export type ProposeApiOp = "insert" | "update" | "delete";
|
|
5
|
+
/** Deploy-generated propose export name (`proposeInsertProducts`, …). */
|
|
6
|
+
export declare function proposeApiExportName(op: ProposeApiOp, tableName: string): string;
|
|
7
|
+
/** Convex module folder under `columnus/read/{segment}/`. */
|
|
8
|
+
export declare function readApiQueryModuleSegment(profileSlug: string): string;
|
|
9
|
+
/** `anyApi` path emitted by `columnus-api pull` / read-api-refs codegen. */
|
|
10
|
+
export declare function readApiAnyApiPath(profileSlug: string, kind: ReadApiQueryKind, tableName: string): string;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// packages/@columnus/shared/src/apiProfileSlug.ts
|
|
2
|
+
function apiProfileSlugToConvexModuleSegment(slug) {
|
|
3
|
+
return slug.replace(/-/g, "_");
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
// packages/@columnus/shared/src/readApiQuery.ts
|
|
7
|
+
function readApiQueryExportName(kind, tableName) {
|
|
8
|
+
return `${kind}${tableName}`;
|
|
9
|
+
}
|
|
10
|
+
function proposeApiExportName(op, tableName) {
|
|
11
|
+
return `propose${op[0].toUpperCase()}${op.slice(1)}${tableName}`;
|
|
12
|
+
}
|
|
13
|
+
function readApiQueryModuleSegment(profileSlug) {
|
|
14
|
+
return apiProfileSlugToConvexModuleSegment(profileSlug);
|
|
15
|
+
}
|
|
16
|
+
function readApiAnyApiPath(profileSlug, kind, tableName) {
|
|
17
|
+
const segment = readApiQueryModuleSegment(profileSlug);
|
|
18
|
+
const exportName = readApiQueryExportName(kind, tableName);
|
|
19
|
+
return `anyApi.columnus.read.${segment}.${exportName}.${exportName}`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { proposeApiExportName, readApiAnyApiPath, readApiQueryExportName, readApiQueryModuleSegment };
|
|
23
|
+
//# sourceMappingURL=readApiQuery.js.map
|
|
24
|
+
//# sourceMappingURL=readApiQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/apiProfileSlug.ts","../src/readApiQuery.ts"],"names":[],"mappings":";AAkDO,SAAS,oCAAoC,IAAA,EAAsB;AACxE,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAC/B;;;AC/CO,SAAS,sBAAA,CAAuB,MAAwB,SAAA,EAA2B;AACxF,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,SAAS,CAAA,CAAA;AAC5B;AAKO,SAAS,oBAAA,CAAqB,IAAkB,SAAA,EAA2B;AAChF,EAAA,OAAO,CAAA,OAAA,EAAU,EAAA,CAAG,CAAC,CAAA,CAAG,WAAA,EAAa,CAAA,EAAG,EAAA,CAAG,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,SAAS,CAAA,CAAA;AACjE;AAGO,SAAS,0BAA0B,WAAA,EAA6B;AACrE,EAAA,OAAO,oCAAoC,WAAW,CAAA;AACxD;AAGO,SAAS,iBAAA,CACd,WAAA,EACA,IAAA,EACA,SAAA,EACQ;AACR,EAAA,MAAM,OAAA,GAAU,0BAA0B,WAAW,CAAA;AACrD,EAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,IAAA,EAAM,SAAS,CAAA;AACzD,EAAA,OAAO,CAAA,qBAAA,EAAwB,OAAO,CAAA,CAAA,EAAI,UAAU,IAAI,UAAU,CAAA,CAAA;AACpE","file":"readApiQuery.js","sourcesContent":["/** URL-safe profile slug for `api.columnus.read.{slug}.*` (plan 004). */\nexport const API_PROFILE_SLUG_RE = /^[a-z][a-z0-9-]{0,47}$/;\n\nexport function isApiProfileSlug(slug: string): boolean {\n return API_PROFILE_SLUG_RE.test(slug);\n}\n\n/** Derive a slug from a human display name. */\nexport function slugifyApiProfileName(name: string): string {\n const lowered = name.trim().toLowerCase();\n const hyphenated = lowered\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/-+/g, \"-\");\n let slug = hyphenated.slice(0, 48);\n if (!slug) slug = \"profile\";\n if (!/^[a-z]/.test(slug)) slug = `p-${slug}`.slice(0, 48);\n return slug.slice(0, 48);\n}\n\nexport function assertApiProfileSlug(slug: string): void {\n if (!isApiProfileSlug(slug)) {\n throw new Error(\n \"Profile slug must start with a letter and contain only lowercase letters, numbers, and hyphens (max 48 characters).\",\n );\n }\n}\n\n/** Reject profile slug edits after create (plan 006 D13). */\nexport function profileSlugChangeError(\n existingSlug: string,\n nextSlug: string | undefined,\n): string | undefined {\n if (nextSlug === undefined) return undefined;\n const trimmed = nextSlug.trim();\n if (trimmed && trimmed !== existingSlug) {\n return \"Profile slug cannot be changed after creation\";\n }\n return undefined;\n}\n\nexport function assertProfileSlugUnchanged(\n existingSlug: string,\n nextSlug: string | undefined,\n): void {\n const message = profileSlugChangeError(existingSlug, nextSlug);\n if (message) throw new Error(message);\n}\n\n/** Convex module path segment (`columnus/read/{segment}/…`). Hyphens are invalid in paths. */\nexport function apiProfileSlugToConvexModuleSegment(slug: string): string {\n return slug.replace(/-/g, \"_\");\n}\n","import { apiProfileSlugToConvexModuleSegment } from \"./apiProfileSlug.ts\";\n\nexport type ReadApiQueryKind = \"list\" | \"get\";\n\n/** Deploy-generated export name (`listProducts`, `getProducts`, …). */\nexport function readApiQueryExportName(kind: ReadApiQueryKind, tableName: string): string {\n return `${kind}${tableName}`;\n}\n\nexport type ProposeApiOp = \"insert\" | \"update\" | \"delete\";\n\n/** Deploy-generated propose export name (`proposeInsertProducts`, …). */\nexport function proposeApiExportName(op: ProposeApiOp, tableName: string): string {\n return `propose${op[0]!.toUpperCase()}${op.slice(1)}${tableName}`;\n}\n\n/** Convex module folder under `columnus/read/{segment}/`. */\nexport function readApiQueryModuleSegment(profileSlug: string): string {\n return apiProfileSlugToConvexModuleSegment(profileSlug);\n}\n\n/** `anyApi` path emitted by `columnus-api pull` / read-api-refs codegen. */\nexport function readApiAnyApiPath(\n profileSlug: string,\n kind: ReadApiQueryKind,\n tableName: string,\n): string {\n const segment = readApiQueryModuleSegment(profileSlug);\n const exportName = readApiQueryExportName(kind, tableName);\n return `anyApi.columnus.read.${segment}.${exportName}.${exportName}`;\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type Field, type Table } from "./schemaTypes.ts";
|
|
2
|
+
import type { Query } from "./queryTypes.ts";
|
|
3
|
+
export type RecordTableDisplayValueMap = Map<string, {
|
|
4
|
+
id?: string;
|
|
5
|
+
preview?: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare const RECORD_TABLE_DEFAULT_FIELD_COUNT = 5;
|
|
8
|
+
export declare function defaultRecordTableFieldNames(table: Table): string[];
|
|
9
|
+
/** Field names referenced by Query predicates (for locking embed columns). */
|
|
10
|
+
export declare function queryPredicateFieldNames(query: Query | null): string[];
|
|
11
|
+
export declare function parseRecordTableFieldsJson(fieldsJson: string): string[];
|
|
12
|
+
export declare function stringifyRecordTableFields(fields: string[]): string;
|
|
13
|
+
/** Discretionary field names stored on the block (empty → first five defaults). */
|
|
14
|
+
export declare function discretionaryRecordTableFieldNames(table: Table, fieldsJson: string): string[];
|
|
15
|
+
/** Manifest-ordered data columns: discretionary ∪ query predicate fields (deduped). `_id` is separate. */
|
|
16
|
+
export declare function resolveRecordTableVisibleFields(table: Table, fieldsJson: string, query: Query | null): Field[];
|
|
17
|
+
export declare function collectQueryRefIds(table: Table, query: Query | null): Map<string, Set<string>>;
|
|
18
|
+
/** @deprecated Prefer {@link collectQueryRefIds}. */
|
|
19
|
+
export declare function collectFilterRefIds(table: Table, query: Query | null): Map<string, Set<string>>;
|
|
20
|
+
export declare function formatFilterEqDisplayValue(field: Field | undefined, value: unknown, displayByTable: Map<string, RecordTableDisplayValueMap>): string;
|
|
21
|
+
export declare function formatRecordTableQuerySummary(table: Table, query: Query | null, displayByTable: Map<string, RecordTableDisplayValueMap>): string;
|