Below contains an overview of the specifications for the Bundle Builder API, including TypeScript definitions & detailed descriptions.
BundleDocument Interface
The specification for a single document within the configured collection:
type
BundleDocument
=
{
// A list of document IDs to serve in the bundle.
docs?
:
Array<string>
;
// A map containing individual named queries and their definitions.
queries?
:
Map<string
,
QueryDefinition
[]>;
// A map of parameters and their definitions, which can be provided to a query definition.
params?
:
Map<string
,
ParamDefinition
> ;
// Specifies how long to keep the bundle in the client's cache, in seconds. If not defined, client-side cache is disabled.
clientCache?
:
string
;
// Only used in combination with Firebase Hosting. Specifies how long to keep the bundle in Firebase Hosting CDN cache, in seconds.
serverCache
:
string
;
// Specifies how long (in seconds) to keep the bundle in a Cloud Storage bucket, in seconds. If not defined, Cloud Storage bucket is not accessed.
fileCache?
:
string
;
// If a 'File Cache' is specified, bundles created before this timestamp will not be file cached.
notBefore?
:
Timestamp
;
};
ParamDefinition Interface
The specification of a single parameter defined in a BundleDocument
.
type
ParamDefinition
=
{
// Whether this parameter is required. If not provided as a query string, an error will be thrown.
required
:
boolean
;
// The type of value which will be parsed, defaults to 'string'.
type
?:
|
"string"
|
"integer"
|
"float"
|
"boolean"
|
"string-array"
|
"integer-array"
|
"float-array"
;
};
For example, given the follow parameter:
params
:
{
name
:
{
required
:
true
,
type
:
'string'
,
}
}
When making a request to the bundle HTTP endpoint, the parameter can be provided via a query parameter, e.g. ?name=david
. The parameter can be used within a QueryDefinition
(see below) value ( $name
) to dynamically create bundles.
QueryDefinition Interface
A query definition is used to create named queries on the bundle. Each object within the queries
map will create a new named query, using the object key as the name. Each query must specify a collection, and optionally a list of query conditions to perform.
type
QueryDefinition
=
{
// The collection to perform the query on.
collection
:
string
;
// An optional list of conditions to perform on the specified collection.
conditions?
:
QueryCondition
[];
};
The conditions
parameter can contain an array of QueryCondition
interfaces. Each item in the array must only include a single condition.
type
QueryCondition
=
{
// Performs a `where` filter on the collection on a given FieldPath, operator and value.
where
?:
[
string
,
(
|
"<"
|
"<="
|
"=="
|
">="
|
">"
|
"!="
|
"array-contains"
|
"in"
|
"not-in"
|
"array-contains-any"
),
any
];
orderBy
?:
[
string
,
(
"asc"
|
"desc"
)
?
];
limit?
:
number
;
limitToLast?
:
number
;
offset?
:
number
;
startAt?
:
string
;
startAfter?
:
string
;
endAt?
:
string
;
endBefore?
:
string
;
};
For example, to create a query named "products" on a products
collection with a where and limit condition, the data structure output should match the following:
queries
:
{
products
:
{
collection
:
'products'
,
conditions
:
[
{
where
:
[
'type'
,
'=='
,
'featured'
]
},
{
limit
:
10
},
],
}
}
When providing array values to in
, not-in
, or array-contains-any
filters, you must provide a comma separated value as the value as nested array values are not supported in Firestore. For example:
{
where
:
[
'category'
,
'in'
,
'womens,shorts'
]
},
// ['womens', 'shorts']
Any number value will be parsed as a number, however if a string number value is required it should be wrapped in parentheses:
{
where
:
[
'price'
,
'in'
,
'1,2.5'
]
},
// [1, 2.5]
{
where
:
[
'price'
,
'in'
,
'"1","2.5"'
]
},
// ['1', '2.5']
Conditions can also be used alongside parameters. For example, if a parameter type
is defined (see above), this can be provided to a condition value to provide dynamic data bundles via the $
syntax:
// ?type=featured
conditions
:
[
{
where
:
[
'type'
,
'=='
,
'$type'
]
},