@plasmicpkgs/plasmic-link-preview 1.0.83 → 1.0.85

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.
@@ -365,31 +365,27 @@ function _extends() {
365
365
  return _extends.apply(this, arguments);
366
366
  }
367
367
 
368
- var readMT = function readMT(el, name) {
369
- var prop = el.getAttribute("name") || el.getAttribute("property");
370
- return prop == name ? el.getAttribute("content") : null;
371
- };
372
368
  var isValidUrl = function isValidUrl(url) {
373
369
  return /(^http(s?):\/\/[^\s$.?#].[^\s]*)/i.test(url);
374
370
  };
375
371
  var getMetadata = /*#__PURE__*/function () {
376
372
  var _ref = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(url) {
377
- var contents, $, getHostname, getTitle, metas, meta, _loop, i, metadata;
378
- return _regeneratorRuntime().wrap(function _callee$(_context2) {
379
- while (1) switch (_context2.prev = _context2.next) {
373
+ var contents, $, getHostname, getTitle, meta, metas, metadata;
374
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
375
+ while (1) switch (_context.prev = _context.next) {
380
376
  case 0:
381
377
  if (isValidUrl(url)) {
382
- _context2.next = 2;
378
+ _context.next = 2;
383
379
  break;
384
380
  }
385
- return _context2.abrupt("return", {});
381
+ return _context.abrupt("return", {});
386
382
  case 2:
387
- _context2.next = 4;
383
+ _context.next = 4;
388
384
  return fetch("https://corsproxy.io/?" + url).then(function (res) {
389
385
  return res.text();
390
386
  });
391
387
  case 4:
392
- contents = _context2.sent;
388
+ contents = _context.sent;
393
389
  $ = nodeHtmlParser.parse(contents);
394
390
  getHostname = function getHostname() {
395
391
  var _URL = new URL(url),
@@ -400,57 +396,52 @@ var getMetadata = /*#__PURE__*/function () {
400
396
  var title = $.querySelector("title");
401
397
  return title == null ? void 0 : title.text;
402
398
  };
403
- metas = $.querySelectorAll("meta");
404
399
  meta = {};
405
- _loop = /*#__PURE__*/_regeneratorRuntime().mark(function _loop() {
406
- var el;
407
- return _regeneratorRuntime().wrap(function _loop$(_context) {
408
- while (1) switch (_context.prev = _context.next) {
409
- case 0:
410
- el = metas[i];
411
- ["title", "description", "image"].forEach(function (s) {
412
- var val = readMT(el, s);
413
- if (val) meta[s] = val;
414
- });
415
- ["og:title", "og:description", "og:image", "og:url", "og:site_name", "og:type"].forEach(function (s) {
416
- var val = readMT(el, s);
417
- if (val) meta[s.split(":")[1]] = val;
418
- });
419
- case 3:
420
- case "end":
421
- return _context.stop();
422
- }
423
- }, _loop);
400
+ metas = $.querySelectorAll("meta").map(function (el) {
401
+ return {
402
+ name: el.getAttribute("name") || el.getAttribute("property"),
403
+ content: el.getAttribute("content")
404
+ };
405
+ }).filter(function (item) {
406
+ return item.name && item.content;
424
407
  });
425
- i = 0;
426
- case 12:
427
- if (!(i < metas.length)) {
428
- _context2.next = 17;
429
- break;
430
- }
431
- return _context2.delegateYield(_loop(), "t0", 14);
432
- case 14:
433
- i++;
434
- _context2.next = 12;
435
- break;
436
- case 17:
437
- // images
438
- $.querySelectorAll("img").every(function (el) {
439
- var src = el.getAttribute("src");
440
- if (src) {
441
- meta.image = new URL(src, url).href;
442
- return false;
443
- }
444
- return true;
408
+ ["og:title", "og:description", "twitter:description",
409
+ // in order of priority, og:image is sufficient if present
410
+ "og:image", "twitter:image", "og:url", "og:site_name", "og:type"].forEach(function (metaName) {
411
+ var metasItem = metas.find(function (m) {
412
+ return m.name === metaName;
413
+ });
414
+ if (!metasItem || !metasItem.name) return;
415
+ var key = metasItem.name.split(":")[1];
416
+ if (!meta[key]) meta[key] = metasItem.content;
417
+ });
418
+ ["title", "description", "image"].forEach(function (metaName) {
419
+ var metasItem = metas.find(function (m) {
420
+ return m.name === metaName;
421
+ });
422
+ if (!metasItem || !metasItem.name) return;
423
+ var key = metaName;
424
+ if (!meta[key]) meta[key] = metasItem.content;
445
425
  });
426
+ if (!meta.image) {
427
+ // find all images available and choose one!
428
+ $.querySelectorAll("img").every(function (el) {
429
+ var src = el.getAttribute("src");
430
+ if (src) {
431
+ meta.image = new URL(src, url).href;
432
+ return false;
433
+ }
434
+ return true;
435
+ });
436
+ }
446
437
  metadata = _extends({
447
438
  hostname: getHostname(),
448
439
  title: getTitle()
449
440
  }, meta);
450
- return _context2.abrupt("return", metadata);
451
- case 20:
441
+ return _context.abrupt("return", metadata);
442
+ case 15:
452
443
  case "end":
453
- return _context2.stop();
444
+ return _context.stop();
454
445
  }
455
446
  }, _callee);
456
447
  }));
@@ -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 { HTMLElement, 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 readMT = (el: HTMLElement, name: string) => {\n const prop = el.getAttribute(\"name\") || el.getAttribute(\"property\");\n return prop == name ? el.getAttribute(\"content\") : null;\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 metas = $.querySelectorAll(\"meta\");\n const meta: Meta = {};\n\n for (let i = 0; i < metas.length; i++) {\n const el = metas[i];\n\n [\"title\", \"description\", \"image\"].forEach((s) => {\n const val = readMT(el, s);\n if (val) meta[s as keyof Meta] = val;\n });\n\n [\n \"og:title\",\n \"og:description\",\n \"og:image\",\n \"og:url\",\n \"og:site_name\",\n \"og:type\",\n ].forEach((s) => {\n const val = readMT(el, s);\n if (val) meta[s.split(\":\")[1] as keyof Meta] = val;\n });\n }\n\n // images\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 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","readMT","el","name","prop","getAttribute","isValidUrl","url","test","getMetadata","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","contents","$","getHostname","getTitle","metas","_loop","i","metadata","wrap","_callee$","_context2","prev","next","abrupt","fetch","then","res","text","sent","HTML","_URL","URL","hostname","title","querySelector","querySelectorAll","_loop$","_context","forEach","s","val","split","stop","length","delegateYield","every","src","image","href","_extends","_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","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",s=i.toStringTag||"@@toStringTag";function l(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{l({},"")}catch(t){l=function(t,e,r){return t[e]=r}}function h(t,e,r,n){var i=Object.create((e&&e.prototype instanceof g?e:g).prototype),a=new S(n||[]);return o(i,"_invoke",{value:N(t,r,a)}),i}function f(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=h;var p="suspendedStart",v="executing",d="completed",y={};function g(){}function m(){}function w(){}var b={};l(b,c,(function(){return this}));var x=Object.getPrototypeOf,L=x&&x(x(G([])));L&&L!==r&&n.call(L,c)&&(b=L);var E=w.prototype=g.prototype=Object.create(b);function P(t){["next","throw","return"].forEach((function(e){l(t,e,(function(t){return this._invoke(e,t)}))}))}function k(t,e){function r(o,i,a,c){var u=f(t[o],t,i);if("throw"!==u.type){var s=u.arg,l=s.value;return l&&"object"==typeof l&&n.call(l,"__await")?e.resolve(l.__await).then((function(t){r("next",t,a,c)}),(function(t){r("throw",t,a,c)})):e.resolve(l).then((function(t){s.value=t,a(s)}),(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 N(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 s=f(e,r,n);if("normal"===s.type){if(o=n.done?d:"suspendedYield",s.arg===y)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(o=d,n.method="throw",n.arg=s.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=f(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 m.prototype=w,o(E,"constructor",{value:w,configurable:!0}),o(w,"constructor",{value:m,configurable:!0}),m.displayName=l(w,s,"GeneratorFunction"),e.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===m||"GeneratorFunction"===(e.displayName||e.name))},e.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,w):(t.__proto__=w,l(t,s,"GeneratorFunction")),t.prototype=Object.create(E),t},e.awrap=function(t){return{__await:t}},P(k.prototype),l(k.prototype,u,(function(){return this})),e.AsyncIterator=k,e.async=function(t,r,n,o,i){void 0===i&&(i=Promise);var a=new k(h(t,r,n,o),i);return e.isGeneratorFunction(r)?a:a.next().then((function(t){return t.done?t.value:a.next()}))},P(E),l(E,s,"Generator"),l(E,c,(function(){return this})),l(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"),s=n.call(a,"finallyLoc");if(u&&s){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(!s)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 s(){return(s=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 l=function(t,e){return(t.getAttribute("name")||t.getAttribute("property"))==e?t.getAttribute("content"):null},h=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,p,v;return a().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(h(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: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=r.querySelectorAll("meta"),u={},f=a().mark((function t(){var e;return a().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e=c[p],["title","description","image"].forEach((function(t){var r=l(e,t);r&&(u[t]=r)})),["og:title","og:description","og:image","og:url","og:site_name","og:type"].forEach((function(t){var r=l(e,t);r&&(u[t.split(":")[1]]=r)}));case 3:case"end":return t.stop()}}),t)})),p=0;case 12:if(!(p<c.length)){t.next=17;break}return t.delegateYield(f(),"t0",14);case 14:p++,t.next=12;break;case 17:return r.querySelectorAll("img").every((function(t){var r=t.getAttribute("src");return!r||(u.image=new URL(r,e).href,!1)})),v=s({hostname:n(),title:o()},u),t.abrupt("return",v);case 20:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),p=function(t){var n,i=t.url,a=t.children,c=t.loadingMessage,u=t.noPreviewMessage,s=t.showLoading,l=t.showNoPreview,h=e.useRef(!0),p=e.useState({}),v=p[0],d=p[1],y=e.useState(!1),g=y[0],m=y[1],w=!!o.usePlasmicCanvasContext(),b=e.useCallback((function(){d({title:"",description:"",image:"",siteName:"",hostname:""})}),[]);e.useEffect((function(){if(h.current=!0,i)return m(!0),b(),f(i).then((function(t){h.current&&(d(t),m(!1))})).catch((function(t){console.error(t),console.error("No metadata could be found for the given URL."),h.current&&(b(),m(!1))})),function(){h.current=!1}}),[b,i]);var x=!!w&&s,L=!!w&&l,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"),k=E?r.createElement(r.Fragment,null,a):r.createElement("p",null,v.title),N=!g&&!P;return r.createElement("div",null,r.createElement(o.DataProvider,{name:"metadata",data:v},r.createElement("div",{style:g||x||L||!P?{display:"none"}:{}},k),(N||L)&&u,(g||x)&&c))};exports.LinkPreview=p,exports.registerLinkPreview=function(t){!function(t,e,r){t?t.registerComponent(e,r):n(e,r)}(t,p,{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!!h(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(){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";
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 { HTMLElement, 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 readMT = (el: HTMLElement, name: string) => {\n const prop = el.getAttribute(\"name\") || el.getAttribute(\"property\");\n return prop == name ? el.getAttribute(\"content\") : null;\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 metas = $.querySelectorAll(\"meta\");\n const meta: Meta = {};\n\n for (let i = 0; i < metas.length; i++) {\n const el = metas[i];\n\n [\"title\", \"description\", \"image\"].forEach((s) => {\n const val = readMT(el, s);\n if (val) meta[s as keyof Meta] = val;\n });\n\n [\n \"og:title\",\n \"og:description\",\n \"og:image\",\n \"og:url\",\n \"og:site_name\",\n \"og:type\",\n ].forEach((s) => {\n const val = readMT(el, s);\n if (val) meta[s.split(\":\")[1] as keyof Meta] = val;\n });\n }\n\n // images\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 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":["readMT","el","name","getAttribute","isValidUrl","url","test","getMetadata","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","$","getHostname","getTitle","metas","meta","_loop","i","metadata","wrap","_context2","prev","next","abrupt","fetch","then","res","text","HTML","sent","URL","hostname","title","querySelector","querySelectorAll","_context","forEach","s","val","split","stop","length","delegateYield","every","src","image","href","_extends","_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","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":"wtOAmBA,IAAMA,EAAa,SAACC,GAClB,MAAO,oCAAoCC,KAAKD,IAG5CE,aAAW,IAAAC,EAAAC,EAAAC,IAAAC,MAAG,SAAAC,EAAOP,GAAW,IAAAQ,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAR,IAAAS,eAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,OAAA,GAC/BlB,EAAWC,IAAIe,EAAAE,OAAA,MAAA,OAAAF,EAAAG,gBAAS,IAAE,OAAA,OAAAH,EAAAE,OAERE,+BAA+BnB,GAAOoB,MAAK,SAACC,GAAG,OACpEA,EAAIC,UACL,OA8DQ,OA5DHd,EAAIe,QAJIR,EAAAS,MAMRf,EAAc,WAElB,OADqB,IAAIgB,IAAIzB,GAArB0B,UAIJhB,EAAW,WACf,IAAMiB,EAAQnB,EAAEoB,cAAc,SAC9B,aAAOD,SAAAA,EAAOL,MAGVX,EAAa,GAEbC,EAAQJ,EAAEqB,iBAAiB,QAC9BC,KAAI,SAACC,GAAE,MAAM,CACZC,KAAMD,EAAGE,aAAa,SAAWF,EAAGE,aAAa,YACjDC,QAASH,EAAGE,aAAa,eAE1BE,QAAO,SAACC,GAAI,OAAKA,EAAKJ,MAAQI,EAAKF,WAEtC,CACE,WACA,iBACA,sBAEA,WACA,gBACA,SACA,eACA,WACAG,SAAQ,SAACC,GACT,IAAMC,EAAY3B,EAAM4B,MAAK,SAACC,GAAC,OAAKA,EAAET,OAASM,KAC/C,GAAKC,GAAcA,EAAUP,KAA7B,CACA,IAAMU,EAAMH,EAAUP,KAAKW,MAAM,KAAK,GACjChC,EAAK+B,KAAM/B,EAAK+B,GAAOH,EAAUL,aAGxC,CAAC,QAAS,cAAe,SAASG,SAAQ,SAACC,GACzC,IAAMC,EAAY3B,EAAM4B,MAAK,SAACC,GAAC,OAAKA,EAAET,OAASM,KAC1CC,GAAcA,EAAUP,OAExBrB,EADO2B,KACI3B,EADJ2B,GACgBC,EAAUL,aAGnCvB,EAAKiC,OAERpC,EAAEqB,iBAAiB,OAAOgB,OAAM,SAACd,GAC/B,IAAMe,EAA0Bf,EAAGE,aAAa,OAChD,OAAIa,IACFnC,EAAKiC,MAAQ,IAAInB,IAAIqB,EAAK9C,GAAK+C,MACxB,MAMPlC,EAAQmC,GACZtB,SAAUjB,IACVkB,MAAOjB,KACJC,GAAII,EAAAG,gBAGFL,GAAQ,QAAA,UAAA,OAAAE,EAAAkC,UAAA1C,OAChB,gBAvEgB2C,GAAA,OAAA/C,EAAAgD,WAAAC,eCRJC,EAA0C,SAA/BlD,SACtBH,EAAGG,EAAHH,IACAsD,EAAQnD,EAARmD,SACAC,EAAcpD,EAAdoD,eACAC,EAAgBrD,EAAhBqD,iBACAC,EAAWtD,EAAXsD,YACAC,EAAavD,EAAbuD,cAEMC,EAAaC,UAAO,GAC1BC,EAAgCC,WAAmB,IAA5CjD,EAAQgD,KAAEE,EAAWF,KAC5BG,EAAkCF,YAAS,GAApCG,EAASD,KAAEE,EAAYF,KAExBG,IAAeC,4BAEfC,EAAgBC,eAAY,WAChCP,EAAY,CACVpC,MAAO,GACP4C,YAAa,GACb3B,MAAO,GACP4B,SAAU,GACV9C,SAAU,OAEX,IAEH+C,aAAU,WAER,GADAd,EAAWe,SAAU,EAChB1E,EAmBL,OAjBAkE,GAAa,GACbG,IACAnE,EAAYF,GACToB,MAAK,SAACC,GACDsC,EAAWe,UACbX,EAAY1C,GACZ6C,GAAa,cAGV,SAACS,GACNC,QAAQC,MAAMF,GACdC,QAAQC,MAAM,iDACVlB,EAAWe,UACbL,IACAH,GAAa,OAGZ,WACLP,EAAWe,SAAU,KAEtB,CAACL,EAAerE,IAEnB,IAAM8E,IAAkBX,GAAaV,EAC/BsB,IAAoBZ,GAAaT,EACjCsB,QAAe1B,SAAAA,EAAkB2B,MAAM3B,SACvC4B,SACJrE,UAAQsE,EAARtE,EAAUc,cAAVwD,EAAiBC,UAAWvE,EAASc,MAAM0D,WAAW,oBAClDC,EAAON,EAAcO,gCAAGjC,GAAeiC,yBAAI1E,EAASc,OAGpD6D,GAAgBvB,IAAciB,EAEpC,OACEK,2BACEA,gBAACE,gBAAazD,KAAK,WAAW0D,KAAM7E,GAElC0E,uBAAKI,MAPT1B,GAAaa,GAAmBC,IAAsBG,EAOxB,CAAEU,QAAS,QAAW,IAAKN,IACnDE,GAAgBT,IAAsBvB,GACtCS,GAAaa,IAAoBvB,gEAQPsC,aCjDlCA,EACAC,EACAnF,GAEIkF,EACFA,EAAOE,kBAAkBD,EAAWnF,GAEpCoF,EAAkBD,EAAWnF,GD2C/BqF,CAAwBH,EAAQxC,EAAa,CAC3CrB,KAJ4B,uBAK5BiE,cAAc,EACdC,YAAa,eACbjB,MAAO,CACLjF,IAAK,CACHmG,KAAM,SACND,YAAa,MACbE,aAAc,sBACdC,iBAAkB,sBAClBC,UAAW,SAACC,GACV,QAAIxG,EAAWwG,IACR,eAEThC,YAAa,4DAEfjB,SAAU,CACR6C,KAAM,OACNK,iBAAiB,GAEnBhD,iBAAkB,CAChB2C,KAAM,OACND,YAAa,uBACbM,iBAAiB,EACjBJ,aAAc,CACZ,CACED,KAAM,OACNI,MAAO,mBAIb9C,YAAa,CACX0C,KAAM,UACN5B,YACE,kIAEJb,cAAe,CACbyC,KAAM,UACN5B,YACE,uIAEJhB,eAAgB,CACd4C,KAAM,OACND,YAAa,kBACbM,iBAAiB,EACjBJ,aAAc,CACZ,CACED,KAAM,OACNI,MAAO,yBAKfE,WAAY,oCACZC,WAAY,0CAzDgB"}
@@ -358,31 +358,27 @@ function _extends() {
358
358
  return _extends.apply(this, arguments);
359
359
  }
360
360
 
361
- var readMT = function readMT(el, name) {
362
- var prop = el.getAttribute("name") || el.getAttribute("property");
363
- return prop == name ? el.getAttribute("content") : null;
364
- };
365
361
  var isValidUrl = function isValidUrl(url) {
366
362
  return /(^http(s?):\/\/[^\s$.?#].[^\s]*)/i.test(url);
367
363
  };
368
364
  var getMetadata = /*#__PURE__*/function () {
369
365
  var _ref = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(url) {
370
- var contents, $, getHostname, getTitle, metas, meta, _loop, i, metadata;
371
- return _regeneratorRuntime().wrap(function _callee$(_context2) {
372
- while (1) switch (_context2.prev = _context2.next) {
366
+ var contents, $, getHostname, getTitle, meta, metas, metadata;
367
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
368
+ while (1) switch (_context.prev = _context.next) {
373
369
  case 0:
374
370
  if (isValidUrl(url)) {
375
- _context2.next = 2;
371
+ _context.next = 2;
376
372
  break;
377
373
  }
378
- return _context2.abrupt("return", {});
374
+ return _context.abrupt("return", {});
379
375
  case 2:
380
- _context2.next = 4;
376
+ _context.next = 4;
381
377
  return fetch("https://corsproxy.io/?" + url).then(function (res) {
382
378
  return res.text();
383
379
  });
384
380
  case 4:
385
- contents = _context2.sent;
381
+ contents = _context.sent;
386
382
  $ = parse(contents);
387
383
  getHostname = function getHostname() {
388
384
  var _URL = new URL(url),
@@ -393,57 +389,52 @@ var getMetadata = /*#__PURE__*/function () {
393
389
  var title = $.querySelector("title");
394
390
  return title == null ? void 0 : title.text;
395
391
  };
396
- metas = $.querySelectorAll("meta");
397
392
  meta = {};
398
- _loop = /*#__PURE__*/_regeneratorRuntime().mark(function _loop() {
399
- var el;
400
- return _regeneratorRuntime().wrap(function _loop$(_context) {
401
- while (1) switch (_context.prev = _context.next) {
402
- case 0:
403
- el = metas[i];
404
- ["title", "description", "image"].forEach(function (s) {
405
- var val = readMT(el, s);
406
- if (val) meta[s] = val;
407
- });
408
- ["og:title", "og:description", "og:image", "og:url", "og:site_name", "og:type"].forEach(function (s) {
409
- var val = readMT(el, s);
410
- if (val) meta[s.split(":")[1]] = val;
411
- });
412
- case 3:
413
- case "end":
414
- return _context.stop();
415
- }
416
- }, _loop);
393
+ metas = $.querySelectorAll("meta").map(function (el) {
394
+ return {
395
+ name: el.getAttribute("name") || el.getAttribute("property"),
396
+ content: el.getAttribute("content")
397
+ };
398
+ }).filter(function (item) {
399
+ return item.name && item.content;
417
400
  });
418
- i = 0;
419
- case 12:
420
- if (!(i < metas.length)) {
421
- _context2.next = 17;
422
- break;
423
- }
424
- return _context2.delegateYield(_loop(), "t0", 14);
425
- case 14:
426
- i++;
427
- _context2.next = 12;
428
- break;
429
- case 17:
430
- // images
431
- $.querySelectorAll("img").every(function (el) {
432
- var src = el.getAttribute("src");
433
- if (src) {
434
- meta.image = new URL(src, url).href;
435
- return false;
436
- }
437
- return true;
401
+ ["og:title", "og:description", "twitter:description",
402
+ // in order of priority, og:image is sufficient if present
403
+ "og:image", "twitter:image", "og:url", "og:site_name", "og:type"].forEach(function (metaName) {
404
+ var metasItem = metas.find(function (m) {
405
+ return m.name === metaName;
406
+ });
407
+ if (!metasItem || !metasItem.name) return;
408
+ var key = metasItem.name.split(":")[1];
409
+ if (!meta[key]) meta[key] = metasItem.content;
410
+ });
411
+ ["title", "description", "image"].forEach(function (metaName) {
412
+ var metasItem = metas.find(function (m) {
413
+ return m.name === metaName;
414
+ });
415
+ if (!metasItem || !metasItem.name) return;
416
+ var key = metaName;
417
+ if (!meta[key]) meta[key] = metasItem.content;
438
418
  });
419
+ if (!meta.image) {
420
+ // find all images available and choose one!
421
+ $.querySelectorAll("img").every(function (el) {
422
+ var src = el.getAttribute("src");
423
+ if (src) {
424
+ meta.image = new URL(src, url).href;
425
+ return false;
426
+ }
427
+ return true;
428
+ });
429
+ }
439
430
  metadata = _extends({
440
431
  hostname: getHostname(),
441
432
  title: getTitle()
442
433
  }, meta);
443
- return _context2.abrupt("return", metadata);
444
- case 20:
434
+ return _context.abrupt("return", metadata);
435
+ case 15:
445
436
  case "end":
446
- return _context2.stop();
437
+ return _context.stop();
447
438
  }
448
439
  }, _callee);
449
440
  }));
@@ -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 { HTMLElement, 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 readMT = (el: HTMLElement, name: string) => {\n const prop = el.getAttribute(\"name\") || el.getAttribute(\"property\");\n return prop == name ? el.getAttribute(\"content\") : null;\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 metas = $.querySelectorAll(\"meta\");\n const meta: Meta = {};\n\n for (let i = 0; i < metas.length; i++) {\n const el = metas[i];\n\n [\"title\", \"description\", \"image\"].forEach((s) => {\n const val = readMT(el, s);\n if (val) meta[s as keyof Meta] = val;\n });\n\n [\n \"og:title\",\n \"og:description\",\n \"og:image\",\n \"og:url\",\n \"og:site_name\",\n \"og:type\",\n ].forEach((s) => {\n const val = readMT(el, s);\n if (val) meta[s.split(\":\")[1] as keyof Meta] = val;\n });\n }\n\n // images\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 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","readMT","el","name","prop","getAttribute","isValidUrl","url","test","getMetadata","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","contents","$","getHostname","getTitle","metas","_loop","i","metadata","wrap","_callee$","_context2","prev","next","abrupt","fetch","then","res","text","sent","HTML","_URL","URL","hostname","title","querySelector","querySelectorAll","_loop$","_context","forEach","s","val","split","stop","length","delegateYield","every","src","image","href","_extends","_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","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.83",
3
+ "version": "1.0.85",
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",
@@ -28,8 +28,8 @@
28
28
  "analyze": "size-limit --why"
29
29
  },
30
30
  "devDependencies": {
31
- "@plasmicapp/data-sources": "0.1.136",
32
- "@plasmicapp/host": "1.0.178",
31
+ "@plasmicapp/data-sources": "0.1.141",
32
+ "@plasmicapp/host": "1.0.188",
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": "a834834304554aa592ea1c434ac41e0d2503557a"
52
+ "gitHead": "594aedc08ba8399a46ef84977fbfc6130ba8e4c5"
53
53
  }