@platforma-sdk/bootstrap 3.5.21 → 4.0.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/assets/compose-backend.yaml +119 -49
- package/dist/commands/svc/create/arg-parser.cjs +175 -0
- package/dist/commands/svc/create/arg-parser.cjs.map +1 -0
- package/dist/commands/svc/create/arg-parser.d.ts +42 -0
- package/dist/commands/svc/create/arg-parser.js +173 -0
- package/dist/commands/svc/create/arg-parser.js.map +1 -0
- package/dist/commands/svc/create/docker/s3.cjs +26 -3
- package/dist/commands/svc/create/docker/s3.cjs.map +1 -1
- package/dist/commands/svc/create/docker/s3.js +26 -3
- package/dist/commands/svc/create/docker/s3.js.map +1 -1
- package/dist/commands/svc/create/docker.cjs +36 -3
- package/dist/commands/svc/create/docker.cjs.map +1 -1
- package/dist/commands/svc/create/docker.js +36 -3
- package/dist/commands/svc/create/docker.js.map +1 -1
- package/dist/commands/svc/create/local/s3.cjs +21 -3
- package/dist/commands/svc/create/local/s3.cjs.map +1 -1
- package/dist/commands/svc/create/local/s3.js +21 -3
- package/dist/commands/svc/create/local/s3.js.map +1 -1
- package/dist/commands/svc/create/local.cjs +51 -28
- package/dist/commands/svc/create/local.cjs.map +1 -1
- package/dist/commands/svc/create/local.js +51 -28
- package/dist/commands/svc/create/local.js.map +1 -1
- package/dist/core.cjs +174 -44
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +3 -0
- package/dist/core.js +174 -44
- package/dist/core.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +8 -8
- package/dist/index.js.map +1 -1
- package/dist/templates/compose.cjs +3 -0
- package/dist/templates/compose.cjs.map +1 -1
- package/dist/templates/compose.d.ts +1 -0
- package/dist/templates/compose.js +3 -0
- package/dist/templates/compose.js.map +1 -1
- package/dist/templates/pl-config.cjs +2 -2
- package/dist/templates/pl-config.cjs.map +1 -1
- package/dist/templates/pl-config.js +2 -2
- package/dist/templates/pl-config.js.map +1 -1
- package/package.json +2 -2
|
@@ -10,8 +10,8 @@ services:
|
|
|
10
10
|
- "${MINIO_CONSOLE_PORT:-9001}:9001"
|
|
11
11
|
|
|
12
12
|
environment:
|
|
13
|
-
MINIO_ROOT_USER: testuser
|
|
14
|
-
MINIO_ROOT_PASSWORD: testpassword
|
|
13
|
+
MINIO_ROOT_USER: static:testuser
|
|
14
|
+
MINIO_ROOT_PASSWORD: static:testpassword
|
|
15
15
|
|
|
16
16
|
volumes:
|
|
17
17
|
- "${MINIO_STORAGE}:/data"
|
|
@@ -19,9 +19,10 @@ services:
|
|
|
19
19
|
backend:
|
|
20
20
|
image: ${PL_IMAGE}
|
|
21
21
|
ports:
|
|
22
|
-
- "${
|
|
23
|
-
- "${
|
|
24
|
-
- "${
|
|
22
|
+
- "${PL_LISTEN_ADDRESS:-127.0.0.1}:${PL_LISTEN_PORT:-6345}:6345"
|
|
23
|
+
- "${PL_LISTEN_ADDRESS:-127.0.0.1}:${PL_LISTEN_HTTP_PORT:-6347}:6347"
|
|
24
|
+
- "${PL_MONITORING_IP:-127.0.0.1}:${PL_MONITORING_PORT:-9090}:9090"
|
|
25
|
+
- "${PL_DEBUG_IP:-127.0.0.1}:${PL_DEBUG_PORT:-9091}:9091"
|
|
25
26
|
tmpfs: [ /tmp ]
|
|
26
27
|
|
|
27
28
|
logging:
|
|
@@ -34,58 +35,127 @@ services:
|
|
|
34
35
|
# Make docker container to write final configuration to stdout at start
|
|
35
36
|
- "PL_DUMP_CONFIG_BEFORE_RUN=true"
|
|
36
37
|
|
|
37
|
-
# License settings
|
|
38
|
+
# License settings
|
|
38
39
|
- "PL_LICENSE=${PL_LICENSE:-}"
|
|
39
40
|
- "PL_LICENSE_FILE=${PL_LICENSE_FILE:+/storage/mi.license}"
|
|
40
41
|
|
|
41
|
-
#
|
|
42
|
-
- "
|
|
43
|
-
- "
|
|
44
|
-
- "
|
|
42
|
+
# Main storage configuration
|
|
43
|
+
- "PL_MAIN_ROOT=/storage"
|
|
44
|
+
- "PL_DB_DIR=/storage/rocksdb"
|
|
45
|
+
- "PL_WORK_DIR=/storage/work"
|
|
46
|
+
- "PL_PACKAGES_DIR=/storage/packages"
|
|
47
|
+
|
|
48
|
+
# Listen configuration
|
|
49
|
+
- "PL_LISTEN_ADDRESS=0.0.0.0"
|
|
50
|
+
- "PL_LISTEN_PORT=6345"
|
|
51
|
+
- "PL_LISTEN_HTTP_PORT=6347"
|
|
52
|
+
# - "PL_LISTEN_TLS=${PL_LISTEN_TLS:-}"
|
|
53
|
+
# - "PL_LISTEN_TLS_ORG=${PL_LISTEN_TLS_ORG:-}" # Platforma
|
|
54
|
+
# - "PL_LISTEN_TLS_DOMAINS=${PL_LISTEN_TLS_DOMAINS:-}"
|
|
55
|
+
# - "PL_LISTEN_TLS_IPS=${PL_LISTEN_TLS_IPS:-}"
|
|
56
|
+
|
|
57
|
+
# Monitoring configuration
|
|
58
|
+
- "PL_NO_MONITORING=${PL_NO_MONITORING:-false}"
|
|
59
|
+
- "PL_MONITORING_PORT=9090"
|
|
60
|
+
- "PL_MONITORING_IP=0.0.0.0"
|
|
61
|
+
- "PL_NO_MONITORING_DUMPS=${PL_NO_MONITORING_DUMPS:-false}"
|
|
62
|
+
- "PL_MONITORING_DUMP_DIR=/storage/metrics"
|
|
63
|
+
- "PL_MONITORING_DUMP_RETENTION=${PL_MONITORING_DUMP_RETENTION:-48h}"
|
|
64
|
+
- "PL_MONITORING_DUMP_INTERVAL=${PL_MONITORING_DUMP_INTERVAL:-20s}"
|
|
65
|
+
|
|
66
|
+
# Debug configuration
|
|
45
67
|
- "PL_DEBUG_ENABLED=${PL_DEBUG_ENABLED:-true}"
|
|
46
|
-
- "
|
|
68
|
+
- "PL_DEBUG_PORT=9091"
|
|
69
|
+
- "PL_DEBUG_IP=0.0.0.0"
|
|
70
|
+
|
|
71
|
+
# Logging configuration
|
|
72
|
+
- "PL_LOG_DESTINATION=${PL_LOG_DIR:+dir://${PL_LOG_DIR}}"
|
|
47
73
|
|
|
48
|
-
# Logging
|
|
49
74
|
- "PL_LOG_LEVEL=${PL_LOG_LEVEL:-warn}"
|
|
50
|
-
- "
|
|
51
|
-
- "
|
|
52
|
-
- "
|
|
53
|
-
- "
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
- "
|
|
59
|
-
- "
|
|
60
|
-
|
|
61
|
-
- "
|
|
62
|
-
|
|
63
|
-
#
|
|
64
|
-
- "
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
#
|
|
68
|
-
- "
|
|
69
|
-
- "
|
|
70
|
-
- "
|
|
71
|
-
- "
|
|
72
|
-
- "
|
|
73
|
-
- "
|
|
74
|
-
- "
|
|
75
|
-
- "
|
|
76
|
-
|
|
77
|
-
#
|
|
78
|
-
- "
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
- "
|
|
82
|
-
- "
|
|
83
|
-
|
|
84
|
-
- "
|
|
85
|
-
- "
|
|
75
|
+
- "PL_LOG_ROTATION_SIZE=${PL_LOG_ROTATION_SIZE:-20MiB}"
|
|
76
|
+
- "PL_LOG_ROTATION_BACKUPS=${PL_LOG_ROTATION_BACKUPS:-20}"
|
|
77
|
+
- "PL_NO_LOG_ROTATION=${PL_NO_LOG_ROTATION:-false}"
|
|
78
|
+
- "PL_NO_LOG_COMPRESSION=${PL_NO_LOG_COMPRESSION:-false}"
|
|
79
|
+
- "PL_LOG_EXTENDED=${PL_LOG_EXTENDED:-false}"
|
|
80
|
+
|
|
81
|
+
# Authentication configuration
|
|
82
|
+
- "PL_NO_AUTH=${PL_NO_AUTH:-false}"
|
|
83
|
+
- "PL_AUTH_HTPASSWD=${PL_AUTH_HTPASSWD:+/etc/platforma/users.htpasswd}"
|
|
84
|
+
# - "PL_AUTH_LDAP_SERVER=${PL_AUTH_LDAP_SERVER:-}"
|
|
85
|
+
# - "PL_AUTH_LDAP_DN=${PL_AUTH_LDAP_DN:-}"
|
|
86
|
+
- "PL_AUTH_LDAP_START_TLS=${PL_AUTH_LDAP_START_TLS:-false}"
|
|
87
|
+
# - "PL_AUTH_LDAP_TLS=${PL_AUTH_LDAP_TLS:-}"
|
|
88
|
+
# - "PL_AUTH_LDAP_CLIENT_CAS=${PL_AUTH_LDAP_CLIENT_CAS:-}"
|
|
89
|
+
# - "PL_AUTH_LDAP_ROOT_CAS=${PL_AUTH_LDAP_ROOT_CAS:-}"
|
|
90
|
+
|
|
91
|
+
# Primary storage configurationq
|
|
92
|
+
# - "PL_PRIMARY_STORAGE_S3=${PL_PRIMARY_STORAGE_S3:-http://minio:9000/platforma-primary-bucket}"
|
|
93
|
+
# - "PL_PRIMARY_STORAGE_S3_REGION=${PL_PRIMARY_STORAGE_S3_REGION:-eu-central-1}"
|
|
94
|
+
# - "PL_PRIMARY_STORAGE_S3_KEY=${PL_PRIMARY_STORAGE_S3_KEY:-static:testuser}"
|
|
95
|
+
# - "PL_PRIMARY_STORAGE_S3_SECRET=${PL_PRIMARY_STORAGE_S3_SECRET:-static:testpassword}"
|
|
96
|
+
# - "PL_PRIMARY_STORAGE_S3_EXTERNAL_ENDPOINT=${PL_PRIMARY_STORAGE_S3_EXTERNAL_ENDPOINT:-http://0.0.0.0:9000}"
|
|
97
|
+
# - "PL_PRIMARY_STORAGE_S3_NO_DATA_INTEGRITY=${PL_PRIMARY_STORAGE_S3_NO_DATA_INTEGRITY:-false}"
|
|
98
|
+
# - "PL_PRIMARY_STORAGE_GCS=${PL_PRIMARY_STORAGE_GCS:-}"
|
|
99
|
+
# - "PL_PRIMARY_STORAGE_GCS_PROJECT_ID=${PL_PRIMARY_STORAGE_GCS_PROJECT_ID:-}"
|
|
100
|
+
# - "PL_PRIMARY_STORAGE_GCS_SERVICE_ACCOUNT=${PL_PRIMARY_STORAGE_GCS_SERVICE_ACCOUNT:-}"
|
|
101
|
+
# - "PL_PRIMARY_STORAGE_GCS_JSON_FILE_PATH=${PL_PRIMARY_STORAGE_GCS_JSON_FILE_PATH:-}"
|
|
102
|
+
# - "PL_PRIMARY_STORAGE_FS=${PL_PRIMARY_STORAGE_FS:-}"
|
|
103
|
+
# - "PL_PRIMARY_STORAGE_FS_URL=${PL_PRIMARY_STORAGE_FS_URL:-}"
|
|
104
|
+
|
|
105
|
+
# Data library configuration
|
|
106
|
+
# - "PL_NO_HOST_DATA_LIBRARY=${PL_NO_HOST_DATA_LIBRARY:-false}"
|
|
107
|
+
- "PL_DATA_LIBRARY_FS_PATH=host=/storage/library"
|
|
108
|
+
# # S3 data library - only set if explicitly provided
|
|
109
|
+
# - "PL_DATA_LIBRARY_S3_URL=${PL_DATA_LIBRARY_S3_URL:-library=http://minio:9000/platforma-library-bucket}"
|
|
110
|
+
# - "PL_DATA_LIBRARY_S3_REGION=${PL_DATA_LIBRARY_S3_REGION:-library=eu-central-1}"
|
|
111
|
+
# - "PL_DATA_LIBRARY_S3_KEY=${PL_DATA_LIBRARY_S3_KEY:-library=testuser}"
|
|
112
|
+
# - "PL_DATA_LIBRARY_S3_SECRET=${PL_DATA_LIBRARY_S3_SECRET:-library=testpassword}"
|
|
113
|
+
# - "PL_DATA_LIBRARY_S3_EXTERNAL_ENDPOINT=${PL_DATA_LIBRARY_S3_EXTERNAL_ENDPOINT:-library=http://0.0.0.0:9000}"
|
|
114
|
+
# - "PL_DATA_LIBRARY_S3_NO_DATA_INTEGRITY=${PL_DATA_LIBRARY_S3_NO_DATA_INTEGRITY:-raw-data=false}"
|
|
115
|
+
# GCS data library - only set if explicitly provided
|
|
116
|
+
# - "PL_DATA_LIBRARY_GCS_URL=${PL_DATA_LIBRARY_GCS_URL:-}"
|
|
117
|
+
# - "PL_DATA_LIBRARY_GCS_PROJECT_ID=${PL_DATA_LIBRARY_GCS_PROJECT_ID:-}"
|
|
118
|
+
# - "PL_DATA_LIBRARY_GCS_SERVICE_ACCOUNT=${PL_DATA_LIBRARY_GCS_SERVICE_ACCOUNT:-}"
|
|
119
|
+
# - "PL_DATA_LIBRARY_GCS_JSON_FILE_PATH=${PL_DATA_LIBRARY_GCS_JSON_FILE_PATH:-}"
|
|
120
|
+
|
|
121
|
+
# Runner configuration
|
|
122
|
+
- "PL_RUNNER_LOCAL_CPU=${PL_RUNNER_LOCAL_CPU:-1}"
|
|
123
|
+
- "PL_RUNNER_LOCAL_RAM=${PL_RUNNER_LOCAL_RAM:-95%}"
|
|
124
|
+
# - "PL_RUNNER_GOOGLE_BATCH_SHARED_STORAGE=${PL_RUNNER_GOOGLE_BATCH_SHARED_STORAGE:-}"
|
|
125
|
+
# - "PL_RUNNER_GOOGLE_BATCH_PROJECT=${PL_RUNNER_GOOGLE_BATCH_PROJECT:-}"
|
|
126
|
+
# - "PL_RUNNER_GOOGLE_BATCH_REGION=${PL_RUNNER_GOOGLE_BATCH_REGION:-}"
|
|
127
|
+
- "PL_RUNNER_GOOGLE_BATCH_JOB_NAME_PREFIX=${PL_RUNNER_GOOGLE_BATCH_JOB_NAME_PREFIX:-pl-cmd}"
|
|
128
|
+
# - "PL_RUNNER_GOOGLE_BATCH_JOB_IMAGE=${PL_RUNNER_GOOGLE_BATCH_JOB_IMAGE:-}"
|
|
129
|
+
# - "PL_RUNNER_GOOGLE_BATCH_NETWORK=${PL_RUNNER_GOOGLE_BATCH_NETWORK:-}"
|
|
130
|
+
# - "PL_RUNNER_GOOGLE_BATCH_SUBNETWORK=${PL_RUNNER_GOOGLE_BATCH_SUBNETWORK:-}"
|
|
131
|
+
- "PL_RUNNER_GOOGLE_BATCH_PROVISIONING=${PL_RUNNER_GOOGLE_BATCH_PROVISIONING:-STANDARD}"
|
|
132
|
+
# - "PL_RUNNER_GOOGLE_BATCH_SERVICE_ACCOUNT=${PL_RUNNER_GOOGLE_BATCH_SERVICE_ACCOUNT:-}"
|
|
133
|
+
# - "PL_RUNNER_EMERGENCY_BOOTSTRAP_FILE=${PL_RUNNER_EMERGENCY_BOOTSTRAP_FILE:-}"
|
|
134
|
+
- "PL_RUNNER_EMERGENCY_BOOTSTRAP_SKIP_AUTO_DETECT=${PL_RUNNER_EMERGENCY_BOOTSTRAP_SKIP_AUTO_DETECT:-false}"
|
|
135
|
+
|
|
136
|
+
# Workflow configuration
|
|
137
|
+
- "PL_WORKFLOW_MAX_CONCURRENCY=${PL_WORKFLOW_MAX_CONCURRENCY:-1}"
|
|
138
|
+
- "PL_WORKFLOW_COMPILATION_CACHE_SIZE=${PL_WORKFLOW_COMPILATION_CACHE_SIZE:-2000}"
|
|
139
|
+
|
|
140
|
+
# Special options
|
|
141
|
+
- "PL_USE_RESTRICTED_NETWORK_MODE=${PL_USE_RESTRICTED_NETWORK_MODE:-false}"
|
|
142
|
+
- "PL_SKIP_EXTENDED_SELF_CHECK=${PL_SKIP_EXTENDED_SELF_CHECK:-false}"
|
|
143
|
+
|
|
144
|
+
# Behavior options
|
|
145
|
+
- "PL_KEEP_WORKDIRS=${PL_KEEP_WORKDIRS:-0s}"
|
|
146
|
+
- "PL_KEEP_GOOD_WORKDIRS=${PL_KEEP_GOOD_WORKDIRS:-20m}"
|
|
147
|
+
- "PL_KEEP_FAULTY_WORKDIRS=${PL_KEEP_FAULTY_WORKDIRS:-1h}"
|
|
148
|
+
- "PL_FEAT_TX_STATS=${PL_FEAT_TX_STATS:-false}"
|
|
149
|
+
- "PL_FEAT_EXPENSIVE_ASSERTIONS=${PL_FEAT_EXPENSIVE_ASSERTIONS:-false}"
|
|
150
|
+
|
|
151
|
+
# Hidden behavior options
|
|
152
|
+
- "PL_LISTEN_COMPRESSION=${PL_LISTEN_COMPRESSION:-gzip}"
|
|
153
|
+
- "PL_ENABLE_GRPC_REFLECTION=${PL_ENABLE_GRPC_REFLECTION:-false}"
|
|
154
|
+
- "PL_RUNNER_GOOGLE_BATCH_JOB_DEBUG_SCRIPT=${PL_RUNNER_GOOGLE_BATCH_JOB_DEBUG_SCRIPT:-false}"
|
|
155
|
+
# - "PL_RUNNER_GOOGLE_BATCH_JOB_DUMP_CONFIGS=${PL_RUNNER_GOOGLE_BATCH_JOB_DUMP_CONFIGS:-}"
|
|
86
156
|
|
|
87
157
|
volumes:
|
|
88
|
-
- ${
|
|
158
|
+
- ${PL_AUTH_HTPASSWD:-/dev/null}:/etc/platforma/users.htpasswd
|
|
89
159
|
- ${PL_LICENSE_FILE:-/dev/null}:/storage/mi.license
|
|
90
160
|
- ${PL_LOG_DIR:-/dev/null}:/storage/log/
|
|
91
161
|
- ${PL_DATA_DB_ROOT:-storage-db}:/storage/rocksdb
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Enhanced command line argument parser for OCLIF commands
|
|
5
|
+
* Handles both known and unknown flags
|
|
6
|
+
*/
|
|
7
|
+
class ArgParser {
|
|
8
|
+
knownFlags;
|
|
9
|
+
flagDefinitions;
|
|
10
|
+
constructor(flags) {
|
|
11
|
+
this.knownFlags = new Set(Object.keys(flags));
|
|
12
|
+
this.flagDefinitions = new Map();
|
|
13
|
+
// Analyze flag definitions
|
|
14
|
+
for (const [name, flag] of Object.entries(flags)) {
|
|
15
|
+
if (flag.type) {
|
|
16
|
+
this.flagDefinitions.set(name, {
|
|
17
|
+
name,
|
|
18
|
+
type: flag.type,
|
|
19
|
+
required: flag.required || false,
|
|
20
|
+
default: flag.default,
|
|
21
|
+
multiple: flag.multiple || false
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse command line arguments
|
|
28
|
+
*/
|
|
29
|
+
parse(argv) {
|
|
30
|
+
const result = {
|
|
31
|
+
instanceName: '',
|
|
32
|
+
knownFlags: {},
|
|
33
|
+
unknownFlags: [],
|
|
34
|
+
positionalArgs: []
|
|
35
|
+
};
|
|
36
|
+
let i = 0;
|
|
37
|
+
while (i < argv.length) {
|
|
38
|
+
const arg = argv[i];
|
|
39
|
+
if (arg.startsWith('--')) {
|
|
40
|
+
// Handle flag
|
|
41
|
+
if (arg.includes('=')) {
|
|
42
|
+
// Flag with value: --flag=value
|
|
43
|
+
const [flagName, value] = arg.split('=', 2);
|
|
44
|
+
const cleanFlagName = flagName.substring(2);
|
|
45
|
+
if (this.knownFlags.has(cleanFlagName)) {
|
|
46
|
+
result.knownFlags[cleanFlagName] = this.parseFlagValue(cleanFlagName, value);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
result.unknownFlags.push(arg);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Flag without value: --flag or --flag value
|
|
54
|
+
const flagName = arg.substring(2);
|
|
55
|
+
if (this.knownFlags.has(flagName)) {
|
|
56
|
+
const flagDef = this.flagDefinitions.get(flagName);
|
|
57
|
+
if (flagDef?.type === 'boolean') {
|
|
58
|
+
// Boolean flag
|
|
59
|
+
result.knownFlags[flagName] = true;
|
|
60
|
+
}
|
|
61
|
+
else if (i + 1 < argv.length && !argv[i + 1].startsWith('-')) {
|
|
62
|
+
// Flag with value in next argument
|
|
63
|
+
const value = argv[i + 1];
|
|
64
|
+
result.knownFlags[flagName] = this.parseFlagValue(flagName, value);
|
|
65
|
+
i++; // Skip next argument
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// Flag without value
|
|
69
|
+
result.knownFlags[flagName] = true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
result.unknownFlags.push(arg);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else if (arg.startsWith('-') && arg.length > 1) {
|
|
78
|
+
// Short flags: -f, -abc
|
|
79
|
+
const shortFlags = arg.substring(1).split('');
|
|
80
|
+
for (const shortFlag of shortFlags) {
|
|
81
|
+
// Find long name for short flag
|
|
82
|
+
const longFlagName = this.findLongFlagName(shortFlag);
|
|
83
|
+
if (longFlagName) {
|
|
84
|
+
result.knownFlags[longFlagName] = true;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
result.unknownFlags.push(`-${shortFlag}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// Positional argument
|
|
93
|
+
if (!result.instanceName) {
|
|
94
|
+
result.instanceName = arg;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
result.positionalArgs.push(arg);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
i++;
|
|
101
|
+
}
|
|
102
|
+
// Set default values
|
|
103
|
+
this.setDefaultValues(result.knownFlags);
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Parse flag value according to its type
|
|
108
|
+
*/
|
|
109
|
+
parseFlagValue(flagName, value) {
|
|
110
|
+
const flagDef = this.flagDefinitions.get(flagName);
|
|
111
|
+
if (!flagDef) {
|
|
112
|
+
return value;
|
|
113
|
+
}
|
|
114
|
+
switch (flagDef.type) {
|
|
115
|
+
case 'number':
|
|
116
|
+
const num = parseFloat(value);
|
|
117
|
+
if (isNaN(num)) {
|
|
118
|
+
throw new Error(`Invalid number value for flag --${flagName}: ${value}`);
|
|
119
|
+
}
|
|
120
|
+
return num;
|
|
121
|
+
case 'boolean':
|
|
122
|
+
if (value === 'true' || value === '1')
|
|
123
|
+
return true;
|
|
124
|
+
if (value === 'false' || value === '0')
|
|
125
|
+
return false;
|
|
126
|
+
return Boolean(value);
|
|
127
|
+
case 'array':
|
|
128
|
+
if (flagDef.multiple) {
|
|
129
|
+
// For multiple flags create array
|
|
130
|
+
// This will be handled in main parse method
|
|
131
|
+
return [value];
|
|
132
|
+
}
|
|
133
|
+
return value;
|
|
134
|
+
default:
|
|
135
|
+
return value;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Find long flag name by short flag
|
|
140
|
+
*/
|
|
141
|
+
findLongFlagName(shortFlag) {
|
|
142
|
+
// Simple implementation - can be extended
|
|
143
|
+
for (const flagName of this.knownFlags) {
|
|
144
|
+
if (flagName.startsWith(shortFlag)) {
|
|
145
|
+
return flagName;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Set default values for flags
|
|
152
|
+
*/
|
|
153
|
+
setDefaultValues(flags) {
|
|
154
|
+
for (const [name, flagDef] of this.flagDefinitions) {
|
|
155
|
+
if (flagDef.default !== undefined && flags[name] === undefined) {
|
|
156
|
+
flags[name] = flagDef.default;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Validate required flags
|
|
162
|
+
*/
|
|
163
|
+
validateRequired(flags) {
|
|
164
|
+
const errors = [];
|
|
165
|
+
for (const [name, flagDef] of this.flagDefinitions) {
|
|
166
|
+
if (flagDef.required && flags[name] === undefined) {
|
|
167
|
+
errors.push(`Required flag --${name} is missing`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return errors;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
exports.ArgParser = ArgParser;
|
|
175
|
+
//# sourceMappingURL=arg-parser.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arg-parser.cjs","sources":["../../../../src/commands/svc/create/arg-parser.ts"],"sourcesContent":["/**\n * Enhanced command line argument parser for OCLIF commands\n * Handles both known and unknown flags\n */\n\nexport interface ParsedArgs {\n instanceName: string;\n knownFlags: Record<string, any>;\n unknownFlags: string[];\n positionalArgs: string[];\n}\n\nexport interface FlagDefinition {\n name: string;\n type: 'string' | 'boolean' | 'number' | 'array';\n required?: boolean;\n default?: any;\n multiple?: boolean;\n}\n\nexport class ArgParser {\n private knownFlags: Set<string>;\n private flagDefinitions: Map<string, FlagDefinition>;\n\n constructor(flags: Record<string, any>) {\n this.knownFlags = new Set(Object.keys(flags));\n this.flagDefinitions = new Map();\n \n // Analyze flag definitions\n for (const [name, flag] of Object.entries(flags)) {\n if (flag.type) {\n this.flagDefinitions.set(name, {\n name,\n type: flag.type,\n required: flag.required || false,\n default: flag.default,\n multiple: flag.multiple || false\n });\n }\n }\n }\n\n /**\n * Parse command line arguments\n */\n parse(argv: string[]): ParsedArgs {\n const result: ParsedArgs = {\n instanceName: '',\n knownFlags: {},\n unknownFlags: [],\n positionalArgs: []\n };\n\n let i = 0;\n while (i < argv.length) {\n const arg = argv[i];\n\n if (arg.startsWith('--')) {\n // Handle flag\n if (arg.includes('=')) {\n // Flag with value: --flag=value\n const [flagName, value] = arg.split('=', 2);\n const cleanFlagName = flagName.substring(2);\n \n if (this.knownFlags.has(cleanFlagName)) {\n result.knownFlags[cleanFlagName] = this.parseFlagValue(cleanFlagName, value);\n } else {\n result.unknownFlags.push(arg);\n }\n } else {\n // Flag without value: --flag or --flag value\n const flagName = arg.substring(2);\n \n if (this.knownFlags.has(flagName)) {\n const flagDef = this.flagDefinitions.get(flagName);\n \n if (flagDef?.type === 'boolean') {\n // Boolean flag\n result.knownFlags[flagName] = true;\n } else if (i + 1 < argv.length && !argv[i + 1].startsWith('-')) {\n // Flag with value in next argument\n const value = argv[i + 1];\n result.knownFlags[flagName] = this.parseFlagValue(flagName, value);\n i++; // Skip next argument\n } else {\n // Flag without value\n result.knownFlags[flagName] = true;\n }\n } else {\n result.unknownFlags.push(arg);\n }\n }\n } else if (arg.startsWith('-') && arg.length > 1) {\n // Short flags: -f, -abc\n const shortFlags = arg.substring(1).split('');\n for (const shortFlag of shortFlags) {\n // Find long name for short flag\n const longFlagName = this.findLongFlagName(shortFlag);\n if (longFlagName) {\n result.knownFlags[longFlagName] = true;\n } else {\n result.unknownFlags.push(`-${shortFlag}`);\n }\n }\n } else {\n // Positional argument\n if (!result.instanceName) {\n result.instanceName = arg;\n } else {\n result.positionalArgs.push(arg);\n }\n }\n \n i++;\n }\n\n // Set default values\n this.setDefaultValues(result.knownFlags);\n \n return result;\n }\n\n /**\n * Parse flag value according to its type\n */\n private parseFlagValue(flagName: string, value: string): any {\n const flagDef = this.flagDefinitions.get(flagName);\n \n if (!flagDef) {\n return value;\n }\n\n switch (flagDef.type) {\n case 'number':\n const num = parseFloat(value);\n if (isNaN(num)) {\n throw new Error(`Invalid number value for flag --${flagName}: ${value}`);\n }\n return num;\n \n case 'boolean':\n if (value === 'true' || value === '1') return true;\n if (value === 'false' || value === '0') return false;\n return Boolean(value);\n \n case 'array':\n if (flagDef.multiple) {\n // For multiple flags create array\n // This will be handled in main parse method\n return [value];\n }\n return value;\n \n default:\n return value;\n }\n }\n\n /**\n * Find long flag name by short flag\n */\n private findLongFlagName(shortFlag: string): string | null {\n // Simple implementation - can be extended\n for (const flagName of this.knownFlags) {\n if (flagName.startsWith(shortFlag)) {\n return flagName;\n }\n }\n return null;\n }\n\n /**\n * Set default values for flags\n */\n private setDefaultValues(flags: Record<string, any>): void {\n for (const [name, flagDef] of this.flagDefinitions) {\n if (flagDef.default !== undefined && flags[name] === undefined) {\n flags[name] = flagDef.default;\n }\n }\n }\n\n /**\n * Validate required flags\n */\n validateRequired(flags: Record<string, any>): string[] {\n const errors: string[] = [];\n \n for (const [name, flagDef] of this.flagDefinitions) {\n if (flagDef.required && flags[name] === undefined) {\n errors.push(`Required flag --${name} is missing`);\n }\n }\n \n return errors;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced command line argument parser for OCLIF commands
|
|
3
|
+
* Handles both known and unknown flags
|
|
4
|
+
*/
|
|
5
|
+
export interface ParsedArgs {
|
|
6
|
+
instanceName: string;
|
|
7
|
+
knownFlags: Record<string, any>;
|
|
8
|
+
unknownFlags: string[];
|
|
9
|
+
positionalArgs: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface FlagDefinition {
|
|
12
|
+
name: string;
|
|
13
|
+
type: 'string' | 'boolean' | 'number' | 'array';
|
|
14
|
+
required?: boolean;
|
|
15
|
+
default?: any;
|
|
16
|
+
multiple?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare class ArgParser {
|
|
19
|
+
private knownFlags;
|
|
20
|
+
private flagDefinitions;
|
|
21
|
+
constructor(flags: Record<string, any>);
|
|
22
|
+
/**
|
|
23
|
+
* Parse command line arguments
|
|
24
|
+
*/
|
|
25
|
+
parse(argv: string[]): ParsedArgs;
|
|
26
|
+
/**
|
|
27
|
+
* Parse flag value according to its type
|
|
28
|
+
*/
|
|
29
|
+
private parseFlagValue;
|
|
30
|
+
/**
|
|
31
|
+
* Find long flag name by short flag
|
|
32
|
+
*/
|
|
33
|
+
private findLongFlagName;
|
|
34
|
+
/**
|
|
35
|
+
* Set default values for flags
|
|
36
|
+
*/
|
|
37
|
+
private setDefaultValues;
|
|
38
|
+
/**
|
|
39
|
+
* Validate required flags
|
|
40
|
+
*/
|
|
41
|
+
validateRequired(flags: Record<string, any>): string[];
|
|
42
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced command line argument parser for OCLIF commands
|
|
3
|
+
* Handles both known and unknown flags
|
|
4
|
+
*/
|
|
5
|
+
class ArgParser {
|
|
6
|
+
knownFlags;
|
|
7
|
+
flagDefinitions;
|
|
8
|
+
constructor(flags) {
|
|
9
|
+
this.knownFlags = new Set(Object.keys(flags));
|
|
10
|
+
this.flagDefinitions = new Map();
|
|
11
|
+
// Analyze flag definitions
|
|
12
|
+
for (const [name, flag] of Object.entries(flags)) {
|
|
13
|
+
if (flag.type) {
|
|
14
|
+
this.flagDefinitions.set(name, {
|
|
15
|
+
name,
|
|
16
|
+
type: flag.type,
|
|
17
|
+
required: flag.required || false,
|
|
18
|
+
default: flag.default,
|
|
19
|
+
multiple: flag.multiple || false
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Parse command line arguments
|
|
26
|
+
*/
|
|
27
|
+
parse(argv) {
|
|
28
|
+
const result = {
|
|
29
|
+
instanceName: '',
|
|
30
|
+
knownFlags: {},
|
|
31
|
+
unknownFlags: [],
|
|
32
|
+
positionalArgs: []
|
|
33
|
+
};
|
|
34
|
+
let i = 0;
|
|
35
|
+
while (i < argv.length) {
|
|
36
|
+
const arg = argv[i];
|
|
37
|
+
if (arg.startsWith('--')) {
|
|
38
|
+
// Handle flag
|
|
39
|
+
if (arg.includes('=')) {
|
|
40
|
+
// Flag with value: --flag=value
|
|
41
|
+
const [flagName, value] = arg.split('=', 2);
|
|
42
|
+
const cleanFlagName = flagName.substring(2);
|
|
43
|
+
if (this.knownFlags.has(cleanFlagName)) {
|
|
44
|
+
result.knownFlags[cleanFlagName] = this.parseFlagValue(cleanFlagName, value);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
result.unknownFlags.push(arg);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Flag without value: --flag or --flag value
|
|
52
|
+
const flagName = arg.substring(2);
|
|
53
|
+
if (this.knownFlags.has(flagName)) {
|
|
54
|
+
const flagDef = this.flagDefinitions.get(flagName);
|
|
55
|
+
if (flagDef?.type === 'boolean') {
|
|
56
|
+
// Boolean flag
|
|
57
|
+
result.knownFlags[flagName] = true;
|
|
58
|
+
}
|
|
59
|
+
else if (i + 1 < argv.length && !argv[i + 1].startsWith('-')) {
|
|
60
|
+
// Flag with value in next argument
|
|
61
|
+
const value = argv[i + 1];
|
|
62
|
+
result.knownFlags[flagName] = this.parseFlagValue(flagName, value);
|
|
63
|
+
i++; // Skip next argument
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Flag without value
|
|
67
|
+
result.knownFlags[flagName] = true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
result.unknownFlags.push(arg);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else if (arg.startsWith('-') && arg.length > 1) {
|
|
76
|
+
// Short flags: -f, -abc
|
|
77
|
+
const shortFlags = arg.substring(1).split('');
|
|
78
|
+
for (const shortFlag of shortFlags) {
|
|
79
|
+
// Find long name for short flag
|
|
80
|
+
const longFlagName = this.findLongFlagName(shortFlag);
|
|
81
|
+
if (longFlagName) {
|
|
82
|
+
result.knownFlags[longFlagName] = true;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
result.unknownFlags.push(`-${shortFlag}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// Positional argument
|
|
91
|
+
if (!result.instanceName) {
|
|
92
|
+
result.instanceName = arg;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
result.positionalArgs.push(arg);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
i++;
|
|
99
|
+
}
|
|
100
|
+
// Set default values
|
|
101
|
+
this.setDefaultValues(result.knownFlags);
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Parse flag value according to its type
|
|
106
|
+
*/
|
|
107
|
+
parseFlagValue(flagName, value) {
|
|
108
|
+
const flagDef = this.flagDefinitions.get(flagName);
|
|
109
|
+
if (!flagDef) {
|
|
110
|
+
return value;
|
|
111
|
+
}
|
|
112
|
+
switch (flagDef.type) {
|
|
113
|
+
case 'number':
|
|
114
|
+
const num = parseFloat(value);
|
|
115
|
+
if (isNaN(num)) {
|
|
116
|
+
throw new Error(`Invalid number value for flag --${flagName}: ${value}`);
|
|
117
|
+
}
|
|
118
|
+
return num;
|
|
119
|
+
case 'boolean':
|
|
120
|
+
if (value === 'true' || value === '1')
|
|
121
|
+
return true;
|
|
122
|
+
if (value === 'false' || value === '0')
|
|
123
|
+
return false;
|
|
124
|
+
return Boolean(value);
|
|
125
|
+
case 'array':
|
|
126
|
+
if (flagDef.multiple) {
|
|
127
|
+
// For multiple flags create array
|
|
128
|
+
// This will be handled in main parse method
|
|
129
|
+
return [value];
|
|
130
|
+
}
|
|
131
|
+
return value;
|
|
132
|
+
default:
|
|
133
|
+
return value;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Find long flag name by short flag
|
|
138
|
+
*/
|
|
139
|
+
findLongFlagName(shortFlag) {
|
|
140
|
+
// Simple implementation - can be extended
|
|
141
|
+
for (const flagName of this.knownFlags) {
|
|
142
|
+
if (flagName.startsWith(shortFlag)) {
|
|
143
|
+
return flagName;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Set default values for flags
|
|
150
|
+
*/
|
|
151
|
+
setDefaultValues(flags) {
|
|
152
|
+
for (const [name, flagDef] of this.flagDefinitions) {
|
|
153
|
+
if (flagDef.default !== undefined && flags[name] === undefined) {
|
|
154
|
+
flags[name] = flagDef.default;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Validate required flags
|
|
160
|
+
*/
|
|
161
|
+
validateRequired(flags) {
|
|
162
|
+
const errors = [];
|
|
163
|
+
for (const [name, flagDef] of this.flagDefinitions) {
|
|
164
|
+
if (flagDef.required && flags[name] === undefined) {
|
|
165
|
+
errors.push(`Required flag --${name} is missing`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return errors;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export { ArgParser };
|
|
173
|
+
//# sourceMappingURL=arg-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arg-parser.js","sources":["../../../../src/commands/svc/create/arg-parser.ts"],"sourcesContent":["/**\n * Enhanced command line argument parser for OCLIF commands\n * Handles both known and unknown flags\n */\n\nexport interface ParsedArgs {\n instanceName: string;\n knownFlags: Record<string, any>;\n unknownFlags: string[];\n positionalArgs: string[];\n}\n\nexport interface FlagDefinition {\n name: string;\n type: 'string' | 'boolean' | 'number' | 'array';\n required?: boolean;\n default?: any;\n multiple?: boolean;\n}\n\nexport class ArgParser {\n private knownFlags: Set<string>;\n private flagDefinitions: Map<string, FlagDefinition>;\n\n constructor(flags: Record<string, any>) {\n this.knownFlags = new Set(Object.keys(flags));\n this.flagDefinitions = new Map();\n \n // Analyze flag definitions\n for (const [name, flag] of Object.entries(flags)) {\n if (flag.type) {\n this.flagDefinitions.set(name, {\n name,\n type: flag.type,\n required: flag.required || false,\n default: flag.default,\n multiple: flag.multiple || false\n });\n }\n }\n }\n\n /**\n * Parse command line arguments\n */\n parse(argv: string[]): ParsedArgs {\n const result: ParsedArgs = {\n instanceName: '',\n knownFlags: {},\n unknownFlags: [],\n positionalArgs: []\n };\n\n let i = 0;\n while (i < argv.length) {\n const arg = argv[i];\n\n if (arg.startsWith('--')) {\n // Handle flag\n if (arg.includes('=')) {\n // Flag with value: --flag=value\n const [flagName, value] = arg.split('=', 2);\n const cleanFlagName = flagName.substring(2);\n \n if (this.knownFlags.has(cleanFlagName)) {\n result.knownFlags[cleanFlagName] = this.parseFlagValue(cleanFlagName, value);\n } else {\n result.unknownFlags.push(arg);\n }\n } else {\n // Flag without value: --flag or --flag value\n const flagName = arg.substring(2);\n \n if (this.knownFlags.has(flagName)) {\n const flagDef = this.flagDefinitions.get(flagName);\n \n if (flagDef?.type === 'boolean') {\n // Boolean flag\n result.knownFlags[flagName] = true;\n } else if (i + 1 < argv.length && !argv[i + 1].startsWith('-')) {\n // Flag with value in next argument\n const value = argv[i + 1];\n result.knownFlags[flagName] = this.parseFlagValue(flagName, value);\n i++; // Skip next argument\n } else {\n // Flag without value\n result.knownFlags[flagName] = true;\n }\n } else {\n result.unknownFlags.push(arg);\n }\n }\n } else if (arg.startsWith('-') && arg.length > 1) {\n // Short flags: -f, -abc\n const shortFlags = arg.substring(1).split('');\n for (const shortFlag of shortFlags) {\n // Find long name for short flag\n const longFlagName = this.findLongFlagName(shortFlag);\n if (longFlagName) {\n result.knownFlags[longFlagName] = true;\n } else {\n result.unknownFlags.push(`-${shortFlag}`);\n }\n }\n } else {\n // Positional argument\n if (!result.instanceName) {\n result.instanceName = arg;\n } else {\n result.positionalArgs.push(arg);\n }\n }\n \n i++;\n }\n\n // Set default values\n this.setDefaultValues(result.knownFlags);\n \n return result;\n }\n\n /**\n * Parse flag value according to its type\n */\n private parseFlagValue(flagName: string, value: string): any {\n const flagDef = this.flagDefinitions.get(flagName);\n \n if (!flagDef) {\n return value;\n }\n\n switch (flagDef.type) {\n case 'number':\n const num = parseFloat(value);\n if (isNaN(num)) {\n throw new Error(`Invalid number value for flag --${flagName}: ${value}`);\n }\n return num;\n \n case 'boolean':\n if (value === 'true' || value === '1') return true;\n if (value === 'false' || value === '0') return false;\n return Boolean(value);\n \n case 'array':\n if (flagDef.multiple) {\n // For multiple flags create array\n // This will be handled in main parse method\n return [value];\n }\n return value;\n \n default:\n return value;\n }\n }\n\n /**\n * Find long flag name by short flag\n */\n private findLongFlagName(shortFlag: string): string | null {\n // Simple implementation - can be extended\n for (const flagName of this.knownFlags) {\n if (flagName.startsWith(shortFlag)) {\n return flagName;\n }\n }\n return null;\n }\n\n /**\n * Set default values for flags\n */\n private setDefaultValues(flags: Record<string, any>): void {\n for (const [name, flagDef] of this.flagDefinitions) {\n if (flagDef.default !== undefined && flags[name] === undefined) {\n flags[name] = flagDef.default;\n }\n }\n }\n\n /**\n * Validate required flags\n */\n validateRequired(flags: Record<string, any>): string[] {\n const errors: string[] = [];\n \n for (const [name, flagDef] of this.flagDefinitions) {\n if (flagDef.required && flags[name] === undefined) {\n errors.push(`Required flag --${name} is missing`);\n }\n }\n \n return errors;\n }\n}\n"],"names":[],"mappings":"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"}
|