1*b7d15820SCedric van Puttenimport Minipass from 'minipass'; 2*b7d15820SCedric van Puttenimport path from 'path'; 3*b7d15820SCedric van Puttenimport { ReadEntry } from 'tar'; 4*b7d15820SCedric van Putten 5*b7d15820SCedric van Puttenexport function sanitizedName(name: string) { 6*b7d15820SCedric van Putten return name 7*b7d15820SCedric van Putten .replace(/[\W_]+/g, '') 8*b7d15820SCedric van Putten .normalize('NFD') 9*b7d15820SCedric van Putten .replace(/[\u0300-\u036f]/g, ''); 10*b7d15820SCedric van Putten} 11*b7d15820SCedric van Putten 12*b7d15820SCedric van Puttenclass Transformer extends Minipass { 13*b7d15820SCedric van Putten data: string; 14*b7d15820SCedric van Putten 15*b7d15820SCedric van Putten constructor(private name: string) { 16*b7d15820SCedric van Putten super(); 17*b7d15820SCedric van Putten this.data = ''; 18*b7d15820SCedric van Putten } 19*b7d15820SCedric van Putten write(data: string) { 20*b7d15820SCedric van Putten this.data += data; 21*b7d15820SCedric van Putten return true; 22*b7d15820SCedric van Putten } 23*b7d15820SCedric van Putten end() { 24*b7d15820SCedric van Putten const replaced = this.data 25*b7d15820SCedric van Putten .replace(/Hello App Display Name/g, this.name) 26*b7d15820SCedric van Putten .replace(/HelloWorld/g, sanitizedName(this.name)) 27*b7d15820SCedric van Putten .replace(/helloworld/g, sanitizedName(this.name.toLowerCase())); 28*b7d15820SCedric van Putten super.write(replaced); 29*b7d15820SCedric van Putten return super.end(); 30*b7d15820SCedric van Putten } 31*b7d15820SCedric van Putten} 32*b7d15820SCedric van Putten 33*b7d15820SCedric van Puttenexport function createEntryResolver(name: string) { 34*b7d15820SCedric van Putten return (entry: ReadEntry) => { 35*b7d15820SCedric van Putten if (name) { 36*b7d15820SCedric van Putten // Rewrite paths for bare workflow 37*b7d15820SCedric van Putten entry.path = entry.path 38*b7d15820SCedric van Putten .replace( 39*b7d15820SCedric van Putten /HelloWorld/g, 40*b7d15820SCedric van Putten entry.path.includes('android') ? sanitizedName(name.toLowerCase()) : sanitizedName(name) 41*b7d15820SCedric van Putten ) 42*b7d15820SCedric van Putten .replace(/helloworld/g, sanitizedName(name).toLowerCase()); 43*b7d15820SCedric van Putten } 44*b7d15820SCedric van Putten if (entry.type && /^file$/i.test(entry.type) && path.basename(entry.path) === 'gitignore') { 45*b7d15820SCedric van Putten // Rename `gitignore` because npm ignores files named `.gitignore` when publishing. 46*b7d15820SCedric van Putten // See: https://github.com/npm/npm/issues/1862 47*b7d15820SCedric van Putten entry.path = entry.path.replace(/gitignore$/, '.gitignore'); 48*b7d15820SCedric van Putten } 49*b7d15820SCedric van Putten }; 50*b7d15820SCedric van Putten} 51*b7d15820SCedric van Putten 52*b7d15820SCedric van Puttenexport function createFileTransform(name: string) { 53*b7d15820SCedric van Putten return (entry: ReadEntry) => { 54*b7d15820SCedric van Putten // Binary files, don't process these (avoid decoding as utf8) 55*b7d15820SCedric van Putten if ( 56*b7d15820SCedric van Putten ![ 57*b7d15820SCedric van Putten '.png', 58*b7d15820SCedric van Putten '.jpg', 59*b7d15820SCedric van Putten '.jpeg', 60*b7d15820SCedric van Putten '.gif', 61*b7d15820SCedric van Putten '.webp', 62*b7d15820SCedric van Putten '.psd', 63*b7d15820SCedric van Putten '.tiff', 64*b7d15820SCedric van Putten '.svg', 65*b7d15820SCedric van Putten '.jar', 66*b7d15820SCedric van Putten '.keystore', 67*b7d15820SCedric van Putten // Font files 68*b7d15820SCedric van Putten '.otf', 69*b7d15820SCedric van Putten '.ttf', 70*b7d15820SCedric van Putten ].includes(path.extname(entry.path)) && 71*b7d15820SCedric van Putten name 72*b7d15820SCedric van Putten ) { 73*b7d15820SCedric van Putten return new Transformer(name); 74*b7d15820SCedric van Putten } 75*b7d15820SCedric van Putten return undefined; 76*b7d15820SCedric van Putten }; 77*b7d15820SCedric van Putten} 78