@slingr/cli 0.0.3 â 0.0.4
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/LICENSE.txt +202 -0
- package/README.md +490 -319
- package/bin/dev.cmd +2 -2
- package/bin/dev.js +5 -5
- package/bin/run.cmd +2 -2
- package/bin/run.js +4 -4
- package/bin/slingr +1 -0
- package/dist/commands/build.d.ts +20 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +206 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/create-app.d.ts +0 -1
- package/dist/commands/create-app.d.ts.map +1 -1
- package/dist/commands/create-app.js +38 -57
- package/dist/commands/create-app.js.map +1 -1
- package/dist/commands/debug.d.ts +28 -0
- package/dist/commands/debug.d.ts.map +1 -0
- package/dist/commands/debug.js +474 -0
- package/dist/commands/debug.js.map +1 -0
- package/dist/commands/ds.d.ts +14 -1
- package/dist/commands/ds.d.ts.map +1 -1
- package/dist/commands/ds.js +450 -121
- package/dist/commands/ds.js.map +1 -1
- package/dist/commands/gql.d.ts +1 -1
- package/dist/commands/gql.d.ts.map +1 -1
- package/dist/commands/gql.js +190 -184
- package/dist/commands/gql.js.map +1 -1
- package/dist/commands/infra/down.d.ts.map +1 -1
- package/dist/commands/infra/down.js +8 -7
- package/dist/commands/infra/down.js.map +1 -1
- package/dist/commands/infra/up.d.ts.map +1 -1
- package/dist/commands/infra/up.js +8 -7
- package/dist/commands/infra/up.js.map +1 -1
- package/dist/commands/infra/update.d.ts +1 -0
- package/dist/commands/infra/update.d.ts.map +1 -1
- package/dist/commands/infra/update.js +33 -69
- package/dist/commands/infra/update.js.map +1 -1
- package/dist/commands/run.d.ts +29 -2
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +628 -130
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/setup.d.ts +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +34 -71
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/sync-metadata.d.ts +15 -0
- package/dist/commands/sync-metadata.d.ts.map +1 -0
- package/dist/commands/sync-metadata.js +225 -0
- package/dist/commands/sync-metadata.js.map +1 -0
- package/dist/commands/users.d.ts +30 -0
- package/dist/commands/users.d.ts.map +1 -0
- package/dist/commands/users.js +472 -0
- package/dist/commands/users.js.map +1 -0
- package/dist/commands/views.d.ts +11 -0
- package/dist/commands/views.d.ts.map +1 -0
- package/dist/commands/views.js +73 -0
- package/dist/commands/views.js.map +1 -0
- package/dist/projectStructure.d.ts +2 -2
- package/dist/projectStructure.d.ts.map +1 -1
- package/dist/projectStructure.js +281 -69
- package/dist/projectStructure.js.map +1 -1
- package/dist/scripts/generate-metadata.d.ts +13 -0
- package/dist/scripts/generate-metadata.d.ts.map +1 -0
- package/dist/scripts/generate-metadata.js +412 -0
- package/dist/scripts/generate-metadata.js.map +1 -0
- package/dist/scripts/generate-metadata.ts +498 -0
- package/dist/scripts/generate-schema.d.ts +1 -1
- package/dist/scripts/generate-schema.js +168 -74
- package/dist/scripts/generate-schema.js.map +1 -1
- package/dist/scripts/generate-schema.ts +258 -143
- package/dist/templates/.env.template +23 -0
- package/dist/templates/.firebaserc.template +5 -0
- package/dist/templates/.github/copilot-instructions.md.template +652 -17
- package/dist/templates/backend/Dockerfile.template +30 -0
- package/dist/templates/config/datasource.ts.template +12 -9
- package/dist/templates/config/jest.config.ts +30 -30
- package/dist/templates/config/jest.setup.ts +1 -1
- package/dist/templates/config/tsconfig.json.template +50 -29
- package/dist/templates/dataSources/mysql.ts.template +16 -13
- package/dist/templates/dataSources/postgres.ts.template +15 -13
- package/dist/templates/dataset-generator-script.ts.template +139 -139
- package/dist/templates/datasets/mysql-default/.slingr-schema.json.template +5 -0
- package/dist/templates/datasets/mysql-default/Address.jsonl.template +3 -3
- package/dist/templates/datasets/mysql-default/App.jsonl.template +4 -4
- package/dist/templates/datasets/mysql-default/Company.jsonl.template +3 -3
- package/dist/templates/datasets/mysql-default/Person.jsonl.template +2 -2
- package/dist/templates/datasets/mysql-default/User.jsonl.template +1 -0
- package/dist/templates/datasets/mysql-default/instructions.md.template +1 -0
- package/dist/templates/datasets/postgres-default/.slingr-schema.json.template +5 -0
- package/dist/templates/datasets/postgres-default/Address.jsonl.template +3 -3
- package/dist/templates/datasets/postgres-default/App.jsonl.template +4 -4
- package/dist/templates/datasets/postgres-default/Company.jsonl.template +3 -3
- package/dist/templates/datasets/postgres-default/Person.jsonl.template +2 -2
- package/dist/templates/datasets/postgres-default/User.jsonl.template +1 -0
- package/dist/templates/datasets/postgres-default/instructions.md.template +1 -0
- package/dist/templates/docker-compose.prod-test.yml.template +32 -0
- package/dist/templates/docker-compose.yml.template +24 -0
- package/dist/templates/docs/app-description.md.template +33 -33
- package/dist/templates/firebase.json.template +68 -0
- package/dist/templates/frontend/.umirc.ts.template +23 -0
- package/dist/templates/frontend/package.json.template +45 -0
- package/dist/templates/frontend/public/config.json +6 -0
- package/dist/templates/frontend/public/logo.svg +6 -0
- package/dist/templates/frontend/src/app.tsx.template +44 -0
- package/dist/templates/frontend/src/global.less.template +117 -0
- package/dist/templates/frontend/src/layouts/MainLayout.tsx.template +75 -0
- package/dist/templates/frontend/src/types/graphql-augmentation.d.ts.template +44 -0
- package/dist/templates/frontend/src/views/customViews/user/UserCreateView.tsx.template +18 -0
- package/dist/templates/frontend/src/views/customViews/user/UserEditView.tsx.template +29 -0
- package/dist/templates/frontend/src/views/customViews/user/UserReadView.tsx.template +24 -0
- package/dist/templates/frontend/src/views/customViews/user/UserTableView.tsx.template +38 -0
- package/dist/templates/frontend/src/views/customViews/welcome.tsx.template +34 -0
- package/dist/templates/frontend/tsconfig.json.template +50 -0
- package/dist/templates/gql/codegen.yml.template +25 -25
- package/dist/templates/gql/index.ts.template +17 -24
- package/dist/templates/gql/operations.graphql.template +30 -30
- package/dist/templates/ops/README.md.template +1045 -0
- package/dist/templates/ops/cloudbuild.yaml.template +161 -0
- package/dist/templates/ops/scripts/_utils.js.template +217 -0
- package/dist/templates/ops/scripts/deploy.js.template +145 -0
- package/dist/templates/ops/scripts/setup-gcp.js.template +330 -0
- package/dist/templates/ops/scripts/setup-secrets.js.template +76 -0
- package/dist/templates/ops/scripts/test-prod-local.js.template +49 -0
- package/dist/templates/package.json.template +50 -38
- package/dist/templates/pnpm-workspace.yaml.template +3 -0
- package/dist/templates/prompt-analysis.md.template +110 -110
- package/dist/templates/prompt-script-generation.md.template +258 -258
- package/dist/templates/src/Address.ts.template +28 -31
- package/dist/templates/src/App.ts.template +17 -61
- package/dist/templates/src/Company.ts.template +41 -47
- package/dist/templates/src/Models.test.ts.template +654 -654
- package/dist/templates/src/Person.test.ts.template +289 -289
- package/dist/templates/src/Person.ts.template +90 -105
- package/dist/templates/src/actions/index.ts.template +11 -11
- package/dist/templates/src/auth/permissions.ts.template +34 -0
- package/dist/templates/src/data/App.ts.template +48 -0
- package/dist/templates/src/data/User.ts.template +35 -0
- package/dist/templates/src/types/gql.d.ts.template +17 -17
- package/dist/templates/vscode/extensions.json +4 -3
- package/dist/templates/vscode/settings.json +17 -11
- package/dist/templates/workspace-package.json.template +21 -0
- package/dist/utils/buildCache.d.ts +12 -0
- package/dist/utils/buildCache.d.ts.map +1 -0
- package/dist/utils/buildCache.js +102 -0
- package/dist/utils/buildCache.js.map +1 -0
- package/dist/utils/checkFramework.d.ts +27 -0
- package/dist/utils/checkFramework.d.ts.map +1 -0
- package/dist/utils/checkFramework.js +104 -0
- package/dist/utils/checkFramework.js.map +1 -0
- package/dist/utils/datasourceParser.d.ts +11 -0
- package/dist/utils/datasourceParser.d.ts.map +1 -1
- package/dist/utils/datasourceParser.js +154 -56
- package/dist/utils/datasourceParser.js.map +1 -1
- package/dist/utils/dockerManager.d.ts +25 -0
- package/dist/utils/dockerManager.d.ts.map +1 -0
- package/dist/utils/dockerManager.js +281 -0
- package/dist/utils/dockerManager.js.map +1 -0
- package/dist/utils/infraFileParser.d.ts +26 -0
- package/dist/utils/infraFileParser.d.ts.map +1 -0
- package/dist/utils/infraFileParser.js +75 -0
- package/dist/utils/infraFileParser.js.map +1 -0
- package/dist/utils/jsonlLoader.d.ts +91 -12
- package/dist/utils/jsonlLoader.d.ts.map +1 -1
- package/dist/utils/jsonlLoader.js +674 -63
- package/dist/utils/jsonlLoader.js.map +1 -1
- package/dist/utils/model-analyzer.d.ts.map +1 -1
- package/dist/utils/model-analyzer.js +67 -13
- package/dist/utils/model-analyzer.js.map +1 -1
- package/dist/utils/userManagement.d.ts +57 -0
- package/dist/utils/userManagement.d.ts.map +1 -0
- package/dist/utils/userManagement.js +288 -0
- package/dist/utils/userManagement.js.map +1 -0
- package/dist/utils/viewsGenerator.d.ts +15 -0
- package/dist/utils/viewsGenerator.d.ts.map +1 -0
- package/dist/utils/viewsGenerator.js +311 -0
- package/dist/utils/viewsGenerator.js.map +1 -0
- package/oclif.manifest.json +445 -20
- package/package.json +29 -26
- package/src/templates/.env.template +23 -0
- package/src/templates/.firebaserc.template +5 -0
- package/src/templates/.github/copilot-instructions.md.template +652 -17
- package/src/templates/backend/Dockerfile.template +30 -0
- package/src/templates/config/datasource.ts.template +12 -9
- package/src/templates/config/jest.config.ts +30 -30
- package/src/templates/config/jest.setup.ts +1 -1
- package/src/templates/config/tsconfig.json.template +50 -29
- package/src/templates/dataSources/mysql.ts.template +16 -13
- package/src/templates/dataSources/postgres.ts.template +15 -13
- package/src/templates/dataset-generator-script.ts.template +139 -139
- package/src/templates/datasets/mysql-default/.slingr-schema.json.template +5 -0
- package/src/templates/datasets/mysql-default/Address.jsonl.template +3 -3
- package/src/templates/datasets/mysql-default/App.jsonl.template +4 -4
- package/src/templates/datasets/mysql-default/Company.jsonl.template +3 -3
- package/src/templates/datasets/mysql-default/Person.jsonl.template +2 -2
- package/src/templates/datasets/mysql-default/User.jsonl.template +1 -0
- package/src/templates/datasets/mysql-default/instructions.md.template +1 -0
- package/src/templates/datasets/postgres-default/.slingr-schema.json.template +5 -0
- package/src/templates/datasets/postgres-default/Address.jsonl.template +3 -3
- package/src/templates/datasets/postgres-default/App.jsonl.template +4 -4
- package/src/templates/datasets/postgres-default/Company.jsonl.template +3 -3
- package/src/templates/datasets/postgres-default/Person.jsonl.template +2 -2
- package/src/templates/datasets/postgres-default/User.jsonl.template +1 -0
- package/src/templates/datasets/postgres-default/instructions.md.template +1 -0
- package/src/templates/docker-compose.prod-test.yml.template +32 -0
- package/src/templates/docker-compose.yml.template +24 -0
- package/src/templates/docs/app-description.md.template +33 -33
- package/src/templates/firebase.json.template +68 -0
- package/src/templates/frontend/.umirc.ts.template +23 -0
- package/src/templates/frontend/package.json.template +45 -0
- package/src/templates/frontend/public/config.json +6 -0
- package/src/templates/frontend/public/logo.svg +6 -0
- package/src/templates/frontend/src/app.tsx.template +44 -0
- package/src/templates/frontend/src/global.less.template +117 -0
- package/src/templates/frontend/src/layouts/MainLayout.tsx.template +75 -0
- package/src/templates/frontend/src/types/graphql-augmentation.d.ts.template +44 -0
- package/src/templates/frontend/src/views/customViews/user/UserCreateView.tsx.template +18 -0
- package/src/templates/frontend/src/views/customViews/user/UserEditView.tsx.template +29 -0
- package/src/templates/frontend/src/views/customViews/user/UserReadView.tsx.template +24 -0
- package/src/templates/frontend/src/views/customViews/user/UserTableView.tsx.template +38 -0
- package/src/templates/frontend/src/views/customViews/welcome.tsx.template +34 -0
- package/src/templates/frontend/tsconfig.json.template +50 -0
- package/src/templates/gql/codegen.yml.template +25 -25
- package/src/templates/gql/index.ts.template +17 -24
- package/src/templates/gql/operations.graphql.template +30 -30
- package/src/templates/ops/README.md.template +1045 -0
- package/src/templates/ops/cloudbuild.yaml.template +161 -0
- package/src/templates/ops/scripts/_utils.js.template +217 -0
- package/src/templates/ops/scripts/deploy.js.template +145 -0
- package/src/templates/ops/scripts/setup-gcp.js.template +330 -0
- package/src/templates/ops/scripts/setup-secrets.js.template +76 -0
- package/src/templates/ops/scripts/test-prod-local.js.template +49 -0
- package/src/templates/package.json.template +50 -38
- package/src/templates/pnpm-workspace.yaml.template +3 -0
- package/src/templates/prompt-analysis.md.template +110 -110
- package/src/templates/prompt-script-generation.md.template +258 -258
- package/src/templates/src/Address.ts.template +28 -31
- package/src/templates/src/App.ts.template +17 -61
- package/src/templates/src/Company.ts.template +41 -47
- package/src/templates/src/Models.test.ts.template +654 -654
- package/src/templates/src/Person.test.ts.template +289 -289
- package/src/templates/src/Person.ts.template +90 -105
- package/src/templates/src/actions/index.ts.template +11 -11
- package/src/templates/src/auth/permissions.ts.template +34 -0
- package/src/templates/src/data/App.ts.template +48 -0
- package/src/templates/src/data/User.ts.template +35 -0
- package/src/templates/src/types/gql.d.ts.template +17 -17
- package/src/templates/vscode/extensions.json +4 -3
- package/src/templates/vscode/settings.json +17 -11
- package/src/templates/workspace-package.json.template +21 -0
- package/dist/templates/src/index.ts +0 -66
- package/src/templates/src/index.ts +0 -66
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const core_1 = require("@oclif/core");
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
10
|
+
const checkFramework_js_1 = require("../utils/checkFramework.js");
|
|
11
|
+
const userManagement_js_1 = require("../utils/userManagement.js");
|
|
12
|
+
class Users extends core_1.Command {
|
|
13
|
+
static description = 'Manage application users';
|
|
14
|
+
static examples = [
|
|
15
|
+
'<%= config.bin %> <%= command.id %> list',
|
|
16
|
+
'<%= config.bin %> <%= command.id %> create',
|
|
17
|
+
'<%= config.bin %> <%= command.id %> create --email john@example.com --first-name John --last-name Doe --password pass123 --roles "Admin,User"',
|
|
18
|
+
'<%= config.bin %> <%= command.id %> set-password john@example.com',
|
|
19
|
+
'<%= config.bin %> <%= command.id %> set-password john@example.com --new-password newpass123',
|
|
20
|
+
'<%= config.bin %> <%= command.id %> reset-password john@example.com',
|
|
21
|
+
'<%= config.bin %> <%= command.id %> activate john@example.com',
|
|
22
|
+
'<%= config.bin %> <%= command.id %> deactivate john@example.com',
|
|
23
|
+
'<%= config.bin %> <%= command.id %> delete john@example.com --force',
|
|
24
|
+
];
|
|
25
|
+
static args = {
|
|
26
|
+
action: core_1.Args.string({
|
|
27
|
+
description: 'Action to perform',
|
|
28
|
+
options: ['list', 'create', 'set-password', 'reset-password', 'activate', 'deactivate', 'delete'],
|
|
29
|
+
required: true,
|
|
30
|
+
}),
|
|
31
|
+
email: core_1.Args.string({
|
|
32
|
+
description: 'User email (required for set-password, reset-password, activate, deactivate, delete)',
|
|
33
|
+
required: false,
|
|
34
|
+
}),
|
|
35
|
+
};
|
|
36
|
+
static flags = {
|
|
37
|
+
help: core_1.Flags.help({ char: 'h' }),
|
|
38
|
+
// For create command
|
|
39
|
+
'first-name': core_1.Flags.string({
|
|
40
|
+
description: 'User first name',
|
|
41
|
+
}),
|
|
42
|
+
'last-name': core_1.Flags.string({
|
|
43
|
+
description: 'User last name',
|
|
44
|
+
}),
|
|
45
|
+
email: core_1.Flags.string({
|
|
46
|
+
char: 'e',
|
|
47
|
+
description: 'User email address',
|
|
48
|
+
}),
|
|
49
|
+
password: core_1.Flags.string({
|
|
50
|
+
char: 'p',
|
|
51
|
+
description: 'User password',
|
|
52
|
+
}),
|
|
53
|
+
roles: core_1.Flags.string({
|
|
54
|
+
char: 'r',
|
|
55
|
+
description: 'Comma-separated list of roles',
|
|
56
|
+
}),
|
|
57
|
+
// For set-password command
|
|
58
|
+
'new-password': core_1.Flags.string({
|
|
59
|
+
description: 'New password for the user',
|
|
60
|
+
}),
|
|
61
|
+
// General flags
|
|
62
|
+
force: core_1.Flags.boolean({
|
|
63
|
+
char: 'f',
|
|
64
|
+
description: 'Skip confirmation prompts for destructive operations',
|
|
65
|
+
default: false,
|
|
66
|
+
}),
|
|
67
|
+
datasource: core_1.Flags.string({
|
|
68
|
+
char: 'd',
|
|
69
|
+
description: 'DataSource name (auto-discovered from User model if not specified)',
|
|
70
|
+
}),
|
|
71
|
+
};
|
|
72
|
+
async run() {
|
|
73
|
+
const { args, flags } = await this.parse(Users);
|
|
74
|
+
// Validate environment
|
|
75
|
+
await this.validateEnvironment();
|
|
76
|
+
// Validate email argument for commands that require it
|
|
77
|
+
if (['set-password', 'reset-password', 'activate', 'deactivate', 'delete'].includes(args.action)) {
|
|
78
|
+
if (!args.email) {
|
|
79
|
+
this.error(`Email argument is required for ${args.action} action`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Store datasource reference for cleanup
|
|
83
|
+
let dataSource = null;
|
|
84
|
+
// Dispatch to appropriate handler
|
|
85
|
+
try {
|
|
86
|
+
switch (args.action) {
|
|
87
|
+
case 'list':
|
|
88
|
+
dataSource = await this.listUsers(flags);
|
|
89
|
+
break;
|
|
90
|
+
case 'create':
|
|
91
|
+
dataSource = await this.createUser(flags);
|
|
92
|
+
break;
|
|
93
|
+
case 'set-password':
|
|
94
|
+
dataSource = await this.setPassword(args.email, flags);
|
|
95
|
+
break;
|
|
96
|
+
case 'reset-password':
|
|
97
|
+
dataSource = await this.resetPassword(args.email, flags);
|
|
98
|
+
break;
|
|
99
|
+
case 'activate':
|
|
100
|
+
dataSource = await this.activateUser(args.email, flags);
|
|
101
|
+
break;
|
|
102
|
+
case 'deactivate':
|
|
103
|
+
dataSource = await this.deactivateUser(args.email, flags);
|
|
104
|
+
break;
|
|
105
|
+
case 'delete':
|
|
106
|
+
dataSource = await this.deleteUser(args.email, flags);
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
// Handle common database connection errors
|
|
112
|
+
if (error.message?.includes('ECONNREFUSED') || error.message?.includes('Connection refused')) {
|
|
113
|
+
this.error(`â Cannot connect to database.\n\n` +
|
|
114
|
+
`The database infrastructure exists but is not running.\n\n` +
|
|
115
|
+
`To fix this, run:\n` +
|
|
116
|
+
` âĸ slingr run\n` +
|
|
117
|
+
`OR\n` +
|
|
118
|
+
` âĸ docker-compose up -d`);
|
|
119
|
+
}
|
|
120
|
+
this.error(`Failed to ${args.action} user: ${error.message}`);
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
// Clean up database connection
|
|
124
|
+
if (dataSource && dataSource.getTypeOrmDataSource()?.isInitialized) {
|
|
125
|
+
await dataSource.getTypeOrmDataSource()?.destroy();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async validateEnvironment() {
|
|
130
|
+
// Check package.json exists
|
|
131
|
+
const pkgPath = node_path_1.default.join(process.cwd(), 'package.json');
|
|
132
|
+
if (!(await fs_extra_1.default.pathExists(pkgPath))) {
|
|
133
|
+
this.error('â Not in a Slingr application directory.\n\n' + "Please run this command from your app's root directory.");
|
|
134
|
+
}
|
|
135
|
+
// Check it's a Slingr app
|
|
136
|
+
if (!(await (0, checkFramework_js_1.hasSlingrFramework)())) {
|
|
137
|
+
this.error('â This directory does not contain a Slingr application.');
|
|
138
|
+
}
|
|
139
|
+
// Check backend/dist directory exists (app must be built)
|
|
140
|
+
const backendPath = (0, checkFramework_js_1.getBackendPath)();
|
|
141
|
+
const distPath = node_path_1.default.join(backendPath, 'dist');
|
|
142
|
+
if (!(await fs_extra_1.default.pathExists(distPath))) {
|
|
143
|
+
this.error('â Application not built.\n\n' +
|
|
144
|
+
'Please run "npm run build" from the backend directory before using this command.');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async listUsers(flags) {
|
|
148
|
+
this.log('đ Loading users...\n');
|
|
149
|
+
const dataSource = await (0, userManagement_js_1.loadDataSource)(flags.datasource);
|
|
150
|
+
const userRepo = await (0, userManagement_js_1.getUserRepository)(dataSource);
|
|
151
|
+
const users = await userRepo.find();
|
|
152
|
+
if (users.length === 0) {
|
|
153
|
+
this.log('No users found in the database.\n');
|
|
154
|
+
return dataSource;
|
|
155
|
+
}
|
|
156
|
+
this.log('Users in application:\n');
|
|
157
|
+
let activeCount = 0;
|
|
158
|
+
let inactiveCount = 0;
|
|
159
|
+
for (const user of users) {
|
|
160
|
+
this.log(` ${(0, userManagement_js_1.formatUser)(user)}`);
|
|
161
|
+
if (user.status === 'active') {
|
|
162
|
+
activeCount++;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
inactiveCount++;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
this.log('');
|
|
169
|
+
this.log(`Total: ${users.length} users (${activeCount} active, ${inactiveCount} inactive)`);
|
|
170
|
+
this.log('');
|
|
171
|
+
return dataSource;
|
|
172
|
+
}
|
|
173
|
+
async createUser(flags) {
|
|
174
|
+
this.log('đ¤ Creating new user...\n');
|
|
175
|
+
// Load framework utilities
|
|
176
|
+
this.log('đĻ Loading framework utilities...');
|
|
177
|
+
const framework = await import('@slingr/framework-backend');
|
|
178
|
+
const { createUser: frameworkCreateUser } = framework;
|
|
179
|
+
this.log('đ Loading datasource...');
|
|
180
|
+
const dataSource = await (0, userManagement_js_1.loadDataSource)(flags.datasource);
|
|
181
|
+
this.log('đ Loading User model...');
|
|
182
|
+
const UserModel = await (0, userManagement_js_1.loadUserModel)();
|
|
183
|
+
this.log('đ Getting user repository...');
|
|
184
|
+
const userRepo = await (0, userManagement_js_1.getUserRepository)(dataSource);
|
|
185
|
+
this.log('â
Repository loaded\n');
|
|
186
|
+
// Collect user data (interactive or from flags)
|
|
187
|
+
let firstName = flags['first-name'];
|
|
188
|
+
let lastName = flags['last-name'];
|
|
189
|
+
let email = flags.email;
|
|
190
|
+
let password = flags.password;
|
|
191
|
+
let rolesStr = flags.roles;
|
|
192
|
+
// Interactive mode if flags not provided
|
|
193
|
+
if (!firstName) {
|
|
194
|
+
const answer = await inquirer_1.default.prompt([
|
|
195
|
+
{
|
|
196
|
+
type: 'input',
|
|
197
|
+
name: 'firstName',
|
|
198
|
+
message: 'First name:',
|
|
199
|
+
validate: (input) => (input.length > 0 ? true : 'First name is required'),
|
|
200
|
+
},
|
|
201
|
+
]);
|
|
202
|
+
firstName = answer.firstName;
|
|
203
|
+
}
|
|
204
|
+
if (!lastName) {
|
|
205
|
+
const answer = await inquirer_1.default.prompt([
|
|
206
|
+
{
|
|
207
|
+
type: 'input',
|
|
208
|
+
name: 'lastName',
|
|
209
|
+
message: 'Last name:',
|
|
210
|
+
validate: (input) => (input.length > 0 ? true : 'Last name is required'),
|
|
211
|
+
},
|
|
212
|
+
]);
|
|
213
|
+
lastName = answer.lastName;
|
|
214
|
+
}
|
|
215
|
+
if (!email) {
|
|
216
|
+
const answer = await inquirer_1.default.prompt([
|
|
217
|
+
{
|
|
218
|
+
type: 'input',
|
|
219
|
+
name: 'email',
|
|
220
|
+
message: 'Email:',
|
|
221
|
+
validate: (input) => {
|
|
222
|
+
if (!(0, userManagement_js_1.validateEmail)(input)) {
|
|
223
|
+
return 'Please enter a valid email address';
|
|
224
|
+
}
|
|
225
|
+
return true;
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
]);
|
|
229
|
+
email = answer.email;
|
|
230
|
+
}
|
|
231
|
+
else if (!(0, userManagement_js_1.validateEmail)(email)) {
|
|
232
|
+
this.error('â Invalid email address format');
|
|
233
|
+
}
|
|
234
|
+
// Check if user already exists
|
|
235
|
+
const existingUser = await (0, userManagement_js_1.findUserByEmail)(email, userRepo);
|
|
236
|
+
if (existingUser) {
|
|
237
|
+
this.error(`â User with email ${email} already exists\n\n` +
|
|
238
|
+
`To update the password, run:\n` +
|
|
239
|
+
` âĸ slingr users set-password ${email}`);
|
|
240
|
+
}
|
|
241
|
+
if (!password) {
|
|
242
|
+
password = await (0, userManagement_js_1.promptPassword)('Password (min 8 characters):');
|
|
243
|
+
}
|
|
244
|
+
else if (password.length < 8) {
|
|
245
|
+
this.error('â Password must be at least 8 characters long');
|
|
246
|
+
}
|
|
247
|
+
// Get available roles
|
|
248
|
+
const availableRoles = await (0, userManagement_js_1.getAvailableRoles)();
|
|
249
|
+
if (!rolesStr) {
|
|
250
|
+
const answer = await inquirer_1.default.prompt([
|
|
251
|
+
{
|
|
252
|
+
type: 'input',
|
|
253
|
+
name: 'roles',
|
|
254
|
+
message: `Roles (comma-separated, available: ${availableRoles.join(', ')}):`,
|
|
255
|
+
default: availableRoles[0] || '',
|
|
256
|
+
validate: async (input) => {
|
|
257
|
+
if (!input) {
|
|
258
|
+
return true;
|
|
259
|
+
} // Optional
|
|
260
|
+
const roles = input.split(',').map(r => r.trim());
|
|
261
|
+
const validation = await (0, userManagement_js_1.validateRoles)(roles);
|
|
262
|
+
if (!validation.valid) {
|
|
263
|
+
return `Invalid roles: ${validation.invalidRoles.join(', ')}. Available: ${availableRoles.join(', ')}`;
|
|
264
|
+
}
|
|
265
|
+
return true;
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
]);
|
|
269
|
+
rolesStr = answer.roles;
|
|
270
|
+
}
|
|
271
|
+
const roles = rolesStr
|
|
272
|
+
? rolesStr
|
|
273
|
+
.split(',')
|
|
274
|
+
.map((r) => r.trim())
|
|
275
|
+
.filter((r) => r.length > 0)
|
|
276
|
+
: [];
|
|
277
|
+
// Validate roles
|
|
278
|
+
if (roles.length > 0) {
|
|
279
|
+
const validation = await (0, userManagement_js_1.validateRoles)(roles);
|
|
280
|
+
if (!validation.valid) {
|
|
281
|
+
this.error(`â Invalid roles: ${validation.invalidRoles.join(', ')}\n\n` +
|
|
282
|
+
`Available roles in your app:\n` +
|
|
283
|
+
availableRoles.map((r) => ` âĸ ${r}`).join('\n') +
|
|
284
|
+
`\n\nCheck src/data/User.ts to add new roles.`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// Create user model instance
|
|
288
|
+
this.log('đ¤ Creating user instance...');
|
|
289
|
+
const user = new UserModel();
|
|
290
|
+
user.firstName = firstName;
|
|
291
|
+
user.lastName = lastName;
|
|
292
|
+
user.email = email;
|
|
293
|
+
user.password = password; // Plain password - framework will hash it
|
|
294
|
+
user.roles = roles.length > 0 ? roles : undefined;
|
|
295
|
+
user.status = 'active';
|
|
296
|
+
// Save user using framework's createUser function
|
|
297
|
+
// This handles password hashing, validation, and array field persistence
|
|
298
|
+
this.log('đž Saving user to database...');
|
|
299
|
+
await frameworkCreateUser(user);
|
|
300
|
+
this.log('');
|
|
301
|
+
this.log('â
User created successfully!');
|
|
302
|
+
this.log('');
|
|
303
|
+
this.log(`đ§ Email: ${email}`);
|
|
304
|
+
this.log(`đ¤ Name: ${firstName} ${lastName}`);
|
|
305
|
+
if (roles.length > 0) {
|
|
306
|
+
this.log(`đ Roles: ${roles.join(', ')}`);
|
|
307
|
+
}
|
|
308
|
+
this.log('');
|
|
309
|
+
return dataSource;
|
|
310
|
+
}
|
|
311
|
+
async setPassword(email, flags) {
|
|
312
|
+
this.log(`đ Setting password for ${email}...\n`);
|
|
313
|
+
const framework = await import('@slingr/framework-backend');
|
|
314
|
+
const hashUserPassword = framework.hashUserPassword;
|
|
315
|
+
const dataSource = await (0, userManagement_js_1.loadDataSource)(flags.datasource);
|
|
316
|
+
const userRepo = await (0, userManagement_js_1.getUserRepository)(dataSource);
|
|
317
|
+
// Find user
|
|
318
|
+
const user = await (0, userManagement_js_1.findUserByEmail)(email, userRepo);
|
|
319
|
+
if (!user) {
|
|
320
|
+
this.error(`â User not found: ${email}\n\n` + `To see all users, run:\n` + ` âĸ slingr users list`);
|
|
321
|
+
}
|
|
322
|
+
// Get new password
|
|
323
|
+
let newPassword = flags['new-password'];
|
|
324
|
+
if (!newPassword) {
|
|
325
|
+
newPassword = await (0, userManagement_js_1.promptPassword)('New password (min 8 characters):');
|
|
326
|
+
}
|
|
327
|
+
else if (newPassword.length < 8) {
|
|
328
|
+
this.error('â Password must be at least 8 characters long');
|
|
329
|
+
}
|
|
330
|
+
// Hash and update password
|
|
331
|
+
user.password = await hashUserPassword(newPassword);
|
|
332
|
+
await userRepo.save(user);
|
|
333
|
+
this.log('');
|
|
334
|
+
this.log(`â
Password updated successfully for ${email}`);
|
|
335
|
+
this.log('');
|
|
336
|
+
return dataSource;
|
|
337
|
+
}
|
|
338
|
+
async resetPassword(email, flags) {
|
|
339
|
+
this.log(`đ Resetting password for ${email}...\n`);
|
|
340
|
+
const { hashUserPassword } = await import('@slingr/framework-backend');
|
|
341
|
+
const dataSource = await (0, userManagement_js_1.loadDataSource)(flags.datasource);
|
|
342
|
+
const userRepo = await (0, userManagement_js_1.getUserRepository)(dataSource);
|
|
343
|
+
// Find user
|
|
344
|
+
const user = await (0, userManagement_js_1.findUserByEmail)(email, userRepo);
|
|
345
|
+
if (!user) {
|
|
346
|
+
this.error(`â User not found: ${email}\n\n` + `To see all users, run:\n` + ` âĸ slingr users list`);
|
|
347
|
+
}
|
|
348
|
+
// Confirmation (unless --force)
|
|
349
|
+
if (!flags.force) {
|
|
350
|
+
this.log(`â ī¸ WARNING: This will reset the password for ${email}\n`);
|
|
351
|
+
const confirmed = await (0, userManagement_js_1.promptConfirmation)('Are you sure?', false);
|
|
352
|
+
if (!confirmed) {
|
|
353
|
+
this.log('Operation cancelled');
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
this.log('');
|
|
357
|
+
}
|
|
358
|
+
// Generate random password
|
|
359
|
+
const newPassword = (0, userManagement_js_1.generateRandomPassword)(12);
|
|
360
|
+
// Hash and update password
|
|
361
|
+
user.password = await hashUserPassword(newPassword);
|
|
362
|
+
await userRepo.save(user);
|
|
363
|
+
this.log('đ Password reset successfully!');
|
|
364
|
+
this.log('');
|
|
365
|
+
this.log(`Temporary password: ${newPassword}`);
|
|
366
|
+
this.log('');
|
|
367
|
+
this.log('â ī¸ Make sure to save this password - it will not be shown again!');
|
|
368
|
+
this.log('');
|
|
369
|
+
return dataSource;
|
|
370
|
+
}
|
|
371
|
+
async activateUser(email, flags) {
|
|
372
|
+
this.log(`â
Activating user ${email}...\n`);
|
|
373
|
+
const { activateUser } = await import('@slingr/framework-backend');
|
|
374
|
+
const dataSource = await (0, userManagement_js_1.loadDataSource)(flags.datasource);
|
|
375
|
+
const userRepo = await (0, userManagement_js_1.getUserRepository)(dataSource);
|
|
376
|
+
// Find user
|
|
377
|
+
const user = await (0, userManagement_js_1.findUserByEmail)(email, userRepo);
|
|
378
|
+
if (!user) {
|
|
379
|
+
this.error(`â User not found: ${email}\n\n` + `To see all users, run:\n` + ` âĸ slingr users list`);
|
|
380
|
+
}
|
|
381
|
+
// Check if already active
|
|
382
|
+
if (user.status === 'active') {
|
|
383
|
+
this.log(`âšī¸ User ${email} is already active\n`);
|
|
384
|
+
return dataSource;
|
|
385
|
+
}
|
|
386
|
+
// Activate user
|
|
387
|
+
await activateUser(user);
|
|
388
|
+
await userRepo.save(user);
|
|
389
|
+
this.log(`â
User ${email} activated successfully\n`);
|
|
390
|
+
return dataSource;
|
|
391
|
+
}
|
|
392
|
+
async deactivateUser(email, flags) {
|
|
393
|
+
this.log(`â ī¸ Deactivating user ${email}...\n`);
|
|
394
|
+
const { deactivateUser } = await import('@slingr/framework-backend');
|
|
395
|
+
const dataSource = await (0, userManagement_js_1.loadDataSource)(flags.datasource);
|
|
396
|
+
const userRepo = await (0, userManagement_js_1.getUserRepository)(dataSource);
|
|
397
|
+
// Find user
|
|
398
|
+
const user = await (0, userManagement_js_1.findUserByEmail)(email, userRepo);
|
|
399
|
+
if (!user) {
|
|
400
|
+
this.error(`â User not found: ${email}\n\n` + `To see all users, run:\n` + ` âĸ slingr users list`);
|
|
401
|
+
}
|
|
402
|
+
// Check if already inactive
|
|
403
|
+
if (user.status === 'inactive') {
|
|
404
|
+
this.log(`âšī¸ User ${email} is already inactive\n`);
|
|
405
|
+
return dataSource;
|
|
406
|
+
}
|
|
407
|
+
// Warn if trying to deactivate System user
|
|
408
|
+
if (user.roles?.includes('System')) {
|
|
409
|
+
this.log(`â ī¸ WARNING: You are about to deactivate a System user!\n`);
|
|
410
|
+
}
|
|
411
|
+
// Confirmation (unless --force)
|
|
412
|
+
if (!flags.force) {
|
|
413
|
+
const confirmed = await (0, userManagement_js_1.promptConfirmation)('Are you sure?', false);
|
|
414
|
+
if (!confirmed) {
|
|
415
|
+
this.log('Operation cancelled');
|
|
416
|
+
return dataSource;
|
|
417
|
+
}
|
|
418
|
+
this.log('');
|
|
419
|
+
}
|
|
420
|
+
// Deactivate user
|
|
421
|
+
await deactivateUser(user);
|
|
422
|
+
await userRepo.save(user);
|
|
423
|
+
this.log(`â ī¸ User ${email} deactivated successfully\n`);
|
|
424
|
+
return dataSource;
|
|
425
|
+
}
|
|
426
|
+
async deleteUser(email, flags) {
|
|
427
|
+
this.log(`đī¸ Deleting user ${email}...\n`);
|
|
428
|
+
const dataSource = await (0, userManagement_js_1.loadDataSource)(flags.datasource);
|
|
429
|
+
const userRepo = await (0, userManagement_js_1.getUserRepository)(dataSource);
|
|
430
|
+
// Find user
|
|
431
|
+
const user = await (0, userManagement_js_1.findUserByEmail)(email, userRepo);
|
|
432
|
+
if (!user) {
|
|
433
|
+
this.error(`â User not found: ${email}\n\n` + `To see all users, run:\n` + ` âĸ slingr users list`);
|
|
434
|
+
}
|
|
435
|
+
// Prevent deleting System user
|
|
436
|
+
if (user.roles?.includes('System')) {
|
|
437
|
+
this.error(`â Cannot delete System user!\n\n` +
|
|
438
|
+
`System users are critical for application management and cannot be deleted.`);
|
|
439
|
+
}
|
|
440
|
+
// Strong confirmation (unless --force)
|
|
441
|
+
if (!flags.force) {
|
|
442
|
+
this.log(`â ī¸ WARNING: This will permanently delete the user!\n`);
|
|
443
|
+
this.log(`Email: ${email}`);
|
|
444
|
+
this.log(`Name: ${user.firstName} ${user.lastName}`);
|
|
445
|
+
this.log('');
|
|
446
|
+
const answer = await inquirer_1.default.prompt([
|
|
447
|
+
{
|
|
448
|
+
type: 'input',
|
|
449
|
+
name: 'confirmation',
|
|
450
|
+
message: 'Type "DELETE" to confirm:',
|
|
451
|
+
validate: (input) => {
|
|
452
|
+
if (input !== 'DELETE') {
|
|
453
|
+
return 'You must type "DELETE" to confirm';
|
|
454
|
+
}
|
|
455
|
+
return true;
|
|
456
|
+
},
|
|
457
|
+
},
|
|
458
|
+
]);
|
|
459
|
+
if (answer.confirmation !== 'DELETE') {
|
|
460
|
+
this.log('Operation cancelled');
|
|
461
|
+
return dataSource;
|
|
462
|
+
}
|
|
463
|
+
this.log('');
|
|
464
|
+
}
|
|
465
|
+
// Delete user
|
|
466
|
+
await userRepo.remove(user);
|
|
467
|
+
this.log(`đī¸ User ${email} deleted successfully\n`);
|
|
468
|
+
return dataSource;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
exports.default = Users;
|
|
472
|
+
//# sourceMappingURL=users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/commands/users.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class Views extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
action: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
private generateContext;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=views.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/commands/views.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAE,MAAM,aAAa,CAAC;AAO5C,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,OAAgB,WAAW,SAAqD;IAEhF,OAAgB,QAAQ,WAA4D;IAEpF,OAAgB,IAAI;;MAMlB;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YA4BnB,eAAe;CA6B9B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const core_1 = require("@oclif/core");
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const checkFramework_js_1 = require("../utils/checkFramework.js");
|
|
10
|
+
const viewsGenerator_js_1 = require("../utils/viewsGenerator.js");
|
|
11
|
+
class Views extends core_1.Command {
|
|
12
|
+
static description = 'Manage custom views for your Slingr application';
|
|
13
|
+
static examples = ['<%= config.bin %> <%= command.id %> generate-context'];
|
|
14
|
+
static args = {
|
|
15
|
+
action: core_1.Args.string({
|
|
16
|
+
description: 'Action to perform (generate-context)',
|
|
17
|
+
options: ['generate-context'],
|
|
18
|
+
required: true,
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
async run() {
|
|
22
|
+
const { args } = await this.parse(Views);
|
|
23
|
+
const { action } = args;
|
|
24
|
+
// Verify we're in a Slingr app directory
|
|
25
|
+
const pkgPath = node_path_1.default.join(process.cwd(), 'package.json');
|
|
26
|
+
if (!(await fs_extra_1.default.pathExists(pkgPath))) {
|
|
27
|
+
this.error("Not in a Slingr application directory. Please run this command from your app's root directory.");
|
|
28
|
+
}
|
|
29
|
+
// Check if the app uses @slingr/framework-backend
|
|
30
|
+
if (!(await (0, checkFramework_js_1.hasSlingrFramework)())) {
|
|
31
|
+
this.error('This directory does not contain a Slingr application.');
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
switch (action) {
|
|
35
|
+
case 'generate-context':
|
|
36
|
+
await this.generateContext();
|
|
37
|
+
break;
|
|
38
|
+
default:
|
|
39
|
+
this.error(`Unknown action: ${action}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
this.error(`Failed to ${action}: ${error.message}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async generateContext() {
|
|
47
|
+
this.log('đ Scanning for views...');
|
|
48
|
+
const frontendPath = node_path_1.default.join(process.cwd(), 'frontend');
|
|
49
|
+
if (!(await fs_extra_1.default.pathExists(frontendPath))) {
|
|
50
|
+
this.error('Frontend directory not found.\n\n' +
|
|
51
|
+
'Expected frontend directory at: ' +
|
|
52
|
+
frontendPath +
|
|
53
|
+
'\n\n' +
|
|
54
|
+
'This command requires a Slingr application with a frontend.');
|
|
55
|
+
}
|
|
56
|
+
const generated = await (0, viewsGenerator_js_1.generateViewsContext)(process.cwd());
|
|
57
|
+
if (generated) {
|
|
58
|
+
this.log('');
|
|
59
|
+
this.log('â
Context file generated successfully!');
|
|
60
|
+
this.log('');
|
|
61
|
+
this.log('đ Location: frontend/generated/context.ts');
|
|
62
|
+
this.log('đ Location: frontend/generated/views.ts');
|
|
63
|
+
this.log('đ Location: backend/generated/views.ts');
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.log('');
|
|
67
|
+
this.log('âšī¸ No views found or frontend directory does not exist.');
|
|
68
|
+
this.log(' Context file was not generated.');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.default = Views;
|
|
73
|
+
//# sourceMappingURL=views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/commands/views.ts"],"names":[],"mappings":";;;;;AAAA,sCAA4C;AAC5C,wDAA0B;AAC1B,0DAA6B;AAE7B,kEAAgE;AAChE,kEAAkE;AAElE,MAAqB,KAAM,SAAQ,cAAO;IACxC,MAAM,CAAU,WAAW,GAAG,iDAAiD,CAAC;IAEhF,MAAM,CAAU,QAAQ,GAAG,CAAC,sDAAsD,CAAC,CAAC;IAEpF,MAAM,CAAU,IAAI,GAAG;QACrB,MAAM,EAAE,WAAI,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,sCAAsC;YACnD,OAAO,EAAE,CAAC,kBAAkB,CAAC;YAC7B,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAExB,yCAAyC;QACzC,MAAM,OAAO,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QACzD,IAAI,CAAC,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,CAAC,gGAAgG,CAAC,CAAC;QAC/G,CAAC;QAED,kDAAkD;QAClD,IAAI,CAAC,CAAC,MAAM,IAAA,sCAAkB,GAAE,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,CAAC;YACH,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,kBAAkB;oBACrB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC7B,MAAM;gBACR;oBACE,IAAI,CAAC,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,aAAa,MAAM,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAErC,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,CACR,mCAAmC;gBACjC,kCAAkC;gBAClC,YAAY;gBACZ,MAAM;gBACN,6DAA6D,CAChE,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAA,wCAAoB,EAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAE5D,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACnD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YACvD,IAAI,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACrD,IAAI,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;YACrE,IAAI,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;;AArEH,wBAsEC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectStructure.d.ts","sourceRoot":"","sources":["../src/projectStructure.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"projectStructure.d.ts","sourceRoot":"","sources":["../src/projectStructure.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AA0FD,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA8dhG"}
|