create-gardener 2.0.8 → 2.1.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/README.md +328 -140
- package/package.json +1 -1
- package/template/build/backend/controllers/gardener/addComponent.d.ts +8 -0
- package/template/build/backend/controllers/gardener/addComponent.d.ts.map +1 -0
- package/template/build/backend/controllers/gardener/addComponent.js +19 -0
- package/template/build/backend/controllers/gardener/addComponent.js.map +1 -0
- package/template/build/backend/controllers/gardener/addPage.d.ts +3 -0
- package/template/build/backend/controllers/gardener/addPage.d.ts.map +1 -0
- package/template/build/backend/controllers/gardener/addPage.js +76 -0
- package/template/build/backend/controllers/gardener/addPage.js.map +1 -0
- package/template/build/backend/controllers/gardener/createStatic.d.ts +3 -0
- package/template/build/backend/controllers/gardener/createStatic.d.ts.map +1 -0
- package/template/build/backend/controllers/gardener/createStatic.js +61 -0
- package/template/build/backend/controllers/gardener/createStatic.js.map +1 -0
- package/template/build/backend/controllers/gardener/imageOptimiser.d.ts +3 -0
- package/template/build/backend/controllers/gardener/imageOptimiser.d.ts.map +1 -0
- package/template/build/backend/controllers/gardener/imageOptimiser.js +54 -0
- package/template/build/backend/controllers/gardener/imageOptimiser.js.map +1 -0
- package/template/build/backend/controllers/gardener/index.d.ts +6 -0
- package/template/build/backend/controllers/gardener/index.d.ts.map +1 -0
- package/template/build/backend/controllers/gardener/index.js +6 -0
- package/template/build/backend/controllers/gardener/index.js.map +1 -0
- package/template/build/backend/controllers/gardener/saveTemplate.d.ts +3 -0
- package/template/build/backend/controllers/gardener/saveTemplate.d.ts.map +1 -0
- package/template/build/backend/controllers/gardener/saveTemplate.js +36 -0
- package/template/build/backend/controllers/gardener/saveTemplate.js.map +1 -0
- package/template/build/backend/libs/generateWebp.d.ts +2 -0
- package/template/build/backend/libs/generateWebp.d.ts.map +1 -0
- package/template/build/backend/libs/generateWebp.js +18 -0
- package/template/build/backend/libs/generateWebp.js.map +1 -0
- package/template/build/backend/routes/gardener.route.d.ts +4 -0
- package/template/build/backend/routes/gardener.route.d.ts.map +1 -0
- package/template/build/backend/routes/gardener.route.js +13 -0
- package/template/build/backend/routes/gardener.route.js.map +1 -0
- package/template/build/backend/server.d.ts +2 -0
- package/template/build/backend/server.d.ts.map +1 -0
- package/template/build/backend/server.js +20 -0
- package/template/build/backend/server.js.map +1 -0
- package/template/build/frontend/assets/favicon.png +0 -0
- package/template/build/frontend/assets/gardener.jpg +0 -0
- package/template/build/frontend/static/cache/favicon_500x500.webp +0 -0
- package/template/build/frontend/static/cache/favicon_50x50.webp +0 -0
- package/template/build/frontend/static/cache/gardener_500x500.webp +0 -0
- package/template/build/frontend/static/cache/gardener_50x50.webp +0 -0
- package/template/build/frontend/static/components/copybtn.js +86 -0
- package/template/build/frontend/static/components/nonui/api.js +39 -0
- package/template/build/frontend/static/components/nonui/navigation.js +59 -0
- package/template/build/frontend/static/components/notification.js +67 -0
- package/template/build/frontend/static/gardener.js +89 -0
- package/template/build/frontend/static/gardener.test.js +364 -0
- package/template/build/frontend/static/gardenerConfig.js +1 -0
- package/template/build/frontend/static/gardenerDev.js +499 -0
- package/template/build/frontend/static/global.js +4 -0
- package/template/build/frontend/static/pages/pages._.js +20 -0
- package/template/build/frontend/static/style.css +2 -0
- package/template/build/frontend/static/style2.css +26 -0
- package/template/build/frontend/static/zod.js +8 -0
- package/template/build/frontend/style.css +1045 -0
- package/template/build/frontend/tailwind.css +1 -0
- package/template/build/frontend/views/_.ejs +121 -0
- package/template/build/frontend/views/partials/icons/clipboard.ejs +1 -0
- package/template/build/frontend/views/partials/icons/clipboardok.ejs +1 -0
- package/template/src/backend/controllers/gardener/addPage.ts +30 -24
- package/template/src/backend/controllers/gardener/createStatic.ts +1 -0
- package/template/src/backend/controllers/gardener/saveTemplate.ts +1 -1
- package/template/src/backend/libs/generateWebp.ts +0 -2
- package/template/src/frontend/static/cache/gardener_100x100.webp +0 -0
- package/template/src/frontend/static/components/copybtn.js +16 -3
- package/template/src/frontend/static/components/footer.js +33 -0
- package/template/src/frontend/static/components/gardener/errorBox.js +47 -0
- package/template/src/frontend/static/components/gardener/hotReloadbtn.js +82 -0
- package/template/src/frontend/static/components/gardener/pageOverlayBtn.js +138 -0
- package/template/src/frontend/static/components/gardener/parserWindow.js +159 -0
- package/template/src/frontend/static/components/nonui/api.js +15 -2
- package/template/src/frontend/static/gardener.js +129 -58
- package/template/src/frontend/static/gardenerDev.js +65 -399
- package/template/src/frontend/static/global.js +1 -1
- package/template/src/frontend/static/pages/pages._.js +5 -0
- package/template/src/frontend/static/style.css +101 -1
- package/template/src/frontend/static/style2.css +2 -2
- package/template/src/frontend/static/pages/pages._al.js +0 -2
- package/template/src/frontend/static/pages/pages._new.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createStatic.d.ts","sourceRoot":"","sources":["../../../../src/backend/controllers/gardener/createStatic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAWjD,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,+CAwE7D"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fsp from "fs/promises";
|
|
3
|
+
import ejs from "ejs";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = path.dirname(__filename);
|
|
7
|
+
const frontendDir = path.resolve(__dirname, '..', '..', '..', 'frontend');
|
|
8
|
+
export async function createStatic(req, res) {
|
|
9
|
+
try {
|
|
10
|
+
const viewsDir = path.join(frontendDir, "views");
|
|
11
|
+
const outDir = path.resolve("src/tempfrontend");
|
|
12
|
+
const finalOut = path.resolve("src/frontendStatic");
|
|
13
|
+
await fsp.mkdir(outDir, { recursive: true });
|
|
14
|
+
await fsp.mkdir(finalOut, { recursive: true });
|
|
15
|
+
const entries = await fsp.readdir(viewsDir, { withFileTypes: true });
|
|
16
|
+
const rendered = [];
|
|
17
|
+
for (const entry of entries) {
|
|
18
|
+
// skip folders (partials, layouts, etc.)
|
|
19
|
+
if (!entry.isFile())
|
|
20
|
+
continue;
|
|
21
|
+
if (!entry.name.endsWith(".ejs"))
|
|
22
|
+
continue;
|
|
23
|
+
const inputPath = path.join(viewsDir, entry.name);
|
|
24
|
+
const outputName = entry.name.replace(/\.ejs$/, ".html");
|
|
25
|
+
const outputPath = path.join(outDir, outputName);
|
|
26
|
+
const html = await ejs.renderFile(inputPath, {}, {
|
|
27
|
+
// async: true,
|
|
28
|
+
views: [viewsDir], // needed for includes
|
|
29
|
+
});
|
|
30
|
+
await fsp.writeFile(outputPath, html, "utf8");
|
|
31
|
+
rendered.push(outputName);
|
|
32
|
+
}
|
|
33
|
+
const entries3 = await fsp.readdir(outDir, { withFileTypes: true });
|
|
34
|
+
for (const entry of entries3) {
|
|
35
|
+
// "_path1_path2_path3.html" -> ["path1", "path2", "path3"]
|
|
36
|
+
const parts = entry.name
|
|
37
|
+
.replace(/^_/, "")
|
|
38
|
+
.replace(/\.html$/, "")
|
|
39
|
+
.split("_");
|
|
40
|
+
const targetDir = path.join(finalOut, ...parts);
|
|
41
|
+
const targetFile = path.join(targetDir, "index.html");
|
|
42
|
+
// ensure directories exist
|
|
43
|
+
await fsp.mkdir(targetDir, { recursive: true });
|
|
44
|
+
console.log('done');
|
|
45
|
+
// copy file
|
|
46
|
+
await fsp.copyFile(path.join(outDir, entry.name), targetFile);
|
|
47
|
+
}
|
|
48
|
+
await fsp.rm(outDir, { recursive: true, force: true });
|
|
49
|
+
await fsp.cp(path.join(frontendDir, "static"), path.join(finalOut, 'static'), { recursive: true });
|
|
50
|
+
return res.json({
|
|
51
|
+
success: true,
|
|
52
|
+
generated: rendered,
|
|
53
|
+
outDir,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
console.error(err);
|
|
58
|
+
return res.status(500).json({ error: "Static build failed" });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=createStatic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createStatic.js","sourceRoot":"","sources":["../../../../src/backend/controllers/gardener/createStatic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imageOptimiser.d.ts","sourceRoot":"","sources":["../../../../src/backend/controllers/gardener/imageOptimiser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAWjD,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,sDAuD/D"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import fsp from "fs/promises";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import generateWebP from "../../libs/generateWebp.js";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = path.dirname(__filename);
|
|
7
|
+
export async function imageOptimiser(req, res) {
|
|
8
|
+
try {
|
|
9
|
+
const { name } = req.params;
|
|
10
|
+
if (typeof name !== 'string')
|
|
11
|
+
return res.status(400).json({ success: false, message: "invalid path" });
|
|
12
|
+
// name format: test_500x300.webp
|
|
13
|
+
const match = name.match(/^(.+?)_(\d+)x(\d+)\.webp$/);
|
|
14
|
+
if (!match) {
|
|
15
|
+
return res.status(400).json({ error: "Invalid image format" });
|
|
16
|
+
}
|
|
17
|
+
const [, baseName, widthStr, heightStr] = match;
|
|
18
|
+
if (!widthStr || !heightStr)
|
|
19
|
+
return;
|
|
20
|
+
const width = parseInt(widthStr, 10);
|
|
21
|
+
const height = parseInt(heightStr, 10);
|
|
22
|
+
const cacheDir = path.join(__dirname, "..", "..", "..", "frontend", "static", "cache");
|
|
23
|
+
await fsp.mkdir(cacheDir, { recursive: true });
|
|
24
|
+
const outputPath = path.join(cacheDir, name);
|
|
25
|
+
try {
|
|
26
|
+
await fsp.access(outputPath);
|
|
27
|
+
return res.sendFile(path.basename(outputPath), {
|
|
28
|
+
root: path.dirname(outputPath),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// not cached → continue
|
|
33
|
+
}
|
|
34
|
+
const assetsDir = path.resolve(__dirname, '..', '..', '..', "frontend", "assets");
|
|
35
|
+
const files = await fsp.readdir(assetsDir);
|
|
36
|
+
const sourceFile = files.find((file) => {
|
|
37
|
+
const parsed = path.parse(file);
|
|
38
|
+
return parsed.name === baseName;
|
|
39
|
+
});
|
|
40
|
+
if (!sourceFile) {
|
|
41
|
+
return res.status(404).json({ error: "Source image not found" });
|
|
42
|
+
}
|
|
43
|
+
const inputPath = path.join(assetsDir, sourceFile);
|
|
44
|
+
await generateWebP(inputPath, outputPath, width, height);
|
|
45
|
+
return res.sendFile(path.basename(outputPath), {
|
|
46
|
+
root: path.dirname(outputPath),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
console.error(err);
|
|
51
|
+
return res.status(500).json({ error: "Image optimisation failed" });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=imageOptimiser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imageOptimiser.js","sourceRoot":"","sources":["../../../../src/backend/controllers/gardener/imageOptimiser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/backend/controllers/gardener/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/backend/controllers/gardener/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saveTemplate.d.ts","sourceRoot":"","sources":["../../../../src/backend/controllers/gardener/saveTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAWjD,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,+CA8B7D"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import fsp from "fs/promises";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = path.dirname(__filename);
|
|
6
|
+
const frontendDir = path.resolve(__dirname, "..", "..", "..", "frontend");
|
|
7
|
+
const templateDir = path.join(frontendDir, "template");
|
|
8
|
+
export async function saveTemplate(req, res) {
|
|
9
|
+
try {
|
|
10
|
+
const { path: reqPath } = req.body; // ✅ renamed
|
|
11
|
+
const name = reqPath;
|
|
12
|
+
const sourceFile = path.join(frontendDir, 'views', `${name}.ejs`);
|
|
13
|
+
const sourceFileContent = await fsp.readFile(sourceFile, "utf-8");
|
|
14
|
+
const targetFileContent = replaceLastOccurrence(sourceFileContent, `/static/pages/pages.${name}.js`, "");
|
|
15
|
+
// ✅ ensure directory exists
|
|
16
|
+
await fsp.mkdir(templateDir, { recursive: true });
|
|
17
|
+
await fsp.writeFile(path.join(templateDir, `template.${name}.ejs`), targetFileContent, "utf-8");
|
|
18
|
+
return res.json({ message: "Template Saved Successfully" });
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
console.error(err);
|
|
22
|
+
return res.status(500).json({ message: "Something went wrong" });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function replaceLastOccurrence(content, searchPattern, replacementLine) {
|
|
26
|
+
const lines = content.split("\n");
|
|
27
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
28
|
+
if (lines[i].includes(searchPattern)) {
|
|
29
|
+
lines[i] = replacementLine; // ✅ replace cleanly
|
|
30
|
+
return lines.join("\n"); // ✅ return result
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
console.warn(`Pattern not found: ${searchPattern}`);
|
|
34
|
+
return content; // fallback
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=saveTemplate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saveTemplate.js","sourceRoot":"","sources":["../../../../src/backend/controllers/gardener/saveTemplate.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,aAAa,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAY,EAAE,GAAa;IAC5D,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,YAAY;QAEhD,MAAM,IAAI,GAAG,OAAO,CAAC;QAErB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;QAElE,MAAM,iBAAiB,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAElE,MAAM,iBAAiB,GAAG,qBAAqB,CAC7C,iBAAiB,EACjB,uBAAuB,IAAI,KAAK,EAChC,EAAE,CACH,CAAC;QAEF,4BAA4B;QAC5B,MAAM,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAElD,MAAM,GAAG,CAAC,SAAS,CACjB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,IAAI,MAAM,CAAC,EAC9C,iBAAiB,EACjB,OAAO,CACR,CAAC;QAEF,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAAe,EACf,aAAqB,EACrB,eAAuB;IAEvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,oBAAoB;YAChD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAI,kBAAkB;QAChD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,sBAAsB,aAAa,EAAE,CAAC,CAAC;IACpD,OAAO,OAAO,CAAC,CAAC,WAAW;AAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateWebp.d.ts","sourceRoot":"","sources":["../../../src/backend/libs/generateWebp.ts"],"names":[],"mappings":"AAIA,wBAA8B,YAAY,CACxC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fsp from "fs/promises";
|
|
3
|
+
import sharp from "sharp";
|
|
4
|
+
export default async function generateWebP(inputPath, outputPath, width, height) {
|
|
5
|
+
const cacheDir = path.dirname(outputPath);
|
|
6
|
+
await fsp.mkdir(cacheDir, { recursive: true });
|
|
7
|
+
console.log(`Processing image: ${inputPath}`);
|
|
8
|
+
console.log(`Output path: ${outputPath}`);
|
|
9
|
+
await sharp(inputPath)
|
|
10
|
+
.resize(width, height, {
|
|
11
|
+
fit: "inside",
|
|
12
|
+
withoutEnlargement: true,
|
|
13
|
+
})
|
|
14
|
+
.webp({ quality: 100 })
|
|
15
|
+
.toFile(outputPath);
|
|
16
|
+
console.log("✅ Image successfully generated");
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=generateWebp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateWebp.js","sourceRoot":"","sources":["../../../src/backend/libs/generateWebp.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,aAAa,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,YAAY,CACxC,SAAiB,EACjB,UAAkB,EAClB,KAAa,EACb,MAAc;IAEd,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAC;IAE1C,MAAM,KAAK,CAAC,SAAS,CAAC;SACnB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;QACrB,GAAG,EAAE,QAAQ;QACb,kBAAkB,EAAE,IAAI;KACzB,CAAC;SACD,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;SACtB,MAAM,CAAC,UAAU,CAAC,CAAC;IAEtB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gardener.route.d.ts","sourceRoot":"","sources":["../../../src/backend/routes/gardener.route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,QAAA,MAAM,MAAM,EAAE,MAAiB,CAAC;AAChC,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Router } from "express";
|
|
2
|
+
import { addComponent, addPage, createStatic, imageOptimiser, saveTemplate } from "../controllers/gardener/index.js";
|
|
3
|
+
const router = Router();
|
|
4
|
+
export default router;
|
|
5
|
+
router.route("/static/cache/:name").get(imageOptimiser);
|
|
6
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
7
|
+
router.route("/createstatic").get(createStatic);
|
|
8
|
+
router.route('/addcomponent').post(addComponent);
|
|
9
|
+
router.route('/addpage').post(addPage);
|
|
10
|
+
router.route('/savetemplate').post(saveTemplate);
|
|
11
|
+
}
|
|
12
|
+
router.route('/').get((req, res) => res.render('_', { fileName: '_' }));
|
|
13
|
+
//# sourceMappingURL=gardener.route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gardener.route.js","sourceRoot":"","sources":["../../../src/backend/routes/gardener.route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAErH,MAAM,MAAM,GAAW,MAAM,EAAE,CAAC;AAChC,eAAe,MAAM,CAAC;AAKtB,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAExD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;IAC1C,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACnD,CAAC;AAMD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/backend/server.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// server.ts
|
|
2
|
+
import 'dotenv/config';
|
|
3
|
+
import express from 'express';
|
|
4
|
+
import frontendRoute from './routes/gardener.route.js';
|
|
5
|
+
import path from "path";
|
|
6
|
+
const app = express();
|
|
7
|
+
import { fileURLToPath } from "url";
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = path.dirname(__filename);
|
|
10
|
+
const staticFiles = path.resolve(__dirname, '..', 'frontend');
|
|
11
|
+
app.set('views', path.join(staticFiles, 'views'));
|
|
12
|
+
app.set("view engine", "ejs");
|
|
13
|
+
app.use(express.static(staticFiles));
|
|
14
|
+
app.use(express.json());
|
|
15
|
+
app.use(frontendRoute);
|
|
16
|
+
const PORT = process.env.PORT || 3000;
|
|
17
|
+
app.listen(PORT, () => {
|
|
18
|
+
console.log("server listening 🚀🚀🚀 PORT:", PORT);
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/backend/server.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,OAAO,eAAe,CAAC;AACvB,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,aAAa,MAAM,4BAA4B,CAAA;AACtD,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AAGtB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,CAAA;AAE7D,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAClD,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;AAC9B,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AACrC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AACxB,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAEvB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;AAEtC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACpB,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC"}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
|
|
2
|
+
import { gardener, fetchElement, replaceElement } from '../gardener.js'
|
|
3
|
+
|
|
4
|
+
export function copybtn() {
|
|
5
|
+
return gardener({
|
|
6
|
+
"t": "button",
|
|
7
|
+
"cn": [
|
|
8
|
+
"copybtn",
|
|
9
|
+
"flex",
|
|
10
|
+
"items-center",
|
|
11
|
+
"justify-center",
|
|
12
|
+
"p-2",
|
|
13
|
+
"text-gray-400",
|
|
14
|
+
"hover:text-white",
|
|
15
|
+
"hover:bg-white/10",
|
|
16
|
+
"rounded",
|
|
17
|
+
"transition-all",
|
|
18
|
+
"duration-200",
|
|
19
|
+
"active:scale-95"
|
|
20
|
+
],
|
|
21
|
+
"attr": {
|
|
22
|
+
"title": "Copy to clipboard"
|
|
23
|
+
},
|
|
24
|
+
"children": [
|
|
25
|
+
{
|
|
26
|
+
"t": "span",
|
|
27
|
+
"cn": [
|
|
28
|
+
"w-5",
|
|
29
|
+
"h-5"
|
|
30
|
+
],
|
|
31
|
+
"children": [
|
|
32
|
+
{
|
|
33
|
+
"t": "svg",
|
|
34
|
+
"cn": [
|
|
35
|
+
"icon",
|
|
36
|
+
"icon-tabler",
|
|
37
|
+
"icons-tabler-outline",
|
|
38
|
+
"icon-tabler-clipboard-check"
|
|
39
|
+
],
|
|
40
|
+
"attr": {
|
|
41
|
+
"xmlns": "http://www.w3.org/2000/svg",
|
|
42
|
+
"width": "24",
|
|
43
|
+
"height": "24",
|
|
44
|
+
"viewBox": "0 0 24 24",
|
|
45
|
+
"fill": "none",
|
|
46
|
+
"stroke": "currentColor",
|
|
47
|
+
"stroke-width": "2",
|
|
48
|
+
"stroke-linecap": "round",
|
|
49
|
+
"stroke-linejoin": "round"
|
|
50
|
+
},
|
|
51
|
+
"children": [
|
|
52
|
+
{
|
|
53
|
+
"t": "path",
|
|
54
|
+
"attr": {
|
|
55
|
+
"stroke": "none",
|
|
56
|
+
"d": "M0 0h24v24H0z",
|
|
57
|
+
"fill": "none"
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"t": "path",
|
|
62
|
+
"attr": {
|
|
63
|
+
"d": "M9 5h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-12a2 2 0 0 0 -2 -2h-2"
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"t": "path",
|
|
68
|
+
"attr": {
|
|
69
|
+
"d": "M9 5a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2"
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"t": "path",
|
|
74
|
+
"attr": {
|
|
75
|
+
"d": "M9 14l2 2l4 -4"
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const baseName = '';
|
|
2
|
+
|
|
3
|
+
export async function Fetch(
|
|
4
|
+
path,
|
|
5
|
+
body,
|
|
6
|
+
method = 'POST'
|
|
7
|
+
) {
|
|
8
|
+
|
|
9
|
+
try {
|
|
10
|
+
|
|
11
|
+
const headers = {
|
|
12
|
+
"Content-Type": "application/json",
|
|
13
|
+
"ngrok-skip-browser-warning": 'true'
|
|
14
|
+
// "Authorization": 'Bearer ' + auth
|
|
15
|
+
}
|
|
16
|
+
let res;
|
|
17
|
+
if (method === 'GET' || method === 'DELETE')
|
|
18
|
+
res = await fetch(baseName + path, {
|
|
19
|
+
credentials: "include",
|
|
20
|
+
headers: headers,
|
|
21
|
+
method,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
else
|
|
25
|
+
res = await fetch(baseName + path, {
|
|
26
|
+
credentials: "include",
|
|
27
|
+
headers: headers,
|
|
28
|
+
method,
|
|
29
|
+
body: JSON.stringify(body),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
return res
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
console.log(err)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { gardener, fetchElement, appendElement } from "/static/gardener.js";
|
|
2
|
+
import { mode } from "/static/gardenerConfig.js";
|
|
3
|
+
|
|
4
|
+
const body = fetchElement('#main');
|
|
5
|
+
|
|
6
|
+
export function nextPagehandler() {
|
|
7
|
+
const anchor = document.querySelectorAll('a')
|
|
8
|
+
anchor.forEach(link => {
|
|
9
|
+
|
|
10
|
+
link.addEventListener('click', (e) => {
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
e.preventDefault();
|
|
14
|
+
nextPage(link.href)
|
|
15
|
+
|
|
16
|
+
})
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
window.addEventListener('pagehide', () => {
|
|
22
|
+
setTimeout(() => {
|
|
23
|
+
body.style.transform = 'translateX(0px)';
|
|
24
|
+
setTimeout(() => {
|
|
25
|
+
try {
|
|
26
|
+
fetchElement('.tempnpdiv').remove()
|
|
27
|
+
}
|
|
28
|
+
catch (err) { }
|
|
29
|
+
|
|
30
|
+
}, 200)
|
|
31
|
+
}, 200);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function nextPage(link) {
|
|
37
|
+
|
|
38
|
+
appendElement(body, gardener({
|
|
39
|
+
t: 'div',
|
|
40
|
+
cn: ['tempnpdiv', 'top-0', 'left-[100vw]', 'fixed', 'h-screen', 'w-screen'],
|
|
41
|
+
}))
|
|
42
|
+
const width = window.innerWidth
|
|
43
|
+
console.log(width)
|
|
44
|
+
body.style.transition = '.2s';
|
|
45
|
+
body.style.transform = `translateX(-${width}px)`
|
|
46
|
+
setTimeout(() => {
|
|
47
|
+
window.location.href = link
|
|
48
|
+
}, 200)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function pageloader() {
|
|
52
|
+
const loader = fetchElement('.loader');
|
|
53
|
+
loader.style.transition = '.4s';
|
|
54
|
+
loader.style.opacity = '0';
|
|
55
|
+
if (mode !== 'dev')
|
|
56
|
+
setTimeout(() => loader.remove(), 400)
|
|
57
|
+
else
|
|
58
|
+
loader.remove();
|
|
59
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { gardener, replaceElement, fetchElement } from '/static/gardener.js';
|
|
2
|
+
|
|
3
|
+
export default function addNotification(noti) {
|
|
4
|
+
console.log('clicked');
|
|
5
|
+
replaceElement(fetchElement('.notification'), Notification(noti));
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function Notification(notification) {
|
|
9
|
+
if (!notification) return null;
|
|
10
|
+
|
|
11
|
+
const statusStyles = {
|
|
12
|
+
success: "bg-[#2e7d32]",
|
|
13
|
+
warning: "bg-[#ed6c02]",
|
|
14
|
+
failure: "bg-[#d32f2f]",
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
return gardener({
|
|
19
|
+
"t": "div",
|
|
20
|
+
"cn": [
|
|
21
|
+
"notification",
|
|
22
|
+
"fixed",
|
|
23
|
+
"top-[-60px]",
|
|
24
|
+
"left-0",
|
|
25
|
+
"md:left-auto",
|
|
26
|
+
"md:right-[60px]",
|
|
27
|
+
"right-0",
|
|
28
|
+
"z-50",
|
|
29
|
+
"flex",
|
|
30
|
+
"justify-center",
|
|
31
|
+
"min-w-100",
|
|
32
|
+
"px-4",
|
|
33
|
+
"box-border"
|
|
34
|
+
],
|
|
35
|
+
"children": [
|
|
36
|
+
{
|
|
37
|
+
"t": "div",
|
|
38
|
+
"cn": [
|
|
39
|
+
"flex",
|
|
40
|
+
"items-center",
|
|
41
|
+
"w-full",
|
|
42
|
+
"max-w-sm",
|
|
43
|
+
"p-4",
|
|
44
|
+
"rounded-2xl",
|
|
45
|
+
"shadow-xl",
|
|
46
|
+
"text-white",
|
|
47
|
+
"backdrop-blur-md",
|
|
48
|
+
"bg-opacity-95",
|
|
49
|
+
statusStyles[notification.status]
|
|
50
|
+
],
|
|
51
|
+
"children": [
|
|
52
|
+
{
|
|
53
|
+
"t": "div",
|
|
54
|
+
"cn": [
|
|
55
|
+
"flex-1",
|
|
56
|
+
"text-sm",
|
|
57
|
+
"font-medium",
|
|
58
|
+
"tracking-wide"
|
|
59
|
+
],
|
|
60
|
+
"txt": notification.message
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|