@almadar/runtime 6.60.0 → 6.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -478,8 +478,15 @@ interface LoadedSchema {
478
478
  * Result of loading a single orbital from a schema.
479
479
  */
480
480
  interface LoadedOrbital {
481
- /** The loaded orbital */
481
+ /** The loaded orbital — the named one when requested, else the first. */
482
482
  orbital: Orbital;
483
+ /**
484
+ * EVERY orbital in the loaded schema. `Alias.traits.X` carries no orbital
485
+ * segment, so a multi-orbital behavior's traits and pages must all stay
486
+ * reachable; resolving against `orbital` alone silently loses everything
487
+ * outside it. Mirrors the compiled path's `AliasEntry.orbitals`.
488
+ */
489
+ orbitals?: Orbital[];
483
490
  /** Source path/URL (resolved) */
484
491
  sourcePath: string;
485
492
  /** Original import path */
@@ -1,4 +1,4 @@
1
1
  import 'express';
2
- export { F as ClientEffectTuple, G as ClientNavigateBackTuple, H as ClientNavigateTuple, J as ClientNotifyTuple, K as ClientRenderUITuple, M as EffectResult, e as InMemoryPersistence, N as LiveBroadcastItem, Q as LoaderConfig, O as OrbitalEventRequest, f as OrbitalEventResponse, T as OrbitalServerRuntime, g as OrbitalServerRuntimeConfig, P as PersistenceAdapter, R as RegisteredOrbital, l as RuntimeOrbital, m as RuntimeOrbitalSchema, n as RuntimeTrait, V as RuntimeTraitTick, p as collectDeclaredConfigDefaults, W as createOrbitalServerRuntime } from './OrbitalServerRuntime-Cvw0CUfG.js';
2
+ export { F as ClientEffectTuple, G as ClientNavigateBackTuple, H as ClientNavigateTuple, J as ClientNotifyTuple, K as ClientRenderUITuple, M as EffectResult, e as InMemoryPersistence, N as LiveBroadcastItem, Q as LoaderConfig, O as OrbitalEventRequest, f as OrbitalEventResponse, T as OrbitalServerRuntime, g as OrbitalServerRuntimeConfig, P as PersistenceAdapter, R as RegisteredOrbital, l as RuntimeOrbital, m as RuntimeOrbitalSchema, n as RuntimeTrait, V as RuntimeTraitTick, p as collectDeclaredConfigDefaults, W as createOrbitalServerRuntime } from './OrbitalServerRuntime-CZHHxo_A.js';
3
3
  import './types-BaD_ox7e.js';
4
4
  import '@almadar/core';
@@ -1,5 +1,5 @@
1
- import { createTickScheduler, EventBus, createUnifiedLoader, MockPersistenceAdapter, InMemoryPersistence, preprocessSchema, normalizeCallSiteConfigToValues, StateMachineManager, parseDurationString, validateEventPayload, formatPayloadValidationError, collectDeclaredConfigDefaults, collectDeclaredEntityDefaults, EffectExecutor } from './chunk-5IFHQDW2.js';
2
- export { InMemoryPersistence, collectDeclaredConfigDefaults } from './chunk-5IFHQDW2.js';
1
+ import { createTickScheduler, EventBus, createUnifiedLoader, MockPersistenceAdapter, InMemoryPersistence, preprocessSchema, normalizeCallSiteConfigToValues, StateMachineManager, parseDurationString, validateEventPayload, formatPayloadValidationError, collectDeclaredConfigDefaults, collectDeclaredEntityDefaults, EffectExecutor } from './chunk-MEBKFZC4.js';
2
+ export { InMemoryPersistence, collectDeclaredConfigDefaults } from './chunk-MEBKFZC4.js';
3
3
  import { isValidCronExpression } from './chunk-OU3ITB5S.js';
4
4
  import { createContextFromBindings, resolveCallSitePayloadCaptures, applyRowAccess, checkMutationAccess, accessDeniedMessage } from './chunk-ZJ62H3ES.js';
5
5
  import './chunk-T4VDAB4C.js';
@@ -1613,8 +1613,9 @@ var OrbitalServerRuntime = class {
1613
1613
  const readPolicy = this.resolvedSchema ? entityAccessPolicies(this.resolvedSchema, fetchEntityType)?.read : void 0;
1614
1614
  const accessBindings = { user: bindingsRef?.user, payload: bindingsRef?.payload, config: bindingsRef?.config };
1615
1615
  if (options?.id) {
1616
- const entity = await this.persistence.getById(fetchEntityType, options.id);
1617
- if (entity && applyRowAccess([entity], readPolicy, void 0, accessBindings).length > 0) {
1616
+ const stored = await this.persistence.getById(fetchEntityType, options.id);
1617
+ if (stored && applyRowAccess([stored], readPolicy, void 0, accessBindings).length > 0) {
1618
+ const entity = { ...stored };
1618
1619
  if (options?.include && options.include.length > 0) {
1619
1620
  await this.populateRelations([entity], fetchEntityType, options.include);
1620
1621
  }
@@ -1638,6 +1639,7 @@ var OrbitalServerRuntime = class {
1638
1639
  entities = entities.slice(0, options.limit);
1639
1640
  }
1640
1641
  if (options?.include && options.include.length > 0) {
1642
+ entities = entities.map((row) => ({ ...row }));
1641
1643
  await this.populateRelations(entities, fetchEntityType, options.include);
1642
1644
  }
1643
1645
  fetchedData[fetchEntityType] = entities;
@@ -2635,6 +2635,7 @@ var HttpLoader = class {
2635
2635
  success: true,
2636
2636
  data: {
2637
2637
  orbital,
2638
+ orbitals: schema.orbitals,
2638
2639
  sourcePath: schemaResult.data.sourcePath,
2639
2640
  importPath
2640
2641
  }
@@ -2844,7 +2845,7 @@ async function getExternalLoaderModule() {
2844
2845
  return null;
2845
2846
  }
2846
2847
  try {
2847
- externalLoaderModule = await import('./external-loader-WYQAS3BS.js');
2848
+ externalLoaderModule = await import('./external-loader-YUUADLAP.js');
2848
2849
  return externalLoaderModule;
2849
2850
  } catch {
2850
2851
  return null;
@@ -3017,6 +3018,7 @@ var UnifiedLoader = class {
3017
3018
  success: true,
3018
3019
  data: {
3019
3020
  orbital: found,
3021
+ orbitals: schema.orbitals,
3020
3022
  sourcePath: schemaResult.data.sourcePath,
3021
3023
  importPath
3022
3024
  }
@@ -3032,6 +3034,7 @@ var UnifiedLoader = class {
3032
3034
  success: true,
3033
3035
  data: {
3034
3036
  orbital: schema.orbitals[0],
3037
+ orbitals: schema.orbitals,
3035
3038
  sourcePath: schemaResult.data.sourcePath,
3036
3039
  importPath
3037
3040
  }
@@ -3400,10 +3403,13 @@ function buildIdIndex(orbital, orbitals) {
3400
3403
  const idIndex = /* @__PURE__ */ new Map();
3401
3404
  indexOrbitalNodes(orbital, idIndex);
3402
3405
  for (const imported of orbitals.values()) {
3403
- indexOrbitalNodes(imported.orbital, idIndex);
3406
+ for (const o of importedOrbitals(imported)) indexOrbitalNodes(o, idIndex);
3404
3407
  }
3405
3408
  return idIndex;
3406
3409
  }
3410
+ function importedOrbitals(imported) {
3411
+ return imported.orbitals?.length ? imported.orbitals : [imported.orbital];
3412
+ }
3407
3413
  function renameEventsInRenderUiConfig(node, rename) {
3408
3414
  if (node === null || node === void 0) return node;
3409
3415
  if (Array.isArray(node)) {
@@ -3442,16 +3448,50 @@ function renameEventsInRenderUiConfig(node, rename) {
3442
3448
  return next;
3443
3449
  }
3444
3450
  function renameEventsInEffects(effects, rename) {
3445
- return effects.map((effect) => {
3446
- if (!Array.isArray(effect)) return effect;
3447
- if (effect[0] === "render-ui" && effect.length >= 3) {
3448
- const slot = effect[1];
3449
- const config = effect[2];
3450
- const nextConfig = renameEventsInRenderUiConfig(config, rename);
3451
- return [effect[0], slot, nextConfig, ...effect.slice(3)];
3452
- }
3453
- return effect;
3454
- });
3451
+ return effects.map((effect) => renameEventRefsInNode(effect, rename));
3452
+ }
3453
+ var EMIT_OPTION_SLOTS = /* @__PURE__ */ new Set(["success", "failure", "on_message", "on_change"]);
3454
+ function renameEventRefsInNode(node, rename) {
3455
+ if (node === null || node === void 0) return node;
3456
+ if (Array.isArray(node)) {
3457
+ if (node[0] === "render-ui" && node.length >= 3) {
3458
+ const nextConfig = renameEventsInRenderUiConfig(node[2], rename);
3459
+ return [
3460
+ node[0],
3461
+ node[1],
3462
+ nextConfig,
3463
+ ...node.slice(3).map((x) => renameEventRefsInNode(x, rename))
3464
+ ];
3465
+ }
3466
+ const out = node.map((x) => renameEventRefsInNode(x, rename));
3467
+ if (node[0] === "emit" && typeof node[1] === "string") {
3468
+ out[1] = rename(node[1]) ?? node[1];
3469
+ }
3470
+ return out;
3471
+ }
3472
+ if (typeof node === "object") {
3473
+ const obj = node;
3474
+ const next = {};
3475
+ for (const [k, v] of Object.entries(obj)) {
3476
+ if (k === "emit") {
3477
+ if (typeof v === "string") {
3478
+ next[k] = rename(v) ?? v;
3479
+ } else if (v !== null && typeof v === "object" && !Array.isArray(v)) {
3480
+ const slots = {};
3481
+ for (const [slot, slotV] of Object.entries(v)) {
3482
+ slots[slot] = EMIT_OPTION_SLOTS.has(slot) && typeof slotV === "string" ? rename(slotV) ?? slotV : renameEventRefsInNode(slotV, rename);
3483
+ }
3484
+ next[k] = slots;
3485
+ } else {
3486
+ next[k] = renameEventRefsInNode(v, rename);
3487
+ }
3488
+ continue;
3489
+ }
3490
+ next[k] = renameEventRefsInNode(v, rename);
3491
+ }
3492
+ return next;
3493
+ }
3494
+ return node;
3455
3495
  }
3456
3496
  var REBIND_ENTITY_PROPS = /* @__PURE__ */ new Set(["entity"]);
3457
3497
  var ID_ENTITY_PROPS = /* @__PURE__ */ new Set(["entity", "entityType", "source"]);
@@ -3745,13 +3785,12 @@ function applyEventRenames(trait, renames) {
3745
3785
  if (!renames || Object.keys(renames).length === 0) return trait;
3746
3786
  const rename = (k) => k !== void 0 && k in renames ? renames[k] : k;
3747
3787
  const sm = trait.stateMachine;
3748
- if (!sm) return trait;
3749
- const nextTransitions = (sm.transitions ?? []).map((t) => {
3788
+ const nextTransitions = (sm?.transitions ?? []).map((t) => {
3750
3789
  const nextEvent = rename(t.event) ?? t.event;
3751
3790
  const nextEffects = t.effects ? renameEventsInEffects(t.effects, rename) : t.effects;
3752
3791
  return { ...t, event: nextEvent, effects: nextEffects };
3753
3792
  });
3754
- const nextEvents = (sm.events ?? []).map((e) => {
3793
+ const nextEvents = (sm?.events ?? []).map((e) => {
3755
3794
  const newKey = rename(e.key);
3756
3795
  if (newKey === e.key) return e;
3757
3796
  return { ...e, key: newKey ?? e.key };
@@ -3761,13 +3800,30 @@ function applyEventRenames(trait, renames) {
3761
3800
  const newEvent = rename(em.event);
3762
3801
  return newEvent === em.event ? em : { ...em, event: newEvent ?? em.event };
3763
3802
  });
3803
+ const nextTicks = (trait.ticks ?? []).map(
3804
+ (tk) => tk.effects ? {
3805
+ ...tk,
3806
+ effects: renameEventsInEffects(
3807
+ tk.effects,
3808
+ rename
3809
+ )
3810
+ } : tk
3811
+ );
3812
+ const nextListens = (trait.listens ?? []).map((l) => {
3813
+ const sourced = l.source !== void 0 && l.source.kind !== "any";
3814
+ const nextEvent = sourced ? l.event : rename(l.event) ?? l.event;
3815
+ const nextTriggers = rename(l.triggers) ?? l.triggers;
3816
+ return nextEvent === l.event && nextTriggers === l.triggers ? l : { ...l, event: nextEvent, triggers: nextTriggers };
3817
+ });
3764
3818
  return {
3765
3819
  ...trait,
3766
- stateMachine: {
3820
+ stateMachine: sm ? {
3767
3821
  ...sm,
3768
3822
  transitions: nextTransitions,
3769
3823
  events: nextEvents
3770
- },
3824
+ } : sm,
3825
+ ...trait.ticks ? { ticks: nextTicks } : {},
3826
+ ...trait.listens ? { listens: nextListens } : {},
3771
3827
  emits: nextEmits
3772
3828
  };
3773
3829
  }
@@ -3821,7 +3877,7 @@ var ReferenceResolver = class {
3821
3877
  if (this.loader || this.loaderInitialized) return;
3822
3878
  this.loaderInitialized = true;
3823
3879
  try {
3824
- const { ExternalOrbitalLoader } = await import('./external-loader-WYQAS3BS.js');
3880
+ const { ExternalOrbitalLoader } = await import('./external-loader-YUUADLAP.js');
3825
3881
  this.loader = new ExternalOrbitalLoader(this.options);
3826
3882
  } catch {
3827
3883
  }
@@ -3929,6 +3985,7 @@ var ReferenceResolver = class {
3929
3985
  alias: use.as,
3930
3986
  from: use.from,
3931
3987
  orbital: loadResult.data.orbital,
3988
+ orbitals: loadResult.data.orbitals ?? [loadResult.data.orbital],
3932
3989
  sourcePath: loadResult.data.sourcePath
3933
3990
  });
3934
3991
  }
@@ -4133,7 +4190,11 @@ var ReferenceResolver = class {
4133
4190
  visited.add(pullKey);
4134
4191
  const imported = imports.orbitals.get(alias);
4135
4192
  if (!imported) continue;
4136
- const atomEntry = findTraitEntryInOrbital(imported.orbital, sibling);
4193
+ let atomEntry = null;
4194
+ for (const o of importedOrbitals(imported)) {
4195
+ atomEntry = findTraitEntryInOrbital(o, sibling);
4196
+ if (atomEntry) break;
4197
+ }
4137
4198
  if (!atomEntry) continue;
4138
4199
  let atomTrait;
4139
4200
  if ("stateMachine" in atomEntry) {
@@ -4282,12 +4343,17 @@ var ReferenceResolver = class {
4282
4343
  ]
4283
4344
  };
4284
4345
  }
4285
- const trait = this.findTraitInOrbital(imported.orbital, parsed.traitName, refId, imports.idIndex);
4346
+ let trait = null;
4347
+ for (const o of importedOrbitals(imported)) {
4348
+ trait = this.findTraitInOrbital(o, parsed.traitName, refId, imports.idIndex);
4349
+ if (trait) break;
4350
+ }
4286
4351
  if (!trait) {
4352
+ const available = importedOrbitals(imported).flatMap((o) => this.listTraitsInOrbital(o));
4287
4353
  return {
4288
4354
  success: false,
4289
4355
  errors: [
4290
- `Trait "${parsed.traitName}" not found in imported orbital "${parsed.alias}". Available traits: ${this.listTraitsInOrbital(imported.orbital).join(", ") || "none"}`
4356
+ `Trait "${parsed.traitName}" not found in imported orbital "${parsed.alias}". Available traits: ${available.join(", ") || "none"}`
4291
4357
  ]
4292
4358
  };
4293
4359
  }
@@ -4456,12 +4522,17 @@ var ReferenceResolver = class {
4456
4522
  ]
4457
4523
  };
4458
4524
  }
4459
- const page = this.findPageInOrbital(imported.orbital, parsed.pageName, refId, imports.idIndex);
4525
+ let page = null;
4526
+ for (const o of importedOrbitals(imported)) {
4527
+ page = this.findPageInOrbital(o, parsed.pageName, refId, imports.idIndex);
4528
+ if (page) break;
4529
+ }
4460
4530
  if (!page) {
4531
+ const available = importedOrbitals(imported).flatMap((o) => this.listPagesInOrbital(o));
4461
4532
  return {
4462
4533
  success: false,
4463
4534
  errors: [
4464
- `Page "${parsed.pageName}" not found in imported orbital "${parsed.alias}". Available pages: ${this.listPagesInOrbital(imported.orbital).join(", ") || "none"}`
4535
+ `Page "${parsed.pageName}" not found in imported orbital "${parsed.alias}". Available pages: ${available.join(", ") || "none"}`
4465
4536
  ]
4466
4537
  };
4467
4538
  }
@@ -154,6 +154,7 @@ var ExternalOrbitalLoader = class {
154
154
  success: true,
155
155
  data: {
156
156
  orbital,
157
+ orbitals: schema.orbitals,
157
158
  sourcePath: schemaResult.data.sourcePath,
158
159
  importPath
159
160
  }
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { g as RuntimePatternValue, B as BindingContext, f as EvaluationContextExtensions, P as PatternProps, E as EffectHandlers, h as EffectContext, i as ExecutionEnvironment, j as EffectResult, S as ServiceCallContext, T as TraitDefinition } from './types-BaD_ox7e.js';
2
2
  export { k as BrowserFileMeta, l as BrowserFilePickerOptions, m as BrowserGeolocationOptions, n as BrowserGeolocationPosition, C as ConfigContext, o as Effect, a as EventListener, H as HANDLER_MANIFEST, I as IEventBus, b as RuntimeConfig, R as RuntimeEvent, d as TraitState, c as TransitionObserver, e as TransitionResult, U as Unsubscribe } from './types-BaD_ox7e.js';
3
- import { U as UnifiedLoaderOptions, S as SchemaLoader, I as ImportChainLike, L as LoadResult, a as LoadedSchema, b as LoadedOrbital, P as PersistenceAdapter } from './OrbitalServerRuntime-Cvw0CUfG.js';
4
- export { E as EntitySharingMap, c as EventBus, d as EventNamespaceMap, e as InMemoryPersistence, O as OrbitalEventRequest, f as OrbitalEventResponse, g as OrbitalServerRuntimeConfig, h as PreprocessOptions, i as PreprocessResult, j as PreprocessedSchema, k as ProcessEventOptions, R as RegisteredOrbital, l as RuntimeOrbital, m as RuntimeOrbitalSchema, n as RuntimeTrait, o as StateMachineManager, p as collectDeclaredConfigDefaults, q as collectDeclaredEntityDefaults, r as createInitialTraitState, s as findInitialState, t as findTransition, u as getIsolatedCollectionName, v as getNamespacedEvent, w as isBrowser, x as isElectron, y as isNamespacedEvent, z as isNode, A as normalizeEventKey, B as parseNamespacedEvent, C as preprocessSchema, D as processEvent } from './OrbitalServerRuntime-Cvw0CUfG.js';
3
+ import { U as UnifiedLoaderOptions, S as SchemaLoader, I as ImportChainLike, L as LoadResult, a as LoadedSchema, b as LoadedOrbital, P as PersistenceAdapter } from './OrbitalServerRuntime-CZHHxo_A.js';
4
+ export { E as EntitySharingMap, c as EventBus, d as EventNamespaceMap, e as InMemoryPersistence, O as OrbitalEventRequest, f as OrbitalEventResponse, g as OrbitalServerRuntimeConfig, h as PreprocessOptions, i as PreprocessResult, j as PreprocessedSchema, k as ProcessEventOptions, R as RegisteredOrbital, l as RuntimeOrbital, m as RuntimeOrbitalSchema, n as RuntimeTrait, o as StateMachineManager, p as collectDeclaredConfigDefaults, q as collectDeclaredEntityDefaults, r as createInitialTraitState, s as findInitialState, t as findTransition, u as getIsolatedCollectionName, v as getNamespacedEvent, w as isBrowser, x as isElectron, y as isNamespacedEvent, z as isNode, A as normalizeEventKey, B as parseNamespacedEvent, C as preprocessSchema, D as processEvent } from './OrbitalServerRuntime-CZHHxo_A.js';
5
5
  import { EvaluationContext, SExpressionEvaluator } from '@almadar/evaluator';
6
6
  export { EvaluationContext, createMinimalContext } from '@almadar/evaluator';
7
7
  import { RenderBindingMarker, SExpr, RuntimeValue, TraitConfigObject, EventPayload, PatternConfig, EntityId, EntityField, EntityRow, EntityPersistence, ServiceParams, EntityAccessPolicies, PayloadField, OrbitalDefinition, OrbitalSchema } from '@almadar/core';
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { EffectExecutor } from './chunk-5IFHQDW2.js';
2
- export { EffectExecutor, EventBus, HANDLER_MANIFEST, InMemoryPersistence, MockPersistenceAdapter, StateMachineManager, TickScheduler, buildEmitsFromTraits, collectDeclaredConfigDefaults, collectDeclaredEntityDefaults, createInitialTraitState, createMockPersistence, createTestExecutor, createTickScheduler, createUnifiedLoader, findInitialState, findTransition, formatPayloadValidationError, getIsolatedCollectionName, getNamespacedEvent, isBrowser, isElectron, isNamespacedEvent, isNode, isValidDurationString, normalizeCallSiteConfigToValues, normalizeEventKey, parseDurationString, parseNamespacedEvent, preprocessSchema, processEvent, validateEventPayload, validatePayloadShapes } from './chunk-5IFHQDW2.js';
1
+ import { EffectExecutor } from './chunk-MEBKFZC4.js';
2
+ export { EffectExecutor, EventBus, HANDLER_MANIFEST, InMemoryPersistence, MockPersistenceAdapter, StateMachineManager, TickScheduler, buildEmitsFromTraits, collectDeclaredConfigDefaults, collectDeclaredEntityDefaults, createInitialTraitState, createMockPersistence, createTestExecutor, createTickScheduler, createUnifiedLoader, findInitialState, findTransition, formatPayloadValidationError, getIsolatedCollectionName, getNamespacedEvent, isBrowser, isElectron, isNamespacedEvent, isNode, isValidDurationString, normalizeCallSiteConfigToValues, normalizeEventKey, parseDurationString, parseNamespacedEvent, preprocessSchema, processEvent, validateEventPayload, validatePayloadShapes } from './chunk-MEBKFZC4.js';
3
3
  export { cronMatches, cronMinuteKey, isValidCronExpression, parseCron, parseCronField } from './chunk-OU3ITB5S.js';
4
4
  import { createContextFromBindings, applyRowAccess, checkMutationAccess, accessDeniedMessage } from './chunk-ZJ62H3ES.js';
5
5
  export { CALLSITE_PAYLOAD_PREFIX, applyRowAccess, checkMutationAccess, containsBindings, createContextFromBindings, createMinimalContext, deferEntityBindings, extractBindings, interpolateProps, interpolateValue, resolveCallSitePayloadCaptures } from './chunk-ZJ62H3ES.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/runtime",
3
- "version": "6.60.0",
3
+ "version": "6.62.0",
4
4
  "description": "Interpreted runtime for Almadar orbital applications (OrbitalServerRuntime)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -57,11 +57,11 @@
57
57
  "access": "public"
58
58
  },
59
59
  "dependencies": {
60
- "@almadar/core": "^10.69.0",
60
+ "@almadar/core": "^10.71.0",
61
61
  "@almadar/evaluator": "^2.42.0",
62
62
  "@almadar/logger": "^1.11.0",
63
63
  "@almadar/server": "^2.38.0",
64
- "@almadar/std": "^16.185.0"
64
+ "@almadar/std": "^16.190.0"
65
65
  },
66
66
  "peerDependencies": {
67
67
  "express": "^5.0.0"
@@ -72,7 +72,7 @@
72
72
  }
73
73
  },
74
74
  "devDependencies": {
75
- "@almadar/eslint-plugin": "^2.15.0",
75
+ "@almadar/eslint-plugin": "^2.16.0",
76
76
  "@types/express": "^5.0.0",
77
77
  "@types/node": "^20.0.0",
78
78
  "@typescript-eslint/parser": "8.65.0",