jsonresume-theme-field-researcher 0.2.2 → 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 +6 -0
- package/dist/index.js +94 -21
- package/index.jsx +9 -19
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,7 +1,29 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
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)
|
|
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
|
|
6671
|
-
|
|
6672
|
-
|
|
6673
|
-
|
|
6674
|
-
|
|
6675
|
-
|
|
6676
|
-
|
|
6677
|
-
|
|
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 {
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
}
|