From 504f1a8e97585b8275133ec12446548320e8dbee Mon Sep 17 00:00:00 2001 From: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com> Date: Mon, 25 Nov 2024 11:49:11 -0700 Subject: [PATCH] sdk tweaks (#2791) * sdk tweaks * switch back to deeppartial --- core/startos/src/s9pk/v2/pack.rs | 13 +++++- core/startos/src/util/mod.rs | 10 +++-- .../lib/actions/input/builder/inputSpec.ts | 9 ++-- sdk/base/lib/actions/input/builder/value.ts | 45 +++++++++---------- .../lib/actions/input/builder/variants.ts | 21 --------- .../lib/dependencies/setupDependencies.ts | 40 ++++++++++++++--- sdk/base/lib/osBindings/ImageSource.ts | 4 +- sdk/base/lib/types.ts | 13 ++++-- sdk/base/lib/types/ManifestTypes.ts | 17 +++++-- sdk/base/package-lock.json | 8 ++-- sdk/base/package.json | 2 +- sdk/package/lib/StartSdk.ts | 1 + sdk/package/lib/manifest/setupManifest.ts | 4 +- sdk/package/lib/test/inputSpecBuilder.test.ts | 38 ++++++++-------- sdk/package/lib/test/output.sdk.ts | 12 ++++- sdk/package/lib/test/output.test.ts | 2 +- sdk/package/package-lock.json | 12 ++--- sdk/package/package.json | 4 +- 18 files changed, 149 insertions(+), 106 deletions(-) diff --git a/core/startos/src/s9pk/v2/pack.rs b/core/startos/src/s9pk/v2/pack.rs index 67be558f1..be81d9e78 100644 --- a/core/startos/src/s9pk/v2/pack.rs +++ b/core/startos/src/s9pk/v2/pack.rs @@ -354,7 +354,9 @@ pub enum ImageSource { Packed, #[serde(rename_all = "camelCase")] DockerBuild { + #[ts(optional)] workdir: Option, + #[ts(optional)] dockerfile: Option, #[serde(skip_serializing_if = "Option::is_none")] #[ts(optional)] @@ -366,8 +368,15 @@ impl ImageSource { pub fn ingredients(&self) -> Vec { match self { Self::Packed => Vec::new(), - Self::DockerBuild { dockerfile, .. } => { - vec![dockerfile.clone().unwrap_or_else(|| "Dockerfile".into())] + Self::DockerBuild { + dockerfile, + workdir, + .. + } => { + vec![workdir + .as_deref() + .unwrap_or(Path::new(".")) + .join(dockerfile.as_deref().unwrap_or(Path::new("Dockerfile")))] } Self::DockerTag(_) => Vec::new(), } diff --git a/core/startos/src/util/mod.rs b/core/startos/src/util/mod.rs index 0f3563018..d6f426135 100644 --- a/core/startos/src/util/mod.rs +++ b/core/startos/src/util/mod.rs @@ -122,7 +122,8 @@ impl<'a> std::ops::DerefMut for ExtendedCommand<'a> { } impl<'a> Invoke<'a> for tokio::process::Command { - type Extended<'ext> = ExtendedCommand<'ext> + type Extended<'ext> + = ExtendedCommand<'ext> where Self: 'ext, 'ext: 'a; @@ -162,7 +163,8 @@ impl<'a> Invoke<'a> for tokio::process::Command { } impl<'a> Invoke<'a> for ExtendedCommand<'a> { - type Extended<'ext> = &'ext mut ExtendedCommand<'ext> + type Extended<'ext> + = &'ext mut ExtendedCommand<'ext> where Self: 'ext, 'ext: 'a; @@ -663,8 +665,8 @@ impl FromStr for PathOrUrl { type Err = ::Err; fn from_str(s: &str) -> Result { if let Ok(url) = s.parse::() { - if url.scheme() == "file" { - Ok(Self::Path(url.path().parse()?)) + if let Some(path) = s.strip_prefix("file://") { + Ok(Self::Path(path.parse()?)) } else { Ok(Self::Url(url)) } diff --git a/sdk/base/lib/actions/input/builder/inputSpec.ts b/sdk/base/lib/actions/input/builder/inputSpec.ts index 611ad8a48..31e06df4f 100644 --- a/sdk/base/lib/actions/input/builder/inputSpec.ts +++ b/sdk/base/lib/actions/input/builder/inputSpec.ts @@ -1,8 +1,9 @@ import { ValueSpec } from "../inputSpecTypes" -import { PartialValue, Value } from "./value" +import { Value } from "./value" import { _ } from "../../../util" import { Effects } from "../../../Effects" import { Parser, object } from "ts-matches" +import { DeepPartial } from "../../../types" export type LazyBuildOptions = { effects: Effects @@ -22,8 +23,8 @@ export type ExtractPartialInputSpecType< | InputSpec, any> | InputSpec, never>, > = A extends InputSpec | InputSpec - ? PartialValue - : PartialValue + ? DeepPartial + : DeepPartial export type InputSpecOf, Store = never> = { [K in keyof A]: Value @@ -94,7 +95,7 @@ export class InputSpec, Store = never> { public validator: Parser, ) {} _TYPE: Type = null as any as Type - _PARTIAL: PartialValue = null as any as PartialValue + _PARTIAL: DeepPartial = null as any as DeepPartial async build(options: LazyBuildOptions) { const answer = {} as { [K in keyof Type]: ValueSpec diff --git a/sdk/base/lib/actions/input/builder/value.ts b/sdk/base/lib/actions/input/builder/value.ts index 053bd0596..676c4aac1 100644 --- a/sdk/base/lib/actions/input/builder/value.ts +++ b/sdk/base/lib/actions/input/builder/value.ts @@ -1,6 +1,6 @@ import { InputSpec, LazyBuild } from "./inputSpec" import { List } from "./list" -import { PartialUnionRes, UnionRes, Variants } from "./variants" +import { Variants } from "./variants" import { FilePath, Pattern, @@ -30,7 +30,7 @@ import { DeepPartial } from "../../../types" type AsRequired = Required extends true ? T - : T | null | undefined + : T | null const testForAsRequiredParser = once( () => object({ required: literal(true) }).test, @@ -38,21 +38,12 @@ const testForAsRequiredParser = once( function asRequiredParser< Type, Input, - Return extends - | Parser - | Parser, + Return extends Parser | Parser, >(parser: Parser, input: Input): Return { if (testForAsRequiredParser()(input)) return parser as any - return parser.optional() as any + return parser.nullable() as any } -export type PartialValue = - T extends UnionRes - ? PartialUnionRes - : T extends {} - ? { [P in keyof T]?: PartialValue } - : T - export class Value { protected constructor( public build: LazyBuild, @@ -196,7 +187,7 @@ export class Value { } >, ) { - return new Value(async (options) => { + return new Value(async (options) => { const a = await getA(options) return { type: "text" as const, @@ -213,7 +204,7 @@ export class Value { generate: a.generate ?? null, ...a, } - }, string.optional()) + }, string.nullable()) } static textarea(a: { name: string @@ -265,7 +256,7 @@ export class Value { } >, ) { - return new Value(async (options) => { + return new Value(async (options) => { const a = await getA(options) return { description: null, @@ -278,7 +269,7 @@ export class Value { immutable: false, ...a, } - }, string.optional()) + }, string.nullable()) } static number(a: { name: string @@ -351,7 +342,7 @@ export class Value { } >, ) { - return new Value(async (options) => { + return new Value(async (options) => { const a = await getA(options) return { type: "number" as const, @@ -366,7 +357,7 @@ export class Value { immutable: false, ...a, } - }, number.optional()) + }, number.nullable()) } static color(a: { name: string @@ -413,7 +404,7 @@ export class Value { } >, ) { - return new Value(async (options) => { + return new Value(async (options) => { const a = await getA(options) return { type: "color" as const, @@ -423,7 +414,7 @@ export class Value { immutable: false, ...a, } - }, string.optional()) + }, string.nullable()) } static datetime(a: { name: string @@ -483,7 +474,7 @@ export class Value { } >, ) { - return new Value(async (options) => { + return new Value(async (options) => { const a = await getA(options) return { type: "datetime" as const, @@ -496,7 +487,7 @@ export class Value { immutable: false, ...a, } - }, string.optional()) + }, string.nullable()) } static select>(a: { name: string @@ -690,14 +681,14 @@ export class Value { // } // >, // ) { - // return new Value( + // return new Value( // async (options) => ({ // type: "file" as const, // description: null, // warning: null, // ...(await a(options)), // }), - // object({ filePath: string }).optional(), + // object({ filePath: string }).nullable(), // ) // } static union< @@ -822,6 +813,10 @@ export class Value { }, parser) } + map(fn: (value: Type) => U): Value { + return new Value(this.build, this.validator.map(fn)) + } + /** * Use this during the times that the input needs a more specific type. * Used in types that the value/ variant/ list/ inputSpec is constructed somewhere else. diff --git a/sdk/base/lib/actions/input/builder/variants.ts b/sdk/base/lib/actions/input/builder/variants.ts index 05124f45a..93453d73c 100644 --- a/sdk/base/lib/actions/input/builder/variants.ts +++ b/sdk/base/lib/actions/input/builder/variants.ts @@ -29,27 +29,6 @@ export type UnionRes< } }[K] -export type PartialUnionRes< - Store, - VariantValues extends { - [K in string]: { - name: string - spec: InputSpec | InputSpec - } - }, - K extends keyof VariantValues & string = keyof VariantValues & string, -> = { - [key in keyof VariantValues]: { - selection?: key - value?: ExtractPartialInputSpecType - other?: { - [key2 in Exclude]?: DeepPartial< - ExtractInputSpecType - > - } - } -}[K] - /** * Used in the the Value.select { @link './value.ts' } * to indicate the type of select variants that are available. The key for the record passed in will be the diff --git a/sdk/base/lib/dependencies/setupDependencies.ts b/sdk/base/lib/dependencies/setupDependencies.ts index f694c042c..6b15ef0d1 100644 --- a/sdk/base/lib/dependencies/setupDependencies.ts +++ b/sdk/base/lib/dependencies/setupDependencies.ts @@ -1,12 +1,42 @@ import * as T from "../types" import { once } from "../util" -type DependencyType = { - [K in keyof Manifest["dependencies"]]: Omit -} +export type RequiredDependenciesOf = { + [K in keyof Manifest["dependencies"]]: Manifest["dependencies"][K]["optional"] extends false + ? K + : never +}[keyof Manifest["dependencies"]] +export type OptionalDependenciesOf = Exclude< + keyof Manifest["dependencies"], + RequiredDependenciesOf +> + +type DependencyRequirement = + | { + kind: "running" + healthChecks: Array + versionRange: string + } + | { + kind: "exists" + versionRange: string + } +type Matches = T extends U ? (U extends T ? null : never) : never +const _checkType: Matches< + DependencyRequirement & { id: T.PackageId }, + T.DependencyRequirement +> = null + +export type CurrentDependenciesResult = { + [K in RequiredDependenciesOf]: DependencyRequirement +} & { + [K in OptionalDependenciesOf]?: DependencyRequirement +} & Record export function setupDependencies( - fn: (options: { effects: T.Effects }) => Promise>, + fn: (options: { + effects: T.Effects + }) => Promise>, ): (options: { effects: T.Effects }) => Promise { const cell = { updater: async (_: { effects: T.Effects }) => null } cell.updater = async (options: { effects: T.Effects }) => { @@ -21,7 +51,7 @@ export function setupDependencies( dependencies: Object.entries(dependencyType).map( ([id, { versionRange, ...x }, ,]) => ({ - id, + // id, ...x, versionRange: versionRange.toString(), }) as T.DependencyRequirement, diff --git a/sdk/base/lib/osBindings/ImageSource.ts b/sdk/base/lib/osBindings/ImageSource.ts index 58d2c2a79..d8f876aef 100644 --- a/sdk/base/lib/osBindings/ImageSource.ts +++ b/sdk/base/lib/osBindings/ImageSource.ts @@ -5,8 +5,8 @@ export type ImageSource = | "packed" | { dockerBuild: { - workdir: string | null - dockerfile: string | null + workdir?: string + dockerfile?: string buildArgs?: { [key: string]: BuildArg } } } diff --git a/sdk/base/lib/types.ts b/sdk/base/lib/types.ts index ab1acaa87..36d4bd293 100644 --- a/sdk/base/lib/types.ts +++ b/sdk/base/lib/types.ts @@ -13,6 +13,11 @@ import { Effects } from "./Effects" export { Effects } export * from "./osBindings" export { SDKManifest } from "./types/ManifestTypes" +export { + RequiredDependenciesOf as RequiredDependencies, + OptionalDependenciesOf as OptionalDependencies, + CurrentDependenciesResult, +} from "./dependencies/setupDependencies" export type ExposedStorePaths = string[] & Affine<"ExposedStorePaths"> declare const HealthProof: unique symbol @@ -224,6 +229,8 @@ export type KnownError = export type Dependencies = Array -export type DeepPartial = T extends {} - ? { [P in keyof T]?: DeepPartial } - : T +export type DeepPartial = T extends unknown[] + ? T + : T extends {} + ? { [P in keyof T]?: DeepPartial } + : T diff --git a/sdk/base/lib/types/ManifestTypes.ts b/sdk/base/lib/types/ManifestTypes.ts index 86ecf9140..17defebcd 100644 --- a/sdk/base/lib/types/ManifestTypes.ts +++ b/sdk/base/lib/types/ManifestTypes.ts @@ -150,10 +150,19 @@ export type SDKManifest = { } } -export type SDKImageInputSpec = { - source: Exclude - arch?: string[] - emulateMissingAs?: string | null +// this is hacky but idk a more elegant way +type ArchOptions = { + 0: ["x86_64", "aarch64"] + 1: ["aarch64", "x86_64"] + 2: ["x86_64"] + 3: ["aarch64"] } +export type SDKImageInputSpec = { + [A in keyof ArchOptions]: { + source: Exclude + arch?: ArchOptions[A] + emulateMissingAs?: ArchOptions[A][number] | null + } +}[keyof ArchOptions] export type ManifestDependency = T.Manifest["dependencies"][string] diff --git a/sdk/base/package-lock.json b/sdk/base/package-lock.json index 4c8f58364..d7b491303 100644 --- a/sdk/base/package-lock.json +++ b/sdk/base/package-lock.json @@ -14,7 +14,7 @@ "isomorphic-fetch": "^3.0.0", "lodash.merge": "^4.6.2", "mime-types": "^2.1.35", - "ts-matches": "^6.0.0", + "ts-matches": "^6.1.0", "yaml": "^2.2.2" }, "devDependencies": { @@ -3897,9 +3897,9 @@ "dev": true }, "node_modules/ts-matches": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-6.0.0.tgz", - "integrity": "sha512-vR4hhz9bYMW30qIJUuLaeAWlsR54vse6ZI2riVhVLMBE6/vss43jwrOvbHheiyU7e26ssT/yWx69aJHD2REJSA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-6.1.0.tgz", + "integrity": "sha512-01qvbIpOiKdbzzXDH84JeHunvCwBGFdZw94jS6kOGLSN5ms+1nBZtfe8WSuYMIPb1xPA+qyAiVgznFi2VCQ6UQ==", "license": "MIT" }, "node_modules/ts-morph": { diff --git a/sdk/base/package.json b/sdk/base/package.json index 509e621de..4cc2fc7ca 100644 --- a/sdk/base/package.json +++ b/sdk/base/package.json @@ -27,7 +27,7 @@ "isomorphic-fetch": "^3.0.0", "lodash.merge": "^4.6.2", "mime-types": "^2.1.35", - "ts-matches": "^6.0.0", + "ts-matches": "^6.1.0", "yaml": "^2.2.2" }, "prettier": { diff --git a/sdk/package/lib/StartSdk.ts b/sdk/package/lib/StartSdk.ts index 28a14e1e5..634af249d 100644 --- a/sdk/package/lib/StartSdk.ts +++ b/sdk/package/lib/StartSdk.ts @@ -135,6 +135,7 @@ export class StartSdk { } return { + manifest: this.manifest, ...startSdkEffectWrapper, action: { run: actions.runAction, diff --git a/sdk/package/lib/manifest/setupManifest.ts b/sdk/package/lib/manifest/setupManifest.ts index c529f1ab7..5dfdb2451 100644 --- a/sdk/package/lib/manifest/setupManifest.ts +++ b/sdk/package/lib/manifest/setupManifest.ts @@ -59,7 +59,9 @@ export function buildManifest< (images, [k, v]) => { v.arch = v.arch || ["aarch64", "x86_64"] if (v.emulateMissingAs === undefined) - v.emulateMissingAs = v.arch[0] || null + v.emulateMissingAs = (v.arch as string[]).includes("aarch64") + ? "aarch64" + : v.arch[0] || null images[k] = v as ImageConfig return images }, diff --git a/sdk/package/lib/test/inputSpecBuilder.test.ts b/sdk/package/lib/test/inputSpecBuilder.test.ts index 195acb40a..27869067d 100644 --- a/sdk/package/lib/test/inputSpecBuilder.test.ts +++ b/sdk/package/lib/test/inputSpecBuilder.test.ts @@ -87,7 +87,7 @@ describe("values", () => { const rawIs = await value.build({} as any) validator.unsafeCast("test text") validator.unsafeCast(null) - testOutput()(null) + testOutput()(null) }) test("color", async () => { const value = Value.color({ @@ -99,7 +99,7 @@ describe("values", () => { }) const validator = value.validator validator.unsafeCast("#000000") - testOutput()(null) + testOutput()(null) }) test("datetime", async () => { const value = Value.datetime({ @@ -129,7 +129,7 @@ describe("values", () => { }) const validator = value.validator validator.unsafeCast("2021-01-01") - testOutput()(null) + testOutput()(null) }) test("textarea", async () => { const value = Value.textarea({ @@ -144,7 +144,7 @@ describe("values", () => { }) const validator = value.validator validator.unsafeCast("test text") - testOutput()(null) + testOutput()(null) }) test("number", async () => { const value = Value.number({ @@ -180,7 +180,7 @@ describe("values", () => { }) const validator = value.validator validator.unsafeCast(2) - testOutput()(null) + testOutput()(null) }) test("select", async () => { const value = Value.select({ @@ -319,33 +319,33 @@ describe("values", () => { test("text", async () => { const value = Value.dynamicText(async () => ({ name: "Testing", - required: true, + required: false, default: null, })) const validator = value.validator const rawIs = await value.build({} as any) validator.unsafeCast("test text") validator.unsafeCast(null) - testOutput()(null) + testOutput()(null) expect(await value.build(fakeOptions)).toMatchObject({ name: "Testing", - required: true, + required: false, default: null, }) }) test("text with default", async () => { const value = Value.dynamicText(async () => ({ name: "Testing", - required: true, + required: false, default: "this is a default value", })) const validator = value.validator validator.unsafeCast("test text") validator.unsafeCast(null) - testOutput()(null) + testOutput()(null) expect(await value.build(fakeOptions)).toMatchObject({ name: "Testing", - required: true, + required: false, default: "this is a default value", }) }) @@ -359,7 +359,7 @@ describe("values", () => { const rawIs = await value.build({} as any) validator.unsafeCast("test text") validator.unsafeCast(null) - testOutput()(null) + testOutput()(null) expect(await value.build(fakeOptions)).toMatchObject({ name: "Testing", required: false, @@ -377,7 +377,7 @@ describe("values", () => { const validator = value.validator validator.unsafeCast("#000000") validator.unsafeCast(null) - testOutput()(null) + testOutput()(null) expect(await value.build(fakeOptions)).toMatchObject({ name: "Testing", required: false, @@ -445,7 +445,7 @@ describe("values", () => { const validator = value.validator validator.unsafeCast("2021-01-01") validator.unsafeCast(null) - testOutput()(null) + testOutput()(null) expect(await value.build(fakeOptions)).toMatchObject({ name: "Testing", required: true, @@ -468,7 +468,7 @@ describe("values", () => { })) const validator = value.validator validator.unsafeCast("test text") - testOutput()(null) + testOutput()(null) expect(await value.build(fakeOptions)).toMatchObject({ name: "Testing", required: false, @@ -492,7 +492,7 @@ describe("values", () => { validator.unsafeCast(2) validator.unsafeCast(null) expect(() => validator.unsafeCast("null")).toThrowError() - testOutput()(null) + testOutput()(null) expect(await value.build(fakeOptions)).toMatchObject({ name: "Testing", required: true, @@ -795,7 +795,7 @@ describe("Nested nullable values", () => { validator.unsafeCast({ a: null }) validator.unsafeCast({ a: "test" }) expect(() => validator.unsafeCast({ a: 4 })).toThrowError() - testOutput()(null) + testOutput()(null) }) test("Testing number", async () => { const value = InputSpec.of({ @@ -818,7 +818,7 @@ describe("Nested nullable values", () => { validator.unsafeCast({ a: null }) validator.unsafeCast({ a: 5 }) expect(() => validator.unsafeCast({ a: "4" })).toThrowError() - testOutput()(null) + testOutput()(null) }) test("Testing color", async () => { const value = InputSpec.of({ @@ -835,7 +835,7 @@ describe("Nested nullable values", () => { validator.unsafeCast({ a: null }) validator.unsafeCast({ a: "5" }) expect(() => validator.unsafeCast({ a: 4 })).toThrowError() - testOutput()(null) + testOutput()(null) }) test("Testing select", async () => { const value = InputSpec.of({ diff --git a/sdk/package/lib/test/output.sdk.ts b/sdk/package/lib/test/output.sdk.ts index d87446585..3f3bb5411 100644 --- a/sdk/package/lib/test/output.sdk.ts +++ b/sdk/package/lib/test/output.sdk.ts @@ -1,6 +1,6 @@ +import { CurrentDependenciesResult } from "../../../base/lib/dependencies/setupDependencies" import { StartSdk } from "../StartSdk" import { setupManifest } from "../manifest/setupManifest" -import { VersionInfo } from "../version/VersionInfo" import { VersionGraph } from "../version/VersionGraph" export type Manifest = any @@ -21,7 +21,15 @@ export const sdk = StartSdk.of() long: "", }, containers: {}, - images: {}, + images: { + main: { + source: { + dockerTag: "start9/hello-world", + }, + arch: ["aarch64", "x86_64"], + emulateMissingAs: "aarch64", + }, + }, volumes: [], assets: [], alerts: { diff --git a/sdk/package/lib/test/output.test.ts b/sdk/package/lib/test/output.test.ts index 53d006274..a2e9c35d5 100644 --- a/sdk/package/lib/test/output.test.ts +++ b/sdk/package/lib/test/output.test.ts @@ -22,7 +22,7 @@ testOutput< testOutput()(null) testOutput< InputSpecSpec["advanced"]["peers"]["addnode"][0]["hostname"], - string | null | undefined + string | null >()(null) testOutput< InputSpecSpec["testListUnion"][0]["union"]["value"]["name"], diff --git a/sdk/package/package-lock.json b/sdk/package/package-lock.json index 0b06e79db..1f5715258 100644 --- a/sdk/package/package-lock.json +++ b/sdk/package/package-lock.json @@ -1,12 +1,12 @@ { "name": "@start9labs/start-sdk", - "version": "0.3.6-alpha.16", + "version": "0.3.6-alpha.21", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@start9labs/start-sdk", - "version": "0.3.6-alpha.16", + "version": "0.3.6-alpha.21", "license": "MIT", "dependencies": { "@iarna/toml": "^2.2.5", @@ -15,7 +15,7 @@ "isomorphic-fetch": "^3.0.0", "lodash.merge": "^4.6.2", "mime-types": "^2.1.35", - "ts-matches": "^6.0.0", + "ts-matches": "^6.1.0", "yaml": "^2.2.2" }, "devDependencies": { @@ -3918,9 +3918,9 @@ "dev": true }, "node_modules/ts-matches": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-6.0.0.tgz", - "integrity": "sha512-vR4hhz9bYMW30qIJUuLaeAWlsR54vse6ZI2riVhVLMBE6/vss43jwrOvbHheiyU7e26ssT/yWx69aJHD2REJSA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-6.1.0.tgz", + "integrity": "sha512-01qvbIpOiKdbzzXDH84JeHunvCwBGFdZw94jS6kOGLSN5ms+1nBZtfe8WSuYMIPb1xPA+qyAiVgznFi2VCQ6UQ==", "license": "MIT" }, "node_modules/ts-morph": { diff --git a/sdk/package/package.json b/sdk/package/package.json index bbcab9830..2bf4b71f5 100644 --- a/sdk/package/package.json +++ b/sdk/package/package.json @@ -1,6 +1,6 @@ { "name": "@start9labs/start-sdk", - "version": "0.3.6-alpha.17", + "version": "0.3.6-alpha.21", "description": "Software development kit to facilitate packaging services for StartOS", "main": "./package/lib/index.js", "types": "./package/lib/index.d.ts", @@ -33,7 +33,7 @@ "isomorphic-fetch": "^3.0.0", "lodash.merge": "^4.6.2", "mime-types": "^2.1.35", - "ts-matches": "^6.0.0", + "ts-matches": "^6.1.0", "yaml": "^2.2.2", "@iarna/toml": "^2.2.5", "@noble/curves": "^1.4.0",