@pixelated-tech/components 3.9.12 → 3.9.13

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 +9 -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 +7 -6
  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
@@ -64,7 +64,6 @@ cloudinaryTransforms */ }) {
64
64
  ? _jsx("a", { href: url, target: target, rel: target == "_blank" ? "noopener noreferrer" : "", children: _jsx(SmartImage, { src: img, title: title ?? imgAlt ?? undefined, alt: imgAlt ?? title ?? "", aboveFold: aboveFold, cloudinaryEnv: config?.cloudinary?.product_env ?? undefined, cloudinaryDomain: config?.cloudinary?.baseUrl ?? undefined, cloudinaryTransforms: config?.cloudinary?.transforms ?? undefined, suppressHydrationWarning: true }) })
65
65
  : (url && imgClick)
66
66
  ? _jsx(SmartImage, { src: img, title: title ?? imgAlt ?? undefined, alt: imgAlt ?? title ?? "", onClick: (event) => imgClick(event, url), aboveFold: aboveFold, cloudinaryEnv: config?.cloudinary?.product_env ?? undefined, cloudinaryDomain: config?.cloudinary?.baseUrl ?? undefined, cloudinaryTransforms: config?.cloudinary?.transforms ?? undefined, suppressHydrationWarning: true })
67
- /* <img src={img} title={title ?? imgAlt ?? undefined} alt={imgAlt ?? title ?? undefined} onClick={(event) => imgClick(event, url)} /> */
68
67
  : _jsx(SmartImage, { src: img, title: title ?? imgAlt ?? undefined, alt: imgAlt ?? title ?? "", aboveFold: aboveFold, cloudinaryEnv: config?.cloudinary?.product_env ?? undefined, cloudinaryDomain: config?.cloudinary?.baseUrl ?? undefined, cloudinaryTransforms: config?.cloudinary?.transforms ?? undefined, suppressHydrationWarning: true }) }) : null;
69
68
  return (_jsx("div", { id: friendlyTitle ? "callout-" + friendlyTitle : undefined, className: "callout" +
70
69
  (variant ? " " + variant : "") +
@@ -19,7 +19,6 @@ export function Markdown(props) {
19
19
  .replace(/^#{2}\s(.*$)/gim, '<h2>$1</h2>') // h2 tag
20
20
  .replace(/^#{1}\s(.*$)/gim, '<h1>$1</h1>') // h1 tag
21
21
  .replace(/(=|-|\*){3}/gim, '<hr />') // horizontal rule
22
- // .replace(/!\[(.*?)\]\((.*?)\)/gim, "<img alt='$1' title='$1' src='$2' />") // images
23
22
  .replace(/!\[(.*?)\]\((.*?)\)/gim, _jsx(SmartImage, { alt: '$1', title: '$1', src: '$2', cloudinaryEnv: config?.cloudinary?.product_env, cloudinaryDomain: config?.cloudinary?.baseUrl, cloudinaryTransforms: config?.cloudinary?.transforms })) // images
24
23
  .replace(/\[([^[]+)\]\((.*)\)/gim, '<a href="$2">$1</a>') // links
25
24
  .replace(/^\*{1}\s+(.*$)/gim, '<ul><li>$1</li></ul>') // unordered list
@@ -152,7 +152,6 @@ export function RecipeBookItem(props) {
152
152
  const recipe = props.recipeData;
153
153
  const ingredients = recipe.ingredients.map((ingredient, iKey) => _jsx("li", { className: "p-ingredient", children: ingredient }, iKey));
154
154
  const instructions = recipe.instructions.map((instruction, iKey) => _jsx("li", { className: "p-instruction", children: instruction }, iKey));
155
- /* ? <img className='u-photo' src={recipe.photo} title={recipe.name} alt={recipe.name} /> */
156
155
  const recipeImage = (recipe.photo.length > 0
157
156
  ? _jsx(SmartImage, { className: 'u-photo', src: recipe.photo, title: recipe.name, alt: recipe.name, cloudinaryEnv: config?.cloudinary?.product_env ?? undefined, cloudinaryDomain: config?.cloudinary?.baseUrl ?? undefined, cloudinaryTransforms: config?.cloudinary?.transforms ?? undefined })
158
157
  : null);
@@ -128,7 +128,6 @@ export function ContentfulListItem(props) {
128
128
  : thisItem.fields.imageUrl;
129
129
  const config = usePixelatedConfig();
130
130
  const imgComponent = _jsx(SmartImage, { src: itemImage, title: thisItem.fields.title, alt: thisItem.fields.title, cloudinaryEnv: config?.cloudinary?.product_env ?? undefined, cloudinaryDomain: config?.cloudinary?.baseUrl ?? undefined, cloudinaryTransforms: config?.cloudinary?.transforms ?? undefined });
131
- // <img src={itemImage} title={thisItem.fields.title} alt={thisItem.fields.title} />
132
131
  return (_jsxs("div", { className: "contentful-item row-12col", children: [_jsx("div", { className: "contentful-item-photo grid-s1-e5", children: itemURL
133
132
  ? _jsx("a", { href: itemURL, target: itemURLTarget, rel: "noopener noreferrer", children: imgComponent })
134
133
  : (imgComponent) }), _jsxs("div", { className: "contentful-item-body grid-s5-e13", children: [_jsx("div", { className: "contentful-item-header", children: itemURL
@@ -165,18 +165,6 @@ export function SocialCards(props) {
165
165
  let myNewCard = {};
166
166
  const item = items[prop];
167
167
  myNewCard = item;
168
- /* ===== FIX FOR DESCRIPTION ===== */
169
- /* if (item.description) {
170
- if (item.description.length > 500) {
171
- const doc = html2dom(item.description)
172
- const itemDescription = doc.innerHTML
173
- myNewCard.description = itemDescription
174
- }
175
- } else {
176
- const myImgBase = item.thumbnail
177
- const myImgTag = '<img src="' + myImgBase + '" alt="' + item.title + '" title="' + item.title + '">'
178
- myNewCard.description = '<p>' + myImgTag + item.title + '</p>'
179
- } */
180
168
  /* ===== FIX FOR SOURCE ===== */
181
169
  if (!(item.source)) {
182
170
  myNewCard.source = new URL(myURL).hostname;
@@ -143,7 +143,6 @@ export function EbayListItem(props) {
143
143
  shoppingCartItem.itemURL = itemURL;
144
144
  const config = usePixelatedConfig();
145
145
  const itemImageComponent = _jsx(SmartImage, { src: itemImage, title: thisItem.title, alt: thisItem.title, cloudinaryEnv: props.cloudinaryProductEnv ?? undefined, cloudinaryDomain: config?.cloudinary?.baseUrl ?? undefined, cloudinaryTransforms: config?.cloudinary?.transforms ?? undefined });
146
- // <img src={itemImage} title={thisItem.title} alt={thisItem.title} />
147
146
  return (_jsxs("div", { className: "ebayItem row-12col", children: [_jsx("div", { className: "ebayItemPhoto grid-s1-e5", children: itemURL
148
147
  ? _jsx("a", { href: itemURL, target: itemURLTarget, rel: "noopener noreferrer", children: itemImageComponent })
149
148
  : (itemImageComponent) }), _jsxs("div", { className: "ebayItemBody grid-s5-e13", children: [_jsx("div", { className: "ebayItemHeader", children: itemURL
@@ -177,9 +177,7 @@ export function ShoppingCartItem(props) {
177
177
  return (_jsxs("div", { className: "pixCartItem row-12col", children: [_jsx("div", { className: "pixCartItemPhoto grid-s1-e4", children: thisItem.itemURL && thisItem.itemImageURL
178
178
  ? _jsx("a", { href: thisItem.itemURL, target: thisItemTarget, rel: "noopener noreferrer", children: _jsx(SmartImage, { src: thisItem.itemImageURL, alt: thisItem.itemTitle, cloudinaryEnv: config?.cloudinary?.product_env, cloudinaryDomain: config?.cloudinary?.baseUrl, cloudinaryTransforms: config?.cloudinary?.transforms }) })
179
179
  : thisItem.itemImageURL
180
- ? (
181
- /* <img src={thisItem.itemImageURL} title={thisItem.itemTitle} alt={thisItem.itemTitle} /> */
182
- _jsx(SmartImage, { src: thisItem.itemImageURL, title: thisItem.itemTitle, alt: thisItem.itemTitle, cloudinaryEnv: config?.cloudinary?.product_env, cloudinaryDomain: config?.cloudinary?.baseUrl, cloudinaryTransforms: config?.cloudinary?.transforms }))
180
+ ? (_jsx(SmartImage, { src: thisItem.itemImageURL, title: thisItem.itemTitle, alt: thisItem.itemTitle, cloudinaryEnv: config?.cloudinary?.product_env, cloudinaryDomain: config?.cloudinary?.baseUrl, cloudinaryTransforms: config?.cloudinary?.transforms }))
183
181
  : _jsx(_Fragment, {}) }), _jsxs("div", { className: "grid-s4-e11", children: [_jsx("div", { className: "pixCartItemHeader", children: _jsx("span", { children: thisItem.itemURL
184
182
  ? _jsx("a", { href: thisItem.itemURL, target: thisItemTarget, rel: "noopener noreferrer", children: _jsx("h2", { className: "", children: thisItem.itemTitle }) })
185
183
  : _jsx("h2", { className: "", children: thisItem.itemTitle }) }) }), _jsxs("div", { className: "pixCartItemDetails grid12", children: [_jsx("br", {}), _jsxs("div", { children: [_jsx("b", { children: "Item ID: " }), thisItem.itemID] }), _jsxs("div", { children: [_jsx("b", { children: "Quantity: " }), thisItem.itemQuantity] }), _jsx("br", {}), _jsx("div", { children: _jsx(FormButton, { className: "pixCartButton", type: "button", id: `btn-rm-${thisItem.itemID}`, text: "Remove Item From Cart", onClick: () => removeFromShoppingCart(thisItem) }) })] })] }), _jsx("div", { className: "grid-s11-e13", children: _jsx("div", { className: "pixCartItemPrice", children: formatAsUSD(thisItem.itemCost) }) })] }));
@@ -1 +1 @@
1
- pxl:v1:55ff7f36b775dde0f0538c0e:6f17256f9023d3def87e7737a49ac1ee:b99ad3cd6f90893f4c75cc8204236da698c957763b5d4a44e1022de49df0b7519516f543469389ed9f04b24c5e02be7396405c564fe06e37114563ba77262d883df5e450f57ea612fcaf2240a97f9a91f16afbbc164bb80d2f8e7b3c57a0c8ff7507f9d4ebc319ec0a0087ebc540c92113730c9f689feeb3768ec35c2ee899b62a2caa4ee794fffe892183d4cbd2306cbc59b8f0201b8766fb0dfd651edf6ad259b1a746b8d8a85a866873b775380b61081c59592d1c3160e2bc974120d9decb8563fd3db06aa4476ba08e6c4a3e27a256c06b70dfca088b81842144504ee540a3e0079ca941f1c83519bbb0e0682e77b9d183254618b017c47e7b62579c351ff148d4f92d124a65729216a74c50543b93a26f70dc2976d382ca87fce5b57bd11dd34fdc0ea006a1d265d02a757d555c3501393001fe7a0ab379622287200123a182d721c32d99c86c843035550953ca75a05f805ff5d907ad4b1ae06506cf08e6153d2cc0837138fa03b8231675fd6be349a5e07851e4dc10062477241d55db87c74046fe0b78e9ca03f4f3a5330d56dc25210081c7efccf928d04c8707da1a03fcc592263f939e311bc8a6022f08d3f44854e6e7b9de1553a4febe63ebb1e03944e5eb8e171ac357cf01728a4f21e7d5b36a06bd3566fb1fcdb93f8573eb9e46d9213503965ea7708d2103f37518a517420ac2213233c91c7924cb9a72f58ac303cb0434c65ce2b9a74c441d52bd1ebf765ebf628e04f6871f5f87a7bb01ea0b21db7cdad8f07dcf6fcb0b6bcfbe1978c79829e788be7054a1eace97956c682e71596370b4a2310143971ee1b441cb657e2a0b61e2c0d8758d56776d20aaad93ce6c161d44947acff02afde48927c172eb172e9c32b3bd347418d1b6593c62cdde817371c0593f9050df1f0e91f09281cc0e9959149299663a86c7d329002db7c0b244c7efc0571df30a7be10af9a027ccd12122f2f8d143ecc16e43628b6cedbe22b005253f79bdee938d1abab148f14742a6db4925b9915a669a4e79a1d06e8ffd4f908e04291c554ba84f9ca4c6caee5c5b59907ae479017aad28351c2e4fb0312433cafbbfdda1d4e5354ff68ab9d215e81e00459d6cbb18bfb14826c1a861ddbbcb6ab448a70c5b54ba437921a2c8dbba1945f05e23af1b6b65860f9a5e18abe7a15aa35d13a0e9fdc6c2881ec197ca3aa7c9ba3aaf624ad5be6e2271f0e551ebfaeedf379a7299e5296e7af1983947336488e526d75f700b1dd2dc5779abaa96decad662787f00f2476d250066a3eaca21a10c43b5dd91efc6ab91732ba11bc3620481b7ea9436bf8c7652f16840f41f90f2833d3c70a0a41bdb44933e9107a7060939f12eda4494c65442d09bc8bba14f5c4c3fd2dd412ae86e26b383b396752a97f2dc50825acac6747bede22c98705800379cb6b78bab8a2829b2773b7b7d797a734925b218f38c8f9530328c6d5f1f2cb1cb40b873b01316d037b72dd47cceeb648d4c56329c6ce841c62f99e1916527a8487bcad587cc2a1e6627ae8837d4df8bb788b3d08994eefdb3131f6027b6bd265293619560e6d9523f7a6551c71cf4b1aa92a9edf9b70cb710272810904f5b90fe84550b9e5b21cbda91da921597e53afe5db03fad1c62db073d9183e09ef588f5bb6cd5ce2abe09c8c47de899eaf5560c1b8fca141c8d742aa110d3b3429296506a0cca2c8179468c158a5a6b7c02a0a85ace7e06b77dbc828daa0549c0a09d5d862f9def847be523a6e3c61ef599fb89e1d2cd7cf9683b67c4dccb74acb66c40d9b8039e1252138c8add634bc671558af62175b585239cd68f921201b53c18ff0955d7a83ce7ab0906ccc67bb0cd99a2886547b39af6ea205eaf8568b44fa96bf03d6c478a4a27c3b51baa8cb2d9389cec8bf3e4aaeaaba42bd25509a0bba0920c9cb9ec67f2cfff1f1c98cfc51a782c32e17ffed4a2de06a4bc86a4996bf16bb36bae64113492eafb3f78b60e30eea0d328fb4bb16454e3845fc31be92db9d2b5e1f8f7ba7b6e77d939dbcc318ecc39f16452844001a11684bd68514a091593679d84092fd5358f809dbe0b895613f51afab629228d7ed8f7494a19631a7ecfa6b973d5844c10e8d42ccf61f277ef328b435dfd43b3f856b1581c2ab392b3edb49e047097439b01c537af2412b9c3f65ba016a3a933cf1bb27cace89e4e25f27d0b34255b71b0f7e3a159c7b62b22668e542c3a4249bee7ca37af811b2594d387b952336939d9a7aa5408cdbd69a86b7bcc34c8565958242452e1b0b34dee79b97524b981e01a2860872089aaf31b1fea32317badd18b6b8f66fbcce3c3ad84c6693a920e150235f4952f49f8bc66e50fca4cfb660bc840723d6155051a6baa190822756f0cbe5ede5421666b3fe3b8c7b0a7d78c1951c764d24e98278134a32faca1dd986e1fa89ed0021614123f9360d42bd213c392c4ed353736d4a8e14ef42221d717d9e77182726fdf7d12ba944f41546648cd8a7a2f2617dbb83a4adb75e44b23fc074dbd37e6f9020062ccdb1daa14240a4c9286cfb3e1c3c960a90e78c049c4ed46bb2de3815c03519849a254243f428e9b31e35e6213f8cf13c7c9142a5009d796506df0273d384e532951a2504d73acaef5a220284aa5f1fd2b7134e6330c0ff34f9802d3ddfcadbab64a5428b7e249eb55bbecee6d315393c2c5ad7e448484c4a34f381669dc6bf7ac471b68d0d5fee8c7e87f188a19d906a905b66f43842489ed1856148e19ffd2f7004a36f63187262ad1aca9f4a3ce44a9ec7050611f646b4e628038d11738bfe32e690df85c71816a111b359927df1e60552229eea2ad7aba0ebb3472edcaae5b215d3ca01521a6197b4e2648a48ac01223ec46f3893afcf5ab706139b1866849ea78f5deb13c19d8fc3bcb74de11366399a1c725168214ba38df43ca44bf9f1859330887b38d9d6a922f024081de4230efec5bdd953f553dca2a5acd20b419bc6f09bb728e4666f0f7f15229c4e8a203f7ab8489e63d8cdc39de7d4e090335c6b342e67d0d88282c74d37e06fd64c62255ad157b9b6fc2925feaf90429235622c8c287c6f8ae205bf51434e3d43363425fa20a6ea300871152a23a120d944ff935e9eb6462dd3a0ddd7a88de375abf6535f007edd38003aadb45a291147fd65a3412003665815741f7f66d41645623659f08adb6cf955c05f52b1265c4b052b3d4c1385ba7e3d26985e1db034e905df43fe38a724fe35dc5f854c8353d29a2f9035a658dcf3804ac82f3e7230f355f7bf13578da448ca961f32a8e14ab0b04ade580e8ae335d911eef4f5383a1b20ea847e69a0927bb313465e4d7fb7f552ba7e172f429586a25f5b7b57e66d749907e90d7f2bc7639e54cbb0265e70573f66a81f2b2b84d90060f52ab88eeaa9b6bbd5767b466fab77fd9024e454dc16aa270dbaece72565791a88166f3b0515bcabf52ef6f18fbb949bd0d9e937e99baa28c1fc5d371ec7b300d3cb8140c6d656be57a68e8d8314b2dbee84ac04e36be8bf72f9614c3acb27deeb13ec5b38a7047c0e6b49a4b737417c8cc9910f37f498bbe89ff2180c06c58e8bad1ba7c2fb73412cf64052bb4f35a1374e7f41e23ba987438f88efc07d0f918eac38c648dfa4d97a6d8eb47841409f1a86d8fab2be03d805086981ba2eb79740fe0fa9aafb0d7953ad71745090101443744067df9633b250b464929676cf857fe0513168a3cd51ca74428be02efbe5fd58ae04608fc1ba8b86b0720738524b984c69d375727b425fd1a07c9800dca05573d012b719ed2c513751f573d1bcd2b33c08dcbfddd2fbcb97802f1d387c17c8e882a4b3f59c153c676ce5c005969e8e969b7cdea6ca5550cb590d87f0337553b13ac93f89a8430ce70eb10c8f755d838df5b7deafb976cc0eb81e5d7c3eba4387450884c5654adee48e5a107dc6ab4d006efb10209eddf0b213921a70fe7607586f3ce6a1618968bcc991dd449386596bebbe2c0800fd4a9f13deba85af8316815d46ffb3b751f4af2b38a5715e72ed3b2068fe55657e4461dd0214dc5cf15f2f8777b6585d3e95f147e0a0a38c4eddd95e00f7a75f6b409614033cfb531843f433ae9104458c1a931aadda7b5ffe0b8a90f3c1c4c8ada01c2e6bc5b7bff23bbb26c58b739e9df774ebcecfdfcdd61fa9374b38c09769c1f597a0298d5cecba23b5ba90976a9eae9fcc0f8935d4260a1adf52a0114dbfc9672c9e572d826bcda98b54cc33d64dcede76d94cd3de1c2b9a7b49325efb8c051753820696f0c8cc6021559b867358dc1abcd89a6597fcf3a0c294a671220770f5455c22e4dd3cc3762c9f9a0f681cb0442e2e7aec4538e8f95b7918a326242ef0a0bdb1dd543a28dd749309cd8836128a6ae426e040fe769dcd75e40255a36826b2b4d852dfea63f2d890fed24aaf9113748567d09fcc4eb97dab702abfeb337c4355c1f268d125d5e3b73a269a46bdd825f561f6fd88abc3286246e796f0184423810de5e13b5d3b70e9c46af5df7b0f7757e1edc652a19ef44566becbc8db655f66a920f087d85105404912417ea01c3e125e5f378dfaf1b615fd291392123c21fd255a26d460aebbe90549891b3920d769e49aad1c619a873f61bb15ccec5ec716e8cdecee0b7d7ec12425235a9a264d4b8473d4e65ffba50d08818f5ce43a7510b0fe8366be3a21925678b2ad2b3e321417e6710c78071d85b5efb84f374057de1e7615ebee8247abb7e134e0eb2ca5e452fdd533d3f7f5ac8bb797ec6aa70adbf08117b145fde14356f1d3601c4e4dfd18977fef5369cc61b01f78c6694f0732f84576024e816ee54e1889d9e954958c0da389c16a68637550317db838243c70bf9529d6ad8d40bf88ceb494b7dbe961d25e3aa6ccaf2fc58f5372497a7d7c3e7b0a59b8f252de644581489b114d30cbb5e0497f1291792342d2e00f056534af17d5137a991b4f53f8d54f9236a22d2c9a1facf1b8c78c48f757adc9e4021f4db752c2d32380835a93599259ef2185c235ebd17c781214944509475d8b44897b8c6dde32567d8cd42bcbb3924b25750392880bad5cd519e039a5db34cc65c90eff6199a132d297de8364180edc975ce12dfa604e6a6add13e6364e40a79cba3b013cc845b146e68f55a1c3a989571a4c705
1
+ pxl:v1:1c69961284965ad54bac7b9d:721a75e24a21a214f51e32fd3b6f1c32:88ffc96a10b338e1849d2d858df1b7204395ea0e4a850a3c3cd5d68a97a8aa202474c9e06a599513428e00b0d3262b37d567a4303e79478758f2c3f420e760a3308951149c67435c401d8a319e641b439a7175eaca2015bb6b986958a5af935a90bee8e535897d0a1c7a193d42b3f585cf255d903ea33cf5960254a367ca507dc9b4cbac145f635161a375b4e3c1cf963526ef090ba7aa8648e196a66fff6fa4b4c053d242680a66accdb91934819a8785407bf170f7d592426dc311a17360a6b492669382b3048a0d24e827921a014e3f5600439bdfe049486781d44fb9ba1d6d29d0da1318f34c9570af6c15381796446dbd284e5bc8ca9ddb23b6ef9e88804866537a463d0f8a21f63c5c9ec4afeea986a56cfe27d9751210016cd7e0a745f38f31d85b0ae973cc183561c1edf4f14a2bdcabceeba9d13e52c682d0140b86a7966a1a0c189b60880e2f4180d396da00747ee5a32dfdd96f20b4409a0d5a28338c5744885a9b685ac3b09f5e87c91506d54cc89a875b576764947c3fa9d6c4dd55c5a85d1feea41ab511707f4873fe88338adda3910e528f6554abd12b2dd695ab825adf9dfb7f9c2f024dc34eb8d0e3c23c0cc664949016d0d72de2e14685b3786abdadc1fac65d4ed3fe0e8539dde9689ac470d3ad6d5cea8f33e5098fc21c4b870617c52ca32a9d8733ca06bea5abeac03e21f85b0df620cfb0a469ac2b59c338e3cecf82a94ad291d2d1e54c09cb0002632f841859e8220fdde6c1a2037f80d6d2f207ac14cecf313bb185b1c334c128d5618b5528ec489f89ee6d279778c0e80894d1650013bb7e9c4254a13d5af6b4f79d2f81fb47f10d0e49a1b5a45a8a90d36916af3f4acf550fe28253d9ef5356e86e4e5afe6717e19af70de7ccf4bffe1608f61bd2bf44aca5ea8c1f83f12a7c46b390241777e4792d065ee1401d7721df98213352329be1fa867b004360071d44f50a531b971a5dc470a7fd6c106b9f7c4563af71949350fe25d456008d9e5568138261008aa1789ac08f3377b0f807840a6c296d473cac9e1ef7f5fc4ce1e2d4910bfc8fd9523d9d0b9ea515b41ab191862b8f417b1143bf15db195777708b4bebe639b717ad37455641680c6b875c225494c9af0c8c65eb92017e3e1c72eecd107ab6e7badd99c7a1bb039e85f82475c3ccf9cf9c8810d474b749a4bbe16c7a8f1bc2673a737d58f186c3a88c78bec1f687eba2a1e5e05edc5d3fd2be17573cd57664389d829e411e2655dbe16b88a2bcfcaf09fb265bc53f93aefeb249480c9eabd342e24ff9d505cf686820a1d368b259770b401d35c5617ac6508bd8a1ca6ffb233e4f8b4a74335e7118fe98fee97f85abfaaa4d7e8ceec81595e69a6c32c62b34409b9e845bdc58e13ff48a09446c06004b3b6f5e74a53bba29e8d660b14beabf333bd598d66ed5bba07d195e74ea9f85630d932adcc87b9f37a1e2d2640a157e575c343b2f454074c2b911976862361df439fff5b259064e24981184f0da66282196cf6c7201eaa45d8218e76f2ffb34aab39945252b6f3d204add8ab65abde55ad304e8cf43505e105d1e0cf61bec9986f9d1afd3901602c3f683326639c87247eda13b3adb7edcd90b239efa34c7454b0555567dfbe25d2aa03f2458dabe0337d0eefa74ffce3e993fbcf585b0ee8cd8cae087131df95fb753267d66f64ca21f7b9d93cc7784a24b6e89c9380bd1b5532a583dcef3b0f1faed210d07822e5e912c4767dec72904f049d603209c929a882385ca581d7ae0ce3e665d23813d9f93ded8c4b5aefcb1cbc7cac8e8b2e2bb1674e6c4890865bc36fcee5b118ca98f186201291b6ea32e8775b9722e45b0d5e58dbe34dc2779c15fc641cc575cc3ee32c38c6d49ca47d331ec2400f9323223452a3cdffaf85fc62f70097e8d2f6df367b20b6dbb22e1ec3f5f7f45a82a74a90ea2560e7bf53e08869650aa419b713a90a1255f7c7dc54d07517eb0d749c1c416bd016d9015eaa1361d103e8f77256fdf3430075fca1e6dbdf1692cdbbcec6ec01733c4736669b8a291766733ef134d0c3efada713c5625d5071ee5e0f0e09544a960f5db9104eba1140df6faf98bad81bb407766c96218211c90c776a2b32dcca75701ee503ded7e973cd0aa05d7075fd08f11f9d694062e649df99b4596d7aee40fa9f5bfd323d553b6366a517fbbe52a95cdaf4196edb77281d878c5c3338198a7c968c27c6cbb39e833e873dd8738a7b783533cdbb20b52b63c47c926c88f48880fa86655ca77cd5d415c92fa1920ac46324908712a3273afea6e142e1f18a84f9bd9123fdd50fe5118e7810d2d984f90e6c7dde9d67c180b883673b2b1492cf12040247cbd31a197d842819324ad86bae553c9e13d71d3608d76a265759fc78c07ff2645017765e3ade15d28f9ecf3fbfd1f30f0875eaa7c9d15ba66b1f344bd33652bb13075da616cd5663e617c659506b1be855a20eae0dccbfedc17ba8a9f0c7de146eeb32c517df67b97075b6e803fc24679888370aacffcb47eb6727e8a07e4b899684ffa07e2b6a5010e1a3e708052c405d1f9a649226eeb146d3c0236d2f911ef5aef9780aaac56dbe216f8b0bc78528c4be189eebe24c32a8657cd1d9012778c604e428e22a8d40eb4963d2be2bb82dbf028080e118949f0a6916f2a277d3b1c50bf07290a9b2a91f2442c6e85a7f2749b1ce6a900bb13c760ca607042126af4d10339f22da68327a00ac88632a9e83f256dc9e0f19ad4f9da27217191d4fe5da064f068545d3e471b5ede002400a98cb9badf3b2e90fa7c70152fc3264821f3d427c6e79092f374c07ca2ec9d0e482ef416fef56f5289e000ae6004d00acf6c908c0a550deec9ba4c0e163a7eb30c3bacc2fbcc59979abff1e7028ab5b54f96aaaabfd1fb43491231533322a559bcea6c67c3476550087f9252b0a1a2885357c48c5db379fa8e925a885142a5a6d061e8b564064fec78e6288e0193ab1d462ec91ad2c28b623eb9f511b4a881077837ef5ec3782ed70cf1c409015f59f61ab6712c314bd29c5e9ca3e02b762b18244fe3859506cf03f7c5e986ca2b8e911a40069be3e7219abc8bb7e9ba93db1d0ce32dea6922635076ab22dcb92fe36523290357263efee8f8e6369303bac95872d4969a9fc889ab07d34c5799c19dd0b488df464338371909b0cc2c88daf724bf37baa077126a980134263d9e7ff25bc55df37c132196470d93fd49aef005dff3452ed2a4f43555844dc5abc126103c6938a4b707f16fffad4eca44075c30392703dd50845dccca2020334c25f6f4684f7af0099b34a640ca79314d574c6a8166f928320a09e12912b553da4b5209631c5029986a065fd18ded9510fd141ea4a480c79a62d945a88721c955aca8ecc71f34be2ccd9839ed03213bd7d3c29958b2d5391056c6891ba7ad5998e62689c484e65fcf45eed6f3f1f10cb9cbb53497630fa60dad2e912b8cec5f4bbd273b1e017f0988b17861478745ccec258e06cf14f25e885ef206f58311e841d5b0aef770f75c312d8e599d152cd261bc4e5bf30099accec7141800928c3dde4e0c8e317d445f0a1bf6836fcac83775196eda2417f8a62b0e408361914a8dc2f2d1bae3e2eba5507bb6683b81640ddb118e31704e6e98b92759b24ee16edab80476d675351592d453fa5d1c53a1c6b7876f99ca0f19e32a5f5f232d81436f6c783b491f2452369f2c1a82e55a3e4446cbaa1a4c01c096b50ba281937f96159e011dadd4962375bfd7dda240422235dbed036cc02af47651d3aec11bae6e36cba06e35ebc682a118eddea02c02a587aec038fc986bf91ab49afbb946ef6a12e194226a72d2da8fd0453bfc0f7e85b71e23726581e39239805f7f61d555a313259ad956e365f93325e525178dcca1e533c63d1c61b3c61de521339161599246a3899cd1033fa0fa56cd3892a1d630e28f71d82dd99df49c29ac5f9b183432b0f3bcc24e1ae1f106ed1815eb5e4ec15e974c46cf97411a281a211ece4a7fef76c7b8fb533dd565fd52016ed384824835a928861a3ffc5f26c93adec06ba1e83e1696c5115875c8d1046cd3148db8fb39f4c806ff201a33f89999a3704ed399ae9e95327bb3ff2f4cc1c457ada0e51444b1525d52ff1f0fd19b1a18622b2d4ddc48ab75227b29b51f0957968cb02c5ed6645b8500ce6be40a21097aca4d91ac6b15c1f52f8f7b93d6392a8490d0acf6d827931561c758df0080c46ac51e437b55216bd3e90337583856124e1953d8774dfef08851c0123f6cb2e028b3dc3591bdfe85a569d4c951b78428292adf8e246e5cb7cbce87182845ec6a9b20bdea150918b4bd2d09300a245ba1e4e1b3f2bf91a5bf783f2b2da234e95d680ddd28814d6b41169464d298d167c8964989d7ae22c176080440e43ac4210707ab050e3b1446753edf6c96fb8ea7142dcffee11683c86303fe5c5d8767a80639f2f3ae474ba00201b66879bb507fb0ce681d8ff1cca1139ed9dde6a1d86e8b9ef6942d9fe3a5782aff51b4c57bff863382e2b7ed4123be0a30510db43c220bc0dfb4a4e14e4ccdd2ac3cd65fe9a85809fba4ebcb0f6338fa2cb77c6635aeb7adfd48b681c797a12d3f0bf89f93fe63287ba97b5e6f538582399722e9a05812033fbbbb67e0106f70a01aa00f5db9e3fd70d5b7829d6b669e67722c61ff3e3e352dce9ea3529087d9a1057bc8a1681f860075ca0f9583638f3a2c9d50fe5cb4346055b4d7fecc86a168ec22116628bfebc70324595f2de3e2b840f0e4649d4681290579e04efcb7e59c69ab4fb43b36d17d50c074db04fbf16e05b2b2f667361c19b04daa4c5558f19361c94a881fb846656b9be6bfcd7ded25fc50d945627e4daa609075429289222c2b6587503e8af937bb95622019059422210bc5ba07054feb42b2c3252455730362b74fcaa62b90e617b5269e8f423308cfdea64b023fc7d0c8d2efcb9f64a026affa76124aa816133b36ad8641cd31c4db1e9ead3398fda11e02d41b85036f68bffd50eda2a2132e9453c837558551c5709c871fe086c85af86259acc94735d5acdf987d976b547039c8d40754e89adf7897049b020dd37b69b3e304e9a0f56a126857edbc0f79e3a12b68da4cb5d4e99ba9ae0eff5a9035bc6ebe22c1456db00e
@@ -1,16 +1,17 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
3
 
4
+ step=1
5
+
6
+
4
7
  # Centralized build script for pixelated-components
5
8
  # Replaces the inline build command in package.json
6
-
7
9
  echo ""
8
10
  echo "================================================="
9
11
  echo "🔨 Starting centralized build process"
10
12
  echo "================================================="
11
13
  echo ""
12
14
 
13
- step=1
14
15
 
15
16
  echo ""
16
17
  echo "Step $((step++)): Validate Exports"
@@ -18,18 +19,21 @@ echo "================================================="
18
19
  # directly run the validate script instead of npm wrapper
19
20
  npx tsx src/scripts/validate-exports.js
20
21
 
22
+
21
23
  echo ""
22
24
  echo "Step $((step++)): Clean previous build"
23
25
  echo "================================================="
24
26
  rm -rf dist
25
27
  echo "✅ Removed previous dist/ directory"
26
28
 
29
+
27
30
  echo ""
28
31
  echo "Step $((step++)): TypeScript build"
29
32
  echo "================================================="
30
33
  npx tsc --project tsconfig.json
31
34
  echo "✅ TypeScript compilation completed"
32
35
 
36
+
33
37
  echo ""
34
38
  echo "Step $((step++)): Copy assets (rsync equivalent)"
35
39
  echo "================================================="
@@ -37,12 +41,14 @@ echo "================================================="
37
41
  (cd src && tar -cf - $(find . -name "*.css" -o -name "*.scss" -o -name "*.json") scripts/) | tar -C dist -xf - || true
38
42
  echo "✅ Copied assets to dist/ completed"
39
43
 
44
+
40
45
  echo ""
41
46
  echo "Step $((step++)): Prune unnecessary tsc output"
42
47
  echo "================================================="
43
48
  rm -rf dist/{images,stories,test,tests} || true
44
49
  echo "✅ Pruned unnecessary files from dist/"
45
50
 
51
+
46
52
  # Ensure encrypted config is present in dist (if available in src)
47
53
  # This moves the responsibility of placing pixelated.config.json.enc into the build step
48
54
  echo ""
@@ -50,7 +56,6 @@ echo "Step $((step++)): Ensure encrypted config is in dist (if available)"
50
56
  echo "================================================="
51
57
  DIST_DIR="dist"
52
58
  ENC_DEST="$DIST_DIR/config/pixelated.config.json.enc"
53
- PLAIN_DIST_CFG="$DIST_DIR/config/pixelated.config.json"
54
59
 
55
60
  config_paths=("src/app/config/pixelated.config.json" "src/config/pixelated.config.json" "src/pixelated.config.json")
56
61
  found_enc=false
@@ -64,7 +69,19 @@ for src in "${config_paths[@]}"; do
64
69
  fi
65
70
  done
66
71
 
72
+ if [ "$found_enc" = false ]; then
73
+ echo "ℹ️ No source .enc found in src; build did not place encrypted config. If you expect an encoded config, run 'npm run config:encrypt' and re-run build."
74
+ else
75
+ echo "✅ Encrypted config ensured in dist"
76
+ fi
77
+
78
+
79
+
67
80
  # Remove plaintext config from dist if present (avoid shipping plaintext)
81
+ echo ""
82
+ echo "Step $((step++)): Ensure decrypted config is NOT in dist"
83
+ echo "================================================="
84
+ PLAIN_DIST_CFG="$DIST_DIR/config/pixelated.config.json"
68
85
  if [ -f "$PLAIN_DIST_CFG" ]; then
69
86
  echo "⚠️ Found plaintext config in dist at $PLAIN_DIST_CFG — removing it to avoid accidental publish."
70
87
  rm -f "$PLAIN_DIST_CFG"
@@ -73,11 +90,7 @@ else
73
90
  echo "ℹ️ No plaintext config found in dist."
74
91
  fi
75
92
 
76
- if [ "$found_enc" = false ]; then
77
- echo "ℹ️ No source .enc found in src; build did not place encrypted config. If you expect an encoded config, run 'npm run config:encrypt' and re-run build."
78
- else
79
- echo "✅ Encrypted config ensured in dist"
80
- fi
93
+
81
94
 
82
95
  echo ""
83
96
  echo "================================================="
@@ -0,0 +1,80 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+
4
+ async function exists(p) {
5
+ try {
6
+ await fs.access(p);
7
+ return true;
8
+ } catch (e) {
9
+ return false;
10
+ }
11
+ }
12
+
13
+ export async function loadManifest(baseDir = path.resolve(__dirname)) {
14
+ const manifestPath = path.resolve(baseDir, 'create-pixelated-app.json');
15
+ try {
16
+ if (await exists(manifestPath)) {
17
+ const txt = await fs.readFile(manifestPath, 'utf8');
18
+ return JSON.parse(txt);
19
+ }
20
+ } catch (e) {
21
+ // ignore parse/read errors
22
+ }
23
+ return null;
24
+ }
25
+
26
+ export function findTemplateForSlug(manifest, slug) {
27
+ if (!manifest || !Array.isArray(manifest.templates)) return null;
28
+ slug = (slug || '').toLowerCase();
29
+ for (const t of manifest.templates) {
30
+ if (!t.aliases || !Array.isArray(t.aliases)) continue;
31
+ for (let a of t.aliases) {
32
+ a = a.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
33
+ if (a === slug) return t;
34
+ }
35
+ // also fuzzy match (e.g., 'about-us' -> 'about')
36
+ for (let a of t.aliases) {
37
+ a = a.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
38
+ if (slug === a || slug.startsWith(a + '-') || slug.endsWith('-' + a) || slug.includes('-' + a + '-')) return t;
39
+ }
40
+ }
41
+ return null;
42
+ }
43
+
44
+ export async function pruneTemplateDirs(manifest, destPath, requestedSlugs = []) {
45
+ const removed = [];
46
+ if (!manifest || !Array.isArray(manifest.templates)) return removed;
47
+ const requested = new Set((requestedSlugs || []).map(s => s.toString()));
48
+ for (const t of manifest.templates) {
49
+ const folderName = path.basename(t.src);
50
+ const candidateDir = path.join(destPath, 'src', 'app', '(pages)', folderName);
51
+ if (await exists(candidateDir) && !requested.has(folderName)) {
52
+ // remove the template page folder
53
+ await fs.rm(candidateDir, { recursive: true, force: true });
54
+ removed.push(folderName);
55
+ // remove any associated files defined in the manifest (relative to site root)
56
+ if (Array.isArray(t.associated_files)) {
57
+ for (const rel of t.associated_files) {
58
+ const candidateFile = path.join(destPath, rel);
59
+ try {
60
+ if (await exists(candidateFile)) {
61
+ await fs.rm(candidateFile, { recursive: true, force: true });
62
+ }
63
+ } catch (e) {
64
+ // ignore individual failures
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ return removed;
71
+ }
72
+
73
+ export function printAvailableTemplates(manifest) {
74
+ if (!manifest || !Array.isArray(manifest.templates) || manifest.templates.length === 0) return;
75
+ console.log('\nAvailable templates:');
76
+ for (const t of manifest.templates) {
77
+ const aliases = Array.isArray(t.aliases) ? t.aliases.join(', ') : '';
78
+ console.log(` - ${t.name}${aliases ? ': ' + aliases : ''}`);
79
+ }
80
+ }