safeword 0.8.9 → 0.9.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.
@@ -1,100 +0,0 @@
1
- import {
2
- createProjectContext,
3
- error,
4
- header,
5
- info,
6
- isGitRepo,
7
- listItem,
8
- reconcile,
9
- success,
10
- warn
11
- } from "./chunk-KQ6BLN6W.js";
12
- import {
13
- SAFEWORD_SCHEMA,
14
- exists,
15
- writeJson
16
- } from "./chunk-CLSGXTOL.js";
17
- import {
18
- VERSION
19
- } from "./chunk-ORQHKDT2.js";
20
-
21
- // src/commands/setup.ts
22
- import { execSync } from "child_process";
23
- import nodePath from "path";
24
- function printChangesSummary(created, updated, packageJsonCreated) {
25
- if (created.length > 0 || packageJsonCreated) {
26
- info("\nCreated:");
27
- if (packageJsonCreated) listItem("package.json");
28
- for (const file of created) listItem(file);
29
- }
30
- if (updated.length > 0) {
31
- info("\nModified:");
32
- for (const file of updated) listItem(file);
33
- }
34
- }
35
- async function setup(options) {
36
- const cwd = process.cwd();
37
- const safewordDirectory = nodePath.join(cwd, ".safeword");
38
- if (exists(safewordDirectory)) {
39
- error("Already configured. Run `safeword upgrade` to update.");
40
- process.exit(1);
41
- }
42
- const packageJsonPath = nodePath.join(cwd, "package.json");
43
- let packageJsonCreated = false;
44
- if (!exists(packageJsonPath)) {
45
- const dirName = nodePath.basename(cwd) || "project";
46
- const defaultPackageJson = {
47
- name: dirName,
48
- version: "0.1.0",
49
- scripts: {}
50
- };
51
- writeJson(packageJsonPath, defaultPackageJson);
52
- packageJsonCreated = true;
53
- }
54
- const isNonInteractive = options.yes || !process.stdin.isTTY;
55
- header("Safeword Setup");
56
- info(`Version: ${VERSION}`);
57
- if (packageJsonCreated) {
58
- info("Created package.json (none found)");
59
- }
60
- try {
61
- info("\nCreating safeword configuration...");
62
- const ctx = createProjectContext(cwd);
63
- const result = await reconcile(SAFEWORD_SCHEMA, "install", ctx);
64
- success("Created .safeword directory and configuration");
65
- if (result.packagesToInstall.length > 0) {
66
- info("\nInstalling linting dependencies...");
67
- try {
68
- const installCmd = `npm install -D ${result.packagesToInstall.join(" ")}`;
69
- info(`Running: ${installCmd}`);
70
- execSync(installCmd, { cwd, stdio: "inherit" });
71
- success("Installed linting dependencies");
72
- } catch {
73
- warn("Failed to install dependencies. Run manually:");
74
- listItem(`npm install -D ${result.packagesToInstall.join(" ")}`);
75
- }
76
- }
77
- if (!isGitRepo(cwd)) {
78
- if (isNonInteractive) {
79
- warn("Skipped Husky setup (no git repository)");
80
- } else {
81
- warn("Skipped Husky setup (no .git directory)");
82
- info("Initialize git and run safeword upgrade to enable pre-commit hooks");
83
- }
84
- }
85
- header("Setup Complete");
86
- printChangesSummary(result.created, result.updated, packageJsonCreated);
87
- info("\nNext steps:");
88
- listItem("Run `safeword check` to verify setup");
89
- listItem("Commit the new files to git");
90
- success(`
91
- Safeword ${VERSION} installed successfully!`);
92
- } catch (error_) {
93
- error(`Setup failed: ${error_ instanceof Error ? error_.message : "Unknown error"}`);
94
- process.exit(1);
95
- }
96
- }
97
- export {
98
- setup
99
- };
100
- //# sourceMappingURL=setup-QUUJ7SH3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/setup.ts"],"sourcesContent":["/**\n * Setup command - Initialize safeword in a project\n *\n * Uses reconcile() with mode='install' to create all managed files.\n */\n\nimport { execSync } from 'node:child_process';\nimport nodePath from 'node:path';\n\nimport { reconcile } from '../reconcile.js';\nimport { SAFEWORD_SCHEMA } from '../schema.js';\nimport { createProjectContext } from '../utils/context.js';\nimport { exists, writeJson } from '../utils/fs.js';\nimport { isGitRepo } from '../utils/git.js';\nimport { error, header, info, listItem, success, warn } from '../utils/output.js';\nimport { VERSION } from '../version.js';\n\nexport interface SetupOptions {\n yes?: boolean;\n}\n\ninterface PackageJson {\n name?: string;\n version?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n 'lint-staged'?: Record<string, string[]>;\n}\n\n/**\n * Print file changes summary\n * @param created\n * @param updated\n * @param packageJsonCreated\n */\nfunction printChangesSummary(\n created: string[],\n updated: string[],\n packageJsonCreated: boolean,\n): void {\n if (created.length > 0 || packageJsonCreated) {\n info('\\nCreated:');\n if (packageJsonCreated) listItem('package.json');\n for (const file of created) listItem(file);\n }\n\n if (updated.length > 0) {\n info('\\nModified:');\n for (const file of updated) listItem(file);\n }\n}\n\n/**\n *\n * @param options\n */\nexport async function setup(options: SetupOptions): Promise<void> {\n const cwd = process.cwd();\n const safewordDirectory = nodePath.join(cwd, '.safeword');\n\n // Check if already configured\n if (exists(safewordDirectory)) {\n error('Already configured. Run `safeword upgrade` to update.');\n process.exit(1);\n }\n\n // Check for package.json, create if missing\n const packageJsonPath = nodePath.join(cwd, 'package.json');\n let packageJsonCreated = false;\n if (!exists(packageJsonPath)) {\n const dirName = nodePath.basename(cwd) || 'project';\n const defaultPackageJson: PackageJson = {\n name: dirName,\n version: '0.1.0',\n scripts: {},\n };\n writeJson(packageJsonPath, defaultPackageJson);\n packageJsonCreated = true;\n }\n\n const isNonInteractive = options.yes || !process.stdin.isTTY;\n\n header('Safeword Setup');\n info(`Version: ${VERSION}`);\n\n if (packageJsonCreated) {\n info('Created package.json (none found)');\n }\n\n try {\n // Use reconcile with mode='install' to create all managed files\n info('\\nCreating safeword configuration...');\n const ctx = createProjectContext(cwd);\n const result = await reconcile(SAFEWORD_SCHEMA, 'install', ctx);\n\n success('Created .safeword directory and configuration');\n\n // Install npm dependencies\n if (result.packagesToInstall.length > 0) {\n info('\\nInstalling linting dependencies...');\n\n try {\n const installCmd = `npm install -D ${result.packagesToInstall.join(' ')}`;\n info(`Running: ${installCmd}`);\n\n execSync(installCmd, { cwd, stdio: 'inherit' });\n success('Installed linting dependencies');\n } catch {\n warn('Failed to install dependencies. Run manually:');\n listItem(`npm install -D ${result.packagesToInstall.join(' ')}`);\n }\n }\n\n // Report Husky status\n if (!isGitRepo(cwd)) {\n if (isNonInteractive) {\n warn('Skipped Husky setup (no git repository)');\n } else {\n warn('Skipped Husky setup (no .git directory)');\n info('Initialize git and run safeword upgrade to enable pre-commit hooks');\n }\n }\n\n // Print summary\n header('Setup Complete');\n printChangesSummary(result.created, result.updated, packageJsonCreated);\n\n info('\\nNext steps:');\n listItem('Run `safeword check` to verify setup');\n listItem('Commit the new files to git');\n\n success(`\\nSafeword ${VERSION} installed successfully!`);\n } catch (error_) {\n error(`Setup failed: ${error_ instanceof Error ? error_.message : 'Unknown error'}`);\n process.exit(1);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAMA,SAAS,gBAAgB;AACzB,OAAO,cAAc;AA6BrB,SAAS,oBACP,SACA,SACA,oBACM;AACN,MAAI,QAAQ,SAAS,KAAK,oBAAoB;AAC5C,SAAK,YAAY;AACjB,QAAI,mBAAoB,UAAS,cAAc;AAC/C,eAAW,QAAQ,QAAS,UAAS,IAAI;AAAA,EAC3C;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,SAAK,aAAa;AAClB,eAAW,QAAQ,QAAS,UAAS,IAAI;AAAA,EAC3C;AACF;AAMA,eAAsB,MAAM,SAAsC;AAChE,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,oBAAoB,SAAS,KAAK,KAAK,WAAW;AAGxD,MAAI,OAAO,iBAAiB,GAAG;AAC7B,UAAM,uDAAuD;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,kBAAkB,SAAS,KAAK,KAAK,cAAc;AACzD,MAAI,qBAAqB;AACzB,MAAI,CAAC,OAAO,eAAe,GAAG;AAC5B,UAAM,UAAU,SAAS,SAAS,GAAG,KAAK;AAC1C,UAAM,qBAAkC;AAAA,MACtC,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAAC;AAAA,IACZ;AACA,cAAU,iBAAiB,kBAAkB;AAC7C,yBAAqB;AAAA,EACvB;AAEA,QAAM,mBAAmB,QAAQ,OAAO,CAAC,QAAQ,MAAM;AAEvD,SAAO,gBAAgB;AACvB,OAAK,YAAY,OAAO,EAAE;AAE1B,MAAI,oBAAoB;AACtB,SAAK,mCAAmC;AAAA,EAC1C;AAEA,MAAI;AAEF,SAAK,sCAAsC;AAC3C,UAAM,MAAM,qBAAqB,GAAG;AACpC,UAAM,SAAS,MAAM,UAAU,iBAAiB,WAAW,GAAG;AAE9D,YAAQ,+CAA+C;AAGvD,QAAI,OAAO,kBAAkB,SAAS,GAAG;AACvC,WAAK,sCAAsC;AAE3C,UAAI;AACF,cAAM,aAAa,kBAAkB,OAAO,kBAAkB,KAAK,GAAG,CAAC;AACvE,aAAK,YAAY,UAAU,EAAE;AAE7B,iBAAS,YAAY,EAAE,KAAK,OAAO,UAAU,CAAC;AAC9C,gBAAQ,gCAAgC;AAAA,MAC1C,QAAQ;AACN,aAAK,+CAA+C;AACpD,iBAAS,kBAAkB,OAAO,kBAAkB,KAAK,GAAG,CAAC,EAAE;AAAA,MACjE;AAAA,IACF;AAGA,QAAI,CAAC,UAAU,GAAG,GAAG;AACnB,UAAI,kBAAkB;AACpB,aAAK,yCAAyC;AAAA,MAChD,OAAO;AACL,aAAK,yCAAyC;AAC9C,aAAK,oEAAoE;AAAA,MAC3E;AAAA,IACF;AAGA,WAAO,gBAAgB;AACvB,wBAAoB,OAAO,SAAS,OAAO,SAAS,kBAAkB;AAEtE,SAAK,eAAe;AACpB,aAAS,sCAAsC;AAC/C,aAAS,6BAA6B;AAEtC,YAAQ;AAAA,WAAc,OAAO,0BAA0B;AAAA,EACzD,SAAS,QAAQ;AACf,UAAM,iBAAiB,kBAAkB,QAAQ,OAAO,UAAU,eAAe,EAAE;AACnF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;","names":[]}
@@ -1,9 +0,0 @@
1
- import {
2
- sync
3
- } from "./chunk-4URRFBUS.js";
4
- import "./chunk-CLSGXTOL.js";
5
- import "./chunk-ORQHKDT2.js";
6
- export {
7
- sync
8
- };
9
- //# sourceMappingURL=sync-ISBJ7X2T.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/upgrade.ts"],"sourcesContent":["/**\n * Upgrade command - Update safeword configuration to latest version\n *\n * Uses reconcile() with mode='upgrade' to update all managed files.\n */\n\nimport nodePath from 'node:path';\n\nimport { reconcile } from '../reconcile.js';\nimport { SAFEWORD_SCHEMA } from '../schema.js';\nimport { createProjectContext } from '../utils/context.js';\nimport { exists, readFileSafe } from '../utils/fs.js';\nimport { error, header, info, listItem, success, warn } from '../utils/output.js';\nimport { compareVersions } from '../utils/version.js';\nimport { VERSION } from '../version.js';\nimport { sync } from './sync.js';\n\n/**\n * Print info about deprecated packages that can be removed.\n * Does NOT auto-remove because user may have installed these independently.\n * @param packages - List of package names that are deprecated\n */\nfunction printDeprecatedPackagesInfo(packages: string[]): void {\n if (packages.length === 0) return;\n\n warn(`\\n${packages.length} package(s) are now bundled in eslint-plugin-safeword:`);\n for (const pkg of packages) {\n listItem(pkg);\n }\n info(\"\\nIf you don't use these elsewhere, you can remove them:\");\n listItem(`npm uninstall ${packages.join(' ')}`);\n}\n\n/**\n * Upgrade safeword configuration to the latest version.\n */\nexport async function upgrade(): Promise<void> {\n const cwd = process.cwd();\n const safewordDirectory = nodePath.join(cwd, '.safeword');\n\n // Check if configured\n if (!exists(safewordDirectory)) {\n error('Not configured. Run `safeword setup` first.');\n process.exit(1);\n }\n\n // Read project version\n const versionPath = nodePath.join(safewordDirectory, 'version');\n const projectVersion = readFileSafe(versionPath)?.trim() ?? '0.0.0';\n\n // Check for downgrade\n if (compareVersions(VERSION, projectVersion) < 0) {\n error(`CLI v${VERSION} is older than project v${projectVersion}.`);\n error('Update the CLI first: npm install -g safeword');\n process.exit(1);\n }\n\n header('Safeword Upgrade');\n info(`Upgrading from v${projectVersion} to v${VERSION}`);\n\n try {\n // Use reconcile with mode='upgrade' to update all managed files\n const ctx = createProjectContext(cwd);\n const result = await reconcile(SAFEWORD_SCHEMA, 'upgrade', ctx);\n\n // Print summary\n header('Upgrade Complete');\n\n info(`\\nVersion: v${projectVersion} → v${VERSION}`);\n\n if (result.created.length > 0) {\n info('\\nCreated:');\n for (const file of result.created) {\n listItem(file);\n }\n }\n\n if (result.updated.length > 0) {\n info('\\nUpdated:');\n for (const file of result.updated) {\n listItem(file);\n }\n }\n\n // Auto-sync: install missing ESLint packages\n if (result.packagesToInstall.length > 0) {\n info(`\\nSyncing ${result.packagesToInstall.length} package(s)...`);\n await sync();\n }\n\n // Notify about deprecated packages (user may remove manually)\n printDeprecatedPackagesInfo(result.packagesToRemove);\n\n success(`\\nSafeword upgraded to v${VERSION}`);\n } catch (error_) {\n error(`Upgrade failed: ${error_ instanceof Error ? error_.message : 'Unknown error'}`);\n process.exit(1);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,OAAO,cAAc;AAgBrB,SAAS,4BAA4B,UAA0B;AAC7D,MAAI,SAAS,WAAW,EAAG;AAE3B,OAAK;AAAA,EAAK,SAAS,MAAM,wDAAwD;AACjF,aAAW,OAAO,UAAU;AAC1B,aAAS,GAAG;AAAA,EACd;AACA,OAAK,0DAA0D;AAC/D,WAAS,iBAAiB,SAAS,KAAK,GAAG,CAAC,EAAE;AAChD;AAKA,eAAsB,UAAyB;AAC7C,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,oBAAoB,SAAS,KAAK,KAAK,WAAW;AAGxD,MAAI,CAAC,OAAO,iBAAiB,GAAG;AAC9B,UAAM,6CAA6C;AACnD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,cAAc,SAAS,KAAK,mBAAmB,SAAS;AAC9D,QAAM,iBAAiB,aAAa,WAAW,GAAG,KAAK,KAAK;AAG5D,MAAI,gBAAgB,SAAS,cAAc,IAAI,GAAG;AAChD,UAAM,QAAQ,OAAO,2BAA2B,cAAc,GAAG;AACjE,UAAM,+CAA+C;AACrD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,SAAO,kBAAkB;AACzB,OAAK,mBAAmB,cAAc,QAAQ,OAAO,EAAE;AAEvD,MAAI;AAEF,UAAM,MAAM,qBAAqB,GAAG;AACpC,UAAM,SAAS,MAAM,UAAU,iBAAiB,WAAW,GAAG;AAG9D,WAAO,kBAAkB;AAEzB,SAAK;AAAA,YAAe,cAAc,YAAO,OAAO,EAAE;AAElD,QAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,WAAK,YAAY;AACjB,iBAAW,QAAQ,OAAO,SAAS;AACjC,iBAAS,IAAI;AAAA,MACf;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,WAAK,YAAY;AACjB,iBAAW,QAAQ,OAAO,SAAS;AACjC,iBAAS,IAAI;AAAA,MACf;AAAA,IACF;AAGA,QAAI,OAAO,kBAAkB,SAAS,GAAG;AACvC,WAAK;AAAA,UAAa,OAAO,kBAAkB,MAAM,gBAAgB;AACjE,YAAM,KAAK;AAAA,IACb;AAGA,gCAA4B,OAAO,gBAAgB;AAEnD,YAAQ;AAAA,wBAA2B,OAAO,EAAE;AAAA,EAC9C,SAAS,QAAQ;AACf,UAAM,mBAAmB,kBAAkB,QAAQ,OAAO,UAAU,eAAe,EAAE;AACrF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;","names":[]}