diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts index 98eb4b549..3da0fd8f1 100644 --- a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts @@ -46,7 +46,7 @@ import { transformNewConfigToOld, transformOldConfigToNew, } from "./transformConfigSpec" -import { partialDiff } from "@start9labs/start-sdk/base/lib/util" +import { partialDiff, StorePath } from "@start9labs/start-sdk/base/lib/util" type Optional = A | undefined | null function todo(): never { @@ -355,6 +355,10 @@ export class SystemForEmbassy implements System { ) { await effects.action.clearRequests({ only: ["needs-config"] }) } + await effects.store.set({ + path: EMBASSY_POINTER_PATH_PREFIX, + value: this.getConfig(effects, timeoutMs), + }) } else if (this.manifest.config) { await effects.action.request({ packageId: this.manifest.id, @@ -577,11 +581,31 @@ export class SystemForEmbassy implements System { const moduleCode = await this.moduleCode await moduleCode.createBackup?.(polyfillEffects(effects, this.manifest)) } + await fs.writeFile( + "/media/startos/backup/store.json", + JSON.stringify(await effects.store.get({ path: "" as StorePath })), + { encoding: "utf-8" }, + ) + const dataVersion = await effects.getDataVersion() + if (dataVersion) + await fs.writeFile("/media/startos/backup/dataVersion.txt", dataVersion, { + encoding: "utf-8", + }) } async restoreBackup( effects: Effects, timeoutMs: number | null, ): Promise { + const store = await fs + .readFile("/media/startos/backup/store.json", { + encoding: "utf-8", + }) + .catch((_) => null) + if (store) + await effects.store.set({ + path: "" as StorePath, + value: JSON.parse(store), + }) const restoreBackup = this.manifest.backup.restore if (restoreBackup.type === "docker") { const commands = [restoreBackup.entrypoint, ...restoreBackup.args] @@ -600,6 +624,13 @@ export class SystemForEmbassy implements System { const moduleCode = await this.moduleCode await moduleCode.restoreBackup?.(polyfillEffects(effects, this.manifest)) } + + const dataVersion = await fs + .readFile("/media/startos/backup/dataVersion.txt", { + encoding: "utf-8", + }) + .catch((_) => null) + if (dataVersion) await effects.setDataVersion({ version: dataVersion }) } async getConfig(effects: Effects, timeoutMs: number | null) { return this.getConfigUncleaned(effects, timeoutMs).then(convertToNewConfig) diff --git a/core/startos/src/service/mod.rs b/core/startos/src/service/mod.rs index 8d3db1944..dd67863ae 100644 --- a/core/startos/src/service/mod.rs +++ b/core/startos/src/service/mod.rs @@ -574,7 +574,7 @@ impl Service { .send( Guid::new(), transition::backup::Backup { - path: guard.path().join("data"), + path: guard.path().to_path_buf(), }, ) .await?? diff --git a/core/startos/src/service/transition/restore.rs b/core/startos/src/service/transition/restore.rs index 7061b0c1e..559dbe8ec 100644 --- a/core/startos/src/service/transition/restore.rs +++ b/core/startos/src/service/transition/restore.rs @@ -1,5 +1,6 @@ use std::path::PathBuf; +use futures::channel::oneshot; use futures::FutureExt; use models::ProcedureName; @@ -28,10 +29,11 @@ impl Handler for ServiceActor { jobs: &BackgroundJobQueue, ) -> Self::Response { // So Need a handle to just a single field in the state - let path = restore.path.clone(); + let path = restore.path; let seed = self.0.clone(); let state = self.0.persistent_container.state.clone(); + let (send_res, recv_res) = oneshot::channel(); let transition = RemoteCancellable::new( async move { let backup_guard = seed @@ -48,17 +50,10 @@ impl Handler for ServiceActor { }); Ok::<_, Error>(()) } - .map(|x| { - if let Err(err) = x { - tracing::debug!("{:?}", err); - tracing::warn!("{}", err); - } - }), + .map(|res| send_res.send(res)), ); let cancel_handle = transition.cancellation_handle(); - let transition = transition.shared(); - let job_transition = transition.clone(); - jobs.add_job(job_transition.map(|_| ())); + jobs.add_job(transition.map(|_| ())); let mut old = None; self.0.persistent_container.state.send_modify(|s| { @@ -73,9 +68,9 @@ impl Handler for ServiceActor { if let Some(t) = old { t.abort().await; } - match transition.await { - None => Err(Error::new(eyre!("Restoring canceled"), ErrorKind::Unknown)), - Some(x) => Ok(x), + match recv_res.await { + Err(_) => Err(Error::new(eyre!("Restoring canceled"), ErrorKind::Unknown)), + Ok(res) => res, } } } diff --git a/core/startos/src/util/io.rs b/core/startos/src/util/io.rs index f0bae7a0a..d9035c774 100644 --- a/core/startos/src/util/io.rs +++ b/core/startos/src/util/io.rs @@ -915,6 +915,16 @@ impl Drop for TmpDir { } } +pub async fn maybe_open_file(path: impl AsRef) -> Result, Error> { + let path = path.as_ref(); + match File::open(path).await { + Ok(a) => Ok(Some(a)), + Err(e) if e.kind() == std::io::ErrorKind::NotFound => Ok(None), + Err(e) => Err(e), + } + .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("open {path:?}"))) +} + pub async fn open_file(path: impl AsRef) -> Result { let path = path.as_ref(); File::open(path) diff --git a/sdk/base/package-lock.json b/sdk/base/package-lock.json index 533fd0db3..e545d6722 100644 --- a/sdk/base/package-lock.json +++ b/sdk/base/package-lock.json @@ -7,15 +7,14 @@ "name": "@start9labs/start-sdk-base", "license": "MIT", "dependencies": { - "@iarna/toml": "^2.2.5", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.4.0", + "@iarna/toml": "^3.0.0", + "@noble/curves": "^1.8.2", + "@noble/hashes": "^1.7.2", "deep-equality-data-structures": "^1.5.0", "isomorphic-fetch": "^3.0.0", - "lodash.merge": "^4.6.2", - "mime-types": "^2.1.35", + "mime-types": "^3.0.1", "ts-matches": "^6.2.1", - "yaml": "^2.2.2" + "yaml": "^2.7.1" }, "devDependencies": { "@types/jest": "^29.4.0", @@ -964,9 +963,9 @@ } }, "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-td6ZUkz2oS3VeleBcN+m//Q6HlCFCPrnI0FZhrt/h4XqLEdOyYp2u21nd8MdsR+WJy5r9PTDaHTDDfhf4H4l6Q==", "license": "ISC" }, "node_modules/@istanbuljs/load-nyc-config": { @@ -1342,12 +1341,12 @@ } }, "node_modules/@noble/curves": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", - "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.2.tgz", + "integrity": "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==", "license": "MIT", "dependencies": { - "@noble/hashes": "1.6.0" + "@noble/hashes": "1.7.2" }, "engines": { "node": "^14.21.3 || >=16" @@ -1356,22 +1355,10 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@noble/curves/node_modules/@noble/hashes": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", - "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@noble/hashes": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", - "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", + "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -3696,12 +3683,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3790,21 +3771,21 @@ } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" @@ -4970,9 +4951,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/sdk/base/package.json b/sdk/base/package.json index 6a050b61b..141738af8 100644 --- a/sdk/base/package.json +++ b/sdk/base/package.json @@ -21,14 +21,13 @@ }, "homepage": "https://github.com/Start9Labs/start-sdk#readme", "dependencies": { - "@iarna/toml": "^2.2.5", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.4.0", + "@iarna/toml": "^3.0.0", + "@noble/curves": "^1.8.2", + "@noble/hashes": "^1.7.2", "isomorphic-fetch": "^3.0.0", - "lodash.merge": "^4.6.2", - "mime-types": "^2.1.35", + "mime-types": "^3.0.1", "ts-matches": "^6.2.1", - "yaml": "^2.2.2", + "yaml": "^2.7.1", "deep-equality-data-structures": "^1.5.0" }, "prettier": { diff --git a/sdk/package/lib/backup/Backups.ts b/sdk/package/lib/backup/Backups.ts index c7c6301f5..ef7ee4cca 100644 --- a/sdk/package/lib/backup/Backups.ts +++ b/sdk/package/lib/backup/Backups.ts @@ -1,6 +1,7 @@ import * as T from "../../../base/lib/types" import * as child_process from "child_process" -import { asError } from "../util" +import * as fs from "fs/promises" +import { asError, StorePath } from "../util" export const DEFAULT_OPTIONS: T.SyncOptions = { delete: true, @@ -91,7 +92,7 @@ export class Backups { return this } - async createBackup() { + async createBackup(effects: T.Effects) { for (const item of this.backupSet) { const rsyncResults = await runRsync({ srcPath: item.dataPath, @@ -105,10 +106,30 @@ export class Backups { }) await rsyncResults.wait() } + await fs.writeFile( + "/media/startos/backup/store.json", + JSON.stringify(await effects.store.get({ path: "" as StorePath })), + { encoding: "utf-8" }, + ) + const dataVersion = await effects.getDataVersion() + if (dataVersion) + await fs.writeFile("/media/startos/backup/dataVersion.txt", dataVersion, { + encoding: "utf-8", + }) return } - async restoreBackup() { + async restoreBackup(effects: T.Effects) { + const store = await fs + .readFile("/media/startos/backup/store.json", { + encoding: "utf-8", + }) + .catch((_) => null) + if (store) + await effects.store.set({ + path: "" as StorePath, + value: JSON.parse(store), + }) for (const item of this.backupSet) { const rsyncResults = await runRsync({ srcPath: item.backupPath, @@ -121,6 +142,12 @@ export class Backups { }, }) await rsyncResults.wait() + const dataVersion = await fs + .readFile("/media/startos/backup/dataVersion.txt", { + encoding: "utf-8", + }) + .catch((_) => null) + if (dataVersion) await effects.setDataVersion({ version: dataVersion }) } return } diff --git a/sdk/package/lib/backup/setupBackups.ts b/sdk/package/lib/backup/setupBackups.ts index 722d245ff..34c7300df 100644 --- a/sdk/package/lib/backup/setupBackups.ts +++ b/sdk/package/lib/backup/setupBackups.ts @@ -26,12 +26,12 @@ export function setupBackups( } = { get createBackup() { return (async (options) => { - return (await backupsFactory(options)).createBackup() + return (await backupsFactory(options)).createBackup(options.effects) }) as T.ExpectedExports.createBackup }, get restoreBackup() { return (async (options) => { - return (await backupsFactory(options)).restoreBackup() + return (await backupsFactory(options)).restoreBackup(options.effects) }) as T.ExpectedExports.restoreBackup }, } diff --git a/sdk/package/lib/util/fileHelper.ts b/sdk/package/lib/util/fileHelper.ts index 5df265223..8f587bfcb 100644 --- a/sdk/package/lib/util/fileHelper.ts +++ b/sdk/package/lib/util/fileHelper.ts @@ -1,6 +1,7 @@ import * as matches from "ts-matches" import * as YAML from "yaml" import * as TOML from "@iarna/toml" +import * as INI from "ini" import * as T from "../../../base/lib/types" import * as fs from "node:fs/promises" import { asError, partialDiff } from "../../../base/lib/util" @@ -285,6 +286,7 @@ export class FileHelper { ) { return new FileHelper(path, toFile, fromFile, validate) } + /** * Create a File Helper for a .json file. */ @@ -296,6 +298,7 @@ export class FileHelper { (data) => shape.unsafeCast(data), ) } + /** * Create a File Helper for a .toml file */ @@ -310,6 +313,7 @@ export class FileHelper { (data) => shape.unsafeCast(data), ) } + /** * Create a File Helper for a .yaml file */ @@ -324,6 +328,41 @@ export class FileHelper { (data) => shape.unsafeCast(data), ) } + + static ini>( + path: string, + shape: matches.Validator, + options?: INI.EncodeOptions & INI.DecodeOptions, + ) { + return new FileHelper( + path, + (inData) => INI.stringify(inData, options), + (inString) => INI.parse(inString, options), + (data) => shape.unsafeCast(data), + ) + } + + static env>( + path: string, + shape: matches.Validator, + ) { + return new FileHelper( + path, + (inData) => + Object.entries(inData) + .map(([k, v]) => `${k}=${v}`) + .join("\n"), + (inString) => + Object.fromEntries( + inString + .split("\n") + .map((line) => line.trim()) + .filter((line) => !line.startsWith("#") && line.includes("=")) + .map((line) => line.split("=", 2)), + ), + (data) => shape.unsafeCast(data), + ) + } } export default FileHelper diff --git a/sdk/package/package-lock.json b/sdk/package/package-lock.json index e00df38ba..8ff103e62 100644 --- a/sdk/package/package-lock.json +++ b/sdk/package/package-lock.json @@ -1,28 +1,28 @@ { "name": "@start9labs/start-sdk", - "version": "0.4.0-beta.2", + "version": "0.4.0-beta.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@start9labs/start-sdk", - "version": "0.4.0-beta.2", + "version": "0.4.0-beta.3", "license": "MIT", "dependencies": { - "@iarna/toml": "^2.2.5", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.4.0", - "deep-equality-data-structures": "^1.5.1", + "@iarna/toml": "^3.0.0", + "@noble/curves": "^1.8.2", + "@noble/hashes": "^1.7.2", + "deep-equality-data-structures": "^2.0.0", + "ini": "^5.0.0", "isomorphic-fetch": "^3.0.0", - "lodash.merge": "^4.6.2", - "mime-types": "^2.1.35", + "mime-types": "^3.0.1", "ts-matches": "^6.2.1", - "yaml": "^2.2.2" + "yaml": "^2.7.1" }, "devDependencies": { "@iarna/toml": "^2.2.5", + "@types/ini": "^4.1.1", "@types/jest": "^29.4.0", - "@types/lodash.merge": "^4.6.2", "copyfiles": "^2.4.1", "jest": "^29.4.3", "peggy": "^3.0.2", @@ -1366,12 +1366,12 @@ } }, "node_modules/@noble/curves": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", - "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.2.tgz", + "integrity": "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==", "license": "MIT", "dependencies": { - "@noble/hashes": "1.6.0" + "@noble/hashes": "1.7.2" }, "engines": { "node": "^14.21.3 || >=16" @@ -1380,22 +1380,10 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@noble/curves/node_modules/@noble/hashes": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", - "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@noble/hashes": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", - "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", + "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -1607,6 +1595,13 @@ "@types/node": "*" } }, + "node_modules/@types/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@types/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-MIyNUZipBTbyUNnhvuXJTY7B6qNI78meck9Jbv3wk0OgNwRyOOVEKDutAkOs1snB/tx0FafyR6/SN4Ps0hZPeg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -1645,23 +1640,6 @@ "pretty-format": "^29.0.0" } }, - "node_modules/@types/lodash": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz", - "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/lodash.merge": { - "version": "4.6.9", - "resolved": "https://registry.npmjs.org/@types/lodash.merge/-/lodash.merge-4.6.9.tgz", - "integrity": "sha512-23sHDPmzd59kUgWyKGiOMO2Qb9YtqRO/x4IhkgNUiPQ1+5MUVqi6bCZeq9nBJ17msjIMbEIO5u+XW4Kz6aGUhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/lodash": "*" - } - }, "node_modules/@types/node": { "version": "22.10.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz", @@ -2289,9 +2267,9 @@ } }, "node_modules/deep-equality-data-structures": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/deep-equality-data-structures/-/deep-equality-data-structures-1.5.1.tgz", - "integrity": "sha512-P7zsL2/AbZIGHDxbo/LLEhCp11AttRp8GvzXOXudqMT/qiGCLo/pyI4lAZvjUZyQnlIbPna3fv8DMsuRvLt4ww==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deep-equality-data-structures/-/deep-equality-data-structures-2.0.0.tgz", + "integrity": "sha512-qgrUr7MKXq7VRN+WUpQ48QlXVGL0KdibAoTX8KRg18lgOgqbEKMAW1WZsVCtakY4+XX42pbAJzTz/DlXEFM2Fg==", "license": "MIT", "dependencies": { "object-hash": "^3.0.0" @@ -2847,6 +2825,15 @@ "dev": true, "license": "ISC" }, + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3794,12 +3781,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3888,21 +3869,21 @@ } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" @@ -5181,9 +5162,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/sdk/package/package.json b/sdk/package/package.json index 677a0b74c..4a8b5b461 100644 --- a/sdk/package/package.json +++ b/sdk/package/package.json @@ -1,6 +1,6 @@ { "name": "@start9labs/start-sdk", - "version": "0.4.0-beta.2", + "version": "0.4.0-beta.3", "description": "Software development kit to facilitate packaging services for StartOS", "main": "./package/lib/index.js", "types": "./package/lib/index.d.ts", @@ -32,14 +32,14 @@ "homepage": "https://github.com/Start9Labs/start-sdk#readme", "dependencies": { "isomorphic-fetch": "^3.0.0", - "lodash.merge": "^4.6.2", - "mime-types": "^2.1.35", + "mime-types": "^3.0.1", "ts-matches": "^6.2.1", - "yaml": "^2.2.2", - "deep-equality-data-structures": "^1.5.1", - "@iarna/toml": "^2.2.5", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.4.0" + "yaml": "^2.7.1", + "deep-equality-data-structures": "^2.0.0", + "ini": "^5.0.0", + "@iarna/toml": "^3.0.0", + "@noble/curves": "^1.8.2", + "@noble/hashes": "^1.7.2" }, "prettier": { "trailingComma": "all", @@ -50,7 +50,7 @@ "devDependencies": { "@iarna/toml": "^2.2.5", "@types/jest": "^29.4.0", - "@types/lodash.merge": "^4.6.2", + "@types/ini": "^4.1.1", "copyfiles": "^2.4.1", "jest": "^29.4.3", "peggy": "^3.0.2",