Skip to content

Commit

Permalink
feat(node-env): introduce shared useValues property (#147)
Browse files Browse the repository at this point in the history
  • Loading branch information
patrickmichalina authored Jun 9, 2019
1 parent e451c98 commit 5bc6bcc
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export const ENV = 'flo.node-env-transfer.config' as unknown as Type<any>
export const ENV_CONFIG_DEFAULT = 'flo.node-env-transfer.config-browser-default' as unknown as Type<any>
export const ENV_CONFIG_TS_KEY = 'flo.node-env-transfer.config-ts-key' as unknown as Type<any>
export const NODE_ENV = 'flo.node-env-transfer.node-env' as unknown as Type<any>
export const NODE_ENV_USE_VALUES = 'flo.node-env-transfer.node-env-def' as unknown as Type<any>
export const ENV_CONFIG_SERVER_EXTRACTOR = 'flo.node-env-transfer.config-extractor' as unknown as Type<any>
export const ENV_CONFIG_SERVER_REPLACER = 'flo.node-env-transfer.config-replacer' as unknown as Type<any>
export const ENV_CONFIG_SERVER_SELECTED = 'flo.node-env-transfer.config-selected' as unknown as Type<any>
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ describe(NodeEnvTransferServerModule.name, () => {
})

it('should ignore non-functions passed as replacer settting', () => {
const sut1 = serverEnvConfigFactory({ NG_KEY1: '1' }, ['NG_KEY1'], '', 'thing' as any)
const sut2 = serverEnvConfigFactory({ NG_KEY1: '1' }, ['NG_KEY1'], '', defaultReplaceExtract('NG_'))
const sut1 = serverEnvConfigFactory({ NG_KEY1: '1' }, {}, ['NG_KEY1'], '', 'thing' as any)
const sut2 = serverEnvConfigFactory({ NG_KEY1: '1' }, {}, ['NG_KEY1'], '', defaultReplaceExtract('NG_'))
expect(sut1).toEqual({ NG_KEY1: '1' })
expect(sut2).toEqual({ KEY1: '1' })
})
Expand All @@ -68,6 +68,28 @@ describe(NodeEnvTransferServerModule.name, () => {
expect(nodeEnvFactory()).toEqual({})
})

it('merge useValues property', () => {
setupTestBed({
NODE_ENV_VAR: 'SOMETHING',
FLO_SERVER_API: 'https://url.ref',
FLO_SERVER_API2: 'https://url.ref2',
})({
useValues: {
THIS_IS_ME: 'Yay!',
DUDE: 'Sweeeet!'
},
extractor: 'FLO_'
})

const env = TestBed.get(ENV)

expect(Object.keys(env).length).toEqual(4)
expect(env.SERVER_API).toEqual('https://url.ref')
expect(env.SERVER_API2).toEqual('https://url.ref2')
expect(env.THIS_IS_ME).toEqual('Yay!')
expect(env.DUDE).toEqual('Sweeeet!')
})

it('should select by pattern', () => {
setupTestBed({
NODE_ENV_VAR: 'SOMETHING',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ import { TransferState, makeStateKey } from '@angular/platform-browser'
import { NodeEnvTransferModule } from './node-env-transfer.common.module'
import {
NODE_ENV, ENV, ENV_CONFIG_TS_KEY, ENV_CONFIG_SERVER_EXTRACTOR,
ENV_CONFIG_SERVER_REPLACER, ENV_CONFIG_SERVER_SELECTED
ENV_CONFIG_SERVER_REPLACER, ENV_CONFIG_SERVER_SELECTED, NODE_ENV_USE_VALUES
} from './node-env-transfer.tokens'

export const DEFAULT_ENV_CONFIG_FILTER_KEYS: ReadonlyArray<string> = []
export const DEFAULT_ENV_CONFIG_EXTRACTOR = 'NG_'
export const DEFAULT_NODE_ENV_USE_VALUES = {}

export function serverEnvConfigFactory(nodeEnv = {}, selectKeys: ReadonlyArray<string>,
export function serverEnvConfigFactory(nodeEnv = {},
defaultValues: { readonly [key: string]: any },
selectKeys: ReadonlyArray<string>,
extractor: string, replacer: (key: string) => string) {
const keys = Object.keys(nodeEnv)
const extracted = keys.filter(key => extractor && new RegExp(extractor).test(key))
Expand All @@ -22,7 +25,10 @@ export function serverEnvConfigFactory(nodeEnv = {}, selectKeys: ReadonlyArray<s
.filter((elem, pos, arr) => arr.indexOf(elem) === pos)
.reduce((acc, curr) => ({ ...acc, [deriveNewKey(curr)]: nodeEnv[curr] }), {})

return lambda
return !Object.keys(defaultValues).length ? lambda : {
...lambda,
...defaultValues
}
}

export function onInit(ts: TransferState, env: any, stateKey: string) {
Expand All @@ -42,6 +48,7 @@ export function defaultReplaceExtract(extractionKey: string) {
export interface INodeEnvTransferServerModuleConfig {
readonly selectKeys: ReadonlyArray<string>
readonly extractor: string
readonly useValues: { readonly [key: string]: any }
}

@NgModule({
Expand All @@ -50,6 +57,10 @@ export interface INodeEnvTransferServerModuleConfig {
NodeEnvTransferModule
],
providers: [
{
provide: NODE_ENV_USE_VALUES,
useValue: DEFAULT_NODE_ENV_USE_VALUES
},
{
provide: NODE_ENV,
useFactory: nodeEnvFactory
Expand All @@ -70,7 +81,7 @@ export interface INodeEnvTransferServerModuleConfig {
{
provide: ENV,
useFactory: serverEnvConfigFactory,
deps: [NODE_ENV, ENV_CONFIG_SERVER_SELECTED, ENV_CONFIG_SERVER_EXTRACTOR, ENV_CONFIG_SERVER_REPLACER]
deps: [NODE_ENV, NODE_ENV_USE_VALUES, ENV_CONFIG_SERVER_SELECTED, ENV_CONFIG_SERVER_EXTRACTOR, ENV_CONFIG_SERVER_REPLACER]
},
{
provide: APP_INITIALIZER,
Expand All @@ -85,6 +96,10 @@ export class NodeEnvTransferServerModule {
return {
ngModule: NodeEnvTransferServerModule,
providers: [
{
provide: NODE_ENV_USE_VALUES,
useValue: config.useValues || DEFAULT_NODE_ENV_USE_VALUES
},
{
provide: ENV_CONFIG_SERVER_EXTRACTOR,
useValue: config.extractor || DEFAULT_ENV_CONFIG_EXTRACTOR
Expand Down
6 changes: 5 additions & 1 deletion src/app/app.server.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,11 @@ import { SvgTransferStateServerModule } from '@flosportsinc/ng-svg-transfer-stat
AppModule,
WindowServerModule,
CookieServerModule,
NodeEnvTransferServerModule,
NodeEnvTransferServerModule.config({
useValues: {
customSharedVariable: 'This is neat, no?'
}
}),
SvgTransferStateServerModule.withSvgAssetRoot('dist/flo-angular/browser/assets/svg')
],
providers: [
Expand Down

0 comments on commit 5bc6bcc

Please sign in to comment.