@fouaden/snipit 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/bin/snipit.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import '../dist/index.js';
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const deleteCommand: Command;
@@ -0,0 +1,20 @@
1
+ import { Command } from 'commander';
2
+ import pc from 'picocolors';
3
+ import { deleteById } from '../utils/storage.js';
4
+ export const deleteCommand = new Command('delete')
5
+ .description('Delete a snippet by ID')
6
+ .argument('<id>', 'The ID of the snippet to delete (get IDs from snipit list)')
7
+ .action((idArg) => {
8
+ const id = parseInt(idArg, 10);
9
+ if (isNaN(id)) {
10
+ console.error(pc.red('✖ ID must be a number. Run snipit list to find IDs.'));
11
+ process.exit(1);
12
+ }
13
+ const deleted = deleteById(id);
14
+ if (!deleted) {
15
+ console.error(pc.red(`✖ No snippet found with ID #${id}`));
16
+ process.exit(1);
17
+ }
18
+ console.log(pc.green(`✔ Deleted snippet #${id}`));
19
+ });
20
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,wBAAwB,CAAC;KACrC,QAAQ,CAAC,MAAM,EAAE,4DAA4D,CAAC;KAC9E,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE;IACxB,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE/B,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAE/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const getCommand: Command;
@@ -0,0 +1,27 @@
1
+ import { Command } from "commander";
2
+ import clipboard from "clipboardy";
3
+ import pc from "picocolors";
4
+ import { getByTitle } from "../utils/storage.js";
5
+ export const getCommand = new Command("get")
6
+ .description("Retrieve a snippet by title")
7
+ .argument("<title>", "The title of the snippet to retrive")
8
+ .option("--copy", "Copy the Code to clipboard automatically")
9
+ .action(async (title, options) => {
10
+ const snippet = getByTitle(title);
11
+ if (!snippet) {
12
+ console.error(pc.red(`✖ No snippet found with title "${title}"`));
13
+ console.error(pc.dim(" Run snipit list to see all saved snippets"));
14
+ process.exit(1);
15
+ }
16
+ console.log("");
17
+ console.log(pc.dim(` # ${snippet.title}`));
18
+ console.log("");
19
+ console.log(snippet.code);
20
+ console.log("");
21
+ if (options.copy) {
22
+ await clipboard.write(snippet.code);
23
+ console.log(pc.green(" ✔ Copied to clipboard"));
24
+ console.log("");
25
+ }
26
+ });
27
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/commands/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,6BAA6B,CAAC;KAC1C,QAAQ,CAAC,SAAS,EAAE,qCAAqC,CAAC;KAC1D,MAAM,CAAC,QAAQ,EAAE,0CAA0C,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAA2B,EAAE,EAAE;IAC3D,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAElC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,kCAAkC,KAAK,GAAG,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const listCommand: Command;
@@ -0,0 +1,36 @@
1
+ import { Command } from 'commander';
2
+ import pc from 'picocolors';
3
+ import { getAll } from '../utils/storage.js';
4
+ export const listCommand = new Command('list')
5
+ .description('List all saved snippets')
6
+ .option('-t, --tag <tag>', 'Filter by tag')
7
+ .option('-s, --search <query>', 'Search snippet titles')
8
+ .action((options) => {
9
+ let snippets = getAll();
10
+ if (options.tag) {
11
+ snippets = snippets.filter((s) => s.tags.includes(options.tag.toLowerCase()));
12
+ }
13
+ if (options.search) {
14
+ const q = options.search.toLowerCase();
15
+ snippets = snippets.filter((s) => s.title.toLowerCase().includes(q));
16
+ }
17
+ if (snippets.length === 0) {
18
+ const hint = options.tag
19
+ ? `No snippets found with tag "${options.tag}"`
20
+ : 'No snippets yet. Use snipit save to add one.';
21
+ console.log(pc.yellow(`\n ${hint}\n`));
22
+ return;
23
+ }
24
+ console.log('');
25
+ for (const s of snippets) {
26
+ const id = pc.bold(pc.cyan(` #${s.id}`));
27
+ const title = pc.white(` ${s.title}`);
28
+ const tags = s.tags.length > 0 ? pc.green(s.tags.join(', ')) + pc.dim(' · ') : '';
29
+ const date = pc.dim(s.createdAt);
30
+ console.log(id);
31
+ console.log(title);
32
+ console.log(` ${tags}${date}`);
33
+ console.log('');
34
+ }
35
+ });
36
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,iBAAiB,EAAE,eAAe,CAAC;KAC1C,MAAM,CAAC,sBAAsB,EAAE,uBAAuB,CAAC;KACvD,MAAM,CAAC,CAAC,OAA0C,EAAE,EAAE;IACrD,IAAI,QAAQ,GAAc,MAAM,EAAE,CAAC;IAEnC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAI,CAAC,WAAW,EAAE,CAAC,CAC5C,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACvC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG;YACtB,CAAC,CAAC,+BAA+B,OAAO,CAAC,GAAG,GAAG;YAC/C,CAAC,CAAC,8CAA8C,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,EAAE,GAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACvC,MAAM,IAAI,GAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,GAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAElC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const saveCommand: Command;
@@ -0,0 +1,52 @@
1
+ import { Command } from "commander";
2
+ import { readFileSync, existsSync } from "fs";
3
+ import pc from "picocolors";
4
+ import { addSnippet } from "../utils/storage.js";
5
+ import { editor } from "@inquirer/prompts";
6
+ const previewCode = (code) => {
7
+ const lines = code.split("\n");
8
+ const preview = lines.slice(0, 3).join("\n");
9
+ const hasMore = lines.length > 3;
10
+ console.log(pc.dim(preview));
11
+ if (hasMore)
12
+ console.log(pc.dim(` ... +${lines.length - 3} more lines`));
13
+ };
14
+ export const saveCommand = new Command("save")
15
+ .description("Save a new snippet")
16
+ .argument("<title>", "The title of the snippet to save")
17
+ .option("-c, --code <code>", "Inline code string")
18
+ .option("-f, --file <path>", "Read code from a file")
19
+ .option("-t, --tag <tags>", 'Comma-separated tags e.g. "ts,async"')
20
+ .action(async (title, options) => {
21
+ let code;
22
+ if (options.file) {
23
+ if (!existsSync(options.file)) {
24
+ console.error(pc.red(`✖ File not found: ${options.file}`));
25
+ process.exit(1);
26
+ }
27
+ code = readFileSync(options.file, "utf-8").trim();
28
+ }
29
+ else if (options.code) {
30
+ code = options.code.trim();
31
+ }
32
+ else {
33
+ code = await editor({
34
+ message: "Write your snippet (saves when you close the editor):",
35
+ });
36
+ if (!code.trim()) {
37
+ console.error(pc.red("✖ Snippet cannot be empty."));
38
+ process.exit(1);
39
+ }
40
+ }
41
+ const tags = options.tag
42
+ ? options.tag.split(",").map((t) => t.trim().toLowerCase())
43
+ : [];
44
+ const snippet = addSnippet({ title, code, tags });
45
+ console.log(pc.green(`\n✔ Saved "${snippet.title}" as #${snippet.id}`));
46
+ if (tags.length > 0)
47
+ console.log(pc.dim(` Tags: ${tags.join(", ")}`));
48
+ console.log("");
49
+ previewCode(snippet.code);
50
+ console.log("");
51
+ });
52
+ //# sourceMappingURL=save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save.js","sourceRoot":"","sources":["../../src/commands/save.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const start: () => void;
@@ -0,0 +1,16 @@
1
+ import { join, dirname } from "path";
2
+ import { fileURLToPath } from "url";
3
+ import { readFileSync } from "fs";
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+ export const start = () => {
6
+ try {
7
+ const pkgPath = join(__dirname, "../../package.json");
8
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
9
+ console.log(`Welcome to Snipit v${pkg.version} `);
10
+ }
11
+ catch (err) {
12
+ console.error("Could not find the package.json file.");
13
+ }
14
+ console.log(`Type "snipit --help" for more information`);
15
+ };
16
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;AAC3D,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ import { Command } from "commander";
2
+ import { getCommand } from "./commands/get.js";
3
+ import { saveCommand } from "./commands/save.js";
4
+ import { deleteCommand } from "./commands/delete.js";
5
+ import { listCommand } from "./commands/list.js";
6
+ const program = new Command();
7
+ program
8
+ .name('snipit')
9
+ .description('A local snippet manager')
10
+ .version('1.0.0');
11
+ // Commands
12
+ program.addCommand(saveCommand);
13
+ program.addCommand(getCommand);
14
+ program.addCommand(deleteCommand);
15
+ program.addCommand(listCommand);
16
+ program.parse(process.argv);
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,yBAAyB,CAAC;KACtC,OAAO,CAAC,OAAO,CAAC,CAAA;AAGjB,WAAW;AACX,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;AAC9B,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;AAGjC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface Snippet {
2
+ id: number;
3
+ title: string;
4
+ code: string;
5
+ tags: string[];
6
+ createdAt: string;
7
+ }
8
+ export interface SnipitStore {
9
+ snippets: Snippet[];
10
+ lastId: number;
11
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { Snippet, SnipitStore } from "../types/index.js";
2
+ export declare function readStore(): SnipitStore;
3
+ export declare function writeStore(store: SnipitStore): void;
4
+ export declare function getAll(): Snippet[];
5
+ export declare function getByTitle(title: string): Snippet | undefined;
6
+ export declare function addSnippet(snippet: Omit<Snippet, "id" | "createdAt">): Snippet;
7
+ export declare function deleteById(id: number): boolean;
@@ -0,0 +1,57 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
2
+ import { homedir } from "os";
3
+ import { join } from "path";
4
+ // ~/.snipit/snippets.json
5
+ const SNIPIT_DIR = join(homedir(), ".snipit");
6
+ const STORE_PATH = join(SNIPIT_DIR, "snippets.json");
7
+ const DEFAULT_STORE = {
8
+ snippets: [],
9
+ lastId: 0,
10
+ };
11
+ function ensureDirExists() {
12
+ if (!existsSync(SNIPIT_DIR)) {
13
+ mkdirSync(SNIPIT_DIR, { recursive: true });
14
+ }
15
+ }
16
+ export function readStore() {
17
+ ensureDirExists();
18
+ if (!existsSync(STORE_PATH)) {
19
+ return { ...DEFAULT_STORE };
20
+ }
21
+ const raw = readFileSync(STORE_PATH, "utf-8");
22
+ return JSON.parse(raw);
23
+ }
24
+ export function writeStore(store) {
25
+ ensureDirExists();
26
+ writeFileSync(STORE_PATH, JSON.stringify(store, null, 2), "utf-8");
27
+ }
28
+ export function getAll() {
29
+ return readStore().snippets;
30
+ }
31
+ export function getByTitle(title) {
32
+ const store = readStore();
33
+ return store.snippets.find((s) => s.title.toLowerCase() === title.toLowerCase());
34
+ }
35
+ export function addSnippet(snippet) {
36
+ const store = readStore();
37
+ const newSnippet = {
38
+ ...snippet,
39
+ id: store.lastId + 1,
40
+ createdAt: new Date().toISOString().split("T")[0],
41
+ };
42
+ store.snippets.push(newSnippet);
43
+ store.lastId = newSnippet.id;
44
+ writeStore(store);
45
+ return newSnippet;
46
+ }
47
+ export function deleteById(id) {
48
+ const store = readStore();
49
+ const lastStoreSize = store.snippets.length;
50
+ store.snippets = store.snippets.filter((s) => s.id != id);
51
+ if (store.snippets.length === lastStoreSize) {
52
+ return false;
53
+ }
54
+ writeStore(store);
55
+ return true;
56
+ }
57
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAQ,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,0BAA0B;AAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;AAErD,MAAM,aAAa,GAAgB;IACjC,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,CAAC;CACV,CAAC;AAEF,SAAS,eAAe;IACtB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,eAAe,EAAE,CAAC;IAClB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;IAC9B,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAkB;IAC3C,eAAe,EAAE,CAAC;IAClB,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,SAAS,EAAE,CAAC,QAAQ,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAE1B,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CACrD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAA0C;IACnE,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAY;QAC1B,GAAG,OAAO;QACV,EAAE,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;QACpB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAClD,CAAC;IACF,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC;IAC7B,UAAU,CAAC,KAAK,CAAC,CAAC;IAClB,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAS;IAChC,MAAM,KAAK,GAAG,SAAS,EAAE,CAAA;IACzB,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAA;IAC3C,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IACzD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAA;IAChB,CAAC;IACD,UAAU,CAAC,KAAK,CAAC,CAAA;IACjB,OAAO,IAAI,CAAA;AAEf,CAAC"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@fouaden/snipit",
3
+ "version": "1.0.0",
4
+ "description": "A lightweight CLI tool to save, search and tag code snippets locally. Stop re-typing; start snipping.",
5
+ "main": "bin/snipit.js",
6
+ "scripts": {
7
+ "dev": "tsx bin/snipit.js",
8
+ "build": "tsc",
9
+ "start": "node bin/snipit.js"
10
+ },
11
+ "bin": {
12
+ "snipit": "./bin/snipit.js"
13
+ },
14
+ "files": ["dist/", "bin/"],
15
+ "keywords": [],
16
+ "author": "fouadbuilds",
17
+ "license": "MIT",
18
+ "type": "module",
19
+ "devDependencies": {
20
+ "@types/node": "^25.3.0",
21
+ "ts-node": "^10.9.2",
22
+ "tsx": "^4.21.0",
23
+ "typescript": "^5.9.3"
24
+ },
25
+ "dependencies": {
26
+ "@inquirer/prompts": "^8.3.0",
27
+ "clipboardy": "^5.3.1",
28
+ "commander": "^14.0.3",
29
+ "picocolors": "^1.1.1",
30
+ "vitest": "^4.0.18"
31
+ }
32
+ }