From 9a7845048c4374953f6a354a037d86ffa2f1c348 Mon Sep 17 00:00:00 2001 From: Fadhlan Ridhwanallah Date: Fri, 24 Jan 2025 22:26:12 +0700 Subject: [PATCH 1/7] (WIP) Adding renderType flag to prerendered search --- packages/runtime-common/card-document.ts | 1 + packages/runtime-common/index-query-engine.ts | 114 +++++++++++++----- packages/runtime-common/realm.ts | 3 + 3 files changed, 88 insertions(+), 30 deletions(-) diff --git a/packages/runtime-common/card-document.ts b/packages/runtime-common/card-document.ts index c8f55767f7..a5c610ea8e 100644 --- a/packages/runtime-common/card-document.ts +++ b/packages/runtime-common/card-document.ts @@ -337,6 +337,7 @@ export function transformResultsToPrerenderedCardsDoc(results: { id: card.url, attributes: { html: card.html, + usedRenderType: card.usedRenderType, ...(card.isError ? { isError: true as const } : {}), }, })); diff --git a/packages/runtime-common/index-query-engine.ts b/packages/runtime-common/index-query-engine.ts index d7a8f2782f..1af8f29bca 100644 --- a/packages/runtime-common/index-query-engine.ts +++ b/packages/runtime-common/index-query-engine.ts @@ -30,6 +30,7 @@ import { tableValuedFunctionsPlaceholder, query, isDbExpression, + Param, } from './expression'; import { type Query, @@ -120,6 +121,7 @@ export type QueryOptions = WIPOptions & PrerenderedCardOptions; interface PrerenderedCardOptions { htmlFormat?: 'embedded' | 'fitted' | 'atom'; + renderType?: ResolvedCodeRef; includeErrors?: true; cardUrls?: string[]; } @@ -131,6 +133,7 @@ interface WIPOptions { export interface PrerenderedCard { url: string; html: string | null; + usedRenderType: string; isError?: true; } @@ -461,33 +464,15 @@ export class IndexQueryEngine { ); } - let ref: ResolvedCodeRef; - let filterOnValue = filter && 'type' in filter ? filter.type : filter?.on; - if (filterOnValue) { - ref = filterOnValue as ResolvedCodeRef; - } else { - ref = baseCardRef; - } - - let htmlColumnExpression; - switch (opts.htmlFormat) { - case 'embedded': - htmlColumnExpression = [ - 'embedded_html ->> ', - param(internalKeyFor(ref, undefined)), - ]; - break; - case 'fitted': - htmlColumnExpression = [ - 'fitted_html ->> ', - param(internalKeyFor(ref, undefined)), - ]; - break; - case 'atom': - default: - htmlColumnExpression = ['atom_html']; - break; - } + let htmlColumnExpression = this.buildHtmlColumnExpression({ + htmlFormat: opts.htmlFormat, + renderType: opts.renderType, + }); + let usedRenderTypeColumnExpression = + this.buildUsedRenderTypeColumnExpression({ + htmlFormat: opts.htmlFormat, + renderType: opts.renderType, + }); let { results, meta } = (await this._search( realmURL, @@ -495,13 +480,19 @@ export class IndexQueryEngine { loader, opts, [ - 'SELECT url, ANY_VALUE(i.type) as type, ANY_VALUE(file_alias) as file_alias, ANY_VALUE(', + 'SELECT url, ANY_VALUE(i.type) as type, ANY_VALUE(file_alias) as file_alias, ', ...htmlColumnExpression, - ') as html, ANY_VALUE(deps) as deps', + ' as html,', + ...usedRenderTypeColumnExpression, + ' as used_render_type,', + 'ANY_VALUE(deps) as deps', ], )) as { meta: QueryResultsMeta; - results: (Partial & { html: string | null })[]; + results: (Partial & { + html: string | null; + used_render_type: string; + })[]; }; // We need a way to get scoped css urls even from cards linked from foreign realms.These are saved in the deps column of instances and modules. @@ -521,6 +512,7 @@ export class IndexQueryEngine { return { url: card.url!, html: card.html, + usedRenderType: card.used_render_type, ...(card.type === 'error' ? { isError: true as const } : {}), }; }); @@ -528,6 +520,68 @@ export class IndexQueryEngine { return { prerenderedCards, scopedCssUrls: [...scopedCssUrls], meta }; } + private buildHtmlColumnExpression({ + htmlFormat, + renderType, + }: { + htmlFormat: 'embedded' | 'fitted' | 'atom' | undefined; + renderType?: ResolvedCodeRef; + }): (string | Param)[] { + let fieldName = htmlFormat ? `${htmlFormat}_html` : `atom_html`; + if (!htmlFormat || htmlFormat === 'atom') { + return [fieldName]; + } + + let htmlColumnExpression = []; + htmlColumnExpression.push('COALESCE('); + if (renderType) { + htmlColumnExpression.push(`${fieldName} ->> `); + htmlColumnExpression.push(param(internalKeyFor(renderType, undefined))); + htmlColumnExpression.push(','); + } + + htmlColumnExpression.push(`( + CASE + WHEN ANY_VALUE(${fieldName}) IS NOT NULL + AND jsonb_typeof(ANY_VALUE(${fieldName})) = 'object' + THEN ( + SELECT value + FROM jsonb_each_text(ANY_VALUE(${fieldName})) + WHERE key = ( + SELECT replace(ANY_VALUE(types[1]::text), '"', '') + )) + ELSE NULL + END), + NULL)`); + + return htmlColumnExpression; + } + + private buildUsedRenderTypeColumnExpression({ + htmlFormat, + renderType, + }: { + htmlFormat: 'embedded' | 'fitted' | 'atom' | undefined; + renderType?: ResolvedCodeRef; + }): (string | Param)[] { + let fieldName = htmlFormat ? `${htmlFormat}_html` : `atom_html`; + + let usedRenderTypeColumnExpression = []; + if (htmlFormat && htmlFormat !== 'atom' && renderType) { + usedRenderTypeColumnExpression.push(`CASE`); + usedRenderTypeColumnExpression.push(`WHEN ${fieldName} ->> `); + usedRenderTypeColumnExpression.push( + param(internalKeyFor(renderType, undefined)), + ); + usedRenderTypeColumnExpression.push(`IS NOT NULL THEN ${renderType}`); + usedRenderTypeColumnExpression.push(`ELSE ANY_VALUE(types[1]) END`); + } else { + usedRenderTypeColumnExpression.push('ANY_VALUE(types[1])'); + } + + return usedRenderTypeColumnExpression; + } + async fetchCardTypeSummary(realmURL: URL): Promise { let results = (await this.#query([ `SELECT value diff --git a/packages/runtime-common/realm.ts b/packages/runtime-common/realm.ts index 096bc7c49c..7d32333855 100644 --- a/packages/runtime-common/realm.ts +++ b/packages/runtime-common/realm.ts @@ -36,6 +36,7 @@ import { type QueuePublisher, type FileMeta, type DirectoryMeta, + type ResolvedCodeRef, } from './index'; import merge from 'lodash/merge'; import mergeWith from 'lodash/mergeWith'; @@ -1645,6 +1646,7 @@ export class Realm { let parsedQueryString = parseQuery(href); let htmlFormat = parsedQueryString.prerenderedHtmlFormat as string; let cardUrls = parsedQueryString.cardUrls as string[]; + let renderType = parsedQueryString.renderType as ResolvedCodeRef; if (!isValidPrerenderedHtmlFormat(htmlFormat)) { return badRequest( @@ -1669,6 +1671,7 @@ export class Realm { useWorkInProgressIndex, htmlFormat, cardUrls, + renderType, includeErrors: true, }, ); From 632b6cdd085ceeb899f3a4f1ef234947a4860d17 Mon Sep 17 00:00:00 2001 From: Fadhlan Ridhwanallah Date: Thu, 30 Jan 2025 20:39:38 +0700 Subject: [PATCH 2/7] Fix query --- packages/runtime-common/index-query-engine.ts | 19 ++++++++++++------- packages/runtime-common/realm.ts | 1 + 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/runtime-common/index-query-engine.ts b/packages/runtime-common/index-query-engine.ts index 1af8f29bca..95e9708cd2 100644 --- a/packages/runtime-common/index-query-engine.ts +++ b/packages/runtime-common/index-query-engine.ts @@ -529,13 +529,13 @@ export class IndexQueryEngine { }): (string | Param)[] { let fieldName = htmlFormat ? `${htmlFormat}_html` : `atom_html`; if (!htmlFormat || htmlFormat === 'atom') { - return [fieldName]; + return [`ANY_VALUE(${fieldName})`]; } let htmlColumnExpression = []; htmlColumnExpression.push('COALESCE('); if (renderType) { - htmlColumnExpression.push(`${fieldName} ->> `); + htmlColumnExpression.push(`ANY_VALUE(${fieldName}) ->> `); htmlColumnExpression.push(param(internalKeyFor(renderType, undefined))); htmlColumnExpression.push(','); } @@ -548,7 +548,7 @@ export class IndexQueryEngine { SELECT value FROM jsonb_each_text(ANY_VALUE(${fieldName})) WHERE key = ( - SELECT replace(ANY_VALUE(types[1]::text), '"', '') + SELECT replace(ANY_VALUE(types[0]::text), '"', '') )) ELSE NULL END), @@ -569,14 +569,19 @@ export class IndexQueryEngine { let usedRenderTypeColumnExpression = []; if (htmlFormat && htmlFormat !== 'atom' && renderType) { usedRenderTypeColumnExpression.push(`CASE`); - usedRenderTypeColumnExpression.push(`WHEN ${fieldName} ->> `); + usedRenderTypeColumnExpression.push(`WHEN ANY_VALUE(${fieldName}) ->> `); usedRenderTypeColumnExpression.push( param(internalKeyFor(renderType, undefined)), ); - usedRenderTypeColumnExpression.push(`IS NOT NULL THEN ${renderType}`); - usedRenderTypeColumnExpression.push(`ELSE ANY_VALUE(types[1]) END`); + usedRenderTypeColumnExpression.push(`IS NOT NULL THEN '${internalKeyFor(renderType, undefined)}'`); + usedRenderTypeColumnExpression.push( + `ELSE replace(ANY_VALUE(types[0]::text), '"', '') + END`, + ); } else { - usedRenderTypeColumnExpression.push('ANY_VALUE(types[1])'); + usedRenderTypeColumnExpression.push( + `replace(ANY_VALUE(types[0]::text), '"', '')`, + ); } return usedRenderTypeColumnExpression; diff --git a/packages/runtime-common/realm.ts b/packages/runtime-common/realm.ts index 7d32333855..19d4f04afd 100644 --- a/packages/runtime-common/realm.ts +++ b/packages/runtime-common/realm.ts @@ -1661,6 +1661,7 @@ export class Realm { // prerenderedHtmlFormat and cardUrls are special parameters only for this endpoint so don't include it in our Query for standard card search delete parsedQueryString.prerenderedHtmlFormat; delete parsedQueryString.cardUrls; + delete parsedQueryString.renderType; let cardsQuery = parsedQueryString; assertQuery(parsedQueryString); From a1d389a151d18b86b2bb87978471056fd92312b1 Mon Sep 17 00:00:00 2001 From: Fadhlan Ridhwanallah Date: Thu, 30 Jan 2025 21:09:50 +0700 Subject: [PATCH 3/7] Fix realm server tests --- .../tests/realm-endpoints-test.ts | 16 ++--- packages/runtime-common/index-query-engine.ts | 4 +- .../tests/index-query-engine-test.ts | 71 ++++++++++++++++++- 3 files changed, 79 insertions(+), 12 deletions(-) diff --git a/packages/realm-server/tests/realm-endpoints-test.ts b/packages/realm-server/tests/realm-endpoints-test.ts index 8ca6b069da..8c87a1acc2 100644 --- a/packages/realm-server/tests/realm-endpoints-test.ts +++ b/packages/realm-server/tests/realm-endpoints-test.ts @@ -2452,8 +2452,8 @@ module(basename(__filename), function () { assert.true( json.data[0].attributes.html .replace(/\s+/g, ' ') - .includes('Person Aaron'), - 'embedded html looks correct (CardDef template)', + .includes('Embedded Card Person: Aaron'), + 'embedded html looks correct (Person template)', ); // 2nd card: Person Craig @@ -2461,8 +2461,8 @@ module(basename(__filename), function () { assert.true( json.data[1].attributes.html .replace(/\s+/g, ' ') - .includes('Person Craig'), - 'embedded html for Craig looks correct (CardDef template)', + .includes('Embedded Card Person: Craig'), + 'embedded html for Craig looks correct (Person template)', ); // 3rd card: FancyPerson Jane @@ -2470,8 +2470,8 @@ module(basename(__filename), function () { assert.true( json.data[2].attributes.html .replace(/\s+/g, ' ') - .includes('FancyPerson Jane'), - 'embedded html for Jane looks correct (CardDef template)', + .includes('Embedded Card FancyPerson: Jane'), + 'embedded html for Jane looks correct (FancyPerson template)', ); // 4th card: FancyPerson Jimmy @@ -2479,8 +2479,8 @@ module(basename(__filename), function () { assert.true( json.data[3].attributes.html .replace(/\s+/g, ' ') - .includes('FancyPerson Jimmy'), - 'embedded html for Jimmy looks correct (CardDef template)', + .includes('Embedded Card FancyPerson: Jimmy'), + 'embedded html for Jimmy looks correct (FancyPerson template)', ); assertScopedCssUrlsContain( diff --git a/packages/runtime-common/index-query-engine.ts b/packages/runtime-common/index-query-engine.ts index 95e9708cd2..f1057e82b7 100644 --- a/packages/runtime-common/index-query-engine.ts +++ b/packages/runtime-common/index-query-engine.ts @@ -573,7 +573,9 @@ export class IndexQueryEngine { usedRenderTypeColumnExpression.push( param(internalKeyFor(renderType, undefined)), ); - usedRenderTypeColumnExpression.push(`IS NOT NULL THEN '${internalKeyFor(renderType, undefined)}'`); + usedRenderTypeColumnExpression.push( + `IS NOT NULL THEN '${internalKeyFor(renderType, undefined)}'`, + ); usedRenderTypeColumnExpression.push( `ELSE replace(ANY_VALUE(types[0]::text), '"', '') END`, diff --git a/packages/runtime-common/tests/index-query-engine-test.ts b/packages/runtime-common/tests/index-query-engine-test.ts index a107f9fb5d..25fd60b4b5 100644 --- a/packages/runtime-common/tests/index-query-engine-test.ts +++ b/packages/runtime-common/tests/index-query-engine-test.ts @@ -2571,7 +2571,11 @@ const tests = Object.freeze({ ); assert.strictEqual( prerenderedCards[0].html, - '
Donald (CardDef embedded template)
', + '
Donald (FancyPerson embedded template)
', + ); + assert.strictEqual( + prerenderedCards[0].usedRenderType, + `${testRealmURL}fancy-person/FancyPerson`, ); assert.strictEqual( @@ -2580,7 +2584,11 @@ const tests = Object.freeze({ ); assert.strictEqual( prerenderedCards[1].html, - '
Jimmy (CardDef embedded template)
', + '
Jimmy (Person embedded template)
', + ); + assert.strictEqual( + prerenderedCards[1].usedRenderType, + `${testRealmURL}person/Person`, ); assert.strictEqual( @@ -2589,7 +2597,11 @@ const tests = Object.freeze({ ); assert.strictEqual( prerenderedCards[2].html, - '
Van Gogh (CardDef embedded template)
', + '
Van Gogh (Person embedded template)
', + ); + assert.strictEqual( + prerenderedCards[2].usedRenderType, + `${testRealmURL}person/Person`, ); // Requesting embedded template with ON filter @@ -2628,6 +2640,10 @@ const tests = Object.freeze({ prerenderedCards[0].html, '
Donald (FancyPerson embedded template)
', ); + assert.strictEqual( + prerenderedCards[0].usedRenderType, + `${testRealmURL}fancy-person/FancyPerson`, + ); // Requesting atom template ({ prerenderedCards, meta } = await indexQueryEngine.searchPrerendered( @@ -2653,6 +2669,55 @@ const tests = Object.freeze({ assert.strictEqual(meta.page.total, 1, 'the total results meta is correct'); assert.strictEqual(prerenderedCards[0].url, `${testRealmURL}donald.json`); assert.strictEqual(prerenderedCards[0].html, 'Donald'); // Atom template + assert.strictEqual( + prerenderedCards[0].usedRenderType, + `${testRealmURL}fancy-person/FancyPerson`, + ); + + // Define renderType argument + ({ prerenderedCards, meta } = await indexQueryEngine.searchPrerendered( + new URL(testRealmURL), + { + filter: { + on: { + module: `${testRealmURL}fancy-person`, + name: 'FancyPerson', + }, + not: { + eq: { + name: 'Richard', + }, + }, + }, + }, + loader, + { + htmlFormat: 'embedded', + renderType: { + module: `${testRealmURL}person`, + name: 'Person', + }, + }, + )); + + assert.strictEqual( + prerenderedCards.length, + 1, + 'the actual returned total results are correct (there is only one FancyPerson)', + ); + + assert.strictEqual( + prerenderedCards[0].url, + 'http://test-realm/test/donald.json', + ); + assert.strictEqual( + prerenderedCards[0].html, + '
Donald (Person embedded template)
', + ); + assert.strictEqual( + prerenderedCards[0].usedRenderType, + `${testRealmURL}person/Person`, + ); }, 'can get prerendered cards in an error state from the indexer': async ( From f69e5f2ae067b01cd249da6734529162d11c0c56 Mon Sep 17 00:00:00 2001 From: Fadhlan Ridhwanallah Date: Thu, 30 Jan 2025 22:44:56 +0700 Subject: [PATCH 4/7] Make the query compatible with sqlite --- packages/runtime-common/index-query-engine.ts | 59 +++++++++++++------ 1 file changed, 41 insertions(+), 18 deletions(-) diff --git a/packages/runtime-common/index-query-engine.ts b/packages/runtime-common/index-query-engine.ts index f1057e82b7..3ebe11a961 100644 --- a/packages/runtime-common/index-query-engine.ts +++ b/packages/runtime-common/index-query-engine.ts @@ -29,7 +29,9 @@ import { fieldArity, tableValuedFunctionsPlaceholder, query, + dbExpression, isDbExpression, + DBSpecificExpression, Param, } from './expression'; import { @@ -526,7 +528,7 @@ export class IndexQueryEngine { }: { htmlFormat: 'embedded' | 'fitted' | 'atom' | undefined; renderType?: ResolvedCodeRef; - }): (string | Param)[] { + }): (string | Param | DBSpecificExpression)[] { let fieldName = htmlFormat ? `${htmlFormat}_html` : `atom_html`; if (!htmlFormat || htmlFormat === 'atom') { return [`ANY_VALUE(${fieldName})`]; @@ -540,19 +542,27 @@ export class IndexQueryEngine { htmlColumnExpression.push(','); } - htmlColumnExpression.push(`( - CASE - WHEN ANY_VALUE(${fieldName}) IS NOT NULL - AND jsonb_typeof(ANY_VALUE(${fieldName})) = 'object' - THEN ( - SELECT value - FROM jsonb_each_text(ANY_VALUE(${fieldName})) - WHERE key = ( - SELECT replace(ANY_VALUE(types[0]::text), '"', '') - )) - ELSE NULL - END), - NULL)`); + htmlColumnExpression.push( + ...[ + `( + CASE WHEN ANY_VALUE(${fieldName}) IS NOT NULL AND `, + dbExpression({ + pg: `jsonb_typeof(ANY_VALUE(${fieldName})) = 'object'`, + sqlite: `json_type(ANY_VALUE(${fieldName})) = 'object'`, + }), + ` THEN ( SELECT value FROM `, + dbExpression({ + pg: `jsonb_each_text(ANY_VALUE(${fieldName}))`, + sqlite: `json_each(ANY_VALUE(${fieldName}))`, + }), + ` WHERE key = (SELECT replace(ANY_VALUE( `, + dbExpression({ + pg: `types[0]::text`, + sqlite: `json_extract(types, '$[0]')`, + }), + `), '"', ''))) ELSE NULL END), NULL)`, + ], + ); return htmlColumnExpression; } @@ -563,7 +573,7 @@ export class IndexQueryEngine { }: { htmlFormat: 'embedded' | 'fitted' | 'atom' | undefined; renderType?: ResolvedCodeRef; - }): (string | Param)[] { + }): (string | Param | DBSpecificExpression)[] { let fieldName = htmlFormat ? `${htmlFormat}_html` : `atom_html`; let usedRenderTypeColumnExpression = []; @@ -577,12 +587,25 @@ export class IndexQueryEngine { `IS NOT NULL THEN '${internalKeyFor(renderType, undefined)}'`, ); usedRenderTypeColumnExpression.push( - `ELSE replace(ANY_VALUE(types[0]::text), '"', '') - END`, + ...[ + `ELSE replace(ANY_VALUE(`, + dbExpression({ + pg: `types[0]::text`, + sqlite: `json_extract(types, '$[0]')`, + }), + `), '"', '') END`, + ], ); } else { usedRenderTypeColumnExpression.push( - `replace(ANY_VALUE(types[0]::text), '"', '')`, + ...[ + `replace(ANY_VALUE(`, + dbExpression({ + pg: `types[0]::text`, + sqlite: `json_extract(types, '$[0]')`, + }), + `), '"', '')`, + ], ); } From 14f8022377b4482984e083aafbf693a5d3ad8e46 Mon Sep 17 00:00:00 2001 From: Fadhlan Ridhwanallah Date: Thu, 30 Jan 2025 23:14:00 +0700 Subject: [PATCH 5/7] Return usedRenderType as ResolvedCodeRef --- .../components/operator-mode-test.gts | 3 - packages/runtime-common/index-query-engine.ts | 8 ++- .../tests/index-query-engine-test.ts | 60 +++++++++++-------- 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/packages/host/tests/integration/components/operator-mode-test.gts b/packages/host/tests/integration/components/operator-mode-test.gts index cf1f6190b2..9c937d99b2 100644 --- a/packages/host/tests/integration/components/operator-mode-test.gts +++ b/packages/host/tests/integration/components/operator-mode-test.gts @@ -920,9 +920,6 @@ module('Integration | operator-mode', function (hooks) { assert.dom(`[data-test-stack-card-index="0"]`).exists(); assert.dom(`[data-test-cards-grid-item]`).exists(); - assert - .dom(`[data-test-cards-grid-item="${testRealmURL}BlogPost/1"]`) - .includesText('Blog Post'); assert .dom(`[data-test-cards-grid-item="${testRealmURL}BlogPost/1"] `) .includesText('Outer Space Journey'); diff --git a/packages/runtime-common/index-query-engine.ts b/packages/runtime-common/index-query-engine.ts index 3ebe11a961..85920de480 100644 --- a/packages/runtime-common/index-query-engine.ts +++ b/packages/runtime-common/index-query-engine.ts @@ -135,7 +135,7 @@ interface WIPOptions { export interface PrerenderedCard { url: string; html: string | null; - usedRenderType: string; + usedRenderType: ResolvedCodeRef; isError?: true; } @@ -511,10 +511,14 @@ export class IndexQueryEngine { } }); + let moduleNameSeparatorIndex = card.used_render_type.lastIndexOf('/'); return { url: card.url!, html: card.html, - usedRenderType: card.used_render_type, + usedRenderType: { + module: card.used_render_type.substring(0, moduleNameSeparatorIndex), + name: card.used_render_type.substring(moduleNameSeparatorIndex + 1), + }, ...(card.type === 'error' ? { isError: true as const } : {}), }; }); diff --git a/packages/runtime-common/tests/index-query-engine-test.ts b/packages/runtime-common/tests/index-query-engine-test.ts index 25fd60b4b5..d9fc213af5 100644 --- a/packages/runtime-common/tests/index-query-engine-test.ts +++ b/packages/runtime-common/tests/index-query-engine-test.ts @@ -2320,6 +2320,10 @@ const tests = Object.freeze({ realm_version: 1, realm_url: testRealmURL, deps: [], + types: [ + `${testRealmURL}person/Person`, + 'https://cardstack.com/base/card-api/CardDef', + ], last_modified: '1', resource_created_at: '1', }, @@ -2330,6 +2334,10 @@ const tests = Object.freeze({ realm_version: 1, realm_url: testRealmURL, deps: [], + types: [ + `${testRealmURL}person/Person`, + 'https://cardstack.com/base/card-api/CardDef', + ], last_modified: '3', resource_created_at: '3', }, @@ -2340,6 +2348,10 @@ const tests = Object.freeze({ realm_version: 1, realm_url: testRealmURL, deps: [], + types: [ + `${testRealmURL}person/Person`, + 'https://cardstack.com/base/card-api/CardDef', + ], last_modified: '2', resource_created_at: '2', }, @@ -2573,10 +2585,10 @@ const tests = Object.freeze({ prerenderedCards[0].html, '
Donald (FancyPerson embedded template)
', ); - assert.strictEqual( - prerenderedCards[0].usedRenderType, - `${testRealmURL}fancy-person/FancyPerson`, - ); + assert.deepEqual(prerenderedCards[0].usedRenderType, { + module: `${testRealmURL}fancy-person`, + name: 'FancyPerson', + }); assert.strictEqual( prerenderedCards[1].url, @@ -2586,10 +2598,10 @@ const tests = Object.freeze({ prerenderedCards[1].html, '
Jimmy (Person embedded template)
', ); - assert.strictEqual( - prerenderedCards[1].usedRenderType, - `${testRealmURL}person/Person`, - ); + assert.deepEqual(prerenderedCards[1].usedRenderType, { + module: `${testRealmURL}person`, + name: 'Person', + }); assert.strictEqual( prerenderedCards[2].url, @@ -2599,10 +2611,10 @@ const tests = Object.freeze({ prerenderedCards[2].html, '
Van Gogh (Person embedded template)
', ); - assert.strictEqual( - prerenderedCards[2].usedRenderType, - `${testRealmURL}person/Person`, - ); + assert.deepEqual(prerenderedCards[2].usedRenderType, { + module: `${testRealmURL}person`, + name: 'Person', + }); // Requesting embedded template with ON filter ({ prerenderedCards, meta } = await indexQueryEngine.searchPrerendered( @@ -2640,10 +2652,10 @@ const tests = Object.freeze({ prerenderedCards[0].html, '
Donald (FancyPerson embedded template)
', ); - assert.strictEqual( - prerenderedCards[0].usedRenderType, - `${testRealmURL}fancy-person/FancyPerson`, - ); + assert.deepEqual(prerenderedCards[0].usedRenderType, { + module: `${testRealmURL}fancy-person`, + name: 'FancyPerson', + }); // Requesting atom template ({ prerenderedCards, meta } = await indexQueryEngine.searchPrerendered( @@ -2669,10 +2681,10 @@ const tests = Object.freeze({ assert.strictEqual(meta.page.total, 1, 'the total results meta is correct'); assert.strictEqual(prerenderedCards[0].url, `${testRealmURL}donald.json`); assert.strictEqual(prerenderedCards[0].html, 'Donald'); // Atom template - assert.strictEqual( - prerenderedCards[0].usedRenderType, - `${testRealmURL}fancy-person/FancyPerson`, - ); + assert.deepEqual(prerenderedCards[0].usedRenderType, { + module: `${testRealmURL}fancy-person`, + name: 'FancyPerson', + }); // Define renderType argument ({ prerenderedCards, meta } = await indexQueryEngine.searchPrerendered( @@ -2714,10 +2726,10 @@ const tests = Object.freeze({ prerenderedCards[0].html, '
Donald (Person embedded template)
', ); - assert.strictEqual( - prerenderedCards[0].usedRenderType, - `${testRealmURL}person/Person`, - ); + assert.deepEqual(prerenderedCards[0].usedRenderType, { + module: `${testRealmURL}person`, + name: 'Person', + }); }, 'can get prerendered cards in an error state from the indexer': async ( From cd5cc5f561b00d3e61d2f971cb1c96803af7ba7c Mon Sep 17 00:00:00 2001 From: Fadhlan Ridhwanallah Date: Thu, 30 Jan 2025 23:23:21 +0700 Subject: [PATCH 6/7] remove unnecessary line --- packages/runtime-common/index-query-engine.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/runtime-common/index-query-engine.ts b/packages/runtime-common/index-query-engine.ts index 85920de480..701b0f8c20 100644 --- a/packages/runtime-common/index-query-engine.ts +++ b/packages/runtime-common/index-query-engine.ts @@ -578,12 +578,10 @@ export class IndexQueryEngine { htmlFormat: 'embedded' | 'fitted' | 'atom' | undefined; renderType?: ResolvedCodeRef; }): (string | Param | DBSpecificExpression)[] { - let fieldName = htmlFormat ? `${htmlFormat}_html` : `atom_html`; - let usedRenderTypeColumnExpression = []; if (htmlFormat && htmlFormat !== 'atom' && renderType) { usedRenderTypeColumnExpression.push(`CASE`); - usedRenderTypeColumnExpression.push(`WHEN ANY_VALUE(${fieldName}) ->> `); + usedRenderTypeColumnExpression.push(`WHEN ANY_VALUE(${htmlFormat}_html) ->> `); usedRenderTypeColumnExpression.push( param(internalKeyFor(renderType, undefined)), ); From fe0ba011a3daf2df26769940f507c6bad6c7882f Mon Sep 17 00:00:00 2001 From: Fadhlan Ridhwanallah Date: Fri, 31 Jan 2025 00:00:37 +0700 Subject: [PATCH 7/7] lint fix --- packages/runtime-common/index-query-engine.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/runtime-common/index-query-engine.ts b/packages/runtime-common/index-query-engine.ts index 701b0f8c20..b3df164edb 100644 --- a/packages/runtime-common/index-query-engine.ts +++ b/packages/runtime-common/index-query-engine.ts @@ -581,7 +581,9 @@ export class IndexQueryEngine { let usedRenderTypeColumnExpression = []; if (htmlFormat && htmlFormat !== 'atom' && renderType) { usedRenderTypeColumnExpression.push(`CASE`); - usedRenderTypeColumnExpression.push(`WHEN ANY_VALUE(${htmlFormat}_html) ->> `); + usedRenderTypeColumnExpression.push( + `WHEN ANY_VALUE(${htmlFormat}_html) ->> `, + ); usedRenderTypeColumnExpression.push( param(internalKeyFor(renderType, undefined)), );