@paroicms/site-generator-plugin 0.6.0 → 0.8.0
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/gen-backend/ddl/site-generator.ddl.sql +22 -0
- package/gen-backend/dist/commands/execute-command.js +60 -0
- package/gen-backend/dist/{generator/session → commands}/generator-session.js +16 -8
- package/gen-backend/dist/context.js +6 -0
- package/gen-backend/dist/db/db-init.js +35 -0
- package/gen-backend/dist/db/db.queries.js +60 -0
- package/gen-backend/dist/db/ddl-migration.js +15 -0
- package/gen-backend/dist/generator/fake-content-generator.ts/content-report.js +11 -0
- package/gen-backend/dist/generator/fake-content-generator.ts/create-database-with-fake-content.js +21 -15
- package/gen-backend/dist/generator/fake-content-generator.ts/create-node-contents.js +10 -4
- package/gen-backend/dist/generator/llm-queries/invoke-message-guard.js +2 -0
- package/gen-backend/dist/generator/llm-queries/invoke-new-site-analysis.js +4 -1
- package/gen-backend/dist/generator/llm-queries/invoke-update-site-schema.js +7 -2
- package/gen-backend/dist/generator/site-generator/document-template-creator.js +19 -2
- package/gen-backend/dist/generator/site-generator/site-generator.js +14 -11
- package/gen-backend/dist/generator/site-generator/template-helpers.js +5 -2
- package/gen-backend/dist/generator/site-schema-generator/create-site-schema.js +1 -1
- package/gen-backend/dist/lib/site-remover.js +39 -0
- package/gen-backend/dist/plugin.js +41 -23
- package/gen-backend/images/im01.webp +0 -0
- package/gen-backend/images/im02.webp +0 -0
- package/gen-backend/images/im03.webp +0 -0
- package/gen-backend/images/im04.webp +0 -0
- package/gen-backend/images/im05.webp +0 -0
- package/gen-backend/images/im06.webp +0 -0
- package/gen-backend/images/im07.webp +0 -0
- package/gen-backend/images/im08.webp +0 -0
- package/gen-backend/images/im09.webp +0 -0
- package/gen-backend/images/im10.webp +0 -0
- package/gen-backend/images/im11.webp +0 -0
- package/gen-backend/images/im12.webp +0 -0
- package/gen-backend/prompts/predefined-fields.json +25 -21
- package/gen-backend/prompts/update-site-schema-2-execute.md +2 -1
- package/gen-front/dist/gen-front.css +1 -1
- package/package.json +10 -8
- package/gen-backend/dist/generator/actions.js +0 -45
- package/gen-backend/images/im01.jpg +0 -0
- package/gen-backend/images/im02.jpg +0 -0
- package/gen-backend/images/im03.jpg +0 -0
- package/gen-backend/images/im04.jpg +0 -0
- package/gen-backend/images/im05.jpg +0 -0
- package/gen-backend/images/im06.jpg +0 -0
- package/gen-backend/images/im07.jpg +0 -0
- package/gen-backend/images/im08.jpg +0 -0
- package/gen-backend/images/im09.jpg +0 -0
- package/gen-backend/images/im10.jpg +0 -0
- package/gen-backend/images/im11.jpg +0 -0
- package/gen-backend/images/im12.jpg +0 -0
- /package/gen-backend/dist/{generator/generator-types.js → lib/internal-types.js} +0 -0
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
import { ChatAnthropic } from "@langchain/anthropic";
|
|
2
2
|
import { ChatMistralAI } from "@langchain/mistralai";
|
|
3
|
-
import {
|
|
4
|
-
import { pathExists } from "@paroicms/internal-server-lib";
|
|
3
|
+
import { getJwtSecretSync, pathExists } from "@paroicms/internal-server-lib";
|
|
5
4
|
import { ApiError, escapeHtml } from "@paroicms/public-server-lib";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { executeCommand } from "./commands/execute-command.js";
|
|
7
|
+
import { SLUG, packageDir, pluginVersion } from "./context.js";
|
|
9
8
|
import { formatGeneratorCommand, formatGeneratorPluginConfiguration } from "./data-format.js";
|
|
10
|
-
import {
|
|
9
|
+
import { createOrOpenSiteGeneratorConnection } from "./db/db-init.js";
|
|
11
10
|
import { initializeImageNames } from "./generator/lib/images-lib.js";
|
|
12
|
-
|
|
13
|
-
const version = strVal(JSON.parse(readFileSync(join(packageDir, "package.json"), "utf-8")).version);
|
|
14
|
-
const SLUG = "site-generator";
|
|
11
|
+
import { removeExpiredSites } from "./lib/site-remover.js";
|
|
15
12
|
await initializeImageNames();
|
|
16
13
|
const plugin = {
|
|
17
|
-
version,
|
|
14
|
+
version: pluginVersion,
|
|
18
15
|
slug: SLUG,
|
|
19
16
|
async siteInit(service) {
|
|
17
|
+
const { cn, logNextQuery } = await createOrOpenSiteGeneratorConnection({
|
|
18
|
+
sqliteFile: join(service.registeredSite.dataDir, "site-generator.sqlite"),
|
|
19
|
+
canCreate: true,
|
|
20
|
+
logger: service.logger,
|
|
21
|
+
});
|
|
20
22
|
const pluginConf = formatGeneratorPluginConfiguration(service.configuration);
|
|
21
23
|
let debugDir = pluginConf.debugDir;
|
|
22
24
|
if (debugDir) {
|
|
@@ -55,6 +57,32 @@ const plugin = {
|
|
|
55
57
|
temperature: 0.2,
|
|
56
58
|
maxTokens: 50_000,
|
|
57
59
|
});
|
|
60
|
+
let rawContext;
|
|
61
|
+
service.registerHook("initialized", (service) => {
|
|
62
|
+
const packConf = service.connector.getSitePackConf(pluginConf.packName);
|
|
63
|
+
const { sitesDir, packName } = packConf;
|
|
64
|
+
if (!sitesDir || packConf.serveOn !== "subDomain") {
|
|
65
|
+
throw new Error(`Site-generator plugin can generate sites only for sub-domain pack with "sitesDir", but pack "${packName}" doesn't have it`);
|
|
66
|
+
}
|
|
67
|
+
rawContext = {
|
|
68
|
+
cn,
|
|
69
|
+
logNextQuery,
|
|
70
|
+
jwtSecret: getJwtSecretSync(join(service.registeredSite.dataDir, "site-generator-secret.txt")),
|
|
71
|
+
pluginConf,
|
|
72
|
+
bestModel,
|
|
73
|
+
bestModelName: bestModel.model,
|
|
74
|
+
goodModel,
|
|
75
|
+
goodModelName: goodModel.model,
|
|
76
|
+
cheapModel,
|
|
77
|
+
cheapModelName: cheapModel.model,
|
|
78
|
+
debugDir,
|
|
79
|
+
sitesDir,
|
|
80
|
+
packConf,
|
|
81
|
+
service,
|
|
82
|
+
logger: service.logger,
|
|
83
|
+
};
|
|
84
|
+
removeExpiredSites(rawContext).catch(console.error);
|
|
85
|
+
});
|
|
58
86
|
service.setPublicAssetsDirectory(join(packageDir, "gen-front", "dist"));
|
|
59
87
|
const scriptAttr = [
|
|
60
88
|
["type", "module"],
|
|
@@ -64,24 +92,14 @@ const plugin = {
|
|
|
64
92
|
];
|
|
65
93
|
service.addHeadTag(`<link rel="stylesheet" href="${escapeHtml(`${service.pluginAssetsUrl}/gen-front.css`)}">`, `<script ${scriptAttr.map(([key, val]) => `${key}="${escapeHtml(val)}"`).join(" ")}></script>`);
|
|
66
94
|
service.setPublicApiHandler(async (service, httpContext, relativePath) => {
|
|
95
|
+
if (!rawContext)
|
|
96
|
+
throw new Error("should be initialized");
|
|
97
|
+
const ctx = rawContext;
|
|
67
98
|
const { req, res } = httpContext;
|
|
68
99
|
if (relativePath !== "") {
|
|
69
100
|
res.status(404).send({ status: 404 });
|
|
70
101
|
return;
|
|
71
102
|
}
|
|
72
|
-
const ctx = {
|
|
73
|
-
pluginConf,
|
|
74
|
-
packConf: service.connector.getSitePackConf(pluginConf.packName),
|
|
75
|
-
service,
|
|
76
|
-
logger: service.logger,
|
|
77
|
-
bestModel,
|
|
78
|
-
bestModelName: bestModel.model,
|
|
79
|
-
goodModel,
|
|
80
|
-
goodModelName: goodModel.model,
|
|
81
|
-
cheapModel,
|
|
82
|
-
cheapModelName: cheapModel.model,
|
|
83
|
-
debugDir,
|
|
84
|
-
};
|
|
85
103
|
let command;
|
|
86
104
|
try {
|
|
87
105
|
command = formatGeneratorCommand(req.body);
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,110 +1,114 @@
|
|
|
1
1
|
[
|
|
2
2
|
{
|
|
3
3
|
"fieldName": "leadParagraph",
|
|
4
|
-
"dataType": "quillDelta",
|
|
5
4
|
"localized": true,
|
|
5
|
+
"dataType": "json",
|
|
6
|
+
"renderAs": "html",
|
|
6
7
|
"description": "Lead paragraph, or \"chapo\", of a post (HTML)"
|
|
7
8
|
},
|
|
8
9
|
{
|
|
9
10
|
"fieldName": "htmlContent",
|
|
10
|
-
"dataType": "quillDelta",
|
|
11
11
|
"localized": true,
|
|
12
|
+
"dataType": "json",
|
|
13
|
+
"renderAs": "html",
|
|
12
14
|
"description": "HTML Content"
|
|
13
15
|
},
|
|
14
16
|
{
|
|
15
17
|
"fieldName": "introduction",
|
|
16
|
-
"dataType": "quillDelta",
|
|
17
18
|
"localized": true,
|
|
19
|
+
"dataType": "json",
|
|
20
|
+
"renderAs": "html",
|
|
18
21
|
"description": "A short introduction (HTML)"
|
|
19
22
|
},
|
|
20
23
|
{
|
|
21
24
|
"fieldName": "footerMention",
|
|
22
|
-
"dataType": "
|
|
25
|
+
"dataType": "json",
|
|
26
|
+
"renderAs": "html",
|
|
23
27
|
"localized": true,
|
|
24
28
|
"description": "The footer mention is used to display a legal notice or a disclaimer (HTML). Usually included as a site field."
|
|
25
29
|
},
|
|
26
30
|
{
|
|
27
31
|
"fieldName": "logo",
|
|
28
|
-
"dataType": "media",
|
|
29
32
|
"localized": false,
|
|
33
|
+
"dataType": "media",
|
|
30
34
|
"description": "A logo is an image that represents a brand"
|
|
31
35
|
},
|
|
32
36
|
{
|
|
33
37
|
"fieldName": "slogan",
|
|
34
|
-
"dataType": "string",
|
|
35
38
|
"localized": true,
|
|
39
|
+
"dataType": "string",
|
|
36
40
|
"description": "A slogan is a memorable motto or phrase as a repetitive expression of an idea or purpose"
|
|
37
41
|
},
|
|
38
42
|
{
|
|
39
43
|
"fieldName": "phone",
|
|
40
|
-
"dataType": "string",
|
|
41
44
|
"localized": false,
|
|
45
|
+
"dataType": "string",
|
|
42
46
|
"description": "Phone number"
|
|
43
47
|
},
|
|
44
48
|
{
|
|
45
49
|
"fieldName": "phone2",
|
|
46
|
-
"dataType": "string",
|
|
47
50
|
"localized": false,
|
|
51
|
+
"dataType": "string",
|
|
48
52
|
"description": "Secondary phone number"
|
|
49
53
|
},
|
|
50
54
|
{
|
|
51
55
|
"fieldName": "title",
|
|
52
|
-
"dataType": "string",
|
|
53
56
|
"localized": true,
|
|
57
|
+
"dataType": "string",
|
|
54
58
|
"description": "Store a title"
|
|
55
59
|
},
|
|
56
60
|
{
|
|
57
61
|
"fieldName": "shortTitle",
|
|
58
|
-
"dataType": "string",
|
|
59
62
|
"localized": true,
|
|
63
|
+
"dataType": "string",
|
|
60
64
|
"description": "A short title can be useful for buttons or menu items"
|
|
61
65
|
},
|
|
62
66
|
{
|
|
63
67
|
"fieldName": "gallery",
|
|
64
|
-
"dataType": "gallery",
|
|
65
68
|
"localized": false,
|
|
69
|
+
"dataType": "gallery",
|
|
66
70
|
"description": "A collection of medias. It can be rendered as a carousel, a slider, a slideshow, an image gallery etc."
|
|
67
71
|
},
|
|
68
72
|
{
|
|
69
73
|
"fieldName": "image",
|
|
70
|
-
"dataType": "media",
|
|
71
74
|
"localized": false,
|
|
75
|
+
"dataType": "media",
|
|
72
76
|
"description": "An image"
|
|
73
77
|
},
|
|
74
78
|
{
|
|
75
79
|
"fieldName": "backgroundImage",
|
|
76
|
-
"dataType": "media",
|
|
77
80
|
"localized": false,
|
|
81
|
+
"dataType": "media",
|
|
78
82
|
"description": "A background image"
|
|
79
83
|
},
|
|
80
84
|
{
|
|
81
85
|
"fieldName": "translatedImage",
|
|
82
|
-
"dataType": "media",
|
|
83
86
|
"localized": true,
|
|
87
|
+
"dataType": "media",
|
|
84
88
|
"description": "Image that will be different depending on the language (localized)"
|
|
85
89
|
},
|
|
86
90
|
{
|
|
87
91
|
"fieldName": "featuredDocument",
|
|
88
|
-
"dataType": "string",
|
|
89
92
|
"localized": false,
|
|
93
|
+
"dataType": "string",
|
|
90
94
|
"description": "A link to a featured document"
|
|
91
95
|
},
|
|
92
96
|
{
|
|
93
97
|
"fieldName": "phones",
|
|
94
|
-
"dataType": "json",
|
|
95
98
|
"localized": false,
|
|
99
|
+
"dataType": "json",
|
|
96
100
|
"description": "A list of phone numbers"
|
|
97
101
|
},
|
|
98
102
|
{
|
|
99
103
|
"fieldName": "video",
|
|
100
|
-
"dataType": "string",
|
|
101
104
|
"localized": false,
|
|
102
|
-
"
|
|
105
|
+
"dataType": "string",
|
|
106
|
+
"description": "A YouTube video"
|
|
103
107
|
},
|
|
104
108
|
{
|
|
105
|
-
"fieldName": "
|
|
106
|
-
"dataType": "string",
|
|
109
|
+
"fieldName": "oneLanguageVideo",
|
|
107
110
|
"localized": true,
|
|
108
|
-
"
|
|
111
|
+
"dataType": "string",
|
|
112
|
+
"description": "A YouTube video, but different for each language"
|
|
109
113
|
}
|
|
110
114
|
]
|
|
@@ -23,7 +23,8 @@ Here is an example of an object for describing a custom **HTML** field type:
|
|
|
23
23
|
"name": "myCustomField",
|
|
24
24
|
"localized": true,
|
|
25
25
|
"storedAs": "text",
|
|
26
|
-
"dataType": "
|
|
26
|
+
"dataType": "json",
|
|
27
|
+
"renderAs": "html",
|
|
27
28
|
"useAsExcerpt": 1,
|
|
28
29
|
"plugin": "@paroicms/quill-editor-plugin"
|
|
29
30
|
}}
|