diff --git a/packages/host/tests/unit/query-field-normalization-test.ts b/packages/host/tests/unit/query-field-normalization-test.ts index f8c98a2892..6bf2b7685c 100644 --- a/packages/host/tests/unit/query-field-normalization-test.ts +++ b/packages/host/tests/unit/query-field-normalization-test.ts @@ -1,18 +1,13 @@ import { module, test } from 'qunit'; import type { LooseCardResource } from '@cardstack/runtime-common'; -import { - codeRefWithAbsoluteIdentifier, - rri, - VirtualNetwork, -} from '@cardstack/runtime-common'; +import { codeRefWithAbsoluteIdentifier, rri } from '@cardstack/runtime-common'; import { getValueForResourcePath, normalizeQueryDefinition, } from '@cardstack/runtime-common/query-field-utils'; module('normalizeQueryDefinition', function () { - let virtualNetwork = new VirtualNetwork(); let fieldDefinition = { type: 'containsMany', isPrimitive: false, @@ -49,7 +44,6 @@ module('normalizeQueryDefinition', function () { fieldPath: 'profile', resource, resolvePathValue: (path) => getValueForResourcePath(resource, path), - virtualNetwork, }); assert.ok(normalized, 'normalization succeeded'); @@ -57,7 +51,6 @@ module('normalizeQueryDefinition', function () { fieldDefinition.fieldOrCard, new URL(resource.id!), undefined, - virtualNetwork, ); assert.deepEqual(normalized?.query.filter, { eq: { city: 'NYC' }, @@ -66,7 +59,7 @@ module('normalizeQueryDefinition', function () { assert.strictEqual(normalized?.realm, 'https://other.realm/'); }); - test('resolves in RRI space when no VirtualNetwork is supplied', function (assert) { + test('resolves relative code refs in RRI space', function (assert) { let realmURL = new URL('https://realm.example/'); let resource: LooseCardResource = { // A prefix-mapped realm's canonical instance id. @@ -96,7 +89,7 @@ module('normalizeQueryDefinition', function () { resolvePathValue: () => undefined, }); - assert.ok(normalized, 'normalization succeeded without a VirtualNetwork'); + assert.ok(normalized, 'normalization succeeded'); assert.deepEqual( normalized?.query.filter, { @@ -132,7 +125,6 @@ module('normalizeQueryDefinition', function () { fieldDefinition.fieldOrCard, relativeTo, undefined, - virtualNetwork, ); let normalized = normalizeQueryDefinition({ @@ -144,7 +136,6 @@ module('normalizeQueryDefinition', function () { fieldName: 'testField', resolvePathValue: () => undefined, relativeTo, - virtualNetwork, }); assert.ok(normalized, 'normalization succeeded'); @@ -160,7 +151,6 @@ module('normalizeQueryDefinition', function () { fieldDefinition.fieldOrCard, relativeTo, undefined, - virtualNetwork, ); let normalized = normalizeQueryDefinition({ @@ -174,7 +164,6 @@ module('normalizeQueryDefinition', function () { fieldName: 'testField', resolvePathValue: () => undefined, relativeTo, - virtualNetwork, }); assert.ok(normalized, 'normalization succeeded'); @@ -193,7 +182,6 @@ module('normalizeQueryDefinition', function () { fieldDefinition.fieldOrCard, relativeTo, undefined, - virtualNetwork, ); let normalized = normalizeQueryDefinition({ @@ -207,7 +195,6 @@ module('normalizeQueryDefinition', function () { fieldName: 'testField', resolvePathValue: () => undefined, relativeTo, - virtualNetwork, }); assert.ok(normalized, 'normalization succeeded'); @@ -226,7 +213,6 @@ module('normalizeQueryDefinition', function () { fieldDefinition.fieldOrCard, relativeTo, undefined, - virtualNetwork, ); let normalized = normalizeQueryDefinition({ @@ -245,7 +231,6 @@ module('normalizeQueryDefinition', function () { fieldName: 'testField', resolvePathValue: () => undefined, relativeTo, - virtualNetwork, }); assert.ok(normalized, 'normalization succeeded'); @@ -269,7 +254,6 @@ module('normalizeQueryDefinition', function () { fieldDefinition.fieldOrCard, relativeTo, undefined, - virtualNetwork, ); let typeRef = { module: rri('https://example.com/other'), @@ -287,7 +271,6 @@ module('normalizeQueryDefinition', function () { fieldName: 'testField', resolvePathValue: () => undefined, relativeTo, - virtualNetwork, }); assert.ok(normalized, 'normalization succeeded'); @@ -318,7 +301,6 @@ module('normalizeQueryDefinition', function () { fieldName: 'testField', resolvePathValue: () => undefined, relativeTo, - virtualNetwork, }); assert.ok(normalized, 'normalization succeeded'); @@ -326,7 +308,6 @@ module('normalizeQueryDefinition', function () { fieldDefinition.fieldOrCard, relativeTo, undefined, - virtualNetwork, ); assert.deepEqual(normalized?.query.filter, { any: [ @@ -350,14 +331,12 @@ module('normalizeQueryDefinition', function () { fieldName: 'matchingItems', resolvePathValue: (path) => resolvePath(instance, path), relativeTo, - virtualNetwork, }); let targetRef = codeRefWithAbsoluteIdentifier( fieldDefinition.fieldOrCard, relativeTo, undefined, - virtualNetwork, ); assert.deepEqual(normalized?.query.filter, { in: { color: ['red', 'blue', 'green'] }, @@ -379,7 +358,6 @@ module('normalizeQueryDefinition', function () { fieldName: 'matchingItems', resolvePathValue: (path) => resolvePath(instance, path), relativeTo, - virtualNetwork, }); assert.strictEqual( @@ -403,14 +381,12 @@ module('normalizeQueryDefinition', function () { fieldName: 'favoriteCity', resolvePathValue: (path) => resolvePath(instance, path), relativeTo, - virtualNetwork, }); let targetRef = codeRefWithAbsoluteIdentifier( fieldDefinition.fieldOrCard, relativeTo, undefined, - virtualNetwork, ); assert.deepEqual(normalized?.query.filter, { eq: { city: 'Paris' }, diff --git a/packages/runtime-common/query-field-utils.ts b/packages/runtime-common/query-field-utils.ts index 02c777e2ae..ec6a6d6011 100644 --- a/packages/runtime-common/query-field-utils.ts +++ b/packages/runtime-common/query-field-utils.ts @@ -1,6 +1,5 @@ import { codeRefWithAbsoluteIdentifier, type CodeRef } from './code-ref.ts'; import { rri, type RealmResourceIdentifier } from './realm-identifiers.ts'; -import type { VirtualNetwork } from './virtual-network.ts'; import type { FieldDefinition } from './definitions.ts'; import type { FileMetaResource, @@ -41,12 +40,6 @@ export interface NormalizeQueryDefinitionParams { resolvePathValue: (path: string) => any; resource?: LooseCardResource | FileMetaResource; relativeTo?: RealmResourceIdentifier | URL; - // Optional: when supplied, the target code ref and the reference base are - // resolved through the VirtualNetwork to real URLs (legacy callers). When - // omitted, resolution happens in RRI space — identifiers pass through in - // their canonical form (prefix for mapped realms, URL otherwise), which the - // search index and the client-side filter matcher both tolerate. - virtualNetwork?: VirtualNetwork; } export interface NormalizedQueryDefinitionResult { @@ -63,7 +56,6 @@ export function normalizeQueryDefinition({ resolvePathValue, resource, relativeTo, - virtualNetwork, }: NormalizeQueryDefinitionParams): NormalizedQueryDefinitionResult | null { let workingQuery: QueryWithInterpolations = JSON.parse( JSON.stringify(queryDefinition), @@ -239,18 +231,16 @@ export function normalizeQueryDefinition({ let resolvedRealm = resolveRealm(specifiedRealm); + // Resolve in RRI space: the resource's canonical id (prefix form for mapped + // realms, URL otherwise) is a valid base for relative code-ref resolution, + // and the resulting ref keeps its canonical spelling — which the search + // index and the client-side filter matcher both tolerate. let relativeToBase: RealmResourceIdentifier | URL = - relativeTo ?? - (resource?.id - ? virtualNetwork - ? virtualNetwork.toURL(resource.id) - : rri(resource.id) - : realmURL); + relativeTo ?? (resource?.id ? rri(resource.id) : realmURL); let targetRef = codeRefWithAbsoluteIdentifier( fieldDefinition.fieldOrCard, relativeToBase, undefined, - virtualNetwork, ); let filter = queryAny.filter as Record | undefined; diff --git a/packages/runtime-common/realm-index-query-engine.ts b/packages/runtime-common/realm-index-query-engine.ts index 82efb6347b..b9f4c6a744 100644 --- a/packages/runtime-common/realm-index-query-engine.ts +++ b/packages/runtime-common/realm-index-query-engine.ts @@ -1046,6 +1046,11 @@ export class RealmIndexQueryEngine { let fieldPath = fieldName.includes('.') ? fieldName.slice(0, fieldName.lastIndexOf('.')) : ''; + // Resolved in RRI space (no VirtualNetwork): the target code ref keeps its + // canonical spelling (prefix form for mapped realms), which the index + // matches via its equivalent-spelling tolerance, and the resulting + // `links.search` seed URL reconciles with the client's RRI-space rebuild + // of the same query. let normalized = normalizeQueryDefinition({ fieldDefinition, queryDefinition, @@ -1054,10 +1059,6 @@ export class RealmIndexQueryEngine { fieldName, fieldPath, resolvePathValue: (path) => getValueForResourcePath(resource, path), - relativeTo: resource.id - ? this.#realm.virtualNetwork.toURL(resource.id) - : realmURL, - virtualNetwork: this.#realm.virtualNetwork, }); if (!normalized) { return { results: [], errors: [], searchURL: '' };