fln 1.0.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/LICENSE +21 -0
- package/README.md +330 -0
- package/dist/api/fln.d.ts +3 -0
- package/dist/api/fln.d.ts.map +1 -0
- package/dist/api/fln.js +71 -0
- package/dist/api/index.d.ts +3 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +2 -0
- package/dist/api/types.d.ts +34 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +1 -0
- package/dist/cli/commandLine.d.ts +2 -0
- package/dist/cli/commandLine.d.ts.map +1 -0
- package/dist/cli/commandLine.js +120 -0
- package/dist/cli/help.d.ts +2 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +40 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +9 -0
- package/dist/cli/output/components/breakdown.d.ts +2 -0
- package/dist/cli/output/components/breakdown.d.ts.map +1 -0
- package/dist/cli/output/components/breakdown.js +21 -0
- package/dist/cli/output/components/errors.d.ts +6 -0
- package/dist/cli/output/components/errors.d.ts.map +1 -0
- package/dist/cli/output/components/errors.js +13 -0
- package/dist/cli/output/components/progressBar.d.ts +7 -0
- package/dist/cli/output/components/progressBar.d.ts.map +1 -0
- package/dist/cli/output/components/progressBar.js +38 -0
- package/dist/cli/output/components/summary.d.ts +8 -0
- package/dist/cli/output/components/summary.d.ts.map +1 -0
- package/dist/cli/output/components/summary.js +12 -0
- package/dist/cli/output/components/warnings.d.ts +6 -0
- package/dist/cli/output/components/warnings.d.ts.map +1 -0
- package/dist/cli/output/components/warnings.js +11 -0
- package/dist/cli/output/formatter.d.ts +5 -0
- package/dist/cli/output/formatter.d.ts.map +1 -0
- package/dist/cli/output/formatter.js +28 -0
- package/dist/cli/output/index.d.ts +8 -0
- package/dist/cli/output/index.d.ts.map +1 -0
- package/dist/cli/output/index.js +4 -0
- package/dist/cli/output/renderer.d.ts +21 -0
- package/dist/cli/output/renderer.d.ts.map +1 -0
- package/dist/cli/output/renderer.js +121 -0
- package/dist/cli/output/styles.d.ts +23 -0
- package/dist/cli/output/styles.d.ts.map +1 -0
- package/dist/cli/output/styles.js +26 -0
- package/dist/config/defaults.d.ts +3 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +2 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +5 -0
- package/dist/config/loader.d.ts +3 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +11 -0
- package/dist/config/resolver.d.ts +8 -0
- package/dist/config/resolver.d.ts.map +1 -0
- package/dist/config/resolver.js +66 -0
- package/dist/config/types.d.ts +40 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +1 -0
- package/dist/config/utils.d.ts +7 -0
- package/dist/config/utils.d.ts.map +1 -0
- package/dist/config/utils.js +161 -0
- package/dist/core/ignoreMatcher.d.ts +15 -0
- package/dist/core/ignoreMatcher.d.ts.map +1 -0
- package/dist/core/ignoreMatcher.js +97 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/renderOutput.d.ts +4 -0
- package/dist/core/renderOutput.d.ts.map +1 -0
- package/dist/core/renderOutput.js +218 -0
- package/dist/core/renderTree.d.ts +3 -0
- package/dist/core/renderTree.d.ts.map +1 -0
- package/dist/core/renderTree.js +23 -0
- package/dist/core/scanTree.d.ts +4 -0
- package/dist/core/scanTree.d.ts.map +1 -0
- package/dist/core/scanTree.js +348 -0
- package/dist/core/size.d.ts +4 -0
- package/dist/core/size.d.ts.map +1 -0
- package/dist/core/size.js +32 -0
- package/dist/core/statsCollector.d.ts +4 -0
- package/dist/core/statsCollector.d.ts.map +1 -0
- package/dist/core/statsCollector.js +28 -0
- package/dist/core/types.d.ts +53 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/infra/countTokens.d.ts +2 -0
- package/dist/infra/countTokens.d.ts.map +1 -0
- package/dist/infra/countTokens.js +186 -0
- package/dist/infra/datetime.d.ts +3 -0
- package/dist/infra/datetime.d.ts.map +1 -0
- package/dist/infra/datetime.js +15 -0
- package/dist/infra/index.d.ts +7 -0
- package/dist/infra/index.d.ts.map +1 -0
- package/dist/infra/index.js +6 -0
- package/dist/infra/logger.d.ts +19 -0
- package/dist/infra/logger.d.ts.map +1 -0
- package/dist/infra/logger.js +99 -0
- package/dist/infra/outputWriter.d.ts +15 -0
- package/dist/infra/outputWriter.d.ts.map +1 -0
- package/dist/infra/outputWriter.js +35 -0
- package/dist/infra/terminal.d.ts +91 -0
- package/dist/infra/terminal.d.ts.map +1 -0
- package/dist/infra/terminal.js +189 -0
- package/dist/infra/usageTracker.d.ts +3 -0
- package/dist/infra/usageTracker.d.ts.map +1 -0
- package/dist/infra/usageTracker.js +39 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
export function getTerminalInfo() {
|
|
2
|
+
const width = process.stdout.columns || 80;
|
|
3
|
+
const supportsAnsi = process.stdout.isTTY && process.env.TERM !== "dumb";
|
|
4
|
+
return { width, supportsAnsi };
|
|
5
|
+
}
|
|
6
|
+
export function isTTY() {
|
|
7
|
+
return Boolean(process.stdout.isTTY);
|
|
8
|
+
}
|
|
9
|
+
export function shouldUseColors() {
|
|
10
|
+
return isTTY() && process.env.NO_COLOR !== "1" && process.env.TERM !== "dumb";
|
|
11
|
+
}
|
|
12
|
+
export const ansi = {
|
|
13
|
+
cursorHide: "\x1B[?25l",
|
|
14
|
+
cursorShow: "\x1B[?25h",
|
|
15
|
+
cursorUp: (lines) => `\x1B[${lines}A`,
|
|
16
|
+
cursorDown: (lines) => `\x1B[${lines}B`,
|
|
17
|
+
cursorTo: (column) => `\x1B[${column}G`,
|
|
18
|
+
clearLine: "\x1B[2K",
|
|
19
|
+
clearLineRight: "\x1B[0K",
|
|
20
|
+
reset: "\x1B[0m",
|
|
21
|
+
bold: "\x1B[1m",
|
|
22
|
+
dim: "\x1B[2m",
|
|
23
|
+
black: "\x1B[30m",
|
|
24
|
+
red: "\x1B[31m",
|
|
25
|
+
green: "\x1B[32m",
|
|
26
|
+
yellow: "\x1B[33m",
|
|
27
|
+
blue: "\x1B[34m",
|
|
28
|
+
magenta: "\x1B[35m",
|
|
29
|
+
cyan: "\x1B[36m",
|
|
30
|
+
white: "\x1B[37m",
|
|
31
|
+
gray: "\x1B[90m",
|
|
32
|
+
bgBlack: "\x1B[40m",
|
|
33
|
+
bgRed: "\x1B[41m",
|
|
34
|
+
bgGreen: "\x1B[42m",
|
|
35
|
+
bgYellow: "\x1B[43m",
|
|
36
|
+
bgBlue: "\x1B[44m",
|
|
37
|
+
bgMagenta: "\x1B[45m",
|
|
38
|
+
bgCyan: "\x1B[46m",
|
|
39
|
+
bgWhite: "\x1B[47m",
|
|
40
|
+
brightBlack: "\x1B[90m",
|
|
41
|
+
brightRed: "\x1B[91m",
|
|
42
|
+
brightGreen: "\x1B[92m",
|
|
43
|
+
brightYellow: "\x1B[93m",
|
|
44
|
+
brightBlue: "\x1B[94m",
|
|
45
|
+
brightMagenta: "\x1B[95m",
|
|
46
|
+
brightCyan: "\x1B[96m",
|
|
47
|
+
brightWhite: "\x1B[97m"
|
|
48
|
+
};
|
|
49
|
+
export const symbols = {
|
|
50
|
+
dot: "•",
|
|
51
|
+
check: "✓",
|
|
52
|
+
cross: "✗",
|
|
53
|
+
warning: "⚠",
|
|
54
|
+
info: "ℹ",
|
|
55
|
+
arrowRight: "→",
|
|
56
|
+
boxTopLeft: "╭",
|
|
57
|
+
boxTopRight: "╮",
|
|
58
|
+
boxBottomLeft: "╰",
|
|
59
|
+
boxBottomRight: "╯",
|
|
60
|
+
boxVertical: "│",
|
|
61
|
+
boxHorizontal: "─",
|
|
62
|
+
boxCross: "┼",
|
|
63
|
+
boxTLeft: "├",
|
|
64
|
+
boxTRight: "┤",
|
|
65
|
+
barFull: "█",
|
|
66
|
+
barEmpty: "░",
|
|
67
|
+
barQuarter: "▓",
|
|
68
|
+
barHalf: "▒"
|
|
69
|
+
};
|
|
70
|
+
export function renderProgressBar(options) {
|
|
71
|
+
const { total, current, width, useAnsi, label, suffix } = options;
|
|
72
|
+
if (!useAnsi) {
|
|
73
|
+
const percentage = total > 0 ? Math.round((current / total) * 100) : 0;
|
|
74
|
+
const basicBar = `[${current}/${total}] ${percentage}%`;
|
|
75
|
+
return label ? `${label} ${basicBar}` : basicBar;
|
|
76
|
+
}
|
|
77
|
+
const percentage = total > 0 ? (current / total) : 0;
|
|
78
|
+
const percentText = `${Math.round(percentage * 100)}%`;
|
|
79
|
+
const prefixText = label ? `${label} ` : "";
|
|
80
|
+
const suffixText = suffix ? ` ${ansi.dim}${suffix}${ansi.reset}` : "";
|
|
81
|
+
const statsText = ` ${percentText} ${ansi.dim}${symbols.dot} ${current}/${total}${ansi.reset}`;
|
|
82
|
+
const availableWidth = Math.max(10, width - prefixText.length - statsText.length - suffixText.length - 4);
|
|
83
|
+
const filledWidth = Math.floor(availableWidth * percentage);
|
|
84
|
+
const emptyWidth = availableWidth - filledWidth;
|
|
85
|
+
const bar = `${ansi.cyan}${symbols.barFull.repeat(filledWidth)}${ansi.reset}${ansi.dim}${symbols.barEmpty.repeat(emptyWidth)}${ansi.reset}`;
|
|
86
|
+
return `${prefixText}${bar}${statsText}${suffixText}`;
|
|
87
|
+
}
|
|
88
|
+
export function renderBox(options) {
|
|
89
|
+
const { title, content, width = 50, useAnsi, showDivider = false } = options;
|
|
90
|
+
if (!useAnsi) {
|
|
91
|
+
const lines = [];
|
|
92
|
+
if (title)
|
|
93
|
+
lines.push(`=== ${title} ===`);
|
|
94
|
+
for (const line of content)
|
|
95
|
+
lines.push(line);
|
|
96
|
+
if (title)
|
|
97
|
+
lines.push("=".repeat(title.length + 8));
|
|
98
|
+
return lines.join("\n");
|
|
99
|
+
}
|
|
100
|
+
const lines = [];
|
|
101
|
+
const innerWidth = width - 4;
|
|
102
|
+
const topLine = `${ansi.dim}${symbols.boxTopLeft}${symbols.boxHorizontal.repeat(width - 2)}${symbols.boxTopRight}${ansi.reset}`;
|
|
103
|
+
lines.push(topLine);
|
|
104
|
+
if (title) {
|
|
105
|
+
const titleWithAnsi = `${ansi.bold}${title}${ansi.reset}`;
|
|
106
|
+
lines.push(`${ansi.dim}${symbols.boxVertical}${ansi.reset} ${titleWithAnsi.padEnd(innerWidth + (titleWithAnsi.length - stripAnsi(titleWithAnsi).length), " ")} ${ansi.dim}${symbols.boxVertical}${ansi.reset}`);
|
|
107
|
+
}
|
|
108
|
+
if (showDivider && title) {
|
|
109
|
+
const dividerLine = `${ansi.dim}${symbols.boxTLeft}${symbols.boxHorizontal.repeat(width - 2)}${symbols.boxTRight}${ansi.reset}`;
|
|
110
|
+
lines.push(dividerLine);
|
|
111
|
+
}
|
|
112
|
+
for (const line of content) {
|
|
113
|
+
const strippedLength = stripAnsi(line).length;
|
|
114
|
+
const ansiLength = line.length - strippedLength;
|
|
115
|
+
const paddedLine = line.padEnd(innerWidth + ansiLength, " ");
|
|
116
|
+
lines.push(`${ansi.dim}${symbols.boxVertical}${ansi.reset} ${paddedLine} ${ansi.dim}${symbols.boxVertical}${ansi.reset}`);
|
|
117
|
+
}
|
|
118
|
+
const bottomLine = `${ansi.dim}${symbols.boxBottomLeft}${symbols.boxHorizontal.repeat(width - 2)}${symbols.boxBottomRight}${ansi.reset}`;
|
|
119
|
+
lines.push(bottomLine);
|
|
120
|
+
return lines.join("\n");
|
|
121
|
+
}
|
|
122
|
+
function stripAnsi(text) {
|
|
123
|
+
return text.replaceAll(/\x1B\[[\d;]*m/g, "");
|
|
124
|
+
}
|
|
125
|
+
export function createProgressRenderer(label, useAnsi, isQuiet) {
|
|
126
|
+
let isActive = false;
|
|
127
|
+
let lastUpdate = 0;
|
|
128
|
+
const { width } = getTerminalInfo();
|
|
129
|
+
const cleanup = () => {
|
|
130
|
+
if (!isActive || isQuiet || !useAnsi)
|
|
131
|
+
return;
|
|
132
|
+
process.stdout.write(`${ansi.clearLine}\r`);
|
|
133
|
+
};
|
|
134
|
+
const handleExit = () => {
|
|
135
|
+
cleanup();
|
|
136
|
+
process.stdout.write(ansi.cursorShow);
|
|
137
|
+
};
|
|
138
|
+
return {
|
|
139
|
+
start: () => {
|
|
140
|
+
if (isQuiet)
|
|
141
|
+
return;
|
|
142
|
+
isActive = true;
|
|
143
|
+
if (useAnsi) {
|
|
144
|
+
process.stdout.write(ansi.cursorHide);
|
|
145
|
+
process.once("SIGINT", handleExit);
|
|
146
|
+
process.once("SIGTERM", handleExit);
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
update: (current, total, suffix) => {
|
|
150
|
+
if (!isActive || isQuiet)
|
|
151
|
+
return;
|
|
152
|
+
if (useAnsi) {
|
|
153
|
+
const bar = renderProgressBar({
|
|
154
|
+
total,
|
|
155
|
+
current,
|
|
156
|
+
width,
|
|
157
|
+
useAnsi,
|
|
158
|
+
label,
|
|
159
|
+
suffix
|
|
160
|
+
});
|
|
161
|
+
process.stdout.write(`${ansi.clearLine}\r${bar}`);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
const now = Date.now();
|
|
165
|
+
if (now - lastUpdate < 100 && current < total)
|
|
166
|
+
return;
|
|
167
|
+
lastUpdate = now;
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
finish: (message) => {
|
|
171
|
+
if (!isActive || isQuiet)
|
|
172
|
+
return;
|
|
173
|
+
cleanup();
|
|
174
|
+
if (message && useAnsi)
|
|
175
|
+
console.info(`${ansi.green}${symbols.check}${ansi.reset} ${message}`);
|
|
176
|
+
else if (message)
|
|
177
|
+
console.info(message);
|
|
178
|
+
isActive = false;
|
|
179
|
+
},
|
|
180
|
+
cleanup: () => {
|
|
181
|
+
if (!isActive)
|
|
182
|
+
return;
|
|
183
|
+
cleanup();
|
|
184
|
+
if (useAnsi)
|
|
185
|
+
process.stdout.write(ansi.cursorShow);
|
|
186
|
+
isActive = false;
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usageTracker.d.ts","sourceRoot":"","sources":["../../src/infra/usageTracker.ts"],"names":[],"mappings":"AA0CA,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAO3D;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAElE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
function getConfigDirectory() {
|
|
5
|
+
const home = homedir();
|
|
6
|
+
if (process.platform === "win32")
|
|
7
|
+
return join(process.env.LOCALAPPDATA || join(home, "AppData", "Local"), "fln");
|
|
8
|
+
return join(home, ".config", "fln");
|
|
9
|
+
}
|
|
10
|
+
function getUsageFilePath() {
|
|
11
|
+
return join(getConfigDirectory(), "usage.json");
|
|
12
|
+
}
|
|
13
|
+
async function readUsageStats() {
|
|
14
|
+
try {
|
|
15
|
+
const content = await readFile(getUsageFilePath(), "utf8");
|
|
16
|
+
return JSON.parse(content);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return { runCount: 0, lastRun: new Date().toISOString() };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function writeUsageStats(stats) {
|
|
23
|
+
try {
|
|
24
|
+
const directory = getConfigDirectory();
|
|
25
|
+
await mkdir(directory, { recursive: true });
|
|
26
|
+
await writeFile(getUsageFilePath(), JSON.stringify(stats, null, "\t"));
|
|
27
|
+
}
|
|
28
|
+
catch { }
|
|
29
|
+
}
|
|
30
|
+
export async function incrementUsageCount() {
|
|
31
|
+
const stats = await readUsageStats();
|
|
32
|
+
stats.runCount += 1;
|
|
33
|
+
stats.lastRun = new Date().toISOString();
|
|
34
|
+
await writeUsageStats(stats);
|
|
35
|
+
return stats.runCount;
|
|
36
|
+
}
|
|
37
|
+
export function shouldShowSponsorMessage(runCount) {
|
|
38
|
+
return runCount === 5 || runCount === 25;
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,UAAU,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const VERSION = "1.0.0";
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "fln",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Feed your entire codebase to any LLM in one shot. No attachment limits, no upload hassles.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"cli",
|
|
7
|
+
"filesystem",
|
|
8
|
+
"directory",
|
|
9
|
+
"snapshot",
|
|
10
|
+
"flatten",
|
|
11
|
+
"flat",
|
|
12
|
+
"codebase",
|
|
13
|
+
"llm",
|
|
14
|
+
"prompt",
|
|
15
|
+
"markdown",
|
|
16
|
+
"json"
|
|
17
|
+
],
|
|
18
|
+
"homepage": "https://github.com/nesvet/fln#readme",
|
|
19
|
+
"bugs": {
|
|
20
|
+
"url": "https://github.com/nesvet/fln/issues"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "https://github.com/nesvet/fln.git"
|
|
25
|
+
},
|
|
26
|
+
"funding": {
|
|
27
|
+
"type": "patreon",
|
|
28
|
+
"url": "https://www.patreon.com/nesvet"
|
|
29
|
+
},
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"author": "Eugene Nesvetaev <dev@nesvet.dev> (https://nesvet.dev/)",
|
|
32
|
+
"sideEffects": false,
|
|
33
|
+
"type": "module",
|
|
34
|
+
"exports": {
|
|
35
|
+
".": {
|
|
36
|
+
"types": "./dist/index.d.ts",
|
|
37
|
+
"import": "./dist/index.js"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"main": "./dist/index.js",
|
|
41
|
+
"types": "./dist/index.d.ts",
|
|
42
|
+
"bin": {
|
|
43
|
+
"fln": "./dist/cli/main.js"
|
|
44
|
+
},
|
|
45
|
+
"files": [
|
|
46
|
+
"dist"
|
|
47
|
+
],
|
|
48
|
+
"scripts": {
|
|
49
|
+
"prebuild": "bun run generate:version",
|
|
50
|
+
"build": "bun build --compile --minify --sourcemap ./src/cli/main.ts --outfile fln",
|
|
51
|
+
"prebuild:npm": "bun run generate:version",
|
|
52
|
+
"build:npm": "tsc -p tsconfig.build.json",
|
|
53
|
+
"clean": "rm -rf fln dist",
|
|
54
|
+
"dev": "bun run src/cli/main.ts",
|
|
55
|
+
"generate:examples": "bun run scripts/generate-examples.ts",
|
|
56
|
+
"generate:version": "bun run scripts/generate-version.ts",
|
|
57
|
+
"install:system": "bun run build && echo 'Requesting sudo to move binary to /usr/local/bin...' && sudo mv ./fln /usr/local/bin/fln && echo 'Installed successfully. Run \"fln --help\" to test.'",
|
|
58
|
+
"install:user": "bun run build && mkdir -p \"$HOME/.local/bin\" && mv ./fln \"$HOME/.local/bin/fln\" && echo 'Installed successfully. Run \"fln --help\" to test.'",
|
|
59
|
+
"lint": "eslint .",
|
|
60
|
+
"prepublishOnly": "bun run generate:version && bun run build:npm",
|
|
61
|
+
"test": "bun test",
|
|
62
|
+
"typecheck": "tsc --noEmit"
|
|
63
|
+
},
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"ignore": "^7.0.5",
|
|
66
|
+
"picocolors": "^1.1.1"
|
|
67
|
+
},
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@nesvet/eslint-config": "latest",
|
|
70
|
+
"@types/bun": "latest",
|
|
71
|
+
"@types/node": "latest",
|
|
72
|
+
"typescript": "latest"
|
|
73
|
+
},
|
|
74
|
+
"packageManager": "bun@1.3.9",
|
|
75
|
+
"engines": {
|
|
76
|
+
"bun": ">=1.0.0",
|
|
77
|
+
"node": ">=18.3.0"
|
|
78
|
+
}
|
|
79
|
+
}
|