@paroicms/public-server-lib 0.6.0

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/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # @paroicms/public-server-lib
2
+
3
+ Common utilitaries for paroicms plugins.
4
+
5
+ This package is part of [ParoiCMS](https://www.npmjs.com/package/@paroicms/server).
6
+
7
+ ## License
8
+
9
+ Released under the [MIT license](https://gitlab.com/paroi/opensource/paroicms/-/blob/main/LICENSE.md).
@@ -0,0 +1,11 @@
1
+ export declare function escapeHtml(text: string, options?: {
2
+ newLinesToBr?: boolean;
3
+ }): string;
4
+ export declare function decodeHtmlEntities(str: string): string;
5
+ export declare function newLinesToBr(text: string): string;
6
+ export declare function htmlToText(html: string): string;
7
+ export declare function stripHtmlTags(html: string, { blockSeparator }?: {
8
+ blockSeparator?: string;
9
+ }): string;
10
+ export declare function insertBlockSeparators(html: string, sep: string): string;
11
+ export declare function replaceLinks(html: string): string;
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ // TODO: Remove all Rome ignore comment and resolve issues
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.replaceLinks = exports.insertBlockSeparators = exports.stripHtmlTags = exports.htmlToText = exports.newLinesToBr = exports.decodeHtmlEntities = exports.escapeHtml = void 0;
5
+ /**
6
+ * @see https://stackoverflow.com/a/4835406/3786294
7
+ */
8
+ const htmlEntities = {
9
+ "&": "&",
10
+ "<": "&lt;",
11
+ ">": "&gt;",
12
+ '"': "&quot;",
13
+ "'": "&#039;",
14
+ };
15
+ function escapeHtml(text, options = {}) {
16
+ let val = text;
17
+ val = val.replace(/[&<>"']/g, (m) => htmlEntities[m]);
18
+ if (options.newLinesToBr) {
19
+ val = newLinesToBr(val);
20
+ }
21
+ return val;
22
+ }
23
+ exports.escapeHtml = escapeHtml;
24
+ function decodeHtmlEntities(str) {
25
+ const entities = {
26
+ "&lt;": "<",
27
+ "&#60;": "<",
28
+ "&#x3C;": "<",
29
+ "&gt;": ">",
30
+ "&#62;": ">",
31
+ "&#x3E;": ">",
32
+ "&#47;": "/",
33
+ "&#x2F;": "/",
34
+ "&apos;": "'",
35
+ "&#39;": "'",
36
+ "&#x27;": "'",
37
+ "&quot;": '"',
38
+ "&#34;": '"',
39
+ "&#x22;": '"',
40
+ "&amp;": "&",
41
+ "&#38;": "&",
42
+ "&#x26;": "&",
43
+ };
44
+ return str.replace(/&lt;|&#60;|&#x3C;|&gt;|&#62;|&#x3E;|&#47;|&#x2F;|&apos;|&#39;|&#x27;|&quot;|&#34;|&#x22;|&amp;|&#38;|&#x26;/g, (match) => entities[match]);
45
+ }
46
+ exports.decodeHtmlEntities = decodeHtmlEntities;
47
+ function newLinesToBr(text) {
48
+ return text.replace(/(?:\r\n|\r|\n)/g, "<br>\n");
49
+ }
50
+ exports.newLinesToBr = newLinesToBr;
51
+ function htmlToText(html) {
52
+ return stripHtmlTags(replaceLinks(html));
53
+ }
54
+ exports.htmlToText = htmlToText;
55
+ /**
56
+ * Thanks to https://stackoverflow.com/a/430240/3786294
57
+ */
58
+ const tagBody = "(?:[^\"'>]|\"[^\"]*\"|'[^']*')*";
59
+ const tagOrComment = new RegExp(`<(?:!--(?:(?:-*[^->])*--+|-?)|script\\b${tagBody}>[\\s\\S]*?</script\\s*|style\\b${tagBody}>[\\s\\S]*?</style\\s*|/?[a-z]${tagBody})>`, "gi");
60
+ function stripHtmlTags(html, { blockSeparator } = {}) {
61
+ let val = blockSeparator ? insertBlockSeparators(html, blockSeparator) : html;
62
+ val = val.replace(/<br\s*\/?>/gi, "\n");
63
+ let prev;
64
+ do {
65
+ prev = val;
66
+ val = val.replace(tagOrComment, "");
67
+ } while (val !== prev);
68
+ if (blockSeparator && val.endsWith(blockSeparator)) {
69
+ val = val.slice(0, -blockSeparator.length);
70
+ }
71
+ return decodeHtmlEntities(val);
72
+ }
73
+ exports.stripHtmlTags = stripHtmlTags;
74
+ function insertBlockSeparators(html, sep) {
75
+ const regex = /(\w)(<\/(?:address|article|aside|blockquote|canvas|dd|div|dl|dt|fieldset|figcaption|figure|footer|form|h[1-6]|header|hr|li|main|nav|noscript|ol|p|pre|section|table|tfoot|ul|video)>)/g;
76
+ return html.replace(regex, (_, p1, p2) => `${p1}${sep}${p2}`);
77
+ }
78
+ exports.insertBlockSeparators = insertBlockSeparators;
79
+ function replaceLinks(html) {
80
+ return html.replace(/<a\s+[^>]*href="([^"]*)"[^>]*>([^<]*)<\/a>/gi, (_, url, label) => {
81
+ return `${label.trim()} ( ${url} )`;
82
+ });
83
+ }
84
+ exports.replaceLinks = replaceLinks;
85
+ //# sourceMappingURL=html-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-helpers.js","sourceRoot":"","sources":["../../src/html-helpers/html-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type * from "../types/backend-plugin-types";
2
+ export type * from "../types/plugin-site-context-types";
3
+ export * from "./html-helpers/html-helpers";
4
+ export * from "./obfuscate.helper";
5
+ export * from "./server-image-cache-engine.helper";
6
+ export * from "./simple-i18n";
7
+ export * from "./url.helpers";
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./html-helpers/html-helpers"), exports);
18
+ __exportStar(require("./obfuscate.helper"), exports);
19
+ __exportStar(require("./server-image-cache-engine.helper"), exports);
20
+ __exportStar(require("./simple-i18n"), exports);
21
+ __exportStar(require("./url.helpers"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,8DAA4C;AAC5C,qDAAmC;AACnC,qEAAmD;AACnD,gDAA8B;AAC9B,gDAA8B"}
@@ -0,0 +1,2 @@
1
+ export declare function generateObfuscatedHtml(inputString: string): string;
2
+ export declare function obfuscateAsHtmlLink(phoneOrEmail: string): string;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.obfuscateAsHtmlLink = exports.generateObfuscatedHtml = void 0;
4
+ const html_helpers_1 = require("./html-helpers/html-helpers");
5
+ function generateObfuscatedHtml(inputString) {
6
+ const jsString = JSON.stringify(btoa(inputString));
7
+ return `<script>document.write(atob(${jsString}))</script>`;
8
+ }
9
+ exports.generateObfuscatedHtml = generateObfuscatedHtml;
10
+ function obfuscateAsHtmlLink(phoneOrEmail) {
11
+ return generateObfuscatedHtml(generateTargetHtml(phoneOrEmail));
12
+ }
13
+ exports.obfuscateAsHtmlLink = obfuscateAsHtmlLink;
14
+ function generateTargetHtml(str) {
15
+ const inputString = str.trim();
16
+ const linkString = generateLinkString(inputString);
17
+ return `<a href="${(0, html_helpers_1.escapeHtml)(linkString)}">${(0, html_helpers_1.escapeHtml)(inputString)}</a>`;
18
+ }
19
+ function generateLinkString(inputString) {
20
+ if (inputString.includes("@")) {
21
+ return `mailto:${inputString}`;
22
+ }
23
+ const plus = inputString.startsWith("+");
24
+ const allDigits = inputString.replaceAll(/[^0-9]/g, "");
25
+ return plus ? `tel:+${allDigits}` : `tel:${allDigits}`;
26
+ }
27
+ //# sourceMappingURL=obfuscate.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obfuscate.helper.js","sourceRoot":"","sources":["../src/obfuscate.helper.ts"],"names":[],"mappings":";;;AAAA,8DAAyD;AAEzD,SAAgB,sBAAsB,CAAC,WAAmB;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACnD,OAAO,+BAA+B,QAAQ,aAAa,CAAC;AAC9D,CAAC;AAHD,wDAGC;AAED,SAAgB,mBAAmB,CAAC,YAAoB;IACtD,OAAO,sBAAsB,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC;AAClE,CAAC;AAFD,kDAEC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACnD,OAAO,YAAY,IAAA,yBAAU,EAAC,UAAU,CAAC,KAAK,IAAA,yBAAU,EAAC,WAAW,CAAC,MAAM,CAAC;AAC9E,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAmB;IAC7C,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,UAAU,WAAW,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,SAAS,EAAE,CAAC;AACzD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ImageSize, VariantName } from "@paroicms/public-anywhere-lib";
2
+ export declare function isImageSize(imageSize: string): imageSize is ImageSize;
3
+ export declare function isVariantName(variantName: string): variantName is VariantName;
4
+ export declare function generateImageSlug(fromName?: string): string | undefined;
5
+ export declare function applyRatioToImageSize(imageSize: ImageSize, pixelRatio: number): ImageSize;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyRatioToImageSize = exports.generateImageSlug = exports.isVariantName = exports.isImageSize = void 0;
4
+ const data_formatters_lib_1 = require("@paroi/data-formatters-lib");
5
+ const internal_anywhere_lib_1 = require("@paroicms/internal-anywhere-lib");
6
+ function isImageSize(imageSize) {
7
+ return /^[0-9]+x|x[0-9]+|x[0-9]+x|[0-9]+x[0-9]+$/.test(imageSize);
8
+ }
9
+ exports.isImageSize = isImageSize;
10
+ function isVariantName(variantName) {
11
+ return /^[0-9]+x[0-9]+$/.test(variantName);
12
+ }
13
+ exports.isVariantName = isVariantName;
14
+ function generateImageSlug(fromName) {
15
+ if (!fromName)
16
+ return;
17
+ return (0, internal_anywhere_lib_1.generateSlug)(fromName).substring(0, 12).replace(/-$/g, "");
18
+ }
19
+ exports.generateImageSlug = generateImageSlug;
20
+ function applyRatioToImageSize(imageSize, pixelRatio) {
21
+ const splitted = imageSize.split("x");
22
+ if (splitted.length === 3) {
23
+ const value = splitted[1];
24
+ splitted[1] = `${Math.round((0, data_formatters_lib_1.nbVal)(value) * pixelRatio)}`;
25
+ }
26
+ else if (splitted.length === 2) {
27
+ const width = splitted[0];
28
+ const height = splitted[1];
29
+ if (height !== "")
30
+ splitted[1] = `${Math.round((0, data_formatters_lib_1.nbVal)(height) * pixelRatio)}`;
31
+ if (width !== "")
32
+ splitted[0] = `${Math.round((0, data_formatters_lib_1.nbVal)(width) * pixelRatio)}`;
33
+ }
34
+ return splitted.join("x");
35
+ }
36
+ exports.applyRatioToImageSize = applyRatioToImageSize;
37
+ //# sourceMappingURL=server-image-cache-engine.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-image-cache-engine.helper.js","sourceRoot":"","sources":["../src/server-image-cache-engine.helper.ts"],"names":[],"mappings":";;;AAAA,oEAAmD;AACnD,2EAA+D;AAG/D,SAAgB,WAAW,CAAC,SAAiB;IAC3C,OAAO,0CAA0C,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACpE,CAAC;AAFD,kCAEC;AAED,SAAgB,aAAa,CAAC,WAAmB;IAC/C,OAAO,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC7C,CAAC;AAFD,sCAEC;AAED,SAAgB,iBAAiB,CAAC,QAAiB;IACjD,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,OAAO,IAAA,oCAAY,EAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACpE,CAAC;AAHD,8CAGC;AAED,SAAgB,qBAAqB,CAAC,SAAoB,EAAE,UAAkB;IAC5E,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,2BAAK,EAAC,KAAK,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;IAC3D,CAAC;SAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE3B,IAAI,MAAM,KAAK,EAAE;YAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,2BAAK,EAAC,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;QAC7E,IAAI,KAAK,KAAK,EAAE;YAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,2BAAK,EAAC,KAAK,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;IAC7E,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAc,CAAC;AACzC,CAAC;AAfD,sDAeC"}
@@ -0,0 +1,14 @@
1
+ import type { AppLog } from "../types/plugin-site-context-types";
2
+ export interface SimpleTranslator {
3
+ translate: (options: SimpleTranslateOptions) => string;
4
+ }
5
+ export interface SimpleTranslateOptions {
6
+ language: string;
7
+ key: string;
8
+ args?: (string | number)[];
9
+ }
10
+ export declare function createSimpleTranslator(options: {
11
+ l10nDir: string;
12
+ languages: string[];
13
+ appLog: Pick<AppLog, "warn">;
14
+ }): Promise<SimpleTranslator>;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSimpleTranslator = void 0;
4
+ const data_formatters_lib_1 = require("@paroi/data-formatters-lib");
5
+ const promises_1 = require("node:fs/promises");
6
+ const node_path_1 = require("node:path");
7
+ async function createSimpleTranslator(options) {
8
+ const labels = await loadLabels(options);
9
+ return {
10
+ translate: (options) => translate(labels, options),
11
+ };
12
+ }
13
+ exports.createSimpleTranslator = createSimpleTranslator;
14
+ function translate(labels, { args = [], key, language }) {
15
+ let label = labels.get(language)?.[key] ?? key;
16
+ const variables = findVariablesInString(label, args.length);
17
+ variables.reverse();
18
+ for (const { indexInString, variableName, variableNumber } of variables) {
19
+ const value = args[variableNumber - 1];
20
+ const before = label.substring(0, indexInString);
21
+ const after = label.substring(indexInString + variableName.length);
22
+ label = `${before}${value}${after}`;
23
+ }
24
+ return label;
25
+ }
26
+ function findVariablesInString(str, max) {
27
+ const matches = [];
28
+ const regex = /\$[0-9]+/g;
29
+ let match;
30
+ while (true) {
31
+ match = regex.exec(str);
32
+ if (!match)
33
+ break;
34
+ const [variableName] = match;
35
+ const variableNumber = (0, data_formatters_lib_1.nbVal)(variableName.substring(1), { varName: variableName });
36
+ if (variableNumber <= max) {
37
+ matches.push({
38
+ variableName,
39
+ variableNumber,
40
+ indexInString: match.index,
41
+ });
42
+ }
43
+ }
44
+ return matches;
45
+ }
46
+ async function loadLabels({ l10nDir, languages, appLog, }) {
47
+ const labels = new Map();
48
+ for (const language of languages) {
49
+ let content;
50
+ try {
51
+ content = await (0, promises_1.readFile)((0, node_path_1.join)(l10nDir, `${language}.json`), "utf-8");
52
+ }
53
+ catch {
54
+ continue; // it's fine, there is no locale file for this language
55
+ }
56
+ try {
57
+ labels.set(language, flattenLocales(JSON.parse(content)));
58
+ }
59
+ catch {
60
+ appLog.warn(`invalid locale file '${(0, node_path_1.join)(l10nDir, `${language}.json`)}'`);
61
+ }
62
+ }
63
+ return labels;
64
+ }
65
+ function flattenLocales(source, prefix = "") {
66
+ const result = {};
67
+ for (const [key, val] of Object.entries(source)) {
68
+ if (val === null)
69
+ throw new Error(`invalid null value for '${key}'`);
70
+ if (typeof val === "string") {
71
+ result[`${prefix}${key}`] = val;
72
+ }
73
+ else if (typeof val === "object") {
74
+ Object.assign(result, flattenLocales(val, `${prefix}${key}.`));
75
+ }
76
+ else {
77
+ throw new Error(`invalid value for '${key}'`);
78
+ }
79
+ }
80
+ return result;
81
+ }
82
+ //# sourceMappingURL=simple-i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-i18n.js","sourceRoot":"","sources":["../src/simple-i18n.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { VariantName } from "@paroicms/public-anywhere-lib";
2
+ import type { PluginSiteContext } from "../types/plugin-site-context-types";
3
+ export interface GetBoUrlOptions {
4
+ path?: string;
5
+ publicProtocol: string;
6
+ boPort: number;
7
+ fqdn: string;
8
+ }
9
+ export declare function getBoUrl({ path, fqdn, publicProtocol, boPort }: GetBoUrlOptions): string;
10
+ export interface UrlOfMediaFileValues {
11
+ mediaUid: string;
12
+ mediaType: string;
13
+ originalName: string | undefined;
14
+ absoluteUrl?: boolean;
15
+ }
16
+ export declare function makeUrlOfMediaFile(siteContext: Pick<PluginSiteContext, "siteUrl">, values: UrlOfMediaFileValues): string;
17
+ export declare function makeUrlOfMediaFile(siteContext: Pick<PluginSiteContext, "siteUrl">, values: UrlOfMediaFileValues, options: {
18
+ returnObj: true;
19
+ }): {
20
+ url: string;
21
+ fileName: string;
22
+ };
23
+ export interface UrlOfImageVariantValues {
24
+ mediaUid: string;
25
+ mediaType: string;
26
+ variantName: VariantName;
27
+ resourceVersion: string | undefined;
28
+ slug: string | undefined;
29
+ absoluteUrl?: boolean;
30
+ }
31
+ export declare function makeUrlOfImageVariant(siteContext: Pick<PluginSiteContext, "siteUrl">, values: UrlOfImageVariantValues): string;
32
+ export declare function makeUrlOfImageVariant(siteContext: Pick<PluginSiteContext, "siteUrl">, values: UrlOfImageVariantValues, options: {
33
+ returnObj: true;
34
+ }): {
35
+ url: string;
36
+ fileName: string;
37
+ };
38
+ export declare function fileExtensionOf(mediaType: string): string;
39
+ export declare function toAbsoluteUrl(siteContext: Pick<PluginSiteContext, "siteUrl">, url: string): string;
40
+ export declare function makeFeedUrl(siteContext: Pick<PluginSiteContext, "multilingual" | "siteUrl">, language?: string): string;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeFeedUrl = exports.toAbsoluteUrl = exports.fileExtensionOf = exports.makeUrlOfImageVariant = exports.makeUrlOfMediaFile = exports.getBoUrl = void 0;
4
+ function getBoUrl({ path, fqdn, publicProtocol, boPort }) {
5
+ return `${publicProtocol}://${fqdn}${boPort === 80 ? "" : `:${boPort}`}${path ?? ""}`;
6
+ }
7
+ exports.getBoUrl = getBoUrl;
8
+ function makeUrlOfMediaFile(siteContext, values, options) {
9
+ const { mediaUid, mediaType, originalName, absoluteUrl } = values;
10
+ const fileName = `${originalName ?? "unamed"}${fileExtensionOf(mediaType)}`;
11
+ const relUrl = `/medias/${encodeURIComponent(mediaUid)}/file/${encodeURIComponent(fileName)}`;
12
+ const url = absoluteUrl ? toAbsoluteUrl(siteContext, relUrl) : relUrl;
13
+ return options?.returnObj ? { url, fileName } : url;
14
+ }
15
+ exports.makeUrlOfMediaFile = makeUrlOfMediaFile;
16
+ function makeUrlOfImageVariant(siteContext, values, options) {
17
+ const { mediaUid, mediaType, variantName, slug, resourceVersion, absoluteUrl } = values;
18
+ const fileName = `${slug ?? "unamed"}-${variantName}${fileExtensionOf(mediaType)}`;
19
+ let relUrl;
20
+ if (resourceVersion) {
21
+ relUrl = `/medias/${encodeURIComponent(mediaUid)}/image/${encodeURIComponent(resourceVersion)}/${encodeURIComponent(fileName)}`;
22
+ }
23
+ else {
24
+ relUrl = `/medias/${encodeURIComponent(mediaUid)}/image/${encodeURIComponent(fileName)}`;
25
+ }
26
+ const url = absoluteUrl ? toAbsoluteUrl(siteContext, relUrl) : relUrl;
27
+ return options?.returnObj ? { url, fileName } : url;
28
+ }
29
+ exports.makeUrlOfImageVariant = makeUrlOfImageVariant;
30
+ function fileExtensionOf(mediaType) {
31
+ const regexMatchArray = mediaType.match(/\w+\/([-+.\w]+)/);
32
+ if (!regexMatchArray) {
33
+ throw new Error("media extension is incorrect.");
34
+ }
35
+ return `.${regexMatchArray[1]}`;
36
+ }
37
+ exports.fileExtensionOf = fileExtensionOf;
38
+ function toAbsoluteUrl(siteContext, url) {
39
+ return url.startsWith("/") ? `${siteContext.siteUrl}${url}` : url;
40
+ }
41
+ exports.toAbsoluteUrl = toAbsoluteUrl;
42
+ function makeFeedUrl(siteContext, language) {
43
+ if (siteContext.multilingual && !language) {
44
+ throw new Error("language is required for multilingual site");
45
+ }
46
+ return toAbsoluteUrl(siteContext, siteContext.multilingual ? `/${language}/feed` : "/feed");
47
+ }
48
+ exports.makeFeedUrl = makeFeedUrl;
49
+ //# sourceMappingURL=url.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.helpers.js","sourceRoot":"","sources":["../src/url.helpers.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@paroicms/public-server-lib",
3
+ "version": "0.6.0",
4
+ "description": "Common utilitaries for paroicms plugins (backend side).",
5
+ "author": "Paroi Team",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://gitlab.com/paroi/opensource/paroicms.git",
9
+ "directory": "packages/public-server-lib"
10
+ },
11
+ "license": "MIT",
12
+ "type": "commonjs",
13
+ "main": "dist/index.js",
14
+ "types": "dist/index.d.ts",
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "test": "vitest",
18
+ "test:run": "vitest run",
19
+ "clear": "rimraf dist/*",
20
+ "dev": "tsc --watch --preserveWatchOutput",
21
+ "eslint": "eslint ."
22
+ },
23
+ "devDependencies": {
24
+ "@types/node": "~20.12.8",
25
+ "rimraf": "~5.0.5",
26
+ "typescript": "~5.4.5",
27
+ "vitest": "~1.6.0"
28
+ },
29
+ "files": [
30
+ "dist"
31
+ ],
32
+ "dependencies": {
33
+ "@paroi/data-formatters-lib": "~0.4.0",
34
+ "@paroicms/internal-anywhere-lib": "1.17.0",
35
+ "@paroicms/public-anywhere-lib": "0.2.0"
36
+ }
37
+ }