@zfadhli/tokrec 0.12.0 → 0.12.1

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/lib/cli.mjs CHANGED
@@ -26,7 +26,7 @@ function registerRecorderOptions(cmd) {
26
26
  }
27
27
  function parseRecorderOpts(opts) {
28
28
  const user = opts.user;
29
- if (!user) throw new TikTokError("config-error", "<user> is required (positional or --user)");
29
+ if (!user) throw new TikTokError("config-error", "<user> is required (--user or -u)");
30
30
  const parsed = { user: sanitizeUser(user) };
31
31
  if (opts.output) parsed.outputDir = opts.output;
32
32
  if (opts.interval !== void 0) {
@@ -126,38 +126,11 @@ function parseArgs(argv = process.argv) {
126
126
  result = { command: "setup" };
127
127
  });
128
128
  });
129
- if (![
130
- "start",
131
- "stop",
132
- "status",
133
- "setup"
134
- ].includes(argv[2] ?? "")) {
135
- const positionalUser = extractPositional(argv);
136
- if (positionalUser) argv.push("--user", positionalUser);
137
- }
138
129
  cli.parse(argv);
139
130
  if (error) throw new TikTokError("config-error", error);
140
- if (!result) throw new TikTokError("config-error", "<user> is required (positional or --user). Use --help for usage.");
131
+ if (!result) throw new TikTokError("config-error", "<user> is required (--user or -u). Use --help for usage.");
141
132
  return result;
142
133
  }
143
- /**
144
- * Scan argv for the first bare argument that is neither a flag nor a flag's value.
145
- * Returns the value and removes it from the array, or null if none found.
146
- */
147
- function extractPositional(argv) {
148
- for (let i = 2; i < argv.length; i++) {
149
- const arg = argv[i];
150
- if (arg === "--") return argv.splice(i, 1)[0];
151
- if (arg.startsWith("-")) {
152
- const next = argv[i + 1];
153
- if (next && !next.startsWith("-") && arg !== "--help" && arg !== "--version") i++;
154
- continue;
155
- }
156
- argv.splice(i, 1);
157
- return arg;
158
- }
159
- return null;
160
- }
161
134
  //#endregion
162
135
  export { parseArgs };
163
136
 
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":["pkg.version"],"sources":["../../src/lib/cli.ts"],"sourcesContent":["/**\n * CLI argument parser — uses koko-cli's createCLI (wraps cac).\n * Exports a single parseArgs() function.\n */\n\nimport { type CommandBuilder, createCLI } from \"@zfadhli/koko-cli\"\nimport pkg from \"../../package.json\"\nimport type { LogLevel, RecorderConfig } from \"./config\"\nimport { TikTokError } from \"./config\"\nimport { sanitizeUser } from \"./utils\"\n\nexport type CLIResult =\n | { command: \"record\"; config: RecorderConfig }\n | { command: \"start\"; args: string[] }\n | { command: \"stop\"; user?: string }\n | { command: \"status\"; user?: string }\n | { command: \"setup\" }\n\n/** Shared recorder options for both default and start commands. */\nfunction registerRecorderOptions(cmd: CommandBuilder) {\n cmd.option(\"-u, --user <name>\", \"TikTok username (or pass as first argument)\")\n cmd.option(\"-o, --output <dir>\", \"Output directory\", {\n default: \"./recordings\",\n })\n cmd.option(\"-i, --interval <minutes>\", \"Polling interval in minutes\", {\n default: \"3\",\n })\n cmd.option(\"-d, --duration <minutes>\", \"Max recording duration in minutes\")\n cmd.option(\"-p, --proxy <url>\", \"HTTP proxy (e.g. http://127.0.0.1:8080)\")\n cmd.option(\"-l, --log-level <level>\", \"Log level: debug | info | warn | error\")\n cmd.option(\"-c, --cookies <path>\", \"Path to cookies.json\")\n cmd.option(\n \"-s, --segment-minutes <minutes>\",\n \"Segment duration in minutes (default: disabled). Split recording into segments of this length.\",\n )\n cmd.option(\"--normalize\", \"Normalize audio loudness (EBU R128)\")\n cmd.option(\"--normalize-loudness <num>\", \"Target loudness in LUFS (default: -14)\")\n cmd.option(\"--normalize-codec <name>\", \"Audio codec for normalized output (default: libopus)\")\n cmd.option(\"--normalize-bitrate <str>\", \"Audio bitrate for normalized output (default: 96k)\")\n cmd.option(\"--rate <n>\", \"Max API requests per second (default: 5). Set 0 for unlimited.\")\n cmd.option(\"--debug\", \"Show API debug logging on stderr for troubleshooting\")\n}\n\nfunction parseRecorderOpts(opts: Record<string, unknown>): RecorderConfig {\n const user = opts.user as string | undefined\n if (!user) {\n throw new TikTokError(\"config-error\", \"<user> is required (positional or --user)\")\n }\n\n const parsed: RecorderConfig = {\n user: sanitizeUser(user),\n }\n\n if (opts.output) parsed.outputDir = opts.output as string\n if (opts.interval !== undefined) {\n const n = Number(opts.interval)\n if (!Number.isFinite(n) || n < 1) {\n throw new TikTokError(\"config-error\", \"--interval must be a number >= 1\")\n }\n parsed.interval = n\n }\n if (opts.duration !== undefined) {\n const n = Number(opts.duration)\n if (!Number.isFinite(n) || n < 0) {\n throw new TikTokError(\"config-error\", \"--duration must be a number >= 0 (minutes)\")\n }\n parsed.duration = n * 60\n }\n if (opts.proxy) parsed.proxy = opts.proxy as string\n if (opts.logLevel) {\n const levels = [\"debug\", \"info\", \"warn\", \"error\"]\n if (!levels.includes(opts.logLevel as string)) {\n throw new TikTokError(\"config-error\", `--log-level must be one of: ${levels.join(\", \")}`)\n }\n parsed.logLevel = opts.logLevel as LogLevel\n }\n if (opts.cookies) parsed.cookiesPath = opts.cookies as string\n if (opts.segmentMinutes !== undefined) {\n const n = Number(opts.segmentMinutes)\n if (!Number.isFinite(n) || n < 0) {\n throw new TikTokError(\"config-error\", \"--segment-minutes must be a number >= 0\")\n }\n parsed.segmentMinutes = n\n }\n if (opts.normalize !== undefined) parsed.normalizeAudio = opts.normalize as boolean\n if (opts.normalizeLoudness !== undefined) {\n const n = Number(opts.normalizeLoudness)\n if (!Number.isFinite(n)) {\n throw new TikTokError(\"config-error\", \"--normalize-loudness must be a number\")\n }\n parsed.normalizeLoudness = n\n }\n if (opts.normalizeCodec) parsed.normalizeCodec = opts.normalizeCodec as string\n if (opts.normalizeBitrate) parsed.normalizeBitrate = opts.normalizeBitrate as string\n if (opts.rate !== undefined) {\n const n = Number(opts.rate)\n if (!Number.isFinite(n) || n < 0) {\n throw new TikTokError(\"config-error\", \"--rate must be a number >= 0\")\n }\n parsed.ratePerSecond = n\n }\n if (opts.debug) parsed.debug = true\n\n return parsed\n}\n\nexport function parseArgs(argv: string[] = process.argv): CLIResult {\n let result: CLIResult | undefined\n let error: string | undefined\n\n const cli = createCLI(\"tokrec\", pkg.version).description(\n \"Minimal TikTok live stream recorder — Bun + TypeScript\",\n )\n\n cli.command(\"\", \"Record a TikTok live stream\", (cmd) => {\n registerRecorderOptions(cmd)\n cmd.action((opts: Record<string, unknown>) => {\n try {\n result = { command: \"record\", config: parseRecorderOpts(opts) }\n } catch (err) {\n error = err instanceof Error ? err.message : String(err)\n }\n })\n })\n\n cli.command(\"start\", \"Start recorder in a tmux session (survives terminal close)\", (cmd) => {\n registerRecorderOptions(cmd)\n cmd.action((opts: Record<string, unknown>) => {\n try {\n parseRecorderOpts(opts)\n // Pass through original args (minus 'start') to the inner tokrec process\n const args = argv.slice(2).filter((a) => a !== \"start\")\n result = { command: \"start\", args }\n } catch (err) {\n error = err instanceof Error ? err.message : String(err)\n }\n })\n })\n\n cli.command(\"stop\", \"Stop background tmux session(s)\", (cmd) => {\n cmd.option(\"-u, --user <name>\", \"Stop a specific user's session (omit to stop all)\")\n cmd.action((opts: Record<string, unknown>) => {\n result = { command: \"stop\", user: opts.user as string | undefined }\n })\n })\n\n cli.command(\"status\", \"Check tmux session(s)\", (cmd) => {\n cmd.option(\"-u, --user <name>\", \"Check a specific user's session (omit to show all)\")\n cmd.action((opts: Record<string, unknown>) => {\n result = { command: \"status\", user: opts.user as string | undefined }\n })\n })\n\n cli.command(\"setup\", \"Check cookie status or create cookies.json interactively\", (cmd) => {\n cmd.action(() => {\n result = { command: \"setup\" }\n })\n })\n\n // If the first bare argument (not a flag or flag value) looks like a username,\n // convert it to --user for cac (which only handles options on the default command).\n // Skip for subcommands — they have their own option parsing.\n const subcommands = [\"start\", \"stop\", \"status\", \"setup\"]\n if (!subcommands.includes(argv[2] ?? \"\")) {\n const positionalUser = extractPositional(argv)\n if (positionalUser) {\n argv.push(\"--user\", positionalUser)\n }\n }\n\n cli.parse(argv)\n\n if (error) {\n throw new TikTokError(\"config-error\", error)\n }\n\n if (!result) {\n throw new TikTokError(\n \"config-error\",\n \"<user> is required (positional or --user). Use --help for usage.\",\n )\n }\n\n return result\n}\n\n/**\n * Scan argv for the first bare argument that is neither a flag nor a flag's value.\n * Returns the value and removes it from the array, or null if none found.\n */\nfunction extractPositional(argv: string[]): string | null {\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i] as string\n // -- signals end of options; anything after is a positional\n if (arg === \"--\") {\n const pos = argv.splice(i, 1)[0] as string\n return pos\n }\n // If this arg is a flag (-*) the next arg is its value\n if (arg.startsWith(\"-\")) {\n // Skip the value if this flag takes one (not a boolean flag like --help/--version)\n const next = argv[i + 1]\n if (next && !next.startsWith(\"-\") && arg !== \"--help\" && arg !== \"--version\") {\n i++ // skip the value\n }\n continue\n }\n // Found a bare positional — remove it and return\n argv.splice(i, 1)\n return arg\n }\n return null\n}\n"],"mappings":";;;;;;;;;;AAmBA,SAAS,wBAAwB,KAAqB;CACpD,IAAI,OAAO,qBAAqB,6CAA6C;CAC7E,IAAI,OAAO,sBAAsB,oBAAoB,EACnD,SAAS,eACX,CAAC;CACD,IAAI,OAAO,4BAA4B,+BAA+B,EACpE,SAAS,IACX,CAAC;CACD,IAAI,OAAO,4BAA4B,mCAAmC;CAC1E,IAAI,OAAO,qBAAqB,yCAAyC;CACzE,IAAI,OAAO,2BAA2B,wCAAwC;CAC9E,IAAI,OAAO,wBAAwB,sBAAsB;CACzD,IAAI,OACF,mCACA,gGACF;CACA,IAAI,OAAO,eAAe,qCAAqC;CAC/D,IAAI,OAAO,8BAA8B,wCAAwC;CACjF,IAAI,OAAO,4BAA4B,sDAAsD;CAC7F,IAAI,OAAO,6BAA6B,oDAAoD;CAC5F,IAAI,OAAO,cAAc,gEAAgE;CACzF,IAAI,OAAO,WAAW,sDAAsD;AAC9E;AAEA,SAAS,kBAAkB,MAA+C;CACxE,MAAM,OAAO,KAAK;CAClB,IAAI,CAAC,MACH,MAAM,IAAI,YAAY,gBAAgB,2CAA2C;CAGnF,MAAM,SAAyB,EAC7B,MAAM,aAAa,IAAI,EACzB;CAEA,IAAI,KAAK,QAAQ,OAAO,YAAY,KAAK;CACzC,IAAI,KAAK,aAAa,KAAA,GAAW;EAC/B,MAAM,IAAI,OAAO,KAAK,QAAQ;EAC9B,IAAI,CAAC,OAAO,SAAS,CAAC,KAAK,IAAI,GAC7B,MAAM,IAAI,YAAY,gBAAgB,kCAAkC;EAE1E,OAAO,WAAW;CACpB;CACA,IAAI,KAAK,aAAa,KAAA,GAAW;EAC/B,MAAM,IAAI,OAAO,KAAK,QAAQ;EAC9B,IAAI,CAAC,OAAO,SAAS,CAAC,KAAK,IAAI,GAC7B,MAAM,IAAI,YAAY,gBAAgB,4CAA4C;EAEpF,OAAO,WAAW,IAAI;CACxB;CACA,IAAI,KAAK,OAAO,OAAO,QAAQ,KAAK;CACpC,IAAI,KAAK,UAAU;EACjB,MAAM,SAAS;GAAC;GAAS;GAAQ;GAAQ;EAAO;EAChD,IAAI,CAAC,OAAO,SAAS,KAAK,QAAkB,GAC1C,MAAM,IAAI,YAAY,gBAAgB,+BAA+B,OAAO,KAAK,IAAI,GAAG;EAE1F,OAAO,WAAW,KAAK;CACzB;CACA,IAAI,KAAK,SAAS,OAAO,cAAc,KAAK;CAC5C,IAAI,KAAK,mBAAmB,KAAA,GAAW;EACrC,MAAM,IAAI,OAAO,KAAK,cAAc;EACpC,IAAI,CAAC,OAAO,SAAS,CAAC,KAAK,IAAI,GAC7B,MAAM,IAAI,YAAY,gBAAgB,yCAAyC;EAEjF,OAAO,iBAAiB;CAC1B;CACA,IAAI,KAAK,cAAc,KAAA,GAAW,OAAO,iBAAiB,KAAK;CAC/D,IAAI,KAAK,sBAAsB,KAAA,GAAW;EACxC,MAAM,IAAI,OAAO,KAAK,iBAAiB;EACvC,IAAI,CAAC,OAAO,SAAS,CAAC,GACpB,MAAM,IAAI,YAAY,gBAAgB,uCAAuC;EAE/E,OAAO,oBAAoB;CAC7B;CACA,IAAI,KAAK,gBAAgB,OAAO,iBAAiB,KAAK;CACtD,IAAI,KAAK,kBAAkB,OAAO,mBAAmB,KAAK;CAC1D,IAAI,KAAK,SAAS,KAAA,GAAW;EAC3B,MAAM,IAAI,OAAO,KAAK,IAAI;EAC1B,IAAI,CAAC,OAAO,SAAS,CAAC,KAAK,IAAI,GAC7B,MAAM,IAAI,YAAY,gBAAgB,8BAA8B;EAEtE,OAAO,gBAAgB;CACzB;CACA,IAAI,KAAK,OAAO,OAAO,QAAQ;CAE/B,OAAO;AACT;AAEA,SAAgB,UAAU,OAAiB,QAAQ,MAAiB;CAClE,IAAI;CACJ,IAAI;CAEJ,MAAM,MAAM,UAAU,UAAUA,OAAW,CAAC,CAAC,YAC3C,wDACF;CAEA,IAAI,QAAQ,IAAI,gCAAgC,QAAQ;EACtD,wBAAwB,GAAG;EAC3B,IAAI,QAAQ,SAAkC;GAC5C,IAAI;IACF,SAAS;KAAE,SAAS;KAAU,QAAQ,kBAAkB,IAAI;IAAE;GAChE,SAAS,KAAK;IACZ,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;GACzD;EACF,CAAC;CACH,CAAC;CAED,IAAI,QAAQ,SAAS,+DAA+D,QAAQ;EAC1F,wBAAwB,GAAG;EAC3B,IAAI,QAAQ,SAAkC;GAC5C,IAAI;IACF,kBAAkB,IAAI;IAGtB,SAAS;KAAE,SAAS;KAAS,MADhB,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,MAAM,OACf;IAAE;GACpC,SAAS,KAAK;IACZ,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;GACzD;EACF,CAAC;CACH,CAAC;CAED,IAAI,QAAQ,QAAQ,oCAAoC,QAAQ;EAC9D,IAAI,OAAO,qBAAqB,mDAAmD;EACnF,IAAI,QAAQ,SAAkC;GAC5C,SAAS;IAAE,SAAS;IAAQ,MAAM,KAAK;GAA2B;EACpE,CAAC;CACH,CAAC;CAED,IAAI,QAAQ,UAAU,0BAA0B,QAAQ;EACtD,IAAI,OAAO,qBAAqB,oDAAoD;EACpF,IAAI,QAAQ,SAAkC;GAC5C,SAAS;IAAE,SAAS;IAAU,MAAM,KAAK;GAA2B;EACtE,CAAC;CACH,CAAC;CAED,IAAI,QAAQ,SAAS,6DAA6D,QAAQ;EACxF,IAAI,aAAa;GACf,SAAS,EAAE,SAAS,QAAQ;EAC9B,CAAC;CACH,CAAC;CAMD,IAAI,CAAC;EADgB;EAAS;EAAQ;EAAU;CACjC,CAAC,CAAC,SAAS,KAAK,MAAM,EAAE,GAAG;EACxC,MAAM,iBAAiB,kBAAkB,IAAI;EAC7C,IAAI,gBACF,KAAK,KAAK,UAAU,cAAc;CAEtC;CAEA,IAAI,MAAM,IAAI;CAEd,IAAI,OACF,MAAM,IAAI,YAAY,gBAAgB,KAAK;CAG7C,IAAI,CAAC,QACH,MAAM,IAAI,YACR,gBACA,kEACF;CAGF,OAAO;AACT;;;;;AAMA,SAAS,kBAAkB,MAA+B;CACxD,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,MAAM,KAAK;EAEjB,IAAI,QAAQ,MAEV,OADY,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC;EAIhC,IAAI,IAAI,WAAW,GAAG,GAAG;GAEvB,MAAM,OAAO,KAAK,IAAI;GACtB,IAAI,QAAQ,CAAC,KAAK,WAAW,GAAG,KAAK,QAAQ,YAAY,QAAQ,aAC/D;GAEF;EACF;EAEA,KAAK,OAAO,GAAG,CAAC;EAChB,OAAO;CACT;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"cli.mjs","names":["pkg.version"],"sources":["../../src/lib/cli.ts"],"sourcesContent":["/**\n * CLI argument parser — uses koko-cli's createCLI (wraps cac).\n * Exports a single parseArgs() function.\n */\n\nimport { type CommandBuilder, createCLI } from \"@zfadhli/koko-cli\"\nimport pkg from \"../../package.json\"\nimport type { LogLevel, RecorderConfig } from \"./config\"\nimport { TikTokError } from \"./config\"\nimport { sanitizeUser } from \"./utils\"\n\nexport type CLIResult =\n | { command: \"record\"; config: RecorderConfig }\n | { command: \"start\"; args: string[] }\n | { command: \"stop\"; user?: string }\n | { command: \"status\"; user?: string }\n | { command: \"setup\" }\n\n/** Shared recorder options for both default and start commands. */\nfunction registerRecorderOptions(cmd: CommandBuilder) {\n cmd.option(\"-u, --user <name>\", \"TikTok username (or pass as first argument)\")\n cmd.option(\"-o, --output <dir>\", \"Output directory\", {\n default: \"./recordings\",\n })\n cmd.option(\"-i, --interval <minutes>\", \"Polling interval in minutes\", {\n default: \"3\",\n })\n cmd.option(\"-d, --duration <minutes>\", \"Max recording duration in minutes\")\n cmd.option(\"-p, --proxy <url>\", \"HTTP proxy (e.g. http://127.0.0.1:8080)\")\n cmd.option(\"-l, --log-level <level>\", \"Log level: debug | info | warn | error\")\n cmd.option(\"-c, --cookies <path>\", \"Path to cookies.json\")\n cmd.option(\n \"-s, --segment-minutes <minutes>\",\n \"Segment duration in minutes (default: disabled). Split recording into segments of this length.\",\n )\n cmd.option(\"--normalize\", \"Normalize audio loudness (EBU R128)\")\n cmd.option(\"--normalize-loudness <num>\", \"Target loudness in LUFS (default: -14)\")\n cmd.option(\"--normalize-codec <name>\", \"Audio codec for normalized output (default: libopus)\")\n cmd.option(\"--normalize-bitrate <str>\", \"Audio bitrate for normalized output (default: 96k)\")\n cmd.option(\"--rate <n>\", \"Max API requests per second (default: 5). Set 0 for unlimited.\")\n cmd.option(\"--debug\", \"Show API debug logging on stderr for troubleshooting\")\n}\n\nfunction parseRecorderOpts(opts: Record<string, unknown>): RecorderConfig {\n const user = opts.user as string | undefined\n if (!user) {\n throw new TikTokError(\"config-error\", \"<user> is required (--user or -u)\")\n }\n\n const parsed: RecorderConfig = {\n user: sanitizeUser(user),\n }\n\n if (opts.output) parsed.outputDir = opts.output as string\n if (opts.interval !== undefined) {\n const n = Number(opts.interval)\n if (!Number.isFinite(n) || n < 1) {\n throw new TikTokError(\"config-error\", \"--interval must be a number >= 1\")\n }\n parsed.interval = n\n }\n if (opts.duration !== undefined) {\n const n = Number(opts.duration)\n if (!Number.isFinite(n) || n < 0) {\n throw new TikTokError(\"config-error\", \"--duration must be a number >= 0 (minutes)\")\n }\n parsed.duration = n * 60\n }\n if (opts.proxy) parsed.proxy = opts.proxy as string\n if (opts.logLevel) {\n const levels = [\"debug\", \"info\", \"warn\", \"error\"]\n if (!levels.includes(opts.logLevel as string)) {\n throw new TikTokError(\"config-error\", `--log-level must be one of: ${levels.join(\", \")}`)\n }\n parsed.logLevel = opts.logLevel as LogLevel\n }\n if (opts.cookies) parsed.cookiesPath = opts.cookies as string\n if (opts.segmentMinutes !== undefined) {\n const n = Number(opts.segmentMinutes)\n if (!Number.isFinite(n) || n < 0) {\n throw new TikTokError(\"config-error\", \"--segment-minutes must be a number >= 0\")\n }\n parsed.segmentMinutes = n\n }\n if (opts.normalize !== undefined) parsed.normalizeAudio = opts.normalize as boolean\n if (opts.normalizeLoudness !== undefined) {\n const n = Number(opts.normalizeLoudness)\n if (!Number.isFinite(n)) {\n throw new TikTokError(\"config-error\", \"--normalize-loudness must be a number\")\n }\n parsed.normalizeLoudness = n\n }\n if (opts.normalizeCodec) parsed.normalizeCodec = opts.normalizeCodec as string\n if (opts.normalizeBitrate) parsed.normalizeBitrate = opts.normalizeBitrate as string\n if (opts.rate !== undefined) {\n const n = Number(opts.rate)\n if (!Number.isFinite(n) || n < 0) {\n throw new TikTokError(\"config-error\", \"--rate must be a number >= 0\")\n }\n parsed.ratePerSecond = n\n }\n if (opts.debug) parsed.debug = true\n\n return parsed\n}\n\nexport function parseArgs(argv: string[] = process.argv): CLIResult {\n let result: CLIResult | undefined\n let error: string | undefined\n\n const cli = createCLI(\"tokrec\", pkg.version).description(\n \"Minimal TikTok live stream recorder — Bun + TypeScript\",\n )\n\n cli.command(\"\", \"Record a TikTok live stream\", (cmd) => {\n registerRecorderOptions(cmd)\n cmd.action((opts: Record<string, unknown>) => {\n try {\n result = { command: \"record\", config: parseRecorderOpts(opts) }\n } catch (err) {\n error = err instanceof Error ? err.message : String(err)\n }\n })\n })\n\n cli.command(\"start\", \"Start recorder in a tmux session (survives terminal close)\", (cmd) => {\n registerRecorderOptions(cmd)\n cmd.action((opts: Record<string, unknown>) => {\n try {\n parseRecorderOpts(opts)\n // Pass through original args (minus 'start') to the inner tokrec process\n const args = argv.slice(2).filter((a) => a !== \"start\")\n result = { command: \"start\", args }\n } catch (err) {\n error = err instanceof Error ? err.message : String(err)\n }\n })\n })\n\n cli.command(\"stop\", \"Stop background tmux session(s)\", (cmd) => {\n cmd.option(\"-u, --user <name>\", \"Stop a specific user's session (omit to stop all)\")\n cmd.action((opts: Record<string, unknown>) => {\n result = { command: \"stop\", user: opts.user as string | undefined }\n })\n })\n\n cli.command(\"status\", \"Check tmux session(s)\", (cmd) => {\n cmd.option(\"-u, --user <name>\", \"Check a specific user's session (omit to show all)\")\n cmd.action((opts: Record<string, unknown>) => {\n result = { command: \"status\", user: opts.user as string | undefined }\n })\n })\n\n cli.command(\"setup\", \"Check cookie status or create cookies.json interactively\", (cmd) => {\n cmd.action(() => {\n result = { command: \"setup\" }\n })\n })\n\n cli.parse(argv)\n\n if (error) {\n throw new TikTokError(\"config-error\", error)\n }\n\n if (!result) {\n throw new TikTokError(\n \"config-error\",\n \"<user> is required (--user or -u). Use --help for usage.\",\n )\n }\n\n return result\n}\n"],"mappings":"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"}
package/dist/package.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "0.12.0";
2
+ var version = "0.12.1";
3
3
  //#endregion
4
4
  export { version };
5
5
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zfadhli/tokrec",
3
- "version": "0.12.0",
3
+ "version": "0.12.1",
4
4
  "description": "Minimal TikTok live stream recorder — Bun + TypeScript",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",