piral-cli
Version:
The standard CLI for creating and building a Piral instance or a Pilet.
200 lines • 8.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createEmulatorSources = createEmulatorSources;
exports.createEmulatorWebsite = createEmulatorWebsite;
exports.packageEmulator = packageEmulator;
const path_1 = require("path");
const package_1 = require("./package");
const template_1 = require("./template");
const constants_1 = require("./constants");
const info_1 = require("./info");
const npm_1 = require("./npm");
const declaration_1 = require("./declaration");
const enums_1 = require("./enums");
const archive_1 = require("./archive");
const io_1 = require("./io");
const io_2 = require("./io");
function makeFilesMap(files = []) {
return files
.filter((file) => file && (typeof file === 'string' || typeof file === 'object'))
.map((file) => (typeof file === 'string' ? { from: file, to: file } : file))
.filter((file) => typeof file.to === 'string' && typeof file.from === 'string')
.map((file) => ({
...file,
to: file.to.replace(/\\/g, '/'),
from: (0, path_1.join)('files', file.to).replace(/\\/g, '/'),
}));
}
async function makeExternals(sourceDir, piralPkg, externals) {
const externalPackages = await Promise.all(externals
.filter((ext) => ext.type === 'local' && (0, package_1.isValidDependency)(ext.name))
.map(async (external) => ({
name: external.name,
version: await (0, package_1.findDependencyVersion)(piralPkg, sourceDir, external),
optional: external.isAsync,
})));
const externalDependencies = externalPackages.reduce((deps, dep) => {
if (!dep.optional) {
deps[dep.name] = dep.version;
}
return deps;
}, {});
const importmapEntries = externalPackages.reduce((deps, dep) => {
deps[dep.name] = dep.name;
return deps;
}, {});
const optionalDependencies = externalPackages.reduce((deps, dep) => {
if (dep.optional) {
deps[dep.name] = dep.name;
}
return deps;
}, {});
return [externalDependencies, importmapEntries, optionalDependencies];
}
async function createScaffoldingTarballs(sourceDir, targetDir, files = []) {
const filesDir = (0, path_1.resolve)(targetDir, constants_1.filesTar);
const filesOnceDir = (0, path_1.resolve)(targetDir, constants_1.filesOnceTar);
await Promise.all([(0, io_1.createDirectory)(filesDir), (0, io_1.createDirectory)(filesOnceDir)]);
// for scaffolding we need to keep the files also available in the new package
await (0, package_1.copyScaffoldingFiles)(sourceDir, filesDir, files.filter((m) => typeof m === 'string' || !m.once));
// also to avoid information loss we should store the once-only files separately
await (0, package_1.copyScaffoldingFiles)(sourceDir, filesOnceDir, files.filter((m) => typeof m !== 'string' && m.once));
// since things like .gitignore are not properly treated by npm we pack the files (for standard and once only)
await Promise.all([
(0, archive_1.createTarball)(filesDir, targetDir, `${constants_1.filesTar}.tar`),
(0, archive_1.createTarball)(filesOnceDir, targetDir, `${constants_1.filesOnceTar}.tar`),
]);
// ... and remove the directory
await Promise.all([(0, io_1.removeDirectory)(filesDir), (0, io_1.removeDirectory)(filesOnceDir)]);
}
async function createEmulatorSources(sourceDir, externals, targetDir, targetFile, logLevel) {
const piralPkg = await (0, io_2.readJson)(sourceDir, constants_1.packageJson);
const piralJsonPkg = await (0, io_2.readJson)(sourceDir, constants_1.piralJson);
const pilets = {
...piralPkg.pilets,
...piralJsonPkg.pilets,
};
const allDeps = {
...piralPkg.devDependencies,
...piralPkg.dependencies,
};
const rootDir = (0, path_1.resolve)(targetDir, '..');
const appDir = (0, path_1.relative)(rootDir, targetDir);
const [externalDependencies, importmapEntries, optionalDependencies] = await makeExternals(sourceDir, piralPkg, externals);
// do not modify an existing JSON
await (0, io_2.createFileIfNotExists)(rootDir, constants_1.packageJson, '{}');
// patch the JSON relevant for the project
await (0, io_2.updateExistingJson)(rootDir, constants_1.packageJson, {
name: piralPkg.name,
description: piralPkg.description,
version: piralPkg.version,
license: piralPkg.license,
homepage: piralPkg.homepage,
keywords: piralPkg.keywords,
importmap: {
imports: importmapEntries,
},
pilets: {
...pilets,
files: makeFilesMap(pilets.files),
},
piralCLI: {
remoteTypes: piralJsonPkg.remoteTypesSource,
version: info_1.cliVersion,
generated: true,
},
main: `./${path_1.posix.join(appDir, 'index.js')}`,
typings: `./${path_1.posix.join(appDir, 'index.d.ts')}`,
app: `./${path_1.posix.join(appDir, 'index.html')}`,
peerDependencies: {},
optionalDependencies,
devDependencies: {
...allDeps,
...externalDependencies,
},
sharedDependencies: (0, package_1.flattenExternals)(externals, true),
repository: piralPkg.repository,
bugs: piralPkg.bugs,
author: piralPkg.author,
contributors: piralPkg.contributors,
engines: piralPkg.engines,
cpu: piralPkg.cpu,
publishConfig: piralPkg.publishConfig,
});
// we just want to make sure that "files" mentioned in the original package.json are respected in the package
await (0, package_1.copyScaffoldingFiles)(sourceDir, rootDir, piralPkg.files ?? []);
// actually including this one hints that the app shell should have been included - which is forbidden
await (0, template_1.createPiralStubIndexIfNotExists)(targetDir, 'index.js', enums_1.ForceOverwrite.yes, {
name: piralPkg.name,
outFile: (0, path_1.basename)(targetFile),
});
// generate the associated index.d.ts
await (0, declaration_1.createPiralDeclaration)(sourceDir, piralPkg.app ?? `./src/index.html`, targetDir, enums_1.ForceOverwrite.yes, logLevel);
// generate the files.tar and files_once.tar files
await createScaffoldingTarballs(sourceDir, rootDir, pilets.files);
return rootDir;
}
async function createEmulatorWebsite(sourceDir, externals, targetDir, targetFile, logLevel) {
const piralPkg = await (0, io_2.readJson)(sourceDir, constants_1.packageJson);
const piralJsonPkg = await (0, io_2.readJson)(sourceDir, constants_1.piralJson);
const pilets = {
...piralPkg.pilets,
...piralJsonPkg.pilets,
};
const allDeps = {
...piralPkg.devDependencies,
...piralPkg.dependencies,
};
const [externalDependencies, importmapEntries, optionalDependencies] = await makeExternals(sourceDir, piralPkg, externals);
const allFiles = await (0, io_1.matchFiles)(targetDir, '*');
const data = {
name: piralPkg.name,
description: piralPkg.description,
version: piralPkg.version,
timestamp: new Date().toISOString(),
scaffolding: {
remoteTypes: piralJsonPkg.remoteTypesSource,
pilets: {
...pilets,
files: makeFilesMap(pilets.files),
},
cli: info_1.cliVersion,
},
files: {
typings: 'index.d.ts',
main: (0, path_1.basename)(targetFile),
app: 'index.html',
always: `${constants_1.filesTar}.tar`,
once: `${constants_1.filesOnceTar}.tar`,
assets: allFiles.map((file) => (0, path_1.relative)(targetDir, file)),
},
importmap: {
imports: importmapEntries,
},
dependencies: {
optional: optionalDependencies,
included: {
...allDeps,
...externalDependencies,
},
},
};
await (0, io_2.writeJson)(targetDir, constants_1.emulatorJson, data, true);
// generate the associated index.d.ts
await (0, declaration_1.createPiralDeclaration)(sourceDir, piralPkg.app ?? `./src/index.html`, targetDir, enums_1.ForceOverwrite.yes, logLevel);
// generate the files.tar and files_once.tar files
await createScaffoldingTarballs(sourceDir, targetDir, pilets.files);
return targetDir;
}
async function packageEmulator(rootDir) {
// finally package everything up
await (0, npm_1.createNpmPackage)(rootDir);
// get all files
const names = await (0, io_1.getFileNames)(rootDir);
// cleanup
await Promise.all(names
.filter((name) => !name.endsWith('.tgz'))
.map((name) => (0, path_1.resolve)(rootDir, name))
.map((file) => (0, io_1.removeAny)(file)));
}
//# sourceMappingURL=emulator.js.map