52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
/**
|
|
* External dependencies
|
|
*/
|
|
import { z } from 'zod';
|
|
|
|
const headerChoices = [
|
|
{
|
|
slug: 'woocommerce-blocks/header-essential',
|
|
label: 'Essential Header',
|
|
},
|
|
{
|
|
slug: 'woocommerce-blocks/header-centered-menu',
|
|
label: 'Centered Menu with search Header',
|
|
},
|
|
{
|
|
slug: 'woocommerce-blocks/header-minimal',
|
|
label: 'Minimal Header',
|
|
},
|
|
{
|
|
slug: 'woocommerce-blocks/header-large',
|
|
label: 'Large Header',
|
|
},
|
|
];
|
|
|
|
const allowedHeaders: string[] = headerChoices.map( ( header ) => header.slug );
|
|
|
|
export const headerValidator = z.object( {
|
|
slug: z.string().refine( ( slug ) => allowedHeaders.includes( slug ), {
|
|
message: 'Header not part of allowed list',
|
|
} ),
|
|
} );
|
|
|
|
export const defaultHeader = {
|
|
queryId: 'default_header',
|
|
|
|
// make sure version is updated every time the prompt is changed
|
|
version: '2023-09-19',
|
|
prompt: ( businessDescription: string, look: string, tone: string ) => {
|
|
return `
|
|
You are a WordPress theme expert. Analyse the following store description, merchant's chosen look and tone, and determine the most appropriate header.
|
|
Respond only with one header and only its JSON.
|
|
|
|
Chosen look and tone: ${ look } look, ${ tone } tone.
|
|
Business description: ${ businessDescription }
|
|
|
|
Headers to choose from:
|
|
${ JSON.stringify( headerChoices ) }
|
|
`;
|
|
},
|
|
responseValidation: headerValidator.parse,
|
|
};
|