@sarawebs/sb-utils
Version:
SaraWebs utility functions for web apps and tools
1 lines • 10.9 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/utils.js","../src/dom.js","../src/LinkPreviewFetcher.js","../src/index.js"],"sourcesContent":["/**\n * Generates a random ID with optional prefix.\n * @param {string} [prefix=''] - Prefix to prepend to the ID.\n * @returns {string} - A unique ID like 'myapp-XXXXXXX'.\n */\nfunction generateID(prefix = \"\") {\n return `${prefix ? prefix + \"-\" : \"\"}${crypto.randomUUID().slice(0, 8)}`;\n}\n\n/**\n * Appends a copyright notice to the footer.\n *\n * @param {Object} [options={}] - Configuration options.\n * @param {string} [options.title='This Website'] - The title to display before the © symbol.\n * @param {string} [options.site='https://sarawebs.com'] - The URL to link the company name to.\n * @param {string} [options.company='SaraWebs'] - The company or author's name to display.\n * @param {number} [options.year=currentYear] - The year to display. Defaults to the current year.\n */\nfunction addCopyRight({\n title = \"This Website\",\n site = \"https://sarawebs.com\",\n company = \"SaraWebs\",\n year = new Date().getFullYear(),\n} = {}) {\n const footer = document.querySelector(\"footer\");\n if (!footer) return;\n\n const div = document.createElement(\"div\");\n const p = document.createElement(\"p\");\n p.style.textAlign = \"center\";\n p.innerHTML = `\n ${title} © ${year}<br>\n Built with ❤️ by \n <a href=\"${site}\" target=\"_blank\" rel=\"noopener\" style=\"color:#207de9;text-decoration:none;\">${company}</a>\n `;\n div.appendChild(p);\n footer.appendChild(div);\n}\n\n/**\n * Generates a 2D board array and applies a push function.\n * @param {number} rows - Number of rows.\n * @param {number} cols - Number of columns.\n * @param {Function} pushFunc - Callback to push into each cell.\n * @returns {Array<Array>} - Generated 2D board.\n */\nfunction createBoard(rows, cols, pushFunc) {\n const board = [];\n for (let i = 0; i < rows; i++) {\n board[i] = [];\n for (let j = 0; j < cols; j++) {\n pushFunc(board[i], i, j);\n }\n }\n return board;\n}\n/**\n * Returns a random color, either from a provided palette or by generating a random hex color.\n * @param {string[]} [palette] - Optional array of hex color strings.\n * @returns {string} - A random color in hex format.\n */\nfunction getRandomColor(palette) {\n const defaultPalette = [\n \"#8e1330\",\n \"#8a6c1d\",\n \"#406555\",\n \"#7c0e45\",\n \"#8d1978\",\n \"#181770\",\n \"#cc38d7\",\n \"#47504e\",\n \"#0fa080\",\n \"#0f64a0\",\n \"#460fa0\",\n \"#a00f65\",\n \"#a00f24\",\n \"#0f94a0\",\n \"#0fa067\",\n \"#0fa03c\",\n \"#38a00f\",\n \"#a09d0f\",\n \"#a0670f\",\n \"#a0370f\",\n \"#a00f0f\",\n \"#2b634d\",\n \"#2b4c63\",\n \"#2e6bc6\",\n \"#1992d4\",\n ];\n\n const activePalette =\n Array.isArray(palette) && palette.length > 0 ? palette : defaultPalette;\n\n return activePalette[Math.floor(Math.random() * activePalette.length)];\n}\n\nexport { generateID, addCopyRight, createBoard, getRandomColor };\n","// src/dom.js\n\nexport class ElementBuilder {\n constructor(type) {\n this.el = document.createElement(type);\n }\n\n addClass(...classes) {\n this.el.classList.add(...classes);\n return this;\n }\n\n setId(id) {\n this.el.id = id;\n return this;\n }\n\n setText(text) {\n this.el.textContent = text;\n return this;\n }\n\n setAttr(name, value) {\n this.el.setAttribute(name, value);\n return this;\n }\n\n on(event, handler) {\n this.el.addEventListener(event, handler);\n return this;\n }\n\n append(child) {\n this.el.appendChild(\n child instanceof ElementBuilder ? child.build() : child,\n );\n return this;\n }\n\n build() {\n return this.el;\n }\n}\n\nexport function labelAndInput({\n labelText,\n inputType,\n id,\n name,\n required = false,\n}) {\n const label = new ElementBuilder(\"label\")\n .setAttr(\"for\", id)\n .setText(labelText);\n\n const input = new ElementBuilder(\"input\")\n .setAttr(\"type\", inputType)\n .setAttr(\"id\", id)\n .setAttr(\"name\", name);\n\n if (required) {\n input.setAttr(\"required\", \"\");\n }\n\n return [label, input];\n}\n","export class LinkPreviewFetcher {\n constructor(apiKey, httpClient = (...args) => fetch(...args)) {\n this.apiKey = apiKey;\n this.httpClient = httpClient;\n this.apiEndpoint = \"https://api.linkpreview.net/\";\n }\n\n buildUrl(targetUrl) {\n const encodedUrl = encodeURIComponent(targetUrl);\n return `${this.apiEndpoint}?key=${this.apiKey}&q=${encodedUrl}`;\n }\n\n async fetchPreview(targetUrl) {\n const requestUrl = this.buildUrl(targetUrl);\n try {\n const response = await this.httpClient(requestUrl);\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}`);\n }\n const data = await response.json();\n return this.parseResponse(data);\n } catch (err) {\n console.error(\"LinkPreviewFetcher error:\", err);\n throw err;\n }\n }\n\n parseResponse(data) {\n return {\n title: data.title || \"\",\n description: data.description || \"\",\n image: data.image || \"\",\n url: data.url || \"\",\n };\n }\n}\n","// src/index.js\n\nimport {\n generateID,\n addCopyRight,\n createBoard,\n getRandomColor,\n} from \"./utils.js\";\nimport { ElementBuilder, labelAndInput } from \"./dom.js\";\nimport { LinkPreviewFetcher } from \"./LinkPreviewFetcher.js\";\n\nconst sb_utils = {\n generateID,\n addCopyRight,\n createBoard,\n getRandomColor,\n ElementBuilder,\n labelAndInput,\n LinkPreviewFetcher,\n};\n\nif (typeof window !== \"undefined\") {\n window.sb = sb_utils;\n}\n\nexport {\n generateID,\n addCopyRight,\n createBoard,\n getRandomColor,\n ElementBuilder,\n labelAndInput,\n LinkPreviewFetcher,\n};\n\nexport default sb_utils;\n"],"names":[],"mappings":"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"}