Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 1 addition & 7 deletions src/cloud-hypervisor/artifact-manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
type CloudHypervisorArtifactDigests,
} from '../types/runtime-options';
import { version as AWF_VERSION } from '../../package.json';
import { requireObject } from '../json-validation';

const VIRTIOFSD_RELEASE_VERSION = '1.13.3';
export const CLOUD_HYPERVISOR_ARTIFACT_RELEASE_TAG = `v${AWF_VERSION}`;
Expand Down Expand Up @@ -37,13 +38,6 @@ export interface CloudHypervisorArtifactManifest {
}>;
}

function requireObject(value: unknown, label: string): Record<string, unknown> {
if (!value || typeof value !== 'object' || Array.isArray(value)) {
throw new Error(`${label} must be a JSON object`);
}
return value as Record<string, unknown>;
}

function requireString(value: unknown, label: string): string {
if (typeof value !== 'string' || value.length === 0) {
throw new Error(`${label} must be a non-empty string`);
Expand Down
8 changes: 1 addition & 7 deletions src/cloud-hypervisor/enclave-artifact-manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
CLOUD_HYPERVISOR_ARTIFACT_REPOSITORY,
CLOUD_HYPERVISOR_ARTIFACT_SIGNER_WORKFLOW,
} from './artifact-manifest';
import { requireObject } from '../json-validation';

export type CloudHypervisorEnclaveRole = 'script' | 'agent';
export const CLOUD_HYPERVISOR_ENCLAVE_KERNEL_VERSION = '6.1.141';
Expand Down Expand Up @@ -59,13 +60,6 @@ export interface CloudHypervisorEnclaveArtifactManifest {
>>;
}

function requireObject(value: unknown, label: string): Record<string, unknown> {
if (!value || typeof value !== 'object' || Array.isArray(value)) {
throw new Error(`${label} must be a JSON object`);
}
return value as Record<string, unknown>;
}

function requireClosedKeys(
value: Record<string, unknown>,
expected: readonly string[],
Expand Down
18 changes: 18 additions & 0 deletions src/json-validation.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { requireObject } from './json-validation';

describe('requireObject', () => {
it('returns plain JSON objects', () => {
const value = { key: 'value' };

expect(requireObject(value, 'value')).toBe(value);
});

it.each([null, undefined, false, 0, '', [], ['value']])(
Comment thread
Copilot marked this conversation as resolved.
Outdated
'rejects non-object JSON values: %p',
(value) => {
expect(() => requireObject(value, 'value')).toThrow(
'value must be a JSON object',
);
},
);
});
9 changes: 9 additions & 0 deletions src/json-validation.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export function requireObject(
value: unknown,
label: string,
): Record<string, unknown> {
if (!value || typeof value !== 'object' || Array.isArray(value)) {
throw new Error(`${label} must be a JSON object`);
}
return value as Record<string, unknown>;
}
9 changes: 2 additions & 7 deletions src/nvx/outcome.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { requireObject } from '../json-validation';

export const NVX_OUTCOME_SCHEMA_VERSION = 1;
export const NVX_TEARDOWN_STAGES = [
'control_channels_closed',
Expand Down Expand Up @@ -137,13 +139,6 @@ export function parseNvxOneShotOutcome(contents: string): NvxOneShotOutcome {
};
}

function requireObject(value: unknown, label: string): Record<string, unknown> {
if (!value || typeof value !== 'object' || Array.isArray(value)) {
throw new Error(`${label} must be a JSON object`);
}
return value as Record<string, unknown>;
}

function requireString(value: unknown, label: string): string {
if (typeof value !== 'string' || value.length === 0) {
throw new Error(`${label} must be a non-empty string`);
Expand Down
Loading