@harperfast/harper 5.0.0-alpha.10 → 5.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/BinObjects.js +17 -0
- package/bin/cliOperations.js +157 -0
- package/bin/copyDb.ts +280 -0
- package/bin/harper.js +156 -0
- package/bin/install.js +15 -0
- package/bin/lite.js +5 -0
- package/bin/restart.js +201 -0
- package/bin/run.js +409 -0
- package/bin/status.js +65 -0
- package/bin/stop.js +22 -0
- package/bin/upgrade.js +134 -0
- package/components/Application.ts +646 -0
- package/components/ApplicationScope.ts +49 -0
- package/components/Component.ts +53 -0
- package/components/ComponentV1.ts +342 -0
- package/components/DEFAULT_CONFIG.ts +18 -0
- package/components/EntryHandler.ts +227 -0
- package/components/Logger.ts +14 -0
- package/components/OptionsWatcher.ts +354 -0
- package/components/PluginModule.ts +6 -0
- package/components/Scope.ts +329 -0
- package/components/componentLoader.ts +529 -0
- package/components/deriveCommonPatternBase.ts +31 -0
- package/components/deriveGlobOptions.ts +44 -0
- package/components/deriveURLPath.ts +57 -0
- package/components/operations.js +658 -0
- package/components/operationsValidation.js +246 -0
- package/components/packageComponent.ts +39 -0
- package/components/requestRestart.ts +26 -0
- package/components/resolveBaseURLPath.ts +38 -0
- package/components/status/ComponentStatus.ts +110 -0
- package/components/status/ComponentStatusRegistry.ts +251 -0
- package/components/status/api.ts +153 -0
- package/components/status/crossThread.ts +405 -0
- package/components/status/errors.ts +152 -0
- package/components/status/index.ts +44 -0
- package/components/status/internal.ts +65 -0
- package/components/status/registry.ts +12 -0
- package/components/status/types.ts +96 -0
- package/config/RootConfigWatcher.ts +59 -0
- package/config/configHelpers.ts +11 -0
- package/config/configUtils.js +967 -0
- package/config/harperConfigEnvVars.ts +641 -0
- package/dataLayer/CreateAttributeObject.js +25 -0
- package/dataLayer/CreateTableObject.js +11 -0
- package/dataLayer/DataLayerObjects.js +43 -0
- package/dataLayer/DeleteBeforeObject.js +22 -0
- package/dataLayer/DeleteObject.js +25 -0
- package/dataLayer/DropAttributeObject.js +11 -0
- package/dataLayer/GetBackupObject.js +22 -0
- package/dataLayer/InsertObject.js +24 -0
- package/dataLayer/ReadAuditLogObject.js +24 -0
- package/dataLayer/SQLSearch.js +1335 -0
- package/dataLayer/SearchByConditionsObject.js +61 -0
- package/dataLayer/SearchByHashObject.js +21 -0
- package/dataLayer/SearchObject.js +45 -0
- package/dataLayer/SqlSearchObject.js +14 -0
- package/dataLayer/UpdateObject.js +23 -0
- package/dataLayer/UpsertObject.js +23 -0
- package/dataLayer/bulkLoad.js +813 -0
- package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
- package/dataLayer/dataObjects/UpsertObject.js +23 -0
- package/dataLayer/delete.js +164 -0
- package/dataLayer/export.js +381 -0
- package/dataLayer/getBackup.js +40 -0
- package/dataLayer/harperBridge/BridgeMethods.js +81 -0
- package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
- package/dataLayer/harperBridge/harperBridge.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
- package/dataLayer/hdbInfoController.js +254 -0
- package/dataLayer/insert.js +266 -0
- package/dataLayer/readAuditLog.js +59 -0
- package/dataLayer/schema.js +366 -0
- package/dataLayer/schemaDescribe.js +289 -0
- package/dataLayer/search.js +60 -0
- package/dataLayer/transaction.js +17 -0
- package/dataLayer/update.js +124 -0
- package/dist/components/Logger.d.ts +12 -0
- package/dist/components/Logger.js +3 -0
- package/dist/components/Logger.js.map +1 -0
- package/dist/components/Scope.d.ts +14 -4
- package/dist/components/Scope.js +18 -10
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/componentLoader.js +16 -9
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/operations.js +2 -2
- package/dist/components/operations.js.map +1 -1
- package/dist/config/configUtils.d.ts +1 -1
- package/dist/config/configUtils.js +1 -1
- package/dist/config/configUtils.js.map +1 -1
- package/dist/dataLayer/CreateTableObject.d.ts +2 -2
- package/dist/dataLayer/CreateTableObject.js +2 -2
- package/dist/dataLayer/CreateTableObject.js.map +1 -1
- package/dist/dataLayer/delete.d.ts +1 -1
- package/dist/dataLayer/schema.js +6 -5
- package/dist/dataLayer/schema.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +1 -1
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/DatabaseTransaction.d.ts +1 -1
- package/dist/resources/IterableEventQueue.d.ts +1 -1
- package/dist/resources/LMDBTransaction.d.ts +5 -1
- package/dist/resources/Resource.d.ts +1 -1
- package/dist/resources/RocksIndexStore.d.ts +3 -3
- package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
- package/dist/resources/Table.d.ts +15 -6
- package/dist/resources/Table.js +4 -1
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/read.js +32 -22
- package/dist/resources/analytics/read.js.map +1 -1
- package/dist/resources/analytics/write.js +3 -6
- package/dist/resources/analytics/write.js.map +1 -1
- package/dist/resources/auditStore.d.ts +3 -3
- package/dist/resources/blob.d.ts +25 -2
- package/dist/resources/databases.d.ts +12 -2
- package/dist/resources/databases.js +22 -19
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/search.js +11 -5
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/transaction.d.ts +2 -1
- package/dist/security/auth.js +1 -1
- package/dist/security/auth.js.map +1 -1
- package/dist/security/cryptoHash.d.ts +2 -2
- package/dist/security/jsLoader.js +243 -66
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/keys.js +4 -5
- package/dist/security/keys.js.map +1 -1
- package/dist/security/user.js +3 -3
- package/dist/security/user.js.map +1 -1
- package/dist/server/REST.js +16 -2
- package/dist/server/REST.js.map +1 -1
- package/dist/server/Server.d.ts +2 -1
- package/dist/server/Server.js.map +1 -1
- package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
- package/dist/server/fastifyRoutes.js +2 -0
- package/dist/server/fastifyRoutes.js.map +1 -1
- package/dist/server/http.js +12 -6
- package/dist/server/http.js.map +1 -1
- package/dist/server/jobs/JobObject.d.ts +3 -3
- package/dist/server/loadRootComponents.js +1 -0
- package/dist/server/loadRootComponents.js.map +1 -1
- package/dist/server/operationsServer.js +3 -1
- package/dist/server/operationsServer.js.map +1 -1
- package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
- package/dist/server/serverHelpers/Request.d.ts +5 -5
- package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
- package/dist/server/threads/manageThreads.d.ts +2 -2
- package/dist/server/threads/manageThreads.js +50 -35
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.d.ts +1 -1
- package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
- package/dist/utility/AWS/AWSConnector.d.ts +3 -2
- package/dist/utility/common_utils.d.ts +3 -3
- package/dist/utility/environment/systemInformation.d.ts +1 -0
- package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
- package/dist/utility/globalSchema.d.ts +1 -1
- package/dist/utility/hdbTerms.d.ts +3 -0
- package/dist/utility/hdbTerms.js +3 -0
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/installation.d.ts +2 -4
- package/dist/utility/installation.js.map +1 -1
- package/dist/utility/lmdb/commonUtility.d.ts +1 -0
- package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
- package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
- package/dist/utility/lmdb/searchUtility.d.ts +2 -1
- package/dist/utility/lmdb/writeUtility.d.ts +1 -0
- package/dist/utility/logging/harper_logger.d.ts +6 -6
- package/dist/utility/processManagement/processManagement.d.ts +1 -1
- package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
- package/dist/validation/common_validators.d.ts +4 -3
- package/dist/validation/configValidator.d.ts +3 -2
- package/index.d.ts +56 -0
- package/index.js +41 -0
- package/json/systemSchema.json +373 -0
- package/launchServiceScripts/launchHarperDB.js +3 -0
- package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
- package/package.json +21 -3
- package/resources/DatabaseTransaction.ts +378 -0
- package/resources/ErrorResource.ts +57 -0
- package/resources/IterableEventQueue.ts +94 -0
- package/resources/LMDBTransaction.ts +349 -0
- package/resources/RecordEncoder.ts +702 -0
- package/resources/RequestTarget.ts +134 -0
- package/resources/Resource.ts +789 -0
- package/resources/ResourceInterface.ts +221 -0
- package/resources/ResourceInterfaceV2.ts +53 -0
- package/resources/ResourceV2.ts +67 -0
- package/resources/Resources.ts +162 -0
- package/resources/RocksIndexStore.ts +70 -0
- package/resources/RocksTransactionLogStore.ts +352 -0
- package/resources/Table.ts +4527 -0
- package/resources/analytics/hostnames.ts +72 -0
- package/resources/analytics/metadata.ts +10 -0
- package/resources/analytics/read.ts +252 -0
- package/resources/analytics/write.ts +803 -0
- package/resources/auditStore.ts +556 -0
- package/resources/blob.ts +1268 -0
- package/resources/crdt.ts +125 -0
- package/resources/dataLoader.ts +527 -0
- package/resources/databases.ts +1290 -0
- package/resources/graphql.ts +221 -0
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
- package/resources/indexes/customIndexes.ts +7 -0
- package/resources/indexes/vector.ts +38 -0
- package/resources/jsResource.ts +86 -0
- package/resources/loadEnv.ts +22 -0
- package/resources/login.ts +18 -0
- package/resources/openApi.ts +409 -0
- package/resources/registrationDeprecated.ts +8 -0
- package/resources/replayLogs.ts +136 -0
- package/resources/roles.ts +98 -0
- package/resources/search.ts +1301 -0
- package/resources/tracked.ts +584 -0
- package/resources/transaction.ts +89 -0
- package/resources/transactionBroadcast.ts +258 -0
- package/security/auth.ts +376 -0
- package/security/certificateVerification/certificateVerificationSource.ts +84 -0
- package/security/certificateVerification/configValidation.ts +107 -0
- package/security/certificateVerification/crlVerification.ts +623 -0
- package/security/certificateVerification/index.ts +121 -0
- package/security/certificateVerification/ocspVerification.ts +148 -0
- package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
- package/security/certificateVerification/types.ts +128 -0
- package/security/certificateVerification/verificationConfig.ts +138 -0
- package/security/certificateVerification/verificationUtils.ts +447 -0
- package/security/cryptoHash.js +42 -0
- package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
- package/security/data_objects/PermissionResponseObject.js +115 -0
- package/security/data_objects/PermissionTableResponseObject.js +20 -0
- package/security/fastifyAuth.js +169 -0
- package/security/impersonation.ts +160 -0
- package/security/jsLoader.ts +716 -0
- package/security/keys.js +948 -0
- package/security/permissionsTranslator.js +300 -0
- package/security/role.js +218 -0
- package/security/tokenAuthentication.ts +228 -0
- package/security/user.ts +449 -0
- package/server/DurableSubscriptionsSession.ts +503 -0
- package/server/REST.ts +407 -0
- package/server/Server.ts +89 -0
- package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
- package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
- package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
- package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
- package/server/fastifyRoutes.ts +205 -0
- package/server/graphqlQuerying.ts +700 -0
- package/server/http.ts +640 -0
- package/server/itc/serverHandlers.js +161 -0
- package/server/itc/utility/ITCEventObject.js +10 -0
- package/server/jobs/JobObject.js +24 -0
- package/server/jobs/jobProcess.js +69 -0
- package/server/jobs/jobRunner.js +162 -0
- package/server/jobs/jobs.js +304 -0
- package/server/loadRootComponents.js +44 -0
- package/server/mqtt.ts +485 -0
- package/server/nodeName.ts +75 -0
- package/server/operationsServer.ts +313 -0
- package/server/serverHelpers/Headers.ts +108 -0
- package/server/serverHelpers/JSONStream.ts +269 -0
- package/server/serverHelpers/OperationFunctionObject.ts +13 -0
- package/server/serverHelpers/Request.ts +158 -0
- package/server/serverHelpers/contentTypes.ts +637 -0
- package/server/serverHelpers/requestTimePlugin.js +57 -0
- package/server/serverHelpers/serverHandlers.js +148 -0
- package/server/serverHelpers/serverUtilities.ts +473 -0
- package/server/serverRegistry.ts +8 -0
- package/server/static.ts +187 -0
- package/server/status/definitions.ts +37 -0
- package/server/status/index.ts +125 -0
- package/server/storageReclamation.ts +93 -0
- package/server/threads/itc.js +89 -0
- package/server/threads/manageThreads.js +594 -0
- package/server/threads/socketRouter.ts +360 -0
- package/server/threads/threadServer.js +279 -0
- package/server/throttle.ts +73 -0
- package/sqlTranslator/SelectValidator.js +330 -0
- package/sqlTranslator/alasqlFunctionImporter.js +62 -0
- package/sqlTranslator/deleteTranslator.js +67 -0
- package/sqlTranslator/index.js +242 -0
- package/sqlTranslator/sql_statement_bucket.js +472 -0
- package/static/defaultConfig.yaml +3 -0
- package/studio/web/HDBDogOnly.svg +78 -0
- package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
- package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
- package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
- package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
- package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
- package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
- package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
- package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
- package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
- package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
- package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
- package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
- package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
- package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
- package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
- package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
- package/studio/web/assets/index-BTgXJX9d.js +235 -0
- package/studio/web/assets/index-BTgXJX9d.js.map +1 -0
- package/studio/web/assets/index-C-GXfcup.js +37 -0
- package/studio/web/assets/index-C-GXfcup.js.map +1 -0
- package/studio/web/assets/index-PFlNdimM.js +2 -0
- package/studio/web/assets/index-PFlNdimM.js.map +1 -0
- package/studio/web/assets/index-Y2g_iFpU.css +1 -0
- package/studio/web/assets/index-jiPwkrsB.css +1 -0
- package/studio/web/assets/index.lazy-C3TJZJ4o.js +266 -0
- package/studio/web/assets/index.lazy-C3TJZJ4o.js.map +1 -0
- package/studio/web/assets/profiler-DotzgiCJ.js +2 -0
- package/studio/web/assets/profiler-DotzgiCJ.js.map +1 -0
- package/studio/web/assets/react-redux-VxUEx_mU.js +6 -0
- package/studio/web/assets/react-redux-VxUEx_mU.js.map +1 -0
- package/studio/web/assets/startRecording-B_9J9Csd.js +3 -0
- package/studio/web/assets/startRecording-B_9J9Csd.js.map +1 -0
- package/studio/web/fabric-signup-background.webp +0 -0
- package/studio/web/fabric-signup-text.png +0 -0
- package/studio/web/favicon_purple.png +0 -0
- package/studio/web/github-icon.svg +15 -0
- package/studio/web/harper-fabric_black.png +0 -0
- package/studio/web/harper-fabric_white.png +0 -0
- package/studio/web/harper-studio_white.png +0 -0
- package/studio/web/index.html +16 -0
- package/studio/web/running.css +148 -0
- package/studio/web/running.html +147 -0
- package/studio/web/running.js +111 -0
- package/upgrade/UpgradeObjects.js +13 -0
- package/upgrade/directives/directivesController.js +90 -0
- package/upgrade/directivesManager.js +139 -0
- package/upgrade/upgradePrompt.js +124 -0
- package/upgrade/upgradeUtilities.js +28 -0
- package/utility/AWS/AWSConnector.js +29 -0
- package/utility/OperationFunctionCaller.js +63 -0
- package/utility/assignCmdEnvVariables.js +62 -0
- package/utility/common_utils.js +867 -0
- package/utility/environment/environmentManager.js +208 -0
- package/utility/environment/systemInformation.js +355 -0
- package/utility/errors/commonErrors.js +267 -0
- package/utility/errors/hdbError.js +146 -0
- package/utility/functions/date/dateFunctions.js +65 -0
- package/utility/functions/geo.js +355 -0
- package/utility/functions/sql/alaSQLExtension.js +104 -0
- package/utility/globalSchema.js +35 -0
- package/utility/hdbTerms.ts +819 -0
- package/utility/install/checkJWTTokensExist.js +62 -0
- package/utility/install/harperdb.conf +15 -0
- package/utility/install/harperdb.service +14 -0
- package/utility/install/installer.js +635 -0
- package/utility/installation.ts +30 -0
- package/utility/lmdb/DBIDefinition.js +20 -0
- package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
- package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/OpenDBIObject.js +31 -0
- package/utility/lmdb/OpenEnvironmentObject.js +41 -0
- package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
- package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/cleanLMDBMap.js +65 -0
- package/utility/lmdb/commonUtility.js +119 -0
- package/utility/lmdb/deleteUtility.js +128 -0
- package/utility/lmdb/environmentUtility.js +477 -0
- package/utility/lmdb/searchCursorFunctions.js +187 -0
- package/utility/lmdb/searchUtility.js +918 -0
- package/utility/lmdb/terms.js +57 -0
- package/utility/lmdb/writeUtility.js +407 -0
- package/utility/logging/harper_logger.js +876 -0
- package/utility/logging/logRotator.js +157 -0
- package/utility/logging/logger.ts +24 -0
- package/utility/logging/readLog.js +355 -0
- package/utility/logging/transactionLog.js +57 -0
- package/utility/mount_hdb.js +59 -0
- package/utility/npmUtilities.js +102 -0
- package/utility/operationPermissions.ts +112 -0
- package/utility/operation_authorization.js +836 -0
- package/utility/packageUtils.js +55 -0
- package/utility/password.ts +99 -0
- package/utility/processManagement/processManagement.js +187 -0
- package/utility/processManagement/servicesConfig.js +56 -0
- package/utility/scripts/restartHdb.js +24 -0
- package/utility/scripts/user_data.sh +13 -0
- package/utility/signalling.js +36 -0
- package/utility/terms/certificates.js +81 -0
- package/utility/when.ts +20 -0
- package/v1.d.ts +39 -0
- package/v1.js +41 -0
- package/v2.d.ts +39 -0
- package/v2.js +41 -0
- package/validation/bulkDeleteValidator.js +24 -0
- package/validation/check_permissions.js +19 -0
- package/validation/common_validators.js +95 -0
- package/validation/configValidator.js +331 -0
- package/validation/deleteValidator.js +15 -0
- package/validation/fileLoadValidator.js +153 -0
- package/validation/insertValidator.js +40 -0
- package/validation/installValidator.js +37 -0
- package/validation/readLogValidator.js +64 -0
- package/validation/role_validation.js +320 -0
- package/validation/schemaMetadataValidator.js +42 -0
- package/validation/searchValidator.js +166 -0
- package/validation/statusValidator.ts +66 -0
- package/validation/transactionLogValidator.js +33 -0
- package/validation/user_validation.js +55 -0
- package/validation/validationWrapper.js +105 -0
- package/dist/resources/analytics/profile.d.ts +0 -2
- package/dist/resources/analytics/profile.js +0 -144
- package/dist/resources/analytics/profile.js.map +0 -1
|
@@ -0,0 +1,641 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HARPER_DEFAULT_CONFIG and HARPER_SET_CONFIG environment variable support
|
|
3
|
+
*
|
|
4
|
+
* This module provides utilities for applying configuration from environment variables
|
|
5
|
+
* to Harper's configuration system with source tracking and drift detection.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Install-time and runtime configuration from env vars
|
|
9
|
+
* - Source tracking (which env var set each config value)
|
|
10
|
+
* - Drift detection (detect manual config file edits)
|
|
11
|
+
* - Snapshot-based deletion (remove values when omitted from env var)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { Logger } from '../utility/logging/logger.ts';
|
|
15
|
+
import * as fs from 'fs-extra';
|
|
16
|
+
import * as path from 'node:path';
|
|
17
|
+
import * as crypto from 'node:crypto';
|
|
18
|
+
import { getBackupDirPath } from './configHelpers.ts';
|
|
19
|
+
|
|
20
|
+
const STATE_FILE_NAME = '.harper-config-state.json';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Get logger instance with tag - lazy loaded to avoid circular dependencies
|
|
24
|
+
* and ensure logger is initialized before use
|
|
25
|
+
*/
|
|
26
|
+
function getLogger(): Logger {
|
|
27
|
+
const { loggerWithTag } = require('../utility/logging/harper_logger.js');
|
|
28
|
+
return loggerWithTag('env-config');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Type definitions
|
|
32
|
+
type ConfigObject = Record<string, any>;
|
|
33
|
+
type ConfigSource = 'HARPER_DEFAULT_CONFIG' | 'HARPER_SET_CONFIG' | 'user' | 'default';
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Configuration state tracking structure
|
|
37
|
+
*
|
|
38
|
+
* Stored in {rootPath}/backup/.harper-config-state.json
|
|
39
|
+
*
|
|
40
|
+
* Example:
|
|
41
|
+
* {
|
|
42
|
+
* "version": "1.0",
|
|
43
|
+
* "sources": {
|
|
44
|
+
* "http.port": "HARPER_DEFAULT_CONFIG",
|
|
45
|
+
* "http.mtls": "HARPER_SET_CONFIG",
|
|
46
|
+
* "logging.level": "user"
|
|
47
|
+
* },
|
|
48
|
+
* "originalValues": {
|
|
49
|
+
* "http.port": 9925,
|
|
50
|
+
* "http.mtls": false
|
|
51
|
+
* },
|
|
52
|
+
* "snapshots": {
|
|
53
|
+
* "HARPER_DEFAULT_CONFIG": {
|
|
54
|
+
* "hash": "a1b2c3d4",
|
|
55
|
+
* "config": { "http": { "port": 8080 } }
|
|
56
|
+
* },
|
|
57
|
+
* "HARPER_SET_CONFIG": {
|
|
58
|
+
* "hash": "e5f6g7h8",
|
|
59
|
+
* "config": { "http": { "mtls": true } }
|
|
60
|
+
* }
|
|
61
|
+
* }
|
|
62
|
+
* }
|
|
63
|
+
*/
|
|
64
|
+
interface ConfigState {
|
|
65
|
+
version: string;
|
|
66
|
+
sources: Record<string, ConfigSource>; // Maps config path to the source that set it
|
|
67
|
+
originalValues: Record<string, any>; // Original values before env var override (for restoration)
|
|
68
|
+
snapshots: {
|
|
69
|
+
// Snapshots of what each env var currently specifies (for detecting changes)
|
|
70
|
+
HARPER_DEFAULT_CONFIG?: { hash: string; config: ConfigObject };
|
|
71
|
+
HARPER_SET_CONFIG?: { hash: string; config: ConfigObject };
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
interface ApplyLayerOptions {
|
|
76
|
+
respectSources?: ConfigSource[];
|
|
77
|
+
storeOriginals?: boolean;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Custom error for configuration environment variable parsing/validation
|
|
82
|
+
*/
|
|
83
|
+
export class ConfigEnvVarError extends Error {
|
|
84
|
+
envVarName?: string;
|
|
85
|
+
originalError?: Error;
|
|
86
|
+
|
|
87
|
+
constructor(message: string, envVarName?: string, originalError?: Error) {
|
|
88
|
+
super(message);
|
|
89
|
+
this.name = 'ConfigEnvVarError';
|
|
90
|
+
this.envVarName = envVarName;
|
|
91
|
+
this.originalError = originalError;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Check if value is a plain object (not array, not null, not Date, etc.)
|
|
97
|
+
*/
|
|
98
|
+
function isPlainObject(value: any): value is Record<string, any> {
|
|
99
|
+
return (
|
|
100
|
+
value !== null &&
|
|
101
|
+
typeof value === 'object' &&
|
|
102
|
+
!Array.isArray(value) &&
|
|
103
|
+
Object.prototype.toString.call(value) === '[object Object]'
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Filters out arguments that are already set in HARPER_SET_CONFIG.
|
|
109
|
+
* This prevents individual environment variables from overriding runtime configuration.
|
|
110
|
+
*
|
|
111
|
+
* Note: Only filters against HARPER_SET_CONFIG, not HARPER_DEFAULT_CONFIG, since
|
|
112
|
+
* HARPER_DEFAULT_CONFIG sets defaults that can be overridden by individual env vars.
|
|
113
|
+
*
|
|
114
|
+
* @param args - Object containing individual env var arguments (e.g., from assignCMDENVVariables)
|
|
115
|
+
* @returns Filtered args object with HARPER_SET_CONFIG keys removed
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* // If HARPER_SET_CONFIG sets operationsApi.network.port
|
|
119
|
+
* const args = { operationsapi_network_port: '9925', rootpath: '/var/hdb' };
|
|
120
|
+
* const filtered = filterArgsAgainstRuntimeConfig(args);
|
|
121
|
+
* // Returns: { rootpath: '/var/hdb' }
|
|
122
|
+
*/
|
|
123
|
+
export function filterArgsAgainstRuntimeConfig(args: Record<string, any>): Record<string, any> {
|
|
124
|
+
// Only filter against HARPER_SET_CONFIG (not HARPER_DEFAULT_CONFIG)
|
|
125
|
+
if (!process.env.HARPER_SET_CONFIG) {
|
|
126
|
+
return args;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Parse HARPER_SET_CONFIG
|
|
130
|
+
let setConfig: ConfigObject;
|
|
131
|
+
try {
|
|
132
|
+
setConfig = JSON.parse(process.env.HARPER_SET_CONFIG);
|
|
133
|
+
} catch (err) {
|
|
134
|
+
// If parsing fails, log warning and return args unchanged
|
|
135
|
+
const logger = getLogger();
|
|
136
|
+
logger.warn('Failed to parse HARPER_SET_CONFIG for arg filtering', err);
|
|
137
|
+
return args;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// If no valid config, return args unchanged
|
|
141
|
+
if (Object.keys(setConfig).length === 0) {
|
|
142
|
+
return args;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Flatten HARPER_SET_CONFIG to get all keys
|
|
146
|
+
const flattenSetConfig = (obj: ConfigObject, prefix = ''): Set<string> => {
|
|
147
|
+
const keys = new Set<string>();
|
|
148
|
+
for (const key in obj) {
|
|
149
|
+
const newKey = prefix ? `${prefix}_${key}` : key;
|
|
150
|
+
if (obj[key] !== null && typeof obj[key] === 'object' && !Array.isArray(obj[key])) {
|
|
151
|
+
flattenSetConfig(obj[key], newKey).forEach((k) => keys.add(k));
|
|
152
|
+
} else {
|
|
153
|
+
keys.add(newKey.toLowerCase());
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return keys;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
const setConfigKeys = flattenSetConfig(setConfig);
|
|
160
|
+
|
|
161
|
+
// Filter out args that are in HARPER_SET_CONFIG
|
|
162
|
+
const filteredArgs: Record<string, any> = {};
|
|
163
|
+
for (const key in args) {
|
|
164
|
+
if (!setConfigKeys.has(key.toLowerCase())) {
|
|
165
|
+
filteredArgs[key] = args[key];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return filteredArgs;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Flatten nested object to dot-notation paths
|
|
174
|
+
*/
|
|
175
|
+
function flattenObject(obj: ConfigObject, prefix = ''): Record<string, any> {
|
|
176
|
+
const result: Record<string, any> = {};
|
|
177
|
+
|
|
178
|
+
for (const key in obj) {
|
|
179
|
+
if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
|
|
180
|
+
|
|
181
|
+
const value = obj[key];
|
|
182
|
+
const newKey = prefix ? `${prefix}.${key}` : key;
|
|
183
|
+
|
|
184
|
+
if (isPlainObject(value)) {
|
|
185
|
+
// Recurse for nested objects
|
|
186
|
+
Object.assign(result, flattenObject(value, newKey));
|
|
187
|
+
} else {
|
|
188
|
+
// Store primitive or array
|
|
189
|
+
result[newKey] = value;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Get nested value by dot-notation path
|
|
198
|
+
*/
|
|
199
|
+
function getNestedValue(obj: ConfigObject, path: string): any {
|
|
200
|
+
const keys = path.split('.');
|
|
201
|
+
let current = obj;
|
|
202
|
+
|
|
203
|
+
for (const key of keys) {
|
|
204
|
+
if (current === null || current === undefined) {
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
current = current[key];
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return current;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Set nested value by dot-notation path
|
|
215
|
+
*/
|
|
216
|
+
function setNestedValue(obj: ConfigObject, path: string, value: any): void {
|
|
217
|
+
const keys = path.split('.');
|
|
218
|
+
let current = obj;
|
|
219
|
+
|
|
220
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
221
|
+
const key = keys[i];
|
|
222
|
+
if (!isPlainObject(current[key])) {
|
|
223
|
+
current[key] = {};
|
|
224
|
+
}
|
|
225
|
+
current = current[key];
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
current[keys[keys.length - 1]] = value;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Delete nested value by dot-notation path
|
|
233
|
+
*/
|
|
234
|
+
function deleteNestedValue(obj: ConfigObject, path: string): void {
|
|
235
|
+
const keys = path.split('.');
|
|
236
|
+
let current = obj;
|
|
237
|
+
|
|
238
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
239
|
+
const key = keys[i];
|
|
240
|
+
if (!isPlainObject(current[key])) {
|
|
241
|
+
return; // Path doesn't exist
|
|
242
|
+
}
|
|
243
|
+
current = current[key];
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
delete current[keys[keys.length - 1]];
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Hash config object for snapshot comparison
|
|
251
|
+
*/
|
|
252
|
+
function hashConfig(config: ConfigObject): string {
|
|
253
|
+
// Deterministic JSON stringify with sorted keys at all levels
|
|
254
|
+
const sortedStringify = (obj: any): string => {
|
|
255
|
+
if (obj === null || typeof obj !== 'object') {
|
|
256
|
+
return JSON.stringify(obj);
|
|
257
|
+
}
|
|
258
|
+
if (Array.isArray(obj)) {
|
|
259
|
+
return '[' + obj.map(sortedStringify).join(',') + ']';
|
|
260
|
+
}
|
|
261
|
+
const keys = Object.keys(obj).sort();
|
|
262
|
+
const pairs = keys.map((key) => JSON.stringify(key) + ':' + sortedStringify(obj[key]));
|
|
263
|
+
return '{' + pairs.join(',') + '}';
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
const json = sortedStringify(config);
|
|
267
|
+
return crypto.createHash('sha256').update(json).digest('hex');
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Parse configuration environment variable value
|
|
272
|
+
*/
|
|
273
|
+
function parseConfigEnvVar(envVarValue: string | undefined, envVarName: string): ConfigObject | null {
|
|
274
|
+
if (!envVarValue || envVarValue.trim() === '') {
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
try {
|
|
279
|
+
const parsed = JSON.parse(envVarValue.trim());
|
|
280
|
+
|
|
281
|
+
if (!isPlainObject(parsed)) {
|
|
282
|
+
throw new ConfigEnvVarError(`${envVarName} must be a JSON object, got: ${typeof parsed}`, envVarName);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return parsed;
|
|
286
|
+
} catch (error) {
|
|
287
|
+
if (error instanceof ConfigEnvVarError) {
|
|
288
|
+
throw error;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
throw new ConfigEnvVarError(
|
|
292
|
+
`Invalid JSON syntax in ${envVarName}: ${(error as Error).message}`,
|
|
293
|
+
envVarName,
|
|
294
|
+
error as Error
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Load configuration state from file
|
|
301
|
+
*/
|
|
302
|
+
function loadConfigState(rootPath: string): ConfigState {
|
|
303
|
+
const statePath = path.join(getBackupDirPath(rootPath), STATE_FILE_NAME);
|
|
304
|
+
|
|
305
|
+
if (!fs.existsSync(statePath)) {
|
|
306
|
+
return {
|
|
307
|
+
version: '1.0',
|
|
308
|
+
sources: {},
|
|
309
|
+
originalValues: {},
|
|
310
|
+
snapshots: {},
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
try {
|
|
315
|
+
const state = fs.readJsonSync(statePath) as ConfigState;
|
|
316
|
+
// Ensure originalValues exists (for backwards compatibility with old state files)
|
|
317
|
+
if (!state.originalValues) {
|
|
318
|
+
state.originalValues = {};
|
|
319
|
+
}
|
|
320
|
+
return state;
|
|
321
|
+
} catch (error) {
|
|
322
|
+
// If state file is corrupted, start fresh
|
|
323
|
+
const logger = getLogger();
|
|
324
|
+
logger.warn(`Failed to load config state file, starting fresh: ${(error as Error).message}`);
|
|
325
|
+
return {
|
|
326
|
+
version: '1.0',
|
|
327
|
+
sources: {},
|
|
328
|
+
originalValues: {},
|
|
329
|
+
snapshots: {},
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Save configuration state to file
|
|
336
|
+
*/
|
|
337
|
+
function saveConfigState(rootPath: string, state: ConfigState): void {
|
|
338
|
+
const backupDir = getBackupDirPath(rootPath);
|
|
339
|
+
const statePath = path.join(backupDir, STATE_FILE_NAME);
|
|
340
|
+
|
|
341
|
+
// Ensure backup directory exists
|
|
342
|
+
fs.ensureDirSync(backupDir);
|
|
343
|
+
|
|
344
|
+
fs.writeJsonSync(statePath, state, { spaces: 2 });
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Detect config drift (user manual edits)
|
|
349
|
+
* Compares current file values with expected values from state
|
|
350
|
+
*/
|
|
351
|
+
function detectConfigDrift(fileConfig: ConfigObject, state: ConfigState): string[] {
|
|
352
|
+
const driftedPaths: string[] = [];
|
|
353
|
+
|
|
354
|
+
for (const [path, source] of Object.entries(state.sources)) {
|
|
355
|
+
// Only check paths from env vars (not user or default)
|
|
356
|
+
if (source !== 'HARPER_DEFAULT_CONFIG' && source !== 'HARPER_SET_CONFIG') {
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
const snapshot = state.snapshots[source];
|
|
361
|
+
if (!snapshot) continue;
|
|
362
|
+
|
|
363
|
+
const currentValue = getNestedValue(fileConfig, path);
|
|
364
|
+
const expectedValue = getNestedValue(snapshot.config, path);
|
|
365
|
+
|
|
366
|
+
// If values differ, user has edited the file
|
|
367
|
+
if (JSON.stringify(currentValue) !== JSON.stringify(expectedValue)) {
|
|
368
|
+
driftedPaths.push(path);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
return driftedPaths;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Apply a configuration layer (DEFAULT or SET)
|
|
377
|
+
*/
|
|
378
|
+
function applyConfigLayer(
|
|
379
|
+
fileConfig: ConfigObject,
|
|
380
|
+
state: ConfigState,
|
|
381
|
+
envConfig: ConfigObject,
|
|
382
|
+
sourceName: ConfigSource,
|
|
383
|
+
options: ApplyLayerOptions = {}
|
|
384
|
+
): void {
|
|
385
|
+
const { respectSources = [], storeOriginals = false } = options;
|
|
386
|
+
const flatEnvConfig = flattenObject(envConfig);
|
|
387
|
+
|
|
388
|
+
for (const [path, value] of Object.entries(flatEnvConfig)) {
|
|
389
|
+
const currentSource = state.sources[path];
|
|
390
|
+
const currentValue = getNestedValue(fileConfig, path);
|
|
391
|
+
|
|
392
|
+
// Skip if this path has a source we should respect
|
|
393
|
+
if (currentSource && respectSources.includes(currentSource)) {
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// Store original value if requested and this is first time overriding
|
|
398
|
+
if (storeOriginals && !currentSource && currentValue !== undefined && currentValue !== null) {
|
|
399
|
+
if (!(path in state.originalValues)) {
|
|
400
|
+
state.originalValues[path] = currentValue;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Set the value and track the source
|
|
405
|
+
setNestedValue(fileConfig, path, value);
|
|
406
|
+
state.sources[path] = sourceName;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Handle deletions when keys are removed from env var
|
|
412
|
+
*/
|
|
413
|
+
function handleDeletions(
|
|
414
|
+
fileConfig: ConfigObject,
|
|
415
|
+
state: ConfigState,
|
|
416
|
+
previousConfig: ConfigObject,
|
|
417
|
+
currentConfig: ConfigObject,
|
|
418
|
+
sourceName: ConfigSource
|
|
419
|
+
): void {
|
|
420
|
+
const previousPaths = Object.keys(flattenObject(previousConfig));
|
|
421
|
+
const currentPaths = Object.keys(flattenObject(currentConfig));
|
|
422
|
+
|
|
423
|
+
// Find paths that were in previous but not in current
|
|
424
|
+
const deletedPaths = previousPaths.filter((p) => !currentPaths.includes(p));
|
|
425
|
+
|
|
426
|
+
for (const path of deletedPaths) {
|
|
427
|
+
// Only handle if this path was set by this source
|
|
428
|
+
if (state.sources[path] === sourceName) {
|
|
429
|
+
// For both HARPER_DEFAULT_CONFIG and HARPER_SET_CONFIG, restore original value instead of deleting
|
|
430
|
+
if (
|
|
431
|
+
(sourceName === 'HARPER_DEFAULT_CONFIG' || sourceName === 'HARPER_SET_CONFIG') &&
|
|
432
|
+
path in state.originalValues
|
|
433
|
+
) {
|
|
434
|
+
setNestedValue(fileConfig, path, state.originalValues[path]);
|
|
435
|
+
delete state.originalValues[path];
|
|
436
|
+
} else {
|
|
437
|
+
// For other sources or if no original value, delete
|
|
438
|
+
deleteNestedValue(fileConfig, path);
|
|
439
|
+
}
|
|
440
|
+
delete state.sources[path];
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* Remove all values set by a specific source
|
|
447
|
+
*/
|
|
448
|
+
function removeValuesWithSource(fileConfig: ConfigObject, state: ConfigState, sourceName: ConfigSource): void {
|
|
449
|
+
const pathsToRemove = Object.keys(state.sources).filter((path) => state.sources[path] === sourceName);
|
|
450
|
+
|
|
451
|
+
for (const path of pathsToRemove) {
|
|
452
|
+
deleteNestedValue(fileConfig, path);
|
|
453
|
+
delete state.sources[path];
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* Build snapshot of values actually set by a source
|
|
459
|
+
*/
|
|
460
|
+
function buildSnapshot(fileConfig: ConfigObject, state: ConfigState, sourceName: ConfigSource): ConfigObject {
|
|
461
|
+
const actuallySetConfig: ConfigObject = {};
|
|
462
|
+
for (const path in state.sources) {
|
|
463
|
+
if (state.sources[path] === sourceName) {
|
|
464
|
+
const value = getNestedValue(fileConfig, path);
|
|
465
|
+
if (value !== undefined) {
|
|
466
|
+
setNestedValue(actuallySetConfig, path, value);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
return actuallySetConfig;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* Process a config environment variable (parse, apply, track)
|
|
475
|
+
*/
|
|
476
|
+
function processEnvVar(
|
|
477
|
+
fileConfig: ConfigObject,
|
|
478
|
+
state: ConfigState,
|
|
479
|
+
envVarName: string,
|
|
480
|
+
sourceName: ConfigSource,
|
|
481
|
+
options: {
|
|
482
|
+
isInstall?: boolean;
|
|
483
|
+
respectSources?: ConfigSource[];
|
|
484
|
+
} = {}
|
|
485
|
+
): void {
|
|
486
|
+
const envVarValue = process.env[envVarName];
|
|
487
|
+
if (!envVarValue) return;
|
|
488
|
+
|
|
489
|
+
const logger = getLogger();
|
|
490
|
+
const parsedConfig = parseConfigEnvVar(envVarValue, envVarName);
|
|
491
|
+
if (!parsedConfig) return;
|
|
492
|
+
|
|
493
|
+
const currentHash = hashConfig(parsedConfig);
|
|
494
|
+
const previousSnapshot = state.snapshots[sourceName];
|
|
495
|
+
|
|
496
|
+
// Apply the configuration
|
|
497
|
+
if (sourceName === 'HARPER_SET_CONFIG') {
|
|
498
|
+
// SET_CONFIG always overrides everything, but store originals for restoration
|
|
499
|
+
applyConfigLayer(fileConfig, state, parsedConfig, sourceName, {
|
|
500
|
+
respectSources: [],
|
|
501
|
+
storeOriginals: true,
|
|
502
|
+
});
|
|
503
|
+
} else if (sourceName === 'HARPER_DEFAULT_CONFIG') {
|
|
504
|
+
// DEFAULT_CONFIG behavior depends on install vs runtime
|
|
505
|
+
if (options.isInstall) {
|
|
506
|
+
// Install: Override template defaults, but respect other sources
|
|
507
|
+
applyConfigLayer(fileConfig, state, parsedConfig, sourceName, {
|
|
508
|
+
respectSources: ['HARPER_SET_CONFIG', 'user'],
|
|
509
|
+
storeOriginals: true,
|
|
510
|
+
});
|
|
511
|
+
} else {
|
|
512
|
+
// Runtime: Only update values we previously set
|
|
513
|
+
const flatEnvConfig = flattenObject(parsedConfig);
|
|
514
|
+
for (const [path, value] of Object.entries(flatEnvConfig)) {
|
|
515
|
+
const currentSource = state.sources[path];
|
|
516
|
+
const currentValue = getNestedValue(fileConfig, path);
|
|
517
|
+
|
|
518
|
+
// Skip if path has a tracked source that's not HARPER_DEFAULT_CONFIG
|
|
519
|
+
if (currentSource && currentSource !== 'HARPER_DEFAULT_CONFIG') {
|
|
520
|
+
continue;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// At runtime, only set if we previously set this value OR if value doesn't exist
|
|
524
|
+
if (!currentSource) {
|
|
525
|
+
if (currentValue !== undefined && currentValue !== null) {
|
|
526
|
+
// Value exists but we never set it - store as original but don't override
|
|
527
|
+
if (!(path in state.originalValues)) {
|
|
528
|
+
state.originalValues[path] = currentValue;
|
|
529
|
+
}
|
|
530
|
+
continue;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// Set the value and track the source
|
|
535
|
+
setNestedValue(fileConfig, path, value);
|
|
536
|
+
state.sources[path] = sourceName;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// Handle deletions if config changed
|
|
542
|
+
if (previousSnapshot && previousSnapshot.hash !== currentHash) {
|
|
543
|
+
handleDeletions(fileConfig, state, previousSnapshot.config, parsedConfig, sourceName);
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
// Build and store snapshot
|
|
547
|
+
const actuallySetConfig = buildSnapshot(fileConfig, state, sourceName);
|
|
548
|
+
state.snapshots[sourceName] = {
|
|
549
|
+
hash: currentHash,
|
|
550
|
+
config: actuallySetConfig,
|
|
551
|
+
};
|
|
552
|
+
|
|
553
|
+
const mode = options.isInstall ? 'installation' : 'runtime';
|
|
554
|
+
logger.debug?.(`Applied ${envVarName} at ${mode}`);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/**
|
|
558
|
+
* Remove all config values set by an environment variable that has been removed
|
|
559
|
+
*/
|
|
560
|
+
function cleanupRemovedEnvVar(
|
|
561
|
+
fileConfig: ConfigObject,
|
|
562
|
+
state: ConfigState,
|
|
563
|
+
envVarName: string,
|
|
564
|
+
sourceName: ConfigSource
|
|
565
|
+
): void {
|
|
566
|
+
if (!state.snapshots[sourceName]) return;
|
|
567
|
+
|
|
568
|
+
const logger = getLogger();
|
|
569
|
+
|
|
570
|
+
// For both HARPER_DEFAULT_CONFIG and HARPER_SET_CONFIG, restore original values
|
|
571
|
+
if (sourceName === 'HARPER_DEFAULT_CONFIG' || sourceName === 'HARPER_SET_CONFIG') {
|
|
572
|
+
const pathsToCleanup = Object.keys(state.sources).filter((path) => state.sources[path] === sourceName);
|
|
573
|
+
for (const path of pathsToCleanup) {
|
|
574
|
+
if (path in state.originalValues) {
|
|
575
|
+
// Restore original value
|
|
576
|
+
setNestedValue(fileConfig, path, state.originalValues[path]);
|
|
577
|
+
delete state.originalValues[path];
|
|
578
|
+
} else {
|
|
579
|
+
// No original, just delete
|
|
580
|
+
deleteNestedValue(fileConfig, path);
|
|
581
|
+
}
|
|
582
|
+
delete state.sources[path];
|
|
583
|
+
}
|
|
584
|
+
} else {
|
|
585
|
+
// For other sources, just remove
|
|
586
|
+
removeValuesWithSource(fileConfig, state, sourceName);
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
delete state.snapshots[sourceName];
|
|
590
|
+
logger.debug?.(`${envVarName} removed, cleaned up values`);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
/**
|
|
594
|
+
* Apply HARPER_DEFAULT_CONFIG and HARPER_SET_CONFIG
|
|
595
|
+
* Can be used for both install-time and runtime
|
|
596
|
+
*/
|
|
597
|
+
export function applyRuntimeEnvConfig(
|
|
598
|
+
fileConfig: ConfigObject,
|
|
599
|
+
rootPath: string,
|
|
600
|
+
options: { isInstall?: boolean } = {}
|
|
601
|
+
): ConfigObject {
|
|
602
|
+
const defaultEnvValue = process.env.HARPER_DEFAULT_CONFIG;
|
|
603
|
+
const setEnvValue = process.env.HARPER_SET_CONFIG;
|
|
604
|
+
|
|
605
|
+
// Load existing state
|
|
606
|
+
const state = loadConfigState(rootPath);
|
|
607
|
+
|
|
608
|
+
// No env vars set and no previous state, nothing to do
|
|
609
|
+
if (!defaultEnvValue && !setEnvValue && Object.keys(state.snapshots).length === 0) {
|
|
610
|
+
return fileConfig;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
// Detect drift (user manual edits) - only at runtime, not install
|
|
614
|
+
if (!options.isInstall) {
|
|
615
|
+
const driftedPaths = detectConfigDrift(fileConfig, state);
|
|
616
|
+
for (const path of driftedPaths) {
|
|
617
|
+
state.sources[path] = 'user';
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
// Process HARPER_DEFAULT_CONFIG
|
|
622
|
+
processEnvVar(fileConfig, state, 'HARPER_DEFAULT_CONFIG', 'HARPER_DEFAULT_CONFIG', options);
|
|
623
|
+
|
|
624
|
+
// Clean up if HARPER_DEFAULT_CONFIG was removed
|
|
625
|
+
if (!defaultEnvValue) {
|
|
626
|
+
cleanupRemovedEnvVar(fileConfig, state, 'HARPER_DEFAULT_CONFIG', 'HARPER_DEFAULT_CONFIG');
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
// Process HARPER_SET_CONFIG (always overrides everything)
|
|
630
|
+
processEnvVar(fileConfig, state, 'HARPER_SET_CONFIG', 'HARPER_SET_CONFIG', options);
|
|
631
|
+
|
|
632
|
+
// Clean up if HARPER_SET_CONFIG was removed
|
|
633
|
+
if (!setEnvValue) {
|
|
634
|
+
cleanupRemovedEnvVar(fileConfig, state, 'HARPER_SET_CONFIG', 'HARPER_SET_CONFIG');
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
// Save updated state
|
|
638
|
+
saveConfigState(rootPath, state);
|
|
639
|
+
|
|
640
|
+
return fileConfig;
|
|
641
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const uuid = require('uuid');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Constructor class for inserting an attirbute in HDB
|
|
7
|
+
*/
|
|
8
|
+
class CreateAttributeObject {
|
|
9
|
+
/**
|
|
10
|
+
*
|
|
11
|
+
* @param schema
|
|
12
|
+
* @param {String} table
|
|
13
|
+
* @param {String} attribute
|
|
14
|
+
* @param {*} [id]
|
|
15
|
+
*/
|
|
16
|
+
constructor(schema, table, attribute, id) {
|
|
17
|
+
this.schema = schema;
|
|
18
|
+
this.table = table;
|
|
19
|
+
this.attribute = attribute;
|
|
20
|
+
this.id = id ? id : uuid.v4();
|
|
21
|
+
this.schema_table = `${this.schema}.${this.table}`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
module.exports = CreateAttributeObject;
|