forked from ampproject/amphtml
-
Notifications
You must be signed in to change notification settings - Fork 0
/
firebase.js
126 lines (115 loc) · 3.68 KB
/
firebase.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/**
* Copyright 2018 The AMP HTML Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS-IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const argv = require('minimist')(process.argv.slice(2));
const colors = require('ansi-colors');
const fs = require('fs-extra');
const log = require('fancy-log');
const path = require('path');
const {build} = require('./build');
const {clean} = require('./clean');
const {dist} = require('./dist');
const {enableLocalTesting} = require('./helpers');
async function walk(dest) {
const filelist = [];
const files = await fs.readdir(dest);
for (let i = 0; i < files.length; i++) {
const file = `${dest}/${files[i]}`;
fs.statSync(file).isDirectory()
? Array.prototype.push.apply(filelist, await walk(file))
: filelist.push(file);
}
return filelist;
}
async function copyAndReplaceUrls(src, dest) {
await fs.copy(src, dest, {overwrite: true});
// Recursively gets all the files within the directory and its children.
const files = await walk(dest);
const promises = files
.filter(fileName => path.extname(fileName) == '.html')
.map(file => replaceUrls(file));
await Promise.all(promises);
}
async function firebase() {
if (!argv.nobuild) {
await clean();
if (argv.min) {
await dist();
} else {
await build();
}
}
await fs.mkdirp('firebase');
if (argv.file) {
log(colors.green(`Processing file: ${argv.file}.`));
log(colors.green('Writing file to firebase.index.html.'));
await fs.copyFile(/*src*/ argv.file, 'firebase/index.html', {
overwrite: true,
});
await replaceUrls('firebase/index.html');
} else {
log(colors.green('Copying test/manual and examples folders.'));
await Promise.all([
copyAndReplaceUrls('test/manual', 'firebase/manual'),
copyAndReplaceUrls('examples', 'firebase/examples'),
]);
}
log(colors.green('Copying local amp files from dist folder.'));
await Promise.all([
fs.copy('dist', 'firebase/dist', {overwrite: true}),
fs.copy('dist.3p/current', 'firebase/dist.3p/current', {overwrite: true}),
]);
if (argv.fortesting) {
await Promise.all([
enableLocalTesting('firebase/dist.3p/current/integration.js'),
enableLocalTesting('firebase/dist/amp.js'),
]);
}
await Promise.all([
fs.copyFile('firebase/dist/ww.max.js', 'firebase/dist/ww.js', {
overwrite: true,
}),
]);
}
async function replaceUrls(filePath) {
const data = await fs.readFile(filePath, 'utf8');
let result = data.replace(
/https:\/\/cdn\.ampproject\.org\/v0\.js/g,
'/dist/amp.js'
);
if (argv.min) {
result = result.replace(
/https:\/\/cdn\.ampproject\.org\/v0\/(.+?).js/g,
'/dist/v0/$1.js'
);
} else {
result = result.replace(
/https:\/\/cdn\.ampproject\.org\/v0\/(.+?).js/g,
'/dist/v0/$1.max.js'
);
}
await fs.writeFile(filePath, result, 'utf8');
}
module.exports = {
firebase,
};
firebase.description = 'Generates firebase folder for deployment';
firebase.flags = {
'file': 'File to deploy to firebase as index.html',
'min': 'Source from minified files',
'nobuild': 'Skips the gulp build|dist step.',
'fortesting':
'Expects an env var AMP_TESTING_HOST and writes this to AMP_CONFIG',
};