🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@brndnjs/tokencount

Package Overview
Dependencies
Maintainers
1
Versions
2
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@brndnjs/tokencount - npm Package Compare versions

Comparing version
0.1.3
to
0.1.4
+11
-1
dist/cli.d.ts

@@ -15,3 +15,13 @@ #!/usr/bin/env node

declare function main(argv: string[], streams: Streams): Promise<number>;
/**
* True when this module is the program entry point rather than an import.
*
* `import.meta.url` is always the file's real (symlink-resolved) path, but
* `argv[1]` is the path as invoked — for a globally installed bin that is the
* symlink in node's bin dir, not the real `dist/cli.js`. Resolving `argv[1]`
* through realpath makes the two comparable; a plain `===` silently failed for
* every symlinked invocation, so the CLI ran nothing and exited 0.
*/
declare function isMainModule(metaUrl: string, invokedPath: string | undefined): boolean;
export { main };
export { isMainModule, main };

@@ -7,3 +7,3 @@ #!/usr/bin/env node

// src/cli.ts
import { createReadStream } from "fs";
import { createReadStream, realpathSync } from "fs";
import { createRequire } from "module";

@@ -87,3 +87,12 @@ import { pathToFileURL } from "url";

}
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
function isMainModule(metaUrl, invokedPath) {
if (!invokedPath) return false;
let resolved = invokedPath;
try {
resolved = realpathSync(invokedPath);
} catch {
}
return metaUrl === pathToFileURL(resolved).href;
}
if (isMainModule(import.meta.url, process.argv[1])) {
main(process.argv.slice(2), process).then(

@@ -102,4 +111,5 @@ (code) => {

export {
isMainModule,
main
};
//# sourceMappingURL=cli.js.map
+1
-1

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createReadStream } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport type { Readable, Writable } from \"node:stream\";\nimport { pathToFileURL } from \"node:url\";\nimport { countTokensInStream } from \"./index.js\";\n\nconst HELP = `Usage: tokencount [FILE]...\nCount tokens (o200k_base) in each FILE, or in standard input.\n\nWith no FILE, or when FILE is -, read standard input.\n\n -h, --help display this help and exit\n -v, --version output version information and exit\n`;\n\ninterface Streams {\n stdin: Readable;\n stdout: Writable;\n stderr: Writable;\n}\n\n/**\n * Run the CLI. Streams are injected so the command is testable without spawning\n * a process. Returns the exit code: 0 success, 1 a file could not be read, 2 a\n * bad argument.\n */\nexport async function main(argv: string[], streams: Streams): Promise<number> {\n const files: string[] = [];\n for (const arg of argv) {\n if (arg === \"-h\" || arg === \"--help\") {\n streams.stdout.write(HELP);\n return 0;\n }\n if (arg === \"-v\" || arg === \"--version\") {\n streams.stdout.write(`${readVersion()}\\n`);\n return 0;\n }\n // \"-\" means stdin; any other leading-dash token is an unknown option.\n if (arg.startsWith(\"-\") && arg !== \"-\") {\n streams.stderr.write(`tokencount: unrecognized option '${arg}'\\n`);\n streams.stderr.write(\"Try 'tokencount --help' for more information.\\n\");\n return 2;\n }\n files.push(arg);\n }\n\n // No files: read stdin and print just the count, so output pipes cleanly.\n if (files.length === 0) {\n const count = await countTokensInStream(streams.stdin);\n streams.stdout.write(`${count}\\n`);\n return 0;\n }\n\n const results: Array<{ name: string; count: number }> = [];\n let failed = false;\n for (const file of files) {\n try {\n const source = file === \"-\" ? streams.stdin : createReadStream(file);\n results.push({ name: file, count: await countTokensInStream(source) });\n } catch (error) {\n failed = true;\n streams.stderr.write(`tokencount: ${file}: ${describeError(error)}\\n`);\n }\n }\n\n const total = results.reduce((sum, result) => sum + result.count, 0);\n const width = fieldWidth(results, total, files.length > 1);\n for (const { name, count } of results) {\n streams.stdout.write(`${String(count).padStart(width)} ${name}\\n`);\n }\n if (files.length > 1) {\n streams.stdout.write(`${String(total).padStart(width)} total\\n`);\n }\n return failed ? 1 : 0;\n}\n\n/** Width of the count column, sized to the largest number printed (wc-style). */\nfunction fieldWidth(\n results: ReadonlyArray<{ count: number }>,\n total: number,\n includeTotal: boolean,\n): number {\n const max = results.reduce(\n (m, r) => Math.max(m, r.count),\n includeTotal ? total : 0,\n );\n return String(max).length;\n}\n\n/** Map a filesystem error to a wc-style message. */\nfunction describeError(error: unknown): string {\n const code =\n error && typeof error === \"object\" && \"code\" in error\n ? (error as { code?: string }).code\n : undefined;\n if (code === \"ENOENT\") return \"No such file or directory\";\n if (code === \"EISDIR\") return \"Is a directory\";\n if (code === \"EACCES\") return \"Permission denied\";\n return error instanceof Error ? error.message : String(error);\n}\n\n/** Read the package version for `--version`. Works from dist/ and from src/. */\nfunction readVersion(): string {\n const require = createRequire(import.meta.url);\n return (require(\"../package.json\") as { version: string }).version;\n}\n\n// Run only when executed as the CLI, not when imported by tests.\nif (\n process.argv[1] &&\n import.meta.url === pathToFileURL(process.argv[1]).href\n) {\n main(process.argv.slice(2), process).then(\n (code) => {\n process.exitCode = code;\n },\n (error) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`tokencount: ${message}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":"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","names":["require"]}
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createReadStream, realpathSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport type { Readable, Writable } from \"node:stream\";\nimport { pathToFileURL } from \"node:url\";\nimport { countTokensInStream } from \"./index.js\";\n\nconst HELP = `Usage: tokencount [FILE]...\nCount tokens (o200k_base) in each FILE, or in standard input.\n\nWith no FILE, or when FILE is -, read standard input.\n\n -h, --help display this help and exit\n -v, --version output version information and exit\n`;\n\ninterface Streams {\n stdin: Readable;\n stdout: Writable;\n stderr: Writable;\n}\n\n/**\n * Run the CLI. Streams are injected so the command is testable without spawning\n * a process. Returns the exit code: 0 success, 1 a file could not be read, 2 a\n * bad argument.\n */\nexport async function main(argv: string[], streams: Streams): Promise<number> {\n const files: string[] = [];\n for (const arg of argv) {\n if (arg === \"-h\" || arg === \"--help\") {\n streams.stdout.write(HELP);\n return 0;\n }\n if (arg === \"-v\" || arg === \"--version\") {\n streams.stdout.write(`${readVersion()}\\n`);\n return 0;\n }\n // \"-\" means stdin; any other leading-dash token is an unknown option.\n if (arg.startsWith(\"-\") && arg !== \"-\") {\n streams.stderr.write(`tokencount: unrecognized option '${arg}'\\n`);\n streams.stderr.write(\"Try 'tokencount --help' for more information.\\n\");\n return 2;\n }\n files.push(arg);\n }\n\n // No files: read stdin and print just the count, so output pipes cleanly.\n if (files.length === 0) {\n const count = await countTokensInStream(streams.stdin);\n streams.stdout.write(`${count}\\n`);\n return 0;\n }\n\n const results: Array<{ name: string; count: number }> = [];\n let failed = false;\n for (const file of files) {\n try {\n const source = file === \"-\" ? streams.stdin : createReadStream(file);\n results.push({ name: file, count: await countTokensInStream(source) });\n } catch (error) {\n failed = true;\n streams.stderr.write(`tokencount: ${file}: ${describeError(error)}\\n`);\n }\n }\n\n const total = results.reduce((sum, result) => sum + result.count, 0);\n const width = fieldWidth(results, total, files.length > 1);\n for (const { name, count } of results) {\n streams.stdout.write(`${String(count).padStart(width)} ${name}\\n`);\n }\n if (files.length > 1) {\n streams.stdout.write(`${String(total).padStart(width)} total\\n`);\n }\n return failed ? 1 : 0;\n}\n\n/** Width of the count column, sized to the largest number printed (wc-style). */\nfunction fieldWidth(\n results: ReadonlyArray<{ count: number }>,\n total: number,\n includeTotal: boolean,\n): number {\n const max = results.reduce(\n (m, r) => Math.max(m, r.count),\n includeTotal ? total : 0,\n );\n return String(max).length;\n}\n\n/** Map a filesystem error to a wc-style message. */\nfunction describeError(error: unknown): string {\n const code =\n error && typeof error === \"object\" && \"code\" in error\n ? (error as { code?: string }).code\n : undefined;\n if (code === \"ENOENT\") return \"No such file or directory\";\n if (code === \"EISDIR\") return \"Is a directory\";\n if (code === \"EACCES\") return \"Permission denied\";\n return error instanceof Error ? error.message : String(error);\n}\n\n/** Read the package version for `--version`. Works from dist/ and from src/. */\nfunction readVersion(): string {\n const require = createRequire(import.meta.url);\n return (require(\"../package.json\") as { version: string }).version;\n}\n\n/**\n * True when this module is the program entry point rather than an import.\n *\n * `import.meta.url` is always the file's real (symlink-resolved) path, but\n * `argv[1]` is the path as invoked — for a globally installed bin that is the\n * symlink in node's bin dir, not the real `dist/cli.js`. Resolving `argv[1]`\n * through realpath makes the two comparable; a plain `===` silently failed for\n * every symlinked invocation, so the CLI ran nothing and exited 0.\n */\nexport function isMainModule(\n metaUrl: string,\n invokedPath: string | undefined,\n): boolean {\n if (!invokedPath) return false;\n let resolved = invokedPath;\n try {\n resolved = realpathSync(invokedPath);\n } catch {\n // argv[1] should exist, but if realpath fails fall back to the raw path\n // rather than crashing (which would again silently produce no output).\n }\n return metaUrl === pathToFileURL(resolved).href;\n}\n\n// Run only when executed as the CLI, not when imported by tests.\nif (isMainModule(import.meta.url, process.argv[1])) {\n main(process.argv.slice(2), process).then(\n (code) => {\n process.exitCode = code;\n },\n (error) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`tokencount: ${message}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":"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","names":["require"]}
{
"name": "@brndnjs/tokencount",
"version": "0.1.3",
"version": "0.1.4",
"description": "Count tokens from a file or stdin, wc-style",

@@ -5,0 +5,0 @@ "license": "MIT",