@ai-stack/payloadcms 3.0.0-beta.104.4 → 3.0.0-beta.111.1
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.
- package/dist/ai/models/anthropic/generateRichText.d.ts.map +1 -1
- package/dist/ai/models/anthropic/generateRichText.js +2 -2
- package/dist/ai/models/anthropic/generateRichText.js.map +1 -1
- package/dist/ai/models/anthropic/index.d.ts.map +1 -1
- package/dist/ai/models/anthropic/index.js +0 -25
- package/dist/ai/models/anthropic/index.js.map +1 -1
- package/dist/ai/models/elevenLabs/index.js.map +1 -1
- package/dist/ai/models/openai/generateRichText.js +2 -2
- package/dist/ai/models/openai/generateRichText.js.map +1 -1
- package/dist/ai/models/openai/index.d.ts.map +1 -1
- package/dist/ai/models/openai/index.js +0 -27
- package/dist/ai/models/openai/index.js.map +1 -1
- package/dist/ai/prompts.js +1 -1
- package/dist/ai/prompts.js.map +1 -1
- package/dist/ai/schemas/lexicalJsonSchema.d.ts +2 -0
- package/dist/ai/schemas/lexicalJsonSchema.d.ts.map +1 -0
- package/dist/ai/schemas/lexicalJsonSchema.js +317 -0
- package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -0
- package/dist/ai/utils/generateFileNameByPrompt.js.map +1 -1
- package/dist/ai/utils/systemGenerate.d.ts +5 -0
- package/dist/ai/utils/systemGenerate.d.ts.map +1 -0
- package/dist/ai/utils/{generateSeedPrompt.js → systemGenerate.js} +2 -2
- package/dist/ai/utils/systemGenerate.js.map +1 -0
- package/dist/collections/Instructions.d.ts +1 -1
- package/dist/collections/Instructions.d.ts.map +1 -1
- package/dist/collections/Instructions.js +177 -85
- package/dist/collections/Instructions.js.map +1 -1
- package/dist/defaults.d.ts +1 -1
- package/dist/defaults.d.ts.map +1 -1
- package/dist/defaults.js +1 -1
- package/dist/defaults.js.map +1 -1
- package/dist/endpoints/fetchFields.d.ts +3 -0
- package/dist/endpoints/fetchFields.d.ts.map +1 -0
- package/dist/endpoints/fetchFields.js +21 -0
- package/dist/endpoints/fetchFields.js.map +1 -0
- package/dist/endpoints/index.d.ts.map +1 -1
- package/dist/endpoints/index.js +12 -17
- package/dist/endpoints/index.js.map +1 -1
- package/dist/fields/LexicalEditor/ComposeFeatureComponent.d.ts.map +1 -1
- package/dist/fields/LexicalEditor/ComposeFeatureComponent.js +1 -0
- package/dist/fields/LexicalEditor/ComposeFeatureComponent.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +11 -15
- package/dist/init.js.map +1 -1
- package/dist/libraries/autocomplete/AutocompleteTextArea.js.map +1 -1
- package/dist/libraries/handlebars/helpers.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +9 -34
- package/dist/plugin.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.d.ts.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.js +8 -6
- package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
- package/dist/providers/InstructionsProvider/useInstructions.js +1 -1
- package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/ui/Compose/Compose.d.ts.map +1 -1
- package/dist/ui/Compose/Compose.js +6 -4
- package/dist/ui/Compose/Compose.js.map +1 -1
- package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/useGenerate.d.ts.map +1 -1
- package/dist/ui/Compose/hooks/useGenerate.js +15 -16
- package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
- package/dist/ui/Compose/hooks/useHistory.js +1 -1
- package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
- package/dist/utilities/updateFieldsConfig.d.ts.map +1 -1
- package/dist/utilities/updateFieldsConfig.js +6 -4
- package/dist/utilities/updateFieldsConfig.js.map +1 -1
- package/package.json +6 -9
- package/dist/ai/schemas/lexical.schema.d.ts +0 -31
- package/dist/ai/schemas/lexical.schema.d.ts.map +0 -1
- package/dist/ai/schemas/lexical.schema.js +0 -102
- package/dist/ai/schemas/lexical.schema.js.map +0 -1
- package/dist/ai/utils/generateSeedPrompt.d.ts +0 -5
- package/dist/ai/utils/generateSeedPrompt.d.ts.map +0 -1
- package/dist/ai/utils/generateSeedPrompt.js.map +0 -1
- package/dist/utilities/jsonToZod.d.ts +0 -3
- package/dist/utilities/jsonToZod.d.ts.map +0 -1
- package/dist/utilities/jsonToZod.js +0 -33
- package/dist/utilities/jsonToZod.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/collections/Instructions.ts"],"sourcesContent":["import type { CollectionConfig, GroupField } from 'payload'\n\nimport { GenerationModels } from '../ai/models/index.js'\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\n\nconst groupSettings = GenerationModels.reduce((fields, model) => {\n if (model.settings) {\n fields.push(model.settings)\n }\n return fields\n}, [] as GroupField[])\n\nconst modelOptions = GenerationModels.map((model) => {\n return {\n fields: model.fields,\n label: model.name,\n value: model.id,\n }\n})\n\
|
|
1
|
+
{"version":3,"sources":["../../src/collections/Instructions.ts"],"sourcesContent":["import type { CollectionConfig, GroupField } from 'payload'\n\nimport { GenerationModels } from '../ai/models/index.js'\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\n\nconst groupSettings = GenerationModels.reduce((fields, model) => {\n if (model.settings) {\n fields.push(model.settings)\n }\n return fields\n}, [] as GroupField[])\n\nconst modelOptions = GenerationModels.map((model) => {\n return {\n fields: model.fields,\n label: model.name,\n value: model.id,\n }\n})\n\nconst defaultAccessConfig = {\n create: () => true,\n read: () => true,\n update: () => true,\n}\n\nconst defaultAdminConfig = {\n group: 'Plugins',\n hidden: true,\n}\n\nexport const instructionsCollection = (options?: Partial<CollectionConfig>) =>\n <CollectionConfig>{\n slug: PLUGIN_INSTRUCTIONS_TABLE,\n access: {\n ...defaultAccessConfig,\n ...options?.access,\n },\n admin: {\n ...defaultAdminConfig,\n ...options?.admin,\n group: 'Plugins',\n },\n fields: [\n {\n name: 'schema-path',\n type: 'text',\n admin: {\n readOnly: true,\n },\n unique: true,\n },\n {\n name: 'field-type',\n type: 'select',\n admin: {\n readOnly: true,\n },\n defaultValue: 'text',\n label: 'Field type',\n options: [\n {\n label: 'text',\n value: 'text',\n },\n {\n label: 'textarea',\n value: 'textarea',\n },\n {\n label: 'upload',\n value: 'upload',\n },\n {\n label: 'richText',\n value: 'richText',\n },\n ],\n },\n {\n name: 'relation-to',\n type: 'text',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'upload'\n },\n },\n label: 'Relation to',\n },\n {\n name: 'model-id',\n type: 'select',\n admin: {\n components: {\n Field: {\n clientProps: {\n filterByField: 'field-type',\n options: modelOptions,\n },\n path: '@ai-stack/payloadcms/fields#SelectField',\n },\n },\n },\n label: 'Model',\n options: modelOptions.map((option) => {\n return {\n label: option.label,\n value: option.value,\n }\n }),\n },\n {\n id: 'ai-prompts-tabs',\n type: 'tabs',\n tabs: [\n {\n description: 'This will appear within the tab above the fields.',\n fields: [\n {\n name: 'prompt',\n type: 'textarea',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/fields#PromptEditorField',\n },\n },\n label: '',\n },\n ],\n label: 'Prompt',\n },\n {\n description: 'This will appear within the tab above the fields. sys',\n fields: [\n {\n name: 'system',\n type: 'textarea',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n defaultValue: `INSTRUCTIONS:\nYou are a highly skilled and professional blog writer,\nrenowned for crafting engaging and well-organized articles.\nWhen given a title, you meticulously create blogs that are not only\ninformative and accurate but also captivating and beautifully structured.`,\n label: '',\n },\n ],\n label: 'System prompt',\n },\n {\n // Note: Update when tabs PR is merged: https://github.com/payloadcms/payload/pull/8406\n // admin: {\n // condition: (_, current) => {\n // console.log('condition in tab', current)\n // return current['field-type'] === 'richText'\n // },\n // },\n description: 'This will appear within the tab above the fields. Layout',\n fields: [\n {\n /**TODO's:\n * - Layouts can be saved in as an array\n * - user can add their own layout to collections and use it later for generate specific rich text\n * - user can select previously added layout\n */\n name: 'layout',\n type: 'textarea',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n defaultValue: `[paragraph] - Write a concise introduction (2-3 sentences) that outlines the main topic.\n[horizontalrule] - Insert a horizontal rule to separate the introduction from the main content.\n[list] - Create a list with 3-5 items. Each list item should contain:\n a. [heading] - A brief, descriptive heading (up to 5 words)\n b. [paragraph] - A short explanation or elaboration (1-2 sentences)\n[horizontalrule] - Insert another horizontal rule to separate the main content from the conclusion.\n[paragraph] - Compose a brief conclusion (2-3 sentences) summarizing the key points.\n[quote] - Include a relevant quote from a famous person, directly related to the topic. Format: \"Quote text.\" - Author Name`,\n label: '',\n },\n ],\n label: 'Layout',\n },\n ],\n },\n ...groupSettings,\n ],\n labels: {\n plural: 'Compose Settings',\n singular: 'Compose Setting',\n },\n }\n"],"names":["GenerationModels","PLUGIN_INSTRUCTIONS_TABLE","groupSettings","reduce","fields","model","settings","push","modelOptions","map","label","name","value","id","defaultAccessConfig","create","read","update","defaultAdminConfig","group","hidden","instructionsCollection","options","slug","access","admin","type","readOnly","unique","defaultValue","condition","_","current","components","Field","clientProps","filterByField","path","option","tabs","description","labels","plural","singular"],"mappings":"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"}
|
package/dist/defaults.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export declare const PLUGIN_NAME = "plugin-ai";
|
|
2
2
|
export declare const PLUGIN_INSTRUCTIONS_TABLE = "plugin-ai-instructions";
|
|
3
|
-
export declare const PLUGIN_INSTRUCTIONS_MAP_GLOBAL = "plugin-ai-instructions-map";
|
|
4
3
|
export declare const PLUGIN_LEXICAL_EDITOR_FEATURE = "plugin-ai-actions-feature";
|
|
5
4
|
export declare const PLUGIN_API_ENDPOINT_BASE = "/plugin-ai";
|
|
6
5
|
export declare const PLUGIN_API_ENDPOINT_GENERATE = "/plugin-ai/generate";
|
|
7
6
|
export declare const PLUGIN_API_ENDPOINT_GENERATE_UPLOAD = "/plugin-ai/generate/upload";
|
|
7
|
+
export declare const PLUGIN_FETCH_FIELDS_ENDPOINT = "/plugin-ai/fetch-fields";
|
|
8
8
|
export declare const PLUGIN_DEFAULT_OPENAI_MODEL = "gpt-4o-mini";
|
|
9
9
|
export declare const PLUGIN_DEFAULT_ANTHROPIC_MODEL = "claude-3-sonnet-20240229";
|
|
10
10
|
//# sourceMappingURL=defaults.d.ts.map
|
package/dist/defaults.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,cAAc,CAAA;AACtC,eAAO,MAAM,yBAAyB,2BAAgC,CAAA;AACtE,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,cAAc,CAAA;AACtC,eAAO,MAAM,yBAAyB,2BAAgC,CAAA;AACtE,eAAO,MAAM,6BAA6B,8BAAmC,CAAA;AAG7E,eAAO,MAAM,wBAAwB,eAAoB,CAAA;AACzD,eAAO,MAAM,4BAA4B,wBAAyC,CAAA;AAClF,eAAO,MAAM,mCAAmC,+BAA2C,CAAA;AAC3F,eAAO,MAAM,4BAA4B,4BAA6C,CAAA;AAGtF,eAAO,MAAM,2BAA2B,gBAAgB,CAAA;AACxD,eAAO,MAAM,8BAA8B,6BAA6B,CAAA"}
|
package/dist/defaults.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export const PLUGIN_NAME = 'plugin-ai';
|
|
2
2
|
export const PLUGIN_INSTRUCTIONS_TABLE = `${PLUGIN_NAME}-instructions`;
|
|
3
|
-
export const PLUGIN_INSTRUCTIONS_MAP_GLOBAL = `${PLUGIN_INSTRUCTIONS_TABLE}-map`;
|
|
4
3
|
export const PLUGIN_LEXICAL_EDITOR_FEATURE = `${PLUGIN_NAME}-actions-feature`;
|
|
5
4
|
// Endpoint defaults
|
|
6
5
|
export const PLUGIN_API_ENDPOINT_BASE = `/${PLUGIN_NAME}`;
|
|
7
6
|
export const PLUGIN_API_ENDPOINT_GENERATE = `${PLUGIN_API_ENDPOINT_BASE}/generate`;
|
|
8
7
|
export const PLUGIN_API_ENDPOINT_GENERATE_UPLOAD = `${PLUGIN_API_ENDPOINT_GENERATE}/upload`;
|
|
8
|
+
export const PLUGIN_FETCH_FIELDS_ENDPOINT = `${PLUGIN_API_ENDPOINT_BASE}/fetch-fields`;
|
|
9
9
|
// LLM Settings
|
|
10
10
|
export const PLUGIN_DEFAULT_OPENAI_MODEL = `gpt-4o-mini`;
|
|
11
11
|
export const PLUGIN_DEFAULT_ANTHROPIC_MODEL = `claude-3-sonnet-20240229`;
|
package/dist/defaults.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/defaults.ts"],"sourcesContent":["export const PLUGIN_NAME = 'plugin-ai'\nexport const PLUGIN_INSTRUCTIONS_TABLE = `${PLUGIN_NAME}-instructions`\nexport const
|
|
1
|
+
{"version":3,"sources":["../src/defaults.ts"],"sourcesContent":["export const PLUGIN_NAME = 'plugin-ai'\nexport const PLUGIN_INSTRUCTIONS_TABLE = `${PLUGIN_NAME}-instructions`\nexport const PLUGIN_LEXICAL_EDITOR_FEATURE = `${PLUGIN_NAME}-actions-feature`\n\n// Endpoint defaults\nexport const PLUGIN_API_ENDPOINT_BASE = `/${PLUGIN_NAME}`\nexport const PLUGIN_API_ENDPOINT_GENERATE = `${PLUGIN_API_ENDPOINT_BASE}/generate`\nexport const PLUGIN_API_ENDPOINT_GENERATE_UPLOAD = `${PLUGIN_API_ENDPOINT_GENERATE}/upload`\nexport const PLUGIN_FETCH_FIELDS_ENDPOINT = `${PLUGIN_API_ENDPOINT_BASE}/fetch-fields`\n\n// LLM Settings\nexport const PLUGIN_DEFAULT_OPENAI_MODEL = `gpt-4o-mini`\nexport const PLUGIN_DEFAULT_ANTHROPIC_MODEL = `claude-3-sonnet-20240229`\n"],"names":["PLUGIN_NAME","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_LEXICAL_EDITOR_FEATURE","PLUGIN_API_ENDPOINT_BASE","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_FETCH_FIELDS_ENDPOINT","PLUGIN_DEFAULT_OPENAI_MODEL","PLUGIN_DEFAULT_ANTHROPIC_MODEL"],"mappings":"AAAA,OAAO,MAAMA,cAAc,YAAW;AACtC,OAAO,MAAMC,4BAA4B,GAAGD,YAAY,aAAa,CAAC,CAAA;AACtE,OAAO,MAAME,gCAAgC,GAAGF,YAAY,gBAAgB,CAAC,CAAA;AAE7E,oBAAoB;AACpB,OAAO,MAAMG,2BAA2B,CAAC,CAAC,EAAEH,aAAa,CAAA;AACzD,OAAO,MAAMI,+BAA+B,GAAGD,yBAAyB,SAAS,CAAC,CAAA;AAClF,OAAO,MAAME,sCAAsC,GAAGD,6BAA6B,OAAO,CAAC,CAAA;AAC3F,OAAO,MAAME,+BAA+B,GAAGH,yBAAyB,aAAa,CAAC,CAAA;AAEtF,eAAe;AACf,OAAO,MAAMI,8BAA8B,CAAC,WAAW,CAAC,CAAA;AACxD,OAAO,MAAMC,iCAAiC,CAAC,wBAAwB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchFields.d.ts","sourceRoot":"","sources":["../../src/endpoints/fetchFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,SAAS,CAAA;AAIvD,eAAO,MAAM,WAAW,EAAE,QAmBzB,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { PLUGIN_FETCH_FIELDS_ENDPOINT, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js';
|
|
2
|
+
export const fetchFields = {
|
|
3
|
+
handler: async (req)=>{
|
|
4
|
+
const { docs = [] } = await req.payload.find({
|
|
5
|
+
collection: PLUGIN_INSTRUCTIONS_TABLE,
|
|
6
|
+
pagination: false
|
|
7
|
+
});
|
|
8
|
+
const fieldMap = {};
|
|
9
|
+
docs.forEach((doc)=>{
|
|
10
|
+
fieldMap[doc['schema-path']] = {
|
|
11
|
+
id: doc.id,
|
|
12
|
+
fieldType: doc['field-type']
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
return Response.json(fieldMap);
|
|
16
|
+
},
|
|
17
|
+
method: 'get',
|
|
18
|
+
path: PLUGIN_FETCH_FIELDS_ENDPOINT
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=fetchFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/endpoints/fetchFields.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from 'payload'\n\nimport { PLUGIN_FETCH_FIELDS_ENDPOINT, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\n\nexport const fetchFields: Endpoint = {\n handler: async (req: PayloadRequest) => {\n const { docs = [] } = await req.payload.find({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n pagination: false,\n })\n\n const fieldMap = {}\n docs.forEach((doc) => {\n fieldMap[doc['schema-path']] = {\n id: doc.id,\n fieldType: doc['field-type'],\n }\n })\n\n return Response.json(fieldMap)\n },\n method: 'get',\n path: PLUGIN_FETCH_FIELDS_ENDPOINT,\n}\n"],"names":["PLUGIN_FETCH_FIELDS_ENDPOINT","PLUGIN_INSTRUCTIONS_TABLE","fetchFields","handler","req","docs","payload","find","collection","pagination","fieldMap","forEach","doc","id","fieldType","Response","json","method","path"],"mappings":"AAEA,SAASA,4BAA4B,EAAEC,yBAAyB,QAAQ,iBAAgB;AAExF,OAAO,MAAMC,cAAwB;IACnCC,SAAS,OAAOC;QACd,MAAM,EAAEC,OAAO,EAAE,EAAE,GAAG,MAAMD,IAAIE,OAAO,CAACC,IAAI,CAAC;YAC3CC,YAAYP;YACZQ,YAAY;QACd;QAEA,MAAMC,WAAW,CAAC;QAClBL,KAAKM,OAAO,CAAC,CAACC;YACZF,QAAQ,CAACE,GAAG,CAAC,cAAc,CAAC,GAAG;gBAC7BC,IAAID,IAAIC,EAAE;gBACVC,WAAWF,GAAG,CAAC,aAAa;YAC9B;QACF;QAEA,OAAOG,SAASC,IAAI,CAACN;IACvB;IACAO,QAAQ;IACRC,MAAMlB;AACR,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/endpoints/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,SAAS,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/endpoints/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,SAAS,EAAE,MAAM,aAAa,CAAA;AAuE7D,eAAO,MAAM,SAAS,EAAE,SA2HvB,CAAA"}
|
package/dist/endpoints/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { lexicalSchema } from '../ai/schemas/lexical.schema.js';
|
|
2
1
|
import { GenerationModels } from '../ai/models/index.js';
|
|
3
2
|
import { defaultPrompts } from '../ai/prompts.js';
|
|
4
3
|
import { PLUGIN_API_ENDPOINT_GENERATE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD, PLUGIN_INSTRUCTIONS_TABLE, PLUGIN_NAME } from '../defaults.js';
|
|
@@ -9,9 +8,10 @@ const assignPrompt = async (action, { type, actionParams, context, field, layout
|
|
|
9
8
|
const prompt = await replacePlaceholders(template, context);
|
|
10
9
|
const toLexicalHTML = type === 'richText' ? handlebarsHelpersMap.toHTML.name : '';
|
|
11
10
|
const assignedPrompts = {
|
|
12
|
-
layout,
|
|
11
|
+
layout: type === 'richText' ? layout : undefined,
|
|
13
12
|
prompt,
|
|
14
|
-
|
|
13
|
+
//TODO: Define only once on a collection level
|
|
14
|
+
system: type === 'richText' ? systemPrompt : undefined
|
|
15
15
|
};
|
|
16
16
|
if (action === 'Compose') {
|
|
17
17
|
return assignedPrompts;
|
|
@@ -49,7 +49,8 @@ export const endpoints = {
|
|
|
49
49
|
});
|
|
50
50
|
const { collections } = req.payload.config;
|
|
51
51
|
const collection = collections.find((collection)=>collection.slug === PLUGIN_INSTRUCTIONS_TABLE);
|
|
52
|
-
const {
|
|
52
|
+
const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin;
|
|
53
|
+
const { schema: editorSchema = {} } = editorConfig;
|
|
53
54
|
const { prompt: promptTemplate = '' } = instructions;
|
|
54
55
|
const schemaPath = instructions['schema-path'];
|
|
55
56
|
const fieldName = schemaPath?.split('.').pop();
|
|
@@ -59,29 +60,24 @@ export const endpoints = {
|
|
|
59
60
|
return l.code === locale;
|
|
60
61
|
});
|
|
61
62
|
const localeInfo = localeData?.label[defaultLocale] || locale;
|
|
62
|
-
|
|
63
|
-
const opt = {
|
|
64
|
-
locale: localeInfo,
|
|
65
|
-
modelId: instructions['model-id']
|
|
66
|
-
};
|
|
67
|
-
const model = GenerationModels.find((model)=>model.id === opt.modelId);
|
|
63
|
+
const model = GenerationModels.find((model)=>model.id === instructions['model-id']);
|
|
68
64
|
const settingsName = model.settings?.name;
|
|
69
|
-
const modelOptions = instructions[settingsName];
|
|
65
|
+
const modelOptions = instructions[settingsName] || {};
|
|
70
66
|
const prompts = await assignPrompt(action, {
|
|
71
67
|
type: instructions['field-type'],
|
|
72
68
|
actionParams,
|
|
73
69
|
context: contextData,
|
|
74
70
|
field: fieldName,
|
|
75
|
-
layout:
|
|
76
|
-
systemPrompt:
|
|
71
|
+
layout: instructions.layout,
|
|
72
|
+
systemPrompt: instructions.system,
|
|
77
73
|
template: promptTemplate
|
|
78
74
|
});
|
|
79
75
|
console.log('Running handler with prompts:', prompts);
|
|
80
76
|
return model.handler?.(prompts.prompt, {
|
|
81
77
|
...modelOptions,
|
|
82
|
-
...opt,
|
|
83
78
|
editorSchema,
|
|
84
79
|
layout: prompts.layout,
|
|
80
|
+
locale: localeInfo,
|
|
85
81
|
system: prompts.system
|
|
86
82
|
}).catch((error)=>{
|
|
87
83
|
console.error('Error: endpoint - generating text:', error);
|
|
@@ -97,7 +93,7 @@ export const endpoints = {
|
|
|
97
93
|
handler: async (req)=>{
|
|
98
94
|
const data = await req.json?.();
|
|
99
95
|
const { options } = data;
|
|
100
|
-
const { instructionId
|
|
96
|
+
const { instructionId } = options;
|
|
101
97
|
const contextData = data.doc;
|
|
102
98
|
let instructions = {
|
|
103
99
|
'model-id': '',
|
|
@@ -115,11 +111,10 @@ export const endpoints = {
|
|
|
115
111
|
registerEditorHelper(req.payload, schemaPath);
|
|
116
112
|
const text = await replacePlaceholders(promptTemplate, contextData);
|
|
117
113
|
const modelId = instructions['model-id'];
|
|
118
|
-
|
|
114
|
+
const uploadCollectionSlug = instructions['relation-to'];
|
|
119
115
|
const model = GenerationModels.find((model)=>model.id === modelId);
|
|
120
116
|
const settingsName = model.settings?.name;
|
|
121
117
|
const modelOptions = instructions[settingsName] || {};
|
|
122
|
-
console.log('modelOptions', modelOptions);
|
|
123
118
|
const result = await model.handler?.(text, modelOptions);
|
|
124
119
|
const assetData = await req.payload.create({
|
|
125
120
|
collection: uploadCollectionSlug,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/endpoints/index.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport type { ActionMenuItems, Endpoints } from '../types.js'\n\nimport { lexicalSchema } from '../ai/schemas/lexical.schema.js'\nimport { GenerationModels } from '../ai/models/index.js'\nimport { defaultPrompts } from '../ai/prompts.js'\nimport {\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../defaults.js'\nimport { registerEditorHelper } from '../libraries/handlebars/helpers.js'\nimport { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\n\nconst assignPrompt = async (\n action: ActionMenuItems,\n {\n type,\n actionParams,\n context,\n field,\n layout,\n systemPrompt = '',\n template,\n }: {\n actionParams: Record<any, any>\n context: object\n field: string\n layout: string\n systemPrompt: string\n template: string\n type: string\n },\n) => {\n const prompt = await replacePlaceholders(template, context)\n const toLexicalHTML = type === 'richText' ? handlebarsHelpersMap.toHTML.name : ''\n const assignedPrompts = {\n layout,\n prompt,\n system: systemPrompt,\n }\n\n if (action === 'Compose') {\n return assignedPrompts\n }\n\n const { layout: getLayout, system: getSystemPrompt } = defaultPrompts.find(\n (p) => p.name === action,\n )\n\n let updatedLayout = layout\n if (getLayout) {\n updatedLayout = getLayout()\n }\n\n const system = getSystemPrompt({\n ...(actionParams || {}),\n prompt,\n systemPrompt,\n })\n\n return {\n layout: updatedLayout,\n // TODO: revisit this toLexicalHTML\n prompt: await replacePlaceholders(`{{${toLexicalHTML} ${field}}}`, context),\n system,\n }\n}\n\nexport const endpoints: Endpoints = {\n textarea: {\n handler: async (req: PayloadRequest) => {\n const data = await req.json?.()\n\n const { locale = 'en', options } = data\n const { action, actionParams, instructionId } = options\n const contextData = data.doc\n\n if (!instructionId) {\n throw new Error(\n `Instruction ID is required for \"${PLUGIN_NAME}\" to work, please check your configuration`,\n )\n }\n\n const instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const { collections } = req.payload.config\n const collection = collections.find(\n (collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE,\n )\n\n const { editorConfig: { schema: editorSchema = lexicalSchema() } = {} } =\n collection.custom || {}\n\n const { prompt: promptTemplate = '' } = instructions\n\n const schemaPath = instructions['schema-path'] as string\n const fieldName = schemaPath?.split('.').pop()\n\n registerEditorHelper(req.payload, schemaPath)\n\n const { defaultLocale, locales = [] } = req.payload.config.localization || {}\n const localeData = locales.find((l) => {\n return l.code === locale\n })\n\n const localeInfo = localeData?.label[defaultLocale] || locale\n\n //TODO: remove this\n const opt = {\n locale: localeInfo,\n modelId: instructions['model-id'],\n }\n\n const model = GenerationModels.find((model) => model.id === opt.modelId)\n const settingsName = model.settings?.name\n const modelOptions = instructions[settingsName] as {\n layout: string\n system: string\n }\n\n const prompts = await assignPrompt(action, {\n type: instructions['field-type'] as string,\n actionParams,\n context: contextData,\n field: fieldName,\n layout: modelOptions.layout,\n systemPrompt: modelOptions.system,\n template: promptTemplate as string,\n })\n\n console.log('Running handler with prompts:', prompts)\n return model\n .handler?.(prompts.prompt, {\n ...modelOptions,\n ...opt,\n editorSchema,\n layout: prompts.layout,\n system: prompts.system,\n })\n .catch((error) => {\n console.error('Error: endpoint - generating text:', error)\n return new Response(JSON.stringify(error.message), { status: 500 })\n })\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE,\n },\n upload: {\n handler: async (req: PayloadRequest) => {\n const data = await req.json?.()\n\n const { options } = data\n const { instructionId, uploadCollectionSlug } = options\n const contextData = data.doc\n\n let instructions = { 'model-id': '', prompt: '' }\n\n if (instructionId) {\n // @ts-expect-error\n instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n })\n }\n\n const { prompt: promptTemplate = '' } = instructions\n const schemaPath = instructions['schema-path']\n\n registerEditorHelper(req.payload, schemaPath)\n\n const text = await replacePlaceholders(promptTemplate, contextData)\n const modelId = instructions['model-id']\n console.log('prompt text:', text)\n\n const model = GenerationModels.find((model) => model.id === modelId)\n const settingsName = model.settings?.name\n const modelOptions = instructions[settingsName] || {}\n console.log('modelOptions', modelOptions)\n\n const result = await model.handler?.(text, modelOptions)\n\n const assetData = await req.payload.create({\n collection: uploadCollectionSlug,\n data: result.data,\n file: result.file,\n })\n\n return new Response(\n JSON.stringify({\n result: {\n id: assetData.id,\n alt: assetData.alt,\n },\n }),\n )\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n },\n}\n"],"names":["lexicalSchema","GenerationModels","defaultPrompts","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","registerEditorHelper","handlebarsHelpersMap","replacePlaceholders","assignPrompt","action","type","actionParams","context","field","layout","systemPrompt","template","prompt","toLexicalHTML","toHTML","name","assignedPrompts","system","getLayout","getSystemPrompt","find","p","updatedLayout","endpoints","textarea","handler","req","data","json","locale","options","instructionId","contextData","doc","Error","instructions","payload","findByID","id","collection","collections","config","slug","editorConfig","schema","editorSchema","custom","promptTemplate","schemaPath","fieldName","split","pop","defaultLocale","locales","localization","localeData","l","code","localeInfo","label","opt","modelId","model","settingsName","settings","modelOptions","prompts","console","log","catch","error","Response","JSON","stringify","message","status","method","path","upload","uploadCollectionSlug","text","result","assetData","create","file","alt"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/endpoints/index.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport type { ActionMenuItems, Endpoints } from '../types.js'\n\nimport { GenerationModels } from '../ai/models/index.js'\nimport { defaultPrompts } from '../ai/prompts.js'\nimport {\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../defaults.js'\nimport { registerEditorHelper } from '../libraries/handlebars/helpers.js'\nimport { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\n\nconst assignPrompt = async (\n action: ActionMenuItems,\n {\n type,\n actionParams,\n context,\n field,\n layout,\n systemPrompt = '',\n template,\n }: {\n actionParams: Record<any, any>\n context: object\n field: string\n layout: string\n systemPrompt: string\n template: string\n type: string\n },\n) => {\n const prompt = await replacePlaceholders(template, context)\n const toLexicalHTML = type === 'richText' ? handlebarsHelpersMap.toHTML.name : ''\n\n const assignedPrompts = {\n layout: type === 'richText' ? layout : undefined,\n prompt,\n //TODO: Define only once on a collection level\n system: type === 'richText' ? systemPrompt : undefined,\n }\n\n if (action === 'Compose') {\n return assignedPrompts\n }\n\n const { layout: getLayout, system: getSystemPrompt } = defaultPrompts.find(\n (p) => p.name === action,\n )\n\n let updatedLayout = layout\n if (getLayout) {\n updatedLayout = getLayout()\n }\n\n const system = getSystemPrompt({\n ...(actionParams || {}),\n prompt,\n systemPrompt,\n })\n\n return {\n layout: updatedLayout,\n // TODO: revisit this toLexicalHTML\n prompt: await replacePlaceholders(`{{${toLexicalHTML} ${field}}}`, context),\n system,\n }\n}\n\nexport const endpoints: Endpoints = {\n textarea: {\n handler: async (req: PayloadRequest) => {\n const data = await req.json?.()\n\n const { locale = 'en', options } = data\n const { action, actionParams, instructionId } = options\n const contextData = data.doc\n\n if (!instructionId) {\n throw new Error(\n `Instruction ID is required for \"${PLUGIN_NAME}\" to work, please check your configuration`,\n )\n }\n\n const instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const { collections } = req.payload.config\n const collection = collections.find(\n (collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE,\n )\n\n const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin\n const { schema: editorSchema = {} } = editorConfig\n const { prompt: promptTemplate = '' } = instructions\n\n const schemaPath = instructions['schema-path'] as string\n const fieldName = schemaPath?.split('.').pop()\n\n registerEditorHelper(req.payload, schemaPath)\n\n const { defaultLocale, locales = [] } = req.payload.config.localization || {}\n const localeData = locales.find((l) => {\n return l.code === locale\n })\n\n const localeInfo = localeData?.label[defaultLocale] || locale\n\n const model = GenerationModels.find((model) => model.id === instructions['model-id'])\n const settingsName = model.settings?.name\n const modelOptions = instructions[settingsName] || {}\n\n const prompts = await assignPrompt(action, {\n type: instructions['field-type'] as string,\n actionParams,\n context: contextData,\n field: fieldName,\n layout: instructions.layout,\n systemPrompt: instructions.system,\n template: promptTemplate as string,\n })\n\n console.log('Running handler with prompts:', prompts)\n return model\n .handler?.(prompts.prompt, {\n ...modelOptions,\n editorSchema,\n layout: prompts.layout,\n locale: localeInfo,\n system: prompts.system,\n })\n .catch((error) => {\n console.error('Error: endpoint - generating text:', error)\n return new Response(JSON.stringify(error.message), { status: 500 })\n })\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE,\n },\n upload: {\n handler: async (req: PayloadRequest) => {\n const data = await req.json?.()\n\n const { options } = data\n const { instructionId } = options\n const contextData = data.doc\n\n let instructions = { 'model-id': '', prompt: '' }\n\n if (instructionId) {\n // @ts-expect-error\n instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n })\n }\n\n const { prompt: promptTemplate = '' } = instructions\n const schemaPath = instructions['schema-path']\n\n registerEditorHelper(req.payload, schemaPath)\n\n const text = await replacePlaceholders(promptTemplate, contextData)\n const modelId = instructions['model-id']\n const uploadCollectionSlug = instructions['relation-to']\n\n const model = GenerationModels.find((model) => model.id === modelId)\n const settingsName = model.settings?.name\n const modelOptions = instructions[settingsName] || {}\n\n const result = await model.handler?.(text, modelOptions)\n\n const assetData = await req.payload.create({\n collection: uploadCollectionSlug,\n data: result.data,\n file: result.file,\n })\n\n return new Response(\n JSON.stringify({\n result: {\n id: assetData.id,\n alt: assetData.alt,\n },\n }),\n )\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n },\n}\n"],"names":["GenerationModels","defaultPrompts","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","registerEditorHelper","handlebarsHelpersMap","replacePlaceholders","assignPrompt","action","type","actionParams","context","field","layout","systemPrompt","template","prompt","toLexicalHTML","toHTML","name","assignedPrompts","undefined","system","getLayout","getSystemPrompt","find","p","updatedLayout","endpoints","textarea","handler","req","data","json","locale","options","instructionId","contextData","doc","Error","instructions","payload","findByID","id","collection","collections","config","slug","custom","editorConfig","admin","schema","editorSchema","promptTemplate","schemaPath","fieldName","split","pop","defaultLocale","locales","localization","localeData","l","code","localeInfo","label","model","settingsName","settings","modelOptions","prompts","console","log","catch","error","Response","JSON","stringify","message","status","method","path","upload","text","modelId","uploadCollectionSlug","result","assetData","create","file","alt"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComposeFeatureComponent.d.ts","sourceRoot":"","sources":["../../../src/fields/LexicalEditor/ComposeFeatureComponent.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ComposeFeatureComponent.d.ts","sourceRoot":"","sources":["../../../src/fields/LexicalEditor/ComposeFeatureComponent.tsx"],"names":[],"mappings":"AAMA,eAAO,MAAM,uBAAuB,+CAQnC,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useFieldProps } from '@payloadcms/ui';
|
|
3
|
+
import React from 'react';
|
|
3
4
|
import { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js';
|
|
4
5
|
import { Compose } from '../../ui/Compose/Compose.js';
|
|
5
6
|
export const ComposeFeatureComponent = ()=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/fields/LexicalEditor/ComposeFeatureComponent.tsx"],"sourcesContent":["import { useFieldProps } from '@payloadcms/ui'\n\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { Compose } from '../../ui/Compose/Compose.js'\n\nexport const ComposeFeatureComponent = () => {\n const { schemaPath } = useFieldProps()\n\n const { id: instructionId } = useInstructions({\n path: schemaPath,\n })\n\n return <Compose instructionId={instructionId} />\n}\n"],"names":["useFieldProps","useInstructions","Compose","ComposeFeatureComponent","schemaPath","id","instructionId","path"],"mappings":";AAAA,SAASA,aAAa,QAAQ,iBAAgB;
|
|
1
|
+
{"version":3,"sources":["../../../src/fields/LexicalEditor/ComposeFeatureComponent.tsx"],"sourcesContent":["import { useFieldProps } from '@payloadcms/ui'\nimport React from 'react'\n\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { Compose } from '../../ui/Compose/Compose.js'\n\nexport const ComposeFeatureComponent = () => {\n const { schemaPath } = useFieldProps()\n\n const { id: instructionId } = useInstructions({\n path: schemaPath,\n })\n\n return <Compose instructionId={instructionId} />\n}\n"],"names":["useFieldProps","React","useInstructions","Compose","ComposeFeatureComponent","schemaPath","id","instructionId","path"],"mappings":";AAAA,SAASA,aAAa,QAAQ,iBAAgB;AAC9C,OAAOC,WAAW,QAAO;AAEzB,SAASC,eAAe,QAAQ,0DAAyD;AACzF,SAASC,OAAO,QAAQ,8BAA6B;AAErD,OAAO,MAAMC,0BAA0B;IACrC,MAAM,EAAEC,UAAU,EAAE,GAAGL;IAEvB,MAAM,EAAEM,IAAIC,aAAa,EAAE,GAAGL,gBAAgB;QAC5CM,MAAMH;IACR;IAEA,qBAAO,KAACF;QAAQI,eAAeA;;AACjC,EAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
* COMMERCIAL-LICENSE.md. Unauthorized commercial use or resale of modified versions
|
|
5
5
|
* without appropriate licensing is prohibited.
|
|
6
6
|
*/
|
|
7
|
-
export { payloadAiPlugin } from './plugin.js';
|
|
8
7
|
export { PayloadAiPluginLexicalEditorFeature } from './fields/LexicalEditor/feature.server.js';
|
|
9
|
-
export {
|
|
8
|
+
export { payloadAiPlugin } from './plugin.js';
|
|
10
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mCAAmC,EAAE,MAAM,0CAA0C,CAAA;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
* redistribution, or embedding in proprietary systems, please refer to the
|
|
4
4
|
* COMMERCIAL-LICENSE.md. Unauthorized commercial use or resale of modified versions
|
|
5
5
|
* without appropriate licensing is prohibited.
|
|
6
|
-
*/ export {
|
|
7
|
-
export {
|
|
8
|
-
export { LexicalBaseNode } from './ai/schemas/lexical.schema.js';
|
|
6
|
+
*/ export { PayloadAiPluginLexicalEditorFeature } from './fields/LexicalEditor/feature.server.js';
|
|
7
|
+
export { payloadAiPlugin } from './plugin.js';
|
|
9
8
|
|
|
10
9
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @license This software is licensed under the MIT License. For commercial use,\n * redistribution, or embedding in proprietary systems, please refer to the\n * COMMERCIAL-LICENSE.md. Unauthorized commercial use or resale of modified versions\n * without appropriate licensing is prohibited.\n */\n\nexport {
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @license This software is licensed under the MIT License. For commercial use,\n * redistribution, or embedding in proprietary systems, please refer to the\n * COMMERCIAL-LICENSE.md. Unauthorized commercial use or resale of modified versions\n * without appropriate licensing is prohibited.\n */\n\nexport { PayloadAiPluginLexicalEditorFeature } from './fields/LexicalEditor/feature.server.js'\nexport { payloadAiPlugin } from './plugin.js'\n"],"names":["PayloadAiPluginLexicalEditorFeature","payloadAiPlugin"],"mappings":"AAAA;;;;;CAKC,GAED,SAASA,mCAAmC,QAAQ,2CAA0C;AAC9F,SAASC,eAAe,QAAQ,cAAa"}
|
package/dist/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAO9C,eAAO,MAAM,IAAI,YAAmB,OAAO,uCAAkC,YAAY,kBAuFxF,CAAA"}
|
package/dist/init.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { GenerationModels } from './ai/models/index.js';
|
|
2
2
|
import { seedPrompts } from './ai/prompts.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { systemGenerate } from './ai/utils/systemGenerate.js';
|
|
4
|
+
import { PLUGIN_INSTRUCTIONS_TABLE } from './defaults.js';
|
|
5
5
|
export const init = async (payload, fieldSchemaPaths, pluginConfig)=>{
|
|
6
6
|
payload.logger.info(`— AI Plugin: Initializing...`);
|
|
7
7
|
const paths = Object.keys(fieldSchemaPaths);
|
|
8
8
|
const fieldInstructionsMap = {};
|
|
9
9
|
for(let i = 0; i < paths.length; i++){
|
|
10
10
|
const path = paths[i];
|
|
11
|
-
const { type: fieldType, label: fieldLabel } = fieldSchemaPaths[path];
|
|
12
|
-
//TODO: if global is broken the plugin doesn't know and does not run reindexing
|
|
11
|
+
const { type: fieldType, label: fieldLabel, relationTo } = fieldSchemaPaths[path];
|
|
13
12
|
const entry = await payload.find({
|
|
14
13
|
collection: PLUGIN_INSTRUCTIONS_TABLE,
|
|
14
|
+
pagination: false,
|
|
15
15
|
where: {
|
|
16
16
|
'field-type': {
|
|
17
17
|
equals: fieldType
|
|
@@ -30,7 +30,7 @@ export const init = async (payload, fieldSchemaPaths, pluginConfig)=>{
|
|
|
30
30
|
});
|
|
31
31
|
let generatedPrompt = '{{ title }}';
|
|
32
32
|
if (pluginConfig.generatePromptOnInit) {
|
|
33
|
-
generatedPrompt = await
|
|
33
|
+
generatedPrompt = await systemGenerate({
|
|
34
34
|
prompt,
|
|
35
35
|
system
|
|
36
36
|
});
|
|
@@ -44,10 +44,11 @@ export const init = async (payload, fieldSchemaPaths, pluginConfig)=>{
|
|
|
44
44
|
return a.fields.includes(fieldType);
|
|
45
45
|
})?.id,
|
|
46
46
|
prompt: generatedPrompt,
|
|
47
|
+
'relation-to': relationTo,
|
|
47
48
|
'schema-path': path
|
|
48
49
|
}
|
|
49
|
-
}).then((a)=>a).catch((
|
|
50
|
-
console.log('
|
|
50
|
+
}).then((a)=>a).catch((err)=>{
|
|
51
|
+
console.log('— AI Plugin: Error creating Compose settings-', err);
|
|
51
52
|
});
|
|
52
53
|
// @ts-expect-error
|
|
53
54
|
if (instructions?.id) {
|
|
@@ -64,14 +65,9 @@ export const init = async (payload, fieldSchemaPaths, pluginConfig)=>{
|
|
|
64
65
|
};
|
|
65
66
|
}
|
|
66
67
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
data: {
|
|
71
|
-
map: fieldInstructionsMap
|
|
72
|
-
},
|
|
73
|
-
depth: 2
|
|
74
|
-
});
|
|
68
|
+
if (pluginConfig.debugging) {
|
|
69
|
+
payload.logger.info(`— AI Plugin: Enabled fields map: ${JSON.stringify(fieldInstructionsMap, null, 2)}`);
|
|
70
|
+
}
|
|
75
71
|
payload.logger.info(`— AI Plugin: Initialized!`);
|
|
76
72
|
if (pluginConfig.generatePromptOnInit) {
|
|
77
73
|
payload.logger.info('\n\n-AI Plugin: Example prompts are added to get you started, Now go break some code 🚀🚀🚀\n\n');
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/init.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../src/init.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nimport type { PluginConfig } from './types.js'\n\nimport { GenerationModels } from './ai/models/index.js'\nimport { seedPrompts } from './ai/prompts.js'\nimport { systemGenerate } from './ai/utils/systemGenerate.js'\nimport { PLUGIN_INSTRUCTIONS_TABLE } from './defaults.js'\n\nexport const init = async (payload: Payload, fieldSchemaPaths, pluginConfig: PluginConfig) => {\n payload.logger.info(`— AI Plugin: Initializing...`)\n\n const paths = Object.keys(fieldSchemaPaths)\n\n const fieldInstructionsMap = {}\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i]\n const { type: fieldType, label: fieldLabel, relationTo } = fieldSchemaPaths[path]\n const entry = await payload.find({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n pagination: false,\n where: {\n 'field-type': {\n equals: fieldType,\n },\n 'schema-path': {\n equals: path,\n },\n },\n })\n\n if (!entry?.docs?.length) {\n const { prompt, system } = seedPrompts({\n fieldLabel,\n fieldSchemaPaths,\n fieldType,\n path,\n })\n\n let generatedPrompt = '{{ title }}'\n if (pluginConfig.generatePromptOnInit) {\n generatedPrompt = await systemGenerate({\n prompt,\n system,\n })\n payload.logger.info(\n `\\nPrompt generated for \"${fieldLabel}\" field:\\nprompt: ${generatedPrompt}\\n\\n`,\n )\n }\n\n const instructions = await payload\n .create({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n data: {\n 'field-type': fieldType,\n 'model-id': GenerationModels.find((a) => {\n return a.fields.includes(fieldType)\n })?.id,\n prompt: generatedPrompt,\n 'relation-to': relationTo,\n 'schema-path': path,\n },\n })\n .then((a) => a)\n .catch((err) => {\n console.log('— AI Plugin: Error creating Compose settings-', err)\n })\n\n // @ts-expect-error\n if (instructions?.id) {\n fieldInstructionsMap[path] = {\n id: instructions.id,\n fieldType,\n }\n }\n } else {\n const [instructions] = entry.docs\n fieldInstructionsMap[path] = {\n id: instructions.id,\n fieldType,\n }\n }\n }\n\n if (pluginConfig.debugging) {\n payload.logger.info(\n `— AI Plugin: Enabled fields map: ${JSON.stringify(fieldInstructionsMap, null, 2)}`,\n )\n }\n\n payload.logger.info(`— AI Plugin: Initialized!`)\n if (pluginConfig.generatePromptOnInit) {\n payload.logger.info(\n '\\n\\n-AI Plugin: Example prompts are added to get you started, Now go break some code 🚀🚀🚀\\n\\n',\n )\n }\n}\n"],"names":["GenerationModels","seedPrompts","systemGenerate","PLUGIN_INSTRUCTIONS_TABLE","init","payload","fieldSchemaPaths","pluginConfig","logger","info","paths","Object","keys","fieldInstructionsMap","i","length","path","type","fieldType","label","fieldLabel","relationTo","entry","find","collection","pagination","where","equals","docs","prompt","system","generatedPrompt","generatePromptOnInit","instructions","create","data","a","fields","includes","id","then","catch","err","console","log","debugging","JSON","stringify"],"mappings":"AAIA,SAASA,gBAAgB,QAAQ,uBAAsB;AACvD,SAASC,WAAW,QAAQ,kBAAiB;AAC7C,SAASC,cAAc,QAAQ,+BAA8B;AAC7D,SAASC,yBAAyB,QAAQ,gBAAe;AAEzD,OAAO,MAAMC,OAAO,OAAOC,SAAkBC,kBAAkBC;IAC7DF,QAAQG,MAAM,CAACC,IAAI,CAAC,CAAC,4BAA4B,CAAC;IAElD,MAAMC,QAAQC,OAAOC,IAAI,CAACN;IAE1B,MAAMO,uBAAuB,CAAC;IAC9B,IAAK,IAAIC,IAAI,GAAGA,IAAIJ,MAAMK,MAAM,EAAED,IAAK;QACrC,MAAME,OAAON,KAAK,CAACI,EAAE;QACrB,MAAM,EAAEG,MAAMC,SAAS,EAAEC,OAAOC,UAAU,EAAEC,UAAU,EAAE,GAAGf,gBAAgB,CAACU,KAAK;QACjF,MAAMM,QAAQ,MAAMjB,QAAQkB,IAAI,CAAC;YAC/BC,YAAYrB;YACZsB,YAAY;YACZC,OAAO;gBACL,cAAc;oBACZC,QAAQT;gBACV;gBACA,eAAe;oBACbS,QAAQX;gBACV;YACF;QACF;QAEA,IAAI,CAACM,OAAOM,MAAMb,QAAQ;YACxB,MAAM,EAAEc,MAAM,EAAEC,MAAM,EAAE,GAAG7B,YAAY;gBACrCmB;gBACAd;gBACAY;gBACAF;YACF;YAEA,IAAIe,kBAAkB;YACtB,IAAIxB,aAAayB,oBAAoB,EAAE;gBACrCD,kBAAkB,MAAM7B,eAAe;oBACrC2B;oBACAC;gBACF;gBACAzB,QAAQG,MAAM,CAACC,IAAI,CACjB,CAAC,wBAAwB,EAAEW,WAAW,kBAAkB,EAAEW,gBAAgB,IAAI,CAAC;YAEnF;YAEA,MAAME,eAAe,MAAM5B,QACxB6B,MAAM,CAAC;gBACNV,YAAYrB;gBACZgC,MAAM;oBACJ,cAAcjB;oBACd,YAAYlB,iBAAiBuB,IAAI,CAAC,CAACa;wBACjC,OAAOA,EAAEC,MAAM,CAACC,QAAQ,CAACpB;oBAC3B,IAAIqB;oBACJV,QAAQE;oBACR,eAAeV;oBACf,eAAeL;gBACjB;YACF,GACCwB,IAAI,CAAC,CAACJ,IAAMA,GACZK,KAAK,CAAC,CAACC;gBACNC,QAAQC,GAAG,CAAC,iDAAiDF;YAC/D;YAEF,mBAAmB;YACnB,IAAIT,cAAcM,IAAI;gBACpB1B,oBAAoB,CAACG,KAAK,GAAG;oBAC3BuB,IAAIN,aAAaM,EAAE;oBACnBrB;gBACF;YACF;QACF,OAAO;YACL,MAAM,CAACe,aAAa,GAAGX,MAAMM,IAAI;YACjCf,oBAAoB,CAACG,KAAK,GAAG;gBAC3BuB,IAAIN,aAAaM,EAAE;gBACnBrB;YACF;QACF;IACF;IAEA,IAAIX,aAAasC,SAAS,EAAE;QAC1BxC,QAAQG,MAAM,CAACC,IAAI,CACjB,CAAC,iCAAiC,EAAEqC,KAAKC,SAAS,CAAClC,sBAAsB,MAAM,IAAI;IAEvF;IAEAR,QAAQG,MAAM,CAACC,IAAI,CAAC,CAAC,yBAAyB,CAAC;IAC/C,IAAIF,aAAayB,oBAAoB,EAAE;QACrC3B,QAAQG,MAAM,CAACC,IAAI,CACjB;IAEJ;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/libraries/autocomplete/AutocompleteTextArea.tsx"],"sourcesContent":["/**\n * Credit: Yury Dymov\n * Github: https://github.com/yury-dymov/react-autocomplete-input\n *\n * Modified to only be use for PromptEditorField\n */\n\nimport * as inputSelection from 'get-input-selection'\nimport isEqual from 'lodash.isequal'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport scrollIntoView from 'scroll-into-view-if-needed'\nimport getCaretCoordinates from 'textarea-caret'\n\nimport styles from './AutocompleteTextArea.module.scss'\n\nconst KEY_UP = 38\nconst KEY_DOWN = 40\nconst KEY_RETURN = 13\nconst KEY_ENTER = 14\nconst KEY_ESCAPE = 27\nconst KEY_TAB = 9\n\nconst OPTION_LIST_MIN_WIDTH = 100\n\nexport const AutocompleteTextField = (props) => {\n const {\n changeOnSelect = (trigger, slug) => trigger + slug,\n defaultValue = '',\n disabled = false,\n matchAny = false,\n maxOptions = 10,\n minChars = 0,\n offsetX = 0,\n offsetY = 0,\n onBlur = (e: any) => {},\n onChange = (e: any) => {},\n onKeyDown = (e: any) => {},\n onRequestOptions = (e: any) => {},\n onSelect = (e: any) => {},\n options = [],\n passThroughEnter = false,\n passThroughTab = true,\n regex = '^[A-Za-z0-9\\\\-_]+$',\n requestOnlyIfNoOptions = true,\n spaceRemovers = [',', '.', '!', '?'],\n spacer = ' ',\n trigger = '@',\n triggerCaseInsensitive = false,\n triggerMatchWholeWord = false,\n value: propValue = null,\n ...rest\n } = props\n\n const [helperVisible, setHelperVisible] = useState(false)\n const [left, setLeft] = useState(0)\n const [top, setTop] = useState(0)\n const [triggerChar, setTriggerChar] = useState(null)\n const [matchLength, setMatchLength] = useState(0)\n const [matchStart, setMatchStart] = useState(0)\n const [selection, setSelection] = useState(0)\n const [value, setValue] = useState(null)\n const [caret, setCaret] = useState(0)\n const [currentOptions, setCurrentOptions] = useState([])\n\n const recentValue = useRef(defaultValue)\n const enableSpaceRemovers = useRef(false)\n const inputRef = useRef(null)\n const currentRef = useRef(null)\n const parentRef = useRef(null)\n\n useEffect(() => {\n window.addEventListener('resize', handleResize)\n window.addEventListener('scroll', handleResize)\n\n return () => {\n window.removeEventListener('resize', handleResize)\n window.removeEventListener('scroll', handleResize)\n }\n }, [])\n\n useEffect(() => {\n if (!isEqual(options, currentOptions)) {\n updateHelper(recentValue.current, caret, options)\n }\n }, [options, caret])\n\n useEffect(() => {\n if (helperVisible && currentRef.current) {\n scrollIntoView(currentRef.current, { boundary: parentRef.current, scrollMode: 'if-needed' })\n }\n }, [helperVisible, selection])\n\n const handleResize = useCallback(() => {\n setHelperVisible(false)\n }, [])\n\n const isTrigger = useCallback(\n (triggerStr, str, i) => {\n if (!triggerStr || !triggerStr.length) {\n return true\n }\n\n if (triggerMatchWholeWord && i > 0 && str.charAt(i - 1).match(/\\w/)) {\n return false\n }\n\n if (\n str.substr(i, triggerStr.length) === triggerStr ||\n (triggerCaseInsensitive &&\n str.substr(i, triggerStr.length).toLowerCase() === triggerStr.toLowerCase())\n ) {\n return true\n }\n\n return false\n },\n [triggerMatchWholeWord, triggerCaseInsensitive],\n )\n\n const arrayTriggerMatch = useCallback((triggers, re) => {\n return triggers.map((trigger) => ({\n triggerLength: trigger.length,\n triggerMatch: trigger.match(re),\n triggerStr: trigger,\n }))\n }, [])\n\n const getMatch = useCallback(\n (str, caret, providedOptions) => {\n const re = new RegExp(regex)\n const triggers = Array.isArray(trigger) ? trigger : [trigger]\n triggers.sort()\n\n const providedOptionsObject = Array.isArray(providedOptions)\n ? triggers.reduce((acc, triggerStr) => ({ ...acc, [triggerStr]: providedOptions }), {})\n : providedOptions\n\n const triggersMatch = arrayTriggerMatch(triggers, re)\n let slugData = null\n\n for (let triggersIndex = 0; triggersIndex < triggersMatch.length; triggersIndex++) {\n const { triggerLength, triggerMatch, triggerStr } = triggersMatch[triggersIndex]\n\n for (let i = caret - 1; i >= 0; --i) {\n const substr = str.substring(i, caret)\n const match = substr.match(re)\n let matchStart = -1\n\n if (triggerLength > 0) {\n const triggerIdx = triggerMatch ? i : i - triggerLength + 1\n\n if (triggerIdx < 0) {\n break\n }\n\n if (isTrigger(triggerStr, str, triggerIdx)) {\n matchStart = triggerIdx + triggerLength\n }\n\n if (!match && matchStart < 0) {\n break\n }\n } else {\n if (match && i > 0) {\n continue\n }\n matchStart = i === 0 && match ? 0 : i + 1\n\n if (caret - matchStart === 0) {\n break\n }\n }\n\n if (matchStart >= 0) {\n const triggerOptions = providedOptionsObject[triggerStr]\n if (triggerOptions == null) {\n continue\n }\n\n const matchedSlug = str.substring(matchStart, caret)\n\n const filteredOptions = triggerOptions.filter((slug) => {\n const idx = slug.toLowerCase().indexOf(matchedSlug.toLowerCase())\n return idx !== -1 && (matchAny || idx === 0)\n })\n\n const currTrigger = triggerStr\n const matchLength = matchedSlug.length\n\n slugData = {\n matchLength,\n matchStart,\n options: filteredOptions,\n trigger: currTrigger,\n }\n }\n }\n }\n\n return slugData\n },\n [regex, trigger, arrayTriggerMatch, isTrigger, matchAny],\n )\n\n const updateCaretPosition = useCallback((newCaret) => {\n requestAnimationFrame(() => {\n setCaret(newCaret)\n inputSelection.default.setCaretPosition(inputRef.current, newCaret)\n })\n }, [])\n\n const updateHelper = useCallback(\n (str, caretPos, helperOptions) => {\n const slug = getMatch(str, caretPos, helperOptions)\n\n if (slug) {\n const caretCoordinates = getCaretCoordinates(inputRef.current, caretPos)\n const rect = inputRef.current.getBoundingClientRect()\n\n const newTop = caretCoordinates.top + rect.top - inputRef.current.scrollTop\n const newLeft = Math.min(\n caretCoordinates.left + rect.left - inputRef.current.scrollLeft,\n window.innerWidth - OPTION_LIST_MIN_WIDTH,\n )\n\n if (\n slug.matchLength >= minChars &&\n (slug.options.length > 1 ||\n (slug.options.length === 1 &&\n (slug.options[0].length !== slug.matchLength || slug.options[0].length === 1)))\n ) {\n setHelperVisible(true)\n setTop(newTop)\n setLeft(newLeft)\n setTriggerChar(slug.trigger)\n setMatchLength(slug.matchLength)\n setMatchStart(slug.matchStart)\n setCurrentOptions(slug.options)\n } else {\n if (!requestOnlyIfNoOptions || !slug.options.length) {\n onRequestOptions(str.substr(slug.matchStart, slug.matchLength))\n }\n resetHelper()\n }\n updateCaretPosition(caretPos)\n } else {\n resetHelper()\n }\n },\n [getMatch, minChars, requestOnlyIfNoOptions, onRequestOptions, updateCaretPosition],\n )\n\n const resetHelper = useCallback(() => {\n setHelperVisible(false)\n setSelection(0)\n }, [])\n\n const handleChange = useCallback(\n (e) => {\n const str = e.target.value\n const caretPos = inputSelection.default.default(e.target).end\n\n if (!str.length) {\n setHelperVisible(false)\n }\n\n recentValue.current = str\n\n if (!str.length || !caretPos) {\n return onChange(e.target.value)\n }\n\n // Space removers logic\n if (enableSpaceRemovers.current && spaceRemovers.length && str.length > 2 && spacer.length) {\n for (let i = 0; i < Math.max(recentValue.current.length, str.length); ++i) {\n if (recentValue.current[i] !== str[i]) {\n if (\n i >= 2 &&\n str[i - 1] === spacer &&\n spaceRemovers.indexOf(str[i - 2]) === -1 &&\n spaceRemovers.indexOf(str[i]) !== -1 &&\n getMatch(str.substring(0, i - 2), caretPos - 3, options)\n ) {\n const newValue = `${str.slice(0, i - 1)}${str.slice(i, i + 1)}${str.slice(i - 1, i)}${str.slice(i + 1)}`\n\n updateCaretPosition(i + 1)\n inputRef.current.value = newValue\n\n if (!propValue) {\n setValue(newValue)\n }\n\n return onChange(newValue)\n }\n\n break\n }\n }\n\n enableSpaceRemovers.current = false\n }\n\n updateHelper(str, caretPos, options)\n\n if (!propValue) {\n setValue(e.target.value)\n }\n\n return onChange(e.target.value)\n },\n [\n onChange,\n propValue,\n spaceRemovers,\n spacer,\n options,\n updateCaretPosition,\n updateHelper,\n getMatch,\n ],\n )\n\n const handleBlur = useCallback(\n (e) => {\n resetHelper()\n onBlur(e)\n },\n [onBlur, resetHelper],\n )\n\n const handleSelection = useCallback(\n (idx) => {\n const slug = currentOptions[idx]\n const value = recentValue.current\n const part1 =\n triggerChar.length === 0 ? '' : value.substring(0, matchStart - triggerChar.length)\n const part2 = value.substring(matchStart + matchLength)\n\n const event = { target: inputRef.current }\n const changedStr = changeOnSelect(triggerChar, slug)\n\n event.target.value = `${part1}${changedStr}${spacer}${part2}`\n handleChange(event)\n onSelect(event.target.value)\n\n resetHelper()\n\n const advanceCaretDistance = part1.length + changedStr.length + (spacer ? spacer.length : 1)\n updateCaretPosition(advanceCaretDistance)\n\n enableSpaceRemovers.current = true\n },\n [\n currentOptions,\n triggerChar,\n matchStart,\n matchLength,\n changeOnSelect,\n spacer,\n handleChange,\n onSelect,\n resetHelper,\n updateCaretPosition,\n ],\n )\n\n const handleKeyDown = useCallback(\n (event) => {\n const optionsCount =\n maxOptions > 0 ? Math.min(currentOptions.length, maxOptions) : currentOptions.length\n\n if (helperVisible) {\n switch (event.keyCode) {\n case KEY_ESCAPE:\n event.preventDefault()\n resetHelper()\n break\n case KEY_UP:\n event.preventDefault()\n if (optionsCount > 0) {\n setSelection(\n (prevSelection) => Math.max(0, optionsCount + prevSelection - 1) % optionsCount,\n )\n }\n break\n case KEY_DOWN:\n event.preventDefault()\n if (optionsCount > 0) {\n setSelection((prevSelection) => (prevSelection + 1) % optionsCount)\n }\n break\n case KEY_ENTER:\n case KEY_RETURN:\n if (!passThroughEnter) {\n event.preventDefault()\n }\n handleSelection(selection)\n break\n case KEY_TAB:\n if (!passThroughTab) {\n event.preventDefault()\n }\n handleSelection(selection)\n break\n default:\n onKeyDown(event)\n break\n }\n } else {\n onKeyDown(event)\n }\n },\n [\n helperVisible,\n currentOptions,\n maxOptions,\n passThroughEnter,\n passThroughTab,\n selection,\n onKeyDown,\n resetHelper,\n handleSelection,\n ],\n )\n\n const renderAutocompleteList = useCallback(() => {\n if (!helperVisible || currentOptions.length === 0) {\n return null\n }\n\n if (selection >= currentOptions.length) {\n setSelection(0)\n return null\n }\n\n const optionNumber = maxOptions === 0 ? currentOptions.length : maxOptions\n\n const helperOptions = currentOptions.slice(0, optionNumber).map((val, idx) => {\n let [helper, value] = val.split(' ')\n if (!value) {\n helper = undefined\n value = val\n }\n\n const renderHighlightedText = (text) => {\n const highlightStart = text\n .toLowerCase()\n .indexOf(recentValue.current.substr(matchStart, matchLength).toLowerCase())\n\n const highlightedText = text.substr(highlightStart, matchLength)\n\n if (!val.startsWith(text)) {\n return text\n }\n\n return (\n <>\n {text.slice(0, highlightStart)}\n <strong>{highlightedText}</strong>\n {text.slice(highlightStart + matchLength)}\n </>\n )\n }\n\n return (\n <li\n className={idx === selection ? styles.active : null}\n key={val}\n onClick={() => {\n handleSelection(idx)\n }}\n onMouseDown={(e) => {\n e.preventDefault()\n }}\n onMouseEnter={() => {\n setSelection(idx)\n }}\n ref={idx === selection ? currentRef : null}\n role=\"presentation\"\n >\n {helper && <code className={styles.helper}>{renderHighlightedText(helper)}</code>}\n {renderHighlightedText(value)}\n </li>\n )\n })\n\n const maxWidth = window.innerWidth - left - offsetX - 5\n const maxHeight = window.innerHeight - top - offsetY - 5\n\n return (\n <ul\n className={styles.autocompleteInput + ' ' + 'popup__content'}\n ref={parentRef}\n style={{\n left: left + offsetX,\n maxHeight,\n maxWidth,\n opacity: 'initial',\n pointerEvents: 'initial',\n position: 'fixed',\n top: top + offsetY,\n visibility: 'initial',\n }}\n >\n {helperOptions}\n </ul>\n )\n }, [\n helperVisible,\n currentOptions,\n selection,\n maxOptions,\n left,\n top,\n offsetX,\n offsetY,\n matchStart,\n matchLength,\n handleSelection,\n ])\n\n return (\n <div className=\"popup\">\n <textarea\n className=\"textarea-outer\"\n disabled={disabled}\n onBlur={handleBlur}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n ref={inputRef}\n rows={6}\n style={{ overflow: 'auto' }}\n value={propValue !== null ? propValue : value || defaultValue}\n {...rest}\n />\n {renderAutocompleteList()}\n </div>\n )\n}\n"],"names":["inputSelection","isEqual","React","useCallback","useEffect","useRef","useState","scrollIntoView","getCaretCoordinates","styles","KEY_UP","KEY_DOWN","KEY_RETURN","KEY_ENTER","KEY_ESCAPE","KEY_TAB","OPTION_LIST_MIN_WIDTH","AutocompleteTextField","props","changeOnSelect","trigger","slug","defaultValue","disabled","matchAny","maxOptions","minChars","offsetX","offsetY","onBlur","e","onChange","onKeyDown","onRequestOptions","onSelect","options","passThroughEnter","passThroughTab","regex","requestOnlyIfNoOptions","spaceRemovers","spacer","triggerCaseInsensitive","triggerMatchWholeWord","value","propValue","rest","helperVisible","setHelperVisible","left","setLeft","top","setTop","triggerChar","setTriggerChar","matchLength","setMatchLength","matchStart","setMatchStart","selection","setSelection","setValue","caret","setCaret","currentOptions","setCurrentOptions","recentValue","enableSpaceRemovers","inputRef","currentRef","parentRef","window","addEventListener","handleResize","removeEventListener","updateHelper","current","boundary","scrollMode","isTrigger","triggerStr","str","i","length","charAt","match","substr","toLowerCase","arrayTriggerMatch","triggers","re","map","triggerLength","triggerMatch","getMatch","providedOptions","RegExp","Array","isArray","sort","providedOptionsObject","reduce","acc","triggersMatch","slugData","triggersIndex","substring","triggerIdx","triggerOptions","matchedSlug","filteredOptions","filter","idx","indexOf","currTrigger","updateCaretPosition","newCaret","requestAnimationFrame","default","setCaretPosition","caretPos","helperOptions","caretCoordinates","rect","getBoundingClientRect","newTop","scrollTop","newLeft","Math","min","scrollLeft","innerWidth","resetHelper","handleChange","target","end","max","newValue","slice","handleBlur","handleSelection","part1","part2","event","changedStr","advanceCaretDistance","handleKeyDown","optionsCount","keyCode","preventDefault","prevSelection","renderAutocompleteList","optionNumber","val","helper","split","undefined","renderHighlightedText","text","highlightStart","highlightedText","startsWith","strong","li","className","active","onClick","onMouseDown","onMouseEnter","ref","role","code","maxWidth","maxHeight","innerHeight","ul","autocompleteInput","style","opacity","pointerEvents","position","visibility","div","textarea","rows","overflow"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/libraries/autocomplete/AutocompleteTextArea.tsx"],"sourcesContent":["/**\n * Credit: Yury Dymov\n * Github: https://github.com/yury-dymov/react-autocomplete-input\n *\n * Modified to only be use for PromptEditorField\n */\n\nimport * as inputSelection from 'get-input-selection'\nimport isEqual from 'lodash.isequal'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport scrollIntoView from 'scroll-into-view-if-needed'\nimport getCaretCoordinates from 'textarea-caret'\n\nimport styles from './AutocompleteTextArea.module.scss'\n\nconst KEY_UP = 38\nconst KEY_DOWN = 40\nconst KEY_RETURN = 13\nconst KEY_ENTER = 14\nconst KEY_ESCAPE = 27\nconst KEY_TAB = 9\n\nconst OPTION_LIST_MIN_WIDTH = 100\n\nexport const AutocompleteTextField = (props) => {\n const {\n changeOnSelect = (trigger, slug) => trigger + slug,\n defaultValue = '',\n disabled = false,\n matchAny = false,\n maxOptions = 10,\n minChars = 0,\n offsetX = 0,\n offsetY = 0,\n onBlur = (e: any) => {},\n onChange = (e: any) => {},\n onKeyDown = (e: any) => {},\n onRequestOptions = (e: any) => {},\n onSelect = (e: any) => {},\n options = [],\n passThroughEnter = false,\n passThroughTab = true,\n regex = '^[A-Za-z0-9\\\\-_]+$',\n requestOnlyIfNoOptions = true,\n spaceRemovers = [',', '.', '!', '?'],\n spacer = ' ',\n trigger = '@',\n triggerCaseInsensitive = false,\n triggerMatchWholeWord = false,\n value: propValue = null,\n ...rest\n } = props\n\n const [helperVisible, setHelperVisible] = useState(false)\n const [left, setLeft] = useState(0)\n const [top, setTop] = useState(0)\n const [triggerChar, setTriggerChar] = useState(null)\n const [matchLength, setMatchLength] = useState(0)\n const [matchStart, setMatchStart] = useState(0)\n const [selection, setSelection] = useState(0)\n const [value, setValue] = useState(null)\n const [caret, setCaret] = useState(0)\n const [currentOptions, setCurrentOptions] = useState([])\n\n const recentValue = useRef(defaultValue)\n const enableSpaceRemovers = useRef(false)\n const inputRef = useRef(null)\n const currentRef = useRef(null)\n const parentRef = useRef(null)\n\n useEffect(() => {\n window.addEventListener('resize', handleResize)\n window.addEventListener('scroll', handleResize)\n\n return () => {\n window.removeEventListener('resize', handleResize)\n window.removeEventListener('scroll', handleResize)\n }\n }, [])\n\n useEffect(() => {\n if (!isEqual(options, currentOptions)) {\n updateHelper(recentValue.current, caret, options)\n }\n }, [options, caret])\n\n useEffect(() => {\n if (helperVisible && currentRef.current) {\n scrollIntoView(currentRef.current, { boundary: parentRef.current, scrollMode: 'if-needed' })\n }\n }, [helperVisible, selection])\n\n const handleResize = useCallback(() => {\n setHelperVisible(false)\n }, [])\n\n const isTrigger = useCallback(\n (triggerStr, str, i) => {\n if (!triggerStr || !triggerStr.length) {\n return true\n }\n\n if (triggerMatchWholeWord && i > 0 && str.charAt(i - 1).match(/\\w/)) {\n return false\n }\n\n if (\n str.substr(i, triggerStr.length) === triggerStr ||\n (triggerCaseInsensitive &&\n str.substr(i, triggerStr.length).toLowerCase() === triggerStr.toLowerCase())\n ) {\n return true\n }\n\n return false\n },\n [triggerMatchWholeWord, triggerCaseInsensitive],\n )\n\n const arrayTriggerMatch = useCallback((triggers, re) => {\n return triggers.map((trigger) => ({\n triggerLength: trigger.length,\n triggerMatch: trigger.match(re),\n triggerStr: trigger,\n }))\n }, [])\n\n const getMatch = useCallback(\n (str, caret, providedOptions) => {\n const re = new RegExp(regex)\n const triggers = Array.isArray(trigger) ? trigger : [trigger]\n triggers.sort()\n\n const providedOptionsObject = Array.isArray(providedOptions)\n ? triggers.reduce((acc, triggerStr) => ({ ...acc, [triggerStr]: providedOptions }), {})\n : providedOptions\n\n const triggersMatch = arrayTriggerMatch(triggers, re)\n let slugData = null\n\n for (let triggersIndex = 0; triggersIndex < triggersMatch.length; triggersIndex++) {\n const { triggerLength, triggerMatch, triggerStr } = triggersMatch[triggersIndex]\n\n for (let i = caret - 1; i >= 0; --i) {\n const substr = str.substring(i, caret)\n const match = substr.match(re)\n let matchStart = -1\n\n if (triggerLength > 0) {\n const triggerIdx = triggerMatch ? i : i - triggerLength + 1\n\n if (triggerIdx < 0) {\n break\n }\n\n if (isTrigger(triggerStr, str, triggerIdx)) {\n matchStart = triggerIdx + triggerLength\n }\n\n if (!match && matchStart < 0) {\n break\n }\n } else {\n if (match && i > 0) {\n continue\n }\n matchStart = i === 0 && match ? 0 : i + 1\n\n if (caret - matchStart === 0) {\n break\n }\n }\n\n if (matchStart >= 0) {\n const triggerOptions = providedOptionsObject[triggerStr]\n if (triggerOptions == null) {\n continue\n }\n\n const matchedSlug = str.substring(matchStart, caret)\n\n const filteredOptions = triggerOptions.filter((slug) => {\n const idx = slug.toLowerCase().indexOf(matchedSlug.toLowerCase())\n return idx !== -1 && (matchAny || idx === 0)\n })\n\n const currTrigger = triggerStr\n const matchLength = matchedSlug.length\n\n slugData = {\n matchLength,\n matchStart,\n options: filteredOptions,\n trigger: currTrigger,\n }\n }\n }\n }\n\n return slugData\n },\n [regex, trigger, arrayTriggerMatch, isTrigger, matchAny],\n )\n\n const updateCaretPosition = useCallback((newCaret) => {\n requestAnimationFrame(() => {\n setCaret(newCaret)\n inputSelection.default.setCaretPosition(inputRef.current, newCaret)\n })\n }, [])\n\n const updateHelper = useCallback(\n (str, caretPos, helperOptions) => {\n const slug = getMatch(str, caretPos, helperOptions)\n\n if (slug) {\n const caretCoordinates = getCaretCoordinates(inputRef.current, caretPos)\n const rect = inputRef.current.getBoundingClientRect()\n\n const newTop = caretCoordinates.top + rect.top - inputRef.current.scrollTop\n const newLeft = Math.min(\n caretCoordinates.left + rect.left - inputRef.current.scrollLeft,\n window.innerWidth - OPTION_LIST_MIN_WIDTH,\n )\n\n if (\n slug.matchLength >= minChars &&\n (slug.options.length > 1 ||\n (slug.options.length === 1 &&\n (slug.options[0].length !== slug.matchLength || slug.options[0].length === 1)))\n ) {\n setHelperVisible(true)\n setTop(newTop)\n setLeft(newLeft)\n setTriggerChar(slug.trigger)\n setMatchLength(slug.matchLength)\n setMatchStart(slug.matchStart)\n setCurrentOptions(slug.options)\n } else {\n if (!requestOnlyIfNoOptions || !slug.options.length) {\n onRequestOptions(str.substr(slug.matchStart, slug.matchLength))\n }\n resetHelper()\n }\n updateCaretPosition(caretPos)\n } else {\n resetHelper()\n }\n },\n [getMatch, minChars, requestOnlyIfNoOptions, onRequestOptions, updateCaretPosition],\n )\n\n const resetHelper = useCallback(() => {\n setHelperVisible(false)\n setSelection(0)\n }, [])\n\n const handleChange = useCallback(\n (e) => {\n const str = e.target.value\n const caretPos = inputSelection.default.default(e.target).end\n\n if (!str.length) {\n setHelperVisible(false)\n }\n\n recentValue.current = str\n\n if (!str.length || !caretPos) {\n return onChange(e.target.value)\n }\n\n // Space removers logic\n if (enableSpaceRemovers.current && spaceRemovers.length && str.length > 2 && spacer.length) {\n for (let i = 0; i < Math.max(recentValue.current.length, str.length); ++i) {\n if (recentValue.current[i] !== str[i]) {\n if (\n i >= 2 &&\n str[i - 1] === spacer &&\n spaceRemovers.indexOf(str[i - 2]) === -1 &&\n spaceRemovers.indexOf(str[i]) !== -1 &&\n getMatch(str.substring(0, i - 2), caretPos - 3, options)\n ) {\n const newValue = `${str.slice(0, i - 1)}${str.slice(i, i + 1)}${str.slice(i - 1, i)}${str.slice(i + 1)}`\n\n updateCaretPosition(i + 1)\n inputRef.current.value = newValue\n\n if (!propValue) {\n setValue(newValue)\n }\n\n return onChange(newValue)\n }\n\n break\n }\n }\n\n enableSpaceRemovers.current = false\n }\n\n updateHelper(str, caretPos, options)\n\n if (!propValue) {\n setValue(e.target.value)\n }\n\n return onChange(e.target.value)\n },\n [\n onChange,\n propValue,\n spaceRemovers,\n spacer,\n options,\n updateCaretPosition,\n updateHelper,\n getMatch,\n ],\n )\n\n const handleBlur = useCallback(\n (e) => {\n resetHelper()\n onBlur(e)\n },\n [onBlur, resetHelper],\n )\n\n const handleSelection = useCallback(\n (idx) => {\n const slug = currentOptions[idx]\n const value = recentValue.current\n const part1 =\n triggerChar.length === 0 ? '' : value.substring(0, matchStart - triggerChar.length)\n const part2 = value.substring(matchStart + matchLength)\n\n const event = { target: inputRef.current }\n const changedStr = changeOnSelect(triggerChar, slug)\n\n event.target.value = `${part1}${changedStr}${spacer}${part2}`\n handleChange(event)\n onSelect(event.target.value)\n\n resetHelper()\n\n const advanceCaretDistance = part1.length + changedStr.length + (spacer ? spacer.length : 1)\n updateCaretPosition(advanceCaretDistance)\n\n enableSpaceRemovers.current = true\n },\n [\n currentOptions,\n triggerChar,\n matchStart,\n matchLength,\n changeOnSelect,\n spacer,\n handleChange,\n onSelect,\n resetHelper,\n updateCaretPosition,\n ],\n )\n\n const handleKeyDown = useCallback(\n (event) => {\n const optionsCount =\n maxOptions > 0 ? Math.min(currentOptions.length, maxOptions) : currentOptions.length\n\n if (helperVisible) {\n switch (event.keyCode) {\n case KEY_ESCAPE:\n event.preventDefault()\n resetHelper()\n break\n case KEY_UP:\n event.preventDefault()\n if (optionsCount > 0) {\n setSelection(\n (prevSelection) => Math.max(0, optionsCount + prevSelection - 1) % optionsCount,\n )\n }\n break\n case KEY_DOWN:\n event.preventDefault()\n if (optionsCount > 0) {\n setSelection((prevSelection) => (prevSelection + 1) % optionsCount)\n }\n break\n case KEY_ENTER:\n case KEY_RETURN:\n if (!passThroughEnter) {\n event.preventDefault()\n }\n handleSelection(selection)\n break\n case KEY_TAB:\n if (!passThroughTab) {\n event.preventDefault()\n }\n handleSelection(selection)\n break\n default:\n onKeyDown(event)\n break\n }\n } else {\n onKeyDown(event)\n }\n },\n [\n helperVisible,\n currentOptions,\n maxOptions,\n passThroughEnter,\n passThroughTab,\n selection,\n onKeyDown,\n resetHelper,\n handleSelection,\n ],\n )\n\n const renderAutocompleteList = useCallback(() => {\n if (!helperVisible || currentOptions.length === 0) {\n return null\n }\n\n if (selection >= currentOptions.length) {\n setSelection(0)\n return null\n }\n\n const optionNumber = maxOptions === 0 ? currentOptions.length : maxOptions\n\n const helperOptions = currentOptions.slice(0, optionNumber).map((val, idx) => {\n let [helper, value] = val.split(' ')\n if (!value) {\n helper = undefined\n value = val\n }\n\n const renderHighlightedText = (text) => {\n const highlightStart = text\n .toLowerCase()\n .indexOf(recentValue.current.substr(matchStart, matchLength).toLowerCase())\n\n const highlightedText = text.substr(highlightStart, matchLength)\n\n if (!val.startsWith(text)) {\n return text\n }\n\n return (\n <>\n {text.slice(0, highlightStart)}\n <strong>{highlightedText}</strong>\n {text.slice(highlightStart + matchLength)}\n </>\n )\n }\n\n return (\n <li\n className={idx === selection ? styles.active : null}\n key={val}\n onClick={() => {\n handleSelection(idx)\n }}\n onMouseDown={(e) => {\n e.preventDefault()\n }}\n onMouseEnter={() => {\n setSelection(idx)\n }}\n ref={idx === selection ? currentRef : null}\n role=\"presentation\"\n >\n {helper && <code className={styles.helper}>{renderHighlightedText(helper)}</code>}\n {renderHighlightedText(value)}\n </li>\n )\n })\n\n const maxWidth = window.innerWidth - left - offsetX - 5\n const maxHeight = window.innerHeight - top - offsetY - 5\n\n return (\n <ul\n className={styles.autocompleteInput + ' ' + 'popup__content'}\n ref={parentRef}\n style={{\n left: left + offsetX,\n maxHeight,\n maxWidth,\n opacity: 'initial',\n pointerEvents: 'initial',\n position: 'fixed',\n top: top + offsetY,\n visibility: 'initial',\n }}\n >\n {helperOptions}\n </ul>\n )\n }, [\n helperVisible,\n currentOptions,\n selection,\n maxOptions,\n left,\n top,\n offsetX,\n offsetY,\n matchStart,\n matchLength,\n handleSelection,\n ])\n\n return (\n <div className=\"popup\">\n <textarea\n className=\"textarea-outer\"\n disabled={disabled}\n onBlur={handleBlur}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n ref={inputRef}\n rows={6}\n style={{ overflow: 'auto' }}\n value={propValue !== null ? propValue : value || defaultValue}\n {...rest}\n />\n {renderAutocompleteList()}\n </div>\n )\n}\n"],"names":["inputSelection","isEqual","React","useCallback","useEffect","useRef","useState","scrollIntoView","getCaretCoordinates","styles","KEY_UP","KEY_DOWN","KEY_RETURN","KEY_ENTER","KEY_ESCAPE","KEY_TAB","OPTION_LIST_MIN_WIDTH","AutocompleteTextField","props","changeOnSelect","trigger","slug","defaultValue","disabled","matchAny","maxOptions","minChars","offsetX","offsetY","onBlur","e","onChange","onKeyDown","onRequestOptions","onSelect","options","passThroughEnter","passThroughTab","regex","requestOnlyIfNoOptions","spaceRemovers","spacer","triggerCaseInsensitive","triggerMatchWholeWord","value","propValue","rest","helperVisible","setHelperVisible","left","setLeft","top","setTop","triggerChar","setTriggerChar","matchLength","setMatchLength","matchStart","setMatchStart","selection","setSelection","setValue","caret","setCaret","currentOptions","setCurrentOptions","recentValue","enableSpaceRemovers","inputRef","currentRef","parentRef","window","addEventListener","handleResize","removeEventListener","updateHelper","current","boundary","scrollMode","isTrigger","triggerStr","str","i","length","charAt","match","substr","toLowerCase","arrayTriggerMatch","triggers","re","map","triggerLength","triggerMatch","getMatch","providedOptions","RegExp","Array","isArray","sort","providedOptionsObject","reduce","acc","triggersMatch","slugData","triggersIndex","substring","triggerIdx","triggerOptions","matchedSlug","filteredOptions","filter","idx","indexOf","currTrigger","updateCaretPosition","newCaret","requestAnimationFrame","default","setCaretPosition","caretPos","helperOptions","caretCoordinates","rect","getBoundingClientRect","newTop","scrollTop","newLeft","Math","min","scrollLeft","innerWidth","resetHelper","handleChange","target","end","max","newValue","slice","handleBlur","handleSelection","part1","part2","event","changedStr","advanceCaretDistance","handleKeyDown","optionsCount","keyCode","preventDefault","prevSelection","renderAutocompleteList","optionNumber","val","helper","split","undefined","renderHighlightedText","text","highlightStart","highlightedText","startsWith","strong","li","className","active","onClick","onMouseDown","onMouseEnter","ref","role","code","maxWidth","maxHeight","innerHeight","ul","autocompleteInput","style","opacity","pointerEvents","position","visibility","div","textarea","rows","overflow"],"mappings":"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"}
|