jsonresume-theme-field-researcher 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # jsonresume-theme-field-researcher
2
2
 
3
+ ## 0.2.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 5c23cd2: use @jsonresume/core/ssr renderResumeDocument
8
+
9
+ ## 0.2.2
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies [ff0f85b]
14
+ - @jsonresume/core@0.3.0
15
+
3
16
  ## 0.2.1
4
17
 
5
18
  ### Patch Changes
package/dist/index.js CHANGED
@@ -1,7 +1,29 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { renderToString } from "react-dom/server";
3
- import { __spreadArray, __assign } from "tslib";
2
+ import { renderToStaticMarkup } from "react-dom/server";
4
3
  import o, { useRef, useContext, useState, useMemo, useEffect, useDebugValue, createElement, createContext } from "react";
4
+ var __assign = function() {
5
+ __assign = Object.assign || function __assign2(t) {
6
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
7
+ s = arguments[i];
8
+ for (var p2 in s) if (Object.prototype.hasOwnProperty.call(s, p2)) t[p2] = s[p2];
9
+ }
10
+ return t;
11
+ };
12
+ return __assign.apply(this, arguments);
13
+ };
14
+ function __spreadArray(to, from2, pack) {
15
+ if (pack || arguments.length === 2) for (var i = 0, l = from2.length, ar; i < l; i++) {
16
+ if (ar || !(i in from2)) {
17
+ if (!ar) ar = Array.prototype.slice.call(from2, 0, i);
18
+ ar[i] = from2[i];
19
+ }
20
+ }
21
+ return to.concat(ar || Array.prototype.slice.call(from2));
22
+ }
23
+ typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
24
+ var e = new Error(message);
25
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
26
+ };
5
27
  function memoize(fn) {
6
28
  var cache = /* @__PURE__ */ Object.create(null);
7
29
  return function(arg) {
@@ -1278,6 +1300,65 @@ var vt = /^\s*<\/[a-z]/i, gt = (function() {
1278
1300
  "production" !== process.env.NODE_ENV && "undefined" != typeof navigator && "ReactNative" === navigator.product && console.warn("It looks like you've imported 'styled-components' on React Native.\nPerhaps you're looking to import 'styled-components/native'?\nRead more about this at https://www.styled-components.com/docs/basics#react-native");
1279
1301
  var wt = "__sc-".concat(f, "__");
1280
1302
  "production" !== process.env.NODE_ENV && "test" !== process.env.NODE_ENV && "undefined" != typeof window && (window[wt] || (window[wt] = 0), 1 === window[wt] && console.warn("It looks like there are several instances of 'styled-components' initialized in this application. This may cause dynamic styles to not render properly, errors during the rehydration process, a missing theme prop, and makes your application bigger without good reason.\n\nSee https://s-c.sh/2BAXzed for more info."), window[wt] += 1);
1303
+ const CSS_RESET = "<style>*,*::before,*::after{box-sizing:border-box}html,body{margin:0;padding:0}body{-webkit-font-smoothing:antialiased}</style>";
1304
+ const TOKENS_CSS_HREF = "https://unpkg.com/@jsonresume/core/dist/tokens.css";
1305
+ const FONTS_PRECONNECT = '<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>';
1306
+ function isHref(value) {
1307
+ return /^(https?:)?\/\//.test(value) || value.trim().startsWith("<link");
1308
+ }
1309
+ function familyParam(family) {
1310
+ const [name, ...rest] = String(family).split(":");
1311
+ const encodedName = name.trim().replace(/\s+/g, "+");
1312
+ return rest.length ? `${encodedName}:${rest.join(":")}` : encodedName;
1313
+ }
1314
+ function googleFontsLinks(families) {
1315
+ if (!Array.isArray(families) || families.length === 0) return "";
1316
+ const passthrough = [];
1317
+ const names = [];
1318
+ for (const entry of families) {
1319
+ if (entry == null || entry === "") continue;
1320
+ if (isHref(entry)) passthrough.push(entry);
1321
+ else names.push(entry);
1322
+ }
1323
+ const links = passthrough.map(
1324
+ (href) => href.trim().startsWith("<link") ? href : `<link href="${href}" rel="stylesheet">`
1325
+ );
1326
+ if (names.length > 0) {
1327
+ const query = names.map(familyParam).join("&family=");
1328
+ links.unshift(
1329
+ `<link href="https://fonts.googleapis.com/css2?family=${query}&display=swap" rel="stylesheet">`
1330
+ );
1331
+ }
1332
+ if (links.length === 0) return "";
1333
+ return FONTS_PRECONNECT + links.join("");
1334
+ }
1335
+ function renderResumeDocument(element, options = {}) {
1336
+ const {
1337
+ fonts,
1338
+ title,
1339
+ lang = "en",
1340
+ dir = "ltr",
1341
+ reset = false,
1342
+ head = "",
1343
+ includeTokensCss = true,
1344
+ bodyClass
1345
+ } = options;
1346
+ const sheet = new gt();
1347
+ let html;
1348
+ let styleTags;
1349
+ try {
1350
+ html = renderToStaticMarkup(sheet.collectStyles(element));
1351
+ styleTags = sheet.getStyleTags();
1352
+ } finally {
1353
+ sheet.seal();
1354
+ }
1355
+ const fontLinks = googleFontsLinks(fonts);
1356
+ const tokensLink = includeTokensCss ? `<link rel="stylesheet" href="${TOKENS_CSS_HREF}">` : "";
1357
+ const resetTag = reset ? CSS_RESET : "";
1358
+ const titleTag = title ? `<title>${title}</title>` : "";
1359
+ const bodyAttr = bodyClass ? ` class="${bodyClass}"` : "";
1360
+ return `<!DOCTYPE html><html lang="${lang}" dir="${dir}"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">` + fontLinks + tokensLink + resetTag + head + styleTags + titleTag + `</head><body${bodyAttr}>${html}</body></html>`;
1361
+ }
1281
1362
  createContext({
1282
1363
  theme: "professional",
1283
1364
  setTheme: () => {
@@ -1455,7 +1536,9 @@ function formatDateRange({
1455
1536
  return formatter.format(date);
1456
1537
  };
1457
1538
  const start = formatDate(startDate);
1458
- if (endDate === void 0) return start;
1539
+ if (endDate === void 0) {
1540
+ return start;
1541
+ }
1459
1542
  const end = formatDate(endDate);
1460
1543
  return `${start} - ${end}`;
1461
1544
  }
@@ -1576,7 +1659,6 @@ function safeUrl(url) {
1576
1659
  const trimmed = url.trim();
1577
1660
  const dangerousProtocols = /^(javascript|data|vbscript|file|about):/i;
1578
1661
  if (dangerousProtocols.test(trimmed)) {
1579
- console.warn(`[Security] Blocked dangerous URL: ${trimmed.slice(0, 50)}`);
1580
1662
  return null;
1581
1663
  }
1582
1664
  const safeProtocols = /^(https?|mailto|tel|sms|ftp):/i;
@@ -1592,7 +1674,6 @@ function safeUrl(url) {
1592
1674
  if (/^[a-z0-9][a-z0-9.-]+\.[a-z]{2,}$/i.test(trimmed)) {
1593
1675
  return `https://${trimmed}`;
1594
1676
  }
1595
- console.warn(`[Security] Uncertain URL safety: ${trimmed.slice(0, 50)}`);
1596
1677
  return trimmed;
1597
1678
  }
1598
1679
  function isExternalUrl(url, currentOrigin = null) {
@@ -6663,23 +6744,15 @@ function Resume({ resume = {} }) {
6663
6744
  ] });
6664
6745
  }
6665
6746
  function render(resume) {
6666
- const sheet = new gt();
6667
- const html = renderToString(sheet.collectStyles(/* @__PURE__ */ jsx(Resume, { resume })));
6668
- const styles = sheet.getStyleTags();
6669
6747
  const title = resume.basics && resume.basics.name || "Resume";
6670
- return `<!DOCTYPE html>
6671
- <html lang="en">
6672
- <head>
6673
- <meta charset="utf-8">
6674
- <title>${title}</title>
6675
- <meta name="viewport" content="width=device-width, initial-scale=1">
6676
- <link rel="preconnect" href="https://fonts.googleapis.com">
6677
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
6678
- <link href="https://fonts.googleapis.com/css2?family=Spectral:ital,wght@0,400;0,500;0,600;0,700;1,400&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
6679
- ${styles}
6680
- </head>
6681
- <body>${html}</body>
6682
- </html>`;
6748
+ return renderResumeDocument(/* @__PURE__ */ jsx(Resume, { resume }), {
6749
+ fonts: [
6750
+ "Spectral:ital,wght@0,400;0,500;0,600;0,700;1,400",
6751
+ "IBM Plex Mono:wght@400;500;600"
6752
+ ],
6753
+ title,
6754
+ includeTokensCss: false
6755
+ });
6683
6756
  }
6684
6757
  export {
6685
6758
  render
package/index.jsx CHANGED
@@ -1,24 +1,14 @@
1
- import { renderToString } from 'react-dom/server';
2
- import { ServerStyleSheet } from 'styled-components';
1
+ import { renderResumeDocument } from '@jsonresume/core/ssr';
3
2
  import Resume from './src/Resume.jsx';
4
3
 
5
4
  export function render(resume) {
6
- const sheet = new ServerStyleSheet();
7
- const html = renderToString(sheet.collectStyles(<Resume resume={resume} />));
8
- const styles = sheet.getStyleTags();
9
5
  const title = (resume.basics && resume.basics.name) || 'Resume';
10
-
11
- return `<!DOCTYPE html>
12
- <html lang="en">
13
- <head>
14
- <meta charset="utf-8">
15
- <title>${title}</title>
16
- <meta name="viewport" content="width=device-width, initial-scale=1">
17
- <link rel="preconnect" href="https://fonts.googleapis.com">
18
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
19
- <link href="https://fonts.googleapis.com/css2?family=Spectral:ital,wght@0,400;0,500;0,600;0,700;1,400&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
20
- ${styles}
21
- </head>
22
- <body>${html}</body>
23
- </html>`;
6
+ return renderResumeDocument(<Resume resume={resume} />, {
7
+ fonts: [
8
+ 'Spectral:ital,wght@0,400;0,500;0,600;0,700;1,400',
9
+ 'IBM Plex Mono:wght@400;500;600',
10
+ ],
11
+ title,
12
+ includeTokensCss: false,
13
+ });
24
14
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jsonresume-theme-field-researcher",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./index.jsx",
@@ -13,7 +13,7 @@
13
13
  },
14
14
  "dependencies": {
15
15
  "styled-components": "^6.1.19",
16
- "@jsonresume/core": "0.2.0"
16
+ "@jsonresume/core": "0.3.0"
17
17
  },
18
18
  "exports": {
19
19
  ".": {