1 |
|
2 | import type {
|
3 | SourceLocation,
|
4 | Meta,
|
5 | ModuleSpecifier,
|
6 | Symbol,
|
7 | } from '@parcel/types';
|
8 | import {md5FromObject} from '@parcel/utils';
|
9 | import type {Dependency, Environment, Target} from './types';
|
10 | import {getEnvironmentHash} from './Environment';
|
11 |
|
12 | type DependencyOpts = {|
|
13 | id?: string,
|
14 | sourcePath?: string,
|
15 | sourceAssetId?: string,
|
16 | moduleSpecifier: ModuleSpecifier,
|
17 | isAsync?: boolean,
|
18 | isEntry?: boolean,
|
19 | isOptional?: boolean,
|
20 | isURL?: boolean,
|
21 | isWeak?: ?boolean,
|
22 | loc?: SourceLocation,
|
23 | env: Environment,
|
24 | meta?: Meta,
|
25 | target?: Target,
|
26 | symbols?: Map<Symbol, Symbol>,
|
27 | pipeline?: ?string,
|
28 | |};
|
29 |
|
30 | export function createDependency(opts: DependencyOpts): Dependency {
|
31 | let id =
|
32 | opts.id ||
|
33 | md5FromObject({
|
34 | sourceAssetId: opts.sourceAssetId,
|
35 | moduleSpecifier: opts.moduleSpecifier,
|
36 | env: getEnvironmentHash(opts.env),
|
37 | target: opts.target,
|
38 | pipeline: opts.pipeline,
|
39 | });
|
40 |
|
41 | return {
|
42 | ...opts,
|
43 | id,
|
44 | isAsync: opts.isAsync ?? false,
|
45 | isEntry: opts.isEntry ?? false,
|
46 | isOptional: opts.isOptional ?? false,
|
47 | isURL: opts.isURL ?? false,
|
48 | isDeferred: false,
|
49 | meta: opts.meta || {},
|
50 | symbols: opts.symbols || new Map(),
|
51 | };
|
52 | }
|
53 |
|
54 | export function mergeDependencies(a: Dependency, b: Dependency): void {
|
55 | let {meta, symbols, isWeak, ...other} = b;
|
56 | Object.assign(a, other);
|
57 | Object.assign(a.meta, meta);
|
58 | a.isWeak = a.isWeak === isWeak ? a.isWeak : a.isWeak ?? isWeak;
|
59 | for (let [k, v] of symbols) {
|
60 | a.symbols.set(k, v);
|
61 | }
|
62 | }
|