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