Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions bin/cuid2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
#!/usr/bin/env node

import { createId, init } from "../index.js";
import { writeFileSync, readFileSync, existsSync } from "fs";
import { homedir } from "os";
import { join } from "path";

const args = process.argv.slice(2);

// Handle --help
if (args.includes("--help") || args.includes("-h")) {
console.log(`
cuid2 - Secure, collision-resistant ID generator

Usage: cuid2 [count] [options]

Arguments:
count Number of IDs to generate (default: 1)

Options:
--slug Generate a short 5-character ID
--length <n> Custom ID length (default: 24)
--fingerprint <s> Custom fingerprint for ID generation
--install Install shell alias 'cuid' → 'npx @paralleldrive/cuid2'
--help, -h Show this help message

Examples:
cuid2 # Generate one ID
cuid2 5 # Generate 5 IDs
cuid2 --slug # Generate a short ID (5 chars)
cuid2 --length 10 # Generate 10-character ID
cuid2 --fingerprint "server1" # Generate ID with custom fingerprint
cuid2 --install # Install shell alias
`);
process.exit(0);
}

// Handle --install-alias
if (args.includes("--install")) {
const shellConfigFiles = [".zshrc", ".bashrc", ".bash_profile", ".profile"];

const aliasCommand = 'alias cuid="npx @paralleldrive/cuid2"';
const home = homedir();

let installed = false;

for (const configFile of shellConfigFiles) {
const configPath = join(home, configFile);

if (existsSync(configPath)) {
const content = readFileSync(configPath, "utf8");

// Check if alias already exists
if (content.includes("alias cuid=")) {
console.log(`✓ Alias already exists in ${configFile}`);
installed = true;
} else {
// Add alias to config file
const newContent = content + `\n\n# CUID2 alias\n${aliasCommand}\n`;
writeFileSync(configPath, newContent, "utf8");
console.log(`✓ Alias added to ${configFile}`);
console.log(` Run: source ~/${configFile}`);
installed = true;
}
}
}

if (!installed) {
console.log("✗ No shell config file found");
console.log(` You can manually add: ${aliasCommand}`);
process.exit(1);
}

process.exit(0);
}

// Parse arguments
const getArgValue = (flag) => {
const index = args.indexOf(flag);
return index !== -1 && args[index + 1] ? args[index + 1] : null;
};

const hasSlug = args.includes("--slug");
const lengthArg = getArgValue("--length");
const fingerprintArg = getArgValue("--fingerprint");
const countArg = args.find(
(arg) => !arg.startsWith("--") && arg !== lengthArg && arg !== fingerprintArg
);
const count = parseInt(countArg) || 1;

// Build init options
const options = {};
if (hasSlug) {
options.length = 5;
} else if (lengthArg) {
options.length = parseInt(lengthArg);
}
if (fingerprintArg) {
options.fingerprint = fingerprintArg;
}

// Create generator
const generator = Object.keys(options).length > 0 ? init(options) : createId;

// Generate IDs
for (let i = 0; i < count; i++) {
console.log(generator());
}
10 changes: 5 additions & 5 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const { createId, init, getConstants, isCuid } = require("./src/index");
import { createId, init, getConstants, isCuid } from "./src/index.js";

module.exports.createId = createId;
module.exports.init = init;
module.exports.getConstants = getConstants;
module.exports.isCuid = isCuid;
export { createId };
export { init };
export { getConstants };
export { isCuid };
2 changes: 1 addition & 1 deletion next.config.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module.exports = {
reactStrictMode: true,
}
};
Loading
Loading