@pixelated-tech/components 3.9.12 → 3.9.14

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.
Files changed (49) hide show
  1. package/dist/components/general/callout.js +0 -1
  2. package/dist/components/general/markdown.js +0 -1
  3. package/dist/components/general/recipe.js +0 -1
  4. package/dist/components/integrations/contentful.items.components.js +0 -1
  5. package/dist/components/integrations/socialcard.js +0 -12
  6. package/dist/components/shoppingcart/ebay.components.js +0 -1
  7. package/dist/components/shoppingcart/shoppingcart.components.js +1 -3
  8. package/dist/config/pixelated.config.json.enc +1 -1
  9. package/dist/scripts/build.sh +21 -8
  10. package/dist/scripts/create-pixelated-app-template-mapper.js +80 -0
  11. package/dist/scripts/create-pixelated-app.js +471 -0
  12. package/dist/scripts/create-pixelated-app.json +32 -0
  13. package/dist/scripts/release.sh +23 -3
  14. package/dist/types/components/general/404.d.ts.map +1 -1
  15. package/dist/types/components/general/callout.d.ts.map +1 -1
  16. package/dist/types/components/general/markdown.d.ts.map +1 -1
  17. package/dist/types/components/general/menu-accordion.d.ts.map +1 -1
  18. package/dist/types/components/general/recipe.d.ts.map +1 -1
  19. package/dist/types/components/general/resume.d.ts.map +1 -1
  20. package/dist/types/components/general/timeline.d.ts.map +1 -1
  21. package/dist/types/components/integrations/contentful.items.components.d.ts.map +1 -1
  22. package/dist/types/components/integrations/socialcard.d.ts.map +1 -1
  23. package/dist/types/components/integrations/wordpress.components.d.ts.map +1 -1
  24. package/dist/types/components/shoppingcart/ebay.components.d.ts.map +1 -1
  25. package/dist/types/components/shoppingcart/shoppingcart.components.d.ts.map +1 -1
  26. package/dist/types/scripts/create-pixelated-app-template-mapper.d.ts +5 -0
  27. package/dist/types/scripts/create-pixelated-app-template-mapper.d.ts.map +1 -0
  28. package/dist/types/scripts/create-pixelated-app.d.ts +12 -0
  29. package/dist/types/scripts/create-pixelated-app.d.ts.map +1 -0
  30. package/dist/types/tests/config-vault.test.d.ts +2 -0
  31. package/dist/types/tests/config-vault.test.d.ts.map +1 -0
  32. package/dist/types/tests/create-pixelated-app-template-mapper.test.d.ts +2 -0
  33. package/dist/types/tests/create-pixelated-app-template-mapper.test.d.ts.map +1 -0
  34. package/dist/types/tests/create-pixelated-app.cli.test.d.ts +2 -0
  35. package/dist/types/tests/create-pixelated-app.cli.test.d.ts.map +1 -0
  36. package/dist/types/tests/create-pixelated-app.test.d.ts +2 -0
  37. package/dist/types/tests/create-pixelated-app.test.d.ts.map +1 -0
  38. package/dist/types/tests/generate-site-images.test.d.ts +2 -0
  39. package/dist/types/tests/generate-site-images.test.d.ts.map +1 -0
  40. package/dist/types/tests/pixelated-eslint-plugin.test.d.ts +2 -0
  41. package/dist/types/tests/pixelated-eslint-plugin.test.d.ts.map +1 -0
  42. package/dist/types/tests/shell-scripts.test.d.ts +2 -0
  43. package/dist/types/tests/shell-scripts.test.d.ts.map +1 -0
  44. package/dist/types/tests/validate-exports.test.d.ts +2 -0
  45. package/dist/types/tests/validate-exports.test.d.ts.map +1 -0
  46. package/package.json +8 -7
  47. package/dist/scripts/validate-exports.cjs +0 -280
  48. package/dist/types/scripts/validate-exports.d.cts +0 -2
  49. package/dist/types/scripts/validate-exports.d.cts.map +0 -1
@@ -0,0 +1,471 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * create-pixelated-app.js
4
+ *
5
+ * Simple CLI to scaffold a new site from `pixelated-template`.
6
+ * - copies the template to a destination folder
7
+ * - clears out the .git history in the copy
8
+ * - optionally initializes a fresh git repo and adds a remote
9
+ *
10
+ * TODOs (placeholders for later work):
11
+ * - Create/patch pixelated.config.json and optionally run config:encrypt
12
+ * - Run `npm ci` / `npm run lint` / `npm test` and optionally build
13
+ * - Optionally create GitHub repo using API (with token from secure vault)
14
+ *
15
+ *
16
+ 1) Recommended approach (short) āœ…
17
+ Build a small Node-based CLI (easier cross-platform than a Bash script) called e.g. scripts/new-site.js or an npm create script.
18
+ Make it interactive with sensible CLI flags (--name, --domain, --repo, --git, --encrypt, --no-install) and a non-interactive mode for CI.
19
+
20
+ 2) High-level workflow the script should perform šŸ”
21
+ Validate inputs (target path, site slug, repo name).
22
+ Copy pixelated-template → ./<new-site-name> (preserve file modes).
23
+ Replace placeholders in files (template tokens like {{SITE_NAME}}, {{PACKAGE_NAME}}, {{DOMAIN}}).
24
+ Patch template-specific files (see list below).
25
+ Remove template git metadata (rm -rf .git) and reset any CI state.
26
+ Create/patch pixelated.config.json with site-specific values (ask for secrets). Optionally run npm run config:encrypt to write .enc.
27
+ Run validation: npm ci (optional), npm run lint, npm test, npm run build.
28
+ Init git, make initial commit, optionally create remote GitHub repo (if token available) and push.
29
+ Print summary and next steps (e.g., configure hosting / DNS / deploy keys).
30
+
31
+ 3) Files / fields to update in the template šŸ”§
32
+ package.json — name, description, repository, author, homepage, version, scripts (if you want to change default scripts).
33
+ README.md — project title and quick-start instructions.
34
+ next.config.ts / amplify.yml — site-specific env entries and build steps.
35
+ pixelated.config.json — update global/aws/contentful/google fields for this site (prefer *.enc workflow).
36
+ src/app/(pages)/… and any site metadata files (site slug, default pagesDir).
37
+ public/ assets and site-images.json — update site logos/URLs.
38
+ certificates/ if using TLS — template may include placeholder paths.
39
+ FEATURE_CHECKLIST.md — optionally update default checklist for new site.
40
+ .gitignore — ensure pixelated.config.json is ignored if plaintext during setup.
41
+
42
+ 4) Template hardening (recommended changes in pixelated-template) āš ļø
43
+ Add placeholder tokens for the things above (e.g., {{PACKAGE_NAME}}, {{SITE_DOMAIN}}) rather than literal values.
44
+ Add a template.json or template.meta that lists files & placeholders to auto-replace.
45
+ Ensure the template does not include real secrets. Provide pixelated.config.json.example with placeholders and an example .env.local.example.
46
+ Add a scripts/prepare-template.sh or test job that ensures no plaintext sensitive values remain.
47
+ Document the creation process in TEMPLATE_README.md for maintainers.
48
+
49
+ 5) Security & operational notes šŸ”
50
+ Do not commit plaintext pixelated.config.json. If the CLI accepts secret values, optionally run npm run config:encrypt immediately and only commit the .enc if needed (prefer not to commit it; store in site secrets store).
51
+ Add an option to write the encrypted file directly into dist/config when building a deployment bundle.
52
+ Provide an audit step: scan resulting repo for secret patterns before final commit/push.
53
+
54
+ 6) Helpful CLI implementation details (tools & libs) šŸ› ļø
55
+ Use Node + these packages: fs-extra (copy), replace-in-file or simple .replace() for template tokens, inquirer (prompt), execa (run commands), simple-git (git ops), node-fetch or @octokit/rest (optional GitHub repo creation).
56
+ Use safe file writes and atomic renames for config operations.
57
+ Provide a --dry-run and --preview mode so users can verify changes before creating repo or pushing.
58
+
59
+ 7) Validation & post-creation steps āœ…
60
+ npm run lint && npm test && npm run build — fail fast and show errors for the new site.
61
+ Optional: run npm run config:decrypt locally (with provided key) to confirm decryption works in your deploy workflow (BUT DO NOT store the key in the repo).
62
+
63
+ 8) Example minimal CLI flow (pseudo)
64
+ Prompt: site name, package name, repo URL (optional), domain, author, contentful tokens, aws keys (optional), encrypt?
65
+ Copy template → replace tokens → create pixelated.config.json from pixelated.config.json.example → encrypt if requested → init git → run install/build → push to remote.
66
+
67
+ */
68
+
69
+ import fs from 'fs/promises';
70
+ import path from 'path';
71
+ import { exec as execCb } from 'child_process';
72
+ import { promisify } from 'util';
73
+ import readline from 'readline/promises';
74
+ import { stdin as input, stdout as output } from 'process';
75
+ import { fileURLToPath } from 'url';
76
+ import { loadManifest, findTemplateForSlug, pruneTemplateDirs, printAvailableTemplates } from './create-pixelated-app-template-mapper.js';
77
+
78
+ const __filename = fileURLToPath(import.meta.url);
79
+ const __dirname = path.dirname(__filename);
80
+
81
+ const exec = promisify(execCb);
82
+
83
+ async function exists(p) {
84
+ try {
85
+ await fs.access(p);
86
+ return true;
87
+ } catch (e) {
88
+ return false;
89
+ }
90
+ }
91
+
92
+ async function countFiles(src) {
93
+ let total = 0;
94
+ async function walk(p) {
95
+ const stat = await fs.lstat(p);
96
+ if (stat.isDirectory()) {
97
+ const items = await fs.readdir(p, { withFileTypes: true });
98
+ for (const item of items) {
99
+ await walk(path.join(p, item.name));
100
+ }
101
+ } else {
102
+ total++;
103
+ }
104
+ }
105
+ await walk(src);
106
+ return total;
107
+ }
108
+
109
+ function startSpinner(messageFn) {
110
+ if (!process.stdout.isTTY) return { stop: () => {} };
111
+ const frames = ['-', '\\', '|', '/'];
112
+ let i = 0;
113
+ const interval = setInterval(() => {
114
+ const msg = messageFn ? messageFn() : '';
115
+ process.stdout.write(`\r${frames[i % frames.length]} ${msg}`);
116
+ i++;
117
+ }, 100);
118
+ return {
119
+ stop: () => {
120
+ clearInterval(interval);
121
+ process.stdout.write('\r');
122
+ process.stdout.write('\n');
123
+ }
124
+ };
125
+ }
126
+
127
+ async function copyRecursive(src, dest, onFileCopied) {
128
+ // Recursive copy that reports per-file progress via onFileCopied.
129
+ await fs.mkdir(dest, { recursive: true });
130
+ const items = await fs.readdir(src, { withFileTypes: true });
131
+ for (const item of items) {
132
+ const s = path.join(src, item.name);
133
+ const d = path.join(dest, item.name);
134
+ const stat = await fs.lstat(s);
135
+ if (stat.isDirectory()) {
136
+ await copyRecursive(s, d, onFileCopied);
137
+ } else if (stat.isSymbolicLink()) {
138
+ try {
139
+ const link = await fs.readlink(s);
140
+ await fs.symlink(link, d);
141
+ if (onFileCopied) onFileCopied(d);
142
+ } catch (e) {
143
+ // ignore symlink failures
144
+ if (onFileCopied) onFileCopied(d);
145
+ }
146
+ } else {
147
+ // Regular file
148
+ await fs.copyFile(s, d);
149
+ if (onFileCopied) onFileCopied(d);
150
+ }
151
+ }
152
+ }
153
+
154
+ // Replace placeholders like {{SITE_NAME}}, {{SITE_URL}}, {{EMAIL_ADDRESS}} across the created site
155
+ // This supports both literal tags and simple regex patterns (for cases where the bundler
156
+ // transformed template tokens into JS expressions like {SITE_NAME}). Each replacement
157
+ // entry may have { tag, value, isRegex } where isRegex indicates `tag` is a regex string.
158
+ async function replacePlaceholders(rootDir, replacements) {
159
+ const ignoreDirs = new Set(['.git', 'node_modules', 'dist', 'coverage']);
160
+ let filesChanged = 0;
161
+ async function walk(p) {
162
+ const items = await fs.readdir(p, { withFileTypes: true });
163
+ for (const item of items) {
164
+ const entry = path.join(p, item.name);
165
+ if (item.isDirectory()) {
166
+ // Allow running against .next when explicitly targeting it, but skip when walking a template
167
+ if (item.name === '.next' && rootDir !== '.next') continue;
168
+ if (ignoreDirs.has(item.name)) continue;
169
+ await walk(entry);
170
+ } else {
171
+ try {
172
+ let content = await fs.readFile(entry, 'utf8');
173
+ let newContent = content;
174
+ for (const { tag, value, isRegex } of replacements) {
175
+ let re;
176
+ if (isRegex) {
177
+ re = new RegExp(tag, 'g');
178
+ } else {
179
+ re = new RegExp(tag.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g');
180
+ }
181
+ newContent = newContent.replace(re, value);
182
+ }
183
+ if (newContent !== content) {
184
+ await fs.writeFile(entry, newContent, 'utf8');
185
+ filesChanged++;
186
+ }
187
+ } catch (e) {
188
+ // Could be binary or unreadable - skip
189
+ }
190
+ }
191
+ }
192
+ }
193
+ await walk(rootDir);
194
+ return filesChanged;
195
+ }
196
+
197
+ // Token map used by the CLI: literal marker (e.g., "__SITE_NAME__") -> replacement value (populate during interactive prompts)
198
+ export const TOKEN_MAP = {
199
+ "__SITE_NAME__": '',
200
+ "__SITE_URL__": '',
201
+ "__EMAIL_ADDRESS__": ''
202
+ };
203
+
204
+ // Helper: add a route entry to the routes.json structure for a newly created page
205
+ export function addRouteEntry(routesJson, pageSlug, displayName, rootDisplayName) {
206
+ if (!routesJson || !Array.isArray(routesJson.routes)) return false;
207
+ const candidatePath = `/${pageSlug}`;
208
+ if (routesJson.routes.some(r => r.path === candidatePath)) return false;
209
+ const name = displayName.split(/\s+/).map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(' ');
210
+ routesJson.routes.push({
211
+ "name": name,
212
+ "path": candidatePath,
213
+ "title": `${rootDisplayName} - ${displayName}`,
214
+ "description": "",
215
+ "keywords": ""
216
+ });
217
+ return true;
218
+ }
219
+
220
+ // Copy a template page into the target directory, resolving to the expected location inside the workspace template.
221
+ // Returns an object { used: 'template'|'fallback', src: <sourcePath> }
222
+ export async function copyTemplateForPage(templatePathArg, templateSrc, templatePagesHome, targetDir) {
223
+ const folderName = path.basename(templateSrc);
224
+ const srcTemplatePath = path.join(templatePathArg, 'src', 'app', '(pages)', folderName);
225
+ if (await exists(srcTemplatePath)) {
226
+ await copyRecursive(srcTemplatePath, targetDir);
227
+ return { used: 'template', src: srcTemplatePath };
228
+ } else {
229
+ await copyRecursive(templatePagesHome, targetDir);
230
+ return { used: 'fallback', src: templatePagesHome };
231
+ }
232
+ }
233
+
234
+
235
+ async function main() {
236
+ const rl = readline.createInterface({ input, output });
237
+ try {
238
+ console.log('\nšŸ“¦ Pixelated site creator — scaffold a new site from pixelated-template\n');
239
+
240
+ const defaultName = 'my-site';
241
+ const siteName = (await rl.question(`Root directory name (kebab-case) [${defaultName}]: `)) || defaultName;
242
+
243
+ // Display name used in route titles: convert kebab to Title Case
244
+ const rootDisplayName = siteName.split(/[-_]+/).map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(' ');
245
+
246
+ // Additional site metadata for placeholder substitution
247
+ const siteUrl = (await rl.question('Site URL (e.g. https://example.com) [leave blank to skip]: ')).trim();
248
+ const emailAddress = (await rl.question('Contact email address [leave blank to skip]: ')).trim();
249
+
250
+ const workspaceRoot = path.resolve(__dirname, '..', '..', '..');
251
+ const templatePath = path.resolve(workspaceRoot, 'pixelated-template');
252
+ if (!(await exists(templatePath))) {
253
+ console.error(`\nāŒ Template not found at ${templatePath}. Please ensure this tool is run inside the workspace that contains pixelated-template.`);
254
+ process.exit(1);
255
+ }
256
+
257
+ // Load manifest (if present)
258
+ const manifest = await loadManifest(__dirname);
259
+ // Note: available templates will be printed later just before prompting for pages
260
+
261
+
262
+ // Destination is implicitly the top-level Git folder + site name to avoid prompting for it
263
+ const destPath = path.resolve(workspaceRoot, siteName);
264
+ console.log(`\nThe new site will be created at: ${destPath}`);
265
+ const proceed = (await rl.question('Proceed? (Y/n): ')) || 'y';
266
+ if (proceed.toLowerCase() !== 'y' && proceed.toLowerCase() !== 'yes') {
267
+ console.log('Aborting.');
268
+ process.exit(0);
269
+ }
270
+
271
+ if (await exists(destPath)) {
272
+ const shouldOverwrite = (await rl.question(`Destination ${destPath} already exists. Overwrite? (y/N): `)).toLowerCase();
273
+ if (shouldOverwrite !== 'y' && shouldOverwrite !== 'yes') {
274
+ console.log('Aborting. Choose another destination.');
275
+ process.exit(0);
276
+ }
277
+ console.log(`Removing existing directory ${destPath}...`);
278
+ await fs.rm(destPath, { recursive: true, force: true });
279
+ }
280
+
281
+ console.log(`\nCopying template from ${templatePath} -> ${destPath} ...`);
282
+ const totalFiles = await countFiles(templatePath);
283
+ let filesCopied = 0;
284
+ let lastFile = '';
285
+ const spinner = startSpinner(() => `Copying... ${filesCopied}/${totalFiles} ${lastFile ? '- ' + path.basename(lastFile) : ''}`);
286
+ await copyRecursive(templatePath, destPath, (f) => { if (f) { filesCopied++; lastFile = f; } });
287
+ // If fs.cp was used, per-file callbacks won't have been called; ensure we report the full total
288
+ if (filesCopied < totalFiles) filesCopied = totalFiles;
289
+ spinner.stop();
290
+ console.log(`āœ… Template files copied (${filesCopied} files).`);
291
+
292
+ // Remove git history
293
+ const gitDir = path.join(destPath, '.git');
294
+ if (await exists(gitDir)) {
295
+ console.log('Removing .git directory from new site...');
296
+ await fs.rm(gitDir, { recursive: true, force: true });
297
+ }
298
+
299
+ // Pages prompt: show available templates and ask which pages to create (comma-separated)
300
+ if (manifest && Array.isArray(manifest.templates) && manifest.templates.length) {
301
+ printAvailableTemplates(manifest);
302
+ }
303
+ const pagesInput = (await rl.question('Pages to create (comma-separated, e.g. about,contact) [leave blank to skip]: ')).trim();
304
+ let pagesToCreate = [];
305
+ let existingPages = [];
306
+ if (pagesInput) {
307
+ const raw = pagesInput.split(',').map(s => s.trim()).filter(Boolean);
308
+ // sanitize and normalize
309
+ const seen = new Set();
310
+ for (const r of raw) {
311
+ const lower = r.toLowerCase();
312
+ if (lower === 'home' || lower === 'index') {
313
+ existingPages.push('home');
314
+ continue;
315
+ }
316
+ let slug = r.trim().toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
317
+ if (!slug) continue;
318
+ if (seen.has(slug)) continue;
319
+ seen.add(slug);
320
+ const matchedTemplate = findTemplateForSlug(manifest, slug);
321
+ pagesToCreate.push({ slug, displayName: r.trim(), template: matchedTemplate });
322
+ }
323
+
324
+ console.log('\nSummary of pages:');
325
+ if (existingPages.length) console.log(` - Existing (skipped): ${existingPages.join(', ')}`);
326
+ if (pagesToCreate.length) {
327
+ console.log(' - To be created:');
328
+ for (const p of pagesToCreate) {
329
+ if (p.template) {
330
+ console.log(` - ${p.slug} (mapped to template: ${p.template.name})`);
331
+ } else {
332
+ console.log(` - ${p.slug} (no template match)`);
333
+ }
334
+ }
335
+ }
336
+ const proceedPages = (await rl.question('Proceed to create these pages? (Y/n): ')) || 'y';
337
+ if (proceedPages.toLowerCase() === 'y' || proceedPages.toLowerCase() === 'yes') {
338
+ // perform creation
339
+ const templatePagesHome = path.join(templatePath, 'src', 'app', '(pages)', '(home)');
340
+ const siteRoutesFile = path.join(destPath, 'src', 'app', 'data', 'routes.json');
341
+ let routesJson = null;
342
+ try {
343
+ routesJson = JSON.parse(await fs.readFile(siteRoutesFile, 'utf8'));
344
+ // Ensure siteInfo exists and set its name to the root display name
345
+ routesJson.siteInfo = routesJson.siteInfo || {};
346
+ routesJson.siteInfo.name = rootDisplayName;
347
+ } catch (e) {
348
+ console.warn('āš ļø Could not read routes.json, routes will not be updated.');
349
+ }
350
+
351
+ for (const p of pagesToCreate) {
352
+ const targetDir = path.join(destPath, 'src', 'app', '(pages)', p.slug);
353
+ console.log(`Creating page ${p.slug} -> ${targetDir}`);
354
+ let copyResult = null;
355
+ if (p.template && p.template.src) {
356
+ copyResult = await copyTemplateForPage(templatePath, p.template.src, templatePagesHome, targetDir);
357
+ if (copyResult.used === 'template') {
358
+ console.log(` - Copied template ${p.template.name} from ${copyResult.src}`);
359
+ } else {
360
+ console.warn(`āš ļø Template source ${path.join(templatePath, 'src', 'app', '(pages)', path.basename(p.template.src))} not found; using default page template instead.`);
361
+ }
362
+ } else {
363
+ await copyRecursive(templatePagesHome, targetDir);
364
+ }
365
+ // rename component in page.tsx
366
+ const pageFile = path.join(targetDir, 'page.tsx');
367
+ try {
368
+ let content = await fs.readFile(pageFile, 'utf8');
369
+ const compName = p.displayName.replace(/[^a-zA-Z0-9]+/g,' ').split(/\s+/).map(s=>s.charAt(0).toUpperCase()+s.slice(1)).join('') + 'Page';
370
+ content = content.replace(/export default function\s+\w+\s*\(/, `export default function ${compName}(`);
371
+ await fs.writeFile(pageFile, content, 'utf8');
372
+ console.log(` - Updated component name to ${compName} in ${path.relative(destPath, pageFile)}`);
373
+ } catch (e) {
374
+ console.warn(`āš ļø Failed to update component name for ${p.slug}:`, e?.message || e);
375
+ }
376
+
377
+ // update routes.json
378
+ if (routesJson && Array.isArray(routesJson.routes)) {
379
+ // Skip if route path already exists
380
+ const candidatePath = `/${p.slug}`;
381
+ if (!routesJson.routes.some(r => r.path === candidatePath)) {
382
+ routesJson.routes.push({
383
+ "name": p.displayName.split(/\s+/).map(s=>s.charAt(0).toUpperCase()+s.slice(1)).join(' '),
384
+ "path": candidatePath,
385
+ "title": `${rootDisplayName} - ${p.displayName}`,
386
+ "description": "",
387
+ "keywords": ""
388
+ });
389
+ } else {
390
+ console.log(` - Route ${candidatePath} already exists; skipping route add.`);
391
+ }
392
+ }
393
+ }
394
+
395
+ if (manifest) {
396
+ const removed = await pruneTemplateDirs(manifest, destPath, pagesToCreate.map(p=>p.slug));
397
+ for (const r of removed) {
398
+ console.log(`Removed unused template page ${r} from new site...`);
399
+ }
400
+ }
401
+
402
+ if (routesJson) {
403
+ try {
404
+ await fs.writeFile(siteRoutesFile, JSON.stringify(routesJson, null, '\t'), 'utf8');
405
+ console.log('āœ… routes.json updated.');
406
+ } catch (e) {
407
+ console.warn('āš ļø Failed to write routes.json:', e?.message || e);
408
+ }
409
+ }
410
+ } else {
411
+ console.log('Skipping page creation.');
412
+ }
413
+ }
414
+ // Automatically replace double-underscore template placeholders (e.g., __SITE_NAME__) with provided values
415
+ const replacements = {};
416
+ if (rootDisplayName) replacements.SITE_NAME = rootDisplayName;
417
+ if (siteUrl) replacements.SITE_URL = siteUrl;
418
+ if (emailAddress) replacements.EMAIL_ADDRESS = emailAddress;
419
+ if (Object.keys(replacements).length) {
420
+ const replArray = [];
421
+ for (const [t, valRaw] of Object.entries(replacements)) {
422
+ const val = String(valRaw);
423
+ // populate TOKEN_MAP so other code can inspect token->value mapping (keyed by literal marker)
424
+ const marker = `__${t}__`;
425
+ TOKEN_MAP[marker] = val;
426
+ // First, replace expression occurrences like {__TOKEN__} with a quoted string expression to avoid bare identifiers
427
+ replArray.push({ tag: `\\{${marker}\\}`, value: `{${JSON.stringify(val)}}`, isRegex: true });
428
+ // Then, replace literal marker occurrences (e.g., __TOKEN__) with the plain value
429
+ replArray.push({ tag: marker, value: val });
430
+ }
431
+ try {
432
+ const changed = await replacePlaceholders(destPath, replArray);
433
+ console.log(`āœ… Replaced template placeholders in ${changed} files under ${destPath}`);
434
+ } catch (e) {
435
+ console.warn('āš ļø Failed to replace placeholders in site copy:', e?.message || e);
436
+ }
437
+ }
438
+ // Prompt about git initialization
439
+ const initGitAnswer = (await rl.question('Initialize a fresh git repository here? (Y/n): ')) || 'y';
440
+ if (initGitAnswer.toLowerCase() === 'y' || initGitAnswer.toLowerCase() === 'yes') {
441
+ try {
442
+ await exec('git init -b main', { cwd: destPath });
443
+ await exec('git add .', { cwd: destPath });
444
+ await exec('git commit -m "chore: initial commit from pixelated-template"', { cwd: destPath });
445
+ console.log('āœ… Git initialized and initial commit created.');
446
+ } catch (e) {
447
+ console.warn('āš ļø Git init or commit failed. You can initialize manually later.', e?.stderr || e?.message || e);
448
+ }
449
+ }
450
+
451
+
452
+
453
+ console.log('\nšŸŽ‰ Done. Summary:');
454
+ console.log(` - Site copied to: ${destPath}`);
455
+ console.log('\nNote: A git remote was not set by this script. You can add one later with `git remote add origin <url>` if desired.');
456
+ console.log('\nNext recommended steps (manual or to be automated in future):');
457
+ console.log(' - Update pixelated.config.json for this site and encrypt it with your config tool');
458
+ console.log(' - Run `npm run lint`, `npm test`, and `npm run build` inside the new site and fix any issues');
459
+ console.log(' - Create GitHub repo (if not already created), push main branch, and set up CI/deploy secrets');
460
+ } catch (err) {
461
+ console.error('Unexpected error:', err);
462
+ process.exit(1);
463
+ } finally {
464
+ rl.close();
465
+ }
466
+ }
467
+
468
+ if (typeof process !== 'undefined' && new URL(import.meta.url).pathname === process.argv[1]) {
469
+ // CLI entry point: run the interactive main flow
470
+ main();
471
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "templates": [
3
+ {
4
+ "name": "FAQs",
5
+ "aliases": ["faq", "faqs", "qa", "q-and-a", "frequently-asked-question", "frequently-asked-questions"],
6
+ "src": "../../pixelated-template/src/app/(pages)/faqs",
7
+ "associated_files": ["src/app/data/faqs.json"]
8
+ },
9
+ {
10
+ "name": "Projects",
11
+ "aliases": ["gallery", "project", "projects", "portfolio", "work", "our-work",
12
+ "our-projects", "our-project", "case-studies", "examples", "showcase", "samples"],
13
+ "src": "../../pixelated-template/src/app/(pages)/projects"
14
+ },
15
+ {
16
+ "name": "About",
17
+ "aliases": ["about", "about-us", "company", "our-company", "team", "our-team", "about-us-page"],
18
+ "src": "../../pixelated-template/src/app/(pages)/about"
19
+ },
20
+ {
21
+ "name": "Contact",
22
+ "aliases": ["contact", "contact-us", "contact-us-page", "contactus", "support", "get-in-touch", "reach-out", "get-in-touch"],
23
+ "src": "../../pixelated-template/src/app/(pages)/contact",
24
+ "associated_files": ["src/app/data/contactform.json"]
25
+ },
26
+ {
27
+ "name": "Services",
28
+ "aliases": ["services", "service", "our-services", "services-page", "offerings", "solutions", "products"],
29
+ "src": "../../pixelated-template/src/app/(pages)/services"
30
+ }
31
+ ]
32
+ }
@@ -36,7 +36,7 @@ fi
36
36
 
37
37
  # Select remote
38
38
  echo ""
39
- echo "šŸ”‘ Step $((STEP_COUNT++)): Locating GitHub token in config..."
39
+ echo "šŸ”‘ Step $((STEP_COUNT++)): Choose the git Remote to release:"
40
40
  echo "================================================="
41
41
  # Function to prompt for remote selection
42
42
  prompt_remote_selection() {
@@ -62,6 +62,20 @@ prompt_remote_selection() {
62
62
  }
63
63
  REMOTE_NAME=$(prompt_remote_selection)
64
64
 
65
+ # Confirm current directory matches the selected remote's repository name
66
+ remote_url=$(git remote get-url "$REMOTE_NAME" 2>/dev/null || true)
67
+ remote_repo=$(basename -s .git "${remote_url##*/}")
68
+ local_repo=$(basename "$(git rev-parse --show-toplevel)")
69
+ if [ -n "$remote_repo" ] && [ "$remote_repo" != "$local_repo" ]; then
70
+ echo "\nāš ļø Warning: Selected remote '$REMOTE_NAME' points to repository '$remote_repo' but you are currently in folder '$local_repo'."
71
+ read -p "Proceed anyway? (y/N): " proceed
72
+ proceed=${proceed:-n}
73
+ if [[ ! "$proceed" =~ ^[Yy] ]]; then
74
+ echo "Aborting. Please run this script from the correct repository folder." >&2
75
+ exit 1
76
+ fi
77
+ fi
78
+
65
79
 
66
80
 
67
81
 
@@ -120,6 +134,12 @@ if [ -n "$UPDATES" ]; then
120
134
  else
121
135
  echo "āœ… No dependency updates needed."
122
136
  fi
137
+
138
+
139
+
140
+ echo ""
141
+ echo "šŸ“¦ Step $((STEP_COUNT++)): Updating Audit Fixes..."
142
+ echo "================================================="
123
143
  npm audit fix --force 2>/dev/null || true
124
144
 
125
145
 
@@ -150,6 +170,8 @@ echo "šŸ”Ø Step $((STEP_COUNT++)): Building project..."
150
170
  echo "================================================="
151
171
  npm run build
152
172
 
173
+
174
+
153
175
  # Post-build: if a dist folder exists, ensure it does NOT contain plaintext config and that the .enc file is present
154
176
  echo ""
155
177
  echo "šŸ”§ Step $((STEP_COUNT++)): Post-build config check: cleaning dist and verifying .enc..."
@@ -315,8 +337,6 @@ else
315
337
  # Diagnostic: show remote and derived repo path (non-secret)
316
338
  echo "Remote URL: $REMOTE_URL"
317
339
  echo "Derived repo_path: $repo_path"
318
- echo "Remote URL: $REMOTE_URL"
319
- echo "Derived repo_path: $repo_path"
320
340
 
321
341
  # Quick access check to see if token and repo path are valid
322
342
  access_resp=$(curl -s -H "Authorization: token $GITHUB_TOKEN" "https://api.github.com/repos/$repo_path")
@@ -1 +1 @@
1
- {"version":3,"file":"404.d.ts","sourceRoot":"","sources":["../../../../src/components/general/404.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,WAAW,CAAC;AAKnB,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAE,KAAK,EAAE,cAAc,2CAgDhD;yBAhDe,UAAU"}
1
+ {"version":3,"file":"404.d.ts","sourceRoot":"","sources":["../../../../src/components/general/404.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,WAAW,CAAC;AAKnB,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAE,KAAK,EAAE,cAAc,2CA4ChD;yBA5Ce,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"callout.d.ts","sourceRoot":"","sources":["../../../../src/components/general/callout.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,gBAAgB,CAAC;AAiBxB,eAAO,MAAM,QAAQ,iFAAkF,CAAC;AACxG,eAAO,MAAM,MAAM,mDAAoD,CAAC;AACxE,eAAO,MAAM,OAAO,qCAAsC,CAAC;AAC3D,eAAO,MAAM,UAAU,4BAA6B,CAAC;AAGrD,MAAM,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9C,MAAM,MAAM,WAAW,GAAG,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;AAClD,MAAM,MAAM,UAAU,GAAG,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AAChD,MAAM,MAAM,aAAa,GAAG,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AA2BtD,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;AAC/D,wBAAgB,OAAO,CAAC,EACvB,OAAmB,EACnB,QAAqB,EACrB,MAAqB,EACrB,SAAkB,EAClB,WAAiC,EACjC,GAAG,EAAE,GAAG,EAAE,MAAM,EAChB,QAAmB,EACnB,QAAQ,EACR,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAC9C,SAAS,GAGgB,EAAE,WAAW,2CA2EtC;yBAxFe,OAAO;;;;;;;;;;;;;;;;;;;;;;;AAkGvB,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAE,EAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAC,EAAE,iBAAiB,2CASrE;yBATe,aAAa;;;;;;;AAmB7B,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAG,iBAAiB,2CAgBxE;yBAhBe,aAAa"}
1
+ {"version":3,"file":"callout.d.ts","sourceRoot":"","sources":["../../../../src/components/general/callout.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,gBAAgB,CAAC;AAiBxB,eAAO,MAAM,QAAQ,iFAAkF,CAAC;AACxG,eAAO,MAAM,MAAM,mDAAoD,CAAC;AACxE,eAAO,MAAM,OAAO,qCAAsC,CAAC;AAC3D,eAAO,MAAM,UAAU,4BAA6B,CAAC;AAGrD,MAAM,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9C,MAAM,MAAM,WAAW,GAAG,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;AAClD,MAAM,MAAM,UAAU,GAAG,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AAChD,MAAM,MAAM,aAAa,GAAG,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AA2BtD,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;AAC/D,wBAAgB,OAAO,CAAC,EACvB,OAAmB,EACnB,QAAqB,EACrB,MAAqB,EACrB,SAAkB,EAClB,WAAiC,EACjC,GAAG,EAAE,GAAG,EAAE,MAAM,EAChB,QAAmB,EACnB,QAAQ,EACR,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAC9C,SAAS,GAGgB,EAAE,WAAW,2CAwEtC;yBArFe,OAAO;;;;;;;;;;;;;;;;;;;;;;;AA+FvB,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAE,EAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAC,EAAE,iBAAiB,2CASrE;yBATe,aAAa;;;;;;;AAmB7B,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAG,iBAAiB,2CAgBxE;yBAhBe,aAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../../src/components/general/markdown.tsx"],"names":[],"mappings":"AAMA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,gBAAgB,CAAC;AAMxB,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AACjE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,2CAsC3C;yBAtCe,QAAQ"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../../src/components/general/markdown.tsx"],"names":[],"mappings":"AAMA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,gBAAgB,CAAC;AAMxB,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AACjE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,2CAqC3C;yBArCe,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"menu-accordion.d.ts","sourceRoot":"","sources":["../../../../src/components/general/menu-accordion.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,sBAAsB,CAAC;AAI9B,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,MAAM;QACf,QAAQ,EAAE,MAAM,IAAI,CAAC;KACrB;CACD;AAUD,MAAM,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAqCzD,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,2CAyGrD;yBAzGe,aAAa;;;;;;;;;;;;AAuH7B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,2CAO/D;yBAPe,kBAAkB;;;;;;;;;;;;;;;;;;AAkBlC,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACnF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,qBAAqB,2CAQ7D;yBARe,iBAAiB;;;;;;;AAmBjC,MAAM,MAAM,uBAAuB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,SAAS,CAAC,CAAC;AACvF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,2CAmBjE;yBAnBe,mBAAmB"}
1
+ {"version":3,"file":"menu-accordion.d.ts","sourceRoot":"","sources":["../../../../src/components/general/menu-accordion.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,sBAAsB,CAAC;AAI9B,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,MAAM;QACf,QAAQ,EAAE,MAAM,IAAI,CAAC;KACrB;CACD;AAUD,MAAM,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAqCzD,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,2CAyGrD;yBAzGe,aAAa;;;;;;;;;;;;AAuH7B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,2CAO/D;yBAPe,kBAAkB;;;;;;;;;;;;;;;;;;AAkBlC,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACnF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,qBAAqB,2CAQ7D;yBARe,iBAAiB;;;;;;;AAmBjC,MAAM,MAAM,uBAAuB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,SAAS,CAAC,CAAC;AACvF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,2CAkBjE;yBAlBe,mBAAmB"}
@@ -1 +1 @@
1
- {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../../src/components/general/recipe.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,cAAc,CAAC;AAetB,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,GAAG,GAAG,gBAAgB,CAuD5E;AA8CD,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CAkF/C;yBAlFe,UAAU;;;;;;;;AA6F1B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAOvD;yBAPe,cAAc;;;;;;;;AAiB9B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAE,KAAK,EAAE,kBAAkB,2CA2CxD;yBA3Ce,cAAc;;;;;;;AAoD9B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CA8CvD;yBA9Ce,cAAc;;;;;;;AAkD9B,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AACnE,wBAAgB,SAAS,4CAyBxB;yBAzBe,SAAS"}
1
+ {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../../src/components/general/recipe.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,cAAc,CAAC;AAetB,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,GAAG,GAAG,gBAAgB,CAuD5E;AA8CD,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CAkF/C;yBAlFe,UAAU;;;;;;;;AA6F1B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAOvD;yBAPe,cAAc;;;;;;;;AAiB9B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAE,KAAK,EAAE,kBAAkB,2CA0CxD;yBA1Ce,cAAc;;;;;;;AAmD9B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CA8CvD;yBA9Ce,cAAc;;;;;;;AAkD9B,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AACnE,wBAAgB,SAAS,4CAwBxB;yBAxBe,SAAS"}
@@ -1 +1 @@
1
- {"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../../src/components/general/resume.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,+BAA+B,CAAC;AACvC,OAAO,cAAc,CAAC;AAkCtB,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7D,wBAAgB,MAAM,CAAE,KAAK,EAAE,UAAU,2CAyDxC;yBAzDe,MAAM;;;;;AA8DtB,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CAO/C;yBAPe,UAAU;;;;;AAa1B,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,2CAgBrD;yBAhBe,aAAa;;;;;;AAwB7B,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CA0DnD;yBA1De,YAAY;;;;;;;;AAgE5B,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB,2CAkBnE;yBAlBe,oBAAoB;;;;;;AAwBpC,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAE,KAAK,EAAE,gBAAgB,2CAiBpD;yBAjBe,YAAY;;;;;;AAuB5B,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAE,KAAK,EAAE,iBAAiB,2CActD;yBAde,aAAa;;;;;;AAqB7B,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACjF,wBAAgB,gBAAgB,CAAE,KAAK,EAAE,oBAAoB,2CA0B5D;yBA1Be,gBAAgB;;;;;;;AA+BhC,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/E,wBAAgB,eAAe,CAAE,KAAK,EAAE,mBAAmB,2CAoB1D;yBApBe,eAAe;;;;;AA2B/B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAiDvD;yBAjDe,cAAc"}
1
+ {"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../../src/components/general/resume.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,+BAA+B,CAAC;AACvC,OAAO,cAAc,CAAC;AAkCtB,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7D,wBAAgB,MAAM,CAAE,KAAK,EAAE,UAAU,2CAyDxC;yBAzDe,MAAM;;;;;AA8DtB,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CAO/C;yBAPe,UAAU;;;;;AAa1B,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,2CAgBrD;yBAhBe,aAAa;;;;;;AAwB7B,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAyDnD;yBAzDe,YAAY;;;;;;;;AA+D5B,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB,2CAkBnE;yBAlBe,oBAAoB;;;;;;AAwBpC,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAE,KAAK,EAAE,gBAAgB,2CAiBpD;yBAjBe,YAAY;;;;;;AAuB5B,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAE,KAAK,EAAE,iBAAiB,2CActD;yBAde,aAAa;;;;;;AAqB7B,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACjF,wBAAgB,gBAAgB,CAAE,KAAK,EAAE,oBAAoB,2CA0B5D;yBA1Be,gBAAgB;;;;;;;AA+BhC,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/E,wBAAgB,eAAe,CAAE,KAAK,EAAE,mBAAmB,2CAoB1D;yBApBe,eAAe;;;;;AA2B/B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAgDvD;yBAhDe,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../../src/components/general/timeline.tsx"],"names":[],"mappings":"AAIA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,gBAAgB,CAAC;AAcxB,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AACjE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,2CAiB3C;yBAjBe,QAAQ;;;;;;;;;;AA0BxB,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AACtG,iBAAwB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAmB3D;kBAnBuB,YAAY;;;;;;;;eAAZ,YAAY"}
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../../src/components/general/timeline.tsx"],"names":[],"mappings":"AAIA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,gBAAgB,CAAC;AAcxB,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AACjE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,2CAiB3C;yBAjBe,QAAQ;;;;;;;;;;AA0BxB,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AACtG,iBAAwB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAkB3D;kBAlBuB,YAAY;;;;;;;;eAAZ,YAAY"}
@@ -1 +1 @@
1
- {"version":3,"file":"contentful.items.components.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/contentful.items.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAWnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,wBAAwB,CAAC;AAsBhC,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,2CAiGzD;yBAjGe,eAAe;;;;;;AA6G/B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,2CA8D/D;yBA9De,kBAAkB;;;;;;AA2ElC,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB,2CASnE;yBATe,oBAAoB;;;;;;;AAsBpC,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB,2CAwInE;yBAxIe,oBAAoB"}
1
+ {"version":3,"file":"contentful.items.components.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/contentful.items.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAWnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,wBAAwB,CAAC;AAsBhC,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,2CAiGzD;yBAjGe,eAAe;;;;;;AA6G/B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,2CA6D/D;yBA7De,kBAAkB;;;;;;AA0ElC,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB,2CASnE;yBATe,oBAAoB;;;;;;;AAsBpC,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB,2CAwInE;yBAxIe,oBAAoB"}
@@ -1 +1 @@
1
- {"version":3,"file":"socialcard.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/socialcard.tsx"],"names":[],"mappings":"AACA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,kBAAkB,CAAC;AAiC1B,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;AACvE,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,qDAgOjD;yBAhOe,WAAW;;;;;AAuO3B,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CAqB/C;yBArBe,UAAU;;;;;;;AAyB1B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,4CAMjC;yBANe,kBAAkB"}
1
+ {"version":3,"file":"socialcard.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/socialcard.tsx"],"names":[],"mappings":"AACA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,kBAAkB,CAAC;AAiC1B,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;AACvE,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,qDAoNjD;yBApNe,WAAW;;;;;AA2N3B,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,2CAoB/C;yBApBe,UAAU;;;;;;;AAwB1B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,4CAMjC;yBANe,kBAAkB"}
@@ -1 +1 @@
1
- {"version":3,"file":"wordpress.components.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/wordpress.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQnD,OAAO,iBAAiB,CAAC;AAkBzB,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAsDnD;yBAtDe,YAAY;;;;;;;;;AAkE5B,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,2CAiDzD;yBAjDe,eAAe;;;;;;;;;;;;AAwD/B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,kDA0B/D;yBA1Be,kBAAkB"}
1
+ {"version":3,"file":"wordpress.components.d.ts","sourceRoot":"","sources":["../../../../src/components/integrations/wordpress.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQnD,OAAO,iBAAiB,CAAC;AAkBzB,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAsDnD;yBAtDe,YAAY;;;;;;;;;AAkE5B,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,2CAgDzD;yBAhDe,eAAe;;;;;;;;;;;;AAuD/B,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACrF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,kDAyB/D;yBAzBe,kBAAkB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ebay.components.d.ts","sourceRoot":"","sources":["../../../../src/components/shoppingcart/ebay.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AASnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,YAAY,CAAC;AAUpB,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AACnE,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,2CAmF7C;yBAnFe,SAAS;;;;;;AA4FzB,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,kDAqEvD;yBArEe,cAAc;;;;;;AAgF9B,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAyDnD;yBAzDe,YAAY;;;;;;;AAkE5B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CASvD;yBATe,cAAc;;;;;;;AAoB9B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAuFvD;yBAvFe,cAAc;;;;;;;AAgG9B,MAAM,MAAM,4BAA4B,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,SAAS,CAAC,CAAC;AACjG,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,4BAA4B,2CAgK3E;yBAhKe,wBAAwB"}
1
+ {"version":3,"file":"ebay.components.d.ts","sourceRoot":"","sources":["../../../../src/components/shoppingcart/ebay.components.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AASnD,OAAO,+BAA+B,CAAC;AACvC,OAAO,YAAY,CAAC;AAUpB,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AACnE,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,2CAmF7C;yBAnFe,SAAS;;;;;;AA4FzB,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,kDAqEvD;yBArEe,cAAc;;;;;;AAgF9B,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,2CAwDnD;yBAxDe,YAAY;;;;;;;AAiE5B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CASvD;yBATe,cAAc;;;;;;;AAoB9B,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,2CAuFvD;yBAvFe,cAAc;;;;;;;AAgG9B,MAAM,MAAM,4BAA4B,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,SAAS,CAAC,CAAC;AACjG,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,4BAA4B,2CAgK3E;yBAhKe,wBAAwB"}