@teambit/envs 1.0.494 → 1.0.495

Sign up to get free protection for your applications and to get access to all the features.
@@ -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