create-gardener 2.1.3 → 2.1.5
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 +108 -302
- package/package.json +1 -1
- package/template/.env +3 -0
- package/template/README.md +181 -0
- package/template/buildHelper.js +5 -0
- package/template/src/backend/controllers/gardener/hotReload.ts +34 -0
- package/template/src/backend/controllers/gardener/imageOptimiser.ts +114 -25
- package/template/src/backend/controllers/gardener/index.ts +1 -0
- package/template/src/backend/routes/gardener.route.ts +2 -1
- package/template/src/backend/server.ts +19 -1
- package/template/src/frontend/assets/remote/betterway.jpg +0 -0
- package/template/src/frontend/static/components/gardener/hotReloadbtn.js +25 -78
- package/template/src/frontend/static/gardenerDev.js +2 -18
- package/template/src/frontend/static/style.css +0 -77
- package/template/src/frontend/views/_.ejs +101 -89
- package/template/build/backend/controllers/gardener/addComponent.d.ts +0 -8
- package/template/build/backend/controllers/gardener/addComponent.d.ts.map +0 -1
- package/template/build/backend/controllers/gardener/addComponent.js +0 -19
- package/template/build/backend/controllers/gardener/addComponent.js.map +0 -1
- package/template/build/backend/controllers/gardener/addPage.d.ts +0 -3
- package/template/build/backend/controllers/gardener/addPage.d.ts.map +0 -1
- package/template/build/backend/controllers/gardener/addPage.js +0 -86
- package/template/build/backend/controllers/gardener/addPage.js.map +0 -1
- package/template/build/backend/controllers/gardener/createStatic.d.ts +0 -3
- package/template/build/backend/controllers/gardener/createStatic.d.ts.map +0 -1
- package/template/build/backend/controllers/gardener/createStatic.js +0 -63
- package/template/build/backend/controllers/gardener/createStatic.js.map +0 -1
- package/template/build/backend/controllers/gardener/imageOptimiser.d.ts +0 -3
- package/template/build/backend/controllers/gardener/imageOptimiser.d.ts.map +0 -1
- package/template/build/backend/controllers/gardener/imageOptimiser.js +0 -54
- package/template/build/backend/controllers/gardener/imageOptimiser.js.map +0 -1
- package/template/build/backend/controllers/gardener/index.d.ts +0 -6
- package/template/build/backend/controllers/gardener/index.d.ts.map +0 -1
- package/template/build/backend/controllers/gardener/index.js +0 -6
- package/template/build/backend/controllers/gardener/index.js.map +0 -1
- package/template/build/backend/controllers/gardener/saveTemplate.d.ts +0 -3
- package/template/build/backend/controllers/gardener/saveTemplate.d.ts.map +0 -1
- package/template/build/backend/controllers/gardener/saveTemplate.js +0 -36
- package/template/build/backend/controllers/gardener/saveTemplate.js.map +0 -1
- package/template/build/backend/libs/generateWebp.d.ts +0 -2
- package/template/build/backend/libs/generateWebp.d.ts.map +0 -1
- package/template/build/backend/libs/generateWebp.js +0 -16
- package/template/build/backend/libs/generateWebp.js.map +0 -1
- package/template/build/backend/routes/gardener.route.d.ts +0 -4
- package/template/build/backend/routes/gardener.route.d.ts.map +0 -1
- package/template/build/backend/routes/gardener.route.js +0 -18
- package/template/build/backend/routes/gardener.route.js.map +0 -1
- package/template/build/backend/server.d.ts +0 -2
- package/template/build/backend/server.d.ts.map +0 -1
- package/template/build/backend/server.js +0 -20
- package/template/build/backend/server.js.map +0 -1
- package/template/build/frontend/assets/favicon.png +0 -0
- package/template/build/frontend/assets/gardener.jpg +0 -0
- package/template/build/frontend/static/bundle/bundle._.js +0 -1
- package/template/build/frontend/static/bundle/bundle._about.js +0 -1
- package/template/build/frontend/static/bundle/bundle._kartik.js +0 -1
- package/template/build/frontend/static/bundle/bundle._new.js +0 -1
- package/template/build/frontend/static/bundle/bundle._ritish.js +0 -1
- 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_100x100.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 +0 -99
- package/template/build/frontend/static/components/footer.js +0 -33
- package/template/build/frontend/static/components/gardener/errorBox.js +0 -47
- package/template/build/frontend/static/components/gardener/hotReloadbtn.js +0 -82
- package/template/build/frontend/static/components/gardener/pageOverlayBtn.js +0 -138
- package/template/build/frontend/static/components/gardener/parserWindow.js +0 -159
- package/template/build/frontend/static/components/nonui/api.js +0 -52
- package/template/build/frontend/static/components/nonui/navigation.js +0 -59
- package/template/build/frontend/static/components/notification.js +0 -67
- package/template/build/frontend/static/gardener.js +0 -160
- package/template/build/frontend/static/gardenerConfig.js +0 -1
- package/template/build/frontend/static/gardenerDev.js +0 -165
- package/template/build/frontend/static/global.js +0 -4
- package/template/build/frontend/static/pages/pages._.js +0 -25
- package/template/build/frontend/static/pages/pages._about.js +0 -2
- package/template/build/frontend/static/pages/pages._kartik.js +0 -2
- package/template/build/frontend/static/pages/pages._new.js +0 -2
- package/template/build/frontend/static/pages/pages._ritish.js +0 -2
- package/template/build/frontend/static/style.css +0 -2
- package/template/build/frontend/static/style2.css +0 -26
- package/template/build/frontend/style.css +0 -1045
- package/template/build/frontend/tailwind.css +0 -1
- package/template/build/frontend/views/_.ejs +0 -125
- package/template/build/frontend/views/_about.ejs +0 -126
- package/template/build/frontend/views/_kartik.ejs +0 -126
- package/template/build/frontend/views/_new.ejs +0 -126
- package/template/build/frontend/views/_ritish.ejs +0 -126
- package/template/build/frontend/views/partials/icons/clipboard.ejs +0 -1
- package/template/build/frontend/views/partials/icons/clipboardok.ejs +0 -1
- package/template/src/frontend/static/cache/favicon_500x500.webp +0 -0
- package/template/src/frontend/static/cache/favicon_50x50.webp +0 -0
- package/template/src/frontend/static/cache/gardener_100x100.webp +0 -0
- package/template/src/frontend/static/cache/gardener_500x500.webp +0 -0
|
@@ -1,83 +1,94 @@
|
|
|
1
1
|
<!DOCTYPE html>
|
|
2
2
|
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<link rel="icon" type="image/svg+xml" href="/static/cache/favicon_50x50.webp" />
|
|
7
|
-
<link href="/static/style.css" rel="stylesheet"/>
|
|
8
|
-
<link href="/static/style2.css" rel="stylesheet"/>
|
|
9
|
-
<title>Gardener: The Mini Web Framework</title>
|
|
10
|
-
</head>
|
|
11
|
-
<body class="bg-slate-50 text-slate-900 font-sans">
|
|
12
3
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
<link rel="icon" type="image/svg+xml" href="/static/cache/favicon_50x50.webp" />
|
|
8
|
+
<link href="/static/style.css" rel="stylesheet" />
|
|
9
|
+
<link href="/static/style2.css" rel="stylesheet" />
|
|
10
|
+
<title>Gardener: The Mini Web Framework</title>
|
|
11
|
+
</head>
|
|
16
12
|
|
|
17
|
-
|
|
13
|
+
<body class="bg-slate-50 text-slate-900 font-sans">
|
|
18
14
|
|
|
15
|
+
<div class='hidden' id='fileName'><%=fileName%></div>
|
|
16
|
+
<div class='loader w-screen h-screen bg-white fixed z-2'> </div>
|
|
17
|
+
<div class='notification'></div>
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
<a class="block
|
|
34
|
-
|
|
19
|
+
<div id='main'>
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
<!-- hero -->
|
|
23
|
+
<div class='hero flex-wrap w-full h-screen bg-green-200 flex justify-center items-center px-10'>
|
|
24
|
+
<div class='w-200'>
|
|
25
|
+
<a href="https://ritish.site">Home</a> > <a href="https://ritish.site/projects">Projects</a> > <a
|
|
26
|
+
href="/">Gardener</a>
|
|
27
|
+
<h1 class='text-6xl my-10 font-bold text-green-900'>Gardener</h1>
|
|
28
|
+
<h2 class='text-2xl font-bold text-green-800 mb-4'>Develop With No Bloat</h2>
|
|
29
|
+
<p class="text-lg mb-6 max-w-md">Gardener is a lightweight, DOM-first front-end library. No virtual DOM, no JSX,
|
|
30
|
+
and no compilation step. Just the real DOM.</p>
|
|
31
|
+
<div class='flex gap-2 m-2'>
|
|
32
|
+
<a class="block bg-green-700 text-white px-8 py-3 rounded-lg font-bold hover:bg-green-800 transition"
|
|
33
|
+
href='/get-started'>Get Started</a>
|
|
34
|
+
<a class="block border border-green-700 text-black px-8 py-3 rounded-lg font-bold hover:text-white hover:bg-green-800 transition"
|
|
35
|
+
href='/documentation/#introduction'>Documentation</a>
|
|
36
|
+
</div>
|
|
37
|
+
<div class='flex gap-2 m-2'>
|
|
38
|
+
<a class="block border border-green-700 text-black px-8 py-3 rounded-lg font-bold hover:text-white hover:bg-green-800 transition"
|
|
39
|
+
href='https://github.com/ritishDas/Gardener'>View On Github</a>
|
|
40
|
+
<a class="block border border-green-700 text-black px-8 py-3 rounded-lg font-bold hover:text-white hover:bg-green-800 transition"
|
|
41
|
+
href='https://www.npmjs.com/package/create-gardener'>View On npm</a>
|
|
35
42
|
</div>
|
|
36
|
-
<img src="/static/cache/gardener_500x500.webp" alt="Gardener Logo" class="w-96 h-96 object-contain ml-10">
|
|
37
43
|
</div>
|
|
44
|
+
<img src="/static/cache/betterway_200x200.webp?url=https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQIc-V0t9zqjdPUe6IoI4M7U4jSW6yY6dhhtw&s" alt="Gardener Logo" class="w-96 h-96 object-contain ml-10">
|
|
45
|
+
</div>
|
|
38
46
|
|
|
39
|
-
|
|
40
|
-
<div
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
47
|
+
<!-- Copy command -->
|
|
48
|
+
<div
|
|
49
|
+
class="flex w-1/4 items-center mx-auto my-15 justify-between gap-4 bg-[#1e1e1e] border border-gray-700 rounded-lg px-4 py-3 font-mono shadow-sm group">
|
|
50
|
+
<span class="text-sm md:text-base text-gray-300 select-all">
|
|
51
|
+
<span class="text-emerald-400 mr-2">$</span><span class='initCommand'>pnpm create gardener app</span>
|
|
52
|
+
</span>
|
|
53
|
+
|
|
54
|
+
<button
|
|
55
|
+
class="copybtn flex items-center justify-center p-2 text-gray-400 hover:text-white hover:bg-white/10 rounded transition-all duration-200 active:scale-95"
|
|
56
|
+
title="Copy to clipboard">
|
|
57
|
+
<span class="w-5 h-5">
|
|
58
|
+
<%- include('partials/icons/clipboard') %>
|
|
59
|
+
</span>
|
|
60
|
+
</button>
|
|
61
|
+
</div>
|
|
62
|
+
<!-- Philosophy -->
|
|
63
|
+
<div class="max-w-5xl mx-auto py-20 px-6 grid md:grid-cols-2 gap-12">
|
|
64
|
+
<div>
|
|
65
|
+
<h3 class="text-3xl font-bold mb-4 text-green-900">✨ Philosophy</h3>
|
|
66
|
+
<ul class="space-y-3 text-slate-700">
|
|
67
|
+
<li><strong>DOM-First:</strong> Renders directly to the real DOM.</li>
|
|
68
|
+
<li><strong>Deterministic:</strong> If you can inspect it, you can understand it.</li>
|
|
69
|
+
<li><strong>Native:</strong> Works in the browser via ES modules.</li>
|
|
70
|
+
<li><strong>Zero Build:</strong> No bundlers or magic required.</li>
|
|
71
|
+
</ul>
|
|
72
|
+
</div>
|
|
62
73
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
</div>
|
|
74
|
+
<!-- Features -->
|
|
75
|
+
<div>
|
|
76
|
+
<h3 class="text-3xl font-bold mb-4 text-green-900">🚀 Features</h3>
|
|
77
|
+
<div class="grid grid-cols-2 gap-4">
|
|
78
|
+
<div class="p-4 bg-white shadow-sm border border-green-100 rounded">Declarative UI</div>
|
|
79
|
+
<div class="p-4 bg-white shadow-sm border border-green-100 rounded">SVG Namespace Support</div>
|
|
80
|
+
<div class="p-4 bg-white shadow-sm border border-green-100 rounded">Hot Reload</div>
|
|
81
|
+
<div class="p-4 bg-white shadow-sm border border-green-100 rounded">Image Optimization</div>
|
|
72
82
|
</div>
|
|
73
83
|
</div>
|
|
84
|
+
</div>
|
|
74
85
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
<pre class="text-blue-300">
|
|
86
|
+
<!-- Api Example -->
|
|
87
|
+
<div class="bg-slate-900 py-20 text-white">
|
|
88
|
+
<div class="max-w-5xl mx-auto px-6">
|
|
89
|
+
<h3 class="text-3xl font-bold mb-8 text-center text-green-400">The Core API</h3>
|
|
90
|
+
<div class="bg-slate-800 p-6 rounded-xl border border-slate-700 font-mono text-sm overflow-x-auto">
|
|
91
|
+
<pre class="text-blue-300">
|
|
81
92
|
gardener({
|
|
82
93
|
t: <span class="text-green-300">'div'</span>,
|
|
83
94
|
cn: [<span class="text-green-300">'p-6'</span>, <span class="text-green-300">'flex'</span>],
|
|
@@ -91,35 +102,36 @@ gardener({
|
|
|
91
102
|
]
|
|
92
103
|
})
|
|
93
104
|
</pre>
|
|
94
|
-
</div>
|
|
95
105
|
</div>
|
|
96
106
|
</div>
|
|
107
|
+
</div>
|
|
97
108
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
</div>
|
|
109
|
+
<div class="max-w-5xl mx-auto py-20 px-6 text-center">
|
|
110
|
+
<h3 class="text-3xl font-bold mb-4 text-green-900">🧠 Simple State</h3>
|
|
111
|
+
<p class="mb-8 text-slate-600">No proxies. No diffing. Just clean, reactive callbacks.</p>
|
|
112
|
+
<div class="inline-block text-left bg-white p-6 rounded shadow-lg border-t-4 border-green-500 font-mono text-sm">
|
|
113
|
+
<p class="text-slate-500">// Initialize</p>
|
|
114
|
+
<p>const count = new State(0);</p>
|
|
115
|
+
<p class="text-slate-500 mt-2">// React</p>
|
|
116
|
+
<p>count.registerCb(val => updateUI(val));</p>
|
|
107
117
|
</div>
|
|
108
|
-
|
|
109
|
-
<!-- Footer -->
|
|
110
|
-
<footer class="bg-green-900 text-green-100 py-12 text-center">
|
|
111
|
-
<p class="text-xl italic">"Because sometimes you don't need a forest. Just a garden."</p>
|
|
112
|
-
<div class="mt-6 text-sm opacity-70">
|
|
113
|
-
MIT Licensed | Built on Express & EJS
|
|
114
|
-
</div>
|
|
115
|
-
</footer>
|
|
116
118
|
</div>
|
|
117
119
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
120
|
+
<!-- Footer -->
|
|
121
|
+
<footer class="bg-green-900 text-green-100 py-12 text-center">
|
|
122
|
+
<p class="text-xl italic">"Because sometimes you don't need a forest. Just a garden."</p>
|
|
123
|
+
<div class="mt-6 text-sm opacity-70">
|
|
124
|
+
MIT Licensed | Built on Express & EJS
|
|
125
|
+
</div>
|
|
126
|
+
</footer>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
</body>
|
|
130
|
+
<% if (process.env.NODE_ENV==='production' ) { %>
|
|
131
|
+
<script type='module' src='/static/bundle/bundle.<%=fileName%>.js'></script>
|
|
121
132
|
<% } else { %>
|
|
122
133
|
<script type='module' src='/static/global.js'></script>
|
|
123
134
|
<script type='module' src='/static/pages/pages._.js'></script>
|
|
124
|
-
|
|
135
|
+
<% } %>
|
|
136
|
+
|
|
125
137
|
</html>
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Request, Response } from "express";
|
|
2
|
-
interface AddComponentBody {
|
|
3
|
-
path: string;
|
|
4
|
-
component: string;
|
|
5
|
-
}
|
|
6
|
-
export declare function addComponent(req: Request<{}, {}, AddComponentBody>, res: Response): Promise<void>;
|
|
7
|
-
export {};
|
|
8
|
-
//# sourceMappingURL=addComponent.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"addComponent.d.ts","sourceRoot":"","sources":["../../../../src/backend/controllers/gardener/addComponent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIjD,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAQD,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,gBAAgB,CAAC,EAAE,GAAG,EAAE,QAAQ,iBAWvF"}
|
|
@@ -1,19 +0,0 @@
|
|
|
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
|
-
export async function addComponent(req, res) {
|
|
8
|
-
try {
|
|
9
|
-
const { path: filePath, component } = req.body;
|
|
10
|
-
await fsp.mkdir(path.join(frontendDir, 'static', 'components'), { recursive: true });
|
|
11
|
-
await fsp.writeFile(path.join(frontendDir, `${filePath}`), component, "utf8");
|
|
12
|
-
res.json({ success: true });
|
|
13
|
-
}
|
|
14
|
-
catch (err) {
|
|
15
|
-
const error = err;
|
|
16
|
-
res.json({ success: false, msg: error.message });
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=addComponent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"addComponent.js","sourceRoot":"","sources":["../../../../src/backend/controllers/gardener/addComponent.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,aAAa,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;AAOxB,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,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAsC,EAAE,GAAa;IACtF,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAC/C,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrF,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAC9E,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,GAAY,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"addPage.d.ts","sourceRoot":"","sources":["../../../../src/backend/controllers/gardener/addPage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA8CjD,wBAAsB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,iBAyCxD"}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import fsp from "fs/promises";
|
|
2
|
-
import { access } from "fs/promises";
|
|
3
|
-
import path from 'path';
|
|
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
|
-
const templateDir = path.join(frontendDir, 'template');
|
|
9
|
-
async function findTemplate(fileName) {
|
|
10
|
-
try {
|
|
11
|
-
while (fileName.length !== 0) {
|
|
12
|
-
console.log(fileName);
|
|
13
|
-
const searchFile = `template.${fileName}.ejs`;
|
|
14
|
-
console.log(searchFile);
|
|
15
|
-
const searchPath = path.join(templateDir, searchFile);
|
|
16
|
-
console.log(searchPath);
|
|
17
|
-
try {
|
|
18
|
-
await access(searchPath); // ✅ checks if file exists
|
|
19
|
-
return searchPath; // return full path immediately
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
// file does not exist → continue
|
|
23
|
-
}
|
|
24
|
-
let lastUnderscore = fileName.lastIndexOf('_');
|
|
25
|
-
if (lastUnderscore === -1)
|
|
26
|
-
break;
|
|
27
|
-
if (lastUnderscore === 0)
|
|
28
|
-
lastUnderscore += 1;
|
|
29
|
-
fileName = fileName.substring(0, lastUnderscore);
|
|
30
|
-
console.log(fileName);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
throw new Error("Template not found");
|
|
35
|
-
}
|
|
36
|
-
// ❗ explicit failure instead of silent bug
|
|
37
|
-
}
|
|
38
|
-
export async function addPage(req, res) {
|
|
39
|
-
try {
|
|
40
|
-
const pagename = req.body.page;
|
|
41
|
-
const name = pagename.replaceAll('/', '_');
|
|
42
|
-
const templatePath = await findTemplate(name); //path.join(frontendDir, findTemplate(name)); //path.join(frontendDir, 'frontendtemplate.ejs');
|
|
43
|
-
if (!templatePath)
|
|
44
|
-
throw new Error('no template found');
|
|
45
|
-
const viewPath = path.join(frontendDir, `views`, `${name}.ejs`);
|
|
46
|
-
const routePath = path.resolve(__dirname, '..', '..', 'routes', 'gardener.route.ts');
|
|
47
|
-
const jsDir = path.join(frontendDir, 'static/pages');
|
|
48
|
-
const jsFilePath = path.join(jsDir, `pages.${name}.js`);
|
|
49
|
-
const bundleDir = path.join(frontendDir, 'bundle');
|
|
50
|
-
const templateContent = await fsp.readFile(templatePath, 'utf8');
|
|
51
|
-
await fsp.writeFile(viewPath, templateContent, "utf8");
|
|
52
|
-
await replaceLastOccurrence(viewPath, '<script', `<script src="/static/pages/pages.${name}.js" type='module'></script>`);
|
|
53
|
-
const routeEntry = `router.route("${pagename}").get((req: Request, res: Response) => res.render("${name}",{fileName:"${name}"}));\n`;
|
|
54
|
-
await fsp.appendFile(routePath, routeEntry, "utf8");
|
|
55
|
-
await fsp.mkdir(jsDir, { recursive: true });
|
|
56
|
-
const jsContent = 'import { gardener, fetchElement, replaceElement, appendElement } from "../gardener.js";\n import {log, parser, addEl, State} from "../gardenerDev.js"';
|
|
57
|
-
await fsp.writeFile(jsFilePath, jsContent, "utf8");
|
|
58
|
-
await fsp.mkdir(bundleDir, { recursive: true });
|
|
59
|
-
const bundleContent = `import '../static/global.js';import '../static/pages/pages.${name}.js'; `;
|
|
60
|
-
await fsp.writeFile(path.join(bundleDir, `bundle.${name}.js`), bundleContent, "utf8");
|
|
61
|
-
res.json({ success: true });
|
|
62
|
-
}
|
|
63
|
-
catch (err) {
|
|
64
|
-
const error = err;
|
|
65
|
-
res.json({ success: false, msg: error.message });
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
async function replaceLastOccurrence(filePath, searchPattern, replacementLine) {
|
|
69
|
-
const content = await fsp.readFile(filePath, 'utf8');
|
|
70
|
-
const lines = content.split('\n');
|
|
71
|
-
let found = false;
|
|
72
|
-
for (let i = lines.length - 1; i >= 0; i--) {
|
|
73
|
-
if (lines[i].includes(searchPattern)) {
|
|
74
|
-
lines[i] = `${replacementLine}\n${lines[i]}`;
|
|
75
|
-
found = true;
|
|
76
|
-
break;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
if (found) {
|
|
80
|
-
await fsp.writeFile(filePath, lines.join('\n'), 'utf8');
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
console.warn(`Pattern "${searchPattern}" not found in ${filePath}`);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
//# sourceMappingURL=addPage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"addPage.js","sourceRoot":"","sources":["../../../../src/backend/controllers/gardener/addPage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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,+CAyE7D"}
|
|
@@ -1,63 +0,0 @@
|
|
|
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
|
-
fileName: inputPath
|
|
28
|
-
}, {
|
|
29
|
-
// async: true,
|
|
30
|
-
views: [viewsDir], // needed for includes
|
|
31
|
-
});
|
|
32
|
-
await fsp.writeFile(outputPath, html, "utf8");
|
|
33
|
-
rendered.push(outputName);
|
|
34
|
-
}
|
|
35
|
-
const entries3 = await fsp.readdir(outDir, { withFileTypes: true });
|
|
36
|
-
for (const entry of entries3) {
|
|
37
|
-
// "_path1_path2_path3.html" -> ["path1", "path2", "path3"]
|
|
38
|
-
const parts = entry.name
|
|
39
|
-
.replace(/^_/, "")
|
|
40
|
-
.replace(/\.html$/, "")
|
|
41
|
-
.split("_");
|
|
42
|
-
const targetDir = path.join(finalOut, ...parts);
|
|
43
|
-
const targetFile = path.join(targetDir, "index.html");
|
|
44
|
-
// ensure directories exist
|
|
45
|
-
await fsp.mkdir(targetDir, { recursive: true });
|
|
46
|
-
console.log('done');
|
|
47
|
-
// copy file
|
|
48
|
-
await fsp.copyFile(path.join(outDir, entry.name), targetFile);
|
|
49
|
-
}
|
|
50
|
-
await fsp.rm(outDir, { recursive: true, force: true });
|
|
51
|
-
await fsp.cp(path.join(frontendDir, "static"), path.join(finalOut, 'static'), { recursive: true });
|
|
52
|
-
return res.json({
|
|
53
|
-
success: true,
|
|
54
|
-
generated: rendered,
|
|
55
|
-
outDir,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
console.error(err);
|
|
60
|
-
return res.status(500).json({ error: "Static build failed" });
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
//# sourceMappingURL=createStatic.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createStatic.js","sourceRoot":"","sources":["../../../../src/backend/controllers/gardener/createStatic.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,54 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"imageOptimiser.js","sourceRoot":"","sources":["../../../../src/backend/controllers/gardener/imageOptimiser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,36 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
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,CAcf"}
|