Global config

GlobalConfig is an in-memory store for all your globally needed configuration values.


Wherever you import your config, the configuration previously set will be present in the imported GlobalConfig.

The config serves as container for some pre-defined keys that you may set that upfront can later use, and to be used in your script to the same extent.

To use, just instantiate a new GlobalConfig, and you're ready to interact with your existing configuration by the available methods.


For typescript users it might be advisable to export your configuration from a single place to take advantage from the type hinting your own configuration provides.

import { GlobalConfig } from '@upfrontjs/framework';
import type { MyConfiguration } from './types'

const config: GlobalConfig<MyConfiguration> = new GlobalConfig({});
export { config };




Given the set and get methods are cloning all values that are not of type function; usedAsReference static property has been added on the GlobalConfig class as an escape hatch. All property names set in this array will be returned as is without cloning. If '*' is present in this array, all values will be returned as is. The default value is ['headers'] as no subtype of HeadersInit is of type function.



The class constructor takes a configuration object which gets deep merged into the existing configuration if any.


To avoid triggering circular analysis in typescript when using the set method, when using the constructor you should set an initial type.

import { GlobalConfig } from '@upfrontjs/framework';
import type { Configuration } from '@upfrontjs/framework';

const config: GlobalConfig<Configuration> = new GlobalConfig();

config.set('key', 'value');


import { GlobalConfig } from '@upfrontjs/framework';
import type { Configuration } from '@upfrontjs/framework';

const config = new GlobalConfig();

config.set('key', 'value'); // TS2775: Assertions require every name in the call target to be declared with an explicit type annotation.


The set method sets the given value in the config.

config.set('key', 'value');

config.has('key'); // true


Values will be cloned subject to usedAsReference.


The get method returns the requested value. If the key not found it returns the second optional parameter, which is the default value.

config.set('key', 'value');

config.get('key'); // 'value'
config.get('nonExistentKey'); // undefined
config.get('nonExistentKey', 1); // 1


Values will be cloned subject to usedAsReference.


The get method determines whether the given key is set in the config.

config.has('key'); // false

config.set('key', 'value');

config.has('key'); // true


The unset method removes the given key from the config.

config.set('key', 'value');

config.has('key'); // false


The reset method removes all the values from the config.

config.set('key', 'value');

config.has('key'); // false


Configuration is an interface describing some predefined keys, all of which are optional. If a configuration is given to the GlobalConfig, and any of the pre-defined keys are present, they must match the type set in the Configuration. The following keys are present:


This value if set, will be used in the model on requests. It must implement the ApiCaller interface.


This value if set, will be used in the model on requests. It must implement the HandlesApiResponse interface.


This value if set, will be used by to cast values to the date-time library of your choice, if casting is configured on the model. This has to be either a function which will be called with the value dateTime(attribute) or a class with will be constructed with the value e.g.: new DateTime(attribute)


This value if set will be merged into the request headers by the API service class if that service is used. This value has to match the type of HeadersInit.


This is a string that the model's endpoint will be prefixed by on requests. Example value would be: ''.


This value if set, it will be available for consuming in your Factories under the member key random.


The requestMiddleware is an object that implements the RequestMiddleware interface. This means it has a handle method which takes the following arguments:

  • url (the target url of the request)
  • method (the request method used)
  • data (an optional form data or object that to be sent to the server)
  • customHeaders (an optional object that includes the custom headers passed to the call method)
  • queryParameters (an optional object that may include the result of the query builder)

This handle method should return an object that may have the following properties data, customHeaders, queryParameters. These properties should be matching the initial types from the argument or be the value undefined (to remove the value). The method may or may not return a promiseopen in new window.

This middleware allows tapping into the request for transforming it before it's passed along to the ApiCaller.