@adidas/htmplar-cli 2.0.0-alpha.0 → 2.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.mjs +1 -1
- package/dist/{chunk-54YCFVBV.mjs → chunk-AQE5HMDM.mjs} +4 -4
- package/dist/{chunk-54YCFVBV.mjs.map → chunk-AQE5HMDM.mjs.map} +1 -1
- package/dist/chunk-PDVVYV5V.mjs +161 -0
- package/dist/chunk-PDVVYV5V.mjs.map +1 -0
- package/dist/{chunk-OS3XTI2L.mjs → chunk-WUPBHVSW.mjs} +5 -5
- package/dist/{chunk-OS3XTI2L.mjs.map → chunk-WUPBHVSW.mjs.map} +1 -1
- package/dist/cli.mjs +1 -1
- package/dist/dev-3URSSDZ2.mjs +3 -0
- package/dist/dev-3URSSDZ2.mjs.map +1 -0
- package/dist/index.mjs +2 -2
- package/dist/init-LIK5GE6A.mjs +3 -0
- package/dist/{init-C6KFY3EU.mjs.map → init-LIK5GE6A.mjs.map} +1 -1
- package/package.json +3 -3
- package/dist/chunk-VTX5I4NH.mjs +0 -54
- package/dist/chunk-VTX5I4NH.mjs.map +0 -1
- package/dist/dev-RQXJ5FUM.mjs +0 -3
- package/dist/dev-RQXJ5FUM.mjs.map +0 -1
- package/dist/init-C6KFY3EU.mjs +0 -3
package/dist/bin.mjs
CHANGED
|
@@ -8,7 +8,7 @@ program.command("dev").description("Start development server with hot reload").o
|
|
|
8
8
|
console.log(chalk.blue("\u{1F680} Starting HTMplar dev server..."));
|
|
9
9
|
console.log(chalk.gray(` Port: ${options.port}`));
|
|
10
10
|
try {
|
|
11
|
-
const { startDevServer } = await import('./dev-
|
|
11
|
+
const { startDevServer } = await import('./dev-3URSSDZ2.mjs');
|
|
12
12
|
await startDevServer(options);
|
|
13
13
|
} catch (error) {
|
|
14
14
|
console.error(chalk.red("\u274C Failed to start dev server:"), error);
|
|
@@ -39,7 +39,7 @@ program.command("preview").description("Preview built emails").option("-p, --por
|
|
|
39
39
|
program.command("init [name]").description("Initialize a new HTMplar project").action(async (name) => {
|
|
40
40
|
console.log(chalk.blue("\u{1F389} Initializing new HTMplar project..."));
|
|
41
41
|
try {
|
|
42
|
-
const { initProject } = await import('./init-
|
|
42
|
+
const { initProject } = await import('./init-LIK5GE6A.mjs');
|
|
43
43
|
await initProject(name);
|
|
44
44
|
console.log(chalk.green("\u2705 Project initialized!"));
|
|
45
45
|
} catch (error) {
|
|
@@ -48,5 +48,5 @@ program.command("init [name]").description("Initialize a new HTMplar project").a
|
|
|
48
48
|
}
|
|
49
49
|
});
|
|
50
50
|
program.parse();
|
|
51
|
-
//# sourceMappingURL=chunk-
|
|
52
|
-
//# sourceMappingURL=chunk-
|
|
51
|
+
//# sourceMappingURL=chunk-AQE5HMDM.mjs.map
|
|
52
|
+
//# sourceMappingURL=chunk-AQE5HMDM.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts"],"names":[],"mappings":"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","file":"chunk-AQE5HMDM.mjs","sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\n\nconst program = new Command();\n\nprogram\n .name('htmplar')\n .description('HTMplar - Modern email development with React')\n .version('2.0.0-alpha.0');\n\n// Dev command\nprogram\n .command('dev')\n .description('Start development server with hot reload')\n .option('-p, --port <port>', 'Port to run the server on', '3000')\n .option('-o, --open', 'Open browser automatically', false)\n .action(async (options) => {\n console.log(chalk.blue('🚀 Starting HTMplar dev server...'));\n console.log(chalk.gray(` Port: ${options.port}`));\n\n try {\n const { startDevServer } = await import('./commands/dev.js');\n await startDevServer(options);\n } catch (error) {\n console.error(chalk.red('❌ Failed to start dev server:'), error);\n process.exit(1);\n }\n });\n\n// Build command\nprogram\n .command('build')\n .description('Build emails to static HTML')\n .option('-o, --output <dir>', 'Output directory', 'dist')\n .option('--clean', 'Clean output directory before build', false)\n .action(async (options) => {\n console.log(chalk.blue('📦 Building emails...'));\n\n try {\n const { buildEmails } = await import('./commands/build.js');\n await buildEmails(options);\n console.log(chalk.green('✅ Build complete!'));\n } catch (error) {\n console.error(chalk.red('❌ Build failed:'), error);\n process.exit(1);\n }\n });\n\n// Preview command\nprogram\n .command('preview')\n .description('Preview built emails')\n .option('-p, --port <port>', 'Port to run preview server', '3001')\n .option('-o, --open', 'Open browser automatically', false)\n .action(async (options) => {\n console.log(chalk.blue('👀 Starting preview server...'));\n\n try {\n const { startPreviewServer } = await import('./commands/preview.js');\n await startPreviewServer(options);\n } catch (error) {\n console.error(chalk.red('❌ Failed to start preview:'), error);\n process.exit(1);\n }\n });\n\n// Init command\nprogram\n .command('init [name]')\n .description('Initialize a new HTMplar project')\n .action(async (name) => {\n console.log(chalk.blue('🎉 Initializing new HTMplar project...'));\n\n try {\n const { initProject } = await import('./commands/init.js');\n await initProject(name);\n console.log(chalk.green('✅ Project initialized!'));\n } catch (error) {\n console.error(chalk.red('❌ Initialization failed:'), error);\n process.exit(1);\n }\n });\n\nprogram.parse();\n"]}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { createServer } from 'vite';
|
|
2
|
+
import react from '@vitejs/plugin-react';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { readdir } from 'fs/promises';
|
|
6
|
+
|
|
7
|
+
// src/commands/dev.ts
|
|
8
|
+
async function discoverEmailTemplates() {
|
|
9
|
+
const srcDir = path.join(process.cwd(), "src");
|
|
10
|
+
try {
|
|
11
|
+
const files = await readdir(srcDir);
|
|
12
|
+
return files.filter(
|
|
13
|
+
(file) => (file.endsWith(".tsx") || file.endsWith(".jsx")) && file !== "main.tsx" && file !== "main.jsx"
|
|
14
|
+
).map((file) => file.replace(/\.(tsx|jsx)$/, ""));
|
|
15
|
+
} catch {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function createRoutingPlugin(templates) {
|
|
20
|
+
return {
|
|
21
|
+
name: "htmplar-routing",
|
|
22
|
+
configureServer(server) {
|
|
23
|
+
server.middlewares.use(async (req, res, next) => {
|
|
24
|
+
const url = req.url || "";
|
|
25
|
+
if (url === "/" || url === "/index.html") {
|
|
26
|
+
const templateLinks = templates.map(
|
|
27
|
+
(name) => `<li style="margin: 10px 0;"><a href="/${name}" style="color: #0066cc; text-decoration: none; font-size: 16px;">\u{1F4E7} ${name}</a></li>`
|
|
28
|
+
).join("");
|
|
29
|
+
const html = `<!DOCTYPE html>
|
|
30
|
+
<html lang="en">
|
|
31
|
+
<head>
|
|
32
|
+
<meta charset="UTF-8" />
|
|
33
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
34
|
+
<title>HTMplar Email Templates</title>
|
|
35
|
+
<style>
|
|
36
|
+
body {
|
|
37
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
38
|
+
max-width: 800px;
|
|
39
|
+
margin: 0 auto;
|
|
40
|
+
padding: 40px 20px;
|
|
41
|
+
background: #f9f9f9;
|
|
42
|
+
}
|
|
43
|
+
h1 { color: #333; }
|
|
44
|
+
ul { list-style: none; padding: 0; }
|
|
45
|
+
a:hover { text-decoration: underline !important; }
|
|
46
|
+
.card {
|
|
47
|
+
background: white;
|
|
48
|
+
padding: 30px;
|
|
49
|
+
border-radius: 8px;
|
|
50
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
51
|
+
}
|
|
52
|
+
</style>
|
|
53
|
+
</head>
|
|
54
|
+
<body>
|
|
55
|
+
<div class="card">
|
|
56
|
+
<h1>\u{1F4E7} HTMplar Email Templates</h1>
|
|
57
|
+
<p style="color: #666; margin-top: 10px;">
|
|
58
|
+
Click on a template below to preview it. Changes will hot reload automatically.
|
|
59
|
+
</p>
|
|
60
|
+
${templates.length > 0 ? `<ul style="margin-top: 30px;">${templateLinks}</ul>` : '<p style="color: #999; margin-top: 30px;">No email templates found. Create a .tsx file in the src/ directory.</p>'}
|
|
61
|
+
</div>
|
|
62
|
+
</body>
|
|
63
|
+
</html>`;
|
|
64
|
+
res.setHeader("Content-Type", "text/html");
|
|
65
|
+
res.end(html);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const routeMatch = url.match(/^\/([^/?]+)/);
|
|
69
|
+
if (routeMatch) {
|
|
70
|
+
const templateName = routeMatch[1];
|
|
71
|
+
if (templates.includes(templateName)) {
|
|
72
|
+
const ext = await getTemplateExtension(templateName);
|
|
73
|
+
const html = `<!DOCTYPE html>
|
|
74
|
+
<html lang="en">
|
|
75
|
+
<head>
|
|
76
|
+
<meta charset="UTF-8" />
|
|
77
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
78
|
+
<title>${templateName} - HTMplar</title>
|
|
79
|
+
<style>
|
|
80
|
+
body { margin: 0; padding: 0; }
|
|
81
|
+
#root { min-height: 100vh; }
|
|
82
|
+
</style>
|
|
83
|
+
</head>
|
|
84
|
+
<body>
|
|
85
|
+
<div id="root"></div>
|
|
86
|
+
<script type="module">
|
|
87
|
+
import React from 'react';
|
|
88
|
+
import { createRoot } from 'react-dom/client';
|
|
89
|
+
import EmailComponent from '/src/${templateName}.${ext}';
|
|
90
|
+
|
|
91
|
+
const root = createRoot(document.getElementById('root'));
|
|
92
|
+
root.render(React.createElement(EmailComponent));
|
|
93
|
+
</script>
|
|
94
|
+
</body>
|
|
95
|
+
</html>`;
|
|
96
|
+
res.setHeader("Content-Type", "text/html");
|
|
97
|
+
res.end(html);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
next();
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async function getTemplateExtension(name) {
|
|
107
|
+
const srcDir = path.join(process.cwd(), "src");
|
|
108
|
+
const files = await readdir(srcDir);
|
|
109
|
+
const file = files.find((f) => f === `${name}.tsx` || f === `${name}.jsx`);
|
|
110
|
+
return file?.endsWith(".tsx") ? "tsx" : "jsx";
|
|
111
|
+
}
|
|
112
|
+
async function startDevServer(options) {
|
|
113
|
+
const port = parseInt(options.port, 10);
|
|
114
|
+
try {
|
|
115
|
+
process.env.VITE_TELEMETRY_DISABLED = "1";
|
|
116
|
+
const templates = await discoverEmailTemplates();
|
|
117
|
+
const server = await createServer({
|
|
118
|
+
configFile: false,
|
|
119
|
+
root: process.cwd(),
|
|
120
|
+
server: {
|
|
121
|
+
port,
|
|
122
|
+
open: options.open
|
|
123
|
+
},
|
|
124
|
+
plugins: [react(), createRoutingPlugin(templates)],
|
|
125
|
+
resolve: {
|
|
126
|
+
alias: {
|
|
127
|
+
"@adidas/htmplar-core": path.resolve(process.cwd(), "node_modules/@adidas/htmplar-core"),
|
|
128
|
+
"@adidas/htmplar-renderer": path.resolve(
|
|
129
|
+
process.cwd(),
|
|
130
|
+
"node_modules/@adidas/htmplar-renderer"
|
|
131
|
+
)
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
await server.listen();
|
|
136
|
+
console.log("");
|
|
137
|
+
console.log(chalk.green("\u2705 Dev server running!"));
|
|
138
|
+
console.log("");
|
|
139
|
+
console.log(chalk.cyan(` \u279C Local: http://localhost:${port}/`));
|
|
140
|
+
console.log("");
|
|
141
|
+
console.log(chalk.gray(" Press Ctrl+C to stop"));
|
|
142
|
+
console.log("");
|
|
143
|
+
process.on("SIGTERM", async () => {
|
|
144
|
+
await server.close();
|
|
145
|
+
process.exit(0);
|
|
146
|
+
});
|
|
147
|
+
process.on("SIGINT", async () => {
|
|
148
|
+
console.log("");
|
|
149
|
+
console.log(chalk.yellow("Stopping dev server..."));
|
|
150
|
+
await server.close();
|
|
151
|
+
process.exit(0);
|
|
152
|
+
});
|
|
153
|
+
} catch (error) {
|
|
154
|
+
console.error(chalk.red("Failed to start dev server:"), error);
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export { startDevServer };
|
|
160
|
+
//# sourceMappingURL=chunk-PDVVYV5V.mjs.map
|
|
161
|
+
//# sourceMappingURL=chunk-PDVVYV5V.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/dev.ts"],"names":[],"mappings":"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","file":"chunk-PDVVYV5V.mjs","sourcesContent":["import { createServer, ViteDevServer } from 'vite';\nimport react from '@vitejs/plugin-react';\nimport chalk from 'chalk';\nimport path from 'path';\nimport { readdir } from 'fs/promises';\n\ninterface DevOptions {\n port: string;\n open: boolean;\n}\n\nasync function discoverEmailTemplates(): Promise<string[]> {\n const srcDir = path.join(process.cwd(), 'src');\n try {\n const files = await readdir(srcDir);\n return files\n .filter(\n (file) =>\n (file.endsWith('.tsx') || file.endsWith('.jsx')) &&\n file !== 'main.tsx' &&\n file !== 'main.jsx'\n )\n .map((file) => file.replace(/\\.(tsx|jsx)$/, ''));\n } catch {\n return [];\n }\n}\n\nfunction createRoutingPlugin(templates: string[]) {\n return {\n name: 'htmplar-routing',\n configureServer(server: ViteDevServer) {\n server.middlewares.use(async (req, res, next) => {\n const url = req.url || '';\n\n // Root - show index with list of templates\n if (url === '/' || url === '/index.html') {\n const templateLinks = templates\n .map(\n (name) =>\n `<li style=\"margin: 10px 0;\"><a href=\"/${name}\" style=\"color: #0066cc; text-decoration: none; font-size: 16px;\">📧 ${name}</a></li>`\n )\n .join('');\n\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>HTMplar Email Templates</title>\n <style>\n body {\n font-family: system-ui, -apple-system, sans-serif;\n max-width: 800px;\n margin: 0 auto;\n padding: 40px 20px;\n background: #f9f9f9;\n }\n h1 { color: #333; }\n ul { list-style: none; padding: 0; }\n a:hover { text-decoration: underline !important; }\n .card {\n background: white;\n padding: 30px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n }\n </style>\n </head>\n <body>\n <div class=\"card\">\n <h1>📧 HTMplar Email Templates</h1>\n <p style=\"color: #666; margin-top: 10px;\">\n Click on a template below to preview it. Changes will hot reload automatically.\n </p>\n ${\n templates.length > 0\n ? `<ul style=\"margin-top: 30px;\">${templateLinks}</ul>`\n : '<p style=\"color: #999; margin-top: 30px;\">No email templates found. Create a .tsx file in the src/ directory.</p>'\n }\n </div>\n </body>\n</html>`;\n\n res.setHeader('Content-Type', 'text/html');\n res.end(html);\n return;\n }\n\n // Template routes - serve dynamic preview\n const routeMatch = url.match(/^\\/([^/?]+)/);\n if (routeMatch) {\n const templateName = routeMatch[1];\n if (templates.includes(templateName)) {\n const ext = await getTemplateExtension(templateName);\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${templateName} - HTMplar</title>\n <style>\n body { margin: 0; padding: 0; }\n #root { min-height: 100vh; }\n </style>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\">\n import React from 'react';\n import { createRoot } from 'react-dom/client';\n import EmailComponent from '/src/${templateName}.${ext}';\n\n const root = createRoot(document.getElementById('root'));\n root.render(React.createElement(EmailComponent));\n </script>\n </body>\n</html>`;\n\n res.setHeader('Content-Type', 'text/html');\n res.end(html);\n return;\n }\n }\n\n next();\n });\n },\n };\n}\n\nasync function getTemplateExtension(name: string): Promise<string> {\n const srcDir = path.join(process.cwd(), 'src');\n const files = await readdir(srcDir);\n const file = files.find((f) => f === `${name}.tsx` || f === `${name}.jsx`);\n return file?.endsWith('.tsx') ? 'tsx' : 'jsx';\n}\n\nexport async function startDevServer(options: DevOptions) {\n const port = parseInt(options.port, 10);\n\n try {\n // Disable telemetry\n process.env.VITE_TELEMETRY_DISABLED = '1';\n\n // Discover email templates\n const templates = await discoverEmailTemplates();\n\n // Create Vite dev server\n const server = await createServer({\n configFile: false,\n root: process.cwd(),\n server: {\n port,\n open: options.open,\n },\n plugins: [react(), createRoutingPlugin(templates)],\n resolve: {\n alias: {\n '@adidas/htmplar-core': path.resolve(process.cwd(), 'node_modules/@adidas/htmplar-core'),\n '@adidas/htmplar-renderer': path.resolve(\n process.cwd(),\n 'node_modules/@adidas/htmplar-renderer'\n ),\n },\n },\n });\n\n await server.listen();\n\n console.log('');\n console.log(chalk.green('✅ Dev server running!'));\n console.log('');\n console.log(chalk.cyan(` ➜ Local: http://localhost:${port}/`));\n console.log('');\n console.log(chalk.gray(' Press Ctrl+C to stop'));\n console.log('');\n\n // Keep process alive\n process.on('SIGTERM', async () => {\n await server.close();\n process.exit(0);\n });\n\n process.on('SIGINT', async () => {\n console.log('');\n console.log(chalk.yellow('Stopping dev server...'));\n await server.close();\n process.exit(0);\n });\n } catch (error) {\n console.error(chalk.red('Failed to start dev server:'), error);\n throw error;\n }\n}\n"]}
|
|
@@ -21,13 +21,13 @@ async function initProject(name) {
|
|
|
21
21
|
preview: "htmplar preview"
|
|
22
22
|
},
|
|
23
23
|
dependencies: {
|
|
24
|
-
"@adidas/htmplar-core": "^2.0.0-alpha.
|
|
25
|
-
"@adidas/htmplar-renderer": "^2.0.0-alpha.
|
|
24
|
+
"@adidas/htmplar-core": "^2.0.0-alpha.2",
|
|
25
|
+
"@adidas/htmplar-renderer": "^2.0.0-alpha.2",
|
|
26
26
|
react: "^18.3.1",
|
|
27
27
|
"react-dom": "^18.3.1"
|
|
28
28
|
},
|
|
29
29
|
devDependencies: {
|
|
30
|
-
"@adidas/htmplar-cli": "^2.0.0-alpha.
|
|
30
|
+
"@adidas/htmplar-cli": "^2.0.0-alpha.2",
|
|
31
31
|
"@types/react": "^18.3.8",
|
|
32
32
|
"@types/react-dom": "^18.3.0",
|
|
33
33
|
typescript: "^5.6.2"
|
|
@@ -103,5 +103,5 @@ npm run preview
|
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
export { initProject };
|
|
106
|
-
//# sourceMappingURL=chunk-
|
|
107
|
-
//# sourceMappingURL=chunk-
|
|
106
|
+
//# sourceMappingURL=chunk-WUPBHVSW.mjs.map
|
|
107
|
+
//# sourceMappingURL=chunk-WUPBHVSW.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/init.ts"],"names":[],"mappings":";;;;;;AAKA,eAAsB,YAAY,IAAA,EAAe;AAC/C,EAAA,MAAM,cAAc,IAAA,IAAQ,WAAA;AAC5B,EAAA,MAAM,UAAU,GAAA,CAAI,CAAA,kBAAA,EAAqB,WAAW,CAAA,CAAE,EAAE,KAAA,EAAM;AAE9D,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,WAAW,CAAA;AAGlD,IAAA,MAAM,KAAA,CAAM,KAAK,UAAA,EAAY,KAAK,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACxD,IAAA,MAAM,KAAA,CAAM,KAAK,UAAA,EAAY,MAAM,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAGzD,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,OAAA;AAAA,MACT,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,GAAA,EAAK,aAAA;AAAA,QACL,KAAA,EAAO,eAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACX;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,sBAAA,EAAwB,gBAAA;AAAA,QACxB,0BAAA,EAA4B,gBAAA;AAAA,QAC5B,KAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa;AAAA,OACf;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,qBAAA,EAAuB,gBAAA;AAAA,QACvB,cAAA,EAAgB,SAAA;AAAA,QAChB,kBAAA,EAAoB,SAAA;AAAA,QACpB,UAAA,EAAY;AAAA;AACd,KACF;AAEA,IAAA,MAAM,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,cAAc,CAAA,EAAG,KAAK,SAAA,CAAU,WAAA,EAAa,IAAA,EAAM,CAAC,CAAC,CAAA;AAGtF,IAAA,MAAM,YAAA,GAAe,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA4BrB,IAAA,MAAM,UAAU,IAAA,CAAK,UAAA,EAAY,KAAA,EAAO,aAAa,GAAG,YAAY,CAAA;AAGpE,IAAA,MAAM,MAAA,GAAS,KAAK,WAAW;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA,CAAA;AA0B/B,IAAA,MAAM,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,WAAW,GAAG,MAAM,CAAA;AAErD,IAAA,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,kBAAkB,CAAC,CAAA;AAE/C,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AACrC,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,EAAQ,WAAW,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,IAAI,eAAe,CAAA;AAC3B,IAAA,OAAA,CAAQ,IAAI,eAAe,CAAA;AAC3B,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAK,0BAA0B,CAAA;AACvC,IAAA,MAAM,KAAA;AAAA,EACR;AACF","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/commands/init.ts"],"names":[],"mappings":";;;;;;AAKA,eAAsB,YAAY,IAAA,EAAe;AAC/C,EAAA,MAAM,cAAc,IAAA,IAAQ,WAAA;AAC5B,EAAA,MAAM,UAAU,GAAA,CAAI,CAAA,kBAAA,EAAqB,WAAW,CAAA,CAAE,EAAE,KAAA,EAAM;AAE9D,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,WAAW,CAAA;AAGlD,IAAA,MAAM,KAAA,CAAM,KAAK,UAAA,EAAY,KAAK,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACxD,IAAA,MAAM,KAAA,CAAM,KAAK,UAAA,EAAY,MAAM,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAGzD,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,OAAA;AAAA,MACT,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,GAAA,EAAK,aAAA;AAAA,QACL,KAAA,EAAO,eAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACX;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,sBAAA,EAAwB,gBAAA;AAAA,QACxB,0BAAA,EAA4B,gBAAA;AAAA,QAC5B,KAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa;AAAA,OACf;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,qBAAA,EAAuB,gBAAA;AAAA,QACvB,cAAA,EAAgB,SAAA;AAAA,QAChB,kBAAA,EAAoB,SAAA;AAAA,QACpB,UAAA,EAAY;AAAA;AACd,KACF;AAEA,IAAA,MAAM,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,cAAc,CAAA,EAAG,KAAK,SAAA,CAAU,WAAA,EAAa,IAAA,EAAM,CAAC,CAAC,CAAA;AAGtF,IAAA,MAAM,YAAA,GAAe,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA4BrB,IAAA,MAAM,UAAU,IAAA,CAAK,UAAA,EAAY,KAAA,EAAO,aAAa,GAAG,YAAY,CAAA;AAGpE,IAAA,MAAM,MAAA,GAAS,KAAK,WAAW;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA,CAAA;AA0B/B,IAAA,MAAM,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,WAAW,GAAG,MAAM,CAAA;AAErD,IAAA,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,kBAAkB,CAAC,CAAA;AAE/C,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AACrC,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,EAAQ,WAAW,CAAA,CAAE,CAAA;AACjC,IAAA,OAAA,CAAQ,IAAI,eAAe,CAAA;AAC3B,IAAA,OAAA,CAAQ,IAAI,eAAe,CAAA;AAC3B,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAK,0BAA0B,CAAA;AACvC,IAAA,MAAM,KAAA;AAAA,EACR;AACF","file":"chunk-WUPBHVSW.mjs","sourcesContent":["import { mkdir, writeFile } from 'fs/promises';\nimport { join } from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\n\nexport async function initProject(name?: string) {\n const projectName = name || 'my-emails';\n const spinner = ora(`Creating project: ${projectName}`).start();\n\n try {\n const projectDir = join(process.cwd(), projectName);\n\n // Create directories\n await mkdir(join(projectDir, 'src'), { recursive: true });\n await mkdir(join(projectDir, 'dist'), { recursive: true });\n\n // Create package.json\n const packageJson = {\n name: projectName,\n version: '1.0.0',\n private: true,\n scripts: {\n dev: 'htmplar dev',\n build: 'htmplar build',\n preview: 'htmplar preview',\n },\n dependencies: {\n '@adidas/htmplar-core': '^2.0.0-alpha.2',\n '@adidas/htmplar-renderer': '^2.0.0-alpha.2',\n react: '^18.3.1',\n 'react-dom': '^18.3.1',\n },\n devDependencies: {\n '@adidas/htmplar-cli': '^2.0.0-alpha.2',\n '@types/react': '^18.3.8',\n '@types/react-dom': '^18.3.0',\n typescript: '^5.6.2',\n },\n };\n\n await writeFile(join(projectDir, 'package.json'), JSON.stringify(packageJson, null, 2));\n\n // Create example email\n const exampleEmail = `import React from 'react';\nimport { Block, Text, Button } from '@adidas/htmplar-core';\n\nexport default function WelcomeEmail() {\n return (\n <Block backgroundColor=\"#f4f4f4\" padding={40}>\n <Block backgroundColor=\"#ffffff\" padding={30} maxWidth={600}>\n <Text fontSize={24} fontWeight=\"bold\" align=\"center\">\n Welcome to HTMplar!\n </Text>\n\n <Block padding={20}>\n <Text fontSize={16} color=\"#666666\">\n Start building amazing emails with React and TypeScript.\n </Text>\n </Block>\n\n <Block padding={20}>\n <Button href=\"https://github.com/adidas/htmplar\">\n Get Started\n </Button>\n </Block>\n </Block>\n </Block>\n );\n}\n`;\n\n await writeFile(join(projectDir, 'src', 'welcome.tsx'), exampleEmail);\n\n // Create README\n const readme = `# ${projectName}\n\nHTMplar email project\n\n## Getting Started\n\n\\`\\`\\`bash\n# Install dependencies\nnpm install\n\n# Start dev server\nnpm run dev\n\n# Build emails\nnpm run build\n\n# Preview built emails\nnpm run preview\n\\`\\`\\`\n\n## Project Structure\n\n- \\`src/\\` - Email source files (React components)\n- \\`dist/\\` - Built HTML files\n`;\n\n await writeFile(join(projectDir, 'README.md'), readme);\n\n spinner.succeed(chalk.green('Project created!'));\n\n console.log('');\n console.log(chalk.cyan('Next steps:'));\n console.log('');\n console.log(` cd ${projectName}`);\n console.log(' npm install');\n console.log(' npm run dev');\n console.log('');\n } catch (error) {\n spinner.fail('Failed to create project');\n throw error;\n }\n}\n"]}
|
package/dist/cli.mjs
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"dev-3URSSDZ2.mjs"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { startDevServer } from './chunk-
|
|
1
|
+
export { startDevServer } from './chunk-PDVVYV5V.mjs';
|
|
2
2
|
export { buildEmails } from './chunk-3B2SEUWU.mjs';
|
|
3
3
|
export { startPreviewServer } from './chunk-SEOAKQKB.mjs';
|
|
4
|
-
export { initProject } from './chunk-
|
|
4
|
+
export { initProject } from './chunk-WUPBHVSW.mjs';
|
|
5
5
|
|
|
6
6
|
// src/index.ts
|
|
7
7
|
var version = "2.0.0-alpha.0";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"init-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"init-LIK5GE6A.mjs"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adidas/htmplar-cli",
|
|
3
|
-
"version": "2.0.0-alpha.
|
|
3
|
+
"version": "2.0.0-alpha.2",
|
|
4
4
|
"description": "Command line interface for HTMplar",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@adidas/htmplar-core": "*",
|
|
33
33
|
"@adidas/htmplar-renderer": "*",
|
|
34
|
+
"@vitejs/plugin-react": "^4.3.2",
|
|
34
35
|
"chalk": "^5.3.0",
|
|
35
36
|
"chokidar": "^3.6.0",
|
|
36
37
|
"commander": "^12.1.0",
|
|
@@ -45,8 +46,7 @@
|
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
47
48
|
"@types/express": "^4.17.21",
|
|
48
|
-
"@types/inquirer": "^9.0.7"
|
|
49
|
-
"@vitejs/plugin-react": "^4.3.2"
|
|
49
|
+
"@types/inquirer": "^9.0.7"
|
|
50
50
|
},
|
|
51
51
|
"publishConfig": {
|
|
52
52
|
"access": "public"
|
package/dist/chunk-VTX5I4NH.mjs
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { createServer } from 'vite';
|
|
2
|
-
import react from '@vitejs/plugin-react';
|
|
3
|
-
import chalk from 'chalk';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
|
|
6
|
-
// src/commands/dev.ts
|
|
7
|
-
async function startDevServer(options) {
|
|
8
|
-
const port = parseInt(options.port, 10);
|
|
9
|
-
try {
|
|
10
|
-
const server = await createServer({
|
|
11
|
-
configFile: false,
|
|
12
|
-
root: process.cwd(),
|
|
13
|
-
server: {
|
|
14
|
-
port,
|
|
15
|
-
open: options.open
|
|
16
|
-
},
|
|
17
|
-
plugins: [react()],
|
|
18
|
-
resolve: {
|
|
19
|
-
alias: {
|
|
20
|
-
"@adidas/htmplar-core": path.resolve(process.cwd(), "node_modules/@adidas/htmplar-core"),
|
|
21
|
-
"@adidas/htmplar-renderer": path.resolve(
|
|
22
|
-
process.cwd(),
|
|
23
|
-
"node_modules/@adidas/htmplar-renderer"
|
|
24
|
-
)
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
await server.listen();
|
|
29
|
-
console.log("");
|
|
30
|
-
console.log(chalk.green("\u2705 Dev server running!"));
|
|
31
|
-
console.log("");
|
|
32
|
-
console.log(chalk.cyan(` \u279C Local: http://localhost:${port}/`));
|
|
33
|
-
console.log("");
|
|
34
|
-
console.log(chalk.gray(" Press Ctrl+C to stop"));
|
|
35
|
-
console.log("");
|
|
36
|
-
process.on("SIGTERM", async () => {
|
|
37
|
-
await server.close();
|
|
38
|
-
process.exit(0);
|
|
39
|
-
});
|
|
40
|
-
process.on("SIGINT", async () => {
|
|
41
|
-
console.log("");
|
|
42
|
-
console.log(chalk.yellow("Stopping dev server..."));
|
|
43
|
-
await server.close();
|
|
44
|
-
process.exit(0);
|
|
45
|
-
});
|
|
46
|
-
} catch (error) {
|
|
47
|
-
console.error(chalk.red("Failed to start dev server:"), error);
|
|
48
|
-
throw error;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export { startDevServer };
|
|
53
|
-
//# sourceMappingURL=chunk-VTX5I4NH.mjs.map
|
|
54
|
-
//# sourceMappingURL=chunk-VTX5I4NH.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/dev.ts"],"names":[],"mappings":";;;;;;AAUA,eAAsB,eAAe,OAAA,EAAqB;AACxD,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAEtC,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa;AAAA,MAChC,UAAA,EAAY,KAAA;AAAA,MACZ,IAAA,EAAM,QAAQ,GAAA,EAAI;AAAA,MAClB,MAAA,EAAQ;AAAA,QACN,IAAA;AAAA,QACA,MAAM,OAAA,CAAQ;AAAA,OAChB;AAAA,MACA,OAAA,EAAS,CAAC,KAAA,EAAO,CAAA;AAAA,MACjB,OAAA,EAAS;AAAA,QACP,KAAA,EAAO;AAAA,UACL,wBAAwB,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,mCAAmC,CAAA;AAAA,UACvF,4BAA4B,IAAA,CAAK,OAAA;AAAA,YAC/B,QAAQ,GAAA,EAAI;AAAA,YACZ;AAAA;AACF;AACF;AACF,KACD,CAAA;AAED,IAAA,MAAM,OAAO,MAAA,EAAO;AAEpB,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,4BAAuB,CAAC,CAAA;AAChD,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,KAAA,CAAM,IAAA,CAAK,CAAA,qCAAA,EAAmC,IAAI,GAAG,CAAC,CAAA;AAClE,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,yBAAyB,CAAC,CAAA;AACjD,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,YAAY;AAChC,MAAA,MAAM,OAAO,KAAA,EAAM;AACnB,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,YAAY;AAC/B,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,wBAAwB,CAAC,CAAA;AAClD,MAAA,MAAM,OAAO,KAAA,EAAM;AACnB,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,6BAA6B,GAAG,KAAK,CAAA;AAC7D,IAAA,MAAM,KAAA;AAAA,EACR;AACF","file":"chunk-VTX5I4NH.mjs","sourcesContent":["import { createServer } from 'vite';\nimport react from '@vitejs/plugin-react';\nimport chalk from 'chalk';\nimport path from 'path';\n\ninterface DevOptions {\n port: string;\n open: boolean;\n}\n\nexport async function startDevServer(options: DevOptions) {\n const port = parseInt(options.port, 10);\n\n try {\n // Create Vite dev server\n const server = await createServer({\n configFile: false,\n root: process.cwd(),\n server: {\n port,\n open: options.open,\n },\n plugins: [react()],\n resolve: {\n alias: {\n '@adidas/htmplar-core': path.resolve(process.cwd(), 'node_modules/@adidas/htmplar-core'),\n '@adidas/htmplar-renderer': path.resolve(\n process.cwd(),\n 'node_modules/@adidas/htmplar-renderer'\n ),\n },\n },\n });\n\n await server.listen();\n\n console.log('');\n console.log(chalk.green('✅ Dev server running!'));\n console.log('');\n console.log(chalk.cyan(` ➜ Local: http://localhost:${port}/`));\n console.log('');\n console.log(chalk.gray(' Press Ctrl+C to stop'));\n console.log('');\n\n // Keep process alive\n process.on('SIGTERM', async () => {\n await server.close();\n process.exit(0);\n });\n\n process.on('SIGINT', async () => {\n console.log('');\n console.log(chalk.yellow('Stopping dev server...'));\n await server.close();\n process.exit(0);\n });\n } catch (error) {\n console.error(chalk.red('Failed to start dev server:'), error);\n throw error;\n }\n}\n"]}
|
package/dist/dev-RQXJ5FUM.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"dev-RQXJ5FUM.mjs"}
|
package/dist/init-C6KFY3EU.mjs
DELETED