UNPKG

6.88 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.pacmak = exports.configureLogging = exports.TargetName = void 0;
4const jsii_reflect_1 = require("jsii-reflect");
5const jsii_rosetta_1 = require("jsii-rosetta");
6const path_1 = require("path");
7const process_1 = require("process");
8const logging = require("./logging");
9const npm_modules_1 = require("./npm-modules");
10const targets_1 = require("./targets");
11Object.defineProperty(exports, "TargetName", { enumerable: true, get: function () { return targets_1.TargetName; } });
12const timer_1 = require("./timer");
13const util_1 = require("./util");
14var logging_1 = require("./logging");
15Object.defineProperty(exports, "configureLogging", { enumerable: true, get: function () { return logging_1.configure; } });
16/**
17 * Generates code in the desired targets.
18 */
19async function pacmak({ argv = {}, clean = true, codeOnly = false, fingerprint = true, force = false, forceSubdirectory = true, forceTarget = false, inputDirectories, outputDirectory, parallel = true, recurse = false, rosettaTablet, rosettaUnknownSnippets = undefined, runtimeTypeChecking = true, targets = Object.values(targets_1.TargetName), timers = new timer_1.Timers(), updateNpmIgnoreFiles = false, validateAssemblies = false, }) {
20 const rosetta = new jsii_rosetta_1.RosettaTabletReader({
21 unknownSnippets: rosettaUnknownSnippets,
22 prefixDisclaimer: true,
23 });
24 if (rosettaTablet) {
25 await rosetta.loadTabletFromFile(rosettaTablet);
26 }
27 const modulesToPackageSorted = await (0, npm_modules_1.findJsiiModules)(inputDirectories, recurse);
28 const modulesToPackageFlat = (0, util_1.flatten)(modulesToPackageSorted);
29 logging.info(`Found ${modulesToPackageFlat.length} modules to package`);
30 if (modulesToPackageFlat.length === 0) {
31 logging.warn('Nothing to do');
32 return;
33 }
34 if (outputDirectory) {
35 // Ensure this is consistently interpreted as relative to cwd(). This is transparent for absolute
36 // paths, as those would be returned unmodified.
37 const absoluteOutputDirectory = (0, path_1.resolve)((0, process_1.cwd)(), outputDirectory);
38 for (const mod of modulesToPackageFlat) {
39 mod.outputDirectory = absoluteOutputDirectory;
40 }
41 }
42 else if (updateNpmIgnoreFiles) {
43 // if outdir is coming from package.json, verify it is excluded by .npmignore. if it is explicitly
44 // defined via --out, don't perform this verification.
45 await (0, npm_modules_1.updateAllNpmIgnores)(modulesToPackageFlat);
46 }
47 const packCommand = argv['pack-command'];
48 await timers.recordAsync(packCommand, () => {
49 logging.info('Packaging NPM bundles');
50 return Promise.all(modulesToPackageFlat.map((m) => m.npmPack(packCommand)));
51 });
52 await timers.recordAsync('load jsii', () => {
53 logging.info('Loading jsii assemblies and translations');
54 const system = new jsii_reflect_1.TypeSystem();
55 return Promise.all(modulesToPackageFlat.map(async (m) => {
56 await m.load(system, validateAssemblies);
57 return rosetta.addAssembly(m.assembly.spec, m.moduleDirectory);
58 }));
59 });
60 try {
61 const targetSets = sliceTargets(modulesToPackageSorted, targets, forceTarget);
62 if (targetSets.every((s) => s.modulesSorted.length === 0)) {
63 throw new Error(`None of the requested packages had any targets to build for '${targets.join(', ')}' (use --force-target to force)`);
64 }
65 const perLanguageDirectory = targetSets.length > 1 || forceSubdirectory;
66 // We run all target sets in parallel for minimal wall clock time
67 await Promise.all(mapParallelOrSerial(targetSets, async (targetSet) => {
68 logging.info(`Packaging '${targetSet.targetType}' for ${describePackages(targetSet)}`);
69 return timers
70 .recordAsync(targetSet.targetType, () => buildTargetsForLanguage(targetSet.targetType, targetSet.modulesSorted, {
71 argv,
72 clean,
73 codeOnly,
74 fingerprint,
75 force,
76 perLanguageDirectory,
77 rosetta,
78 runtimeTypeChecking,
79 }))
80 .then(() => logging.info(`${targetSet.targetType} finished`), (err) => {
81 logging.warn(`${targetSet.targetType} failed`);
82 return Promise.reject(err);
83 });
84 }, { parallel }));
85 }
86 finally {
87 if (clean) {
88 logging.debug('Cleaning up');
89 await timers.recordAsync('cleanup', () => Promise.all(modulesToPackageFlat.map((m) => m.cleanup())));
90 }
91 else {
92 logging.info('Temporary directories retained (--no-clean)');
93 }
94 }
95 logging.info(`Packaged. ${timers.display()}`);
96}
97exports.pacmak = pacmak;
98//#endregion
99//#region Building
100async function buildTargetsForLanguage(targetLanguage, modules, { argv, clean, codeOnly, fingerprint, force, perLanguageDirectory, rosetta, runtimeTypeChecking, }) {
101 // ``argv.target`` is guaranteed valid by ``yargs`` through the ``choices`` directive.
102 const factory = targets_1.ALL_BUILDERS[targetLanguage];
103 if (!factory) {
104 throw new Error(`Unsupported target: '${targetLanguage}'`);
105 }
106 return factory(modules, {
107 arguments: argv,
108 clean: clean,
109 codeOnly: codeOnly,
110 fingerprint: fingerprint,
111 force: force,
112 languageSubdirectory: perLanguageDirectory,
113 rosetta,
114 runtimeTypeChecking,
115 }).buildModules();
116}
117function sliceTargets(modulesSorted, requestedTargets, force) {
118 const ret = new Array();
119 for (const target of requestedTargets) {
120 ret.push({
121 targetType: target,
122 modulesSorted: modulesSorted
123 .map((modules) => modules.filter((m) => force || m.availableTargets.includes(target)))
124 .filter((ms) => ms.length > 0),
125 });
126 }
127 return ret;
128}
129//#endregion
130//#region Parallelization
131function mapParallelOrSerial(collection, mapper, { parallel }) {
132 const result = new Array();
133 for (const item of collection) {
134 result.push(result.length === 0 || parallel
135 ? // Running parallel, or first element
136 mapper(item)
137 : // Wait for the previous promise, then make the next one
138 result[result.length - 1].then(() => mapper(item), (error) => Promise.reject(error)));
139 }
140 return result;
141}
142//#endregion
143//#region Misc. Utilities
144function describePackages(target) {
145 const modules = (0, util_1.flatten)(target.modulesSorted);
146 if (modules.length > 0 && modules.length < 5) {
147 return modules.map((m) => m.name).join(', ');
148 }
149 return `${modules.length} modules`;
150}
151//#endregion
152//# sourceMappingURL=index.js.map
\No newline at end of file