@uptrademedia/site-kit 1.0.30 → 1.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-WNCM4GNY.js → chunk-7BEMFSF6.js} +41 -23
- package/dist/chunk-7BEMFSF6.js.map +1 -0
- package/dist/{chunk-L474IOHD.mjs → chunk-A37Z47FZ.mjs} +41 -23
- package/dist/chunk-A37Z47FZ.mjs.map +1 -0
- package/dist/{chunk-WPSRS352.mjs → chunk-BQOFRBGZ.mjs} +3 -3
- package/dist/chunk-BQOFRBGZ.mjs.map +1 -0
- package/dist/{chunk-HCFPU7TU.js → chunk-G7RSD56P.js} +3 -3
- package/dist/chunk-G7RSD56P.js.map +1 -0
- package/dist/{chunk-MDOHOEME.mjs → chunk-GM2ZDV2B.mjs} +63 -45
- package/dist/chunk-GM2ZDV2B.mjs.map +1 -0
- package/dist/{chunk-6J26EHDM.js → chunk-H5PVDCCM.js} +63 -45
- package/dist/chunk-H5PVDCCM.js.map +1 -0
- package/dist/{chunk-XFRPT5ZX.mjs → chunk-X66VOCWP.mjs} +26 -53
- package/dist/chunk-X66VOCWP.mjs.map +1 -0
- package/dist/{chunk-5R4R3WDP.js → chunk-Y4BW6XYJ.js} +26 -53
- package/dist/chunk-Y4BW6XYJ.js.map +1 -0
- package/dist/commerce/index.js +39 -39
- package/dist/commerce/index.mjs +1 -1
- package/dist/engage/index.d.mts +2 -2
- package/dist/engage/index.d.ts +2 -2
- package/dist/engage/index.js +4 -4
- package/dist/engage/index.mjs +1 -1
- package/dist/forms/index.d.mts +1 -1
- package/dist/forms/index.d.ts +1 -1
- package/dist/forms/index.js +6 -4
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/index.mjs +6 -4
- package/dist/forms/index.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +51 -39
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +24 -12
- package/dist/index.mjs.map +1 -1
- package/dist/seo/index.d.mts +6 -18
- package/dist/seo/index.d.ts +6 -18
- package/dist/seo/index.js +2 -2
- package/dist/seo/index.mjs +1 -1
- package/dist/seo/register-sitemap-cli.js +112 -3
- package/dist/seo/register-sitemap-cli.js.map +1 -1
- package/dist/seo/register-sitemap-cli.mjs +106 -2
- package/dist/seo/register-sitemap-cli.mjs.map +1 -1
- package/dist/setup/client.js +3 -3
- package/dist/setup/client.mjs +1 -1
- package/dist/setup/index.js +3 -3
- package/dist/setup/index.mjs +1 -1
- package/dist/{types-B77UG-p-.d.mts → types-CYPI3-8j.d.mts} +2 -0
- package/dist/{types-B77UG-p-.d.ts → types-CYPI3-8j.d.ts} +2 -0
- package/dist/{types-CWKw0giL.d.ts → types-C_pfGZhI.d.mts} +1 -2
- package/dist/{types-CWKw0giL.d.mts → types-C_pfGZhI.d.ts} +1 -2
- package/package.json +1 -1
- package/dist/chunk-5R4R3WDP.js.map +0 -1
- package/dist/chunk-6J26EHDM.js.map +0 -1
- package/dist/chunk-HCFPU7TU.js.map +0 -1
- package/dist/chunk-L474IOHD.mjs.map +0 -1
- package/dist/chunk-MDOHOEME.mjs.map +0 -1
- package/dist/chunk-WNCM4GNY.js.map +0 -1
- package/dist/chunk-WPSRS352.mjs.map +0 -1
- package/dist/chunk-XFRPT5ZX.mjs.map +0 -1
package/dist/seo/index.d.mts
CHANGED
|
@@ -533,27 +533,15 @@ declare function LocationPageContent({ projectId, path, section, fallback, class
|
|
|
533
533
|
/**
|
|
534
534
|
* SitemapSync - Automatically sync sitemap.xml to Portal API
|
|
535
535
|
*
|
|
536
|
-
*
|
|
537
|
-
*
|
|
538
|
-
*
|
|
539
|
-
* The sitemap.xml is the canonical source of truth for what pages exist.
|
|
540
|
-
* Analytics will only track page views for pages that exist in seo_pages.
|
|
536
|
+
* Client-only component. Lives at package root so the main entry does not
|
|
537
|
+
* pull in seo/ (and server-only code). For use in SiteKitProvider and
|
|
538
|
+
* from @uptrademedia/site-kit/seo.
|
|
541
539
|
*
|
|
542
540
|
* @example
|
|
543
541
|
* ```tsx
|
|
544
|
-
*
|
|
545
|
-
*
|
|
546
|
-
*
|
|
547
|
-
* export default function RootLayout({ children }) {
|
|
548
|
-
* return (
|
|
549
|
-
* <html>
|
|
550
|
-
* <body>
|
|
551
|
-
* <SitemapSync />
|
|
552
|
-
* {children}
|
|
553
|
-
* </body>
|
|
554
|
-
* </html>
|
|
555
|
-
* )
|
|
556
|
-
* }
|
|
542
|
+
* import { SitemapSync } from '@uptrademedia/site-kit'
|
|
543
|
+
* // or
|
|
544
|
+
* import { SitemapSync } from '@uptrademedia/site-kit/seo'
|
|
557
545
|
* ```
|
|
558
546
|
*/
|
|
559
547
|
interface SitemapSyncProps {
|
package/dist/seo/index.d.ts
CHANGED
|
@@ -533,27 +533,15 @@ declare function LocationPageContent({ projectId, path, section, fallback, class
|
|
|
533
533
|
/**
|
|
534
534
|
* SitemapSync - Automatically sync sitemap.xml to Portal API
|
|
535
535
|
*
|
|
536
|
-
*
|
|
537
|
-
*
|
|
538
|
-
*
|
|
539
|
-
* The sitemap.xml is the canonical source of truth for what pages exist.
|
|
540
|
-
* Analytics will only track page views for pages that exist in seo_pages.
|
|
536
|
+
* Client-only component. Lives at package root so the main entry does not
|
|
537
|
+
* pull in seo/ (and server-only code). For use in SiteKitProvider and
|
|
538
|
+
* from @uptrademedia/site-kit/seo.
|
|
541
539
|
*
|
|
542
540
|
* @example
|
|
543
541
|
* ```tsx
|
|
544
|
-
*
|
|
545
|
-
*
|
|
546
|
-
*
|
|
547
|
-
* export default function RootLayout({ children }) {
|
|
548
|
-
* return (
|
|
549
|
-
* <html>
|
|
550
|
-
* <body>
|
|
551
|
-
* <SitemapSync />
|
|
552
|
-
* {children}
|
|
553
|
-
* </body>
|
|
554
|
-
* </html>
|
|
555
|
-
* )
|
|
556
|
-
* }
|
|
542
|
+
* import { SitemapSync } from '@uptrademedia/site-kit'
|
|
543
|
+
* // or
|
|
544
|
+
* import { SitemapSync } from '@uptrademedia/site-kit/seo'
|
|
557
545
|
* ```
|
|
558
546
|
*/
|
|
559
547
|
interface SitemapSyncProps {
|
package/dist/seo/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var chunkG7RSD56P_js = require('../chunk-G7RSD56P.js');
|
|
6
6
|
var chunk6NTMCSHP_js = require('../chunk-6NTMCSHP.js');
|
|
7
7
|
var chunkFOBATMSH_js = require('../chunk-FOBATMSH.js');
|
|
8
8
|
require('../chunk-ZSMWDLMK.js');
|
|
@@ -754,7 +754,7 @@ async function LocationPageContent({
|
|
|
754
754
|
|
|
755
755
|
Object.defineProperty(exports, "SitemapSync", {
|
|
756
756
|
enumerable: true,
|
|
757
|
-
get: function () { return
|
|
757
|
+
get: function () { return chunkG7RSD56P_js.SitemapSync; }
|
|
758
758
|
});
|
|
759
759
|
Object.defineProperty(exports, "generateSitemap", {
|
|
760
760
|
enumerable: true,
|
package/dist/seo/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { SitemapSync } from '../chunk-
|
|
1
|
+
export { SitemapSync } from '../chunk-BQOFRBGZ.mjs';
|
|
2
2
|
export { generateSitemap, getRedirect, getRobotsDirective, isIndexable } from '../chunk-WG2SI2UN.mjs';
|
|
3
3
|
import { getSEOPageData, getABTest, recordABImpression, getSchemaMarkups, getEntityEnhancedSchema, getFAQData, getInternalLinks, getContentBlock, getEntities, getManagedScripts } from '../chunk-MLY7AWHG.mjs';
|
|
4
4
|
export { getABTest, getContentBlock, getEntities, getEntityEnhancedSchema, getFAQData, getInternalLinks, getManagedScripts, getPrimaryEntity, getRedirectData, getRobotsData, getSEOPageData, getSchemaMarkups, getSitemapEntries, getVisibilityScore, getVisibilitySummary, recordABImpression, registerSitemap } from '../chunk-MLY7AWHG.mjs';
|
|
@@ -1,9 +1,118 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var chunk6NTMCSHP_js = require('../chunk-6NTMCSHP.js');
|
|
5
|
-
require('../chunk-FOBATMSH.js');
|
|
6
4
|
require('../chunk-ZSMWDLMK.js');
|
|
5
|
+
var fs = require('fs');
|
|
6
|
+
var path = require('path');
|
|
7
|
+
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
11
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
12
|
+
|
|
13
|
+
function getApiConfig() {
|
|
14
|
+
const apiUrl = process.env.UPTRADE_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.uptrademedia.com";
|
|
15
|
+
const apiKey = process.env.UPTRADE_API_KEY || process.env.NEXT_PUBLIC_UPTRADE_API_KEY || "";
|
|
16
|
+
return { apiUrl, apiKey };
|
|
17
|
+
}
|
|
18
|
+
function discoverNextJsRoutes(appDir, basePath = "") {
|
|
19
|
+
const entries = [];
|
|
20
|
+
const items = fs__default.default.readdirSync(appDir, { withFileTypes: true });
|
|
21
|
+
for (const item of items) {
|
|
22
|
+
if (item.name.startsWith("_") || item.name.startsWith(".")) continue;
|
|
23
|
+
if (item.name === "api") continue;
|
|
24
|
+
if (item.name === "node_modules") continue;
|
|
25
|
+
const itemPath = path__default.default.join(appDir, item.name);
|
|
26
|
+
if (item.isDirectory()) {
|
|
27
|
+
const hasPage = fs__default.default.existsSync(path__default.default.join(itemPath, "page.tsx")) || fs__default.default.existsSync(path__default.default.join(itemPath, "page.js")) || fs__default.default.existsSync(path__default.default.join(itemPath, "page.jsx"));
|
|
28
|
+
const isRouteGroup = item.name.startsWith("(") && item.name.endsWith(")");
|
|
29
|
+
const isDynamic = item.name.startsWith("[") && item.name.endsWith("]");
|
|
30
|
+
let routePath = basePath;
|
|
31
|
+
if (!isRouteGroup && !isDynamic) {
|
|
32
|
+
routePath = `${basePath}/${item.name}`;
|
|
33
|
+
}
|
|
34
|
+
if (hasPage && !isDynamic) {
|
|
35
|
+
const priority = routePath === "" ? 1 : 0.8;
|
|
36
|
+
entries.push({ path: routePath || "/", priority });
|
|
37
|
+
}
|
|
38
|
+
if (!isDynamic) {
|
|
39
|
+
const subEntries = discoverNextJsRoutes(
|
|
40
|
+
itemPath,
|
|
41
|
+
isRouteGroup ? basePath : routePath
|
|
42
|
+
);
|
|
43
|
+
entries.push(...subEntries);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (basePath === "") {
|
|
48
|
+
const hasRootPage = fs__default.default.existsSync(path__default.default.join(appDir, "page.tsx")) || fs__default.default.existsSync(path__default.default.join(appDir, "page.js")) || fs__default.default.existsSync(path__default.default.join(appDir, "page.jsx"));
|
|
49
|
+
if (hasRootPage) {
|
|
50
|
+
entries.unshift({ path: "/", priority: 1 });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return entries;
|
|
54
|
+
}
|
|
55
|
+
async function registerSitemapViaApi(entries, optimizeMeta) {
|
|
56
|
+
const { apiUrl, apiKey } = getApiConfig();
|
|
57
|
+
if (!apiKey) {
|
|
58
|
+
console.warn("[Uptrade] No API key (UPTRADE_API_KEY or NEXT_PUBLIC_UPTRADE_API_KEY)");
|
|
59
|
+
return { success: false, created: 0, updated: 0 };
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {
|
|
63
|
+
method: "POST",
|
|
64
|
+
headers: {
|
|
65
|
+
"Content-Type": "application/json",
|
|
66
|
+
"x-api-key": apiKey
|
|
67
|
+
},
|
|
68
|
+
body: JSON.stringify({ entries, optimize_meta: optimizeMeta })
|
|
69
|
+
});
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
console.error(`[Uptrade] Sitemap registration failed: ${response.status} ${response.statusText}`);
|
|
72
|
+
return { success: false, created: 0, updated: 0 };
|
|
73
|
+
}
|
|
74
|
+
return await response.json();
|
|
75
|
+
} catch (error) {
|
|
76
|
+
console.error("[Uptrade] Sitemap registration error:", error);
|
|
77
|
+
return { success: false, created: 0, updated: 0 };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async function registerLocalSitemap(options) {
|
|
81
|
+
let entries = options.entries || [];
|
|
82
|
+
if (options.autoDiscover && entries.length === 0) {
|
|
83
|
+
const cwd = process.cwd();
|
|
84
|
+
const appDirs = [
|
|
85
|
+
path__default.default.join(cwd, "app"),
|
|
86
|
+
path__default.default.join(cwd, "src", "app")
|
|
87
|
+
];
|
|
88
|
+
for (const appDir of appDirs) {
|
|
89
|
+
if (fs__default.default.existsSync(appDir)) {
|
|
90
|
+
entries = discoverNextJsRoutes(appDir);
|
|
91
|
+
console.log(`[Uptrade] Auto-discovered ${entries.length} routes from ${path__default.default.relative(cwd, appDir)}`);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (entries.length === 0) {
|
|
97
|
+
console.warn("[Uptrade] No sitemap entries to register");
|
|
98
|
+
return { success: true, created: 0, updated: 0 };
|
|
99
|
+
}
|
|
100
|
+
console.log(`[Uptrade] Registering ${entries.length} sitemap entries...`);
|
|
101
|
+
const payload = entries.map((e) => ({
|
|
102
|
+
path: e.path,
|
|
103
|
+
title: e.title,
|
|
104
|
+
priority: e.priority,
|
|
105
|
+
changefreq: e.changefreq
|
|
106
|
+
}));
|
|
107
|
+
const result = await registerSitemapViaApi(
|
|
108
|
+
payload,
|
|
109
|
+
options.optimize_meta !== false
|
|
110
|
+
);
|
|
111
|
+
if (result.success) {
|
|
112
|
+
console.log(`[Uptrade] Sitemap registered: ${result.created} new, ${result.updated} updated`);
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
7
116
|
|
|
8
117
|
// src/seo/register-sitemap-cli.ts
|
|
9
118
|
async function main() {
|
|
@@ -12,7 +121,7 @@ async function main() {
|
|
|
12
121
|
const skipOptimize = args.includes("--no-optimize") || args.includes("--skip-optimize");
|
|
13
122
|
console.log("[Uptrade] Registering sitemap entries...");
|
|
14
123
|
try {
|
|
15
|
-
const result = await
|
|
124
|
+
const result = await registerLocalSitemap({
|
|
16
125
|
autoDiscover,
|
|
17
126
|
optimize_meta: !skipOptimize
|
|
18
127
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/seo/register-sitemap-cli.ts"],"names":["registerLocalSitemap"],"mappings":";;;;;;;;AAmBA,eAAe,IAAA,GAAO;AACpB,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACjC,EAAA,MAAM,eAAe,IAAA,CAAK,QAAA,CAAS,iBAAiB,CAAA,IAAK,IAAA,CAAK,SAAS,IAAI,CAAA;AAC3E,EAAA,MAAM,eAAe,IAAA,CAAK,QAAA,CAAS,eAAe,CAAA,IAAK,IAAA,CAAK,SAAS,iBAAiB,CAAA;AAEtF,EAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AAEtD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMA,qCAAA,CAAqB;AAAA,MACxC,YAAA;AAAA,MACA,eAAe,CAAC;AAAA,KACjB,CAAA;AAED,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,OAAA,CAAQ,IAAI,CAAA,gDAAA,CAA6C,CAAA;AACzD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AACpD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AACpD,MAAA,IAAI,MAAA,CAAO,OAAA,KAAY,KAAA,CAAA,IAAa,MAAA,CAAO,UAAU,CAAA,EAAG;AACtD,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,MACtD;AACA,MAAA,IAAI,MAAA,CAAO,mBAAmB,SAAA,EAAW;AACvC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2DAAA,EAAyD,MAAA,CAAO,iBAAA,CAAkB,YAAY,CAAA,MAAA,CAAQ,CAAA;AAClH,QAAA,OAAA,CAAQ,IAAI,CAAA,yEAAA,CAA2E,CAAA;AAAA,MACzF;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAM,6CAAwC,CAAA;AACtD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,2BAAsB,KAAK,CAAA;AACzC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;AAEA,IAAA,EAAK","file":"register-sitemap-cli.js","sourcesContent":["#!/usr/bin/env node\n/**\n * CLI script to register sitemap entries at build time\n * \n * Usage:\n * npx uptrade-register-sitemap\n * npx uptrade-register-sitemap --auto-discover\n * npx uptrade-register-sitemap --no-optimize # Skip Signal AI meta optimization\n * \n * Or in package.json:\n * {\n * \"scripts\": {\n * \"postbuild\": \"uptrade-register-sitemap --auto-discover\"\n * }\n * }\n */\n\nimport { registerLocalSitemap } from './routing'\n\nasync function main() {\n const args = process.argv.slice(2)\n const autoDiscover = args.includes('--auto-discover') || args.includes('-a')\n const skipOptimize = args.includes('--no-optimize') || args.includes('--skip-optimize')\n \n console.log('[Uptrade] Registering sitemap entries...')\n \n try {\n const result = await registerLocalSitemap({\n autoDiscover,\n optimize_meta: !skipOptimize,\n })\n \n if (result.success) {\n console.log(`[Uptrade] ✓ Sitemap registered successfully`)\n console.log(`[Uptrade] Created: ${result.created}`)\n console.log(`[Uptrade] Updated: ${result.updated}`)\n if (result.removed !== undefined && result.removed > 0) {\n console.log(`[Uptrade] Removed: ${result.removed}`)\n }\n if (result.meta_optimization?.triggered) {\n console.log(`[Uptrade] ✓ Signal AI meta optimization triggered for ${result.meta_optimization.pages_queued} pages`)\n console.log(`[Uptrade] (Running in background - check Portal SEO module for results)`)\n }\n process.exit(0)\n } else {\n console.error('[Uptrade] ✗ Failed to register sitemap')\n process.exit(1)\n }\n } catch (error) {\n console.error('[Uptrade] ✗ Error:', error)\n process.exit(1)\n }\n}\n\nmain()\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/seo/register-sitemap-cli-impl.ts","../../src/seo/register-sitemap-cli.ts"],"names":["fs","path"],"mappings":"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","file":"register-sitemap-cli.js","sourcesContent":["/**\n * Standalone implementation for uptrade-register-sitemap CLI.\n * Does NOT import from server-api or routing, so it can run in Node without\n * pulling in server-only (which throws when required outside Next.js server context).\n */\n\nimport fs from 'fs'\nimport path from 'path'\n\nfunction getApiConfig(): { apiUrl: string; apiKey: string } {\n const apiUrl =\n process.env.UPTRADE_API_URL ||\n process.env.NEXT_PUBLIC_UPTRADE_API_URL ||\n 'https://api.uptrademedia.com'\n const apiKey =\n process.env.UPTRADE_API_KEY ||\n process.env.NEXT_PUBLIC_UPTRADE_API_KEY ||\n ''\n return { apiUrl, apiKey }\n}\n\nfunction discoverNextJsRoutes(\n appDir: string,\n basePath: string = ''\n): Array<{ path: string; priority: number }> {\n const entries: Array<{ path: string; priority: number }> = []\n\n const items = fs.readdirSync(appDir, { withFileTypes: true })\n\n for (const item of items) {\n if (item.name.startsWith('_') || item.name.startsWith('.')) continue\n if (item.name === 'api') continue\n if (item.name === 'node_modules') continue\n\n const itemPath = path.join(appDir, item.name)\n\n if (item.isDirectory()) {\n const hasPage =\n fs.existsSync(path.join(itemPath, 'page.tsx')) ||\n fs.existsSync(path.join(itemPath, 'page.js')) ||\n fs.existsSync(path.join(itemPath, 'page.jsx'))\n\n const isRouteGroup = item.name.startsWith('(') && item.name.endsWith(')')\n const isDynamic = item.name.startsWith('[') && item.name.endsWith(']')\n\n let routePath = basePath\n if (!isRouteGroup && !isDynamic) {\n routePath = `${basePath}/${item.name}`\n }\n\n if (hasPage && !isDynamic) {\n const priority = routePath === '' ? 1.0 : 0.8\n entries.push({ path: routePath || '/', priority })\n }\n\n if (!isDynamic) {\n const subEntries = discoverNextJsRoutes(\n itemPath,\n isRouteGroup ? basePath : routePath\n )\n entries.push(...subEntries)\n }\n }\n }\n\n if (basePath === '') {\n const hasRootPage =\n fs.existsSync(path.join(appDir, 'page.tsx')) ||\n fs.existsSync(path.join(appDir, 'page.js')) ||\n fs.existsSync(path.join(appDir, 'page.jsx'))\n if (hasRootPage) {\n entries.unshift({ path: '/', priority: 1.0 })\n }\n }\n\n return entries\n}\n\nasync function registerSitemapViaApi(\n entries: Array<{\n path: string\n title?: string\n priority?: number\n changefreq?: string\n }>,\n optimizeMeta: boolean\n): Promise<{\n success: boolean\n created: number\n updated: number\n removed?: number\n meta_optimization?: { triggered: boolean; pages_queued: number } | null\n}> {\n const { apiUrl, apiKey } = getApiConfig()\n if (!apiKey) {\n console.warn('[Uptrade] No API key (UPTRADE_API_KEY or NEXT_PUBLIC_UPTRADE_API_KEY)')\n return { success: false, created: 0, updated: 0 }\n }\n\n try {\n const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ entries, optimize_meta: optimizeMeta }),\n })\n\n if (!response.ok) {\n console.error(`[Uptrade] Sitemap registration failed: ${response.status} ${response.statusText}`)\n return { success: false, created: 0, updated: 0 }\n }\n\n return await response.json()\n } catch (error) {\n console.error('[Uptrade] Sitemap registration error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\nexport type RegisterLocalSitemapOptions = {\n entries?: Array<{\n path: string\n title?: string\n priority?: number\n changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n }>\n autoDiscover?: boolean\n optimize_meta?: boolean\n}\n\nexport type RegisterLocalSitemapResult = {\n success: boolean\n created: number\n updated: number\n removed?: number\n meta_optimization?: {\n triggered: boolean\n pages_queued: number\n } | null\n}\n\nexport async function registerLocalSitemap(\n options: RegisterLocalSitemapOptions\n): Promise<RegisterLocalSitemapResult> {\n let entries = options.entries || []\n\n if (options.autoDiscover && entries.length === 0) {\n const cwd = process.cwd()\n const appDirs = [\n path.join(cwd, 'app'),\n path.join(cwd, 'src', 'app'),\n ]\n for (const appDir of appDirs) {\n if (fs.existsSync(appDir)) {\n entries = discoverNextJsRoutes(appDir)\n console.log(`[Uptrade] Auto-discovered ${entries.length} routes from ${path.relative(cwd, appDir)}`)\n break\n }\n }\n }\n\n if (entries.length === 0) {\n console.warn('[Uptrade] No sitemap entries to register')\n return { success: true, created: 0, updated: 0 }\n }\n\n console.log(`[Uptrade] Registering ${entries.length} sitemap entries...`)\n const payload = entries.map((e) => ({\n path: e.path,\n title: e.title,\n priority: e.priority,\n changefreq: e.changefreq,\n }))\n const result = await registerSitemapViaApi(\n payload,\n options.optimize_meta !== false\n )\n\n if (result.success) {\n console.log(`[Uptrade] Sitemap registered: ${result.created} new, ${result.updated} updated`)\n }\n\n return result\n}\n","#!/usr/bin/env node\n/**\n * CLI script to register sitemap entries at build time\n * \n * Usage:\n * npx uptrade-register-sitemap\n * npx uptrade-register-sitemap --auto-discover\n * npx uptrade-register-sitemap --no-optimize # Skip Signal AI meta optimization\n * \n * Or in package.json:\n * {\n * \"scripts\": {\n * \"postbuild\": \"uptrade-register-sitemap --auto-discover\"\n * }\n * }\n */\n\nimport { registerLocalSitemap } from './register-sitemap-cli-impl'\n\nasync function main() {\n const args = process.argv.slice(2)\n const autoDiscover = args.includes('--auto-discover') || args.includes('-a')\n const skipOptimize = args.includes('--no-optimize') || args.includes('--skip-optimize')\n \n console.log('[Uptrade] Registering sitemap entries...')\n \n try {\n const result = await registerLocalSitemap({\n autoDiscover,\n optimize_meta: !skipOptimize,\n })\n \n if (result.success) {\n console.log(`[Uptrade] ✓ Sitemap registered successfully`)\n console.log(`[Uptrade] Created: ${result.created}`)\n console.log(`[Uptrade] Updated: ${result.updated}`)\n if (result.removed !== undefined && result.removed > 0) {\n console.log(`[Uptrade] Removed: ${result.removed}`)\n }\n if (result.meta_optimization?.triggered) {\n console.log(`[Uptrade] ✓ Signal AI meta optimization triggered for ${result.meta_optimization.pages_queued} pages`)\n console.log(`[Uptrade] (Running in background - check Portal SEO module for results)`)\n }\n process.exit(0)\n } else {\n console.error('[Uptrade] ✗ Failed to register sitemap')\n process.exit(1)\n }\n } catch (error) {\n console.error('[Uptrade] ✗ Error:', error)\n process.exit(1)\n }\n}\n\nmain()\n"]}
|
|
@@ -1,7 +1,111 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { registerLocalSitemap } from '../chunk-WG2SI2UN.mjs';
|
|
3
|
-
import '../chunk-MLY7AWHG.mjs';
|
|
4
2
|
import '../chunk-4XPGGLVP.mjs';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
|
|
6
|
+
function getApiConfig() {
|
|
7
|
+
const apiUrl = process.env.UPTRADE_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.uptrademedia.com";
|
|
8
|
+
const apiKey = process.env.UPTRADE_API_KEY || process.env.NEXT_PUBLIC_UPTRADE_API_KEY || "";
|
|
9
|
+
return { apiUrl, apiKey };
|
|
10
|
+
}
|
|
11
|
+
function discoverNextJsRoutes(appDir, basePath = "") {
|
|
12
|
+
const entries = [];
|
|
13
|
+
const items = fs.readdirSync(appDir, { withFileTypes: true });
|
|
14
|
+
for (const item of items) {
|
|
15
|
+
if (item.name.startsWith("_") || item.name.startsWith(".")) continue;
|
|
16
|
+
if (item.name === "api") continue;
|
|
17
|
+
if (item.name === "node_modules") continue;
|
|
18
|
+
const itemPath = path.join(appDir, item.name);
|
|
19
|
+
if (item.isDirectory()) {
|
|
20
|
+
const hasPage = fs.existsSync(path.join(itemPath, "page.tsx")) || fs.existsSync(path.join(itemPath, "page.js")) || fs.existsSync(path.join(itemPath, "page.jsx"));
|
|
21
|
+
const isRouteGroup = item.name.startsWith("(") && item.name.endsWith(")");
|
|
22
|
+
const isDynamic = item.name.startsWith("[") && item.name.endsWith("]");
|
|
23
|
+
let routePath = basePath;
|
|
24
|
+
if (!isRouteGroup && !isDynamic) {
|
|
25
|
+
routePath = `${basePath}/${item.name}`;
|
|
26
|
+
}
|
|
27
|
+
if (hasPage && !isDynamic) {
|
|
28
|
+
const priority = routePath === "" ? 1 : 0.8;
|
|
29
|
+
entries.push({ path: routePath || "/", priority });
|
|
30
|
+
}
|
|
31
|
+
if (!isDynamic) {
|
|
32
|
+
const subEntries = discoverNextJsRoutes(
|
|
33
|
+
itemPath,
|
|
34
|
+
isRouteGroup ? basePath : routePath
|
|
35
|
+
);
|
|
36
|
+
entries.push(...subEntries);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (basePath === "") {
|
|
41
|
+
const hasRootPage = fs.existsSync(path.join(appDir, "page.tsx")) || fs.existsSync(path.join(appDir, "page.js")) || fs.existsSync(path.join(appDir, "page.jsx"));
|
|
42
|
+
if (hasRootPage) {
|
|
43
|
+
entries.unshift({ path: "/", priority: 1 });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return entries;
|
|
47
|
+
}
|
|
48
|
+
async function registerSitemapViaApi(entries, optimizeMeta) {
|
|
49
|
+
const { apiUrl, apiKey } = getApiConfig();
|
|
50
|
+
if (!apiKey) {
|
|
51
|
+
console.warn("[Uptrade] No API key (UPTRADE_API_KEY or NEXT_PUBLIC_UPTRADE_API_KEY)");
|
|
52
|
+
return { success: false, created: 0, updated: 0 };
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {
|
|
56
|
+
method: "POST",
|
|
57
|
+
headers: {
|
|
58
|
+
"Content-Type": "application/json",
|
|
59
|
+
"x-api-key": apiKey
|
|
60
|
+
},
|
|
61
|
+
body: JSON.stringify({ entries, optimize_meta: optimizeMeta })
|
|
62
|
+
});
|
|
63
|
+
if (!response.ok) {
|
|
64
|
+
console.error(`[Uptrade] Sitemap registration failed: ${response.status} ${response.statusText}`);
|
|
65
|
+
return { success: false, created: 0, updated: 0 };
|
|
66
|
+
}
|
|
67
|
+
return await response.json();
|
|
68
|
+
} catch (error) {
|
|
69
|
+
console.error("[Uptrade] Sitemap registration error:", error);
|
|
70
|
+
return { success: false, created: 0, updated: 0 };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async function registerLocalSitemap(options) {
|
|
74
|
+
let entries = options.entries || [];
|
|
75
|
+
if (options.autoDiscover && entries.length === 0) {
|
|
76
|
+
const cwd = process.cwd();
|
|
77
|
+
const appDirs = [
|
|
78
|
+
path.join(cwd, "app"),
|
|
79
|
+
path.join(cwd, "src", "app")
|
|
80
|
+
];
|
|
81
|
+
for (const appDir of appDirs) {
|
|
82
|
+
if (fs.existsSync(appDir)) {
|
|
83
|
+
entries = discoverNextJsRoutes(appDir);
|
|
84
|
+
console.log(`[Uptrade] Auto-discovered ${entries.length} routes from ${path.relative(cwd, appDir)}`);
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (entries.length === 0) {
|
|
90
|
+
console.warn("[Uptrade] No sitemap entries to register");
|
|
91
|
+
return { success: true, created: 0, updated: 0 };
|
|
92
|
+
}
|
|
93
|
+
console.log(`[Uptrade] Registering ${entries.length} sitemap entries...`);
|
|
94
|
+
const payload = entries.map((e) => ({
|
|
95
|
+
path: e.path,
|
|
96
|
+
title: e.title,
|
|
97
|
+
priority: e.priority,
|
|
98
|
+
changefreq: e.changefreq
|
|
99
|
+
}));
|
|
100
|
+
const result = await registerSitemapViaApi(
|
|
101
|
+
payload,
|
|
102
|
+
options.optimize_meta !== false
|
|
103
|
+
);
|
|
104
|
+
if (result.success) {
|
|
105
|
+
console.log(`[Uptrade] Sitemap registered: ${result.created} new, ${result.updated} updated`);
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
5
109
|
|
|
6
110
|
// src/seo/register-sitemap-cli.ts
|
|
7
111
|
async function main() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/seo/register-sitemap-cli.ts"],"names":[],"mappings":";;;;;;AAmBA,eAAe,IAAA,GAAO;AACpB,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACjC,EAAA,MAAM,eAAe,IAAA,CAAK,QAAA,CAAS,iBAAiB,CAAA,IAAK,IAAA,CAAK,SAAS,IAAI,CAAA;AAC3E,EAAA,MAAM,eAAe,IAAA,CAAK,QAAA,CAAS,eAAe,CAAA,IAAK,IAAA,CAAK,SAAS,iBAAiB,CAAA;AAEtF,EAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AAEtD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB;AAAA,MACxC,YAAA;AAAA,MACA,eAAe,CAAC;AAAA,KACjB,CAAA;AAED,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,OAAA,CAAQ,IAAI,CAAA,gDAAA,CAA6C,CAAA;AACzD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AACpD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AACpD,MAAA,IAAI,MAAA,CAAO,OAAA,KAAY,KAAA,CAAA,IAAa,MAAA,CAAO,UAAU,CAAA,EAAG;AACtD,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,MACtD;AACA,MAAA,IAAI,MAAA,CAAO,mBAAmB,SAAA,EAAW;AACvC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2DAAA,EAAyD,MAAA,CAAO,iBAAA,CAAkB,YAAY,CAAA,MAAA,CAAQ,CAAA;AAClH,QAAA,OAAA,CAAQ,IAAI,CAAA,yEAAA,CAA2E,CAAA;AAAA,MACzF;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAM,6CAAwC,CAAA;AACtD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,2BAAsB,KAAK,CAAA;AACzC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;AAEA,IAAA,EAAK","file":"register-sitemap-cli.mjs","sourcesContent":["#!/usr/bin/env node\n/**\n * CLI script to register sitemap entries at build time\n * \n * Usage:\n * npx uptrade-register-sitemap\n * npx uptrade-register-sitemap --auto-discover\n * npx uptrade-register-sitemap --no-optimize # Skip Signal AI meta optimization\n * \n * Or in package.json:\n * {\n * \"scripts\": {\n * \"postbuild\": \"uptrade-register-sitemap --auto-discover\"\n * }\n * }\n */\n\nimport { registerLocalSitemap } from './routing'\n\nasync function main() {\n const args = process.argv.slice(2)\n const autoDiscover = args.includes('--auto-discover') || args.includes('-a')\n const skipOptimize = args.includes('--no-optimize') || args.includes('--skip-optimize')\n \n console.log('[Uptrade] Registering sitemap entries...')\n \n try {\n const result = await registerLocalSitemap({\n autoDiscover,\n optimize_meta: !skipOptimize,\n })\n \n if (result.success) {\n console.log(`[Uptrade] ✓ Sitemap registered successfully`)\n console.log(`[Uptrade] Created: ${result.created}`)\n console.log(`[Uptrade] Updated: ${result.updated}`)\n if (result.removed !== undefined && result.removed > 0) {\n console.log(`[Uptrade] Removed: ${result.removed}`)\n }\n if (result.meta_optimization?.triggered) {\n console.log(`[Uptrade] ✓ Signal AI meta optimization triggered for ${result.meta_optimization.pages_queued} pages`)\n console.log(`[Uptrade] (Running in background - check Portal SEO module for results)`)\n }\n process.exit(0)\n } else {\n console.error('[Uptrade] ✗ Failed to register sitemap')\n process.exit(1)\n }\n } catch (error) {\n console.error('[Uptrade] ✗ Error:', error)\n process.exit(1)\n }\n}\n\nmain()\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/seo/register-sitemap-cli-impl.ts","../../src/seo/register-sitemap-cli.ts"],"names":[],"mappings":"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","file":"register-sitemap-cli.mjs","sourcesContent":["/**\n * Standalone implementation for uptrade-register-sitemap CLI.\n * Does NOT import from server-api or routing, so it can run in Node without\n * pulling in server-only (which throws when required outside Next.js server context).\n */\n\nimport fs from 'fs'\nimport path from 'path'\n\nfunction getApiConfig(): { apiUrl: string; apiKey: string } {\n const apiUrl =\n process.env.UPTRADE_API_URL ||\n process.env.NEXT_PUBLIC_UPTRADE_API_URL ||\n 'https://api.uptrademedia.com'\n const apiKey =\n process.env.UPTRADE_API_KEY ||\n process.env.NEXT_PUBLIC_UPTRADE_API_KEY ||\n ''\n return { apiUrl, apiKey }\n}\n\nfunction discoverNextJsRoutes(\n appDir: string,\n basePath: string = ''\n): Array<{ path: string; priority: number }> {\n const entries: Array<{ path: string; priority: number }> = []\n\n const items = fs.readdirSync(appDir, { withFileTypes: true })\n\n for (const item of items) {\n if (item.name.startsWith('_') || item.name.startsWith('.')) continue\n if (item.name === 'api') continue\n if (item.name === 'node_modules') continue\n\n const itemPath = path.join(appDir, item.name)\n\n if (item.isDirectory()) {\n const hasPage =\n fs.existsSync(path.join(itemPath, 'page.tsx')) ||\n fs.existsSync(path.join(itemPath, 'page.js')) ||\n fs.existsSync(path.join(itemPath, 'page.jsx'))\n\n const isRouteGroup = item.name.startsWith('(') && item.name.endsWith(')')\n const isDynamic = item.name.startsWith('[') && item.name.endsWith(']')\n\n let routePath = basePath\n if (!isRouteGroup && !isDynamic) {\n routePath = `${basePath}/${item.name}`\n }\n\n if (hasPage && !isDynamic) {\n const priority = routePath === '' ? 1.0 : 0.8\n entries.push({ path: routePath || '/', priority })\n }\n\n if (!isDynamic) {\n const subEntries = discoverNextJsRoutes(\n itemPath,\n isRouteGroup ? basePath : routePath\n )\n entries.push(...subEntries)\n }\n }\n }\n\n if (basePath === '') {\n const hasRootPage =\n fs.existsSync(path.join(appDir, 'page.tsx')) ||\n fs.existsSync(path.join(appDir, 'page.js')) ||\n fs.existsSync(path.join(appDir, 'page.jsx'))\n if (hasRootPage) {\n entries.unshift({ path: '/', priority: 1.0 })\n }\n }\n\n return entries\n}\n\nasync function registerSitemapViaApi(\n entries: Array<{\n path: string\n title?: string\n priority?: number\n changefreq?: string\n }>,\n optimizeMeta: boolean\n): Promise<{\n success: boolean\n created: number\n updated: number\n removed?: number\n meta_optimization?: { triggered: boolean; pages_queued: number } | null\n}> {\n const { apiUrl, apiKey } = getApiConfig()\n if (!apiKey) {\n console.warn('[Uptrade] No API key (UPTRADE_API_KEY or NEXT_PUBLIC_UPTRADE_API_KEY)')\n return { success: false, created: 0, updated: 0 }\n }\n\n try {\n const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ entries, optimize_meta: optimizeMeta }),\n })\n\n if (!response.ok) {\n console.error(`[Uptrade] Sitemap registration failed: ${response.status} ${response.statusText}`)\n return { success: false, created: 0, updated: 0 }\n }\n\n return await response.json()\n } catch (error) {\n console.error('[Uptrade] Sitemap registration error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\nexport type RegisterLocalSitemapOptions = {\n entries?: Array<{\n path: string\n title?: string\n priority?: number\n changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n }>\n autoDiscover?: boolean\n optimize_meta?: boolean\n}\n\nexport type RegisterLocalSitemapResult = {\n success: boolean\n created: number\n updated: number\n removed?: number\n meta_optimization?: {\n triggered: boolean\n pages_queued: number\n } | null\n}\n\nexport async function registerLocalSitemap(\n options: RegisterLocalSitemapOptions\n): Promise<RegisterLocalSitemapResult> {\n let entries = options.entries || []\n\n if (options.autoDiscover && entries.length === 0) {\n const cwd = process.cwd()\n const appDirs = [\n path.join(cwd, 'app'),\n path.join(cwd, 'src', 'app'),\n ]\n for (const appDir of appDirs) {\n if (fs.existsSync(appDir)) {\n entries = discoverNextJsRoutes(appDir)\n console.log(`[Uptrade] Auto-discovered ${entries.length} routes from ${path.relative(cwd, appDir)}`)\n break\n }\n }\n }\n\n if (entries.length === 0) {\n console.warn('[Uptrade] No sitemap entries to register')\n return { success: true, created: 0, updated: 0 }\n }\n\n console.log(`[Uptrade] Registering ${entries.length} sitemap entries...`)\n const payload = entries.map((e) => ({\n path: e.path,\n title: e.title,\n priority: e.priority,\n changefreq: e.changefreq,\n }))\n const result = await registerSitemapViaApi(\n payload,\n options.optimize_meta !== false\n )\n\n if (result.success) {\n console.log(`[Uptrade] Sitemap registered: ${result.created} new, ${result.updated} updated`)\n }\n\n return result\n}\n","#!/usr/bin/env node\n/**\n * CLI script to register sitemap entries at build time\n * \n * Usage:\n * npx uptrade-register-sitemap\n * npx uptrade-register-sitemap --auto-discover\n * npx uptrade-register-sitemap --no-optimize # Skip Signal AI meta optimization\n * \n * Or in package.json:\n * {\n * \"scripts\": {\n * \"postbuild\": \"uptrade-register-sitemap --auto-discover\"\n * }\n * }\n */\n\nimport { registerLocalSitemap } from './register-sitemap-cli-impl'\n\nasync function main() {\n const args = process.argv.slice(2)\n const autoDiscover = args.includes('--auto-discover') || args.includes('-a')\n const skipOptimize = args.includes('--no-optimize') || args.includes('--skip-optimize')\n \n console.log('[Uptrade] Registering sitemap entries...')\n \n try {\n const result = await registerLocalSitemap({\n autoDiscover,\n optimize_meta: !skipOptimize,\n })\n \n if (result.success) {\n console.log(`[Uptrade] ✓ Sitemap registered successfully`)\n console.log(`[Uptrade] Created: ${result.created}`)\n console.log(`[Uptrade] Updated: ${result.updated}`)\n if (result.removed !== undefined && result.removed > 0) {\n console.log(`[Uptrade] Removed: ${result.removed}`)\n }\n if (result.meta_optimization?.triggered) {\n console.log(`[Uptrade] ✓ Signal AI meta optimization triggered for ${result.meta_optimization.pages_queued} pages`)\n console.log(`[Uptrade] (Running in background - check Portal SEO module for results)`)\n }\n process.exit(0)\n } else {\n console.error('[Uptrade] ✗ Failed to register sitemap')\n process.exit(1)\n }\n } catch (error) {\n console.error('[Uptrade] ✗ Error:', error)\n process.exit(1)\n }\n}\n\nmain()\n"]}
|
package/dist/setup/client.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var chunkDRFTRTKV_js = require('../chunk-DRFTRTKV.js');
|
|
5
|
-
var
|
|
5
|
+
var chunkY4BW6XYJ_js = require('../chunk-Y4BW6XYJ.js');
|
|
6
6
|
require('../chunk-ZSMWDLMK.js');
|
|
7
7
|
|
|
8
8
|
|
|
@@ -21,11 +21,11 @@ Object.defineProperty(exports, "getSnippetsByModule", {
|
|
|
21
21
|
});
|
|
22
22
|
Object.defineProperty(exports, "SetupWizard", {
|
|
23
23
|
enumerable: true,
|
|
24
|
-
get: function () { return
|
|
24
|
+
get: function () { return chunkY4BW6XYJ_js.SetupWizard; }
|
|
25
25
|
});
|
|
26
26
|
Object.defineProperty(exports, "UptradeSetup", {
|
|
27
27
|
enumerable: true,
|
|
28
|
-
get: function () { return
|
|
28
|
+
get: function () { return chunkY4BW6XYJ_js.SetupWizard; }
|
|
29
29
|
});
|
|
30
30
|
//# sourceMappingURL=client.js.map
|
|
31
31
|
//# sourceMappingURL=client.js.map
|
package/dist/setup/client.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
export { IntegrationCodeView, generateIntegrationCode, getSnippetsByModule } from '../chunk-EL5QTAA3.mjs';
|
|
3
|
-
export { SetupWizard, SetupWizard as UptradeSetup } from '../chunk-
|
|
3
|
+
export { SetupWizard, SetupWizard as UptradeSetup } from '../chunk-X66VOCWP.mjs';
|
|
4
4
|
import '../chunk-4XPGGLVP.mjs';
|
|
5
5
|
//# sourceMappingURL=client.mjs.map
|
|
6
6
|
//# sourceMappingURL=client.mjs.map
|
package/dist/setup/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var chunkDRFTRTKV_js = require('../chunk-DRFTRTKV.js');
|
|
4
4
|
var chunkKBS3KW2U_js = require('../chunk-KBS3KW2U.js');
|
|
5
|
-
var
|
|
5
|
+
var chunkY4BW6XYJ_js = require('../chunk-Y4BW6XYJ.js');
|
|
6
6
|
require('../chunk-ZSMWDLMK.js');
|
|
7
7
|
|
|
8
8
|
|
|
@@ -25,11 +25,11 @@ Object.defineProperty(exports, "handleRequest", {
|
|
|
25
25
|
});
|
|
26
26
|
Object.defineProperty(exports, "SetupWizard", {
|
|
27
27
|
enumerable: true,
|
|
28
|
-
get: function () { return
|
|
28
|
+
get: function () { return chunkY4BW6XYJ_js.SetupWizard; }
|
|
29
29
|
});
|
|
30
30
|
Object.defineProperty(exports, "UptradeSetup", {
|
|
31
31
|
enumerable: true,
|
|
32
|
-
get: function () { return
|
|
32
|
+
get: function () { return chunkY4BW6XYJ_js.SetupWizard; }
|
|
33
33
|
});
|
|
34
34
|
//# sourceMappingURL=index.js.map
|
|
35
35
|
//# sourceMappingURL=index.js.map
|
package/dist/setup/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { IntegrationCodeView, generateIntegrationCode, getSnippetsByModule } from '../chunk-EL5QTAA3.mjs';
|
|
2
2
|
export { handleRequest } from '../chunk-IT6R5VAZ.mjs';
|
|
3
|
-
export { SetupWizard, SetupWizard as UptradeSetup } from '../chunk-
|
|
3
|
+
export { SetupWizard, SetupWizard as UptradeSetup } from '../chunk-X66VOCWP.mjs';
|
|
4
4
|
import '../chunk-4XPGGLVP.mjs';
|
|
5
5
|
//# sourceMappingURL=index.mjs.map
|
|
6
6
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -57,6 +57,8 @@ interface FormField {
|
|
|
57
57
|
options?: FieldOption[];
|
|
58
58
|
/** Validation */
|
|
59
59
|
is_required: boolean;
|
|
60
|
+
/** When true, label is hidden and used as placeholder (e.g. subscribe forms) */
|
|
61
|
+
hide_label?: boolean;
|
|
60
62
|
validation?: ValidationRules;
|
|
61
63
|
/** Conditional logic */
|
|
62
64
|
conditional?: ConditionalLogic;
|
|
@@ -57,6 +57,8 @@ interface FormField {
|
|
|
57
57
|
options?: FieldOption[];
|
|
58
58
|
/** Validation */
|
|
59
59
|
is_required: boolean;
|
|
60
|
+
/** When true, label is hidden and used as placeholder (e.g. subscribe forms) */
|
|
61
|
+
hide_label?: boolean;
|
|
60
62
|
validation?: ValidationRules;
|
|
61
63
|
/** Conditional logic */
|
|
62
64
|
conditional?: ConditionalLogic;
|
|
@@ -157,9 +157,8 @@ interface ChatConfig {
|
|
|
157
157
|
buttonIcon?: 'chat' | 'help' | 'custom';
|
|
158
158
|
buttonColor?: string;
|
|
159
159
|
buttonText?: string;
|
|
160
|
-
/** Brand
|
|
160
|
+
/** Brand primary color */
|
|
161
161
|
brandPrimary?: string;
|
|
162
|
-
brandSecondary?: string;
|
|
163
162
|
/** Welcome message */
|
|
164
163
|
welcomeMessage?: string;
|
|
165
164
|
/** Operating hours */
|
|
@@ -157,9 +157,8 @@ interface ChatConfig {
|
|
|
157
157
|
buttonIcon?: 'chat' | 'help' | 'custom';
|
|
158
158
|
buttonColor?: string;
|
|
159
159
|
buttonText?: string;
|
|
160
|
-
/** Brand
|
|
160
|
+
/** Brand primary color */
|
|
161
161
|
brandPrimary?: string;
|
|
162
|
-
brandSecondary?: string;
|
|
163
162
|
/** Welcome message */
|
|
164
163
|
welcomeMessage?: string;
|
|
165
164
|
/** Operating hours */
|
package/package.json
CHANGED