UNPKG

2.34 kBJavaScriptView Raw
1// @flow
2import type {EnvironmentOpts} from '@parcel/types';
3import type {Environment} from './types';
4import {md5FromObject} from '@parcel/utils';
5
6const DEFAULT_ENGINES = {
7 browsers: ['> 0.25%'],
8 node: '>= 8.0.0',
9};
10
11export function createEnvironment({
12 context,
13 engines,
14 includeNodeModules,
15 outputFormat,
16 isLibrary = false,
17}: EnvironmentOpts = {}): Environment {
18 if (context == null) {
19 if (engines?.node) {
20 context = 'node';
21 } else if (engines?.browsers) {
22 context = 'browser';
23 } else {
24 context = 'browser';
25 }
26 }
27
28 if (engines == null) {
29 switch (context) {
30 case 'node':
31 case 'electron-main':
32 engines = {
33 node: DEFAULT_ENGINES.node,
34 };
35 break;
36 case 'browser':
37 case 'web-worker':
38 case 'service-worker':
39 case 'electron-renderer':
40 engines = {
41 browsers: DEFAULT_ENGINES.browsers,
42 };
43 break;
44 default:
45 engines = {};
46 }
47 }
48
49 if (includeNodeModules == null) {
50 switch (context) {
51 case 'node':
52 case 'electron-main':
53 case 'electron-renderer':
54 includeNodeModules = false;
55 break;
56 case 'browser':
57 case 'web-worker':
58 case 'service-worker':
59 default:
60 includeNodeModules = true;
61 break;
62 }
63 }
64
65 if (outputFormat == null) {
66 switch (context) {
67 case 'node':
68 case 'electron-main':
69 case 'electron-renderer':
70 outputFormat = 'commonjs';
71 break;
72 default:
73 outputFormat = 'global';
74 break;
75 }
76 }
77
78 return {
79 context,
80 engines,
81 includeNodeModules,
82 outputFormat,
83 isLibrary,
84 };
85}
86
87export function mergeEnvironments(
88 a: Environment,
89 b: ?EnvironmentOpts,
90): Environment {
91 // If merging the same object, avoid copying.
92 if (a === b) {
93 return a;
94 }
95
96 return createEnvironment({
97 ...a,
98 ...b,
99 });
100}
101
102export function getEnvironmentHash(env: Environment) {
103 // context is excluded from hash so that assets can be shared between e.g. workers and browser.
104 // Different engines should be sufficient to distinguish multi-target builds.
105 return md5FromObject({
106 engines: env.engines,
107 includeNodeModules: env.includeNodeModules,
108 outputFormat: env.outputFormat,
109 isLibrary: env.isLibrary,
110 });
111}