Skip to content

Commit

Permalink
Add Support for Custom Prompts
Browse files Browse the repository at this point in the history
  • Loading branch information
developerkunal committed Jul 24, 2024
1 parent 7e01c42 commit eb57fcd
Show file tree
Hide file tree
Showing 8 changed files with 710 additions and 90 deletions.
76 changes: 63 additions & 13 deletions src/context/directory/handlers/prompts.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
import path from 'path';
import { ensureDirSync } from 'fs-extra';
import { ensureDirSync, readFileSync, writeFileSync } from 'fs-extra';
import { constants } from '../../../tools';
import { existsMustBeDir, dumpJSON, loadJSON, isFile } from '../../../utils';
import { dumpJSON, existsMustBeDir, isFile, loadJSON } from '../../../utils';
import { DirectoryHandler } from '.';
import DirectoryContext from '..';
import { ParsedAsset } from '../../../types';
import {
Prompts,
PromptSettings,
AllPromptsByLanguage,
CustomPartialsConfig,
CustomPartialsPromptTypes,
Prompts,
PromptSettings
} from '../../../tools/auth0/handlers/prompts';
import log from '../../../logger';

type ParsedPrompts = ParsedAsset<'prompts', Prompts>;

const getPromptsDirectory = (filePath: string) => {
return path.join(filePath, constants.PROMPTS_DIRECTORY);
};
const getPromptsDirectory = (filePath: string) => path.join(filePath, constants.PROMPTS_DIRECTORY);

const getPromptsSettingsFile = (promptsDirectory: string) => {
return path.join(promptsDirectory, 'prompts.json');
};
const getPromptsSettingsFile = (promptsDirectory: string) => path.join(promptsDirectory, 'prompts.json');

const getCustomTextFile = (promptsDirectory: string) => path.join(promptsDirectory, 'custom-text.json');

const getCustomTextFile = (promptsDirectory: string) => {
return path.join(promptsDirectory, 'custom-text.json');
const getPartialsFile = (promptsDirectory: string) => {
return path.join(promptsDirectory, 'partials.json');
};

function parse(context: DirectoryContext): ParsedPrompts {
Expand All @@ -47,10 +48,40 @@ function parse(context: DirectoryContext): ParsedPrompts {
}) as AllPromptsByLanguage;
})();

const partials = (() => {
const partialsFile = getPartialsFile(promptsDirectory);
if (!isFile(partialsFile)) return {};
const partialsFileContent = loadJSON(partialsFile, {
mappings: context.mappings,
disableKeywordReplacement: context.disableKeywordReplacement,
}) as CustomPartialsConfig;

return Object.entries(partialsFileContent).reduce((acc, [promptName, items]) => {
acc[promptName] = items.reduce((screenAcc, { name, template }) => {
if (!screenAcc[promptName]) {
screenAcc[promptName] = {};
}

// Read template content from the file
const templateFilePath = path.join(promptsDirectory, template);
if (isFile(templateFilePath)) {
const templateContent = readFileSync(templateFilePath, 'utf8');
if (templateContent.trim()) {
screenAcc[promptName][name] = templateContent;
}
}

return screenAcc;
}, {} as Record<string, Record<string, string>>);
return acc;
}, {} as Record<CustomPartialsPromptTypes, Record<string, Record<string, string>>>);
})();

return {
prompts: {
...promptsSettings,
customText,
partials,
},
};
}
Expand All @@ -60,7 +91,7 @@ async function dump(context: DirectoryContext): Promise<void> {

if (!prompts) return;

const { customText, ...promptsSettings } = prompts;
const { customText, partials, ...promptsSettings } = prompts;

const promptsDirectory = getPromptsDirectory(context.filePath);
ensureDirSync(promptsDirectory);
Expand All @@ -72,6 +103,25 @@ async function dump(context: DirectoryContext): Promise<void> {
if (!customText) return;
const customTextFile = getCustomTextFile(promptsDirectory);
dumpJSON(customTextFile, customText);

if (!partials) return;
const partialsFile = getPartialsFile(promptsDirectory);

// Transform the partials data back to CustomPartialsConfig format
const transformedPartials = Object.entries(partials).reduce((acc, [promptName, screens]) => {
acc[promptName] = Object.entries(screens).map(([, insertionPoints]) => Object.entries(insertionPoints).map(([insertionPoint, template]) => {
const templateFilePath = path.join(promptsDirectory, 'partials', promptName, `${insertionPoint}.liquid`);
ensureDirSync(path.dirname(templateFilePath));
writeFileSync(templateFilePath, template, 'utf8');
return {
name: insertionPoint,
template: path.relative(promptsDirectory, templateFilePath) // Path relative to `promptsDirectory`
};
})).flat(); // Flatten the nested arrays into a single array
return acc;
}, {} as CustomPartialsConfig);

dumpJSON(partialsFile, transformedPartials);
}

const promptsHandler: DirectoryHandler<ParsedPrompts> = {
Expand Down
Loading

0 comments on commit eb57fcd

Please sign in to comment.