@plasmicpkgs/plasmic-link-preview 1.0.108 → 1.0.110
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/plasmic-link-preview.cjs.development.js +37 -47
- package/dist/plasmic-link-preview.cjs.development.js.map +1 -1
- package/dist/plasmic-link-preview.cjs.production.min.js +1 -1
- package/dist/plasmic-link-preview.cjs.production.min.js.map +1 -1
- package/dist/plasmic-link-preview.esm.js +37 -47
- package/dist/plasmic-link-preview.esm.js.map +1 -1
- package/package.json +3 -3
|
@@ -19,6 +19,40 @@ function registerComponentHelper(loader, component, meta) {
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
function asyncGeneratorStep(n, t, e, r, o, a, c) {
|
|
23
|
+
try {
|
|
24
|
+
var i = n[a](c),
|
|
25
|
+
u = i.value;
|
|
26
|
+
} catch (n) {
|
|
27
|
+
return void e(n);
|
|
28
|
+
}
|
|
29
|
+
i.done ? t(u) : Promise.resolve(u).then(r, o);
|
|
30
|
+
}
|
|
31
|
+
function _asyncToGenerator(n) {
|
|
32
|
+
return function () {
|
|
33
|
+
var t = this,
|
|
34
|
+
e = arguments;
|
|
35
|
+
return new Promise(function (r, o) {
|
|
36
|
+
var a = n.apply(t, e);
|
|
37
|
+
function _next(n) {
|
|
38
|
+
asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
|
|
39
|
+
}
|
|
40
|
+
function _throw(n) {
|
|
41
|
+
asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
|
|
42
|
+
}
|
|
43
|
+
_next(void 0);
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function _extends() {
|
|
48
|
+
return _extends = Object.assign ? Object.assign.bind() : function (n) {
|
|
49
|
+
for (var e = 1; e < arguments.length; e++) {
|
|
50
|
+
var t = arguments[e];
|
|
51
|
+
for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
|
|
52
|
+
}
|
|
53
|
+
return n;
|
|
54
|
+
}, _extends.apply(null, arguments);
|
|
55
|
+
}
|
|
22
56
|
function _regeneratorRuntime() {
|
|
23
57
|
_regeneratorRuntime = function () {
|
|
24
58
|
return e;
|
|
@@ -127,7 +161,7 @@ function _regeneratorRuntime() {
|
|
|
127
161
|
function makeInvokeMethod(e, r, n) {
|
|
128
162
|
var o = h;
|
|
129
163
|
return function (i, a) {
|
|
130
|
-
if (o === f) throw
|
|
164
|
+
if (o === f) throw Error("Generator is already running");
|
|
131
165
|
if (o === s) {
|
|
132
166
|
if ("throw" === i) throw a;
|
|
133
167
|
return {
|
|
@@ -269,7 +303,7 @@ function _regeneratorRuntime() {
|
|
|
269
303
|
} else if (c) {
|
|
270
304
|
if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
|
|
271
305
|
} else {
|
|
272
|
-
if (!u) throw
|
|
306
|
+
if (!u) throw Error("try statement without catch or finally");
|
|
273
307
|
if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
|
|
274
308
|
}
|
|
275
309
|
}
|
|
@@ -309,7 +343,7 @@ function _regeneratorRuntime() {
|
|
|
309
343
|
return o;
|
|
310
344
|
}
|
|
311
345
|
}
|
|
312
|
-
throw
|
|
346
|
+
throw Error("illegal catch attempt");
|
|
313
347
|
},
|
|
314
348
|
delegateYield: function (e, r, n) {
|
|
315
349
|
return this.delegate = {
|
|
@@ -320,50 +354,6 @@ function _regeneratorRuntime() {
|
|
|
320
354
|
}
|
|
321
355
|
}, e;
|
|
322
356
|
}
|
|
323
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
324
|
-
try {
|
|
325
|
-
var info = gen[key](arg);
|
|
326
|
-
var value = info.value;
|
|
327
|
-
} catch (error) {
|
|
328
|
-
reject(error);
|
|
329
|
-
return;
|
|
330
|
-
}
|
|
331
|
-
if (info.done) {
|
|
332
|
-
resolve(value);
|
|
333
|
-
} else {
|
|
334
|
-
Promise.resolve(value).then(_next, _throw);
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
function _asyncToGenerator(fn) {
|
|
338
|
-
return function () {
|
|
339
|
-
var self = this,
|
|
340
|
-
args = arguments;
|
|
341
|
-
return new Promise(function (resolve, reject) {
|
|
342
|
-
var gen = fn.apply(self, args);
|
|
343
|
-
function _next(value) {
|
|
344
|
-
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
345
|
-
}
|
|
346
|
-
function _throw(err) {
|
|
347
|
-
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
348
|
-
}
|
|
349
|
-
_next(undefined);
|
|
350
|
-
});
|
|
351
|
-
};
|
|
352
|
-
}
|
|
353
|
-
function _extends() {
|
|
354
|
-
_extends = Object.assign ? Object.assign.bind() : function (target) {
|
|
355
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
356
|
-
var source = arguments[i];
|
|
357
|
-
for (var key in source) {
|
|
358
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
359
|
-
target[key] = source[key];
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
return target;
|
|
364
|
-
};
|
|
365
|
-
return _extends.apply(this, arguments);
|
|
366
|
-
}
|
|
367
357
|
|
|
368
358
|
var isValidUrl = function isValidUrl(url) {
|
|
369
359
|
return /(^http(s?):\/\/[^\s$.?#].[^\s]*)/i.test(url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plasmic-link-preview.cjs.development.js","sources":["../src/lib/utils.ts","../src/lib/html-metadata-parser.ts","../src/index.tsx"],"sourcesContent":["import {\n ComponentMeta,\n default as registerComponent,\n} from \"@plasmicapp/host/registerComponent\";\nimport {\n default as registerGlobalContext,\n GlobalContextMeta,\n} from \"@plasmicapp/host/registerGlobalContext\";\nimport { default as registerToken } from \"@plasmicapp/host/registerToken\";\nimport React from \"react\";\n\nexport type Registerable = {\n registerComponent: typeof registerComponent;\n registerGlobalContext: typeof registerGlobalContext;\n registerToken: typeof registerToken;\n};\n\nexport function makeRegisterComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n return function (loader?: Registerable) {\n registerComponentHelper(loader, component, meta);\n };\n}\n\nexport function makeRegisterGlobalContext<T extends React.ComponentType<any>>(\n component: T,\n meta: GlobalContextMeta<React.ComponentProps<T>>\n) {\n return function (loader?: Registerable) {\n if (loader) {\n loader.registerGlobalContext(component, meta);\n } else {\n registerGlobalContext(component, meta);\n }\n };\n}\n\nexport function registerComponentHelper<T extends React.ComponentType<any>>(\n loader: Registerable | undefined,\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n if (loader) {\n loader.registerComponent(component, meta);\n } else {\n registerComponent(component, meta);\n }\n}\n\ntype ReactElt = {\n children: ReactElt | ReactElt[];\n props: {\n children: ReactElt | ReactElt[];\n [prop: string]: any;\n } | null;\n type: React.ComponentType<any> | null;\n key: string | null;\n} | null;\n\nexport function traverseReactEltTree(\n children: React.ReactNode,\n callback: (elt: ReactElt) => void\n) {\n const rec = (elts: ReactElt | ReactElt[] | null) => {\n (Array.isArray(elts) ? elts : [elts]).forEach((elt) => {\n if (elt) {\n callback(elt);\n if (elt.children) {\n rec(elt.children);\n }\n if (elt.props?.children && elt.props.children !== elt.children) {\n rec(elt.props.children);\n }\n }\n });\n };\n rec(children as any);\n}\n\nexport function asArray<T>(x: T[] | T | undefined | null) {\n if (Array.isArray(x)) {\n return x;\n } else if (x == null) {\n return [];\n } else {\n return [x];\n }\n}\n","import { parse as HTML } from \"node-html-parser\";\n\ninterface Meta {\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n type?: string;\n site_name?: string;\n}\n\nexport interface Metadata {\n title?: string;\n description?: string;\n image?: string;\n siteName?: string;\n hostname?: string;\n}\n\nconst isValidUrl = (url: string) => {\n return /(^http(s?):\\/\\/[^\\s$.?#].[^\\s]*)/i.test(url);\n};\n\nconst getMetadata = async (url: string): Promise<Metadata> => {\n if (!isValidUrl(url)) return {};\n\n const contents = await fetch(`https://corsproxy.io/?${url}`).then((res) =>\n res.text()\n );\n\n const $ = HTML(contents);\n\n const getHostname = () => {\n const { hostname } = new URL(url);\n return hostname;\n };\n\n const getTitle = () => {\n const title = $.querySelector(\"title\");\n return title?.text;\n };\n\n const meta: Meta = {};\n\n const metas = $.querySelectorAll(\"meta\")\n .map((el) => ({\n name: el.getAttribute(\"name\") || el.getAttribute(\"property\"),\n content: el.getAttribute(\"content\"),\n }))\n .filter((item) => item.name && item.content);\n\n [\n \"og:title\",\n \"og:description\",\n \"twitter:description\",\n // in order of priority, og:image is sufficient if present\n \"og:image\",\n \"twitter:image\",\n \"og:url\",\n \"og:site_name\",\n \"og:type\",\n ].forEach((metaName) => {\n const metasItem = metas.find((m) => m.name === metaName);\n if (!metasItem || !metasItem.name) return;\n const key = metasItem.name.split(\":\")[1] as keyof Meta;\n if (!meta[key]) meta[key] = metasItem.content;\n });\n\n [\"title\", \"description\", \"image\"].forEach((metaName) => {\n const metasItem = metas.find((m) => m.name === metaName);\n if (!metasItem || !metasItem.name) return;\n const key = metaName as keyof Meta;\n if (!meta[key]) meta[key] = metasItem.content;\n });\n\n if (!meta.image) {\n // find all images available and choose one!\n $.querySelectorAll(\"img\").every((el) => {\n const src: string | undefined = el.getAttribute(\"src\");\n if (src) {\n meta.image = new URL(src, url).href;\n return false;\n }\n return true;\n });\n }\n\n const metadata: Metadata = {\n hostname: getHostname(),\n title: getTitle(),\n ...meta,\n };\n\n return metadata;\n};\n\nexport default getMetadata;\nexport { isValidUrl };\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Registerable, registerComponentHelper } from \"./lib/utils\";\n\nimport { DataProvider, usePlasmicCanvasContext } from \"@plasmicapp/host\";\nimport getMetadata, { isValidUrl, Metadata } from \"./lib/html-metadata-parser\";\n\nexport type LinkPreviewProps = {\n url: string;\n children: React.ReactNode;\n loadingMessage: React.ReactNode;\n noPreviewMessage: React.ReactNode;\n showLoading: boolean;\n showNoPreview: boolean;\n};\n\nexport const LinkPreview: React.FC<LinkPreviewProps> = ({\n url,\n children,\n loadingMessage,\n noPreviewMessage,\n showLoading,\n showNoPreview,\n}) => {\n const _isMounted = useRef(true);\n const [metadata, setMetadata] = useState<Metadata>({});\n const [isLoading, setIsLoading] = useState(false);\n\n const isEditMode = !!usePlasmicCanvasContext();\n\n const resetMetadata = useCallback(() => {\n setMetadata({\n title: \"\",\n description: \"\",\n image: \"\",\n siteName: \"\",\n hostname: \"\",\n });\n }, []);\n\n useEffect(() => {\n _isMounted.current = true;\n if (!url) return;\n\n setIsLoading(true);\n resetMetadata();\n getMetadata(url)\n .then((res) => {\n if (_isMounted.current) {\n setMetadata(res);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n console.error(err);\n console.error(\"No metadata could be found for the given URL.\");\n if (_isMounted.current) {\n resetMetadata();\n setIsLoading(false);\n }\n });\n return () => {\n _isMounted.current = false;\n };\n }, [resetMetadata, url]);\n\n const showLoadingProp = isEditMode ? showLoading : false;\n const showNoPreviewProp = isEditMode ? showNoPreview : false;\n const hasChildren = (children as any)?.props.children;\n const hasMetadata =\n metadata?.title?.length && !metadata.title.startsWith(\"Origin DNS error\");\n const body = hasChildren ? <>{children}</> : <p>{metadata.title}</p>;\n const hidePreview =\n isLoading || showLoadingProp || showNoPreviewProp || !hasMetadata;\n const hasNoPreview = !isLoading && !hasMetadata;\n\n return (\n <div>\n <DataProvider name=\"metadata\" data={metadata}>\n {/* We want the metadata to always be available to the elements inside children slot. So we use CSS to hide it */}\n <div style={hidePreview ? { display: \"none\" } : {}}>{body}</div>\n {(hasNoPreview || showNoPreviewProp) && noPreviewMessage}\n {(isLoading || showLoadingProp) && loadingMessage}\n </DataProvider>\n </div>\n );\n};\n\nexport const rlpComponentName = \"plasmic-link-preview\";\n\nexport function registerLinkPreview(loader?: Registerable) {\n registerComponentHelper(loader, LinkPreview, {\n name: rlpComponentName,\n providesData: true,\n displayName: \"Link Preview\",\n props: {\n url: {\n type: \"string\",\n displayName: \"URL\",\n defaultValue: \"https://plasmic.app\",\n defaultValueHint: \"https://example.com\",\n validator: (value) => {\n if (isValidUrl(value)) return true;\n return \"Invalid URL\";\n },\n description: \"The URL for which you want to generate the link preview.\",\n },\n children: {\n type: \"slot\",\n hidePlaceholder: true,\n },\n noPreviewMessage: {\n type: \"slot\",\n displayName: \"'No Preview' Message\",\n hidePlaceholder: true,\n defaultValue: [\n {\n type: \"text\",\n value: \"no preview...\",\n },\n ],\n },\n showLoading: {\n type: \"boolean\",\n description:\n \"You can enable this prop to show the loading message, so you can easily customize it. This prop has no effect in the live app.\",\n },\n showNoPreview: {\n type: \"boolean\",\n description:\n \"You can enable this prop to show the 'No Preview' message, so you can easily customize it. This prop has no effect in the live app.\",\n },\n loadingMessage: {\n type: \"slot\",\n displayName: \"Loading Message\",\n hidePlaceholder: true,\n defaultValue: [\n {\n type: \"text\",\n value: \"loading preview...\",\n },\n ],\n },\n },\n importPath: \"@plasmicpkgs/plasmic-link-preview\",\n importName: \"LinkPreview\",\n });\n}\n"],"names":["registerComponentHelper","loader","component","meta","registerComponent","isValidUrl","url","test","getMetadata","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","contents","$","getHostname","getTitle","metas","metadata","wrap","_callee$","_context","prev","next","abrupt","fetch","then","res","text","sent","HTML","_URL","URL","hostname","title","querySelector","querySelectorAll","map","el","name","getAttribute","content","filter","item","forEach","metaName","metasItem","find","m","key","split","image","every","src","href","_extends","stop","_x","apply","arguments","LinkPreview","children","loadingMessage","noPreviewMessage","showLoading","showNoPreview","_isMounted","useRef","_useState","useState","setMetadata","_useState2","isLoading","setIsLoading","isEditMode","usePlasmicCanvasContext","resetMetadata","useCallback","description","siteName","useEffect","current","err","console","error","showLoadingProp","showNoPreviewProp","hasChildren","props","hasMetadata","_metadata$title","length","startsWith","body","React","hidePreview","hasNoPreview","DataProvider","data","style","display","rlpComponentName","registerLinkPreview","providesData","displayName","type","defaultValue","defaultValueHint","validator","value","hidePlaceholder","importPath","importName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plasmic-link-preview.cjs.development.js","sources":["../src/lib/utils.ts","../src/lib/html-metadata-parser.ts","../src/index.tsx"],"sourcesContent":["import {\n ComponentMeta,\n default as registerComponent,\n} from \"@plasmicapp/host/registerComponent\";\nimport {\n default as registerGlobalContext,\n GlobalContextMeta,\n} from \"@plasmicapp/host/registerGlobalContext\";\nimport { default as registerToken } from \"@plasmicapp/host/registerToken\";\nimport React from \"react\";\n\nexport type Registerable = {\n registerComponent: typeof registerComponent;\n registerGlobalContext: typeof registerGlobalContext;\n registerToken: typeof registerToken;\n};\n\nexport function makeRegisterComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n return function (loader?: Registerable) {\n registerComponentHelper(loader, component, meta);\n };\n}\n\nexport function makeRegisterGlobalContext<T extends React.ComponentType<any>>(\n component: T,\n meta: GlobalContextMeta<React.ComponentProps<T>>\n) {\n return function (loader?: Registerable) {\n if (loader) {\n loader.registerGlobalContext(component, meta);\n } else {\n registerGlobalContext(component, meta);\n }\n };\n}\n\nexport function registerComponentHelper<T extends React.ComponentType<any>>(\n loader: Registerable | undefined,\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n if (loader) {\n loader.registerComponent(component, meta);\n } else {\n registerComponent(component, meta);\n }\n}\n\ntype ReactElt = {\n children: ReactElt | ReactElt[];\n props: {\n children: ReactElt | ReactElt[];\n [prop: string]: any;\n } | null;\n type: React.ComponentType<any> | null;\n key: string | null;\n} | null;\n\nexport function traverseReactEltTree(\n children: React.ReactNode,\n callback: (elt: ReactElt) => void\n) {\n const rec = (elts: ReactElt | ReactElt[] | null) => {\n (Array.isArray(elts) ? elts : [elts]).forEach((elt) => {\n if (elt) {\n callback(elt);\n if (elt.children) {\n rec(elt.children);\n }\n if (elt.props?.children && elt.props.children !== elt.children) {\n rec(elt.props.children);\n }\n }\n });\n };\n rec(children as any);\n}\n\nexport function asArray<T>(x: T[] | T | undefined | null) {\n if (Array.isArray(x)) {\n return x;\n } else if (x == null) {\n return [];\n } else {\n return [x];\n }\n}\n","import { parse as HTML } from \"node-html-parser\";\n\ninterface Meta {\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n type?: string;\n site_name?: string;\n}\n\nexport interface Metadata {\n title?: string;\n description?: string;\n image?: string;\n siteName?: string;\n hostname?: string;\n}\n\nconst isValidUrl = (url: string) => {\n return /(^http(s?):\\/\\/[^\\s$.?#].[^\\s]*)/i.test(url);\n};\n\nconst getMetadata = async (url: string): Promise<Metadata> => {\n if (!isValidUrl(url)) return {};\n\n const contents = await fetch(`https://corsproxy.io/?${url}`).then((res) =>\n res.text()\n );\n\n const $ = HTML(contents);\n\n const getHostname = () => {\n const { hostname } = new URL(url);\n return hostname;\n };\n\n const getTitle = () => {\n const title = $.querySelector(\"title\");\n return title?.text;\n };\n\n const meta: Meta = {};\n\n const metas = $.querySelectorAll(\"meta\")\n .map((el) => ({\n name: el.getAttribute(\"name\") || el.getAttribute(\"property\"),\n content: el.getAttribute(\"content\"),\n }))\n .filter((item) => item.name && item.content);\n\n [\n \"og:title\",\n \"og:description\",\n \"twitter:description\",\n // in order of priority, og:image is sufficient if present\n \"og:image\",\n \"twitter:image\",\n \"og:url\",\n \"og:site_name\",\n \"og:type\",\n ].forEach((metaName) => {\n const metasItem = metas.find((m) => m.name === metaName);\n if (!metasItem || !metasItem.name) return;\n const key = metasItem.name.split(\":\")[1] as keyof Meta;\n if (!meta[key]) meta[key] = metasItem.content;\n });\n\n [\"title\", \"description\", \"image\"].forEach((metaName) => {\n const metasItem = metas.find((m) => m.name === metaName);\n if (!metasItem || !metasItem.name) return;\n const key = metaName as keyof Meta;\n if (!meta[key]) meta[key] = metasItem.content;\n });\n\n if (!meta.image) {\n // find all images available and choose one!\n $.querySelectorAll(\"img\").every((el) => {\n const src: string | undefined = el.getAttribute(\"src\");\n if (src) {\n meta.image = new URL(src, url).href;\n return false;\n }\n return true;\n });\n }\n\n const metadata: Metadata = {\n hostname: getHostname(),\n title: getTitle(),\n ...meta,\n };\n\n return metadata;\n};\n\nexport default getMetadata;\nexport { isValidUrl };\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Registerable, registerComponentHelper } from \"./lib/utils\";\n\nimport { DataProvider, usePlasmicCanvasContext } from \"@plasmicapp/host\";\nimport getMetadata, { isValidUrl, Metadata } from \"./lib/html-metadata-parser\";\n\nexport type LinkPreviewProps = {\n url: string;\n children: React.ReactNode;\n loadingMessage: React.ReactNode;\n noPreviewMessage: React.ReactNode;\n showLoading: boolean;\n showNoPreview: boolean;\n};\n\nexport const LinkPreview: React.FC<LinkPreviewProps> = ({\n url,\n children,\n loadingMessage,\n noPreviewMessage,\n showLoading,\n showNoPreview,\n}) => {\n const _isMounted = useRef(true);\n const [metadata, setMetadata] = useState<Metadata>({});\n const [isLoading, setIsLoading] = useState(false);\n\n const isEditMode = !!usePlasmicCanvasContext();\n\n const resetMetadata = useCallback(() => {\n setMetadata({\n title: \"\",\n description: \"\",\n image: \"\",\n siteName: \"\",\n hostname: \"\",\n });\n }, []);\n\n useEffect(() => {\n _isMounted.current = true;\n if (!url) return;\n\n setIsLoading(true);\n resetMetadata();\n getMetadata(url)\n .then((res) => {\n if (_isMounted.current) {\n setMetadata(res);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n console.error(err);\n console.error(\"No metadata could be found for the given URL.\");\n if (_isMounted.current) {\n resetMetadata();\n setIsLoading(false);\n }\n });\n return () => {\n _isMounted.current = false;\n };\n }, [resetMetadata, url]);\n\n const showLoadingProp = isEditMode ? showLoading : false;\n const showNoPreviewProp = isEditMode ? showNoPreview : false;\n const hasChildren = (children as any)?.props.children;\n const hasMetadata =\n metadata?.title?.length && !metadata.title.startsWith(\"Origin DNS error\");\n const body = hasChildren ? <>{children}</> : <p>{metadata.title}</p>;\n const hidePreview =\n isLoading || showLoadingProp || showNoPreviewProp || !hasMetadata;\n const hasNoPreview = !isLoading && !hasMetadata;\n\n return (\n <div>\n <DataProvider name=\"metadata\" data={metadata}>\n {/* We want the metadata to always be available to the elements inside children slot. So we use CSS to hide it */}\n <div style={hidePreview ? { display: \"none\" } : {}}>{body}</div>\n {(hasNoPreview || showNoPreviewProp) && noPreviewMessage}\n {(isLoading || showLoadingProp) && loadingMessage}\n </DataProvider>\n </div>\n );\n};\n\nexport const rlpComponentName = \"plasmic-link-preview\";\n\nexport function registerLinkPreview(loader?: Registerable) {\n registerComponentHelper(loader, LinkPreview, {\n name: rlpComponentName,\n providesData: true,\n displayName: \"Link Preview\",\n props: {\n url: {\n type: \"string\",\n displayName: \"URL\",\n defaultValue: \"https://plasmic.app\",\n defaultValueHint: \"https://example.com\",\n validator: (value) => {\n if (isValidUrl(value)) return true;\n return \"Invalid URL\";\n },\n description: \"The URL for which you want to generate the link preview.\",\n },\n children: {\n type: \"slot\",\n hidePlaceholder: true,\n },\n noPreviewMessage: {\n type: \"slot\",\n displayName: \"'No Preview' Message\",\n hidePlaceholder: true,\n defaultValue: [\n {\n type: \"text\",\n value: \"no preview...\",\n },\n ],\n },\n showLoading: {\n type: \"boolean\",\n description:\n \"You can enable this prop to show the loading message, so you can easily customize it. This prop has no effect in the live app.\",\n },\n showNoPreview: {\n type: \"boolean\",\n description:\n \"You can enable this prop to show the 'No Preview' message, so you can easily customize it. This prop has no effect in the live app.\",\n },\n loadingMessage: {\n type: \"slot\",\n displayName: \"Loading Message\",\n hidePlaceholder: true,\n defaultValue: [\n {\n type: \"text\",\n value: \"loading preview...\",\n },\n ],\n },\n },\n importPath: \"@plasmicpkgs/plasmic-link-preview\",\n importName: \"LinkPreview\",\n });\n}\n"],"names":["registerComponentHelper","loader","component","meta","registerComponent","isValidUrl","url","test","getMetadata","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","contents","$","getHostname","getTitle","metas","metadata","wrap","_callee$","_context","prev","next","abrupt","fetch","then","res","text","sent","HTML","_URL","URL","hostname","title","querySelector","querySelectorAll","map","el","name","getAttribute","content","filter","item","forEach","metaName","metasItem","find","m","key","split","image","every","src","href","_extends","stop","_x","apply","arguments","LinkPreview","children","loadingMessage","noPreviewMessage","showLoading","showNoPreview","_isMounted","useRef","_useState","useState","setMetadata","_useState2","isLoading","setIsLoading","isEditMode","usePlasmicCanvasContext","resetMetadata","useCallback","description","siteName","useEffect","current","err","console","error","showLoadingProp","showNoPreviewProp","hasChildren","props","hasMetadata","_metadata$title","length","startsWith","body","React","hidePreview","hasNoPreview","DataProvider","data","style","display","rlpComponentName","registerLinkPreview","providesData","displayName","type","defaultValue","defaultValueHint","validator","value","hidePlaceholder","importPath","importName"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";function t(t){return t&&"object"==typeof t&&"default"in t?t.default:t}Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=t(e),n=t(require("@plasmicapp/host/registerComponent"));require("@plasmicapp/host/registerGlobalContext");var o=require("@plasmicapp/host"),i=require("node-html-parser");function a(){a=function(){return e};var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},c=i.iterator||"@@iterator",u=i.asyncIterator||"@@asyncIterator",l=i.toStringTag||"@@toStringTag";function s(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{s({},"")}catch(t){s=function(t,e,r){return t[e]=r}}function f(t,e,r,n){var i=Object.create((e&&e.prototype instanceof m?e:m).prototype),a=new S(n||[]);return o(i,"_invoke",{value:k(t,r,a)}),i}function h(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=f;var p="suspendedStart",v="executing",d="completed",y={};function m(){}function g(){}function w(){}var b={};s(b,c,(function(){return this}));var L=Object.getPrototypeOf,x=L&&L(L(G([])));x&&x!==r&&n.call(x,c)&&(b=x);var E=w.prototype=m.prototype=Object.create(b);function P(t){["next","throw","return"].forEach((function(e){s(t,e,(function(t){return this._invoke(e,t)}))}))}function N(t,e){function r(o,i,a,c){var u=h(t[o],t,i);if("throw"!==u.type){var l=u.arg,s=l.value;return s&&"object"==typeof s&&n.call(s,"__await")?e.resolve(s.__await).then((function(t){r("next",t,a,c)}),(function(t){r("throw",t,a,c)})):e.resolve(s).then((function(t){l.value=t,a(l)}),(function(t){return r("throw",t,a,c)}))}c(u.arg)}var i;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return i=i?i.then(o,o):o()}})}function k(e,r,n){var o=p;return function(i,a){if(o===v)throw new Error("Generator is already running");if(o===d){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var c=n.delegate;if(c){var u=O(c,n);if(u){if(u===y)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===p)throw o=d,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=v;var l=h(e,r,n);if("normal"===l.type){if(o=n.done?d:"suspendedYield",l.arg===y)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(o=d,n.method="throw",n.arg=l.arg)}}}function O(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator.return&&(r.method="return",r.arg=t,O(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),y;var i=h(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,y;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,y):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,y)}function j(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function _(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function S(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(j,this),this.reset(!0)}function G(e){if(e||""===e){var r=e[c];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function r(){for(;++o<e.length;)if(n.call(e,o))return r.value=e[o],r.done=!1,r;return r.value=t,r.done=!0,r};return i.next=i}}throw new TypeError(typeof e+" is not iterable")}return g.prototype=w,o(E,"constructor",{value:w,configurable:!0}),o(w,"constructor",{value:g,configurable:!0}),g.displayName=s(w,l,"GeneratorFunction"),e.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===g||"GeneratorFunction"===(e.displayName||e.name))},e.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,w):(t.__proto__=w,s(t,l,"GeneratorFunction")),t.prototype=Object.create(E),t},e.awrap=function(t){return{__await:t}},P(N.prototype),s(N.prototype,u,(function(){return this})),e.AsyncIterator=N,e.async=function(t,r,n,o,i){void 0===i&&(i=Promise);var a=new N(f(t,r,n,o),i);return e.isGeneratorFunction(r)?a:a.next().then((function(t){return t.done?t.value:a.next()}))},P(E),s(E,l,"Generator"),s(E,c,(function(){return this})),s(E,"toString",(function(){return"[object Generator]"})),e.keys=function(t){var e=Object(t),r=[];for(var n in e)r.push(n);return r.reverse(),function t(){for(;r.length;){var n=r.pop();if(n in e)return t.value=n,t.done=!1,t}return t.done=!0,t}},e.values=G,S.prototype={constructor:S,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method="next",this.arg=t,this.tryEntries.forEach(_),!e)for(var r in this)"t"===r.charAt(0)&&n.call(this,r)&&!isNaN(+r.slice(1))&&(this[r]=t)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var r=this;function o(n,o){return c.type="throw",c.arg=e,r.next=n,o&&(r.method="next",r.arg=t),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var a=this.tryEntries[i],c=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),l=n.call(a,"finallyLoc");if(u&&l){if(this.prev<a.catchLoc)return o(a.catchLoc,!0);if(this.prev<a.finallyLoc)return o(a.finallyLoc)}else if(u){if(this.prev<a.catchLoc)return o(a.catchLoc,!0)}else{if(!l)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return o(a.finallyLoc)}}}},abrupt:function(t,e){for(var r=this.tryEntries.length-1;r>=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===t||"continue"===t)&&i.tryLoc<=e&&e<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=t,a.arg=e,i?(this.method="next",this.next=i.finallyLoc,y):this.complete(a)},complete:function(t,e){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&e&&(this.next=e),y},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),_(r),y}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;_(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:G(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),y}},e}function c(t,e,r,n,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void r(t)}c.done?e(u):Promise.resolve(u).then(n,o)}function u(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function a(t){c(i,n,o,a,u,"next",t)}function u(t){c(i,n,o,a,u,"throw",t)}a(void 0)}))}}function l(){return(l=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t}).apply(this,arguments)}var s=function(t){return/(^http(s?):\/\/[^\s$.?#].[^\s]*)/i.test(t)},f=function(){var t=u(a().mark((function t(e){var r,n,o,c,u,f;return a().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(s(e)){t.next=2;break}return t.abrupt("return",{});case 2:return t.next=4,fetch("https://corsproxy.io/?"+e).then((function(t){return t.text()}));case 4:return r=i.parse(t.sent),n=function(){return new URL(e).hostname},o=function(){var t=r.querySelector("title");return null==t?void 0:t.text},c={},u=r.querySelectorAll("meta").map((function(t){return{name:t.getAttribute("name")||t.getAttribute("property"),content:t.getAttribute("content")}})).filter((function(t){return t.name&&t.content})),["og:title","og:description","twitter:description","og:image","twitter:image","og:url","og:site_name","og:type"].forEach((function(t){var e=u.find((function(e){return e.name===t}));if(e&&e.name){var r=e.name.split(":")[1];c[r]||(c[r]=e.content)}})),["title","description","image"].forEach((function(t){var e=u.find((function(e){return e.name===t}));e&&e.name&&(c[t]||(c[t]=e.content))})),c.image||r.querySelectorAll("img").every((function(t){var r=t.getAttribute("src");return!r||(c.image=new URL(r,e).href,!1)})),f=l({hostname:n(),title:o()},c),t.abrupt("return",f);case 15:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),h=function(t){var n,i=t.url,a=t.children,c=t.loadingMessage,u=t.noPreviewMessage,l=t.showLoading,s=t.showNoPreview,h=e.useRef(!0),p=e.useState({}),v=p[0],d=p[1],y=e.useState(!1),m=y[0],g=y[1],w=!!o.usePlasmicCanvasContext(),b=e.useCallback((function(){d({title:"",description:"",image:"",siteName:"",hostname:""})}),[]);e.useEffect((function(){if(h.current=!0,i)return g(!0),b(),f(i).then((function(t){h.current&&(d(t),g(!1))})).catch((function(t){console.error(t),console.error("No metadata could be found for the given URL."),h.current&&(b(),g(!1))})),function(){h.current=!1}}),[b,i]);var L=!!w&&l,x=!!w&&s,E=null==a?void 0:a.props.children,P=(null==v||null==(n=v.title)?void 0:n.length)&&!v.title.startsWith("Origin DNS error"),N=E?r.createElement(r.Fragment,null,a):r.createElement("p",null,v.title),k=!m&&!P;return r.createElement("div",null,r.createElement(o.DataProvider,{name:"metadata",data:v},r.createElement("div",{style:m||L||x||!P?{display:"none"}:{}},N),(k||x)&&u,(m||L)&&c))};exports.LinkPreview=h,exports.registerLinkPreview=function(t){!function(t,e,r){t?t.registerComponent(e,r):n(e,r)}(t,h,{name:"plasmic-link-preview",providesData:!0,displayName:"Link Preview",props:{url:{type:"string",displayName:"URL",defaultValue:"https://plasmic.app",defaultValueHint:"https://example.com",validator:function(t){return!!s(t)||"Invalid URL"},description:"The URL for which you want to generate the link preview."},children:{type:"slot",hidePlaceholder:!0},noPreviewMessage:{type:"slot",displayName:"'No Preview' Message",hidePlaceholder:!0,defaultValue:[{type:"text",value:"no preview..."}]},showLoading:{type:"boolean",description:"You can enable this prop to show the loading message, so you can easily customize it. This prop has no effect in the live app."},showNoPreview:{type:"boolean",description:"You can enable this prop to show the 'No Preview' message, so you can easily customize it. This prop has no effect in the live app."},loadingMessage:{type:"slot",displayName:"Loading Message",hidePlaceholder:!0,defaultValue:[{type:"text",value:"loading preview..."}]}},importPath:"@plasmicpkgs/plasmic-link-preview",importName:"LinkPreview"})},exports.rlpComponentName="plasmic-link-preview";
|
|
1
|
+
"use strict";function t(t){return t&&"object"==typeof t&&"default"in t?t.default:t}Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=t(e),n=t(require("@plasmicapp/host/registerComponent"));require("@plasmicapp/host/registerGlobalContext");var o=require("@plasmicapp/host"),i=require("node-html-parser");function a(t,e,r,n,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void r(t)}c.done?e(u):Promise.resolve(u).then(n,o)}function c(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function c(t){a(i,n,o,c,u,"next",t)}function u(t){a(i,n,o,c,u,"throw",t)}c(void 0)}))}}function u(){return(u=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)({}).hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t}).apply(null,arguments)}function l(){l=function(){return e};var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",c=i.asyncIterator||"@@asyncIterator",u=i.toStringTag||"@@toStringTag";function s(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{s({},"")}catch(t){s=function(t,e,r){return t[e]=r}}function f(t,e,r,n){var i=Object.create((e&&e.prototype instanceof m?e:m).prototype),a=new S(n||[]);return o(i,"_invoke",{value:k(t,r,a)}),i}function h(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=f;var p="suspendedStart",v="executing",d="completed",y={};function m(){}function g(){}function w(){}var b={};s(b,a,(function(){return this}));var L=Object.getPrototypeOf,x=L&&L(L(G([])));x&&x!==r&&n.call(x,a)&&(b=x);var E=w.prototype=m.prototype=Object.create(b);function P(t){["next","throw","return"].forEach((function(e){s(t,e,(function(t){return this._invoke(e,t)}))}))}function N(t,e){function r(o,i,a,c){var u=h(t[o],t,i);if("throw"!==u.type){var l=u.arg,s=l.value;return s&&"object"==typeof s&&n.call(s,"__await")?e.resolve(s.__await).then((function(t){r("next",t,a,c)}),(function(t){r("throw",t,a,c)})):e.resolve(s).then((function(t){l.value=t,a(l)}),(function(t){return r("throw",t,a,c)}))}c(u.arg)}var i;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return i=i?i.then(o,o):o()}})}function k(e,r,n){var o=p;return function(i,a){if(o===v)throw Error("Generator is already running");if(o===d){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var c=n.delegate;if(c){var u=O(c,n);if(u){if(u===y)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===p)throw o=d,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=v;var l=h(e,r,n);if("normal"===l.type){if(o=n.done?d:"suspendedYield",l.arg===y)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(o=d,n.method="throw",n.arg=l.arg)}}}function O(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator.return&&(r.method="return",r.arg=t,O(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),y;var i=h(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,y;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,y):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,y)}function _(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function j(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function S(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(_,this),this.reset(!0)}function G(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function r(){for(;++o<e.length;)if(n.call(e,o))return r.value=e[o],r.done=!1,r;return r.value=t,r.done=!0,r};return i.next=i}}throw new TypeError(typeof e+" is not iterable")}return g.prototype=w,o(E,"constructor",{value:w,configurable:!0}),o(w,"constructor",{value:g,configurable:!0}),g.displayName=s(w,u,"GeneratorFunction"),e.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===g||"GeneratorFunction"===(e.displayName||e.name))},e.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,w):(t.__proto__=w,s(t,u,"GeneratorFunction")),t.prototype=Object.create(E),t},e.awrap=function(t){return{__await:t}},P(N.prototype),s(N.prototype,c,(function(){return this})),e.AsyncIterator=N,e.async=function(t,r,n,o,i){void 0===i&&(i=Promise);var a=new N(f(t,r,n,o),i);return e.isGeneratorFunction(r)?a:a.next().then((function(t){return t.done?t.value:a.next()}))},P(E),s(E,u,"Generator"),s(E,a,(function(){return this})),s(E,"toString",(function(){return"[object Generator]"})),e.keys=function(t){var e=Object(t),r=[];for(var n in e)r.push(n);return r.reverse(),function t(){for(;r.length;){var n=r.pop();if(n in e)return t.value=n,t.done=!1,t}return t.done=!0,t}},e.values=G,S.prototype={constructor:S,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method="next",this.arg=t,this.tryEntries.forEach(j),!e)for(var r in this)"t"===r.charAt(0)&&n.call(this,r)&&!isNaN(+r.slice(1))&&(this[r]=t)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var r=this;function o(n,o){return c.type="throw",c.arg=e,r.next=n,o&&(r.method="next",r.arg=t),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var a=this.tryEntries[i],c=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),l=n.call(a,"finallyLoc");if(u&&l){if(this.prev<a.catchLoc)return o(a.catchLoc,!0);if(this.prev<a.finallyLoc)return o(a.finallyLoc)}else if(u){if(this.prev<a.catchLoc)return o(a.catchLoc,!0)}else{if(!l)throw Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return o(a.finallyLoc)}}}},abrupt:function(t,e){for(var r=this.tryEntries.length-1;r>=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===t||"continue"===t)&&i.tryLoc<=e&&e<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=t,a.arg=e,i?(this.method="next",this.next=i.finallyLoc,y):this.complete(a)},complete:function(t,e){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&e&&(this.next=e),y},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),j(r),y}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;j(r)}return o}}throw Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:G(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),y}},e}var s=function(t){return/(^http(s?):\/\/[^\s$.?#].[^\s]*)/i.test(t)},f=function(){var t=c(l().mark((function t(e){var r,n,o,a,c,f;return l().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(s(e)){t.next=2;break}return t.abrupt("return",{});case 2:return t.next=4,fetch("https://corsproxy.io/?"+e).then((function(t){return t.text()}));case 4:return r=i.parse(t.sent),n=function(){return new URL(e).hostname},o=function(){var t=r.querySelector("title");return null==t?void 0:t.text},a={},c=r.querySelectorAll("meta").map((function(t){return{name:t.getAttribute("name")||t.getAttribute("property"),content:t.getAttribute("content")}})).filter((function(t){return t.name&&t.content})),["og:title","og:description","twitter:description","og:image","twitter:image","og:url","og:site_name","og:type"].forEach((function(t){var e=c.find((function(e){return e.name===t}));if(e&&e.name){var r=e.name.split(":")[1];a[r]||(a[r]=e.content)}})),["title","description","image"].forEach((function(t){var e=c.find((function(e){return e.name===t}));e&&e.name&&(a[t]||(a[t]=e.content))})),a.image||r.querySelectorAll("img").every((function(t){var r=t.getAttribute("src");return!r||(a.image=new URL(r,e).href,!1)})),f=u({hostname:n(),title:o()},a),t.abrupt("return",f);case 15:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),h=function(t){var n,i=t.url,a=t.children,c=t.loadingMessage,u=t.noPreviewMessage,l=t.showLoading,s=t.showNoPreview,h=e.useRef(!0),p=e.useState({}),v=p[0],d=p[1],y=e.useState(!1),m=y[0],g=y[1],w=!!o.usePlasmicCanvasContext(),b=e.useCallback((function(){d({title:"",description:"",image:"",siteName:"",hostname:""})}),[]);e.useEffect((function(){if(h.current=!0,i)return g(!0),b(),f(i).then((function(t){h.current&&(d(t),g(!1))})).catch((function(t){console.error(t),console.error("No metadata could be found for the given URL."),h.current&&(b(),g(!1))})),function(){h.current=!1}}),[b,i]);var L=!!w&&l,x=!!w&&s,E=null==a?void 0:a.props.children,P=(null==v||null==(n=v.title)?void 0:n.length)&&!v.title.startsWith("Origin DNS error"),N=E?r.createElement(r.Fragment,null,a):r.createElement("p",null,v.title),k=!m&&!P;return r.createElement("div",null,r.createElement(o.DataProvider,{name:"metadata",data:v},r.createElement("div",{style:m||L||x||!P?{display:"none"}:{}},N),(k||x)&&u,(m||L)&&c))};exports.LinkPreview=h,exports.registerLinkPreview=function(t){!function(t,e,r){t?t.registerComponent(e,r):n(e,r)}(t,h,{name:"plasmic-link-preview",providesData:!0,displayName:"Link Preview",props:{url:{type:"string",displayName:"URL",defaultValue:"https://plasmic.app",defaultValueHint:"https://example.com",validator:function(t){return!!s(t)||"Invalid URL"},description:"The URL for which you want to generate the link preview."},children:{type:"slot",hidePlaceholder:!0},noPreviewMessage:{type:"slot",displayName:"'No Preview' Message",hidePlaceholder:!0,defaultValue:[{type:"text",value:"no preview..."}]},showLoading:{type:"boolean",description:"You can enable this prop to show the loading message, so you can easily customize it. This prop has no effect in the live app."},showNoPreview:{type:"boolean",description:"You can enable this prop to show the 'No Preview' message, so you can easily customize it. This prop has no effect in the live app."},loadingMessage:{type:"slot",displayName:"Loading Message",hidePlaceholder:!0,defaultValue:[{type:"text",value:"loading preview..."}]}},importPath:"@plasmicpkgs/plasmic-link-preview",importName:"LinkPreview"})},exports.rlpComponentName="plasmic-link-preview";
|
|
2
2
|
//# sourceMappingURL=plasmic-link-preview.cjs.production.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plasmic-link-preview.cjs.production.min.js","sources":["../src/lib/html-metadata-parser.ts","../src/index.tsx","../src/lib/utils.ts"],"sourcesContent":["import { parse as HTML } from \"node-html-parser\";\n\ninterface Meta {\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n type?: string;\n site_name?: string;\n}\n\nexport interface Metadata {\n title?: string;\n description?: string;\n image?: string;\n siteName?: string;\n hostname?: string;\n}\n\nconst isValidUrl = (url: string) => {\n return /(^http(s?):\\/\\/[^\\s$.?#].[^\\s]*)/i.test(url);\n};\n\nconst getMetadata = async (url: string): Promise<Metadata> => {\n if (!isValidUrl(url)) return {};\n\n const contents = await fetch(`https://corsproxy.io/?${url}`).then((res) =>\n res.text()\n );\n\n const $ = HTML(contents);\n\n const getHostname = () => {\n const { hostname } = new URL(url);\n return hostname;\n };\n\n const getTitle = () => {\n const title = $.querySelector(\"title\");\n return title?.text;\n };\n\n const meta: Meta = {};\n\n const metas = $.querySelectorAll(\"meta\")\n .map((el) => ({\n name: el.getAttribute(\"name\") || el.getAttribute(\"property\"),\n content: el.getAttribute(\"content\"),\n }))\n .filter((item) => item.name && item.content);\n\n [\n \"og:title\",\n \"og:description\",\n \"twitter:description\",\n // in order of priority, og:image is sufficient if present\n \"og:image\",\n \"twitter:image\",\n \"og:url\",\n \"og:site_name\",\n \"og:type\",\n ].forEach((metaName) => {\n const metasItem = metas.find((m) => m.name === metaName);\n if (!metasItem || !metasItem.name) return;\n const key = metasItem.name.split(\":\")[1] as keyof Meta;\n if (!meta[key]) meta[key] = metasItem.content;\n });\n\n [\"title\", \"description\", \"image\"].forEach((metaName) => {\n const metasItem = metas.find((m) => m.name === metaName);\n if (!metasItem || !metasItem.name) return;\n const key = metaName as keyof Meta;\n if (!meta[key]) meta[key] = metasItem.content;\n });\n\n if (!meta.image) {\n // find all images available and choose one!\n $.querySelectorAll(\"img\").every((el) => {\n const src: string | undefined = el.getAttribute(\"src\");\n if (src) {\n meta.image = new URL(src, url).href;\n return false;\n }\n return true;\n });\n }\n\n const metadata: Metadata = {\n hostname: getHostname(),\n title: getTitle(),\n ...meta,\n };\n\n return metadata;\n};\n\nexport default getMetadata;\nexport { isValidUrl };\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Registerable, registerComponentHelper } from \"./lib/utils\";\n\nimport { DataProvider, usePlasmicCanvasContext } from \"@plasmicapp/host\";\nimport getMetadata, { isValidUrl, Metadata } from \"./lib/html-metadata-parser\";\n\nexport type LinkPreviewProps = {\n url: string;\n children: React.ReactNode;\n loadingMessage: React.ReactNode;\n noPreviewMessage: React.ReactNode;\n showLoading: boolean;\n showNoPreview: boolean;\n};\n\nexport const LinkPreview: React.FC<LinkPreviewProps> = ({\n url,\n children,\n loadingMessage,\n noPreviewMessage,\n showLoading,\n showNoPreview,\n}) => {\n const _isMounted = useRef(true);\n const [metadata, setMetadata] = useState<Metadata>({});\n const [isLoading, setIsLoading] = useState(false);\n\n const isEditMode = !!usePlasmicCanvasContext();\n\n const resetMetadata = useCallback(() => {\n setMetadata({\n title: \"\",\n description: \"\",\n image: \"\",\n siteName: \"\",\n hostname: \"\",\n });\n }, []);\n\n useEffect(() => {\n _isMounted.current = true;\n if (!url) return;\n\n setIsLoading(true);\n resetMetadata();\n getMetadata(url)\n .then((res) => {\n if (_isMounted.current) {\n setMetadata(res);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n console.error(err);\n console.error(\"No metadata could be found for the given URL.\");\n if (_isMounted.current) {\n resetMetadata();\n setIsLoading(false);\n }\n });\n return () => {\n _isMounted.current = false;\n };\n }, [resetMetadata, url]);\n\n const showLoadingProp = isEditMode ? showLoading : false;\n const showNoPreviewProp = isEditMode ? showNoPreview : false;\n const hasChildren = (children as any)?.props.children;\n const hasMetadata =\n metadata?.title?.length && !metadata.title.startsWith(\"Origin DNS error\");\n const body = hasChildren ? <>{children}</> : <p>{metadata.title}</p>;\n const hidePreview =\n isLoading || showLoadingProp || showNoPreviewProp || !hasMetadata;\n const hasNoPreview = !isLoading && !hasMetadata;\n\n return (\n <div>\n <DataProvider name=\"metadata\" data={metadata}>\n {/* We want the metadata to always be available to the elements inside children slot. So we use CSS to hide it */}\n <div style={hidePreview ? { display: \"none\" } : {}}>{body}</div>\n {(hasNoPreview || showNoPreviewProp) && noPreviewMessage}\n {(isLoading || showLoadingProp) && loadingMessage}\n </DataProvider>\n </div>\n );\n};\n\nexport const rlpComponentName = \"plasmic-link-preview\";\n\nexport function registerLinkPreview(loader?: Registerable) {\n registerComponentHelper(loader, LinkPreview, {\n name: rlpComponentName,\n providesData: true,\n displayName: \"Link Preview\",\n props: {\n url: {\n type: \"string\",\n displayName: \"URL\",\n defaultValue: \"https://plasmic.app\",\n defaultValueHint: \"https://example.com\",\n validator: (value) => {\n if (isValidUrl(value)) return true;\n return \"Invalid URL\";\n },\n description: \"The URL for which you want to generate the link preview.\",\n },\n children: {\n type: \"slot\",\n hidePlaceholder: true,\n },\n noPreviewMessage: {\n type: \"slot\",\n displayName: \"'No Preview' Message\",\n hidePlaceholder: true,\n defaultValue: [\n {\n type: \"text\",\n value: \"no preview...\",\n },\n ],\n },\n showLoading: {\n type: \"boolean\",\n description:\n \"You can enable this prop to show the loading message, so you can easily customize it. This prop has no effect in the live app.\",\n },\n showNoPreview: {\n type: \"boolean\",\n description:\n \"You can enable this prop to show the 'No Preview' message, so you can easily customize it. This prop has no effect in the live app.\",\n },\n loadingMessage: {\n type: \"slot\",\n displayName: \"Loading Message\",\n hidePlaceholder: true,\n defaultValue: [\n {\n type: \"text\",\n value: \"loading preview...\",\n },\n ],\n },\n },\n importPath: \"@plasmicpkgs/plasmic-link-preview\",\n importName: \"LinkPreview\",\n });\n}\n","import {\n ComponentMeta,\n default as registerComponent,\n} from \"@plasmicapp/host/registerComponent\";\nimport {\n default as registerGlobalContext,\n GlobalContextMeta,\n} from \"@plasmicapp/host/registerGlobalContext\";\nimport { default as registerToken } from \"@plasmicapp/host/registerToken\";\nimport React from \"react\";\n\nexport type Registerable = {\n registerComponent: typeof registerComponent;\n registerGlobalContext: typeof registerGlobalContext;\n registerToken: typeof registerToken;\n};\n\nexport function makeRegisterComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n return function (loader?: Registerable) {\n registerComponentHelper(loader, component, meta);\n };\n}\n\nexport function makeRegisterGlobalContext<T extends React.ComponentType<any>>(\n component: T,\n meta: GlobalContextMeta<React.ComponentProps<T>>\n) {\n return function (loader?: Registerable) {\n if (loader) {\n loader.registerGlobalContext(component, meta);\n } else {\n registerGlobalContext(component, meta);\n }\n };\n}\n\nexport function registerComponentHelper<T extends React.ComponentType<any>>(\n loader: Registerable | undefined,\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n if (loader) {\n loader.registerComponent(component, meta);\n } else {\n registerComponent(component, meta);\n }\n}\n\ntype ReactElt = {\n children: ReactElt | ReactElt[];\n props: {\n children: ReactElt | ReactElt[];\n [prop: string]: any;\n } | null;\n type: React.ComponentType<any> | null;\n key: string | null;\n} | null;\n\nexport function traverseReactEltTree(\n children: React.ReactNode,\n callback: (elt: ReactElt) => void\n) {\n const rec = (elts: ReactElt | ReactElt[] | null) => {\n (Array.isArray(elts) ? elts : [elts]).forEach((elt) => {\n if (elt) {\n callback(elt);\n if (elt.children) {\n rec(elt.children);\n }\n if (elt.props?.children && elt.props.children !== elt.children) {\n rec(elt.props.children);\n }\n }\n });\n };\n rec(children as any);\n}\n\nexport function asArray<T>(x: T[] | T | undefined | null) {\n if (Array.isArray(x)) {\n return x;\n } else if (x == null) {\n return [];\n } else {\n return [x];\n }\n}\n"],"names":["isValidUrl","url","test","getMetadata","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","$","getHostname","getTitle","meta","metas","metadata","wrap","_context","prev","next","abrupt","fetch","then","res","text","HTML","sent","URL","hostname","title","querySelector","querySelectorAll","map","el","name","getAttribute","content","filter","item","forEach","metaName","metasItem","find","m","key","split","image","every","src","href","_extends","stop","_x","apply","arguments","LinkPreview","children","loadingMessage","noPreviewMessage","showLoading","showNoPreview","_isMounted","useRef","_useState","useState","setMetadata","_useState2","isLoading","setIsLoading","isEditMode","usePlasmicCanvasContext","resetMetadata","useCallback","description","siteName","useEffect","current","err","console","error","showLoadingProp","showNoPreviewProp","hasChildren","props","hasMetadata","_metadata$title","length","startsWith","body","React","hasNoPreview","DataProvider","data","style","display","loader","component","registerComponent","registerComponentHelper","providesData","displayName","type","defaultValue","defaultValueHint","validator","value","hidePlaceholder","importPath","importName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plasmic-link-preview.cjs.production.min.js","sources":["../src/lib/html-metadata-parser.ts","../src/index.tsx","../src/lib/utils.ts"],"sourcesContent":["import { parse as HTML } from \"node-html-parser\";\n\ninterface Meta {\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n type?: string;\n site_name?: string;\n}\n\nexport interface Metadata {\n title?: string;\n description?: string;\n image?: string;\n siteName?: string;\n hostname?: string;\n}\n\nconst isValidUrl = (url: string) => {\n return /(^http(s?):\\/\\/[^\\s$.?#].[^\\s]*)/i.test(url);\n};\n\nconst getMetadata = async (url: string): Promise<Metadata> => {\n if (!isValidUrl(url)) return {};\n\n const contents = await fetch(`https://corsproxy.io/?${url}`).then((res) =>\n res.text()\n );\n\n const $ = HTML(contents);\n\n const getHostname = () => {\n const { hostname } = new URL(url);\n return hostname;\n };\n\n const getTitle = () => {\n const title = $.querySelector(\"title\");\n return title?.text;\n };\n\n const meta: Meta = {};\n\n const metas = $.querySelectorAll(\"meta\")\n .map((el) => ({\n name: el.getAttribute(\"name\") || el.getAttribute(\"property\"),\n content: el.getAttribute(\"content\"),\n }))\n .filter((item) => item.name && item.content);\n\n [\n \"og:title\",\n \"og:description\",\n \"twitter:description\",\n // in order of priority, og:image is sufficient if present\n \"og:image\",\n \"twitter:image\",\n \"og:url\",\n \"og:site_name\",\n \"og:type\",\n ].forEach((metaName) => {\n const metasItem = metas.find((m) => m.name === metaName);\n if (!metasItem || !metasItem.name) return;\n const key = metasItem.name.split(\":\")[1] as keyof Meta;\n if (!meta[key]) meta[key] = metasItem.content;\n });\n\n [\"title\", \"description\", \"image\"].forEach((metaName) => {\n const metasItem = metas.find((m) => m.name === metaName);\n if (!metasItem || !metasItem.name) return;\n const key = metaName as keyof Meta;\n if (!meta[key]) meta[key] = metasItem.content;\n });\n\n if (!meta.image) {\n // find all images available and choose one!\n $.querySelectorAll(\"img\").every((el) => {\n const src: string | undefined = el.getAttribute(\"src\");\n if (src) {\n meta.image = new URL(src, url).href;\n return false;\n }\n return true;\n });\n }\n\n const metadata: Metadata = {\n hostname: getHostname(),\n title: getTitle(),\n ...meta,\n };\n\n return metadata;\n};\n\nexport default getMetadata;\nexport { isValidUrl };\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Registerable, registerComponentHelper } from \"./lib/utils\";\n\nimport { DataProvider, usePlasmicCanvasContext } from \"@plasmicapp/host\";\nimport getMetadata, { isValidUrl, Metadata } from \"./lib/html-metadata-parser\";\n\nexport type LinkPreviewProps = {\n url: string;\n children: React.ReactNode;\n loadingMessage: React.ReactNode;\n noPreviewMessage: React.ReactNode;\n showLoading: boolean;\n showNoPreview: boolean;\n};\n\nexport const LinkPreview: React.FC<LinkPreviewProps> = ({\n url,\n children,\n loadingMessage,\n noPreviewMessage,\n showLoading,\n showNoPreview,\n}) => {\n const _isMounted = useRef(true);\n const [metadata, setMetadata] = useState<Metadata>({});\n const [isLoading, setIsLoading] = useState(false);\n\n const isEditMode = !!usePlasmicCanvasContext();\n\n const resetMetadata = useCallback(() => {\n setMetadata({\n title: \"\",\n description: \"\",\n image: \"\",\n siteName: \"\",\n hostname: \"\",\n });\n }, []);\n\n useEffect(() => {\n _isMounted.current = true;\n if (!url) return;\n\n setIsLoading(true);\n resetMetadata();\n getMetadata(url)\n .then((res) => {\n if (_isMounted.current) {\n setMetadata(res);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n console.error(err);\n console.error(\"No metadata could be found for the given URL.\");\n if (_isMounted.current) {\n resetMetadata();\n setIsLoading(false);\n }\n });\n return () => {\n _isMounted.current = false;\n };\n }, [resetMetadata, url]);\n\n const showLoadingProp = isEditMode ? showLoading : false;\n const showNoPreviewProp = isEditMode ? showNoPreview : false;\n const hasChildren = (children as any)?.props.children;\n const hasMetadata =\n metadata?.title?.length && !metadata.title.startsWith(\"Origin DNS error\");\n const body = hasChildren ? <>{children}</> : <p>{metadata.title}</p>;\n const hidePreview =\n isLoading || showLoadingProp || showNoPreviewProp || !hasMetadata;\n const hasNoPreview = !isLoading && !hasMetadata;\n\n return (\n <div>\n <DataProvider name=\"metadata\" data={metadata}>\n {/* We want the metadata to always be available to the elements inside children slot. So we use CSS to hide it */}\n <div style={hidePreview ? { display: \"none\" } : {}}>{body}</div>\n {(hasNoPreview || showNoPreviewProp) && noPreviewMessage}\n {(isLoading || showLoadingProp) && loadingMessage}\n </DataProvider>\n </div>\n );\n};\n\nexport const rlpComponentName = \"plasmic-link-preview\";\n\nexport function registerLinkPreview(loader?: Registerable) {\n registerComponentHelper(loader, LinkPreview, {\n name: rlpComponentName,\n providesData: true,\n displayName: \"Link Preview\",\n props: {\n url: {\n type: \"string\",\n displayName: \"URL\",\n defaultValue: \"https://plasmic.app\",\n defaultValueHint: \"https://example.com\",\n validator: (value) => {\n if (isValidUrl(value)) return true;\n return \"Invalid URL\";\n },\n description: \"The URL for which you want to generate the link preview.\",\n },\n children: {\n type: \"slot\",\n hidePlaceholder: true,\n },\n noPreviewMessage: {\n type: \"slot\",\n displayName: \"'No Preview' Message\",\n hidePlaceholder: true,\n defaultValue: [\n {\n type: \"text\",\n value: \"no preview...\",\n },\n ],\n },\n showLoading: {\n type: \"boolean\",\n description:\n \"You can enable this prop to show the loading message, so you can easily customize it. This prop has no effect in the live app.\",\n },\n showNoPreview: {\n type: \"boolean\",\n description:\n \"You can enable this prop to show the 'No Preview' message, so you can easily customize it. This prop has no effect in the live app.\",\n },\n loadingMessage: {\n type: \"slot\",\n displayName: \"Loading Message\",\n hidePlaceholder: true,\n defaultValue: [\n {\n type: \"text\",\n value: \"loading preview...\",\n },\n ],\n },\n },\n importPath: \"@plasmicpkgs/plasmic-link-preview\",\n importName: \"LinkPreview\",\n });\n}\n","import {\n ComponentMeta,\n default as registerComponent,\n} from \"@plasmicapp/host/registerComponent\";\nimport {\n default as registerGlobalContext,\n GlobalContextMeta,\n} from \"@plasmicapp/host/registerGlobalContext\";\nimport { default as registerToken } from \"@plasmicapp/host/registerToken\";\nimport React from \"react\";\n\nexport type Registerable = {\n registerComponent: typeof registerComponent;\n registerGlobalContext: typeof registerGlobalContext;\n registerToken: typeof registerToken;\n};\n\nexport function makeRegisterComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n return function (loader?: Registerable) {\n registerComponentHelper(loader, component, meta);\n };\n}\n\nexport function makeRegisterGlobalContext<T extends React.ComponentType<any>>(\n component: T,\n meta: GlobalContextMeta<React.ComponentProps<T>>\n) {\n return function (loader?: Registerable) {\n if (loader) {\n loader.registerGlobalContext(component, meta);\n } else {\n registerGlobalContext(component, meta);\n }\n };\n}\n\nexport function registerComponentHelper<T extends React.ComponentType<any>>(\n loader: Registerable | undefined,\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n if (loader) {\n loader.registerComponent(component, meta);\n } else {\n registerComponent(component, meta);\n }\n}\n\ntype ReactElt = {\n children: ReactElt | ReactElt[];\n props: {\n children: ReactElt | ReactElt[];\n [prop: string]: any;\n } | null;\n type: React.ComponentType<any> | null;\n key: string | null;\n} | null;\n\nexport function traverseReactEltTree(\n children: React.ReactNode,\n callback: (elt: ReactElt) => void\n) {\n const rec = (elts: ReactElt | ReactElt[] | null) => {\n (Array.isArray(elts) ? elts : [elts]).forEach((elt) => {\n if (elt) {\n callback(elt);\n if (elt.children) {\n rec(elt.children);\n }\n if (elt.props?.children && elt.props.children !== elt.children) {\n rec(elt.props.children);\n }\n }\n });\n };\n rec(children as any);\n}\n\nexport function asArray<T>(x: T[] | T | undefined | null) {\n if (Array.isArray(x)) {\n return x;\n } else if (x == null) {\n return [];\n } else {\n return [x];\n }\n}\n"],"names":["isValidUrl","url","test","getMetadata","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","$","getHostname","getTitle","meta","metas","metadata","wrap","_context","prev","next","abrupt","fetch","then","res","text","HTML","sent","URL","hostname","title","querySelector","querySelectorAll","map","el","name","getAttribute","content","filter","item","forEach","metaName","metasItem","find","m","key","split","image","every","src","href","_extends","stop","_x","apply","arguments","LinkPreview","children","loadingMessage","noPreviewMessage","showLoading","showNoPreview","_isMounted","useRef","_useState","useState","setMetadata","_useState2","isLoading","setIsLoading","isEditMode","usePlasmicCanvasContext","resetMetadata","useCallback","description","siteName","useEffect","current","err","console","error","showLoadingProp","showNoPreviewProp","hasChildren","props","hasMetadata","_metadata$title","length","startsWith","body","React","hasNoPreview","DataProvider","data","style","display","loader","component","registerComponent","registerComponentHelper","providesData","displayName","type","defaultValue","defaultValueHint","validator","value","hidePlaceholder","importPath","importName"],"mappings":"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"}
|
|
@@ -12,6 +12,40 @@ function registerComponentHelper(loader, component, meta) {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
function asyncGeneratorStep(n, t, e, r, o, a, c) {
|
|
16
|
+
try {
|
|
17
|
+
var i = n[a](c),
|
|
18
|
+
u = i.value;
|
|
19
|
+
} catch (n) {
|
|
20
|
+
return void e(n);
|
|
21
|
+
}
|
|
22
|
+
i.done ? t(u) : Promise.resolve(u).then(r, o);
|
|
23
|
+
}
|
|
24
|
+
function _asyncToGenerator(n) {
|
|
25
|
+
return function () {
|
|
26
|
+
var t = this,
|
|
27
|
+
e = arguments;
|
|
28
|
+
return new Promise(function (r, o) {
|
|
29
|
+
var a = n.apply(t, e);
|
|
30
|
+
function _next(n) {
|
|
31
|
+
asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
|
|
32
|
+
}
|
|
33
|
+
function _throw(n) {
|
|
34
|
+
asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
|
|
35
|
+
}
|
|
36
|
+
_next(void 0);
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function _extends() {
|
|
41
|
+
return _extends = Object.assign ? Object.assign.bind() : function (n) {
|
|
42
|
+
for (var e = 1; e < arguments.length; e++) {
|
|
43
|
+
var t = arguments[e];
|
|
44
|
+
for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
|
|
45
|
+
}
|
|
46
|
+
return n;
|
|
47
|
+
}, _extends.apply(null, arguments);
|
|
48
|
+
}
|
|
15
49
|
function _regeneratorRuntime() {
|
|
16
50
|
_regeneratorRuntime = function () {
|
|
17
51
|
return e;
|
|
@@ -120,7 +154,7 @@ function _regeneratorRuntime() {
|
|
|
120
154
|
function makeInvokeMethod(e, r, n) {
|
|
121
155
|
var o = h;
|
|
122
156
|
return function (i, a) {
|
|
123
|
-
if (o === f) throw
|
|
157
|
+
if (o === f) throw Error("Generator is already running");
|
|
124
158
|
if (o === s) {
|
|
125
159
|
if ("throw" === i) throw a;
|
|
126
160
|
return {
|
|
@@ -262,7 +296,7 @@ function _regeneratorRuntime() {
|
|
|
262
296
|
} else if (c) {
|
|
263
297
|
if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
|
|
264
298
|
} else {
|
|
265
|
-
if (!u) throw
|
|
299
|
+
if (!u) throw Error("try statement without catch or finally");
|
|
266
300
|
if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
|
|
267
301
|
}
|
|
268
302
|
}
|
|
@@ -302,7 +336,7 @@ function _regeneratorRuntime() {
|
|
|
302
336
|
return o;
|
|
303
337
|
}
|
|
304
338
|
}
|
|
305
|
-
throw
|
|
339
|
+
throw Error("illegal catch attempt");
|
|
306
340
|
},
|
|
307
341
|
delegateYield: function (e, r, n) {
|
|
308
342
|
return this.delegate = {
|
|
@@ -313,50 +347,6 @@ function _regeneratorRuntime() {
|
|
|
313
347
|
}
|
|
314
348
|
}, e;
|
|
315
349
|
}
|
|
316
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
317
|
-
try {
|
|
318
|
-
var info = gen[key](arg);
|
|
319
|
-
var value = info.value;
|
|
320
|
-
} catch (error) {
|
|
321
|
-
reject(error);
|
|
322
|
-
return;
|
|
323
|
-
}
|
|
324
|
-
if (info.done) {
|
|
325
|
-
resolve(value);
|
|
326
|
-
} else {
|
|
327
|
-
Promise.resolve(value).then(_next, _throw);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
function _asyncToGenerator(fn) {
|
|
331
|
-
return function () {
|
|
332
|
-
var self = this,
|
|
333
|
-
args = arguments;
|
|
334
|
-
return new Promise(function (resolve, reject) {
|
|
335
|
-
var gen = fn.apply(self, args);
|
|
336
|
-
function _next(value) {
|
|
337
|
-
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
338
|
-
}
|
|
339
|
-
function _throw(err) {
|
|
340
|
-
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
341
|
-
}
|
|
342
|
-
_next(undefined);
|
|
343
|
-
});
|
|
344
|
-
};
|
|
345
|
-
}
|
|
346
|
-
function _extends() {
|
|
347
|
-
_extends = Object.assign ? Object.assign.bind() : function (target) {
|
|
348
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
349
|
-
var source = arguments[i];
|
|
350
|
-
for (var key in source) {
|
|
351
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
352
|
-
target[key] = source[key];
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
return target;
|
|
357
|
-
};
|
|
358
|
-
return _extends.apply(this, arguments);
|
|
359
|
-
}
|
|
360
350
|
|
|
361
351
|
var isValidUrl = function isValidUrl(url) {
|
|
362
352
|
return /(^http(s?):\/\/[^\s$.?#].[^\s]*)/i.test(url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plasmic-link-preview.esm.js","sources":["../src/lib/utils.ts","../src/lib/html-metadata-parser.ts","../src/index.tsx"],"sourcesContent":["import {\n ComponentMeta,\n default as registerComponent,\n} from \"@plasmicapp/host/registerComponent\";\nimport {\n default as registerGlobalContext,\n GlobalContextMeta,\n} from \"@plasmicapp/host/registerGlobalContext\";\nimport { default as registerToken } from \"@plasmicapp/host/registerToken\";\nimport React from \"react\";\n\nexport type Registerable = {\n registerComponent: typeof registerComponent;\n registerGlobalContext: typeof registerGlobalContext;\n registerToken: typeof registerToken;\n};\n\nexport function makeRegisterComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n return function (loader?: Registerable) {\n registerComponentHelper(loader, component, meta);\n };\n}\n\nexport function makeRegisterGlobalContext<T extends React.ComponentType<any>>(\n component: T,\n meta: GlobalContextMeta<React.ComponentProps<T>>\n) {\n return function (loader?: Registerable) {\n if (loader) {\n loader.registerGlobalContext(component, meta);\n } else {\n registerGlobalContext(component, meta);\n }\n };\n}\n\nexport function registerComponentHelper<T extends React.ComponentType<any>>(\n loader: Registerable | undefined,\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n if (loader) {\n loader.registerComponent(component, meta);\n } else {\n registerComponent(component, meta);\n }\n}\n\ntype ReactElt = {\n children: ReactElt | ReactElt[];\n props: {\n children: ReactElt | ReactElt[];\n [prop: string]: any;\n } | null;\n type: React.ComponentType<any> | null;\n key: string | null;\n} | null;\n\nexport function traverseReactEltTree(\n children: React.ReactNode,\n callback: (elt: ReactElt) => void\n) {\n const rec = (elts: ReactElt | ReactElt[] | null) => {\n (Array.isArray(elts) ? elts : [elts]).forEach((elt) => {\n if (elt) {\n callback(elt);\n if (elt.children) {\n rec(elt.children);\n }\n if (elt.props?.children && elt.props.children !== elt.children) {\n rec(elt.props.children);\n }\n }\n });\n };\n rec(children as any);\n}\n\nexport function asArray<T>(x: T[] | T | undefined | null) {\n if (Array.isArray(x)) {\n return x;\n } else if (x == null) {\n return [];\n } else {\n return [x];\n }\n}\n","import { parse as HTML } from \"node-html-parser\";\n\ninterface Meta {\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n type?: string;\n site_name?: string;\n}\n\nexport interface Metadata {\n title?: string;\n description?: string;\n image?: string;\n siteName?: string;\n hostname?: string;\n}\n\nconst isValidUrl = (url: string) => {\n return /(^http(s?):\\/\\/[^\\s$.?#].[^\\s]*)/i.test(url);\n};\n\nconst getMetadata = async (url: string): Promise<Metadata> => {\n if (!isValidUrl(url)) return {};\n\n const contents = await fetch(`https://corsproxy.io/?${url}`).then((res) =>\n res.text()\n );\n\n const $ = HTML(contents);\n\n const getHostname = () => {\n const { hostname } = new URL(url);\n return hostname;\n };\n\n const getTitle = () => {\n const title = $.querySelector(\"title\");\n return title?.text;\n };\n\n const meta: Meta = {};\n\n const metas = $.querySelectorAll(\"meta\")\n .map((el) => ({\n name: el.getAttribute(\"name\") || el.getAttribute(\"property\"),\n content: el.getAttribute(\"content\"),\n }))\n .filter((item) => item.name && item.content);\n\n [\n \"og:title\",\n \"og:description\",\n \"twitter:description\",\n // in order of priority, og:image is sufficient if present\n \"og:image\",\n \"twitter:image\",\n \"og:url\",\n \"og:site_name\",\n \"og:type\",\n ].forEach((metaName) => {\n const metasItem = metas.find((m) => m.name === metaName);\n if (!metasItem || !metasItem.name) return;\n const key = metasItem.name.split(\":\")[1] as keyof Meta;\n if (!meta[key]) meta[key] = metasItem.content;\n });\n\n [\"title\", \"description\", \"image\"].forEach((metaName) => {\n const metasItem = metas.find((m) => m.name === metaName);\n if (!metasItem || !metasItem.name) return;\n const key = metaName as keyof Meta;\n if (!meta[key]) meta[key] = metasItem.content;\n });\n\n if (!meta.image) {\n // find all images available and choose one!\n $.querySelectorAll(\"img\").every((el) => {\n const src: string | undefined = el.getAttribute(\"src\");\n if (src) {\n meta.image = new URL(src, url).href;\n return false;\n }\n return true;\n });\n }\n\n const metadata: Metadata = {\n hostname: getHostname(),\n title: getTitle(),\n ...meta,\n };\n\n return metadata;\n};\n\nexport default getMetadata;\nexport { isValidUrl };\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Registerable, registerComponentHelper } from \"./lib/utils\";\n\nimport { DataProvider, usePlasmicCanvasContext } from \"@plasmicapp/host\";\nimport getMetadata, { isValidUrl, Metadata } from \"./lib/html-metadata-parser\";\n\nexport type LinkPreviewProps = {\n url: string;\n children: React.ReactNode;\n loadingMessage: React.ReactNode;\n noPreviewMessage: React.ReactNode;\n showLoading: boolean;\n showNoPreview: boolean;\n};\n\nexport const LinkPreview: React.FC<LinkPreviewProps> = ({\n url,\n children,\n loadingMessage,\n noPreviewMessage,\n showLoading,\n showNoPreview,\n}) => {\n const _isMounted = useRef(true);\n const [metadata, setMetadata] = useState<Metadata>({});\n const [isLoading, setIsLoading] = useState(false);\n\n const isEditMode = !!usePlasmicCanvasContext();\n\n const resetMetadata = useCallback(() => {\n setMetadata({\n title: \"\",\n description: \"\",\n image: \"\",\n siteName: \"\",\n hostname: \"\",\n });\n }, []);\n\n useEffect(() => {\n _isMounted.current = true;\n if (!url) return;\n\n setIsLoading(true);\n resetMetadata();\n getMetadata(url)\n .then((res) => {\n if (_isMounted.current) {\n setMetadata(res);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n console.error(err);\n console.error(\"No metadata could be found for the given URL.\");\n if (_isMounted.current) {\n resetMetadata();\n setIsLoading(false);\n }\n });\n return () => {\n _isMounted.current = false;\n };\n }, [resetMetadata, url]);\n\n const showLoadingProp = isEditMode ? showLoading : false;\n const showNoPreviewProp = isEditMode ? showNoPreview : false;\n const hasChildren = (children as any)?.props.children;\n const hasMetadata =\n metadata?.title?.length && !metadata.title.startsWith(\"Origin DNS error\");\n const body = hasChildren ? <>{children}</> : <p>{metadata.title}</p>;\n const hidePreview =\n isLoading || showLoadingProp || showNoPreviewProp || !hasMetadata;\n const hasNoPreview = !isLoading && !hasMetadata;\n\n return (\n <div>\n <DataProvider name=\"metadata\" data={metadata}>\n {/* We want the metadata to always be available to the elements inside children slot. So we use CSS to hide it */}\n <div style={hidePreview ? { display: \"none\" } : {}}>{body}</div>\n {(hasNoPreview || showNoPreviewProp) && noPreviewMessage}\n {(isLoading || showLoadingProp) && loadingMessage}\n </DataProvider>\n </div>\n );\n};\n\nexport const rlpComponentName = \"plasmic-link-preview\";\n\nexport function registerLinkPreview(loader?: Registerable) {\n registerComponentHelper(loader, LinkPreview, {\n name: rlpComponentName,\n providesData: true,\n displayName: \"Link Preview\",\n props: {\n url: {\n type: \"string\",\n displayName: \"URL\",\n defaultValue: \"https://plasmic.app\",\n defaultValueHint: \"https://example.com\",\n validator: (value) => {\n if (isValidUrl(value)) return true;\n return \"Invalid URL\";\n },\n description: \"The URL for which you want to generate the link preview.\",\n },\n children: {\n type: \"slot\",\n hidePlaceholder: true,\n },\n noPreviewMessage: {\n type: \"slot\",\n displayName: \"'No Preview' Message\",\n hidePlaceholder: true,\n defaultValue: [\n {\n type: \"text\",\n value: \"no preview...\",\n },\n ],\n },\n showLoading: {\n type: \"boolean\",\n description:\n \"You can enable this prop to show the loading message, so you can easily customize it. This prop has no effect in the live app.\",\n },\n showNoPreview: {\n type: \"boolean\",\n description:\n \"You can enable this prop to show the 'No Preview' message, so you can easily customize it. This prop has no effect in the live app.\",\n },\n loadingMessage: {\n type: \"slot\",\n displayName: \"Loading Message\",\n hidePlaceholder: true,\n defaultValue: [\n {\n type: \"text\",\n value: \"loading preview...\",\n },\n ],\n },\n },\n importPath: \"@plasmicpkgs/plasmic-link-preview\",\n importName: \"LinkPreview\",\n });\n}\n"],"names":["registerComponentHelper","loader","component","meta","registerComponent","isValidUrl","url","test","getMetadata","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","contents","$","getHostname","getTitle","metas","metadata","wrap","_callee$","_context","prev","next","abrupt","fetch","then","res","text","sent","HTML","_URL","URL","hostname","title","querySelector","querySelectorAll","map","el","name","getAttribute","content","filter","item","forEach","metaName","metasItem","find","m","key","split","image","every","src","href","_extends","stop","_x","apply","arguments","LinkPreview","children","loadingMessage","noPreviewMessage","showLoading","showNoPreview","_isMounted","useRef","_useState","useState","setMetadata","_useState2","isLoading","setIsLoading","isEditMode","usePlasmicCanvasContext","resetMetadata","useCallback","description","siteName","useEffect","current","err","console","error","showLoadingProp","showNoPreviewProp","hasChildren","props","hasMetadata","_metadata$title","length","startsWith","body","React","hidePreview","hasNoPreview","DataProvider","data","style","display","rlpComponentName","registerLinkPreview","providesData","displayName","type","defaultValue","defaultValueHint","validator","value","hidePlaceholder","importPath","importName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plasmic-link-preview.esm.js","sources":["../src/lib/utils.ts","../src/lib/html-metadata-parser.ts","../src/index.tsx"],"sourcesContent":["import {\n ComponentMeta,\n default as registerComponent,\n} from \"@plasmicapp/host/registerComponent\";\nimport {\n default as registerGlobalContext,\n GlobalContextMeta,\n} from \"@plasmicapp/host/registerGlobalContext\";\nimport { default as registerToken } from \"@plasmicapp/host/registerToken\";\nimport React from \"react\";\n\nexport type Registerable = {\n registerComponent: typeof registerComponent;\n registerGlobalContext: typeof registerGlobalContext;\n registerToken: typeof registerToken;\n};\n\nexport function makeRegisterComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n return function (loader?: Registerable) {\n registerComponentHelper(loader, component, meta);\n };\n}\n\nexport function makeRegisterGlobalContext<T extends React.ComponentType<any>>(\n component: T,\n meta: GlobalContextMeta<React.ComponentProps<T>>\n) {\n return function (loader?: Registerable) {\n if (loader) {\n loader.registerGlobalContext(component, meta);\n } else {\n registerGlobalContext(component, meta);\n }\n };\n}\n\nexport function registerComponentHelper<T extends React.ComponentType<any>>(\n loader: Registerable | undefined,\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n if (loader) {\n loader.registerComponent(component, meta);\n } else {\n registerComponent(component, meta);\n }\n}\n\ntype ReactElt = {\n children: ReactElt | ReactElt[];\n props: {\n children: ReactElt | ReactElt[];\n [prop: string]: any;\n } | null;\n type: React.ComponentType<any> | null;\n key: string | null;\n} | null;\n\nexport function traverseReactEltTree(\n children: React.ReactNode,\n callback: (elt: ReactElt) => void\n) {\n const rec = (elts: ReactElt | ReactElt[] | null) => {\n (Array.isArray(elts) ? elts : [elts]).forEach((elt) => {\n if (elt) {\n callback(elt);\n if (elt.children) {\n rec(elt.children);\n }\n if (elt.props?.children && elt.props.children !== elt.children) {\n rec(elt.props.children);\n }\n }\n });\n };\n rec(children as any);\n}\n\nexport function asArray<T>(x: T[] | T | undefined | null) {\n if (Array.isArray(x)) {\n return x;\n } else if (x == null) {\n return [];\n } else {\n return [x];\n }\n}\n","import { parse as HTML } from \"node-html-parser\";\n\ninterface Meta {\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n type?: string;\n site_name?: string;\n}\n\nexport interface Metadata {\n title?: string;\n description?: string;\n image?: string;\n siteName?: string;\n hostname?: string;\n}\n\nconst isValidUrl = (url: string) => {\n return /(^http(s?):\\/\\/[^\\s$.?#].[^\\s]*)/i.test(url);\n};\n\nconst getMetadata = async (url: string): Promise<Metadata> => {\n if (!isValidUrl(url)) return {};\n\n const contents = await fetch(`https://corsproxy.io/?${url}`).then((res) =>\n res.text()\n );\n\n const $ = HTML(contents);\n\n const getHostname = () => {\n const { hostname } = new URL(url);\n return hostname;\n };\n\n const getTitle = () => {\n const title = $.querySelector(\"title\");\n return title?.text;\n };\n\n const meta: Meta = {};\n\n const metas = $.querySelectorAll(\"meta\")\n .map((el) => ({\n name: el.getAttribute(\"name\") || el.getAttribute(\"property\"),\n content: el.getAttribute(\"content\"),\n }))\n .filter((item) => item.name && item.content);\n\n [\n \"og:title\",\n \"og:description\",\n \"twitter:description\",\n // in order of priority, og:image is sufficient if present\n \"og:image\",\n \"twitter:image\",\n \"og:url\",\n \"og:site_name\",\n \"og:type\",\n ].forEach((metaName) => {\n const metasItem = metas.find((m) => m.name === metaName);\n if (!metasItem || !metasItem.name) return;\n const key = metasItem.name.split(\":\")[1] as keyof Meta;\n if (!meta[key]) meta[key] = metasItem.content;\n });\n\n [\"title\", \"description\", \"image\"].forEach((metaName) => {\n const metasItem = metas.find((m) => m.name === metaName);\n if (!metasItem || !metasItem.name) return;\n const key = metaName as keyof Meta;\n if (!meta[key]) meta[key] = metasItem.content;\n });\n\n if (!meta.image) {\n // find all images available and choose one!\n $.querySelectorAll(\"img\").every((el) => {\n const src: string | undefined = el.getAttribute(\"src\");\n if (src) {\n meta.image = new URL(src, url).href;\n return false;\n }\n return true;\n });\n }\n\n const metadata: Metadata = {\n hostname: getHostname(),\n title: getTitle(),\n ...meta,\n };\n\n return metadata;\n};\n\nexport default getMetadata;\nexport { isValidUrl };\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Registerable, registerComponentHelper } from \"./lib/utils\";\n\nimport { DataProvider, usePlasmicCanvasContext } from \"@plasmicapp/host\";\nimport getMetadata, { isValidUrl, Metadata } from \"./lib/html-metadata-parser\";\n\nexport type LinkPreviewProps = {\n url: string;\n children: React.ReactNode;\n loadingMessage: React.ReactNode;\n noPreviewMessage: React.ReactNode;\n showLoading: boolean;\n showNoPreview: boolean;\n};\n\nexport const LinkPreview: React.FC<LinkPreviewProps> = ({\n url,\n children,\n loadingMessage,\n noPreviewMessage,\n showLoading,\n showNoPreview,\n}) => {\n const _isMounted = useRef(true);\n const [metadata, setMetadata] = useState<Metadata>({});\n const [isLoading, setIsLoading] = useState(false);\n\n const isEditMode = !!usePlasmicCanvasContext();\n\n const resetMetadata = useCallback(() => {\n setMetadata({\n title: \"\",\n description: \"\",\n image: \"\",\n siteName: \"\",\n hostname: \"\",\n });\n }, []);\n\n useEffect(() => {\n _isMounted.current = true;\n if (!url) return;\n\n setIsLoading(true);\n resetMetadata();\n getMetadata(url)\n .then((res) => {\n if (_isMounted.current) {\n setMetadata(res);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n console.error(err);\n console.error(\"No metadata could be found for the given URL.\");\n if (_isMounted.current) {\n resetMetadata();\n setIsLoading(false);\n }\n });\n return () => {\n _isMounted.current = false;\n };\n }, [resetMetadata, url]);\n\n const showLoadingProp = isEditMode ? showLoading : false;\n const showNoPreviewProp = isEditMode ? showNoPreview : false;\n const hasChildren = (children as any)?.props.children;\n const hasMetadata =\n metadata?.title?.length && !metadata.title.startsWith(\"Origin DNS error\");\n const body = hasChildren ? <>{children}</> : <p>{metadata.title}</p>;\n const hidePreview =\n isLoading || showLoadingProp || showNoPreviewProp || !hasMetadata;\n const hasNoPreview = !isLoading && !hasMetadata;\n\n return (\n <div>\n <DataProvider name=\"metadata\" data={metadata}>\n {/* We want the metadata to always be available to the elements inside children slot. So we use CSS to hide it */}\n <div style={hidePreview ? { display: \"none\" } : {}}>{body}</div>\n {(hasNoPreview || showNoPreviewProp) && noPreviewMessage}\n {(isLoading || showLoadingProp) && loadingMessage}\n </DataProvider>\n </div>\n );\n};\n\nexport const rlpComponentName = \"plasmic-link-preview\";\n\nexport function registerLinkPreview(loader?: Registerable) {\n registerComponentHelper(loader, LinkPreview, {\n name: rlpComponentName,\n providesData: true,\n displayName: \"Link Preview\",\n props: {\n url: {\n type: \"string\",\n displayName: \"URL\",\n defaultValue: \"https://plasmic.app\",\n defaultValueHint: \"https://example.com\",\n validator: (value) => {\n if (isValidUrl(value)) return true;\n return \"Invalid URL\";\n },\n description: \"The URL for which you want to generate the link preview.\",\n },\n children: {\n type: \"slot\",\n hidePlaceholder: true,\n },\n noPreviewMessage: {\n type: \"slot\",\n displayName: \"'No Preview' Message\",\n hidePlaceholder: true,\n defaultValue: [\n {\n type: \"text\",\n value: \"no preview...\",\n },\n ],\n },\n showLoading: {\n type: \"boolean\",\n description:\n \"You can enable this prop to show the loading message, so you can easily customize it. This prop has no effect in the live app.\",\n },\n showNoPreview: {\n type: \"boolean\",\n description:\n \"You can enable this prop to show the 'No Preview' message, so you can easily customize it. This prop has no effect in the live app.\",\n },\n loadingMessage: {\n type: \"slot\",\n displayName: \"Loading Message\",\n hidePlaceholder: true,\n defaultValue: [\n {\n type: \"text\",\n value: \"loading preview...\",\n },\n ],\n },\n },\n importPath: \"@plasmicpkgs/plasmic-link-preview\",\n importName: \"LinkPreview\",\n });\n}\n"],"names":["registerComponentHelper","loader","component","meta","registerComponent","isValidUrl","url","test","getMetadata","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","contents","$","getHostname","getTitle","metas","metadata","wrap","_callee$","_context","prev","next","abrupt","fetch","then","res","text","sent","HTML","_URL","URL","hostname","title","querySelector","querySelectorAll","map","el","name","getAttribute","content","filter","item","forEach","metaName","metasItem","find","m","key","split","image","every","src","href","_extends","stop","_x","apply","arguments","LinkPreview","children","loadingMessage","noPreviewMessage","showLoading","showNoPreview","_isMounted","useRef","_useState","useState","setMetadata","_useState2","isLoading","setIsLoading","isEditMode","usePlasmicCanvasContext","resetMetadata","useCallback","description","siteName","useEffect","current","err","console","error","showLoadingProp","showNoPreviewProp","hasChildren","props","hasMetadata","_metadata$title","length","startsWith","body","React","hidePreview","hasNoPreview","DataProvider","data","style","display","rlpComponentName","registerLinkPreview","providesData","displayName","type","defaultValue","defaultValueHint","validator","value","hidePlaceholder","importPath","importName"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plasmicpkgs/plasmic-link-preview",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.110",
|
|
4
4
|
"description": "A React component that renders beautiful, fully-customizable link previews.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@plasmicapp/data-sources": "0.1.141",
|
|
32
|
-
"@plasmicapp/host": "1.0.
|
|
32
|
+
"@plasmicapp/host": "1.0.213",
|
|
33
33
|
"@size-limit/preset-small-lib": "^4.11.0",
|
|
34
34
|
"@types/node": "^14.0.26",
|
|
35
35
|
"@types/react": "^18.2.33",
|
|
@@ -49,5 +49,5 @@
|
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"node-html-parser": "^6.1.11"
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "3a42fbf1505e2f4e51f0a4d93cb4de16617bba84"
|
|
53
53
|
}
|