@utilix-tech/sdk 0.54.0 → 0.56.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/CHANGELOG.md +8 -0
- package/README.md +16 -6
- package/dist/{chunk-3KIUADK4.js → chunk-56VFNHVO.js} +55 -1
- package/dist/{chunk-NKN656TQ.js → chunk-MRIGQRTU.js} +79 -1
- package/dist/{chunk-DEBIH7QS.js → chunk-TVSQ53TZ.js} +55 -1
- package/dist/{data-CupeugaR.d.ts → data-Cvyg8ZXo.d.cts} +35 -2
- package/dist/{data-CupeugaR.d.cts → data-Cvyg8ZXo.d.ts} +35 -2
- package/dist/index.cjs +186 -0
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/{network-C6IcHeMB.d.ts → network-CoGf7_Op.d.cts} +37 -2
- package/dist/{network-C6IcHeMB.d.cts → network-CoGf7_Op.d.ts} +37 -2
- package/dist/tools/data.cjs +54 -0
- package/dist/tools/data.d.cts +1 -1
- package/dist/tools/data.d.ts +1 -1
- package/dist/tools/data.js +1 -1
- package/dist/tools/network.cjs +54 -0
- package/dist/tools/network.d.cts +1 -1
- package/dist/tools/network.d.ts +1 -1
- package/dist/tools/network.js +1 -1
- package/dist/tools/units.cjs +78 -0
- package/dist/tools/units.d.cts +1 -1
- package/dist/tools/units.d.ts +1 -1
- package/dist/tools/units.js +1 -1
- package/dist/{units-p-1Ikx7l.d.cts → units-BM9GkUZW.d.cts} +71 -2
- package/dist/{units-p-1Ikx7l.d.ts → units-BM9GkUZW.d.ts} +71 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
Full release notes for all Utilix surfaces (browser tools, REST API, SDKs, MCP server) live at [utilix.tech/changelog](https://utilix.tech/changelog). This file tracks just this package.
|
|
4
4
|
|
|
5
|
+
## 0.56.0
|
|
6
|
+
- Add `buildAcceptLanguage`, `parseAcceptLanguage` (accept-language-parser): build an Accept-Language request-header value from locale/quality pairs sorted by descending preference, or parse an existing one into its ranked entries.
|
|
7
|
+
- Add `calculateBlendedLoanRate` (blended-loan-rate-calculator): compute the single weighted-average interest rate across a list of loan balances, plus combined monthly and annual interest accrual.
|
|
8
|
+
|
|
9
|
+
## 0.55.0
|
|
10
|
+
- Add `calculateDebtToIncomeRatio` (debt-to-income-ratio-calculator): compute the debt-to-income ratio (total monthly debt payments / gross monthly income) from one or more monthly debts, plus a qualitative tier matching common mortgage-lending guidance.
|
|
11
|
+
- Add `inferCsvColumnTypes` (csv-column-type-inferencer): parse CSV/TSV data and infer each column's data type (integer, float, boolean, ISO 8601 date, or string), flagging nullable columns and empty-cell counts.
|
|
12
|
+
|
|
5
13
|
## 0.54.0
|
|
6
14
|
- Add `validatePackageExports` (package-json-exports-validator): parse a package.json's exports field and flag common dual-package (ESM/CJS) misconfigurations, a types condition not listed first, a missing default fallback, mismatched require/import extensions, mixed subpath/condition keys, and pattern mismatches.
|
|
7
15
|
- Add `buildXContentTypeOptionsHeader`, `parseXContentTypeOptionsHeader`, `assessContentTypeRisk` (x-content-type-options-builder): build the fixed X-Content-Type-Options: nosniff header, validate a pasted value, and assess MIME-sniffing risk for a given Content-Type.
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @utilix-tech/sdk
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**648 developer utility functions for Node.js: runs locally, no API key required.**
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@utilix-tech/sdk)
|
|
6
6
|
[](https://www.npmjs.com/package/@utilix-tech/sdk)
|
|
@@ -205,7 +205,8 @@ import { parseCsv, csvToJson, validateYaml, resolveYamlAnchors, tomlToJson, json
|
|
|
205
205
|
formatXml, xmlToJson, jsonToXml, parseIni,
|
|
206
206
|
validateNdjson, formatNdjson, ndjsonToJsonArray, diffEnvExample,
|
|
207
207
|
parseSubtitles, convertSubtitles, shiftSubtitles, analyzeCaptionSpeed, parseFrontMatter,
|
|
208
|
-
generateMarkdownToc, csvToSqlInsert, findCsvDuplicateRows, calculateMarkdownTaskListProgress
|
|
208
|
+
generateMarkdownToc, csvToSqlInsert, findCsvDuplicateRows, calculateMarkdownTaskListProgress,
|
|
209
|
+
inferCsvColumnTypes } from "@utilix-tech/sdk/data";
|
|
209
210
|
|
|
210
211
|
// CSV
|
|
211
212
|
const rows = parseCsv("name,age\nalice,30\nbob,25");
|
|
@@ -265,6 +266,10 @@ findCsvDuplicateRows("name,email\nAlice,a@x.com\nBob,b@x.com\nAlice,a@x.com");
|
|
|
265
266
|
// Markdown task list progress: completion percentage overall and per heading section
|
|
266
267
|
calculateMarkdownTaskListProgress("# Phase 1\n- [x] a\n- [x] b\n## Phase 2\n- [ ] c\n");
|
|
267
268
|
// { totalItems: 3, completedItems: 2, percentComplete: 66.67, sections: [{ section: "Phase 1", ... }, { section: "Phase 2", ... }] }
|
|
269
|
+
|
|
270
|
+
// Infer each CSV column's data type: integer, float, boolean, ISO 8601 date, or string
|
|
271
|
+
inferCsvColumnTypes("id,price,active\n1,9.99,true\n2,5,false");
|
|
272
|
+
// { columns: [{ name: "id", inferredType: "integer", ... }, { name: "price", inferredType: "float", ... }, ...], rowCount: 2 }
|
|
268
273
|
```
|
|
269
274
|
|
|
270
275
|
---
|
|
@@ -326,7 +331,7 @@ formatIso8601Duration(90061); // { iso: "P1DT1H1M1S", ... }
|
|
|
326
331
|
### `/units`: Conversions
|
|
327
332
|
|
|
328
333
|
```ts
|
|
329
|
-
import { convertBytes, pxToAll, convert, formatValue, validateCardNumber, validateIban, calculateLoan, validateBarcode, calculateTax, calculateCompoundInterest, validateIsbn, calculateTipSplit, calculateSimpleInterest, calculateTimeValue, calculatePercentageChange, convertAprApy, calculateMarginMarkup, calculateDiscount, applySuccessiveDiscounts, calculateBreakEven, calculateVideoBitrate, calculateRuleOf72, calculateEmi, calculateRoi, compareUnitPrices, calculatePaybackPeriod, calculateCdMaturity, calculateDepreciationSchedule, calculateCashRounding, calculateMovingAverages, calculateGpa, calculateCreditUtilization } from "@utilix-tech/sdk/units";
|
|
334
|
+
import { convertBytes, pxToAll, convert, formatValue, validateCardNumber, validateIban, calculateLoan, validateBarcode, calculateTax, calculateCompoundInterest, validateIsbn, calculateTipSplit, calculateSimpleInterest, calculateTimeValue, calculatePercentageChange, convertAprApy, calculateMarginMarkup, calculateDiscount, applySuccessiveDiscounts, calculateBreakEven, calculateVideoBitrate, calculateRuleOf72, calculateEmi, calculateRoi, compareUnitPrices, calculatePaybackPeriod, calculateCdMaturity, calculateDepreciationSchedule, calculateCashRounding, calculateMovingAverages, calculateGpa, calculateCreditUtilization, calculateDebtToIncomeRatio, calculateBlendedLoanRate } from "@utilix-tech/sdk/units";
|
|
330
335
|
|
|
331
336
|
// File sizes
|
|
332
337
|
convertBytes(1073741824, "GB"); // 1
|
|
@@ -464,6 +469,10 @@ calculateGpa([{ name: "Calculus", grade: "A", credits: 4 }, { name: "History", g
|
|
|
464
469
|
// Per-account and overall credit utilization, plus a qualitative tier
|
|
465
470
|
calculateCreditUtilization([{ label: "Visa", balance: 500, limit: 5000 }, { label: "Amex", balance: 1200, limit: 3000 }]);
|
|
466
471
|
// { overallUtilizationPercent: 21.25, overallTier: "good", totalBalance: 1700, totalLimit: 8000, accounts: [...] }
|
|
472
|
+
|
|
473
|
+
// Debt-to-income (DTI) ratio, plus a qualitative tier matching common mortgage-lending guidance
|
|
474
|
+
calculateDebtToIncomeRatio([{ label: "Rent", amount: 1500 }, { label: "Car loan", amount: 400 }], 5000);
|
|
475
|
+
// { dtiPercent: 38, tier: "moderate", totalMonthlyDebt: 1900, grossMonthlyIncome: 5000, debts: [...] }
|
|
467
476
|
```
|
|
468
477
|
|
|
469
478
|
---
|
|
@@ -478,7 +487,8 @@ import { getStatusCode, isValidIp, isValidIpv4, isValidIpv6,
|
|
|
478
487
|
buildRangeHeader, parseContentRangeHeader, buildVaryHeader, parseVaryHeader, validateManifest,
|
|
479
488
|
buildPermissionsPolicy, parsePermissionsPolicy, buildClientHints, parseClientHintHeaders,
|
|
480
489
|
buildContentDisposition, parseContentDisposition,
|
|
481
|
-
buildXContentTypeOptionsHeader, parseXContentTypeOptionsHeader, assessContentTypeRisk
|
|
490
|
+
buildXContentTypeOptionsHeader, parseXContentTypeOptionsHeader, assessContentTypeRisk,
|
|
491
|
+
buildAcceptLanguage, parseAcceptLanguage } from "@utilix-tech/sdk/network";
|
|
482
492
|
|
|
483
493
|
getStatusCode(404);
|
|
484
494
|
// { code: 404, text: "Not Found", description: "...", category: "Client Error" }
|
|
@@ -850,10 +860,10 @@ inspectGifFrames(new Uint8Array(gifBytes));
|
|
|
850
860
|
| `@utilix-tech/sdk/encoding` | Base64, URL, HTML entities, Base32/Base58/Base62 encode/decode |
|
|
851
861
|
| `@utilix-tech/sdk/hashing` | MD5, SHA-1/256/512, bcrypt, HMAC, .htpasswd, SRI hashes, content-hash ETag generation |
|
|
852
862
|
| `@utilix-tech/sdk/text` | Case convert, slugify, word count, lorem ipsum, line ops, HTML→Markdown, Levenshtein/Damerau string distance, readability scoring, sentence length distribution, emoji lookup |
|
|
853
|
-
| `@utilix-tech/sdk/data` | CSV, YAML, TOML, XML, INI, NDJSON parse and convert, SRT/WebVTT subtitles, Markdown front matter parser, YAML anchor/alias resolver |
|
|
863
|
+
| `@utilix-tech/sdk/data` | CSV, YAML, TOML, XML, INI, NDJSON parse and convert, SRT/WebVTT subtitles, Markdown front matter parser, YAML anchor/alias resolver, CSV column type inferencer |
|
|
854
864
|
| `@utilix-tech/sdk/generators` | UUID v4/v7, ULID, passwords, strength check, entropy estimator, fake data |
|
|
855
865
|
| `@utilix-tech/sdk/time` | Date diff, timezone convert, cron parse, relative time |
|
|
856
|
-
| `@utilix-tech/sdk/units` | Bytes, CSS px/rem, number bases, currency format, credit card/IBAN/barcode/ISBN validation, loan calculator, EMI calculator, compound/simple interest calculators, VAT/sales tax calculator, tip/bill split calculator, break-even point calculator, Rule of 72 calculator, savings goal calculator, ROI calculator, cash denomination/till calculator, payback period calculator, CD maturity calculator |
|
|
866
|
+
| `@utilix-tech/sdk/units` | Bytes, CSS px/rem, number bases, currency format, credit card/IBAN/barcode/ISBN validation, loan calculator, EMI calculator, compound/simple interest calculators, VAT/sales tax calculator, tip/bill split calculator, break-even point calculator, Rule of 72 calculator, savings goal calculator, ROI calculator, cash denomination/till calculator, payback period calculator, CD maturity calculator, debt-to-income ratio calculator |
|
|
857
867
|
| `@utilix-tech/sdk/network` | HTTP status codes, IP validation, country flags, geolocation URLs, HAR file parsing, User-Agent parsing, IPv6 address compress/expand, Permissions-Policy header builder, Client Hints header builder/parser, Content-Disposition header builder/parser, X-Content-Type-Options header builder/risk assessor, sitemap.xml validator, sitemap index splitter |
|
|
858
868
|
| `@utilix-tech/sdk/api` | cURL build/parse, JWT decode/sign, JWKS parse, CORS headers, CSP header |
|
|
859
869
|
| `@utilix-tech/sdk/code` | SQL format/minify, HTML format/minify, regex tester, GraphQL format, MIME type lookup, GitHub URL parsing, regex ReDoS detector, Conventional Commits linter, package.json exports field validator |
|
|
@@ -26,6 +26,7 @@ __export(data_exports, {
|
|
|
26
26
|
getTomlStats: () => getTomlStats,
|
|
27
27
|
getXmlStats: () => getXmlStats,
|
|
28
28
|
getYamlStats: () => getYamlStats,
|
|
29
|
+
inferCsvColumnTypes: () => inferCsvColumnTypes,
|
|
29
30
|
iniToJson: () => iniToJson,
|
|
30
31
|
jsonArrayToNdjson: () => jsonArrayToNdjson,
|
|
31
32
|
jsonToIni: () => jsonToIni,
|
|
@@ -1610,6 +1611,59 @@ function findCsvDuplicateRows(input, options) {
|
|
|
1610
1611
|
uniqueRowCount: parsed.rows.length - duplicateRowCount + duplicateGroups.length
|
|
1611
1612
|
};
|
|
1612
1613
|
}
|
|
1614
|
+
var _ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})?)?$/;
|
|
1615
|
+
function _classifyCsvValue(raw) {
|
|
1616
|
+
const v = raw.trim();
|
|
1617
|
+
if (v === "") return "empty";
|
|
1618
|
+
if (/^(true|false)$/i.test(v)) return "boolean";
|
|
1619
|
+
if (/^-?\d+$/.test(v)) return "integer";
|
|
1620
|
+
if (/^-?\d+\.\d+$/.test(v)) return "float";
|
|
1621
|
+
if (_ISO_DATE_RE.test(v)) return "date";
|
|
1622
|
+
return "string";
|
|
1623
|
+
}
|
|
1624
|
+
function inferCsvColumnTypes(input, options) {
|
|
1625
|
+
const parsed = parseCsv(input, {
|
|
1626
|
+
delimiter: options?.delimiter ?? ",",
|
|
1627
|
+
hasHeader: options?.hasHeader !== false
|
|
1628
|
+
});
|
|
1629
|
+
if ("error" in parsed) return parsed;
|
|
1630
|
+
const columns = parsed.headers.map((name, colIdx) => {
|
|
1631
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1632
|
+
let sawString = false;
|
|
1633
|
+
let nullCount = 0;
|
|
1634
|
+
const sampleValues = [];
|
|
1635
|
+
for (const row of parsed.rows) {
|
|
1636
|
+
const raw = row[colIdx] ?? "";
|
|
1637
|
+
const kind = _classifyCsvValue(raw);
|
|
1638
|
+
if (kind === "empty") {
|
|
1639
|
+
nullCount++;
|
|
1640
|
+
continue;
|
|
1641
|
+
}
|
|
1642
|
+
if (sampleValues.length < 3) sampleValues.push(raw);
|
|
1643
|
+
if (kind === "string") sawString = true;
|
|
1644
|
+
else seen.add(kind);
|
|
1645
|
+
}
|
|
1646
|
+
let inferredType;
|
|
1647
|
+
if (sawString || seen.size === 0) {
|
|
1648
|
+
inferredType = "string";
|
|
1649
|
+
} else if (seen.size === 1) {
|
|
1650
|
+
inferredType = [...seen][0];
|
|
1651
|
+
} else if (seen.has("integer") && seen.has("float") && seen.size === 2) {
|
|
1652
|
+
inferredType = "float";
|
|
1653
|
+
} else {
|
|
1654
|
+
inferredType = "string";
|
|
1655
|
+
}
|
|
1656
|
+
return {
|
|
1657
|
+
name,
|
|
1658
|
+
inferredType,
|
|
1659
|
+
nullable: nullCount > 0,
|
|
1660
|
+
nullCount,
|
|
1661
|
+
totalCount: parsed.rows.length,
|
|
1662
|
+
sampleValues
|
|
1663
|
+
};
|
|
1664
|
+
});
|
|
1665
|
+
return { columns, rowCount: parsed.rows.length };
|
|
1666
|
+
}
|
|
1613
1667
|
var _YAML_ANCHOR_RE = /(?:^|\s)&([A-Za-z0-9_.-]+)/g;
|
|
1614
1668
|
var _YAML_ALIAS_RE = /(?:^|\s)\*([A-Za-z0-9_.-]+)/g;
|
|
1615
1669
|
function _stripYamlLineComment(line) {
|
|
@@ -1721,4 +1775,4 @@ function calculateMarkdownTaskListProgress(markdown) {
|
|
|
1721
1775
|
return { totalItems, completedItems, percentComplete, sections, items };
|
|
1722
1776
|
}
|
|
1723
1777
|
|
|
1724
|
-
export { analyzeCaptionSpeed, calculateMarkdownTaskListProgress, convertSubtitles, csvToJson, csvToSqlInsert, data_exports, detectDelimiter, detectSubtitleFormat, diffEnvExample, envToExport, envToJson, findCsvDuplicateRows, formatNdjson, formatSubtitleTimestamp, formatToml, formatXml, generateMarkdownToc, getSection, getSectionNames, getTomlStats, getXmlStats, getYamlStats, iniToJson, jsonArrayToNdjson, jsonToIni, jsonToToml, jsonToXml, minifyNdjson, minifyToml, minifyXml, ndjsonToJsonArray, parseCsv, parseEnv, parseFrontMatter, parseIni, parseSubtitleTimestamp, parseSubtitles, parseXmlToObject, resolveYamlAnchors, serializeSubtitles, shiftSubtitles, stringifyIni, toCsvString, tomlToJson, validateEnvKey, validateIni, validateNdjson, validateToml, validateXml, validateYaml, xmlToJson };
|
|
1778
|
+
export { analyzeCaptionSpeed, calculateMarkdownTaskListProgress, convertSubtitles, csvToJson, csvToSqlInsert, data_exports, detectDelimiter, detectSubtitleFormat, diffEnvExample, envToExport, envToJson, findCsvDuplicateRows, formatNdjson, formatSubtitleTimestamp, formatToml, formatXml, generateMarkdownToc, getSection, getSectionNames, getTomlStats, getXmlStats, getYamlStats, inferCsvColumnTypes, iniToJson, jsonArrayToNdjson, jsonToIni, jsonToToml, jsonToXml, minifyNdjson, minifyToml, minifyXml, ndjsonToJsonArray, parseCsv, parseEnv, parseFrontMatter, parseIni, parseSubtitleTimestamp, parseSubtitles, parseXmlToObject, resolveYamlAnchors, serializeSubtitles, shiftSubtitles, stringifyIni, toCsvString, tomlToJson, validateEnvKey, validateIni, validateNdjson, validateToml, validateXml, validateYaml, xmlToJson };
|
|
@@ -21,6 +21,7 @@ __export(units_exports, {
|
|
|
21
21
|
bumpVersion: () => bumpVersion,
|
|
22
22
|
calcAspectRatio: () => calcAspectRatio,
|
|
23
23
|
calcSubnet: () => calcSubnet,
|
|
24
|
+
calculateBlendedLoanRate: () => calculateBlendedLoanRate,
|
|
24
25
|
calculateBreakEven: () => calculateBreakEven,
|
|
25
26
|
calculateCashBreakdown: () => calculateCashBreakdown,
|
|
26
27
|
calculateCashRounding: () => calculateCashRounding,
|
|
@@ -28,6 +29,7 @@ __export(units_exports, {
|
|
|
28
29
|
calculateChange: () => calculateChange,
|
|
29
30
|
calculateCompoundInterest: () => calculateCompoundInterest,
|
|
30
31
|
calculateCreditUtilization: () => calculateCreditUtilization,
|
|
32
|
+
calculateDebtToIncomeRatio: () => calculateDebtToIncomeRatio,
|
|
31
33
|
calculateDepreciationSchedule: () => calculateDepreciationSchedule,
|
|
32
34
|
calculateDiscount: () => calculateDiscount,
|
|
33
35
|
calculateEmi: () => calculateEmi,
|
|
@@ -2233,5 +2235,81 @@ function calculateCreditUtilization(accounts) {
|
|
|
2233
2235
|
overallTier: _classifyUtilization(overallUtilizationPercent)
|
|
2234
2236
|
};
|
|
2235
2237
|
}
|
|
2238
|
+
function _classifyDti(percent) {
|
|
2239
|
+
if (percent < 36) return "healthy";
|
|
2240
|
+
if (percent < 43) return "moderate";
|
|
2241
|
+
if (percent < 50) return "high";
|
|
2242
|
+
return "severe";
|
|
2243
|
+
}
|
|
2244
|
+
function calculateDebtToIncomeRatio(debts, grossMonthlyIncome) {
|
|
2245
|
+
if (!Array.isArray(debts) || debts.length === 0) {
|
|
2246
|
+
return { error: "debts must be a non-empty array" };
|
|
2247
|
+
}
|
|
2248
|
+
if (typeof grossMonthlyIncome !== "number" || !Number.isFinite(grossMonthlyIncome) || grossMonthlyIncome <= 0) {
|
|
2249
|
+
return { error: "grossMonthlyIncome must be a finite number greater than zero" };
|
|
2250
|
+
}
|
|
2251
|
+
const round22 = (n) => Math.round(n * 100) / 100;
|
|
2252
|
+
let totalMonthlyDebt = 0;
|
|
2253
|
+
const results = [];
|
|
2254
|
+
for (let i = 0; i < debts.length; i++) {
|
|
2255
|
+
const debt = debts[i];
|
|
2256
|
+
if (typeof debt.amount !== "number" || !Number.isFinite(debt.amount) || debt.amount < 0) {
|
|
2257
|
+
return { error: `debt ${i + 1}: amount must be a finite, non-negative number` };
|
|
2258
|
+
}
|
|
2259
|
+
totalMonthlyDebt += debt.amount;
|
|
2260
|
+
results.push({
|
|
2261
|
+
label: debt.label?.trim() || `Debt ${i + 1}`,
|
|
2262
|
+
amount: debt.amount,
|
|
2263
|
+
percentOfIncome: round22(debt.amount / grossMonthlyIncome * 100)
|
|
2264
|
+
});
|
|
2265
|
+
}
|
|
2266
|
+
const dtiPercent = round22(totalMonthlyDebt / grossMonthlyIncome * 100);
|
|
2267
|
+
return {
|
|
2268
|
+
debts: results,
|
|
2269
|
+
totalMonthlyDebt: round22(totalMonthlyDebt),
|
|
2270
|
+
grossMonthlyIncome,
|
|
2271
|
+
dtiPercent,
|
|
2272
|
+
tier: _classifyDti(dtiPercent)
|
|
2273
|
+
};
|
|
2274
|
+
}
|
|
2275
|
+
function calculateBlendedLoanRate(loans) {
|
|
2276
|
+
if (!Array.isArray(loans) || loans.length === 0) {
|
|
2277
|
+
return { error: "loans must be a non-empty array" };
|
|
2278
|
+
}
|
|
2279
|
+
const round22 = (n) => Math.round(n * 100) / 100;
|
|
2280
|
+
const round4 = (n) => Math.round(n * 1e4) / 1e4;
|
|
2281
|
+
let totalBalance = 0;
|
|
2282
|
+
for (let i = 0; i < loans.length; i++) {
|
|
2283
|
+
const loan = loans[i];
|
|
2284
|
+
if (typeof loan.balance !== "number" || !Number.isFinite(loan.balance) || loan.balance <= 0) {
|
|
2285
|
+
return { error: `loan ${i + 1}: balance must be a finite number greater than zero` };
|
|
2286
|
+
}
|
|
2287
|
+
if (typeof loan.ratePercent !== "number" || !Number.isFinite(loan.ratePercent) || loan.ratePercent < 0) {
|
|
2288
|
+
return { error: `loan ${i + 1}: ratePercent must be a finite, non-negative number` };
|
|
2289
|
+
}
|
|
2290
|
+
totalBalance += loan.balance;
|
|
2291
|
+
}
|
|
2292
|
+
let totalMonthlyInterest = 0;
|
|
2293
|
+
let weightedRateSum = 0;
|
|
2294
|
+
const results = loans.map((loan, i) => {
|
|
2295
|
+
const monthlyInterest = round22(loan.balance * loan.ratePercent / 100 / 12);
|
|
2296
|
+
totalMonthlyInterest += monthlyInterest;
|
|
2297
|
+
weightedRateSum += loan.balance * loan.ratePercent;
|
|
2298
|
+
return {
|
|
2299
|
+
label: loan.label?.trim() || `Loan ${i + 1}`,
|
|
2300
|
+
balance: loan.balance,
|
|
2301
|
+
ratePercent: loan.ratePercent,
|
|
2302
|
+
monthlyInterest,
|
|
2303
|
+
shareOfTotalPercent: round22(loan.balance / totalBalance * 100)
|
|
2304
|
+
};
|
|
2305
|
+
});
|
|
2306
|
+
return {
|
|
2307
|
+
loans: results,
|
|
2308
|
+
totalBalance: round22(totalBalance),
|
|
2309
|
+
weightedAverageRatePercent: round4(weightedRateSum / totalBalance),
|
|
2310
|
+
totalMonthlyInterest: round22(totalMonthlyInterest),
|
|
2311
|
+
totalAnnualInterest: round22(totalMonthlyInterest * 12)
|
|
2312
|
+
};
|
|
2313
|
+
}
|
|
2236
2314
|
|
|
2237
|
-
export { BASE_LABELS, BASE_PREFIXES, BYTE_UNITS, COMMON_CURRENCIES, COMMON_LOCALES, COMMON_PERMISSIONS, COMMON_RATIOS, COMMON_SIZES, COMMON_TAX_RATES, COMMON_TIP_PERCENTAGES, COMMON_VIEWPORTS, GPA_GRADE_POINTS, USD_DENOMINATIONS, applySuccessiveDiscounts, autoFormat, bumpVersion, calcAspectRatio, calcSubnet, calculateBreakEven, calculateCashBreakdown, calculateCashRounding, calculateCdMaturity, calculateChange, calculateCompoundInterest, calculateCreditUtilization, calculateDepreciationSchedule, calculateDiscount, calculateEmi, calculateGpa, calculateLoan, calculateMarginMarkup, calculateMovingAverages, calculatePaybackPeriod, calculatePercentageChange, calculateRoi, calculateRuleOf72, calculateSavingsGoal, calculateSimpleInterest, calculateTax, calculateTimeValue, calculateTipSplit, calculateVideoBitrate, compareSemver, compareUnitPrices, convert, convertAprApy, convertBytes, convertIp, coverBox, decimalToIp, decimalToIpCidr, describePermissions, fitIntoBox, formatNumber, formatValue, formatVwValue, formatWithSeparator, gcd, ipFromBinary, ipFromDecimal, ipFromHex, ipToBinary, ipToDecimal, ipToDecimalCidr, ipToHex, ipToOctal, isValid, isValidCidr, isValidIp, isValidIpv4, marginToMarkup, markupToMargin, octalToPermissions, parseFileSize, parseInput, parseNumberString, parseSemver, permissionsToChmod, permissionsToOctal, permissionsToSymbolic, ptToPx, pxToAll, pxToViewport, remToPx, satisfiesRange, scaleByHeight, scaleByWidth, sortVersions, splitSubnet, symbolicToPermissions, units_exports, validateBarcode, validateCardNumber, validateIban, validateIsbn, viewportToPx };
|
|
2315
|
+
export { BASE_LABELS, BASE_PREFIXES, BYTE_UNITS, COMMON_CURRENCIES, COMMON_LOCALES, COMMON_PERMISSIONS, COMMON_RATIOS, COMMON_SIZES, COMMON_TAX_RATES, COMMON_TIP_PERCENTAGES, COMMON_VIEWPORTS, GPA_GRADE_POINTS, USD_DENOMINATIONS, applySuccessiveDiscounts, autoFormat, bumpVersion, calcAspectRatio, calcSubnet, calculateBlendedLoanRate, calculateBreakEven, calculateCashBreakdown, calculateCashRounding, calculateCdMaturity, calculateChange, calculateCompoundInterest, calculateCreditUtilization, calculateDebtToIncomeRatio, calculateDepreciationSchedule, calculateDiscount, calculateEmi, calculateGpa, calculateLoan, calculateMarginMarkup, calculateMovingAverages, calculatePaybackPeriod, calculatePercentageChange, calculateRoi, calculateRuleOf72, calculateSavingsGoal, calculateSimpleInterest, calculateTax, calculateTimeValue, calculateTipSplit, calculateVideoBitrate, compareSemver, compareUnitPrices, convert, convertAprApy, convertBytes, convertIp, coverBox, decimalToIp, decimalToIpCidr, describePermissions, fitIntoBox, formatNumber, formatValue, formatVwValue, formatWithSeparator, gcd, ipFromBinary, ipFromDecimal, ipFromHex, ipToBinary, ipToDecimal, ipToDecimalCidr, ipToHex, ipToOctal, isValid, isValidCidr, isValidIp, isValidIpv4, marginToMarkup, markupToMargin, octalToPermissions, parseFileSize, parseInput, parseNumberString, parseSemver, permissionsToChmod, permissionsToOctal, permissionsToSymbolic, ptToPx, pxToAll, pxToViewport, remToPx, satisfiesRange, scaleByHeight, scaleByWidth, sortVersions, splitSubnet, symbolicToPermissions, units_exports, validateBarcode, validateCardNumber, validateIban, validateIsbn, viewportToPx };
|
|
@@ -13,6 +13,7 @@ __export(network_exports, {
|
|
|
13
13
|
X_CONTENT_TYPE_OPTIONS_HEADER: () => X_CONTENT_TYPE_OPTIONS_HEADER,
|
|
14
14
|
analyzeEmailHeaders: () => analyzeEmailHeaders,
|
|
15
15
|
assessContentTypeRisk: () => assessContentTypeRisk,
|
|
16
|
+
buildAcceptLanguage: () => buildAcceptLanguage,
|
|
16
17
|
buildCacheControl: () => buildCacheControl,
|
|
17
18
|
buildClientHints: () => buildClientHints,
|
|
18
19
|
buildContentDisposition: () => buildContentDisposition,
|
|
@@ -40,6 +41,7 @@ __export(network_exports, {
|
|
|
40
41
|
isValidIp: () => isValidIp,
|
|
41
42
|
isValidIpv4: () => isValidIpv4,
|
|
42
43
|
isValidIpv6: () => isValidIpv6,
|
|
44
|
+
parseAcceptLanguage: () => parseAcceptLanguage,
|
|
43
45
|
parseClientHintHeaders: () => parseClientHintHeaders,
|
|
44
46
|
parseContentDisposition: () => parseContentDisposition,
|
|
45
47
|
parseContentRangeHeader: () => parseContentRangeHeader,
|
|
@@ -2832,5 +2834,57 @@ function assessContentTypeRisk(contentType) {
|
|
|
2832
2834
|
reason: "Not a well-known type in this tool's lookup table. Treat any response type as sniffable unless you've confirmed the serving browser trusts it, and set nosniff regardless of type as a baseline defense."
|
|
2833
2835
|
};
|
|
2834
2836
|
}
|
|
2837
|
+
function formatAcceptLanguageQuality(q) {
|
|
2838
|
+
let s = q.toFixed(3);
|
|
2839
|
+
s = s.replace(/0+$/, "");
|
|
2840
|
+
s = s.replace(/\.$/, "");
|
|
2841
|
+
return s;
|
|
2842
|
+
}
|
|
2843
|
+
function formatAcceptLanguageEntries(entries) {
|
|
2844
|
+
return entries.map((e) => e.quality === 1 ? e.locale : `${e.locale};q=${formatAcceptLanguageQuality(e.quality)}`).join(", ");
|
|
2845
|
+
}
|
|
2846
|
+
function sortAcceptLanguageEntries(entries) {
|
|
2847
|
+
return entries.map((e, i) => ({ e, i })).sort((a, b) => b.e.quality - a.e.quality || a.i - b.i).map((x) => x.e);
|
|
2848
|
+
}
|
|
2849
|
+
function buildAcceptLanguage(locales) {
|
|
2850
|
+
if (!Array.isArray(locales) || locales.length === 0) return { error: "At least one locale is required" };
|
|
2851
|
+
const entries = [];
|
|
2852
|
+
for (let i = 0; i < locales.length; i++) {
|
|
2853
|
+
const { locale, quality } = locales[i];
|
|
2854
|
+
if (typeof locale !== "string" || locale.trim() === "") return { error: `locale ${i + 1}: locale is required` };
|
|
2855
|
+
const q = quality === void 0 ? 1 : quality;
|
|
2856
|
+
if (typeof q !== "number" || !Number.isFinite(q) || q < 0 || q > 1) {
|
|
2857
|
+
return { error: `locale ${i + 1}: quality must be between 0 and 1` };
|
|
2858
|
+
}
|
|
2859
|
+
entries.push({ locale: locale.trim(), quality: Math.round(q * 1e3) / 1e3 });
|
|
2860
|
+
}
|
|
2861
|
+
const sorted = sortAcceptLanguageEntries(entries);
|
|
2862
|
+
const headerValue = formatAcceptLanguageEntries(sorted);
|
|
2863
|
+
return { header: `Accept-Language: ${headerValue}`, headerValue, entries: sorted };
|
|
2864
|
+
}
|
|
2865
|
+
function parseAcceptLanguage(raw) {
|
|
2866
|
+
if (!raw || raw.trim() === "") return { error: "Input is empty" };
|
|
2867
|
+
const withoutLabel = raw.trim().replace(/^accept-language:\s*/i, "");
|
|
2868
|
+
const parts = withoutLabel.split(",").map((p) => p.trim()).filter((p) => p.length > 0);
|
|
2869
|
+
if (parts.length === 0) return { error: "Input is empty" };
|
|
2870
|
+
const entries = [];
|
|
2871
|
+
for (const part of parts) {
|
|
2872
|
+
const [localeRaw, ...paramsRaw] = part.split(";").map((s) => s.trim());
|
|
2873
|
+
if (!localeRaw) return { error: `Invalid entry: "${part}"` };
|
|
2874
|
+
let quality = 1;
|
|
2875
|
+
for (const param of paramsRaw) {
|
|
2876
|
+
const m = /^q=([\d.]+)$/i.exec(param);
|
|
2877
|
+
if (!m) return { error: `Invalid parameter in "${part}"` };
|
|
2878
|
+
quality = Number(m[1]);
|
|
2879
|
+
if (!Number.isFinite(quality) || quality < 0 || quality > 1) {
|
|
2880
|
+
return { error: `q value must be between 0 and 1 in "${part}"` };
|
|
2881
|
+
}
|
|
2882
|
+
}
|
|
2883
|
+
entries.push({ locale: localeRaw, quality: Math.round(quality * 1e3) / 1e3 });
|
|
2884
|
+
}
|
|
2885
|
+
const sorted = sortAcceptLanguageEntries(entries);
|
|
2886
|
+
const headerValue = formatAcceptLanguageEntries(sorted);
|
|
2887
|
+
return { header: `Accept-Language: ${headerValue}`, headerValue, entries: sorted };
|
|
2888
|
+
}
|
|
2835
2889
|
|
|
2836
|
-
export { CLIENT_HINTS, DNS_RECORD_TYPES, HTTP_HEADERS, LINK_REL_VALUES, PERMISSIONS_POLICY_FEATURES, REFERRER_POLICY_VALUES, STATUS_CODES, X_CONTENT_TYPE_OPTIONS_HEADER, analyzeEmailHeaders, assessContentTypeRisk, buildCacheControl, buildClientHints, buildContentDisposition, buildDnsQueryUrl, buildGeoUrl, buildLinkHeader, buildMapUrl, buildPermissionsPolicy, buildRangeHeader, buildReferrerPolicy, buildVaryHeader, buildXContentTypeOptionsHeader, checkSetCookieHeader, countryCodeToFlag, formatCoordinates, formatTtl, getByCategory, getHeader, getHeadersByCategory, getStatusByCategory, getStatusCode, isClientError, isServerError, isSuccess, isValidIp, isValidIpv4, isValidIpv6, network_exports, parseClientHintHeaders, parseContentDisposition, parseContentRangeHeader, parseDnsResponse, parseGeoResponse, parseHar, parseIpv6Address, parsePermissionsPolicy, parseUserAgent, parseVaryHeader, parseXContentTypeOptionsHeader, searchHeaders, searchStatusCodes, splitSitemap, statusCodeToText, typeNumberToLabel, validateDomain, validateHeaderName, validateHeaderValue, validateManifest, validateRobotsTxt, validateSitemap };
|
|
2890
|
+
export { CLIENT_HINTS, DNS_RECORD_TYPES, HTTP_HEADERS, LINK_REL_VALUES, PERMISSIONS_POLICY_FEATURES, REFERRER_POLICY_VALUES, STATUS_CODES, X_CONTENT_TYPE_OPTIONS_HEADER, analyzeEmailHeaders, assessContentTypeRisk, buildAcceptLanguage, buildCacheControl, buildClientHints, buildContentDisposition, buildDnsQueryUrl, buildGeoUrl, buildLinkHeader, buildMapUrl, buildPermissionsPolicy, buildRangeHeader, buildReferrerPolicy, buildVaryHeader, buildXContentTypeOptionsHeader, checkSetCookieHeader, countryCodeToFlag, formatCoordinates, formatTtl, getByCategory, getHeader, getHeadersByCategory, getStatusByCategory, getStatusCode, isClientError, isServerError, isSuccess, isValidIp, isValidIpv4, isValidIpv6, network_exports, parseAcceptLanguage, parseClientHintHeaders, parseContentDisposition, parseContentRangeHeader, parseDnsResponse, parseGeoResponse, parseHar, parseIpv6Address, parsePermissionsPolicy, parseUserAgent, parseVaryHeader, parseXContentTypeOptionsHeader, searchHeaders, searchStatusCodes, splitSitemap, statusCodeToText, typeNumberToLabel, validateDomain, validateHeaderName, validateHeaderValue, validateManifest, validateRobotsTxt, validateSitemap };
|
|
@@ -405,6 +405,34 @@ interface CsvDuplicateResult {
|
|
|
405
405
|
declare function findCsvDuplicateRows(input: string, options?: CsvDuplicateOptions): CsvDuplicateResult | {
|
|
406
406
|
error: string;
|
|
407
407
|
};
|
|
408
|
+
type CsvColumnType = 'integer' | 'float' | 'boolean' | 'date' | 'string';
|
|
409
|
+
interface CsvColumnTypeOptions {
|
|
410
|
+
delimiter?: string;
|
|
411
|
+
hasHeader?: boolean;
|
|
412
|
+
}
|
|
413
|
+
interface CsvColumnTypeInfo {
|
|
414
|
+
name: string;
|
|
415
|
+
inferredType: CsvColumnType;
|
|
416
|
+
nullable: boolean;
|
|
417
|
+
nullCount: number;
|
|
418
|
+
totalCount: number;
|
|
419
|
+
sampleValues: string[];
|
|
420
|
+
}
|
|
421
|
+
interface CsvColumnTypeResult {
|
|
422
|
+
columns: CsvColumnTypeInfo[];
|
|
423
|
+
rowCount: number;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Parse CSV/TSV data and infer each column's data type (integer, float,
|
|
427
|
+
* boolean, ISO 8601 date, or string) by classifying every non-empty value
|
|
428
|
+
* and finding the tightest type that fits them all: all-integer values
|
|
429
|
+
* infer as integer, a mix of integers and decimals infers as float, and
|
|
430
|
+
* any value that doesn't fit a narrower type falls back to string. Empty
|
|
431
|
+
* cells don't affect the inferred type but do mark the column nullable.
|
|
432
|
+
*/
|
|
433
|
+
declare function inferCsvColumnTypes(input: string, options?: CsvColumnTypeOptions): CsvColumnTypeResult | {
|
|
434
|
+
error: string;
|
|
435
|
+
};
|
|
408
436
|
interface YamlAnchorInfo {
|
|
409
437
|
name: string;
|
|
410
438
|
line: number;
|
|
@@ -462,6 +490,10 @@ declare function calculateMarkdownTaskListProgress(markdown: string): MarkdownTa
|
|
|
462
490
|
type data_CaptionSpeedCue = CaptionSpeedCue;
|
|
463
491
|
type data_CaptionSpeedResult = CaptionSpeedResult;
|
|
464
492
|
type data_ConvertedSubtitles = ConvertedSubtitles;
|
|
493
|
+
type data_CsvColumnType = CsvColumnType;
|
|
494
|
+
type data_CsvColumnTypeInfo = CsvColumnTypeInfo;
|
|
495
|
+
type data_CsvColumnTypeOptions = CsvColumnTypeOptions;
|
|
496
|
+
type data_CsvColumnTypeResult = CsvColumnTypeResult;
|
|
465
497
|
type data_CsvDuplicateGroup = CsvDuplicateGroup;
|
|
466
498
|
type data_CsvDuplicateOptions = CsvDuplicateOptions;
|
|
467
499
|
type data_CsvDuplicateResult = CsvDuplicateResult;
|
|
@@ -516,6 +548,7 @@ declare const data_getSectionNames: typeof getSectionNames;
|
|
|
516
548
|
declare const data_getTomlStats: typeof getTomlStats;
|
|
517
549
|
declare const data_getXmlStats: typeof getXmlStats;
|
|
518
550
|
declare const data_getYamlStats: typeof getYamlStats;
|
|
551
|
+
declare const data_inferCsvColumnTypes: typeof inferCsvColumnTypes;
|
|
519
552
|
declare const data_iniToJson: typeof iniToJson;
|
|
520
553
|
declare const data_jsonArrayToNdjson: typeof jsonArrayToNdjson;
|
|
521
554
|
declare const data_jsonToIni: typeof jsonToIni;
|
|
@@ -546,7 +579,7 @@ declare const data_validateXml: typeof validateXml;
|
|
|
546
579
|
declare const data_validateYaml: typeof validateYaml;
|
|
547
580
|
declare const data_xmlToJson: typeof xmlToJson;
|
|
548
581
|
declare namespace data {
|
|
549
|
-
export { type data_CaptionSpeedCue as CaptionSpeedCue, type data_CaptionSpeedResult as CaptionSpeedResult, type data_ConvertedSubtitles as ConvertedSubtitles, type data_CsvDuplicateGroup as CsvDuplicateGroup, type data_CsvDuplicateOptions as CsvDuplicateOptions, type data_CsvDuplicateResult as CsvDuplicateResult, type data_CsvParseResult as CsvParseResult, type data_CsvToSqlOptions as CsvToSqlOptions, type data_CsvToSqlResult as CsvToSqlResult, type data_EnvDiffError as EnvDiffError, type data_EnvDiffResult as EnvDiffResult, type data_EnvEntry as EnvEntry, type data_EnvParseResult as EnvParseResult, type data_FrontMatterError as FrontMatterError, type data_FrontMatterResult as FrontMatterResult, type data_IniSection as IniSection, type data_MarkdownTaskListItem as MarkdownTaskListItem, type data_MarkdownTaskListProgressResult as MarkdownTaskListProgressResult, type data_MarkdownTaskListSectionSummary as MarkdownTaskListSectionSummary, type data_MarkdownTocEntry as MarkdownTocEntry, type data_MarkdownTocOptions as MarkdownTocOptions, type data_MarkdownTocResult as MarkdownTocResult, type data_NdjsonLineResult as NdjsonLineResult, type data_NdjsonValidateResult as NdjsonValidateResult, type data_ParseOptions as ParseOptions, type data_ParsedIni as ParsedIni, type data_ParsedSubtitles as ParsedSubtitles, type data_SubtitleCue as SubtitleCue, type data_SubtitleFormat as SubtitleFormat, type data_TomlFormatResult as TomlFormatResult, type data_ValidationResult as ValidationResult, type data_XmlFormatResult as XmlFormatResult, type data_XmlToJsonOptions as XmlToJsonOptions, type data_YamlAnchorInfo as YamlAnchorInfo, type data_YamlAnchorResolveError as YamlAnchorResolveError, type data_YamlAnchorResolveResult as YamlAnchorResolveResult, data_analyzeCaptionSpeed as analyzeCaptionSpeed, data_calculateMarkdownTaskListProgress as calculateMarkdownTaskListProgress, data_convertSubtitles as convertSubtitles, data_csvToJson as csvToJson, data_csvToSqlInsert as csvToSqlInsert, data_detectDelimiter as detectDelimiter, data_detectSubtitleFormat as detectSubtitleFormat, data_diffEnvExample as diffEnvExample, data_envToExport as envToExport, data_envToJson as envToJson, data_findCsvDuplicateRows as findCsvDuplicateRows, data_formatNdjson as formatNdjson, data_formatSubtitleTimestamp as formatSubtitleTimestamp, data_formatToml as formatToml, data_formatXml as formatXml, data_generateMarkdownToc as generateMarkdownToc, data_getSection as getSection, data_getSectionNames as getSectionNames, data_getTomlStats as getTomlStats, data_getXmlStats as getXmlStats, data_getYamlStats as getYamlStats, data_iniToJson as iniToJson, data_jsonArrayToNdjson as jsonArrayToNdjson, data_jsonToIni as jsonToIni, data_jsonToToml as jsonToToml, data_jsonToXml as jsonToXml, data_minifyNdjson as minifyNdjson, data_minifyToml as minifyToml, data_minifyXml as minifyXml, data_ndjsonToJsonArray as ndjsonToJsonArray, data_parseCsv as parseCsv, data_parseEnv as parseEnv, data_parseFrontMatter as parseFrontMatter, data_parseIni as parseIni, data_parseSubtitleTimestamp as parseSubtitleTimestamp, data_parseSubtitles as parseSubtitles, data_parseXmlToObject as parseXmlToObject, data_resolveYamlAnchors as resolveYamlAnchors, data_serializeSubtitles as serializeSubtitles, data_shiftSubtitles as shiftSubtitles, data_stringifyIni as stringifyIni, data_toCsvString as toCsvString, data_tomlToJson as tomlToJson, data_validateEnvKey as validateEnvKey, data_validateIni as validateIni, data_validateNdjson as validateNdjson, data_validateToml as validateToml, data_validateXml as validateXml, data_validateYaml as validateYaml, data_xmlToJson as xmlToJson };
|
|
582
|
+
export { type data_CaptionSpeedCue as CaptionSpeedCue, type data_CaptionSpeedResult as CaptionSpeedResult, type data_ConvertedSubtitles as ConvertedSubtitles, type data_CsvColumnType as CsvColumnType, type data_CsvColumnTypeInfo as CsvColumnTypeInfo, type data_CsvColumnTypeOptions as CsvColumnTypeOptions, type data_CsvColumnTypeResult as CsvColumnTypeResult, type data_CsvDuplicateGroup as CsvDuplicateGroup, type data_CsvDuplicateOptions as CsvDuplicateOptions, type data_CsvDuplicateResult as CsvDuplicateResult, type data_CsvParseResult as CsvParseResult, type data_CsvToSqlOptions as CsvToSqlOptions, type data_CsvToSqlResult as CsvToSqlResult, type data_EnvDiffError as EnvDiffError, type data_EnvDiffResult as EnvDiffResult, type data_EnvEntry as EnvEntry, type data_EnvParseResult as EnvParseResult, type data_FrontMatterError as FrontMatterError, type data_FrontMatterResult as FrontMatterResult, type data_IniSection as IniSection, type data_MarkdownTaskListItem as MarkdownTaskListItem, type data_MarkdownTaskListProgressResult as MarkdownTaskListProgressResult, type data_MarkdownTaskListSectionSummary as MarkdownTaskListSectionSummary, type data_MarkdownTocEntry as MarkdownTocEntry, type data_MarkdownTocOptions as MarkdownTocOptions, type data_MarkdownTocResult as MarkdownTocResult, type data_NdjsonLineResult as NdjsonLineResult, type data_NdjsonValidateResult as NdjsonValidateResult, type data_ParseOptions as ParseOptions, type data_ParsedIni as ParsedIni, type data_ParsedSubtitles as ParsedSubtitles, type data_SubtitleCue as SubtitleCue, type data_SubtitleFormat as SubtitleFormat, type data_TomlFormatResult as TomlFormatResult, type data_ValidationResult as ValidationResult, type data_XmlFormatResult as XmlFormatResult, type data_XmlToJsonOptions as XmlToJsonOptions, type data_YamlAnchorInfo as YamlAnchorInfo, type data_YamlAnchorResolveError as YamlAnchorResolveError, type data_YamlAnchorResolveResult as YamlAnchorResolveResult, data_analyzeCaptionSpeed as analyzeCaptionSpeed, data_calculateMarkdownTaskListProgress as calculateMarkdownTaskListProgress, data_convertSubtitles as convertSubtitles, data_csvToJson as csvToJson, data_csvToSqlInsert as csvToSqlInsert, data_detectDelimiter as detectDelimiter, data_detectSubtitleFormat as detectSubtitleFormat, data_diffEnvExample as diffEnvExample, data_envToExport as envToExport, data_envToJson as envToJson, data_findCsvDuplicateRows as findCsvDuplicateRows, data_formatNdjson as formatNdjson, data_formatSubtitleTimestamp as formatSubtitleTimestamp, data_formatToml as formatToml, data_formatXml as formatXml, data_generateMarkdownToc as generateMarkdownToc, data_getSection as getSection, data_getSectionNames as getSectionNames, data_getTomlStats as getTomlStats, data_getXmlStats as getXmlStats, data_getYamlStats as getYamlStats, data_inferCsvColumnTypes as inferCsvColumnTypes, data_iniToJson as iniToJson, data_jsonArrayToNdjson as jsonArrayToNdjson, data_jsonToIni as jsonToIni, data_jsonToToml as jsonToToml, data_jsonToXml as jsonToXml, data_minifyNdjson as minifyNdjson, data_minifyToml as minifyToml, data_minifyXml as minifyXml, data_ndjsonToJsonArray as ndjsonToJsonArray, data_parseCsv as parseCsv, data_parseEnv as parseEnv, data_parseFrontMatter as parseFrontMatter, data_parseIni as parseIni, data_parseSubtitleTimestamp as parseSubtitleTimestamp, data_parseSubtitles as parseSubtitles, data_parseXmlToObject as parseXmlToObject, data_resolveYamlAnchors as resolveYamlAnchors, data_serializeSubtitles as serializeSubtitles, data_shiftSubtitles as shiftSubtitles, data_stringifyIni as stringifyIni, data_toCsvString as toCsvString, data_tomlToJson as tomlToJson, data_validateEnvKey as validateEnvKey, data_validateIni as validateIni, data_validateNdjson as validateNdjson, data_validateToml as validateToml, data_validateXml as validateXml, data_validateYaml as validateYaml, data_xmlToJson as xmlToJson };
|
|
550
583
|
}
|
|
551
584
|
|
|
552
|
-
export {
|
|
585
|
+
export { formatSubtitleTimestamp as $, type XmlToJsonOptions as A, type YamlAnchorResolveError as B, type CaptionSpeedCue as C, type YamlAnchorResolveResult as D, type EnvDiffError as E, type FrontMatterError as F, analyzeCaptionSpeed as G, calculateMarkdownTaskListProgress as H, type IniSection as I, convertSubtitles as J, csvToJson as K, csvToSqlInsert as L, type MarkdownTaskListItem as M, type NdjsonLineResult as N, detectDelimiter as O, type ParseOptions as P, detectSubtitleFormat as Q, diffEnvExample as R, type SubtitleCue as S, type TomlFormatResult as T, envToExport as U, type ValidationResult as V, envToJson as W, type XmlFormatResult as X, type YamlAnchorInfo as Y, findCsvDuplicateRows as Z, formatNdjson as _, type CaptionSpeedResult as a, formatToml as a0, formatXml as a1, generateMarkdownToc as a2, getSection as a3, getSectionNames as a4, getTomlStats as a5, getXmlStats as a6, getYamlStats as a7, inferCsvColumnTypes as a8, iniToJson as a9, validateYaml as aA, xmlToJson as aB, jsonArrayToNdjson as aa, jsonToIni as ab, jsonToToml as ac, jsonToXml as ad, minifyNdjson as ae, minifyToml as af, minifyXml as ag, ndjsonToJsonArray as ah, parseCsv as ai, parseEnv as aj, parseFrontMatter as ak, parseIni as al, parseSubtitleTimestamp as am, parseSubtitles as an, parseXmlToObject as ao, resolveYamlAnchors as ap, serializeSubtitles as aq, shiftSubtitles as ar, stringifyIni as as, toCsvString as at, tomlToJson as au, validateEnvKey as av, validateIni as aw, validateNdjson as ax, validateToml as ay, validateXml as az, type ConvertedSubtitles as b, type CsvColumnType as c, data as d, type CsvColumnTypeInfo as e, type CsvColumnTypeOptions as f, type CsvColumnTypeResult as g, type CsvDuplicateGroup as h, type CsvDuplicateOptions as i, type CsvDuplicateResult as j, type CsvParseResult as k, type CsvToSqlOptions as l, type CsvToSqlResult as m, type EnvDiffResult as n, type EnvEntry as o, type EnvParseResult as p, type FrontMatterResult as q, type MarkdownTaskListProgressResult as r, type MarkdownTaskListSectionSummary as s, type MarkdownTocEntry as t, type MarkdownTocOptions as u, type MarkdownTocResult as v, type NdjsonValidateResult as w, type ParsedIni as x, type ParsedSubtitles as y, type SubtitleFormat as z };
|
|
@@ -405,6 +405,34 @@ interface CsvDuplicateResult {
|
|
|
405
405
|
declare function findCsvDuplicateRows(input: string, options?: CsvDuplicateOptions): CsvDuplicateResult | {
|
|
406
406
|
error: string;
|
|
407
407
|
};
|
|
408
|
+
type CsvColumnType = 'integer' | 'float' | 'boolean' | 'date' | 'string';
|
|
409
|
+
interface CsvColumnTypeOptions {
|
|
410
|
+
delimiter?: string;
|
|
411
|
+
hasHeader?: boolean;
|
|
412
|
+
}
|
|
413
|
+
interface CsvColumnTypeInfo {
|
|
414
|
+
name: string;
|
|
415
|
+
inferredType: CsvColumnType;
|
|
416
|
+
nullable: boolean;
|
|
417
|
+
nullCount: number;
|
|
418
|
+
totalCount: number;
|
|
419
|
+
sampleValues: string[];
|
|
420
|
+
}
|
|
421
|
+
interface CsvColumnTypeResult {
|
|
422
|
+
columns: CsvColumnTypeInfo[];
|
|
423
|
+
rowCount: number;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Parse CSV/TSV data and infer each column's data type (integer, float,
|
|
427
|
+
* boolean, ISO 8601 date, or string) by classifying every non-empty value
|
|
428
|
+
* and finding the tightest type that fits them all: all-integer values
|
|
429
|
+
* infer as integer, a mix of integers and decimals infers as float, and
|
|
430
|
+
* any value that doesn't fit a narrower type falls back to string. Empty
|
|
431
|
+
* cells don't affect the inferred type but do mark the column nullable.
|
|
432
|
+
*/
|
|
433
|
+
declare function inferCsvColumnTypes(input: string, options?: CsvColumnTypeOptions): CsvColumnTypeResult | {
|
|
434
|
+
error: string;
|
|
435
|
+
};
|
|
408
436
|
interface YamlAnchorInfo {
|
|
409
437
|
name: string;
|
|
410
438
|
line: number;
|
|
@@ -462,6 +490,10 @@ declare function calculateMarkdownTaskListProgress(markdown: string): MarkdownTa
|
|
|
462
490
|
type data_CaptionSpeedCue = CaptionSpeedCue;
|
|
463
491
|
type data_CaptionSpeedResult = CaptionSpeedResult;
|
|
464
492
|
type data_ConvertedSubtitles = ConvertedSubtitles;
|
|
493
|
+
type data_CsvColumnType = CsvColumnType;
|
|
494
|
+
type data_CsvColumnTypeInfo = CsvColumnTypeInfo;
|
|
495
|
+
type data_CsvColumnTypeOptions = CsvColumnTypeOptions;
|
|
496
|
+
type data_CsvColumnTypeResult = CsvColumnTypeResult;
|
|
465
497
|
type data_CsvDuplicateGroup = CsvDuplicateGroup;
|
|
466
498
|
type data_CsvDuplicateOptions = CsvDuplicateOptions;
|
|
467
499
|
type data_CsvDuplicateResult = CsvDuplicateResult;
|
|
@@ -516,6 +548,7 @@ declare const data_getSectionNames: typeof getSectionNames;
|
|
|
516
548
|
declare const data_getTomlStats: typeof getTomlStats;
|
|
517
549
|
declare const data_getXmlStats: typeof getXmlStats;
|
|
518
550
|
declare const data_getYamlStats: typeof getYamlStats;
|
|
551
|
+
declare const data_inferCsvColumnTypes: typeof inferCsvColumnTypes;
|
|
519
552
|
declare const data_iniToJson: typeof iniToJson;
|
|
520
553
|
declare const data_jsonArrayToNdjson: typeof jsonArrayToNdjson;
|
|
521
554
|
declare const data_jsonToIni: typeof jsonToIni;
|
|
@@ -546,7 +579,7 @@ declare const data_validateXml: typeof validateXml;
|
|
|
546
579
|
declare const data_validateYaml: typeof validateYaml;
|
|
547
580
|
declare const data_xmlToJson: typeof xmlToJson;
|
|
548
581
|
declare namespace data {
|
|
549
|
-
export { type data_CaptionSpeedCue as CaptionSpeedCue, type data_CaptionSpeedResult as CaptionSpeedResult, type data_ConvertedSubtitles as ConvertedSubtitles, type data_CsvDuplicateGroup as CsvDuplicateGroup, type data_CsvDuplicateOptions as CsvDuplicateOptions, type data_CsvDuplicateResult as CsvDuplicateResult, type data_CsvParseResult as CsvParseResult, type data_CsvToSqlOptions as CsvToSqlOptions, type data_CsvToSqlResult as CsvToSqlResult, type data_EnvDiffError as EnvDiffError, type data_EnvDiffResult as EnvDiffResult, type data_EnvEntry as EnvEntry, type data_EnvParseResult as EnvParseResult, type data_FrontMatterError as FrontMatterError, type data_FrontMatterResult as FrontMatterResult, type data_IniSection as IniSection, type data_MarkdownTaskListItem as MarkdownTaskListItem, type data_MarkdownTaskListProgressResult as MarkdownTaskListProgressResult, type data_MarkdownTaskListSectionSummary as MarkdownTaskListSectionSummary, type data_MarkdownTocEntry as MarkdownTocEntry, type data_MarkdownTocOptions as MarkdownTocOptions, type data_MarkdownTocResult as MarkdownTocResult, type data_NdjsonLineResult as NdjsonLineResult, type data_NdjsonValidateResult as NdjsonValidateResult, type data_ParseOptions as ParseOptions, type data_ParsedIni as ParsedIni, type data_ParsedSubtitles as ParsedSubtitles, type data_SubtitleCue as SubtitleCue, type data_SubtitleFormat as SubtitleFormat, type data_TomlFormatResult as TomlFormatResult, type data_ValidationResult as ValidationResult, type data_XmlFormatResult as XmlFormatResult, type data_XmlToJsonOptions as XmlToJsonOptions, type data_YamlAnchorInfo as YamlAnchorInfo, type data_YamlAnchorResolveError as YamlAnchorResolveError, type data_YamlAnchorResolveResult as YamlAnchorResolveResult, data_analyzeCaptionSpeed as analyzeCaptionSpeed, data_calculateMarkdownTaskListProgress as calculateMarkdownTaskListProgress, data_convertSubtitles as convertSubtitles, data_csvToJson as csvToJson, data_csvToSqlInsert as csvToSqlInsert, data_detectDelimiter as detectDelimiter, data_detectSubtitleFormat as detectSubtitleFormat, data_diffEnvExample as diffEnvExample, data_envToExport as envToExport, data_envToJson as envToJson, data_findCsvDuplicateRows as findCsvDuplicateRows, data_formatNdjson as formatNdjson, data_formatSubtitleTimestamp as formatSubtitleTimestamp, data_formatToml as formatToml, data_formatXml as formatXml, data_generateMarkdownToc as generateMarkdownToc, data_getSection as getSection, data_getSectionNames as getSectionNames, data_getTomlStats as getTomlStats, data_getXmlStats as getXmlStats, data_getYamlStats as getYamlStats, data_iniToJson as iniToJson, data_jsonArrayToNdjson as jsonArrayToNdjson, data_jsonToIni as jsonToIni, data_jsonToToml as jsonToToml, data_jsonToXml as jsonToXml, data_minifyNdjson as minifyNdjson, data_minifyToml as minifyToml, data_minifyXml as minifyXml, data_ndjsonToJsonArray as ndjsonToJsonArray, data_parseCsv as parseCsv, data_parseEnv as parseEnv, data_parseFrontMatter as parseFrontMatter, data_parseIni as parseIni, data_parseSubtitleTimestamp as parseSubtitleTimestamp, data_parseSubtitles as parseSubtitles, data_parseXmlToObject as parseXmlToObject, data_resolveYamlAnchors as resolveYamlAnchors, data_serializeSubtitles as serializeSubtitles, data_shiftSubtitles as shiftSubtitles, data_stringifyIni as stringifyIni, data_toCsvString as toCsvString, data_tomlToJson as tomlToJson, data_validateEnvKey as validateEnvKey, data_validateIni as validateIni, data_validateNdjson as validateNdjson, data_validateToml as validateToml, data_validateXml as validateXml, data_validateYaml as validateYaml, data_xmlToJson as xmlToJson };
|
|
582
|
+
export { type data_CaptionSpeedCue as CaptionSpeedCue, type data_CaptionSpeedResult as CaptionSpeedResult, type data_ConvertedSubtitles as ConvertedSubtitles, type data_CsvColumnType as CsvColumnType, type data_CsvColumnTypeInfo as CsvColumnTypeInfo, type data_CsvColumnTypeOptions as CsvColumnTypeOptions, type data_CsvColumnTypeResult as CsvColumnTypeResult, type data_CsvDuplicateGroup as CsvDuplicateGroup, type data_CsvDuplicateOptions as CsvDuplicateOptions, type data_CsvDuplicateResult as CsvDuplicateResult, type data_CsvParseResult as CsvParseResult, type data_CsvToSqlOptions as CsvToSqlOptions, type data_CsvToSqlResult as CsvToSqlResult, type data_EnvDiffError as EnvDiffError, type data_EnvDiffResult as EnvDiffResult, type data_EnvEntry as EnvEntry, type data_EnvParseResult as EnvParseResult, type data_FrontMatterError as FrontMatterError, type data_FrontMatterResult as FrontMatterResult, type data_IniSection as IniSection, type data_MarkdownTaskListItem as MarkdownTaskListItem, type data_MarkdownTaskListProgressResult as MarkdownTaskListProgressResult, type data_MarkdownTaskListSectionSummary as MarkdownTaskListSectionSummary, type data_MarkdownTocEntry as MarkdownTocEntry, type data_MarkdownTocOptions as MarkdownTocOptions, type data_MarkdownTocResult as MarkdownTocResult, type data_NdjsonLineResult as NdjsonLineResult, type data_NdjsonValidateResult as NdjsonValidateResult, type data_ParseOptions as ParseOptions, type data_ParsedIni as ParsedIni, type data_ParsedSubtitles as ParsedSubtitles, type data_SubtitleCue as SubtitleCue, type data_SubtitleFormat as SubtitleFormat, type data_TomlFormatResult as TomlFormatResult, type data_ValidationResult as ValidationResult, type data_XmlFormatResult as XmlFormatResult, type data_XmlToJsonOptions as XmlToJsonOptions, type data_YamlAnchorInfo as YamlAnchorInfo, type data_YamlAnchorResolveError as YamlAnchorResolveError, type data_YamlAnchorResolveResult as YamlAnchorResolveResult, data_analyzeCaptionSpeed as analyzeCaptionSpeed, data_calculateMarkdownTaskListProgress as calculateMarkdownTaskListProgress, data_convertSubtitles as convertSubtitles, data_csvToJson as csvToJson, data_csvToSqlInsert as csvToSqlInsert, data_detectDelimiter as detectDelimiter, data_detectSubtitleFormat as detectSubtitleFormat, data_diffEnvExample as diffEnvExample, data_envToExport as envToExport, data_envToJson as envToJson, data_findCsvDuplicateRows as findCsvDuplicateRows, data_formatNdjson as formatNdjson, data_formatSubtitleTimestamp as formatSubtitleTimestamp, data_formatToml as formatToml, data_formatXml as formatXml, data_generateMarkdownToc as generateMarkdownToc, data_getSection as getSection, data_getSectionNames as getSectionNames, data_getTomlStats as getTomlStats, data_getXmlStats as getXmlStats, data_getYamlStats as getYamlStats, data_inferCsvColumnTypes as inferCsvColumnTypes, data_iniToJson as iniToJson, data_jsonArrayToNdjson as jsonArrayToNdjson, data_jsonToIni as jsonToIni, data_jsonToToml as jsonToToml, data_jsonToXml as jsonToXml, data_minifyNdjson as minifyNdjson, data_minifyToml as minifyToml, data_minifyXml as minifyXml, data_ndjsonToJsonArray as ndjsonToJsonArray, data_parseCsv as parseCsv, data_parseEnv as parseEnv, data_parseFrontMatter as parseFrontMatter, data_parseIni as parseIni, data_parseSubtitleTimestamp as parseSubtitleTimestamp, data_parseSubtitles as parseSubtitles, data_parseXmlToObject as parseXmlToObject, data_resolveYamlAnchors as resolveYamlAnchors, data_serializeSubtitles as serializeSubtitles, data_shiftSubtitles as shiftSubtitles, data_stringifyIni as stringifyIni, data_toCsvString as toCsvString, data_tomlToJson as tomlToJson, data_validateEnvKey as validateEnvKey, data_validateIni as validateIni, data_validateNdjson as validateNdjson, data_validateToml as validateToml, data_validateXml as validateXml, data_validateYaml as validateYaml, data_xmlToJson as xmlToJson };
|
|
550
583
|
}
|
|
551
584
|
|
|
552
|
-
export {
|
|
585
|
+
export { formatSubtitleTimestamp as $, type XmlToJsonOptions as A, type YamlAnchorResolveError as B, type CaptionSpeedCue as C, type YamlAnchorResolveResult as D, type EnvDiffError as E, type FrontMatterError as F, analyzeCaptionSpeed as G, calculateMarkdownTaskListProgress as H, type IniSection as I, convertSubtitles as J, csvToJson as K, csvToSqlInsert as L, type MarkdownTaskListItem as M, type NdjsonLineResult as N, detectDelimiter as O, type ParseOptions as P, detectSubtitleFormat as Q, diffEnvExample as R, type SubtitleCue as S, type TomlFormatResult as T, envToExport as U, type ValidationResult as V, envToJson as W, type XmlFormatResult as X, type YamlAnchorInfo as Y, findCsvDuplicateRows as Z, formatNdjson as _, type CaptionSpeedResult as a, formatToml as a0, formatXml as a1, generateMarkdownToc as a2, getSection as a3, getSectionNames as a4, getTomlStats as a5, getXmlStats as a6, getYamlStats as a7, inferCsvColumnTypes as a8, iniToJson as a9, validateYaml as aA, xmlToJson as aB, jsonArrayToNdjson as aa, jsonToIni as ab, jsonToToml as ac, jsonToXml as ad, minifyNdjson as ae, minifyToml as af, minifyXml as ag, ndjsonToJsonArray as ah, parseCsv as ai, parseEnv as aj, parseFrontMatter as ak, parseIni as al, parseSubtitleTimestamp as am, parseSubtitles as an, parseXmlToObject as ao, resolveYamlAnchors as ap, serializeSubtitles as aq, shiftSubtitles as ar, stringifyIni as as, toCsvString as at, tomlToJson as au, validateEnvKey as av, validateIni as aw, validateNdjson as ax, validateToml as ay, validateXml as az, type ConvertedSubtitles as b, type CsvColumnType as c, data as d, type CsvColumnTypeInfo as e, type CsvColumnTypeOptions as f, type CsvColumnTypeResult as g, type CsvDuplicateGroup as h, type CsvDuplicateOptions as i, type CsvDuplicateResult as j, type CsvParseResult as k, type CsvToSqlOptions as l, type CsvToSqlResult as m, type EnvDiffResult as n, type EnvEntry as o, type EnvParseResult as p, type FrontMatterResult as q, type MarkdownTaskListProgressResult as r, type MarkdownTaskListSectionSummary as s, type MarkdownTocEntry as t, type MarkdownTocOptions as u, type MarkdownTocResult as v, type NdjsonValidateResult as w, type ParsedIni as x, type ParsedSubtitles as y, type SubtitleFormat as z };
|