@kubb/core 4.20.0 → 4.20.2
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/dist/{getBarrelFiles-DRCrJddy.js → getBarrelFiles-BW5T6Sia.js} +21 -9
- package/dist/getBarrelFiles-BW5T6Sia.js.map +1 -0
- package/dist/{getBarrelFiles-p2qZTkRB.cjs → getBarrelFiles-CfS7qrJ5.cjs} +21 -9
- package/dist/getBarrelFiles-CfS7qrJ5.cjs.map +1 -0
- package/dist/index.cjs +3 -3
- package/dist/index.js +3 -3
- package/dist/{transformers-CqOjKLQD.js → transformers-8ju9ixkG.js} +2 -2
- package/dist/transformers-8ju9ixkG.js.map +1 -0
- package/dist/{transformers-Bwrz5_qV.cjs → transformers-B8kXgG3q.cjs} +2 -2
- package/dist/transformers-B8kXgG3q.cjs.map +1 -0
- package/dist/transformers.cjs +1 -1
- package/dist/transformers.js +1 -1
- package/dist/utils.cjs +35 -2
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +12 -1
- package/dist/utils.d.ts +12 -1
- package/dist/utils.js +33 -3
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/PluginManager.ts +10 -0
- package/src/transformers/trim.ts +1 -1
- package/src/utils/checkOnlineStatus.ts +40 -0
- package/src/utils/index.ts +1 -0
- package/dist/getBarrelFiles-DRCrJddy.js.map +0 -1
- package/dist/getBarrelFiles-p2qZTkRB.cjs.map +0 -1
- package/dist/transformers-Bwrz5_qV.cjs.map +0 -1
- package/dist/transformers-CqOjKLQD.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers-B8kXgG3q.cjs","names":["preserveConsecutiveUppercase","camelCase","_camelcase","value"],"sources":["../src/transformers/transformReservedWord.ts","../src/transformers/trim.ts","../../../node_modules/.pnpm/camelcase@8.0.0/node_modules/camelcase/index.js","../src/transformers/casing.ts","../src/transformers/combineCodes.ts","../src/transformers/createJSDocBlockText.ts","../src/transformers/escape.ts","../src/transformers/indent.ts","../src/transformers/nameSorter.ts","../src/transformers/searchAndReplace.ts","../src/transformers/stringify.ts","../src/transformers/toRegExp.ts","../src/transformers/index.ts"],"sourcesContent":["/**\n * @link https://github.com/jonschlinkert/reserved/blob/master/index.js\n */\nconst reservedWords = [\n 'abstract',\n 'arguments',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'eval',\n 'export',\n 'extends',\n 'false',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'function',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'in',\n 'instanceof',\n 'int',\n 'interface',\n 'let',\n 'long',\n 'native',\n 'new',\n 'null',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'volatile',\n 'while',\n 'with',\n 'yield',\n\n 'Array',\n 'Date',\n 'eval',\n 'function',\n 'hasOwnProperty',\n 'Infinity',\n 'isFinite',\n 'isNaN',\n 'isPrototypeOf',\n 'length',\n 'Math',\n 'name',\n 'NaN',\n 'Number',\n 'Object',\n 'prototype',\n 'String',\n 'toString',\n 'undefined',\n 'valueOf',\n]\n\nexport function transformReservedWord(word: string): string {\n if ((word && reservedWords.includes(word)) || word?.match(/^\\d/)) {\n return `_${word}`\n }\n\n return word\n}\n\nexport function isValidVarName(name: string) {\n try {\n Function(`var ${name}`)\n } catch (_e) {\n return false\n }\n return true\n}\n","export function trim(text: string): string {\n return text.trim()\n}\n\nexport function trimQuotes(text: string): string {\n if (text.match(/^\"(.*)\"$/)) {\n return text.replace(/^\"(.*)\"$/, '$1')\n }\n if (text.match(/^'(.*)'$/)) {\n return text.replace(/^'(.*)'$/, '$1')\n }\n\n if (text.match(/^`(.*)`$/)) {\n return text.replace(/^`(.*)`$/, '$1')\n }\n\n return text\n}\n","const UPPERCASE = /[\\p{Lu}]/u;\nconst LOWERCASE = /[\\p{Ll}]/u;\nconst LEADING_CAPITAL = /^[\\p{Lu}](?![\\p{Lu}])/gu;\nconst IDENTIFIER = /([\\p{Alpha}\\p{N}_]|$)/u;\nconst SEPARATORS = /[_.\\- ]+/;\n\nconst LEADING_SEPARATORS = new RegExp('^' + SEPARATORS.source);\nconst SEPARATORS_AND_IDENTIFIER = new RegExp(SEPARATORS.source + IDENTIFIER.source, 'gu');\nconst NUMBERS_AND_IDENTIFIER = new RegExp('\\\\d+' + IDENTIFIER.source, 'gu');\n\nconst preserveCamelCase = (string, toLowerCase, toUpperCase, preserveConsecutiveUppercase) => {\n\tlet isLastCharLower = false;\n\tlet isLastCharUpper = false;\n\tlet isLastLastCharUpper = false;\n\tlet isLastLastCharPreserved = false;\n\n\tfor (let index = 0; index < string.length; index++) {\n\t\tconst character = string[index];\n\t\tisLastLastCharPreserved = index > 2 ? string[index - 3] === '-' : true;\n\n\t\tif (isLastCharLower && UPPERCASE.test(character)) {\n\t\t\tstring = string.slice(0, index) + '-' + string.slice(index);\n\t\t\tisLastCharLower = false;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = true;\n\t\t\tindex++;\n\t\t} else if (isLastCharUpper && isLastLastCharUpper && LOWERCASE.test(character) && (!isLastLastCharPreserved || preserveConsecutiveUppercase)) {\n\t\t\tstring = string.slice(0, index - 1) + '-' + string.slice(index - 1);\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = false;\n\t\t\tisLastCharLower = true;\n\t\t} else {\n\t\t\tisLastCharLower = toLowerCase(character) === character && toUpperCase(character) !== character;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = toUpperCase(character) === character && toLowerCase(character) !== character;\n\t\t}\n\t}\n\n\treturn string;\n};\n\nconst preserveConsecutiveUppercase = (input, toLowerCase) => {\n\tLEADING_CAPITAL.lastIndex = 0;\n\n\treturn input.replaceAll(LEADING_CAPITAL, match => toLowerCase(match));\n};\n\nconst postProcess = (input, toUpperCase) => {\n\tSEPARATORS_AND_IDENTIFIER.lastIndex = 0;\n\tNUMBERS_AND_IDENTIFIER.lastIndex = 0;\n\n\treturn input\n\t\t.replaceAll(NUMBERS_AND_IDENTIFIER, (match, pattern, offset) => ['_', '-'].includes(input.charAt(offset + match.length)) ? match : toUpperCase(match))\n\t\t.replaceAll(SEPARATORS_AND_IDENTIFIER, (_, identifier) => toUpperCase(identifier));\n};\n\nexport default function camelCase(input, options) {\n\tif (!(typeof input === 'string' || Array.isArray(input))) {\n\t\tthrow new TypeError('Expected the input to be `string | string[]`');\n\t}\n\n\toptions = {\n\t\tpascalCase: false,\n\t\tpreserveConsecutiveUppercase: false,\n\t\t...options,\n\t};\n\n\tif (Array.isArray(input)) {\n\t\tinput = input.map(x => x.trim())\n\t\t\t.filter(x => x.length)\n\t\t\t.join('-');\n\t} else {\n\t\tinput = input.trim();\n\t}\n\n\tif (input.length === 0) {\n\t\treturn '';\n\t}\n\n\tconst toLowerCase = options.locale === false\n\t\t? string => string.toLowerCase()\n\t\t: string => string.toLocaleLowerCase(options.locale);\n\n\tconst toUpperCase = options.locale === false\n\t\t? string => string.toUpperCase()\n\t\t: string => string.toLocaleUpperCase(options.locale);\n\n\tif (input.length === 1) {\n\t\tif (SEPARATORS.test(input)) {\n\t\t\treturn '';\n\t\t}\n\n\t\treturn options.pascalCase ? toUpperCase(input) : toLowerCase(input);\n\t}\n\n\tconst hasUpperCase = input !== toLowerCase(input);\n\n\tif (hasUpperCase) {\n\t\tinput = preserveCamelCase(input, toLowerCase, toUpperCase, options.preserveConsecutiveUppercase);\n\t}\n\n\tinput = input.replace(LEADING_SEPARATORS, '');\n\tinput = options.preserveConsecutiveUppercase ? preserveConsecutiveUppercase(input, toLowerCase) : toLowerCase(input);\n\n\tif (options.pascalCase) {\n\t\tinput = toUpperCase(input.charAt(0)) + input.slice(1);\n\t}\n\n\treturn postProcess(input, toUpperCase);\n}\n","import _camelcase from 'camelcase'\n\ntype Options = {\n /**\n * When set it will replace all `.` with `/`.\n */\n isFile?: boolean\n prefix?: string\n suffix?: string\n}\n\nexport function camelCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n if (isFile) {\n const splitArray = text.split('.')\n return splitArray.map((item, i) => (i === splitArray.length - 1 ? camelCase(item, { prefix, suffix }) : camelCase(item))).join('/')\n }\n\n return _camelcase(`${prefix} ${text} ${suffix}`, { pascalCase: false, preserveConsecutiveUppercase: true }).replace(/[^a-zA-Z0-9]/g, '')\n}\n\nexport function pascalCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n if (isFile) {\n const splitArray = text.split('.')\n return splitArray.map((item, i) => (i === splitArray.length - 1 ? pascalCase(item, { prefix, suffix }) : camelCase(item))).join('/')\n }\n\n return _camelcase(`${prefix} ${text} ${suffix}`, { pascalCase: true, preserveConsecutiveUppercase: true }).replace(/[^a-zA-Z0-9]/g, '')\n}\n\nexport function snakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n const processed = `${prefix} ${text} ${suffix}`.trim()\n // Convert to lowercase and replace non-alphanumeric characters with underscores\n return processed\n .replace(/([a-z])([A-Z])/g, '$1_$2') // camelCase to snake_case\n .replace(/[\\s\\-.]+/g, '_') // spaces, hyphens, dots to underscores\n .replace(/[^a-zA-Z0-9_]/g, '') // remove other special chars\n .toLowerCase()\n .replace(/_+/g, '_') // collapse multiple underscores\n .replace(/^_|_$/g, '') // trim underscores from start and end\n}\n\nexport function screamingSnakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n return snakeCase(text, { prefix, suffix }).toUpperCase()\n}\n","export function combineCodes(codes: string[]): string {\n return codes.join('\\n')\n}\n","export function createJSDocBlockText({ comments }: { comments: Array<string> }): string {\n const filteredComments = comments.filter(Boolean)\n\n if (!filteredComments.length) {\n return ''\n }\n\n return `/**\\n * ${filteredComments.join('\\n * ')}\\n */`\n}\n","export function escape(text?: string): string {\n return text ? text.replaceAll('`', '\\\\`') : ''\n}\n\n/**\n * Escape all characters not included in SingleStringCharacters and DoubleStringCharacters on\n * @link http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4\n * @link https://github.com/joliss/js-string-escape/blob/master/index.js\n */\n\nexport function jsStringEscape(input: any): string {\n return `${input}`.replace(/[\"'\\\\\\n\\r\\u2028\\u2029]/g, (character) => {\n switch (character) {\n case '\"':\n case \"'\":\n case '\\\\':\n return `\\\\${character}`\n // Four possible LineTerminator characters need to be escaped:\n case '\\n':\n return '\\\\n'\n case '\\r':\n return '\\\\r'\n case '\\u2028':\n return '\\\\u2028'\n case '\\u2029':\n return '\\\\u2029'\n default:\n return ''\n }\n })\n}\n","export function createIndent(size: number): string {\n return Array.from({ length: size + 1 }).join(' ')\n}\n","export function nameSorter<T extends { name: string }>(a: T, b: T): 0 | 1 | -1 {\n if (a.name < b.name) {\n return -1\n }\n if (a.name > b.name) {\n return 1\n }\n return 0\n}\n","type Options = {\n text: string\n replaceBy: string\n prefix?: string\n key: string\n searchValues?: (prefix: string, key: string) => Array<RegExp | string>\n}\n\nexport function searchAndReplace(options: Options): string {\n const { text, replaceBy, prefix = '', key } = options\n\n const searchValues = options.searchValues?.(prefix, key) || [\n `${prefix}[\"${key}\"]`,\n `${prefix}['${key}']`,\n `${prefix}[\\`${key}\\`]`,\n `${prefix}\"${key}\"`,\n `${prefix}'${key}'`,\n `${prefix}\\`${key}\\``,\n new RegExp(`${prefix}${key}`, 'g'),\n ]\n\n return searchValues.reduce((prev, searchValue) => {\n return prev.toString().replaceAll(searchValue, replaceBy)\n }, text) as string\n}\n","import { trimQuotes } from './trim'\n\nexport function stringify(value: string | number | boolean | undefined): string {\n if (value === undefined || value === null) {\n return '\"\"'\n }\n\n return JSON.stringify(trimQuotes(value.toString()))\n}\n\nexport function stringifyObject(value: object): string {\n const items = Object.entries(value)\n .map(([key, value]) => {\n if (typeof value === 'object') {\n return `${key}: {\n ${stringifyObject(value)}\n }`\n }\n\n return `${key}: ${value}`\n })\n .filter(Boolean)\n\n return items.join(',\\n')\n}\n","import { trimQuotes } from './trim'\n\nexport function toRegExpString(text: string, func: string | null = 'RegExp'): string {\n const raw = trimQuotes(text)\n\n const [, replacementTarget = '', matchedFlags] = raw.match(/^\\^(\\(\\?([igmsuy]+)\\))/i) ?? []\n const cleaned = raw\n .replace(/^\\\\?\\//, '')\n .replace(/\\\\?\\/$/, '')\n .replace(replacementTarget, '')\n\n const regex = new RegExp(cleaned, matchedFlags)\n const source = regex.source\n const flags = regex.flags\n\n if (func === null) {\n return `/${source}/${flags}`\n }\n\n // return as constructor → new RegExp(\"pattern\", \"flags\")\n return `new ${func}(${JSON.stringify(source)}${flags ? `, ${JSON.stringify(flags)}` : ''})`\n}\n","import { orderBy } from 'natural-orderby'\nimport { merge } from 'remeda'\n\nimport { camelCase, pascalCase, screamingSnakeCase, snakeCase } from './casing.ts'\nimport { combineCodes } from './combineCodes.ts'\nimport { createJSDocBlockText } from './createJSDocBlockText.ts'\nimport { escape, jsStringEscape } from './escape.ts'\nimport { createIndent } from './indent.ts'\nimport { nameSorter } from './nameSorter.ts'\nimport { searchAndReplace } from './searchAndReplace.ts'\nimport { stringify, stringifyObject } from './stringify.ts'\nimport { toRegExpString } from './toRegExp.ts'\nimport { isValidVarName, transformReservedWord } from './transformReservedWord.ts'\nimport { trim, trimQuotes } from './trim.ts'\n\nexport { orderBy } from 'natural-orderby'\nexport { merge } from 'remeda'\nexport { camelCase, pascalCase, screamingSnakeCase, snakeCase } from './casing.ts'\nexport { combineCodes } from './combineCodes.ts'\nexport { createJSDocBlockText } from './createJSDocBlockText.ts'\nexport { escape, jsStringEscape } from './escape.ts'\nexport { createIndent } from './indent.ts'\nexport { nameSorter } from './nameSorter.ts'\nexport { searchAndReplace } from './searchAndReplace.ts'\nexport { stringify, stringifyObject } from './stringify.ts'\nexport { toRegExpString } from './toRegExp.ts'\nexport { isValidVarName, transformReservedWord } from './transformReservedWord.ts'\nexport { trim, trimQuotes } from './trim.ts'\n\nexport default {\n combineCodes,\n escape,\n jsStringEscape,\n createIndent,\n transformReservedWord,\n isValidVarName,\n nameSorter,\n searchAndReplace,\n stringify,\n stringifyObject,\n toRegExpString,\n trim,\n trimQuotes,\n JSDoc: {\n createJSDocBlockText,\n },\n orderBy,\n merge,\n camelCase,\n pascalCase,\n snakeCase,\n screamingSnakeCase,\n} as const\n"],"x_google_ignoreList":[2],"mappings":"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"}
|
package/dist/transformers.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
2
2
|
const require_chunk = require('./chunk-C1_xRkKa.cjs');
|
|
3
|
-
const require_transformers = require('./transformers-
|
|
3
|
+
const require_transformers = require('./transformers-B8kXgG3q.cjs');
|
|
4
4
|
let natural_orderby = require("natural-orderby");
|
|
5
5
|
let remeda = require("remeda");
|
|
6
6
|
|
package/dist/transformers.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { _ as snakeCase, a as stringify, b as isValidVarName, c as nameSorter, d as jsStringEscape, f as createJSDocBlockText, g as screamingSnakeCase, h as pascalCase, i as toRegExpString, l as createIndent, m as camelCase, n as orderBy, o as stringifyObject, p as combineCodes, r as transformers_default, s as searchAndReplace, t as merge, u as escape, v as trim, x as transformReservedWord, y as trimQuotes } from "./transformers-
|
|
1
|
+
import { _ as snakeCase, a as stringify, b as isValidVarName, c as nameSorter, d as jsStringEscape, f as createJSDocBlockText, g as screamingSnakeCase, h as pascalCase, i as toRegExpString, l as createIndent, m as camelCase, n as orderBy, o as stringifyObject, p as combineCodes, r as transformers_default, s as searchAndReplace, t as merge, u as escape, v as trim, x as transformReservedWord, y as trimQuotes } from "./transformers-8ju9ixkG.js";
|
|
2
2
|
|
|
3
3
|
export { camelCase, combineCodes, createIndent, createJSDocBlockText, transformers_default as default, escape, isValidVarName, jsStringEscape, merge, nameSorter, orderBy, pascalCase, screamingSnakeCase, searchAndReplace, snakeCase, stringify, stringifyObject, toRegExpString, transformReservedWord, trim, trimQuotes };
|
package/dist/utils.cjs
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
const require_chunk = require('./chunk-C1_xRkKa.cjs');
|
|
2
|
-
const require_getBarrelFiles = require('./getBarrelFiles-
|
|
3
|
-
const require_transformers = require('./transformers-
|
|
2
|
+
const require_getBarrelFiles = require('./getBarrelFiles-CfS7qrJ5.cjs');
|
|
3
|
+
const require_transformers = require('./transformers-B8kXgG3q.cjs');
|
|
4
4
|
let node_path = require("node:path");
|
|
5
5
|
node_path = require_chunk.__toESM(node_path);
|
|
6
6
|
let natural_orderby = require("natural-orderby");
|
|
7
7
|
let node_url = require("node:url");
|
|
8
8
|
let node_fs = require("node:fs");
|
|
9
|
+
let node_dns = require("node:dns");
|
|
10
|
+
node_dns = require_chunk.__toESM(node_dns);
|
|
9
11
|
let jiti = require("jiti");
|
|
10
12
|
jiti = require_chunk.__toESM(jiti);
|
|
11
13
|
|
|
@@ -47,6 +49,35 @@ var Cache = class {
|
|
|
47
49
|
async flush() {}
|
|
48
50
|
};
|
|
49
51
|
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region src/utils/checkOnlineStatus.ts
|
|
54
|
+
/**
|
|
55
|
+
* Check if the system has internet connectivity
|
|
56
|
+
* Uses DNS lookup to well-known stable domains as a lightweight connectivity test
|
|
57
|
+
*/
|
|
58
|
+
async function isOnline() {
|
|
59
|
+
for (const domain of [
|
|
60
|
+
"dns.google.com",
|
|
61
|
+
"cloudflare.com",
|
|
62
|
+
"one.one.one.one"
|
|
63
|
+
]) try {
|
|
64
|
+
await node_dns.default.promises.resolve(domain);
|
|
65
|
+
return true;
|
|
66
|
+
} catch {}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Execute a function only if online, otherwise silently skip
|
|
71
|
+
*/
|
|
72
|
+
async function executeIfOnline(fn) {
|
|
73
|
+
if (!await isOnline()) return null;
|
|
74
|
+
try {
|
|
75
|
+
return await fn();
|
|
76
|
+
} catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
50
81
|
//#endregion
|
|
51
82
|
//#region src/utils/FunctionParams.ts
|
|
52
83
|
/**
|
|
@@ -219,12 +250,14 @@ exports.Cache = Cache;
|
|
|
219
250
|
exports.FunctionParams = FunctionParams;
|
|
220
251
|
exports.URLPath = require_getBarrelFiles.URLPath;
|
|
221
252
|
exports.buildJSDoc = buildJSDoc;
|
|
253
|
+
exports.executeIfOnline = executeIfOnline;
|
|
222
254
|
exports.formatHrtime = require_getBarrelFiles.formatHrtime;
|
|
223
255
|
exports.formatMs = require_getBarrelFiles.formatMs;
|
|
224
256
|
exports.getBarrelFiles = require_getBarrelFiles.getBarrelFiles;
|
|
225
257
|
exports.getElapsedMs = require_getBarrelFiles.getElapsedMs;
|
|
226
258
|
exports.getNestedAccessor = getNestedAccessor;
|
|
227
259
|
exports.getUniqueName = require_getBarrelFiles.getUniqueName;
|
|
260
|
+
exports.isOnline = isOnline;
|
|
228
261
|
exports.isPromise = isPromise;
|
|
229
262
|
exports.isPromiseFulfilledResult = isPromiseFulfilledResult;
|
|
230
263
|
exports.isPromiseRejectedResult = isPromiseRejectedResult;
|
package/dist/utils.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.cjs","names":["#buffer","#items","#orderItems","#addParams","camelCase","item","path","timeout"],"sources":["../src/utils/buildJSDoc.ts","../src/utils/Cache.ts","../src/utils/FunctionParams.ts","../src/utils/getNestedAccessor.ts","../src/utils/promise.ts","../src/utils/renderTemplate.ts","../src/utils/resolveModuleSource.ts","../src/utils/timeout.ts"],"sourcesContent":["/**\n * Builds a JSDoc comment block with custom indentation.\n * @param comments - Array of comment strings to include in the JSDoc block\n * @param options - Configuration options for formatting\n * @returns Formatted JSDoc string or fallback string if no comments\n */\nexport function buildJSDoc(\n comments: Array<string>,\n options: {\n /**\n * String to use for indenting each line of the JSDoc comment\n * @default ' * ' (3 spaces + asterisk + space)\n */\n indent?: string\n /**\n * String to append after the closing JSDoc tag\n * @default '\\n ' (newline + 2 spaces)\n */\n suffix?: string\n /**\n * String to return when there are no comments\n * @default ' ' (2 spaces)\n */\n fallback?: string\n } = {},\n): string {\n const { indent = ' * ', suffix = '\\n ', fallback = ' ' } = options\n\n if (comments.length === 0) {\n return fallback\n }\n\n return `/**\\n${comments.map((c) => `${indent}${c}`).join('\\n')}\\n */${suffix}`\n}\n","export class Cache<T> {\n #buffer = new Map<string, T>()\n\n async get(key: string): Promise<T | null> {\n return this.#buffer.get(key) ?? null\n }\n\n async set(key: string, value: T): Promise<void> {\n this.#buffer.set(key, value)\n }\n\n async delete(key: string): Promise<void> {\n this.#buffer.delete(key)\n }\n\n async clear(): Promise<void> {\n this.#buffer.clear()\n }\n\n async keys(): Promise<string[]> {\n return [...this.#buffer.keys()]\n }\n\n async values(): Promise<T[]> {\n return [...this.#buffer.values()]\n }\n\n async flush(): Promise<void> {\n // No-op for base cache\n }\n}\n","import { orderBy } from 'natural-orderby'\n\nimport { camelCase } from '../transformers/casing.ts'\n\ntype FunctionParamsASTWithoutType = {\n name?: string\n type?: string\n /**\n * @default true\n */\n required?: boolean\n /**\n * @default true\n */\n enabled?: boolean\n default?: string\n}\n\ntype FunctionParamsASTWithType = {\n name?: never\n type: string\n /**\n * @default true\n */\n required?: boolean\n /**\n * @default true\n */\n enabled?: boolean\n default?: string\n}\n/**\n * @deprecated\n */\nexport type FunctionParamsAST = FunctionParamsASTWithoutType | FunctionParamsASTWithType\n\n/**\n * @deprecated\n */\nexport class FunctionParams {\n #items: Array<FunctionParamsAST | FunctionParamsAST[]> = []\n constructor() {\n return this\n }\n\n get items(): FunctionParamsAST[] {\n return this.#items.flat()\n }\n\n add(item: FunctionParamsAST | Array<FunctionParamsAST | FunctionParamsAST[] | undefined> | undefined): FunctionParams {\n if (!item) {\n return this\n }\n\n if (Array.isArray(item)) {\n item.filter(Boolean).forEach((it) => {\n this.#items.push(it)\n })\n return this\n }\n this.#items.push(item)\n\n return this\n }\n static #orderItems(items: Array<FunctionParamsAST | FunctionParamsAST[]>) {\n return orderBy(\n items.filter(Boolean),\n [\n (v) => {\n if (Array.isArray(v)) {\n return undefined\n }\n return !v.default\n },\n (v) => {\n if (Array.isArray(v)) {\n return undefined\n }\n return v.required ?? true\n },\n ],\n ['desc', 'desc'],\n )\n }\n\n static #addParams(acc: string[], item: FunctionParamsAST) {\n const { enabled = true, name, type, required = true, ...rest } = item\n\n if (!enabled) {\n return acc\n }\n\n if (!name) {\n // when name is not se we uses TypeScript generics\n acc.push(`${type}${rest.default ? ` = ${rest.default}` : ''}`)\n\n return acc\n }\n // TODO check whey we still need the camelcase here\n const parameterName = name.startsWith('{') ? name : camelCase(name)\n\n if (type) {\n if (required) {\n acc.push(`${parameterName}: ${type}${rest.default ? ` = ${rest.default}` : ''}`)\n } else {\n acc.push(`${parameterName}?: ${type}`)\n }\n } else {\n acc.push(`${parameterName}`)\n }\n\n return acc\n }\n\n static toObject(items: FunctionParamsAST[]): FunctionParamsAST {\n let type: string[] = []\n let name: string[] = []\n\n const enabled = items.every((item) => item.enabled) ? items.at(0)?.enabled : true\n const required = items.every((item) => item.required) ?? true\n\n items.forEach((item) => {\n name = FunctionParams.#addParams(name, { ...item, type: undefined })\n if (items.some((item) => item.type)) {\n type = FunctionParams.#addParams(type, item)\n }\n })\n\n return {\n name: `{ ${name.join(', ')} }`,\n type: type.length ? `{ ${type.join('; ')} }` : undefined,\n enabled,\n required,\n }\n }\n\n toObject(): FunctionParamsAST {\n const items = FunctionParams.#orderItems(this.#items).flat()\n\n return FunctionParams.toObject(items)\n }\n\n static toString(items: (FunctionParamsAST | FunctionParamsAST[])[]): string {\n const sortedData = FunctionParams.#orderItems(items)\n\n return sortedData\n .reduce((acc, item) => {\n if (Array.isArray(item)) {\n if (item.length <= 0) {\n return acc\n }\n const subItems = FunctionParams.#orderItems(item) as FunctionParamsAST[]\n const objectItem = FunctionParams.toObject(subItems)\n\n return FunctionParams.#addParams(acc, objectItem)\n }\n\n return FunctionParams.#addParams(acc, item)\n }, [] as string[])\n .join(', ')\n }\n\n toString(): string {\n const items = FunctionParams.#orderItems(this.#items)\n\n return FunctionParams.toString(items)\n }\n}\n","/**\n * Converts a param path (string with dot notation or array of strings) to a JavaScript accessor expression.\n * @param param - The param path, e.g., 'pagination.next.id' or ['pagination', 'next', 'id']\n * @param accessor - The base accessor, e.g., 'lastPage' or 'firstPage'\n * @returns A JavaScript accessor expression, e.g., \"lastPage?.['pagination']?.['next']?.['id']\", or undefined if param is empty\n *\n * @example\n * ```ts\n * getNestedAccessor('pagination.next.id', 'lastPage')\n * // returns: \"lastPage?.['pagination']?.['next']?.['id']\"\n *\n * getNestedAccessor(['pagination', 'next', 'id'], 'lastPage')\n * // returns: \"lastPage?.['pagination']?.['next']?.['id']\"\n *\n * getNestedAccessor('', 'lastPage')\n * // returns: undefined\n * ```\n */\nexport function getNestedAccessor(param: string | string[], accessor: string): string | undefined {\n const parts = Array.isArray(param) ? param : param.split('.')\n if (parts.length === 0 || (parts.length === 1 && parts[0] === '')) {\n return undefined\n }\n return parts.reduce((acc, part) => `${acc}?.['${part}']`, accessor)\n}\n","import type { PossiblePromise } from './types.ts'\n\nexport function isPromise<T>(result: PossiblePromise<T>): result is Promise<T> {\n return !!result && typeof (result as Promise<unknown>)?.then === 'function'\n}\n\nexport function isPromiseFulfilledResult<T = unknown>(result: PromiseSettledResult<unknown>): result is PromiseFulfilledResult<T> {\n return result.status === 'fulfilled'\n}\n\nexport function isPromiseRejectedResult<T>(result: PromiseSettledResult<unknown>): result is Omit<PromiseRejectedResult, 'reason'> & { reason: T } {\n return result.status === 'rejected'\n}\n","export function renderTemplate<TData extends Record<string, unknown> = Record<string, unknown>>(template: string, data: TData | undefined = undefined): string {\n if (!data || !Object.keys(data).length) {\n return template.replace(/{{(.*?)}}/g, '')\n }\n\n const matches = template.match(/{{(.*?)}}/g)\n\n return (\n matches?.reduce((prev, curr) => {\n const index = curr.split(/{{|}}/).filter(Boolean)[0]?.trim()\n if (index === undefined) {\n return prev\n }\n const value = data[index]\n\n if (value === undefined) {\n return prev\n }\n\n return prev\n .replace(curr, () => {\n if (typeof value === 'boolean') {\n return `${value.toString()}` || 'false'\n }\n\n return (value as string) || ''\n })\n .trim()\n }, template) || ''\n )\n}\n","import { readFileSync } from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport createJiti from 'jiti'\n\nexport function resolveModuleSource(pkgName: string) {\n const parentURL = import.meta.url\n const jiti = createJiti(parentURL)\n\n const resolved = jiti.esmResolve(pkgName, parentURL)\n const filePath = resolved.startsWith('file:') ? fileURLToPath(resolved) : resolved\n const source = readFileSync(filePath, { encoding: 'utf-8' })\n const ext = path.extname(filePath)\n return { path: filePath, source, ext } as const\n}\n","export async function timeout(ms: number): Promise<unknown> {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n resolve(timeout)\n }, ms)\n }).then((timeout) => {\n clearTimeout(timeout as NodeJS.Timeout)\n\n return true\n })\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.cjs","names":["#buffer","dns","#items","#orderItems","#addParams","camelCase","item","path","timeout"],"sources":["../src/utils/buildJSDoc.ts","../src/utils/Cache.ts","../src/utils/checkOnlineStatus.ts","../src/utils/FunctionParams.ts","../src/utils/getNestedAccessor.ts","../src/utils/promise.ts","../src/utils/renderTemplate.ts","../src/utils/resolveModuleSource.ts","../src/utils/timeout.ts"],"sourcesContent":["/**\n * Builds a JSDoc comment block with custom indentation.\n * @param comments - Array of comment strings to include in the JSDoc block\n * @param options - Configuration options for formatting\n * @returns Formatted JSDoc string or fallback string if no comments\n */\nexport function buildJSDoc(\n comments: Array<string>,\n options: {\n /**\n * String to use for indenting each line of the JSDoc comment\n * @default ' * ' (3 spaces + asterisk + space)\n */\n indent?: string\n /**\n * String to append after the closing JSDoc tag\n * @default '\\n ' (newline + 2 spaces)\n */\n suffix?: string\n /**\n * String to return when there are no comments\n * @default ' ' (2 spaces)\n */\n fallback?: string\n } = {},\n): string {\n const { indent = ' * ', suffix = '\\n ', fallback = ' ' } = options\n\n if (comments.length === 0) {\n return fallback\n }\n\n return `/**\\n${comments.map((c) => `${indent}${c}`).join('\\n')}\\n */${suffix}`\n}\n","export class Cache<T> {\n #buffer = new Map<string, T>()\n\n async get(key: string): Promise<T | null> {\n return this.#buffer.get(key) ?? null\n }\n\n async set(key: string, value: T): Promise<void> {\n this.#buffer.set(key, value)\n }\n\n async delete(key: string): Promise<void> {\n this.#buffer.delete(key)\n }\n\n async clear(): Promise<void> {\n this.#buffer.clear()\n }\n\n async keys(): Promise<string[]> {\n return [...this.#buffer.keys()]\n }\n\n async values(): Promise<T[]> {\n return [...this.#buffer.values()]\n }\n\n async flush(): Promise<void> {\n // No-op for base cache\n }\n}\n","import dns from 'node:dns'\n\n/**\n * Check if the system has internet connectivity\n * Uses DNS lookup to well-known stable domains as a lightweight connectivity test\n */\nexport async function isOnline(): Promise<boolean> {\n const testDomains = [\n 'dns.google.com', // Google Public DNS\n 'cloudflare.com', // Cloudflare\n 'one.one.one.one', // Cloudflare DNS\n ]\n\n for (const domain of testDomains) {\n try {\n await dns.promises.resolve(domain)\n return true\n } catch {\n // Try next domain\n }\n }\n\n return false\n}\n\n/**\n * Execute a function only if online, otherwise silently skip\n */\nexport async function executeIfOnline<T>(fn: () => Promise<T>): Promise<T | null> {\n const online = await isOnline()\n if (!online) {\n return null\n }\n\n try {\n return await fn()\n } catch {\n return null\n }\n}\n","import { orderBy } from 'natural-orderby'\n\nimport { camelCase } from '../transformers/casing.ts'\n\ntype FunctionParamsASTWithoutType = {\n name?: string\n type?: string\n /**\n * @default true\n */\n required?: boolean\n /**\n * @default true\n */\n enabled?: boolean\n default?: string\n}\n\ntype FunctionParamsASTWithType = {\n name?: never\n type: string\n /**\n * @default true\n */\n required?: boolean\n /**\n * @default true\n */\n enabled?: boolean\n default?: string\n}\n/**\n * @deprecated\n */\nexport type FunctionParamsAST = FunctionParamsASTWithoutType | FunctionParamsASTWithType\n\n/**\n * @deprecated\n */\nexport class FunctionParams {\n #items: Array<FunctionParamsAST | FunctionParamsAST[]> = []\n constructor() {\n return this\n }\n\n get items(): FunctionParamsAST[] {\n return this.#items.flat()\n }\n\n add(item: FunctionParamsAST | Array<FunctionParamsAST | FunctionParamsAST[] | undefined> | undefined): FunctionParams {\n if (!item) {\n return this\n }\n\n if (Array.isArray(item)) {\n item.filter(Boolean).forEach((it) => {\n this.#items.push(it)\n })\n return this\n }\n this.#items.push(item)\n\n return this\n }\n static #orderItems(items: Array<FunctionParamsAST | FunctionParamsAST[]>) {\n return orderBy(\n items.filter(Boolean),\n [\n (v) => {\n if (Array.isArray(v)) {\n return undefined\n }\n return !v.default\n },\n (v) => {\n if (Array.isArray(v)) {\n return undefined\n }\n return v.required ?? true\n },\n ],\n ['desc', 'desc'],\n )\n }\n\n static #addParams(acc: string[], item: FunctionParamsAST) {\n const { enabled = true, name, type, required = true, ...rest } = item\n\n if (!enabled) {\n return acc\n }\n\n if (!name) {\n // when name is not se we uses TypeScript generics\n acc.push(`${type}${rest.default ? ` = ${rest.default}` : ''}`)\n\n return acc\n }\n // TODO check whey we still need the camelcase here\n const parameterName = name.startsWith('{') ? name : camelCase(name)\n\n if (type) {\n if (required) {\n acc.push(`${parameterName}: ${type}${rest.default ? ` = ${rest.default}` : ''}`)\n } else {\n acc.push(`${parameterName}?: ${type}`)\n }\n } else {\n acc.push(`${parameterName}`)\n }\n\n return acc\n }\n\n static toObject(items: FunctionParamsAST[]): FunctionParamsAST {\n let type: string[] = []\n let name: string[] = []\n\n const enabled = items.every((item) => item.enabled) ? items.at(0)?.enabled : true\n const required = items.every((item) => item.required) ?? true\n\n items.forEach((item) => {\n name = FunctionParams.#addParams(name, { ...item, type: undefined })\n if (items.some((item) => item.type)) {\n type = FunctionParams.#addParams(type, item)\n }\n })\n\n return {\n name: `{ ${name.join(', ')} }`,\n type: type.length ? `{ ${type.join('; ')} }` : undefined,\n enabled,\n required,\n }\n }\n\n toObject(): FunctionParamsAST {\n const items = FunctionParams.#orderItems(this.#items).flat()\n\n return FunctionParams.toObject(items)\n }\n\n static toString(items: (FunctionParamsAST | FunctionParamsAST[])[]): string {\n const sortedData = FunctionParams.#orderItems(items)\n\n return sortedData\n .reduce((acc, item) => {\n if (Array.isArray(item)) {\n if (item.length <= 0) {\n return acc\n }\n const subItems = FunctionParams.#orderItems(item) as FunctionParamsAST[]\n const objectItem = FunctionParams.toObject(subItems)\n\n return FunctionParams.#addParams(acc, objectItem)\n }\n\n return FunctionParams.#addParams(acc, item)\n }, [] as string[])\n .join(', ')\n }\n\n toString(): string {\n const items = FunctionParams.#orderItems(this.#items)\n\n return FunctionParams.toString(items)\n }\n}\n","/**\n * Converts a param path (string with dot notation or array of strings) to a JavaScript accessor expression.\n * @param param - The param path, e.g., 'pagination.next.id' or ['pagination', 'next', 'id']\n * @param accessor - The base accessor, e.g., 'lastPage' or 'firstPage'\n * @returns A JavaScript accessor expression, e.g., \"lastPage?.['pagination']?.['next']?.['id']\", or undefined if param is empty\n *\n * @example\n * ```ts\n * getNestedAccessor('pagination.next.id', 'lastPage')\n * // returns: \"lastPage?.['pagination']?.['next']?.['id']\"\n *\n * getNestedAccessor(['pagination', 'next', 'id'], 'lastPage')\n * // returns: \"lastPage?.['pagination']?.['next']?.['id']\"\n *\n * getNestedAccessor('', 'lastPage')\n * // returns: undefined\n * ```\n */\nexport function getNestedAccessor(param: string | string[], accessor: string): string | undefined {\n const parts = Array.isArray(param) ? param : param.split('.')\n if (parts.length === 0 || (parts.length === 1 && parts[0] === '')) {\n return undefined\n }\n return parts.reduce((acc, part) => `${acc}?.['${part}']`, accessor)\n}\n","import type { PossiblePromise } from './types.ts'\n\nexport function isPromise<T>(result: PossiblePromise<T>): result is Promise<T> {\n return !!result && typeof (result as Promise<unknown>)?.then === 'function'\n}\n\nexport function isPromiseFulfilledResult<T = unknown>(result: PromiseSettledResult<unknown>): result is PromiseFulfilledResult<T> {\n return result.status === 'fulfilled'\n}\n\nexport function isPromiseRejectedResult<T>(result: PromiseSettledResult<unknown>): result is Omit<PromiseRejectedResult, 'reason'> & { reason: T } {\n return result.status === 'rejected'\n}\n","export function renderTemplate<TData extends Record<string, unknown> = Record<string, unknown>>(template: string, data: TData | undefined = undefined): string {\n if (!data || !Object.keys(data).length) {\n return template.replace(/{{(.*?)}}/g, '')\n }\n\n const matches = template.match(/{{(.*?)}}/g)\n\n return (\n matches?.reduce((prev, curr) => {\n const index = curr.split(/{{|}}/).filter(Boolean)[0]?.trim()\n if (index === undefined) {\n return prev\n }\n const value = data[index]\n\n if (value === undefined) {\n return prev\n }\n\n return prev\n .replace(curr, () => {\n if (typeof value === 'boolean') {\n return `${value.toString()}` || 'false'\n }\n\n return (value as string) || ''\n })\n .trim()\n }, template) || ''\n )\n}\n","import { readFileSync } from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport createJiti from 'jiti'\n\nexport function resolveModuleSource(pkgName: string) {\n const parentURL = import.meta.url\n const jiti = createJiti(parentURL)\n\n const resolved = jiti.esmResolve(pkgName, parentURL)\n const filePath = resolved.startsWith('file:') ? fileURLToPath(resolved) : resolved\n const source = readFileSync(filePath, { encoding: 'utf-8' })\n const ext = path.extname(filePath)\n return { path: filePath, source, ext } as const\n}\n","export async function timeout(ms: number): Promise<unknown> {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n resolve(timeout)\n }, ms)\n }).then((timeout) => {\n clearTimeout(timeout as NodeJS.Timeout)\n\n return true\n })\n}\n"],"mappings":"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"}
|
package/dist/utils.d.cts
CHANGED
|
@@ -40,6 +40,17 @@ declare class Cache<T> {
|
|
|
40
40
|
flush(): Promise<void>;
|
|
41
41
|
}
|
|
42
42
|
//#endregion
|
|
43
|
+
//#region src/utils/checkOnlineStatus.d.ts
|
|
44
|
+
/**
|
|
45
|
+
* Check if the system has internet connectivity
|
|
46
|
+
* Uses DNS lookup to well-known stable domains as a lightweight connectivity test
|
|
47
|
+
*/
|
|
48
|
+
declare function isOnline(): Promise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* Execute a function only if online, otherwise silently skip
|
|
51
|
+
*/
|
|
52
|
+
declare function executeIfOnline<T>(fn: () => Promise<T>): Promise<T | null>;
|
|
53
|
+
//#endregion
|
|
43
54
|
//#region src/utils/FunctionParams.d.ts
|
|
44
55
|
type FunctionParamsASTWithoutType = {
|
|
45
56
|
name?: string;
|
|
@@ -204,5 +215,5 @@ declare class URLPath {
|
|
|
204
215
|
declare function getUniqueName(originalName: string, data: Record<string, number>): string;
|
|
205
216
|
declare function setUniqueName(originalName: string, data: Record<string, number>): string;
|
|
206
217
|
//#endregion
|
|
207
|
-
export { AsyncEventEmitter, Cache, FunctionParams, type FunctionParamsAST, type URLObject, URLPath, buildJSDoc, formatHrtime, formatMs, getBarrelFiles, getElapsedMs, getNestedAccessor, getUniqueName, isPromise, isPromiseFulfilledResult, isPromiseRejectedResult, renderTemplate, resolveModuleSource, setUniqueName, timeout };
|
|
218
|
+
export { AsyncEventEmitter, Cache, FunctionParams, type FunctionParamsAST, type URLObject, URLPath, buildJSDoc, executeIfOnline, formatHrtime, formatMs, getBarrelFiles, getElapsedMs, getNestedAccessor, getUniqueName, isOnline, isPromise, isPromiseFulfilledResult, isPromiseRejectedResult, renderTemplate, resolveModuleSource, setUniqueName, timeout };
|
|
208
219
|
//# sourceMappingURL=utils.d.cts.map
|
package/dist/utils.d.ts
CHANGED
|
@@ -40,6 +40,17 @@ declare class Cache<T> {
|
|
|
40
40
|
flush(): Promise<void>;
|
|
41
41
|
}
|
|
42
42
|
//#endregion
|
|
43
|
+
//#region src/utils/checkOnlineStatus.d.ts
|
|
44
|
+
/**
|
|
45
|
+
* Check if the system has internet connectivity
|
|
46
|
+
* Uses DNS lookup to well-known stable domains as a lightweight connectivity test
|
|
47
|
+
*/
|
|
48
|
+
declare function isOnline(): Promise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* Execute a function only if online, otherwise silently skip
|
|
51
|
+
*/
|
|
52
|
+
declare function executeIfOnline<T>(fn: () => Promise<T>): Promise<T | null>;
|
|
53
|
+
//#endregion
|
|
43
54
|
//#region src/utils/FunctionParams.d.ts
|
|
44
55
|
type FunctionParamsASTWithoutType = {
|
|
45
56
|
name?: string;
|
|
@@ -204,5 +215,5 @@ declare class URLPath {
|
|
|
204
215
|
declare function getUniqueName(originalName: string, data: Record<string, number>): string;
|
|
205
216
|
declare function setUniqueName(originalName: string, data: Record<string, number>): string;
|
|
206
217
|
//#endregion
|
|
207
|
-
export { AsyncEventEmitter, Cache, FunctionParams, type FunctionParamsAST, type URLObject, URLPath, buildJSDoc, formatHrtime, formatMs, getBarrelFiles, getElapsedMs, getNestedAccessor, getUniqueName, isPromise, isPromiseFulfilledResult, isPromiseRejectedResult, renderTemplate, resolveModuleSource, setUniqueName, timeout };
|
|
218
|
+
export { AsyncEventEmitter, Cache, FunctionParams, type FunctionParamsAST, type URLObject, URLPath, buildJSDoc, executeIfOnline, formatHrtime, formatMs, getBarrelFiles, getElapsedMs, getNestedAccessor, getUniqueName, isOnline, isPromise, isPromiseFulfilledResult, isPromiseRejectedResult, renderTemplate, resolveModuleSource, setUniqueName, timeout };
|
|
208
219
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { t as __name } from "./chunk-iVr_oF3V.js";
|
|
2
|
-
import { a as getElapsedMs, i as formatMs, l as getUniqueName, n as URLPath, o as AsyncEventEmitter, r as formatHrtime, t as getBarrelFiles, u as setUniqueName } from "./getBarrelFiles-
|
|
3
|
-
import { m as camelCase } from "./transformers-
|
|
2
|
+
import { a as getElapsedMs, i as formatMs, l as getUniqueName, n as URLPath, o as AsyncEventEmitter, r as formatHrtime, t as getBarrelFiles, u as setUniqueName } from "./getBarrelFiles-BW5T6Sia.js";
|
|
3
|
+
import { m as camelCase } from "./transformers-8ju9ixkG.js";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { orderBy } from "natural-orderby";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
import { readFileSync } from "node:fs";
|
|
8
|
+
import dns from "node:dns";
|
|
8
9
|
import createJiti from "jiti";
|
|
9
10
|
|
|
10
11
|
//#region src/utils/buildJSDoc.ts
|
|
@@ -45,6 +46,35 @@ var Cache = class {
|
|
|
45
46
|
async flush() {}
|
|
46
47
|
};
|
|
47
48
|
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region src/utils/checkOnlineStatus.ts
|
|
51
|
+
/**
|
|
52
|
+
* Check if the system has internet connectivity
|
|
53
|
+
* Uses DNS lookup to well-known stable domains as a lightweight connectivity test
|
|
54
|
+
*/
|
|
55
|
+
async function isOnline() {
|
|
56
|
+
for (const domain of [
|
|
57
|
+
"dns.google.com",
|
|
58
|
+
"cloudflare.com",
|
|
59
|
+
"one.one.one.one"
|
|
60
|
+
]) try {
|
|
61
|
+
await dns.promises.resolve(domain);
|
|
62
|
+
return true;
|
|
63
|
+
} catch {}
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Execute a function only if online, otherwise silently skip
|
|
68
|
+
*/
|
|
69
|
+
async function executeIfOnline(fn) {
|
|
70
|
+
if (!await isOnline()) return null;
|
|
71
|
+
try {
|
|
72
|
+
return await fn();
|
|
73
|
+
} catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
48
78
|
//#endregion
|
|
49
79
|
//#region src/utils/FunctionParams.ts
|
|
50
80
|
/**
|
|
@@ -212,5 +242,5 @@ async function timeout(ms) {
|
|
|
212
242
|
}
|
|
213
243
|
|
|
214
244
|
//#endregion
|
|
215
|
-
export { AsyncEventEmitter, Cache, FunctionParams, URLPath, buildJSDoc, formatHrtime, formatMs, getBarrelFiles, getElapsedMs, getNestedAccessor, getUniqueName, isPromise, isPromiseFulfilledResult, isPromiseRejectedResult, renderTemplate, resolveModuleSource, setUniqueName, timeout };
|
|
245
|
+
export { AsyncEventEmitter, Cache, FunctionParams, URLPath, buildJSDoc, executeIfOnline, formatHrtime, formatMs, getBarrelFiles, getElapsedMs, getNestedAccessor, getUniqueName, isOnline, isPromise, isPromiseFulfilledResult, isPromiseRejectedResult, renderTemplate, resolveModuleSource, setUniqueName, timeout };
|
|
216
246
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["#buffer","#items","#orderItems","#addParams","item","timeout"],"sources":["../src/utils/buildJSDoc.ts","../src/utils/Cache.ts","../src/utils/FunctionParams.ts","../src/utils/getNestedAccessor.ts","../src/utils/promise.ts","../src/utils/renderTemplate.ts","../src/utils/resolveModuleSource.ts","../src/utils/timeout.ts"],"sourcesContent":["/**\n * Builds a JSDoc comment block with custom indentation.\n * @param comments - Array of comment strings to include in the JSDoc block\n * @param options - Configuration options for formatting\n * @returns Formatted JSDoc string or fallback string if no comments\n */\nexport function buildJSDoc(\n comments: Array<string>,\n options: {\n /**\n * String to use for indenting each line of the JSDoc comment\n * @default ' * ' (3 spaces + asterisk + space)\n */\n indent?: string\n /**\n * String to append after the closing JSDoc tag\n * @default '\\n ' (newline + 2 spaces)\n */\n suffix?: string\n /**\n * String to return when there are no comments\n * @default ' ' (2 spaces)\n */\n fallback?: string\n } = {},\n): string {\n const { indent = ' * ', suffix = '\\n ', fallback = ' ' } = options\n\n if (comments.length === 0) {\n return fallback\n }\n\n return `/**\\n${comments.map((c) => `${indent}${c}`).join('\\n')}\\n */${suffix}`\n}\n","export class Cache<T> {\n #buffer = new Map<string, T>()\n\n async get(key: string): Promise<T | null> {\n return this.#buffer.get(key) ?? null\n }\n\n async set(key: string, value: T): Promise<void> {\n this.#buffer.set(key, value)\n }\n\n async delete(key: string): Promise<void> {\n this.#buffer.delete(key)\n }\n\n async clear(): Promise<void> {\n this.#buffer.clear()\n }\n\n async keys(): Promise<string[]> {\n return [...this.#buffer.keys()]\n }\n\n async values(): Promise<T[]> {\n return [...this.#buffer.values()]\n }\n\n async flush(): Promise<void> {\n // No-op for base cache\n }\n}\n","import { orderBy } from 'natural-orderby'\n\nimport { camelCase } from '../transformers/casing.ts'\n\ntype FunctionParamsASTWithoutType = {\n name?: string\n type?: string\n /**\n * @default true\n */\n required?: boolean\n /**\n * @default true\n */\n enabled?: boolean\n default?: string\n}\n\ntype FunctionParamsASTWithType = {\n name?: never\n type: string\n /**\n * @default true\n */\n required?: boolean\n /**\n * @default true\n */\n enabled?: boolean\n default?: string\n}\n/**\n * @deprecated\n */\nexport type FunctionParamsAST = FunctionParamsASTWithoutType | FunctionParamsASTWithType\n\n/**\n * @deprecated\n */\nexport class FunctionParams {\n #items: Array<FunctionParamsAST | FunctionParamsAST[]> = []\n constructor() {\n return this\n }\n\n get items(): FunctionParamsAST[] {\n return this.#items.flat()\n }\n\n add(item: FunctionParamsAST | Array<FunctionParamsAST | FunctionParamsAST[] | undefined> | undefined): FunctionParams {\n if (!item) {\n return this\n }\n\n if (Array.isArray(item)) {\n item.filter(Boolean).forEach((it) => {\n this.#items.push(it)\n })\n return this\n }\n this.#items.push(item)\n\n return this\n }\n static #orderItems(items: Array<FunctionParamsAST | FunctionParamsAST[]>) {\n return orderBy(\n items.filter(Boolean),\n [\n (v) => {\n if (Array.isArray(v)) {\n return undefined\n }\n return !v.default\n },\n (v) => {\n if (Array.isArray(v)) {\n return undefined\n }\n return v.required ?? true\n },\n ],\n ['desc', 'desc'],\n )\n }\n\n static #addParams(acc: string[], item: FunctionParamsAST) {\n const { enabled = true, name, type, required = true, ...rest } = item\n\n if (!enabled) {\n return acc\n }\n\n if (!name) {\n // when name is not se we uses TypeScript generics\n acc.push(`${type}${rest.default ? ` = ${rest.default}` : ''}`)\n\n return acc\n }\n // TODO check whey we still need the camelcase here\n const parameterName = name.startsWith('{') ? name : camelCase(name)\n\n if (type) {\n if (required) {\n acc.push(`${parameterName}: ${type}${rest.default ? ` = ${rest.default}` : ''}`)\n } else {\n acc.push(`${parameterName}?: ${type}`)\n }\n } else {\n acc.push(`${parameterName}`)\n }\n\n return acc\n }\n\n static toObject(items: FunctionParamsAST[]): FunctionParamsAST {\n let type: string[] = []\n let name: string[] = []\n\n const enabled = items.every((item) => item.enabled) ? items.at(0)?.enabled : true\n const required = items.every((item) => item.required) ?? true\n\n items.forEach((item) => {\n name = FunctionParams.#addParams(name, { ...item, type: undefined })\n if (items.some((item) => item.type)) {\n type = FunctionParams.#addParams(type, item)\n }\n })\n\n return {\n name: `{ ${name.join(', ')} }`,\n type: type.length ? `{ ${type.join('; ')} }` : undefined,\n enabled,\n required,\n }\n }\n\n toObject(): FunctionParamsAST {\n const items = FunctionParams.#orderItems(this.#items).flat()\n\n return FunctionParams.toObject(items)\n }\n\n static toString(items: (FunctionParamsAST | FunctionParamsAST[])[]): string {\n const sortedData = FunctionParams.#orderItems(items)\n\n return sortedData\n .reduce((acc, item) => {\n if (Array.isArray(item)) {\n if (item.length <= 0) {\n return acc\n }\n const subItems = FunctionParams.#orderItems(item) as FunctionParamsAST[]\n const objectItem = FunctionParams.toObject(subItems)\n\n return FunctionParams.#addParams(acc, objectItem)\n }\n\n return FunctionParams.#addParams(acc, item)\n }, [] as string[])\n .join(', ')\n }\n\n toString(): string {\n const items = FunctionParams.#orderItems(this.#items)\n\n return FunctionParams.toString(items)\n }\n}\n","/**\n * Converts a param path (string with dot notation or array of strings) to a JavaScript accessor expression.\n * @param param - The param path, e.g., 'pagination.next.id' or ['pagination', 'next', 'id']\n * @param accessor - The base accessor, e.g., 'lastPage' or 'firstPage'\n * @returns A JavaScript accessor expression, e.g., \"lastPage?.['pagination']?.['next']?.['id']\", or undefined if param is empty\n *\n * @example\n * ```ts\n * getNestedAccessor('pagination.next.id', 'lastPage')\n * // returns: \"lastPage?.['pagination']?.['next']?.['id']\"\n *\n * getNestedAccessor(['pagination', 'next', 'id'], 'lastPage')\n * // returns: \"lastPage?.['pagination']?.['next']?.['id']\"\n *\n * getNestedAccessor('', 'lastPage')\n * // returns: undefined\n * ```\n */\nexport function getNestedAccessor(param: string | string[], accessor: string): string | undefined {\n const parts = Array.isArray(param) ? param : param.split('.')\n if (parts.length === 0 || (parts.length === 1 && parts[0] === '')) {\n return undefined\n }\n return parts.reduce((acc, part) => `${acc}?.['${part}']`, accessor)\n}\n","import type { PossiblePromise } from './types.ts'\n\nexport function isPromise<T>(result: PossiblePromise<T>): result is Promise<T> {\n return !!result && typeof (result as Promise<unknown>)?.then === 'function'\n}\n\nexport function isPromiseFulfilledResult<T = unknown>(result: PromiseSettledResult<unknown>): result is PromiseFulfilledResult<T> {\n return result.status === 'fulfilled'\n}\n\nexport function isPromiseRejectedResult<T>(result: PromiseSettledResult<unknown>): result is Omit<PromiseRejectedResult, 'reason'> & { reason: T } {\n return result.status === 'rejected'\n}\n","export function renderTemplate<TData extends Record<string, unknown> = Record<string, unknown>>(template: string, data: TData | undefined = undefined): string {\n if (!data || !Object.keys(data).length) {\n return template.replace(/{{(.*?)}}/g, '')\n }\n\n const matches = template.match(/{{(.*?)}}/g)\n\n return (\n matches?.reduce((prev, curr) => {\n const index = curr.split(/{{|}}/).filter(Boolean)[0]?.trim()\n if (index === undefined) {\n return prev\n }\n const value = data[index]\n\n if (value === undefined) {\n return prev\n }\n\n return prev\n .replace(curr, () => {\n if (typeof value === 'boolean') {\n return `${value.toString()}` || 'false'\n }\n\n return (value as string) || ''\n })\n .trim()\n }, template) || ''\n )\n}\n","import { readFileSync } from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport createJiti from 'jiti'\n\nexport function resolveModuleSource(pkgName: string) {\n const parentURL = import.meta.url\n const jiti = createJiti(parentURL)\n\n const resolved = jiti.esmResolve(pkgName, parentURL)\n const filePath = resolved.startsWith('file:') ? fileURLToPath(resolved) : resolved\n const source = readFileSync(filePath, { encoding: 'utf-8' })\n const ext = path.extname(filePath)\n return { path: filePath, source, ext } as const\n}\n","export async function timeout(ms: number): Promise<unknown> {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n resolve(timeout)\n }, ms)\n }).then((timeout) => {\n clearTimeout(timeout as NodeJS.Timeout)\n\n return true\n })\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","names":["#buffer","#items","#orderItems","#addParams","item","timeout"],"sources":["../src/utils/buildJSDoc.ts","../src/utils/Cache.ts","../src/utils/checkOnlineStatus.ts","../src/utils/FunctionParams.ts","../src/utils/getNestedAccessor.ts","../src/utils/promise.ts","../src/utils/renderTemplate.ts","../src/utils/resolveModuleSource.ts","../src/utils/timeout.ts"],"sourcesContent":["/**\n * Builds a JSDoc comment block with custom indentation.\n * @param comments - Array of comment strings to include in the JSDoc block\n * @param options - Configuration options for formatting\n * @returns Formatted JSDoc string or fallback string if no comments\n */\nexport function buildJSDoc(\n comments: Array<string>,\n options: {\n /**\n * String to use for indenting each line of the JSDoc comment\n * @default ' * ' (3 spaces + asterisk + space)\n */\n indent?: string\n /**\n * String to append after the closing JSDoc tag\n * @default '\\n ' (newline + 2 spaces)\n */\n suffix?: string\n /**\n * String to return when there are no comments\n * @default ' ' (2 spaces)\n */\n fallback?: string\n } = {},\n): string {\n const { indent = ' * ', suffix = '\\n ', fallback = ' ' } = options\n\n if (comments.length === 0) {\n return fallback\n }\n\n return `/**\\n${comments.map((c) => `${indent}${c}`).join('\\n')}\\n */${suffix}`\n}\n","export class Cache<T> {\n #buffer = new Map<string, T>()\n\n async get(key: string): Promise<T | null> {\n return this.#buffer.get(key) ?? null\n }\n\n async set(key: string, value: T): Promise<void> {\n this.#buffer.set(key, value)\n }\n\n async delete(key: string): Promise<void> {\n this.#buffer.delete(key)\n }\n\n async clear(): Promise<void> {\n this.#buffer.clear()\n }\n\n async keys(): Promise<string[]> {\n return [...this.#buffer.keys()]\n }\n\n async values(): Promise<T[]> {\n return [...this.#buffer.values()]\n }\n\n async flush(): Promise<void> {\n // No-op for base cache\n }\n}\n","import dns from 'node:dns'\n\n/**\n * Check if the system has internet connectivity\n * Uses DNS lookup to well-known stable domains as a lightweight connectivity test\n */\nexport async function isOnline(): Promise<boolean> {\n const testDomains = [\n 'dns.google.com', // Google Public DNS\n 'cloudflare.com', // Cloudflare\n 'one.one.one.one', // Cloudflare DNS\n ]\n\n for (const domain of testDomains) {\n try {\n await dns.promises.resolve(domain)\n return true\n } catch {\n // Try next domain\n }\n }\n\n return false\n}\n\n/**\n * Execute a function only if online, otherwise silently skip\n */\nexport async function executeIfOnline<T>(fn: () => Promise<T>): Promise<T | null> {\n const online = await isOnline()\n if (!online) {\n return null\n }\n\n try {\n return await fn()\n } catch {\n return null\n }\n}\n","import { orderBy } from 'natural-orderby'\n\nimport { camelCase } from '../transformers/casing.ts'\n\ntype FunctionParamsASTWithoutType = {\n name?: string\n type?: string\n /**\n * @default true\n */\n required?: boolean\n /**\n * @default true\n */\n enabled?: boolean\n default?: string\n}\n\ntype FunctionParamsASTWithType = {\n name?: never\n type: string\n /**\n * @default true\n */\n required?: boolean\n /**\n * @default true\n */\n enabled?: boolean\n default?: string\n}\n/**\n * @deprecated\n */\nexport type FunctionParamsAST = FunctionParamsASTWithoutType | FunctionParamsASTWithType\n\n/**\n * @deprecated\n */\nexport class FunctionParams {\n #items: Array<FunctionParamsAST | FunctionParamsAST[]> = []\n constructor() {\n return this\n }\n\n get items(): FunctionParamsAST[] {\n return this.#items.flat()\n }\n\n add(item: FunctionParamsAST | Array<FunctionParamsAST | FunctionParamsAST[] | undefined> | undefined): FunctionParams {\n if (!item) {\n return this\n }\n\n if (Array.isArray(item)) {\n item.filter(Boolean).forEach((it) => {\n this.#items.push(it)\n })\n return this\n }\n this.#items.push(item)\n\n return this\n }\n static #orderItems(items: Array<FunctionParamsAST | FunctionParamsAST[]>) {\n return orderBy(\n items.filter(Boolean),\n [\n (v) => {\n if (Array.isArray(v)) {\n return undefined\n }\n return !v.default\n },\n (v) => {\n if (Array.isArray(v)) {\n return undefined\n }\n return v.required ?? true\n },\n ],\n ['desc', 'desc'],\n )\n }\n\n static #addParams(acc: string[], item: FunctionParamsAST) {\n const { enabled = true, name, type, required = true, ...rest } = item\n\n if (!enabled) {\n return acc\n }\n\n if (!name) {\n // when name is not se we uses TypeScript generics\n acc.push(`${type}${rest.default ? ` = ${rest.default}` : ''}`)\n\n return acc\n }\n // TODO check whey we still need the camelcase here\n const parameterName = name.startsWith('{') ? name : camelCase(name)\n\n if (type) {\n if (required) {\n acc.push(`${parameterName}: ${type}${rest.default ? ` = ${rest.default}` : ''}`)\n } else {\n acc.push(`${parameterName}?: ${type}`)\n }\n } else {\n acc.push(`${parameterName}`)\n }\n\n return acc\n }\n\n static toObject(items: FunctionParamsAST[]): FunctionParamsAST {\n let type: string[] = []\n let name: string[] = []\n\n const enabled = items.every((item) => item.enabled) ? items.at(0)?.enabled : true\n const required = items.every((item) => item.required) ?? true\n\n items.forEach((item) => {\n name = FunctionParams.#addParams(name, { ...item, type: undefined })\n if (items.some((item) => item.type)) {\n type = FunctionParams.#addParams(type, item)\n }\n })\n\n return {\n name: `{ ${name.join(', ')} }`,\n type: type.length ? `{ ${type.join('; ')} }` : undefined,\n enabled,\n required,\n }\n }\n\n toObject(): FunctionParamsAST {\n const items = FunctionParams.#orderItems(this.#items).flat()\n\n return FunctionParams.toObject(items)\n }\n\n static toString(items: (FunctionParamsAST | FunctionParamsAST[])[]): string {\n const sortedData = FunctionParams.#orderItems(items)\n\n return sortedData\n .reduce((acc, item) => {\n if (Array.isArray(item)) {\n if (item.length <= 0) {\n return acc\n }\n const subItems = FunctionParams.#orderItems(item) as FunctionParamsAST[]\n const objectItem = FunctionParams.toObject(subItems)\n\n return FunctionParams.#addParams(acc, objectItem)\n }\n\n return FunctionParams.#addParams(acc, item)\n }, [] as string[])\n .join(', ')\n }\n\n toString(): string {\n const items = FunctionParams.#orderItems(this.#items)\n\n return FunctionParams.toString(items)\n }\n}\n","/**\n * Converts a param path (string with dot notation or array of strings) to a JavaScript accessor expression.\n * @param param - The param path, e.g., 'pagination.next.id' or ['pagination', 'next', 'id']\n * @param accessor - The base accessor, e.g., 'lastPage' or 'firstPage'\n * @returns A JavaScript accessor expression, e.g., \"lastPage?.['pagination']?.['next']?.['id']\", or undefined if param is empty\n *\n * @example\n * ```ts\n * getNestedAccessor('pagination.next.id', 'lastPage')\n * // returns: \"lastPage?.['pagination']?.['next']?.['id']\"\n *\n * getNestedAccessor(['pagination', 'next', 'id'], 'lastPage')\n * // returns: \"lastPage?.['pagination']?.['next']?.['id']\"\n *\n * getNestedAccessor('', 'lastPage')\n * // returns: undefined\n * ```\n */\nexport function getNestedAccessor(param: string | string[], accessor: string): string | undefined {\n const parts = Array.isArray(param) ? param : param.split('.')\n if (parts.length === 0 || (parts.length === 1 && parts[0] === '')) {\n return undefined\n }\n return parts.reduce((acc, part) => `${acc}?.['${part}']`, accessor)\n}\n","import type { PossiblePromise } from './types.ts'\n\nexport function isPromise<T>(result: PossiblePromise<T>): result is Promise<T> {\n return !!result && typeof (result as Promise<unknown>)?.then === 'function'\n}\n\nexport function isPromiseFulfilledResult<T = unknown>(result: PromiseSettledResult<unknown>): result is PromiseFulfilledResult<T> {\n return result.status === 'fulfilled'\n}\n\nexport function isPromiseRejectedResult<T>(result: PromiseSettledResult<unknown>): result is Omit<PromiseRejectedResult, 'reason'> & { reason: T } {\n return result.status === 'rejected'\n}\n","export function renderTemplate<TData extends Record<string, unknown> = Record<string, unknown>>(template: string, data: TData | undefined = undefined): string {\n if (!data || !Object.keys(data).length) {\n return template.replace(/{{(.*?)}}/g, '')\n }\n\n const matches = template.match(/{{(.*?)}}/g)\n\n return (\n matches?.reduce((prev, curr) => {\n const index = curr.split(/{{|}}/).filter(Boolean)[0]?.trim()\n if (index === undefined) {\n return prev\n }\n const value = data[index]\n\n if (value === undefined) {\n return prev\n }\n\n return prev\n .replace(curr, () => {\n if (typeof value === 'boolean') {\n return `${value.toString()}` || 'false'\n }\n\n return (value as string) || ''\n })\n .trim()\n }, template) || ''\n )\n}\n","import { readFileSync } from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport createJiti from 'jiti'\n\nexport function resolveModuleSource(pkgName: string) {\n const parentURL = import.meta.url\n const jiti = createJiti(parentURL)\n\n const resolved = jiti.esmResolve(pkgName, parentURL)\n const filePath = resolved.startsWith('file:') ? fileURLToPath(resolved) : resolved\n const source = readFileSync(filePath, { encoding: 'utf-8' })\n const ext = path.extname(filePath)\n return { path: filePath, source, ext } as const\n}\n","export async function timeout(ms: number): Promise<unknown> {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n resolve(timeout)\n }, ms)\n }).then((timeout) => {\n clearTimeout(timeout as NodeJS.Timeout)\n\n return true\n })\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kubb/core",
|
|
3
|
-
"version": "4.20.
|
|
3
|
+
"version": "4.20.2",
|
|
4
4
|
"description": "Core functionality for Kubb's plugin-based code generation system, providing the foundation for transforming OpenAPI specifications.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"jiti": "^2.6.1",
|
|
88
88
|
"js-runtime": "^0.0.8",
|
|
89
89
|
"natural-orderby": "^5.0.0",
|
|
90
|
-
"p-limit": "^7.
|
|
90
|
+
"p-limit": "^7.3.0",
|
|
91
91
|
"remeda": "^2.33.4",
|
|
92
92
|
"semver": "^7.7.3"
|
|
93
93
|
},
|
package/src/PluginManager.ts
CHANGED
|
@@ -645,6 +645,16 @@ export class PluginManager {
|
|
|
645
645
|
|
|
646
646
|
setUniqueName(plugin.name, usedPluginNames)
|
|
647
647
|
|
|
648
|
+
// Emit warning if this is a duplicate plugin (will be removed in v5)
|
|
649
|
+
const usageCount = usedPluginNames[plugin.name]
|
|
650
|
+
if (usageCount && usageCount > 1) {
|
|
651
|
+
this.events.emit(
|
|
652
|
+
'warn',
|
|
653
|
+
`Multiple instances of plugin "${plugin.name}" detected. This behavior is deprecated and will be removed in v5.`,
|
|
654
|
+
`Plugin key: [${plugin.name}, ${usageCount}]`,
|
|
655
|
+
)
|
|
656
|
+
}
|
|
657
|
+
|
|
648
658
|
return {
|
|
649
659
|
install() {},
|
|
650
660
|
...plugin,
|
package/src/transformers/trim.ts
CHANGED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import dns from 'node:dns'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Check if the system has internet connectivity
|
|
5
|
+
* Uses DNS lookup to well-known stable domains as a lightweight connectivity test
|
|
6
|
+
*/
|
|
7
|
+
export async function isOnline(): Promise<boolean> {
|
|
8
|
+
const testDomains = [
|
|
9
|
+
'dns.google.com', // Google Public DNS
|
|
10
|
+
'cloudflare.com', // Cloudflare
|
|
11
|
+
'one.one.one.one', // Cloudflare DNS
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
for (const domain of testDomains) {
|
|
15
|
+
try {
|
|
16
|
+
await dns.promises.resolve(domain)
|
|
17
|
+
return true
|
|
18
|
+
} catch {
|
|
19
|
+
// Try next domain
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return false
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Execute a function only if online, otherwise silently skip
|
|
28
|
+
*/
|
|
29
|
+
export async function executeIfOnline<T>(fn: () => Promise<T>): Promise<T | null> {
|
|
30
|
+
const online = await isOnline()
|
|
31
|
+
if (!online) {
|
|
32
|
+
return null
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
return await fn()
|
|
37
|
+
} catch {
|
|
38
|
+
return null
|
|
39
|
+
}
|
|
40
|
+
}
|
package/src/utils/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { AsyncEventEmitter } from './AsyncEventEmitter.ts'
|
|
2
2
|
export { buildJSDoc } from './buildJSDoc.ts'
|
|
3
3
|
export { Cache } from './Cache.ts'
|
|
4
|
+
export { executeIfOnline, isOnline } from './checkOnlineStatus.ts'
|
|
4
5
|
export type { FunctionParamsAST } from './FunctionParams.ts'
|
|
5
6
|
export { FunctionParams } from './FunctionParams.ts'
|
|
6
7
|
export { formatHrtime, formatMs, getElapsedMs } from './formatHrtime.ts'
|