@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,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isDockerRunning = isDockerRunning;
|
|
4
|
+
exports.tryStartDocker = tryStartDocker;
|
|
5
|
+
exports.ensureDockerIsRunning = ensureDockerIsRunning;
|
|
6
|
+
const child_process_1 = require("child_process");
|
|
7
|
+
const DOCKER_READY_CYCLE_TIMEOUT_ENV = 'SLINGR_DOCKER_READY_CYCLE_TIMEOUT_MS';
|
|
8
|
+
const DOCKER_READY_MAX_TOTAL_TIMEOUT_ENV = 'SLINGR_DOCKER_READY_MAX_TOTAL_TIMEOUT_MS';
|
|
9
|
+
const DEFAULT_DOCKER_READY_CYCLE_TIMEOUT_MS = 30_000;
|
|
10
|
+
const DEFAULT_DOCKER_READY_MAX_TOTAL_TIMEOUT_MS = 120_000;
|
|
11
|
+
const MIN_DOCKER_TIMEOUT_MS = 5_000;
|
|
12
|
+
const DEFAULT_DOCKER_READY_DELAY_MS = 2_000;
|
|
13
|
+
const DEFAULT_DOCKER_START_ATTEMPT_TIMEOUT_MS = 5_000;
|
|
14
|
+
const DEFAULT_DOCKER_START_RETRY_INTERVAL_MS = 5_000;
|
|
15
|
+
const DOCKER_PROBE_COMMAND = 'docker ps';
|
|
16
|
+
class DockerPermissionError extends Error {
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = 'DockerPermissionError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function isWslEnvironment() {
|
|
23
|
+
return Boolean(process.env.WSL_DISTRO_NAME || process.env.WSL_INTEROP);
|
|
24
|
+
}
|
|
25
|
+
function parseTimeoutFromEnv(envName, defaultValue) {
|
|
26
|
+
const rawValue = process.env[envName];
|
|
27
|
+
if (!rawValue) {
|
|
28
|
+
return defaultValue;
|
|
29
|
+
}
|
|
30
|
+
const parsedValue = Number.parseInt(rawValue, 10);
|
|
31
|
+
if (!Number.isFinite(parsedValue) || parsedValue < MIN_DOCKER_TIMEOUT_MS) {
|
|
32
|
+
console.warn(`Invalid ${envName}='${rawValue}'. Using default ${defaultValue}ms.`);
|
|
33
|
+
return defaultValue;
|
|
34
|
+
}
|
|
35
|
+
return parsedValue;
|
|
36
|
+
}
|
|
37
|
+
function getDockerTimeoutConfig() {
|
|
38
|
+
const cycleTimeoutMs = parseTimeoutFromEnv(DOCKER_READY_CYCLE_TIMEOUT_ENV, DEFAULT_DOCKER_READY_CYCLE_TIMEOUT_MS);
|
|
39
|
+
const maxTotalTimeoutMs = parseTimeoutFromEnv(DOCKER_READY_MAX_TOTAL_TIMEOUT_ENV, DEFAULT_DOCKER_READY_MAX_TOTAL_TIMEOUT_MS);
|
|
40
|
+
return {
|
|
41
|
+
cycleTimeoutMs,
|
|
42
|
+
maxTotalTimeoutMs,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function canRunDockerCommand(timeout = 5000) {
|
|
46
|
+
try {
|
|
47
|
+
(0, child_process_1.execSync)(DOCKER_PROBE_COMMAND, { stdio: 'pipe', timeout });
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function isDockerPermissionDeniedError(errorMessage) {
|
|
55
|
+
return /permission denied|got permission denied/i.test(errorMessage);
|
|
56
|
+
}
|
|
57
|
+
function getLinuxPermissionsHintMessage() {
|
|
58
|
+
return ('Docker is running but your user does not have permission to access the Docker daemon.\n' +
|
|
59
|
+
'Add your user to the docker group and re-open your shell:\n' +
|
|
60
|
+
` sudo usermod -aG docker $USER\n` +
|
|
61
|
+
' newgrp docker\n' +
|
|
62
|
+
'Or run docker commands with sudo.');
|
|
63
|
+
}
|
|
64
|
+
function showLinuxPermissionsHint() {
|
|
65
|
+
console.warn(`\n⚠️ ${getLinuxPermissionsHintMessage()}`);
|
|
66
|
+
}
|
|
67
|
+
function getStartPlanForPlatform(platform) {
|
|
68
|
+
if (platform === 'darwin') {
|
|
69
|
+
return {
|
|
70
|
+
introLog: 'Starting Docker Desktop on macOS...',
|
|
71
|
+
attempts: [{ label: 'open Docker Desktop', command: 'open -a Docker' }],
|
|
72
|
+
failureLog: 'Failed to start Docker Desktop. Please start it manually from Applications.',
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if (platform === 'win32') {
|
|
76
|
+
return {
|
|
77
|
+
introLog: 'Starting Docker Desktop on Windows...',
|
|
78
|
+
attempts: [
|
|
79
|
+
{
|
|
80
|
+
label: 'start Docker Desktop executable',
|
|
81
|
+
command: 'start "" "C:\\Program Files\\Docker\\Docker\\Docker Desktop.exe"',
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
failureLog: 'Failed to start Docker Desktop. Please start it manually from the Start menu.',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
if (platform === 'linux') {
|
|
88
|
+
const attempts = [];
|
|
89
|
+
if (isWslEnvironment()) {
|
|
90
|
+
attempts.push({
|
|
91
|
+
label: 'start Docker Desktop from Windows host via PowerShell',
|
|
92
|
+
command: 'powershell.exe -NoProfile -Command "Start-Process \'C:\\Program Files\\Docker\\Docker\\Docker Desktop.exe\'"',
|
|
93
|
+
}, {
|
|
94
|
+
label: 'start Docker Desktop from Windows host via cmd',
|
|
95
|
+
command: 'cmd.exe /C start "" "C:\\Program Files\\Docker\\Docker\\Docker Desktop.exe"',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
attempts.push({ label: 'docker desktop start', command: 'docker desktop start' }, { label: 'systemd user docker-desktop', command: 'systemctl --user start docker-desktop' }, {
|
|
99
|
+
label: 'systemd docker engine',
|
|
100
|
+
command: 'sudo systemctl start docker',
|
|
101
|
+
stdio: 'inherit',
|
|
102
|
+
showLinuxPermissionHint: true,
|
|
103
|
+
}, {
|
|
104
|
+
label: 'service docker engine',
|
|
105
|
+
command: 'sudo service docker start',
|
|
106
|
+
stdio: 'inherit',
|
|
107
|
+
showLinuxPermissionHint: true,
|
|
108
|
+
});
|
|
109
|
+
return {
|
|
110
|
+
introLog: 'Starting Docker on Linux...',
|
|
111
|
+
attempts,
|
|
112
|
+
failureLog: 'Failed to start Docker automatically on Linux.',
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Utility functions for Docker management.
|
|
119
|
+
* Provides automatic Docker daemon startup and health checking.
|
|
120
|
+
*/
|
|
121
|
+
/**
|
|
122
|
+
* Check if Docker is running by attempting to execute `docker ps`.
|
|
123
|
+
*
|
|
124
|
+
* @returns true if Docker daemon is running, false otherwise
|
|
125
|
+
*/
|
|
126
|
+
function isDockerRunning() {
|
|
127
|
+
return canRunDockerCommand();
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Attempt to start Docker daemon based on the operating system.
|
|
131
|
+
* Tries different commands based on the platform.
|
|
132
|
+
*
|
|
133
|
+
* @returns Promise resolving to true if Docker was started successfully, false otherwise
|
|
134
|
+
*/
|
|
135
|
+
async function tryStartDocker() {
|
|
136
|
+
const { cycleTimeoutMs, maxTotalTimeoutMs } = getDockerTimeoutConfig();
|
|
137
|
+
const totalDeadline = Date.now() + maxTotalTimeoutMs;
|
|
138
|
+
let permissionError;
|
|
139
|
+
try {
|
|
140
|
+
const platform = process.platform;
|
|
141
|
+
const startPlan = getStartPlanForPlatform(platform);
|
|
142
|
+
if (!startPlan) {
|
|
143
|
+
console.warn(`Unsupported platform: ${platform}. Cannot auto-start Docker.`);
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
if (isWslEnvironment() && platform === 'linux') {
|
|
147
|
+
console.log('WSL environment detected. Trying to start Docker Desktop on Windows...');
|
|
148
|
+
}
|
|
149
|
+
console.log(startPlan.introLog);
|
|
150
|
+
while (Date.now() < totalDeadline) {
|
|
151
|
+
const remainingTotalMs = Math.max(0, totalDeadline - Date.now());
|
|
152
|
+
const currentCycleTimeoutMs = Math.min(cycleTimeoutMs, remainingTotalMs);
|
|
153
|
+
for (const attempt of startPlan.attempts) {
|
|
154
|
+
if (Date.now() >= totalDeadline) {
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
const attemptStdio = attempt.stdio ?? 'pipe';
|
|
158
|
+
const isInteractive = attemptStdio === 'inherit';
|
|
159
|
+
const commandTimeoutMs = isInteractive
|
|
160
|
+
? currentCycleTimeoutMs
|
|
161
|
+
: Math.min(DEFAULT_DOCKER_START_ATTEMPT_TIMEOUT_MS, currentCycleTimeoutMs);
|
|
162
|
+
const periodicStart = {
|
|
163
|
+
command: attempt.command,
|
|
164
|
+
stdio: attemptStdio,
|
|
165
|
+
commandTimeoutMs,
|
|
166
|
+
retryIntervalMs: DEFAULT_DOCKER_START_RETRY_INTERVAL_MS,
|
|
167
|
+
};
|
|
168
|
+
try {
|
|
169
|
+
console.log(`Attempting: ${attempt.label}...`);
|
|
170
|
+
await waitForDockerReady(currentCycleTimeoutMs, DEFAULT_DOCKER_READY_DELAY_MS, periodicStart);
|
|
171
|
+
if (attempt.showLinuxPermissionHint) {
|
|
172
|
+
showLinuxPermissionsHint();
|
|
173
|
+
}
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
if (error instanceof DockerPermissionError) {
|
|
178
|
+
permissionError = error;
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (permissionError) {
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
if (Date.now() < totalDeadline) {
|
|
188
|
+
console.log('Docker is still not ready after the current cycle. Retrying startup sequence...');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (permissionError) {
|
|
192
|
+
throw permissionError;
|
|
193
|
+
}
|
|
194
|
+
console.warn(startPlan.failureLog);
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
if (error instanceof DockerPermissionError) {
|
|
199
|
+
throw error;
|
|
200
|
+
}
|
|
201
|
+
console.warn(`Error attempting to start Docker: ${error.message}`);
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Wait for Docker daemon to be ready after starting.
|
|
207
|
+
* Polls `docker ps` until it succeeds or timeout is reached.
|
|
208
|
+
*
|
|
209
|
+
* @param timeoutMs - Maximum time to wait in milliseconds (default: 30000, configurable via SLINGR_DOCKER_READY_CYCLE_TIMEOUT_MS)
|
|
210
|
+
* @param delayMs - Delay between attempts in milliseconds (default: 2000)
|
|
211
|
+
*/
|
|
212
|
+
async function waitForDockerReady(timeoutMs = DEFAULT_DOCKER_READY_CYCLE_TIMEOUT_MS, delayMs = DEFAULT_DOCKER_READY_DELAY_MS, periodicStart) {
|
|
213
|
+
console.log(`Waiting for Docker to be ready (timeout: ${Math.ceil(timeoutMs / 1000)}s)...`);
|
|
214
|
+
const startedAt = Date.now();
|
|
215
|
+
let lastErrorMessage = '';
|
|
216
|
+
let nextStartAttemptAt = startedAt;
|
|
217
|
+
while (Date.now() - startedAt < timeoutMs) {
|
|
218
|
+
if (periodicStart && Date.now() >= nextStartAttemptAt) {
|
|
219
|
+
try {
|
|
220
|
+
(0, child_process_1.execSync)(periodicStart.command, {
|
|
221
|
+
stdio: periodicStart.stdio,
|
|
222
|
+
timeout: periodicStart.commandTimeoutMs,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
const errorMessage = error.message || '';
|
|
227
|
+
const timedOut = /timed out|ETIMEDOUT/i.test(errorMessage);
|
|
228
|
+
if (timedOut) {
|
|
229
|
+
console.warn(`Command timed out after ${Math.ceil(periodicStart.commandTimeoutMs / 1000)}s: ${periodicStart.command}`);
|
|
230
|
+
}
|
|
231
|
+
lastErrorMessage = errorMessage || lastErrorMessage;
|
|
232
|
+
}
|
|
233
|
+
nextStartAttemptAt = Date.now() + periodicStart.retryIntervalMs;
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
(0, child_process_1.execSync)(DOCKER_PROBE_COMMAND, { stdio: 'pipe', timeout: 5000 });
|
|
237
|
+
console.log('✅ Docker is now running!');
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
const errorMessage = error.message || '';
|
|
242
|
+
lastErrorMessage = errorMessage;
|
|
243
|
+
const isLinuxLike = process.platform === 'linux';
|
|
244
|
+
if (isLinuxLike && isDockerPermissionDeniedError(errorMessage)) {
|
|
245
|
+
throw new DockerPermissionError(getLinuxPermissionsHintMessage());
|
|
246
|
+
}
|
|
247
|
+
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
throw new Error(`Docker did not become ready within ${Math.ceil(timeoutMs / 1000)} seconds. ` +
|
|
251
|
+
`Please verify Docker Desktop/Engine is fully started and try again.` +
|
|
252
|
+
(lastErrorMessage ? `\nLast check error: ${lastErrorMessage}` : ''));
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Ensure Docker is running by checking status and attempting to start if needed.
|
|
256
|
+
* Throws an error with helpful message if Docker cannot be started.
|
|
257
|
+
*
|
|
258
|
+
* @param commandName - Name of the command requiring Docker (for error messages)
|
|
259
|
+
*/
|
|
260
|
+
async function ensureDockerIsRunning(commandName = 'this command') {
|
|
261
|
+
// Check if Docker is running
|
|
262
|
+
if (isDockerRunning()) {
|
|
263
|
+
return; // Docker is already running
|
|
264
|
+
}
|
|
265
|
+
// Docker is not running, attempt to start it
|
|
266
|
+
console.log('🐳 Docker is not running. Attempting to start Docker...');
|
|
267
|
+
const dockerStarted = await tryStartDocker();
|
|
268
|
+
if (!dockerStarted) {
|
|
269
|
+
// Failed to start Docker automatically
|
|
270
|
+
throw new Error(`Docker is not running and could not be started automatically.\n\n` +
|
|
271
|
+
`Please start Docker manually:\n` +
|
|
272
|
+
` • On macOS/Windows: Start Docker Desktop\n` +
|
|
273
|
+
` • On WSL: Start Docker Desktop in Windows and enable WSL integration\n` +
|
|
274
|
+
` • On Linux (Docker Desktop): Run "docker desktop start" or "systemctl --user start docker-desktop"\n` +
|
|
275
|
+
` • On Linux (Docker Engine): Run "sudo systemctl start docker" or "sudo service docker start"\n\n` +
|
|
276
|
+
`Then try running ${commandName} again.`);
|
|
277
|
+
}
|
|
278
|
+
// Docker started successfully
|
|
279
|
+
console.log(`✅ Docker started successfully!`);
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=dockerManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dockerManager.js","sourceRoot":"","sources":["../../src/utils/dockerManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface DataSourceConfig {
|
|
2
|
+
connectTimeout?: number;
|
|
3
|
+
database?: string;
|
|
4
|
+
host?: string;
|
|
5
|
+
logging?: boolean;
|
|
6
|
+
managed?: boolean;
|
|
7
|
+
name: string;
|
|
8
|
+
password?: string;
|
|
9
|
+
port?: number;
|
|
10
|
+
synchronize?: boolean;
|
|
11
|
+
type: 'mysql' | 'postgres' | 'sqlite';
|
|
12
|
+
username?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Extracts a datasource configuration from the text content of a TypeScript
|
|
16
|
+
* datasource file. Supports the `=` assignment style used in class-based
|
|
17
|
+
* injected datasources:
|
|
18
|
+
*
|
|
19
|
+
* override port?: number | undefined = 5433;
|
|
20
|
+
* override type = 'postgres' as const;
|
|
21
|
+
* override host = process.env.DB_HOST || 'localhost';
|
|
22
|
+
*
|
|
23
|
+
* Returns null when no recognised database type is found.
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseDataSourceFile(fileContent: string, name: string): DataSourceConfig | null;
|
|
26
|
+
//# sourceMappingURL=infraFileParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infraFileParser.d.ts","sourceRoot":"","sources":["../../src/utils/infraFileParser.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CA+D9F"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseDataSourceFile = parseDataSourceFile;
|
|
4
|
+
/**
|
|
5
|
+
* Extracts a datasource configuration from the text content of a TypeScript
|
|
6
|
+
* datasource file. Supports the `=` assignment style used in class-based
|
|
7
|
+
* injected datasources:
|
|
8
|
+
*
|
|
9
|
+
* override port?: number | undefined = 5433;
|
|
10
|
+
* override type = 'postgres' as const;
|
|
11
|
+
* override host = process.env.DB_HOST || 'localhost';
|
|
12
|
+
*
|
|
13
|
+
* Returns null when no recognised database type is found.
|
|
14
|
+
*/
|
|
15
|
+
function parseDataSourceFile(fileContent, name) {
|
|
16
|
+
// Match: <field-name> <optional type annotation> = <value> <;>
|
|
17
|
+
const extractRaw = (key) => {
|
|
18
|
+
const re = new RegExp('\\b' + key + '\\b[^=\\n]*=\\s*([^;\\n]+)', 'i');
|
|
19
|
+
const m = fileContent.match(re);
|
|
20
|
+
return m ? m[1].trim() : null;
|
|
21
|
+
};
|
|
22
|
+
const interpret = (raw) => {
|
|
23
|
+
if (!raw) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
raw = raw.replace(/,$/, '').trim();
|
|
27
|
+
// Strip TypeScript `as const` suffix
|
|
28
|
+
raw = raw.replace(/\s+as\s+\w+$/, '').trim();
|
|
29
|
+
if (/^(true|false)$/i.test(raw)) {
|
|
30
|
+
return raw.toLowerCase() === 'true';
|
|
31
|
+
}
|
|
32
|
+
let m = raw.match(/parseInt\([^|?]+(?:\|\||[?]{2})\s*['"]([^'"]+)['"][^)]*\)/i);
|
|
33
|
+
if (m) {
|
|
34
|
+
return Number.parseInt(m[1], 10);
|
|
35
|
+
}
|
|
36
|
+
m = raw.match(/process\.env\.[A-Z0-9_]+\s*(?:\|\||[?]{2})\s*['"]([^'"]+)['"]/i);
|
|
37
|
+
if (m) {
|
|
38
|
+
return m[1];
|
|
39
|
+
}
|
|
40
|
+
m = raw.match(/^['"]([^'"]+)['"]$/);
|
|
41
|
+
if (m) {
|
|
42
|
+
return m[1];
|
|
43
|
+
}
|
|
44
|
+
m = raw.match(/^(\d+)$/);
|
|
45
|
+
if (m) {
|
|
46
|
+
return Number.parseInt(m[1], 10);
|
|
47
|
+
}
|
|
48
|
+
return raw;
|
|
49
|
+
};
|
|
50
|
+
const typeRaw = extractRaw('type');
|
|
51
|
+
if (!typeRaw) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
let typeVal = (typeRaw.match(/['"]([^'"]+)['"]/i) || [null, typeRaw])[1].toLowerCase();
|
|
55
|
+
if (typeVal === 'postgresql') {
|
|
56
|
+
typeVal = 'postgres';
|
|
57
|
+
}
|
|
58
|
+
if (!['mysql', 'postgres', 'sqlite'].includes(typeVal)) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
connectTimeout: interpret(extractRaw('connectTimeout')) ?? undefined,
|
|
63
|
+
database: interpret(extractRaw('database')) ?? 'slingr',
|
|
64
|
+
host: interpret(extractRaw('host')) ?? undefined,
|
|
65
|
+
logging: interpret(extractRaw('logging')) ?? undefined,
|
|
66
|
+
managed: interpret(extractRaw('managed')) ?? undefined,
|
|
67
|
+
name,
|
|
68
|
+
password: interpret(extractRaw('password')) ?? (typeVal === 'mysql' ? 'root' : 'postgres'),
|
|
69
|
+
port: interpret(extractRaw('port')) ?? (typeVal === 'mysql' ? 3306 : 5432),
|
|
70
|
+
synchronize: interpret(extractRaw('synchronize')) ?? undefined,
|
|
71
|
+
type: typeVal,
|
|
72
|
+
username: interpret(extractRaw('username')) ?? (typeVal === 'mysql' ? 'root' : 'postgres'),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=infraFileParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infraFileParser.js","sourceRoot":"","sources":["../../src/utils/infraFileParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseDataModel, TypeOrmSqlDataSource } from '@slingr/framework-backend';
|
|
2
2
|
import 'reflect-metadata';
|
|
3
3
|
/**
|
|
4
|
-
* Interface for model constructors that extend
|
|
4
|
+
* Interface for model constructors that extend BaseDataModel
|
|
5
5
|
*/
|
|
6
|
-
export interface ModelConstructor<T extends
|
|
6
|
+
export interface ModelConstructor<T extends BaseDataModel> {
|
|
7
7
|
new (): T;
|
|
8
8
|
fromJSON(data: any): T;
|
|
9
9
|
prototype: T;
|
|
@@ -20,18 +20,35 @@ export interface DatasetLoadOptions {
|
|
|
20
20
|
* Map of model name to model constructor
|
|
21
21
|
* Key: filename without .jsonl extension
|
|
22
22
|
* Value: Model constructor class
|
|
23
|
+
* This should contain ALL models in the application, not just those being loaded from JSONL.
|
|
23
24
|
*/
|
|
24
25
|
modelMap: Record<string, ModelConstructor<any>>;
|
|
25
26
|
/**
|
|
26
27
|
* Whether to validate each record after loading from JSON
|
|
27
28
|
* @default true
|
|
28
29
|
*/
|
|
29
|
-
validateRecords?: boolean;
|
|
30
|
+
validateRecords?: boolean | undefined;
|
|
30
31
|
/**
|
|
31
32
|
* Whether to log detailed information during loading
|
|
32
33
|
* @default false
|
|
33
34
|
*/
|
|
34
|
-
verbose?: boolean;
|
|
35
|
+
verbose?: boolean | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* When provided, only JSONL files whose base name (without .jsonl) is in this list will be loaded.
|
|
38
|
+
* Takes priority over excludeModels.
|
|
39
|
+
*/
|
|
40
|
+
includeModels?: string[] | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* When provided, JSONL files whose base name (without .jsonl) is in this list will be skipped.
|
|
43
|
+
* Ignored when includeModels is provided.
|
|
44
|
+
*/
|
|
45
|
+
excludeModels?: string[] | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Optional dataSource to use for loading missing references from database before validation.
|
|
48
|
+
* When provided, array references not found in loadedEntities will be loaded from the database.
|
|
49
|
+
* This is useful when referenced entities were loaded in a previous session.
|
|
50
|
+
*/
|
|
51
|
+
dataSource?: TypeOrmSqlDataSource | undefined;
|
|
35
52
|
}
|
|
36
53
|
/**
|
|
37
54
|
* Interface for model dependency information
|
|
@@ -51,7 +68,7 @@ export interface DependencyAnalysisResult {
|
|
|
51
68
|
/**
|
|
52
69
|
* Result of loading a dataset
|
|
53
70
|
*/
|
|
54
|
-
export interface DatasetLoadResult<T extends
|
|
71
|
+
export interface DatasetLoadResult<T extends BaseDataModel = BaseDataModel> {
|
|
55
72
|
/**
|
|
56
73
|
* Name of the model/file that was loaded
|
|
57
74
|
*/
|
|
@@ -76,19 +93,41 @@ export interface DatasetLoadResult<T extends BaseModel = BaseModel> {
|
|
|
76
93
|
recordData: any;
|
|
77
94
|
validationErrors: any[];
|
|
78
95
|
}>;
|
|
96
|
+
/**
|
|
97
|
+
* Number of records successfully saved to database
|
|
98
|
+
*/
|
|
99
|
+
saveSuccessCount: number;
|
|
100
|
+
/**
|
|
101
|
+
* Number of records that failed to save to database
|
|
102
|
+
*/
|
|
103
|
+
saveErrorCount: number;
|
|
104
|
+
/**
|
|
105
|
+
* Array of save errors if any
|
|
106
|
+
*/
|
|
107
|
+
saveErrors: Array<{
|
|
108
|
+
recordIndex: number;
|
|
109
|
+
record: T;
|
|
110
|
+
error: string;
|
|
111
|
+
}>;
|
|
79
112
|
}
|
|
80
113
|
/**
|
|
81
114
|
* Utility class for loading datasets from JSONL files using Slingr model fromJSON() functionality
|
|
82
115
|
*/
|
|
83
116
|
export declare class JsonlDatasetLoader {
|
|
117
|
+
/** Per-run cache to avoid repeated DB lookups for the same referenced record. */
|
|
118
|
+
private dbLookupCache;
|
|
84
119
|
/**
|
|
85
120
|
* Analyze model dependencies to determine the correct loading order
|
|
86
121
|
*/
|
|
87
|
-
analyzeDependencies(modelMap: Record<string, ModelConstructor<any>>, verbose?: boolean): DependencyAnalysisResult;
|
|
122
|
+
analyzeDependencies(modelMap: Record<string, ModelConstructor<any>>, verbose?: boolean, availableModels?: Set<string>): DependencyAnalysisResult;
|
|
88
123
|
/**
|
|
89
124
|
* Extract dependencies from a model class by analyzing its decorators/metadata
|
|
90
125
|
*/
|
|
91
126
|
private extractModelDependencies;
|
|
127
|
+
/**
|
|
128
|
+
* Get the referenced model name from field metadata
|
|
129
|
+
*/
|
|
130
|
+
private getReferencedModelName;
|
|
92
131
|
/**
|
|
93
132
|
* Perform topological sort to determine loading order
|
|
94
133
|
*/
|
|
@@ -101,19 +140,59 @@ export declare class JsonlDatasetLoader {
|
|
|
101
140
|
* Load a single JSONL file and convert records using the model's fromJSON method
|
|
102
141
|
*/
|
|
103
142
|
/**
|
|
104
|
-
* Resolves simple references in format {"id": "uuid"} to full objects from loaded entities
|
|
143
|
+
* Resolves simple references in format {"id": "uuid"} to full objects from loaded entities.
|
|
144
|
+
* Only resolves compositions and sharedCompositions, NOT regular references (to avoid circular dependencies).
|
|
145
|
+
* Also handles arrays of compositions.
|
|
146
|
+
*/
|
|
147
|
+
resolveSimpleReferences<T extends BaseDataModel>(data: any, ModelClass: ModelConstructor<T>, loadedEntities: Record<string, Record<string, any>>, verbose?: boolean): Promise<any>;
|
|
148
|
+
/**
|
|
149
|
+
* Fetches a referenced entity from the database, using an in-memory cache keyed by
|
|
150
|
+
* `ClassName:id` to eliminate redundant queries for the same record within a load run.
|
|
151
|
+
*
|
|
152
|
+
* When the entity is not found (or an error occurs), returns a minimal object
|
|
153
|
+
* `{ id: referenceId }` so that TypeORM can still extract the FK on save.
|
|
105
154
|
*/
|
|
106
|
-
|
|
107
|
-
|
|
155
|
+
private fetchReferenceFromDb;
|
|
156
|
+
/**
|
|
157
|
+
* Resolves unresolved references from the database before saving.
|
|
158
|
+
* This handles references that couldn't be resolved from loadedEntities (excluded models).
|
|
159
|
+
* For single references, sets the FK column directly for efficiency.
|
|
160
|
+
* For array references, loads entities from DB to populate the relationship.
|
|
161
|
+
*/
|
|
162
|
+
private resolveUnresolvedReferencesFromDb;
|
|
163
|
+
/**
|
|
164
|
+
* Resolves string UUID reference fields on a model instance to their loaded BaseDataModel entities.
|
|
165
|
+
*
|
|
166
|
+
* During dataset loading, reference fields are stored as plain UUID strings in JSONL files.
|
|
167
|
+
* After fromJSON(), these remain as strings. However, filter validation (ValidateRelationshipFilter)
|
|
168
|
+
* requires actual BaseDataModel instances to properly evaluate filter criteria like:
|
|
169
|
+
* filter: (company) => ({ state: company.state })
|
|
170
|
+
*
|
|
171
|
+
* Without this resolution, company.state would be a plain string, and the filter validator
|
|
172
|
+
* wouldn't be able to check if the county's state matches. This mirrors what
|
|
173
|
+
* preprocessReferenceFields does in the GraphQL/UI path (fetching from DB), but uses
|
|
174
|
+
* already-loaded entities from the dataset instead.
|
|
175
|
+
*
|
|
176
|
+
* When dataSource is provided, missing array references will be loaded from the database.
|
|
177
|
+
* This is necessary for validation when referenced entities were loaded in a previous session.
|
|
178
|
+
*
|
|
179
|
+
* @param modelMap Full map of all model classes (not filtered) - needed to look up referenced model classes
|
|
180
|
+
*/
|
|
181
|
+
private resolveReferenceFieldsToEntities;
|
|
182
|
+
loadJsonlFile<T extends BaseDataModel>(filePath: string, ModelClass: ModelConstructor<T>, modelName: string, loadedEntities: Record<string, Record<string, any>>, validateRecords?: boolean, verbose?: boolean, dataSource?: TypeOrmSqlDataSource, modelMap?: Record<string, ModelConstructor<any>>): Promise<DatasetLoadResult<T>>;
|
|
108
183
|
/**
|
|
109
184
|
* Convert loaded model instances to database-friendly format
|
|
110
185
|
* This method respects the model's field availability settings and converts camelCase to snake_case
|
|
111
186
|
*/
|
|
112
|
-
convertToDbFormat<T extends
|
|
187
|
+
convertToDbFormat<T extends BaseDataModel>(records: T[], verbose?: boolean): any[];
|
|
113
188
|
/**
|
|
114
189
|
* Convert camelCase string to snake_case
|
|
115
190
|
*/
|
|
116
191
|
private camelToSnakeCase;
|
|
192
|
+
/**
|
|
193
|
+
* Recursively format validation error constraints for display
|
|
194
|
+
*/
|
|
195
|
+
private formatValidationConstraints;
|
|
117
196
|
/**
|
|
118
197
|
* Load dataset into database using TypeORM with dynamic table creation
|
|
119
198
|
* This method creates tables dynamically and uses TypeORM for data insertion
|
|
@@ -136,5 +215,5 @@ export declare class JsonlDatasetLoader {
|
|
|
136
215
|
/**
|
|
137
216
|
* Auto-discover models from the compiled JavaScript files
|
|
138
217
|
*/
|
|
139
|
-
export declare function discoverModels(distPath: string): Promise<Record<string, ModelConstructor<any>>>;
|
|
218
|
+
export declare function discoverModels(distPath: string, verbose?: boolean): Promise<Record<string, ModelConstructor<any>>>;
|
|
140
219
|
//# sourceMappingURL=jsonlLoader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonlLoader.d.ts","sourceRoot":"","sources":["../../src/utils/jsonlLoader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"jsonlLoader.d.ts","sourceRoot":"","sources":["../../src/utils/jsonlLoader.ts"],"names":[],"mappings":"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"}
|