Skip to content

Commit

Permalink
Adapt rebuild logic to build after checking the version doesn't alrea…
Browse files Browse the repository at this point in the history
…dy exists on npm
  • Loading branch information
bigorn0 committed Nov 14, 2023
1 parent 7931381 commit 74fa031
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 24 deletions.
43 changes: 36 additions & 7 deletions lib/build.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { LOGGER } from '#lib/logger.js';
import { exec } from './exec.js';
import { npmCommand } from './commands.js';
import { pack } from './pack.js';
import { checkPackageVersionAlreadyExistsOnNPM } from './publish.js';
import { access } from "node:fs/promises";
import { join } from "node:path";
import { cp, mkdir, rm } from './fs.js';
import {platform, arch} from 'node:os';
import { platform, arch } from 'node:os';

const log = LOGGER.extend('build');

Expand Down Expand Up @@ -44,16 +46,43 @@ export async function generateTemporaryPrebuildDirForTarget({moduleBaseDir, targ
await rm(buildDir);
}

export async function build({ name, moduleBaseDir }) {
log('build native module: %o', name);
export async function build({ name, moduleBaseDir, prebuildsAsNpmDependencies}) {

await ensureModuleBaseDirExists(moduleBaseDir);
const prebuildToBuild = await Promise.all(prebuildsAsNpmDependencies
.map( async prebuildMetadataForTarget => {
const {targetPlatform, targetArch, modulePkg} = prebuildMetadataForTarget;
if(targetPlatform === platform() && targetArch === arch()){
const {name, version} = modulePkg;
if( !await checkPackageVersionAlreadyExistsOnNPM({name, version})){
return prebuildMetadataForTarget;
}
}
}));

const [prebuildMetadata] = prebuildToBuild.flat().filter(Boolean);
const toPublish = [];

await installModuleDependencies(moduleBaseDir);
if(prebuildMetadata){

await rebuildModule(moduleBaseDir);
log('build native module: %o', name);

await generateTemporaryPrebuildDirForTarget({ moduleBaseDir, targetArch: arch(), targetPlatform: platform()});
await ensureModuleBaseDirExists(moduleBaseDir);

await installModuleDependencies(moduleBaseDir);

await rebuildModule(moduleBaseDir);

await generateTemporaryPrebuildDirForTarget({ moduleBaseDir, targetArch: arch(), targetPlatform: platform()});

await pack({
srcBaseDir: prebuildNpmMeta.moduleBaseDir,
destBaseDir: prebuildMetadata.rescopedModuleBaseDir,
packageJSONData: prebuildMetadata.modulePkg,
modulesToPublish: toPublish
});
}

return toPublish;
}

export const releaseBuildPath = (moduleBaseDir) => join(moduleBaseDir, 'build', 'Release');
Expand Down
9 changes: 3 additions & 6 deletions lib/pack.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { cp, mkdir, mv, readdir, rm } from './fs.js';
import { writeFile } from 'fs/promises';
import { join, sep } from 'node:path';
import { join } from 'node:path';
import { readPackageData } from './module.js';
import { sanitizeModulePackageJSON } from './build-metadata.js';
import os from 'node:os';

async function relocatePrebuildAndBinaries({baseDir, relocatePrebuilds, isWindows, mainFromConfig, filesFromConfig = []}){
if(relocatePrebuilds){
Expand Down Expand Up @@ -37,7 +36,7 @@ async function relocatePrebuildAndBinaries({baseDir, relocatePrebuilds, isWindow
}
}

async function pack({srcBaseDir, destBaseDir, packageJSONData, modulesToPublish, mainFromConfig, filesFromConfig, relocatePrebuilds = true}){
export async function pack({srcBaseDir, destBaseDir, packageJSONData, modulesToPublish, mainFromConfig, filesFromConfig, relocatePrebuilds = true}){
await rm(destBaseDir);
await mkdir(destBaseDir);

Expand All @@ -56,8 +55,6 @@ export async function rescopeOfficialPrebuildsFromPackage({buildMetadata, rescop

for (const meta of buildMetadata) {
if(!rescopeOnlyPrebuilds){
console.log(">>>>>>>>", meta.moduleBaseDir)
console.log(">>>>>>>>", meta.rescopedModuleBaseDir)
await pack({
srcBaseDir: meta.moduleBaseDir,
destBaseDir: meta.rescopedModuleBaseDir,
Expand All @@ -84,7 +81,7 @@ export async function rescopeOfficialPrebuildsFromPackage({buildMetadata, rescop

}
else{
if(!meta.to_build || meta.to_build && rescopeOnlyPrebuilds && prebuildNpmMeta.targetPlatform === os.platform() && prebuildNpmMeta.targetArch === os.arch()){
if(!meta.to_build){

await pack({
srcBaseDir: prebuildNpmMeta.moduleBaseDir,
Expand Down
3 changes: 3 additions & 0 deletions lib/publish.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,17 @@ export async function publishToNPM(scopedPackagePath) {
const {name, version} = JSON.parse(pkg);

const doesPackageExistsOnNPM = await checkPackageVersionAlreadyExistsOnNPM({name, version});

if(doesPackageExistsOnNPM){
log('--> skip publish package %o with version %o is already published to https://www.npmjs.com', name, version );
log('--> consider bumping the version in package.json buildMetadata the version.' );
return false;
}else{
log('--> package %o with version %o is not yet published to https://www.npmjs.com', name, version );
log('publishing package to registry of Hackolade organization from %o', scopedPackagePath);
await writeFile(path.join(scopedPackagePath, '.npmrc'), npmrc);
await exec({
command: npmCommand, parameters: ['publish' ], options: { cwd: scopedPackagePath }});
return true
}
}
25 changes: 14 additions & 11 deletions rebuild.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { LOGGER } from '#lib/logger.js';
import { build } from '#lib/build.js';
import modules from './modulesToBuild.json' assert { type: 'json' };
import {rescopeOfficialPrebuildsFromPackage} from './lib/pack.js';
import { LOGGER } from '#lib/logger.js';
import { ROOT_DIR } from '#root';
import { runPatchPackage } from './lib/install.js';
import {publishToNPM} from './lib/publish.js';
import { publishToNPM } from './lib/publish.js';

const log = LOGGER.extend('rebuild');

Expand All @@ -31,14 +30,18 @@ const modulesToBuild = modules.filter(({to_build}) => to_build).map(module =>{
return module;
});

log("MODULES: %O", modulesToBuild);

for(const mod of modulesToBuild){
await build(mod);
}
const moduleToPublish = await Promise.all(
modulesToBuild.map(async module => await build(module))
);

const moduleToPublish = await rescopeOfficialPrebuildsFromPackage({buildMetadata: modulesToBuild, rescopeOnlyPrebuilds: true});

for(const moduleToPublishBaseDir of moduleToPublish){
await publishToNPM(moduleToPublishBaseDir);
const toPublish = moduleToPublish.flat();
if(toPublish.length > 0){
log('module prebuilds to publish to NPM registry: %O', toPublish);
for(const moduleToPublishBaseDir of toPublish){
await publishToNPM(moduleToPublishBaseDir);
}
}
else{
log('no module prebuilds to publish to NPM registry!');
}

0 comments on commit 74fa031

Please sign in to comment.