@teambit/envs 1.0.494 → 1.0.495

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.
@@ -0,0 +1,5 @@
1
+ import { DependencyDetector, FileContext } from '@teambit/dependency-resolver';
2
+ export declare class EnvJsoncDetector implements DependencyDetector {
3
+ isSupported(context: FileContext): boolean;
4
+ detect(source: string): string[];
5
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.EnvJsoncDetector = void 0;
7
+ function _commentJson() {
8
+ const data = require("comment-json");
9
+ _commentJson = function () {
10
+ return data;
11
+ };
12
+ return data;
13
+ }
14
+ class EnvJsoncDetector {
15
+ isSupported(context) {
16
+ return context.filename.endsWith('env.jsonc');
17
+ }
18
+ detect(source) {
19
+ const parsed = (0, _commentJson().parse)(source);
20
+ if (!parsed.extends) return [];
21
+ return [parsed.extends];
22
+ }
23
+ }
24
+ exports.EnvJsoncDetector = EnvJsoncDetector;
25
+
26
+ //# sourceMappingURL=env-jsonc.detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_commentJson","data","require","EnvJsoncDetector","isSupported","context","filename","endsWith","detect","source","parsed","parse","extends","exports"],"sources":["env-jsonc.detector.ts"],"sourcesContent":["import { parse } from 'comment-json';\nimport { DependencyDetector, FileContext } from '@teambit/dependency-resolver';\n\nexport class EnvJsoncDetector implements DependencyDetector {\n isSupported(context: FileContext): boolean {\n return context.filename.endsWith('env.jsonc');\n }\n\n detect(source: string): string[] {\n const parsed = parse(source);\n if (!parsed.extends) return [];\n return [parsed.extends];\n }\n}\n"],"mappings":";;;;;;AAAA,SAAAA,aAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,YAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAGO,MAAME,gBAAgB,CAA+B;EAC1DC,WAAWA,CAACC,OAAoB,EAAW;IACzC,OAAOA,OAAO,CAACC,QAAQ,CAACC,QAAQ,CAAC,WAAW,CAAC;EAC/C;EAEAC,MAAMA,CAACC,MAAc,EAAY;IAC/B,MAAMC,MAAM,GAAG,IAAAC,oBAAK,EAACF,MAAM,CAAC;IAC5B,IAAI,CAACC,MAAM,CAACE,OAAO,EAAE,OAAO,EAAE;IAC9B,OAAO,CAACF,MAAM,CAACE,OAAO,CAAC;EACzB;AACF;AAACC,OAAA,CAAAV,gBAAA,GAAAA,gBAAA","ignoreList":[]}
@@ -1,3 +1,4 @@
1
+ import { Dependency as LegacyDependency } from '@teambit/legacy.consumer-component';
1
2
  import { SourceFile } from '@teambit/component.sources';
2
3
  import { CLIMain } from '@teambit/cli';
3
4
  import { Component, ComponentMain } from '@teambit/component';
@@ -16,14 +17,21 @@ import { Runtime } from './runtime';
16
17
  import { EnvDefinition } from './env-definition';
17
18
  import { EnvServiceList } from './env-service-list';
18
19
  import { EnvPlugin } from './env.plugin';
20
+ import { EnvJsoncDetector } from './env-jsonc.detector';
19
21
  export type EnvJsonc = {
20
22
  extends?: string;
21
23
  policy?: EnvPolicyConfigObject;
22
24
  patterns?: EnvJsoncPatterns;
23
25
  };
26
+ /**
27
+ * The resolved env jsonc is the env jsonc after it was resolved from all the parent envs
28
+ */
29
+ export type ResolvedEnvJsonc = Omit<EnvJsonc, 'extends'>;
24
30
  export type EnvJsoncMergeCustomizer = (parentObj: EnvJsonc, childObj: EnvJsonc) => Partial<EnvJsonc>;
31
+ export type EnvJsoncResolver = (parentId: string, envExtendsDeps?: LegacyDependency[]) => Promise<ResolvedEnvJsonc>;
25
32
  export type EnvsRegistry = SlotRegistry<Environment>;
26
33
  export type EnvJsoncMergeCustomizerRegistry = SlotRegistry<EnvJsoncMergeCustomizer>;
34
+ export type EnvJsoncResolverRegistry = SlotRegistry<EnvJsoncResolver>;
27
35
  export type EnvsConfig = {
28
36
  env: string;
29
37
  options: EnvOptions;
@@ -42,6 +50,7 @@ export type RegularCompDescriptor = {
42
50
  description?: string;
43
51
  };
44
52
  export type EnvCompDescriptorProps = RegularCompDescriptor & {
53
+ resolvedEnvJsonc?: ResolvedEnvJsonc;
45
54
  services?: {
46
55
  env: {
47
56
  id: string;
@@ -81,6 +90,7 @@ export declare class EnvsMain {
81
90
  private loggerMain;
82
91
  private workerMain;
83
92
  private envJsoncMergeCustomizerSlot;
93
+ private envJsoncResolverSlot;
84
94
  /**
85
95
  * Envs that are failed to load
86
96
  */
@@ -114,7 +124,7 @@ export declare class EnvsMain {
114
124
  /**
115
125
  * slot for allowing extensions to register new environment.
116
126
  */
117
- envSlot: EnvsRegistry, logger: Logger, servicesRegistry: ServicesRegistry, componentMain: ComponentMain, loggerMain: LoggerMain, workerMain: WorkerMain, envJsoncMergeCustomizerSlot: EnvJsoncMergeCustomizerRegistry);
127
+ envSlot: EnvsRegistry, logger: Logger, servicesRegistry: ServicesRegistry, componentMain: ComponentMain, loggerMain: LoggerMain, workerMain: WorkerMain, envJsoncMergeCustomizerSlot: EnvJsoncMergeCustomizerRegistry, envJsoncResolverSlot: EnvJsoncResolverRegistry);
118
128
  /**
119
129
  * creates a new runtime environments for a set of components.
120
130
  */
@@ -164,8 +174,10 @@ export declare class EnvsMain {
164
174
  * function returns `undefined`.
165
175
  */
166
176
  hasEnvManifest(envComponent?: Component, legacyFiles?: SourceFile[]): boolean | undefined;
167
- getEnvManifest(envComponent?: Component, legacyFiles?: SourceFile[]): EnvJsonc | undefined;
168
- recursivelyMergeWithParentManifest(object: EnvJsonc, originPath: string): EnvJsonc;
177
+ getEnvManifest(envComponent: Component): ResolvedEnvJsonc | undefined;
178
+ getOrCalculateEnvManifest(component: Component, legacyFiles?: SourceFile[], envExtendsDeps?: LegacyDependency[]): Promise<ResolvedEnvJsonc | undefined>;
179
+ calculateEnvManifest(envComponent?: Component, legacyFiles?: SourceFile[], envExtendsDeps?: LegacyDependency[]): Promise<EnvJsonc | undefined>;
180
+ recursivelyMergeWithParentManifest(object: EnvJsonc, envExtendsDeps?: LegacyDependency[]): Promise<EnvJsonc>;
169
181
  mergeEnvManifests(parent: EnvJsonc, child: EnvJsonc): EnvJsonc;
170
182
  hasEnvManifestById(envId: string, requesting: string): Promise<boolean | undefined>;
171
183
  getEnvData(component: Component): Descriptor;
@@ -202,6 +214,7 @@ export declare class EnvsMain {
202
214
  * This is safe to be used on onLoad as well
203
215
  */
204
216
  getOrCalculateEnv(component: Component): EnvDefinition;
217
+ getOrCalculateEnvId(component: Component): Promise<ComponentID>;
205
218
  /**
206
219
  * get an environment Descriptor.
207
220
  */
@@ -245,6 +258,7 @@ export declare class EnvsMain {
245
258
  getAllRegisteredEnvsIds(): string[];
246
259
  getAllRegisteredEnvs(): Environment[];
247
260
  getAllRegisteredEnvJsoncCustomizers(): EnvJsoncMergeCustomizer[];
261
+ getAllRegisteredEnvJsoncResolvers(): EnvJsoncResolver[];
248
262
  getEnvPlugin(): EnvPlugin;
249
263
  /**
250
264
  * an env can be configured on a component in two ways:
@@ -322,12 +336,14 @@ export declare class EnvsMain {
322
336
  * register an env.jsonc merge customizer.
323
337
  */
324
338
  registerEnvJsoncMergeCustomizer(customizer: EnvJsoncMergeCustomizer): void;
339
+ registerEnvJsoncResolver(resolver: EnvJsoncResolver): void;
340
+ getEnvJsoncDetector(): EnvJsoncDetector;
325
341
  addNonLoadedEnvAsComponentIssues(components: Component[]): Promise<void>;
326
342
  private createRuntime;
327
343
  private aggregateByDefs;
328
344
  private getEnvAspectDef;
329
345
  private throwForDuplicateComponents;
330
- static slots: (((registerFn: () => string) => SlotRegistry<Environment>) | ((registerFn: () => string) => SlotRegistry<EnvService<any, {}, {}>>) | ((registerFn: () => string) => SlotRegistry<EnvJsoncMergeCustomizerRegistry>))[];
346
+ static slots: (((registerFn: () => string) => SlotRegistry<Environment>) | ((registerFn: () => string) => SlotRegistry<EnvService<any, {}, {}>>) | ((registerFn: () => string) => SlotRegistry<EnvJsoncMergeCustomizerRegistry>) | ((registerFn: () => string) => SlotRegistry<EnvJsoncResolverRegistry>))[];
331
347
  static dependencies: import("@teambit/harmony").Aspect[];
332
348
  static provider([graphql, loggerAspect, component, cli, worker, issues]: [
333
349
  GraphqlMain,
@@ -336,10 +352,11 @@ export declare class EnvsMain {
336
352
  CLIMain,
337
353
  WorkerMain,
338
354
  IssuesMain
339
- ], config: EnvsConfig, [envSlot, servicesRegistry, envJsoncMergeCustomizerSlot]: [
355
+ ], config: EnvsConfig, [envSlot, servicesRegistry, envJsoncMergeCustomizerSlot, envJsoncResolverSlot]: [
340
356
  EnvsRegistry,
341
357
  ServicesRegistry,
342
- EnvJsoncMergeCustomizerRegistry
358
+ EnvJsoncMergeCustomizerRegistry,
359
+ EnvJsoncResolverRegistry
343
360
  ], context: Harmony): Promise<EnvsMain>;
344
361
  }
345
362
  export {};
@@ -4,34 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.EnvsMain = exports.DEFAULT_ENV = void 0;
7
- function _path() {
8
- const data = require("path");
9
- _path = function () {
10
- return data;
11
- };
12
- return data;
13
- }
14
- function _findRoot() {
15
- const data = _interopRequireDefault(require("find-root"));
16
- _findRoot = function () {
17
- return data;
18
- };
19
- return data;
20
- }
21
- function _toolboxModules() {
22
- const data = require("@teambit/toolbox.modules.module-resolver");
23
- _toolboxModules = function () {
24
- return data;
25
- };
26
- return data;
27
- }
28
- function _fsExtra() {
29
- const data = require("fs-extra");
30
- _fsExtra = function () {
31
- return data;
32
- };
33
- return data;
34
- }
35
7
  function _pLocate() {
36
8
  const data = _interopRequireDefault(require("p-locate"));
37
9
  _pLocate = function () {
@@ -200,12 +172,23 @@ function _env2() {
200
172
  };
201
173
  return data;
202
174
  }
175
+ function _envJsonc() {
176
+ const data = require("./env-jsonc.detector");
177
+ _envJsonc = function () {
178
+ return data;
179
+ };
180
+ return data;
181
+ }
203
182
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
204
183
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
205
184
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
206
185
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
207
186
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
208
187
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
188
+ /**
189
+ * The resolved env jsonc is the env jsonc after it was resolved from all the parent envs
190
+ */
191
+
209
192
  const DEFAULT_ENV = exports.DEFAULT_ENV = 'teambit.harmony/node';
210
193
  class EnvsMain {
211
194
  /**
@@ -228,7 +211,7 @@ class EnvsMain {
228
211
  /**
229
212
  * slot for allowing extensions to register new environment.
230
213
  */
231
- envSlot, logger, servicesRegistry, componentMain, loggerMain, workerMain, envJsoncMergeCustomizerSlot) {
214
+ envSlot, logger, servicesRegistry, componentMain, loggerMain, workerMain, envJsoncMergeCustomizerSlot, envJsoncResolverSlot) {
232
215
  this.config = config;
233
216
  this.harmony = harmony;
234
217
  this.envSlot = envSlot;
@@ -238,6 +221,7 @@ class EnvsMain {
238
221
  this.loggerMain = loggerMain;
239
222
  this.workerMain = workerMain;
240
223
  this.envJsoncMergeCustomizerSlot = envJsoncMergeCustomizerSlot;
224
+ this.envJsoncResolverSlot = envJsoncResolverSlot;
241
225
  /**
242
226
  * Envs that are failed to load
243
227
  */
@@ -380,7 +364,19 @@ class EnvsMain {
380
364
  if (!envJson) return false;
381
365
  return true;
382
366
  }
383
- getEnvManifest(envComponent, legacyFiles) {
367
+ getEnvManifest(envComponent) {
368
+ const data = this.getEnvData(envComponent);
369
+ if (!data) return undefined;
370
+ return data.resolvedEnvJsonc;
371
+ }
372
+ async getOrCalculateEnvManifest(component, legacyFiles, envExtendsDeps) {
373
+ try {
374
+ return this.getEnvManifest(component) || (await this.calculateEnvManifest(component, legacyFiles, envExtendsDeps));
375
+ } catch {
376
+ return this.calculateEnvManifest(component);
377
+ }
378
+ }
379
+ async calculateEnvManifest(envComponent, legacyFiles, envExtendsDeps) {
384
380
  // TODO: maybe throw an error here?
385
381
  if (!envComponent && !legacyFiles) return undefined;
386
382
  // @ts-ignore
@@ -390,29 +386,18 @@ class EnvsMain {
390
386
  });
391
387
  if (!envJson) return undefined;
392
388
  const object = (0, _commentJson().parse)(envJson.contents.toString('utf8'), undefined, true);
393
- const resolvedObject = this.recursivelyMergeWithParentManifest(object, envJson.path);
389
+ if (!object.extends) return object;
390
+ const resolvedObject = await this.recursivelyMergeWithParentManifest(object, envExtendsDeps);
394
391
  return resolvedObject;
395
392
  }
396
- recursivelyMergeWithParentManifest(object, originPath) {
393
+ async recursivelyMergeWithParentManifest(object, envExtendsDeps) {
397
394
  if (!object.extends) return object;
398
- const parentPackageName = object.extends;
399
- const parentPath = (0, _toolboxModules().resolveFrom)(originPath, [parentPackageName]);
400
- const parentResolvedPath = (0, _findRoot().default)(parentPath);
401
- if (!parentResolvedPath || !(0, _fsExtra().existsSync)(parentResolvedPath)) {
402
- this.logger.info(`failed finding parent manifest for ${parentPackageName} at ${parentResolvedPath}`);
403
- }
404
- const parentEnvJsoncPath = ['env.jsonc', 'env.json'].map(fileName => (0, _path().join)(parentResolvedPath, fileName)).find(filePath => {
405
- return (0, _fsExtra().existsSync)(filePath);
406
- });
407
- if (!parentEnvJsoncPath) {
408
- this.logger.consoleWarning(`failed finding parent manifest for ${parentPackageName} at ${parentResolvedPath} referred from ${originPath}`);
409
- return object;
410
- }
411
- const parentStr = (0, _fsExtra().readFileSync)(parentEnvJsoncPath).toString('utf8');
412
- const parentObject = (0, _commentJson().parse)(parentStr, undefined, true);
395
+ const parentEnvId = object.extends;
396
+ const resolver = this.getAllRegisteredEnvJsoncResolvers()[0];
397
+ const parentObject = await resolver(parentEnvId, envExtendsDeps);
413
398
  const mergedObject = this.mergeEnvManifests(parentObject, object);
414
399
  if (mergedObject.extends) {
415
- return this.recursivelyMergeWithParentManifest(mergedObject, parentEnvJsoncPath);
400
+ return this.recursivelyMergeWithParentManifest(mergedObject);
416
401
  }
417
402
  return mergedObject;
418
403
  }
@@ -423,6 +408,8 @@ class EnvsMain {
423
408
  const oneMerged = customizer(parent, child);
424
409
  merged = _objectSpread(_objectSpread({}, merged), oneMerged);
425
410
  }
411
+ // This is important to make sure we won't keep the extends from the child
412
+ delete child.extends;
426
413
  // Take extends specifically from the parent so we can propagate it to the next parent
427
414
  if (parent.extends) {
428
415
  merged.extends = parent.extends;
@@ -540,6 +527,14 @@ class EnvsMain {
540
527
  return this.calculateEnv(component);
541
528
  }
542
529
  }
530
+ getOrCalculateEnvId(component) {
531
+ try {
532
+ const idStr = this.getEnvId(component);
533
+ return Promise.resolve(_componentId().ComponentID.fromString(idStr));
534
+ } catch {
535
+ return this.calculateEnvId(component);
536
+ }
537
+ }
543
538
 
544
539
  /**
545
540
  * get an environment Descriptor.
@@ -553,9 +548,16 @@ class EnvsMain {
553
548
  const componentDescriptor = await this.getComponentEnvDescriptor(component, opts);
554
549
  if (!componentDescriptor) return undefined;
555
550
  const envComponentSelfDescriptor = await this.getEnvSelfDescriptor(component);
556
- const result = envComponentSelfDescriptor ? _objectSpread(_objectSpread({}, componentDescriptor), {}, {
557
- self: envComponentSelfDescriptor
558
- }) : componentDescriptor;
551
+ // const resolvedEnvJsonc = await this.calculateEnvManifest(component);
552
+ const result = componentDescriptor;
553
+ if (envComponentSelfDescriptor) {
554
+ // @ts-ignore
555
+ result.self = envComponentSelfDescriptor;
556
+ }
557
+ // if (resolvedEnvJsonc) {
558
+ // // @ts-ignore
559
+ // result.resolvedEnvJsonc = resolvedEnvJsonc;
560
+ // }
559
561
  return result;
560
562
  }
561
563
 
@@ -742,6 +744,9 @@ class EnvsMain {
742
744
  getAllRegisteredEnvJsoncCustomizers() {
743
745
  return this.envJsoncMergeCustomizerSlot.toArray().map(customizerEntry => customizerEntry[1]);
744
746
  }
747
+ getAllRegisteredEnvJsoncResolvers() {
748
+ return this.envJsoncResolverSlot.toArray().map(resolver => resolver[1]);
749
+ }
745
750
  getEnvPlugin() {
746
751
  return new (_env2().EnvPlugin)(this.envSlot, this.servicesRegistry, this.loggerMain, this.workerMain, this.harmony);
747
752
  }
@@ -1043,6 +1048,12 @@ class EnvsMain {
1043
1048
  registerEnvJsoncMergeCustomizer(customizer) {
1044
1049
  return this.envJsoncMergeCustomizerSlot.register(customizer);
1045
1050
  }
1051
+ registerEnvJsoncResolver(resolver) {
1052
+ return this.envJsoncResolverSlot.register(resolver);
1053
+ }
1054
+ getEnvJsoncDetector() {
1055
+ return new (_envJsonc().EnvJsoncDetector)();
1056
+ }
1046
1057
  async addNonLoadedEnvAsComponentIssues(components) {
1047
1058
  await (0, _pMapSeries().default)(components, async component => {
1048
1059
  const envId = await this.calculateEnvId(component);
@@ -1112,9 +1123,9 @@ class EnvsMain {
1112
1123
  throw new Error(`found duplicated components: ${duplications.join(', ')}`);
1113
1124
  }
1114
1125
  }
1115
- static async provider([graphql, loggerAspect, component, cli, worker, issues], config, [envSlot, servicesRegistry, envJsoncMergeCustomizerSlot], context) {
1126
+ static async provider([graphql, loggerAspect, component, cli, worker, issues], config, [envSlot, servicesRegistry, envJsoncMergeCustomizerSlot, envJsoncResolverSlot], context) {
1116
1127
  const logger = loggerAspect.createLogger(_environments().EnvsAspect.id);
1117
- const envs = new EnvsMain(config, context, envSlot, logger, servicesRegistry, component, loggerAspect, worker, envJsoncMergeCustomizerSlot);
1128
+ const envs = new EnvsMain(config, context, envSlot, logger, servicesRegistry, component, loggerAspect, worker, envJsoncMergeCustomizerSlot, envJsoncResolverSlot);
1118
1129
  component.registerShowFragments([new (_env().EnvFragment)(envs)]);
1119
1130
  if (issues) issues.registerAddComponentsIssues(envs.addNonLoadedEnvAsComponentIssues.bind(envs));
1120
1131
  const envsCmd = new (_envs().EnvsCmd)(envs, component);
@@ -1126,7 +1137,7 @@ class EnvsMain {
1126
1137
  }
1127
1138
  exports.EnvsMain = EnvsMain;
1128
1139
  _defineProperty(EnvsMain, "runtime", _cli().MainRuntime);
1129
- _defineProperty(EnvsMain, "slots", [_harmony().Slot.withType(), _harmony().Slot.withType(), _harmony().Slot.withType()]);
1140
+ _defineProperty(EnvsMain, "slots", [_harmony().Slot.withType(), _harmony().Slot.withType(), _harmony().Slot.withType(), _harmony().Slot.withType()]);
1130
1141
  _defineProperty(EnvsMain, "dependencies", [_graphql().GraphqlAspect, _logger().LoggerAspect, _component().ComponentAspect, _cli().CLIAspect, _worker().WorkerAspect, _issues().IssuesAspect]);
1131
1142
  _environments().EnvsAspect.addRuntime(EnvsMain);
1132
1143