@utilix-tech/sdk 0.32.0 → 0.33.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/dist/index.cjs CHANGED
@@ -7493,6 +7493,7 @@ __export(units_exports, {
7493
7493
  calculateMarginMarkup: () => calculateMarginMarkup,
7494
7494
  calculatePercentageChange: () => calculatePercentageChange,
7495
7495
  calculateRuleOf72: () => calculateRuleOf72,
7496
+ calculateSavingsGoal: () => calculateSavingsGoal,
7496
7497
  calculateSimpleInterest: () => calculateSimpleInterest,
7497
7498
  calculateTax: () => calculateTax,
7498
7499
  calculateTimeValue: () => calculateTimeValue,
@@ -9198,6 +9199,82 @@ function calculateEmi(principal, annualRatePercent, tenure, tenureUnit = "years"
9198
9199
  yearlyBreakdown
9199
9200
  };
9200
9201
  }
9202
+ function calculateSavingsGoal(input) {
9203
+ const { mode, goalAmount, currentSavings, annualInterestRatePercent, monthlyContribution, months } = input;
9204
+ if (mode !== "time-to-goal" && mode !== "contribution-for-target") {
9205
+ return { error: "mode must be 'time-to-goal' or 'contribution-for-target'" };
9206
+ }
9207
+ if (!Number.isFinite(goalAmount) || goalAmount <= 0) return { error: "goalAmount must be a finite number greater than zero" };
9208
+ if (!Number.isFinite(currentSavings) || currentSavings < 0) return { error: "currentSavings must be a finite, non-negative number" };
9209
+ if (!Number.isFinite(annualInterestRatePercent) || annualInterestRatePercent < 0) {
9210
+ return { error: "annualInterestRatePercent must be a finite, non-negative number" };
9211
+ }
9212
+ const round4 = (n) => Math.round(n * 1e4) / 1e4;
9213
+ const r = annualInterestRatePercent / 100 / 12;
9214
+ if (mode === "time-to-goal") {
9215
+ if (typeof monthlyContribution !== "number" || !Number.isFinite(monthlyContribution) || monthlyContribution < 0) {
9216
+ return { error: "monthlyContribution must be a finite, non-negative number" };
9217
+ }
9218
+ let exactMonths;
9219
+ if (currentSavings >= goalAmount) {
9220
+ exactMonths = 0;
9221
+ } else if (monthlyContribution === 0) {
9222
+ if (r === 0) return { error: "monthlyContribution must be greater than zero when annualInterestRatePercent is zero, since savings would never grow toward the goal" };
9223
+ if (currentSavings <= 0) return { error: "monthlyContribution must be greater than zero when currentSavings is zero, since there is nothing to compound" };
9224
+ exactMonths = Math.log(goalAmount / currentSavings) / Math.log(1 + r);
9225
+ } else if (r === 0) {
9226
+ exactMonths = (goalAmount - currentSavings) / monthlyContribution;
9227
+ } else {
9228
+ const denom = currentSavings + monthlyContribution / r;
9229
+ const x = (goalAmount + monthlyContribution / r) / denom;
9230
+ exactMonths = Math.log(x) / Math.log(1 + r);
9231
+ }
9232
+ const monthsRounded = Math.max(0, Math.ceil(exactMonths));
9233
+ const finalBalance = r === 0 ? currentSavings + monthlyContribution * monthsRounded : currentSavings * Math.pow(1 + r, monthsRounded) + monthlyContribution * ((Math.pow(1 + r, monthsRounded) - 1) / r);
9234
+ const totalContributed2 = monthlyContribution * monthsRounded;
9235
+ const totalInterestEarned2 = finalBalance - currentSavings - totalContributed2;
9236
+ return {
9237
+ mode,
9238
+ goalAmount: round4(goalAmount),
9239
+ currentSavings: round4(currentSavings),
9240
+ annualInterestRatePercent: round4(annualInterestRatePercent),
9241
+ monthlyContribution: round4(monthlyContribution),
9242
+ months: round4(exactMonths),
9243
+ monthsRounded,
9244
+ years: round4(monthsRounded / 12),
9245
+ totalContributed: round4(totalContributed2),
9246
+ totalInterestEarned: round4(totalInterestEarned2),
9247
+ finalBalance: round4(finalBalance)
9248
+ };
9249
+ }
9250
+ if (typeof months !== "number" || !Number.isFinite(months) || !Number.isInteger(months) || months <= 0) {
9251
+ return { error: "months must be a positive integer" };
9252
+ }
9253
+ const growthOfCurrentSavings = r === 0 ? currentSavings : currentSavings * Math.pow(1 + r, months);
9254
+ let requiredMonthlyContribution;
9255
+ if (growthOfCurrentSavings >= goalAmount) {
9256
+ requiredMonthlyContribution = 0;
9257
+ } else if (r === 0) {
9258
+ requiredMonthlyContribution = (goalAmount - currentSavings) / months;
9259
+ } else {
9260
+ requiredMonthlyContribution = (goalAmount - growthOfCurrentSavings) * r / (Math.pow(1 + r, months) - 1);
9261
+ }
9262
+ const totalContributed = requiredMonthlyContribution * months;
9263
+ const totalInterestEarned = goalAmount - currentSavings - totalContributed;
9264
+ return {
9265
+ mode,
9266
+ goalAmount: round4(goalAmount),
9267
+ currentSavings: round4(currentSavings),
9268
+ annualInterestRatePercent: round4(annualInterestRatePercent),
9269
+ monthlyContribution: round4(requiredMonthlyContribution),
9270
+ months,
9271
+ monthsRounded: months,
9272
+ years: round4(months / 12),
9273
+ totalContributed: round4(totalContributed),
9274
+ totalInterestEarned: round4(totalInterestEarned),
9275
+ finalBalance: round4(goalAmount)
9276
+ };
9277
+ }
9201
9278
 
9202
9279
  // src/tools/network.ts
9203
9280
  var network_exports = {};
@@ -12416,6 +12493,7 @@ var code_exports = {};
12416
12493
  __export(code_exports, {
12417
12494
  ALL_FLAGS: () => ALL_FLAGS,
12418
12495
  CHEATSHEET: () => CHEATSHEET,
12496
+ DEFAULT_COMMIT_TYPES: () => DEFAULT_COMMIT_TYPES,
12419
12497
  MIME_TABLE: () => MIME_TABLE,
12420
12498
  OPERATIONS: () => OPERATIONS,
12421
12499
  SQL_DEFAULT_OPTIONS: () => SQL_DEFAULT_OPTIONS,
@@ -12440,6 +12518,7 @@ __export(code_exports, {
12440
12518
  getJsStats: () => getJsStats,
12441
12519
  getMethodColor: () => getMethodColor,
12442
12520
  isValidTag: () => isValidTag,
12521
+ lintConventionalCommit: () => lintConventionalCommit,
12443
12522
  lookupMime: () => lookupMime,
12444
12523
  minifyCss: () => minifyCss,
12445
12524
  minifyGql: () => minifyGql,
@@ -15150,6 +15229,124 @@ function detectRedos(pattern) {
15150
15229
  findings: unique
15151
15230
  };
15152
15231
  }
15232
+ var DEFAULT_COMMIT_TYPES = ["build", "chore", "ci", "docs", "feat", "fix", "perf", "refactor", "revert", "style", "test"];
15233
+ var _DEFAULT_MAX_HEADER_LENGTH = 100;
15234
+ var _COMMIT_HEADER_RE = /^([A-Za-z][A-Za-z0-9-]*)(\(([^()]*)\))?(!)?: (.+)$/;
15235
+ var _COMMIT_FOOTER_LINE_RE = /^([A-Za-z][A-Za-z0-9-]*|BREAKING CHANGE)(: ?| #)(.*)$/;
15236
+ var _COMMIT_BREAKING_LOOKALIKE_RE = /^([A-Za-z][A-Za-z -]*?)(: | #)(.*)$/;
15237
+ var _COMMIT_BREAKING_TOKEN_RE = /^breaking[- ]change$/i;
15238
+ function lintConventionalCommit(message, options = {}) {
15239
+ if (typeof message !== "string" || message.trim() === "") {
15240
+ return { error: "message is required" };
15241
+ }
15242
+ if (message.length > 2e4) {
15243
+ return { error: "message too long (max 20,000 chars)" };
15244
+ }
15245
+ const types = options.types && options.types.length > 0 ? options.types : DEFAULT_COMMIT_TYPES;
15246
+ const maxHeaderLength = options.maxHeaderLength ?? _DEFAULT_MAX_HEADER_LENGTH;
15247
+ const findings = [];
15248
+ const lines = message.replace(/\r\n/g, "\n").split("\n");
15249
+ const header = lines[0];
15250
+ const match = header.match(_COMMIT_HEADER_RE);
15251
+ const parsed = {
15252
+ header,
15253
+ type: null,
15254
+ scope: null,
15255
+ breaking: false,
15256
+ description: null,
15257
+ body: null,
15258
+ footers: []
15259
+ };
15260
+ if (!match) {
15261
+ findings.push({
15262
+ rule: "header-format",
15263
+ severity: "error",
15264
+ message: "Header must match '<type>[(scope)][!]: <description>', e.g. 'feat(auth): add OAuth2 login'. A single space must follow the colon."
15265
+ });
15266
+ return { message, valid: false, parsed, findings };
15267
+ }
15268
+ const [, type, scopeGroup, scope, bang, description] = match;
15269
+ parsed.type = type;
15270
+ if (scopeGroup !== void 0) {
15271
+ const scopeContent = (scope ?? "").trim();
15272
+ if (scopeContent === "") {
15273
+ findings.push({ rule: "scope-empty", severity: "error", message: "Scope parentheses are present but empty; either remove the parentheses or put a scope inside them, e.g. fix(parser):." });
15274
+ } else {
15275
+ parsed.scope = scopeContent;
15276
+ }
15277
+ }
15278
+ const trimmedDescription = description.trim();
15279
+ if (trimmedDescription === "") {
15280
+ findings.push({ rule: "subject-empty", severity: "error", message: "The description after the colon must not be empty." });
15281
+ } else {
15282
+ parsed.description = trimmedDescription;
15283
+ if (trimmedDescription.endsWith(".")) {
15284
+ findings.push({ rule: "subject-full-stop", severity: "warning", message: "The description should not end with a period." });
15285
+ }
15286
+ }
15287
+ if (!types.includes(type.toLowerCase())) {
15288
+ findings.push({
15289
+ rule: "type-unknown",
15290
+ severity: "warning",
15291
+ message: `'${type}' is not one of the recognized types (${types.join(", ")}). This is only a convention, not a spec requirement, so a custom type is fine if your team has agreed on it.`
15292
+ });
15293
+ }
15294
+ if (type !== type.toLowerCase()) {
15295
+ findings.push({ rule: "type-case", severity: "warning", message: "The type is conventionally lower-case. The spec itself is not case-sensitive about this, but nearly every tool and team defaults to lower-case." });
15296
+ }
15297
+ if (header.length > maxHeaderLength) {
15298
+ findings.push({ rule: "header-max-length", severity: "warning", message: `Header is ${header.length} characters, longer than the recommended maximum of ${maxHeaderLength}.` });
15299
+ }
15300
+ let breaking = bang === "!";
15301
+ if (lines.length > 1) {
15302
+ if (lines[1].trim() !== "") {
15303
+ findings.push({ rule: "missing-blank-line-before-body", severity: "error", message: "A blank line must separate the header from the body or footer." });
15304
+ }
15305
+ const rest = lines.slice(1).join("\n");
15306
+ const paragraphs = rest.split(/\n{2,}/).map((p) => p.trim()).filter((p) => p !== "");
15307
+ let footerParagraph = null;
15308
+ if (paragraphs.length > 0) {
15309
+ const last = paragraphs[paragraphs.length - 1];
15310
+ const lastLines = last.split("\n");
15311
+ if (lastLines.every((l) => _COMMIT_FOOTER_LINE_RE.test(l.trim()))) {
15312
+ footerParagraph = last;
15313
+ paragraphs.pop();
15314
+ }
15315
+ }
15316
+ parsed.body = paragraphs.length > 0 ? paragraphs.join("\n\n") : null;
15317
+ if (footerParagraph) {
15318
+ for (const line of footerParagraph.split("\n")) {
15319
+ const fm = line.trim().match(_COMMIT_FOOTER_LINE_RE);
15320
+ if (!fm) continue;
15321
+ const [, token, , value] = fm;
15322
+ parsed.footers.push({ token, value: value.trim() });
15323
+ }
15324
+ }
15325
+ for (const f of parsed.footers) {
15326
+ if (_COMMIT_BREAKING_TOKEN_RE.test(f.token) && f.token !== "BREAKING CHANGE" && f.token !== "BREAKING-CHANGE") {
15327
+ findings.push({ rule: "breaking-change-casing", severity: "error", message: `Found '${f.token}:' as a footer, but the spec requires the breaking-change token to be exactly 'BREAKING CHANGE' or 'BREAKING-CHANGE' (uppercase).` });
15328
+ }
15329
+ }
15330
+ for (const p of paragraphs) {
15331
+ for (const line of p.split("\n")) {
15332
+ const bm = line.trim().match(_COMMIT_BREAKING_LOOKALIKE_RE);
15333
+ if (bm && _COMMIT_BREAKING_TOKEN_RE.test(bm[1]) && bm[1] !== "BREAKING CHANGE") {
15334
+ findings.push({ rule: "breaking-change-casing", severity: "error", message: `Found '${bm[1]}' near the end of the message, but it wasn't recognized as a breaking-change footer. The spec requires the exact uppercase token 'BREAKING CHANGE' (or 'BREAKING-CHANGE'), immediately followed by ': '.` });
15335
+ }
15336
+ }
15337
+ }
15338
+ }
15339
+ const breakingFooter = parsed.footers.find((f) => f.token === "BREAKING CHANGE" || f.token === "BREAKING-CHANGE");
15340
+ if (breakingFooter) {
15341
+ breaking = true;
15342
+ if (breakingFooter.value === "") {
15343
+ findings.push({ rule: "breaking-change-empty", severity: "error", message: "A 'BREAKING CHANGE:' footer must be followed by a description of the breaking change." });
15344
+ }
15345
+ }
15346
+ parsed.breaking = breaking;
15347
+ const valid = !findings.some((f) => f.severity === "error");
15348
+ return { message, valid, parsed, findings };
15349
+ }
15153
15350
 
15154
15351
  // src/tools/color.ts
15155
15352
  var color_exports = {};
package/dist/index.d.cts CHANGED
@@ -5,10 +5,10 @@ export { t as text } from './text-CA-zuD0C.cjs';
5
5
  export { d as data } from './data-C4lCByXw.cjs';
6
6
  export { g as generators } from './generators-Du8cBesn.cjs';
7
7
  export { t as time } from './time-KqJjdqII.cjs';
8
- export { u as units } from './units-DQYLZd1n.cjs';
8
+ export { u as units } from './units-BhoxdHhs.cjs';
9
9
  export { n as network } from './network-D7Epuerc.cjs';
10
10
  export { a as api } from './api-DmTNE4c1.cjs';
11
- export { c as code } from './code-DaRvff2v.cjs';
11
+ export { c as code } from './code-BK-x8hVx.cjs';
12
12
  export { c as color } from './color-tPwZCr9H.cjs';
13
13
  export { c as css } from './css-Cf7AMGM-.cjs';
14
14
  export { m as misc } from './misc-CA3N198T.cjs';
package/dist/index.d.ts CHANGED
@@ -5,10 +5,10 @@ export { t as text } from './text-CA-zuD0C.js';
5
5
  export { d as data } from './data-C4lCByXw.js';
6
6
  export { g as generators } from './generators-Du8cBesn.js';
7
7
  export { t as time } from './time-KqJjdqII.js';
8
- export { u as units } from './units-DQYLZd1n.js';
8
+ export { u as units } from './units-BhoxdHhs.js';
9
9
  export { n as network } from './network-D7Epuerc.js';
10
10
  export { a as api } from './api-DmTNE4c1.js';
11
- export { c as code } from './code-DaRvff2v.js';
11
+ export { c as code } from './code-BK-x8hVx.js';
12
12
  export { c as color } from './color-tPwZCr9H.js';
13
13
  export { c as css } from './css-Cf7AMGM-.js';
14
14
  export { m as misc } from './misc-CA3N198T.js';
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  export { media_exports as media } from './chunk-L6V4W4SU.js';
2
- export { units_exports as units } from './chunk-GDIZWDBY.js';
2
+ export { units_exports as units } from './chunk-ZPQOE7KD.js';
3
3
  export { network_exports as network } from './chunk-CSNTHZHF.js';
4
4
  export { api_exports as api } from './chunk-52ZDKSIX.js';
5
- export { code_exports as code } from './chunk-LXKIPPDG.js';
5
+ export { code_exports as code } from './chunk-UUT5HNST.js';
6
6
  export { color_exports as color } from './chunk-BPVAB4P2.js';
7
7
  export { css_exports as css } from './chunk-6YPV2AB5.js';
8
8
  export { misc_exports as misc } from './chunk-GX7H6TAX.js';
@@ -2689,9 +2689,128 @@ function detectRedos(pattern) {
2689
2689
  findings: unique
2690
2690
  };
2691
2691
  }
2692
+ var DEFAULT_COMMIT_TYPES = ["build", "chore", "ci", "docs", "feat", "fix", "perf", "refactor", "revert", "style", "test"];
2693
+ var _DEFAULT_MAX_HEADER_LENGTH = 100;
2694
+ var _COMMIT_HEADER_RE = /^([A-Za-z][A-Za-z0-9-]*)(\(([^()]*)\))?(!)?: (.+)$/;
2695
+ var _COMMIT_FOOTER_LINE_RE = /^([A-Za-z][A-Za-z0-9-]*|BREAKING CHANGE)(: ?| #)(.*)$/;
2696
+ var _COMMIT_BREAKING_LOOKALIKE_RE = /^([A-Za-z][A-Za-z -]*?)(: | #)(.*)$/;
2697
+ var _COMMIT_BREAKING_TOKEN_RE = /^breaking[- ]change$/i;
2698
+ function lintConventionalCommit(message, options = {}) {
2699
+ if (typeof message !== "string" || message.trim() === "") {
2700
+ return { error: "message is required" };
2701
+ }
2702
+ if (message.length > 2e4) {
2703
+ return { error: "message too long (max 20,000 chars)" };
2704
+ }
2705
+ const types = options.types && options.types.length > 0 ? options.types : DEFAULT_COMMIT_TYPES;
2706
+ const maxHeaderLength = options.maxHeaderLength ?? _DEFAULT_MAX_HEADER_LENGTH;
2707
+ const findings = [];
2708
+ const lines = message.replace(/\r\n/g, "\n").split("\n");
2709
+ const header = lines[0];
2710
+ const match = header.match(_COMMIT_HEADER_RE);
2711
+ const parsed = {
2712
+ header,
2713
+ type: null,
2714
+ scope: null,
2715
+ breaking: false,
2716
+ description: null,
2717
+ body: null,
2718
+ footers: []
2719
+ };
2720
+ if (!match) {
2721
+ findings.push({
2722
+ rule: "header-format",
2723
+ severity: "error",
2724
+ message: "Header must match '<type>[(scope)][!]: <description>', e.g. 'feat(auth): add OAuth2 login'. A single space must follow the colon."
2725
+ });
2726
+ return { message, valid: false, parsed, findings };
2727
+ }
2728
+ const [, type, scopeGroup, scope, bang, description] = match;
2729
+ parsed.type = type;
2730
+ if (scopeGroup !== void 0) {
2731
+ const scopeContent = (scope ?? "").trim();
2732
+ if (scopeContent === "") {
2733
+ findings.push({ rule: "scope-empty", severity: "error", message: "Scope parentheses are present but empty; either remove the parentheses or put a scope inside them, e.g. fix(parser):." });
2734
+ } else {
2735
+ parsed.scope = scopeContent;
2736
+ }
2737
+ }
2738
+ const trimmedDescription = description.trim();
2739
+ if (trimmedDescription === "") {
2740
+ findings.push({ rule: "subject-empty", severity: "error", message: "The description after the colon must not be empty." });
2741
+ } else {
2742
+ parsed.description = trimmedDescription;
2743
+ if (trimmedDescription.endsWith(".")) {
2744
+ findings.push({ rule: "subject-full-stop", severity: "warning", message: "The description should not end with a period." });
2745
+ }
2746
+ }
2747
+ if (!types.includes(type.toLowerCase())) {
2748
+ findings.push({
2749
+ rule: "type-unknown",
2750
+ severity: "warning",
2751
+ message: `'${type}' is not one of the recognized types (${types.join(", ")}). This is only a convention, not a spec requirement, so a custom type is fine if your team has agreed on it.`
2752
+ });
2753
+ }
2754
+ if (type !== type.toLowerCase()) {
2755
+ findings.push({ rule: "type-case", severity: "warning", message: "The type is conventionally lower-case. The spec itself is not case-sensitive about this, but nearly every tool and team defaults to lower-case." });
2756
+ }
2757
+ if (header.length > maxHeaderLength) {
2758
+ findings.push({ rule: "header-max-length", severity: "warning", message: `Header is ${header.length} characters, longer than the recommended maximum of ${maxHeaderLength}.` });
2759
+ }
2760
+ let breaking = bang === "!";
2761
+ if (lines.length > 1) {
2762
+ if (lines[1].trim() !== "") {
2763
+ findings.push({ rule: "missing-blank-line-before-body", severity: "error", message: "A blank line must separate the header from the body or footer." });
2764
+ }
2765
+ const rest = lines.slice(1).join("\n");
2766
+ const paragraphs = rest.split(/\n{2,}/).map((p) => p.trim()).filter((p) => p !== "");
2767
+ let footerParagraph = null;
2768
+ if (paragraphs.length > 0) {
2769
+ const last = paragraphs[paragraphs.length - 1];
2770
+ const lastLines = last.split("\n");
2771
+ if (lastLines.every((l) => _COMMIT_FOOTER_LINE_RE.test(l.trim()))) {
2772
+ footerParagraph = last;
2773
+ paragraphs.pop();
2774
+ }
2775
+ }
2776
+ parsed.body = paragraphs.length > 0 ? paragraphs.join("\n\n") : null;
2777
+ if (footerParagraph) {
2778
+ for (const line of footerParagraph.split("\n")) {
2779
+ const fm = line.trim().match(_COMMIT_FOOTER_LINE_RE);
2780
+ if (!fm) continue;
2781
+ const [, token, , value] = fm;
2782
+ parsed.footers.push({ token, value: value.trim() });
2783
+ }
2784
+ }
2785
+ for (const f of parsed.footers) {
2786
+ if (_COMMIT_BREAKING_TOKEN_RE.test(f.token) && f.token !== "BREAKING CHANGE" && f.token !== "BREAKING-CHANGE") {
2787
+ findings.push({ rule: "breaking-change-casing", severity: "error", message: `Found '${f.token}:' as a footer, but the spec requires the breaking-change token to be exactly 'BREAKING CHANGE' or 'BREAKING-CHANGE' (uppercase).` });
2788
+ }
2789
+ }
2790
+ for (const p of paragraphs) {
2791
+ for (const line of p.split("\n")) {
2792
+ const bm = line.trim().match(_COMMIT_BREAKING_LOOKALIKE_RE);
2793
+ if (bm && _COMMIT_BREAKING_TOKEN_RE.test(bm[1]) && bm[1] !== "BREAKING CHANGE") {
2794
+ findings.push({ rule: "breaking-change-casing", severity: "error", message: `Found '${bm[1]}' near the end of the message, but it wasn't recognized as a breaking-change footer. The spec requires the exact uppercase token 'BREAKING CHANGE' (or 'BREAKING-CHANGE'), immediately followed by ': '.` });
2795
+ }
2796
+ }
2797
+ }
2798
+ }
2799
+ const breakingFooter = parsed.footers.find((f) => f.token === "BREAKING CHANGE" || f.token === "BREAKING-CHANGE");
2800
+ if (breakingFooter) {
2801
+ breaking = true;
2802
+ if (breakingFooter.value === "") {
2803
+ findings.push({ rule: "breaking-change-empty", severity: "error", message: "A 'BREAKING CHANGE:' footer must be followed by a description of the breaking change." });
2804
+ }
2805
+ }
2806
+ parsed.breaking = breaking;
2807
+ const valid = !findings.some((f) => f.severity === "error");
2808
+ return { message, valid, parsed, findings };
2809
+ }
2692
2810
 
2693
2811
  exports.ALL_FLAGS = ALL_FLAGS;
2694
2812
  exports.CHEATSHEET = CHEATSHEET;
2813
+ exports.DEFAULT_COMMIT_TYPES = DEFAULT_COMMIT_TYPES;
2695
2814
  exports.MIME_TABLE = MIME_TABLE;
2696
2815
  exports.OPERATIONS = OPERATIONS;
2697
2816
  exports.SQL_DEFAULT_OPTIONS = SQL_DEFAULT_OPTIONS;
@@ -2716,6 +2835,7 @@ exports.getHtmlStats = getHtmlStats;
2716
2835
  exports.getJsStats = getJsStats;
2717
2836
  exports.getMethodColor = getMethodColor;
2718
2837
  exports.isValidTag = isValidTag;
2838
+ exports.lintConventionalCommit = lintConventionalCommit;
2719
2839
  exports.lookupMime = lookupMime;
2720
2840
  exports.minifyCss = minifyCss;
2721
2841
  exports.minifyGql = minifyGql;
@@ -1 +1 @@
1
- export { A as ALL_FLAGS, a as ApiEndpoint, b as ApiInfo, C as CHEATSHEET, d as CheatsheetEntry, e as CssResult, D as DockerImageRef, E as EnvEntry, f as EnvParseResult, G as GitCommandConfig, g as GitCommandResult, h as GitOperation, i as GithubUrlInfo, j as GithubUrlType, k as GqlFormatResult, H as HtmlFormatResult, l as HtmlMinifyOptions, m as HtmlMinifyResult, J as JsMinifyOptions, n as JsMinifyResult, M as MIME_TABLE, o as MatchResult, p as MimeEntry, q as MimeLookupResult, O as OPERATIONS, P as ParsedSpec, R as RedosFinding, r as RedosResult, s as RedosSeverity, t as RegexError, u as RegexFlag, v as RegexMatch, w as RegexResult, x as RegexSuccess, S as SQL_DEFAULT_OPTIONS, y as Segment, z as SpecVersion, B as SqlDialect, F as SqlFormatOptions, T as TestPatternResult, I as buildDockerPull, K as buildDockerRun, L as buildGitCommand, N as collapseHtmlWhitespace, Q as collapseJsWhitespace, U as countProperties, V as countRules, W as detectDialect, X as detectOperationType, Y as detectRedos, Z as envToExport, _ as envToJson, $ as formatCss, a0 as formatGql, a1 as formatHtml, a2 as formatSql, a3 as getEndpointsByTag, a4 as getHtmlStats, a5 as getJsStats, a6 as getMethodColor, a7 as isValidTag, a8 as lookupMime, a9 as minifyCss, aa as minifyGql, ab as minifyHtml, ac as minifyJs, ad as minifySql, ae as normalizeRef, af as parseDockerImage, ag as parseEnv, ah as parseGitCommand, ai as parseGithubUrl, aj as parseSpec, ak as removeConsoleCalls, al as removeEmptyAttributes, am as removeHtmlComments, an as removeJsComments, ao as removeRedundantAttributes, ap as searchCheatsheet, aq as searchEndpoints, ar as splitStatements, as as testPattern, at as testRegex, au as validateEnvKey } from '../code-DaRvff2v.cjs';
1
+ export { A as ALL_FLAGS, a as ApiEndpoint, b as ApiInfo, C as CHEATSHEET, d as CheatsheetEntry, e as ConventionalCommitFinding, f as ConventionalCommitFooter, g as ConventionalCommitOptions, h as ConventionalCommitParsed, i as ConventionalCommitResult, j as ConventionalCommitSeverity, k as CssResult, D as DEFAULT_COMMIT_TYPES, l as DockerImageRef, E as EnvEntry, m as EnvParseResult, G as GitCommandConfig, n as GitCommandResult, o as GitOperation, p as GithubUrlInfo, q as GithubUrlType, r as GqlFormatResult, H as HtmlFormatResult, s as HtmlMinifyOptions, t as HtmlMinifyResult, J as JsMinifyOptions, u as JsMinifyResult, M as MIME_TABLE, v as MatchResult, w as MimeEntry, x as MimeLookupResult, O as OPERATIONS, P as ParsedSpec, R as RedosFinding, y as RedosResult, z as RedosSeverity, B as RegexError, F as RegexFlag, I as RegexMatch, K as RegexResult, L as RegexSuccess, S as SQL_DEFAULT_OPTIONS, N as Segment, Q as SpecVersion, T as SqlDialect, U as SqlFormatOptions, V as TestPatternResult, W as buildDockerPull, X as buildDockerRun, Y as buildGitCommand, Z as collapseHtmlWhitespace, _ as collapseJsWhitespace, $ as countProperties, a0 as countRules, a1 as detectDialect, a2 as detectOperationType, a3 as detectRedos, a4 as envToExport, a5 as envToJson, a6 as formatCss, a7 as formatGql, a8 as formatHtml, a9 as formatSql, aa as getEndpointsByTag, ab as getHtmlStats, ac as getJsStats, ad as getMethodColor, ae as isValidTag, af as lintConventionalCommit, ag as lookupMime, ah as minifyCss, ai as minifyGql, aj as minifyHtml, ak as minifyJs, al as minifySql, am as normalizeRef, an as parseDockerImage, ao as parseEnv, ap as parseGitCommand, aq as parseGithubUrl, ar as parseSpec, as as removeConsoleCalls, at as removeEmptyAttributes, au as removeHtmlComments, av as removeJsComments, aw as removeRedundantAttributes, ax as searchCheatsheet, ay as searchEndpoints, az as splitStatements, aA as testPattern, aB as testRegex, aC as validateEnvKey } from '../code-BK-x8hVx.cjs';
@@ -1 +1 @@
1
- export { A as ALL_FLAGS, a as ApiEndpoint, b as ApiInfo, C as CHEATSHEET, d as CheatsheetEntry, e as CssResult, D as DockerImageRef, E as EnvEntry, f as EnvParseResult, G as GitCommandConfig, g as GitCommandResult, h as GitOperation, i as GithubUrlInfo, j as GithubUrlType, k as GqlFormatResult, H as HtmlFormatResult, l as HtmlMinifyOptions, m as HtmlMinifyResult, J as JsMinifyOptions, n as JsMinifyResult, M as MIME_TABLE, o as MatchResult, p as MimeEntry, q as MimeLookupResult, O as OPERATIONS, P as ParsedSpec, R as RedosFinding, r as RedosResult, s as RedosSeverity, t as RegexError, u as RegexFlag, v as RegexMatch, w as RegexResult, x as RegexSuccess, S as SQL_DEFAULT_OPTIONS, y as Segment, z as SpecVersion, B as SqlDialect, F as SqlFormatOptions, T as TestPatternResult, I as buildDockerPull, K as buildDockerRun, L as buildGitCommand, N as collapseHtmlWhitespace, Q as collapseJsWhitespace, U as countProperties, V as countRules, W as detectDialect, X as detectOperationType, Y as detectRedos, Z as envToExport, _ as envToJson, $ as formatCss, a0 as formatGql, a1 as formatHtml, a2 as formatSql, a3 as getEndpointsByTag, a4 as getHtmlStats, a5 as getJsStats, a6 as getMethodColor, a7 as isValidTag, a8 as lookupMime, a9 as minifyCss, aa as minifyGql, ab as minifyHtml, ac as minifyJs, ad as minifySql, ae as normalizeRef, af as parseDockerImage, ag as parseEnv, ah as parseGitCommand, ai as parseGithubUrl, aj as parseSpec, ak as removeConsoleCalls, al as removeEmptyAttributes, am as removeHtmlComments, an as removeJsComments, ao as removeRedundantAttributes, ap as searchCheatsheet, aq as searchEndpoints, ar as splitStatements, as as testPattern, at as testRegex, au as validateEnvKey } from '../code-DaRvff2v.js';
1
+ export { A as ALL_FLAGS, a as ApiEndpoint, b as ApiInfo, C as CHEATSHEET, d as CheatsheetEntry, e as ConventionalCommitFinding, f as ConventionalCommitFooter, g as ConventionalCommitOptions, h as ConventionalCommitParsed, i as ConventionalCommitResult, j as ConventionalCommitSeverity, k as CssResult, D as DEFAULT_COMMIT_TYPES, l as DockerImageRef, E as EnvEntry, m as EnvParseResult, G as GitCommandConfig, n as GitCommandResult, o as GitOperation, p as GithubUrlInfo, q as GithubUrlType, r as GqlFormatResult, H as HtmlFormatResult, s as HtmlMinifyOptions, t as HtmlMinifyResult, J as JsMinifyOptions, u as JsMinifyResult, M as MIME_TABLE, v as MatchResult, w as MimeEntry, x as MimeLookupResult, O as OPERATIONS, P as ParsedSpec, R as RedosFinding, y as RedosResult, z as RedosSeverity, B as RegexError, F as RegexFlag, I as RegexMatch, K as RegexResult, L as RegexSuccess, S as SQL_DEFAULT_OPTIONS, N as Segment, Q as SpecVersion, T as SqlDialect, U as SqlFormatOptions, V as TestPatternResult, W as buildDockerPull, X as buildDockerRun, Y as buildGitCommand, Z as collapseHtmlWhitespace, _ as collapseJsWhitespace, $ as countProperties, a0 as countRules, a1 as detectDialect, a2 as detectOperationType, a3 as detectRedos, a4 as envToExport, a5 as envToJson, a6 as formatCss, a7 as formatGql, a8 as formatHtml, a9 as formatSql, aa as getEndpointsByTag, ab as getHtmlStats, ac as getJsStats, ad as getMethodColor, ae as isValidTag, af as lintConventionalCommit, ag as lookupMime, ah as minifyCss, ai as minifyGql, aj as minifyHtml, ak as minifyJs, al as minifySql, am as normalizeRef, an as parseDockerImage, ao as parseEnv, ap as parseGitCommand, aq as parseGithubUrl, ar as parseSpec, as as removeConsoleCalls, at as removeEmptyAttributes, au as removeHtmlComments, av as removeJsComments, aw as removeRedundantAttributes, ax as searchCheatsheet, ay as searchEndpoints, az as splitStatements, aA as testPattern, aB as testRegex, aC as validateEnvKey } from '../code-BK-x8hVx.js';
@@ -1,2 +1,2 @@
1
- export { ALL_FLAGS, CHEATSHEET, MIME_TABLE, OPERATIONS, SQL_DEFAULT_OPTIONS, buildDockerPull, buildDockerRun, buildGitCommand, collapseHtmlWhitespace, collapseJsWhitespace, countProperties, countRules, detectDialect, detectOperationType, detectRedos, envToExport, envToJson, formatCss, formatGql, formatHtml, formatSql, getEndpointsByTag, getHtmlStats, getJsStats, getMethodColor, isValidTag, lookupMime, minifyCss, minifyGql, minifyHtml, minifyJs, minifySql, normalizeRef, parseDockerImage, parseEnv, parseGitCommand, parseGithubUrl, parseSpec, removeConsoleCalls, removeEmptyAttributes, removeHtmlComments, removeJsComments, removeRedundantAttributes, searchCheatsheet, searchEndpoints, splitStatements, testPattern, testRegex, validateEnvKey } from '../chunk-LXKIPPDG.js';
1
+ export { ALL_FLAGS, CHEATSHEET, DEFAULT_COMMIT_TYPES, MIME_TABLE, OPERATIONS, SQL_DEFAULT_OPTIONS, buildDockerPull, buildDockerRun, buildGitCommand, collapseHtmlWhitespace, collapseJsWhitespace, countProperties, countRules, detectDialect, detectOperationType, detectRedos, envToExport, envToJson, formatCss, formatGql, formatHtml, formatSql, getEndpointsByTag, getHtmlStats, getJsStats, getMethodColor, isValidTag, lintConventionalCommit, lookupMime, minifyCss, minifyGql, minifyHtml, minifyJs, minifySql, normalizeRef, parseDockerImage, parseEnv, parseGitCommand, parseGithubUrl, parseSpec, removeConsoleCalls, removeEmptyAttributes, removeHtmlComments, removeJsComments, removeRedundantAttributes, searchCheatsheet, searchEndpoints, splitStatements, testPattern, testRegex, validateEnvKey } from '../chunk-UUT5HNST.js';
2
2
  import '../chunk-MLKGABMK.js';
@@ -1648,6 +1648,82 @@ function calculateEmi(principal, annualRatePercent, tenure, tenureUnit = "years"
1648
1648
  yearlyBreakdown
1649
1649
  };
1650
1650
  }
1651
+ function calculateSavingsGoal(input) {
1652
+ const { mode, goalAmount, currentSavings, annualInterestRatePercent, monthlyContribution, months } = input;
1653
+ if (mode !== "time-to-goal" && mode !== "contribution-for-target") {
1654
+ return { error: "mode must be 'time-to-goal' or 'contribution-for-target'" };
1655
+ }
1656
+ if (!Number.isFinite(goalAmount) || goalAmount <= 0) return { error: "goalAmount must be a finite number greater than zero" };
1657
+ if (!Number.isFinite(currentSavings) || currentSavings < 0) return { error: "currentSavings must be a finite, non-negative number" };
1658
+ if (!Number.isFinite(annualInterestRatePercent) || annualInterestRatePercent < 0) {
1659
+ return { error: "annualInterestRatePercent must be a finite, non-negative number" };
1660
+ }
1661
+ const round4 = (n) => Math.round(n * 1e4) / 1e4;
1662
+ const r = annualInterestRatePercent / 100 / 12;
1663
+ if (mode === "time-to-goal") {
1664
+ if (typeof monthlyContribution !== "number" || !Number.isFinite(monthlyContribution) || monthlyContribution < 0) {
1665
+ return { error: "monthlyContribution must be a finite, non-negative number" };
1666
+ }
1667
+ let exactMonths;
1668
+ if (currentSavings >= goalAmount) {
1669
+ exactMonths = 0;
1670
+ } else if (monthlyContribution === 0) {
1671
+ if (r === 0) return { error: "monthlyContribution must be greater than zero when annualInterestRatePercent is zero, since savings would never grow toward the goal" };
1672
+ if (currentSavings <= 0) return { error: "monthlyContribution must be greater than zero when currentSavings is zero, since there is nothing to compound" };
1673
+ exactMonths = Math.log(goalAmount / currentSavings) / Math.log(1 + r);
1674
+ } else if (r === 0) {
1675
+ exactMonths = (goalAmount - currentSavings) / monthlyContribution;
1676
+ } else {
1677
+ const denom = currentSavings + monthlyContribution / r;
1678
+ const x = (goalAmount + monthlyContribution / r) / denom;
1679
+ exactMonths = Math.log(x) / Math.log(1 + r);
1680
+ }
1681
+ const monthsRounded = Math.max(0, Math.ceil(exactMonths));
1682
+ const finalBalance = r === 0 ? currentSavings + monthlyContribution * monthsRounded : currentSavings * Math.pow(1 + r, monthsRounded) + monthlyContribution * ((Math.pow(1 + r, monthsRounded) - 1) / r);
1683
+ const totalContributed2 = monthlyContribution * monthsRounded;
1684
+ const totalInterestEarned2 = finalBalance - currentSavings - totalContributed2;
1685
+ return {
1686
+ mode,
1687
+ goalAmount: round4(goalAmount),
1688
+ currentSavings: round4(currentSavings),
1689
+ annualInterestRatePercent: round4(annualInterestRatePercent),
1690
+ monthlyContribution: round4(monthlyContribution),
1691
+ months: round4(exactMonths),
1692
+ monthsRounded,
1693
+ years: round4(monthsRounded / 12),
1694
+ totalContributed: round4(totalContributed2),
1695
+ totalInterestEarned: round4(totalInterestEarned2),
1696
+ finalBalance: round4(finalBalance)
1697
+ };
1698
+ }
1699
+ if (typeof months !== "number" || !Number.isFinite(months) || !Number.isInteger(months) || months <= 0) {
1700
+ return { error: "months must be a positive integer" };
1701
+ }
1702
+ const growthOfCurrentSavings = r === 0 ? currentSavings : currentSavings * Math.pow(1 + r, months);
1703
+ let requiredMonthlyContribution;
1704
+ if (growthOfCurrentSavings >= goalAmount) {
1705
+ requiredMonthlyContribution = 0;
1706
+ } else if (r === 0) {
1707
+ requiredMonthlyContribution = (goalAmount - currentSavings) / months;
1708
+ } else {
1709
+ requiredMonthlyContribution = (goalAmount - growthOfCurrentSavings) * r / (Math.pow(1 + r, months) - 1);
1710
+ }
1711
+ const totalContributed = requiredMonthlyContribution * months;
1712
+ const totalInterestEarned = goalAmount - currentSavings - totalContributed;
1713
+ return {
1714
+ mode,
1715
+ goalAmount: round4(goalAmount),
1716
+ currentSavings: round4(currentSavings),
1717
+ annualInterestRatePercent: round4(annualInterestRatePercent),
1718
+ monthlyContribution: round4(requiredMonthlyContribution),
1719
+ months,
1720
+ monthsRounded: months,
1721
+ years: round4(months / 12),
1722
+ totalContributed: round4(totalContributed),
1723
+ totalInterestEarned: round4(totalInterestEarned),
1724
+ finalBalance: round4(goalAmount)
1725
+ };
1726
+ }
1651
1727
 
1652
1728
  exports.BASE_LABELS = BASE_LABELS;
1653
1729
  exports.BASE_PREFIXES = BASE_PREFIXES;
@@ -1673,6 +1749,7 @@ exports.calculateLoan = calculateLoan;
1673
1749
  exports.calculateMarginMarkup = calculateMarginMarkup;
1674
1750
  exports.calculatePercentageChange = calculatePercentageChange;
1675
1751
  exports.calculateRuleOf72 = calculateRuleOf72;
1752
+ exports.calculateSavingsGoal = calculateSavingsGoal;
1676
1753
  exports.calculateSimpleInterest = calculateSimpleInterest;
1677
1754
  exports.calculateTax = calculateTax;
1678
1755
  exports.calculateTimeValue = calculateTimeValue;
@@ -1 +1 @@
1
- export { A as AmortizationRow, a as AprApyDirection, b as AprApyResult, c as AspectRatioResult, B as BASE_LABELS, d as BASE_PREFIXES, e as BYTE_UNITS, f as BarcodeFormat, g as BarcodeValidationResult, h as BaseConvertResult, i as BreakEvenInput, j as BreakEvenResult, k as ByteConvertResult, l as ByteUnit, C as COMMON_CURRENCIES, m as COMMON_LOCALES, n as COMMON_PERMISSIONS, o as COMMON_RATIOS, p as COMMON_SIZES, q as COMMON_TAX_RATES, r as COMMON_TIP_PERCENTAGES, s as COMMON_VIEWPORTS, t as CardValidationResult, v as CompoundInterestResult, w as CompoundYearRow, D as Dimensions, x as DiscountField, y as DiscountInput, z as DiscountResult, E as EmiResult, F as EmiTenureUnit, G as EmiYearlyBreakdownRow, H as FilePermissions, I as FormatOptions, J as IbanValidationResult, K as IpConversion, L as IsbnFormat, M as IsbnResult, N as LoanResult, O as MarginMarkupField, P as MarginMarkupInput, Q as MarginMarkupResult, R as NotationStyle, S as NumberBase, T as PercentChangeDirection, U as PercentageChangeResult, V as Permission, W as PxConvertResult, X as RuleOf72Direction, Y as RuleOf72Result, Z as SemverVersion, _ as SimpleInterestResult, $ as SubnetInfo, a0 as SuccessiveDiscountResult, a1 as SuccessiveDiscountStep, a2 as TaxDirection, a3 as TaxResult, a4 as TimeValueDirection, a5 as TimeValueResult, a6 as TipSplitResult, a7 as VideoBitrateInput, a8 as VideoBitrateMode, a9 as VideoBitrateResult, aa as ViewportConvertResult, ab as applySuccessiveDiscounts, ac as autoFormat, ad as bumpVersion, ae as calcAspectRatio, af as calcSubnet, ag as calculateBreakEven, ah as calculateCompoundInterest, ai as calculateDiscount, aj as calculateEmi, ak as calculateLoan, al as calculateMarginMarkup, am as calculatePercentageChange, an as calculateRuleOf72, ao as calculateSimpleInterest, ap as calculateTax, aq as calculateTimeValue, ar as calculateTipSplit, as as calculateVideoBitrate, at as compareSemver, au as convert, av as convertAprApy, aw as convertBytes, ax as convertIp, ay as coverBox, az as decimalToIp, aA as decimalToIpCidr, aB as describePermissions, aC as fitIntoBox, aD as formatNumber, aE as formatValue, aF as formatVwValue, aG as formatWithSeparator, aH as gcd, aI as ipFromBinary, aJ as ipFromDecimal, aK as ipFromHex, aL as ipToBinary, aM as ipToDecimal, aN as ipToDecimalCidr, aO as ipToHex, aP as ipToOctal, aQ as isValid, aR as isValidCidr, aS as isValidIp, aT as isValidIpv4, aU as marginToMarkup, aV as markupToMargin, aW as octalToPermissions, aX as parseFileSize, aY as parseInput, aZ as parseNumberString, a_ as parseSemver, a$ as permissionsToChmod, b0 as permissionsToOctal, b1 as permissionsToSymbolic, b2 as ptToPx, b3 as pxToAll, b4 as pxToViewport, b5 as remToPx, b6 as satisfiesRange, b7 as scaleByHeight, b8 as scaleByWidth, b9 as sortVersions, ba as splitSubnet, bb as symbolicToPermissions, bc as validateBarcode, bd as validateCardNumber, be as validateIban, bf as validateIsbn, bg as viewportToPx } from '../units-DQYLZd1n.cjs';
1
+ export { A as AmortizationRow, a as AprApyDirection, b as AprApyResult, c as AspectRatioResult, B as BASE_LABELS, d as BASE_PREFIXES, e as BYTE_UNITS, f as BarcodeFormat, g as BarcodeValidationResult, h as BaseConvertResult, i as BreakEvenInput, j as BreakEvenResult, k as ByteConvertResult, l as ByteUnit, C as COMMON_CURRENCIES, m as COMMON_LOCALES, n as COMMON_PERMISSIONS, o as COMMON_RATIOS, p as COMMON_SIZES, q as COMMON_TAX_RATES, r as COMMON_TIP_PERCENTAGES, s as COMMON_VIEWPORTS, t as CardValidationResult, v as CompoundInterestResult, w as CompoundYearRow, D as Dimensions, x as DiscountField, y as DiscountInput, z as DiscountResult, E as EmiResult, F as EmiTenureUnit, G as EmiYearlyBreakdownRow, H as FilePermissions, I as FormatOptions, J as IbanValidationResult, K as IpConversion, L as IsbnFormat, M as IsbnResult, N as LoanResult, O as MarginMarkupField, P as MarginMarkupInput, Q as MarginMarkupResult, R as NotationStyle, S as NumberBase, T as PercentChangeDirection, U as PercentageChangeResult, V as Permission, W as PxConvertResult, X as RuleOf72Direction, Y as RuleOf72Result, Z as SavingsGoalInput, _ as SavingsGoalMode, $ as SavingsGoalResult, a0 as SemverVersion, a1 as SimpleInterestResult, a2 as SubnetInfo, a3 as SuccessiveDiscountResult, a4 as SuccessiveDiscountStep, a5 as TaxDirection, a6 as TaxResult, a7 as TimeValueDirection, a8 as TimeValueResult, a9 as TipSplitResult, aa as VideoBitrateInput, ab as VideoBitrateMode, ac as VideoBitrateResult, ad as ViewportConvertResult, ae as applySuccessiveDiscounts, af as autoFormat, ag as bumpVersion, ah as calcAspectRatio, ai as calcSubnet, aj as calculateBreakEven, ak as calculateCompoundInterest, al as calculateDiscount, am as calculateEmi, an as calculateLoan, ao as calculateMarginMarkup, ap as calculatePercentageChange, aq as calculateRuleOf72, ar as calculateSavingsGoal, as as calculateSimpleInterest, at as calculateTax, au as calculateTimeValue, av as calculateTipSplit, aw as calculateVideoBitrate, ax as compareSemver, ay as convert, az as convertAprApy, aA as convertBytes, aB as convertIp, aC as coverBox, aD as decimalToIp, aE as decimalToIpCidr, aF as describePermissions, aG as fitIntoBox, aH as formatNumber, aI as formatValue, aJ as formatVwValue, aK as formatWithSeparator, aL as gcd, aM as ipFromBinary, aN as ipFromDecimal, aO as ipFromHex, aP as ipToBinary, aQ as ipToDecimal, aR as ipToDecimalCidr, aS as ipToHex, aT as ipToOctal, aU as isValid, aV as isValidCidr, aW as isValidIp, aX as isValidIpv4, aY as marginToMarkup, aZ as markupToMargin, a_ as octalToPermissions, a$ as parseFileSize, b0 as parseInput, b1 as parseNumberString, b2 as parseSemver, b3 as permissionsToChmod, b4 as permissionsToOctal, b5 as permissionsToSymbolic, b6 as ptToPx, b7 as pxToAll, b8 as pxToViewport, b9 as remToPx, ba as satisfiesRange, bb as scaleByHeight, bc as scaleByWidth, bd as sortVersions, be as splitSubnet, bf as symbolicToPermissions, bg as validateBarcode, bh as validateCardNumber, bi as validateIban, bj as validateIsbn, bk as viewportToPx } from '../units-BhoxdHhs.cjs';
@@ -1 +1 @@
1
- export { A as AmortizationRow, a as AprApyDirection, b as AprApyResult, c as AspectRatioResult, B as BASE_LABELS, d as BASE_PREFIXES, e as BYTE_UNITS, f as BarcodeFormat, g as BarcodeValidationResult, h as BaseConvertResult, i as BreakEvenInput, j as BreakEvenResult, k as ByteConvertResult, l as ByteUnit, C as COMMON_CURRENCIES, m as COMMON_LOCALES, n as COMMON_PERMISSIONS, o as COMMON_RATIOS, p as COMMON_SIZES, q as COMMON_TAX_RATES, r as COMMON_TIP_PERCENTAGES, s as COMMON_VIEWPORTS, t as CardValidationResult, v as CompoundInterestResult, w as CompoundYearRow, D as Dimensions, x as DiscountField, y as DiscountInput, z as DiscountResult, E as EmiResult, F as EmiTenureUnit, G as EmiYearlyBreakdownRow, H as FilePermissions, I as FormatOptions, J as IbanValidationResult, K as IpConversion, L as IsbnFormat, M as IsbnResult, N as LoanResult, O as MarginMarkupField, P as MarginMarkupInput, Q as MarginMarkupResult, R as NotationStyle, S as NumberBase, T as PercentChangeDirection, U as PercentageChangeResult, V as Permission, W as PxConvertResult, X as RuleOf72Direction, Y as RuleOf72Result, Z as SemverVersion, _ as SimpleInterestResult, $ as SubnetInfo, a0 as SuccessiveDiscountResult, a1 as SuccessiveDiscountStep, a2 as TaxDirection, a3 as TaxResult, a4 as TimeValueDirection, a5 as TimeValueResult, a6 as TipSplitResult, a7 as VideoBitrateInput, a8 as VideoBitrateMode, a9 as VideoBitrateResult, aa as ViewportConvertResult, ab as applySuccessiveDiscounts, ac as autoFormat, ad as bumpVersion, ae as calcAspectRatio, af as calcSubnet, ag as calculateBreakEven, ah as calculateCompoundInterest, ai as calculateDiscount, aj as calculateEmi, ak as calculateLoan, al as calculateMarginMarkup, am as calculatePercentageChange, an as calculateRuleOf72, ao as calculateSimpleInterest, ap as calculateTax, aq as calculateTimeValue, ar as calculateTipSplit, as as calculateVideoBitrate, at as compareSemver, au as convert, av as convertAprApy, aw as convertBytes, ax as convertIp, ay as coverBox, az as decimalToIp, aA as decimalToIpCidr, aB as describePermissions, aC as fitIntoBox, aD as formatNumber, aE as formatValue, aF as formatVwValue, aG as formatWithSeparator, aH as gcd, aI as ipFromBinary, aJ as ipFromDecimal, aK as ipFromHex, aL as ipToBinary, aM as ipToDecimal, aN as ipToDecimalCidr, aO as ipToHex, aP as ipToOctal, aQ as isValid, aR as isValidCidr, aS as isValidIp, aT as isValidIpv4, aU as marginToMarkup, aV as markupToMargin, aW as octalToPermissions, aX as parseFileSize, aY as parseInput, aZ as parseNumberString, a_ as parseSemver, a$ as permissionsToChmod, b0 as permissionsToOctal, b1 as permissionsToSymbolic, b2 as ptToPx, b3 as pxToAll, b4 as pxToViewport, b5 as remToPx, b6 as satisfiesRange, b7 as scaleByHeight, b8 as scaleByWidth, b9 as sortVersions, ba as splitSubnet, bb as symbolicToPermissions, bc as validateBarcode, bd as validateCardNumber, be as validateIban, bf as validateIsbn, bg as viewportToPx } from '../units-DQYLZd1n.js';
1
+ export { A as AmortizationRow, a as AprApyDirection, b as AprApyResult, c as AspectRatioResult, B as BASE_LABELS, d as BASE_PREFIXES, e as BYTE_UNITS, f as BarcodeFormat, g as BarcodeValidationResult, h as BaseConvertResult, i as BreakEvenInput, j as BreakEvenResult, k as ByteConvertResult, l as ByteUnit, C as COMMON_CURRENCIES, m as COMMON_LOCALES, n as COMMON_PERMISSIONS, o as COMMON_RATIOS, p as COMMON_SIZES, q as COMMON_TAX_RATES, r as COMMON_TIP_PERCENTAGES, s as COMMON_VIEWPORTS, t as CardValidationResult, v as CompoundInterestResult, w as CompoundYearRow, D as Dimensions, x as DiscountField, y as DiscountInput, z as DiscountResult, E as EmiResult, F as EmiTenureUnit, G as EmiYearlyBreakdownRow, H as FilePermissions, I as FormatOptions, J as IbanValidationResult, K as IpConversion, L as IsbnFormat, M as IsbnResult, N as LoanResult, O as MarginMarkupField, P as MarginMarkupInput, Q as MarginMarkupResult, R as NotationStyle, S as NumberBase, T as PercentChangeDirection, U as PercentageChangeResult, V as Permission, W as PxConvertResult, X as RuleOf72Direction, Y as RuleOf72Result, Z as SavingsGoalInput, _ as SavingsGoalMode, $ as SavingsGoalResult, a0 as SemverVersion, a1 as SimpleInterestResult, a2 as SubnetInfo, a3 as SuccessiveDiscountResult, a4 as SuccessiveDiscountStep, a5 as TaxDirection, a6 as TaxResult, a7 as TimeValueDirection, a8 as TimeValueResult, a9 as TipSplitResult, aa as VideoBitrateInput, ab as VideoBitrateMode, ac as VideoBitrateResult, ad as ViewportConvertResult, ae as applySuccessiveDiscounts, af as autoFormat, ag as bumpVersion, ah as calcAspectRatio, ai as calcSubnet, aj as calculateBreakEven, ak as calculateCompoundInterest, al as calculateDiscount, am as calculateEmi, an as calculateLoan, ao as calculateMarginMarkup, ap as calculatePercentageChange, aq as calculateRuleOf72, ar as calculateSavingsGoal, as as calculateSimpleInterest, at as calculateTax, au as calculateTimeValue, av as calculateTipSplit, aw as calculateVideoBitrate, ax as compareSemver, ay as convert, az as convertAprApy, aA as convertBytes, aB as convertIp, aC as coverBox, aD as decimalToIp, aE as decimalToIpCidr, aF as describePermissions, aG as fitIntoBox, aH as formatNumber, aI as formatValue, aJ as formatVwValue, aK as formatWithSeparator, aL as gcd, aM as ipFromBinary, aN as ipFromDecimal, aO as ipFromHex, aP as ipToBinary, aQ as ipToDecimal, aR as ipToDecimalCidr, aS as ipToHex, aT as ipToOctal, aU as isValid, aV as isValidCidr, aW as isValidIp, aX as isValidIpv4, aY as marginToMarkup, aZ as markupToMargin, a_ as octalToPermissions, a$ as parseFileSize, b0 as parseInput, b1 as parseNumberString, b2 as parseSemver, b3 as permissionsToChmod, b4 as permissionsToOctal, b5 as permissionsToSymbolic, b6 as ptToPx, b7 as pxToAll, b8 as pxToViewport, b9 as remToPx, ba as satisfiesRange, bb as scaleByHeight, bc as scaleByWidth, bd as sortVersions, be as splitSubnet, bf as symbolicToPermissions, bg as validateBarcode, bh as validateCardNumber, bi as validateIban, bj as validateIsbn, bk as viewportToPx } from '../units-BhoxdHhs.js';
@@ -1,2 +1,2 @@
1
- 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, applySuccessiveDiscounts, autoFormat, bumpVersion, calcAspectRatio, calcSubnet, calculateBreakEven, calculateCompoundInterest, calculateDiscount, calculateEmi, calculateLoan, calculateMarginMarkup, calculatePercentageChange, calculateRuleOf72, calculateSimpleInterest, calculateTax, calculateTimeValue, calculateTipSplit, calculateVideoBitrate, compareSemver, 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, validateBarcode, validateCardNumber, validateIban, validateIsbn, viewportToPx } from '../chunk-GDIZWDBY.js';
1
+ 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, applySuccessiveDiscounts, autoFormat, bumpVersion, calcAspectRatio, calcSubnet, calculateBreakEven, calculateCompoundInterest, calculateDiscount, calculateEmi, calculateLoan, calculateMarginMarkup, calculatePercentageChange, calculateRuleOf72, calculateSavingsGoal, calculateSimpleInterest, calculateTax, calculateTimeValue, calculateTipSplit, calculateVideoBitrate, compareSemver, 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, validateBarcode, validateCardNumber, validateIban, validateIsbn, viewportToPx } from '../chunk-ZPQOE7KD.js';
2
2
  import '../chunk-MLKGABMK.js';