@party-stack/foundry-ontology 0.18.1 → 0.20.0
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/README.md +56 -16
- package/lib/adapter/backend.d.ts +35 -0
- package/lib/adapter/backend.d.ts.map +1 -0
- package/lib/adapter/backend.js +210 -0
- package/lib/adapter/backend.js.map +1 -0
- package/lib/adapter/encrypted.d.ts +12 -0
- package/lib/adapter/encrypted.d.ts.map +1 -0
- package/lib/adapter/encrypted.js +79 -0
- package/lib/adapter/encrypted.js.map +1 -0
- package/lib/adapter/foundryActionError.d.ts +7 -0
- package/lib/adapter/foundryActionError.d.ts.map +1 -0
- package/lib/adapter/foundryActionError.js +61 -0
- package/lib/adapter/foundryActionError.js.map +1 -0
- package/lib/adapter/foundryActionValidation.d.ts +4 -3
- package/lib/adapter/foundryActionValidation.d.ts.map +1 -1
- package/lib/adapter/foundryActionValidation.js +71 -25
- package/lib/adapter/foundryActionValidation.js.map +1 -1
- package/lib/adapter/foundryCodec.d.ts +3 -5
- package/lib/adapter/foundryCodec.d.ts.map +1 -1
- package/lib/adapter/foundryCodec.js +19 -7
- package/lib/adapter/foundryCodec.js.map +1 -1
- package/lib/adapter/foundryObjectSearch.d.ts +13 -0
- package/lib/adapter/foundryObjectSearch.d.ts.map +1 -0
- package/lib/adapter/foundryObjectSearch.js +57 -0
- package/lib/adapter/foundryObjectSearch.js.map +1 -0
- package/lib/adapter/index.d.ts +3 -4
- package/lib/adapter/index.js +3 -4
- package/lib/adapter/likeFilter.d.ts +10 -0
- package/lib/adapter/likeFilter.d.ts.map +1 -0
- package/lib/adapter/likeFilter.js +87 -0
- package/lib/adapter/likeFilter.js.map +1 -0
- package/lib/adapter/makeFoundryOntologyBackend.d.ts +76 -0
- package/lib/adapter/makeFoundryOntologyBackend.d.ts.map +1 -0
- package/lib/adapter/makeFoundryOntologyBackend.js +505 -0
- package/lib/adapter/makeFoundryOntologyBackend.js.map +1 -0
- package/lib/adapter/subsetFilter.d.ts +14 -0
- package/lib/adapter/subsetFilter.d.ts.map +1 -0
- package/lib/adapter/subsetFilter.js +105 -0
- package/lib/adapter/subsetFilter.js.map +1 -0
- package/lib/adapter/uploads.d.ts +25 -0
- package/lib/adapter/uploads.d.ts.map +1 -0
- package/lib/adapter/uploads.js +78 -0
- package/lib/adapter/uploads.js.map +1 -0
- package/lib/backend.d.ts +80 -0
- package/lib/backend.d.ts.map +1 -0
- package/lib/backend.js +34 -0
- package/lib/backend.js.map +1 -0
- package/lib/config/index.d.ts +8 -12
- package/lib/config/index.d.ts.map +1 -1
- package/lib/config/index.js +49 -52
- package/lib/config/index.js.map +1 -1
- package/lib/connectionOptions.d.ts +9 -0
- package/lib/connectionOptions.d.ts.map +1 -0
- package/lib/connectionOptions.js +1 -0
- package/lib/context.d.ts +21 -0
- package/lib/context.d.ts.map +1 -0
- package/lib/context.js +16 -0
- package/lib/context.js.map +1 -0
- package/lib/index.d.ts +7 -7
- package/lib/index.js +6 -7
- package/lib/meta/backend.d.ts +10 -0
- package/lib/meta/backend.d.ts.map +1 -0
- package/lib/meta/backend.js +161 -0
- package/lib/meta/backend.js.map +1 -0
- package/lib/meta/convertMetaActionType.d.ts +3 -2
- package/lib/meta/convertMetaActionType.d.ts.map +1 -1
- package/lib/meta/convertMetaActionType.js +3 -3
- package/lib/meta/convertMetaActionType.js.map +1 -1
- package/lib/meta/convertMetaLinkType.d.ts +2 -2
- package/lib/meta/convertMetaLinkType.d.ts.map +1 -1
- package/lib/meta/convertMetaLinkType.js +13 -13
- package/lib/meta/convertMetaLinkType.js.map +1 -1
- package/lib/meta/convertMetaObjectType.d.ts +2 -2
- package/lib/meta/convertMetaObjectType.d.ts.map +1 -1
- package/lib/meta/convertMetaObjectType.js +5 -1
- package/lib/meta/convertMetaObjectType.js.map +1 -1
- package/lib/meta/convertMetaQueryFunctionType.d.ts +1 -1
- package/lib/meta/convertMetaQueryFunctionType.js.map +1 -1
- package/lib/meta/convertMetaTypeDef.d.ts +1 -1
- package/lib/meta/convertMetaTypeDef.d.ts.map +1 -1
- package/lib/meta/convertMetaTypeDef.js +7 -1
- package/lib/meta/convertMetaTypeDef.js.map +1 -1
- package/lib/meta/convertMetaValueType.d.ts +2 -2
- package/lib/meta/convertMetaValueType.d.ts.map +1 -1
- package/lib/meta/convertMetaValueType.js.map +1 -1
- package/lib/meta/convertOmsActionParameterMetadata.d.ts +1 -1
- package/lib/meta/convertOmsActionParameterMetadata.js +1 -1
- package/lib/meta/convertOmsActionParameterMetadata.js.map +1 -1
- package/lib/meta/index.d.ts +2 -4
- package/lib/meta/index.js +2 -4
- package/lib/meta/listObjectTypes.d.ts +6 -0
- package/lib/meta/listObjectTypes.d.ts.map +1 -0
- package/lib/meta/listObjectTypes.js +13 -0
- package/lib/meta/listObjectTypes.js.map +1 -0
- package/lib/meta/loadActionTypeOmsMetadata.d.ts +1 -0
- package/lib/meta/loadActions.d.ts +7 -0
- package/lib/meta/loadActions.d.ts.map +1 -0
- package/lib/meta/loadActions.js +20 -0
- package/lib/meta/loadActions.js.map +1 -0
- package/lib/meta/loadEntities.d.ts +9 -0
- package/lib/meta/loadEntities.d.ts.map +1 -0
- package/lib/meta/loadEntities.js +73 -0
- package/lib/meta/loadEntities.js.map +1 -0
- package/lib/meta/loadQueryFunctions.d.ts +11 -0
- package/lib/meta/loadQueryFunctions.d.ts.map +1 -0
- package/lib/meta/loadQueryFunctions.js +18 -0
- package/lib/meta/loadQueryFunctions.js.map +1 -0
- package/lib/meta/planMetaLookup.d.ts +12 -0
- package/lib/meta/planMetaLookup.d.ts.map +1 -0
- package/lib/meta/planMetaLookup.js +44 -0
- package/lib/meta/planMetaLookup.js.map +1 -0
- package/lib/platform.d.ts +78 -0
- package/lib/platform.d.ts.map +1 -0
- package/lib/platform.js +116 -0
- package/lib/platform.js.map +1 -0
- package/lib/platformCollections.d.ts +68 -0
- package/lib/platformCollections.d.ts.map +1 -0
- package/lib/platformCollections.js +7 -0
- package/lib/platformCollections.js.map +1 -0
- package/lib/serviceConnector.d.ts +8 -0
- package/lib/serviceConnector.d.ts.map +1 -0
- package/lib/serviceConnector.js +105 -0
- package/lib/serviceConnector.js.map +1 -0
- package/lib/stagedWrites.d.ts +3 -2
- package/lib/stagedWrites.d.ts.map +1 -1
- package/lib/stagedWrites.js +30 -3
- package/lib/stagedWrites.js.map +1 -1
- package/lib/users/admin.d.ts +105 -0
- package/lib/users/admin.d.ts.map +1 -0
- package/lib/users/admin.js +35 -0
- package/lib/users/admin.js.map +1 -0
- package/lib/users/createFoundryUsersIntegration.d.ts +2 -2
- package/lib/users/createFoundryUsersIntegration.d.ts.map +1 -1
- package/lib/users/createFoundryUsersIntegration.js +4 -6
- package/lib/users/createFoundryUsersIntegration.js.map +1 -1
- package/lib/users/foundryUser.d.ts +2 -2
- package/lib/users/foundryUser.js +1 -1
- package/lib/users/foundryUser.js.map +1 -1
- package/lib/users/index.d.ts +2 -3
- package/lib/users/index.js +2 -3
- package/lib/users/loadUserSubset.d.ts +8 -0
- package/lib/users/loadUserSubset.d.ts.map +1 -0
- package/lib/users/loadUserSubset.js +166 -0
- package/lib/users/loadUserSubset.js.map +1 -0
- package/lib/utils/AsyncIterable.d.ts +1 -1
- package/lib/utils/AsyncIterable.d.ts.map +1 -1
- package/lib/utils/AsyncIterable.js +11 -0
- package/lib/utils/AsyncIterable.js.map +1 -1
- package/package.json +17 -16
- package/lib/adapter/convertLoadSubsetOptions.d.ts +0 -8
- package/lib/adapter/convertLoadSubsetOptions.d.ts.map +0 -1
- package/lib/adapter/convertLoadSubsetOptions.js +0 -178
- package/lib/adapter/convertLoadSubsetOptions.js.map +0 -1
- package/lib/adapter/createFoundryOntologyBackendAdapter.d.ts +0 -29
- package/lib/adapter/createFoundryOntologyBackendAdapter.d.ts.map +0 -1
- package/lib/adapter/createFoundryOntologyBackendAdapter.js +0 -311
- package/lib/adapter/createFoundryOntologyBackendAdapter.js.map +0 -1
- package/lib/adapter/objectCollectionOptions.d.ts +0 -31
- package/lib/adapter/objectCollectionOptions.d.ts.map +0 -1
- package/lib/adapter/objectCollectionOptions.js +0 -448
- package/lib/adapter/objectCollectionOptions.js.map +0 -1
- package/lib/config/applyAttachmentConstraintOverrides.d.ts +0 -10
- package/lib/config/applyAttachmentConstraintOverrides.d.ts.map +0 -1
- package/lib/config/applyAttachmentConstraintOverrides.js +0 -50
- package/lib/config/applyAttachmentConstraintOverrides.js.map +0 -1
- package/lib/connection.d.ts +0 -38
- package/lib/connection.d.ts.map +0 -1
- package/lib/connection.js +0 -195
- package/lib/connection.js.map +0 -1
- package/lib/installation/createFoundryBackendInstallation.d.ts +0 -29
- package/lib/installation/createFoundryBackendInstallation.d.ts.map +0 -1
- package/lib/installation/createFoundryBackendInstallation.js +0 -60
- package/lib/installation/createFoundryBackendInstallation.js.map +0 -1
- package/lib/installation/index.d.ts +0 -2
- package/lib/installation/index.js +0 -2
- package/lib/meta/actionTypeCollectionOptions.d.ts +0 -14
- package/lib/meta/actionTypeCollectionOptions.d.ts.map +0 -1
- package/lib/meta/actionTypeCollectionOptions.js +0 -58
- package/lib/meta/actionTypeCollectionOptions.js.map +0 -1
- package/lib/meta/convertActionTypeLoadSubsetOptions.d.ts +0 -7
- package/lib/meta/convertActionTypeLoadSubsetOptions.d.ts.map +0 -1
- package/lib/meta/convertActionTypeLoadSubsetOptions.js +0 -84
- package/lib/meta/convertActionTypeLoadSubsetOptions.js.map +0 -1
- package/lib/meta/createFoundryMetaOntologyBackendAdapter.d.ts +0 -11
- package/lib/meta/createFoundryMetaOntologyBackendAdapter.d.ts.map +0 -1
- package/lib/meta/createFoundryMetaOntologyBackendAdapter.js +0 -43
- package/lib/meta/createFoundryMetaOntologyBackendAdapter.js.map +0 -1
- package/lib/meta/entityCollectionOptions.d.ts +0 -24
- package/lib/meta/entityCollectionOptions.d.ts.map +0 -1
- package/lib/meta/entityCollectionOptions.js +0 -69
- package/lib/meta/entityCollectionOptions.js.map +0 -1
- package/lib/meta/queryFunctionTypeCollectionOptions.d.ts +0 -12
- package/lib/meta/queryFunctionTypeCollectionOptions.d.ts.map +0 -1
- package/lib/meta/queryFunctionTypeCollectionOptions.js +0 -59
- package/lib/meta/queryFunctionTypeCollectionOptions.js.map +0 -1
- package/lib/users/createFoundryAdminOntologyRoute.d.ts +0 -55
- package/lib/users/createFoundryAdminOntologyRoute.d.ts.map +0 -1
- package/lib/users/createFoundryAdminOntologyRoute.js +0 -33
- package/lib/users/createFoundryAdminOntologyRoute.js.map +0 -1
- package/lib/users/userCollectionOptions.d.ts +0 -24
- package/lib/users/userCollectionOptions.d.ts.map +0 -1
- package/lib/users/userCollectionOptions.js +0 -94
- package/lib/users/userCollectionOptions.js.map +0 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { convertLikeFilter } from "./likeFilter.js";
|
|
2
|
+
import { isField } from "@party-stack/ontology-storage/tables";
|
|
3
|
+
//#region src/adapter/subsetFilter.ts
|
|
4
|
+
const scalar = (value) => value instanceof Date ? value.toISOString() : typeof value === "object" && value !== null && "toString" in value ? value.toString() : value;
|
|
5
|
+
/** Conservative candidate filtering shared by HTTP reads and WebSocket watches.
|
|
6
|
+
* Unsupported terms broaden membership, including unverified negation semantics.
|
|
7
|
+
* Sort/limit/cursors stay local so watches include future window entrants.
|
|
8
|
+
*/
|
|
9
|
+
function translate(predicate, recurse = translate) {
|
|
10
|
+
if (predicate.op === "and" || predicate.op === "or") {
|
|
11
|
+
const children = predicate.predicates.map((child) => recurse(child));
|
|
12
|
+
if (predicate.op === "or" && children.some((child) => !child)) return;
|
|
13
|
+
const supported = children.filter((child) => child !== void 0);
|
|
14
|
+
if (!supported.length) return;
|
|
15
|
+
return {
|
|
16
|
+
type: predicate.op,
|
|
17
|
+
value: supported
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (predicate.op === "not" || predicate.op === "ne") return;
|
|
21
|
+
if (predicate.op === "like" || predicate.op === "ilike") {
|
|
22
|
+
if (!isField(predicate.left) || predicate.left.path.length !== 1 || typeof predicate.right !== "string") return;
|
|
23
|
+
return convertLikeFilter([...predicate.left.path], predicate.right, true).query;
|
|
24
|
+
}
|
|
25
|
+
if (predicate.op === "contains") {
|
|
26
|
+
if (predicate.left.path.length !== 1 || isField(predicate.right) || predicate.right == null || typeof predicate.right === "bigint") return;
|
|
27
|
+
return {
|
|
28
|
+
type: "contains",
|
|
29
|
+
field: predicate.left.path[0],
|
|
30
|
+
value: scalar(predicate.right)
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
let left = predicate.left;
|
|
34
|
+
if (predicate.op === "in") {
|
|
35
|
+
if (!isField(left) || left.path.length !== 1 || predicate.values.some((value) => value == null || typeof value === "bigint")) return;
|
|
36
|
+
return {
|
|
37
|
+
type: "in",
|
|
38
|
+
field: left.path[0],
|
|
39
|
+
value: predicate.values.map(scalar)
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
let right = predicate.right;
|
|
43
|
+
let operation = predicate.op;
|
|
44
|
+
if (isField(right) && !isField(left)) {
|
|
45
|
+
[left, right] = [right, left];
|
|
46
|
+
operation = {
|
|
47
|
+
eq: "eq",
|
|
48
|
+
gt: "lt",
|
|
49
|
+
gte: "lte",
|
|
50
|
+
lt: "gt",
|
|
51
|
+
lte: "gte"
|
|
52
|
+
}[operation];
|
|
53
|
+
}
|
|
54
|
+
if (!isField(left) || isField(right) || left.path.length !== 1 || right == null || typeof right === "bigint") return;
|
|
55
|
+
const query = {
|
|
56
|
+
type: operation,
|
|
57
|
+
field: left.path[0],
|
|
58
|
+
value: scalar(right)
|
|
59
|
+
};
|
|
60
|
+
return operation === "eq" ? query : {
|
|
61
|
+
type: "or",
|
|
62
|
+
value: [query, {
|
|
63
|
+
type: "isNull",
|
|
64
|
+
field: left.path[0],
|
|
65
|
+
value: true
|
|
66
|
+
}]
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const subsetFilter = (predicate) => predicate ? translate(predicate) : void 0;
|
|
70
|
+
/** Report effective placement, including supported OR branches that could not safely be sent. */
|
|
71
|
+
function analyzeSubsetFilter(predicate) {
|
|
72
|
+
const translated = /* @__PURE__ */ new Map();
|
|
73
|
+
const visit = (predicate) => {
|
|
74
|
+
const query = translate(predicate, visit);
|
|
75
|
+
translated.set(predicate, query);
|
|
76
|
+
return query;
|
|
77
|
+
};
|
|
78
|
+
const query = predicate ? visit(predicate) : void 0;
|
|
79
|
+
const predicates = [];
|
|
80
|
+
const report = (predicate, path, allowed) => {
|
|
81
|
+
const sent = allowed && translated.get(predicate) !== void 0;
|
|
82
|
+
if (predicate.op === "and" || predicate.op === "or") predicate.predicates.forEach((child, index) => report(child, [...path, index], sent));
|
|
83
|
+
else if (predicate.op === "not") report(predicate.predicate, [...path, 0], false);
|
|
84
|
+
else predicates.push({
|
|
85
|
+
path,
|
|
86
|
+
execution: !sent ? "adapter" : [
|
|
87
|
+
"like",
|
|
88
|
+
"ilike",
|
|
89
|
+
"gt",
|
|
90
|
+
"gte",
|
|
91
|
+
"lt",
|
|
92
|
+
"lte"
|
|
93
|
+
].includes(predicate.op) ? "candidate" : "source"
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
if (predicate) report(predicate, [], true);
|
|
97
|
+
return {
|
|
98
|
+
query,
|
|
99
|
+
predicates
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//#endregion
|
|
103
|
+
export { analyzeSubsetFilter, subsetFilter };
|
|
104
|
+
|
|
105
|
+
//# sourceMappingURL=subsetFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subsetFilter.js","names":[],"sources":["../../src/adapter/subsetFilter.ts"],"sourcesContent":["import { isField } from \"@party-stack/ontology-storage/tables\";\nimport { convertLikeFilter } from \"./likeFilter.js\";\nimport type { SearchJsonQueryV2 } from \"@osdk/foundry.ontologies\";\nimport type { SourceQueryPlan } from \"@party-stack/ontology-backend\";\nimport type { Predicate, Scalar } from \"@party-stack/ontology-storage\";\n\nconst scalar = (value: Scalar): unknown =>\n value instanceof Date\n ? value.toISOString()\n : typeof value === \"object\" && value !== null && \"toString\" in value\n ? value.toString()\n : value;\n\n/** Conservative candidate filtering shared by HTTP reads and WebSocket watches.\n * Unsupported terms broaden membership, including unverified negation semantics.\n * Sort/limit/cursors stay local so watches include future window entrants.\n */\nfunction translate(\n predicate: Predicate,\n recurse: (predicate: Predicate) => SearchJsonQueryV2 | undefined = translate\n): SearchJsonQueryV2 | undefined {\n if (predicate.op === \"and\" || predicate.op === \"or\") {\n const children = predicate.predicates.map((child) => recurse(child));\n if (predicate.op === \"or\" && children.some((child) => !child)) return;\n const supported = children.filter((child): child is SearchJsonQueryV2 => child !== undefined);\n if (!supported.length) return;\n return { type: predicate.op, value: supported };\n }\n if (predicate.op === \"not\" || predicate.op === \"ne\") return;\n if (predicate.op === \"like\" || predicate.op === \"ilike\") {\n if (\n !isField(predicate.left) ||\n predicate.left.path.length !== 1 ||\n typeof predicate.right !== \"string\"\n )\n return;\n // Portable LIKE follows TanStack's literal-backslash semantics. Foundry\n // may overfetch; exact storage evaluation still precedes pagination.\n return convertLikeFilter([...predicate.left.path], predicate.right, true).query;\n }\n if (predicate.op === \"contains\") {\n if (\n predicate.left.path.length !== 1 ||\n isField(predicate.right) ||\n predicate.right == null ||\n typeof predicate.right === \"bigint\"\n )\n return;\n return { type: \"contains\", field: predicate.left.path[0]!, value: scalar(predicate.right) };\n }\n let left = predicate.left;\n if (predicate.op === \"in\") {\n if (\n !isField(left) ||\n left.path.length !== 1 ||\n predicate.values.some((value) => value == null || typeof value === \"bigint\")\n )\n return;\n return { type: \"in\", field: left.path[0]!, value: predicate.values.map(scalar) };\n }\n let right = predicate.right;\n let operation = predicate.op;\n if (isField(right) && !isField(left)) {\n [left, right] = [right, left];\n operation = { eq: \"eq\", gt: \"lt\", gte: \"lte\", lt: \"gt\", lte: \"gte\" }[operation] as typeof operation;\n }\n if (\n !isField(left) ||\n isField(right) ||\n left.path.length !== 1 ||\n right == null ||\n typeof right === \"bigint\"\n )\n return;\n const query: SearchJsonQueryV2 = { type: operation, field: left.path[0]!, value: scalar(right) };\n // Storage has an explicit ordering for missing/nullish values; provider range\n // filters need not share it. Including nulls preserves a candidate superset.\n return operation === \"eq\"\n ? query\n : { type: \"or\", value: [query, { type: \"isNull\", field: left.path[0]!, value: true }] };\n}\n\nexport const subsetFilter = (predicate: Predicate | undefined): SearchJsonQueryV2 | undefined =>\n predicate ? translate(predicate) : undefined;\n\n/** Report effective placement, including supported OR branches that could not safely be sent. */\nexport function analyzeSubsetFilter(predicate: Predicate | undefined) {\n const translated = new Map<Predicate, SearchJsonQueryV2 | undefined>();\n const visit = (predicate: Predicate): SearchJsonQueryV2 | undefined => {\n const query = translate(predicate, visit);\n translated.set(predicate, query);\n return query;\n };\n const query = predicate ? visit(predicate) : undefined;\n const predicates: SourceQueryPlan[\"predicates\"][number][] = [];\n const report = (predicate: Predicate, path: readonly number[], allowed: boolean): void => {\n const sent = allowed && translated.get(predicate) !== undefined;\n if (predicate.op === \"and\" || predicate.op === \"or\") {\n predicate.predicates.forEach((child, index) => report(child, [...path, index], sent));\n } else if (predicate.op === \"not\") {\n report(predicate.predicate, [...path, 0], false);\n } else {\n predicates.push({\n path,\n execution: !sent\n ? \"adapter\"\n : [\"like\", \"ilike\", \"gt\", \"gte\", \"lt\", \"lte\"].includes(predicate.op)\n ? \"candidate\"\n : \"source\",\n });\n }\n };\n if (predicate) report(predicate, [], true);\n return { query, predicates };\n}\n"],"mappings":";;;AAMA,MAAM,UAAU,UACZ,iBAAiB,OACX,MAAM,YAAY,IAClB,OAAO,UAAU,YAAY,UAAU,QAAQ,cAAc,QAC3D,MAAM,SAAS,IACf;;;;;AAMZ,SAAS,UACL,WACA,UAAmE,WACtC;CAC7B,IAAI,UAAU,OAAO,SAAS,UAAU,OAAO,MAAM;EACjD,MAAM,WAAW,UAAU,WAAW,KAAK,UAAU,QAAQ,KAAK,CAAC;EACnE,IAAI,UAAU,OAAO,QAAQ,SAAS,MAAM,UAAU,CAAC,KAAK,GAAG;EAC/D,MAAM,YAAY,SAAS,QAAQ,UAAsC,UAAU,KAAA,CAAS;EAC5F,IAAI,CAAC,UAAU,QAAQ;EACvB,OAAO;GAAE,MAAM,UAAU;GAAI,OAAO;EAAU;CAClD;CACA,IAAI,UAAU,OAAO,SAAS,UAAU,OAAO,MAAM;CACrD,IAAI,UAAU,OAAO,UAAU,UAAU,OAAO,SAAS;EACrD,IACI,CAAC,QAAQ,UAAU,IAAI,KACvB,UAAU,KAAK,KAAK,WAAW,KAC/B,OAAO,UAAU,UAAU,UAE3B;EAGJ,OAAO,kBAAkB,CAAC,GAAG,UAAU,KAAK,IAAI,GAAG,UAAU,OAAO,IAAI,CAAC,CAAC;CAC9E;CACA,IAAI,UAAU,OAAO,YAAY;EAC7B,IACI,UAAU,KAAK,KAAK,WAAW,KAC/B,QAAQ,UAAU,KAAK,KACvB,UAAU,SAAS,QACnB,OAAO,UAAU,UAAU,UAE3B;EACJ,OAAO;GAAE,MAAM;GAAY,OAAO,UAAU,KAAK,KAAK;GAAK,OAAO,OAAO,UAAU,KAAK;EAAE;CAC9F;CACA,IAAI,OAAO,UAAU;CACrB,IAAI,UAAU,OAAO,MAAM;EACvB,IACI,CAAC,QAAQ,IAAI,KACb,KAAK,KAAK,WAAW,KACrB,UAAU,OAAO,MAAM,UAAU,SAAS,QAAQ,OAAO,UAAU,QAAQ,GAE3E;EACJ,OAAO;GAAE,MAAM;GAAM,OAAO,KAAK,KAAK;GAAK,OAAO,UAAU,OAAO,IAAI,MAAM;EAAE;CACnF;CACA,IAAI,QAAQ,UAAU;CACtB,IAAI,YAAY,UAAU;CAC1B,IAAI,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,GAAG;EAClC,CAAC,MAAM,SAAS,CAAC,OAAO,IAAI;EAC5B,YAAY;GAAE,IAAI;GAAM,IAAI;GAAM,KAAK;GAAO,IAAI;GAAM,KAAK;EAAM,EAAE;CACzE;CACA,IACI,CAAC,QAAQ,IAAI,KACb,QAAQ,KAAK,KACb,KAAK,KAAK,WAAW,KACrB,SAAS,QACT,OAAO,UAAU,UAEjB;CACJ,MAAM,QAA2B;EAAE,MAAM;EAAW,OAAO,KAAK,KAAK;EAAK,OAAO,OAAO,KAAK;CAAE;CAG/F,OAAO,cAAc,OACf,QACA;EAAE,MAAM;EAAM,OAAO,CAAC,OAAO;GAAE,MAAM;GAAU,OAAO,KAAK,KAAK;GAAK,OAAO;EAAK,CAAC;CAAE;AAC9F;AAEA,MAAa,gBAAgB,cACzB,YAAY,UAAU,SAAS,IAAI,KAAA;;AAGvC,SAAgB,oBAAoB,WAAkC;CAClE,MAAM,6BAAa,IAAI,IAA8C;CACrE,MAAM,SAAS,cAAwD;EACnE,MAAM,QAAQ,UAAU,WAAW,KAAK;EACxC,WAAW,IAAI,WAAW,KAAK;EAC/B,OAAO;CACX;CACA,MAAM,QAAQ,YAAY,MAAM,SAAS,IAAI,KAAA;CAC7C,MAAM,aAAsD,CAAC;CAC7D,MAAM,UAAU,WAAsB,MAAyB,YAA2B;EACtF,MAAM,OAAO,WAAW,WAAW,IAAI,SAAS,MAAM,KAAA;EACtD,IAAI,UAAU,OAAO,SAAS,UAAU,OAAO,MAC3C,UAAU,WAAW,SAAS,OAAO,UAAU,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK,GAAG,IAAI,CAAC;OACjF,IAAI,UAAU,OAAO,OACxB,OAAO,UAAU,WAAW,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK;OAE/C,WAAW,KAAK;GACZ;GACA,WAAW,CAAC,OACN,YACA;IAAC;IAAQ;IAAS;IAAM;IAAO;IAAM;GAAK,CAAC,CAAC,SAAS,UAAU,EAAE,IAC/D,cACA;EACZ,CAAC;CAET;CACA,IAAI,WAAW,OAAO,WAAW,CAAC,GAAG,IAAI;CACzC,OAAO;EAAE;EAAO;CAAW;AAC/B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { OntologyClient } from "@party-stack/foundry-client";
|
|
2
|
+
import { ByteInput } from "@party-stack/ontology-storage/blobs";
|
|
3
|
+
//#region src/adapter/uploads.d.ts
|
|
4
|
+
export declare function uploadFoundryMedia(client: OntologyClient, input: ByteInput, options: {
|
|
5
|
+
filename: string;
|
|
6
|
+
signal?: AbortSignal;
|
|
7
|
+
}): Promise<{
|
|
8
|
+
readonly mimeType: string;
|
|
9
|
+
readonly reference: {
|
|
10
|
+
readonly type: "mediaSetViewItem";
|
|
11
|
+
readonly mediaSetViewItem: {
|
|
12
|
+
readonly mediaSetRid: string;
|
|
13
|
+
readonly mediaSetViewRid: string;
|
|
14
|
+
readonly mediaItemRid: string;
|
|
15
|
+
readonly token?: string | undefined;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
}>;
|
|
19
|
+
export declare function uploadFoundryAttachment(client: OntologyClient, input: ByteInput, options: {
|
|
20
|
+
filename: string;
|
|
21
|
+
rid?: string;
|
|
22
|
+
signal?: AbortSignal;
|
|
23
|
+
}): Promise<import("@osdk/foundry.ontologies").AttachmentV2>;
|
|
24
|
+
//#endregion
|
|
25
|
+
//# sourceMappingURL=uploads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.d.ts","names":[],"sources":["../../src/adapter/uploads.ts"],"mappings":";;;wBAsEsB,mBAClB,QAAQ,gBACR,OAAO,WACP;EAAW;EAAkB,SAAS;IAAa;;;;;;;;;;;;wBAgBjC,wBAClB,QAAQ,gBACR,OAAO,WACP;EAAW;EAAkB;EAAc,SAAS;IAAa,2CAAA"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Effect, Schema, Stream } from "effect";
|
|
2
|
+
import { Attachments } from "@osdk/foundry.ontologies";
|
|
3
|
+
import { byteChunks, collectByteBlob } from "@party-stack/ontology-storage/blobs";
|
|
4
|
+
//#region src/adapter/uploads.ts
|
|
5
|
+
const MediaReference = Schema.Struct({
|
|
6
|
+
mimeType: Schema.String,
|
|
7
|
+
reference: Schema.Struct({
|
|
8
|
+
type: Schema.Literal("mediaSetViewItem"),
|
|
9
|
+
mediaSetViewItem: Schema.Struct({
|
|
10
|
+
mediaSetRid: Schema.String,
|
|
11
|
+
mediaSetViewRid: Schema.String,
|
|
12
|
+
mediaItemRid: Schema.String,
|
|
13
|
+
token: Schema.optional(Schema.String)
|
|
14
|
+
})
|
|
15
|
+
})
|
|
16
|
+
});
|
|
17
|
+
const ApiFailure = Schema.Struct({
|
|
18
|
+
errorName: Schema.optional(Schema.String),
|
|
19
|
+
errorCode: Schema.optional(Schema.String),
|
|
20
|
+
errorInstanceId: Schema.optional(Schema.String),
|
|
21
|
+
parameters: Schema.optional(Schema.Unknown)
|
|
22
|
+
});
|
|
23
|
+
/** The generated SDK only accepts Blob and JSON-encodes other bodies. Use the same authenticated fetch. */
|
|
24
|
+
async function uploadBinary(client, input, options) {
|
|
25
|
+
const url = new URL(options.path, client.baseUrl.endsWith("/") ? client.baseUrl : `${client.baseUrl}/`);
|
|
26
|
+
url.searchParams.set("filename", options.filename);
|
|
27
|
+
if (options.preview) url.searchParams.set("preview", "true");
|
|
28
|
+
const headers = new Headers({
|
|
29
|
+
"Content-Type": options.contentType,
|
|
30
|
+
Accept: "application/json"
|
|
31
|
+
});
|
|
32
|
+
const stream = input instanceof Blob ? void 0 : Stream.toReadableStream(byteChunks(input));
|
|
33
|
+
const body = input instanceof Blob ? input : stream;
|
|
34
|
+
const init = {
|
|
35
|
+
method: options.method,
|
|
36
|
+
headers,
|
|
37
|
+
body,
|
|
38
|
+
...stream ? { duplex: "half" } : {},
|
|
39
|
+
signal: options.signal
|
|
40
|
+
};
|
|
41
|
+
try {
|
|
42
|
+
const response = await client.fetch(url, init);
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
const details = Schema.decodeUnknownOption(ApiFailure)(await response.json().catch(() => void 0));
|
|
45
|
+
throw Object.assign(/* @__PURE__ */ new Error("Foundry upload failed."), details._tag === "Some" ? details.value : {}, { statusCode: response.status });
|
|
46
|
+
}
|
|
47
|
+
return await response.json();
|
|
48
|
+
} finally {
|
|
49
|
+
if (stream && !stream.locked) await stream.cancel().catch(() => void 0);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async function uploadFoundryMedia(client, input, options) {
|
|
53
|
+
return Schema.decodeUnknownSync(MediaReference)(await uploadBinary(client, input, {
|
|
54
|
+
...options,
|
|
55
|
+
path: "api/v2/mediasets/media/upload",
|
|
56
|
+
method: "PUT",
|
|
57
|
+
contentType: "application/octet-stream"
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
async function uploadFoundryAttachment(client, input, options) {
|
|
61
|
+
const blob = input instanceof Blob ? input : await Effect.runPromise(collectByteBlob(input), { signal: options.signal });
|
|
62
|
+
const signal = options.signal;
|
|
63
|
+
const uploadClient = signal ? {
|
|
64
|
+
...client,
|
|
65
|
+
fetch: (input, init) => client.fetch(input, {
|
|
66
|
+
...init,
|
|
67
|
+
signal: init?.signal ? AbortSignal.any([signal, init.signal]) : signal
|
|
68
|
+
})
|
|
69
|
+
} : client;
|
|
70
|
+
return options.rid ? Attachments.uploadWithRid(uploadClient, options.rid, blob, {
|
|
71
|
+
filename: options.filename,
|
|
72
|
+
preview: true
|
|
73
|
+
}) : Attachments.upload(uploadClient, blob, { filename: options.filename });
|
|
74
|
+
}
|
|
75
|
+
//#endregion
|
|
76
|
+
export { uploadFoundryAttachment, uploadFoundryMedia };
|
|
77
|
+
|
|
78
|
+
//# sourceMappingURL=uploads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.js","names":[],"sources":["../../src/adapter/uploads.ts"],"sourcesContent":["import { Attachments } from \"@osdk/foundry.ontologies\";\nimport { byteChunks, collectByteBlob, type ByteInput } from \"@party-stack/ontology-storage/blobs\";\nimport { Effect, Schema, Stream } from \"effect\";\nimport type { OntologyClient } from \"@party-stack/foundry-client\";\n\nconst MediaReference = Schema.Struct({\n mimeType: Schema.String,\n reference: Schema.Struct({\n type: Schema.Literal(\"mediaSetViewItem\"),\n mediaSetViewItem: Schema.Struct({\n mediaSetRid: Schema.String,\n mediaSetViewRid: Schema.String,\n mediaItemRid: Schema.String,\n token: Schema.optional(Schema.String),\n }),\n }),\n});\nconst ApiFailure = Schema.Struct({\n errorName: Schema.optional(Schema.String),\n errorCode: Schema.optional(Schema.String),\n errorInstanceId: Schema.optional(Schema.String),\n parameters: Schema.optional(Schema.Unknown),\n});\n\n/** The generated SDK only accepts Blob and JSON-encodes other bodies. Use the same authenticated fetch. */\nasync function uploadBinary(\n client: OntologyClient,\n input: ByteInput,\n options: {\n path: string;\n method: \"POST\" | \"PUT\";\n filename: string;\n contentType: string;\n preview?: boolean;\n signal?: AbortSignal;\n }\n): Promise<unknown> {\n const url = new URL(options.path, client.baseUrl.endsWith(\"/\") ? client.baseUrl : `${client.baseUrl}/`);\n url.searchParams.set(\"filename\", options.filename);\n if (options.preview) url.searchParams.set(\"preview\", \"true\");\n const headers = new Headers({ \"Content-Type\": options.contentType, Accept: \"application/json\" });\n const stream = input instanceof Blob ? undefined : Stream.toReadableStream(byteChunks(input));\n const body = input instanceof Blob ? input : stream!;\n const init: RequestInit & { duplex?: \"half\" } = {\n method: options.method,\n headers,\n body,\n ...(stream ? { duplex: \"half\" as const } : {}),\n signal: options.signal,\n };\n try {\n const response = await client.fetch(url, init);\n if (!response.ok) {\n const details = Schema.decodeUnknownOption(ApiFailure)(\n await response.json().catch(() => undefined)\n );\n throw Object.assign(\n new Error(\"Foundry upload failed.\"),\n details._tag === \"Some\" ? details.value : {},\n {\n statusCode: response.status,\n }\n );\n }\n return await response.json();\n } finally {\n if (stream && !stream.locked) await stream.cancel().catch(() => undefined);\n }\n}\n\nexport async function uploadFoundryMedia(\n client: OntologyClient,\n input: ByteInput,\n options: { filename: string; signal?: AbortSignal }\n) {\n // Live browser/SharedWorker smoke test (2026-11-02): this endpoint accepted\n // a ReadableStream with application/octet-stream and no Content-Length (200).\n // Keep streaming here: the ordinary attachment endpoint behaved differently.\n // See specs/2026-10-19-effect-tables-replica/blob-future-work.md for the controls.\n return Schema.decodeUnknownSync(MediaReference)(\n await uploadBinary(client, input, {\n ...options,\n path: \"api/v2/mediasets/media/upload\",\n method: \"PUT\",\n contentType: \"application/octet-stream\",\n })\n );\n}\n\nexport async function uploadFoundryAttachment(\n client: OntologyClient,\n input: ByteInput,\n options: { filename: string; rid?: string; signal?: AbortSignal }\n) {\n // Live browser/SharedWorker smoke test (2026-11-02): streamed bodies failed\n // with 400 Default:InvalidArgument for both octet-stream and PNG Content-Type;\n // Blob and SDK controls succeeded. Media uploads above accepted streaming.\n // The docs do not state a length requirement, so revisit with a provider test.\n // For now use the SDK's Blob path, materializing only at this boundary within\n // collectByteBlob's size limit. Browser fetch forbids setting Content-Length\n // manually. Do not add a Blob/File capability to storage or RPC for this fix.\n const blob =\n input instanceof Blob\n ? input\n : await Effect.runPromise(collectByteBlob(input), { signal: options.signal });\n const signal = options.signal;\n const uploadClient = signal\n ? {\n ...client,\n fetch: (input: RequestInfo | URL, init?: RequestInit) =>\n client.fetch(input, {\n ...init,\n signal: init?.signal ? AbortSignal.any([signal, init.signal]) : signal,\n }),\n }\n : client;\n return options.rid\n ? Attachments.uploadWithRid(uploadClient, options.rid, blob, {\n filename: options.filename,\n preview: true,\n })\n : Attachments.upload(uploadClient, blob, { filename: options.filename });\n}\n"],"mappings":";;;;AAKA,MAAM,iBAAiB,OAAO,OAAO;CACjC,UAAU,OAAO;CACjB,WAAW,OAAO,OAAO;EACrB,MAAM,OAAO,QAAQ,kBAAkB;EACvC,kBAAkB,OAAO,OAAO;GAC5B,aAAa,OAAO;GACpB,iBAAiB,OAAO;GACxB,cAAc,OAAO;GACrB,OAAO,OAAO,SAAS,OAAO,MAAM;EACxC,CAAC;CACL,CAAC;AACL,CAAC;AACD,MAAM,aAAa,OAAO,OAAO;CAC7B,WAAW,OAAO,SAAS,OAAO,MAAM;CACxC,WAAW,OAAO,SAAS,OAAO,MAAM;CACxC,iBAAiB,OAAO,SAAS,OAAO,MAAM;CAC9C,YAAY,OAAO,SAAS,OAAO,OAAO;AAC9C,CAAC;;AAGD,eAAe,aACX,QACA,OACA,SAQgB;CAChB,MAAM,MAAM,IAAI,IAAI,QAAQ,MAAM,OAAO,QAAQ,SAAS,GAAG,IAAI,OAAO,UAAU,GAAG,OAAO,QAAQ,EAAE;CACtG,IAAI,aAAa,IAAI,YAAY,QAAQ,QAAQ;CACjD,IAAI,QAAQ,SAAS,IAAI,aAAa,IAAI,WAAW,MAAM;CAC3D,MAAM,UAAU,IAAI,QAAQ;EAAE,gBAAgB,QAAQ;EAAa,QAAQ;CAAmB,CAAC;CAC/F,MAAM,SAAS,iBAAiB,OAAO,KAAA,IAAY,OAAO,iBAAiB,WAAW,KAAK,CAAC;CAC5F,MAAM,OAAO,iBAAiB,OAAO,QAAQ;CAC7C,MAAM,OAA0C;EAC5C,QAAQ,QAAQ;EAChB;EACA;EACA,GAAI,SAAS,EAAE,QAAQ,OAAgB,IAAI,CAAC;EAC5C,QAAQ,QAAQ;CACpB;CACA,IAAI;EACA,MAAM,WAAW,MAAM,OAAO,MAAM,KAAK,IAAI;EAC7C,IAAI,CAAC,SAAS,IAAI;GACd,MAAM,UAAU,OAAO,oBAAoB,UAAU,CAAC,CAClD,MAAM,SAAS,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS,CAC/C;GACA,MAAM,OAAO,uBACT,IAAI,MAAM,wBAAwB,GAClC,QAAQ,SAAS,SAAS,QAAQ,QAAQ,CAAC,GAC3C,EACI,YAAY,SAAS,OACzB,CACJ;EACJ;EACA,OAAO,MAAM,SAAS,KAAK;CAC/B,UAAU;EACN,IAAI,UAAU,CAAC,OAAO,QAAQ,MAAM,OAAO,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;CAC7E;AACJ;AAEA,eAAsB,mBAClB,QACA,OACA,SACF;CAKE,OAAO,OAAO,kBAAkB,cAAc,CAAC,CAC3C,MAAM,aAAa,QAAQ,OAAO;EAC9B,GAAG;EACH,MAAM;EACN,QAAQ;EACR,aAAa;CACjB,CAAC,CACL;AACJ;AAEA,eAAsB,wBAClB,QACA,OACA,SACF;CAQE,MAAM,OACF,iBAAiB,OACX,QACA,MAAM,OAAO,WAAW,gBAAgB,KAAK,GAAG,EAAE,QAAQ,QAAQ,OAAO,CAAC;CACpF,MAAM,SAAS,QAAQ;CACvB,MAAM,eAAe,SACf;EACI,GAAG;EACH,QAAQ,OAA0B,SAC9B,OAAO,MAAM,OAAO;GAChB,GAAG;GACH,QAAQ,MAAM,SAAS,YAAY,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI;EACpE,CAAC;CACT,IACA;CACN,OAAO,QAAQ,MACT,YAAY,cAAc,cAAc,QAAQ,KAAK,MAAM;EACvD,UAAU,QAAQ;EAClB,SAAS;CACb,CAAC,IACD,YAAY,OAAO,cAAc,MAAM,EAAE,UAAU,QAAQ,SAAS,CAAC;AAC/E"}
|
package/lib/backend.d.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { FoundryUsersIntegration } from "./adapter/makeFoundryOntologyBackend.js";
|
|
2
|
+
import { FoundryOAuthConnectionOptions } from "./connectionOptions.js";
|
|
3
|
+
import { makeFoundryServiceConnector } from "./serviceConnector.js";
|
|
4
|
+
import { ConnectionEgress } from "@party-stack/connect";
|
|
5
|
+
import { Effect } from "effect";
|
|
6
|
+
import { OntologyIR } from "@party-stack/ontology-spec";
|
|
7
|
+
//#region src/backend.d.ts
|
|
8
|
+
/** Use the selected Connect egress; credentials remain at its authority. */
|
|
9
|
+
export declare const makeFoundryConnectionClient: (options: {
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
ontologyId: string;
|
|
12
|
+
egress: ConnectionEgress;
|
|
13
|
+
}) => Effect.Effect<import("@party-stack/foundry-client").OntologyClient, never, import("effect/Scope").Scope>;
|
|
14
|
+
export declare const makeFoundryBackend: (options: {
|
|
15
|
+
baseUrl: string;
|
|
16
|
+
ontologyId: string;
|
|
17
|
+
egress: ConnectionEgress;
|
|
18
|
+
ir: OntologyIR;
|
|
19
|
+
context: Record<string, unknown>;
|
|
20
|
+
users?: FoundryUsersIntegration;
|
|
21
|
+
watch?: boolean;
|
|
22
|
+
}) => Effect.Effect<{
|
|
23
|
+
name: string;
|
|
24
|
+
sourceId: string;
|
|
25
|
+
supportsIdempotency: boolean;
|
|
26
|
+
maintenance?: Effect.Effect<void, import("@party-stack/ontology-backend").BackendError>;
|
|
27
|
+
loadSubset: (subset: import("@party-stack/ontology-spec/query").ObjectSubset) => Effect.Effect<import("@party-stack/ontology-backend").BackendSnapshot, import("@party-stack/ontology-backend").BackendError>;
|
|
28
|
+
query: (document: import("@party-stack/ontology-spec").QueryDocument, options?: {
|
|
29
|
+
readonly inputs?: Record<string, unknown>;
|
|
30
|
+
}) => Effect.Effect<Record<string, unknown>, import("@party-stack/ontology-backend").BackendError>;
|
|
31
|
+
subscribeSelection?: (selection: import("@party-stack/ontology-backend").ObjectSelection, policy?: import("@party-stack/ontology-backend/delivery").DeliveryPolicy, resume?: import("@party-stack/ontology-backend/delivery").DeliveryPosition) => Effect.Effect<import("@party-stack/ontology-backend/delivery").DeliverySubscription, import("@party-stack/ontology-backend").BackendError, import("effect/Scope").Scope>;
|
|
32
|
+
acknowledgeDelivery?: (position: import("@party-stack/ontology-backend/delivery").DeliveryPosition) => Effect.Effect<void, import("@party-stack/ontology-backend").BackendError>;
|
|
33
|
+
resolveActionParameters?: (name: string, parameters: Record<string, unknown>) => Effect.Effect<Record<string, unknown>, import("@party-stack/ontology-backend").BackendError>;
|
|
34
|
+
watchSubset?: (subset: import("@party-stack/ontology-spec/query").ObjectSubset) => Effect.Effect<import("effect/Stream").Stream<import("@party-stack/ontology-backend").SubsetWatchEvent, import("@party-stack/ontology-backend").BackendError>, import("@party-stack/ontology-backend").BackendError, import("effect/Scope").Scope> | undefined;
|
|
35
|
+
refresh?: (subset: import("@party-stack/ontology-spec/query").ObjectSubset) => {
|
|
36
|
+
readonly pollIntervalMs?: number | false;
|
|
37
|
+
readonly maxCoverageAgeMs?: number;
|
|
38
|
+
} | undefined;
|
|
39
|
+
applyAction: (invocation: import("@party-stack/ontology-backend").ActionRequest) => Effect.Effect<import("@party-stack/ontology-backend").ActionReceipt, import("@party-stack/ontology-backend").BackendError>;
|
|
40
|
+
queryFunction: (name: string, parameters: Record<string, unknown>) => Effect.Effect<unknown, import("@party-stack/ontology-backend").BackendError>;
|
|
41
|
+
changes?: {
|
|
42
|
+
readonly pull: (options: {
|
|
43
|
+
readonly cursor?: string;
|
|
44
|
+
readonly limit?: number;
|
|
45
|
+
}) => Effect.Effect<import("@party-stack/ontology-backend").BackendChangePage, import("@party-stack/ontology-backend").BackendError>;
|
|
46
|
+
readonly watch?: Effect.Effect<import("effect/Stream").Stream<void, import("@party-stack/ontology-backend").BackendError>, import("@party-stack/ontology-backend").BackendError, import("effect/Scope").Scope>;
|
|
47
|
+
};
|
|
48
|
+
attachments?: import("@party-stack/ontology-backend").BackendAttachments;
|
|
49
|
+
encrypted?: import("@party-stack/ontology-backend").BackendEncryptedValues;
|
|
50
|
+
validateAction: (name: string, parameters: Record<string, unknown>, settings?: {
|
|
51
|
+
readonly knownParameters?: readonly string[];
|
|
52
|
+
}) => Effect.Effect<{
|
|
53
|
+
readonly certain: false;
|
|
54
|
+
} | {
|
|
55
|
+
readonly certain: true;
|
|
56
|
+
readonly value: {
|
|
57
|
+
readonly kind: "ok";
|
|
58
|
+
readonly value: void;
|
|
59
|
+
} | {
|
|
60
|
+
readonly kind: "err";
|
|
61
|
+
readonly value: readonly {
|
|
62
|
+
readonly message: string;
|
|
63
|
+
readonly path?: readonly (string | number)[] | undefined;
|
|
64
|
+
readonly code?: string | undefined;
|
|
65
|
+
readonly category?: "custom" | "input" | "reference" | undefined;
|
|
66
|
+
readonly source?: "parameter" | "submission" | "user-facing" | undefined;
|
|
67
|
+
readonly messageSource?: "configured" | "standard" | undefined;
|
|
68
|
+
}[];
|
|
69
|
+
};
|
|
70
|
+
}, import("@party-stack/ontology-backend").BackendError<"Conflict" | "Forbidden" | "HistoryExpired" | "Internal" | "InvalidConfiguration" | "InvalidRequest" | "InvalidResponse" | "NotFound" | "NotImplemented" | "RateLimited" | "ResultExpired" | "SchemaMismatch" | "SessionExpired" | "SessionReplaced" | "SourceMismatch" | "Unauthenticated" | "Unavailable" | "ValidationFailed" | "ViewReplaced">, never>;
|
|
71
|
+
}, import("@party-stack/ontology-backend").BackendError<"Conflict" | "Forbidden" | "HistoryExpired" | "Internal" | "InvalidConfiguration" | "InvalidRequest" | "InvalidResponse" | "NotFound" | "NotImplemented" | "RateLimited" | "ResultExpired" | "SchemaMismatch" | "SessionExpired" | "SessionReplaced" | "SourceMismatch" | "Unauthenticated" | "Unavailable" | "ValidationFailed" | "ViewReplaced">, import("effect/Scope").Scope>;
|
|
72
|
+
export declare const makeFoundryMetadataBackend: (options: {
|
|
73
|
+
baseUrl: string;
|
|
74
|
+
ontologyId: string;
|
|
75
|
+
egress: ConnectionEgress;
|
|
76
|
+
refetchInterval?: number | false;
|
|
77
|
+
}) => Effect.Effect<import("@party-stack/ontology-backend").OntologyBackendService, never, import("effect/Scope").Scope>;
|
|
78
|
+
//#endregion
|
|
79
|
+
export { type FoundryOAuthConnectionOptions, makeFoundryServiceConnector };
|
|
80
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","names":[],"sources":["../src/backend.ts"],"mappings":";;;;;;;;qBAYa,8BAA2B;EAC3B;EACG;EACJ,QAAA;MASV,OAAA,6CAAA,8CAAA;qBACW,qBAAkB;EAClB;EACG;EACJ,QAAA;EACJ,IAAA;EACK,SAAA;EACD,QAAA;EACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAOV,wXAAA;qBACW,6BAA0B;EAC1B;EACG;EACJ,QAAA;EACU;MAMpB,OAAA,+CAAA,sDAAA"}
|
package/lib/backend.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { makeFoundryOntologyBackend } from "./adapter/makeFoundryOntologyBackend.js";
|
|
2
|
+
import { makeFoundryMetadataBackend as makeFoundryMetadataBackend$1 } from "./meta/backend.js";
|
|
3
|
+
import { makeFoundryServiceConnector } from "./serviceConnector.js";
|
|
4
|
+
import { toWebEgress } from "@party-stack/connect";
|
|
5
|
+
import { createOntologyClient } from "@party-stack/foundry-client";
|
|
6
|
+
import { Effect } from "effect";
|
|
7
|
+
//#region src/backend.ts
|
|
8
|
+
/** Use the selected Connect egress; credentials remain at its authority. */
|
|
9
|
+
const makeFoundryConnectionClient = Effect.fnUntraced(function* (options) {
|
|
10
|
+
const web = yield* toWebEgress(options.egress);
|
|
11
|
+
return createOntologyClient({
|
|
12
|
+
baseUrl: options.baseUrl,
|
|
13
|
+
ontologyRid: options.ontologyId,
|
|
14
|
+
fetch: web.fetch,
|
|
15
|
+
createWebSocket: web.createWebSocket
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
const makeFoundryBackend = Effect.fnUntraced(function* (options) {
|
|
19
|
+
return yield* makeFoundryOntologyBackend({
|
|
20
|
+
...options,
|
|
21
|
+
client: yield* makeFoundryConnectionClient(options),
|
|
22
|
+
context: options.context
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
const makeFoundryMetadataBackend = Effect.fnUntraced(function* (options) {
|
|
26
|
+
return makeFoundryMetadataBackend$1({
|
|
27
|
+
client: yield* makeFoundryConnectionClient(options),
|
|
28
|
+
refetchInterval: options.refetchInterval
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
//#endregion
|
|
32
|
+
export { makeFoundryBackend, makeFoundryConnectionClient, makeFoundryMetadataBackend, makeFoundryServiceConnector };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","names":["makeMetadataBackend"],"sources":["../src/backend.ts"],"sourcesContent":["import { toWebEgress } from \"@party-stack/connect\";\nimport { createOntologyClient } from \"@party-stack/foundry-client\";\nimport { Effect } from \"effect\";\nimport { makeFoundryOntologyBackend } from \"./adapter/makeFoundryOntologyBackend.js\";\nimport { makeFoundryMetadataBackend as makeMetadataBackend } from \"./meta/backend.js\";\nimport type { FoundryUsersIntegration } from \"./adapter/makeFoundryOntologyBackend.js\";\nimport type { ConnectionEgress } from \"@party-stack/connect\";\nimport type { OntologyIR } from \"@party-stack/ontology-spec\";\n\nexport type { FoundryOAuthConnectionOptions } from \"./connectionOptions.js\";\n\n/** Use the selected Connect egress; credentials remain at its authority. */\nexport const makeFoundryConnectionClient = Effect.fnUntraced(function* (options: {\n baseUrl: string;\n ontologyId: string;\n egress: ConnectionEgress;\n}) {\n const web = yield* toWebEgress(options.egress);\n return createOntologyClient({\n baseUrl: options.baseUrl,\n ontologyRid: options.ontologyId,\n fetch: web.fetch,\n createWebSocket: web.createWebSocket,\n });\n});\nexport const makeFoundryBackend = Effect.fnUntraced(function* (options: {\n baseUrl: string;\n ontologyId: string;\n egress: ConnectionEgress;\n ir: OntologyIR;\n context: Record<string, unknown>;\n users?: FoundryUsersIntegration;\n watch?: boolean;\n}) {\n return yield* makeFoundryOntologyBackend({\n ...options,\n client: yield* makeFoundryConnectionClient(options),\n context: options.context,\n });\n});\nexport const makeFoundryMetadataBackend = Effect.fnUntraced(function* (options: {\n baseUrl: string;\n ontologyId: string;\n egress: ConnectionEgress;\n refetchInterval?: number | false;\n}) {\n return makeMetadataBackend({\n client: yield* makeFoundryConnectionClient(options),\n refetchInterval: options.refetchInterval,\n });\n});\n\nexport { makeFoundryServiceConnector } from \"./serviceConnector.js\";\n"],"mappings":";;;;;;;;AAYA,MAAa,8BAA8B,OAAO,WAAW,WAAW,SAIrE;CACC,MAAM,MAAM,OAAO,YAAY,QAAQ,MAAM;CAC7C,OAAO,qBAAqB;EACxB,SAAS,QAAQ;EACjB,aAAa,QAAQ;EACrB,OAAO,IAAI;EACX,iBAAiB,IAAI;CACzB,CAAC;AACL,CAAC;AACD,MAAa,qBAAqB,OAAO,WAAW,WAAW,SAQ5D;CACC,OAAO,OAAO,2BAA2B;EACrC,GAAG;EACH,QAAQ,OAAO,4BAA4B,OAAO;EAClD,SAAS,QAAQ;CACrB,CAAC;AACL,CAAC;AACD,MAAa,6BAA6B,OAAO,WAAW,WAAW,SAKpE;CACC,OAAOA,6BAAoB;EACvB,QAAQ,OAAO,4BAA4B,OAAO;EAClD,iBAAiB,QAAQ;CAC7B,CAAC;AACL,CAAC"}
|
package/lib/config/index.d.ts
CHANGED
|
@@ -1,24 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { FoundryOAuthConnectionOptions } from "../connectionOptions.js";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { Runtimes } from "@party-stack/runtime";
|
|
4
|
+
import { OntologyPullConfig } from "@party-stack/ontology-backend/meta";
|
|
4
5
|
//#region src/config/index.d.ts
|
|
5
6
|
export interface FoundryOntologyPullConnectionOptions {
|
|
6
7
|
oauth?: FoundryOAuthConnectionOptions;
|
|
7
8
|
token?: string;
|
|
8
9
|
userId?: string;
|
|
9
10
|
}
|
|
10
|
-
export interface
|
|
11
|
+
export interface FoundryPullBackendOptions {
|
|
11
12
|
baseUrl: string;
|
|
12
13
|
ontologyRid: string;
|
|
13
14
|
connection: FoundryOntologyPullConnectionOptions;
|
|
14
|
-
attachmentConstraints?: FoundryAttachmentConstraintOverride[];
|
|
15
|
-
users?: {
|
|
16
|
-
objectType: string;
|
|
17
|
-
lens: Lens;
|
|
18
|
-
};
|
|
19
15
|
}
|
|
20
|
-
|
|
21
|
-
export
|
|
16
|
+
/** Acquire an authenticated metadata backend for the duration of the pull. */
|
|
17
|
+
export declare const makeFoundryPullBackend: (options: FoundryPullBackendOptions) => Effect.Effect<import("@party-stack/ontology-backend").OntologyBackendService, import("@party-stack/ontology-backend").BackendError<"Conflict" | "Forbidden" | "HistoryExpired" | "Internal" | "InvalidConfiguration" | "InvalidRequest" | "InvalidResponse" | "NotFound" | "NotImplemented" | "RateLimited" | "ResultExpired" | "SchemaMismatch" | "SessionExpired" | "SessionReplaced" | "SourceMismatch" | "Unauthenticated" | "Unavailable" | "ValidationFailed" | "ViewReplaced">, Runtimes | import("effect/Scope").Scope>;
|
|
18
|
+
export type FoundryOntologyPullConfig = OntologyPullConfig<Runtimes>;
|
|
22
19
|
//#endregion
|
|
23
|
-
export type { FoundryAttachmentConstraintOverride };
|
|
24
20
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/config/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/config/index.ts"],"mappings":";;;;;iBAgBiB;EACb,QAAQ;EACR;EACA;;iBAGa;EACb;EACA;EACA,YAAY;;;qBAIH,yBAAsB,SAAA,8BAAA,OAAA,+CAAA,gEAAA,iWAAA,kCAAA;YAmDvB,4BAA4B,mBAAmB"}
|
package/lib/config/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { makeFoundryServiceConnector } from "../serviceConnector.js";
|
|
2
|
+
import { makeFoundryMetadataBackend } from "../backend.js";
|
|
3
|
+
import { acquireConfiguredConnection, makeConnectManager } from "@party-stack/connect";
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
import { classifyBackendFailure } from "@party-stack/ontology-backend";
|
|
6
|
+
import { Runtime, Runtimes } from "@party-stack/runtime";
|
|
5
7
|
//#region src/config/index.ts
|
|
6
8
|
const DEFAULT_FOUNDRY_SCOPES = [
|
|
7
9
|
"api:use-ontologies-read",
|
|
@@ -9,55 +11,50 @@ const DEFAULT_FOUNDRY_SCOPES = [
|
|
|
9
11
|
"ontology:view-unredacted-action-type",
|
|
10
12
|
"ontology:view-object-type"
|
|
11
13
|
];
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
14
|
+
/** Acquire an authenticated metadata backend for the duration of the pull. */
|
|
15
|
+
const makeFoundryPullBackend = Effect.fn("Foundry.makePullBackend")(function* (options) {
|
|
16
|
+
const scopes = options.connection.oauth?.scopes ?? DEFAULT_FOUNDRY_SCOPES;
|
|
17
|
+
const oauth = options.connection.oauth;
|
|
18
|
+
const identity = `foundry:${options.baseUrl}:${oauth?.clientId ?? "api-key"}:${[...scopes].sort().join(",")}`;
|
|
19
|
+
const runtimes = yield* Runtimes;
|
|
20
|
+
const runtime = yield* runtimes.acquire({
|
|
21
|
+
owner: "connect",
|
|
22
|
+
namespace: identity
|
|
23
|
+
}).pipe(Effect.mapError((cause) => classifyBackendFailure("pull.runtime", cause)));
|
|
24
|
+
const manager = yield* makeConnectManager({ services: [{
|
|
25
|
+
connector: makeFoundryServiceConnector({ fetch: oauth?.fetch }),
|
|
26
|
+
instances: [{
|
|
27
|
+
id: options.baseUrl,
|
|
28
|
+
title: "Foundry",
|
|
29
|
+
instanceUrl: options.baseUrl,
|
|
30
|
+
OAuthApplications: oauth ? [{
|
|
31
|
+
id: oauth.clientId,
|
|
32
|
+
title: "Foundry",
|
|
33
|
+
clientId: oauth.clientId,
|
|
34
|
+
scopes,
|
|
35
|
+
redirectUrl: oauth.redirectUrl,
|
|
36
|
+
flow: "authorization-code"
|
|
37
|
+
}] : []
|
|
38
|
+
}]
|
|
39
|
+
}] }).pipe(Effect.provideService(Runtime, runtime));
|
|
40
|
+
const access = yield* acquireConfiguredConnection({
|
|
41
|
+
manager,
|
|
42
|
+
serviceInstanceId: options.baseUrl,
|
|
43
|
+
userId: options.connection.userId,
|
|
44
|
+
apiKey: options.connection.token,
|
|
45
|
+
oauth: oauth ? {
|
|
46
|
+
applicationId: oauth.clientId,
|
|
47
|
+
redirectUrl: oauth.redirectUrl
|
|
48
|
+
} : void 0,
|
|
49
|
+
browserAuthentication: runtimes.browserAuthentication ?? runtime.browserAuthentication
|
|
50
|
+
});
|
|
51
|
+
return yield* makeFoundryMetadataBackend({
|
|
52
|
+
baseUrl: options.baseUrl,
|
|
27
53
|
ontologyId: options.ontologyRid,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
installationId: `foundry-pull:${options.baseUrl}:${options.ontologyRid}:${[...scopes].sort().join(",")}`,
|
|
32
|
-
baseUrl: options.baseUrl,
|
|
33
|
-
runtime,
|
|
34
|
-
connections: {
|
|
35
|
-
token: options.connection.token,
|
|
36
|
-
oauth: options.connection.oauth ? {
|
|
37
|
-
...options.connection.oauth,
|
|
38
|
-
scopes
|
|
39
|
-
} : void 0
|
|
40
|
-
},
|
|
41
|
-
routes: [createFoundryOntologyRoute({ ontologyId: options.ontologyRid })]
|
|
42
|
-
});
|
|
43
|
-
},
|
|
44
|
-
async resolveConnection(installation) {
|
|
45
|
-
const configuredUserId = options.connection.userId;
|
|
46
|
-
const activeConnections = [...installation.connections.values()].filter((connection) => connection.state.status === "active").map((connection) => ({
|
|
47
|
-
userId: connection.userId,
|
|
48
|
-
state: connection.state
|
|
49
|
-
}));
|
|
50
|
-
if (!options.connection.token && !configuredUserId && activeConnections.length > 1) throw new Error("Multiple Foundry users are signed in for this project. Set connection.userId in the ontology pull source.");
|
|
51
|
-
let connection = options.connection.token ? await installation.authentication.signIn.apiToken() : configuredUserId ? activeConnections.find((candidate) => candidate.userId === configuredUserId) : activeConnections[0];
|
|
52
|
-
if (!connection && options.connection.oauth) connection = await installation.authentication.signIn.oauth();
|
|
53
|
-
if (!connection) throw new Error("Foundry ontology pull requires connection.oauth or connection.token.");
|
|
54
|
-
if (configuredUserId && connection.userId !== configuredUserId) throw new Error(`Foundry signed in as "${connection.userId}", but connection.userId is "${configuredUserId}".`);
|
|
55
|
-
return connection;
|
|
56
|
-
},
|
|
57
|
-
transformPulledOntology: (ontology) => addConfiguredUser(applyAttachmentConstraintOverrides(ontology, options.attachmentConstraints ?? []), options.users)
|
|
58
|
-
};
|
|
59
|
-
}
|
|
54
|
+
egress: access.egress
|
|
55
|
+
});
|
|
56
|
+
});
|
|
60
57
|
//#endregion
|
|
61
|
-
export {
|
|
58
|
+
export { makeFoundryPullBackend };
|
|
62
59
|
|
|
63
60
|
//# sourceMappingURL=index.js.map
|
package/lib/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/config/index.ts"],"sourcesContent":["import {\
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/config/index.ts"],"sourcesContent":["import { makeConnectManager, acquireConfiguredConnection } from \"@party-stack/connect\";\nimport { classifyBackendFailure } from \"@party-stack/ontology-backend\";\nimport { Runtimes, Runtime } from \"@party-stack/runtime\";\nimport { Effect } from \"effect\";\nimport { makeFoundryMetadataBackend } from \"../backend.js\";\nimport { makeFoundryServiceConnector } from \"../serviceConnector.js\";\nimport type { FoundryOAuthConnectionOptions } from \"../connectionOptions.js\";\nimport type { OntologyPullConfig } from \"@party-stack/ontology-backend/meta\";\n\nconst DEFAULT_FOUNDRY_SCOPES = [\n \"api:use-ontologies-read\",\n \"offline_access\",\n \"ontology:view-unredacted-action-type\",\n \"ontology:view-object-type\",\n];\n\nexport interface FoundryOntologyPullConnectionOptions {\n oauth?: FoundryOAuthConnectionOptions;\n token?: string;\n userId?: string;\n}\n\nexport interface FoundryPullBackendOptions {\n baseUrl: string;\n ontologyRid: string;\n connection: FoundryOntologyPullConnectionOptions;\n}\n\n/** Acquire an authenticated metadata backend for the duration of the pull. */\nexport const makeFoundryPullBackend = Effect.fn(\"Foundry.makePullBackend\")(function* (\n options: FoundryPullBackendOptions\n) {\n const scopes = options.connection.oauth?.scopes ?? DEFAULT_FOUNDRY_SCOPES;\n const oauth = options.connection.oauth;\n const identity = `foundry:${options.baseUrl}:${oauth?.clientId ?? \"api-key\"}:${[...scopes].sort().join(\",\")}`;\n const runtimes = yield* Runtimes;\n const runtime = yield* runtimes\n .acquire({ owner: \"connect\", namespace: identity })\n .pipe(Effect.mapError((cause) => classifyBackendFailure(\"pull.runtime\", cause)));\n const manager = yield* makeConnectManager({\n services: [\n {\n connector: makeFoundryServiceConnector({ fetch: oauth?.fetch }),\n instances: [\n {\n id: options.baseUrl,\n title: \"Foundry\",\n instanceUrl: options.baseUrl,\n OAuthApplications: oauth\n ? [\n {\n id: oauth.clientId,\n title: \"Foundry\",\n clientId: oauth.clientId,\n scopes,\n redirectUrl: oauth.redirectUrl,\n flow: \"authorization-code\",\n },\n ]\n : [],\n },\n ],\n },\n ],\n }).pipe(Effect.provideService(Runtime, runtime));\n const access = yield* acquireConfiguredConnection({\n manager,\n serviceInstanceId: options.baseUrl,\n userId: options.connection.userId,\n apiKey: options.connection.token,\n oauth: oauth ? { applicationId: oauth.clientId, redirectUrl: oauth.redirectUrl } : undefined,\n browserAuthentication: runtimes.browserAuthentication ?? runtime.browserAuthentication,\n });\n return yield* makeFoundryMetadataBackend({\n baseUrl: options.baseUrl,\n ontologyId: options.ontologyRid,\n egress: access.egress,\n });\n});\n\nexport type FoundryOntologyPullConfig = OntologyPullConfig<Runtimes>;\n"],"mappings":";;;;;;;AASA,MAAM,yBAAyB;CAC3B;CACA;CACA;CACA;AACJ;;AAeA,MAAa,yBAAyB,OAAO,GAAG,yBAAyB,CAAC,CAAC,WACvE,SACF;CACE,MAAM,SAAS,QAAQ,WAAW,OAAO,UAAU;CACnD,MAAM,QAAQ,QAAQ,WAAW;CACjC,MAAM,WAAW,WAAW,QAAQ,QAAQ,GAAG,OAAO,YAAY,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG;CAC1G,MAAM,WAAW,OAAO;CACxB,MAAM,UAAU,OAAO,SAClB,QAAQ;EAAE,OAAO;EAAW,WAAW;CAAS,CAAC,CAAC,CAClD,KAAK,OAAO,UAAU,UAAU,uBAAuB,gBAAgB,KAAK,CAAC,CAAC;CACnF,MAAM,UAAU,OAAO,mBAAmB,EACtC,UAAU,CACN;EACI,WAAW,4BAA4B,EAAE,OAAO,OAAO,MAAM,CAAC;EAC9D,WAAW,CACP;GACI,IAAI,QAAQ;GACZ,OAAO;GACP,aAAa,QAAQ;GACrB,mBAAmB,QACb,CACI;IACI,IAAI,MAAM;IACV,OAAO;IACP,UAAU,MAAM;IAChB;IACA,aAAa,MAAM;IACnB,MAAM;GACV,CACJ,IACA,CAAC;EACX,CACJ;CACJ,CACJ,EACJ,CAAC,CAAC,CAAC,KAAK,OAAO,eAAe,SAAS,OAAO,CAAC;CAC/C,MAAM,SAAS,OAAO,4BAA4B;EAC9C;EACA,mBAAmB,QAAQ;EAC3B,QAAQ,QAAQ,WAAW;EAC3B,QAAQ,QAAQ,WAAW;EAC3B,OAAO,QAAQ;GAAE,eAAe,MAAM;GAAU,aAAa,MAAM;EAAY,IAAI,KAAA;EACnF,uBAAuB,SAAS,yBAAyB,QAAQ;CACrE,CAAC;CACD,OAAO,OAAO,2BAA2B;EACrC,SAAS,QAAQ;EACjB,YAAY,QAAQ;EACpB,QAAQ,OAAO;CACnB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionOptions.d.ts","names":[],"sources":["../src/connectionOptions.ts"],"mappings":";iBAAiB;EACb;EACA;EACA;EACA,eAAe,WAAW"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/lib/context.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/context.d.ts
|
|
2
|
+
export declare const FOUNDRY_CURRENT_USER_CONTEXT_FIELD = "userId";
|
|
3
|
+
/** Foundry's currentUser action argument is the authenticated provider subject ID. */
|
|
4
|
+
export declare const foundryContext: {
|
|
5
|
+
type: {
|
|
6
|
+
kind: "struct";
|
|
7
|
+
value: {
|
|
8
|
+
readonly fields: [{
|
|
9
|
+
readonly name: "userId";
|
|
10
|
+
readonly displayName: "User ID";
|
|
11
|
+
readonly type: {
|
|
12
|
+
kind: "string";
|
|
13
|
+
value: {};
|
|
14
|
+
};
|
|
15
|
+
}];
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
partition: string[][];
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","names":[],"sources":["../src/context.ts"],"mappings":";qBAEa;;qBAGA"}
|