Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9d33dd6

Browse files
feat(data-connect): Add validateArgsWithOptions() (#9614)
* update validateArgs to handle new options arguments * add validateArgs unit tests * split functionality into separate functions, add changeset * add hasVars argument to help differentiate first argument * update changelog * export validateArgs * remove vestigial console log * update changeset
1 parent 891a0c9 commit 9d33dd6

6 files changed

Lines changed: 487 additions & 9 deletions

File tree

.changeset/funny-apples-pay.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@firebase/data-connect': minor
3+
'firebase': minor
4+
---
5+
6+
Add validateArgsWithOptions() to Data Connect (internal change, no need to add to public release notes).

common/api-review/data-connect.api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ export function executeMutation<Data, Variables>(mutationRef: MutationRef<Data,
165165
// @public
166166
export function executeQuery<Data, Variables>(queryRef: QueryRef<Data, Variables>, options?: ExecuteQueryOptions): QueryPromise<Data, Variables>;
167167

168-
// @public (undocumented)
168+
// @public
169169
export interface ExecuteQueryOptions {
170170
// (undocumented)
171171
fetchPolicy: QueryFetchPolicy;

packages/data-connect/src/api/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export * from './Reference';
3939
export * from './Mutation';
4040
export * from './query';
4141
export { setLogLevel } from '../logger';
42-
export { validateArgs } from '../util/validateArgs';
42+
export { validateArgs, validateArgsWithOptions } from '../util/validateArgs';
4343
export {
4444
DataConnectErrorCode,
4545
Code,

packages/data-connect/src/core/query/queryOptions.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ export const QueryFetchPolicy = {
2323

2424
/*
2525
* Represents policy for how executeQuery fetches data
26-
*
2726
*/
2827
export type QueryFetchPolicy =
2928
(typeof QueryFetchPolicy)[keyof typeof QueryFetchPolicy];
3029

30+
/**
31+
* Options for executing a query.
32+
*/
3133
export interface ExecuteQueryOptions {
3234
fetchPolicy: QueryFetchPolicy;
3335
}

packages/data-connect/src/util/validateArgs.ts

Lines changed: 76 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,44 +15,114 @@
1515
* limitations under the License.
1616
*/
1717

18+
import { ExecuteQueryOptions } from '../api';
1819
import {
1920
ConnectorConfig,
2021
DataConnect,
2122
getDataConnect
2223
} from '../api/DataConnect';
2324
import { Code, DataConnectError } from '../core/error';
25+
2426
interface ParsedArgs<Variables> {
2527
dc: DataConnect;
2628
vars: Variables;
29+
options?: ExecuteQueryOptions;
2730
}
2831

2932
/**
30-
* The generated SDK will allow the user to pass in either the variable or the data connect instance with the variable,
31-
* and this function validates the variables and returns back the DataConnect instance and variables based on the arguments passed in.
33+
* The generated SDK will allow the user to pass in either the variables or the data connect instance
34+
* with the variables. This function validates the variables and returns back the DataConnect instance
35+
* and variables based on the arguments passed in.
36+
*
37+
* Generated SDKs generated from versions 3.2.0 and lower of the Data Connect emulator binary are
38+
* NOT concerned with options, and will use this function to validate arguments.
39+
*
3240
* @param connectorConfig
3341
* @param dcOrVars
3442
* @param vars
35-
* @param validateVars
43+
* @param variablesRequired
3644
* @returns {DataConnect} and {Variables} instance
3745
* @internal
3846
*/
3947
export function validateArgs<Variables extends object>(
4048
connectorConfig: ConnectorConfig,
4149
dcOrVars?: DataConnect | Variables,
4250
vars?: Variables,
43-
validateVars?: boolean
51+
variablesRequired?: boolean
4452
): ParsedArgs<Variables> {
4553
let dcInstance: DataConnect;
4654
let realVars: Variables;
47-
if (dcOrVars && 'enableEmulator' in dcOrVars) {
55+
56+
const dcFirstArg = dcOrVars && 'enableEmulator' in dcOrVars;
57+
58+
if (dcFirstArg) {
4859
dcInstance = dcOrVars as DataConnect;
4960
realVars = vars as Variables;
5061
} else {
5162
dcInstance = getDataConnect(connectorConfig);
5263
realVars = dcOrVars as Variables;
5364
}
54-
if (!dcInstance || (!realVars && validateVars)) {
65+
66+
if (!dcInstance || (!realVars && variablesRequired)) {
5567
throw new DataConnectError(Code.INVALID_ARGUMENT, 'Variables required.');
5668
}
69+
5770
return { dc: dcInstance, vars: realVars };
5871
}
72+
73+
/**
74+
* The generated SDK will allow the user to pass in either the variables or the data connect instance
75+
* with the variables, and/or options. This function validates the variables and returns back the
76+
* DataConnect instance and variables, and potentially options, based on the arguments passed in.
77+
*
78+
* Generated SDKs generated from versions 3.2.0 and higher of the Data Connect emulator binary are
79+
* in fact concerned with options, and will use this function to validate arguments.
80+
*
81+
* @param connectorConfig
82+
* @param dcOrVarsOrOptions
83+
* @param varsOrOptions
84+
* @param variablesRequired
85+
* @param options
86+
* @returns {DataConnect} and {Variables} instance, and optionally {ExecuteQueryOptions}
87+
* @internal
88+
*/
89+
export function validateArgsWithOptions<Variables extends object>(
90+
connectorConfig: ConnectorConfig,
91+
dcOrVarsOrOptions?: DataConnect | Variables | ExecuteQueryOptions,
92+
varsOrOptions?: Variables | ExecuteQueryOptions,
93+
options?: ExecuteQueryOptions,
94+
hasVars?: boolean,
95+
variablesRequired?: boolean
96+
): ParsedArgs<Variables> {
97+
let dcInstance: DataConnect;
98+
let realVars: Variables;
99+
let realOptions: ExecuteQueryOptions;
100+
101+
const dcFirstArg = dcOrVarsOrOptions && 'enableEmulator' in dcOrVarsOrOptions;
102+
103+
if (dcFirstArg) {
104+
dcInstance = dcOrVarsOrOptions as DataConnect;
105+
if (hasVars) {
106+
realVars = varsOrOptions as Variables;
107+
realOptions = options as ExecuteQueryOptions;
108+
} else {
109+
realVars = undefined as unknown as Variables;
110+
realOptions = varsOrOptions as ExecuteQueryOptions;
111+
}
112+
} else {
113+
dcInstance = getDataConnect(connectorConfig);
114+
if (hasVars) {
115+
realVars = dcOrVarsOrOptions as Variables;
116+
realOptions = varsOrOptions as ExecuteQueryOptions;
117+
} else {
118+
realVars = undefined as unknown as Variables;
119+
realOptions = dcOrVarsOrOptions as ExecuteQueryOptions;
120+
}
121+
}
122+
123+
if (!dcInstance || (!realVars && variablesRequired)) {
124+
throw new DataConnectError(Code.INVALID_ARGUMENT, 'Variables required.');
125+
}
126+
127+
return { dc: dcInstance, vars: realVars, options: realOptions };
128+
}

0 commit comments

Comments
 (0)