@sonordev/site-kit 4.2.0 → 4.2.3
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/agent-manifest.json +1 -1
- package/dist/AnalyticsProvider-NW3UZYL5.mjs +10 -0
- package/dist/{AnalyticsProvider-QD7H2FER.mjs.map → AnalyticsProvider-NW3UZYL5.mjs.map} +1 -1
- package/dist/AnalyticsProvider-VSTTYP4W.js +31 -0
- package/dist/{AnalyticsProvider-JTAJ27EC.js.map → AnalyticsProvider-VSTTYP4W.js.map} +1 -1
- package/dist/ChatWidget-BJOE2OSI.js +20 -0
- package/dist/{ChatWidget-7UV4LXJR.js.map → ChatWidget-BJOE2OSI.js.map} +1 -1
- package/dist/ChatWidget-EWQ7LRD4.mjs +11 -0
- package/dist/{ChatWidget-BS6STWYV.mjs.map → ChatWidget-EWQ7LRD4.mjs.map} +1 -1
- package/dist/EngageWidget-CZMNLFWI.js +18 -0
- package/dist/{EngageWidget-AQOTCO46.js.map → EngageWidget-CZMNLFWI.js.map} +1 -1
- package/dist/EngageWidget-F427CI6Y.mjs +9 -0
- package/dist/{EngageWidget-M7MZXPC4.mjs.map → EngageWidget-F427CI6Y.mjs.map} +1 -1
- package/dist/{FileField-VIYBV4GM.mjs → FileField-5RVBU3Z4.mjs} +5 -5
- package/dist/{FileField-VIYBV4GM.mjs.map → FileField-5RVBU3Z4.mjs.map} +1 -1
- package/dist/{FileField-JIWKVY73.js → FileField-Y4ZA7DST.js} +6 -6
- package/dist/{FileField-JIWKVY73.js.map → FileField-Y4ZA7DST.js.map} +1 -1
- package/dist/{FormSpotlight-7P3JV3XK.mjs → FormSpotlight-CJPI2MRJ.mjs} +3 -3
- package/dist/{FormSpotlight-7P3JV3XK.mjs.map → FormSpotlight-CJPI2MRJ.mjs.map} +1 -1
- package/dist/{FormSpotlight-MSBWEM3F.js → FormSpotlight-MAEV6SZK.js} +15 -15
- package/dist/{FormSpotlight-MSBWEM3F.js.map → FormSpotlight-MAEV6SZK.js.map} +1 -1
- package/dist/{FormStage-FME3O3N2.js → FormStage-D42NAHSN.js} +13 -13
- package/dist/{FormStage-FME3O3N2.js.map → FormStage-D42NAHSN.js.map} +1 -1
- package/dist/{FormStage-327WGVBM.mjs → FormStage-Z7WW3DNA.mjs} +3 -3
- package/dist/{FormStage-327WGVBM.mjs.map → FormStage-Z7WW3DNA.mjs.map} +1 -1
- package/dist/ManagedForm-A7BROQIN.mjs +14 -0
- package/dist/{ManagedForm-BFZWPWGY.mjs.map → ManagedForm-A7BROQIN.mjs.map} +1 -1
- package/dist/ManagedForm-Z3Z5Z6OL.js +23 -0
- package/dist/{ManagedForm-5BXS3XKX.js.map → ManagedForm-Z3Z5Z6OL.js.map} +1 -1
- package/dist/{SignalCore-EE2RAGZ2.mjs → SignalCore-77UH6PZ4.mjs} +5 -5
- package/dist/{SignalCore-EE2RAGZ2.mjs.map → SignalCore-77UH6PZ4.mjs.map} +1 -1
- package/dist/{SignalCore-IPLGFFC3.js → SignalCore-NA6TJFVE.js} +11 -11
- package/dist/{SignalCore-IPLGFFC3.js.map → SignalCore-NA6TJFVE.js.map} +1 -1
- package/dist/SitemapSync-62F6HVAW.js +17 -0
- package/dist/{SitemapSync-XBYRZ7WH.js.map → SitemapSync-62F6HVAW.js.map} +1 -1
- package/dist/SitemapSync-EY33A6P4.mjs +8 -0
- package/dist/{SitemapSync-2X6NM3TX.mjs.map → SitemapSync-EY33A6P4.mjs.map} +1 -1
- package/dist/analytics/index.js +9 -9
- package/dist/analytics/index.mjs +4 -4
- package/dist/api-N5OLQXYN.js +202 -0
- package/dist/api-N5OLQXYN.js.map +1 -0
- package/dist/api-NTHZ6PAW.mjs +184 -0
- package/dist/api-NTHZ6PAW.mjs.map +1 -0
- package/dist/{chunk-NDASB3X3.js → chunk-2XRGCDDG.js} +9 -9
- package/dist/{chunk-NDASB3X3.js.map → chunk-2XRGCDDG.js.map} +1 -1
- package/dist/{chunk-GXABJJ4F.js → chunk-3DSGMX7P.js} +3 -3
- package/dist/{chunk-GXABJJ4F.js.map → chunk-3DSGMX7P.js.map} +1 -1
- package/dist/{chunk-57IFVXCB.mjs → chunk-3P4HJAZA.mjs} +4 -4
- package/dist/{chunk-57IFVXCB.mjs.map → chunk-3P4HJAZA.mjs.map} +1 -1
- package/dist/{chunk-4HNFMOYE.mjs → chunk-535HXGDU.mjs} +3 -3
- package/dist/{chunk-4HNFMOYE.mjs.map → chunk-535HXGDU.mjs.map} +1 -1
- package/dist/{chunk-OO4T5X4Z.mjs → chunk-6D3HZKTZ.mjs} +3 -3
- package/dist/{chunk-OO4T5X4Z.mjs.map → chunk-6D3HZKTZ.mjs.map} +1 -1
- package/dist/{chunk-XOSAVYAI.js → chunk-7BVZLSUJ.js} +8 -8
- package/dist/{chunk-XOSAVYAI.js.map → chunk-7BVZLSUJ.js.map} +1 -1
- package/dist/{chunk-4PP4D3TF.js → chunk-BN4AL7XB.js} +4 -4
- package/dist/{chunk-4PP4D3TF.js.map → chunk-BN4AL7XB.js.map} +1 -1
- package/dist/{chunk-XZCZCND2.mjs → chunk-DZUOLOYS.mjs} +3 -3
- package/dist/{chunk-XZCZCND2.mjs.map → chunk-DZUOLOYS.mjs.map} +1 -1
- package/dist/{chunk-MTXQG3TX.mjs → chunk-EHNUPEFY.mjs} +18 -8
- package/dist/chunk-EHNUPEFY.mjs.map +1 -0
- package/dist/{chunk-CMIFYDKA.mjs → chunk-FZAAQE4Y.mjs} +4 -4
- package/dist/{chunk-CMIFYDKA.mjs.map → chunk-FZAAQE4Y.mjs.map} +1 -1
- package/dist/{chunk-S2C3QU4E.js → chunk-GDMOAGVS.js} +29 -19
- package/dist/chunk-GDMOAGVS.js.map +1 -0
- package/dist/{chunk-WLVS4QBK.js → chunk-GJKO2TZN.js} +4 -4
- package/dist/{chunk-WLVS4QBK.js.map → chunk-GJKO2TZN.js.map} +1 -1
- package/dist/{chunk-DQO4UKFE.mjs → chunk-HTLWSCUQ.mjs} +76 -4
- package/dist/chunk-HTLWSCUQ.mjs.map +1 -0
- package/dist/{chunk-VTFDE7H2.js → chunk-HVDKAR77.js} +7 -7
- package/dist/{chunk-VTFDE7H2.js.map → chunk-HVDKAR77.js.map} +1 -1
- package/dist/{chunk-UKFBG6FV.mjs → chunk-I7ORAWYT.mjs} +3 -3
- package/dist/{chunk-UKFBG6FV.mjs.map → chunk-I7ORAWYT.mjs.map} +1 -1
- package/dist/{chunk-SDBUPTF4.mjs → chunk-INA4NW3Y.mjs} +3 -3
- package/dist/{chunk-SDBUPTF4.mjs.map → chunk-INA4NW3Y.mjs.map} +1 -1
- package/dist/{chunk-DNEUGYTE.mjs → chunk-J6HWSJT7.mjs} +3 -3
- package/dist/{chunk-DNEUGYTE.mjs.map → chunk-J6HWSJT7.mjs.map} +1 -1
- package/dist/{chunk-VOMAEC5G.js → chunk-JJDY5XXG.js} +3 -3
- package/dist/{chunk-VOMAEC5G.js.map → chunk-JJDY5XXG.js.map} +1 -1
- package/dist/{chunk-MZZQHGXY.mjs → chunk-KL4MV6HK.mjs} +3 -3
- package/dist/{chunk-MZZQHGXY.mjs.map → chunk-KL4MV6HK.mjs.map} +1 -1
- package/dist/{chunk-JWIJZQYI.js → chunk-M2SEYO5J.js} +5 -5
- package/dist/{chunk-JWIJZQYI.js.map → chunk-M2SEYO5J.js.map} +1 -1
- package/dist/{chunk-FFQAKIV5.js → chunk-MF6XLEX5.js} +15 -15
- package/dist/{chunk-FFQAKIV5.js.map → chunk-MF6XLEX5.js.map} +1 -1
- package/dist/{chunk-7UCKV4WA.js → chunk-MP7ZYKMM.js} +8 -8
- package/dist/{chunk-7UCKV4WA.js.map → chunk-MP7ZYKMM.js.map} +1 -1
- package/dist/{chunk-INW43FWV.js → chunk-N5RTJNMN.js} +6 -6
- package/dist/{chunk-INW43FWV.js.map → chunk-N5RTJNMN.js.map} +1 -1
- package/dist/{chunk-QNEBWBZ4.js → chunk-NEIUWAAL.js} +5 -5
- package/dist/{chunk-QNEBWBZ4.js.map → chunk-NEIUWAAL.js.map} +1 -1
- package/dist/{chunk-Z7HAQTWP.js → chunk-OHA43BNK.js} +14 -14
- package/dist/{chunk-Z7HAQTWP.js.map → chunk-OHA43BNK.js.map} +1 -1
- package/dist/{chunk-TGGSXT3F.mjs → chunk-PTZB4ES3.mjs} +9 -9
- package/dist/chunk-PTZB4ES3.mjs.map +1 -0
- package/dist/{chunk-FMAEUQEZ.js → chunk-QJK2X3UK.js} +97 -28
- package/dist/chunk-QJK2X3UK.js.map +1 -0
- package/dist/{chunk-VGPZ4PCZ.mjs → chunk-RCRDDMUO.mjs} +3 -3
- package/dist/{chunk-VGPZ4PCZ.mjs.map → chunk-RCRDDMUO.mjs.map} +1 -1
- package/dist/{chunk-IWFP2FQ5.js → chunk-RDISSFEH.js} +15 -15
- package/dist/{chunk-IWFP2FQ5.js.map → chunk-RDISSFEH.js.map} +1 -1
- package/dist/{chunk-R6LQRHPQ.mjs → chunk-RRR6Y6Y5.mjs} +4 -4
- package/dist/{chunk-R6LQRHPQ.mjs.map → chunk-RRR6Y6Y5.mjs.map} +1 -1
- package/dist/chunk-S5L73KZQ.js +8 -0
- package/dist/{chunk-CBN73TLK.js.map → chunk-S5L73KZQ.js.map} +1 -1
- package/dist/{chunk-AVWIKVVE.js → chunk-S5UATBC7.js} +14 -14
- package/dist/{chunk-AVWIKVVE.js.map → chunk-S5UATBC7.js.map} +1 -1
- package/dist/{chunk-PKQVV6LW.js → chunk-SAR473OC.js} +13 -13
- package/dist/chunk-SAR473OC.js.map +1 -0
- package/dist/{chunk-DYDAV4Y4.mjs → chunk-SL6ZGJVN.mjs} +4 -4
- package/dist/{chunk-DYDAV4Y4.mjs.map → chunk-SL6ZGJVN.mjs.map} +1 -1
- package/dist/{chunk-WFCRXUNA.mjs → chunk-T3HGONNE.mjs} +4 -4
- package/dist/{chunk-WFCRXUNA.mjs.map → chunk-T3HGONNE.mjs.map} +1 -1
- package/dist/{chunk-WCIQKO7W.mjs → chunk-T6T5IQMN.mjs} +3 -3
- package/dist/{chunk-WCIQKO7W.mjs.map → chunk-T6T5IQMN.mjs.map} +1 -1
- package/dist/{chunk-XXBVF7WN.mjs → chunk-TFAYDIWM.mjs} +3 -3
- package/dist/{chunk-XXBVF7WN.mjs.map → chunk-TFAYDIWM.mjs.map} +1 -1
- package/dist/{chunk-A5FJZWGY.mjs → chunk-TKVADZFD.mjs} +4 -4
- package/dist/{chunk-A5FJZWGY.mjs.map → chunk-TKVADZFD.mjs.map} +1 -1
- package/dist/{chunk-UDPUBSSS.mjs → chunk-UDNXM6RB.mjs} +3 -3
- package/dist/{chunk-UDPUBSSS.mjs.map → chunk-UDNXM6RB.mjs.map} +1 -1
- package/dist/{chunk-HLCCE7BD.js → chunk-WCTOQFAN.js} +14 -14
- package/dist/{chunk-HLCCE7BD.js.map → chunk-WCTOQFAN.js.map} +1 -1
- package/dist/{chunk-KFDFXRBE.js → chunk-XA7RBHKT.js} +4 -4
- package/dist/{chunk-KFDFXRBE.js.map → chunk-XA7RBHKT.js.map} +1 -1
- package/dist/chunk-XCFCG46K.mjs +6 -0
- package/dist/{chunk-LS64Y25E.mjs.map → chunk-XCFCG46K.mjs.map} +1 -1
- package/dist/{chunk-4YWGUQPU.js → chunk-XOJYGBYF.js} +3 -3
- package/dist/{chunk-4YWGUQPU.js.map → chunk-XOJYGBYF.js.map} +1 -1
- package/dist/{chunk-DSECSIWJ.mjs → chunk-XR3MDDQT.mjs} +3 -3
- package/dist/{chunk-DSECSIWJ.mjs.map → chunk-XR3MDDQT.mjs.map} +1 -1
- package/dist/{chunk-HI6DVYVN.mjs → chunk-XWFUQMU6.mjs} +3 -3
- package/dist/{chunk-HI6DVYVN.mjs.map → chunk-XWFUQMU6.mjs.map} +1 -1
- package/dist/{chunk-IV7LOJZO.js → chunk-YWXZ4YLU.js} +4 -4
- package/dist/{chunk-IV7LOJZO.js.map → chunk-YWXZ4YLU.js.map} +1 -1
- package/dist/{chunk-WCRBZZRI.mjs → chunk-ZASFY4NR.mjs} +89 -20
- package/dist/chunk-ZASFY4NR.mjs.map +1 -0
- package/dist/{chunk-6TAXXKMX.js → chunk-ZAVNGZJZ.js} +77 -3
- package/dist/chunk-ZAVNGZJZ.js.map +1 -0
- package/dist/cli/agent/checks.d.ts.map +1 -1
- package/dist/cli/commands/og.d.ts +46 -11
- package/dist/cli/commands/og.d.ts.map +1 -1
- package/dist/cli/index.js +516 -174
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +514 -172
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/index.js +4 -4
- package/dist/client/index.mjs +3 -3
- package/dist/commerce/index.js +56 -56
- package/dist/commerce/index.mjs +5 -5
- package/dist/engage/index.js +10 -10
- package/dist/engage/index.mjs +7 -7
- package/dist/fleet/index.js +8 -8
- package/dist/fleet/index.mjs +4 -4
- package/dist/forms/ManagedForm.d.ts.map +1 -1
- package/dist/forms/index.js +16 -16
- package/dist/forms/index.mjs +9 -9
- package/dist/forms/server.js +10 -10
- package/dist/forms/server.mjs +8 -8
- package/dist/forms/static.js +7 -7
- package/dist/forms/static.mjs +6 -6
- package/dist/forms/tracking-session.d.ts +63 -0
- package/dist/forms/tracking-session.d.ts.map +1 -0
- package/dist/forms/tracking-session.test.d.ts +22 -0
- package/dist/forms/tracking-session.test.d.ts.map +1 -0
- package/dist/forms/useForm.d.ts +11 -0
- package/dist/forms/useForm.d.ts.map +1 -1
- package/dist/forms/useFormTracking.d.ts +6 -1
- package/dist/forms/useFormTracking.d.ts.map +1 -1
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +4 -4
- package/dist/index.js +63 -63
- package/dist/index.mjs +9 -9
- package/dist/layout/SiteKitClientProviders.d.ts +7 -0
- package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
- package/dist/layout/SiteKitLayout.d.ts +18 -1
- package/dist/layout/SiteKitLayout.d.ts.map +1 -1
- package/dist/layout/client.d.ts +7 -0
- package/dist/layout/client.d.ts.map +1 -1
- package/dist/layout/client.js +8 -8
- package/dist/layout/client.mjs +7 -7
- package/dist/layout/index.js +11 -11
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/index.mjs +9 -9
- package/dist/layout/index.mjs.map +1 -1
- package/dist/maps/index.js +5 -5
- package/dist/maps/index.mjs +3 -3
- package/dist/og/config.d.ts +36 -0
- package/dist/og/config.d.ts.map +1 -1
- package/dist/og/index.js +5 -5
- package/dist/og/index.mjs +1 -1
- package/dist/og/pages.d.ts +56 -0
- package/dist/og/pages.d.ts.map +1 -0
- package/dist/og/pages.test.d.ts +2 -0
- package/dist/og/pages.test.d.ts.map +1 -0
- package/dist/og/template.d.ts.map +1 -1
- package/dist/og/wiring.d.ts +56 -0
- package/dist/og/wiring.d.ts.map +1 -0
- package/dist/og/wiring.test.d.ts +2 -0
- package/dist/og/wiring.test.d.ts.map +1 -0
- package/dist/search/index.js +4 -4
- package/dist/search/index.mjs +3 -3
- package/dist/seo/client.js +5 -5
- package/dist/seo/client.mjs +4 -4
- package/dist/seo/index.js +5 -5
- package/dist/seo/index.mjs +4 -4
- package/dist/seo/register-sitemap-cli.js +1 -1
- package/dist/seo/register-sitemap-cli.mjs +1 -1
- package/dist/server/index.js +3 -3
- package/dist/server/index.mjs +2 -2
- package/dist/shared/version.d.ts +1 -1
- package/dist/signal/index.js +11 -11
- package/dist/signal/index.mjs +2 -2
- package/dist/sync/index.js +16 -16
- package/dist/sync/index.mjs +4 -4
- package/dist/types.d.ts +5 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/AnalyticsProvider-JTAJ27EC.js +0 -31
- package/dist/AnalyticsProvider-QD7H2FER.mjs +0 -10
- package/dist/ChatWidget-7UV4LXJR.js +0 -20
- package/dist/ChatWidget-BS6STWYV.mjs +0 -11
- package/dist/EngageWidget-AQOTCO46.js +0 -18
- package/dist/EngageWidget-M7MZXPC4.mjs +0 -9
- package/dist/ManagedForm-5BXS3XKX.js +0 -23
- package/dist/ManagedForm-BFZWPWGY.mjs +0 -14
- package/dist/SitemapSync-2X6NM3TX.mjs +0 -8
- package/dist/SitemapSync-XBYRZ7WH.js +0 -17
- package/dist/chunk-6TAXXKMX.js.map +0 -1
- package/dist/chunk-CBN73TLK.js +0 -8
- package/dist/chunk-DQO4UKFE.mjs.map +0 -1
- package/dist/chunk-FMAEUQEZ.js.map +0 -1
- package/dist/chunk-LS64Y25E.mjs +0 -6
- package/dist/chunk-MTXQG3TX.mjs.map +0 -1
- package/dist/chunk-PKQVV6LW.js.map +0 -1
- package/dist/chunk-S2C3QU4E.js.map +0 -1
- package/dist/chunk-TGGSXT3F.mjs.map +0 -1
- package/dist/chunk-WCRBZZRI.mjs.map +0 -1
package/dist/cli/index.js
CHANGED
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
|
|
4
4
|
var chunkJS75ORH7_js = require('../chunk-JS75ORH7.js');
|
|
5
5
|
var chunkI7AZC5ZQ_js = require('../chunk-I7AZC5ZQ.js');
|
|
6
|
-
var
|
|
6
|
+
var chunkZAVNGZJZ_js = require('../chunk-ZAVNGZJZ.js');
|
|
7
7
|
var chunkNN2YE5WT_js = require('../chunk-NN2YE5WT.js');
|
|
8
|
-
var
|
|
8
|
+
var chunkLOS5D6B3_js = require('../chunk-LOS5D6B3.js');
|
|
9
|
+
var chunkS5L73KZQ_js = require('../chunk-S5L73KZQ.js');
|
|
9
10
|
var chunkSNAQBZPT_js = require('../chunk-SNAQBZPT.js');
|
|
10
11
|
var events = require('events');
|
|
11
12
|
var childProcess = require('child_process');
|
|
@@ -6233,10 +6234,10 @@ var require_lib2 = chunkSNAQBZPT_js.__commonJS({
|
|
|
6233
6234
|
exports.analyse = analyse;
|
|
6234
6235
|
var detectFile = (filepath, opts = {}) => new Promise((resolve, reject) => {
|
|
6235
6236
|
let fd;
|
|
6236
|
-
const
|
|
6237
|
+
const fs27 = (0, node_1.default)();
|
|
6237
6238
|
const handler = (err, buffer) => {
|
|
6238
6239
|
if (fd) {
|
|
6239
|
-
|
|
6240
|
+
fs27.closeSync(fd);
|
|
6240
6241
|
}
|
|
6241
6242
|
if (err) {
|
|
6242
6243
|
reject(err);
|
|
@@ -6248,9 +6249,9 @@ var require_lib2 = chunkSNAQBZPT_js.__commonJS({
|
|
|
6248
6249
|
};
|
|
6249
6250
|
const sampleSize = (opts === null || opts === void 0 ? void 0 : opts.sampleSize) || 0;
|
|
6250
6251
|
if (sampleSize > 0) {
|
|
6251
|
-
fd =
|
|
6252
|
+
fd = fs27.openSync(filepath, "r");
|
|
6252
6253
|
let sample = Buffer.allocUnsafe(sampleSize);
|
|
6253
|
-
|
|
6254
|
+
fs27.read(fd, sample, 0, sampleSize, opts.offset, (err, bytesRead) => {
|
|
6254
6255
|
if (err) {
|
|
6255
6256
|
handler(err, null);
|
|
6256
6257
|
} else {
|
|
@@ -6262,22 +6263,22 @@ var require_lib2 = chunkSNAQBZPT_js.__commonJS({
|
|
|
6262
6263
|
});
|
|
6263
6264
|
return;
|
|
6264
6265
|
}
|
|
6265
|
-
|
|
6266
|
+
fs27.readFile(filepath, handler);
|
|
6266
6267
|
});
|
|
6267
6268
|
exports.detectFile = detectFile;
|
|
6268
6269
|
var detectFileSync = (filepath, opts = {}) => {
|
|
6269
|
-
const
|
|
6270
|
+
const fs27 = (0, node_1.default)();
|
|
6270
6271
|
if (opts && opts.sampleSize) {
|
|
6271
|
-
const fd =
|
|
6272
|
+
const fd = fs27.openSync(filepath, "r");
|
|
6272
6273
|
let sample = Buffer.allocUnsafe(opts.sampleSize);
|
|
6273
|
-
const bytesRead =
|
|
6274
|
+
const bytesRead = fs27.readSync(fd, sample, 0, opts.sampleSize, opts.offset);
|
|
6274
6275
|
if (bytesRead < opts.sampleSize) {
|
|
6275
6276
|
sample = sample.subarray(0, bytesRead);
|
|
6276
6277
|
}
|
|
6277
|
-
|
|
6278
|
+
fs27.closeSync(fd);
|
|
6278
6279
|
return (0, exports.detect)(sample);
|
|
6279
6280
|
}
|
|
6280
|
-
return (0, exports.detect)(
|
|
6281
|
+
return (0, exports.detect)(fs27.readFileSync(filepath));
|
|
6281
6282
|
};
|
|
6282
6283
|
exports.detectFileSync = detectFileSync;
|
|
6283
6284
|
exports.default = {
|
|
@@ -13267,9 +13268,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
13267
13268
|
* @param {string} [path]
|
|
13268
13269
|
* @return {(string|null|Command)}
|
|
13269
13270
|
*/
|
|
13270
|
-
executableDir(
|
|
13271
|
-
if (
|
|
13272
|
-
this._executableDir =
|
|
13271
|
+
executableDir(path27) {
|
|
13272
|
+
if (path27 === void 0) return this._executableDir;
|
|
13273
|
+
this._executableDir = path27;
|
|
13273
13274
|
return this;
|
|
13274
13275
|
}
|
|
13275
13276
|
/**
|
|
@@ -13542,7 +13543,7 @@ function buildEnvelope(input, nowMs = Date.now()) {
|
|
|
13542
13543
|
ok: exitCode === 0 /* OK */,
|
|
13543
13544
|
command,
|
|
13544
13545
|
schemaVersion: 1,
|
|
13545
|
-
siteKitVersion:
|
|
13546
|
+
siteKitVersion: chunkS5L73KZQ_js.SITE_KIT_VERSION,
|
|
13546
13547
|
exitCode,
|
|
13547
13548
|
status: statusForCode(exitCode),
|
|
13548
13549
|
summary,
|
|
@@ -20376,9 +20377,9 @@ function observableToAsyncIterable(source) {
|
|
|
20376
20377
|
|
|
20377
20378
|
// node_modules/.pnpm/inquirer@14.0.2_@types+node@26.2.0/node_modules/inquirer/dist/ui/prompt.js
|
|
20378
20379
|
var _ = {
|
|
20379
|
-
set: (obj,
|
|
20380
|
+
set: (obj, path27 = "", value) => {
|
|
20380
20381
|
let pointer = obj;
|
|
20381
|
-
|
|
20382
|
+
path27.split(".").forEach((key, index, arr) => {
|
|
20382
20383
|
if (key === "__proto__" || key === "constructor")
|
|
20383
20384
|
return;
|
|
20384
20385
|
if (index === arr.length - 1) {
|
|
@@ -20389,8 +20390,8 @@ var _ = {
|
|
|
20389
20390
|
pointer = pointer[key];
|
|
20390
20391
|
});
|
|
20391
20392
|
},
|
|
20392
|
-
get: (obj,
|
|
20393
|
-
const travel = (regexp) => String.prototype.split.call(
|
|
20393
|
+
get: (obj, path27 = "", defaultValue) => {
|
|
20394
|
+
const travel = (regexp) => String.prototype.split.call(path27, regexp).filter(Boolean).reduce(
|
|
20394
20395
|
// @ts-expect-error implicit any on res[key]
|
|
20395
20396
|
(res, key) => res == null ? res : res[key],
|
|
20396
20397
|
obj
|
|
@@ -20747,18 +20748,18 @@ function scanForForms(ast, content, filePath) {
|
|
|
20747
20748
|
const forms = [];
|
|
20748
20749
|
content.split("\n");
|
|
20749
20750
|
chunkJS75ORH7_js.traverse(ast, {
|
|
20750
|
-
JSXElement(
|
|
20751
|
-
const opening =
|
|
20751
|
+
JSXElement(path27) {
|
|
20752
|
+
const opening = path27.node.openingElement;
|
|
20752
20753
|
if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && opening.name.name === "form") {
|
|
20753
|
-
const fields = extractFieldsFromForm(
|
|
20754
|
+
const fields = extractFieldsFromForm(path27);
|
|
20754
20755
|
const hasOnSubmit = opening.attributes.some(
|
|
20755
20756
|
(attr) => chunkJS75ORH7_js.isJSXAttribute(attr) && chunkJS75ORH7_js.isJSXIdentifier(attr.name) && attr.name.name === "onSubmit"
|
|
20756
20757
|
);
|
|
20757
20758
|
if (hasOnSubmit && fields.length > 0) {
|
|
20758
|
-
const startLine =
|
|
20759
|
-
const endLine =
|
|
20759
|
+
const startLine = path27.node.loc?.start.line || 0;
|
|
20760
|
+
const endLine = path27.node.loc?.end.line || 0;
|
|
20760
20761
|
let componentName = "UnknownForm";
|
|
20761
|
-
let current =
|
|
20762
|
+
let current = path27.parentPath;
|
|
20762
20763
|
while (current) {
|
|
20763
20764
|
if (chunkJS75ORH7_js.isFunctionDeclaration(current.node) && current.node.id) {
|
|
20764
20765
|
componentName = current.node.id.name;
|
|
@@ -20791,7 +20792,7 @@ function scanForForms(ast, content, filePath) {
|
|
|
20791
20792
|
}
|
|
20792
20793
|
if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && opening.name.name === "Form") {
|
|
20793
20794
|
if (content.includes("Formik") || content.includes("formik")) {
|
|
20794
|
-
const fields = extractFieldsFromFormik(
|
|
20795
|
+
const fields = extractFieldsFromFormik(path27);
|
|
20795
20796
|
if (fields.length > 0) {
|
|
20796
20797
|
forms.push({
|
|
20797
20798
|
filePath,
|
|
@@ -20802,8 +20803,8 @@ function scanForForms(ast, content, filePath) {
|
|
|
20802
20803
|
submitsTo: null,
|
|
20803
20804
|
complexity: "moderate",
|
|
20804
20805
|
suggestedAction: "assisted",
|
|
20805
|
-
startLine:
|
|
20806
|
-
endLine:
|
|
20806
|
+
startLine: path27.node.loc?.start.line || 0,
|
|
20807
|
+
endLine: path27.node.loc?.end.line || 0
|
|
20807
20808
|
});
|
|
20808
20809
|
}
|
|
20809
20810
|
}
|
|
@@ -20821,8 +20822,8 @@ function extractFieldsFromForm(formPath) {
|
|
|
20821
20822
|
const radioGroups = /* @__PURE__ */ new Map();
|
|
20822
20823
|
const checkboxGroups = /* @__PURE__ */ new Map();
|
|
20823
20824
|
formPath.traverse({
|
|
20824
|
-
JSXElement(
|
|
20825
|
-
const opening =
|
|
20825
|
+
JSXElement(path27) {
|
|
20826
|
+
const opening = path27.node.openingElement;
|
|
20826
20827
|
const tagName = chunkJS75ORH7_js.isJSXIdentifier(opening.name) ? opening.name.name : null;
|
|
20827
20828
|
if (["input", "textarea", "select"].includes(tagName || "")) {
|
|
20828
20829
|
const attrs = opening.attributes;
|
|
@@ -20869,7 +20870,7 @@ function extractFieldsFromForm(formPath) {
|
|
|
20869
20870
|
}
|
|
20870
20871
|
if (tagName === "select") {
|
|
20871
20872
|
const selectOptions = [];
|
|
20872
|
-
|
|
20873
|
+
path27.traverse({
|
|
20873
20874
|
JSXElement(optionPath) {
|
|
20874
20875
|
const optOpening = optionPath.node.openingElement;
|
|
20875
20876
|
const optTagName = chunkJS75ORH7_js.isJSXIdentifier(optOpening.name) ? optOpening.name.name : null;
|
|
@@ -20944,8 +20945,8 @@ function extractFieldsFromForm(formPath) {
|
|
|
20944
20945
|
function extractFieldsFromFormik(formPath, content) {
|
|
20945
20946
|
const fields = [];
|
|
20946
20947
|
formPath.traverse({
|
|
20947
|
-
JSXElement(
|
|
20948
|
-
const opening =
|
|
20948
|
+
JSXElement(path27) {
|
|
20949
|
+
const opening = path27.node.openingElement;
|
|
20949
20950
|
const tagName = chunkJS75ORH7_js.isJSXIdentifier(opening.name) ? opening.name.name : null;
|
|
20950
20951
|
if (tagName === "Field" || tagName === "FastField") {
|
|
20951
20952
|
const attrs = opening.attributes;
|
|
@@ -21064,11 +21065,11 @@ function scanForMetadata(ast, content, filePath) {
|
|
|
21064
21065
|
}
|
|
21065
21066
|
let hasHeadComponent = false;
|
|
21066
21067
|
chunkJS75ORH7_js.traverse(ast, {
|
|
21067
|
-
JSXElement(
|
|
21068
|
-
const opening =
|
|
21068
|
+
JSXElement(path27) {
|
|
21069
|
+
const opening = path27.node.openingElement;
|
|
21069
21070
|
if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && opening.name.name === "Head") {
|
|
21070
21071
|
hasHeadComponent = true;
|
|
21071
|
-
|
|
21072
|
+
path27.stop();
|
|
21072
21073
|
}
|
|
21073
21074
|
}
|
|
21074
21075
|
});
|
|
@@ -21103,8 +21104,8 @@ function scanForWidgets(ast, content, filePath) {
|
|
|
21103
21104
|
for (const { pattern, type } of widgetPatterns) {
|
|
21104
21105
|
if (pattern.test(content)) {
|
|
21105
21106
|
chunkJS75ORH7_js.traverse(ast, {
|
|
21106
|
-
JSXElement(
|
|
21107
|
-
const opening =
|
|
21107
|
+
JSXElement(path27) {
|
|
21108
|
+
const opening = path27.node.openingElement;
|
|
21108
21109
|
if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && (opening.name.name === "script" || opening.name.name === "Script")) {
|
|
21109
21110
|
const srcAttr = opening.attributes.find(
|
|
21110
21111
|
(attr) => chunkJS75ORH7_js.isJSXAttribute(attr) && chunkJS75ORH7_js.isJSXIdentifier(attr.name) && attr.name.name === "src"
|
|
@@ -21119,8 +21120,8 @@ function scanForWidgets(ast, content, filePath) {
|
|
|
21119
21120
|
filePath,
|
|
21120
21121
|
widgetType: type,
|
|
21121
21122
|
scriptTag: src,
|
|
21122
|
-
startLine:
|
|
21123
|
-
endLine:
|
|
21123
|
+
startLine: path27.node.loc?.start.line || 0,
|
|
21124
|
+
endLine: path27.node.loc?.end.line || 0
|
|
21124
21125
|
});
|
|
21125
21126
|
}
|
|
21126
21127
|
}
|
|
@@ -21259,8 +21260,8 @@ function scanForSchemas(ast, content, filePath) {
|
|
|
21259
21260
|
return schemas;
|
|
21260
21261
|
}
|
|
21261
21262
|
chunkJS75ORH7_js.traverse(ast, {
|
|
21262
|
-
JSXElement(
|
|
21263
|
-
const opening =
|
|
21263
|
+
JSXElement(path27) {
|
|
21264
|
+
const opening = path27.node.openingElement;
|
|
21264
21265
|
if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && (opening.name.name === "script" || opening.name.name === "Script")) {
|
|
21265
21266
|
const typeAttr = opening.attributes.find(
|
|
21266
21267
|
(attr) => chunkJS75ORH7_js.isJSXAttribute(attr) && chunkJS75ORH7_js.isJSXIdentifier(attr.name) && attr.name.name === "type"
|
|
@@ -21287,8 +21288,8 @@ function scanForSchemas(ast, content, filePath) {
|
|
|
21287
21288
|
filePath,
|
|
21288
21289
|
type: detectedType,
|
|
21289
21290
|
schemaType,
|
|
21290
|
-
startLine:
|
|
21291
|
-
endLine:
|
|
21291
|
+
startLine: path27.node.loc?.start.line || 0,
|
|
21292
|
+
endLine: path27.node.loc?.end.line || 0
|
|
21292
21293
|
});
|
|
21293
21294
|
}
|
|
21294
21295
|
}
|
|
@@ -21321,8 +21322,8 @@ function scanForFAQs(ast, content, filePath) {
|
|
|
21321
21322
|
/questions?\s*(?:and|&)?\s*answers?/i
|
|
21322
21323
|
];
|
|
21323
21324
|
chunkJS75ORH7_js.traverse(ast, {
|
|
21324
|
-
JSXElement(
|
|
21325
|
-
const opening =
|
|
21325
|
+
JSXElement(path27) {
|
|
21326
|
+
const opening = path27.node.openingElement;
|
|
21326
21327
|
let tagName = "";
|
|
21327
21328
|
if (chunkJS75ORH7_js.isJSXIdentifier(opening.name)) {
|
|
21328
21329
|
tagName = opening.name.name;
|
|
@@ -21335,8 +21336,8 @@ function scanForFAQs(ast, content, filePath) {
|
|
|
21335
21336
|
faqs.push({
|
|
21336
21337
|
filePath,
|
|
21337
21338
|
type: "details-summary",
|
|
21338
|
-
startLine:
|
|
21339
|
-
endLine:
|
|
21339
|
+
startLine: path27.node.loc?.start.line || 0,
|
|
21340
|
+
endLine: path27.node.loc?.end.line || 0,
|
|
21340
21341
|
hasSchema: content.includes("FAQPage") || content.includes("application/ld+json")
|
|
21341
21342
|
});
|
|
21342
21343
|
return;
|
|
@@ -21344,7 +21345,7 @@ function scanForFAQs(ast, content, filePath) {
|
|
|
21344
21345
|
for (const pattern of faqPatterns) {
|
|
21345
21346
|
if (pattern.test(tagName)) {
|
|
21346
21347
|
let itemCount = 0;
|
|
21347
|
-
|
|
21348
|
+
path27.traverse({
|
|
21348
21349
|
JSXElement(itemPath) {
|
|
21349
21350
|
const itemOpening = itemPath.node.openingElement;
|
|
21350
21351
|
if (chunkJS75ORH7_js.isJSXIdentifier(itemOpening.name)) {
|
|
@@ -21360,8 +21361,8 @@ function scanForFAQs(ast, content, filePath) {
|
|
|
21360
21361
|
type: "accordion",
|
|
21361
21362
|
componentName: tagName,
|
|
21362
21363
|
itemCount: itemCount || void 0,
|
|
21363
|
-
startLine:
|
|
21364
|
-
endLine:
|
|
21364
|
+
startLine: path27.node.loc?.start.line || 0,
|
|
21365
|
+
endLine: path27.node.loc?.end.line || 0,
|
|
21365
21366
|
hasSchema: content.includes("FAQPage") || content.includes("application/ld+json")
|
|
21366
21367
|
});
|
|
21367
21368
|
return;
|
|
@@ -21484,8 +21485,8 @@ function scanForImages(ast, content, filePath) {
|
|
|
21484
21485
|
return images;
|
|
21485
21486
|
}
|
|
21486
21487
|
chunkJS75ORH7_js.traverse(ast, {
|
|
21487
|
-
JSXElement(
|
|
21488
|
-
const opening =
|
|
21488
|
+
JSXElement(path27) {
|
|
21489
|
+
const opening = path27.node.openingElement;
|
|
21489
21490
|
if (!chunkJS75ORH7_js.isJSXIdentifier(opening.name)) return;
|
|
21490
21491
|
const tagName = opening.name.name;
|
|
21491
21492
|
if (tagName === "img" || tagName === "Image") {
|
|
@@ -21513,8 +21514,8 @@ function scanForImages(ast, content, filePath) {
|
|
|
21513
21514
|
src: src || void 0,
|
|
21514
21515
|
alt: alt || void 0,
|
|
21515
21516
|
isLocal,
|
|
21516
|
-
startLine:
|
|
21517
|
-
endLine:
|
|
21517
|
+
startLine: path27.node.loc?.start.line || 0,
|
|
21518
|
+
endLine: path27.node.loc?.end.line || 0
|
|
21518
21519
|
});
|
|
21519
21520
|
}
|
|
21520
21521
|
}
|
|
@@ -22428,18 +22429,18 @@ async function migrateFile(filePath, options) {
|
|
|
22428
22429
|
let componentName = "Form";
|
|
22429
22430
|
const traverse2 = (await import('../lib-BGAWCSUH.js')).default;
|
|
22430
22431
|
traverse2(ast, {
|
|
22431
|
-
ExportNamedDeclaration(
|
|
22432
|
-
const decl =
|
|
22432
|
+
ExportNamedDeclaration(path27) {
|
|
22433
|
+
const decl = path27.node.declaration;
|
|
22433
22434
|
if (decl && decl.type === "FunctionDeclaration" && decl.id) {
|
|
22434
22435
|
componentName = decl.id.name;
|
|
22435
|
-
|
|
22436
|
+
path27.stop();
|
|
22436
22437
|
}
|
|
22437
22438
|
},
|
|
22438
|
-
ExportDefaultDeclaration(
|
|
22439
|
-
const decl =
|
|
22439
|
+
ExportDefaultDeclaration(path27) {
|
|
22440
|
+
const decl = path27.node.declaration;
|
|
22440
22441
|
if (decl && decl.type === "FunctionDeclaration" && decl.id) {
|
|
22441
22442
|
componentName = decl.id.name;
|
|
22442
|
-
|
|
22443
|
+
path27.stop();
|
|
22443
22444
|
}
|
|
22444
22445
|
}
|
|
22445
22446
|
});
|
|
@@ -22766,15 +22767,15 @@ var wslDefaultBrowser = async () => {
|
|
|
22766
22767
|
const { stdout } = await executePowerShell(command, { powerShellPath: psPath });
|
|
22767
22768
|
return stdout.trim();
|
|
22768
22769
|
};
|
|
22769
|
-
var convertWslPathToWindows = async (
|
|
22770
|
-
if (/^[a-z]+:\/\//i.test(
|
|
22771
|
-
return
|
|
22770
|
+
var convertWslPathToWindows = async (path27) => {
|
|
22771
|
+
if (/^[a-z]+:\/\//i.test(path27)) {
|
|
22772
|
+
return path27;
|
|
22772
22773
|
}
|
|
22773
22774
|
try {
|
|
22774
|
-
const { stdout } = await execFile2("wslpath", ["-aw",
|
|
22775
|
+
const { stdout } = await execFile2("wslpath", ["-aw", path27], { encoding: "utf8" });
|
|
22775
22776
|
return stdout.trim();
|
|
22776
22777
|
} catch {
|
|
22777
|
-
return
|
|
22778
|
+
return path27;
|
|
22778
22779
|
}
|
|
22779
22780
|
};
|
|
22780
22781
|
|
|
@@ -25193,8 +25194,8 @@ async function templateCommand(sourcePath, options, config2) {
|
|
|
25193
25194
|
const slots = [];
|
|
25194
25195
|
const componentNames = [];
|
|
25195
25196
|
chunkJS75ORH7_js.traverse(ast, {
|
|
25196
|
-
JSXElement(
|
|
25197
|
-
const openingElement =
|
|
25197
|
+
JSXElement(path27) {
|
|
25198
|
+
const openingElement = path27.node.openingElement;
|
|
25198
25199
|
if (chunkJS75ORH7_js.isJSXIdentifier(openingElement.name)) {
|
|
25199
25200
|
const componentName = openingElement.name.name;
|
|
25200
25201
|
if (componentName[0] === componentName[0].toUpperCase()) {
|
|
@@ -26398,6 +26399,98 @@ async function uploadSchemas(pages, globalSchema, config2) {
|
|
|
26398
26399
|
}
|
|
26399
26400
|
}
|
|
26400
26401
|
}
|
|
26402
|
+
var APP_DIRS = ["app", path10__default.default.join("src", "app")];
|
|
26403
|
+
var CARD_FILE = /^(opengraph-image|twitter-image)\b.*\.(png|jpe?g|gif|webp)$/i;
|
|
26404
|
+
function safeExists(p) {
|
|
26405
|
+
try {
|
|
26406
|
+
return fs__namespace.default.existsSync(p);
|
|
26407
|
+
} catch {
|
|
26408
|
+
return false;
|
|
26409
|
+
}
|
|
26410
|
+
}
|
|
26411
|
+
function findPageCards(cwd) {
|
|
26412
|
+
const found = [];
|
|
26413
|
+
const walk = (dir) => {
|
|
26414
|
+
let entries;
|
|
26415
|
+
try {
|
|
26416
|
+
entries = fs__namespace.default.readdirSync(dir, { withFileTypes: true });
|
|
26417
|
+
} catch {
|
|
26418
|
+
return;
|
|
26419
|
+
}
|
|
26420
|
+
for (const entry of entries) {
|
|
26421
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
|
|
26422
|
+
const full = path10__default.default.join(dir, entry.name);
|
|
26423
|
+
if (entry.isDirectory()) walk(full);
|
|
26424
|
+
else if (CARD_FILE.test(entry.name)) found.push(full);
|
|
26425
|
+
}
|
|
26426
|
+
};
|
|
26427
|
+
for (const rel of APP_DIRS) walk(path10__default.default.join(cwd, rel));
|
|
26428
|
+
return found;
|
|
26429
|
+
}
|
|
26430
|
+
function readOgWiring(cwd) {
|
|
26431
|
+
const siteCard = ["public/og.png", "public/og.jpg", "public/opengraph.png"].some(
|
|
26432
|
+
(rel) => safeExists(path10__default.default.join(cwd, rel))
|
|
26433
|
+
);
|
|
26434
|
+
const layoutPath = ["app/layout.tsx", "src/app/layout.tsx"].map((rel) => path10__default.default.join(cwd, rel)).find(safeExists);
|
|
26435
|
+
let layout = "";
|
|
26436
|
+
if (layoutPath) {
|
|
26437
|
+
try {
|
|
26438
|
+
layout = fs__namespace.default.readFileSync(layoutPath, "utf-8");
|
|
26439
|
+
} catch {
|
|
26440
|
+
}
|
|
26441
|
+
}
|
|
26442
|
+
return {
|
|
26443
|
+
siteCard,
|
|
26444
|
+
pageCards: findPageCards(cwd),
|
|
26445
|
+
layoutDeclaresImages: /images:\s*\[/.test(layout),
|
|
26446
|
+
largeCard: /summary_large_image/.test(layout),
|
|
26447
|
+
referencesImage: /og\.png|opengraph-image|og:image|images:\s*\[/.test(layout),
|
|
26448
|
+
layoutFound: !!layoutPath
|
|
26449
|
+
};
|
|
26450
|
+
}
|
|
26451
|
+
function judgeOgWiring(facts) {
|
|
26452
|
+
const problems = [];
|
|
26453
|
+
if (!facts.layoutFound) {
|
|
26454
|
+
return [{ message: "no app/layout.tsx found to verify metadata", fix: "Run this from the site root." }];
|
|
26455
|
+
}
|
|
26456
|
+
if (!facts.siteCard && !facts.pageCards.length) {
|
|
26457
|
+
return [
|
|
26458
|
+
{
|
|
26459
|
+
message: "no OG card \u2014 shared links render as bare URLs",
|
|
26460
|
+
fix: "Run: sonor-setup og (add og.config.ts for the real brand palette)"
|
|
26461
|
+
}
|
|
26462
|
+
];
|
|
26463
|
+
}
|
|
26464
|
+
if (facts.pageCards.length) {
|
|
26465
|
+
if (facts.layoutDeclaresImages) {
|
|
26466
|
+
problems.push({
|
|
26467
|
+
message: `openGraph/twitter images are declared in the root layout, which overrides all ${facts.pageCards.length} per-page cards`,
|
|
26468
|
+
fix: "Remove the images arrays from the root layout metadata and let Next serve each route its own opengraph-image file."
|
|
26469
|
+
});
|
|
26470
|
+
}
|
|
26471
|
+
problems.push({
|
|
26472
|
+
message: "seo_pages.managed_og_image (if set in Sonor) overrides per-page cards the same way",
|
|
26473
|
+
fix: "Clear managed_og_image for this project so each page serves its own card."
|
|
26474
|
+
});
|
|
26475
|
+
} else if (!facts.referencesImage) {
|
|
26476
|
+
problems.push({
|
|
26477
|
+
message: "card asset exists but layout metadata never references it",
|
|
26478
|
+
fix: "Add openGraph.images: ['/og.png'] (and twitter.images) to the root layout metadata."
|
|
26479
|
+
});
|
|
26480
|
+
}
|
|
26481
|
+
if (!facts.largeCard) {
|
|
26482
|
+
problems.push({
|
|
26483
|
+
message: "twitter.card is not 'summary_large_image' \u2014 previews render as a small square",
|
|
26484
|
+
fix: "Set twitter: { card: 'summary_large_image' } in the root layout metadata."
|
|
26485
|
+
});
|
|
26486
|
+
}
|
|
26487
|
+
return problems;
|
|
26488
|
+
}
|
|
26489
|
+
function checkOgWiring(cwd) {
|
|
26490
|
+
return judgeOgWiring(readOgWiring(cwd));
|
|
26491
|
+
}
|
|
26492
|
+
|
|
26493
|
+
// src/cli/agent/checks.ts
|
|
26401
26494
|
var API_URL4 = process.env.SONOR_API_URL || "https://api.sonor.io";
|
|
26402
26495
|
async function readFileOrNull(p) {
|
|
26403
26496
|
try {
|
|
@@ -27060,58 +27153,19 @@ async function checkImageDimsDrift(cwd) {
|
|
|
27060
27153
|
return { id: "images.dims-drift", title: "Image dims vs SVG", level: "ok", message: "Declared dims match SVG viewBoxes" };
|
|
27061
27154
|
}
|
|
27062
27155
|
async function checkOgCard(cwd) {
|
|
27063
|
-
const
|
|
27064
|
-
|
|
27065
|
-
|
|
27066
|
-
let fileConvention = false;
|
|
27067
|
-
for (const appDir of ["app", "src/app"]) {
|
|
27068
|
-
try {
|
|
27069
|
-
const entries = await fs3__default.default.readdir(path10__default.default.join(cwd, appDir));
|
|
27070
|
-
if (entries.some((e) => e.startsWith("opengraph-image") || e.startsWith("twitter-image"))) {
|
|
27071
|
-
fileConvention = true;
|
|
27072
|
-
}
|
|
27073
|
-
} catch {
|
|
27074
|
-
}
|
|
27075
|
-
}
|
|
27076
|
-
const layoutPath = ["app/layout.tsx", "src/app/layout.tsx"].map((rel) => path10__default.default.join(cwd, rel)).find(existsSyncSafe);
|
|
27077
|
-
const layout = layoutPath ? await readFileOrNull(layoutPath) : null;
|
|
27078
|
-
const referencesImage = !!layout && /og\.png|opengraph-image|og:image|images:\s*\[/.test(layout);
|
|
27079
|
-
const largeCard = !!layout && /summary_large_image/.test(layout);
|
|
27080
|
-
if (!staticCard && !fileConvention) {
|
|
27081
|
-
return {
|
|
27082
|
-
id: "og.card",
|
|
27083
|
-
title: "Open Graph card",
|
|
27084
|
-
level: "warn",
|
|
27085
|
-
message: "No OG card \u2014 shared links render as bare URLs",
|
|
27086
|
-
fix: "Run: sonor-setup og (add og.config.ts for the real brand palette)"
|
|
27087
|
-
};
|
|
27088
|
-
}
|
|
27089
|
-
if (!referencesImage) {
|
|
27090
|
-
return {
|
|
27091
|
-
id: "og.card",
|
|
27092
|
-
title: "Open Graph card",
|
|
27093
|
-
level: "warn",
|
|
27094
|
-
message: "Card asset exists but layout metadata never references it",
|
|
27095
|
-
fix: "Add openGraph.images: ['/og.png'] (and twitter.images) to the root layout metadata."
|
|
27096
|
-
};
|
|
27097
|
-
}
|
|
27098
|
-
if (!largeCard) {
|
|
27099
|
-
return {
|
|
27100
|
-
id: "og.card",
|
|
27101
|
-
title: "Open Graph card",
|
|
27102
|
-
level: "warn",
|
|
27103
|
-
message: "twitter.card is not 'summary_large_image' \u2014 previews render as a small square",
|
|
27104
|
-
fix: "Set twitter: { card: 'summary_large_image' } in the root layout metadata."
|
|
27105
|
-
};
|
|
27106
|
-
}
|
|
27107
|
-
return { id: "og.card", title: "Open Graph card", level: "ok", message: "Card present and wired" };
|
|
27108
|
-
}
|
|
27109
|
-
function existsSyncSafe(p) {
|
|
27110
|
-
try {
|
|
27111
|
-
return chunkSNAQBZPT_js.__require("fs").existsSync(p);
|
|
27112
|
-
} catch {
|
|
27113
|
-
return false;
|
|
27156
|
+
const problems = judgeOgWiring(readOgWiring(cwd));
|
|
27157
|
+
if (!problems.length) {
|
|
27158
|
+
return { id: "og.card", title: "Open Graph card", level: "ok", message: "Cards present and wired" };
|
|
27114
27159
|
}
|
|
27160
|
+
const [first, ...rest] = problems;
|
|
27161
|
+
return {
|
|
27162
|
+
id: "og.card",
|
|
27163
|
+
title: "Open Graph card",
|
|
27164
|
+
level: "warn",
|
|
27165
|
+
message: first.message,
|
|
27166
|
+
...rest.length ? { detail: rest.map((p) => `${p.message} \u2014 ${p.fix}`).join("\n") } : {},
|
|
27167
|
+
fix: first.fix
|
|
27168
|
+
};
|
|
27115
27169
|
}
|
|
27116
27170
|
async function staticChecks(cwd) {
|
|
27117
27171
|
return [
|
|
@@ -27194,7 +27248,64 @@ async function statusCommand(options) {
|
|
|
27194
27248
|
const online = options.offline ? false : true;
|
|
27195
27249
|
await runCommand(ctx, (c) => run2(c, online), renderChecksHuman("Site-Kit Integration Status"));
|
|
27196
27250
|
}
|
|
27251
|
+
|
|
27252
|
+
// src/og/pages.ts
|
|
27253
|
+
function stripBrandSuffix(title, brand) {
|
|
27254
|
+
const cleaned = title.replace(/\s*[|–—-]\s*[^|–—-]+$/, "").trim();
|
|
27255
|
+
if (!cleaned) return title.trim();
|
|
27256
|
+
if (brand && cleaned.toLowerCase() === brand.toLowerCase()) return title.trim();
|
|
27257
|
+
return cleaned;
|
|
27258
|
+
}
|
|
27259
|
+
function titleFromPath(path27) {
|
|
27260
|
+
const last = path27.split("/").filter(Boolean).pop();
|
|
27261
|
+
if (!last) return "Home";
|
|
27262
|
+
return last.replace(/[-_]+/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()).trim();
|
|
27263
|
+
}
|
|
27264
|
+
function kickerFromPath(path27, fallback) {
|
|
27265
|
+
const parts = path27.split("/").filter(Boolean);
|
|
27266
|
+
if (parts.length < 2) return fallback;
|
|
27267
|
+
return parts.slice(0, -1).join(" / ").replace(/[-_]+/g, " ");
|
|
27268
|
+
}
|
|
27269
|
+
function clampSubtitle(text, max = 100) {
|
|
27270
|
+
if (!text) return void 0;
|
|
27271
|
+
const flat = text.replace(/\s+/g, " ").trim();
|
|
27272
|
+
if (!flat) return void 0;
|
|
27273
|
+
if (flat.length <= max) return flat;
|
|
27274
|
+
const sentence = flat.slice(0, max + 1).match(/^.*[.!?](?=\s|$)/)?.[0];
|
|
27275
|
+
if (sentence && sentence.length >= 30) return sentence.trim();
|
|
27276
|
+
const cut = flat.slice(0, flat.lastIndexOf(" ", max) || max).trim();
|
|
27277
|
+
return `${cut.replace(/[.,;:!?…]+$/, "")}\u2026`;
|
|
27278
|
+
}
|
|
27279
|
+
function slugForPath(path27) {
|
|
27280
|
+
const trimmed = path27.replace(/^\/+|\/+$/g, "");
|
|
27281
|
+
if (!trimmed) return "home";
|
|
27282
|
+
return trimmed.replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "").toLowerCase();
|
|
27283
|
+
}
|
|
27284
|
+
function pageCardConfig(base, route, brand) {
|
|
27285
|
+
const override = base.cards?.[route.path] ?? base.cards?.[slugForPath(route.path)];
|
|
27286
|
+
const title = route.title ? stripBrandSuffix(route.title, brand) : titleFromPath(route.path);
|
|
27287
|
+
const derived = {
|
|
27288
|
+
...base,
|
|
27289
|
+
// `cards` is a build-time instruction, not part of a rendered card.
|
|
27290
|
+
cards: void 0,
|
|
27291
|
+
content: {
|
|
27292
|
+
...base.content,
|
|
27293
|
+
kicker: kickerFromPath(route.path, base.content.kicker),
|
|
27294
|
+
title,
|
|
27295
|
+
subtitle: clampSubtitle(route.description) ?? base.content.subtitle
|
|
27296
|
+
}
|
|
27297
|
+
};
|
|
27298
|
+
if (!override) return derived;
|
|
27299
|
+
return {
|
|
27300
|
+
...derived,
|
|
27301
|
+
...override,
|
|
27302
|
+
content: { ...derived.content, ...override.content }
|
|
27303
|
+
};
|
|
27304
|
+
}
|
|
27305
|
+
|
|
27306
|
+
// src/cli/commands/og.ts
|
|
27197
27307
|
var execFileAsync5 = util.promisify(childProcess.execFile);
|
|
27308
|
+
var RENDER_CONCURRENCY = 4;
|
|
27198
27309
|
var CHROME_CANDIDATES = [
|
|
27199
27310
|
process.env.SONOR_CHROME_PATH,
|
|
27200
27311
|
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
@@ -27269,32 +27380,139 @@ function inlinePublicPaths(html, cwd) {
|
|
|
27269
27380
|
return fs.existsSync(full) ? `src="file://${full}"` : `src="${p}"`;
|
|
27270
27381
|
});
|
|
27271
27382
|
}
|
|
27272
|
-
async function
|
|
27273
|
-
const
|
|
27274
|
-
|
|
27275
|
-
|
|
27276
|
-
|
|
27277
|
-
|
|
27278
|
-
|
|
27383
|
+
async function renderCard(config2, outPath, cwd, chrome, tmpSuffix) {
|
|
27384
|
+
const tmpHtml = path10__default.default.join(cwd, `.sonor-og-${tmpSuffix}.html`);
|
|
27385
|
+
try {
|
|
27386
|
+
await fs3__default.default.mkdir(path10__default.default.dirname(outPath), { recursive: true });
|
|
27387
|
+
await fs3__default.default.writeFile(tmpHtml, inlinePublicPaths(chunkZAVNGZJZ_js.buildOgHtml(config2), cwd));
|
|
27388
|
+
const { stdout } = await execFileAsync5(
|
|
27389
|
+
chrome,
|
|
27390
|
+
[
|
|
27391
|
+
"--headless=new",
|
|
27392
|
+
"--disable-gpu",
|
|
27393
|
+
"--hide-scrollbars",
|
|
27394
|
+
"--window-size=1200,630",
|
|
27395
|
+
"--virtual-time-budget=10000",
|
|
27396
|
+
`--screenshot=${outPath}`,
|
|
27397
|
+
"--dump-dom",
|
|
27398
|
+
`file://${tmpHtml}`
|
|
27399
|
+
],
|
|
27400
|
+
{ maxBuffer: 32 * 1024 * 1024 }
|
|
27401
|
+
);
|
|
27402
|
+
return parseReport(stdout);
|
|
27403
|
+
} finally {
|
|
27404
|
+
await fs3__default.default.rm(tmpHtml, { force: true });
|
|
27405
|
+
}
|
|
27406
|
+
}
|
|
27407
|
+
function parseReport(dom) {
|
|
27408
|
+
const raw = dom.match(new RegExp(`${chunkZAVNGZJZ_js.OG_REPORT_ATTR}="([^"]*)"`))?.[1];
|
|
27409
|
+
if (!raw) {
|
|
27410
|
+
return { fits: true, titlePx: chunkZAVNGZJZ_js.TITLE_MAX_PX, issues: ["card rendered but could not be measured (fitter did not run)"] };
|
|
27279
27411
|
}
|
|
27280
|
-
|
|
27281
|
-
|
|
27412
|
+
try {
|
|
27413
|
+
const decoded = raw.replace(/"/g, '"').replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
27414
|
+
return JSON.parse(decoded);
|
|
27415
|
+
} catch {
|
|
27416
|
+
return { fits: true, titlePx: chunkZAVNGZJZ_js.TITLE_MAX_PX, issues: ["card rendered but the fit report was unreadable"] };
|
|
27282
27417
|
}
|
|
27283
|
-
|
|
27284
|
-
|
|
27285
|
-
|
|
27418
|
+
}
|
|
27419
|
+
async function compressCard(pngPath, cwd) {
|
|
27420
|
+
try {
|
|
27421
|
+
const require_ = (await import('module')).createRequire(path10__default.default.join(cwd, "package.json"));
|
|
27422
|
+
const sharp = require_("sharp");
|
|
27423
|
+
const jpgPath = pngPath.replace(/\.png$/, ".jpg");
|
|
27424
|
+
await sharp(pngPath).jpeg({ quality: 84, mozjpeg: true }).toFile(jpgPath);
|
|
27425
|
+
await fs3__default.default.rm(pngPath, { force: true });
|
|
27426
|
+
return jpgPath;
|
|
27427
|
+
} catch {
|
|
27428
|
+
return pngPath;
|
|
27429
|
+
}
|
|
27430
|
+
}
|
|
27431
|
+
function discoverDynamicSegments(appDir) {
|
|
27432
|
+
const found = [];
|
|
27433
|
+
const walk = (dir, urlSegments) => {
|
|
27434
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
27435
|
+
if (!entry.isDirectory()) continue;
|
|
27436
|
+
if (entry.name.startsWith("_") || entry.name.startsWith(".")) continue;
|
|
27437
|
+
if (entry.name === "api" || entry.name === "node_modules") continue;
|
|
27438
|
+
const full = path10__default.default.join(dir, entry.name);
|
|
27439
|
+
const isGroup = entry.name.startsWith("(") && entry.name.endsWith(")");
|
|
27440
|
+
const isDynamic = entry.name.startsWith("[") && entry.name.endsWith("]");
|
|
27441
|
+
const nextUrl = isGroup || isDynamic ? urlSegments : [...urlSegments, entry.name];
|
|
27442
|
+
if (isDynamic) {
|
|
27443
|
+
const hasPage = ["tsx", "jsx", "ts", "js"].some((ext2) => fs.existsSync(path10__default.default.join(full, `page.${ext2}`)));
|
|
27444
|
+
if (hasPage) found.push({ dir: full, urlish: `/${urlSegments.join("/")}` });
|
|
27445
|
+
}
|
|
27446
|
+
walk(full, nextUrl);
|
|
27447
|
+
}
|
|
27448
|
+
};
|
|
27449
|
+
walk(appDir, []);
|
|
27450
|
+
return found;
|
|
27451
|
+
}
|
|
27452
|
+
async function pooled(items, limit, fn) {
|
|
27453
|
+
const results = new Array(items.length);
|
|
27454
|
+
let cursor = 0;
|
|
27455
|
+
const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {
|
|
27456
|
+
while (cursor < items.length) {
|
|
27457
|
+
const i = cursor++;
|
|
27458
|
+
results[i] = await fn(items[i], i);
|
|
27459
|
+
}
|
|
27460
|
+
});
|
|
27461
|
+
await Promise.all(workers);
|
|
27462
|
+
return results;
|
|
27463
|
+
}
|
|
27464
|
+
async function resolveRouteCopy(paths) {
|
|
27465
|
+
let getSEOPageData = null;
|
|
27466
|
+
try {
|
|
27467
|
+
if (process.env.SONOR_API_KEY) {
|
|
27468
|
+
;
|
|
27469
|
+
({ getSEOPageData } = await import('../api-N5OLQXYN.js'));
|
|
27470
|
+
}
|
|
27471
|
+
} catch {
|
|
27472
|
+
getSEOPageData = null;
|
|
27286
27473
|
}
|
|
27287
|
-
return
|
|
27474
|
+
if (!getSEOPageData) return paths.map((p) => ({ path: p }));
|
|
27475
|
+
return pooled(paths, RENDER_CONCURRENCY, async (p) => {
|
|
27476
|
+
try {
|
|
27477
|
+
const page = await getSEOPageData("", p);
|
|
27478
|
+
const title = page?.managed_title ?? page?.managed_og_title;
|
|
27479
|
+
const description = page?.managed_meta_description ?? page?.managed_og_description;
|
|
27480
|
+
return { path: p, title: title || void 0, description: description || void 0 };
|
|
27481
|
+
} catch {
|
|
27482
|
+
return { path: p };
|
|
27483
|
+
}
|
|
27484
|
+
});
|
|
27485
|
+
}
|
|
27486
|
+
function reportCard(label, report) {
|
|
27487
|
+
if (report.fits && !report.issues.length) {
|
|
27488
|
+
const shrunk = report.titlePx < chunkZAVNGZJZ_js.TITLE_MAX_PX ? source_default.gray(` (title fitted to ${report.titlePx}px)`) : "";
|
|
27489
|
+
console.log(` ${source_default.green("\u2713")} ${label}${shrunk}`);
|
|
27490
|
+
return true;
|
|
27491
|
+
}
|
|
27492
|
+
console.log(` ${report.fits ? source_default.yellow("!") : source_default.red("\u2717")} ${label}`);
|
|
27493
|
+
for (const issue of report.issues) {
|
|
27494
|
+
console.log(source_default.gray(` ${issue}`));
|
|
27495
|
+
}
|
|
27496
|
+
return report.fits;
|
|
27288
27497
|
}
|
|
27289
27498
|
async function ogCommand(options) {
|
|
27499
|
+
const ctx = makeContext("og", options);
|
|
27500
|
+
await runCommand(ctx, () => runOg(options));
|
|
27501
|
+
}
|
|
27502
|
+
async function runOg(options) {
|
|
27290
27503
|
console.log("");
|
|
27291
|
-
console.log(source_default.bold(" Generate Open Graph
|
|
27504
|
+
console.log(source_default.bold(" Generate Open Graph cards"));
|
|
27292
27505
|
console.log("");
|
|
27293
27506
|
const cwd = process.cwd();
|
|
27507
|
+
const checks = [];
|
|
27294
27508
|
const chrome = findChrome();
|
|
27295
27509
|
if (!chrome) {
|
|
27296
27510
|
console.log(source_default.red(" \u2717 No Chrome/Chromium found. Set SONOR_CHROME_PATH or install Chrome."));
|
|
27297
|
-
|
|
27511
|
+
return {
|
|
27512
|
+
exitCode: 1 /* FAILED */,
|
|
27513
|
+
summary: "No Chrome/Chromium found",
|
|
27514
|
+
errors: [{ code: "chrome_missing", message: "No Chrome or Chromium binary found", fix: "Install Chrome, or set SONOR_CHROME_PATH to its path." }]
|
|
27515
|
+
};
|
|
27298
27516
|
}
|
|
27299
27517
|
let config2 = await loadConfig4(cwd);
|
|
27300
27518
|
let seeded = false;
|
|
@@ -27304,49 +27522,173 @@ async function ogCommand(options) {
|
|
|
27304
27522
|
console.log(source_default.yellow(" ! No og.config.ts \u2014 generating a seed card from Sonor brand data."));
|
|
27305
27523
|
console.log(source_default.gray(" The site owns its theme: add og.config.ts (defineOgCard) with the real palette."));
|
|
27306
27524
|
}
|
|
27307
|
-
const spinner = ora("Rendering with headless Chrome...").start();
|
|
27308
27525
|
const outPath = path10__default.default.resolve(cwd, options.out || "public/og.png");
|
|
27309
|
-
|
|
27526
|
+
let clean = true;
|
|
27527
|
+
let pageCardsWritten = 0;
|
|
27528
|
+
let totalCardBytes = 0;
|
|
27529
|
+
const spinner = ora("Rendering the site card...").start();
|
|
27310
27530
|
try {
|
|
27311
|
-
const
|
|
27312
|
-
|
|
27313
|
-
|
|
27314
|
-
|
|
27315
|
-
|
|
27316
|
-
|
|
27317
|
-
|
|
27318
|
-
|
|
27319
|
-
|
|
27320
|
-
|
|
27321
|
-
|
|
27322
|
-
|
|
27323
|
-
|
|
27324
|
-
|
|
27325
|
-
|
|
27326
|
-
|
|
27327
|
-
|
|
27328
|
-
|
|
27329
|
-
|
|
27330
|
-
|
|
27331
|
-
|
|
27531
|
+
const report = await renderCard(config2, outPath, cwd, chrome, "site");
|
|
27532
|
+
spinner.stop();
|
|
27533
|
+
console.log(source_default.bold(` Site card${seeded ? source_default.gray(" (seed)") : ""}`));
|
|
27534
|
+
clean = reportCard(`${path10__default.default.relative(cwd, outPath)} \u2014 1200x630`, report) && clean;
|
|
27535
|
+
checks.push(cardCheck("site card", path10__default.default.relative(cwd, outPath), report));
|
|
27536
|
+
} catch (err) {
|
|
27537
|
+
const message = err instanceof Error ? err.message.split("\n")[0] : String(err);
|
|
27538
|
+
spinner.fail(`Render failed: ${message}`);
|
|
27539
|
+
return {
|
|
27540
|
+
exitCode: 1 /* FAILED */,
|
|
27541
|
+
summary: `Site card render failed: ${message}`,
|
|
27542
|
+
errors: [{ code: "render_failed", message, fix: "Check og.config.ts loads and the referenced assets exist under public/." }]
|
|
27543
|
+
};
|
|
27544
|
+
}
|
|
27545
|
+
if (options.pages !== false) {
|
|
27546
|
+
const appDir = chunkLOS5D6B3_js.findAppDirForDiscovery(cwd);
|
|
27547
|
+
if (!appDir) {
|
|
27548
|
+
console.log(source_default.yellow(" ! No app/ directory found \u2014 skipped per-page cards."));
|
|
27549
|
+
} else {
|
|
27550
|
+
const routes = [...new Set(chunkLOS5D6B3_js.discoverNextJsRoutes(appDir).map((r) => r.path))];
|
|
27551
|
+
if (!routes.length) {
|
|
27552
|
+
console.log(source_default.yellow(" ! No static routes discovered \u2014 skipped per-page cards."));
|
|
27553
|
+
} else {
|
|
27554
|
+
console.log("");
|
|
27555
|
+
console.log(source_default.bold(` Page cards`));
|
|
27556
|
+
const copySpinner = ora("Reading managed titles from Sonor...").start();
|
|
27557
|
+
const withCopy = await resolveRouteCopy(routes);
|
|
27558
|
+
const named = withCopy.filter((r) => r.title).length;
|
|
27559
|
+
copySpinner.stop();
|
|
27560
|
+
if (named) {
|
|
27561
|
+
console.log(source_default.gray(` ${named}/${routes.length} titled from Sonor, the rest from the route path`));
|
|
27562
|
+
} else {
|
|
27563
|
+
console.log(source_default.gray(" titled from route paths (no SONOR_API_KEY, or no managed titles yet)"));
|
|
27564
|
+
}
|
|
27565
|
+
const brand = config2.content.title.replace(/\n/g, " ").trim();
|
|
27566
|
+
const copyByPath = new Map(withCopy.map((r) => [r.path, r]));
|
|
27567
|
+
const dynamic = discoverDynamicSegments(appDir).map((seg) => ({
|
|
27568
|
+
...copyByPath.get(seg.urlish) ?? { path: seg.urlish },
|
|
27569
|
+
path: `${seg.urlish}/*`,
|
|
27570
|
+
dir: seg.dir
|
|
27571
|
+
}));
|
|
27572
|
+
const targets = [...withCopy, ...dynamic];
|
|
27573
|
+
const reports = await pooled(targets, RENDER_CONCURRENCY, async (route, i) => {
|
|
27574
|
+
const pageConfig = pageCardConfig(config2, route, brand);
|
|
27575
|
+
const dir = route.dir ?? routeOutputDir(appDir, route.path);
|
|
27576
|
+
for (const ext2 of ["png", "jpg", "jpeg"]) {
|
|
27577
|
+
await fs3__default.default.rm(path10__default.default.join(dir, `opengraph-image.${ext2}`), { force: true });
|
|
27578
|
+
}
|
|
27579
|
+
const png = path10__default.default.join(dir, "opengraph-image.png");
|
|
27580
|
+
const report = await renderCard(pageConfig, png, cwd, chrome, `page-${i}`);
|
|
27581
|
+
const file = await compressCard(png, cwd);
|
|
27582
|
+
return { route, file, report };
|
|
27583
|
+
});
|
|
27584
|
+
for (const { route, file, report } of reports) {
|
|
27585
|
+
clean = reportCard(`${route.path} ${source_default.gray(path10__default.default.relative(cwd, file))}`, report) && clean;
|
|
27586
|
+
checks.push(cardCheck(route.path, path10__default.default.relative(cwd, file), report));
|
|
27587
|
+
}
|
|
27588
|
+
pageCardsWritten = reports.length;
|
|
27589
|
+
const bytes = await totalBytes(reports.map((r) => r.file));
|
|
27590
|
+
totalCardBytes = bytes;
|
|
27591
|
+
console.log(source_default.gray(` ${(bytes / 1024 / 1024).toFixed(1)} MB of cards. Next serves these automatically \u2014 no per-page metadata needed.`));
|
|
27332
27592
|
}
|
|
27333
27593
|
}
|
|
27334
|
-
|
|
27335
|
-
|
|
27594
|
+
}
|
|
27595
|
+
if (options.preview !== false) {
|
|
27596
|
+
try {
|
|
27597
|
+
const require_ = (await import('module')).createRequire(path10__default.default.join(cwd, "package.json"));
|
|
27598
|
+
const sharp = require_("sharp");
|
|
27599
|
+
const previewPath = path10__default.default.join(cwd, ".sonor", "og-preview.png");
|
|
27600
|
+
await fs3__default.default.mkdir(path10__default.default.dirname(previewPath), { recursive: true });
|
|
27601
|
+
await sharp(outPath).resize(300).toFile(previewPath);
|
|
27336
27602
|
console.log("");
|
|
27337
|
-
console.log(source_default.
|
|
27338
|
-
|
|
27339
|
-
|
|
27340
|
-
console.log(source_default.green(" \u2713 Metadata wiring looks right (og:image, summary_large_image, title length)"));
|
|
27603
|
+
console.log(source_default.gray(` Thumbnail check: ${path10__default.default.relative(cwd, previewPath)} \u2014 if text is mush there, fix the card.`));
|
|
27604
|
+
} catch {
|
|
27605
|
+
console.log(source_default.gray(" (sharp not resolvable \u2014 skipped the 300px preview)"));
|
|
27341
27606
|
}
|
|
27342
|
-
|
|
27607
|
+
}
|
|
27608
|
+
const problems = checkOgWiring(cwd);
|
|
27609
|
+
console.log("");
|
|
27610
|
+
if (problems.length) {
|
|
27611
|
+
console.log(source_default.yellow(" Metadata wiring:"));
|
|
27612
|
+
for (const p of problems) {
|
|
27613
|
+
console.log(source_default.yellow(` ! ${p.message}`));
|
|
27614
|
+
console.log(source_default.gray(` ${p.fix}`));
|
|
27615
|
+
}
|
|
27616
|
+
} else {
|
|
27617
|
+
console.log(source_default.green(" \u2713 Metadata wiring looks right (og:image, summary_large_image, title length)"));
|
|
27618
|
+
}
|
|
27619
|
+
const domain = await siteDomain(cwd);
|
|
27620
|
+
console.log(
|
|
27621
|
+
source_default.gray(
|
|
27622
|
+
` Facebook caches cards \u2014 re-scrape at https://developers.facebook.com/tools/debug/${domain ? `?q=${encodeURIComponent(domain)}` : ""}`
|
|
27623
|
+
)
|
|
27624
|
+
);
|
|
27625
|
+
console.log("");
|
|
27626
|
+
if (!clean) {
|
|
27627
|
+
console.log(source_default.red(" \u2717 One or more cards do not fit. Fix the copy above and re-run."));
|
|
27343
27628
|
console.log("");
|
|
27344
|
-
} catch (err) {
|
|
27345
|
-
spinner.fail(`Render failed: ${err instanceof Error ? err.message.split("\n")[0] : err}`);
|
|
27346
|
-
process.exit(1);
|
|
27347
|
-
} finally {
|
|
27348
|
-
await fs3__default.default.rm(tmpHtml, { force: true });
|
|
27349
27629
|
}
|
|
27630
|
+
for (const problem of problems) {
|
|
27631
|
+
checks.push({
|
|
27632
|
+
id: "og.wiring",
|
|
27633
|
+
title: "Metadata wiring",
|
|
27634
|
+
level: "warn",
|
|
27635
|
+
message: problem.message,
|
|
27636
|
+
fix: problem.fix
|
|
27637
|
+
});
|
|
27638
|
+
}
|
|
27639
|
+
const cards = 1 + pageCardsWritten;
|
|
27640
|
+
return {
|
|
27641
|
+
exitCode: clean ? 0 /* OK */ : 1 /* FAILED */,
|
|
27642
|
+
summary: clean ? `${cards} card${cards === 1 ? "" : "s"} rendered, all fitting` : `${cards} card${cards === 1 ? "" : "s"} rendered, some do not fit`,
|
|
27643
|
+
data: { cards, bytes: totalCardBytes },
|
|
27644
|
+
checks,
|
|
27645
|
+
nextSteps: problems.map((p) => p.fix)
|
|
27646
|
+
};
|
|
27647
|
+
}
|
|
27648
|
+
function cardCheck(label, file, report) {
|
|
27649
|
+
const clean = report.fits && !report.issues.length;
|
|
27650
|
+
return {
|
|
27651
|
+
id: "og.card",
|
|
27652
|
+
title: label,
|
|
27653
|
+
level: clean ? "ok" : report.fits ? "warn" : "error",
|
|
27654
|
+
message: clean ? `${file} (title ${report.titlePx}px)` : report.issues.join("; "),
|
|
27655
|
+
...clean ? {} : { fix: "Shorten the copy for this card, or give it an override in og.config.ts `cards`." }
|
|
27656
|
+
};
|
|
27657
|
+
}
|
|
27658
|
+
function routeOutputDir(appDir, urlPath) {
|
|
27659
|
+
const segments = urlPath.split("/").filter(Boolean);
|
|
27660
|
+
let dir = appDir;
|
|
27661
|
+
for (const segment of segments) {
|
|
27662
|
+
const direct = path10__default.default.join(dir, segment);
|
|
27663
|
+
if (fs.existsSync(direct)) {
|
|
27664
|
+
dir = direct;
|
|
27665
|
+
continue;
|
|
27666
|
+
}
|
|
27667
|
+
const group = fs.existsSync(dir) ? fs.readdirSync(dir, { withFileTypes: true }).find(
|
|
27668
|
+
(e) => e.isDirectory() && e.name.startsWith("(") && e.name.endsWith(")") && fs.existsSync(path10__default.default.join(dir, e.name, segment))
|
|
27669
|
+
) : void 0;
|
|
27670
|
+
dir = group ? path10__default.default.join(dir, group.name, segment) : direct;
|
|
27671
|
+
}
|
|
27672
|
+
return dir;
|
|
27673
|
+
}
|
|
27674
|
+
async function totalBytes(files) {
|
|
27675
|
+
let total = 0;
|
|
27676
|
+
for (const f of files) {
|
|
27677
|
+
try {
|
|
27678
|
+
total += (await fs3__default.default.stat(f)).size;
|
|
27679
|
+
} catch {
|
|
27680
|
+
}
|
|
27681
|
+
}
|
|
27682
|
+
return total;
|
|
27683
|
+
}
|
|
27684
|
+
async function siteDomain(cwd) {
|
|
27685
|
+
const envFile = path10__default.default.join(cwd, ".env.local");
|
|
27686
|
+
if (fs.existsSync(envFile)) {
|
|
27687
|
+
const env3 = await fs3__default.default.readFile(envFile, "utf-8").catch(() => "");
|
|
27688
|
+
const url = env3.match(/^NEXT_PUBLIC_SITE_URL=(.+)$/m)?.[1]?.trim();
|
|
27689
|
+
if (url) return url.replace(/\/+$/, "");
|
|
27690
|
+
}
|
|
27691
|
+
return null;
|
|
27350
27692
|
}
|
|
27351
27693
|
var execFileAsync6 = util.promisify(childProcess.execFile);
|
|
27352
27694
|
async function next16Command() {
|
|
@@ -27465,14 +27807,14 @@ var hs = new RegExp(pe, "g");
|
|
|
27465
27807
|
var as = /\\\\/g;
|
|
27466
27808
|
var ls = /\\{/g;
|
|
27467
27809
|
var cs = /\\}/g;
|
|
27468
|
-
var
|
|
27810
|
+
var fs20 = /\\,/g;
|
|
27469
27811
|
var us = /\\./g;
|
|
27470
27812
|
var ds = 1e5;
|
|
27471
27813
|
function Ht(n5) {
|
|
27472
27814
|
return isNaN(n5) ? n5.charCodeAt(0) : parseInt(n5, 10);
|
|
27473
27815
|
}
|
|
27474
27816
|
function ps(n5) {
|
|
27475
|
-
return n5.replace(as, fe).replace(ls, ue).replace(cs, qt).replace(
|
|
27817
|
+
return n5.replace(as, fe).replace(ls, ue).replace(cs, qt).replace(fs20, de).replace(us, pe);
|
|
27476
27818
|
}
|
|
27477
27819
|
function ms(n5) {
|
|
27478
27820
|
return n5.replace(is, "\\").replace(rs, "{").replace(ns, "}").replace(os5, ",").replace(hs, ".");
|
|
@@ -32049,7 +32391,7 @@ async function geoCommand(options) {
|
|
|
32049
32391
|
(0, import_dotenv.config)({ path: ".env.local", quiet: true });
|
|
32050
32392
|
(0, import_dotenv.config)({ path: ".env", quiet: true });
|
|
32051
32393
|
var program2 = new Command();
|
|
32052
|
-
program2.name("sonor-setup").description("Setup + verification toolchain for @sonordev/site-kit").version(
|
|
32394
|
+
program2.name("sonor-setup").description("Setup + verification toolchain for @sonordev/site-kit").version(chunkS5L73KZQ_js.SITE_KIT_VERSION);
|
|
32053
32395
|
withAgentFlags(
|
|
32054
32396
|
program2.command("verify").description("Verify the integration actually works (health + key + SSR) \u2014 exit 0 = done").option("--url <url>", "Verify a running/deployed URL server-renders (recommended for agents)").option("--offline", "Skip the network key-validity ping").option("--strict", "Treat warnings as failures")
|
|
32055
32397
|
).action(verifyCommand);
|
|
@@ -32066,7 +32408,7 @@ withAgentFlags(
|
|
|
32066
32408
|
program2.command("manifest").description("Print the machine-readable agent manifest (modules, env, patterns, failure modes)").option("--section <name>", "Print one section: env | modules | commands | blessedPatterns | failureModes")
|
|
32067
32409
|
).action(manifestCommand);
|
|
32068
32410
|
withAgentFlags(
|
|
32069
|
-
program2.command("og").description("Generate
|
|
32411
|
+
program2.command("og").description("Generate Open Graph cards \u2014 the site card plus one per page \u2014 via headless Chrome").option("--no-preview", "Skip the 300px thumbnail legibility preview").option("--no-pages", "Only render the site card, skip the per-page cards").option("--out <path>", "Site card output path (default public/og.png)")
|
|
32070
32412
|
).action(ogCommand);
|
|
32071
32413
|
withAgentFlags(
|
|
32072
32414
|
program2.command("next16").description("Migrate middleware.ts to proxy.ts (official codemod) and verify")
|