@teambit/scripts 0.0.0-7b9ddaf7267d5e719d14b53976e0d55bfd5b8614 → 0.0.0-ce0b15b1a5b104399f16328c9caae26c5e667ae2
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.
|
@@ -13,6 +13,7 @@ export declare class ScriptsMain {
|
|
|
13
13
|
private componentAspect;
|
|
14
14
|
private config;
|
|
15
15
|
constructor(workspace: Workspace, envs: EnvsMain, logger: Logger, componentAspect: ComponentMain, config: ScriptsConfig);
|
|
16
|
+
private getConfigErrorMessage;
|
|
16
17
|
/**
|
|
17
18
|
* Run a script for all components
|
|
18
19
|
*/
|
|
@@ -23,6 +24,7 @@ export declare class ScriptsMain {
|
|
|
23
24
|
listAllScripts(): Promise<string>;
|
|
24
25
|
/**
|
|
25
26
|
* Check if an env is allowed to run scripts based on config
|
|
27
|
+
* Supports exact match with or without version
|
|
26
28
|
*/
|
|
27
29
|
private isEnvAllowed;
|
|
28
30
|
private getComponents;
|
|
@@ -100,30 +100,28 @@ class ScriptsMain {
|
|
|
100
100
|
this.componentAspect = componentAspect;
|
|
101
101
|
this.config = config;
|
|
102
102
|
}
|
|
103
|
+
getConfigErrorMessage() {
|
|
104
|
+
return _chalk().default.yellow('no envs configured. Add to workspace.jsonc:\n' + '{\n' + ' "teambit.workspace/scripts": {\n' + ' "envs": ["your-scope/your-env"]\n' + ' }\n' + '}');
|
|
105
|
+
}
|
|
103
106
|
|
|
104
107
|
/**
|
|
105
108
|
* Run a script for all components
|
|
106
109
|
*/
|
|
107
110
|
async runScript(scriptName) {
|
|
111
|
+
// Filter envs based on config
|
|
112
|
+
const allowedEnvs = this.config.envs || [];
|
|
113
|
+
if (allowedEnvs.length === 0) {
|
|
114
|
+
return this.getConfigErrorMessage();
|
|
115
|
+
}
|
|
108
116
|
const components = await this.getComponents();
|
|
109
117
|
if (!components.length) {
|
|
110
118
|
return _chalk().default.yellow('no components found');
|
|
111
119
|
}
|
|
112
120
|
|
|
113
|
-
// Group components by environment
|
|
114
|
-
const componentsByEnv = this.groupComponentsByEnv(components);
|
|
121
|
+
// Group components by environment, filtering only configured envs
|
|
122
|
+
const componentsByEnv = this.groupComponentsByEnv(components, allowedEnvs);
|
|
115
123
|
const results = [];
|
|
116
|
-
|
|
117
|
-
// Filter envs based on config
|
|
118
|
-
const allowedEnvs = this.config.envs || [];
|
|
119
|
-
if (allowedEnvs.length === 0) {
|
|
120
|
-
return _chalk().default.yellow('no envs configured in workspace.jsonc under "teambit.workspace/scripts.envs"');
|
|
121
|
-
}
|
|
122
124
|
for (const [envId, envComponents] of Object.entries(componentsByEnv)) {
|
|
123
|
-
// Skip envs not in the allowed list
|
|
124
|
-
if (!this.isEnvAllowed(envId, allowedEnvs)) {
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
127
125
|
const env = this.envs.getEnvDefinitionByStringId(envId);
|
|
128
126
|
if (!env) continue;
|
|
129
127
|
const scripts = this.getScriptsFromEnv(env);
|
|
@@ -145,30 +143,31 @@ class ScriptsMain {
|
|
|
145
143
|
* List all available scripts from all environments
|
|
146
144
|
*/
|
|
147
145
|
async listAllScripts() {
|
|
146
|
+
// Filter envs based on config
|
|
147
|
+
const allowedEnvs = this.config.envs || [];
|
|
148
|
+
if (allowedEnvs.length === 0) {
|
|
149
|
+
return this.getConfigErrorMessage();
|
|
150
|
+
}
|
|
148
151
|
const components = await this.getComponents();
|
|
149
152
|
if (!components.length) {
|
|
150
153
|
return _chalk().default.yellow('no components found');
|
|
151
154
|
}
|
|
152
|
-
const componentsByEnv = this.groupComponentsByEnv(components);
|
|
153
|
-
const results = [];
|
|
154
|
-
results.push(_chalk().default.green('Available scripts:\n'));
|
|
155
155
|
|
|
156
|
-
//
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
156
|
+
// Group components by environment, filtering only configured envs
|
|
157
|
+
const componentsByEnv = this.groupComponentsByEnv(components, allowedEnvs);
|
|
158
|
+
const results = [];
|
|
159
|
+
let foundAnyScripts = false;
|
|
161
160
|
for (const [envId, envComponents] of Object.entries(componentsByEnv)) {
|
|
162
|
-
// Skip envs not in the allowed list
|
|
163
|
-
if (!this.isEnvAllowed(envId, allowedEnvs)) {
|
|
164
|
-
continue;
|
|
165
|
-
}
|
|
166
161
|
const env = this.envs.getEnvDefinitionByStringId(envId);
|
|
167
162
|
if (!env) continue;
|
|
168
163
|
const scripts = this.getScriptsFromEnv(env);
|
|
169
164
|
if (!scripts || scripts.isEmpty()) {
|
|
170
165
|
continue;
|
|
171
166
|
}
|
|
167
|
+
if (!foundAnyScripts) {
|
|
168
|
+
results.push(_chalk().default.green('Available scripts:\n'));
|
|
169
|
+
foundAnyScripts = true;
|
|
170
|
+
}
|
|
172
171
|
results.push(_chalk().default.cyan(`\nEnvironment: ${envId}`));
|
|
173
172
|
results.push(_chalk().default.gray(` (used by ${envComponents.length} component(s))`));
|
|
174
173
|
const scriptsList = scripts.list();
|
|
@@ -178,16 +177,27 @@ class ScriptsMain {
|
|
|
178
177
|
results.push(` ${_chalk().default.bold(scriptName)}: ${handlerStr}`);
|
|
179
178
|
});
|
|
180
179
|
}
|
|
180
|
+
if (!foundAnyScripts) {
|
|
181
|
+
return _chalk().default.yellow('no scripts defined in the configured environments');
|
|
182
|
+
}
|
|
181
183
|
return results.join('\n');
|
|
182
184
|
}
|
|
183
185
|
|
|
184
186
|
/**
|
|
185
187
|
* Check if an env is allowed to run scripts based on config
|
|
188
|
+
* Supports exact match with or without version
|
|
186
189
|
*/
|
|
187
190
|
isEnvAllowed(envId, allowedEnvs) {
|
|
188
|
-
// Match full env ID or just the name part
|
|
189
191
|
return allowedEnvs.some(allowedEnv => {
|
|
190
|
-
|
|
192
|
+
// Exact match (with version): "my-scope/my-env@1.0.0" === "my-scope/my-env@1.0.0"
|
|
193
|
+
if (envId === allowedEnv) return true;
|
|
194
|
+
|
|
195
|
+
// If config has no version, match env without version part
|
|
196
|
+
// Config: "my-scope/my-env" should match "my-scope/my-env@1.0.0"
|
|
197
|
+
if (!allowedEnv.includes('@') && envId.startsWith(allowedEnv + '@')) {
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
return false;
|
|
191
201
|
});
|
|
192
202
|
}
|
|
193
203
|
async getComponents() {
|
|
@@ -195,11 +205,22 @@ class ScriptsMain {
|
|
|
195
205
|
if (!host) throw new Error('workspace not found');
|
|
196
206
|
return host.list();
|
|
197
207
|
}
|
|
198
|
-
groupComponentsByEnv(components) {
|
|
208
|
+
groupComponentsByEnv(components, allowedEnvs) {
|
|
199
209
|
const grouped = (0, _lodash().groupBy)(components, component => {
|
|
200
210
|
const env = this.envs.getOrCalculateEnv(component);
|
|
201
211
|
return env.id;
|
|
202
212
|
});
|
|
213
|
+
|
|
214
|
+
// If allowedEnvs is provided, filter out envs not in the list
|
|
215
|
+
if (allowedEnvs && allowedEnvs.length > 0) {
|
|
216
|
+
const filtered = {};
|
|
217
|
+
for (const [envId, envComponents] of Object.entries(grouped)) {
|
|
218
|
+
if (this.isEnvAllowed(envId, allowedEnvs)) {
|
|
219
|
+
filtered[envId] = envComponents;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return filtered;
|
|
223
|
+
}
|
|
203
224
|
return grouped;
|
|
204
225
|
}
|
|
205
226
|
getScriptsFromEnv(env) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_cli","data","require","_component","_envs","_logger","_workspace","_chalk","_interopRequireDefault","_lodash","_child_process","_scripts","_scripts2","_script","_exceptions","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","ScriptsMain","constructor","workspace","envs","logger","componentAspect","config","runScript","scriptName","components","getComponents","length","chalk","yellow","componentsByEnv","groupComponentsByEnv","results","allowedEnvs","envId","envComponents","entries","isEnvAllowed","env","getEnvDefinitionByStringId","scripts","getScriptsFromEnv","has","ScriptNotFound","handler","get","title","green","push","result","executeScript","join","listAllScripts","isEmpty","cyan","gray","scriptsList","list","forEach","handlerStr","white","bold","some","allowedEnv","endsWith","host","getHost","Error","grouped","groupBy","component","getOrCalculateEnv","id","getScripts","undefined","executeShellCommand","executeFunction","command","output","execSync","cwd","path","encoding","stdio","error","errorMsg","stderr","message","red","context","provider","cli","loggerMain","createLogger","ScriptsAspect","scriptsService","ScriptsService","scriptsMain","registerService","scriptCmd","ScriptCmd","register","exports","CLIAspect","WorkspaceAspect","EnvsAspect","ComponentAspect","LoggerAspect","MainRuntime","addRuntime","_default"],"sources":["scripts.main.runtime.ts"],"sourcesContent":["import { CLIAspect, CLIMain, MainRuntime } from '@teambit/cli';\nimport type { Component } from '@teambit/component';\nimport { ComponentAspect, ComponentMain } from '@teambit/component';\nimport type { EnvsMain, EnvDefinition } from '@teambit/envs';\nimport { EnvsAspect } from '@teambit/envs';\nimport type { Logger, LoggerMain } from '@teambit/logger';\nimport { LoggerAspect } from '@teambit/logger';\nimport type { Workspace } from '@teambit/workspace';\nimport { WorkspaceAspect } from '@teambit/workspace';\nimport chalk from 'chalk';\nimport { groupBy } from 'lodash';\nimport { execSync } from 'child_process';\nimport { ScriptsAspect } from './scripts.aspect';\nimport { ScriptsService } from './scripts.service';\nimport { ScriptCmd } from './script.cmd';\nimport { ScriptNotFound } from './exceptions';\nimport type { Scripts } from './scripts';\nimport type { ScriptHandler, ScriptExecuteContext } from './script-definition';\n\nexport interface ScriptsConfig {\n envs?: string[];\n}\n\nexport class ScriptsMain {\n constructor(\n private workspace: Workspace,\n private envs: EnvsMain,\n private logger: Logger,\n private componentAspect: ComponentMain,\n private config: ScriptsConfig\n ) {}\n\n /**\n * Run a script for all components\n */\n async runScript(scriptName: string): Promise<string> {\n const components = await this.getComponents();\n if (!components.length) {\n return chalk.yellow('no components found');\n }\n\n // Group components by environment\n const componentsByEnv = this.groupComponentsByEnv(components);\n const results: string[] = [];\n\n // Filter envs based on config\n const allowedEnvs = this.config.envs || [];\n if (allowedEnvs.length === 0) {\n return chalk.yellow('no envs configured in workspace.jsonc under \"teambit.workspace/scripts.envs\"');\n }\n\n for (const [envId, envComponents] of Object.entries(componentsByEnv)) {\n // Skip envs not in the allowed list\n if (!this.isEnvAllowed(envId, allowedEnvs)) {\n continue;\n }\n\n const env = this.envs.getEnvDefinitionByStringId(envId);\n if (!env) continue;\n\n const scripts = this.getScriptsFromEnv(env);\n if (!scripts) continue;\n\n if (!scripts.has(scriptName)) {\n throw new ScriptNotFound(scriptName, envId);\n }\n\n const handler = scripts.get(scriptName);\n if (!handler) continue;\n\n const title = chalk.green(\n `\\nRunning script \"${scriptName}\" for ${envComponents.length} component(s) with env ${envId}:`\n );\n results.push(title);\n\n const result = await this.executeScript(handler, envComponents);\n results.push(result);\n }\n\n return results.join('\\n');\n }\n\n /**\n * List all available scripts from all environments\n */\n async listAllScripts(): Promise<string> {\n const components = await this.getComponents();\n if (!components.length) {\n return chalk.yellow('no components found');\n }\n\n const componentsByEnv = this.groupComponentsByEnv(components);\n const results: string[] = [];\n\n results.push(chalk.green('Available scripts:\\n'));\n\n // Filter envs based on config\n const allowedEnvs = this.config.envs || [];\n if (allowedEnvs.length === 0) {\n return chalk.yellow('no envs configured in workspace.jsonc under \"teambit.workspace/scripts.envs\"');\n }\n\n for (const [envId, envComponents] of Object.entries(componentsByEnv)) {\n // Skip envs not in the allowed list\n if (!this.isEnvAllowed(envId, allowedEnvs)) {\n continue;\n }\n\n const env = this.envs.getEnvDefinitionByStringId(envId);\n if (!env) continue;\n\n const scripts = this.getScriptsFromEnv(env);\n if (!scripts || scripts.isEmpty()) {\n continue;\n }\n\n results.push(chalk.cyan(`\\nEnvironment: ${envId}`));\n results.push(chalk.gray(` (used by ${envComponents.length} component(s))`));\n\n const scriptsList = scripts.list();\n scriptsList.forEach((scriptName) => {\n const handler = scripts.get(scriptName);\n const handlerStr = typeof handler === 'function' ? chalk.gray('[function]') : chalk.white(handler as string);\n results.push(` ${chalk.bold(scriptName)}: ${handlerStr}`);\n });\n }\n\n return results.join('\\n');\n }\n\n /**\n * Check if an env is allowed to run scripts based on config\n */\n private isEnvAllowed(envId: string, allowedEnvs: string[]): boolean {\n // Match full env ID or just the name part\n return allowedEnvs.some((allowedEnv) => {\n return envId === allowedEnv || envId.endsWith(`/${allowedEnv}`);\n });\n }\n\n private async getComponents(): Promise<Component[]> {\n const host = this.componentAspect.getHost();\n if (!host) throw new Error('workspace not found');\n return host.list();\n }\n\n private groupComponentsByEnv(components: Component[]): Record<string, Component[]> {\n const grouped = groupBy(components, (component) => {\n const env = this.envs.getOrCalculateEnv(component);\n return env.id;\n });\n return grouped;\n }\n\n private getScriptsFromEnv(env: EnvDefinition): Scripts | undefined {\n if (!env.env.getScripts) return undefined;\n return env.env.getScripts();\n }\n\n private async executeScript(handler: ScriptHandler, components: Component[]): Promise<string> {\n if (typeof handler === 'string') {\n // Execute shell command\n return this.executeShellCommand(handler);\n }\n\n // Execute function\n return this.executeFunction(handler, components);\n }\n\n private executeShellCommand(command: string): string {\n try {\n const output = execSync(command, {\n cwd: this.workspace.path,\n encoding: 'utf-8',\n stdio: 'pipe',\n });\n return chalk.white(output);\n } catch (error: any) {\n const errorMsg = error.stderr || error.message || 'unknown error';\n return chalk.red(`Error executing script: ${errorMsg}`);\n }\n }\n\n private async executeFunction(\n handler: (context?: ScriptExecuteContext) => void | Promise<void>,\n components: Component[]\n ): Promise<string> {\n try {\n const context: ScriptExecuteContext = { components };\n await handler(context);\n return chalk.green('✓ Script function executed successfully');\n } catch (error: any) {\n return chalk.red(`Error executing script function: ${error.message}`);\n }\n }\n\n static slots = [];\n\n static dependencies = [CLIAspect, WorkspaceAspect, EnvsAspect, ComponentAspect, LoggerAspect];\n\n static runtime = MainRuntime;\n\n static async provider(\n [cli, workspace, envs, componentAspect, loggerMain]: [CLIMain, Workspace, EnvsMain, ComponentMain, LoggerMain],\n config: ScriptsConfig\n ) {\n const logger = loggerMain.createLogger(ScriptsAspect.id);\n const scriptsService = new ScriptsService();\n const scriptsMain = new ScriptsMain(workspace, envs, logger, componentAspect, config);\n\n // Register service with envs\n envs.registerService(scriptsService);\n\n // Register CLI command\n const scriptCmd = new ScriptCmd(scriptsMain);\n cli.register(scriptCmd);\n\n return scriptsMain;\n }\n}\n\nScriptsAspect.addRuntime(ScriptsMain);\n\nexport default ScriptsMain;\n"],"mappings":";;;;;;AAAA,SAAAA,KAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,IAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,SAAAE,WAAA;EAAA,MAAAF,IAAA,GAAAC,OAAA;EAAAC,UAAA,YAAAA,CAAA;IAAA,OAAAF,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,SAAAG,MAAA;EAAA,MAAAH,IAAA,GAAAC,OAAA;EAAAE,KAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,SAAAI,QAAA;EAAA,MAAAJ,IAAA,GAAAC,OAAA;EAAAG,OAAA,YAAAA,CAAA;IAAA,OAAAJ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,SAAAK,WAAA;EAAA,MAAAL,IAAA,GAAAC,OAAA;EAAAI,UAAA,YAAAA,CAAA;IAAA,OAAAL,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAM,OAAA;EAAA,MAAAN,IAAA,GAAAO,sBAAA,CAAAN,OAAA;EAAAK,MAAA,YAAAA,CAAA;IAAA,OAAAN,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAQ,QAAA;EAAA,MAAAR,IAAA,GAAAC,OAAA;EAAAO,OAAA,YAAAA,CAAA;IAAA,OAAAR,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAS,eAAA;EAAA,MAAAT,IAAA,GAAAC,OAAA;EAAAQ,cAAA,YAAAA,CAAA;IAAA,OAAAT,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAU,SAAA;EAAA,MAAAV,IAAA,GAAAC,OAAA;EAAAS,QAAA,YAAAA,CAAA;IAAA,OAAAV,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAW,UAAA;EAAA,MAAAX,IAAA,GAAAC,OAAA;EAAAU,SAAA,YAAAA,CAAA;IAAA,OAAAX,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAY,QAAA;EAAA,MAAAZ,IAAA,GAAAC,OAAA;EAAAW,OAAA,YAAAA,CAAA;IAAA,OAAAZ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAa,YAAA;EAAA,MAAAb,IAAA,GAAAC,OAAA;EAAAY,WAAA,YAAAA,CAAA;IAAA,OAAAb,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAA8C,SAAAO,uBAAAO,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAG,gBAAAH,CAAA,EAAAI,CAAA,EAAAC,CAAA,YAAAD,CAAA,GAAAE,cAAA,CAAAF,CAAA,MAAAJ,CAAA,GAAAO,MAAA,CAAAC,cAAA,CAAAR,CAAA,EAAAI,CAAA,IAAAK,KAAA,EAAAJ,CAAA,EAAAK,UAAA,MAAAC,YAAA,MAAAC,QAAA,UAAAZ,CAAA,CAAAI,CAAA,IAAAC,CAAA,EAAAL,CAAA;AAAA,SAAAM,eAAAD,CAAA,QAAAQ,CAAA,GAAAC,YAAA,CAAAT,CAAA,uCAAAQ,CAAA,GAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAC,aAAAT,CAAA,EAAAD,CAAA,2BAAAC,CAAA,KAAAA,CAAA,SAAAA,CAAA,MAAAL,CAAA,GAAAK,CAAA,CAAAU,MAAA,CAAAC,WAAA,kBAAAhB,CAAA,QAAAa,CAAA,GAAAb,CAAA,CAAAiB,IAAA,CAAAZ,CAAA,EAAAD,CAAA,uCAAAS,CAAA,SAAAA,CAAA,YAAAK,SAAA,yEAAAd,CAAA,GAAAe,MAAA,GAAAC,MAAA,EAAAf,CAAA;AAQvC,MAAMgB,WAAW,CAAC;EACvBC,WAAWA,CACDC,SAAoB,EACpBC,IAAc,EACdC,MAAc,EACdC,eAA8B,EAC9BC,MAAqB,EAC7B;IAAA,KALQJ,SAAoB,GAApBA,SAAoB;IAAA,KACpBC,IAAc,GAAdA,IAAc;IAAA,KACdC,MAAc,GAAdA,MAAc;IAAA,KACdC,eAA8B,GAA9BA,eAA8B;IAAA,KAC9BC,MAAqB,GAArBA,MAAqB;EAC5B;;EAEH;AACF;AACA;EACE,MAAMC,SAASA,CAACC,UAAkB,EAAmB;IACnD,MAAMC,UAAU,GAAG,MAAM,IAAI,CAACC,aAAa,CAAC,CAAC;IAC7C,IAAI,CAACD,UAAU,CAACE,MAAM,EAAE;MACtB,OAAOC,gBAAK,CAACC,MAAM,CAAC,qBAAqB,CAAC;IAC5C;;IAEA;IACA,MAAMC,eAAe,GAAG,IAAI,CAACC,oBAAoB,CAACN,UAAU,CAAC;IAC7D,MAAMO,OAAiB,GAAG,EAAE;;IAE5B;IACA,MAAMC,WAAW,GAAG,IAAI,CAACX,MAAM,CAACH,IAAI,IAAI,EAAE;IAC1C,IAAIc,WAAW,CAACN,MAAM,KAAK,CAAC,EAAE;MAC5B,OAAOC,gBAAK,CAACC,MAAM,CAAC,8EAA8E,CAAC;IACrG;IAEA,KAAK,MAAM,CAACK,KAAK,EAAEC,aAAa,CAAC,IAAIjC,MAAM,CAACkC,OAAO,CAACN,eAAe,CAAC,EAAE;MACpE;MACA,IAAI,CAAC,IAAI,CAACO,YAAY,CAACH,KAAK,EAAED,WAAW,CAAC,EAAE;QAC1C;MACF;MAEA,MAAMK,GAAG,GAAG,IAAI,CAACnB,IAAI,CAACoB,0BAA0B,CAACL,KAAK,CAAC;MACvD,IAAI,CAACI,GAAG,EAAE;MAEV,MAAME,OAAO,GAAG,IAAI,CAACC,iBAAiB,CAACH,GAAG,CAAC;MAC3C,IAAI,CAACE,OAAO,EAAE;MAEd,IAAI,CAACA,OAAO,CAACE,GAAG,CAAClB,UAAU,CAAC,EAAE;QAC5B,MAAM,KAAImB,4BAAc,EAACnB,UAAU,EAAEU,KAAK,CAAC;MAC7C;MAEA,MAAMU,OAAO,GAAGJ,OAAO,CAACK,GAAG,CAACrB,UAAU,CAAC;MACvC,IAAI,CAACoB,OAAO,EAAE;MAEd,MAAME,KAAK,GAAGlB,gBAAK,CAACmB,KAAK,CACvB,qBAAqBvB,UAAU,SAASW,aAAa,CAACR,MAAM,0BAA0BO,KAAK,GAC7F,CAAC;MACDF,OAAO,CAACgB,IAAI,CAACF,KAAK,CAAC;MAEnB,MAAMG,MAAM,GAAG,MAAM,IAAI,CAACC,aAAa,CAACN,OAAO,EAAET,aAAa,CAAC;MAC/DH,OAAO,CAACgB,IAAI,CAACC,MAAM,CAAC;IACtB;IAEA,OAAOjB,OAAO,CAACmB,IAAI,CAAC,IAAI,CAAC;EAC3B;;EAEA;AACF;AACA;EACE,MAAMC,cAAcA,CAAA,EAAoB;IACtC,MAAM3B,UAAU,GAAG,MAAM,IAAI,CAACC,aAAa,CAAC,CAAC;IAC7C,IAAI,CAACD,UAAU,CAACE,MAAM,EAAE;MACtB,OAAOC,gBAAK,CAACC,MAAM,CAAC,qBAAqB,CAAC;IAC5C;IAEA,MAAMC,eAAe,GAAG,IAAI,CAACC,oBAAoB,CAACN,UAAU,CAAC;IAC7D,MAAMO,OAAiB,GAAG,EAAE;IAE5BA,OAAO,CAACgB,IAAI,CAACpB,gBAAK,CAACmB,KAAK,CAAC,sBAAsB,CAAC,CAAC;;IAEjD;IACA,MAAMd,WAAW,GAAG,IAAI,CAACX,MAAM,CAACH,IAAI,IAAI,EAAE;IAC1C,IAAIc,WAAW,CAACN,MAAM,KAAK,CAAC,EAAE;MAC5B,OAAOC,gBAAK,CAACC,MAAM,CAAC,8EAA8E,CAAC;IACrG;IAEA,KAAK,MAAM,CAACK,KAAK,EAAEC,aAAa,CAAC,IAAIjC,MAAM,CAACkC,OAAO,CAACN,eAAe,CAAC,EAAE;MACpE;MACA,IAAI,CAAC,IAAI,CAACO,YAAY,CAACH,KAAK,EAAED,WAAW,CAAC,EAAE;QAC1C;MACF;MAEA,MAAMK,GAAG,GAAG,IAAI,CAACnB,IAAI,CAACoB,0BAA0B,CAACL,KAAK,CAAC;MACvD,IAAI,CAACI,GAAG,EAAE;MAEV,MAAME,OAAO,GAAG,IAAI,CAACC,iBAAiB,CAACH,GAAG,CAAC;MAC3C,IAAI,CAACE,OAAO,IAAIA,OAAO,CAACa,OAAO,CAAC,CAAC,EAAE;QACjC;MACF;MAEArB,OAAO,CAACgB,IAAI,CAACpB,gBAAK,CAAC0B,IAAI,CAAC,kBAAkBpB,KAAK,EAAE,CAAC,CAAC;MACnDF,OAAO,CAACgB,IAAI,CAACpB,gBAAK,CAAC2B,IAAI,CAAC,cAAcpB,aAAa,CAACR,MAAM,gBAAgB,CAAC,CAAC;MAE5E,MAAM6B,WAAW,GAAGhB,OAAO,CAACiB,IAAI,CAAC,CAAC;MAClCD,WAAW,CAACE,OAAO,CAAElC,UAAU,IAAK;QAClC,MAAMoB,OAAO,GAAGJ,OAAO,CAACK,GAAG,CAACrB,UAAU,CAAC;QACvC,MAAMmC,UAAU,GAAG,OAAOf,OAAO,KAAK,UAAU,GAAGhB,gBAAK,CAAC2B,IAAI,CAAC,YAAY,CAAC,GAAG3B,gBAAK,CAACgC,KAAK,CAAChB,OAAiB,CAAC;QAC5GZ,OAAO,CAACgB,IAAI,CAAC,KAAKpB,gBAAK,CAACiC,IAAI,CAACrC,UAAU,CAAC,KAAKmC,UAAU,EAAE,CAAC;MAC5D,CAAC,CAAC;IACJ;IAEA,OAAO3B,OAAO,CAACmB,IAAI,CAAC,IAAI,CAAC;EAC3B;;EAEA;AACF;AACA;EACUd,YAAYA,CAACH,KAAa,EAAED,WAAqB,EAAW;IAClE;IACA,OAAOA,WAAW,CAAC6B,IAAI,CAAEC,UAAU,IAAK;MACtC,OAAO7B,KAAK,KAAK6B,UAAU,IAAI7B,KAAK,CAAC8B,QAAQ,CAAC,IAAID,UAAU,EAAE,CAAC;IACjE,CAAC,CAAC;EACJ;EAEA,MAAcrC,aAAaA,CAAA,EAAyB;IAClD,MAAMuC,IAAI,GAAG,IAAI,CAAC5C,eAAe,CAAC6C,OAAO,CAAC,CAAC;IAC3C,IAAI,CAACD,IAAI,EAAE,MAAM,IAAIE,KAAK,CAAC,qBAAqB,CAAC;IACjD,OAAOF,IAAI,CAACR,IAAI,CAAC,CAAC;EACpB;EAEQ1B,oBAAoBA,CAACN,UAAuB,EAA+B;IACjF,MAAM2C,OAAO,GAAG,IAAAC,iBAAO,EAAC5C,UAAU,EAAG6C,SAAS,IAAK;MACjD,MAAMhC,GAAG,GAAG,IAAI,CAACnB,IAAI,CAACoD,iBAAiB,CAACD,SAAS,CAAC;MAClD,OAAOhC,GAAG,CAACkC,EAAE;IACf,CAAC,CAAC;IACF,OAAOJ,OAAO;EAChB;EAEQ3B,iBAAiBA,CAACH,GAAkB,EAAuB;IACjE,IAAI,CAACA,GAAG,CAACA,GAAG,CAACmC,UAAU,EAAE,OAAOC,SAAS;IACzC,OAAOpC,GAAG,CAACA,GAAG,CAACmC,UAAU,CAAC,CAAC;EAC7B;EAEA,MAAcvB,aAAaA,CAACN,OAAsB,EAAEnB,UAAuB,EAAmB;IAC5F,IAAI,OAAOmB,OAAO,KAAK,QAAQ,EAAE;MAC/B;MACA,OAAO,IAAI,CAAC+B,mBAAmB,CAAC/B,OAAO,CAAC;IAC1C;;IAEA;IACA,OAAO,IAAI,CAACgC,eAAe,CAAChC,OAAO,EAAEnB,UAAU,CAAC;EAClD;EAEQkD,mBAAmBA,CAACE,OAAe,EAAU;IACnD,IAAI;MACF,MAAMC,MAAM,GAAG,IAAAC,yBAAQ,EAACF,OAAO,EAAE;QAC/BG,GAAG,EAAE,IAAI,CAAC9D,SAAS,CAAC+D,IAAI;QACxBC,QAAQ,EAAE,OAAO;QACjBC,KAAK,EAAE;MACT,CAAC,CAAC;MACF,OAAOvD,gBAAK,CAACgC,KAAK,CAACkB,MAAM,CAAC;IAC5B,CAAC,CAAC,OAAOM,KAAU,EAAE;MACnB,MAAMC,QAAQ,GAAGD,KAAK,CAACE,MAAM,IAAIF,KAAK,CAACG,OAAO,IAAI,eAAe;MACjE,OAAO3D,gBAAK,CAAC4D,GAAG,CAAC,2BAA2BH,QAAQ,EAAE,CAAC;IACzD;EACF;EAEA,MAAcT,eAAeA,CAC3BhC,OAAiE,EACjEnB,UAAuB,EACN;IACjB,IAAI;MACF,MAAMgE,OAA6B,GAAG;QAAEhE;MAAW,CAAC;MACpD,MAAMmB,OAAO,CAAC6C,OAAO,CAAC;MACtB,OAAO7D,gBAAK,CAACmB,KAAK,CAAC,yCAAyC,CAAC;IAC/D,CAAC,CAAC,OAAOqC,KAAU,EAAE;MACnB,OAAOxD,gBAAK,CAAC4D,GAAG,CAAC,oCAAoCJ,KAAK,CAACG,OAAO,EAAE,CAAC;IACvE;EACF;EAQA,aAAaG,QAAQA,CACnB,CAACC,GAAG,EAAEzE,SAAS,EAAEC,IAAI,EAAEE,eAAe,EAAEuE,UAAU,CAA4D,EAC9GtE,MAAqB,EACrB;IACA,MAAMF,MAAM,GAAGwE,UAAU,CAACC,YAAY,CAACC,wBAAa,CAACtB,EAAE,CAAC;IACxD,MAAMuB,cAAc,GAAG,KAAIC,0BAAc,EAAC,CAAC;IAC3C,MAAMC,WAAW,GAAG,IAAIjF,WAAW,CAACE,SAAS,EAAEC,IAAI,EAAEC,MAAM,EAAEC,eAAe,EAAEC,MAAM,CAAC;;IAErF;IACAH,IAAI,CAAC+E,eAAe,CAACH,cAAc,CAAC;;IAEpC;IACA,MAAMI,SAAS,GAAG,KAAIC,mBAAS,EAACH,WAAW,CAAC;IAC5CN,GAAG,CAACU,QAAQ,CAACF,SAAS,CAAC;IAEvB,OAAOF,WAAW;EACpB;AACF;AAACK,OAAA,CAAAtF,WAAA,GAAAA,WAAA;AAAAlB,eAAA,CApMYkB,WAAW,WA6KP,EAAE;AAAAlB,eAAA,CA7KNkB,WAAW,kBA+KA,CAACuF,gBAAS,EAAEC,4BAAe,EAAEC,kBAAU,EAAEC,4BAAe,EAAEC,sBAAY,CAAC;AAAA7G,eAAA,CA/KlFkB,WAAW,aAiLL4F,kBAAW;AAqB9Bd,wBAAa,CAACe,UAAU,CAAC7F,WAAW,CAAC;AAAC,IAAA8F,QAAA,GAAAR,OAAA,CAAAzG,OAAA,GAEvBmB,WAAW","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_cli","data","require","_component","_envs","_logger","_workspace","_chalk","_interopRequireDefault","_lodash","_child_process","_scripts","_scripts2","_script","_exceptions","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","ScriptsMain","constructor","workspace","envs","logger","componentAspect","config","getConfigErrorMessage","chalk","yellow","runScript","scriptName","allowedEnvs","length","components","getComponents","componentsByEnv","groupComponentsByEnv","results","envId","envComponents","entries","env","getEnvDefinitionByStringId","scripts","getScriptsFromEnv","has","ScriptNotFound","handler","get","title","green","push","result","executeScript","join","listAllScripts","foundAnyScripts","isEmpty","cyan","gray","scriptsList","list","forEach","handlerStr","white","bold","isEnvAllowed","some","allowedEnv","includes","startsWith","host","getHost","Error","grouped","groupBy","component","getOrCalculateEnv","id","filtered","getScripts","undefined","executeShellCommand","executeFunction","command","output","execSync","cwd","path","encoding","stdio","error","errorMsg","stderr","message","red","context","provider","cli","loggerMain","createLogger","ScriptsAspect","scriptsService","ScriptsService","scriptsMain","registerService","scriptCmd","ScriptCmd","register","exports","CLIAspect","WorkspaceAspect","EnvsAspect","ComponentAspect","LoggerAspect","MainRuntime","addRuntime","_default"],"sources":["scripts.main.runtime.ts"],"sourcesContent":["import { CLIAspect, CLIMain, MainRuntime } from '@teambit/cli';\nimport type { Component } from '@teambit/component';\nimport { ComponentAspect, ComponentMain } from '@teambit/component';\nimport type { EnvsMain, EnvDefinition } from '@teambit/envs';\nimport { EnvsAspect } from '@teambit/envs';\nimport type { Logger, LoggerMain } from '@teambit/logger';\nimport { LoggerAspect } from '@teambit/logger';\nimport type { Workspace } from '@teambit/workspace';\nimport { WorkspaceAspect } from '@teambit/workspace';\nimport chalk from 'chalk';\nimport { groupBy } from 'lodash';\nimport { execSync } from 'child_process';\nimport { ScriptsAspect } from './scripts.aspect';\nimport { ScriptsService } from './scripts.service';\nimport { ScriptCmd } from './script.cmd';\nimport { ScriptNotFound } from './exceptions';\nimport type { Scripts } from './scripts';\nimport type { ScriptHandler, ScriptExecuteContext } from './script-definition';\n\nexport interface ScriptsConfig {\n envs?: string[];\n}\n\nexport class ScriptsMain {\n constructor(\n private workspace: Workspace,\n private envs: EnvsMain,\n private logger: Logger,\n private componentAspect: ComponentMain,\n private config: ScriptsConfig\n ) {}\n\n private getConfigErrorMessage(): string {\n return chalk.yellow(\n 'no envs configured. Add to workspace.jsonc:\\n' +\n '{\\n' +\n ' \"teambit.workspace/scripts\": {\\n' +\n ' \"envs\": [\"your-scope/your-env\"]\\n' +\n ' }\\n' +\n '}'\n );\n }\n\n /**\n * Run a script for all components\n */\n async runScript(scriptName: string): Promise<string> {\n // Filter envs based on config\n const allowedEnvs = this.config.envs || [];\n if (allowedEnvs.length === 0) {\n return this.getConfigErrorMessage();\n }\n\n const components = await this.getComponents();\n if (!components.length) {\n return chalk.yellow('no components found');\n }\n\n // Group components by environment, filtering only configured envs\n const componentsByEnv = this.groupComponentsByEnv(components, allowedEnvs);\n const results: string[] = [];\n\n for (const [envId, envComponents] of Object.entries(componentsByEnv)) {\n const env = this.envs.getEnvDefinitionByStringId(envId);\n if (!env) continue;\n\n const scripts = this.getScriptsFromEnv(env);\n if (!scripts) continue;\n\n if (!scripts.has(scriptName)) {\n throw new ScriptNotFound(scriptName, envId);\n }\n\n const handler = scripts.get(scriptName);\n if (!handler) continue;\n\n const title = chalk.green(\n `\\nRunning script \"${scriptName}\" for ${envComponents.length} component(s) with env ${envId}:`\n );\n results.push(title);\n\n const result = await this.executeScript(handler, envComponents);\n results.push(result);\n }\n\n return results.join('\\n');\n }\n\n /**\n * List all available scripts from all environments\n */\n async listAllScripts(): Promise<string> {\n // Filter envs based on config\n const allowedEnvs = this.config.envs || [];\n if (allowedEnvs.length === 0) {\n return this.getConfigErrorMessage();\n }\n\n const components = await this.getComponents();\n if (!components.length) {\n return chalk.yellow('no components found');\n }\n\n // Group components by environment, filtering only configured envs\n const componentsByEnv = this.groupComponentsByEnv(components, allowedEnvs);\n const results: string[] = [];\n let foundAnyScripts = false;\n\n for (const [envId, envComponents] of Object.entries(componentsByEnv)) {\n const env = this.envs.getEnvDefinitionByStringId(envId);\n if (!env) continue;\n\n const scripts = this.getScriptsFromEnv(env);\n if (!scripts || scripts.isEmpty()) {\n continue;\n }\n\n if (!foundAnyScripts) {\n results.push(chalk.green('Available scripts:\\n'));\n foundAnyScripts = true;\n }\n\n results.push(chalk.cyan(`\\nEnvironment: ${envId}`));\n results.push(chalk.gray(` (used by ${envComponents.length} component(s))`));\n\n const scriptsList = scripts.list();\n scriptsList.forEach((scriptName) => {\n const handler = scripts.get(scriptName);\n const handlerStr = typeof handler === 'function' ? chalk.gray('[function]') : chalk.white(handler as string);\n results.push(` ${chalk.bold(scriptName)}: ${handlerStr}`);\n });\n }\n\n if (!foundAnyScripts) {\n return chalk.yellow('no scripts defined in the configured environments');\n }\n\n return results.join('\\n');\n }\n\n /**\n * Check if an env is allowed to run scripts based on config\n * Supports exact match with or without version\n */\n private isEnvAllowed(envId: string, allowedEnvs: string[]): boolean {\n return allowedEnvs.some((allowedEnv) => {\n // Exact match (with version): \"my-scope/my-env@1.0.0\" === \"my-scope/my-env@1.0.0\"\n if (envId === allowedEnv) return true;\n\n // If config has no version, match env without version part\n // Config: \"my-scope/my-env\" should match \"my-scope/my-env@1.0.0\"\n if (!allowedEnv.includes('@') && envId.startsWith(allowedEnv + '@')) {\n return true;\n }\n\n return false;\n });\n }\n\n private async getComponents(): Promise<Component[]> {\n const host = this.componentAspect.getHost();\n if (!host) throw new Error('workspace not found');\n return host.list();\n }\n\n private groupComponentsByEnv(components: Component[], allowedEnvs?: string[]): Record<string, Component[]> {\n const grouped = groupBy(components, (component) => {\n const env = this.envs.getOrCalculateEnv(component);\n return env.id;\n });\n\n // If allowedEnvs is provided, filter out envs not in the list\n if (allowedEnvs && allowedEnvs.length > 0) {\n const filtered: Record<string, Component[]> = {};\n for (const [envId, envComponents] of Object.entries(grouped)) {\n if (this.isEnvAllowed(envId, allowedEnvs)) {\n filtered[envId] = envComponents;\n }\n }\n return filtered;\n }\n\n return grouped;\n }\n\n private getScriptsFromEnv(env: EnvDefinition): Scripts | undefined {\n if (!env.env.getScripts) return undefined;\n return env.env.getScripts();\n }\n\n private async executeScript(handler: ScriptHandler, components: Component[]): Promise<string> {\n if (typeof handler === 'string') {\n // Execute shell command\n return this.executeShellCommand(handler);\n }\n\n // Execute function\n return this.executeFunction(handler, components);\n }\n\n private executeShellCommand(command: string): string {\n try {\n const output = execSync(command, {\n cwd: this.workspace.path,\n encoding: 'utf-8',\n stdio: 'pipe',\n });\n return chalk.white(output);\n } catch (error: any) {\n const errorMsg = error.stderr || error.message || 'unknown error';\n return chalk.red(`Error executing script: ${errorMsg}`);\n }\n }\n\n private async executeFunction(\n handler: (context?: ScriptExecuteContext) => void | Promise<void>,\n components: Component[]\n ): Promise<string> {\n try {\n const context: ScriptExecuteContext = { components };\n await handler(context);\n return chalk.green('✓ Script function executed successfully');\n } catch (error: any) {\n return chalk.red(`Error executing script function: ${error.message}`);\n }\n }\n\n static slots = [];\n\n static dependencies = [CLIAspect, WorkspaceAspect, EnvsAspect, ComponentAspect, LoggerAspect];\n\n static runtime = MainRuntime;\n\n static async provider(\n [cli, workspace, envs, componentAspect, loggerMain]: [CLIMain, Workspace, EnvsMain, ComponentMain, LoggerMain],\n config: ScriptsConfig\n ) {\n const logger = loggerMain.createLogger(ScriptsAspect.id);\n const scriptsService = new ScriptsService();\n const scriptsMain = new ScriptsMain(workspace, envs, logger, componentAspect, config);\n\n // Register service with envs\n envs.registerService(scriptsService);\n\n // Register CLI command\n const scriptCmd = new ScriptCmd(scriptsMain);\n cli.register(scriptCmd);\n\n return scriptsMain;\n }\n}\n\nScriptsAspect.addRuntime(ScriptsMain);\n\nexport default ScriptsMain;\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teambit/scripts",
|
|
3
|
-
"version": "0.0.0-
|
|
3
|
+
"version": "0.0.0-ce0b15b1a5b104399f16328c9caae26c5e667ae2",
|
|
4
|
+
"homepage": "https://bit.cloud/teambit/workspace/scripts",
|
|
4
5
|
"main": "dist/index.js",
|
|
5
6
|
"componentId": {
|
|
7
|
+
"scope": "teambit.workspace",
|
|
6
8
|
"name": "scripts",
|
|
7
|
-
"version": "
|
|
8
|
-
"scope": "teambit.workspace"
|
|
9
|
+
"version": "ce0b15b1a5b104399f16328c9caae26c5e667ae2"
|
|
9
10
|
},
|
|
10
11
|
"dependencies": {
|
|
11
12
|
"chalk": "4.1.2",
|
|
@@ -16,9 +17,9 @@
|
|
|
16
17
|
"@teambit/harmony": "0.4.7",
|
|
17
18
|
"@teambit/logger": "0.0.1375",
|
|
18
19
|
"@teambit/bit-error": "0.0.404",
|
|
19
|
-
"@teambit/component": "0.0.0-
|
|
20
|
-
"@teambit/envs": "0.0.0-
|
|
21
|
-
"@teambit/workspace": "0.0.0-
|
|
20
|
+
"@teambit/component": "0.0.0-fd5ba37ee0522a4bb5c2e4fa2d82093635ac76c4",
|
|
21
|
+
"@teambit/envs": "0.0.0-419b70101192b11c6825df02d90633de883422be",
|
|
22
|
+
"@teambit/workspace": "0.0.0-41f320a6bf12ef6e4b7d7b3104da33c2472fe419"
|
|
22
23
|
},
|
|
23
24
|
"devDependencies": {
|
|
24
25
|
"@types/lodash": "4.14.165",
|
package/scripts.main.runtime.ts
CHANGED
|
@@ -30,31 +30,37 @@ export class ScriptsMain {
|
|
|
30
30
|
private config: ScriptsConfig
|
|
31
31
|
) {}
|
|
32
32
|
|
|
33
|
+
private getConfigErrorMessage(): string {
|
|
34
|
+
return chalk.yellow(
|
|
35
|
+
'no envs configured. Add to workspace.jsonc:\n' +
|
|
36
|
+
'{\n' +
|
|
37
|
+
' "teambit.workspace/scripts": {\n' +
|
|
38
|
+
' "envs": ["your-scope/your-env"]\n' +
|
|
39
|
+
' }\n' +
|
|
40
|
+
'}'
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
33
44
|
/**
|
|
34
45
|
* Run a script for all components
|
|
35
46
|
*/
|
|
36
47
|
async runScript(scriptName: string): Promise<string> {
|
|
48
|
+
// Filter envs based on config
|
|
49
|
+
const allowedEnvs = this.config.envs || [];
|
|
50
|
+
if (allowedEnvs.length === 0) {
|
|
51
|
+
return this.getConfigErrorMessage();
|
|
52
|
+
}
|
|
53
|
+
|
|
37
54
|
const components = await this.getComponents();
|
|
38
55
|
if (!components.length) {
|
|
39
56
|
return chalk.yellow('no components found');
|
|
40
57
|
}
|
|
41
58
|
|
|
42
|
-
// Group components by environment
|
|
43
|
-
const componentsByEnv = this.groupComponentsByEnv(components);
|
|
59
|
+
// Group components by environment, filtering only configured envs
|
|
60
|
+
const componentsByEnv = this.groupComponentsByEnv(components, allowedEnvs);
|
|
44
61
|
const results: string[] = [];
|
|
45
62
|
|
|
46
|
-
// Filter envs based on config
|
|
47
|
-
const allowedEnvs = this.config.envs || [];
|
|
48
|
-
if (allowedEnvs.length === 0) {
|
|
49
|
-
return chalk.yellow('no envs configured in workspace.jsonc under "teambit.workspace/scripts.envs"');
|
|
50
|
-
}
|
|
51
|
-
|
|
52
63
|
for (const [envId, envComponents] of Object.entries(componentsByEnv)) {
|
|
53
|
-
// Skip envs not in the allowed list
|
|
54
|
-
if (!this.isEnvAllowed(envId, allowedEnvs)) {
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
64
|
const env = this.envs.getEnvDefinitionByStringId(envId);
|
|
59
65
|
if (!env) continue;
|
|
60
66
|
|
|
@@ -84,28 +90,23 @@ export class ScriptsMain {
|
|
|
84
90
|
* List all available scripts from all environments
|
|
85
91
|
*/
|
|
86
92
|
async listAllScripts(): Promise<string> {
|
|
93
|
+
// Filter envs based on config
|
|
94
|
+
const allowedEnvs = this.config.envs || [];
|
|
95
|
+
if (allowedEnvs.length === 0) {
|
|
96
|
+
return this.getConfigErrorMessage();
|
|
97
|
+
}
|
|
98
|
+
|
|
87
99
|
const components = await this.getComponents();
|
|
88
100
|
if (!components.length) {
|
|
89
101
|
return chalk.yellow('no components found');
|
|
90
102
|
}
|
|
91
103
|
|
|
92
|
-
|
|
104
|
+
// Group components by environment, filtering only configured envs
|
|
105
|
+
const componentsByEnv = this.groupComponentsByEnv(components, allowedEnvs);
|
|
93
106
|
const results: string[] = [];
|
|
94
|
-
|
|
95
|
-
results.push(chalk.green('Available scripts:\n'));
|
|
96
|
-
|
|
97
|
-
// Filter envs based on config
|
|
98
|
-
const allowedEnvs = this.config.envs || [];
|
|
99
|
-
if (allowedEnvs.length === 0) {
|
|
100
|
-
return chalk.yellow('no envs configured in workspace.jsonc under "teambit.workspace/scripts.envs"');
|
|
101
|
-
}
|
|
107
|
+
let foundAnyScripts = false;
|
|
102
108
|
|
|
103
109
|
for (const [envId, envComponents] of Object.entries(componentsByEnv)) {
|
|
104
|
-
// Skip envs not in the allowed list
|
|
105
|
-
if (!this.isEnvAllowed(envId, allowedEnvs)) {
|
|
106
|
-
continue;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
110
|
const env = this.envs.getEnvDefinitionByStringId(envId);
|
|
110
111
|
if (!env) continue;
|
|
111
112
|
|
|
@@ -114,6 +115,11 @@ export class ScriptsMain {
|
|
|
114
115
|
continue;
|
|
115
116
|
}
|
|
116
117
|
|
|
118
|
+
if (!foundAnyScripts) {
|
|
119
|
+
results.push(chalk.green('Available scripts:\n'));
|
|
120
|
+
foundAnyScripts = true;
|
|
121
|
+
}
|
|
122
|
+
|
|
117
123
|
results.push(chalk.cyan(`\nEnvironment: ${envId}`));
|
|
118
124
|
results.push(chalk.gray(` (used by ${envComponents.length} component(s))`));
|
|
119
125
|
|
|
@@ -125,16 +131,29 @@ export class ScriptsMain {
|
|
|
125
131
|
});
|
|
126
132
|
}
|
|
127
133
|
|
|
134
|
+
if (!foundAnyScripts) {
|
|
135
|
+
return chalk.yellow('no scripts defined in the configured environments');
|
|
136
|
+
}
|
|
137
|
+
|
|
128
138
|
return results.join('\n');
|
|
129
139
|
}
|
|
130
140
|
|
|
131
141
|
/**
|
|
132
142
|
* Check if an env is allowed to run scripts based on config
|
|
143
|
+
* Supports exact match with or without version
|
|
133
144
|
*/
|
|
134
145
|
private isEnvAllowed(envId: string, allowedEnvs: string[]): boolean {
|
|
135
|
-
// Match full env ID or just the name part
|
|
136
146
|
return allowedEnvs.some((allowedEnv) => {
|
|
137
|
-
|
|
147
|
+
// Exact match (with version): "my-scope/my-env@1.0.0" === "my-scope/my-env@1.0.0"
|
|
148
|
+
if (envId === allowedEnv) return true;
|
|
149
|
+
|
|
150
|
+
// If config has no version, match env without version part
|
|
151
|
+
// Config: "my-scope/my-env" should match "my-scope/my-env@1.0.0"
|
|
152
|
+
if (!allowedEnv.includes('@') && envId.startsWith(allowedEnv + '@')) {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return false;
|
|
138
157
|
});
|
|
139
158
|
}
|
|
140
159
|
|
|
@@ -144,11 +163,23 @@ export class ScriptsMain {
|
|
|
144
163
|
return host.list();
|
|
145
164
|
}
|
|
146
165
|
|
|
147
|
-
private groupComponentsByEnv(components: Component[]): Record<string, Component[]> {
|
|
166
|
+
private groupComponentsByEnv(components: Component[], allowedEnvs?: string[]): Record<string, Component[]> {
|
|
148
167
|
const grouped = groupBy(components, (component) => {
|
|
149
168
|
const env = this.envs.getOrCalculateEnv(component);
|
|
150
169
|
return env.id;
|
|
151
170
|
});
|
|
171
|
+
|
|
172
|
+
// If allowedEnvs is provided, filter out envs not in the list
|
|
173
|
+
if (allowedEnvs && allowedEnvs.length > 0) {
|
|
174
|
+
const filtered: Record<string, Component[]> = {};
|
|
175
|
+
for (const [envId, envComponents] of Object.entries(grouped)) {
|
|
176
|
+
if (this.isEnvAllowed(envId, allowedEnvs)) {
|
|
177
|
+
filtered[envId] = envComponents;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return filtered;
|
|
181
|
+
}
|
|
182
|
+
|
|
152
183
|
return grouped;
|
|
153
184
|
}
|
|
154
185
|
|
|
File without changes
|