@plasmicapp/nextjs-app-router 1.0.9 → 1.0.10

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/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  // src/ExtractPlasmicQueryData.tsx
4
- import { extractPlasmicQueryData } from "@plasmicapp/prepass";
4
+ import { plasmicPrepassExtract } from "@plasmicapp/prepass";
5
5
  import * as React from "react";
6
6
  function ExtractPlasmicQueryData(props) {
7
7
  const { children } = props;
@@ -12,17 +12,28 @@ function ExtractPlasmicQueryData(props) {
12
12
  }
13
13
  const scriptId = `plasmic-prefetch-${React["useId"]()}`;
14
14
  if (typeof window === "undefined") {
15
- const data = React["use"](
16
- extractPlasmicQueryData(/* @__PURE__ */ React.createElement(React.Fragment, null, children))
17
- );
15
+ const {
16
+ queryData,
17
+ headMetadata
18
+ } = React["use"](plasmicPrepassExtract(/* @__PURE__ */ React.createElement(React.Fragment, null, children)));
18
19
  return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
19
20
  "script",
20
21
  {
21
22
  type: "application/json",
22
- dangerouslySetInnerHTML: { __html: JSON.stringify(data) },
23
+ dangerouslySetInnerHTML: { __html: JSON.stringify(queryData) },
23
24
  "data-plasmic-prefetch-id": scriptId,
24
25
  suppressHydrationWarning: true
25
26
  }
27
+ ), headMetadata && /* @__PURE__ */ React.createElement(
28
+ "script",
29
+ {
30
+ type: "application/json",
31
+ dangerouslySetInnerHTML: {
32
+ __html: JSON.stringify(headMetadata)
33
+ },
34
+ "data-plasmic-head-metadata-id": scriptId,
35
+ suppressHydrationWarning: true
36
+ }
26
37
  ));
27
38
  } else {
28
39
  return null;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/ExtractPlasmicQueryData.tsx"],
4
- "sourcesContent": ["import { extractPlasmicQueryData } from \"@plasmicapp/prepass\";\nimport * as React from \"react\";\n\n/**\n * EXPERIMENTAL\n *\n * A component that serves the same purpose as extractPlasmicQueryData(), but from\n * React server components. This only works from frameworks that support\n * React.useId() and React.use() (like Next.js 13).\n *\n * The children of this component will be run through `extractPlasmicQueryData()`.\n */\nexport function ExtractPlasmicQueryData(props: { children?: React.ReactNode }) {\n const { children } = props;\n if (!(\"useId\" in React) || !(\"use\" in React)) {\n throw new Error(\n `You can only use <ExtractPlasmicQueryData /> from server components.`\n );\n }\n const scriptId = `plasmic-prefetch-${(React as any)[\"\" + \"useId\"]()}`;\n if (typeof window === \"undefined\") {\n const data: Record<string, any> = (React as any)[\"\" + \"use\"](\n extractPlasmicQueryData(<>{children}</>)\n );\n return (\n <>\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }}\n data-plasmic-prefetch-id={scriptId}\n suppressHydrationWarning={true}\n />\n </>\n );\n } else {\n return null;\n }\n}\n"],
5
- "mappings": ";;;AAAA,SAAS,+BAA+B;AACxC,YAAY,WAAW;AAWhB,SAAS,wBAAwB,OAAuC;AAC7E,QAAM,EAAE,SAAS,IAAI;AACrB,MAAI,EAAE,WAAW,UAAU,EAAE,SAAS,QAAQ;AAC5C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,WAAW,oBAAmC,eAAc;AAClE,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM,OAA2C;AAAA,MAC/C,wBAAwB,0DAAG,QAAS,CAAG;AAAA,IACzC;AACA,WACE,0DACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,yBAAyB,EAAE,QAAQ,KAAK,UAAU,IAAI,EAAE;AAAA,QACxD,4BAA0B;AAAA,QAC1B,0BAA0B;AAAA;AAAA,IAC5B,CACF;AAAA,EAEJ,OAAO;AACL,WAAO;AAAA,EACT;AACF;",
4
+ "sourcesContent": ["import { plasmicPrepassExtract } from \"@plasmicapp/prepass\";\nimport type { HeadMetadata } from \"@plasmicapp/query\";\nimport * as React from \"react\";\n\n/**\n * EXPERIMENTAL\n *\n * A component that serves the same purpose as extractPlasmicQueryData(), but from\n * React server components. This only works from frameworks that support\n * React.useId() and React.use() (like Next.js 13).\n *\n * The children of this component will be run through `extractPlasmicQueryData()`.\n */\nexport function ExtractPlasmicQueryData(props: { children?: React.ReactNode }) {\n const { children } = props;\n if (!(\"useId\" in React) || !(\"use\" in React)) {\n throw new Error(\n `You can only use <ExtractPlasmicQueryData /> from server components.`\n );\n }\n const scriptId = `plasmic-prefetch-${(React as any)[\"\" + \"useId\"]()}`;\n if (typeof window === \"undefined\") {\n const {\n queryData,\n headMetadata,\n }: { queryData: Record<string, any>; headMetadata: HeadMetadata } = (\n React as any\n )[\"\" + \"use\"](plasmicPrepassExtract(<>{children}</>));\n return (\n <>\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(queryData) }}\n data-plasmic-prefetch-id={scriptId}\n suppressHydrationWarning={true}\n />\n {headMetadata && (\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(headMetadata),\n }}\n data-plasmic-head-metadata-id={scriptId}\n suppressHydrationWarning={true}\n />\n )}\n </>\n );\n } else {\n return null;\n }\n}\n"],
5
+ "mappings": ";;;AAAA,SAAS,6BAA6B;AAEtC,YAAY,WAAW;AAWhB,SAAS,wBAAwB,OAAuC;AAC7E,QAAM,EAAE,SAAS,IAAI;AACrB,MAAI,EAAE,WAAW,UAAU,EAAE,SAAS,QAAQ;AAC5C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,WAAW,oBAAmC,eAAc;AAClE,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,IACF,IAEE,aAAY,sBAAsB,0DAAG,QAAS,CAAG,CAAC;AACpD,WACE,0DACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,yBAAyB,EAAE,QAAQ,KAAK,UAAU,SAAS,EAAE;AAAA,QAC7D,4BAA0B;AAAA,QAC1B,0BAA0B;AAAA;AAAA,IAC5B,GACC,gBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ,KAAK,UAAU,YAAY;AAAA,QACrC;AAAA,QACA,iCAA+B;AAAA,QAC/B,0BAA0B;AAAA;AAAA,IAC5B,CAEJ;AAAA,EAEJ,OAAO;AACL,WAAO;AAAA,EACT;AACF;",
6
6
  "names": []
7
7
  }
package/dist/index.js CHANGED
@@ -47,17 +47,28 @@ function ExtractPlasmicQueryData(props) {
47
47
  }
48
48
  const scriptId = `plasmic-prefetch-${React["useId"]()}`;
49
49
  if (typeof window === "undefined") {
50
- const data = React["use"](
51
- (0, import_prepass.extractPlasmicQueryData)(/* @__PURE__ */ React.createElement(React.Fragment, null, children))
52
- );
50
+ const {
51
+ queryData,
52
+ headMetadata
53
+ } = React["use"]((0, import_prepass.plasmicPrepassExtract)(/* @__PURE__ */ React.createElement(React.Fragment, null, children)));
53
54
  return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
54
55
  "script",
55
56
  {
56
57
  type: "application/json",
57
- dangerouslySetInnerHTML: { __html: JSON.stringify(data) },
58
+ dangerouslySetInnerHTML: { __html: JSON.stringify(queryData) },
58
59
  "data-plasmic-prefetch-id": scriptId,
59
60
  suppressHydrationWarning: true
60
61
  }
62
+ ), headMetadata && /* @__PURE__ */ React.createElement(
63
+ "script",
64
+ {
65
+ type: "application/json",
66
+ dangerouslySetInnerHTML: {
67
+ __html: JSON.stringify(headMetadata)
68
+ },
69
+ "data-plasmic-head-metadata-id": scriptId,
70
+ suppressHydrationWarning: true
71
+ }
61
72
  ));
62
73
  } else {
63
74
  return null;
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/ExtractPlasmicQueryData.tsx"],
4
- "sourcesContent": ["export * from \"./ExtractPlasmicQueryData\";\n", "import { extractPlasmicQueryData } from \"@plasmicapp/prepass\";\nimport * as React from \"react\";\n\n/**\n * EXPERIMENTAL\n *\n * A component that serves the same purpose as extractPlasmicQueryData(), but from\n * React server components. This only works from frameworks that support\n * React.useId() and React.use() (like Next.js 13).\n *\n * The children of this component will be run through `extractPlasmicQueryData()`.\n */\nexport function ExtractPlasmicQueryData(props: { children?: React.ReactNode }) {\n const { children } = props;\n if (!(\"useId\" in React) || !(\"use\" in React)) {\n throw new Error(\n `You can only use <ExtractPlasmicQueryData /> from server components.`\n );\n }\n const scriptId = `plasmic-prefetch-${(React as any)[\"\" + \"useId\"]()}`;\n if (typeof window === \"undefined\") {\n const data: Record<string, any> = (React as any)[\"\" + \"use\"](\n extractPlasmicQueryData(<>{children}</>)\n );\n return (\n <>\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }}\n data-plasmic-prefetch-id={scriptId}\n suppressHydrationWarning={true}\n />\n </>\n );\n } else {\n return null;\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,qBAAwC;AACxC,YAAuB;AAWhB,SAAS,wBAAwB,OAAuC;AAC7E,QAAM,EAAE,SAAS,IAAI;AACrB,MAAI,EAAE,WAAW,UAAU,EAAE,SAAS,QAAQ;AAC5C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,WAAW,oBAAmC,eAAc;AAClE,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM,OAA2C;AAAA,UAC/C,wCAAwB,0DAAG,QAAS,CAAG;AAAA,IACzC;AACA,WACE,0DACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,yBAAyB,EAAE,QAAQ,KAAK,UAAU,IAAI,EAAE;AAAA,QACxD,4BAA0B;AAAA,QAC1B,0BAA0B;AAAA;AAAA,IAC5B,CACF;AAAA,EAEJ,OAAO;AACL,WAAO;AAAA,EACT;AACF;",
4
+ "sourcesContent": ["export * from \"./ExtractPlasmicQueryData\";\n", "import { plasmicPrepassExtract } from \"@plasmicapp/prepass\";\nimport type { HeadMetadata } from \"@plasmicapp/query\";\nimport * as React from \"react\";\n\n/**\n * EXPERIMENTAL\n *\n * A component that serves the same purpose as extractPlasmicQueryData(), but from\n * React server components. This only works from frameworks that support\n * React.useId() and React.use() (like Next.js 13).\n *\n * The children of this component will be run through `extractPlasmicQueryData()`.\n */\nexport function ExtractPlasmicQueryData(props: { children?: React.ReactNode }) {\n const { children } = props;\n if (!(\"useId\" in React) || !(\"use\" in React)) {\n throw new Error(\n `You can only use <ExtractPlasmicQueryData /> from server components.`\n );\n }\n const scriptId = `plasmic-prefetch-${(React as any)[\"\" + \"useId\"]()}`;\n if (typeof window === \"undefined\") {\n const {\n queryData,\n headMetadata,\n }: { queryData: Record<string, any>; headMetadata: HeadMetadata } = (\n React as any\n )[\"\" + \"use\"](plasmicPrepassExtract(<>{children}</>));\n return (\n <>\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(queryData) }}\n data-plasmic-prefetch-id={scriptId}\n suppressHydrationWarning={true}\n />\n {headMetadata && (\n <script\n type=\"application/json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(headMetadata),\n }}\n data-plasmic-head-metadata-id={scriptId}\n suppressHydrationWarning={true}\n />\n )}\n </>\n );\n } else {\n return null;\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,qBAAsC;AAEtC,YAAuB;AAWhB,SAAS,wBAAwB,OAAuC;AAC7E,QAAM,EAAE,SAAS,IAAI;AACrB,MAAI,EAAE,WAAW,UAAU,EAAE,SAAS,QAAQ;AAC5C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,WAAW,oBAAmC,eAAc;AAClE,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,IACF,IAEE,iBAAY,sCAAsB,0DAAG,QAAS,CAAG,CAAC;AACpD,WACE,0DACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,yBAAyB,EAAE,QAAQ,KAAK,UAAU,SAAS,EAAE;AAAA,QAC7D,4BAA0B;AAAA,QAC1B,0BAA0B;AAAA;AAAA,IAC5B,GACC,gBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ,KAAK,UAAU,YAAY;AAAA,QACrC;AAAA,QACA,iCAA+B;AAAA,QAC/B,0BAA0B;AAAA;AAAA,IAC5B,CAEJ;AAAA,EAEJ,OAAO;AACL,WAAO;AAAA,EACT;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,3 +1,18 @@
1
+ import type { HeadMetadata } from '@plasmicapp/query';
2
+
3
+ export declare function fetchExtractedHeadMetadata(url: string): Promise<HeadMetadata | undefined>;
4
+
1
5
  export declare function fetchExtractedQueryData(url: string): Promise<any>;
2
6
 
7
+ /**
8
+ * Helper function to extract Head metadata from Plasmic pages.
9
+ *
10
+ * Given current pathname + search params, returns an object compatible with
11
+ * Next.js Metadata interface with SEO metadata.
12
+ */
13
+ export declare function withPlasmicMetadata({ pathname, searchParams, }: {
14
+ pathname: string;
15
+ searchParams: Record<string, string | string[]> | undefined;
16
+ }): Promise<object>;
17
+
3
18
  export { }
@@ -36,7 +36,85 @@ function fetchExtractedQueryData(url) {
36
36
  return void 0;
37
37
  });
38
38
  }
39
+ function fetchExtractedHeadMetadata(url) {
40
+ return __async(this, null, function* () {
41
+ const res = yield fetch(url);
42
+ if (res.status !== 200) {
43
+ return void 0;
44
+ }
45
+ const html = yield res.text();
46
+ const root = parseHtml(html);
47
+ const script = root.querySelector("script[data-plasmic-head-metadata-id]");
48
+ if (script) {
49
+ return JSON.parse(script.innerHTML);
50
+ }
51
+ return void 0;
52
+ });
53
+ }
54
+ function withPlasmicMetadata(_0) {
55
+ return __async(this, arguments, function* ({
56
+ pathname,
57
+ searchParams
58
+ }) {
59
+ var _a, _b, _c;
60
+ const isPlasmicSsr = !!(searchParams == null ? void 0 : searchParams["plasmicSsr"]) && (searchParams == null ? void 0 : searchParams["plasmicSsr"]) !== "false";
61
+ if (isPlasmicSsr) {
62
+ return {};
63
+ }
64
+ const prepassHost = (_c = (_a = process.env.PLASMIC_PREPASS_HOST) != null ? _a : process.env.VERCEL_URL && `https://${process.env.VERCEL_URL}`) != null ? _c : `http://localhost:${(_b = process.env.PORT) != null ? _b : 3e3}`;
65
+ const newSearchParams = new URLSearchParams(
66
+ Object.entries(searchParams != null ? searchParams : {}).flatMap(
67
+ ([key, values]) => Array.isArray(values) ? values.map((v) => [key, v]) : [[key, values]]
68
+ )
69
+ );
70
+ newSearchParams.set("plasmicSsr", "true");
71
+ if (process.env.VERCEL_AUTOMATION_BYPASS_SECRET) {
72
+ newSearchParams.set(
73
+ "x-vercel-protection-bypass",
74
+ process.env.VERCEL_AUTOMATION_BYPASS_SECRET
75
+ );
76
+ }
77
+ const prefetchedHeadMetadata = yield fetchExtractedHeadMetadata(
78
+ `${prepassHost}${pathname}?${newSearchParams.toString()}`
79
+ );
80
+ const headMetadata = {};
81
+ if (prefetchedHeadMetadata && Object.keys(prefetchedHeadMetadata).length > 0) {
82
+ if (prefetchedHeadMetadata.image) {
83
+ headMetadata.twitter = {
84
+ card: "summary_large_image",
85
+ images: [prefetchedHeadMetadata.image]
86
+ };
87
+ headMetadata.openGraph = {
88
+ images: [prefetchedHeadMetadata.image]
89
+ };
90
+ } else {
91
+ headMetadata.twitter = {
92
+ card: "summary"
93
+ };
94
+ headMetadata.openGraph = {};
95
+ }
96
+ if (prefetchedHeadMetadata.title) {
97
+ headMetadata.title = prefetchedHeadMetadata.title;
98
+ headMetadata.twitter.title = prefetchedHeadMetadata.title;
99
+ headMetadata.openGraph.title = prefetchedHeadMetadata.title;
100
+ }
101
+ if (prefetchedHeadMetadata.description) {
102
+ headMetadata.description = prefetchedHeadMetadata.description;
103
+ headMetadata.twitter.description = prefetchedHeadMetadata.description;
104
+ headMetadata.openGraph.description = prefetchedHeadMetadata.description;
105
+ }
106
+ if (prefetchedHeadMetadata.canonical) {
107
+ headMetadata.alternates = {
108
+ canonical: prefetchedHeadMetadata.canonical
109
+ };
110
+ }
111
+ }
112
+ return headMetadata;
113
+ });
114
+ }
39
115
  export {
40
- fetchExtractedQueryData
116
+ fetchExtractedHeadMetadata,
117
+ fetchExtractedQueryData,
118
+ withPlasmicMetadata
41
119
  };
42
120
  //# sourceMappingURL=react-server.esm.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/extracted-data-fetcher.ts"],
4
- "sourcesContent": ["import { parse as parseHtml } from \"node-html-parser\";\n\nexport async function fetchExtractedQueryData(url: string) {\n const res = await fetch(url);\n if (res.status !== 200) {\n return undefined;\n }\n\n const html = await res.text();\n const root = parseHtml(html);\n const script = root.querySelector(\"script[data-plasmic-prefetch-id]\");\n if (script) {\n return JSON.parse(script.innerHTML);\n }\n return undefined;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,SAAS,iBAAiB;AAEnC,SAAsB,wBAAwB,KAAa;AAAA;AACzD,UAAM,MAAM,MAAM,MAAM,GAAG;AAC3B,QAAI,IAAI,WAAW,KAAK;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,OAAO,UAAU,IAAI;AAC3B,UAAM,SAAS,KAAK,cAAc,kCAAkC;AACpE,QAAI,QAAQ;AACV,aAAO,KAAK,MAAM,OAAO,SAAS;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA;",
4
+ "sourcesContent": ["import type { HeadMetadata } from \"@plasmicapp/query\";\nimport { parse as parseHtml } from \"node-html-parser\";\nimport { Metadata } from \"next\";\n\nexport async function fetchExtractedQueryData(url: string) {\n const res = await fetch(url);\n if (res.status !== 200) {\n return undefined;\n }\n\n const html = await res.text();\n const root = parseHtml(html);\n const script = root.querySelector(\"script[data-plasmic-prefetch-id]\");\n if (script) {\n return JSON.parse(script.innerHTML);\n }\n return undefined;\n}\n\nexport async function fetchExtractedHeadMetadata(\n url: string\n): Promise<HeadMetadata | undefined> {\n const res = await fetch(url);\n if (res.status !== 200) {\n return undefined;\n }\n\n const html = await res.text();\n const root = parseHtml(html);\n const script = root.querySelector(\"script[data-plasmic-head-metadata-id]\");\n if (script) {\n return JSON.parse(script.innerHTML);\n }\n return undefined;\n}\n\n/**\n * Helper function to extract Head metadata from Plasmic pages.\n *\n * Given current pathname + search params, returns an object compatible with\n * Next.js Metadata interface with SEO metadata.\n */\nexport async function withPlasmicMetadata({\n pathname,\n searchParams,\n}: {\n pathname: string;\n searchParams: Record<string, string | string[]> | undefined;\n}): Promise<object> {\n const isPlasmicSsr =\n !!searchParams?.[\"plasmicSsr\"] && searchParams?.[\"plasmicSsr\"] !== \"false\";\n\n if (isPlasmicSsr) {\n // We're building the metadata for SSR endpoint here; this endpoint is not\n // exposed for users, so we can just return an empty object.\n return {};\n }\n\n // Fetch the same page from SSR endpoint to retrieve Head metadata\n const prepassHost =\n process.env.PLASMIC_PREPASS_HOST ??\n (process.env.VERCEL_URL && `https://${process.env.VERCEL_URL}`) ??\n `http://localhost:${process.env.PORT ?? 3000}`;\n\n // Build a copy of the search params\n const newSearchParams = new URLSearchParams(\n Object.entries(searchParams ?? {}).flatMap(([key, values]) =>\n Array.isArray(values) ? values.map((v) => [key, v]) : [[key, values]]\n )\n );\n\n // Set `plasmicSsr` search param to indicate you are using the SSR endpoint.\n newSearchParams.set(\"plasmicSsr\", \"true\");\n\n if (process.env.VERCEL_AUTOMATION_BYPASS_SECRET) {\n // If protection bypass is enabled, use it to ensure fetching from\n // the SSR endpoint will not return the authentication page HTML\n newSearchParams.set(\n \"x-vercel-protection-bypass\",\n process.env.VERCEL_AUTOMATION_BYPASS_SECRET\n );\n }\n\n // Fetch and return the data from the endpoint using the new search params\n const prefetchedHeadMetadata = await fetchExtractedHeadMetadata(\n `${prepassHost}${pathname}?${newSearchParams.toString()}`\n );\n\n // Create metadata object\n const headMetadata: Metadata = {};\n if (\n prefetchedHeadMetadata &&\n Object.keys(prefetchedHeadMetadata).length > 0\n ) {\n if (prefetchedHeadMetadata.image) {\n headMetadata.twitter = {\n card: \"summary_large_image\",\n images: [prefetchedHeadMetadata.image],\n };\n headMetadata.openGraph = {\n images: [prefetchedHeadMetadata.image],\n };\n } else {\n headMetadata.twitter = {\n card: \"summary\",\n };\n headMetadata.openGraph = {};\n }\n if (prefetchedHeadMetadata.title) {\n headMetadata.title = prefetchedHeadMetadata.title;\n headMetadata.twitter.title = prefetchedHeadMetadata.title;\n headMetadata.openGraph.title = prefetchedHeadMetadata.title;\n }\n if (prefetchedHeadMetadata.description) {\n headMetadata.description = prefetchedHeadMetadata.description;\n headMetadata.twitter.description = prefetchedHeadMetadata.description;\n headMetadata.openGraph.description = prefetchedHeadMetadata.description;\n }\n if (prefetchedHeadMetadata.canonical) {\n headMetadata.alternates = {\n canonical: prefetchedHeadMetadata.canonical,\n };\n }\n }\n\n return headMetadata;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,SAAS,iBAAiB;AAGnC,SAAsB,wBAAwB,KAAa;AAAA;AACzD,UAAM,MAAM,MAAM,MAAM,GAAG;AAC3B,QAAI,IAAI,WAAW,KAAK;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,OAAO,UAAU,IAAI;AAC3B,UAAM,SAAS,KAAK,cAAc,kCAAkC;AACpE,QAAI,QAAQ;AACV,aAAO,KAAK,MAAM,OAAO,SAAS;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA;AAEA,SAAsB,2BACpB,KACmC;AAAA;AACnC,UAAM,MAAM,MAAM,MAAM,GAAG;AAC3B,QAAI,IAAI,WAAW,KAAK;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,OAAO,UAAU,IAAI;AAC3B,UAAM,SAAS,KAAK,cAAc,uCAAuC;AACzE,QAAI,QAAQ;AACV,aAAO,KAAK,MAAM,OAAO,SAAS;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA;AAQA,SAAsB,oBAAoB,IAMtB;AAAA,6CANsB;AAAA,IACxC;AAAA,IACA;AAAA,EACF,GAGoB;AAhDpB;AAiDE,UAAM,eACJ,CAAC,EAAC,6CAAe,mBAAiB,6CAAe,mBAAkB;AAErE,QAAI,cAAc;AAGhB,aAAO,CAAC;AAAA,IACV;AAGA,UAAM,eACJ,mBAAQ,IAAI,yBAAZ,YACC,QAAQ,IAAI,cAAc,WAAW,QAAQ,IAAI,iBADlD,YAEA,qBAAoB,aAAQ,IAAI,SAAZ,YAAoB;AAG1C,UAAM,kBAAkB,IAAI;AAAA,MAC1B,OAAO,QAAQ,sCAAgB,CAAC,CAAC,EAAE;AAAA,QAAQ,CAAC,CAAC,KAAK,MAAM,MACtD,MAAM,QAAQ,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC;AAAA,MACtE;AAAA,IACF;AAGA,oBAAgB,IAAI,cAAc,MAAM;AAExC,QAAI,QAAQ,IAAI,iCAAiC;AAG/C,sBAAgB;AAAA,QACd;AAAA,QACA,QAAQ,IAAI;AAAA,MACd;AAAA,IACF;AAGA,UAAM,yBAAyB,MAAM;AAAA,MACnC,GAAG,cAAc,YAAY,gBAAgB,SAAS;AAAA,IACxD;AAGA,UAAM,eAAyB,CAAC;AAChC,QACE,0BACA,OAAO,KAAK,sBAAsB,EAAE,SAAS,GAC7C;AACA,UAAI,uBAAuB,OAAO;AAChC,qBAAa,UAAU;AAAA,UACrB,MAAM;AAAA,UACN,QAAQ,CAAC,uBAAuB,KAAK;AAAA,QACvC;AACA,qBAAa,YAAY;AAAA,UACvB,QAAQ,CAAC,uBAAuB,KAAK;AAAA,QACvC;AAAA,MACF,OAAO;AACL,qBAAa,UAAU;AAAA,UACrB,MAAM;AAAA,QACR;AACA,qBAAa,YAAY,CAAC;AAAA,MAC5B;AACA,UAAI,uBAAuB,OAAO;AAChC,qBAAa,QAAQ,uBAAuB;AAC5C,qBAAa,QAAQ,QAAQ,uBAAuB;AACpD,qBAAa,UAAU,QAAQ,uBAAuB;AAAA,MACxD;AACA,UAAI,uBAAuB,aAAa;AACtC,qBAAa,cAAc,uBAAuB;AAClD,qBAAa,QAAQ,cAAc,uBAAuB;AAC1D,qBAAa,UAAU,cAAc,uBAAuB;AAAA,MAC9D;AACA,UAAI,uBAAuB,WAAW;AACpC,qBAAa,aAAa;AAAA,UACxB,WAAW,uBAAuB;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;",
6
6
  "names": []
7
7
  }
@@ -40,7 +40,9 @@ var __async = (__this, __arguments, generator) => {
40
40
  // src/react-server.ts
41
41
  var react_server_exports = {};
42
42
  __export(react_server_exports, {
43
- fetchExtractedQueryData: () => fetchExtractedQueryData
43
+ fetchExtractedHeadMetadata: () => fetchExtractedHeadMetadata,
44
+ fetchExtractedQueryData: () => fetchExtractedQueryData,
45
+ withPlasmicMetadata: () => withPlasmicMetadata
44
46
  });
45
47
  module.exports = __toCommonJS(react_server_exports);
46
48
 
@@ -61,4 +63,80 @@ function fetchExtractedQueryData(url) {
61
63
  return void 0;
62
64
  });
63
65
  }
66
+ function fetchExtractedHeadMetadata(url) {
67
+ return __async(this, null, function* () {
68
+ const res = yield fetch(url);
69
+ if (res.status !== 200) {
70
+ return void 0;
71
+ }
72
+ const html = yield res.text();
73
+ const root = (0, import_node_html_parser.parse)(html);
74
+ const script = root.querySelector("script[data-plasmic-head-metadata-id]");
75
+ if (script) {
76
+ return JSON.parse(script.innerHTML);
77
+ }
78
+ return void 0;
79
+ });
80
+ }
81
+ function withPlasmicMetadata(_0) {
82
+ return __async(this, arguments, function* ({
83
+ pathname,
84
+ searchParams
85
+ }) {
86
+ var _a, _b, _c;
87
+ const isPlasmicSsr = !!(searchParams == null ? void 0 : searchParams["plasmicSsr"]) && (searchParams == null ? void 0 : searchParams["plasmicSsr"]) !== "false";
88
+ if (isPlasmicSsr) {
89
+ return {};
90
+ }
91
+ const prepassHost = (_c = (_a = process.env.PLASMIC_PREPASS_HOST) != null ? _a : process.env.VERCEL_URL && `https://${process.env.VERCEL_URL}`) != null ? _c : `http://localhost:${(_b = process.env.PORT) != null ? _b : 3e3}`;
92
+ const newSearchParams = new URLSearchParams(
93
+ Object.entries(searchParams != null ? searchParams : {}).flatMap(
94
+ ([key, values]) => Array.isArray(values) ? values.map((v) => [key, v]) : [[key, values]]
95
+ )
96
+ );
97
+ newSearchParams.set("plasmicSsr", "true");
98
+ if (process.env.VERCEL_AUTOMATION_BYPASS_SECRET) {
99
+ newSearchParams.set(
100
+ "x-vercel-protection-bypass",
101
+ process.env.VERCEL_AUTOMATION_BYPASS_SECRET
102
+ );
103
+ }
104
+ const prefetchedHeadMetadata = yield fetchExtractedHeadMetadata(
105
+ `${prepassHost}${pathname}?${newSearchParams.toString()}`
106
+ );
107
+ const headMetadata = {};
108
+ if (prefetchedHeadMetadata && Object.keys(prefetchedHeadMetadata).length > 0) {
109
+ if (prefetchedHeadMetadata.image) {
110
+ headMetadata.twitter = {
111
+ card: "summary_large_image",
112
+ images: [prefetchedHeadMetadata.image]
113
+ };
114
+ headMetadata.openGraph = {
115
+ images: [prefetchedHeadMetadata.image]
116
+ };
117
+ } else {
118
+ headMetadata.twitter = {
119
+ card: "summary"
120
+ };
121
+ headMetadata.openGraph = {};
122
+ }
123
+ if (prefetchedHeadMetadata.title) {
124
+ headMetadata.title = prefetchedHeadMetadata.title;
125
+ headMetadata.twitter.title = prefetchedHeadMetadata.title;
126
+ headMetadata.openGraph.title = prefetchedHeadMetadata.title;
127
+ }
128
+ if (prefetchedHeadMetadata.description) {
129
+ headMetadata.description = prefetchedHeadMetadata.description;
130
+ headMetadata.twitter.description = prefetchedHeadMetadata.description;
131
+ headMetadata.openGraph.description = prefetchedHeadMetadata.description;
132
+ }
133
+ if (prefetchedHeadMetadata.canonical) {
134
+ headMetadata.alternates = {
135
+ canonical: prefetchedHeadMetadata.canonical
136
+ };
137
+ }
138
+ }
139
+ return headMetadata;
140
+ });
141
+ }
64
142
  //# sourceMappingURL=react-server.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/react-server.ts", "../src/extracted-data-fetcher.ts"],
4
- "sourcesContent": ["export * from \"./extracted-data-fetcher\";\n", "import { parse as parseHtml } from \"node-html-parser\";\n\nexport async function fetchExtractedQueryData(url: string) {\n const res = await fetch(url);\n if (res.status !== 200) {\n return undefined;\n }\n\n const html = await res.text();\n const root = parseHtml(html);\n const script = root.querySelector(\"script[data-plasmic-prefetch-id]\");\n if (script) {\n return JSON.parse(script.innerHTML);\n }\n return undefined;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,8BAAmC;AAEnC,SAAsB,wBAAwB,KAAa;AAAA;AACzD,UAAM,MAAM,MAAM,MAAM,GAAG;AAC3B,QAAI,IAAI,WAAW,KAAK;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,WAAO,wBAAAA,OAAU,IAAI;AAC3B,UAAM,SAAS,KAAK,cAAc,kCAAkC;AACpE,QAAI,QAAQ;AACV,aAAO,KAAK,MAAM,OAAO,SAAS;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA;",
4
+ "sourcesContent": ["export * from \"./extracted-data-fetcher\";\n", "import type { HeadMetadata } from \"@plasmicapp/query\";\nimport { parse as parseHtml } from \"node-html-parser\";\nimport { Metadata } from \"next\";\n\nexport async function fetchExtractedQueryData(url: string) {\n const res = await fetch(url);\n if (res.status !== 200) {\n return undefined;\n }\n\n const html = await res.text();\n const root = parseHtml(html);\n const script = root.querySelector(\"script[data-plasmic-prefetch-id]\");\n if (script) {\n return JSON.parse(script.innerHTML);\n }\n return undefined;\n}\n\nexport async function fetchExtractedHeadMetadata(\n url: string\n): Promise<HeadMetadata | undefined> {\n const res = await fetch(url);\n if (res.status !== 200) {\n return undefined;\n }\n\n const html = await res.text();\n const root = parseHtml(html);\n const script = root.querySelector(\"script[data-plasmic-head-metadata-id]\");\n if (script) {\n return JSON.parse(script.innerHTML);\n }\n return undefined;\n}\n\n/**\n * Helper function to extract Head metadata from Plasmic pages.\n *\n * Given current pathname + search params, returns an object compatible with\n * Next.js Metadata interface with SEO metadata.\n */\nexport async function withPlasmicMetadata({\n pathname,\n searchParams,\n}: {\n pathname: string;\n searchParams: Record<string, string | string[]> | undefined;\n}): Promise<object> {\n const isPlasmicSsr =\n !!searchParams?.[\"plasmicSsr\"] && searchParams?.[\"plasmicSsr\"] !== \"false\";\n\n if (isPlasmicSsr) {\n // We're building the metadata for SSR endpoint here; this endpoint is not\n // exposed for users, so we can just return an empty object.\n return {};\n }\n\n // Fetch the same page from SSR endpoint to retrieve Head metadata\n const prepassHost =\n process.env.PLASMIC_PREPASS_HOST ??\n (process.env.VERCEL_URL && `https://${process.env.VERCEL_URL}`) ??\n `http://localhost:${process.env.PORT ?? 3000}`;\n\n // Build a copy of the search params\n const newSearchParams = new URLSearchParams(\n Object.entries(searchParams ?? {}).flatMap(([key, values]) =>\n Array.isArray(values) ? values.map((v) => [key, v]) : [[key, values]]\n )\n );\n\n // Set `plasmicSsr` search param to indicate you are using the SSR endpoint.\n newSearchParams.set(\"plasmicSsr\", \"true\");\n\n if (process.env.VERCEL_AUTOMATION_BYPASS_SECRET) {\n // If protection bypass is enabled, use it to ensure fetching from\n // the SSR endpoint will not return the authentication page HTML\n newSearchParams.set(\n \"x-vercel-protection-bypass\",\n process.env.VERCEL_AUTOMATION_BYPASS_SECRET\n );\n }\n\n // Fetch and return the data from the endpoint using the new search params\n const prefetchedHeadMetadata = await fetchExtractedHeadMetadata(\n `${prepassHost}${pathname}?${newSearchParams.toString()}`\n );\n\n // Create metadata object\n const headMetadata: Metadata = {};\n if (\n prefetchedHeadMetadata &&\n Object.keys(prefetchedHeadMetadata).length > 0\n ) {\n if (prefetchedHeadMetadata.image) {\n headMetadata.twitter = {\n card: \"summary_large_image\",\n images: [prefetchedHeadMetadata.image],\n };\n headMetadata.openGraph = {\n images: [prefetchedHeadMetadata.image],\n };\n } else {\n headMetadata.twitter = {\n card: \"summary\",\n };\n headMetadata.openGraph = {};\n }\n if (prefetchedHeadMetadata.title) {\n headMetadata.title = prefetchedHeadMetadata.title;\n headMetadata.twitter.title = prefetchedHeadMetadata.title;\n headMetadata.openGraph.title = prefetchedHeadMetadata.title;\n }\n if (prefetchedHeadMetadata.description) {\n headMetadata.description = prefetchedHeadMetadata.description;\n headMetadata.twitter.description = prefetchedHeadMetadata.description;\n headMetadata.openGraph.description = prefetchedHeadMetadata.description;\n }\n if (prefetchedHeadMetadata.canonical) {\n headMetadata.alternates = {\n canonical: prefetchedHeadMetadata.canonical,\n };\n }\n }\n\n return headMetadata;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["parseHtml"]
7
7
  }
@@ -7603,7 +7603,6 @@ async function main() {
7603
7603
  import_process.default.exit(commandProcess.exitCode ?? void 0);
7604
7604
  }).catch((err) => {
7605
7605
  console.error(`Plasmic: Failed to kill dev server: ${err}`);
7606
- import_process.default.exit(1);
7607
7606
  });
7608
7607
  };
7609
7608
  const command2 = argv._.map((x) => `${x}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plasmicapp/nextjs-app-router",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "types": "./dist/index.d.ts",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.esm.js",
@@ -25,7 +25,8 @@
25
25
  "prepare": "if-env PREPARE_NO_BUILD=true || yarn build"
26
26
  },
27
27
  "dependencies": {
28
- "@plasmicapp/prepass": "1.0.16",
28
+ "@plasmicapp/prepass": "1.0.17",
29
+ "@plasmicapp/query": "0.1.79",
29
30
  "fkill": "^8.1.0",
30
31
  "get-port": "^7.0.0",
31
32
  "node-html-parser": "^6.1.5",
@@ -67,8 +68,9 @@
67
68
  "@types/node": "^20.8.9",
68
69
  "@types/react": "^18.0.27",
69
70
  "@types/yargs": "^17.0.32",
71
+ "next": "^13.2.0",
70
72
  "react": "^18.2.0",
71
73
  "typescript": "^5.2.2"
72
74
  },
73
- "gitHead": "2169c4a64fe85ab5c37d2a612fb37dccb86a1ca2"
75
+ "gitHead": "2f8ee12f8f9c75c0f0af3834b8302b0bea542cbd"
74
76
  }