From 3eeea38b30ec61a9859ce7da4ce4cc22115a2270 Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Mon, 24 Jun 2024 10:18:32 -0400 Subject: [PATCH] use cityssm/configurator --- data/config.defaultValues.d.ts | 59 +++++++++ data/config.defaultValues.js | 57 +++++++++ data/config.defaultValues.ts | 80 ++++++++++++ helpers/functions.config.d.ts | 15 +-- helpers/functions.config.js | 71 +---------- helpers/functions.config.ts | 220 ++------------------------------- package-lock.json | 42 ++++--- package.json | 1 + 8 files changed, 242 insertions(+), 303 deletions(-) create mode 100644 data/config.defaultValues.d.ts create mode 100644 data/config.defaultValues.js create mode 100644 data/config.defaultValues.ts diff --git a/data/config.defaultValues.d.ts b/data/config.defaultValues.d.ts new file mode 100644 index 00000000..03982e18 --- /dev/null +++ b/data/config.defaultValues.d.ts @@ -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[]; +}; diff --git a/data/config.defaultValues.js b/data/config.defaultValues.js new file mode 100644 index 00000000..e5d88588 --- /dev/null +++ b/data/config.defaultValues.js @@ -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': [] +}; diff --git a/data/config.defaultValues.ts b/data/config.defaultValues.ts new file mode 100644 index 00000000..99bf4048 --- /dev/null +++ b/data/config.defaultValues.ts @@ -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[] +} diff --git a/helpers/functions.config.d.ts b/helpers/functions.config.d.ts index 9be646d8..0350a7fa 100644 --- a/helpers/functions.config.d.ts +++ b/helpers/functions.config.d.ts @@ -1,14 +1,3 @@ -import type { config as MSSQLConfig } from 'mssql'; -import type { ConfigActiveDirectory, ConfigNtfyStartup, DynamicsGPLookup } from '../types/configTypes.js'; -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[]; +import { configDefaultValues } from '../data/config.defaultValues.js'; +export declare function getConfigProperty(propertyName: K, fallbackValue?: (typeof configDefaultValues)[K]): (typeof configDefaultValues)[K]; export declare const keepAliveMillis: number; diff --git a/helpers/functions.config.js b/helpers/functions.config.js index d37ed608..3ea60466 100644 --- a/helpers/functions.config.js +++ b/helpers/functions.config.js @@ -1,70 +1,9 @@ +import { Configurator } from '@cityssm/configurator'; +import { configDefaultValues } from '../data/config.defaultValues.js'; import { config } from '../data/config.js'; -const configFallbackValues = new Map(); -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) => 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; +const configurator = new Configurator(configDefaultValues, config); +export function getConfigProperty(propertyName, fallbackValue) { + return configurator.getConfigProperty(propertyName, fallbackValue); } export const keepAliveMillis = getConfigProperty('session.doKeepAlive') ? Math.max(getConfigProperty('session.maxAgeMillis') / 2, getConfigProperty('session.maxAgeMillis') - 10 * 60 * 1000) diff --git a/helpers/functions.config.ts b/helpers/functions.config.ts index 9a087a30..7361988c 100644 --- a/helpers/functions.config.ts +++ b/helpers/functions.config.ts @@ -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 type { - ConfigActiveDirectory, - ConfigNtfyStartup, - DynamicsGPLookup -} from '../types/configTypes.js' -/* - * SET UP FALLBACK VALUES - */ - -const configFallbackValues = new Map() - -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 +const configurator = new Configurator( + configDefaultValues, + config as unknown as Record ) -configFallbackValues.set( - // eslint-disable-next-line no-secrets/no-secrets - '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', []) - -/* - * 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 function getConfigProperty( + propertyName: K, + fallbackValue?: (typeof configDefaultValues)[K] +): (typeof configDefaultValues)[K] { + return configurator.getConfigProperty( + propertyName, + fallbackValue + ) as (typeof configDefaultValues)[K] } export const keepAliveMillis = getConfigProperty('session.doKeepAlive') diff --git a/package-lock.json b/package-lock.json index 6de16350..4c371d57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@cityssm/bulma-js": "^0.5.0", "@cityssm/bulma-webapp-js": "^1.5.0", + "@cityssm/configurator": "^0.1.0", "@cityssm/date-diff": "^2.2.3", "@cityssm/dynamics-gp": "^1.0.3", "@cityssm/expressjs-server-js": "^2.3.3", @@ -239,9 +240,9 @@ } }, "node_modules/@azure/identity": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.4.1.tgz", - "integrity": "sha512-oQ/r5MBdfZTMIUcY5Ch8G7Vv9aIXDkEYyU4Dfqjim4MQN+LY2uiQ57P1JDopMLeHCsZxM4yy8lEdne3tM9Xhzg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.4.2.tgz", + "integrity": "sha512-0q5DL4uyR0EZ4RXQKD8MadGH6zTIcloUoS/RVbCpNpej4pwte0xpqYxk8K97Py2RiuUvI7F4GXpoT4046VfufA==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.5.0", @@ -474,6 +475,14 @@ "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": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@cityssm/date-diff/-/date-diff-2.2.3.tgz", @@ -2619,11 +2628,11 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -5257,9 +5266,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -7851,9 +7860,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mssql": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/mssql/-/mssql-10.0.2.tgz", - "integrity": "sha512-GrQ6gzv2xA7ndOvONyZ++4RZsNkr8qDiIpvuFn2pR3TPiSk/cKdmvOrDU3jWgon7EPj7CPgmDiMh7Hgtft2xLg==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/mssql/-/mssql-10.0.4.tgz", + "integrity": "sha512-MhX5IcJ75/q+dUiOe+1ajpqjEe96ZKqMchYYPUIDU+Btqhwt4gbFeZhcGUZaRCEMV9uF+G8kLvaNSFaEzL9OXQ==", "dependencies": { "@tediousjs/connection-string": "^0.5.0", "commander": "^11.0.0", @@ -10476,9 +10485,9 @@ } }, "node_modules/tedious": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.6.1.tgz", - "integrity": "sha512-KKSDB1OPrPk0WbMPug9YqRbPl44zMjdL2hFyzLEidr2IkItzpV0ZbzW8VA47QIS2oyWhCU7ifIEQY12n23IRDA==", + "version": "16.7.1", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.7.1.tgz", + "integrity": "sha512-NmedZS0NJiTv3CoYnf1FtjxIDUgVYzEmavrc8q2WHRb+lP4deI9BpQfmNnBZZaWusDbP5FVFZCcvzb3xOlNVlQ==", "dependencies": { "@azure/identity": "^3.4.1", "@azure/keyvault-keys": "^4.4.0", @@ -10490,7 +10499,6 @@ "jsbi": "^4.3.0", "native-duplexpair": "^1.0.0", "node-abort-controller": "^3.1.1", - "punycode": "^2.3.0", "sprintf-js": "^1.1.2" }, "engines": { diff --git a/package.json b/package.json index 70dfa5e4..3f1e1850 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "dependencies": { "@cityssm/bulma-js": "^0.5.0", "@cityssm/bulma-webapp-js": "^1.5.0", + "@cityssm/configurator": "^0.1.0", "@cityssm/date-diff": "^2.2.3", "@cityssm/dynamics-gp": "^1.0.3", "@cityssm/expressjs-server-js": "^2.3.3",