{"version":3,"file":"vestjs-runtime.cjs","names":["useAvailableRoot","Isolate"],"sources":["../src/Isolate/IsolateRegistry.ts","../src/Isolate/IsolateReorderable.ts"],"sourcesContent":["import { Nullable, isEmptySet, isNotEmptySet } from 'vest-utils';\n\nimport { useAvailableRoot } from '../VestRuntime';\nimport { TIsolate } from './Isolate';\n\n/**\n * A registry index, mapping group keys (like field names) to sets of isolates.\n */\nexport type RegistryIndex = Map<string, Set<TIsolate>>;\n\n/**\n * Configuration for a registry category.\n */\nexport type RegistryCategoryConfig = {\n  predicate: (isolate: TIsolate) => boolean;\n  getKey: (isolate: TIsolate) => string;\n};\n\n/**\n * Updates the registration of an isolate in all relevant indices based on provided predicates.\n *\n * @param isolate - The isolate node to update.\n * @param predicates - A record of category keys and their corresponding predicate configurations.\n */\nexport function useUpdateRegistry(\n  isolate: TIsolate,\n  predicates: Record<string, RegistryCategoryConfig>,\n) {\n  const root = useGetAvailableRoot();\n\n  if (!root) return;\n\n  for (const key in predicates) {\n    useUpdateCategoryInRegistry(root, key, predicates[key], isolate);\n  }\n}\n\n/**\n * Retrieves isolates from the registry based on a category and an optional key.\n */\nexport function useGetFromRegistry(\n  category: string,\n  key?: string,\n): Set<TIsolate> {\n  const root = useGetAvailableRoot();\n  if (!root) return new Set();\n\n  const index = useEnsureRegistryIndex(root, category);\n\n  if (key) {\n    return index.get(key) ?? new Set();\n  }\n\n  const allNodes = new Set<TIsolate>();\n  index.forEach(set => set.forEach(node => allNodes.add(node)));\n  return allNodes;\n}\n\n/**\n * Checks if the registry contains any isolates for a given category and optional key.\n */\nexport function useHasFromRegistry(category: string, key?: string): boolean {\n  return isNotEmptySet(useGetFromRegistry(category, key));\n}\n\n/**\n * Removes all entries for a specific key from the registry.\n */\nexport function useRemoveFieldFromRegistry(key: string): void {\n  const root = useGetAvailableRoot();\n\n  if (!root) return;\n\n  useForEachRegistryIndex(root, index => index.delete(key));\n}\n\n/**\n * Clears all registry entries from the root isolate.\n */\nexport function useClearRegistry(root: TIsolate) {\n  useForEachRegistryIndex(root, index => index.clear());\n}\n\n// Internal Helpers\n\nconst GENERIC_REGISTRY_KEY = '_generic';\n\nfunction useGetAvailableRoot(): TIsolate | undefined {\n  try {\n    return useAvailableRoot();\n  } catch {\n    return undefined;\n  }\n}\n\nfunction useUpdateCategoryInRegistry(\n  root: TIsolate,\n  category: string,\n  config: RegistryCategoryConfig,\n  isolate: TIsolate,\n) {\n  const isMatching = config.predicate(isolate);\n  const index = useEnsureRegistryIndex(root, category);\n  const key = config.getKey(isolate);\n\n  if (isMatching) {\n    useAddNodeToRegistryIndex(index, key, isolate);\n  } else {\n    useRemoveNodeFromRegistryIndex(index, key, isolate);\n  }\n}\n\nfunction useEnsureRegistryIndex(\n  root: TIsolate,\n  category: string,\n): RegistryIndex {\n  const registryKey = `registry_${category}`;\n\n  if (!root.data[registryKey]) {\n    useDefineEnumerable(root.data, registryKey, new Map());\n  }\n\n  return root.data[registryKey];\n}\n\nfunction useForEachRegistryIndex(\n  root: TIsolate,\n  callback: (index: RegistryIndex) => void,\n) {\n  for (const key in root.data) {\n    if (key.startsWith('registry_')) {\n      callback(root.data[key]);\n    }\n  }\n}\n\nfunction useAddNodeToRegistryIndex(\n  index: RegistryIndex,\n  key: Nullable<string>,\n  isolate: TIsolate,\n) {\n  const indexKey = key ?? GENERIC_REGISTRY_KEY;\n  let entry = index.get(indexKey);\n\n  if (!entry) {\n    entry = new Set();\n    index.set(indexKey, entry);\n  }\n\n  entry.add(isolate);\n}\n\nfunction useRemoveNodeFromRegistryIndex(\n  index: RegistryIndex,\n  key: Nullable<string>,\n  isolate: TIsolate,\n) {\n  const indexKey = key ?? GENERIC_REGISTRY_KEY;\n  const entry = index.get(indexKey);\n\n  if (entry) {\n    entry.delete(isolate);\n    if (isEmptySet(entry)) {\n      index.delete(indexKey);\n    }\n  }\n}\n\nfunction useDefineEnumerable(obj: any, key: string, value: any) {\n  Object.defineProperty(obj, key, {\n    configurable: true,\n    enumerable: true,\n    value,\n    writable: true,\n  });\n}\n","import { CB } from 'vest-utils';\n\nimport { Isolate } from './Isolate';\n\nexport function IsolateReorderable<Payload extends Record<string, any>>(\n  callback: CB,\n  type = 'Reorderable',\n  payload: Payload = {} as Payload,\n) {\n  return Isolate.create(type, callback, { ...payload, allowReorder: true });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAwBA,SAAgB,kBACd,SACA,YACA;CACA,MAAM,OAAO,qBAAqB;AAElC,KAAI,CAAC,KAAM;AAEX,MAAK,MAAM,OAAO,WAChB,6BAA4B,MAAM,KAAK,WAAW,MAAM,QAAQ;;;;;AAOpE,SAAgB,mBACd,UACA,KACe;CACf,MAAM,OAAO,qBAAqB;AAClC,KAAI,CAAC,KAAM,wBAAO,IAAI,KAAK;CAE3B,MAAM,QAAQ,uBAAuB,MAAM,SAAS;AAEpD,KAAI,IACF,QAAO,MAAM,IAAI,IAAI,oBAAI,IAAI,KAAK;CAGpC,MAAM,2BAAW,IAAI,KAAe;AACpC,OAAM,SAAQ,QAAO,IAAI,SAAQ,SAAQ,SAAS,IAAI,KAAK,CAAC,CAAC;AAC7D,QAAO;;;;;AAMT,SAAgB,mBAAmB,UAAkB,KAAuB;AAC1E,sCAAqB,mBAAmB,UAAU,IAAI,CAAC;;;;;AAMzD,SAAgB,2BAA2B,KAAmB;CAC5D,MAAM,OAAO,qBAAqB;AAElC,KAAI,CAAC,KAAM;AAEX,yBAAwB,OAAM,UAAS,MAAM,OAAO,IAAI,CAAC;;;;;AAM3D,SAAgB,iBAAiB,MAAgB;AAC/C,yBAAwB,OAAM,UAAS,MAAM,OAAO,CAAC;;AAKvD,MAAM,uBAAuB;AAE7B,SAAS,sBAA4C;AACnD,KAAI;AACF,SAAOA,4CAAkB;SACnB;AACN;;;AAIJ,SAAS,4BACP,MACA,UACA,QACA,SACA;CACA,MAAM,aAAa,OAAO,UAAU,QAAQ;CAC5C,MAAM,QAAQ,uBAAuB,MAAM,SAAS;CACpD,MAAM,MAAM,OAAO,OAAO,QAAQ;AAElC,KAAI,WACF,2BAA0B,OAAO,KAAK,QAAQ;KAE9C,gCAA+B,OAAO,KAAK,QAAQ;;AAIvD,SAAS,uBACP,MACA,UACe;CACf,MAAM,cAAc,YAAY;AAEhC,KAAI,CAAC,KAAK,KAAK,aACb,qBAAoB,KAAK,MAAM,6BAAa,IAAI,KAAK,CAAC;AAGxD,QAAO,KAAK,KAAK;;AAGnB,SAAS,wBACP,MACA,UACA;AACA,MAAK,MAAM,OAAO,KAAK,KACrB,KAAI,IAAI,WAAW,YAAY,CAC7B,UAAS,KAAK,KAAK,KAAK;;AAK9B,SAAS,0BACP,OACA,KACA,SACA;CACA,MAAM,WAAW,OAAO;CACxB,IAAI,QAAQ,MAAM,IAAI,SAAS;AAE/B,KAAI,CAAC,OAAO;AACV,0BAAQ,IAAI,KAAK;AACjB,QAAM,IAAI,UAAU,MAAM;;AAG5B,OAAM,IAAI,QAAQ;;AAGpB,SAAS,+BACP,OACA,KACA,SACA;CACA,MAAM,WAAW,OAAO;CACxB,MAAM,QAAQ,MAAM,IAAI,SAAS;AAEjC,KAAI,OAAO;AACT,QAAM,OAAO,QAAQ;AACrB,iCAAe,MAAM,CACnB,OAAM,OAAO,SAAS;;;AAK5B,SAAS,oBAAoB,KAAU,KAAa,OAAY;AAC9D,QAAO,eAAe,KAAK,KAAK;EAC9B,cAAc;EACd,YAAY;EACZ;EACA,UAAU;EACX,CAAC;;;;;AC1KJ,SAAgB,mBACd,UACA,OAAO,eACP,UAAmB,EAAE,EACrB;AACA,QAAOC,kCAAQ,OAAO,MAAM,UAAU;EAAE,GAAG;EAAS,cAAc;EAAM,CAAC"}