@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.
Files changed (444) hide show
  1. package/bin/BinObjects.js +17 -0
  2. package/bin/cliOperations.js +157 -0
  3. package/bin/copyDb.ts +280 -0
  4. package/bin/harper.js +156 -0
  5. package/bin/install.js +15 -0
  6. package/bin/lite.js +5 -0
  7. package/bin/restart.js +201 -0
  8. package/bin/run.js +409 -0
  9. package/bin/status.js +65 -0
  10. package/bin/stop.js +22 -0
  11. package/bin/upgrade.js +134 -0
  12. package/components/Application.ts +646 -0
  13. package/components/ApplicationScope.ts +49 -0
  14. package/components/Component.ts +53 -0
  15. package/components/ComponentV1.ts +342 -0
  16. package/components/DEFAULT_CONFIG.ts +18 -0
  17. package/components/EntryHandler.ts +227 -0
  18. package/components/Logger.ts +14 -0
  19. package/components/OptionsWatcher.ts +354 -0
  20. package/components/PluginModule.ts +6 -0
  21. package/components/Scope.ts +329 -0
  22. package/components/componentLoader.ts +529 -0
  23. package/components/deriveCommonPatternBase.ts +31 -0
  24. package/components/deriveGlobOptions.ts +44 -0
  25. package/components/deriveURLPath.ts +57 -0
  26. package/components/operations.js +658 -0
  27. package/components/operationsValidation.js +246 -0
  28. package/components/packageComponent.ts +39 -0
  29. package/components/requestRestart.ts +26 -0
  30. package/components/resolveBaseURLPath.ts +38 -0
  31. package/components/status/ComponentStatus.ts +110 -0
  32. package/components/status/ComponentStatusRegistry.ts +251 -0
  33. package/components/status/api.ts +153 -0
  34. package/components/status/crossThread.ts +405 -0
  35. package/components/status/errors.ts +152 -0
  36. package/components/status/index.ts +44 -0
  37. package/components/status/internal.ts +65 -0
  38. package/components/status/registry.ts +12 -0
  39. package/components/status/types.ts +96 -0
  40. package/config/RootConfigWatcher.ts +59 -0
  41. package/config/configHelpers.ts +11 -0
  42. package/config/configUtils.js +967 -0
  43. package/config/harperConfigEnvVars.ts +641 -0
  44. package/dataLayer/CreateAttributeObject.js +25 -0
  45. package/dataLayer/CreateTableObject.js +11 -0
  46. package/dataLayer/DataLayerObjects.js +43 -0
  47. package/dataLayer/DeleteBeforeObject.js +22 -0
  48. package/dataLayer/DeleteObject.js +25 -0
  49. package/dataLayer/DropAttributeObject.js +11 -0
  50. package/dataLayer/GetBackupObject.js +22 -0
  51. package/dataLayer/InsertObject.js +24 -0
  52. package/dataLayer/ReadAuditLogObject.js +24 -0
  53. package/dataLayer/SQLSearch.js +1335 -0
  54. package/dataLayer/SearchByConditionsObject.js +61 -0
  55. package/dataLayer/SearchByHashObject.js +21 -0
  56. package/dataLayer/SearchObject.js +45 -0
  57. package/dataLayer/SqlSearchObject.js +14 -0
  58. package/dataLayer/UpdateObject.js +23 -0
  59. package/dataLayer/UpsertObject.js +23 -0
  60. package/dataLayer/bulkLoad.js +813 -0
  61. package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
  62. package/dataLayer/dataObjects/UpsertObject.js +23 -0
  63. package/dataLayer/delete.js +164 -0
  64. package/dataLayer/export.js +381 -0
  65. package/dataLayer/getBackup.js +40 -0
  66. package/dataLayer/harperBridge/BridgeMethods.js +81 -0
  67. package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
  68. package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
  69. package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
  70. package/dataLayer/harperBridge/harperBridge.js +21 -0
  71. package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
  72. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
  73. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
  74. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
  75. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
  76. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
  77. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
  78. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
  79. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
  80. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
  81. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
  82. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
  83. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
  84. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
  85. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
  86. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
  87. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
  88. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
  89. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
  90. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
  91. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
  92. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
  93. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
  94. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
  95. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
  96. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
  97. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
  98. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
  99. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
  100. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
  101. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
  102. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
  103. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
  104. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
  105. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
  106. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
  107. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
  108. package/dataLayer/hdbInfoController.js +254 -0
  109. package/dataLayer/insert.js +266 -0
  110. package/dataLayer/readAuditLog.js +59 -0
  111. package/dataLayer/schema.js +366 -0
  112. package/dataLayer/schemaDescribe.js +289 -0
  113. package/dataLayer/search.js +60 -0
  114. package/dataLayer/transaction.js +17 -0
  115. package/dataLayer/update.js +124 -0
  116. package/dist/components/Logger.d.ts +12 -0
  117. package/dist/components/Logger.js +3 -0
  118. package/dist/components/Logger.js.map +1 -0
  119. package/dist/components/Scope.d.ts +14 -4
  120. package/dist/components/Scope.js +18 -10
  121. package/dist/components/Scope.js.map +1 -1
  122. package/dist/components/componentLoader.js +16 -9
  123. package/dist/components/componentLoader.js.map +1 -1
  124. package/dist/components/operations.js +2 -2
  125. package/dist/components/operations.js.map +1 -1
  126. package/dist/config/configUtils.d.ts +1 -1
  127. package/dist/config/configUtils.js +1 -1
  128. package/dist/config/configUtils.js.map +1 -1
  129. package/dist/dataLayer/CreateTableObject.d.ts +2 -2
  130. package/dist/dataLayer/CreateTableObject.js +2 -2
  131. package/dist/dataLayer/CreateTableObject.js.map +1 -1
  132. package/dist/dataLayer/delete.d.ts +1 -1
  133. package/dist/dataLayer/schema.js +6 -5
  134. package/dist/dataLayer/schema.js.map +1 -1
  135. package/dist/dataLayer/schemaDescribe.js +1 -1
  136. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  137. package/dist/index.d.ts +1 -1
  138. package/dist/index.js +2 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/resources/DatabaseTransaction.d.ts +1 -1
  141. package/dist/resources/IterableEventQueue.d.ts +1 -1
  142. package/dist/resources/LMDBTransaction.d.ts +5 -1
  143. package/dist/resources/Resource.d.ts +1 -1
  144. package/dist/resources/RocksIndexStore.d.ts +3 -3
  145. package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
  146. package/dist/resources/Table.d.ts +15 -6
  147. package/dist/resources/Table.js +4 -1
  148. package/dist/resources/Table.js.map +1 -1
  149. package/dist/resources/analytics/read.js +32 -22
  150. package/dist/resources/analytics/read.js.map +1 -1
  151. package/dist/resources/analytics/write.js +3 -6
  152. package/dist/resources/analytics/write.js.map +1 -1
  153. package/dist/resources/auditStore.d.ts +3 -3
  154. package/dist/resources/blob.d.ts +25 -2
  155. package/dist/resources/databases.d.ts +12 -2
  156. package/dist/resources/databases.js +22 -19
  157. package/dist/resources/databases.js.map +1 -1
  158. package/dist/resources/search.js +11 -5
  159. package/dist/resources/search.js.map +1 -1
  160. package/dist/resources/transaction.d.ts +2 -1
  161. package/dist/security/auth.js +1 -1
  162. package/dist/security/auth.js.map +1 -1
  163. package/dist/security/cryptoHash.d.ts +2 -2
  164. package/dist/security/jsLoader.js +243 -66
  165. package/dist/security/jsLoader.js.map +1 -1
  166. package/dist/security/keys.js +4 -5
  167. package/dist/security/keys.js.map +1 -1
  168. package/dist/security/user.js +3 -3
  169. package/dist/security/user.js.map +1 -1
  170. package/dist/server/REST.js +16 -2
  171. package/dist/server/REST.js.map +1 -1
  172. package/dist/server/Server.d.ts +2 -1
  173. package/dist/server/Server.js.map +1 -1
  174. package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
  175. package/dist/server/fastifyRoutes.js +2 -0
  176. package/dist/server/fastifyRoutes.js.map +1 -1
  177. package/dist/server/http.js +12 -6
  178. package/dist/server/http.js.map +1 -1
  179. package/dist/server/jobs/JobObject.d.ts +3 -3
  180. package/dist/server/loadRootComponents.js +1 -0
  181. package/dist/server/loadRootComponents.js.map +1 -1
  182. package/dist/server/operationsServer.js +3 -1
  183. package/dist/server/operationsServer.js.map +1 -1
  184. package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
  185. package/dist/server/serverHelpers/Request.d.ts +5 -5
  186. package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
  187. package/dist/server/threads/manageThreads.d.ts +2 -2
  188. package/dist/server/threads/manageThreads.js +50 -35
  189. package/dist/server/threads/manageThreads.js.map +1 -1
  190. package/dist/server/threads/socketRouter.d.ts +1 -1
  191. package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
  192. package/dist/utility/AWS/AWSConnector.d.ts +3 -2
  193. package/dist/utility/common_utils.d.ts +3 -3
  194. package/dist/utility/environment/systemInformation.d.ts +1 -0
  195. package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
  196. package/dist/utility/globalSchema.d.ts +1 -1
  197. package/dist/utility/hdbTerms.d.ts +3 -0
  198. package/dist/utility/hdbTerms.js +3 -0
  199. package/dist/utility/hdbTerms.js.map +1 -1
  200. package/dist/utility/installation.d.ts +2 -4
  201. package/dist/utility/installation.js.map +1 -1
  202. package/dist/utility/lmdb/commonUtility.d.ts +1 -0
  203. package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
  204. package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
  205. package/dist/utility/lmdb/searchUtility.d.ts +2 -1
  206. package/dist/utility/lmdb/writeUtility.d.ts +1 -0
  207. package/dist/utility/logging/harper_logger.d.ts +6 -6
  208. package/dist/utility/processManagement/processManagement.d.ts +1 -1
  209. package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
  210. package/dist/validation/common_validators.d.ts +4 -3
  211. package/dist/validation/configValidator.d.ts +3 -2
  212. package/index.d.ts +56 -0
  213. package/index.js +41 -0
  214. package/json/systemSchema.json +373 -0
  215. package/launchServiceScripts/launchHarperDB.js +3 -0
  216. package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
  217. package/package.json +21 -3
  218. package/resources/DatabaseTransaction.ts +378 -0
  219. package/resources/ErrorResource.ts +57 -0
  220. package/resources/IterableEventQueue.ts +94 -0
  221. package/resources/LMDBTransaction.ts +349 -0
  222. package/resources/RecordEncoder.ts +702 -0
  223. package/resources/RequestTarget.ts +134 -0
  224. package/resources/Resource.ts +789 -0
  225. package/resources/ResourceInterface.ts +221 -0
  226. package/resources/ResourceInterfaceV2.ts +53 -0
  227. package/resources/ResourceV2.ts +67 -0
  228. package/resources/Resources.ts +162 -0
  229. package/resources/RocksIndexStore.ts +70 -0
  230. package/resources/RocksTransactionLogStore.ts +352 -0
  231. package/resources/Table.ts +4527 -0
  232. package/resources/analytics/hostnames.ts +72 -0
  233. package/resources/analytics/metadata.ts +10 -0
  234. package/resources/analytics/read.ts +252 -0
  235. package/resources/analytics/write.ts +803 -0
  236. package/resources/auditStore.ts +556 -0
  237. package/resources/blob.ts +1268 -0
  238. package/resources/crdt.ts +125 -0
  239. package/resources/dataLoader.ts +527 -0
  240. package/resources/databases.ts +1290 -0
  241. package/resources/graphql.ts +221 -0
  242. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
  243. package/resources/indexes/customIndexes.ts +7 -0
  244. package/resources/indexes/vector.ts +38 -0
  245. package/resources/jsResource.ts +86 -0
  246. package/resources/loadEnv.ts +22 -0
  247. package/resources/login.ts +18 -0
  248. package/resources/openApi.ts +409 -0
  249. package/resources/registrationDeprecated.ts +8 -0
  250. package/resources/replayLogs.ts +136 -0
  251. package/resources/roles.ts +98 -0
  252. package/resources/search.ts +1301 -0
  253. package/resources/tracked.ts +584 -0
  254. package/resources/transaction.ts +89 -0
  255. package/resources/transactionBroadcast.ts +258 -0
  256. package/security/auth.ts +376 -0
  257. package/security/certificateVerification/certificateVerificationSource.ts +84 -0
  258. package/security/certificateVerification/configValidation.ts +107 -0
  259. package/security/certificateVerification/crlVerification.ts +623 -0
  260. package/security/certificateVerification/index.ts +121 -0
  261. package/security/certificateVerification/ocspVerification.ts +148 -0
  262. package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
  263. package/security/certificateVerification/types.ts +128 -0
  264. package/security/certificateVerification/verificationConfig.ts +138 -0
  265. package/security/certificateVerification/verificationUtils.ts +447 -0
  266. package/security/cryptoHash.js +42 -0
  267. package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
  268. package/security/data_objects/PermissionResponseObject.js +115 -0
  269. package/security/data_objects/PermissionTableResponseObject.js +20 -0
  270. package/security/fastifyAuth.js +169 -0
  271. package/security/impersonation.ts +160 -0
  272. package/security/jsLoader.ts +716 -0
  273. package/security/keys.js +948 -0
  274. package/security/permissionsTranslator.js +300 -0
  275. package/security/role.js +218 -0
  276. package/security/tokenAuthentication.ts +228 -0
  277. package/security/user.ts +449 -0
  278. package/server/DurableSubscriptionsSession.ts +503 -0
  279. package/server/REST.ts +407 -0
  280. package/server/Server.ts +89 -0
  281. package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
  282. package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
  283. package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
  284. package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
  285. package/server/fastifyRoutes.ts +205 -0
  286. package/server/graphqlQuerying.ts +700 -0
  287. package/server/http.ts +640 -0
  288. package/server/itc/serverHandlers.js +161 -0
  289. package/server/itc/utility/ITCEventObject.js +10 -0
  290. package/server/jobs/JobObject.js +24 -0
  291. package/server/jobs/jobProcess.js +69 -0
  292. package/server/jobs/jobRunner.js +162 -0
  293. package/server/jobs/jobs.js +304 -0
  294. package/server/loadRootComponents.js +44 -0
  295. package/server/mqtt.ts +485 -0
  296. package/server/nodeName.ts +75 -0
  297. package/server/operationsServer.ts +313 -0
  298. package/server/serverHelpers/Headers.ts +108 -0
  299. package/server/serverHelpers/JSONStream.ts +269 -0
  300. package/server/serverHelpers/OperationFunctionObject.ts +13 -0
  301. package/server/serverHelpers/Request.ts +158 -0
  302. package/server/serverHelpers/contentTypes.ts +637 -0
  303. package/server/serverHelpers/requestTimePlugin.js +57 -0
  304. package/server/serverHelpers/serverHandlers.js +148 -0
  305. package/server/serverHelpers/serverUtilities.ts +473 -0
  306. package/server/serverRegistry.ts +8 -0
  307. package/server/static.ts +187 -0
  308. package/server/status/definitions.ts +37 -0
  309. package/server/status/index.ts +125 -0
  310. package/server/storageReclamation.ts +93 -0
  311. package/server/threads/itc.js +89 -0
  312. package/server/threads/manageThreads.js +594 -0
  313. package/server/threads/socketRouter.ts +360 -0
  314. package/server/threads/threadServer.js +279 -0
  315. package/server/throttle.ts +73 -0
  316. package/sqlTranslator/SelectValidator.js +330 -0
  317. package/sqlTranslator/alasqlFunctionImporter.js +62 -0
  318. package/sqlTranslator/deleteTranslator.js +67 -0
  319. package/sqlTranslator/index.js +242 -0
  320. package/sqlTranslator/sql_statement_bucket.js +472 -0
  321. package/static/defaultConfig.yaml +3 -0
  322. package/studio/web/HDBDogOnly.svg +78 -0
  323. package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
  324. package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
  325. package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
  326. package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
  327. package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
  328. package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
  329. package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
  330. package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
  331. package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
  332. package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
  333. package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
  334. package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
  335. package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
  336. package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
  337. package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
  338. package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
  339. package/studio/web/assets/index-BTgXJX9d.js +235 -0
  340. package/studio/web/assets/index-BTgXJX9d.js.map +1 -0
  341. package/studio/web/assets/index-C-GXfcup.js +37 -0
  342. package/studio/web/assets/index-C-GXfcup.js.map +1 -0
  343. package/studio/web/assets/index-PFlNdimM.js +2 -0
  344. package/studio/web/assets/index-PFlNdimM.js.map +1 -0
  345. package/studio/web/assets/index-Y2g_iFpU.css +1 -0
  346. package/studio/web/assets/index-jiPwkrsB.css +1 -0
  347. package/studio/web/assets/index.lazy-C3TJZJ4o.js +266 -0
  348. package/studio/web/assets/index.lazy-C3TJZJ4o.js.map +1 -0
  349. package/studio/web/assets/profiler-DotzgiCJ.js +2 -0
  350. package/studio/web/assets/profiler-DotzgiCJ.js.map +1 -0
  351. package/studio/web/assets/react-redux-VxUEx_mU.js +6 -0
  352. package/studio/web/assets/react-redux-VxUEx_mU.js.map +1 -0
  353. package/studio/web/assets/startRecording-B_9J9Csd.js +3 -0
  354. package/studio/web/assets/startRecording-B_9J9Csd.js.map +1 -0
  355. package/studio/web/fabric-signup-background.webp +0 -0
  356. package/studio/web/fabric-signup-text.png +0 -0
  357. package/studio/web/favicon_purple.png +0 -0
  358. package/studio/web/github-icon.svg +15 -0
  359. package/studio/web/harper-fabric_black.png +0 -0
  360. package/studio/web/harper-fabric_white.png +0 -0
  361. package/studio/web/harper-studio_white.png +0 -0
  362. package/studio/web/index.html +16 -0
  363. package/studio/web/running.css +148 -0
  364. package/studio/web/running.html +147 -0
  365. package/studio/web/running.js +111 -0
  366. package/upgrade/UpgradeObjects.js +13 -0
  367. package/upgrade/directives/directivesController.js +90 -0
  368. package/upgrade/directivesManager.js +139 -0
  369. package/upgrade/upgradePrompt.js +124 -0
  370. package/upgrade/upgradeUtilities.js +28 -0
  371. package/utility/AWS/AWSConnector.js +29 -0
  372. package/utility/OperationFunctionCaller.js +63 -0
  373. package/utility/assignCmdEnvVariables.js +62 -0
  374. package/utility/common_utils.js +867 -0
  375. package/utility/environment/environmentManager.js +208 -0
  376. package/utility/environment/systemInformation.js +355 -0
  377. package/utility/errors/commonErrors.js +267 -0
  378. package/utility/errors/hdbError.js +146 -0
  379. package/utility/functions/date/dateFunctions.js +65 -0
  380. package/utility/functions/geo.js +355 -0
  381. package/utility/functions/sql/alaSQLExtension.js +104 -0
  382. package/utility/globalSchema.js +35 -0
  383. package/utility/hdbTerms.ts +819 -0
  384. package/utility/install/checkJWTTokensExist.js +62 -0
  385. package/utility/install/harperdb.conf +15 -0
  386. package/utility/install/harperdb.service +14 -0
  387. package/utility/install/installer.js +635 -0
  388. package/utility/installation.ts +30 -0
  389. package/utility/lmdb/DBIDefinition.js +20 -0
  390. package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
  391. package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
  392. package/utility/lmdb/OpenDBIObject.js +31 -0
  393. package/utility/lmdb/OpenEnvironmentObject.js +41 -0
  394. package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
  395. package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
  396. package/utility/lmdb/cleanLMDBMap.js +65 -0
  397. package/utility/lmdb/commonUtility.js +119 -0
  398. package/utility/lmdb/deleteUtility.js +128 -0
  399. package/utility/lmdb/environmentUtility.js +477 -0
  400. package/utility/lmdb/searchCursorFunctions.js +187 -0
  401. package/utility/lmdb/searchUtility.js +918 -0
  402. package/utility/lmdb/terms.js +57 -0
  403. package/utility/lmdb/writeUtility.js +407 -0
  404. package/utility/logging/harper_logger.js +876 -0
  405. package/utility/logging/logRotator.js +157 -0
  406. package/utility/logging/logger.ts +24 -0
  407. package/utility/logging/readLog.js +355 -0
  408. package/utility/logging/transactionLog.js +57 -0
  409. package/utility/mount_hdb.js +59 -0
  410. package/utility/npmUtilities.js +102 -0
  411. package/utility/operationPermissions.ts +112 -0
  412. package/utility/operation_authorization.js +836 -0
  413. package/utility/packageUtils.js +55 -0
  414. package/utility/password.ts +99 -0
  415. package/utility/processManagement/processManagement.js +187 -0
  416. package/utility/processManagement/servicesConfig.js +56 -0
  417. package/utility/scripts/restartHdb.js +24 -0
  418. package/utility/scripts/user_data.sh +13 -0
  419. package/utility/signalling.js +36 -0
  420. package/utility/terms/certificates.js +81 -0
  421. package/utility/when.ts +20 -0
  422. package/v1.d.ts +39 -0
  423. package/v1.js +41 -0
  424. package/v2.d.ts +39 -0
  425. package/v2.js +41 -0
  426. package/validation/bulkDeleteValidator.js +24 -0
  427. package/validation/check_permissions.js +19 -0
  428. package/validation/common_validators.js +95 -0
  429. package/validation/configValidator.js +331 -0
  430. package/validation/deleteValidator.js +15 -0
  431. package/validation/fileLoadValidator.js +153 -0
  432. package/validation/insertValidator.js +40 -0
  433. package/validation/installValidator.js +37 -0
  434. package/validation/readLogValidator.js +64 -0
  435. package/validation/role_validation.js +320 -0
  436. package/validation/schemaMetadataValidator.js +42 -0
  437. package/validation/searchValidator.js +166 -0
  438. package/validation/statusValidator.ts +66 -0
  439. package/validation/transactionLogValidator.js +33 -0
  440. package/validation/user_validation.js +55 -0
  441. package/validation/validationWrapper.js +105 -0
  442. package/dist/resources/analytics/profile.d.ts +0 -2
  443. package/dist/resources/analytics/profile.js +0 -144
  444. 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;
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ class CreateTableObject {
4
+ constructor(schema, table, primary_key) {
5
+ this.schema = schema;
6
+ this.table = table;
7
+ this.primary_key = primary_key;
8
+ }
9
+ }
10
+
11
+ module.exports = CreateTableObject;