All files / lib/schemas results.js

60% Statements 3/5
0% Branches 0/2
0% Functions 0/2
75% Lines 3/4

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91              11x                                                                                 11x                                           11x                                        
import { type } from 'arktype';
 
// Can't use $lib/ in $lib/schemas files, they're susceptible
// to be imported by non-Vite-managed pre-build scripts (e.g. JSON Schema generation)
import { mapValues } from '../utils.js';
import { MetadataRuntimeValue } from './metadata.js';
 
export const MetadataRecord = type({
	'[string]': {
		value: [
			type.or(
				'null',
				MetadataRuntimeValue.boolean,
				MetadataRuntimeValue.integer,
				MetadataRuntimeValue.float,
				MetadataRuntimeValue.string,
				// MetadataRuntimeValue.date
				// Date is not compatible with JSON Schemas, use a datestring instead
				'string.date.iso',
				MetadataRuntimeValue.location,
				MetadataRuntimeValue.boundingbox
			),
			'@',
			'Valeur de la métadonnée'
		],
		'valueLabel?': [
			'string',
			'@',
			"Label de la valeur de la métadonnée. Existe pour les métadonnées de type enum, contient dans ce cas le label associé à la clé de l'option de l'enum choisie"
		],
		confidence: ['number', '@', 'Confiance dans la valeur de la métadonnée, entre 0 et 1'],
		manuallyModified: [
			'boolean',
			'@',
			'La valeur de la métadonnée a été modifiée manuellement'
		],
		alternatives: type({
			'[string]': [
				'number',
				'@',
				'Confiance dans cette valeur alternative de la métadonnée, entre 0 et 1.'
			]
		}).describe(
			"Autres valeurs possibles. Les clés de l'objet sont les autres valeurs possibles pour cette métadonnée (converties en texte via JSON), les valeurs de l'objet sont les confiances associées à ces alternatives."
		)
	}
});
 
export const AnalyzedImage = type({
	id: ['string', '@', "ID de l'image"],
	fileId: ['string | null', '@', "ID du fichier source de l'image"],
	filename: ['string', '@', 'Nom du fichier utilisé pour cette image'],
	contentType: [
		'string',
		'@',
		"Type de contenu de l'image, au format MIME (exemple: image/jpeg)"
	],
	sequence: [
		'number > 0',
		'@',
		"Numéro de séquence de l'image dans l'archive .zip. Unique à l'entièreté de l'export"
	],
	numberInObservation: ['number > 0', '@', "Numéro de l'image dans l'observation"],
	metadata: MetadataRecord,
	exportedAs: type({
		original: ['string', '@', "Chemin vers l'image originale"],
		cropped: ['string', '@', "Chemin vers l'image recadrée"]
	}).describe("Chemins dans l'archive .zip vers l'image exportée")
});
 
export const AnalyzedObservation = type({
	number: ['number > 0', '@', "Numéro de l'observation dans l'export"],
	label: ['string', '@', "Label de l'observation"],
	images: AnalyzedImage.array(),
	metadata: MetadataRecord,
	protocolMetadata: MetadataRecord.describe(
		"Métadonnées définies par le protocole. Les clés de l'objet sont les identifiants des métadonnées, sans le préfixe qui identifie leur protocole de provenance"
	)
});
 
/**
 * @param {Record<string, Omit<import('$lib/database.js').MetadataValue, 'value'> & { value: null | import('$lib/metadata.js').RuntimeValue }>} values
 * @returns {typeof MetadataRecord.infer}
 */
export function toMetadataRecord(values) {
	return mapValues(values, ({ value, ...rest }) => ({
		value: value instanceof Date ? value.toISOString() : value,
		...rest
	}));
}