@memberjunction/server 6.1.3 → 6.1.5
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 +30 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/auth/magicLink/MagicLinkService.d.ts +17 -15
- package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.js +49 -35
- package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
- package/dist/auth/magicLink/magicLinkCore.d.ts +14 -33
- package/dist/auth/magicLink/magicLinkCore.d.ts.map +1 -1
- package/dist/auth/magicLink/magicLinkCore.js +20 -52
- package/dist/auth/magicLink/magicLinkCore.js.map +1 -1
- package/dist/config.d.ts +53 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +23 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +11 -23
- package/dist/context.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +87 -3
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +118 -3
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/DeleteOptionsInput.d.ts +8 -1
- package/dist/generic/DeleteOptionsInput.d.ts.map +1 -1
- package/dist/generic/DeleteOptionsInput.js +1 -1
- package/dist/generic/DeleteOptionsInput.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +4 -0
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +10 -3
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -47
- package/dist/index.js.map +1 -1
- package/dist/postgresqlCompat.d.ts +8 -0
- package/dist/postgresqlCompat.d.ts.map +1 -0
- package/dist/postgresqlCompat.js +19 -0
- package/dist/postgresqlCompat.js.map +1 -0
- package/dist/postgresqlPoolSettings.d.ts +108 -0
- package/dist/postgresqlPoolSettings.d.ts.map +1 -0
- package/dist/postgresqlPoolSettings.js +134 -0
- package/dist/postgresqlPoolSettings.js.map +1 -0
- package/dist/resolvers/AdhocQueryResolver.d.ts +10 -20
- package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +54 -174
- package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +44 -6
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +90 -34
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +2 -1
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/adhocTimeout.d.ts +7 -0
- package/dist/resolvers/adhocTimeout.d.ts.map +1 -0
- package/dist/resolvers/adhocTimeout.js +12 -0
- package/dist/resolvers/adhocTimeout.js.map +1 -0
- package/dist/services/TaskGraphActionRunner.d.ts +13 -8
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +16 -15
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/package.json +92 -92
- package/src/__tests__/AdhocQueryResolver.bugs.test.ts +12 -35
- package/src/__tests__/AdhocQueryResolver.pagination.test.ts +6 -2
- package/src/__tests__/AdhocQueryResolver.scopeGuard.test.ts +3 -3
- package/src/__tests__/DeleteOptionsInput.wireShape.test.ts +62 -0
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +216 -2
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +129 -0
- package/src/__tests__/adhocTimeoutClamp.test.ts +26 -0
- package/src/__tests__/cacheInvalidationRecordData.test.ts +177 -0
- package/src/__tests__/magicLink.test.ts +15 -76
- package/src/__tests__/magicLinkService.consume.test.ts +224 -0
- package/src/__tests__/postgresqlPoolSettings.test.ts +131 -0
- package/src/__tests__/translateBracketsToPG.test.ts +20 -0
- package/src/auth/magicLink/MagicLinkService.ts +55 -36
- package/src/auth/magicLink/magicLinkCore.ts +19 -56
- package/src/config.ts +23 -0
- package/src/context.ts +11 -24
- package/src/generic/CacheInvalidationResolver.ts +139 -3
- package/src/generic/DeleteOptionsInput.ts +9 -2
- package/src/generic/ResolverBase.ts +11 -3
- package/src/index.ts +55 -48
- package/src/postgresqlCompat.ts +21 -0
- package/src/postgresqlPoolSettings.ts +213 -0
- package/src/resolvers/AdhocQueryResolver.ts +64 -194
- package/src/resolvers/RealtimeClientSessionResolver.ts +93 -35
- package/src/resolvers/RunAIAgentResolver.ts +4 -1
- package/src/resolvers/adhocTimeout.ts +12 -0
- package/src/services/TaskGraphActionRunner.ts +16 -15
- package/dist/resolvers/adhoc-query-helpers.d.ts +0 -27
- package/dist/resolvers/adhoc-query-helpers.d.ts.map +0 -1
- package/dist/resolvers/adhoc-query-helpers.js +0 -42
- package/dist/resolvers/adhoc-query-helpers.js.map +0 -1
- package/src/__tests__/adhoc-query-helpers.test.ts +0 -50
- package/src/resolvers/adhoc-query-helpers.ts +0 -50
|
@@ -70,26 +70,27 @@ export class TaskGraphActionRunner {
|
|
|
70
70
|
return output;
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
73
|
-
* Rebuilds the action's parameters from the task's
|
|
73
|
+
* Rebuilds the action's parameters from the task's input, one parameter per key.
|
|
74
74
|
*
|
|
75
|
-
* **
|
|
76
|
-
*
|
|
77
|
-
* marked as not-logged
|
|
78
|
-
* value, which is the honest consequence of choosing not to persist it, and the
|
|
79
|
-
* dispatch is opt-in per binding rather than the default.
|
|
75
|
+
* For a **durable entity-action** graph the input was written by `RedactParamsToRecord`
|
|
76
|
+
* (`@memberjunction/actions-base`) at deferral time, so its values have been through redaction:
|
|
77
|
+
* a parameter the binding marked as not-logged arrives absent rather than secret — the action
|
|
78
|
+
* sees a missing value, which is the honest consequence of choosing not to persist it, and the
|
|
79
|
+
* reason durable dispatch is opt-in per binding rather than the default. Every other graph's
|
|
80
|
+
* input is whatever its spec authored. This method re-applies no redaction rule in either case.
|
|
80
81
|
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
82
|
+
* `InputPayload` already carries the dependency outputs: the dispatcher merges them underneath
|
|
83
|
+
* the task's own input (`mergedPayload`) before calling this runner, so a node's explicit
|
|
84
|
+
* parameters win and a step with an input mapping gets exactly the parameters it declared.
|
|
85
|
+
* `DependencyOutputs` is keyed by upstream task ID, not by parameter name, so it is deliberately
|
|
86
|
+
* not read here — spreading it would hand the action one extra parameter per dependency, named
|
|
87
|
+
* by a GUID and holding that task's whole output.
|
|
83
88
|
*/
|
|
84
89
|
buildParams(params) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
merged[name] = value;
|
|
90
|
+
if (!params.InputPayload || typeof params.InputPayload !== 'object') {
|
|
91
|
+
return [];
|
|
88
92
|
}
|
|
89
|
-
|
|
90
|
-
Object.assign(merged, params.InputPayload);
|
|
91
|
-
}
|
|
92
|
-
return Object.entries(merged).map(([Name, Value]) => ({ Name, Value, Type: 'Input' }));
|
|
93
|
+
return Object.entries(params.InputPayload).map(([Name, Value]) => ({ Name, Value, Type: 'Input' }));
|
|
93
94
|
}
|
|
94
95
|
}
|
|
95
96
|
//# sourceMappingURL=TaskGraphActionRunner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskGraphActionRunner.js","sourceRoot":"","sources":["../../src/services/TaskGraphActionRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,MAAM,OAAO,qBAAqB;IACvB,KAAK,CAAC,gBAAgB,CAAC,MAA2B;QACrD,IAAI,CAAC;YACD,MAAM,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,MAAM,CAAC,QAAQ,mCAAmC,EAAE,CAAC;YAC1G,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC;gBACvD,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBAChC,oFAAoF;gBACpF,qFAAqF;gBACrF,4EAA4E;gBAC5E,iFAAiF;gBACjF,OAAO,EAAE,EAAE;aACd,CAAC,CAAC;YAEH,OAAO;gBACH,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;gBACvC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;gBACzD,sFAAsF;gBACtF,kFAAkF;gBAClF,iEAAiE;gBACjE,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE;aACnC,CAAC;QACN,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3D,QAAQ,CAAC,gCAAgC,MAAM,CAAC,MAAM,YAAY,OAAO,EAAE,CAAC,CAAC;YAC7E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;QACrD,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACK,WAAW,CAAC,YAA2B;QAC3C,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,YAAY,IAAI,EAAE,EAAE,CAAC;YACjC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QAC3E,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"TaskGraphActionRunner.js","sourceRoot":"","sources":["../../src/services/TaskGraphActionRunner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/server",
|
|
3
|
-
"version": "6.1.
|
|
3
|
+
"version": "6.1.5",
|
|
4
4
|
"description": "MemberJunction: This project provides API access via GraphQL to the common data store.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./src/index.ts",
|
|
@@ -19,97 +19,97 @@
|
|
|
19
19
|
"@as-integrations/express5": "^1.0.0",
|
|
20
20
|
"@graphql-tools/schema": "^10.0.38",
|
|
21
21
|
"@graphql-tools/utils": "^11.0.0",
|
|
22
|
-
"@memberjunction/actions": "6.1.
|
|
23
|
-
"@memberjunction/actions-apollo": "6.1.
|
|
24
|
-
"@memberjunction/actions-base": "6.1.
|
|
25
|
-
"@memberjunction/actions-bizapps-accounting": "6.1.
|
|
26
|
-
"@memberjunction/actions-bizapps-crm": "6.1.
|
|
27
|
-
"@memberjunction/actions-bizapps-formbuilders": "6.1.
|
|
28
|
-
"@memberjunction/actions-bizapps-lms": "6.1.
|
|
29
|
-
"@memberjunction/actions-bizapps-social": "6.1.
|
|
30
|
-
"@memberjunction/ai": "6.1.
|
|
31
|
-
"@memberjunction/ai-agent-manager": "6.1.
|
|
32
|
-
"@memberjunction/ai-agent-manager-actions": "6.1.
|
|
33
|
-
"@memberjunction/ai-agents": "6.1.
|
|
34
|
-
"@memberjunction/ai-bridge-base": "6.1.
|
|
35
|
-
"@memberjunction/ai-bridge-ringcentral": "6.1.
|
|
36
|
-
"@memberjunction/ai-bridge-server": "6.1.
|
|
37
|
-
"@memberjunction/ai-bridge-teams": "6.1.
|
|
38
|
-
"@memberjunction/ai-bridge-twilio": "6.1.
|
|
39
|
-
"@memberjunction/ai-bridge-vonage": "6.1.
|
|
40
|
-
"@memberjunction/ai-core-plus": "6.1.
|
|
41
|
-
"@memberjunction/ai-engine-base": "6.1.
|
|
42
|
-
"@memberjunction/ai-mcp-client": "6.1.
|
|
43
|
-
"@memberjunction/ai-prompts": "6.1.
|
|
44
|
-
"@memberjunction/ai-provider-bundle": "6.1.
|
|
45
|
-
"@memberjunction/ai-vector-sync": "6.1.
|
|
46
|
-
"@memberjunction/ai-vectordb": "6.1.
|
|
47
|
-
"@memberjunction/ai-vectors-pinecone": "6.1.
|
|
48
|
-
"@memberjunction/aiengine": "6.1.
|
|
49
|
-
"@memberjunction/api-keys": "6.1.
|
|
50
|
-
"@memberjunction/auth-providers": "6.1.
|
|
51
|
-
"@memberjunction/clustering-engine": "6.1.
|
|
52
|
-
"@memberjunction/codegen-lib": "6.1.
|
|
53
|
-
"@memberjunction/communication-engine": "6.1.
|
|
54
|
-
"@memberjunction/communication-ms-graph": "6.1.
|
|
55
|
-
"@memberjunction/communication-sendgrid": "6.1.
|
|
56
|
-
"@memberjunction/communication-types": "6.1.
|
|
57
|
-
"@memberjunction/component-registry-client-sdk": "6.1.
|
|
58
|
-
"@memberjunction/computer-use": "6.1.
|
|
59
|
-
"@memberjunction/computer-use-engine": "6.1.
|
|
60
|
-
"@memberjunction/config": "6.1.
|
|
61
|
-
"@memberjunction/core": "6.1.
|
|
62
|
-
"@memberjunction/core-actions": "6.1.
|
|
63
|
-
"@memberjunction/core-entities": "6.1.
|
|
64
|
-
"@memberjunction/core-entities-server": "6.1.
|
|
65
|
-
"@memberjunction/credentials": "6.1.
|
|
66
|
-
"@memberjunction/data-context": "6.1.
|
|
67
|
-
"@memberjunction/data-context-server": "6.1.
|
|
68
|
-
"@memberjunction/doc-utils": "6.1.
|
|
69
|
-
"@memberjunction/encryption": "6.1.
|
|
70
|
-
"@memberjunction/entity-communications-base": "6.1.
|
|
71
|
-
"@memberjunction/entity-communications-server": "6.1.
|
|
72
|
-
"@memberjunction/esignature": "6.1.
|
|
73
|
-
"@memberjunction/external-change-detection": "6.1.
|
|
74
|
-
"@memberjunction/generic-database-provider": "6.1.
|
|
75
|
-
"@memberjunction/global": "6.1.
|
|
76
|
-
"@memberjunction/graphql-dataprovider": "6.1.
|
|
77
|
-
"@memberjunction/integration-engine": "6.1.
|
|
78
|
-
"@memberjunction/integration-engine-base": "6.1.
|
|
79
|
-
"@memberjunction/integration-progress-artifacts": "6.1.
|
|
80
|
-
"@memberjunction/integration-schema-builder": "6.1.
|
|
81
|
-
"@memberjunction/interactive-component-types": "6.1.
|
|
82
|
-
"@memberjunction/lists": "6.1.
|
|
83
|
-
"@memberjunction/lists-base": "6.1.
|
|
84
|
-
"@memberjunction/livekit-room-server": "6.1.
|
|
85
|
-
"@memberjunction/network-utils": "6.1.
|
|
86
|
-
"@memberjunction/notifications": "6.1.
|
|
87
|
-
"@memberjunction/postgresql-dataprovider": "6.1.
|
|
88
|
-
"@memberjunction/queue": "6.1.
|
|
89
|
-
"@memberjunction/record-comparison": "6.1.
|
|
90
|
-
"@memberjunction/redis-provider": "6.1.
|
|
91
|
-
"@memberjunction/remote-browser-base": "6.1.
|
|
92
|
-
"@memberjunction/remote-browser-cdp": "6.1.
|
|
93
|
-
"@memberjunction/remote-browser-selfhost": "6.1.
|
|
94
|
-
"@memberjunction/remote-browser-server": "6.1.
|
|
95
|
-
"@memberjunction/scheduling-actions": "6.1.
|
|
96
|
-
"@memberjunction/scheduling-base-types": "6.1.
|
|
97
|
-
"@memberjunction/scheduling-engine": "6.1.
|
|
98
|
-
"@memberjunction/scheduling-engine-base": "6.1.
|
|
99
|
-
"@memberjunction/schema-engine": "6.1.
|
|
100
|
-
"@memberjunction/search-engine": "6.1.
|
|
101
|
-
"@memberjunction/server-extensions-core": "6.1.
|
|
102
|
-
"@memberjunction/sql-dialect": "6.1.
|
|
103
|
-
"@memberjunction/sql-parser": "6.1.
|
|
104
|
-
"@memberjunction/sqlserver-dataprovider": "6.1.
|
|
105
|
-
"@memberjunction/storage": "6.1.
|
|
106
|
-
"@memberjunction/tag-engine": "6.1.
|
|
107
|
-
"@memberjunction/tag-engine-base": "6.1.
|
|
108
|
-
"@memberjunction/task-graph": "6.1.
|
|
109
|
-
"@memberjunction/templates": "6.1.
|
|
110
|
-
"@memberjunction/testing-engine": "6.1.
|
|
111
|
-
"@memberjunction/testing-engine-base": "6.1.
|
|
112
|
-
"@memberjunction/version-history": "6.1.
|
|
22
|
+
"@memberjunction/actions": "6.1.5",
|
|
23
|
+
"@memberjunction/actions-apollo": "6.1.5",
|
|
24
|
+
"@memberjunction/actions-base": "6.1.5",
|
|
25
|
+
"@memberjunction/actions-bizapps-accounting": "6.1.5",
|
|
26
|
+
"@memberjunction/actions-bizapps-crm": "6.1.5",
|
|
27
|
+
"@memberjunction/actions-bizapps-formbuilders": "6.1.5",
|
|
28
|
+
"@memberjunction/actions-bizapps-lms": "6.1.5",
|
|
29
|
+
"@memberjunction/actions-bizapps-social": "6.1.5",
|
|
30
|
+
"@memberjunction/ai": "6.1.5",
|
|
31
|
+
"@memberjunction/ai-agent-manager": "6.1.5",
|
|
32
|
+
"@memberjunction/ai-agent-manager-actions": "6.1.5",
|
|
33
|
+
"@memberjunction/ai-agents": "6.1.5",
|
|
34
|
+
"@memberjunction/ai-bridge-base": "6.1.5",
|
|
35
|
+
"@memberjunction/ai-bridge-ringcentral": "6.1.5",
|
|
36
|
+
"@memberjunction/ai-bridge-server": "6.1.5",
|
|
37
|
+
"@memberjunction/ai-bridge-teams": "6.1.5",
|
|
38
|
+
"@memberjunction/ai-bridge-twilio": "6.1.5",
|
|
39
|
+
"@memberjunction/ai-bridge-vonage": "6.1.5",
|
|
40
|
+
"@memberjunction/ai-core-plus": "6.1.5",
|
|
41
|
+
"@memberjunction/ai-engine-base": "6.1.5",
|
|
42
|
+
"@memberjunction/ai-mcp-client": "6.1.5",
|
|
43
|
+
"@memberjunction/ai-prompts": "6.1.5",
|
|
44
|
+
"@memberjunction/ai-provider-bundle": "6.1.5",
|
|
45
|
+
"@memberjunction/ai-vector-sync": "6.1.5",
|
|
46
|
+
"@memberjunction/ai-vectordb": "6.1.5",
|
|
47
|
+
"@memberjunction/ai-vectors-pinecone": "6.1.5",
|
|
48
|
+
"@memberjunction/aiengine": "6.1.5",
|
|
49
|
+
"@memberjunction/api-keys": "6.1.5",
|
|
50
|
+
"@memberjunction/auth-providers": "6.1.5",
|
|
51
|
+
"@memberjunction/clustering-engine": "6.1.5",
|
|
52
|
+
"@memberjunction/codegen-lib": "6.1.5",
|
|
53
|
+
"@memberjunction/communication-engine": "6.1.5",
|
|
54
|
+
"@memberjunction/communication-ms-graph": "6.1.5",
|
|
55
|
+
"@memberjunction/communication-sendgrid": "6.1.5",
|
|
56
|
+
"@memberjunction/communication-types": "6.1.5",
|
|
57
|
+
"@memberjunction/component-registry-client-sdk": "6.1.5",
|
|
58
|
+
"@memberjunction/computer-use": "6.1.5",
|
|
59
|
+
"@memberjunction/computer-use-engine": "6.1.5",
|
|
60
|
+
"@memberjunction/config": "6.1.5",
|
|
61
|
+
"@memberjunction/core": "6.1.5",
|
|
62
|
+
"@memberjunction/core-actions": "6.1.5",
|
|
63
|
+
"@memberjunction/core-entities": "6.1.5",
|
|
64
|
+
"@memberjunction/core-entities-server": "6.1.5",
|
|
65
|
+
"@memberjunction/credentials": "6.1.5",
|
|
66
|
+
"@memberjunction/data-context": "6.1.5",
|
|
67
|
+
"@memberjunction/data-context-server": "6.1.5",
|
|
68
|
+
"@memberjunction/doc-utils": "6.1.5",
|
|
69
|
+
"@memberjunction/encryption": "6.1.5",
|
|
70
|
+
"@memberjunction/entity-communications-base": "6.1.5",
|
|
71
|
+
"@memberjunction/entity-communications-server": "6.1.5",
|
|
72
|
+
"@memberjunction/esignature": "6.1.5",
|
|
73
|
+
"@memberjunction/external-change-detection": "6.1.5",
|
|
74
|
+
"@memberjunction/generic-database-provider": "6.1.5",
|
|
75
|
+
"@memberjunction/global": "6.1.5",
|
|
76
|
+
"@memberjunction/graphql-dataprovider": "6.1.5",
|
|
77
|
+
"@memberjunction/integration-engine": "6.1.5",
|
|
78
|
+
"@memberjunction/integration-engine-base": "6.1.5",
|
|
79
|
+
"@memberjunction/integration-progress-artifacts": "6.1.5",
|
|
80
|
+
"@memberjunction/integration-schema-builder": "6.1.5",
|
|
81
|
+
"@memberjunction/interactive-component-types": "6.1.5",
|
|
82
|
+
"@memberjunction/lists": "6.1.5",
|
|
83
|
+
"@memberjunction/lists-base": "6.1.5",
|
|
84
|
+
"@memberjunction/livekit-room-server": "6.1.5",
|
|
85
|
+
"@memberjunction/network-utils": "6.1.5",
|
|
86
|
+
"@memberjunction/notifications": "6.1.5",
|
|
87
|
+
"@memberjunction/postgresql-dataprovider": "6.1.5",
|
|
88
|
+
"@memberjunction/queue": "6.1.5",
|
|
89
|
+
"@memberjunction/record-comparison": "6.1.5",
|
|
90
|
+
"@memberjunction/redis-provider": "6.1.5",
|
|
91
|
+
"@memberjunction/remote-browser-base": "6.1.5",
|
|
92
|
+
"@memberjunction/remote-browser-cdp": "6.1.5",
|
|
93
|
+
"@memberjunction/remote-browser-selfhost": "6.1.5",
|
|
94
|
+
"@memberjunction/remote-browser-server": "6.1.5",
|
|
95
|
+
"@memberjunction/scheduling-actions": "6.1.5",
|
|
96
|
+
"@memberjunction/scheduling-base-types": "6.1.5",
|
|
97
|
+
"@memberjunction/scheduling-engine": "6.1.5",
|
|
98
|
+
"@memberjunction/scheduling-engine-base": "6.1.5",
|
|
99
|
+
"@memberjunction/schema-engine": "6.1.5",
|
|
100
|
+
"@memberjunction/search-engine": "6.1.5",
|
|
101
|
+
"@memberjunction/server-extensions-core": "6.1.5",
|
|
102
|
+
"@memberjunction/sql-dialect": "6.1.5",
|
|
103
|
+
"@memberjunction/sql-parser": "6.1.5",
|
|
104
|
+
"@memberjunction/sqlserver-dataprovider": "6.1.5",
|
|
105
|
+
"@memberjunction/storage": "6.1.5",
|
|
106
|
+
"@memberjunction/tag-engine": "6.1.5",
|
|
107
|
+
"@memberjunction/tag-engine-base": "6.1.5",
|
|
108
|
+
"@memberjunction/task-graph": "6.1.5",
|
|
109
|
+
"@memberjunction/templates": "6.1.5",
|
|
110
|
+
"@memberjunction/testing-engine": "6.1.5",
|
|
111
|
+
"@memberjunction/testing-engine-base": "6.1.5",
|
|
112
|
+
"@memberjunction/version-history": "6.1.5",
|
|
113
113
|
"@octokit/auth-app": "^7.1.5",
|
|
114
114
|
"@octokit/rest": "^21.1.1",
|
|
115
115
|
"@types/compression": "^1.8.1",
|
|
@@ -60,20 +60,13 @@ function stubMetadata(): void {
|
|
|
60
60
|
|
|
61
61
|
describe('AdhocQueryResolver source-shape contract', () => {
|
|
62
62
|
|
|
63
|
-
it('Bug #2: AdhocQueryResolver must
|
|
63
|
+
it('Bug #2: AdhocQueryResolver must hand the SQL to the provider ad-hoc path, which renders it', () => {
|
|
64
64
|
const src = readResolverSource();
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
// a partial subset.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
expect(importsRenderPipeline).toBe(true);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('Bug #2: AdhocQueryResolver must call RenderPipeline.Run() somewhere (currently does not)', () => {
|
|
74
|
-
const src = readResolverSource();
|
|
75
|
-
const callsRenderPipelineRun = /\bRenderPipeline\.Run\s*\(/.test(src);
|
|
76
|
-
expect(callsRenderPipelineRun).toBe(true);
|
|
65
|
+
// Composition, comment removal, the single-read rule and the row cap all happen in the
|
|
66
|
+
// provider's ad-hoc path (RenderPipeline), shared with in-process callers. The resolver must
|
|
67
|
+
// delegate there rather than re-implement a partial subset.
|
|
68
|
+
expect(/\.RunQuery\(\{[\s\S]*SQL: input\.SQL/.test(src)).toBe(true);
|
|
69
|
+
expect(/\bRenderPipeline\b/.test(src)).toBe(false);
|
|
77
70
|
});
|
|
78
71
|
|
|
79
72
|
it('Bug #3: AdhocQueryResolver must NOT contain the manual `SELECT TOP N * FROM (...)` wrap', () => {
|
|
@@ -126,29 +119,13 @@ ORDER BY JoinYear DESC`;
|
|
|
126
119
|
// success/failure, the resolver should never hand a string containing
|
|
127
120
|
// "{{query:" to SQL Server.
|
|
128
121
|
//
|
|
129
|
-
// We encode this as a contract on the resolver source: it must
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
// "{{query:" must not reach `request.query(...)`.
|
|
122
|
+
// We encode this as a contract on the resolver source: it must not execute SQL itself.
|
|
123
|
+
// It hands input.SQL to the read-only provider's ad-hoc path, which renders it through
|
|
124
|
+
// RenderPipeline (resolving composition tokens) before anything reaches the database.
|
|
133
125
|
const src = readResolverSource();
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
// call above; here we additionally require that input.SQL flows
|
|
138
|
-
// through RenderPipeline.Run rather than directly to request.query.
|
|
139
|
-
//
|
|
140
|
-
// The current code contains `request.query(executableSql)` where
|
|
141
|
-
// `executableSql` is derived from input.SQL via a string concat —
|
|
142
|
-
// bypassing the pipeline entirely.
|
|
143
|
-
const directlyExecutesInputSQL = /request\.query\s*\(\s*input\.SQL\s*\)/.test(src);
|
|
144
|
-
expect(directlyExecutesInputSQL).toBe(false);
|
|
145
|
-
|
|
146
|
-
// And — the executable string must be derived from a pipeline result,
|
|
147
|
-
// not from an inline template literal that just concatenates input.SQL.
|
|
148
|
-
// Heuristic: the file should reference `FinalSQL` (the pipeline's
|
|
149
|
-
// output field) somewhere — this is what gets sent to the DB.
|
|
150
|
-
const referencesFinalSQL = /\bFinalSQL\b/.test(src);
|
|
151
|
-
expect(referencesFinalSQL).toBe(true);
|
|
126
|
+
const executesSQLItself = /request\.query\s*\(|\.ExecuteSQL\s*\(|new sql\.Request/.test(src);
|
|
127
|
+
expect(executesSQLItself).toBe(false);
|
|
128
|
+
expect(/\.RunQuery\(\{[\s\S]*SQL: input\.SQL/.test(src)).toBe(true);
|
|
152
129
|
});
|
|
153
130
|
});
|
|
154
131
|
|
|
@@ -79,9 +79,13 @@ describe('AdhocQueryResolver pagination source-shape contract', () => {
|
|
|
79
79
|
expect(/TotalRowCount:\s*recordset\.length/.test(src)).toBe(false);
|
|
80
80
|
});
|
|
81
81
|
|
|
82
|
-
it('must
|
|
82
|
+
it('must page through the read-only provider, passing MaxRows, StartRow and the timeout', () => {
|
|
83
83
|
const src = readResolverSource();
|
|
84
|
-
|
|
84
|
+
// The provider's ad-hoc path renders, pages in the database and counts; the resolver
|
|
85
|
+
// must hand it the paging inputs rather than run SQL itself.
|
|
86
|
+
expect(/GetReadOnlyProvider\(/.test(src)).toBe(true);
|
|
87
|
+
expect(/\.RunQuery\(\{[\s\S]*SQL: input\.SQL[\s\S]*MaxRows: input\.MaxRows[\s\S]*StartRow: startRow[\s\S]*TimeoutSeconds/.test(src)).toBe(true);
|
|
88
|
+
expect(/from 'mssql'|new sql\.Request/.test(src)).toBe(false);
|
|
85
89
|
});
|
|
86
90
|
});
|
|
87
91
|
|
|
@@ -71,12 +71,12 @@ describe('AdhocQueryResolver scope guard placement', () => {
|
|
|
71
71
|
expect(/\bIsScopeLimitedPrincipal\s*\(/.test(src)).toBe(true);
|
|
72
72
|
});
|
|
73
73
|
|
|
74
|
-
it('refuses the principal BEFORE acquiring
|
|
74
|
+
it('refuses the principal BEFORE acquiring the read-only provider', () => {
|
|
75
75
|
// Authorization must gate the work, not run alongside it: if the guard landed after
|
|
76
|
-
// the
|
|
76
|
+
// the provider were acquired (or the SQL executed), a scope-limited caller would already
|
|
77
77
|
// have reached the database.
|
|
78
78
|
const guardAt = src.indexOf('IsScopeLimitedPrincipal(');
|
|
79
|
-
const dataSourceAt = src.indexOf('
|
|
79
|
+
const dataSourceAt = src.indexOf('GetReadOnlyProvider(');
|
|
80
80
|
expect(guardAt).toBeGreaterThan(-1);
|
|
81
81
|
expect(dataSourceAt).toBeGreaterThan(-1);
|
|
82
82
|
expect(guardAt).toBeLessThan(dataSourceAt);
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `DeleteOptionsInput.SkipRecordChanges` is optional on the wire.
|
|
3
|
+
*
|
|
4
|
+
* The field arrived in 6.1.0 as `Boolean!`. 5.51.x clients spell out every delete option in
|
|
5
|
+
* `options___`, and none of them knows this field, so on 6.1.0 to 6.1.3 every such delete failed
|
|
6
|
+
* schema validation with `Field "DeleteOptionsInput.SkipRecordChanges" of required type
|
|
7
|
+
* "Boolean!" was not provided` (Izzy, 6.1 certification gate 5). The server never honours the
|
|
8
|
+
* flag from the wire anyway (see SanitizeFromWire), so absent and `false` are the same request.
|
|
9
|
+
*
|
|
10
|
+
* These tests pin the built schema type, which is what a client's validation runs against, and the
|
|
11
|
+
* sanitizer's behaviour on a 5.51-shaped request that omits the field entirely.
|
|
12
|
+
*/
|
|
13
|
+
import 'reflect-metadata';
|
|
14
|
+
import { describe, it, expect } from 'vitest';
|
|
15
|
+
import { Arg, buildSchema, Mutation, Query, Resolver } from 'type-graphql';
|
|
16
|
+
import type { GraphQLInputObjectType } from 'graphql';
|
|
17
|
+
import { DeleteOptionsInput } from '../generic/DeleteOptionsInput.js';
|
|
18
|
+
|
|
19
|
+
@Resolver()
|
|
20
|
+
class ProbeResolver {
|
|
21
|
+
// type-graphql refuses a schema with no Query type; the probe only needs the mutation.
|
|
22
|
+
@Query(() => Boolean)
|
|
23
|
+
Ping(): boolean {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@Mutation(() => Boolean)
|
|
28
|
+
Probe(@Arg('options___', () => DeleteOptionsInput) options: DeleteOptionsInput): boolean {
|
|
29
|
+
return options.SkipRecordChanges === true;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
describe('DeleteOptionsInput wire shape', () => {
|
|
34
|
+
it('builds SkipRecordChanges as optional with a false default, every other field required', async () => {
|
|
35
|
+
const schema = await buildSchema({ resolvers: [ProbeResolver], validate: false });
|
|
36
|
+
// Read the built type directly rather than printing the schema: printSchema runs
|
|
37
|
+
// instanceOf checks that fail when type-graphql and the test resolve separate copies
|
|
38
|
+
// of `graphql`, and the field objects carry everything the assertion needs.
|
|
39
|
+
const input = schema.getType('DeleteOptionsInput') as GraphQLInputObjectType;
|
|
40
|
+
expect(input).toBeDefined();
|
|
41
|
+
const fields = input.getFields();
|
|
42
|
+
expect(String(fields['SkipRecordChanges'].type)).toBe('Boolean');
|
|
43
|
+
expect(fields['SkipRecordChanges'].defaultValue).toBe(false);
|
|
44
|
+
for (const required of ['SkipEntityAIActions', 'SkipEntityActions', 'ReplayOnly', 'IsParentEntityDelete']) {
|
|
45
|
+
expect(String(fields[required].type), required).toBe('Boolean!');
|
|
46
|
+
expect(fields[required].defaultValue, required).toBeUndefined();
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('sanitizer treats a 5.51-shaped request that omits the field as the ordinary case', () => {
|
|
51
|
+
const legacy = {
|
|
52
|
+
SkipEntityAIActions: false,
|
|
53
|
+
SkipEntityActions: true,
|
|
54
|
+
ReplayOnly: false,
|
|
55
|
+
IsParentEntityDelete: false,
|
|
56
|
+
} as DeleteOptionsInput;
|
|
57
|
+
const sanitized = DeleteOptionsInput.SanitizeFromWire(legacy, 'Customers', 'user@example.test');
|
|
58
|
+
expect(sanitized).toBe(legacy);
|
|
59
|
+
expect(sanitized.SkipRecordChanges).toBeUndefined();
|
|
60
|
+
expect(sanitized.SkipEntityActions).toBe(true);
|
|
61
|
+
});
|
|
62
|
+
});
|