@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
- // Filter envs based on config
157
- const allowedEnvs = this.config.envs || [];
158
- if (allowedEnvs.length === 0) {
159
- return _chalk().default.yellow('no envs configured in workspace.jsonc under "teambit.workspace/scripts.envs"');
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
- return envId === allowedEnv || envId.endsWith(`/${allowedEnv}`);
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":"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","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-7b9ddaf7267d5e719d14b53976e0d55bfd5b8614",
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": "7b9ddaf7267d5e719d14b53976e0d55bfd5b8614",
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-94ae0f429a19b3fa7c20aa8291c3ffea06699ac3",
20
- "@teambit/envs": "0.0.0-369a1beca6d7c325851c9d0aa6d7efa4d91b7337",
21
- "@teambit/workspace": "0.0.0-2fceb2925b0ac8d774821ade13eebc93804835ca"
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",
@@ -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
- const componentsByEnv = this.groupComponentsByEnv(components);
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
- return envId === allowedEnv || envId.endsWith(`/${allowedEnv}`);
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