Jonathan Rosenbaum
1 year ago
1 changed files with 151 additions and 0 deletions
@ -0,0 +1,151 @@ |
|||
#!/usr/bin/node
|
|||
|
|||
/* Bumbleberry broke when BikeBike was dockerized, and was updated to more recent and secure Ruby libraries. |
|||
This means that it no longer updates properly without breaking BikeBike. In the absense of using Bumbleberry |
|||
directly to update the css, when browser version are identified by BikeBike, if they don't exist in /public/stylesheets/* |
|||
the browser renders a responsive view, which doesn't look right for normal size screens. |
|||
|
|||
Godwin recommended using the most recent css for the newer versions. This works well for modern browsers. |
|||
To enable this feat, the most recent browsers have to be identified, and the css from the most recent version |
|||
has to be copied over to the newer version. The irony is we could avoid this exercise, and only support modern browsers |
|||
with one css file, but in the spirit of browser justice let's not assume obscure browsers are not being used anymore. |
|||
|
|||
The only disadvantage to this approach would be if a new browser with unknown css arose. Fortunately, this |
|||
probably won't be an issue for a long time to come, since new browsers projects almost always adopt the identity of a major |
|||
engine: and_chr, and_ff, and_qq, and_uc, android, baidu, bb, chrome, edge, firefox, ie, ie_mob, ios_saf, kaios, op_mini, |
|||
op_mobm, opera, safari, samsung |
|||
|
|||
If a new engine does arise, we will deal with that issue when it occurs. |
|||
|
|||
*/ |
|||
|
|||
/* retrieves all relevant browers - using default - https://browsersl.ist/ |
|||
baidu: |
|||
{ |
|||
name: 'baidu', |
|||
versions: [ '13.18' ], |
|||
released: [ '13.18' ], |
|||
releaseDate: { '13.18': 1663027200 } |
|||
} |
|||
*/ |
|||
const browserlist = require('browserslist'); |
|||
const path = require('path'); |
|||
const fs = require('fs'); |
|||
const { version } = require('process'); |
|||
|
|||
// three directories will be parsed: application, admin, web-fonts
|
|||
|
|||
const regex = /.css$/g; |
|||
const d = ["admin", "application", "web-fonts"]; |
|||
|
|||
d.forEach((dir) => { |
|||
caniuse(dir); |
|||
}); |
|||
|
|||
function caniuse(dir) { |
|||
const directory = path.join(__dirname, 'public/stylesheets', dir); |
|||
const directoryFiles = {}; |
|||
|
|||
fs.readdir(directory, function (err, files) { |
|||
//handling error
|
|||
if (err) { |
|||
return console.log('Unable to scan directory: ' + err); |
|||
} |
|||
//listing all files using forEach
|
|||
files.forEach((file) => { |
|||
if (file.match(regex)) { |
|||
//console.log(file)
|
|||
const browserType = file.split('-', 2)[0]; |
|||
const bv = file.split('-', 2)[1]; |
|||
const browserVersion = bv.split('.css', 2)[0]; |
|||
if (directoryFiles[browserType] === undefined) { |
|||
directoryFiles[browserType] = [browserVersion]; |
|||
} else { |
|||
directoryFiles[browserType].push(browserVersion); |
|||
} |
|||
} |
|||
}); |
|||
|
|||
// Here's where we process the files according to these rules
|
|||
// RULES
|
|||
//
|
|||
// Find all versions that don't exist for each browser, by comparing to browserlist versions for each browser.
|
|||
// The most recent css version of the browser will be copied over to each of those newer caniuse versions.
|
|||
// Fortunately, caniuse versions are sequential in order, so they can be compared easily by beginning at the most recent
|
|||
// caniuse version, and stepping down to a version that matches an existing version
|
|||
//
|
|||
// In some cases, one or more versions of a browser exist, but they don't exist in the browserlist versions.
|
|||
// This can be tested if a browser file exists with no matching version. In this case, copy the most recent file
|
|||
// to any new browserlist versions. Example: and_chr, and_ff
|
|||
//
|
|||
// If all versions of a browser exists in browerlist, and are exact matches,
|
|||
// no copying is required. Example: op_mini-all and (bb-7 & bb-10).
|
|||
// We assume we know all engines that ever existed :)
|
|||
for (const browser in directoryFiles) { |
|||
|
|||
// This finds the differences between browserlist and the files in the directory
|
|||
difference = browserlist.data[browser].versions.filter(x => !directoryFiles[browser].includes(x)); |
|||
// This estables if there are any common items between the two arrays
|
|||
const commonality = browserlist.data[browser].versions.some(item => directoryFiles[browser].includes(item)); |
|||
|
|||
// we only have to copy the most recent css when there is a difference
|
|||
const browserVersions = browserlist.data[browser].versions; |
|||
if (difference.length) { |
|||
// console.log(browser + ":")
|
|||
// console.log("Commonality is", commonality);
|
|||
// console.log("Directory Files", directoryFiles[browser]);
|
|||
// console.log("Difference", difference);
|
|||
// Step down from caniuse versions until there is a match in the directory.
|
|||
let c = 1; |
|||
if (commonality) { |
|||
while (browserVersions[browserVersions.length - c]) { |
|||
let bV = browserVersions[browserVersions.length - c]; |
|||
// Use this as the file in the directory to be copied over to the different versions if there is a match.
|
|||
if (directoryFiles[browser].includes(bV)) { |
|||
// console.log("Found", browser + " " + bV);
|
|||
const recentFile = path.join(directory, browser + "-" + bV + ".css"); |
|||
// console.log(recentFile)
|
|||
difference.forEach((ver) => { |
|||
let newFile = path.join(__dirname, "public/stylesheets", dir, browser + "-" + ver + ".css"); |
|||
|
|||
fs.copyFile(recentFile, newFile, (err) => { |
|||
if (err) { |
|||
console.log("Error Found:", err); |
|||
} else { |
|||
// console.log("copied " + recentFile + " to " + newFile);
|
|||
} |
|||
}); |
|||
}); |
|||
break; |
|||
} |
|||
// console.log(browserVersions[browserVersions.length - c]);
|
|||
c++; |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
// If there is no match, use the most recent version in the directory to copy over to the different versions
|
|||
// It's a safe choice to use the last element as the most recent version
|
|||
else { |
|||
const rV = directoryFiles[browser][directoryFiles[browser].length - 1]; |
|||
const recentFile = path.join(directory, browser + "-" + rV + ".css"); |
|||
difference.forEach((ver) => { |
|||
let newFile = path.join(__dirname, "public/stylesheets", dir, browser + "-" + ver + ".css"); |
|||
|
|||
fs.copyFile(recentFile, newFile, (err) => { |
|||
if (err) { |
|||
console.log("Error Found:", err); |
|||
} else { |
|||
// console.log("copied " + recentFile + " to " + newFile);
|
|||
} |
|||
}); |
|||
|
|||
}); |
|||
} |
|||
} |
|||
} |
|||
|
|||
}); |
|||
} |
Loading…
Reference in new issue