i18nsmith 0.1.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/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +180 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/backup.d.ts +6 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +85 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +151 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +235 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/debug-patterns.d.ts +3 -0
- package/dist/commands/debug-patterns.d.ts.map +1 -0
- package/dist/commands/debug-patterns.js +192 -0
- package/dist/commands/debug-patterns.js.map +1 -0
- package/dist/commands/debug-patterns.test.d.ts +2 -0
- package/dist/commands/debug-patterns.test.d.ts.map +1 -0
- package/dist/commands/debug-patterns.test.js +109 -0
- package/dist/commands/debug-patterns.test.js.map +1 -0
- package/dist/commands/diagnose.d.ts +3 -0
- package/dist/commands/diagnose.d.ts.map +1 -0
- package/dist/commands/diagnose.js +117 -0
- package/dist/commands/diagnose.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +450 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/init.test.d.ts +2 -0
- package/dist/commands/init.test.d.ts.map +1 -0
- package/dist/commands/init.test.js +74 -0
- package/dist/commands/init.test.js.map +1 -0
- package/dist/commands/install-hooks.d.ts +3 -0
- package/dist/commands/install-hooks.d.ts.map +1 -0
- package/dist/commands/install-hooks.js +52 -0
- package/dist/commands/install-hooks.js.map +1 -0
- package/dist/commands/preflight.d.ts +7 -0
- package/dist/commands/preflight.d.ts.map +1 -0
- package/dist/commands/preflight.js +417 -0
- package/dist/commands/preflight.js.map +1 -0
- package/dist/commands/preflight.test.d.ts +5 -0
- package/dist/commands/preflight.test.d.ts.map +1 -0
- package/dist/commands/preflight.test.js +108 -0
- package/dist/commands/preflight.test.js.map +1 -0
- package/dist/commands/rename.d.ts +6 -0
- package/dist/commands/rename.d.ts.map +1 -0
- package/dist/commands/rename.js +204 -0
- package/dist/commands/rename.js.map +1 -0
- package/dist/commands/scaffold-adapter.d.ts +3 -0
- package/dist/commands/scaffold-adapter.d.ts.map +1 -0
- package/dist/commands/scaffold-adapter.js +204 -0
- package/dist/commands/scaffold-adapter.js.map +1 -0
- package/dist/commands/scaffold-adapter.test.d.ts +2 -0
- package/dist/commands/scaffold-adapter.test.d.ts.map +1 -0
- package/dist/commands/scaffold-adapter.test.js +102 -0
- package/dist/commands/scaffold-adapter.test.js.map +1 -0
- package/dist/commands/scan.d.ts +3 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +93 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/sync-seed.test.d.ts +2 -0
- package/dist/commands/sync-seed.test.d.ts.map +1 -0
- package/dist/commands/sync-seed.test.js +86 -0
- package/dist/commands/sync-seed.test.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +590 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/transform.d.ts +3 -0
- package/dist/commands/transform.d.ts.map +1 -0
- package/dist/commands/transform.js +114 -0
- package/dist/commands/transform.js.map +1 -0
- package/dist/commands/translate/csv-handler.d.ts +21 -0
- package/dist/commands/translate/csv-handler.d.ts.map +1 -0
- package/dist/commands/translate/csv-handler.js +270 -0
- package/dist/commands/translate/csv-handler.js.map +1 -0
- package/dist/commands/translate/executor.d.ts +31 -0
- package/dist/commands/translate/executor.d.ts.map +1 -0
- package/dist/commands/translate/executor.js +117 -0
- package/dist/commands/translate/executor.js.map +1 -0
- package/dist/commands/translate/index.d.ts +10 -0
- package/dist/commands/translate/index.d.ts.map +1 -0
- package/dist/commands/translate/index.js +170 -0
- package/dist/commands/translate/index.js.map +1 -0
- package/dist/commands/translate/reporter.d.ts +29 -0
- package/dist/commands/translate/reporter.d.ts.map +1 -0
- package/dist/commands/translate/reporter.js +103 -0
- package/dist/commands/translate/reporter.js.map +1 -0
- package/dist/commands/translate/types.d.ts +50 -0
- package/dist/commands/translate/types.d.ts.map +1 -0
- package/dist/commands/translate/types.js +5 -0
- package/dist/commands/translate/types.js.map +1 -0
- package/dist/commands/translate.d.ts +7 -0
- package/dist/commands/translate.d.ts.map +1 -0
- package/dist/commands/translate.js +7 -0
- package/dist/commands/translate.js.map +1 -0
- package/dist/commands/translate.test.d.ts +2 -0
- package/dist/commands/translate.test.d.ts.map +1 -0
- package/dist/commands/translate.test.js +118 -0
- package/dist/commands/translate.test.js.map +1 -0
- package/dist/e2e.test.d.ts +6 -0
- package/dist/e2e.test.d.ts.map +1 -0
- package/dist/e2e.test.js +376 -0
- package/dist/e2e.test.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/integration.test.d.ts +6 -0
- package/dist/integration.test.d.ts.map +1 -0
- package/dist/integration.test.js +320 -0
- package/dist/integration.test.js.map +1 -0
- package/dist/utils/diagnostics-exit.d.ts +12 -0
- package/dist/utils/diagnostics-exit.d.ts.map +1 -0
- package/dist/utils/diagnostics-exit.js +49 -0
- package/dist/utils/diagnostics-exit.js.map +1 -0
- package/dist/utils/diagnostics-exit.test.d.ts +2 -0
- package/dist/utils/diagnostics-exit.test.d.ts.map +1 -0
- package/dist/utils/diagnostics-exit.test.js +40 -0
- package/dist/utils/diagnostics-exit.test.js.map +1 -0
- package/dist/utils/diff-utils.d.ts +4 -0
- package/dist/utils/diff-utils.d.ts.map +1 -0
- package/dist/utils/diff-utils.js +30 -0
- package/dist/utils/diff-utils.js.map +1 -0
- package/dist/utils/diff-utils.test.d.ts +2 -0
- package/dist/utils/diff-utils.test.d.ts.map +1 -0
- package/dist/utils/diff-utils.test.js +30 -0
- package/dist/utils/diff-utils.test.js.map +1 -0
- package/dist/utils/exit-codes.d.ts +142 -0
- package/dist/utils/exit-codes.d.ts.map +1 -0
- package/dist/utils/exit-codes.js +168 -0
- package/dist/utils/exit-codes.js.map +1 -0
- package/dist/utils/package-manager.d.ts +4 -0
- package/dist/utils/package-manager.d.ts.map +1 -0
- package/dist/utils/package-manager.js +40 -0
- package/dist/utils/package-manager.js.map +1 -0
- package/dist/utils/pkg.d.ts +3 -0
- package/dist/utils/pkg.d.ts.map +1 -0
- package/dist/utils/pkg.js +24 -0
- package/dist/utils/pkg.js.map +1 -0
- package/dist/utils/provider-injector.d.ts +36 -0
- package/dist/utils/provider-injector.d.ts.map +1 -0
- package/dist/utils/provider-injector.js +223 -0
- package/dist/utils/provider-injector.js.map +1 -0
- package/dist/utils/provider-injector.test.d.ts +2 -0
- package/dist/utils/provider-injector.test.d.ts.map +1 -0
- package/dist/utils/provider-injector.test.js +67 -0
- package/dist/utils/provider-injector.test.js.map +1 -0
- package/dist/utils/scaffold.d.ts +20 -0
- package/dist/utils/scaffold.d.ts.map +1 -0
- package/dist/utils/scaffold.js +197 -0
- package/dist/utils/scaffold.js.map +1 -0
- package/package.json +35 -0
- package/src/commands/audit.ts +234 -0
- package/src/commands/backup.ts +96 -0
- package/src/commands/check.ts +191 -0
- package/src/commands/config.ts +263 -0
- package/src/commands/debug-patterns.test.ts +134 -0
- package/src/commands/debug-patterns.ts +257 -0
- package/src/commands/diagnose.ts +136 -0
- package/src/commands/init.test.ts +82 -0
- package/src/commands/init.ts +536 -0
- package/src/commands/install-hooks.ts +66 -0
- package/src/commands/preflight.test.ts +139 -0
- package/src/commands/preflight.ts +488 -0
- package/src/commands/rename.ts +264 -0
- package/src/commands/scaffold-adapter.test.ts +110 -0
- package/src/commands/scaffold-adapter.ts +250 -0
- package/src/commands/scan.ts +125 -0
- package/src/commands/sync-seed.test.ts +116 -0
- package/src/commands/sync.ts +736 -0
- package/src/commands/transform.ts +151 -0
- package/src/commands/translate/README.md +75 -0
- package/src/commands/translate/csv-handler.ts +301 -0
- package/src/commands/translate/executor.ts +188 -0
- package/src/commands/translate/index.ts +220 -0
- package/src/commands/translate/reporter.ts +138 -0
- package/src/commands/translate/types.ts +56 -0
- package/src/commands/translate.test.ts +173 -0
- package/src/commands/translate.ts +6 -0
- package/src/e2e.test.ts +479 -0
- package/src/fixtures/README.md +61 -0
- package/src/fixtures/basic-react/i18n.config.json +15 -0
- package/src/fixtures/basic-react/locales/de.json +8 -0
- package/src/fixtures/basic-react/locales/en.json +8 -0
- package/src/fixtures/basic-react/locales/fr.json +8 -0
- package/src/fixtures/basic-react/src/App.tsx +15 -0
- package/src/fixtures/basic-react/src/Messages.tsx +12 -0
- package/src/fixtures/nested-locales/i18n.config.json +9 -0
- package/src/fixtures/nested-locales/locales/en.json +23 -0
- package/src/fixtures/nested-locales/locales/fr.json +23 -0
- package/src/fixtures/nested-locales/src/HomePage.tsx +13 -0
- package/src/fixtures/suspicious-keys/i18n.config.json +9 -0
- package/src/fixtures/suspicious-keys/locales/en.json +11 -0
- package/src/fixtures/suspicious-keys/locales/fr.json +11 -0
- package/src/fixtures/suspicious-keys/src/BadKeys.tsx +19 -0
- package/src/index.ts +43 -0
- package/src/integration.test.ts +438 -0
- package/src/utils/diagnostics-exit.test.ts +47 -0
- package/src/utils/diagnostics-exit.ts +63 -0
- package/src/utils/diff-utils.test.ts +36 -0
- package/src/utils/diff-utils.ts +42 -0
- package/src/utils/exit-codes.ts +201 -0
- package/src/utils/package-manager.ts +44 -0
- package/src/utils/pkg.ts +23 -0
- package/src/utils/provider-injector.test.ts +79 -0
- package/src/utils/provider-injector.ts +315 -0
- package/src/utils/scaffold.ts +240 -0
- package/tsconfig.json +17 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# E2E Test Fixtures
|
|
2
|
+
|
|
3
|
+
This directory contains fixture projects for end-to-end testing of i18nsmith CLI commands.
|
|
4
|
+
|
|
5
|
+
## Fixture Projects
|
|
6
|
+
|
|
7
|
+
### `basic-react`
|
|
8
|
+
A minimal React project with react-i18next for basic workflow testing.
|
|
9
|
+
- Tests: scan, sync, transform, check commands
|
|
10
|
+
- Uses: react-i18next adapter
|
|
11
|
+
|
|
12
|
+
### `nested-locales`
|
|
13
|
+
Tests nested locale file structure (flat vs nested JSON).
|
|
14
|
+
- Tests: --rewrite-shape flat/nested
|
|
15
|
+
- Uses: Nested JSON structure with dot-delimited keys
|
|
16
|
+
|
|
17
|
+
### `multi-namespace`
|
|
18
|
+
Tests namespace-based organization.
|
|
19
|
+
- Tests: Namespace scanning, multi-file locales
|
|
20
|
+
- Uses: Multiple namespace JSON files
|
|
21
|
+
|
|
22
|
+
### `suspicious-keys`
|
|
23
|
+
Tests detection and handling of suspicious key patterns.
|
|
24
|
+
- Tests: audit, sync --strict, auto-rename features
|
|
25
|
+
- Uses: Various problematic key patterns
|
|
26
|
+
|
|
27
|
+
### `backup-restore`
|
|
28
|
+
Tests backup and restore functionality.
|
|
29
|
+
- Tests: backup-list, backup-restore, --no-backup
|
|
30
|
+
- Uses: Pre-created backup directories
|
|
31
|
+
|
|
32
|
+
## Usage in Tests
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
import { setupFixture, cleanupFixture } from './helpers';
|
|
36
|
+
|
|
37
|
+
describe('some feature', () => {
|
|
38
|
+
let fixtureDir: string;
|
|
39
|
+
|
|
40
|
+
beforeEach(async () => {
|
|
41
|
+
fixtureDir = await setupFixture('basic-react');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
afterEach(async () => {
|
|
45
|
+
await cleanupFixture(fixtureDir);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should work', () => {
|
|
49
|
+
const result = runCli(['scan'], { cwd: fixtureDir });
|
|
50
|
+
expect(result.exitCode).toBe(0);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Adding New Fixtures
|
|
56
|
+
|
|
57
|
+
1. Create a new directory under `fixtures/`
|
|
58
|
+
2. Add `i18n.config.json` with appropriate settings
|
|
59
|
+
3. Add source files and locales as needed
|
|
60
|
+
4. Document the fixture in this README
|
|
61
|
+
5. Add tests that use the fixture
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sourceLanguage": "en",
|
|
3
|
+
"targetLanguages": ["fr", "de"],
|
|
4
|
+
"localesDir": "locales",
|
|
5
|
+
"include": ["src/**/*.tsx", "src/**/*.ts"],
|
|
6
|
+
"exclude": ["**/*.test.tsx", "**/*.test.ts"],
|
|
7
|
+
"translationAdapter": {
|
|
8
|
+
"module": "react-i18next",
|
|
9
|
+
"hookName": "useTranslation",
|
|
10
|
+
"translationIdentifier": "t"
|
|
11
|
+
},
|
|
12
|
+
"sync": {
|
|
13
|
+
"suspiciousKeyPolicy": "warn"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
3
|
+
|
|
4
|
+
export function App() {
|
|
5
|
+
const { t } = useTranslation();
|
|
6
|
+
|
|
7
|
+
return (
|
|
8
|
+
<div>
|
|
9
|
+
<h1>{t('common.welcome')}</h1>
|
|
10
|
+
<p>Some untranslated text that should be detected</p>
|
|
11
|
+
<button>{t('buttons.submit')}</button>
|
|
12
|
+
<button>{t('buttons.cancel')}</button>
|
|
13
|
+
</div>
|
|
14
|
+
);
|
|
15
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
3
|
+
|
|
4
|
+
export function SuccessMessage() {
|
|
5
|
+
const { t } = useTranslation();
|
|
6
|
+
return <div className="success">{t('messages.success')}</div>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function ErrorMessage() {
|
|
10
|
+
const { t } = useTranslation();
|
|
11
|
+
return <div className="error">{t('messages.error')}</div>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"common": {
|
|
3
|
+
"buttons": {
|
|
4
|
+
"submit": "Submit",
|
|
5
|
+
"cancel": "Cancel",
|
|
6
|
+
"save": "Save"
|
|
7
|
+
},
|
|
8
|
+
"labels": {
|
|
9
|
+
"name": "Name",
|
|
10
|
+
"email": "Email"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"pages": {
|
|
14
|
+
"home": {
|
|
15
|
+
"title": "Home",
|
|
16
|
+
"welcome": "Welcome back!"
|
|
17
|
+
},
|
|
18
|
+
"settings": {
|
|
19
|
+
"title": "Settings",
|
|
20
|
+
"description": "Configure your preferences"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"common": {
|
|
3
|
+
"buttons": {
|
|
4
|
+
"submit": "Soumettre",
|
|
5
|
+
"cancel": "Annuler",
|
|
6
|
+
"save": "Sauvegarder"
|
|
7
|
+
},
|
|
8
|
+
"labels": {
|
|
9
|
+
"name": "Nom",
|
|
10
|
+
"email": "Courriel"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"pages": {
|
|
14
|
+
"home": {
|
|
15
|
+
"title": "Accueil",
|
|
16
|
+
"welcome": "Bon retour!"
|
|
17
|
+
},
|
|
18
|
+
"settings": {
|
|
19
|
+
"title": "Paramètres",
|
|
20
|
+
"description": "Configurez vos préférences"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useTranslation } from 'react-i18next';
|
|
2
|
+
|
|
3
|
+
export function HomePage() {
|
|
4
|
+
const { t } = useTranslation();
|
|
5
|
+
|
|
6
|
+
return (
|
|
7
|
+
<div>
|
|
8
|
+
<h1>{t('pages.home.title')}</h1>
|
|
9
|
+
<p>{t('pages.home.welcome')}</p>
|
|
10
|
+
<button>{t('common.buttons.submit')}</button>
|
|
11
|
+
</div>
|
|
12
|
+
);
|
|
13
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Hello World": "Hello World",
|
|
3
|
+
"Welcome to our app!": "Welcome to our app!",
|
|
4
|
+
"Click Here": "Click Here",
|
|
5
|
+
"Save": "Save",
|
|
6
|
+
"The Quick Brown Fox": "The Quick Brown Fox",
|
|
7
|
+
"When to use this feature:": "When to use this feature:",
|
|
8
|
+
"proper.namespaced.key": "This is a properly namespaced key",
|
|
9
|
+
"buttons.submit": "Submit",
|
|
10
|
+
"common.title": "Application Title"
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Hello World": "Bonjour le monde",
|
|
3
|
+
"Welcome to our app!": "Bienvenue dans notre application!",
|
|
4
|
+
"Click Here": "Cliquez ici",
|
|
5
|
+
"Save": "Sauvegarder",
|
|
6
|
+
"The Quick Brown Fox": "Le Renard Brun Rapide",
|
|
7
|
+
"When to use this feature:": "Quand utiliser cette fonctionnalité:",
|
|
8
|
+
"proper.namespaced.key": "Ceci est une clé correctement nommée",
|
|
9
|
+
"buttons.submit": "Soumettre",
|
|
10
|
+
"common.title": "Titre de l'application"
|
|
11
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useTranslation } from 'react-i18next';
|
|
2
|
+
|
|
3
|
+
export function BadKeys() {
|
|
4
|
+
const { t } = useTranslation();
|
|
5
|
+
|
|
6
|
+
return (
|
|
7
|
+
<div>
|
|
8
|
+
{/* These are bad keys - text as key */}
|
|
9
|
+
<h1>{t('Hello World')}</h1>
|
|
10
|
+
<p>{t('Welcome to our app!')}</p>
|
|
11
|
+
<a href="#">{t('Click Here')}</a>
|
|
12
|
+
<button>{t('Save')}</button>
|
|
13
|
+
|
|
14
|
+
{/* These are good keys */}
|
|
15
|
+
<p>{t('proper.namespaced.key')}</p>
|
|
16
|
+
<button>{t('buttons.submit')}</button>
|
|
17
|
+
</div>
|
|
18
|
+
);
|
|
19
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { registerInit } from './commands/init.js';
|
|
4
|
+
import { registerScaffoldAdapter } from './commands/scaffold-adapter.js';
|
|
5
|
+
import { registerTranslate } from './commands/translate.js';
|
|
6
|
+
import { registerPreflight } from './commands/preflight.js';
|
|
7
|
+
import { registerDebugPatterns } from './commands/debug-patterns.js';
|
|
8
|
+
import { registerDiagnose } from './commands/diagnose.js';
|
|
9
|
+
import { registerAudit } from './commands/audit.js';
|
|
10
|
+
import { registerCheck } from './commands/check.js';
|
|
11
|
+
import { registerScan } from './commands/scan.js';
|
|
12
|
+
import { registerTransform } from './commands/transform.js';
|
|
13
|
+
import { registerSync } from './commands/sync.js';
|
|
14
|
+
import { registerBackup } from './commands/backup.js';
|
|
15
|
+
import { registerRename } from './commands/rename.js';
|
|
16
|
+
import { registerInstallHooks } from './commands/install-hooks.js';
|
|
17
|
+
import { registerConfig } from './commands/config.js';
|
|
18
|
+
|
|
19
|
+
export const program = new Command();
|
|
20
|
+
|
|
21
|
+
program
|
|
22
|
+
.name('i18nsmith')
|
|
23
|
+
.description('Universal Automated i18n Library')
|
|
24
|
+
.version('0.1.0');
|
|
25
|
+
|
|
26
|
+
registerInit(program);
|
|
27
|
+
registerScaffoldAdapter(program);
|
|
28
|
+
registerTranslate(program);
|
|
29
|
+
registerPreflight(program);
|
|
30
|
+
registerDebugPatterns(program);
|
|
31
|
+
registerDiagnose(program);
|
|
32
|
+
registerAudit(program);
|
|
33
|
+
registerCheck(program);
|
|
34
|
+
registerScan(program);
|
|
35
|
+
registerTransform(program);
|
|
36
|
+
registerSync(program);
|
|
37
|
+
registerBackup(program);
|
|
38
|
+
registerRename(program);
|
|
39
|
+
registerInstallHooks(program);
|
|
40
|
+
registerConfig(program);
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
program.parse();
|