@see-ms/converter 0.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/dist/index.mjs ADDED
@@ -0,0 +1,486 @@
1
+ // src/converter.ts
2
+ import pc3 from "picocolors";
3
+ import fs4 from "fs-extra";
4
+
5
+ // src/filesystem.ts
6
+ import fs from "fs-extra";
7
+ import path from "path";
8
+ import { glob } from "glob";
9
+ import { execSync } from "child_process";
10
+ import pc from "picocolors";
11
+ async function scanAssets(webflowDir) {
12
+ const assets = {
13
+ css: [],
14
+ images: [],
15
+ fonts: [],
16
+ js: []
17
+ };
18
+ const cssFiles = await glob("css/**/*.css", { cwd: webflowDir });
19
+ assets.css = cssFiles;
20
+ const imageFiles = await glob("images/**/*", { cwd: webflowDir });
21
+ assets.images = imageFiles;
22
+ const fontFiles = await glob("fonts/**/*", { cwd: webflowDir });
23
+ assets.fonts = fontFiles;
24
+ const jsFiles = await glob("js/**/*.js", { cwd: webflowDir });
25
+ assets.js = jsFiles;
26
+ return assets;
27
+ }
28
+ async function copyCSSFiles(webflowDir, outputDir, cssFiles) {
29
+ const targetDir = path.join(outputDir, "assets", "css");
30
+ await fs.ensureDir(targetDir);
31
+ for (const file of cssFiles) {
32
+ const source = path.join(webflowDir, file);
33
+ const target = path.join(targetDir, path.basename(file));
34
+ await fs.copy(source, target);
35
+ }
36
+ }
37
+ async function copyImages(webflowDir, outputDir, imageFiles) {
38
+ const targetDir = path.join(outputDir, "public", "assets", "images");
39
+ await fs.ensureDir(targetDir);
40
+ for (const file of imageFiles) {
41
+ const source = path.join(webflowDir, file);
42
+ const target = path.join(targetDir, path.basename(file));
43
+ await fs.copy(source, target);
44
+ }
45
+ }
46
+ async function copyFonts(webflowDir, outputDir, fontFiles) {
47
+ const targetDir = path.join(outputDir, "public", "assets", "fonts");
48
+ await fs.ensureDir(targetDir);
49
+ for (const file of fontFiles) {
50
+ const source = path.join(webflowDir, file);
51
+ const target = path.join(targetDir, path.basename(file));
52
+ await fs.copy(source, target);
53
+ }
54
+ }
55
+ async function copyJSFiles(webflowDir, outputDir, jsFiles) {
56
+ const targetDir = path.join(outputDir, "public", "assets", "js");
57
+ await fs.ensureDir(targetDir);
58
+ for (const file of jsFiles) {
59
+ const source = path.join(webflowDir, file);
60
+ const target = path.join(targetDir, path.basename(file));
61
+ await fs.copy(source, target);
62
+ }
63
+ }
64
+ async function copyAllAssets(webflowDir, outputDir, assets) {
65
+ await copyCSSFiles(webflowDir, outputDir, assets.css);
66
+ await copyImages(webflowDir, outputDir, assets.images);
67
+ await copyFonts(webflowDir, outputDir, assets.fonts);
68
+ await copyJSFiles(webflowDir, outputDir, assets.js);
69
+ }
70
+ async function findHTMLFiles(webflowDir) {
71
+ const htmlFiles = await glob("**/*.html", { cwd: webflowDir });
72
+ return htmlFiles;
73
+ }
74
+ async function readHTMLFile(webflowDir, fileName) {
75
+ const filePath = path.join(webflowDir, fileName);
76
+ return await fs.readFile(filePath, "utf-8");
77
+ }
78
+ async function writeVueComponent(outputDir, fileName, content) {
79
+ const pagesDir = path.join(outputDir, "pages");
80
+ const vueName = fileName.replace(".html", ".vue");
81
+ const targetPath = path.join(pagesDir, vueName);
82
+ await fs.ensureDir(path.dirname(targetPath));
83
+ await fs.writeFile(targetPath, content, "utf-8");
84
+ }
85
+ async function formatVueFiles(outputDir) {
86
+ const pagesDir = path.join(outputDir, "pages");
87
+ try {
88
+ console.log(pc.blue("\n\u2728 Formatting Vue files with Prettier..."));
89
+ execSync("npx prettier --version", { stdio: "ignore" });
90
+ execSync(`npx prettier --write "${pagesDir}/**/*.vue"`, {
91
+ cwd: outputDir,
92
+ stdio: "inherit"
93
+ });
94
+ console.log(pc.green(" \u2713 Vue files formatted"));
95
+ } catch (error) {
96
+ console.log(pc.yellow(" \u26A0 Prettier not available, skipping formatting"));
97
+ }
98
+ }
99
+
100
+ // src/parser.ts
101
+ import * as cheerio from "cheerio";
102
+ import path2 from "path";
103
+ function normalizeRoute(href) {
104
+ let route = href.replace(".html", "");
105
+ if (route === "index" || route === "/index" || route.endsWith("/index")) {
106
+ return "/";
107
+ }
108
+ if (route === ".." || route === "../" || route === "/.." || route === "../index") {
109
+ return "/";
110
+ }
111
+ route = route.replace(/\.\.\//g, "").replace(/\.\//g, "");
112
+ const normalized = path2.posix.normalize(route);
113
+ if (!normalized.startsWith("/")) {
114
+ return "/" + normalized;
115
+ }
116
+ if (normalized === "." || normalized === "") {
117
+ return "/";
118
+ }
119
+ return normalized;
120
+ }
121
+ function normalizeAssetPath(src) {
122
+ if (!src || src.startsWith("http") || src.startsWith("https")) {
123
+ return src;
124
+ }
125
+ let normalized = src.replace(/^(\.\.\/)+/, "").replace(/^\.\//, "");
126
+ if (normalized.startsWith("/assets/")) {
127
+ normalized = normalized.replace(/\/\.\.\//g, "/");
128
+ return normalized;
129
+ }
130
+ return `/assets/${normalized}`;
131
+ }
132
+ function parseHTML(html, fileName) {
133
+ const $ = cheerio.load(html);
134
+ const title = $("title").text() || fileName.replace(".html", "");
135
+ const cssFiles = [];
136
+ $('link[rel="stylesheet"]').each((_, el) => {
137
+ const href = $(el).attr("href");
138
+ if (href) {
139
+ cssFiles.push(href);
140
+ }
141
+ });
142
+ let embeddedStyles = "";
143
+ $(".global-embed style").each((_, el) => {
144
+ embeddedStyles += $(el).html() + "\n";
145
+ });
146
+ $("body > style").each((_, el) => {
147
+ embeddedStyles += $(el).html() + "\n";
148
+ });
149
+ $(".global-embed").remove();
150
+ $("body > style").remove();
151
+ $("body script").remove();
152
+ const images = [];
153
+ $("img").each((_, el) => {
154
+ const src = $(el).attr("src");
155
+ if (src) {
156
+ images.push(src);
157
+ }
158
+ });
159
+ const links = [];
160
+ $("a").each((_, el) => {
161
+ const href = $(el).attr("href");
162
+ if (href) {
163
+ links.push(href);
164
+ }
165
+ });
166
+ const htmlContent = $("body").html() || "";
167
+ return {
168
+ fileName,
169
+ title,
170
+ htmlContent,
171
+ cssFiles,
172
+ embeddedStyles,
173
+ images,
174
+ links
175
+ };
176
+ }
177
+ function transformForNuxt(html) {
178
+ const $ = cheerio.load(html);
179
+ $("html, head, body").each((_, el) => {
180
+ const $el = $(el);
181
+ $el.replaceWith($el.html() || "");
182
+ });
183
+ $("script").remove();
184
+ $("a").each((_, el) => {
185
+ const $el = $(el);
186
+ const href = $el.attr("href");
187
+ if (!href) return;
188
+ const isExternal = href.startsWith("http://") || href.startsWith("https://") || href.startsWith("mailto:") || href.startsWith("tel:") || href.startsWith("#");
189
+ if (!isExternal) {
190
+ const route = normalizeRoute(href);
191
+ $el.attr("to", route);
192
+ $el.removeAttr("href");
193
+ const content = $el.html();
194
+ const classes = $el.attr("class") || "";
195
+ $el.replaceWith(`<nuxt-link to="${route}" class="${classes}">${content}</nuxt-link>`);
196
+ }
197
+ });
198
+ $("img").each((_, el) => {
199
+ const $el = $(el);
200
+ const src = $el.attr("src");
201
+ if (src) {
202
+ const normalizedSrc = normalizeAssetPath(src);
203
+ $el.attr("src", normalizedSrc);
204
+ }
205
+ $el.removeAttr("srcset");
206
+ $el.removeAttr("sizes");
207
+ });
208
+ return $.html();
209
+ }
210
+ function htmlToVueComponent(html, pageName) {
211
+ return `
212
+ <script setup lang="ts">
213
+ // Page: ${pageName}
214
+ </script>
215
+
216
+ <template>
217
+ <div>
218
+ ${html}
219
+ </div>
220
+ </template>
221
+ `;
222
+ }
223
+ function deduplicateStyles(styles) {
224
+ if (!styles.trim()) return "";
225
+ const sections = styles.split(/\/\* From .+ \*\//);
226
+ const uniqueStyles = /* @__PURE__ */ new Set();
227
+ for (const section of sections) {
228
+ const trimmed = section.trim();
229
+ if (trimmed) {
230
+ uniqueStyles.add(trimmed);
231
+ }
232
+ }
233
+ return Array.from(uniqueStyles).join("\n\n");
234
+ }
235
+
236
+ // src/config-updater.ts
237
+ import fs2 from "fs-extra";
238
+ import path3 from "path";
239
+ function generateWebflowAssetPlugin(cssFiles) {
240
+ const webflowFiles = cssFiles.map((file) => `/assets/css/${path3.basename(file)}`);
241
+ return `import type { Plugin } from 'vite'
242
+
243
+ const webflowFiles = [${webflowFiles.map((f) => `'${f}'`).join(", ")}]
244
+ const replacements = [
245
+ ['../images/', '/assets/images/'],
246
+ ['../fonts/', '/assets/fonts/']
247
+ ]
248
+
249
+ const webflowURLReset = (): Plugin => ({
250
+ name: 'webflowURLReset',
251
+ config: () => ({
252
+ build: {
253
+ rollupOptions: {
254
+ external: [/\\.\\.\\/fonts\\//, /\\.\\.\\/images\\//]
255
+ }
256
+ }
257
+ }),
258
+ transform: (code, id) => {
259
+ if (webflowFiles.some((path) => id.includes(path))) {
260
+ replacements.forEach(([search, replace]) => {
261
+ code = code.replaceAll(search, replace)
262
+ })
263
+ }
264
+
265
+ return { code, id, map: null }
266
+ }
267
+ })
268
+
269
+ export default webflowURLReset
270
+ `;
271
+ }
272
+ async function writeWebflowAssetPlugin(outputDir, cssFiles) {
273
+ const utilsDir = path3.join(outputDir, "utils");
274
+ await fs2.ensureDir(utilsDir);
275
+ const content = generateWebflowAssetPlugin(cssFiles);
276
+ const targetPath = path3.join(utilsDir, "webflow-assets.ts");
277
+ await fs2.writeFile(targetPath, content, "utf-8");
278
+ }
279
+ async function updateNuxtConfig(outputDir, cssFiles) {
280
+ const configPath = path3.join(outputDir, "nuxt.config.ts");
281
+ const configExists = await fs2.pathExists(configPath);
282
+ if (!configExists) {
283
+ throw new Error("nuxt.config.ts not found in output directory");
284
+ }
285
+ let config = await fs2.readFile(configPath, "utf-8");
286
+ const cssEntries = cssFiles.map((file) => ` '~/assets/css/${path3.basename(file)}'`);
287
+ if (config.includes("css:")) {
288
+ config = config.replace(
289
+ /css:\s*\[/,
290
+ `css: [
291
+ ${cssEntries.join(",\n")},`
292
+ );
293
+ } else {
294
+ config = config.replace(
295
+ /export default defineNuxtConfig\(\{/,
296
+ `export default defineNuxtConfig({
297
+ css: [
298
+ ${cssEntries.join(",\n")}
299
+ ],`
300
+ );
301
+ }
302
+ await fs2.writeFile(configPath, config, "utf-8");
303
+ }
304
+ async function writeEmbeddedStyles(outputDir, styles) {
305
+ if (!styles.trim()) return;
306
+ const cssDir = path3.join(outputDir, "assets", "css");
307
+ await fs2.ensureDir(cssDir);
308
+ const mainCssPath = path3.join(cssDir, "main.css");
309
+ const exists = await fs2.pathExists(mainCssPath);
310
+ if (exists) {
311
+ const existing = await fs2.readFile(mainCssPath, "utf-8");
312
+ await fs2.writeFile(mainCssPath, `${existing}
313
+
314
+ /* Webflow Embedded Styles */
315
+ ${styles}`, "utf-8");
316
+ } else {
317
+ await fs2.writeFile(mainCssPath, `/* Webflow Embedded Styles */
318
+ ${styles}`, "utf-8");
319
+ }
320
+ }
321
+
322
+ // src/boilerplate.ts
323
+ import fs3 from "fs-extra";
324
+ import path4 from "path";
325
+ import { execSync as execSync2 } from "child_process";
326
+ import pc2 from "picocolors";
327
+ function isGitHubURL(source) {
328
+ return source.startsWith("https://github.com/") || source.startsWith("git@github.com:") || source.includes("github.com");
329
+ }
330
+ async function cloneFromGitHub(repoUrl, outputDir) {
331
+ console.log(pc2.blue(" Cloning from GitHub..."));
332
+ try {
333
+ execSync2(`git clone ${repoUrl} ${outputDir}`, { stdio: "inherit" });
334
+ const gitDir = path4.join(outputDir, ".git");
335
+ await fs3.remove(gitDir);
336
+ console.log(pc2.green(" \u2713 Boilerplate cloned successfully"));
337
+ } catch (error) {
338
+ throw new Error(`Failed to clone repository: ${error instanceof Error ? error.message : String(error)}`);
339
+ }
340
+ }
341
+ async function copyFromLocal(sourcePath, outputDir) {
342
+ console.log(pc2.blue(" Copying from local path..."));
343
+ const sourceExists = await fs3.pathExists(sourcePath);
344
+ if (!sourceExists) {
345
+ throw new Error(`Local boilerplate not found: ${sourcePath}`);
346
+ }
347
+ await fs3.copy(sourcePath, outputDir, {
348
+ filter: (src) => {
349
+ const name = path4.basename(src);
350
+ return !["node_modules", ".nuxt", ".output", ".git", "dist"].includes(name);
351
+ }
352
+ });
353
+ console.log(pc2.green(" \u2713 Boilerplate copied successfully"));
354
+ }
355
+ async function setupBoilerplate(boilerplateSource, outputDir) {
356
+ if (!boilerplateSource) {
357
+ console.log(pc2.blue("\n\u{1F4E6} Creating minimal Nuxt structure..."));
358
+ await fs3.ensureDir(outputDir);
359
+ await fs3.ensureDir(path4.join(outputDir, "pages"));
360
+ await fs3.ensureDir(path4.join(outputDir, "assets"));
361
+ await fs3.ensureDir(path4.join(outputDir, "public"));
362
+ await fs3.ensureDir(path4.join(outputDir, "utils"));
363
+ const configPath = path4.join(outputDir, "nuxt.config.ts");
364
+ const configExists = await fs3.pathExists(configPath);
365
+ if (!configExists) {
366
+ const basicConfig = `export default defineNuxtConfig({
367
+ devtools: { enabled: true },
368
+ css: [],
369
+ })
370
+ `;
371
+ await fs3.writeFile(configPath, basicConfig, "utf-8");
372
+ }
373
+ console.log(pc2.green(" \u2713 Structure created"));
374
+ return;
375
+ }
376
+ const outputExists = await fs3.pathExists(outputDir);
377
+ if (outputExists) {
378
+ throw new Error(`Output directory already exists: ${outputDir}. Please choose a different path or remove it first.`);
379
+ }
380
+ console.log(pc2.blue("\n\u{1F4E6} Setting up boilerplate..."));
381
+ if (isGitHubURL(boilerplateSource)) {
382
+ await cloneFromGitHub(boilerplateSource, outputDir);
383
+ } else {
384
+ await copyFromLocal(boilerplateSource, outputDir);
385
+ }
386
+ }
387
+
388
+ // src/converter.ts
389
+ async function convertWebflowExport(options) {
390
+ const { inputDir, outputDir, boilerplate } = options;
391
+ console.log(pc3.cyan("\u{1F680} Starting Webflow to Nuxt conversion..."));
392
+ console.log(pc3.dim(`Input: ${inputDir}`));
393
+ console.log(pc3.dim(`Output: ${outputDir}`));
394
+ try {
395
+ await setupBoilerplate(boilerplate, outputDir);
396
+ const inputExists = await fs4.pathExists(inputDir);
397
+ if (!inputExists) {
398
+ throw new Error(`Input directory not found: ${inputDir}`);
399
+ }
400
+ console.log(pc3.blue("\n\u{1F4C2} Scanning assets..."));
401
+ const assets = await scanAssets(inputDir);
402
+ console.log(pc3.green(` \u2713 Found ${assets.css.length} CSS files`));
403
+ console.log(pc3.green(` \u2713 Found ${assets.images.length} images`));
404
+ console.log(pc3.green(` \u2713 Found ${assets.fonts.length} fonts`));
405
+ console.log(pc3.green(` \u2713 Found ${assets.js.length} JS files`));
406
+ console.log(pc3.blue("\n\u{1F4E6} Copying assets..."));
407
+ await copyAllAssets(inputDir, outputDir, assets);
408
+ console.log(pc3.green(" \u2713 Assets copied successfully"));
409
+ console.log(pc3.blue("\n\u{1F50D} Finding HTML files..."));
410
+ const htmlFiles = await findHTMLFiles(inputDir);
411
+ console.log(pc3.green(` \u2713 Found ${htmlFiles.length} HTML files`));
412
+ console.log(pc3.blue("\n\u2699\uFE0F Converting HTML to Vue components..."));
413
+ let allEmbeddedStyles = "";
414
+ for (const htmlFile of htmlFiles) {
415
+ const html = await readHTMLFile(inputDir, htmlFile);
416
+ const parsed = parseHTML(html, htmlFile);
417
+ if (parsed.embeddedStyles) {
418
+ allEmbeddedStyles += `
419
+ /* From ${htmlFile} */
420
+ ${parsed.embeddedStyles}
421
+ `;
422
+ }
423
+ const transformed = transformForNuxt(parsed.htmlContent);
424
+ const pageName = htmlFile.replace(".html", "").replace(/\//g, "-");
425
+ const vueComponent = htmlToVueComponent(transformed, pageName);
426
+ await writeVueComponent(outputDir, htmlFile, vueComponent);
427
+ console.log(pc3.green(` \u2713 Created ${htmlFile.replace(".html", ".vue")}`));
428
+ }
429
+ await formatVueFiles(outputDir);
430
+ if (allEmbeddedStyles.trim()) {
431
+ console.log(pc3.blue("\n\u2728 Writing embedded styles..."));
432
+ const dedupedStyles = deduplicateStyles(allEmbeddedStyles);
433
+ await writeEmbeddedStyles(outputDir, dedupedStyles);
434
+ console.log(pc3.green(" \u2713 Embedded styles added to main.css"));
435
+ }
436
+ console.log(pc3.blue("\n\u{1F527} Generating webflow-assets.ts plugin..."));
437
+ await writeWebflowAssetPlugin(outputDir, assets.css);
438
+ console.log(pc3.green(" \u2713 Plugin generated (existing file overwritten)"));
439
+ console.log(pc3.blue("\n\u2699\uFE0F Updating nuxt.config.ts..."));
440
+ try {
441
+ await updateNuxtConfig(outputDir, assets.css);
442
+ console.log(pc3.green(" \u2713 Config updated"));
443
+ } catch (error) {
444
+ console.log(pc3.yellow(" \u26A0 Could not update nuxt.config.ts automatically"));
445
+ console.log(pc3.dim(" Please add CSS files manually"));
446
+ }
447
+ console.log(pc3.green("\n\u2705 Conversion completed successfully!"));
448
+ console.log(pc3.cyan("\n\u{1F4CB} Next steps:"));
449
+ console.log(pc3.dim(` 1. cd ${outputDir}`));
450
+ console.log(pc3.dim(" 2. pnpm install"));
451
+ console.log(pc3.dim(" 3. pnpm dev"));
452
+ } catch (error) {
453
+ console.error(pc3.red("\n\u274C Conversion failed:"));
454
+ console.error(pc3.red(error instanceof Error ? error.message : String(error)));
455
+ throw error;
456
+ }
457
+ }
458
+
459
+ // src/detector.ts
460
+ function detectEditableFields(_html) {
461
+ throw new Error("Not yet implemented");
462
+ }
463
+
464
+ // src/manifest.ts
465
+ function generateManifest(_data) {
466
+ throw new Error("Not yet implemented");
467
+ }
468
+
469
+ // src/generator.ts
470
+ async function generateSchemas(_manifestPath, _cmsType) {
471
+ throw new Error("Not yet implemented");
472
+ }
473
+
474
+ // src/transformer.ts
475
+ function manifestToSchema(_manifest, _cmsType) {
476
+ throw new Error("Not yet implemented");
477
+ }
478
+ export {
479
+ convertWebflowExport,
480
+ detectEditableFields,
481
+ generateManifest,
482
+ generateSchemas,
483
+ manifestToSchema,
484
+ setupBoilerplate
485
+ };
486
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/converter.ts","../src/filesystem.ts","../src/parser.ts","../src/config-updater.ts","../src/boilerplate.ts","../src/detector.ts","../src/manifest.ts","../src/generator.ts","../src/transformer.ts"],"sourcesContent":["/**\n * Main conversion logic\n */\n\nimport type { ConversionOptions } from '@see-ms/types';\nimport pc from 'picocolors';\nimport fs from 'fs-extra';\nimport {\n scanAssets,\n copyAllAssets,\n findHTMLFiles,\n readHTMLFile,\n writeVueComponent,\n formatVueFiles,\n} from './filesystem';\nimport { parseHTML, transformForNuxt, htmlToVueComponent, deduplicateStyles } from './parser';\nimport {\n writeWebflowAssetPlugin,\n updateNuxtConfig,\n writeEmbeddedStyles,\n} from './config-updater';\nimport { setupBoilerplate } from './boilerplate';\n\nexport async function convertWebflowExport(options: ConversionOptions): Promise<void> {\n const { inputDir, outputDir, boilerplate } = options;\n\n console.log(pc.cyan('šŸš€ Starting Webflow to Nuxt conversion...'));\n console.log(pc.dim(`Input: ${inputDir}`));\n console.log(pc.dim(`Output: ${outputDir}`));\n\n try {\n // Step 0: Setup boilerplate first\n await setupBoilerplate(boilerplate, outputDir);\n\n // Step 1: Verify input directory exists\n const inputExists = await fs.pathExists(inputDir);\n if (!inputExists) {\n throw new Error(`Input directory not found: ${inputDir}`);\n }\n\n // Step 2: Scan for assets\n console.log(pc.blue('\\nšŸ“‚ Scanning assets...'));\n const assets = await scanAssets(inputDir);\n console.log(pc.green(` āœ“ Found ${assets.css.length} CSS files`));\n console.log(pc.green(` āœ“ Found ${assets.images.length} images`));\n console.log(pc.green(` āœ“ Found ${assets.fonts.length} fonts`));\n console.log(pc.green(` āœ“ Found ${assets.js.length} JS files`));\n\n // Step 3: Copy assets to output\n console.log(pc.blue('\\nšŸ“¦ Copying assets...'));\n await copyAllAssets(inputDir, outputDir, assets);\n console.log(pc.green(' āœ“ Assets copied successfully'));\n\n // Step 4: Find all HTML files (including in subfolders)\n console.log(pc.blue('\\nšŸ” Finding HTML files...'));\n const htmlFiles = await findHTMLFiles(inputDir);\n console.log(pc.green(` āœ“ Found ${htmlFiles.length} HTML files`));\n\n // Step 5: Convert HTML files to Vue components\n console.log(pc.blue('\\nāš™ļø Converting HTML to Vue components...'));\n let allEmbeddedStyles = '';\n\n for (const htmlFile of htmlFiles) {\n const html = await readHTMLFile(inputDir, htmlFile);\n const parsed = parseHTML(html, htmlFile);\n\n // Collect embedded styles\n if (parsed.embeddedStyles) {\n allEmbeddedStyles += `\\n/* From ${htmlFile} */\\n${parsed.embeddedStyles}\\n`;\n }\n\n // Transform HTML for Nuxt\n const transformed = transformForNuxt(parsed.htmlContent);\n\n // Convert to Vue component\n const pageName = htmlFile.replace('.html', '').replace(/\\//g, '-');\n const vueComponent = htmlToVueComponent(transformed, pageName);\n\n // Write to pages directory (this will overwrite existing files)\n await writeVueComponent(outputDir, htmlFile, vueComponent);\n console.log(pc.green(` āœ“ Created ${htmlFile.replace('.html', '.vue')}`));\n }\n\n // Step 6: Format Vue files with Prettier\n await formatVueFiles(outputDir);\n\n // Step 7: Deduplicate and write embedded styles to main.css\n if (allEmbeddedStyles.trim()) {\n console.log(pc.blue('\\n✨ Writing embedded styles...'));\n const dedupedStyles = deduplicateStyles(allEmbeddedStyles);\n await writeEmbeddedStyles(outputDir, dedupedStyles);\n console.log(pc.green(' āœ“ Embedded styles added to main.css'));\n }\n\n // Step 8: Generate/overwrite webflow-assets.ts\n console.log(pc.blue('\\nšŸ”§ Generating webflow-assets.ts plugin...'));\n await writeWebflowAssetPlugin(outputDir, assets.css);\n console.log(pc.green(' āœ“ Plugin generated (existing file overwritten)'));\n\n // Step 9: Update nuxt.config.ts\n console.log(pc.blue('\\nāš™ļø Updating nuxt.config.ts...'));\n try {\n await updateNuxtConfig(outputDir, assets.css);\n console.log(pc.green(' āœ“ Config updated'));\n } catch (error) {\n console.log(pc.yellow(' ⚠ Could not update nuxt.config.ts automatically'));\n console.log(pc.dim(' Please add CSS files manually'));\n }\n\n // Success!\n console.log(pc.green('\\nāœ… Conversion completed successfully!'));\n console.log(pc.cyan('\\nšŸ“‹ Next steps:'));\n console.log(pc.dim(` 1. cd ${outputDir}`));\n console.log(pc.dim(' 2. pnpm install'));\n console.log(pc.dim(' 3. pnpm dev'));\n } catch (error) {\n console.error(pc.red('\\nāŒ Conversion failed:'));\n console.error(pc.red(error instanceof Error ? error.message : String(error)));\n throw error;\n }\n}\n","/**\n * File system utilities for copying Webflow assets\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { glob } from 'glob';\nimport { execSync } from 'child_process';\nimport pc from 'picocolors';\n\nexport interface AssetPaths {\n css: string[]; // Goes to assets/css/\n images: string[]; // Goes to public/assets/images/\n fonts: string[]; // Goes to public/assets/fonts/\n js: string[]; // Goes to public/assets/js/\n}\n\n/**\n * Scan Webflow export directory for assets\n */\nexport async function scanAssets(webflowDir: string): Promise<AssetPaths> {\n const assets: AssetPaths = {\n css: [],\n images: [],\n fonts: [],\n js: [],\n };\n\n // Find CSS files\n const cssFiles = await glob('css/**/*.css', { cwd: webflowDir });\n assets.css = cssFiles;\n\n // Find images\n const imageFiles = await glob('images/**/*', { cwd: webflowDir });\n assets.images = imageFiles;\n\n // Find fonts\n const fontFiles = await glob('fonts/**/*', { cwd: webflowDir });\n assets.fonts = fontFiles;\n\n // Find JS files\n const jsFiles = await glob('js/**/*.js', { cwd: webflowDir });\n assets.js = jsFiles;\n\n return assets;\n}\n\n/**\n * Copy CSS files to assets/css/\n */\nexport async function copyCSSFiles(\n webflowDir: string,\n outputDir: string,\n cssFiles: string[]\n): Promise<void> {\n const targetDir = path.join(outputDir, 'assets', 'css');\n await fs.ensureDir(targetDir);\n\n for (const file of cssFiles) {\n const source = path.join(webflowDir, file);\n const target = path.join(targetDir, path.basename(file));\n await fs.copy(source, target);\n }\n}\n\n/**\n * Copy images to public/assets/images/\n */\nexport async function copyImages(\n webflowDir: string,\n outputDir: string,\n imageFiles: string[]\n): Promise<void> {\n const targetDir = path.join(outputDir, 'public', 'assets', 'images');\n await fs.ensureDir(targetDir);\n\n for (const file of imageFiles) {\n const source = path.join(webflowDir, file);\n const target = path.join(targetDir, path.basename(file));\n await fs.copy(source, target);\n }\n}\n\n/**\n * Copy fonts to public/assets/fonts/\n */\nexport async function copyFonts(\n webflowDir: string,\n outputDir: string,\n fontFiles: string[]\n): Promise<void> {\n const targetDir = path.join(outputDir, 'public', 'assets', 'fonts');\n await fs.ensureDir(targetDir);\n\n for (const file of fontFiles) {\n const source = path.join(webflowDir, file);\n const target = path.join(targetDir, path.basename(file));\n await fs.copy(source, target);\n }\n}\n\n/**\n * Copy JS files to public/assets/js/\n */\nexport async function copyJSFiles(\n webflowDir: string,\n outputDir: string,\n jsFiles: string[]\n): Promise<void> {\n const targetDir = path.join(outputDir, 'public', 'assets', 'js');\n await fs.ensureDir(targetDir);\n\n for (const file of jsFiles) {\n const source = path.join(webflowDir, file);\n const target = path.join(targetDir, path.basename(file));\n await fs.copy(source, target);\n }\n}\n\n/**\n * Copy all assets to their proper locations\n */\nexport async function copyAllAssets(\n webflowDir: string,\n outputDir: string,\n assets: AssetPaths\n): Promise<void> {\n await copyCSSFiles(webflowDir, outputDir, assets.css);\n await copyImages(webflowDir, outputDir, assets.images);\n await copyFonts(webflowDir, outputDir, assets.fonts);\n await copyJSFiles(webflowDir, outputDir, assets.js);\n}\n\n/**\n * Find all HTML files in Webflow export (including subfolders)\n */\nexport async function findHTMLFiles(webflowDir: string): Promise<string[]> {\n // Find all HTML files recursively\n const htmlFiles = await glob('**/*.html', { cwd: webflowDir });\n return htmlFiles;\n}\n\n/**\n * Read HTML file content\n */\nexport async function readHTMLFile(webflowDir: string, fileName: string): Promise<string> {\n const filePath = path.join(webflowDir, fileName);\n return await fs.readFile(filePath, 'utf-8');\n}\n\n/**\n * Write Vue component to pages directory\n * Handles nested paths (e.g., press-release/article.html -> pages/press-release/article.vue)\n */\nexport async function writeVueComponent(\n outputDir: string,\n fileName: string,\n content: string\n): Promise<void> {\n const pagesDir = path.join(outputDir, 'pages');\n \n // Convert HTML path to Vue path\n // e.g., press-release/article.html -> press-release/article.vue\n const vueName = fileName.replace('.html', '.vue');\n const targetPath = path.join(pagesDir, vueName);\n\n // Ensure the directory exists\n await fs.ensureDir(path.dirname(targetPath));\n\n await fs.writeFile(targetPath, content, 'utf-8');\n}\n\n/**\n * Format Vue files with Prettier\n */\nexport async function formatVueFiles(outputDir: string): Promise<void> {\n const pagesDir = path.join(outputDir, 'pages');\n \n try {\n console.log(pc.blue('\\n✨ Formatting Vue files with Prettier...'));\n \n // Check if prettier is available\n execSync('npx prettier --version', { stdio: 'ignore' });\n \n // Format all Vue files in pages directory\n execSync(`npx prettier --write \"${pagesDir}/**/*.vue\"`, { \n cwd: outputDir,\n stdio: 'inherit' \n });\n \n console.log(pc.green(' āœ“ Vue files formatted'));\n } catch (error) {\n console.log(pc.yellow(' ⚠ Prettier not available, skipping formatting'));\n }\n}\n","/**\n * HTML Parser for Webflow exports\n * Handles conversion to Vue/Nuxt format\n */\n\nimport * as cheerio from 'cheerio';\nimport path from 'path';\n\nexport interface ParsedPage {\n fileName: string;\n title: string;\n htmlContent: string;\n cssFiles: string[];\n embeddedStyles: string;\n images: string[];\n links: string[];\n}\n\n/**\n * Normalize a path to absolute format\n * Examples:\n * - index.html -> /\n * - about.html -> /about\n * - ../index.html -> /\n * - press-release/article.html -> /press-release/article\n */\nfunction normalizeRoute(href: string): string {\n // Remove .html extension\n let route = href.replace('.html', '');\n\n // Handle various index patterns\n if (route === 'index' || route === '/index' || route.endsWith('/index')) {\n return '/';\n }\n\n // Handle parent directory references\n if (route === '..' || route === '../' || route === '/..' || route === '../index') {\n return '/';\n }\n\n // Remove all relative path indicators\n route = route.replace(/\\.\\.\\//g, '').replace(/\\.\\//g, '');\n\n // Normalize the path\n const normalized = path.posix.normalize(route);\n\n // Ensure it starts with /\n if (!normalized.startsWith('/')) {\n return '/' + normalized;\n }\n\n // If it became just '.' after normalization, return '/'\n if (normalized === '.' || normalized === '') {\n return '/';\n }\n\n return normalized;\n}\n\n/**\n * Normalize asset path to absolute\n * Examples:\n * - images/logo.svg -> /assets/images/logo.svg\n * - ../images/logo.svg -> /assets/images/logo.svg\n * - /assets/../images/logo.svg -> /assets/images/logo.svg\n */\nfunction normalizeAssetPath(src: string): string {\n if (!src || src.startsWith('http') || src.startsWith('https')) {\n return src;\n }\n\n // Remove any ../ or ./ at the start\n let normalized = src.replace(/^(\\.\\.\\/)+/, '').replace(/^\\.\\//, '');\n\n // If it already starts with /assets/, clean up any ../ in the middle\n if (normalized.startsWith('/assets/')) {\n normalized = normalized.replace(/\\/\\.\\.\\//g, '/');\n return normalized;\n }\n\n // Otherwise, add /assets/ prefix\n return `/assets/${normalized}`;\n}\n\n/**\n * Parse a Webflow HTML file\n */\nexport function parseHTML(html: string, fileName: string): ParsedPage {\n const $ = cheerio.load(html);\n\n // Extract page title\n const title = $('title').text() || fileName.replace('.html', '');\n\n // Find all CSS files\n const cssFiles: string[] = [];\n $('link[rel=\"stylesheet\"]').each((_, el) => {\n const href = $(el).attr('href');\n if (href) {\n cssFiles.push(href);\n }\n });\n\n // Extract embedded styles (from .global-embed or style tags in body)\n let embeddedStyles = '';\n\n // Get styles from .global-embed class\n $('.global-embed style').each((_, el) => {\n embeddedStyles += $(el).html() + '\\n';\n });\n\n // Get style tags before closing body\n $('body > style').each((_, el) => {\n embeddedStyles += $(el).html() + '\\n';\n });\n\n // Remove the global-embed elements and body style tags from DOM\n $('.global-embed').remove();\n $('body > style').remove();\n\n // Remove all script tags from body\n $('body script').remove();\n\n // Get all images for asset mapping\n const images: string[] = [];\n $('img').each((_, el) => {\n const src = $(el).attr('src');\n if (src) {\n images.push(src);\n }\n });\n\n // Get all links\n const links: string[] = [];\n $('a').each((_, el) => {\n const href = $(el).attr('href');\n if (href) {\n links.push(href);\n }\n });\n\n // Get ONLY the body's inner content (not the body tag itself)\n const htmlContent = $('body').html() || '';\n\n return {\n fileName,\n title,\n htmlContent,\n cssFiles,\n embeddedStyles,\n images,\n links,\n };\n}\n\n/**\n * Transform HTML content for Nuxt/Vue\n * - Convert <a> to <NuxtLink>\n * - Fix image paths (add /assets/ prefix for public folder)\n * - Remove any remaining html/head/body tags\n * - Remove srcset and sizes attributes from images\n */\nexport function transformForNuxt(html: string): string {\n const $ = cheerio.load(html);\n\n // Remove any html, head, body tags that might have leaked through\n $('html, head, body').each((_, el) => {\n const $el = $(el);\n $el.replaceWith($el.html() || '');\n });\n\n // Remove all script tags\n $('script').remove();\n\n // 1. Convert <a> tags to <NuxtLink>\n $('a').each((_, el) => {\n const $el = $(el);\n const href = $el.attr('href');\n\n if (!href) return;\n\n // Check if it's an internal link\n const isExternal = href.startsWith('http://') ||\n href.startsWith('https://') ||\n href.startsWith('mailto:') ||\n href.startsWith('tel:') ||\n href.startsWith('#');\n\n if (!isExternal) {\n // Normalize the route\n const route = normalizeRoute(href);\n\n $el.attr('to', route);\n $el.removeAttr('href');\n\n // Change tag name to NuxtLink\n const content = $el.html();\n const classes = $el.attr('class') || '';\n\n $el.replaceWith(`<nuxt-link to=\"${route}\" class=\"${classes}\">${content}</nuxt-link>`);\n }\n });\n\n // 2. Fix image paths and remove srcset/sizes\n $('img').each((_, el) => {\n const $el = $(el);\n const src = $el.attr('src');\n\n if (src) {\n // Normalize the asset path\n const normalizedSrc = normalizeAssetPath(src);\n $el.attr('src', normalizedSrc);\n }\n\n // Remove srcset and sizes attributes\n $el.removeAttr('srcset');\n $el.removeAttr('sizes');\n });\n\n // Note: CSS background-image paths are NOT changed here\n // They will be handled by the webflow-assets.ts Vite plugin\n\n return $.html();\n}\n\n/**\n * Convert transformed HTML to Vue component\n */\nexport function htmlToVueComponent(html: string, pageName: string): string {\n return `\n<script setup lang=\"ts\">\n// Page: ${pageName}\n</script>\n\n<template>\n <div>\n ${html}\n </div>\n</template>\n`;\n}\n\n/**\n * Deduplicate styles - remove duplicate CSS rules\n */\nexport function deduplicateStyles(styles: string): string {\n if (!styles.trim()) return '';\n\n // Split by comments that indicate file sources\n const sections = styles.split(/\\/\\* From .+ \\*\\//);\n\n // Keep only unique style content\n const uniqueStyles = new Set<string>();\n\n for (const section of sections) {\n const trimmed = section.trim();\n if (trimmed) {\n uniqueStyles.add(trimmed);\n }\n }\n\n return Array.from(uniqueStyles).join('\\n\\n');\n}\n","/**\n * Utilities to update Nuxt config and generate webflow-assets.ts\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\n\n/**\n * Generate the webflow-assets.ts Vite plugin\n */\nexport function generateWebflowAssetPlugin(cssFiles: string[]): string {\n // Convert css/normalize.css to /assets/css/normalize.css\n const webflowFiles = cssFiles.map(file => `/assets/css/${path.basename(file)}`);\n\n return `import type { Plugin } from 'vite'\n\nconst webflowFiles = [${webflowFiles.map(f => `'${f}'`).join(', ')}]\nconst replacements = [\n ['../images/', '/assets/images/'],\n ['../fonts/', '/assets/fonts/']\n]\n\nconst webflowURLReset = (): Plugin => ({\n name: 'webflowURLReset',\n config: () => ({\n build: {\n rollupOptions: {\n external: [/\\\\.\\\\.\\\\/fonts\\\\//, /\\\\.\\\\.\\\\/images\\\\//]\n }\n }\n }),\n transform: (code, id) => {\n if (webflowFiles.some((path) => id.includes(path))) {\n replacements.forEach(([search, replace]) => {\n code = code.replaceAll(search, replace)\n })\n }\n\n return { code, id, map: null }\n }\n})\n\nexport default webflowURLReset\n`;\n}\n\n/**\n * Write webflow-assets.ts to utils folder (overwrites existing)\n */\nexport async function writeWebflowAssetPlugin(\n outputDir: string,\n cssFiles: string[]\n): Promise<void> {\n const utilsDir = path.join(outputDir, 'utils');\n await fs.ensureDir(utilsDir);\n\n const content = generateWebflowAssetPlugin(cssFiles);\n const targetPath = path.join(utilsDir, 'webflow-assets.ts');\n\n // This will overwrite if it exists\n await fs.writeFile(targetPath, content, 'utf-8');\n}\n\n/**\n * Update nuxt.config.ts to add CSS files\n */\nexport async function updateNuxtConfig(\n outputDir: string,\n cssFiles: string[]\n): Promise<void> {\n const configPath = path.join(outputDir, 'nuxt.config.ts');\n\n // Check if config exists\n const configExists = await fs.pathExists(configPath);\n if (!configExists) {\n throw new Error('nuxt.config.ts not found in output directory');\n }\n\n // Read existing config\n let config = await fs.readFile(configPath, 'utf-8');\n\n // Generate CSS array entries\n const cssEntries = cssFiles.map(file => ` '~/assets/css/${path.basename(file)}'`);\n\n // Check if css array exists\n if (config.includes('css:')) {\n // Find the css array and add our files\n // This is a simple approach - we'll add them at the end of the array\n config = config.replace(\n /css:\\s*\\[/,\n `css: [\\n${cssEntries.join(',\\n')},`\n );\n } else {\n // Add css array to the config\n // Find the export default defineNuxtConfig({\n config = config.replace(\n /export default defineNuxtConfig\\(\\{/,\n `export default defineNuxtConfig({\\n css: [\\n${cssEntries.join(',\\n')}\\n ],`\n );\n }\n\n // Write updated config\n await fs.writeFile(configPath, config, 'utf-8');\n}\n\n/**\n * Write embedded styles to main.css\n */\nexport async function writeEmbeddedStyles(\n outputDir: string,\n styles: string\n): Promise<void> {\n if (!styles.trim()) return;\n\n const cssDir = path.join(outputDir, 'assets', 'css');\n await fs.ensureDir(cssDir);\n\n const mainCssPath = path.join(cssDir, 'main.css');\n\n // Check if main.css exists\n const exists = await fs.pathExists(mainCssPath);\n\n if (exists) {\n // Append to existing main.css\n const existing = await fs.readFile(mainCssPath, 'utf-8');\n await fs.writeFile(mainCssPath, `${existing}\\n\\n/* Webflow Embedded Styles */\\n${styles}`, 'utf-8');\n } else {\n // Create new main.css\n await fs.writeFile(mainCssPath, `/* Webflow Embedded Styles */\\n${styles}`, 'utf-8');\n }\n}\n","/**\n * Boilerplate cloning and setup utilities\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport pc from 'picocolors';\n\n/**\n * Check if a string is a GitHub URL\n */\nfunction isGitHubURL(source: string): boolean {\n return source.startsWith('https://github.com/') || \n source.startsWith('git@github.com:') ||\n source.includes('github.com');\n}\n\n/**\n * Clone a GitHub repository\n */\nasync function cloneFromGitHub(repoUrl: string, outputDir: string): Promise<void> {\n console.log(pc.blue(' Cloning from GitHub...'));\n \n try {\n // Clone the repo\n execSync(`git clone ${repoUrl} ${outputDir}`, { stdio: 'inherit' });\n \n // Remove .git directory to start fresh\n const gitDir = path.join(outputDir, '.git');\n await fs.remove(gitDir);\n \n console.log(pc.green(' āœ“ Boilerplate cloned successfully'));\n } catch (error) {\n throw new Error(`Failed to clone repository: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Copy from local directory\n */\nasync function copyFromLocal(sourcePath: string, outputDir: string): Promise<void> {\n console.log(pc.blue(' Copying from local path...'));\n \n const sourceExists = await fs.pathExists(sourcePath);\n if (!sourceExists) {\n throw new Error(`Local boilerplate not found: ${sourcePath}`);\n }\n \n // Copy everything except node_modules, .nuxt, .output, .git\n await fs.copy(sourcePath, outputDir, {\n filter: (src) => {\n const name = path.basename(src);\n return !['node_modules', '.nuxt', '.output', '.git', 'dist'].includes(name);\n },\n });\n \n console.log(pc.green(' āœ“ Boilerplate copied successfully'));\n}\n\n/**\n * Setup boilerplate in output directory\n */\nexport async function setupBoilerplate(\n boilerplateSource: string | undefined,\n outputDir: string\n): Promise<void> {\n if (!boilerplateSource) {\n // No boilerplate specified - create minimal structure\n console.log(pc.blue('\\nšŸ“¦ Creating minimal Nuxt structure...'));\n await fs.ensureDir(outputDir);\n await fs.ensureDir(path.join(outputDir, 'pages'));\n await fs.ensureDir(path.join(outputDir, 'assets'));\n await fs.ensureDir(path.join(outputDir, 'public'));\n await fs.ensureDir(path.join(outputDir, 'utils'));\n \n // Create a basic nuxt.config.ts if it doesn't exist\n const configPath = path.join(outputDir, 'nuxt.config.ts');\n const configExists = await fs.pathExists(configPath);\n \n if (!configExists) {\n const basicConfig = `export default defineNuxtConfig({\n devtools: { enabled: true },\n css: [],\n})\n`;\n await fs.writeFile(configPath, basicConfig, 'utf-8');\n }\n \n console.log(pc.green(' āœ“ Structure created'));\n return;\n }\n\n // Check if output directory already exists\n const outputExists = await fs.pathExists(outputDir);\n if (outputExists) {\n throw new Error(`Output directory already exists: ${outputDir}. Please choose a different path or remove it first.`);\n }\n\n console.log(pc.blue('\\nšŸ“¦ Setting up boilerplate...'));\n\n if (isGitHubURL(boilerplateSource)) {\n await cloneFromGitHub(boilerplateSource, outputDir);\n } else {\n await copyFromLocal(boilerplateSource, outputDir);\n }\n}\n","/**\n * Auto-detection of editable fields\n * TODO: Implement in Sprint 2\n */\n\nexport function detectEditableFields(_html: string): any {\n // TODO: Implement detection logic\n throw new Error('Not yet implemented');\n}\n","/**\n * Manifest generation\n * TODO: Implement in Sprint 2\n */\n\nimport type { CMSManifest } from '@see-ms/types';\n\nexport function generateManifest(_data: any): CMSManifest {\n // TODO: Implement manifest generation\n throw new Error('Not yet implemented');\n}\n","/**\n * CMS schema generation\n * Supports multiple CMS backends: Strapi, Contentful, Sanity\n * TODO: Implement in Sprint 3\n */\n\nexport async function generateSchemas(_manifestPath: string, _cmsType: string): Promise<void> {\n // TODO: Implement generation logic for multiple CMS types\n throw new Error('Not yet implemented');\n}\n","/**\n * Transform manifest to CMS schemas\n * TODO: Implement in Sprint 3\n */\n\nimport type { CMSManifest, StrapiSchema } from '@see-ms/types';\n\nexport function manifestToSchema(_manifest: CMSManifest, _cmsType: string): StrapiSchema[] {\n // TODO: Implement transformation logic for different CMS types\n throw new Error('Not yet implemented');\n}\n"],"mappings":"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","names":["pc","fs","path","fs","path","fs","path","execSync","pc","pc","fs"]}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@see-ms/converter",
3
+ "version": "0.1.0",
4
+ "description": "CLI for converting HTML files to Nuxt 3 with CMS integration",
5
+ "main": "./dist/index.mjs",
6
+ "types": "./dist/index.d.mts",
7
+ "bin": {
8
+ "cms": "./dist/cli.mjs"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "dev": "tsup --watch",
15
+ "build": "tsup",
16
+ "typecheck": "tsc --noEmit",
17
+ "clean": "rm -rf dist"
18
+ },
19
+ "dependencies": {
20
+ "@see-ms/types": "workspace:*",
21
+ "cheerio": "^1.0.0-rc.12",
22
+ "commander": "^11.1.0",
23
+ "fs-extra": "^11.2.0",
24
+ "glob": "^10.3.10",
25
+ "picocolors": "^1.0.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/fs-extra": "^11.0.4",
29
+ "tsup": "^8.0.1",
30
+ "typescript": "^5.3.3"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "keywords": [
36
+ "webflow",
37
+ "nuxt",
38
+ "cms",
39
+ "converter",
40
+ "strapi",
41
+ "contentful",
42
+ "sanity"
43
+ ],
44
+ "license": "MIT"
45
+ }