Skip to content
Snippets Groups Projects
Commit e0aec738 authored by Millicent Billette's avatar Millicent Billette
Browse files

REFACTO: CI build a server/nodejs version and a browser version.

parent d3d207ce
No related branches found
No related tags found
No related merge requests found
Pipeline #12956 passed with warnings
......@@ -61,7 +61,7 @@ pages:
script:
- npm run test:production
- mkdir -p public/dist
- cp -rf generated/minified/* public/dist/
- cp -rf generated/npm/* public/dist/
- mv generated/coverage public/
- mv generated/jscpd/html public/jscpd
- mv generated/maintainability public/
......
const fs = require('fs');
let allModules = [];
fs.readdirSync('src/').forEach(fileName => {
if(!fileName.includes('.')) return 'sub directory excluded';
copy(`src/`,`generated/tmpBrowser/`, fileName);
copy(`src/`,`generated/tmpNodejs/`, fileName);
if (fileName.includes('.test')) return;
const moduleName = fileName.split('.')[0];
allModules.push(moduleName);
});
copy(`src/context-dependant/only-browser.mjs`,`generated/tmpBrowser/context-dependant/generics.mjs`);
copy(`src/context-dependant/only-nodejs.mjs`,`generated/tmpNodejs/context-dependant/generics.mjs`);
copy('package.json', 'generated/tmpBrowser/package.json');
copy('package.json', 'generated/tmpNodejs/package.json');
const allMjsContent = `${
allModules.map(module=>`import * as ${snake2camelCase(module)} from './${module}.mjs';`).join('\n')
}
export {${allModules.map(module=>snake2camelCase(module)).join(', ')}};
`;
fs.writeFileSync(`generated/tmpBrowser/all.mjs`, allMjsContent);
fs.writeFileSync(`generated/tmpNodejs/all.mjs`, allMjsContent);
function copy(srcPath, targetPath, fileName=''){
let content = fs.readFileSync(`${srcPath}${fileName}`, 'utf8');
content = content.replace(/from '\.\.\//g, 'from \'../../');
fs.writeFileSync(`${targetPath}${fileName}`, content);
if (!fileName.includes('.test')) return;
content = content.replace(
/import \* as app from '\.\/([^.]+)\.mjs';/,
(full, libName) => `import {${snake2camelCase(libName)} as app} from './all.mjs';`);
fs.writeFileSync(`${targetPath}all.${fileName}`, content);
}
function snake2camelCase(str){
return str.replace(/[^a-zA-Z0-9]+/g,' ').replace(/ \w/g, chr=> chr.toUpperCase()[1]);
}
const fs = require('fs');
fs.readdirSync('src/').forEach(fileName => {
if(!fileName.includes('.')) return 'sub directory excluded';
const orgContent = fs.readFileSync(`src/${fileName}`, 'utf8').replace(/from '\.\.\//g, 'from \'../../');
fs.writeFileSync(`generated/cov-env/${fileName}`, orgContent);
if (!fileName.includes('.test')) return;
fs.writeFileSync(`generated/minified/${fileName}`, orgContent);
const allJsTest = orgContent.replace(
/import \* as app from '\.\/(crypto)\.mjs';/,
(full, libName) => `import {${libName} as app} from './all.mjs';`);
fs.writeFileSync(`generated/cov-env/all.${fileName}`, allJsTest);
fs.writeFileSync(`generated/minified/all.${fileName}`, allJsTest);
});
fs.writeFileSync('generated/cov-env/package.json', fs.readFileSync('package.json', 'utf8'));
......@@ -2,19 +2,23 @@ import { minify } from "terser";
import { readdirSync, readFileSync, writeFileSync } from "fs";
const minifyCache = {};
readdirSync('generated/npm/').forEach(async fileName => {
if(!fileName.includes('.mjs')) return;
const orgContent = readFileSync(`generated/npm/${fileName}`, 'utf8');
const minified = await minify(orgContent, {
toplevel: true,
ecma: 2020,
nameCache: minifyCache,
compress: {
passes: 2
},
format: {
comments: false
}
minFold('generated/npm/browser/');
minFold('generated/npm/nodejs/');
async function minFold(folder){
readdirSync(folder).forEach(async fileName => {
if(!fileName.includes('.mjs')) return;
const orgContent = readFileSync(folder + fileName, 'utf8');
const minified = await minify(orgContent, {
toplevel: true,
ecma: 2020,
nameCache: minifyCache,
compress: {
passes: 2
},
format: {
comments: false
}
});
writeFileSync(folder + fileName, minified.code);
});
writeFileSync(`generated/minified/${fileName}`, minified.code);
});
}
import mkdirp from "mkdirp";
mkdirp.sync("generated/vendors");
mkdirp.sync("generated/tmpBrowser/context-dependant");
mkdirp.sync("generated/tmpNodejs/context-dependant");
mkdirp.sync("generated/npm/browser");
mkdirp.sync("generated/npm/nodejs");
const fs = require('fs');
const toRollup = [];
fs.readdirSync('src/').forEach(
fileName => (
fileName.includes('.test.mjs')
|| fileName.includes('.test-e2e.mjs')
|| !fileName.includes('.')
) ? 0 : toRollup.push(
{
input: `src/${fileName}`,
output: {
file: `generated/npm/${fileName}`,
format: 'esm'
rollupToDoList('generated/tmpBrowser/','generated/npm/browser/');
rollupToDoList('generated/tmpNodejs/','generated/npm/nodejs/');
function rollupToDoList(org,dest){
fs.readdirSync(org).forEach(
fileName => (
fileName.includes('.test')
|| !fileName.includes('.mjs')
) ? 0 : toRollup.push(
{
input: `${org}${fileName}`,
output: {
file: `${dest}${fileName}`,
format: 'esm'
}
}
}
));
));
}
export default toRollup;
File moved
......@@ -2,7 +2,8 @@
"name": "g1lib",
"version": "3.1.0",
"description": "An ubiquitous static javascript toolbox lib for Ǧ1 / Duniter ecosystem with reliability in mind.",
"main": "all.mjs",
"main": "nodejs/all.mjs",
"browser": "browser/all.mjs",
"author": {
"name": "[1000i100] Millicent Billette",
"email": "git@1000i100.fr",
......
......@@ -5,16 +5,12 @@
"postinstall": "run-s clean build",
"clean": "rm -rf generated*",
"build": "run-s build:**",
"build:mk:npm": "mkdirp generated/npm",
"build:mk:cov-env": "mkdirp generated/cov-env",
"build:mk:minfied": "mkdirp generated/minified",
"build:mk:vendors": "mkdirp generated/vendors",
"build:vendors": "node CI/build.js",
"build:mk": "node CI/mkGenerated.mjs",
"build:vendors": "node CI/vendors.js",
"build:cpSrcToContextSpecific": "node CI/cpSrcToContextSpecific.js",
"build:npm:rollup": "rollup --config CI/rollup.config.js",
"build:npm:cp": "cp npm/* generated/npm/",
"build:npm:cp:readme": "cp README* generated/npm/",
"build:npm:test2npm": "node CI/gen-prod-test.js",
"xbuild:npm:coverageForDeadCodeDeletion": "cd generated/npm/ && c8 ava",
"build:npm:min:terser": "node CI/minify.mjs",
"test": "run-s test:dev",
"test:dev": "run-p test:dev:**",
......@@ -22,17 +18,17 @@
"test:dev:runTests": "ava src/**.test.mjs",
"test:dev:duplication": "jscpd ./ -s",
"xtest:dev:complexity": "codehawk ./",
"test-e2e": "ava src/**.test-e2e.mjs",
"test-e2e": "ava generated/tmpNodejs/**.test-e2e.mjs",
"test:production": "run-s test:production:**",
"xtest:production:qualityCheck": "xo",
"test:production:duplication": "jscpd ./",
"test:production:complexity": "./node_modules/.bin/es6-plato -r -d generated/maintainability ./src/*",
"test:production:complexity:badgesAndThreshold": "node CI/plato-badges.js",
"test:production:srcCoverage": "cd generated/cov-env/ && c8 ava **.test.mjs",
"test:production:testMinified": "cd generated/minified/ && ava **.test.mjs",
"test:production:test-e2e": "cd generated/minified/ && ava **.test-e2e.mjs",
"test:production:clean": "rm -rf generated/minified/*.test*.mjs",
"test:production:minified2npm": "cp -rf generated/minified/* generated/npm/",
"test:production:srcCoverage": "cd generated/tmpNodejs/ && c8 ava **.test.mjs",
"test:production:npm:nodejs:cp": "cp generated/tmpNodejs/*.test*.mjs generated/npm/nodejs/",
"test:production:npm:nodejs:test": "cd generated/npm/nodejs/ && ava **.test.mjs",
"test:production:npm:nodejs:test-e2e": "cd generated/npm/nodejs/ && ava **.test-e2e.mjs",
"test:production:npm:nodejs:clean": "rm -rf generated/npm/nodejs/*.test*.mjs",
"watch": "chokidar src/* -c \"npm run test:dev:runTests\"",
"watch2null": "chokidar src/* -c \"npm run test:dev:runTests 2>/dev/null\""
},
......@@ -61,7 +57,7 @@
"disabledDependenciesTODOAddComplexityQualityCheck": {
"noble-ed25519": "https://github.com/1000i100/noble-ed25519#master",
"ecma-nacl": "^2.5.0",
"codehawk-cli": "^6.0.3",
"codehawk-cli": "^8.3.0",
"xo": "^0.38.2"
},
"ava": {
......
import * as basex from './basex.mjs';
import * as crypto from './crypto.mjs';
import * as dictionaryBuilder from './dictionary-builder.mjs';
export {basex, crypto, dictionaryBuilder};
export async function fetch(...args){
return fetch?fetch(...args):throw new Error('Fetch not available');
return window.fetch(...args);
}
import fetch from '../node_modules/node-fetch/lib/index.mjs';
import {fetch} from './context-dependant/generics.mjs';
export function DataPodClient(hosts) {
const self = this;
......
import fetch from '../node_modules/node-fetch/lib/index.mjs';
import {fetch} from './context-dependant/generics.mjs';
export function GvaClient(hosts) {
const self = this;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment