@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.
Files changed (87) hide show
  1. package/dist/ai/models/anthropic/generateRichText.d.ts.map +1 -1
  2. package/dist/ai/models/anthropic/generateRichText.js +2 -2
  3. package/dist/ai/models/anthropic/generateRichText.js.map +1 -1
  4. package/dist/ai/models/anthropic/index.d.ts.map +1 -1
  5. package/dist/ai/models/anthropic/index.js +0 -25
  6. package/dist/ai/models/anthropic/index.js.map +1 -1
  7. package/dist/ai/models/elevenLabs/index.js.map +1 -1
  8. package/dist/ai/models/openai/generateRichText.js +2 -2
  9. package/dist/ai/models/openai/generateRichText.js.map +1 -1
  10. package/dist/ai/models/openai/index.d.ts.map +1 -1
  11. package/dist/ai/models/openai/index.js +0 -27
  12. package/dist/ai/models/openai/index.js.map +1 -1
  13. package/dist/ai/prompts.js +1 -1
  14. package/dist/ai/prompts.js.map +1 -1
  15. package/dist/ai/schemas/lexicalJsonSchema.d.ts +2 -0
  16. package/dist/ai/schemas/lexicalJsonSchema.d.ts.map +1 -0
  17. package/dist/ai/schemas/lexicalJsonSchema.js +317 -0
  18. package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -0
  19. package/dist/ai/utils/generateFileNameByPrompt.js.map +1 -1
  20. package/dist/ai/utils/systemGenerate.d.ts +5 -0
  21. package/dist/ai/utils/systemGenerate.d.ts.map +1 -0
  22. package/dist/ai/utils/{generateSeedPrompt.js → systemGenerate.js} +2 -2
  23. package/dist/ai/utils/systemGenerate.js.map +1 -0
  24. package/dist/collections/Instructions.d.ts +1 -1
  25. package/dist/collections/Instructions.d.ts.map +1 -1
  26. package/dist/collections/Instructions.js +177 -85
  27. package/dist/collections/Instructions.js.map +1 -1
  28. package/dist/defaults.d.ts +1 -1
  29. package/dist/defaults.d.ts.map +1 -1
  30. package/dist/defaults.js +1 -1
  31. package/dist/defaults.js.map +1 -1
  32. package/dist/endpoints/fetchFields.d.ts +3 -0
  33. package/dist/endpoints/fetchFields.d.ts.map +1 -0
  34. package/dist/endpoints/fetchFields.js +21 -0
  35. package/dist/endpoints/fetchFields.js.map +1 -0
  36. package/dist/endpoints/index.d.ts.map +1 -1
  37. package/dist/endpoints/index.js +12 -17
  38. package/dist/endpoints/index.js.map +1 -1
  39. package/dist/fields/LexicalEditor/ComposeFeatureComponent.d.ts.map +1 -1
  40. package/dist/fields/LexicalEditor/ComposeFeatureComponent.js +1 -0
  41. package/dist/fields/LexicalEditor/ComposeFeatureComponent.js.map +1 -1
  42. package/dist/index.d.ts +1 -2
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +2 -3
  45. package/dist/index.js.map +1 -1
  46. package/dist/init.d.ts.map +1 -1
  47. package/dist/init.js +11 -15
  48. package/dist/init.js.map +1 -1
  49. package/dist/libraries/autocomplete/AutocompleteTextArea.js.map +1 -1
  50. package/dist/libraries/handlebars/helpers.js.map +1 -1
  51. package/dist/plugin.d.ts.map +1 -1
  52. package/dist/plugin.js +9 -34
  53. package/dist/plugin.js.map +1 -1
  54. package/dist/providers/InstructionsProvider/InstructionsProvider.d.ts.map +1 -1
  55. package/dist/providers/InstructionsProvider/InstructionsProvider.js +8 -6
  56. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  57. package/dist/providers/InstructionsProvider/useInstructions.js +1 -1
  58. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  59. package/dist/types.d.ts +2 -2
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/types.js.map +1 -1
  62. package/dist/ui/Compose/Compose.d.ts.map +1 -1
  63. package/dist/ui/Compose/Compose.js +6 -4
  64. package/dist/ui/Compose/Compose.js.map +1 -1
  65. package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
  66. package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
  67. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  68. package/dist/ui/Compose/hooks/useGenerate.d.ts.map +1 -1
  69. package/dist/ui/Compose/hooks/useGenerate.js +15 -16
  70. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  71. package/dist/ui/Compose/hooks/useHistory.js +1 -1
  72. package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
  73. package/dist/utilities/updateFieldsConfig.d.ts.map +1 -1
  74. package/dist/utilities/updateFieldsConfig.js +6 -4
  75. package/dist/utilities/updateFieldsConfig.js.map +1 -1
  76. package/package.json +6 -9
  77. package/dist/ai/schemas/lexical.schema.d.ts +0 -31
  78. package/dist/ai/schemas/lexical.schema.d.ts.map +0 -1
  79. package/dist/ai/schemas/lexical.schema.js +0 -102
  80. package/dist/ai/schemas/lexical.schema.js.map +0 -1
  81. package/dist/ai/utils/generateSeedPrompt.d.ts +0 -5
  82. package/dist/ai/utils/generateSeedPrompt.d.ts.map +0 -1
  83. package/dist/ai/utils/generateSeedPrompt.js.map +0 -1
  84. package/dist/utilities/jsonToZod.d.ts +0 -3
  85. package/dist/utilities/jsonToZod.d.ts.map +0 -1
  86. package/dist/utilities/jsonToZod.js +0 -33
  87. 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\nexport const Instructions: CollectionConfig = {\n slug: PLUGIN_INSTRUCTIONS_TABLE,\n\n // TODO: Revisit permissions, better if end user can provide this\n access: {\n create: () => true,\n read: () => true,\n update: () => true,\n },\n admin: {\n hidden: true,\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: '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 name: 'prompt',\n type: 'textarea',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/fields#PromptEditorField',\n },\n },\n },\n ...groupSettings,\n ],\n hooks: {\n beforeChange: [\n (req) => {\n if (req.data['openai-gpt-object-settings']?.layout?.length === 0) {\n // TODO: why??\n req.data['openai-gpt-object-settings'].layout = ''\n }\n return req.data\n },\n ],\n },\n}\n"],"names":["GenerationModels","PLUGIN_INSTRUCTIONS_TABLE","groupSettings","reduce","fields","model","settings","push","modelOptions","map","label","name","value","id","Instructions","slug","access","create","read","update","admin","hidden","type","readOnly","unique","defaultValue","options","components","Field","clientProps","filterByField","path","option","hooks","beforeChange","req","data","layout","length"],"mappings":"AAEA,SAASA,gBAAgB,QAAQ,wBAAuB;AACxD,SAASC,yBAAyB,QAAQ,iBAAgB;AAE1D,MAAMC,gBAAgBF,iBAAiBG,MAAM,CAAC,CAACC,QAAQC;IACrD,IAAIA,MAAMC,QAAQ,EAAE;QAClBF,OAAOG,IAAI,CAACF,MAAMC,QAAQ;IAC5B;IACA,OAAOF;AACT,GAAG,EAAE;AAEL,MAAMI,eAAeR,iBAAiBS,GAAG,CAAC,CAACJ;IACzC,OAAO;QACLD,QAAQC,MAAMD,MAAM;QACpBM,OAAOL,MAAMM,IAAI;QACjBC,OAAOP,MAAMQ,EAAE;IACjB;AACF;AAEA,OAAO,MAAMC,eAAiC;IAC5CC,MAAMd;IAEN,iEAAiE;IACjEe,QAAQ;QACNC,QAAQ,IAAM;QACdC,MAAM,IAAM;QACZC,QAAQ,IAAM;IAChB;IACAC,OAAO;QACLC,QAAQ;IACV;IACAjB,QAAQ;QACN;YACEO,MAAM;YACNW,MAAM;YACNF,OAAO;gBACLG,UAAU;YACZ;YACAC,QAAQ;QACV;QACA;YACEb,MAAM;YACNW,MAAM;YACNF,OAAO;gBACLG,UAAU;YACZ;YACAE,cAAc;YACdf,OAAO;YACPgB,SAAS;gBACP;oBACEhB,OAAO;oBACPE,OAAO;gBACT;gBACA;oBACEF,OAAO;oBACPE,OAAO;gBACT;gBACA;oBACEF,OAAO;oBACPE,OAAO;gBACT;gBACA;oBACEF,OAAO;oBACPE,OAAO;gBACT;aACD;QACH;QACA;YACED,MAAM;YACNW,MAAM;YACNF,OAAO;gBACLO,YAAY;oBACVC,OAAO;wBACLC,aAAa;4BACXC,eAAe;4BACfJ,SAASlB;wBACX;wBACAuB,MAAM;oBACR;gBACF;YACF;YACArB,OAAO;YACPgB,SAASlB,aAAaC,GAAG,CAAC,CAACuB;gBACzB,OAAO;oBACLtB,OAAOsB,OAAOtB,KAAK;oBACnBE,OAAOoB,OAAOpB,KAAK;gBACrB;YACF;QACF;QACA;YACED,MAAM;YACNW,MAAM;YACNF,OAAO;gBACLO,YAAY;oBACVC,OAAO;gBACT;YACF;QACF;WACG1B;KACJ;IACD+B,OAAO;QACLC,cAAc;YACZ,CAACC;gBACC,IAAIA,IAAIC,IAAI,CAAC,6BAA6B,EAAEC,QAAQC,WAAW,GAAG;oBAChE,cAAc;oBACdH,IAAIC,IAAI,CAAC,6BAA6B,CAACC,MAAM,GAAG;gBAClD;gBACA,OAAOF,IAAIC,IAAI;YACjB;SACD;IACH;AACF,EAAC"}
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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"}
@@ -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
@@ -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,8BAA8B,+BAAqC,CAAA;AAChF,eAAO,MAAM,6BAA6B,8BAAmC,CAAA;AAG7E,eAAO,MAAM,wBAAwB,eAAoB,CAAA;AACzD,eAAO,MAAM,4BAA4B,wBAAyC,CAAA;AAClF,eAAO,MAAM,mCAAmC,+BAA2C,CAAA;AAG3F,eAAO,MAAM,2BAA2B,gBAAgB,CAAA;AACxD,eAAO,MAAM,8BAA8B,6BAA6B,CAAA"}
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`;
@@ -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 PLUGIN_INSTRUCTIONS_MAP_GLOBAL = `${PLUGIN_INSTRUCTIONS_TABLE}-map`\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`\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_INSTRUCTIONS_MAP_GLOBAL","PLUGIN_LEXICAL_EDITOR_FEATURE","PLUGIN_API_ENDPOINT_BASE","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_DEFAULT_OPENAI_MODEL","PLUGIN_DEFAULT_ANTHROPIC_MODEL"],"mappings":"AAAA,OAAO,MAAMA,cAAc,YAAW;AACtC,OAAO,MAAMC,4BAA4B,CAAC,EAAED,YAAY,aAAa,CAAC,CAAA;AACtE,OAAO,MAAME,iCAAiC,CAAC,EAAED,0BAA0B,IAAI,CAAC,CAAA;AAChF,OAAO,MAAME,gCAAgC,CAAC,EAAEH,YAAY,gBAAgB,CAAC,CAAA;AAE7E,oBAAoB;AACpB,OAAO,MAAMI,2BAA2B,CAAC,CAAC,EAAEJ,YAAY,CAAC,CAAA;AACzD,OAAO,MAAMK,+BAA+B,CAAC,EAAED,yBAAyB,SAAS,CAAC,CAAA;AAClF,OAAO,MAAME,sCAAsC,CAAC,EAAED,6BAA6B,OAAO,CAAC,CAAA;AAE3F,eAAe;AACf,OAAO,MAAME,8BAA8B,CAAC,WAAW,CAAC,CAAA;AACxD,OAAO,MAAMC,iCAAiC,CAAC,wBAAwB,CAAC,CAAA"}
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,3 @@
1
+ import type { Endpoint } from 'payload';
2
+ export declare const fetchFields: Endpoint;
3
+ //# sourceMappingURL=fetchFields.d.ts.map
@@ -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;AAsE7D,eAAO,MAAM,SAAS,EAAE,SAsIvB,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"}
@@ -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
- system: systemPrompt
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 { editorConfig: { schema: editorSchema = lexicalSchema() } = {} } = collection.custom || {};
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
- //TODO: remove this
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: modelOptions.layout,
76
- systemPrompt: modelOptions.system,
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, uploadCollectionSlug } = options;
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
- console.log('prompt text:', text);
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":"AAKA,eAAO,MAAM,uBAAuB,+CAQnC,CAAA"}
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;AAE9C,SAASC,eAAe,QAAQ,0DAAyD;AACzF,SAASC,OAAO,QAAQ,8BAA6B;AAErD,OAAO,MAAMC,0BAA0B;IACrC,MAAM,EAAEC,UAAU,EAAE,GAAGJ;IAEvB,MAAM,EAAEK,IAAIC,aAAa,EAAE,GAAGL,gBAAgB;QAC5CM,MAAMH;IACR;IAEA,qBAAO,KAACF;QAAQI,eAAeA;;AACjC,EAAC"}
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 { LexicalBaseNode } from './ai/schemas/lexical.schema.js';
8
+ export { payloadAiPlugin } from './plugin.js';
10
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,mCAAmC,EAAE,MAAM,0CAA0C,CAAA;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA"}
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 { payloadAiPlugin } from './plugin.js';
7
- export { PayloadAiPluginLexicalEditorFeature } from './fields/LexicalEditor/feature.server.js';
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 { payloadAiPlugin } from './plugin.js'\nexport { PayloadAiPluginLexicalEditorFeature } from './fields/LexicalEditor/feature.server.js'\nexport { LexicalBaseNode } from './ai/schemas/lexical.schema.js'\n"],"names":["payloadAiPlugin","PayloadAiPluginLexicalEditorFeature","LexicalBaseNode"],"mappings":"AAAA;;;;;CAKC,GAED,SAASA,eAAe,QAAQ,cAAa;AAC7C,SAASC,mCAAmC,QAAQ,2CAA0C;AAC9F,SAASC,eAAe,QAAQ,iCAAgC"}
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"}
@@ -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;AAMtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,eAAO,MAAM,IAAI,YAAmB,OAAO,uCAAkC,YAAY,kBA2FxF,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 { generateSeedPrompt } from './ai/utils/generateSeedPrompt.js';
4
- import { PLUGIN_INSTRUCTIONS_MAP_GLOBAL, PLUGIN_INSTRUCTIONS_TABLE } from './defaults.js';
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 generateSeedPrompt({
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((a)=>{
50
- console.log('err-', a);
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
- payload.logger.info(`— AI Plugin: Enabled fieldMap: ${JSON.stringify(fieldInstructionsMap, null, 2)}`);
68
- await payload.updateGlobal({
69
- slug: PLUGIN_INSTRUCTIONS_MAP_GLOBAL,
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 { GenerationModels } from './ai/models/index.js'\nimport { seedPrompts } from './ai/prompts.js'\nimport { generateSeedPrompt } from './ai/utils/generateSeedPrompt.js'\nimport { PLUGIN_INSTRUCTIONS_MAP_GLOBAL, PLUGIN_INSTRUCTIONS_TABLE } from './defaults.js'\nimport type { PluginConfig } from './types.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 } = fieldSchemaPaths[path]\n //TODO: if global is broken the plugin doesn't know and does not run reindexing\n const entry = await payload.find({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\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 generateSeedPrompt({\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 'schema-path': path,\n },\n })\n .then((a) => a)\n .catch((a) => {\n console.log('err-', a)\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 payload.logger.info(\n `— AI Plugin: Enabled fieldMap: ${JSON.stringify(fieldInstructionsMap, null, 2)}`,\n )\n await payload.updateGlobal({\n slug: PLUGIN_INSTRUCTIONS_MAP_GLOBAL, // required\n data: {\n map: fieldInstructionsMap,\n },\n depth: 2,\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","generateSeedPrompt","PLUGIN_INSTRUCTIONS_MAP_GLOBAL","PLUGIN_INSTRUCTIONS_TABLE","init","payload","fieldSchemaPaths","pluginConfig","logger","info","paths","Object","keys","fieldInstructionsMap","i","length","path","type","fieldType","label","fieldLabel","entry","find","collection","where","equals","docs","prompt","system","generatedPrompt","generatePromptOnInit","instructions","create","data","a","fields","includes","id","then","catch","console","log","JSON","stringify","updateGlobal","slug","map","depth"],"mappings":"AAEA,SAASA,gBAAgB,QAAQ,uBAAsB;AACvD,SAASC,WAAW,QAAQ,kBAAiB;AAC7C,SAASC,kBAAkB,QAAQ,mCAAkC;AACrE,SAASC,8BAA8B,EAAEC,yBAAyB,QAAQ,gBAAe;AAGzF,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,EAAE,GAAGd,gBAAgB,CAACU,KAAK;QACrE,+EAA+E;QAC/E,MAAMK,QAAQ,MAAMhB,QAAQiB,IAAI,CAAC;YAC/BC,YAAYpB;YACZqB,OAAO;gBACL,cAAc;oBACZC,QAAQP;gBACV;gBACA,eAAe;oBACbO,QAAQT;gBACV;YACF;QACF;QAEA,IAAI,CAACK,OAAOK,MAAMX,QAAQ;YACxB,MAAM,EAAEY,MAAM,EAAEC,MAAM,EAAE,GAAG5B,YAAY;gBACrCoB;gBACAd;gBACAY;gBACAF;YACF;YAEA,IAAIa,kBAAkB;YACtB,IAAItB,aAAauB,oBAAoB,EAAE;gBACrCD,kBAAkB,MAAM5B,mBAAmB;oBACzC0B;oBACAC;gBACF;gBACAvB,QAAQG,MAAM,CAACC,IAAI,CACjB,CAAC,wBAAwB,EAAEW,WAAW,kBAAkB,EAAES,gBAAgB,IAAI,CAAC;YAEnF;YAEA,MAAME,eAAe,MAAM1B,QACxB2B,MAAM,CAAC;gBACNT,YAAYpB;gBACZ8B,MAAM;oBACJ,cAAcf;oBACd,YAAYnB,iBAAiBuB,IAAI,CAAC,CAACY;wBACjC,OAAOA,EAAEC,MAAM,CAACC,QAAQ,CAAClB;oBAC3B,IAAImB;oBACJV,QAAQE;oBACR,eAAeb;gBACjB;YACF,GACCsB,IAAI,CAAC,CAACJ,IAAMA,GACZK,KAAK,CAAC,CAACL;gBACNM,QAAQC,GAAG,CAAC,QAAQP;YACtB;YAEF,mBAAmB;YACnB,IAAIH,cAAcM,IAAI;gBACpBxB,oBAAoB,CAACG,KAAK,GAAG;oBAC3BqB,IAAIN,aAAaM,EAAE;oBACnBnB;gBACF;YACF;QACF,OAAO;YACL,MAAM,CAACa,aAAa,GAAGV,MAAMK,IAAI;YACjCb,oBAAoB,CAACG,KAAK,GAAG;gBAC3BqB,IAAIN,aAAaM,EAAE;gBACnBnB;YACF;QACF;IACF;IAEAb,QAAQG,MAAM,CAACC,IAAI,CACjB,CAAC,+BAA+B,EAAEiC,KAAKC,SAAS,CAAC9B,sBAAsB,MAAM,GAAG,CAAC;IAEnF,MAAMR,QAAQuC,YAAY,CAAC;QACzBC,MAAM3C;QACN+B,MAAM;YACJa,KAAKjC;QACP;QACAkC,OAAO;IACT;IAEA1C,QAAQG,MAAM,CAACC,IAAI,CAAC,CAAC,yBAAyB,CAAC;IAC/C,IAAIF,aAAauB,oBAAoB,EAAE;QACrCzB,QAAQG,MAAM,CAACC,IAAI,CACjB;IAEJ;AACF,EAAC"}
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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"}