@teambit/workspace 0.0.526 → 0.0.530

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.
@@ -2,7 +2,7 @@ import { PubsubMain } from '@teambit/pubsub';
2
2
  import type { AspectLoaderMain } from '@teambit/aspect-loader';
3
3
  import { BundlerMain } from '@teambit/bundler';
4
4
  import { CLIMain } from '@teambit/cli';
5
- import { ComponentMain } from '@teambit/component';
5
+ import type { ComponentMain, Component } from '@teambit/component';
6
6
  import { DependencyResolverMain } from '@teambit/dependency-resolver';
7
7
  import { EnvsMain } from '@teambit/envs';
8
8
  import { GraphqlMain } from '@teambit/graphql';
@@ -14,6 +14,7 @@ import { UiMain } from '@teambit/ui';
14
14
  import type { VariantsMain } from '@teambit/variants';
15
15
  import { OnComponentLoad, OnComponentAdd, OnComponentChange, OnComponentRemove } from './on-component-events';
16
16
  import { WorkspaceExtConfig } from './types';
17
+ import { WatchOptions } from './watch/watcher';
17
18
  import { Workspace } from './workspace';
18
19
  export declare type WorkspaceDeps = [
19
20
  PubsubMain,
@@ -34,9 +35,12 @@ export declare type OnComponentLoadSlot = SlotRegistry<OnComponentLoad>;
34
35
  export declare type OnComponentChangeSlot = SlotRegistry<OnComponentChange>;
35
36
  export declare type OnComponentAddSlot = SlotRegistry<OnComponentAdd>;
36
37
  export declare type OnComponentRemoveSlot = SlotRegistry<OnComponentRemove>;
37
- export default function provideWorkspace([pubsub, cli, scope, component, isolator, dependencyResolver, variants, loggerExt, graphql, ui, bundler, aspectLoader, envs,]: WorkspaceDeps, config: WorkspaceExtConfig, [onComponentLoadSlot, onComponentChangeSlot, onComponentAddSlot, onComponentRemoveSlot]: [
38
+ export declare type OnPreWatch = (components: Component[], watchOpts: WatchOptions) => Promise<void>;
39
+ export declare type OnPreWatchSlot = SlotRegistry<OnPreWatch>;
40
+ export default function provideWorkspace([pubsub, cli, scope, component, isolator, dependencyResolver, variants, loggerExt, graphql, ui, bundler, aspectLoader, envs,]: WorkspaceDeps, config: WorkspaceExtConfig, [onComponentLoadSlot, onComponentChangeSlot, onComponentAddSlot, onComponentRemoveSlot, onPreWatchSlot]: [
38
41
  OnComponentLoadSlot,
39
42
  OnComponentChangeSlot,
40
43
  OnComponentAddSlot,
41
- OnComponentRemoveSlot
44
+ OnComponentRemoveSlot,
45
+ OnPreWatchSlot
42
46
  ], harmony: Harmony): Promise<Workspace | undefined>;
@@ -181,13 +181,13 @@ function _capsule() {
181
181
  return data;
182
182
  }
183
183
 
184
- async function provideWorkspace([pubsub, cli, scope, component, isolator, dependencyResolver, variants, loggerExt, graphql, ui, bundler, aspectLoader, envs], config, [onComponentLoadSlot, onComponentChangeSlot, onComponentAddSlot, onComponentRemoveSlot], harmony) {
184
+ async function provideWorkspace([pubsub, cli, scope, component, isolator, dependencyResolver, variants, loggerExt, graphql, ui, bundler, aspectLoader, envs], config, [onComponentLoadSlot, onComponentChangeSlot, onComponentAddSlot, onComponentRemoveSlot, onPreWatchSlot], harmony) {
185
185
  const bitConfig = harmony.config.get('teambit.harmony/bit');
186
186
  const consumer = await getConsumer(bitConfig.cwd);
187
187
  if (!consumer) return undefined; // TODO: get the 'workspace' name in a better way
188
188
 
189
189
  const logger = loggerExt.createLogger(_constants().EXT_NAME);
190
- const workspace = new (_workspace().Workspace)(pubsub, config, consumer, scope, component, isolator, dependencyResolver, variants, aspectLoader, logger, undefined, harmony, onComponentLoadSlot, onComponentChangeSlot, envs, onComponentAddSlot, onComponentRemoveSlot, graphql);
190
+ const workspace = new (_workspace().Workspace)(pubsub, config, consumer, scope, component, isolator, dependencyResolver, variants, aspectLoader, logger, undefined, harmony, onComponentLoadSlot, onComponentChangeSlot, envs, onComponentAddSlot, onComponentRemoveSlot, onPreWatchSlot, graphql);
191
191
 
192
192
  const getWorkspacePolicyFromPackageJson = () => {
193
193
  var _workspace$consumer$p;
@@ -1 +1 @@
1
- {"version":3,"sources":["workspace.provider.ts"],"names":["provideWorkspace","pubsub","cli","scope","component","isolator","dependencyResolver","variants","loggerExt","graphql","ui","bundler","aspectLoader","envs","config","onComponentLoadSlot","onComponentChangeSlot","onComponentAddSlot","onComponentRemoveSlot","harmony","bitConfig","get","consumer","getConsumer","cwd","undefined","logger","createLogger","EXT_NAME","workspace","Workspace","getWorkspacePolicyFromPackageJson","packageJson","packageJsonObject","policyFromPackageJson","registerRootPolicy","ManyComponentsWriter","registerExternalInstaller","install","installOpts","dedupe","updateExisting","import","onCacheClear","push","clearCache","isLegacy","LegacyComponentLoader","registerOnComponentLoadSubscriber","legacyComponent","id","resolveComponentId","newComponent","state","_consumer","ConsumerComponent","registerOnComponentConfigLoading","componentId","componentFromScope","extensions","componentExtensions","defaultScope","componentDefaultScope","loadExtensions","extensionsWithLegacyIdsP","map","extension","legacyEntry","clone","extensionId","compId","_legacy","newExtensionId","extensionsWithLegacyIds","Promise","all","ExtensionDataList","fromArray","workspaceSchema","registerUiRoot","WorkspaceUIRoot","register","capsuleCmd","CapsuleCmd","commands","CapsuleListCmd","CapsuleCreateCmd","InstallCmd","EjectConfCmd","watcher","Watcher","unregister","WatchCommand","LinkCommand","Tag","registerHost","registerOnStart","loadAspects","getNotLoadedConfiguredExtensions","path"],"mappings":"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","sourcesContent":["import { PubsubMain } from '@teambit/pubsub';\nimport type { AspectLoaderMain } from '@teambit/aspect-loader';\nimport { BundlerMain } from '@teambit/bundler';\nimport { CLIMain, CommandList } from '@teambit/cli';\nimport { ComponentMain } from '@teambit/component';\nimport { DependencyResolverMain } from '@teambit/dependency-resolver';\nimport { EnvsMain } from '@teambit/envs';\nimport { GraphqlMain } from '@teambit/graphql';\nimport { Harmony, SlotRegistry } from '@teambit/harmony';\nimport { IsolatorMain } from '@teambit/isolator';\nimport { LoggerMain } from '@teambit/logger';\nimport type { ScopeMain } from '@teambit/scope';\nimport { UiMain } from '@teambit/ui';\nimport type { VariantsMain } from '@teambit/variants';\nimport { Consumer, loadConsumerIfExist } from '@teambit/legacy/dist/consumer';\nimport ConsumerComponent from '@teambit/legacy/dist/consumer/component';\nimport { registerDefaultScopeGetter } from '@teambit/legacy/dist/api/consumer';\nimport { BitId } from '@teambit/legacy-bit-id';\nimport ManyComponentsWriter from '@teambit/legacy/dist/consumer/component-ops/many-components-writer';\nimport LegacyComponentLoader from '@teambit/legacy/dist/consumer/component/component-loader';\nimport { ExtensionDataList } from '@teambit/legacy/dist/consumer/config/extension-data';\nimport { EXT_NAME } from './constants';\nimport EjectConfCmd from './eject-conf.cmd';\nimport InstallCmd from './install.cmd';\nimport { OnComponentLoad, OnComponentAdd, OnComponentChange, OnComponentRemove } from './on-component-events';\nimport { WorkspaceExtConfig } from './types';\nimport { WatchCommand } from './watch/watch.cmd';\nimport { LinkCommand } from './link';\nimport { Watcher } from './watch/watcher';\nimport { Workspace, WorkspaceInstallOptions } from './workspace';\nimport getWorkspaceSchema from './workspace.graphql';\nimport { WorkspaceUIRoot } from './workspace.ui-root';\nimport { Tag } from './tag-cmd';\nimport { CapsuleCmd, CapsuleCreateCmd, CapsuleListCmd } from './capsule.cmd';\n\nexport type WorkspaceDeps = [\n PubsubMain,\n CLIMain,\n ScopeMain,\n ComponentMain,\n IsolatorMain,\n DependencyResolverMain,\n VariantsMain,\n LoggerMain,\n GraphqlMain,\n UiMain,\n BundlerMain,\n AspectLoaderMain,\n EnvsMain\n];\n\nexport type OnComponentLoadSlot = SlotRegistry<OnComponentLoad>;\n\nexport type OnComponentChangeSlot = SlotRegistry<OnComponentChange>;\n\nexport type OnComponentAddSlot = SlotRegistry<OnComponentAdd>;\n\nexport type OnComponentRemoveSlot = SlotRegistry<OnComponentRemove>;\n\nexport default async function provideWorkspace(\n [\n pubsub,\n cli,\n scope,\n component,\n isolator,\n dependencyResolver,\n variants,\n loggerExt,\n graphql,\n ui,\n bundler,\n aspectLoader,\n envs,\n ]: WorkspaceDeps,\n config: WorkspaceExtConfig,\n [onComponentLoadSlot, onComponentChangeSlot, onComponentAddSlot, onComponentRemoveSlot]: [\n OnComponentLoadSlot,\n OnComponentChangeSlot,\n OnComponentAddSlot,\n OnComponentRemoveSlot\n ],\n harmony: Harmony\n) {\n const bitConfig: any = harmony.config.get('teambit.harmony/bit');\n const consumer = await getConsumer(bitConfig.cwd);\n if (!consumer) return undefined;\n // TODO: get the 'workspace' name in a better way\n const logger = loggerExt.createLogger(EXT_NAME);\n const workspace = new Workspace(\n pubsub,\n config,\n consumer,\n scope,\n component,\n isolator,\n dependencyResolver,\n variants,\n aspectLoader,\n logger,\n undefined,\n harmony,\n onComponentLoadSlot,\n onComponentChangeSlot,\n envs,\n onComponentAddSlot,\n onComponentRemoveSlot,\n graphql\n );\n\n const getWorkspacePolicyFromPackageJson = () => {\n const packageJson = workspace.consumer.packageJson?.packageJsonObject || {};\n const policyFromPackageJson = dependencyResolver.getWorkspacePolicyFromPackageJson(packageJson);\n return policyFromPackageJson;\n };\n\n dependencyResolver.registerRootPolicy(getWorkspacePolicyFromPackageJson());\n\n ManyComponentsWriter.registerExternalInstaller({\n install: async () => {\n // TODO: think how we should pass this options\n const installOpts: WorkspaceInstallOptions = {\n dedupe: true,\n updateExisting: false,\n import: false,\n };\n return workspace.install(undefined, installOpts);\n },\n });\n\n consumer.onCacheClear.push(() => workspace.clearCache());\n\n if (!workspace.isLegacy) {\n LegacyComponentLoader.registerOnComponentLoadSubscriber(async (legacyComponent: ConsumerComponent) => {\n const id = await workspace.resolveComponentId(legacyComponent.id);\n const newComponent = await workspace.get(id, false, legacyComponent);\n return newComponent.state._consumer;\n });\n }\n\n ConsumerComponent.registerOnComponentConfigLoading(EXT_NAME, async (id) => {\n const componentId = await workspace.resolveComponentId(id);\n // We call here directly workspace.scope.get instead of workspace.get because part of the workspace get is loading consumer component\n // which in turn run this event, which will make an infinite loop\n // This component from scope here are only used for merging the extensions with the workspace components\n const componentFromScope = await workspace.scope.get(componentId);\n const extensions = await workspace.componentExtensions(componentId, componentFromScope);\n const defaultScope = await workspace.componentDefaultScope(componentId);\n\n await workspace.loadExtensions(extensions);\n const extensionsWithLegacyIdsP = extensions.map(async (extension) => {\n const legacyEntry = extension.clone();\n if (legacyEntry.extensionId) {\n const compId = await workspace.resolveComponentId(legacyEntry.extensionId);\n legacyEntry.extensionId = compId._legacy;\n legacyEntry.newExtensionId = compId;\n }\n\n return legacyEntry;\n });\n const extensionsWithLegacyIds = await Promise.all(extensionsWithLegacyIdsP);\n\n return {\n defaultScope,\n extensions: ExtensionDataList.fromArray(extensionsWithLegacyIds),\n };\n });\n\n /**\n * Add default scope from harmony during export.\n */\n registerDefaultScopeGetter(async (id: BitId) => {\n const componentId = await workspace.resolveComponentId(id);\n const defaultScope = await workspace.componentDefaultScope(componentId);\n return defaultScope;\n });\n\n const workspaceSchema = getWorkspaceSchema(workspace, graphql);\n ui.registerUiRoot(new WorkspaceUIRoot(workspace, bundler));\n graphql.register(workspaceSchema);\n const capsuleCmd = new CapsuleCmd();\n capsuleCmd.commands = [new CapsuleListCmd(isolator, workspace), new CapsuleCreateCmd(workspace, isolator)];\n const commands: CommandList = [new InstallCmd(workspace, logger), new EjectConfCmd(workspace), capsuleCmd];\n const watcher = new Watcher(workspace, pubsub);\n if (workspace && !workspace.consumer.isLegacy) {\n cli.unregister('watch');\n commands.push(new WatchCommand(pubsub, logger, watcher));\n cli.unregister('link');\n commands.push(new LinkCommand(workspace, logger));\n }\n commands.push(new Tag());\n cli.register(...commands);\n component.registerHost(workspace);\n\n cli.registerOnStart(async () => {\n await workspace.loadAspects(aspectLoader.getNotLoadedConfiguredExtensions());\n });\n\n return workspace;\n}\n\n/**\n * don't use loadConsumer() here, which throws ConsumerNotFound because some commands don't require\n * the consumer to be available. such as, `bit init` or `bit list --remote`.\n * most of the commands do need the consumer. the legacy commands that need the consumer throw an\n * error when is missing. in the new/Harmony commands, such as `bis compile`, the workspace object\n * is passed to the provider, so before using it, make sure it exists.\n * keep in mind that you can't verify it in the provider itself, because the provider is running\n * always for all commands before anything else is happening.\n */\nasync function getConsumer(path?: string): Promise<Consumer | undefined> {\n return loadConsumerIfExist(path);\n}\n"]}
1
+ {"version":3,"sources":["workspace.provider.ts"],"names":["provideWorkspace","pubsub","cli","scope","component","isolator","dependencyResolver","variants","loggerExt","graphql","ui","bundler","aspectLoader","envs","config","onComponentLoadSlot","onComponentChangeSlot","onComponentAddSlot","onComponentRemoveSlot","onPreWatchSlot","harmony","bitConfig","get","consumer","getConsumer","cwd","undefined","logger","createLogger","EXT_NAME","workspace","Workspace","getWorkspacePolicyFromPackageJson","packageJson","packageJsonObject","policyFromPackageJson","registerRootPolicy","ManyComponentsWriter","registerExternalInstaller","install","installOpts","dedupe","updateExisting","import","onCacheClear","push","clearCache","isLegacy","LegacyComponentLoader","registerOnComponentLoadSubscriber","legacyComponent","id","resolveComponentId","newComponent","state","_consumer","ConsumerComponent","registerOnComponentConfigLoading","componentId","componentFromScope","extensions","componentExtensions","defaultScope","componentDefaultScope","loadExtensions","extensionsWithLegacyIdsP","map","extension","legacyEntry","clone","extensionId","compId","_legacy","newExtensionId","extensionsWithLegacyIds","Promise","all","ExtensionDataList","fromArray","workspaceSchema","registerUiRoot","WorkspaceUIRoot","register","capsuleCmd","CapsuleCmd","commands","CapsuleListCmd","CapsuleCreateCmd","InstallCmd","EjectConfCmd","watcher","Watcher","unregister","WatchCommand","LinkCommand","Tag","registerHost","registerOnStart","loadAspects","getNotLoadedConfiguredExtensions","path"],"mappings":"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","sourcesContent":["import { PubsubMain } from '@teambit/pubsub';\nimport type { AspectLoaderMain } from '@teambit/aspect-loader';\nimport { BundlerMain } from '@teambit/bundler';\nimport { CLIMain, CommandList } from '@teambit/cli';\nimport type { ComponentMain, Component } from '@teambit/component';\nimport { DependencyResolverMain } from '@teambit/dependency-resolver';\nimport { EnvsMain } from '@teambit/envs';\nimport { GraphqlMain } from '@teambit/graphql';\nimport { Harmony, SlotRegistry } from '@teambit/harmony';\nimport { IsolatorMain } from '@teambit/isolator';\nimport { LoggerMain } from '@teambit/logger';\nimport type { ScopeMain } from '@teambit/scope';\nimport { UiMain } from '@teambit/ui';\nimport type { VariantsMain } from '@teambit/variants';\nimport { Consumer, loadConsumerIfExist } from '@teambit/legacy/dist/consumer';\nimport ConsumerComponent from '@teambit/legacy/dist/consumer/component';\nimport { registerDefaultScopeGetter } from '@teambit/legacy/dist/api/consumer';\nimport { BitId } from '@teambit/legacy-bit-id';\nimport ManyComponentsWriter from '@teambit/legacy/dist/consumer/component-ops/many-components-writer';\nimport LegacyComponentLoader from '@teambit/legacy/dist/consumer/component/component-loader';\nimport { ExtensionDataList } from '@teambit/legacy/dist/consumer/config/extension-data';\nimport { EXT_NAME } from './constants';\nimport EjectConfCmd from './eject-conf.cmd';\nimport InstallCmd from './install.cmd';\nimport { OnComponentLoad, OnComponentAdd, OnComponentChange, OnComponentRemove } from './on-component-events';\nimport { WorkspaceExtConfig } from './types';\nimport { WatchCommand } from './watch/watch.cmd';\nimport { LinkCommand } from './link';\nimport { Watcher, WatchOptions } from './watch/watcher';\nimport { Workspace, WorkspaceInstallOptions } from './workspace';\nimport getWorkspaceSchema from './workspace.graphql';\nimport { WorkspaceUIRoot } from './workspace.ui-root';\nimport { Tag } from './tag-cmd';\nimport { CapsuleCmd, CapsuleCreateCmd, CapsuleListCmd } from './capsule.cmd';\n\nexport type WorkspaceDeps = [\n PubsubMain,\n CLIMain,\n ScopeMain,\n ComponentMain,\n IsolatorMain,\n DependencyResolverMain,\n VariantsMain,\n LoggerMain,\n GraphqlMain,\n UiMain,\n BundlerMain,\n AspectLoaderMain,\n EnvsMain\n];\n\nexport type OnComponentLoadSlot = SlotRegistry<OnComponentLoad>;\n\nexport type OnComponentChangeSlot = SlotRegistry<OnComponentChange>;\n\nexport type OnComponentAddSlot = SlotRegistry<OnComponentAdd>;\n\nexport type OnComponentRemoveSlot = SlotRegistry<OnComponentRemove>;\n\nexport type OnPreWatch = (components: Component[], watchOpts: WatchOptions) => Promise<void>;\nexport type OnPreWatchSlot = SlotRegistry<OnPreWatch>;\n\nexport default async function provideWorkspace(\n [\n pubsub,\n cli,\n scope,\n component,\n isolator,\n dependencyResolver,\n variants,\n loggerExt,\n graphql,\n ui,\n bundler,\n aspectLoader,\n envs,\n ]: WorkspaceDeps,\n config: WorkspaceExtConfig,\n [onComponentLoadSlot, onComponentChangeSlot, onComponentAddSlot, onComponentRemoveSlot, onPreWatchSlot]: [\n OnComponentLoadSlot,\n OnComponentChangeSlot,\n OnComponentAddSlot,\n OnComponentRemoveSlot,\n OnPreWatchSlot\n ],\n harmony: Harmony\n) {\n const bitConfig: any = harmony.config.get('teambit.harmony/bit');\n const consumer = await getConsumer(bitConfig.cwd);\n if (!consumer) return undefined;\n // TODO: get the 'workspace' name in a better way\n const logger = loggerExt.createLogger(EXT_NAME);\n const workspace = new Workspace(\n pubsub,\n config,\n consumer,\n scope,\n component,\n isolator,\n dependencyResolver,\n variants,\n aspectLoader,\n logger,\n undefined,\n harmony,\n onComponentLoadSlot,\n onComponentChangeSlot,\n envs,\n onComponentAddSlot,\n onComponentRemoveSlot,\n onPreWatchSlot,\n graphql\n );\n\n const getWorkspacePolicyFromPackageJson = () => {\n const packageJson = workspace.consumer.packageJson?.packageJsonObject || {};\n const policyFromPackageJson = dependencyResolver.getWorkspacePolicyFromPackageJson(packageJson);\n return policyFromPackageJson;\n };\n\n dependencyResolver.registerRootPolicy(getWorkspacePolicyFromPackageJson());\n\n ManyComponentsWriter.registerExternalInstaller({\n install: async () => {\n // TODO: think how we should pass this options\n const installOpts: WorkspaceInstallOptions = {\n dedupe: true,\n updateExisting: false,\n import: false,\n };\n return workspace.install(undefined, installOpts);\n },\n });\n\n consumer.onCacheClear.push(() => workspace.clearCache());\n\n if (!workspace.isLegacy) {\n LegacyComponentLoader.registerOnComponentLoadSubscriber(async (legacyComponent: ConsumerComponent) => {\n const id = await workspace.resolveComponentId(legacyComponent.id);\n const newComponent = await workspace.get(id, false, legacyComponent);\n return newComponent.state._consumer;\n });\n }\n\n ConsumerComponent.registerOnComponentConfigLoading(EXT_NAME, async (id) => {\n const componentId = await workspace.resolveComponentId(id);\n // We call here directly workspace.scope.get instead of workspace.get because part of the workspace get is loading consumer component\n // which in turn run this event, which will make an infinite loop\n // This component from scope here are only used for merging the extensions with the workspace components\n const componentFromScope = await workspace.scope.get(componentId);\n const extensions = await workspace.componentExtensions(componentId, componentFromScope);\n const defaultScope = await workspace.componentDefaultScope(componentId);\n\n await workspace.loadExtensions(extensions);\n const extensionsWithLegacyIdsP = extensions.map(async (extension) => {\n const legacyEntry = extension.clone();\n if (legacyEntry.extensionId) {\n const compId = await workspace.resolveComponentId(legacyEntry.extensionId);\n legacyEntry.extensionId = compId._legacy;\n legacyEntry.newExtensionId = compId;\n }\n\n return legacyEntry;\n });\n const extensionsWithLegacyIds = await Promise.all(extensionsWithLegacyIdsP);\n\n return {\n defaultScope,\n extensions: ExtensionDataList.fromArray(extensionsWithLegacyIds),\n };\n });\n\n /**\n * Add default scope from harmony during export.\n */\n registerDefaultScopeGetter(async (id: BitId) => {\n const componentId = await workspace.resolveComponentId(id);\n const defaultScope = await workspace.componentDefaultScope(componentId);\n return defaultScope;\n });\n\n const workspaceSchema = getWorkspaceSchema(workspace, graphql);\n ui.registerUiRoot(new WorkspaceUIRoot(workspace, bundler));\n graphql.register(workspaceSchema);\n const capsuleCmd = new CapsuleCmd();\n capsuleCmd.commands = [new CapsuleListCmd(isolator, workspace), new CapsuleCreateCmd(workspace, isolator)];\n const commands: CommandList = [new InstallCmd(workspace, logger), new EjectConfCmd(workspace), capsuleCmd];\n const watcher = new Watcher(workspace, pubsub);\n if (workspace && !workspace.consumer.isLegacy) {\n cli.unregister('watch');\n commands.push(new WatchCommand(pubsub, logger, watcher));\n cli.unregister('link');\n commands.push(new LinkCommand(workspace, logger));\n }\n commands.push(new Tag());\n cli.register(...commands);\n component.registerHost(workspace);\n\n cli.registerOnStart(async () => {\n await workspace.loadAspects(aspectLoader.getNotLoadedConfiguredExtensions());\n });\n\n return workspace;\n}\n\n/**\n * don't use loadConsumer() here, which throws ConsumerNotFound because some commands don't require\n * the consumer to be available. such as, `bit init` or `bit list --remote`.\n * most of the commands do need the consumer. the legacy commands that need the consumer throw an\n * error when is missing. in the new/Harmony commands, such as `bis compile`, the workspace object\n * is passed to the provider, so before using it, make sure it exists.\n * keep in mind that you can't verify it in the provider itself, because the provider is running\n * always for all commands before anything else is happening.\n */\nasync function getConsumer(path?: string): Promise<Consumer | undefined> {\n return loadConsumerIfExist(path);\n}\n"]}
package/index.ts CHANGED
@@ -5,7 +5,7 @@ export type { default as Workspace } from './workspace';
5
5
  export type { ResolvedComponent } from '@teambit/harmony.modules.resolved-component';
6
6
  export type { AlreadyExistsError as ComponentConfigFileAlreadyExistsError } from './component-config-file';
7
7
  export type { WorkspaceMain } from './workspace.main.runtime';
8
-
8
+ export type { WatchOptions } from './watch/watcher';
9
9
  export * from './events';
10
10
  export type { WorkspaceUI } from './workspace.ui.runtime';
11
11
  export type { SerializableResults, OnComponentEventResult } from './on-component-events';
@@ -4,9 +4,10 @@ import { CompilationInitiator } from '@teambit/compiler';
4
4
  export type SerializableResults = { results: any; toString: () => string };
5
5
  export type OnComponentChange = (
6
6
  component: Component,
7
+ files: string[],
7
8
  initiator?: CompilationInitiator
8
9
  ) => Promise<SerializableResults>;
9
- export type OnComponentAdd = (component: Component) => Promise<SerializableResults>;
10
+ export type OnComponentAdd = (component: Component, files: string[]) => Promise<SerializableResults>;
10
11
  export type OnComponentRemove = (componentId: ComponentID) => Promise<SerializableResults>;
11
12
  export type OnComponentEventResult = { extensionId: string; results: SerializableResults };
12
13
 
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@teambit/workspace",
3
- "version": "0.0.526",
3
+ "version": "0.0.530",
4
4
  "homepage": "https://bit.dev/teambit/workspace/workspace",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.workspace",
8
8
  "name": "workspace",
9
- "version": "0.0.526"
9
+ "version": "0.0.530"
10
10
  },
11
11
  "dependencies": {
12
12
  "chalk": "2.4.2",
@@ -33,53 +33,53 @@
33
33
  "@teambit/base-ui.surfaces.split-pane.hover-splitter": "1.0.0",
34
34
  "@teambit/base-ui.surfaces.split-pane.split-pane": "1.0.0",
35
35
  "@teambit/cli": "0.0.380",
36
- "@teambit/isolator": "0.0.526",
36
+ "@teambit/isolator": "0.0.530",
37
37
  "@teambit/component-tree": "0.0.366",
38
- "@teambit/component.ui.component-status-resolver": "0.0.451",
39
- "@teambit/harmony.modules.resolved-component": "0.0.445",
40
- "@teambit/dependency-resolver": "0.0.526",
41
- "@teambit/logger": "0.0.452",
42
- "@teambit/compiler": "0.0.526",
43
- "@teambit/component": "0.0.526",
44
- "@teambit/graphql": "0.0.526",
45
- "@teambit/aspect-loader": "0.0.526",
46
- "@teambit/bundler": "0.0.526",
47
- "@teambit/envs": "0.0.526",
48
- "@teambit/pubsub": "0.0.526",
49
- "@teambit/scope": "0.0.526",
50
- "@teambit/ui": "0.0.526",
51
- "@teambit/variants": "0.0.454",
38
+ "@teambit/component.ui.component-status-resolver": "0.0.453",
39
+ "@teambit/harmony.modules.resolved-component": "0.0.447",
40
+ "@teambit/dependency-resolver": "0.0.530",
41
+ "@teambit/logger": "0.0.454",
42
+ "@teambit/compiler": "0.0.530",
43
+ "@teambit/component": "0.0.530",
44
+ "@teambit/graphql": "0.0.530",
45
+ "@teambit/aspect-loader": "0.0.530",
46
+ "@teambit/bundler": "0.0.530",
47
+ "@teambit/envs": "0.0.530",
48
+ "@teambit/pubsub": "0.0.530",
49
+ "@teambit/scope": "0.0.530",
50
+ "@teambit/ui": "0.0.530",
51
+ "@teambit/variants": "0.0.456",
52
52
  "@teambit/legacy-bit-id": "0.0.369",
53
53
  "@teambit/bit-error": "0.0.366",
54
54
  "@teambit/component-issues": "0.0.15",
55
55
  "@teambit/config": "0.0.391",
56
- "@teambit/harmony.modules.requireable-component": "0.0.445",
57
- "@teambit/workspace.modules.match-pattern": "0.0.447",
58
- "@teambit/command-bar": "0.0.526",
56
+ "@teambit/harmony.modules.requireable-component": "0.0.447",
57
+ "@teambit/workspace.modules.match-pattern": "0.0.449",
58
+ "@teambit/command-bar": "0.0.530",
59
59
  "@teambit/design.ui.surfaces.menu.link-item": "0.0.374",
60
- "@teambit/graph": "0.0.526",
61
- "@teambit/react-router": "0.0.526",
62
- "@teambit/sidebar": "0.0.526",
63
- "@teambit/ui-foundation.ui.main-dropdown": "0.0.447",
64
- "@teambit/ui-foundation.ui.menu": "0.0.447",
65
- "@teambit/ui-foundation.ui.react-router.slot-router": "0.0.449",
66
- "@teambit/toolbox.time.time-format": "0.0.444",
60
+ "@teambit/graph": "0.0.530",
61
+ "@teambit/react-router": "0.0.530",
62
+ "@teambit/sidebar": "0.0.530",
63
+ "@teambit/ui-foundation.ui.main-dropdown": "0.0.449",
64
+ "@teambit/ui-foundation.ui.menu": "0.0.449",
65
+ "@teambit/ui-foundation.ui.react-router.slot-router": "0.0.451",
66
+ "@teambit/toolbox.time.time-format": "0.0.446",
67
67
  "@teambit/design.ui.styles.ellipsis": "0.0.346",
68
68
  "@teambit/design.ui.styles.muted-italic": "0.0.35",
69
- "@teambit/ui-foundation.ui.full-loader": "0.0.447",
70
- "@teambit/ui-foundation.ui.side-bar": "0.0.451",
71
- "@teambit/ui-foundation.ui.tree.drawer": "0.0.447",
69
+ "@teambit/ui-foundation.ui.full-loader": "0.0.449",
70
+ "@teambit/ui-foundation.ui.side-bar": "0.0.453",
71
+ "@teambit/ui-foundation.ui.tree.drawer": "0.0.449",
72
72
  "@teambit/component-id": "0.0.370",
73
- "@teambit/ui-foundation.ui.hooks.use-data-query": "0.0.448",
74
- "@teambit/deprecation": "0.0.526",
75
- "@teambit/ui-foundation.ui.constants.z-indexes": "0.0.447",
76
- "@teambit/ui-foundation.ui.buttons.collapser": "0.0.152",
77
- "@teambit/ui-foundation.ui.corner": "0.0.454",
78
- "@teambit/ui-foundation.ui.notifications.notification-context": "0.0.448",
79
- "@teambit/ui-foundation.ui.top-bar": "0.0.449",
80
- "@teambit/explorer.ui.gallery.component-grid": "0.0.447",
81
- "@teambit/workspace.ui.empty-workspace": "0.0.449",
82
- "@teambit/workspace.ui.workspace-component-card": "0.0.450"
73
+ "@teambit/ui-foundation.ui.hooks.use-data-query": "0.0.450",
74
+ "@teambit/deprecation": "0.0.530",
75
+ "@teambit/ui-foundation.ui.constants.z-indexes": "0.0.449",
76
+ "@teambit/ui-foundation.ui.buttons.collapser": "0.0.154",
77
+ "@teambit/ui-foundation.ui.corner": "0.0.456",
78
+ "@teambit/ui-foundation.ui.notifications.notification-context": "0.0.450",
79
+ "@teambit/ui-foundation.ui.top-bar": "0.0.451",
80
+ "@teambit/explorer.ui.gallery.component-grid": "0.0.449",
81
+ "@teambit/workspace.ui.empty-workspace": "0.0.451",
82
+ "@teambit/workspace.ui.workspace-component-card": "0.0.452"
83
83
  },
84
84
  "devDependencies": {
85
85
  "@types/react": "^17.0.8",
@@ -24,9 +24,16 @@ export const formatWatchPathsSortByComponent = (trackDirs) => {
24
24
  );
25
25
  };
26
26
 
27
+ /**
28
+ * todo: this was implemented incorrectly.
29
+ * the original idea of `SerializableResults` was to have each one of the aspects registered to the slot, the
30
+ * ability to have their own formatting to their results, and then `toString()` method to print them.
31
+ * Here, the printing is specifically to the Compiler aspect. It should move to where it belongs.
32
+ */
27
33
  export function formatCompileResults(compileResults: OnComponentEventResult[], verbose: boolean) {
28
- if (!compileResults.length) return '';
34
+ if (!compileResults.length || !Array.isArray(compileResults)) return '';
29
35
  return compileResults
36
+ .filter((compileResult) => compileResult.results?.results && Array.isArray(compileResult.results?.results))
30
37
  .map((compileResult) => ({
31
38
  extensionId: compileResult.extensionId,
32
39
  resultsForExtension: compileResult.results?.results?.map((resultForExtension) => ({
@@ -8,7 +8,7 @@ import type { BitBaseEvent, PubsubMain } from '@teambit/pubsub';
8
8
  // import IDs and events
9
9
  import { CompilerAspect, CompilerErrorEvent } from '@teambit/compiler';
10
10
 
11
- import { Watcher } from './watcher';
11
+ import { Watcher, WatchOptions } from './watcher';
12
12
  import { formatCompileResults, formatWatchPathsSortByComponent } from './output-formatter';
13
13
  import { OnComponentEventResult } from '../on-component-events';
14
14
 
@@ -17,6 +17,8 @@ export class WatchCommand implements Command {
17
17
  onAll: (event, path) => this.logger.console(`Event: "${event}". Path: ${path}`),
18
18
  onStart: () => {},
19
19
  onReady: (workspace, watchPathsSortByComponent, verbose) => {
20
+ // eslint-disable-next-line no-console
21
+ console.clear();
20
22
  if (verbose) {
21
23
  this.logger.console(formatWatchPathsSortByComponent(watchPathsSortByComponent));
22
24
  }
@@ -27,6 +29,8 @@ export class WatchCommand implements Command {
27
29
  );
28
30
  },
29
31
  onChange: (filePath: string, buildResults: OnComponentEventResult[], verbose: boolean, duration) => {
32
+ // eslint-disable-next-line no-console
33
+ console.clear();
30
34
  if (!buildResults.length) {
31
35
  this.logger.console(`The file ${filePath} has been changed, but nothing to compile.\n\n`);
32
36
  return;
@@ -37,6 +41,8 @@ export class WatchCommand implements Command {
37
41
  this.logger.console(chalk.yellow(`Watching for component changes (${moment().format('HH:mm:ss')})...`));
38
42
  },
39
43
  onAdd: (filePath: string, buildResults: OnComponentEventResult[], verbose: boolean, duration) => {
44
+ // eslint-disable-next-line no-console
45
+ console.clear();
40
46
  this.logger.console(`The file ${filePath} has been added.\n\n`);
41
47
  this.logger.console(formatCompileResults(buildResults, verbose));
42
48
  this.logger.console(`Finished. (${duration}ms)`);
@@ -55,7 +61,11 @@ export class WatchCommand implements Command {
55
61
  alias = '';
56
62
  group = 'development';
57
63
  shortDescription = '';
58
- options = [['v', 'verbose', 'showing npm verbose output for inspection and prints stack trace']] as CommandOptions;
64
+ options = [
65
+ ['v', 'verbose', 'showing npm verbose output for inspection and prints stack trace'],
66
+ ['', 'skip-pre-compilation', 'skip the compilation step before starting to watch'],
67
+ ['t', 'check-types', 'EXPERIMENTAL. for typescript files, load an tsserver instance to check types'],
68
+ ] as CommandOptions;
59
69
 
60
70
  constructor(
61
71
  /**
@@ -89,8 +99,8 @@ export class WatchCommand implements Command {
89
99
  }
90
100
  };
91
101
 
92
- async report(cliArgs: [], { verbose = false }: { verbose?: boolean }) {
93
- await this.watcher.watch({ msgs: this.msgs, verbose });
102
+ async report(cliArgs: [], watchOpts: WatchOptions) {
103
+ await this.watcher.watch({ msgs: this.msgs, ...watchOpts });
94
104
  return 'watcher terminated';
95
105
  }
96
106
  }
package/watch/watcher.ts CHANGED
@@ -22,6 +22,8 @@ import { OnComponentEventResult } from '../on-component-events';
22
22
 
23
23
  export type WatcherProcessData = { watchProcess: ChildProcess; compilerId: BitId; componentIds: BitId[] };
24
24
 
25
+ export type WatchOptions = { verbose?: boolean; checkTypes?: boolean; skipPreCompilation?: boolean };
26
+
25
27
  export class Watcher {
26
28
  private fsWatcher: FSWatcher;
27
29
  constructor(
@@ -32,51 +34,54 @@ export class Watcher {
32
34
  private multipleWatchers: WatcherProcessData[] = []
33
35
  ) {}
34
36
 
35
- async watch(opts: { msgs; verbose?: boolean }) {
37
+ async watch(opts: { msgs } & WatchOptions) {
36
38
  this.verbose = Boolean(opts.verbose);
37
- await this.watchAll({ msgs: opts.msgs, verbose: this.verbose });
39
+ await this.watchAll(opts);
38
40
  }
39
41
 
40
42
  get consumer(): Consumer {
41
43
  return this.workspace.consumer;
42
44
  }
43
45
 
44
- async watchAll(opts?: { msgs; verbose?: boolean; initiator?: CompilationInitiator }) {
46
+ async watchAll(opts: { msgs; initiator?: CompilationInitiator } & WatchOptions) {
47
+ const { msgs, ...watchOpts } = opts;
45
48
  // TODO: run build in the beginning of process (it's work like this in other envs)
46
- const _verbose = opts?.verbose || false;
47
- await this.createWatcher();
49
+ const pathsToWatch = await this.getPathsToWatch();
50
+ const componentIds = Object.values(this.trackDirs);
51
+ await this.workspace.triggerOnPreWatch(componentIds, watchOpts);
52
+ await this.createWatcher(pathsToWatch);
48
53
  const watcher = this.fsWatcher;
49
- opts?.msgs?.onStart(this.workspace);
54
+ msgs?.onStart(this.workspace);
50
55
 
51
56
  return new Promise((resolve, reject) => {
52
57
  // prefix your command with "BIT_LOG=*" to see all watch events
53
58
  if (process.env.BIT_LOG) {
54
- if (opts?.msgs?.onAll) watcher.on('all', opts?.msgs?.onAll);
59
+ if (msgs?.onAll) watcher.on('all', msgs?.onAll);
55
60
  }
56
61
  watcher.on('ready', () => {
57
- opts?.msgs?.onReady(this.workspace, this.trackDirs, _verbose);
62
+ msgs?.onReady(this.workspace, this.trackDirs, this.verbose);
58
63
  });
59
64
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
60
65
  watcher.on('change', async (filePath) => {
61
66
  const startTime = new Date().getTime();
62
67
  const buildResults = (await this.handleChange(filePath, opts?.initiator)) || [];
63
68
  const duration = new Date().getTime() - startTime;
64
- opts?.msgs?.onChange(filePath, buildResults, _verbose, duration);
69
+ msgs?.onChange(filePath, buildResults, this.verbose, duration);
65
70
  });
66
71
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
67
72
  watcher.on('add', async (filePath) => {
68
73
  const startTime = new Date().getTime();
69
74
  const buildResults = (await this.handleChange(filePath)) || [];
70
75
  const duration = new Date().getTime() - startTime;
71
- opts?.msgs?.onAdd(filePath, buildResults, _verbose, duration);
76
+ msgs?.onAdd(filePath, buildResults, this.verbose, duration);
72
77
  });
73
78
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
74
79
  watcher.on('unlink', async (p) => {
75
- opts?.msgs?.onUnlink(p);
80
+ msgs?.onUnlink(p);
76
81
  await this.handleChange(p);
77
82
  });
78
83
  watcher.on('error', (err) => {
79
- opts?.msgs?.onError(err);
84
+ msgs?.onError(err);
80
85
  reject(err);
81
86
  });
82
87
  });
@@ -95,7 +100,7 @@ export class Watcher {
95
100
  return this.completeWatch();
96
101
  }
97
102
 
98
- const buildResults = await this.executeWatchOperationsOnComponent(componentId, true, initiator);
103
+ const buildResults = await this.executeWatchOperationsOnComponent(componentId, [filePath], true, initiator);
99
104
  this.completeWatch();
100
105
  return buildResults;
101
106
  } catch (err: any) {
@@ -118,8 +123,8 @@ export class Watcher {
118
123
  const results: OnComponentEventResult[] = [];
119
124
  if (newDirs.length) {
120
125
  this.fsWatcher.add(newDirs);
121
- const addResults = await mapSeries(newDirs, (dir) =>
122
- this.executeWatchOperationsOnComponent(this.trackDirs[dir], false)
126
+ const addResults = await mapSeries(newDirs, async (dir) =>
127
+ this.executeWatchOperationsOnComponent(this.trackDirs[dir], [], false)
123
128
  );
124
129
  results.push(...addResults.flat());
125
130
  }
@@ -138,6 +143,7 @@ export class Watcher {
138
143
 
139
144
  private async executeWatchOperationsOnComponent(
140
145
  componentId: ComponentID,
146
+ files: string[],
141
147
  isChange = true,
142
148
  initiator?: CompilationInitiator
143
149
  ): Promise<OnComponentEventResult[]> {
@@ -159,11 +165,13 @@ export class Watcher {
159
165
  let buildResults: OnComponentEventResult[];
160
166
  try {
161
167
  buildResults = isChange
162
- ? await this.workspace.triggerOnComponentChange(componentId, initiator)
168
+ ? await this.workspace.triggerOnComponentChange(componentId, files, initiator)
163
169
  : await this.workspace.triggerOnComponentAdd(componentId);
164
170
  } catch (err: any) {
165
- // do not exist the watch process on errors, just print them
166
- logger.console(err.message || err);
171
+ // do not exit the watch process on errors, just print them
172
+ const msg = `found an issue during onComponentChange or onComponentAdd hooks`;
173
+ logger.error(msg, err);
174
+ logger.console(`\n${msg}: ${err.message || err}`);
167
175
  return [];
168
176
  }
169
177
  if (buildResults && buildResults.length) {
@@ -231,8 +239,7 @@ export class Watcher {
231
239
  return this.findTrackDirByFilePathRecursively(parentDir);
232
240
  }
233
241
 
234
- private async createWatcher() {
235
- const pathsToWatch = await this.getPathsToWatch();
242
+ private async createWatcher(pathsToWatch: string[]) {
236
243
  this.fsWatcher = chokidar.watch(pathsToWatch, {
237
244
  ignoreInitial: true,
238
245
  // Using the function way since the regular way not working as expected
@@ -16,7 +16,7 @@ import { VariantsAspect } from '@teambit/variants';
16
16
  import { EXT_NAME } from './constants';
17
17
  import { OnComponentAdd, OnComponentChange, OnComponentRemove, OnComponentLoad } from './on-component-events';
18
18
  import { WorkspaceAspect } from './workspace.aspect';
19
- import workspaceProvider from './workspace.provider';
19
+ import workspaceProvider, { OnPreWatch } from './workspace.provider';
20
20
 
21
21
  export const WorkspaceMain = {
22
22
  name: EXT_NAME,
@@ -41,6 +41,7 @@ export const WorkspaceMain = {
41
41
  Slot.withType<OnComponentChange>(),
42
42
  Slot.withType<OnComponentAdd>(),
43
43
  Slot.withType<OnComponentRemove>(),
44
+ Slot.withType<OnPreWatch>(),
44
45
  ],
45
46
  provider: workspaceProvider,
46
47
  defineRuntime: 'browser',
@@ -2,7 +2,7 @@ import { PubsubMain } from '@teambit/pubsub';
2
2
  import type { AspectLoaderMain } from '@teambit/aspect-loader';
3
3
  import { BundlerMain } from '@teambit/bundler';
4
4
  import { CLIMain, CommandList } from '@teambit/cli';
5
- import { ComponentMain } from '@teambit/component';
5
+ import type { ComponentMain, Component } from '@teambit/component';
6
6
  import { DependencyResolverMain } from '@teambit/dependency-resolver';
7
7
  import { EnvsMain } from '@teambit/envs';
8
8
  import { GraphqlMain } from '@teambit/graphql';
@@ -26,7 +26,7 @@ import { OnComponentLoad, OnComponentAdd, OnComponentChange, OnComponentRemove }
26
26
  import { WorkspaceExtConfig } from './types';
27
27
  import { WatchCommand } from './watch/watch.cmd';
28
28
  import { LinkCommand } from './link';
29
- import { Watcher } from './watch/watcher';
29
+ import { Watcher, WatchOptions } from './watch/watcher';
30
30
  import { Workspace, WorkspaceInstallOptions } from './workspace';
31
31
  import getWorkspaceSchema from './workspace.graphql';
32
32
  import { WorkspaceUIRoot } from './workspace.ui-root';
@@ -57,6 +57,9 @@ export type OnComponentAddSlot = SlotRegistry<OnComponentAdd>;
57
57
 
58
58
  export type OnComponentRemoveSlot = SlotRegistry<OnComponentRemove>;
59
59
 
60
+ export type OnPreWatch = (components: Component[], watchOpts: WatchOptions) => Promise<void>;
61
+ export type OnPreWatchSlot = SlotRegistry<OnPreWatch>;
62
+
60
63
  export default async function provideWorkspace(
61
64
  [
62
65
  pubsub,
@@ -74,11 +77,12 @@ export default async function provideWorkspace(
74
77
  envs,
75
78
  ]: WorkspaceDeps,
76
79
  config: WorkspaceExtConfig,
77
- [onComponentLoadSlot, onComponentChangeSlot, onComponentAddSlot, onComponentRemoveSlot]: [
80
+ [onComponentLoadSlot, onComponentChangeSlot, onComponentAddSlot, onComponentRemoveSlot, onPreWatchSlot]: [
78
81
  OnComponentLoadSlot,
79
82
  OnComponentChangeSlot,
80
83
  OnComponentAddSlot,
81
- OnComponentRemoveSlot
84
+ OnComponentRemoveSlot,
85
+ OnPreWatchSlot
82
86
  ],
83
87
  harmony: Harmony
84
88
  ) {
@@ -105,6 +109,7 @@ export default async function provideWorkspace(
105
109
  envs,
106
110
  onComponentAddSlot,
107
111
  onComponentRemoveSlot,
112
+ onPreWatchSlot,
108
113
  graphql
109
114
  );
110
115
 
package/workspace.ts CHANGED
@@ -77,13 +77,15 @@ import {
77
77
  SerializableResults,
78
78
  } from './on-component-events';
79
79
  import { WorkspaceExtConfig } from './types';
80
- import { Watcher } from './watch/watcher';
80
+ import { Watcher, WatchOptions } from './watch/watcher';
81
81
  import { ComponentStatus } from './workspace-component/component-status';
82
82
  import {
83
83
  OnComponentAddSlot,
84
84
  OnComponentChangeSlot,
85
85
  OnComponentLoadSlot,
86
86
  OnComponentRemoveSlot,
87
+ OnPreWatch,
88
+ OnPreWatchSlot,
87
89
  } from './workspace.provider';
88
90
  import { WorkspaceComponentLoader } from './workspace-component/workspace-component-loader';
89
91
  import { IncorrectEnvAspect } from './exceptions/incorrect-env-aspect';
@@ -190,6 +192,8 @@ export class Workspace implements ComponentFactory {
190
192
 
191
193
  private onComponentRemoveSlot: OnComponentRemoveSlot,
192
194
 
195
+ private onPreWatchSlot: OnPreWatchSlot,
196
+
193
197
  private graphql: GraphqlMain
194
198
  ) {
195
199
  // TODO: refactor - prefer to avoid code inside the constructor.
@@ -246,6 +250,11 @@ export class Workspace implements ComponentFactory {
246
250
  return this;
247
251
  }
248
252
 
253
+ registerOnPreWatch(onPreWatchFunc: OnPreWatch) {
254
+ this.onPreWatchSlot.register(onPreWatchFunc);
255
+ return this;
256
+ }
257
+
249
258
  /**
250
259
  * name of the workspace as configured in either `workspace.json`.
251
260
  * defaults to workspace root directory name.
@@ -468,7 +477,11 @@ export class Workspace implements ComponentFactory {
468
477
  this.componentList = new ComponentsList(this.consumer);
469
478
  }
470
479
 
471
- async triggerOnComponentChange(id: ComponentID, initiator?: CompilationInitiator): Promise<OnComponentEventResult[]> {
480
+ async triggerOnComponentChange(
481
+ id: ComponentID,
482
+ files: string[],
483
+ initiator?: CompilationInitiator
484
+ ): Promise<OnComponentEventResult[]> {
472
485
  const component = await this.get(id);
473
486
  // if a new file was added, upon component-load, its .bitmap entry is updated to include the
474
487
  // new file. write these changes to the .bitmap file so then other processes have access to
@@ -477,7 +490,7 @@ export class Workspace implements ComponentFactory {
477
490
  const onChangeEntries = this.onComponentChangeSlot.toArray(); // e.g. [ [ 'teambit.bit/compiler', [Function: bound onComponentChange] ] ]
478
491
  const results: Array<{ extensionId: string; results: SerializableResults }> = [];
479
492
  await mapSeries(onChangeEntries, async ([extension, onChangeFunc]) => {
480
- const onChangeResult = await onChangeFunc(component, initiator);
493
+ const onChangeResult = await onChangeFunc(component, files, initiator);
481
494
  results.push({ extensionId: extension, results: onChangeResult });
482
495
  });
483
496
 
@@ -490,8 +503,9 @@ export class Workspace implements ComponentFactory {
490
503
  const component = await this.get(id);
491
504
  const onAddEntries = this.onComponentAddSlot.toArray(); // e.g. [ [ 'teambit.bit/compiler', [Function: bound onComponentChange] ] ]
492
505
  const results: Array<{ extensionId: string; results: SerializableResults }> = [];
506
+ const files = component.state.filesystem.files.map((file) => file.path);
493
507
  await mapSeries(onAddEntries, async ([extension, onAddFunc]) => {
494
- const onAddResult = await onAddFunc(component);
508
+ const onAddResult = await onAddFunc(component, files);
495
509
  results.push({ extensionId: extension, results: onAddResult });
496
510
  });
497
511
 
@@ -664,6 +678,18 @@ export class Workspace implements ComponentFactory {
664
678
  return this.componentDirFromLegacyId(componentId._legacy, bitMapOptions, options);
665
679
  }
666
680
 
681
+ /**
682
+ * component's files in the workspace are symlinked to the node_modules, and a package.json file is generated on that
683
+ * package directory to simulate a valid node package.
684
+ * @returns the package directory inside the node_module.
685
+ * by default the absolute path, unless `options.relative` was set
686
+ */
687
+ componentPackageDir(component: Component, options = { relative: false }): string {
688
+ const packageName = componentIdToPackageName(component.state._consumer);
689
+ const packageDir = path.join('node_modules', packageName);
690
+ return options.relative ? packageDir : this.consumer.toAbsolutePath(packageDir);
691
+ }
692
+
667
693
  private componentDirFromLegacyId(
668
694
  bitId: BitId,
669
695
  bitMapOptions?: GetBitMapComponentOptions,
@@ -803,6 +829,14 @@ export class Workspace implements ComponentFactory {
803
829
  return mergedExtensions;
804
830
  }
805
831
 
832
+ async triggerOnPreWatch(componentIds: ComponentID[], watchOpts: WatchOptions) {
833
+ const components = await this.getMany(componentIds);
834
+ const preWatchFunctions = this.onPreWatchSlot.values();
835
+ await mapSeries(preWatchFunctions, async (func) => {
836
+ await func(components, watchOpts);
837
+ });
838
+ }
839
+
806
840
  /**
807
841
  * This will mutate the entries with extensionId prop to have resolved legacy id
808
842
  * This should be worked on the extension data list not the new aspect list