gtx-cli 1.2.0-alpha.1 → 1.2.0-alpha.3

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/cli/base.js CHANGED
@@ -60,6 +60,8 @@ const supportedFiles_1 = require("../formats/files/supportedFiles");
60
60
  const wizard_1 = require("../setup/wizard");
61
61
  const packageJson_1 = require("../utils/packageJson");
62
62
  const userInput_1 = require("../setup/userInput");
63
+ const installPackage_1 = require("../utils/installPackage");
64
+ const packageManager_1 = require("../utils/packageManager");
63
65
  class BaseCLI {
64
66
  // Constructor is shared amongst all CLI class types
65
67
  constructor(library, additionalModules) {
@@ -112,7 +114,9 @@ class BaseCLI {
112
114
  if (wrap) {
113
115
  (0, console_1.logInfo)(`${chalk_1.default.yellow('[EXPERIMENTAL]')} Running React setup wizard...`);
114
116
  yield this.handleSetupReactCommand(options);
115
- (0, console_1.endCommand)(`Done! We've automatically wrapped all of your JSX components for you.`);
117
+ (0, console_1.endCommand)(`Done! Since this wizard is experimental, please review the changes and make modifications as needed.
118
+ Certain aspects of your app may still need manual setup.
119
+ See the docs for more information: https://generaltranslation.com/docs/react/tutorials/quickstart`);
116
120
  ranReactSetup = true;
117
121
  }
118
122
  }
@@ -121,7 +125,7 @@ class BaseCLI {
121
125
  }
122
126
  // Configure gt.config.json
123
127
  yield this.handleInitCommand(ranReactSetup);
124
- (0, console_1.endCommand)("Done! Take advantage of all of General Translation's features by signing up for a free account! https://generaltranslation.com/signup");
128
+ (0, console_1.endCommand)('Done! Remember to get an API key and project ID from the dashboard! https://dash.generaltranslation.com');
125
129
  }));
126
130
  }
127
131
  setupConfigureCommand() {
@@ -259,9 +263,20 @@ class BaseCLI {
259
263
  (0, setupConfig_1.default)(configFilepath, {
260
264
  defaultLocale,
261
265
  locales,
262
- files,
266
+ files: Object.keys(files).length > 0 ? files : undefined,
263
267
  });
264
268
  (0, console_1.logSuccess)(`Feel free to edit ${chalk_1.default.cyan(configFilepath)} to customize your translation setup. Docs: https://generaltranslation.com/docs/cli/reference/config`);
269
+ // Install gtx-cli if not installed
270
+ const isCLIInstalled = packageJson
271
+ ? (0, packageJson_1.isPackageInstalled)('gtx-cli', packageJson, true, true)
272
+ : true; // if no package.json, we can't install it
273
+ if (!isCLIInstalled) {
274
+ const packageManager = yield (0, packageManager_1.getPackageManager)();
275
+ const spinner = (0, console_1.createSpinner)();
276
+ spinner.start(`Installing gtx-cli as a dev dependency with ${packageManager.name}...`);
277
+ yield (0, installPackage_1.installPackage)('gtx-cli', packageManager, true);
278
+ spinner.stop(chalk_1.default.green('Installed gtx-cli.'));
279
+ }
265
280
  });
266
281
  }
267
282
  }
@@ -22,7 +22,7 @@ export declare function promptText({ message, defaultValue, validate, }: {
22
22
  defaultValue?: string;
23
23
  validate?: (value: string) => boolean | string;
24
24
  }): Promise<string>;
25
- export declare function promptSelect<T extends string>({ message, options, defaultValue, }: {
25
+ export declare function promptSelect<T>({ message, options, defaultValue, }: {
26
26
  message: string;
27
27
  options: Array<{
28
28
  value: T;
@@ -64,31 +64,19 @@ Please let us know what you would like to see supported at https://github.com/ge
64
64
  // Check if gt-next or gt-react is installed
65
65
  if (frameworkType === 'next-app' &&
66
66
  !(0, packageJson_1.isPackageInstalled)('gt-next', packageJson)) {
67
- const packageManager = (0, packageManager_1.getPackageManager)();
68
- if (packageManager) {
69
- const spinner = (0, console_1.createSpinner)('timer');
70
- spinner.start('Installing gt-next...');
71
- yield (0, installPackage_1.installPackage)('gt-next', packageManager);
72
- spinner.stop(chalk_1.default.green('Automatically installed gt-next.'));
73
- }
74
- else {
75
- (0, console_2.logInfo)('Please first install gt-next as a dependency, then re-run this command.');
76
- process.exit(0);
77
- }
67
+ const packageManager = yield (0, packageManager_1.getPackageManager)();
68
+ const spinner = (0, console_1.createSpinner)('timer');
69
+ spinner.start(`Installing gt-next with ${packageManager.name}...`);
70
+ yield (0, installPackage_1.installPackage)('gt-next', packageManager);
71
+ spinner.stop(chalk_1.default.green('Automatically installed gt-next.'));
78
72
  }
79
73
  else if (['next-pages', 'react', 'redwood', 'vite', 'gatsby'].includes(frameworkType) &&
80
74
  !(0, packageJson_1.isPackageInstalled)('gt-react', packageJson)) {
81
- const packageManager = (0, packageManager_1.getPackageManager)();
82
- if (packageManager) {
83
- const spinner = (0, console_1.createSpinner)('timer');
84
- spinner.start('Installing gt-react...');
85
- yield (0, installPackage_1.installPackage)('gt-react', packageManager);
86
- spinner.stop(chalk_1.default.green('Automatically installed gt-react.'));
87
- }
88
- else {
89
- (0, console_2.logInfo)('Please first install gt-react as a dependency, then re-run this command.');
90
- process.exit(0);
91
- }
75
+ const packageManager = yield (0, packageManager_1.getPackageManager)();
76
+ const spinner = (0, console_1.createSpinner)('timer');
77
+ spinner.start(`Installing gt-react with ${packageManager.name}...`);
78
+ yield (0, installPackage_1.installPackage)('gt-react', packageManager);
79
+ spinner.stop(chalk_1.default.green('Automatically installed gt-react.'));
92
80
  }
93
81
  // ----- Create a starter gt.config.json file -----
94
82
  (0, generateSettings_1.generateSettings)(options);
@@ -125,9 +113,7 @@ Please let us know what you would like to see supported at https://github.com/ge
125
113
  // Wrap all JSX elements in the src directory with a <T> tag, with unique ids
126
114
  const { filesUpdated: filesUpdatedNext } = yield (0, scanForContent_2.default)(mergeOptions, 'gt-next', errors, warnings);
127
115
  filesUpdated = [...filesUpdated, ...filesUpdatedNext];
128
- spinner.stop(chalk_1.default.green('Added <T> tags and updated ') +
129
- chalk_1.default.bold.cyan(filesUpdatedNext.length) +
130
- chalk_1.default.green(' files.'));
116
+ spinner.stop(chalk_1.default.green(`Success! Added <T> tags and updated ${chalk_1.default.bold.cyan(filesUpdated.length)} files:\n`) + filesUpdated.map((file) => `${chalk_1.default.green('-')} ${file}`).join('\n'));
131
117
  if (addWithGTConfig) {
132
118
  // Add the withGTConfig() function to the next.config.js file
133
119
  yield (0, handleInitGT_1.default)(nextConfigPath, errors, warnings, filesUpdated);
@@ -157,9 +143,7 @@ Please let us know what you would like to see supported at https://github.com/ge
157
143
  // Wrap all JSX elements in the src directory with a <T> tag, with unique ids
158
144
  const { filesUpdated: filesUpdatedReact } = yield (0, scanForContent_1.default)(mergeOptions, 'gt-react', frameworkType, errors, warnings);
159
145
  filesUpdated = [...filesUpdated, ...filesUpdatedReact];
160
- spinner.stop(chalk_1.default.green('Added <T> tags and updated ') +
161
- chalk_1.default.bold.cyan(filesUpdatedReact.length) +
162
- chalk_1.default.green(' files.'));
146
+ spinner.stop(chalk_1.default.green(`Success! Added <T> tags and updated ${chalk_1.default.bold.cyan(filesUpdated.length)} files:\n`) + filesUpdated.map((file) => `${chalk_1.default.green('-')} ${file}`).join('\n'));
163
147
  if (errors.length > 0) {
164
148
  (0, console_2.logError)(chalk_1.default.red('Failed to write files:\n') + errors.join('\n'));
165
149
  }
@@ -182,8 +166,5 @@ Please let us know what you would like to see supported at https://github.com/ge
182
166
  // Format updated files if formatters are available
183
167
  if (applyFormatting)
184
168
  yield (0, postProcess_2.formatFiles)(filesUpdated, formatter);
185
- if (filesUpdated.length > 0) {
186
- (0, console_2.logStep)('Please review the changes before committing.');
187
- }
188
169
  });
189
170
  }
@@ -1,2 +1,2 @@
1
1
  import { PackageManager } from './packageManager';
2
- export declare function installPackage(packageName: string, packageManager: PackageManager): Promise<void>;
2
+ export declare function installPackage(packageName: string, packageManager: PackageManager, asDevDependency?: boolean): Promise<void>;
@@ -16,11 +16,14 @@ exports.installPackage = installPackage;
16
16
  const chalk_1 = __importDefault(require("chalk"));
17
17
  const child_process_1 = require("child_process");
18
18
  const console_1 = require("../console");
19
- function installPackage(packageName, packageManager) {
19
+ function installPackage(packageName, packageManager, asDevDependency) {
20
20
  return __awaiter(this, void 0, void 0, function* () {
21
21
  return new Promise((resolve, reject) => {
22
22
  const command = packageManager.name;
23
23
  const args = [packageManager.installCommand, packageName];
24
+ if (asDevDependency) {
25
+ args.push(packageManager.devDependencyFlag);
26
+ }
24
27
  const childProcess = (0, child_process_1.spawn)(command, args, {
25
28
  stdio: ['pipe', 'ignore', 'pipe'],
26
29
  });
@@ -1,5 +1,5 @@
1
1
  export declare function searchForPackageJson(): Record<string, any> | null;
2
2
  export declare function getPackageJson(): Record<string, any>;
3
3
  export declare function updatePackageJson(packageJson: Record<string, any>): void;
4
- export declare function isPackageInstalled(packageName: string, packageJson: Record<string, any>, asDevDependency?: boolean): boolean;
4
+ export declare function isPackageInstalled(packageName: string, packageJson: Record<string, any>, asDevDependency?: boolean, checkBoth?: boolean): boolean;
5
5
  export declare function getPackageVersion(packageName: string, packageJson: Record<string, any>): string | undefined;
@@ -54,8 +54,10 @@ function updatePackageJson(packageJson) {
54
54
  process.exit(1);
55
55
  }
56
56
  }
57
- function isPackageInstalled(packageName, packageJson, asDevDependency = false) {
58
- const dependencies = asDevDependency
57
+ // check if a package is installed in the package.json file
58
+ function isPackageInstalled(packageName, packageJson, asDevDependency = false, checkBoth = false) {
59
+ const dependencies = checkBoth
60
+ ? Object.assign(Object.assign({}, packageJson.devDependencies), packageJson.dependencies) : asDevDependency
59
61
  ? packageJson.devDependencies
60
62
  : packageJson.dependencies;
61
63
  if (!dependencies) {
@@ -6,6 +6,7 @@ export interface PackageManager {
6
6
  runScriptCommand: string;
7
7
  flags: string;
8
8
  forceInstallFlag: string;
9
+ devDependencyFlag: string;
9
10
  registry?: string;
10
11
  detect: () => boolean;
11
12
  addOverride: (pkgName: string, pkgVersion: string) => Promise<void>;
@@ -18,4 +19,5 @@ export declare const YARN_V2: PackageManager;
18
19
  export declare const PNPM: PackageManager;
19
20
  export declare const NPM: PackageManager;
20
21
  export declare const packageManagers: PackageManager[];
21
- export declare function getPackageManager(managers?: PackageManager[]): PackageManager | null;
22
+ export declare function _detectPackageManger(managers?: PackageManager[]): PackageManager | null;
23
+ export declare function getPackageManager(): Promise<PackageManager>;
@@ -43,11 +43,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
43
43
  };
44
44
  Object.defineProperty(exports, "__esModule", { value: true });
45
45
  exports.packageManagers = exports.NPM = exports.PNPM = exports.YARN_V2 = exports.YARN_V1 = exports.DENO = exports.BUN = void 0;
46
+ exports._detectPackageManger = _detectPackageManger;
46
47
  exports.getPackageManager = getPackageManager;
47
- // This file is MIT licensed and was adapted from https://github.com/getsentry/sentry-wizard/blob/master/src/utils/package-manager.ts
48
+ // This file is MIT licensed and was adapted from https://github.com/getsentry/sentry-wizard/blob/master/src/utils/package-manager.ts and https://github.com/getsentry/sentry-wizard/blob/master/src/utils/clack/index.ts
48
49
  const fs = __importStar(require("fs"));
49
50
  const path = __importStar(require("path"));
50
51
  const packageJson_1 = require("./packageJson");
52
+ const console_1 = require("../console");
51
53
  exports.BUN = {
52
54
  name: 'bun',
53
55
  label: 'Bun',
@@ -56,6 +58,7 @@ exports.BUN = {
56
58
  runScriptCommand: 'bun run',
57
59
  flags: '',
58
60
  forceInstallFlag: '--force',
61
+ devDependencyFlag: '--dev',
59
62
  detect: () => ['bun.lockb', 'bun.lock'].some((lockFile) => {
60
63
  try {
61
64
  return fs.existsSync(path.join(process.cwd(), lockFile));
@@ -78,6 +81,7 @@ exports.DENO = {
78
81
  runScriptCommand: 'deno task',
79
82
  flags: '',
80
83
  forceInstallFlag: '--force',
84
+ devDependencyFlag: '--dev',
81
85
  registry: 'npm',
82
86
  detect: () => {
83
87
  try {
@@ -101,6 +105,7 @@ exports.YARN_V1 = {
101
105
  runScriptCommand: 'yarn',
102
106
  flags: '--ignore-workspace-root-check',
103
107
  forceInstallFlag: '--force',
108
+ devDependencyFlag: '--dev',
104
109
  detect: () => {
105
110
  try {
106
111
  return fs
@@ -127,6 +132,7 @@ exports.YARN_V2 = {
127
132
  runScriptCommand: 'yarn',
128
133
  flags: '',
129
134
  forceInstallFlag: '--force',
135
+ devDependencyFlag: '--dev',
130
136
  detect: () => {
131
137
  try {
132
138
  return fs
@@ -152,6 +158,7 @@ exports.PNPM = {
152
158
  runScriptCommand: 'pnpm',
153
159
  flags: '--ignore-workspace-root-check',
154
160
  forceInstallFlag: '--force',
161
+ devDependencyFlag: '--save-dev',
155
162
  detect: () => {
156
163
  try {
157
164
  return fs.existsSync(path.join(process.cwd(), 'pnpm-lock.yaml'));
@@ -175,6 +182,7 @@ exports.NPM = {
175
182
  runScriptCommand: 'npm run',
176
183
  flags: '',
177
184
  forceInstallFlag: '--force',
185
+ devDependencyFlag: '--save-dev',
178
186
  detect: () => {
179
187
  try {
180
188
  return fs.existsSync(path.join(process.cwd(), 'package-lock.json'));
@@ -190,7 +198,7 @@ exports.NPM = {
190
198
  }),
191
199
  };
192
200
  exports.packageManagers = [exports.NPM, exports.YARN_V1, exports.YARN_V2, exports.PNPM, exports.BUN, exports.DENO];
193
- function getPackageManager(managers) {
201
+ function _detectPackageManger(managers) {
194
202
  const foundPackageMangers = (managers !== null && managers !== void 0 ? managers : exports.packageManagers).filter((packageManager) => packageManager.detect());
195
203
  // Only consider a package manager detected if we found exactly one.
196
204
  // If we find more than one, we should not make any assumptions.
@@ -199,3 +207,27 @@ function getPackageManager(managers) {
199
207
  }
200
208
  return null;
201
209
  }
210
+ // Get the package manager for the current project
211
+ // Uses a global cache to avoid prompting the user multiple times
212
+ function getPackageManager() {
213
+ return __awaiter(this, void 0, void 0, function* () {
214
+ const globalWizard = global;
215
+ if (globalWizard._gt_wizard_cached_package_manager) {
216
+ return globalWizard._gt_wizard_cached_package_manager;
217
+ }
218
+ const detectedPackageManager = _detectPackageManger();
219
+ if (detectedPackageManager) {
220
+ globalWizard._gt_wizard_cached_package_manager = detectedPackageManager;
221
+ return detectedPackageManager;
222
+ }
223
+ const selectedPackageManager = yield (0, console_1.promptSelect)({
224
+ message: 'Please select your package manager.',
225
+ options: exports.packageManagers.map((packageManager) => ({
226
+ value: packageManager,
227
+ label: packageManager.label,
228
+ })),
229
+ });
230
+ globalWizard._gt_wizard_cached_package_manager = selectedPackageManager;
231
+ return selectedPackageManager;
232
+ });
233
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gtx-cli",
3
- "version": "1.2.0-alpha.1",
3
+ "version": "1.2.0-alpha.3",
4
4
  "type": "commonjs",
5
5
  "main": "dist/index.js",
6
6
  "bin": "dist/main.js",