use cityssm/configurator

deepsource-autofix-76c6eb20
Dan Gowans 2024-06-24 10:18:32 -04:00
parent 1a28c38066
commit 3eeea38b30
8 changed files with 242 additions and 303 deletions

59
data/config.defaultValues.d.ts vendored 100644
View File

@ -0,0 +1,59 @@
import type { config as MSSQLConfig } from 'mssql';
import type { ConfigActiveDirectory, ConfigNtfyStartup, DynamicsGPLookup } from '../types/configTypes.js';
export declare const configDefaultValues: {
activeDirectory: ConfigActiveDirectory;
'application.applicationName': string;
'application.backgroundURL': string;
'application.logoURL': string;
'application.httpPort': number;
'application.userDomain': string;
'application.useTestDatabases': boolean;
'application.maximumProcesses': number;
'application.ntfyStartup': ConfigNtfyStartup | undefined;
'reverseProxy.disableCompression': boolean;
'reverseProxy.disableEtag': boolean;
'reverseProxy.urlPrefix': string;
'session.cookieName': string;
'session.secret': string;
'session.maxAgeMillis': number;
'session.doKeepAlive': boolean;
'users.testing': string[];
'users.canLogin': string[];
'users.canUpdate': string[];
'users.isAdmin': string[];
'aliases.lot': string;
'aliases.lots': string;
'aliases.map': string;
'aliases.maps': string;
'aliases.occupancy': string;
'aliases.occupancies': string;
'aliases.occupancyStartDate': string;
'aliases.occupant': string;
'aliases.occupants': string;
'aliases.externalReceiptNumber': string;
'aliases.workOrderOpenDate': string;
'aliases.workOrderCloseDate': string;
'settings.map.mapCityDefault': string;
'settings.map.mapProvinceDefault': string;
'settings.lot.lotNamePattern': RegExp | undefined;
'settings.lot.lotNameHelpText': string;
'settings.lot.lotNameSortNameFunction': (lotName: string) => string;
'settings.lotOccupancy.occupancyEndDateIsRequired': boolean;
'settings.lotOccupancy.occupantCityDefault': string;
'settings.lotOccupancy.occupantProvinceDefault': string;
'settings.lotOccupancy.prints': string[];
'settings.fees.taxPercentageDefault': number;
'settings.workOrders.workOrderNumberLength': number;
'settings.workOrders.workOrderMilestoneDateRecentBeforeDays': number;
'settings.workOrders.workOrderMilestoneDateRecentAfterDays': number;
'settings.workOrders.calendarEmailAddress': string;
'settings.workOrders.prints': string[];
'settings.adminCleanup.recordDeleteAgeDays': number;
'settings.printPdf.contentDisposition': "attachment" | "inline";
'settings.dynamicsGP.integrationIsEnabled': boolean;
'settings.dynamicsGP.mssqlConfig': MSSQLConfig;
'settings.dynamicsGP.lookupOrder': DynamicsGPLookup[];
'settings.dynamicsGP.accountCodes': string[];
'settings.dynamicsGP.itemNumbers': string[];
'settings.dynamicsGP.trialBalanceCodes': string[];
};

View File

@ -0,0 +1,57 @@
export const configDefaultValues = {
'activeDirectory': undefined,
'application.applicationName': 'Lot Occupancy System',
'application.backgroundURL': '/images/cemetery-background.jpg',
'application.logoURL': '/images/cemetery-logo.png',
'application.httpPort': 7000,
'application.userDomain': '',
'application.useTestDatabases': false,
'application.maximumProcesses': 4,
'application.ntfyStartup': undefined,
'reverseProxy.disableCompression': false,
'reverseProxy.disableEtag': false,
'reverseProxy.urlPrefix': '',
'session.cookieName': 'lot-occupancy-system-user-sid',
'session.secret': 'cityssm/lot-occupancy-system',
'session.maxAgeMillis': 60 * 60 * 1000,
'session.doKeepAlive': false,
'users.testing': [],
'users.canLogin': ['administrator'],
'users.canUpdate': [],
'users.isAdmin': ['administrator'],
'aliases.lot': 'Lot',
'aliases.lots': 'Lots',
'aliases.map': 'Map',
'aliases.maps': 'Maps',
'aliases.occupancy': 'Occupancy',
'aliases.occupancies': 'Occupancies',
'aliases.occupancyStartDate': 'Start Date',
'aliases.occupant': 'Occupant',
'aliases.occupants': 'Occupants',
'aliases.externalReceiptNumber': 'External Receipt Number',
'aliases.workOrderOpenDate': 'Open Date',
'aliases.workOrderCloseDate': 'Close Date',
'settings.map.mapCityDefault': '',
'settings.map.mapProvinceDefault': '',
'settings.lot.lotNamePattern': undefined,
'settings.lot.lotNameHelpText': '',
'settings.lot.lotNameSortNameFunction': (lotName) => lotName,
'settings.lotOccupancy.occupancyEndDateIsRequired': true,
'settings.lotOccupancy.occupantCityDefault': '',
'settings.lotOccupancy.occupantProvinceDefault': '',
'settings.lotOccupancy.prints': ['screen/lotOccupancy'],
'settings.fees.taxPercentageDefault': 0,
'settings.workOrders.workOrderNumberLength': 6,
'settings.workOrders.workOrderMilestoneDateRecentBeforeDays': 5,
'settings.workOrders.workOrderMilestoneDateRecentAfterDays': 60,
'settings.workOrders.calendarEmailAddress': 'no-reply@127.0.0.1',
'settings.workOrders.prints': ['pdf/workOrder', 'pdf/workOrder-commentLog'],
'settings.adminCleanup.recordDeleteAgeDays': 60,
'settings.printPdf.contentDisposition': 'attachment',
'settings.dynamicsGP.integrationIsEnabled': false,
'settings.dynamicsGP.mssqlConfig': undefined,
'settings.dynamicsGP.lookupOrder': ['invoice'],
'settings.dynamicsGP.accountCodes': [],
'settings.dynamicsGP.itemNumbers': [],
'settings.dynamicsGP.trialBalanceCodes': []
};

View File

@ -0,0 +1,80 @@
import type { config as MSSQLConfig } from 'mssql'
import type { ConfigActiveDirectory, ConfigNtfyStartup, DynamicsGPLookup } from '../types/configTypes.js'
export const configDefaultValues = {
'activeDirectory': undefined as unknown as ConfigActiveDirectory,
'application.applicationName': 'Lot Occupancy System',
'application.backgroundURL': '/images/cemetery-background.jpg',
'application.logoURL': '/images/cemetery-logo.png',
'application.httpPort': 7000,
'application.userDomain': '',
'application.useTestDatabases': false,
'application.maximumProcesses': 4,
'application.ntfyStartup': undefined as ConfigNtfyStartup | undefined,
'reverseProxy.disableCompression': false,
'reverseProxy.disableEtag': false,
'reverseProxy.urlPrefix': '',
'session.cookieName': 'lot-occupancy-system-user-sid',
'session.secret': 'cityssm/lot-occupancy-system',
'session.maxAgeMillis': 60 * 60 * 1000,
'session.doKeepAlive': false,
'users.testing': [] as string[],
'users.canLogin': ['administrator'],
'users.canUpdate': [] as string[],
'users.isAdmin': ['administrator'],
'aliases.lot': 'Lot',
'aliases.lots': 'Lots',
'aliases.map': 'Map',
'aliases.maps': 'Maps',
'aliases.occupancy': 'Occupancy',
'aliases.occupancies': 'Occupancies',
'aliases.occupancyStartDate': 'Start Date',
'aliases.occupant': 'Occupant',
'aliases.occupants': 'Occupants',
'aliases.externalReceiptNumber': 'External Receipt Number',
'aliases.workOrderOpenDate': 'Open Date',
'aliases.workOrderCloseDate': 'Close Date',
'settings.map.mapCityDefault': '',
'settings.map.mapProvinceDefault': '',
'settings.lot.lotNamePattern': undefined as RegExp | undefined,
'settings.lot.lotNameHelpText': '',
'settings.lot.lotNameSortNameFunction': (lotName: string) => lotName,
// eslint-disable-next-line no-secrets/no-secrets
'settings.lotOccupancy.occupancyEndDateIsRequired': true,
'settings.lotOccupancy.occupantCityDefault': '',
'settings.lotOccupancy.occupantProvinceDefault': '',
'settings.lotOccupancy.prints': ['screen/lotOccupancy'],
'settings.fees.taxPercentageDefault': 0,
'settings.workOrders.workOrderNumberLength': 6,
'settings.workOrders.workOrderMilestoneDateRecentBeforeDays': 5,
'settings.workOrders.workOrderMilestoneDateRecentAfterDays': 60,
'settings.workOrders.calendarEmailAddress': 'no-reply@127.0.0.1',
'settings.workOrders.prints': ['pdf/workOrder', 'pdf/workOrder-commentLog'],
'settings.adminCleanup.recordDeleteAgeDays': 60,
'settings.printPdf.contentDisposition': 'attachment' as 'attachment' | 'inline',
'settings.dynamicsGP.integrationIsEnabled': false,
'settings.dynamicsGP.mssqlConfig': undefined as unknown as MSSQLConfig,
// eslint-disable-next-line no-secrets/no-secrets
'settings.dynamicsGP.lookupOrder': ['invoice'] as DynamicsGPLookup[],
'settings.dynamicsGP.accountCodes': [] as string[],
'settings.dynamicsGP.itemNumbers': [] as string[],
'settings.dynamicsGP.trialBalanceCodes': [] as string[]
}

View File

@ -1,14 +1,3 @@
import type { config as MSSQLConfig } from 'mssql'; import { configDefaultValues } from '../data/config.defaultValues.js';
import type { ConfigActiveDirectory, ConfigNtfyStartup, DynamicsGPLookup } from '../types/configTypes.js'; export declare function getConfigProperty<K extends keyof typeof configDefaultValues>(propertyName: K, fallbackValue?: (typeof configDefaultValues)[K]): (typeof configDefaultValues)[K];
export declare function getConfigProperty(propertyName: 'application.applicationName' | 'application.logoURL' | 'application.userDomain' | 'reverseProxy.urlPrefix' | 'session.cookieName' | 'session.secret' | 'aliases.lot' | 'aliases.lots' | 'aliases.map' | 'aliases.maps' | 'aliases.occupancy' | 'aliases.occupancies' | 'aliases.occupancyStartDate' | 'aliases.occupant' | 'aliases.occupants' | 'aliases.workOrderOpenDate' | 'aliases.workOrderCloseDate' | 'aliases.externalReceiptNumber' | 'settings.map.mapCityDefault' | 'settings.map.mapProvinceDefault' | 'settings.lot.lotNameHelpText' | 'settings.lotOccupancy.occupantCityDefault' | 'settings.lotOccupancy.occupantProvinceDefault' | 'settings.workOrders.calendarEmailAddress'): string;
export declare function getConfigProperty(propertyName: 'application.httpPort' | 'application.maximumProcesses' | 'session.maxAgeMillis' | 'settings.fees.taxPercentageDefault' | 'settings.workOrders.workOrderNumberLength' | 'settings.workOrders.workOrderMilestoneDateRecentBeforeDays' | 'settings.workOrders.workOrderMilestoneDateRecentAfterDays' | 'settings.adminCleanup.recordDeleteAgeDays'): number;
export declare function getConfigProperty(propertyName: 'application.useTestDatabases' | 'reverseProxy.disableCompression' | 'reverseProxy.disableEtag' | 'session.doKeepAlive' | 'settings.lotOccupancy.occupancyEndDateIsRequired' | 'settings.dynamicsGP.integrationIsEnabled'): boolean;
export declare function getConfigProperty(propertyName: 'users.testing' | 'users.canLogin' | 'users.canUpdate' | 'users.isAdmin' | 'settings.dynamicsGP.accountCodes' | 'settings.dynamicsGP.itemNumbers' | 'settings.dynamicsGP.trialBalanceCodes' | 'settings.lotOccupancy.prints' | 'settings.workOrders.prints'): string[];
export declare function getConfigProperty(propertyName: 'application.ntfyStartup'): ConfigNtfyStartup | undefined;
export declare function getConfigProperty(propertyName: 'activeDirectory'): ConfigActiveDirectory;
export declare function getConfigProperty(propertyName: 'settings.lot.lotNamePattern'): RegExp;
export declare function getConfigProperty(propertyName: 'settings.lot.lotNameSortNameFunction'): (lotName: string) => string;
export declare function getConfigProperty(propertyName: 'settings.printPdf.contentDisposition'): 'attachment' | 'inline';
export declare function getConfigProperty(propertyName: 'settings.dynamicsGP.mssqlConfig'): MSSQLConfig;
export declare function getConfigProperty(propertyName: 'settings.dynamicsGP.lookupOrder'): DynamicsGPLookup[];
export declare const keepAliveMillis: number; export declare const keepAliveMillis: number;

View File

@ -1,70 +1,9 @@
import { Configurator } from '@cityssm/configurator';
import { configDefaultValues } from '../data/config.defaultValues.js';
import { config } from '../data/config.js'; import { config } from '../data/config.js';
const configFallbackValues = new Map(); const configurator = new Configurator(configDefaultValues, config);
configFallbackValues.set('application.applicationName', 'Lot Occupancy System'); export function getConfigProperty(propertyName, fallbackValue) {
configFallbackValues.set('application.backgroundURL', '/images/cemetery-background.jpg'); return configurator.getConfigProperty(propertyName, fallbackValue);
configFallbackValues.set('application.logoURL', '/images/cemetery-logo.png');
configFallbackValues.set('application.httpPort', 7000);
configFallbackValues.set('application.useTestDatabases', false);
configFallbackValues.set('application.maximumProcesses', 4);
configFallbackValues.set('reverseProxy.disableCompression', false);
configFallbackValues.set('reverseProxy.disableEtag', false);
configFallbackValues.set('reverseProxy.urlPrefix', '');
configFallbackValues.set('session.cookieName', 'lot-occupancy-system-user-sid');
configFallbackValues.set('session.secret', 'cityssm/lot-occupancy-system');
configFallbackValues.set('session.maxAgeMillis', 60 * 60 * 1000);
configFallbackValues.set('session.doKeepAlive', false);
configFallbackValues.set('users.testing', []);
configFallbackValues.set('users.canLogin', ['administrator']);
configFallbackValues.set('users.canUpdate', []);
configFallbackValues.set('users.isAdmin', ['administrator']);
configFallbackValues.set('aliases.lot', 'Lot');
configFallbackValues.set('aliases.lots', 'Lots');
configFallbackValues.set('aliases.map', 'Map');
configFallbackValues.set('aliases.maps', 'Maps');
configFallbackValues.set('aliases.occupancy', 'Occupancy');
configFallbackValues.set('aliases.occupancies', 'Occupancies');
configFallbackValues.set('aliases.occupancyStartDate', 'Start Date');
configFallbackValues.set('aliases.occupant', 'Occupant');
configFallbackValues.set('aliases.occupants', 'Occupants');
configFallbackValues.set('aliases.externalReceiptNumber', 'External Receipt Number');
configFallbackValues.set('aliases.workOrderOpenDate', 'Open Date');
configFallbackValues.set('aliases.workOrderCloseDate', 'Close Date');
configFallbackValues.set('settings.map.mapCityDefault', '');
configFallbackValues.set('settings.map.mapProvinceDefault', '');
configFallbackValues.set('settings.lot.lotNameSortNameFunction', (lotName) => lotName);
configFallbackValues.set('settings.lotOccupancy.occupancyEndDateIsRequired', true);
configFallbackValues.set('settings.lotOccupancy.occupantCityDefault', '');
configFallbackValues.set('settings.lotOccupancy.occupantProvinceDefault', '');
configFallbackValues.set('settings.lotOccupancy.prints', [
'screen/lotOccupancy'
]);
configFallbackValues.set('settings.fees.taxPercentageDefault', 0);
configFallbackValues.set('settings.workOrders.workOrderNumberLength', 6);
configFallbackValues.set('settings.workOrders.workOrderMilestoneDateRecentBeforeDays', 5);
configFallbackValues.set('settings.workOrders.workOrderMilestoneDateRecentAfterDays', 60);
configFallbackValues.set('settings.workOrders.calendarEmailAddress', 'no-reply@127.0.0.1');
configFallbackValues.set('settings.workOrders.prints', [
'pdf/workOrder',
'pdf/workOrder-commentLog'
]);
configFallbackValues.set('settings.adminCleanup.recordDeleteAgeDays', 60);
configFallbackValues.set('settings.printPdf.contentDisposition', 'attachment');
configFallbackValues.set('settings.dynamicsGP.integrationIsEnabled', false);
configFallbackValues.set('settings.dynamicsGP.lookupOrder', ['invoice']);
configFallbackValues.set('settings.dynamicsGP.accountCodes', []);
configFallbackValues.set('settings.dynamicsGP.itemNumbers', []);
configFallbackValues.set('settings.dynamicsGP.trialBalanceCodes', []);
export function getConfigProperty(propertyName) {
const propertyNameSplit = propertyName.split('.');
let currentObject = config;
for (const propertyNamePiece of propertyNameSplit) {
if (Object.hasOwn(currentObject, propertyNamePiece)) {
currentObject = currentObject[propertyNamePiece];
continue;
}
return configFallbackValues.get(propertyName);
}
return currentObject;
} }
export const keepAliveMillis = getConfigProperty('session.doKeepAlive') export const keepAliveMillis = getConfigProperty('session.doKeepAlive')
? Math.max(getConfigProperty('session.maxAgeMillis') / 2, getConfigProperty('session.maxAgeMillis') - 10 * 60 * 1000) ? Math.max(getConfigProperty('session.maxAgeMillis') / 2, getConfigProperty('session.maxAgeMillis') - 10 * 60 * 1000)

View File

@ -1,215 +1,21 @@
import type { config as MSSQLConfig } from 'mssql' import { Configurator } from '@cityssm/configurator'
import { configDefaultValues } from '../data/config.defaultValues.js'
import { config } from '../data/config.js' import { config } from '../data/config.js'
import type {
ConfigActiveDirectory,
ConfigNtfyStartup,
DynamicsGPLookup
} from '../types/configTypes.js'
/* const configurator = new Configurator(
* SET UP FALLBACK VALUES configDefaultValues,
*/ config as unknown as Record<string, unknown>
const configFallbackValues = new Map<string, unknown>()
configFallbackValues.set('application.applicationName', 'Lot Occupancy System')
configFallbackValues.set(
'application.backgroundURL',
'/images/cemetery-background.jpg'
)
configFallbackValues.set('application.logoURL', '/images/cemetery-logo.png')
configFallbackValues.set('application.httpPort', 7000)
configFallbackValues.set('application.useTestDatabases', false)
configFallbackValues.set('application.maximumProcesses', 4)
configFallbackValues.set('reverseProxy.disableCompression', false)
configFallbackValues.set('reverseProxy.disableEtag', false)
configFallbackValues.set('reverseProxy.urlPrefix', '')
configFallbackValues.set('session.cookieName', 'lot-occupancy-system-user-sid')
configFallbackValues.set('session.secret', 'cityssm/lot-occupancy-system')
configFallbackValues.set('session.maxAgeMillis', 60 * 60 * 1000)
configFallbackValues.set('session.doKeepAlive', false)
configFallbackValues.set('users.testing', [])
configFallbackValues.set('users.canLogin', ['administrator'])
configFallbackValues.set('users.canUpdate', [])
configFallbackValues.set('users.isAdmin', ['administrator'])
configFallbackValues.set('aliases.lot', 'Lot')
configFallbackValues.set('aliases.lots', 'Lots')
configFallbackValues.set('aliases.map', 'Map')
configFallbackValues.set('aliases.maps', 'Maps')
configFallbackValues.set('aliases.occupancy', 'Occupancy')
configFallbackValues.set('aliases.occupancies', 'Occupancies')
configFallbackValues.set('aliases.occupancyStartDate', 'Start Date')
configFallbackValues.set('aliases.occupant', 'Occupant')
configFallbackValues.set('aliases.occupants', 'Occupants')
configFallbackValues.set(
'aliases.externalReceiptNumber',
'External Receipt Number'
)
configFallbackValues.set('aliases.workOrderOpenDate', 'Open Date')
configFallbackValues.set('aliases.workOrderCloseDate', 'Close Date')
configFallbackValues.set('settings.map.mapCityDefault', '')
configFallbackValues.set('settings.map.mapProvinceDefault', '')
configFallbackValues.set(
'settings.lot.lotNameSortNameFunction',
(lotName: string) => lotName
) )
configFallbackValues.set( export function getConfigProperty<K extends keyof typeof configDefaultValues>(
// eslint-disable-next-line no-secrets/no-secrets propertyName: K,
'settings.lotOccupancy.occupancyEndDateIsRequired', fallbackValue?: (typeof configDefaultValues)[K]
true ): (typeof configDefaultValues)[K] {
) return configurator.getConfigProperty(
configFallbackValues.set('settings.lotOccupancy.occupantCityDefault', '') propertyName,
configFallbackValues.set('settings.lotOccupancy.occupantProvinceDefault', '') fallbackValue
configFallbackValues.set('settings.lotOccupancy.prints', [ ) as (typeof configDefaultValues)[K]
'screen/lotOccupancy'
])
configFallbackValues.set('settings.fees.taxPercentageDefault', 0)
configFallbackValues.set('settings.workOrders.workOrderNumberLength', 6)
configFallbackValues.set(
'settings.workOrders.workOrderMilestoneDateRecentBeforeDays',
5
)
configFallbackValues.set(
'settings.workOrders.workOrderMilestoneDateRecentAfterDays',
60
)
configFallbackValues.set(
'settings.workOrders.calendarEmailAddress',
'no-reply@127.0.0.1'
)
configFallbackValues.set('settings.workOrders.prints', [
'pdf/workOrder',
'pdf/workOrder-commentLog'
])
configFallbackValues.set('settings.adminCleanup.recordDeleteAgeDays', 60)
configFallbackValues.set('settings.printPdf.contentDisposition', 'attachment')
configFallbackValues.set('settings.dynamicsGP.integrationIsEnabled', false)
configFallbackValues.set('settings.dynamicsGP.lookupOrder', ['invoice'])
configFallbackValues.set('settings.dynamicsGP.accountCodes', [])
configFallbackValues.set('settings.dynamicsGP.itemNumbers', [])
configFallbackValues.set('settings.dynamicsGP.trialBalanceCodes', [])
/*
* Set up function overloads
*/
export function getConfigProperty(
propertyName:
| 'application.applicationName'
| 'application.logoURL'
| 'application.userDomain'
| 'reverseProxy.urlPrefix'
| 'session.cookieName'
| 'session.secret'
| 'aliases.lot'
| 'aliases.lots'
| 'aliases.map'
| 'aliases.maps'
| 'aliases.occupancy'
| 'aliases.occupancies'
| 'aliases.occupancyStartDate'
| 'aliases.occupant'
| 'aliases.occupants'
| 'aliases.workOrderOpenDate'
| 'aliases.workOrderCloseDate'
| 'aliases.externalReceiptNumber'
| 'settings.map.mapCityDefault'
| 'settings.map.mapProvinceDefault'
| 'settings.lot.lotNameHelpText'
| 'settings.lotOccupancy.occupantCityDefault'
| 'settings.lotOccupancy.occupantProvinceDefault'
| 'settings.workOrders.calendarEmailAddress'
): string
export function getConfigProperty(
propertyName:
| 'application.httpPort'
| 'application.maximumProcesses'
| 'session.maxAgeMillis'
| 'settings.fees.taxPercentageDefault'
| 'settings.workOrders.workOrderNumberLength'
| 'settings.workOrders.workOrderMilestoneDateRecentBeforeDays'
| 'settings.workOrders.workOrderMilestoneDateRecentAfterDays'
| 'settings.adminCleanup.recordDeleteAgeDays'
): number
export function getConfigProperty(
propertyName:
| 'application.useTestDatabases'
| 'reverseProxy.disableCompression'
| 'reverseProxy.disableEtag'
| 'session.doKeepAlive'
| 'settings.lotOccupancy.occupancyEndDateIsRequired'
| 'settings.dynamicsGP.integrationIsEnabled'
): boolean
export function getConfigProperty(
propertyName:
| 'users.testing'
| 'users.canLogin'
| 'users.canUpdate'
| 'users.isAdmin'
| 'settings.dynamicsGP.accountCodes'
| 'settings.dynamicsGP.itemNumbers'
| 'settings.dynamicsGP.trialBalanceCodes'
| 'settings.lotOccupancy.prints'
| 'settings.workOrders.prints'
): string[]
export function getConfigProperty(
propertyName: 'application.ntfyStartup'
): ConfigNtfyStartup | undefined
export function getConfigProperty(
propertyName: 'activeDirectory'
): ConfigActiveDirectory
export function getConfigProperty(propertyName: 'settings.lot.lotNamePattern'): RegExp
export function getConfigProperty(
propertyName: 'settings.lot.lotNameSortNameFunction'
): (lotName: string) => string
export function getConfigProperty(
propertyName: 'settings.printPdf.contentDisposition'
): 'attachment' | 'inline'
export function getConfigProperty(
propertyName: 'settings.dynamicsGP.mssqlConfig'
): MSSQLConfig
export function getConfigProperty(
propertyName: 'settings.dynamicsGP.lookupOrder'
): DynamicsGPLookup[]
export function getConfigProperty(propertyName: string): unknown {
const propertyNameSplit = propertyName.split('.')
let currentObject = config
for (const propertyNamePiece of propertyNameSplit) {
if (Object.hasOwn(currentObject, propertyNamePiece)) {
currentObject = currentObject[propertyNamePiece]
continue
}
return configFallbackValues.get(propertyName)
}
return currentObject
} }
export const keepAliveMillis = getConfigProperty('session.doKeepAlive') export const keepAliveMillis = getConfigProperty('session.doKeepAlive')

42
package-lock.json generated
View File

@ -11,6 +11,7 @@
"dependencies": { "dependencies": {
"@cityssm/bulma-js": "^0.5.0", "@cityssm/bulma-js": "^0.5.0",
"@cityssm/bulma-webapp-js": "^1.5.0", "@cityssm/bulma-webapp-js": "^1.5.0",
"@cityssm/configurator": "^0.1.0",
"@cityssm/date-diff": "^2.2.3", "@cityssm/date-diff": "^2.2.3",
"@cityssm/dynamics-gp": "^1.0.3", "@cityssm/dynamics-gp": "^1.0.3",
"@cityssm/expressjs-server-js": "^2.3.3", "@cityssm/expressjs-server-js": "^2.3.3",
@ -239,9 +240,9 @@
} }
}, },
"node_modules/@azure/identity": { "node_modules/@azure/identity": {
"version": "3.4.1", "version": "3.4.2",
"resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.4.1.tgz", "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.4.2.tgz",
"integrity": "sha512-oQ/r5MBdfZTMIUcY5Ch8G7Vv9aIXDkEYyU4Dfqjim4MQN+LY2uiQ57P1JDopMLeHCsZxM4yy8lEdne3tM9Xhzg==", "integrity": "sha512-0q5DL4uyR0EZ4RXQKD8MadGH6zTIcloUoS/RVbCpNpej4pwte0xpqYxk8K97Py2RiuUvI7F4GXpoT4046VfufA==",
"dependencies": { "dependencies": {
"@azure/abort-controller": "^1.0.0", "@azure/abort-controller": "^1.0.0",
"@azure/core-auth": "^1.5.0", "@azure/core-auth": "^1.5.0",
@ -474,6 +475,14 @@
"node": "^12.20.0 || ^14.13.1 || >=16.0.0" "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
} }
}, },
"node_modules/@cityssm/configurator": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/@cityssm/configurator/-/configurator-0.1.0.tgz",
"integrity": "sha512-MGklw25IFyovef5/pYXF3XePkbLDuW0DxKoqPlD8Cwmk/ySXDBhKsDdVgKVcGVRD70k8538PhN5vA4U9cVhtQw==",
"engines": {
"node": ">=18.0.0"
}
},
"node_modules/@cityssm/date-diff": { "node_modules/@cityssm/date-diff": {
"version": "2.2.3", "version": "2.2.3",
"resolved": "https://registry.npmjs.org/@cityssm/date-diff/-/date-diff-2.2.3.tgz", "resolved": "https://registry.npmjs.org/@cityssm/date-diff/-/date-diff-2.2.3.tgz",
@ -2619,11 +2628,11 @@
} }
}, },
"node_modules/braces": { "node_modules/braces": {
"version": "3.0.2", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dependencies": { "dependencies": {
"fill-range": "^7.0.1" "fill-range": "^7.1.1"
}, },
"engines": { "engines": {
"node": ">=8" "node": ">=8"
@ -5257,9 +5266,9 @@
} }
}, },
"node_modules/fill-range": { "node_modules/fill-range": {
"version": "7.0.1", "version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dependencies": { "dependencies": {
"to-regex-range": "^5.0.1" "to-regex-range": "^5.0.1"
}, },
@ -7851,9 +7860,9 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}, },
"node_modules/mssql": { "node_modules/mssql": {
"version": "10.0.2", "version": "10.0.4",
"resolved": "https://registry.npmjs.org/mssql/-/mssql-10.0.2.tgz", "resolved": "https://registry.npmjs.org/mssql/-/mssql-10.0.4.tgz",
"integrity": "sha512-GrQ6gzv2xA7ndOvONyZ++4RZsNkr8qDiIpvuFn2pR3TPiSk/cKdmvOrDU3jWgon7EPj7CPgmDiMh7Hgtft2xLg==", "integrity": "sha512-MhX5IcJ75/q+dUiOe+1ajpqjEe96ZKqMchYYPUIDU+Btqhwt4gbFeZhcGUZaRCEMV9uF+G8kLvaNSFaEzL9OXQ==",
"dependencies": { "dependencies": {
"@tediousjs/connection-string": "^0.5.0", "@tediousjs/connection-string": "^0.5.0",
"commander": "^11.0.0", "commander": "^11.0.0",
@ -10476,9 +10485,9 @@
} }
}, },
"node_modules/tedious": { "node_modules/tedious": {
"version": "16.6.1", "version": "16.7.1",
"resolved": "https://registry.npmjs.org/tedious/-/tedious-16.6.1.tgz", "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.7.1.tgz",
"integrity": "sha512-KKSDB1OPrPk0WbMPug9YqRbPl44zMjdL2hFyzLEidr2IkItzpV0ZbzW8VA47QIS2oyWhCU7ifIEQY12n23IRDA==", "integrity": "sha512-NmedZS0NJiTv3CoYnf1FtjxIDUgVYzEmavrc8q2WHRb+lP4deI9BpQfmNnBZZaWusDbP5FVFZCcvzb3xOlNVlQ==",
"dependencies": { "dependencies": {
"@azure/identity": "^3.4.1", "@azure/identity": "^3.4.1",
"@azure/keyvault-keys": "^4.4.0", "@azure/keyvault-keys": "^4.4.0",
@ -10490,7 +10499,6 @@
"jsbi": "^4.3.0", "jsbi": "^4.3.0",
"native-duplexpair": "^1.0.0", "native-duplexpair": "^1.0.0",
"node-abort-controller": "^3.1.1", "node-abort-controller": "^3.1.1",
"punycode": "^2.3.0",
"sprintf-js": "^1.1.2" "sprintf-js": "^1.1.2"
}, },
"engines": { "engines": {

View File

@ -35,6 +35,7 @@
"dependencies": { "dependencies": {
"@cityssm/bulma-js": "^0.5.0", "@cityssm/bulma-js": "^0.5.0",
"@cityssm/bulma-webapp-js": "^1.5.0", "@cityssm/bulma-webapp-js": "^1.5.0",
"@cityssm/configurator": "^0.1.0",
"@cityssm/date-diff": "^2.2.3", "@cityssm/date-diff": "^2.2.3",
"@cityssm/dynamics-gp": "^1.0.3", "@cityssm/dynamics-gp": "^1.0.3",
"@cityssm/expressjs-server-js": "^2.3.3", "@cityssm/expressjs-server-js": "^2.3.3",