Skip to content

satisfactory-dev/ajv-utilities

Repository files navigation

Coverage Status Workflow Status

Installation

npm install --save-dev @satisfactory-dev/ajv-utilities

Usage

compile

import Ajv from 'ajv/dist/2020';
import {compile, FailedToCompileSchema} from '@satisfactory-dev/ajv-utilities';

const schema = {type: 'string'};

try {
	const check = compile(new Ajv(), schema);
} catch (err) {
	if (err instanceof FailedToCompileSchema) {
		console.error('failed to compile', err);
	} else {
		console.error('unknown error', err);
	}
}

esmify

import Ajv from 'ajv/dist/2020';
import standalone from 'ajv/dist/standalone';
import {compile, esmify} from '@satisfactory-dev/ajv-utilities';

const ajv = new Ajv();

await writeFile(
	'./standalone-validator.mjs',
	esmify(standalone(ajv, compile(ajv, schema)))
);

typescriptify

import {writeFile} from 'node:fs/promises';

import {typescriptify} from '@satisfactory-dev/ajv-utilities';

import {
	$defs_schema,
	$ref,
} from '@signpostmarv/json-schema-typescript-codegen';

import {TemplatedString} from '@signpostmarv/json-schema-typescript-codegen/ajv';

import type {SchemaObject} from 'ajv/dist/2020.js';
import Ajv2020 from 'ajv/dist/2020.js';

import standaloneCode from 'ajv/dist/standalone/index.js';

// oxlint-disable-next-line @stylistic/max-len
import ConstString from './schema/lib/PropertySchemaToRegex/ConstString.schema.json' with {type: 'json'};

// oxlint-disable-next-line @stylistic/max-len
import EnumString from './schema/lib/PropertySchemaToRegex/EnumString.schema.json' with {type: 'json'};

// oxlint-disable-next-line @stylistic/max-len
import NamedList from './schema/lib/PropertySchemaToRegex/NamedList.schema.json' with {type: 'json'};

import {
	FlexibleArray_generate_schema_definition__items,
	FlexibleArray_generate_schema_definition__prefixItems,
} from './src/version-specific/0.3.7.7/TypedString/FlexibleArray.ts';

// oxlint-disable-next-line @stylistic/max-len
import PatternString from './schema/lib/PropertySchemaToRegex/PatternString.schema.json' with {type: 'json'};
import {Object_generate_schema_definition} from './src/version-specific/0.3.7.7/TypedString/Object.ts';

import {
	PrefixedString,
	type mode as PrefixedString_mode,
} from './src/version-specific/0.3.7.7/PrefixedString.ts';

const FlexibleArray__items = {
	$id: 'docs.json.ts--lib--PropertySchemaToRegex--FlexibleArray--items',
	...FlexibleArray_generate_schema_definition__items(),
};

const FlexibleArray__prefixItems = {
	// oxlint-disable-next-line @stylistic/max-len
	$id: 'docs.json.ts--lib--PropertySchemaToRegex--FlexibleArray--prefixItems',
	...FlexibleArray_generate_schema_definition__prefixItems(),
};

const TypedString_object_schema = {
	$id: 'docs.json.ts--lib--PropertySchemaToRegex--TypedString--object',
	type: 'object',
	additionalProperties: false,
	required: ['type', 'typed_string'],
	properties: {
		$defs: $defs_schema.properties.$defs,
		type: {
			type: 'string',
			const: 'string',
		},
		typed_string: Object_generate_schema_definition(),
	},
};

const PrefixedString_schemas: {
	[key in PrefixedString_mode]: SchemaObject & {$id: string};
} = {
	non_quoted: {
		// oxlint-disable-next-line @stylistic/max-len
		$id: 'docs.json.ts--lib--PropertySchemaToRegex--PrefixedString--non_quoted',
		...PrefixedString.generate_schema_definition({
			mode: 'non_quoted',
		}),
	},
	quoted: {
		// oxlint-disable-next-line @stylistic/max-len
		$id: 'docs.json.ts--lib--PropertySchemaToRegex--PrefixedString--quoted',
		...PrefixedString.generate_schema_definition({
			mode: 'quoted',
		}),
	},
	single_quoted: {
		// oxlint-disable-next-line @stylistic/max-len
		$id: 'docs.json.ts--lib--PropertySchemaToRegex--PrefixedString--single_quoted',
		...PrefixedString.generate_schema_definition({
			mode: 'single_quoted',
		}),
	},
	version_specific_default: {
		// oxlint-disable-next-line @stylistic/max-len
		$id: 'docs.json.ts--lib--PropertySchemaToRegex--PrefixedString--version_specific_default',
		...PrefixedString.generate_schema_definition({
			mode: 'version_specific_default',
		}),
	},
};

const $ref_schema = {
	$id: 'docs.json.ts--lib--PropertySchemaToRegex--$ref',
	...$ref.generate_type_definition(),
};

const TemplatedString_schema = {
	$id: 'docs.json.ts--lib--PropertySchemaToRegex--TemplatedString',
	...TemplatedString.generate_schema_definition(),
};

const ajv = new Ajv2020({
	verbose: true,
	logger: false,
	allErrors: true,
	code: {
		source: true,
		esm: true,
		lines: true,
		optimize: 2,
	},
	schemas: [
		ConstString,
		EnumString,
		NamedList,
		FlexibleArray__items,
		FlexibleArray__prefixItems,
		PatternString,
		TypedString_object_schema,
		PrefixedString_schemas.non_quoted,
		PrefixedString_schemas.quoted,
		PrefixedString_schemas.single_quoted,
		PrefixedString_schemas.version_specific_default,
		$ref_schema,
		TemplatedString_schema,
	],
});

const code = `// oxlint-disable @stylistic/max-len${'\n'}${typescriptify(
	standaloneCode(ajv, {
		PropertySchemaToRegex_ConstString: ConstString.$id,
		PropertySchemaToRegex_EnumString: EnumString.$id,
		PropertySchemaToRegex_NamedList: NamedList.$id,

		// oxlint-disable-next-line @stylistic/max-len
		PropertySchemaToRegex_FlexibleArray__items: FlexibleArray__items.$id,

		// oxlint-disable-next-line @stylistic/max-len
		PropertySchemaToRegex_FlexibleArray__prefixItems:
			FlexibleArray__prefixItems.$id,
		PropertySchemaToRegex_PatternString: PatternString.$id,

		// oxlint-disable-next-line @stylistic/max-len
		PropertySchemaToRegex_TypedString_object:
			TypedString_object_schema.$id,

		// oxlint-disable-next-line @stylistic/max-len
		PropertySchemaToRegex_PrefixedString_non_quoted:
			PrefixedString_schemas.non_quoted.$id,

		// oxlint-disable-next-line @stylistic/max-len
		PropertySchemaToRegex_PrefixedString_quoted:
			PrefixedString_schemas.quoted.$id,

		// oxlint-disable-next-line @stylistic/max-len
		PropertySchemaToRegex_PrefixedString_single_quoted:
			PrefixedString_schemas.single_quoted.$id,

		// oxlint-disable-next-line @stylistic/max-len
		PropertySchemaToRegex_PrefixedString_version_specific_default:
			PrefixedString_schemas.version_specific_default.$id,

		PropertySchemaToRegex_ref: $ref_schema.$id,
		PropertySchemaToRegex_TemplatedString: TemplatedString_schema.$id,
	}),
	{
		remove_dataCtxKeys: {
			[ConstString.$id]: [
				'parentData',
				'parentDataProperty',
				'rootData',
				'dynamicAnchors',
			],
			[EnumString.$id]: [
				'parentData',
				'parentDataProperty',
				'rootData',
				'dynamicAnchors',
			],
			[NamedList.$id]: [
				'parentData',
				'parentDataProperty',
				'rootData',
				'dynamicAnchors',
			],
			[FlexibleArray__items.$id]: [
				'parentData',
				'parentDataProperty',
				'rootData',
				'dynamicAnchors',
			],
			[FlexibleArray__prefixItems.$id]: [
				'parentData',
				'parentDataProperty',
				'rootData',
				'dynamicAnchors',
			],
			[PatternString.$id]: [
				'parentData',
				'parentDataProperty',
				'rootData',
				'dynamicAnchors',
			],
			[TypedString_object_schema.$id]: [
				'parentData',
				'parentDataProperty',
				'rootData',
				'dynamicAnchors',
			],
			[PrefixedString_schemas.non_quoted.$id]: [
				'parentData',
				'parentDataProperty',
				'rootData',
				'dynamicAnchors',
			],
			[PrefixedString_schemas.quoted.$id]: [
				'parentData',
				'parentDataProperty',
				'rootData',
				'dynamicAnchors',
			],
			[PrefixedString_schemas.single_quoted.$id]: [
				'parentData',
				'parentDataProperty',
				'rootData',
				'dynamicAnchors',
			],
			[PrefixedString_schemas.version_specific_default.$id]: [
				'parentData',
				'parentDataProperty',
				'rootData',
				'dynamicAnchors',
			],
			[$ref_schema.$id]: [
				'parentData',
				'parentDataProperty',
				'rootData',
				'dynamicAnchors',
			],
			[TemplatedString_schema.$id]: ['parentData', 'parentDataProperty'],
		},
		specify_types: {
			[ConstString.$id]: [
				'ConstString',

				// oxlint-disable-next-line @stylistic/max-len
				'../src/version-specific/0.3.7.7/TypedString/PropertySchemaToRegex/ConstString.ts',
			],
			[EnumString.$id]: [
				'EnumString',

				// oxlint-disable-next-line @stylistic/max-len
				'../src/version-specific/0.3.7.7/TypedString/PropertySchemaToRegex/EnumString.ts',
			],
			[NamedList.$id]: [
				'NamedList_type',
				'../src/version-specific/0.3.7.7/NamedList.ts',
			],
			[FlexibleArray__items.$id]: [
				{name: 'FlexibleArray_type', args: ['items']},

				// oxlint-disable-next-line @stylistic/max-len
				'../src/version-specific/0.3.7.7/TypedString/FlexibleArray.ts',
			],
			[FlexibleArray__prefixItems.$id]: [
				{name: 'FlexibleArray_type', args: ['prefixItems']},

				// oxlint-disable-next-line @stylistic/max-len
				'../src/version-specific/0.3.7.7/TypedString/FlexibleArray.ts',
			],
			[PatternString.$id]: [
				'PatternString_type',

				// oxlint-disable-next-line @stylistic/max-len
				'../src/version-specific/0.3.7.7/TypedString/PropertySchemaToRegex/PatternString.ts',
			],
			[TypedString_object_schema.$id]: [
				'TypedString_Object_type',

				// oxlint-disable-next-line @stylistic/max-len
				'../src/version-specific/0.3.7.7/TypedString/PropertySchemaToRegex/Object.ts',
			],
			[PrefixedString_schemas.non_quoted.$id]: [
				{name: 'PrefixedString_type', args: ['non_quoted']},

				// oxlint-disable-next-line @stylistic/max-len
				'../src/version-specific/0.3.7.7/PrefixedString.ts',
			],
			[PrefixedString_schemas.quoted.$id]: [
				{name: 'PrefixedString_type', args: ['quoted']},

				// oxlint-disable-next-line @stylistic/max-len
				'../src/version-specific/0.3.7.7/PrefixedString.ts',
			],
			[PrefixedString_schemas.single_quoted.$id]: [
				{name: 'PrefixedString_type', args: ['single_quoted']},

				// oxlint-disable-next-line @stylistic/max-len
				'../src/version-specific/0.3.7.7/PrefixedString.ts',
			],
			[PrefixedString_schemas.version_specific_default.$id]: [
				{
					name: 'PrefixedString_type',
					args: ['version_specific_default'],
				},

				// oxlint-disable-next-line @stylistic/max-len
				'../src/version-specific/0.3.7.7/PrefixedString.ts',
			],
			[$ref_schema.$id]: [
				'$ref_type',
				'@signpostmarv/json-schema-typescript-codegen',
			],
			[TemplatedString_schema.$id]: [
				'templated_string_type',
				'@signpostmarv/json-schema-typescript-codegen/ajv',
			],
		},
	}
)}`;

await writeFile(`${import.meta.dirname}/generated-types/lib.ts`, code);

About

Ajv Utilities to help with runtime + standalone compiles

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project

  •  

Contributors

Languages