Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/funny-apples-pay.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@firebase/data-connect': minor
'firebase': minor
---

Add validateArgsWithOptions() to Data Connect
2 changes: 1 addition & 1 deletion common/api-review/data-connect.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ export function executeMutation<Data, Variables>(mutationRef: MutationRef<Data,
// @public
export function executeQuery<Data, Variables>(queryRef: QueryRef<Data, Variables>, options?: ExecuteQueryOptions): QueryPromise<Data, Variables>;

// @public (undocumented)
// @public
export interface ExecuteQueryOptions {
// (undocumented)
fetchPolicy: QueryFetchPolicy;
Expand Down
4 changes: 3 additions & 1 deletion packages/data-connect/src/core/query/queryOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,13 @@ export const QueryFetchPolicy = {

/*
* Represents policy for how executeQuery fetches data
*
*/
export type QueryFetchPolicy =
(typeof QueryFetchPolicy)[keyof typeof QueryFetchPolicy];

/**
* Options for executing a query.
*/
export interface ExecuteQueryOptions {
fetchPolicy: QueryFetchPolicy;
}
82 changes: 76 additions & 6 deletions packages/data-connect/src/util/validateArgs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,44 +15,114 @@
* limitations under the License.
*/

import { ExecuteQueryOptions } from '../api';
import {
ConnectorConfig,
DataConnect,
getDataConnect
} from '../api/DataConnect';
import { Code, DataConnectError } from '../core/error';

interface ParsedArgs<Variables> {
dc: DataConnect;
vars: Variables;
options?: ExecuteQueryOptions;
}

/**
* The generated SDK will allow the user to pass in either the variable or the data connect instance with the variable,
* and this function validates the variables and returns back the DataConnect instance and variables based on the arguments passed in.
* The generated SDK will allow the user to pass in either the variables or the data connect instance
* with the variables. This function validates the variables and returns back the DataConnect instance
* and variables based on the arguments passed in.
*
* Generated SDKs generated from versions 3.2.0 and lower of the Data Connect emulator binary are
* NOT concerned with options, and will use this function to validate arguments.
*
* @param connectorConfig
* @param dcOrVars
* @param vars
* @param validateVars
* @param variablesRequired
* @returns {DataConnect} and {Variables} instance
* @internal
*/
export function validateArgs<Variables extends object>(
connectorConfig: ConnectorConfig,
dcOrVars?: DataConnect | Variables,
vars?: Variables,
validateVars?: boolean
variablesRequired?: boolean
): ParsedArgs<Variables> {
let dcInstance: DataConnect;
let realVars: Variables;
if (dcOrVars && 'enableEmulator' in dcOrVars) {

const dcFirstArg = dcOrVars && 'enableEmulator' in dcOrVars;

if (dcFirstArg) {
dcInstance = dcOrVars as DataConnect;
realVars = vars as Variables;
} else {
dcInstance = getDataConnect(connectorConfig);
realVars = dcOrVars as Variables;
}
if (!dcInstance || (!realVars && validateVars)) {

if (!dcInstance || (!realVars && variablesRequired)) {
throw new DataConnectError(Code.INVALID_ARGUMENT, 'Variables required.');
}

return { dc: dcInstance, vars: realVars };
}

/**
* The generated SDK will allow the user to pass in either the variables or the data connect instance
* with the variables, and/or options. This function validates the variables and returns back the
* DataConnect instance and variables, and potentially options, based on the arguments passed in.
*
* Generated SDKs generated from versions 3.2.0 and higher of the Data Connect emulator binary are
* in fact concerned with options, and will use this function to validate arguments.
*
* @param connectorConfig
* @param dcOrVarsOrOptions
* @param varsOrOptions
* @param variablesRequired
* @param options
* @returns {DataConnect} and {Variables} instance, and optionally {ExecuteQueryOptions}
* @internal
*/
export function validateArgsWithOptions<Variables extends object>(
connectorConfig: ConnectorConfig,
dcOrVarsOrOptions?: DataConnect | Variables | ExecuteQueryOptions,
varsOrOptions?: Variables | ExecuteQueryOptions,
options?: ExecuteQueryOptions,
hasVars?: boolean,
variablesRequired?: boolean
): ParsedArgs<Variables> {
let dcInstance: DataConnect;
let realVars: Variables;
let realOptions: ExecuteQueryOptions;

const dcFirstArg = dcOrVarsOrOptions && 'enableEmulator' in dcOrVarsOrOptions;

if (dcFirstArg) {
dcInstance = dcOrVarsOrOptions as DataConnect;
if (hasVars) {
realVars = varsOrOptions as Variables;
realOptions = options as ExecuteQueryOptions;
} else {
realVars = undefined as unknown as Variables;
realOptions = varsOrOptions as ExecuteQueryOptions;
}
} else {
dcInstance = getDataConnect(connectorConfig);
if (hasVars) {
realVars = dcOrVarsOrOptions as Variables;
realOptions = varsOrOptions as ExecuteQueryOptions;
} else {
realVars = undefined as unknown as Variables;
realOptions = dcOrVarsOrOptions as ExecuteQueryOptions;
}
}

if (!dcInstance || (!realVars && variablesRequired)) {
throw new DataConnectError(Code.INVALID_ARGUMENT, 'Variables required.');
}

return { dc: dcInstance, vars: realVars, options: realOptions };
}
Loading
Loading