UNPKG

@knowark/validarkjs

Version:
82 lines (70 loc) 2.46 kB
import { sessionDatabase, schemaDatabase } from '../../common/database.js' export const getType = (instance) => { if (instance?.constructor === String) return 'string' if (Number.isInteger(instance)) return 'integer' if (instance?.constructor === Number) return 'number' if (instance?.constructor === Boolean) return 'boolean' if (instance?.constructor === Array) return 'array' if (instance === null) return 'null' return 'object' } export const resolve = (document, pointer) => { let value = document if (!pointer) return value const tokens = pointer.slice(1).split('/') for (let token of tokens) { token = decodeURIComponent( token.replaceAll('~1', '/').replaceAll('~0', '~')) value = value[token] } return value } export const reference = (fragment, baseUri) => { const uri = new URL(fragment, baseUri) const [address, pointer] = uri.href.split('#') const schema = schemaDatabase.get(uri.toString()) if (schema) return schema const document = schemaDatabase.get(address) return resolve(document, pointer) } export const dynamicReference = (fragment) => { let schema const scope = sessionDatabase.get('base').slice().reverse() for (const [index, baseUri] of scope.entries()) { const uri = new URL(fragment, baseUri) if (fragment.startsWith('#/')) return reference(fragment, baseUri) const currentSchema = schemaDatabase.get(uri.toString()) if (currentSchema) { if (fragment.endsWith(currentSchema.$dynamicAnchor)) { schema = currentSchema fragment = uri.hash continue } else if (index === 0 && fragment.endsWith(currentSchema.$anchor)) { schema = currentSchema break } } } return schema } export const evaluateProperty = (property) => { for (const set of sessionDatabase.get('evaluatedProperties')) { set.add(property) } } export const resetProperties = (properties = new Set()) => { sessionDatabase.get('evaluatedProperties').pop() sessionDatabase.get('evaluatedProperties').push(properties) } export const cloneProperties = () => { return new Set(...sessionDatabase.get('evaluatedProperties').slice(-1)) } export const evaluateItem = (item, index) => { for (const array of sessionDatabase.get('evaluatedItems')) { array[index] = item } } export const resetItems = (items = []) => { sessionDatabase.get('evaluatedItems').pop() sessionDatabase.get('evaluatedItems').push(items) }