@pixelated-tech/components 3.1.5 → 3.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
  <br />
13
13
  <div align="center">
14
14
  <a href="https://github.com/brianwhaley/pixelated-components">
15
- <img src="images/bg6.gif" alt="Logo" width="80" height="80">
15
+ <img src="https://www.pixelated.tech/images/pix/pix-bg-512.jpg" alt="Logo" width="80" height="80">
16
16
  </a>
17
17
 
18
18
  <h3 align="center">Pixelated Components</h3>
@@ -45,7 +45,14 @@ This is a library of components I have found useful to build web sites quickly.
45
45
  * [![Next][Next.js]][Next-url]
46
46
  * [![React][React.js]][React-url]
47
47
  * [![Storybook][Storybook.js]][Storybook-url]
48
+ * [![Calendly][Calendly.com]][Calendly-url]
48
49
  * [![Contentful][Contentful.com]][Contentful-url]
50
+ * [![Cloudinary][Cloudinary.com]][Cloudinary-url]
51
+ * [![Flickr][Flickr.com]][Flickr-url]
52
+ * [![Gravatar][Gravatar.com]][Gravatar-url]
53
+ * [![Hubspot][Hubspot.com]][Hubspot-url]
54
+ * [![Instagram][Instagram.com]][Instagram-url]
55
+ * [![PayPal][PayPal.com]][PayPal-url]
49
56
  * [![Wordpress][Wordpress.com]][Wordpress-url]
50
57
  * [![Github][Github.com]][Github-url]
51
58
  * [![npm][npm.org]][npm-url]
@@ -53,7 +60,6 @@ This is a library of components I have found useful to build web sites quickly.
53
60
 
54
61
 
55
62
 
56
-
57
63
  <!-- GETTING STARTED -->
58
64
  ## Getting Started
59
65
 
@@ -75,47 +81,44 @@ To get a local copy up and running follow these simple example steps.
75
81
  ## Usage
76
82
 
77
83
  Components to help build websites quicker:
84
+ 1. Centralized 404 Error Page
78
85
  1. Buzzword Bingo Cards
79
- 1. Page Callouts - Large and Small
86
+ 1. Page Callouts
80
87
  1. Image Carousel - Page, Header, and Simple
88
+ 1. Calendly Scheduling Integration
89
+ 1. Cloudinary Remote Fetch Optimization Integration
90
+ 1. SmartImage Component with Cloudianry and Next Imgegration
91
+ 1. Centralized Configuration Management
81
92
  1. Contentful CMS Integration
93
+ 1. CSS Preload for Page Performance
82
94
  1. eBay Store Listings
95
+ 1. Flickr Image API Integration
83
96
  1. Form Components and Form Builder
84
- 1. Google Search and Google Analytics Integration
85
- 1. Markdown to HTMl Engine
97
+ 1. Google Analytics, Map, and Search Integration
98
+ 1. Gravatar Card Integration
99
+ 1. Page and Page Section Header Components
100
+ 1. Hubspot Calendar and Form Integration
101
+ 1. Instagram Image Fetch Integration
102
+ 1. Loading and ToggleLoading Component
103
+ 1. Markdown to HTML Engine
86
104
  1. Menu Components - Simple and Accordion
87
105
  1. Metadata Injection from Route JSON file
106
+ 1. Centralized MicroInteractions
88
107
  1. Modal Dialogs
89
108
  1. NerdJokes Integration
109
+ 1. PageBuilder and PageNegine with JSON, integration with Contentful
110
+ 1. Page Section and Page Section Grid / Flex Item Layout Components
111
+ 1. panel Component, also usable with Accordion Menu
90
112
  1. Recipe XML MicroFormat Engine
91
113
  1. Resume MicroFormat Engine
114
+ 1. Shopping Cart functionality with eBay and PayPal Integration
92
115
  1. Sitemap.XML dynamic generation from Route JSON file
93
116
  1. Social Card Engine
94
117
  1. Table Components
118
+ 1. Image Tiles Component
119
+ 1. Wordpress Blog Post Integration
95
120
  1. Other Utilities
96
121
 
97
- ### Google Reviews (server-side)
98
- - Requires: `GOOGLE_MAPS_API_KEY` (or use the built-in hard-coded key during testing).
99
- - Import: `import { getGoogleReviewsByCompanyName } from 'pixelated-components';`
100
- - Example:
101
-
102
- ```
103
- const { place, reviews } = await getGoogleReviewsByCompanyName({
104
- companyName: 'PixelVivid',
105
- language: 'en',
106
- near: { lat: 32.2163, lng: -80.7526 },
107
- radiusMeters: 50000,
108
- region: 'us',
109
- type: 'point_of_interest',
110
- maxReviews: 5,
111
- });
112
- ```
113
-
114
- - Tips:
115
- - Prefer `near` + `radiusMeters` for better disambiguation.
116
- - If results return 0, try adjusting `region` or `type`, or use the exact business name.
117
-
118
-
119
122
 
120
123
 
121
124
  <!-- ROADMAP -->
@@ -124,10 +127,7 @@ const { place, reviews } = await getGoogleReviewsByCompanyName({
124
127
  - [ ] LinkedIn Recommendations Integration
125
128
  - [ ] eBay Feedback Integration
126
129
  - [ ] Yelp Recommendations integration
127
- - [ ] Calendly Integration
128
130
  - [ ] Instagram Image Integration for Carousels
129
- - [ ] Expanding menu based on
130
- - [ ] eCommerce Features + Paypal ( or Stripe, Square)
131
131
  - [ ] Shopify Integration
132
132
  - [ ] Quickbooks Integration
133
133
  - [ ] Buffer Integration (or Sendible, Sprout Social, Hootsuite)
@@ -209,23 +209,44 @@ Project Link: [https://github.com/brianwhaley/pixelated-components](https://gith
209
209
 
210
210
  [product-screenshot]: images/screenshot.png
211
211
 
212
+ [Calendly.com]: https://img.shields.io/badge/Calendly-006bff
213
+ [Calendly-url]: https://cloudinary.com
214
+
215
+ [Cloudinary.com]: https://img.shields.io/badge/Cloudinary-3448C5?style=for-the-badge&logo=cloudinary&logoColor=white
216
+ [Cloudinary-url]: https://cloudinary.com
217
+
218
+ [Contentful.com]: https://img.shields.io/badge/Contentful-2478CC?logo=contentful&logoColor=fff
219
+ [Contentful-url]: https://contentful.com
220
+
221
+ [Flickr.com]: https://img.shields.io/static/v1?style=for-the-badge&message=Flickr&color=0063DC&logo=Flickr&logoColor=FFFFFF
222
+ [Flickr-url]: https://flickr.com
223
+
224
+ [GitHub.com]: https://img.shields.io/badge/GitHub-%23121011.svg?logo=github&logoColor=white
225
+ [Github-url]: https://www.github.com
226
+
227
+ [Gravatar.com]: https://img.shields.io/badge/Gravatar-1d4fc4
228
+ [Gravatar-url]: https://www.github.com
229
+
230
+ [Hubspot.com]: https://img.shields.io/badge/HubSpot-YES-brightgreen?style=plastic&logo=hubspot
231
+ [Hubspot-url]: https://www.github.com
232
+
233
+ [Instagram.com]: https://img.shields.io/badge/Instagram-E4405F?style=for-the-badge&logo=instagram&logoColor=white
234
+ [Instagram-url]: https://www.github.com
235
+
212
236
  [Next.js]: https://img.shields.io/badge/next.js-000000?style=for-the-badge&logo=nextdotjs&logoColor=white
213
237
  [Next-url]: https://nextjs.org/
214
238
 
239
+ [npm.org]: https://img.shields.io/badge/npm-CB3837?logo=npm&logoColor=fff
240
+ [npm-url]: https://www.npmjs.org
241
+
242
+ [PayPal.js]: https://img.shields.io/badge/PayPal-Support_Us-003087?logo=paypal&logoColor=fff
243
+ [PayPal-url]: https://reactjs.org/
244
+
215
245
  [React.js]: https://img.shields.io/badge/React-20232A?style=for-the-badge&logo=react&logoColor=61DAFB
216
246
  [React-url]: https://reactjs.org/
217
247
 
218
248
  [Storybook.js]: https://img.shields.io/badge/Storybook-FF4785?logo=storybook&logoColor=white
219
249
  [Storybook-url]: https://storybook.js.org
220
250
 
221
- [Contentful.com]: https://img.shields.io/badge/Contentful-2478CC?logo=contentful&logoColor=fff
222
- [Contentful-url]: https://contentful.com
223
-
224
251
  [WordPress.com]: https://img.shields.io/badge/WordPress-%2321759B.svg?logo=wordpress&logoColor=white
225
252
  [Wordpress-url]: http://www.wordpress.com
226
-
227
- [npm.org]: https://img.shields.io/badge/npm-CB3837?logo=npm&logoColor=fff
228
- [npm-url]: https://www.npmjs.org
229
-
230
- [GitHub.com]: https://img.shields.io/badge/GitHub-%23121011.svg?logo=github&logoColor=white
231
- [Github-url]: https://www.github.com
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import PropTypes from "prop-types";
3
+ // https://gist.github.com/whitingx/3840905
4
+ generateMetaTags.propTypes = {
5
+ title: PropTypes.string.isRequired,
6
+ description: PropTypes.string.isRequired,
7
+ keywords: PropTypes.string.isRequired,
8
+ site_name: PropTypes.string.isRequired,
9
+ email: PropTypes.string.isRequired,
10
+ origin: PropTypes.string.isRequired,
11
+ url: PropTypes.string.isRequired,
12
+ image: PropTypes.string.isRequired,
13
+ image_height: PropTypes.string.isRequired,
14
+ image_width: PropTypes.string.isRequired,
15
+ favicon: PropTypes.string.isRequired,
16
+ };
17
+ export function generateMetaTags(props) {
18
+ const { title, description, keywords, site_name, email, origin, url, image, image_height, image_width, favicon } = props;
19
+ return (_jsxs(_Fragment, { children: [_jsx("title", { children: title }), _jsx("meta", { charSet: "UTF-8" }), _jsx("meta", { httpEquiv: "content-type", content: "text/html; charset=UTF-8" }), _jsx("meta", { httpEquiv: 'Expires', content: '0' }), _jsx("meta", { httpEquiv: 'Pragma', content: 'no-cache' }), _jsx("meta", { httpEquiv: 'Cache-Control', content: 'no-cache' }), _jsx("meta", { name: "application-name", content: site_name }), _jsx("meta", { name: "author", content: site_name + ", " + email }), _jsx("meta", { name: 'copyright', content: site_name }), _jsx("meta", { name: "creator", content: site_name }), _jsx("meta", { name: "description", content: description }), _jsx("meta", { name: "keywords", content: keywords }), _jsx("meta", { name: 'language', content: 'EN' }), _jsx("meta", { name: 'owner', content: site_name }), _jsx("meta", { name: "publisher", content: site_name }), _jsx("meta", { name: 'rating', content: 'General' }), _jsx("meta", { name: 'reply-to', content: email }), _jsx("meta", { name: "robots", content: "index, follow" }), _jsx("meta", { name: 'url', content: url }), _jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1.0, shrink-to-fit=no" }), _jsx("meta", { property: "og:description", content: description }), _jsx("meta", { property: 'og:email', content: email }), _jsx("meta", { property: "og:image", content: image }), _jsx("meta", { property: "og:image:height", content: image_height }), _jsx("meta", { property: "og:image:width", content: image_width }), _jsx("meta", { property: "og:locale", content: "en_US" }), _jsx("meta", { property: "og:site_name", content: site_name }), _jsx("meta", { property: "og:title", content: title }), _jsx("meta", { property: "og:type", content: "website" }), _jsx("meta", { property: "og:url", content: url }), _jsx("meta", { itemProp: "name", content: site_name }), _jsx("meta", { itemProp: "url", content: url }), _jsx("meta", { itemProp: "description", content: description }), _jsx("meta", { itemProp: "thumbnailUrl", content: image }), _jsx("meta", { property: "twitter:domain", content: new URL(origin).hostname }), _jsx("meta", { property: "twitter:url", content: url }), _jsx("meta", { name: "twitter:card", content: "summary_large_image" }), _jsx("meta", { name: "twitter:creator", content: site_name }), _jsx("meta", { name: "twitter:description", content: description }), _jsx("meta", { name: "twitter:image", content: image }), _jsx("meta", { name: "twitter:image:height", content: image_height }), _jsx("meta", { name: "twitter:image:width", content: image_width }), _jsx("meta", { name: "twitter:title", content: title }), _jsx("link", { rel: "author", href: origin }), _jsx("link", { rel: "canonical", href: url }), _jsx("link", { rel: "icon", type: "image/x-icon", href: favicon }), _jsx("link", { rel: "shortcut icon", type: "image/x-icon", href: favicon }), _jsx("link", { rel: "manifest", href: "/manifest.webmanifest" }), _jsx("link", { rel: "preconnect", href: "https://images.ctfassets.net/" }), _jsx("link", { rel: "preconnect", href: "https://res.cloudinary.com/" }), _jsx("link", { rel: "preconnect", href: "https://farm2.static.flickr.com" }), _jsx("link", { rel: "preconnect", href: "https://farm6.static.flickr.com" }), _jsx("link", { rel: "preconnect", href: "https://farm8.static.flickr.com" }), _jsx("link", { rel: "preconnect", href: "https://farm66.static.flickr.com" })] }));
20
+ }
21
+ setClientMetadata.propTypes = {
22
+ title: PropTypes.string.isRequired,
23
+ description: PropTypes.string.isRequired,
24
+ keywords: PropTypes.string.isRequired,
25
+ };
26
+ export function setClientMetadata(props) {
27
+ const { title, description, keywords } = props;
28
+ document.title = title;
29
+ (document.querySelector("meta[property='og:title']"))?.setAttribute('content', title);
30
+ (document.querySelector("meta[name='description']"))?.setAttribute('content', description);
31
+ (document.querySelector("meta[property='og:description']"))?.setAttribute('content', description);
32
+ (document.querySelector("meta[itemprop='description']"))?.setAttribute('content', description);
33
+ (document.querySelector("meta[name='keywords']"))?.setAttribute('content', keywords);
34
+ }
35
+ ;
@@ -63,38 +63,6 @@ export function getAllRoutes(routes, key) {
63
63
  traverse(routes);
64
64
  return result;
65
65
  }
66
- import fs from 'fs';
67
- import path from 'path';
68
- export function getAllImages() {
69
- // const imagePaths: ImageInfo[] = [];
70
- const imagePaths = [];
71
- const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg', '.webp'];
72
- const publicDir = './public';
73
- function walk(currentDir) {
74
- fs.readdirSync(currentDir).forEach(file => {
75
- const filePath = path.join(currentDir, file);
76
- const fileStat = fs.statSync(filePath);
77
- if (fileStat.isDirectory()) {
78
- walk(filePath); // Recursive call for subdirectories
79
- }
80
- else {
81
- if (fs.statSync(filePath).isFile() && (imageExtensions.some(ext => file.endsWith(ext)))) {
82
- // Found an image!
83
- // const imageURL = `/${filePath.replace('./public/', '')}`; // Construct URL
84
- // Add to your image data list (e.g., { url: imageURL, alt: "description" })
85
- const relativePath = path.relative(publicDir, filePath).replace(/\\/g, '/');
86
- const fullPath = `/${relativePath}`;
87
- // imagePaths.push({loc: fullPath});
88
- imagePaths.push(fullPath);
89
- }
90
- }
91
- });
92
- }
93
- ;
94
- walk(publicDir);
95
- // return JSON.stringify(imagePaths);
96
- return imagePaths;
97
- }
98
66
  export const getMetadata = (routes, key = "name", value = "Home") => {
99
67
  // const allRoutes = getAllRoutes(routes, "routes");
100
68
  // const foundObject = allRoutes.find((obj: { [x: string]: string; }) => obj && Object.prototype.hasOwnProperty.call(obj, key) && obj[key as keyof typeof obj] === value);
@@ -116,22 +84,6 @@ export const getMetadata = (routes, key = "name", value = "Home") => {
116
84
  return metadata;
117
85
  }
118
86
  };
119
- export const setClientMetadata = ({ title, description, keywords }) => {
120
- document.title = title;
121
- (document.querySelector("meta[property='og:title']"))?.setAttribute('content', title);
122
- (document.querySelector("meta[name='description']"))?.setAttribute('content', description);
123
- (document.querySelector("meta[property='og:description']"))?.setAttribute('content', description);
124
- (document.querySelector("meta[itemprop='description']"))?.setAttribute('content', description);
125
- (document.querySelector("meta[name='keywords']"))?.setAttribute('content', keywords);
126
- };
127
- export const setServerMetadata = ({ key, value }) => {
128
- const myMetaData = getMetadata({ key, value });
129
- return {
130
- title: myMetaData.title,
131
- description: myMetaData.description,
132
- keywords: myMetaData.keywords
133
- };
134
- };
135
87
  export function getAccordionMenuData(myRoutes) {
136
88
  const menuItems = myRoutes.map((thisRoute) => (thisRoute.routes
137
89
  ? { [thisRoute.name]: thisRoute.routes.map((subRoute) => ({ [subRoute.name]: subRoute.path })) }
@@ -1,9 +1,129 @@
1
1
  import PropTypes from "prop-types";
2
- import { getAllRoutes, getAllImages } from "./metadata";
2
+ import { getAllRoutes } from "./metadata";
3
3
  import { getWordPressItems } from "../cms/wordpress.functions";
4
- import { getContentfulFieldValues } from "../cms/contentful.delivery";
4
+ import { getContentfulFieldValues, getContentfulAssetURLs } from "../cms/contentful.delivery";
5
5
  import { getEbayAppToken, getEbayItemsSearch } from "../shoppingcart/ebay.functions";
6
6
  import { getFullPixelatedConfig } from '../config/config';
7
+ /**
8
+ * Helper to construct an origin string from a Next-like headers() object or plain values.
9
+ * Accepts an object with `get(key)` method, or `undefined` and falls back to localhost origin.
10
+ */
11
+ export function getOriginFromHeaders(headersLike, fallbackOrigin = 'http://localhost:3000') {
12
+ try {
13
+ if (!headersLike)
14
+ return fallbackOrigin;
15
+ const proto = headersLike.get('x-forwarded-proto') || 'http';
16
+ const host = headersLike.get('host') || 'localhost:3000';
17
+ return `${proto}://${host}`;
18
+ }
19
+ catch (e) {
20
+ console.log("Error getting origin from headers:", e);
21
+ return fallbackOrigin;
22
+ }
23
+ }
24
+ /**
25
+ * Next-specific async helper: getOriginFromNextHeaders
26
+ * - Convenience wrapper that dynamically imports `next/headers` and calls our `getOriginFromHeaders` function
27
+ * - Falls back to `fallbackOrigin` if `next/headers` not available or on error
28
+ */
29
+ export async function getOriginFromNextHeaders(fallbackOrigin = 'http://localhost:3000') {
30
+ try {
31
+ // dynamic import ensures we don't require 'next/headers' in non-Next environments
32
+ const mod = await import('next/headers');
33
+ if (mod && typeof mod.headers === 'function') {
34
+ const hdrs = await mod.headers();
35
+ return getOriginFromHeaders(hdrs, fallbackOrigin);
36
+ }
37
+ }
38
+ catch (e) {
39
+ console.log("Error getting origin from Next headers:", e);
40
+ // Not in a Next environment or module not found; return fallback
41
+ }
42
+ return fallbackOrigin;
43
+ }
44
+ export function flattenRoutes(routes) {
45
+ // Convenience wrapper for the project-level getAllRoutes helper
46
+ return getAllRoutes(routes, 'routes');
47
+ }
48
+ export function jsonToSitemapEntries(entries) {
49
+ return entries.map((entry) => `<url>
50
+ <loc>${entry.url}</loc>
51
+ <lastmod>${entry.lastModified}</lastmod>
52
+ <changefreq>${entry.changeFrequency}</changefreq>
53
+ <priority>${entry.priority}</priority>
54
+ </url>`).join('');
55
+ }
56
+ /**
57
+ * generateSitemap: compose the individual create* functions based on toggles in SitemapConfig.
58
+ * - Keep this minimal for the MVP: no retries/caching here. Add TODOs for later.
59
+ */
60
+ export async function generateSitemap(cfg = {}, originInput) {
61
+ const origin = originInput ?? 'http://localhost:3000';
62
+ const sitemapEntries = [];
63
+ // Defaults: pages true, image json true, others false
64
+ const usePages = cfg.createPageURLs ?? true;
65
+ const useWP = cfg.createWordPressURLs ?? false;
66
+ const useImageJSON = cfg.createImageURLsFromJSON ?? true;
67
+ const useContentful = cfg.createContentfulURLs ?? false;
68
+ const useContentfulImages = cfg.createContentfulImageURLs ?? false;
69
+ const usePageBuilder = cfg.createPageBuilderURLs ?? false;
70
+ const useEbay = cfg.createEbayItemURLs ?? false;
71
+ // Pages
72
+ if (usePages) {
73
+ if (cfg.routes) {
74
+ const flat = flattenRoutes(cfg.routes);
75
+ sitemapEntries.push(...(await createPageURLs(flat, origin)));
76
+ }
77
+ }
78
+ // Image JSON
79
+ if (useImageJSON) {
80
+ sitemapEntries.push(...(await createImageURLsFromJSON(origin, cfg.imageJson?.path ?? 'public/site-images.json')));
81
+ }
82
+ // WordPress
83
+ if (useWP && cfg.wordpress?.site) {
84
+ sitemapEntries.push(...(await createWordPressURLs({ site: cfg.wordpress.site })));
85
+ }
86
+ // Contentful (pages)
87
+ if (useContentful && cfg.contentful) {
88
+ sitemapEntries.push(...(await createContentfulURLs({ apiProps: cfg.contentful, origin })));
89
+ }
90
+ // Contentful images
91
+ if (useContentfulImages && cfg.contentful) {
92
+ sitemapEntries.push(...(await createContentfulImageURLs({ apiProps: cfg.contentful, origin })));
93
+ }
94
+ // Page Builder (existing helper in package not always present)
95
+ if (usePageBuilder && cfg.contentful) {
96
+ // TODO: wire createContentfulPageBuilderURLs if needed; skipping for MVP
97
+ }
98
+ // Ebay items
99
+ if (useEbay) {
100
+ sitemapEntries.push(...(await createEbayItemURLs(origin)));
101
+ }
102
+ // Deduplicate by URL and properly merge images arrays if present
103
+ const map = new Map();
104
+ for (const entry of sitemapEntries.flat()) {
105
+ if (!entry || !entry.url)
106
+ continue;
107
+ const key = entry.url.toLowerCase();
108
+ const existing = map.get(key);
109
+ if (!existing) {
110
+ map.set(key, { ...entry });
111
+ }
112
+ else {
113
+ // Merge images
114
+ if (entry.images && entry.images.length) {
115
+ existing.images = Array.from(new Set([...(existing.images || []), ...entry.images]));
116
+ }
117
+ // Keep the earliest lastModified? Use whichever is present (prefer existing)
118
+ existing.lastModified = existing.lastModified || entry.lastModified;
119
+ existing.priority = existing.priority || entry.priority;
120
+ existing.changeFrequency = existing.changeFrequency || entry.changeFrequency;
121
+ map.set(key, existing);
122
+ }
123
+ }
124
+ const entries = Array.from(map.values());
125
+ return entries;
126
+ }
7
127
  export async function createPageURLs(myRoutes, origin) {
8
128
  const sitemap = [];
9
129
  // const origin = await getOrigin();
@@ -12,7 +132,7 @@ export async function createPageURLs(myRoutes, origin) {
12
132
  if (route.path.substring(0, 4).toLowerCase() !== 'http') {
13
133
  sitemap.push({
14
134
  url: `${origin}${route.path}`,
15
- lastModified: (new Date()).toISOString(),
135
+ lastModified: new Date(),
16
136
  changeFrequency: "hourly",
17
137
  priority: 1.0,
18
138
  });
@@ -20,15 +140,34 @@ export async function createPageURLs(myRoutes, origin) {
20
140
  }
21
141
  return sitemap;
22
142
  }
23
- export async function createImageURLs(origin) {
143
+ export async function createImageURLsFromJSON(origin, jsonPath = 'public/site-images.json') {
24
144
  const sitemap = [];
25
- // const origin = await getOrigin();
26
- const images = getAllImages();
27
- const newImages = images.map((image) => { return (`${origin}${image}`); });
28
- sitemap.push({
29
- url: `${origin}/images`, // Provide a valid URL for the images
30
- images: newImages,
31
- });
145
+ try {
146
+ let urlPath = jsonPath;
147
+ if (urlPath.startsWith('public/'))
148
+ urlPath = urlPath.slice('public/'.length);
149
+ if (!urlPath.startsWith('/'))
150
+ urlPath = `/${urlPath}`;
151
+ const resp = await fetch(`${origin}${urlPath}`);
152
+ if (!resp.ok)
153
+ return sitemap;
154
+ const imgs = await resp.json();
155
+ if (!Array.isArray(imgs))
156
+ return sitemap;
157
+ // Use an array of URL strings so the sitemap serializer writes the URL text
158
+ const newImages = imgs.map(i => {
159
+ const rel = i.startsWith('/') ? i : `/${i}`;
160
+ return `${origin}${rel}`;
161
+ });
162
+ sitemap.push({
163
+ url: `${origin}/images`,
164
+ images: newImages,
165
+ });
166
+ }
167
+ catch (e) {
168
+ if (typeof console !== 'undefined')
169
+ console.warn('createImageURLsFromJSON failed', e);
170
+ }
32
171
  return sitemap;
33
172
  }
34
173
  export async function createWordPressURLs(props) {
@@ -37,7 +176,7 @@ export async function createWordPressURLs(props) {
37
176
  for await (const post of blogPosts ?? []) {
38
177
  sitemap.push({
39
178
  url: post.URL,
40
- lastModified: post.modified ?? new Date().toISOString(),
179
+ lastModified: post.modified ? new Date(post.modified) : new Date(),
41
180
  changeFrequency: "hourly",
42
181
  priority: 1.0,
43
182
  });
@@ -66,7 +205,7 @@ export async function createContentfulURLs(props) {
66
205
  for (const title of contentfulTitles) {
67
206
  sitemap.push({
68
207
  url: `${props.origin}/projects/${encodeURIComponent(title)}`,
69
- lastModified: (new Date()).toISOString(),
208
+ lastModified: new Date(),
70
209
  changeFrequency: "hourly",
71
210
  priority: 1.0,
72
211
  });
@@ -92,13 +231,51 @@ export async function createContentfulPageBuilderURLs(props) {
92
231
  for (const pageName of pageNames) {
93
232
  sitemap.push({
94
233
  url: `${props.origin}/${encodeURIComponent(pageName)}`,
95
- lastModified: (new Date()).toISOString(),
234
+ lastModified: new Date(),
96
235
  changeFrequency: "hourly",
97
236
  priority: 1.0,
98
237
  });
99
238
  }
100
239
  return sitemap;
101
240
  }
241
+ createContentfulImageURLs.propTypes = {
242
+ apiProps: PropTypes.shape({
243
+ proxyURL: PropTypes.string,
244
+ base_url: PropTypes.string.isRequired,
245
+ space_id: PropTypes.string.isRequired,
246
+ environment: PropTypes.string.isRequired,
247
+ access_token: PropTypes.string.isRequired,
248
+ }).isRequired,
249
+ origin: PropTypes.string.isRequired,
250
+ };
251
+ export async function createContentfulImageURLs(props) {
252
+ const sitemap = [];
253
+ const providerContentfulApiProps = getFullPixelatedConfig()?.contentful;
254
+ const mergedApiProps = { ...providerContentfulApiProps, ...props.apiProps };
255
+ try {
256
+ const assets = await getContentfulAssetURLs({ apiProps: mergedApiProps });
257
+ if (!Array.isArray(assets) || assets.length === 0)
258
+ return sitemap;
259
+ const newImages = assets.map((a) => {
260
+ let i = a.image || '';
261
+ if (i.startsWith('//'))
262
+ i = `https:${i}`;
263
+ else if (i.startsWith('/'))
264
+ i = `${props.origin}${i}`;
265
+ return i;
266
+ }).filter(Boolean);
267
+ sitemap.push({
268
+ url: `${props.origin}/images`,
269
+ images: newImages,
270
+ lastModified: new Date(),
271
+ });
272
+ }
273
+ catch (e) {
274
+ if (typeof console !== 'undefined')
275
+ console.warn('createContentfulImageURLs failed', e);
276
+ }
277
+ return sitemap;
278
+ }
102
279
  const defaultEbayProps = {
103
280
  proxyURL: "https://proxy.pixelated.tech/prod/proxy?url=",
104
281
  baseTokenURL: 'https://api.ebay.com/identity/v1/oauth2/token',
@@ -122,7 +299,7 @@ export async function createEbayItemURLs(origin) {
122
299
  for (const item of items.itemSummaries) {
123
300
  sitemap.push({
124
301
  url: `${origin}/store/${item.legacyItemId}`,
125
- lastModified: item.itemCreationDate,
302
+ lastModified: item.itemCreationDate ? new Date(item.itemCreationDate) : new Date(),
126
303
  changeFrequency: "hourly",
127
304
  priority: 1.0,
128
305
  });
@@ -131,41 +308,3 @@ export async function createEbayItemURLs(origin) {
131
308
  });
132
309
  return sitemap;
133
310
  }
134
- export function jsonToSitemapEntries(entries) {
135
- return entries.map((entry) => `<url>
136
- <loc>${entry.url}</loc>
137
- <lastmod>${entry.lastModified}</lastmod>
138
- <changefreq>${entry.changeFrequency}</changefreq>
139
- <priority>${entry.priority}</priority>
140
- </url>`).join('');
141
- }
142
- export async function createImageURLsFromJSON(origin, jsonPath = 'public/site-images.json') {
143
- const sitemap = [];
144
- try {
145
- let urlPath = jsonPath;
146
- if (urlPath.startsWith('public/'))
147
- urlPath = urlPath.slice('public/'.length);
148
- if (!urlPath.startsWith('/'))
149
- urlPath = `/${urlPath}`;
150
- const resp = await fetch(`${origin}${urlPath}`);
151
- if (!resp.ok)
152
- return sitemap;
153
- const imgs = await resp.json();
154
- if (!Array.isArray(imgs))
155
- return sitemap;
156
- // Use an array of URL strings so the sitemap serializer writes the URL text
157
- const newImages = imgs.map(i => {
158
- const rel = i.startsWith('/') ? i : `/${i}`;
159
- return `${origin}${rel}`;
160
- });
161
- sitemap.push({
162
- url: `${origin}/images`,
163
- images: newImages,
164
- });
165
- }
166
- catch (e) {
167
- if (typeof console !== 'undefined')
168
- console.warn('createImageURLsFromJSON failed', e);
169
- }
170
- return sitemap;
171
- }
package/dist/index.js CHANGED
@@ -63,6 +63,7 @@ export * from './components/seo/googleanalytics';
63
63
  export * from './components/seo/googlemap';
64
64
  export * from './components/seo/googlesearch';
65
65
  export * from './components/seo/metadata'; // server-side
66
+ export * from './components/seo/metadata.components';
66
67
  export * from './components/seo/sitemap'; // server-side
67
68
  export * from './components/shoppingcart/ebay.components';
68
69
  export * from './components/shoppingcart/ebay.functions'; // server-side
@@ -33,3 +33,4 @@ export * from './components/utilities/functions';
33
33
  // Server-only wrapper exports
34
34
  // DO I REALLY NEED THIS?
35
35
  export * from './components/config/config.server';
36
+ export * from './components/seo/metadata.components';
@@ -0,0 +1,28 @@
1
+ import PropTypes, { InferProps } from "prop-types";
2
+ export type generateMetaTagsProps = InferProps<typeof generateMetaTags.propTypes>;
3
+ export declare function generateMetaTags(props: generateMetaTagsProps): import("react/jsx-runtime").JSX.Element;
4
+ export declare namespace generateMetaTags {
5
+ var propTypes: {
6
+ title: PropTypes.Validator<string>;
7
+ description: PropTypes.Validator<string>;
8
+ keywords: PropTypes.Validator<string>;
9
+ site_name: PropTypes.Validator<string>;
10
+ email: PropTypes.Validator<string>;
11
+ origin: PropTypes.Validator<string>;
12
+ url: PropTypes.Validator<string>;
13
+ image: PropTypes.Validator<string>;
14
+ image_height: PropTypes.Validator<string>;
15
+ image_width: PropTypes.Validator<string>;
16
+ favicon: PropTypes.Validator<string>;
17
+ };
18
+ }
19
+ export type SetClientMetadataProps = InferProps<typeof setClientMetadata.propTypes>;
20
+ export declare function setClientMetadata(props: SetClientMetadataProps): void;
21
+ export declare namespace setClientMetadata {
22
+ var propTypes: {
23
+ title: PropTypes.Validator<string>;
24
+ description: PropTypes.Validator<string>;
25
+ keywords: PropTypes.Validator<string>;
26
+ };
27
+ }
28
+ //# sourceMappingURL=metadata.components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.components.d.ts","sourceRoot":"","sources":["../../../../src/components/seo/metadata.components.tsx"],"names":[],"mappings":"AAEA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkBnD,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;AAClF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CAqE5D;yBArEe,gBAAgB;;;;;;;;;;;;;;;AA+EhC,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACpF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,QAQ9D;yBARe,iBAAiB"}
@@ -10,7 +10,6 @@ export type Route = {
10
10
  };
11
11
  export declare function getRouteByKey(obj: any, key: string, value: any): any;
12
12
  export declare function getAllRoutes(routes: Route, key: string): any[];
13
- export declare function getAllImages(): string[];
14
13
  export type Metadata = {
15
14
  title?: string;
16
15
  description?: string;
@@ -18,18 +17,5 @@ export type Metadata = {
18
17
  [key: string]: any;
19
18
  };
20
19
  export declare const getMetadata: (routes: any, key?: string, value?: string) => Metadata;
21
- export declare const setClientMetadata: ({ title, description, keywords }: {
22
- title: string;
23
- description: string;
24
- keywords: string;
25
- }) => void;
26
- export declare const setServerMetadata: ({ key, value }: {
27
- key: string;
28
- value: string;
29
- }) => {
30
- title: string | undefined;
31
- description: string | undefined;
32
- keywords: string | undefined;
33
- };
34
20
  export declare function getAccordionMenuData(myRoutes: Route): any;
35
21
  //# sourceMappingURL=metadata.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../../src/components/seo/metadata.ts"],"names":[],"mappings":"AACA,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,SAAI,EAAE,eAAe,GAAE,MAAM,EAAO,YA0B7G;AAID,MAAM,MAAM,KAAK,GAAG;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACnB,CAAA;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAgBpE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,SAkBtD;AAQD,wBAAgB,YAAY,aA4B3B;AAaD,MAAM,MAAM,QAAQ,GAAG;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,QAAQ,GAAG,EAAE,MAAK,MAAe,EAAE,QAAO,MAAe,aAmBpF,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,kCAAgC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,SAOvH,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,gBAAc;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;;;;CAO7E,CAAC;AAGF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,KAAK,OAsBnD"}
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../../src/components/seo/metadata.ts"],"names":[],"mappings":"AAEA,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,SAAI,EAAE,eAAe,GAAE,MAAM,EAAO,YA0B7G;AAID,MAAM,MAAM,KAAK,GAAG;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACnB,CAAA;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAgBpE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,SAkBtD;AAKD,MAAM,MAAM,QAAQ,GAAG;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,QAAQ,GAAG,EAAE,MAAK,MAAe,EAAE,QAAO,MAAe,aAmBpF,CAAC;AAIF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,KAAK,OAsBnD"}
@@ -1,22 +1,83 @@
1
1
  import PropTypes, { InferProps } from "prop-types";
2
- export type SitemapEntry = {
3
- url: string;
4
- lastModified: string;
5
- changeFrequency: "hourly";
6
- priority: number;
2
+ import type { MetadataRoute } from 'next';
3
+ export type SitemapEntry = MetadataRoute.Sitemap[number];
4
+ export type SitemapConfig = {
5
+ createPageURLs?: boolean;
6
+ createWordPressURLs?: boolean;
7
+ createImageURLs?: boolean;
8
+ createImageURLsFromJSON?: boolean;
9
+ createContentfulURLs?: boolean;
10
+ createContentfulImageURLs?: boolean;
11
+ createPageBuilderURLs?: boolean;
12
+ createEbayItemURLs?: boolean;
13
+ wordpress?: {
14
+ site?: string;
15
+ };
16
+ imageJson?: {
17
+ path?: string;
18
+ };
19
+ contentful?: any;
20
+ routes?: any;
7
21
  };
22
+ /**
23
+ * Helper to construct an origin string from a Next-like headers() object or plain values.
24
+ * Accepts an object with `get(key)` method, or `undefined` and falls back to localhost origin.
25
+ */
26
+ export declare function getOriginFromHeaders(headersLike?: {
27
+ get: (k: string) => string | null;
28
+ } | undefined, fallbackOrigin?: string): string;
29
+ /**
30
+ * Next-specific async helper: getOriginFromNextHeaders
31
+ * - Convenience wrapper that dynamically imports `next/headers` and calls our `getOriginFromHeaders` function
32
+ * - Falls back to `fallbackOrigin` if `next/headers` not available or on error
33
+ */
34
+ export declare function getOriginFromNextHeaders(fallbackOrigin?: string): Promise<string>;
35
+ export declare function flattenRoutes(routes: any): any[];
36
+ export declare function jsonToSitemapEntries(entries: SitemapEntry[]): string;
37
+ /**
38
+ * generateSitemap: compose the individual create* functions based on toggles in SitemapConfig.
39
+ * - Keep this minimal for the MVP: no retries/caching here. Add TODOs for later.
40
+ */
41
+ export declare function generateSitemap(cfg?: SitemapConfig, originInput?: string): Promise<MetadataRoute.Sitemap>;
8
42
  export declare function createPageURLs(myRoutes: {
9
43
  path: string;
10
- }[], origin: string): Promise<SitemapEntry[]>;
11
- export declare function createImageURLs(origin: string): Promise<{
44
+ }[], origin: string): Promise<{
12
45
  url: string;
13
- images: string[];
46
+ lastModified?: string | Date | undefined;
47
+ changeFrequency?: "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never" | undefined;
48
+ priority?: number | undefined;
49
+ alternates?: {
50
+ languages?: import("next/dist/lib/metadata/types/alternative-urls-types").Languages<string> | undefined;
51
+ } | undefined;
52
+ images?: string[] | undefined;
53
+ videos?: import("next/dist/lib/metadata/types/metadata-types").Videos[] | undefined;
14
54
  }[]>;
55
+ export declare function createImageURLsFromJSON(origin: string, jsonPath?: string): Promise<SitemapEntry[]>;
15
56
  export declare function createWordPressURLs(props: {
16
57
  site: string;
17
- }): Promise<SitemapEntry[]>;
58
+ }): Promise<{
59
+ url: string;
60
+ lastModified?: string | Date | undefined;
61
+ changeFrequency?: "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never" | undefined;
62
+ priority?: number | undefined;
63
+ alternates?: {
64
+ languages?: import("next/dist/lib/metadata/types/alternative-urls-types").Languages<string> | undefined;
65
+ } | undefined;
66
+ images?: string[] | undefined;
67
+ videos?: import("next/dist/lib/metadata/types/metadata-types").Videos[] | undefined;
68
+ }[]>;
18
69
  export type createContentfulURLsType = InferProps<typeof createContentfulURLs.propTypes>;
19
- export declare function createContentfulURLs(props: createContentfulURLsType): Promise<SitemapEntry[]>;
70
+ export declare function createContentfulURLs(props: createContentfulURLsType): Promise<{
71
+ url: string;
72
+ lastModified?: string | Date | undefined;
73
+ changeFrequency?: "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never" | undefined;
74
+ priority?: number | undefined;
75
+ alternates?: {
76
+ languages?: import("next/dist/lib/metadata/types/alternative-urls-types").Languages<string> | undefined;
77
+ } | undefined;
78
+ images?: string[] | undefined;
79
+ videos?: import("next/dist/lib/metadata/types/metadata-types").Videos[] | undefined;
80
+ }[]>;
20
81
  export declare namespace createContentfulURLs {
21
82
  var propTypes: {
22
83
  apiProps: PropTypes.Validator<NonNullable<PropTypes.InferProps<{
@@ -29,7 +90,17 @@ export declare namespace createContentfulURLs {
29
90
  };
30
91
  }
31
92
  export type createContentfulPageBuilderURLsType = InferProps<typeof createContentfulPageBuilderURLs.propTypes>;
32
- export declare function createContentfulPageBuilderURLs(props: createContentfulPageBuilderURLsType): Promise<SitemapEntry[]>;
93
+ export declare function createContentfulPageBuilderURLs(props: createContentfulPageBuilderURLsType): Promise<{
94
+ url: string;
95
+ lastModified?: string | Date | undefined;
96
+ changeFrequency?: "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never" | undefined;
97
+ priority?: number | undefined;
98
+ alternates?: {
99
+ languages?: import("next/dist/lib/metadata/types/alternative-urls-types").Languages<string> | undefined;
100
+ } | undefined;
101
+ images?: string[] | undefined;
102
+ videos?: import("next/dist/lib/metadata/types/metadata-types").Videos[] | undefined;
103
+ }[]>;
33
104
  export declare namespace createContentfulPageBuilderURLs {
34
105
  var propTypes: {
35
106
  apiProps: PropTypes.Validator<NonNullable<PropTypes.InferProps<{
@@ -41,7 +112,29 @@ export declare namespace createContentfulPageBuilderURLs {
41
112
  origin: PropTypes.Validator<string>;
42
113
  };
43
114
  }
44
- export declare function createEbayItemURLs(origin: string): Promise<SitemapEntry[]>;
45
- export declare function jsonToSitemapEntries(entries: SitemapEntry[]): string;
46
- export declare function createImageURLsFromJSON(origin: string, jsonPath?: string): Promise<any[]>;
115
+ export type createContentfulImageURLsType = InferProps<typeof createContentfulImageURLs.propTypes>;
116
+ export declare function createContentfulImageURLs(props: createContentfulImageURLsType): Promise<SitemapEntry[]>;
117
+ export declare namespace createContentfulImageURLs {
118
+ var propTypes: {
119
+ apiProps: PropTypes.Validator<NonNullable<PropTypes.InferProps<{
120
+ proxyURL: PropTypes.Requireable<string>;
121
+ base_url: PropTypes.Validator<string>;
122
+ space_id: PropTypes.Validator<string>;
123
+ environment: PropTypes.Validator<string>;
124
+ access_token: PropTypes.Validator<string>;
125
+ }>>>;
126
+ origin: PropTypes.Validator<string>;
127
+ };
128
+ }
129
+ export declare function createEbayItemURLs(origin: string): Promise<{
130
+ url: string;
131
+ lastModified?: string | Date | undefined;
132
+ changeFrequency?: "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never" | undefined;
133
+ priority?: number | undefined;
134
+ alternates?: {
135
+ languages?: import("next/dist/lib/metadata/types/alternative-urls-types").Languages<string> | undefined;
136
+ } | undefined;
137
+ images?: string[] | undefined;
138
+ videos?: import("next/dist/lib/metadata/types/metadata-types").Videos[] | undefined;
139
+ }[]>;
47
140
  //# sourceMappingURL=sitemap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../../../src/components/seo/sitemap.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQnD,MAAM,MAAM,YAAY,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,QAAQ,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,wBAAsB,cAAc,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,MAAM,EAAE,MAAM,2BAehF;AAID,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM;;;KAUnD;AAID,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,2BAY9D;AAaD,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzF,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB,2BAqBzE;yBArBqB,oBAAoB;;;;;;;;;;;AAkC1C,MAAM,MAAM,mCAAmC,GAAG,UAAU,CAAC,OAAO,+BAA+B,CAAC,SAAS,CAAC,CAAC;AAC/G,wBAAsB,+BAA+B,CAAC,KAAK,EAAE,mCAAmC,2BAgB/F;yBAhBqB,+BAA+B;;;;;;;;;;;AAmCrD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,2BAiBtD;AAKD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,EAAE,UAU3D;AAKD,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAA4B,kBAuBjG"}
1
+ {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../../../src/components/seo/sitemap.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAQ1C,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAWzD,MAAM,MAAM,aAAa,GAAG;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,MAAM,CAAC,EAAE,GAAG,CAAC;CACb,CAAC;AAKF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE;IAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,EAAE,cAAc,SAA0B,UAU7I;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAAC,cAAc,SAA0B,mBAatF;AAID,wBAAgB,aAAa,CAAC,MAAM,EAAE,GAAG,SAGxC;AAID,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,EAAE,UAU3D;AAID;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,GAAE,aAAkB,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAkEnH;AAKD,wBAAsB,cAAc,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,MAAM,EAAE,MAAM;;;;;;iBA+MmtL,CAAC;;;;KAhMpyL;AAMD,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAA4B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAuB3H;AAKD,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC;;;;;;iBA8JquL,CAAC;;;;KAlJpyL;AAaD,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzF,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB;;;;;;iBAoI0tL,CAAC;;;;KA/GpyL;yBArBqB,oBAAoB;;;;;;;;;;;AAkC1C,MAAM,MAAM,mCAAmC,GAAG,UAAU,CAAC,OAAO,+BAA+B,CAAC,SAAS,CAAC,CAAC;AAC/G,wBAAsB,+BAA+B,CAAC,KAAK,EAAE,mCAAmC;;;;;;iBAiGosL,CAAC;;;;KAjFpyL;yBAhBqB,+BAA+B;;;;;;;;;;;AAgCrD,MAAM,MAAM,6BAA6B,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,SAAS,CAAC,CAAC;AACnG,wBAAsB,yBAAyB,CAAC,KAAK,EAAE,6BAA6B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAsB7G;yBAtBqB,yBAAyB;;;;;;;;;;;;AAyC/C,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM;;;;;;iBAuB6uL,CAAC;;;;KANpyL"}
@@ -61,6 +61,7 @@ export * from "./components/seo/googleanalytics";
61
61
  export * from "./components/seo/googlemap";
62
62
  export * from "./components/seo/googlesearch";
63
63
  export * from "./components/seo/metadata";
64
+ export * from "./components/seo/metadata.components";
64
65
  export * from "./components/seo/sitemap";
65
66
  export * from "./components/shoppingcart/ebay.components";
66
67
  export * from "./components/shoppingcart/ebay.functions";
@@ -27,4 +27,5 @@ export * from "./components/shoppingcart/shoppingcart.functions";
27
27
  export * from "./components/utilities/api";
28
28
  export * from "./components/utilities/functions";
29
29
  export * from "./components/config/config.server";
30
+ export * from "./components/seo/metadata.components";
30
31
  //# sourceMappingURL=index.server.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixelated-tech/components",
3
- "version": "3.1.5",
3
+ "version": "3.1.6",
4
4
  "private": false,
5
5
  "author": {
6
6
  "name": "Pixelated Technologies",
@@ -60,6 +60,7 @@
60
60
  "build2palmettoepoxy": "npm run build && rm -rf ../palmetto-epoxy/node_modules/@pixelated-tech/components/dist && cp -r dist ../palmetto-epoxy/node_modules/@pixelated-tech/components/",
61
61
  "build2pixelated": "npm run build && rm -rf ../pixelated/node_modules/@pixelated-tech/components/dist && cp -r dist ../pixelated/node_modules/@pixelated-tech/components/",
62
62
  "build2pixelvivid": "npm run build && rm -rf ../pixelvivid/node_modules/@pixelated-tech/components/dist && cp -r dist ../pixelvivid/node_modules/@pixelated-tech/components/",
63
+ "build2template": "npm run build && rm -rf ../pixelated-template/node_modules/@pixelated-tech/components/dist && cp -r dist ../pixelated-template/node_modules/@pixelated-tech/components/",
63
64
  "storybook": "rm -rf node_modules/.cache && storybook dev -p 6006",
64
65
  "buildStorybook": "rm -rf node_modules/.cache && storybook build",
65
66
  "test": "react-scripts test"