@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.
Files changed (40) hide show
  1. package/assets/compose-backend.yaml +119 -49
  2. package/dist/commands/svc/create/arg-parser.cjs +175 -0
  3. package/dist/commands/svc/create/arg-parser.cjs.map +1 -0
  4. package/dist/commands/svc/create/arg-parser.d.ts +42 -0
  5. package/dist/commands/svc/create/arg-parser.js +173 -0
  6. package/dist/commands/svc/create/arg-parser.js.map +1 -0
  7. package/dist/commands/svc/create/docker/s3.cjs +26 -3
  8. package/dist/commands/svc/create/docker/s3.cjs.map +1 -1
  9. package/dist/commands/svc/create/docker/s3.js +26 -3
  10. package/dist/commands/svc/create/docker/s3.js.map +1 -1
  11. package/dist/commands/svc/create/docker.cjs +36 -3
  12. package/dist/commands/svc/create/docker.cjs.map +1 -1
  13. package/dist/commands/svc/create/docker.js +36 -3
  14. package/dist/commands/svc/create/docker.js.map +1 -1
  15. package/dist/commands/svc/create/local/s3.cjs +21 -3
  16. package/dist/commands/svc/create/local/s3.cjs.map +1 -1
  17. package/dist/commands/svc/create/local/s3.js +21 -3
  18. package/dist/commands/svc/create/local/s3.js.map +1 -1
  19. package/dist/commands/svc/create/local.cjs +51 -28
  20. package/dist/commands/svc/create/local.cjs.map +1 -1
  21. package/dist/commands/svc/create/local.js +51 -28
  22. package/dist/commands/svc/create/local.js.map +1 -1
  23. package/dist/core.cjs +174 -44
  24. package/dist/core.cjs.map +1 -1
  25. package/dist/core.d.ts +3 -0
  26. package/dist/core.js +174 -44
  27. package/dist/core.js.map +1 -1
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.ts +8 -8
  30. package/dist/index.js.map +1 -1
  31. package/dist/templates/compose.cjs +3 -0
  32. package/dist/templates/compose.cjs.map +1 -1
  33. package/dist/templates/compose.d.ts +1 -0
  34. package/dist/templates/compose.js +3 -0
  35. package/dist/templates/compose.js.map +1 -1
  36. package/dist/templates/pl-config.cjs +2 -2
  37. package/dist/templates/pl-config.cjs.map +1 -1
  38. package/dist/templates/pl-config.js +2 -2
  39. package/dist/templates/pl-config.js.map +1 -1
  40. 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
- - "${PL_GRPC_ADDR:-127.0.0.1:${PL_GRPC_PORT:-6345}}:6345"
23
- - "${PL_MONITORING_ADDR:-127.0.0.1:${PL_MONITORING_PORT:-9090}}:9090"
24
- - "${PL_DEBUG_ADDR:-127.0.0.1:${PL_DEBUG_PORT:-9091}}:9091"
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. You have to have license to start platforma
38
+ # License settings
38
39
  - "PL_LICENSE=${PL_LICENSE:-}"
39
40
  - "PL_LICENSE_FILE=${PL_LICENSE_FILE:+/storage/mi.license}"
40
41
 
41
- # Network: listen ports for services
42
- - "PL_API_ADDR=0.0.0.0:6345"
43
- - "PL_MONITORING_ENABLED=${PL_MONITORING_ENABLED:-true}"
44
- - "PL_MONITORING_ADDR=0.0.0.0:9090"
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
- - "PL_DEBUG_ADDR=0.0.0.0:9091"
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
- - "PL_LOG_DESTINATION=${PL_LOG_DIR:+/storage/log/platforma.log}"
51
- - "PL_LOG_ROTATION_ENABLED=${PL_LOG_ROTATION_ENABLED:-false}"
52
- - "PL_LOG_COMMIT_SUMMARY=${PL_LOG_COMMIT_SUMMARY:-false}"
53
- - "PL_LOG_RESOURCE_DATA=${PL_LOG_RESOURCE_DATA:-false}"
54
-
55
- - "PL_AUTH_ENABLED=${PL_AUTH_ENABLED:-false}"
56
- - "PL_AUTH_HTPASSWD_PATH=${PL_AUTH_HTPASSWD_PATH:+/etc/platforma/users.htpasswd}"
57
-
58
- - "PL_RUNNER_WD_CACHE_ON_SUCCESS=${PL_RUNNER_WD_CACHE_ON_SUCCESS:-20m}"
59
- - "PL_RUNNER_WD_CACHE_ON_FAILURE=${PL_RUNNER_WD_CACHE_ON_FAILURE:-1h}"
60
-
61
- - "PL_WORKFLOW_ENABLE_ALL_FEATURES=true"
62
-
63
- # Data Controller: general settings
64
- - "PL_DATA_CREATE_BUCKET=true" # try to automatically create buckets for storages if they not exist
65
- - "PL_DATA_HARDLINK_MODE=auto" # wether to use hardlinks when copying data between storages and within storage.
66
-
67
- # Data Controller: primary storage
68
- - "PL_DATA_PRIMARY_TYPE=${PL_DATA_PRIMARY_TYPE:-S3}"
69
- - "PL_DATA_PRIMARY_S3_ENDPOINT=${PL_DATA_PRIMARY_S3_ENDPOINT:-http://minio:9000/}"
70
- - "PL_DATA_PRIMARY_S3_PRESIGN_ENDPOINT=${PL_DATA_PRIMARY_S3_PRESIGN_ENDPOINT:-${PL_DATA_PRIMARY_S3_ENDPOINT:-http://localhost:9000/}}"
71
- - "PL_DATA_PRIMARY_S3_KEY_PREFIX=${PL_DATA_PRIMARY_S3_KEY_PREFIX:-}"
72
- - "PL_DATA_PRIMARY_S3_REGION=${PL_DATA_PRIMARY_S3_REGION:-eu-central-1}"
73
- - "PL_DATA_PRIMARY_S3_BUCKET=${PL_DATA_PRIMARY_S3_BUCKET:-platforma-primary-bucket}"
74
- - "PL_DATA_PRIMARY_S3_KEY=${PL_DATA_PRIMARY_S3_KEY:-static:testuser}"
75
- - "PL_DATA_PRIMARY_S3_SECRET=${PL_DATA_PRIMARY_S3_SECRET:-static:testpassword}"
76
-
77
- # Data Controller: library storage
78
- - "PL_DATA_LIBRARY_TYPE=${PL_DATA_LIBRARY_TYPE:-FS}" # change it to 'S3' to use library located in S3 bucket
79
- - "PL_DATA_LIBRARY_S3_ENDPOINT=${PL_DATA_LIBRARY_S3_ENDPOINT:-http://minio:9000/}"
80
- - "PL_DATA_LIBRARY_S3_PRESIGN_ENDPOINT=${PL_DATA_LIBRARY_S3_PRESIGN_ENDPOINT:-${PL_DATA_LIBRARY_S3_ENDPOINT:-http://localhost:9000/}}"
81
- - "PL_DATA_LIBRARY_S3_KEY_PREFIX=${PL_DATA_LIBRARY_S3_KEY_PREFIX:-}"
82
- - "PL_DATA_LIBRARY_S3_REGION=${PL_DATA_LIBRARY_S3_REGION:-eu-central-1}"
83
- - "PL_DATA_LIBRARY_S3_BUCKET=${PL_DATA_LIBRARY_S3_BUCKET:-platforma-library-bucket}"
84
- - "PL_DATA_LIBRARY_S3_KEY=${PL_DATA_PRIMARY_S3_KEY:-static:testuser}"
85
- - "PL_DATA_LIBRARY_S3_SECRET=${PL_DATA_PRIMARY_S3_SECRET:-static:testpassword}"
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
- - ${PL_AUTH_HTPASSWD_PATH-/dev/null}:/etc/platforma/users.htpasswd
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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"}