Skip to content

Commit 455d7db

Browse files
authored
Fix doc generation script to preserve old filename capitalization (#1586)
Fix doc generation script to preserve old filename capitalization
1 parent 00bc086 commit 455d7db

File tree

3 files changed

+97
-75
lines changed

3 files changed

+97
-75
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@
2929
"test:coverage": "lcov-result-merger 'packages/**/lcov.info' | coveralls",
3030
"test:setup": "node tools/config.js",
3131
"pretest:saucelabs": "lerna run --parallel pretest",
32-
"test:saucelabs": "karma start config/karma.saucelabs.js --single-run"
32+
"test:saucelabs": "karma start config/karma.saucelabs.js --single-run",
33+
"docgen": "node scripts/docgen/generate-docs.js"
3334
},
3435
"repository": {
3536
"type": "git",

scripts/docgen/generate-docs.js

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,19 @@ function moveFilesToRoot(subdir) {
7272
*/
7373
function fixLinks(file) {
7474
return fs.readFile(file, 'utf8').then(data => {
75-
const fixedLinks = data
75+
const flattenedLinks = data
7676
.replace(/\.\.\//g, '')
7777
.replace(/(modules|interfaces|classes)\//g, '');
78-
return fs.writeFile(file, fixedLinks);
78+
let caseFixedLinks = flattenedLinks;
79+
for (const lower in lowerToUpperLookup) {
80+
const re = new RegExp(lower, 'g');
81+
caseFixedLinks = caseFixedLinks.replace(re, lowerToUpperLookup[lower]);
82+
}
83+
return fs.writeFile(file, caseFixedLinks);
7984
});
8085
}
8186

82-
let tocLower = '';
87+
let tocText = '';
8388

8489
/**
8590
* Generates temporary markdown file that will be sourced by Typedoc to
@@ -89,9 +94,7 @@ let tocLower = '';
8994
* @param {string} homeRaw
9095
*/
9196
function generateTempHomeMdFile(tocRaw, homeRaw) {
92-
// In case we need to paste in toc.yaml from old docs.
93-
tocLower = tocRaw.replace(/path:.*/g, x => x.toLowerCase());
94-
const { toc } = yaml.safeLoad(tocLower);
97+
const { toc } = yaml.safeLoad(tocRaw);
9598
let tocPageLines = [homeRaw, '# API Reference'];
9699
toc.forEach(group => {
97100
tocPageLines.push(`\n## [${group.title}](${stripPath(group.path)})`);
@@ -102,29 +105,46 @@ function generateTempHomeMdFile(tocRaw, homeRaw) {
102105
return fs.writeFile(tempHomePath, tocPageLines.join('\n'));
103106
}
104107

108+
/**
109+
* Mapping between lowercase file name and correctly cased name.
110+
* Used to update links when filenames are capitalized.
111+
*/
112+
const lowerToUpperLookup = {};
113+
105114
/**
106115
* Checks to see if any files listed in toc.yaml were not generated.
116+
* If files exist, fixes filename case to match toc.yaml version.
107117
*/
108-
function checkForMissingFiles() {
118+
function checkForMissingFilesAndFixFilenameCase() {
109119
// Get filenames from toc.yaml.
110-
const filenames = tocLower
120+
const filenames = tocText
111121
.split('\n')
112122
.filter(line => line.includes('path:'))
113123
.map(line => line.split(devsitePath)[1]);
114124
// Logs warning to console if a file from TOC is not found.
115-
filenames.forEach(filename => {
116-
// This is just a warning, it doesn't need to finish before
117-
// the process continues.
118-
fs.exists(`${docPath}/${filename}.html`).then(exists => {
119-
if (!exists) {
125+
const fileCheckPromises = filenames.map(filename => {
126+
// Warns if file does not exist, fixes filename case if it does.
127+
// Preferred filename for devsite should be capitalized and taken from
128+
// toc.yaml.
129+
const tocFilePath = `${docPath}/${filename}.html`;
130+
// Generated filename from Typedoc will be lowercase.
131+
const generatedFilePath = `${docPath}/${filename.toLowerCase()}.html`;
132+
return fs.exists(generatedFilePath).then(exists => {
133+
if (exists) {
134+
// Store in a lookup table for link fixing.
135+
lowerToUpperLookup[
136+
`${filename.toLowerCase()}.html`
137+
] = `${filename}.html`;
138+
return fs.rename(generatedFilePath, tocFilePath);
139+
} else {
120140
console.warn(
121141
`Missing file: ${filename}.html requested ` +
122142
`in toc.yaml but not found in ${docPath}`
123143
);
124144
}
125145
});
126146
});
127-
return filenames;
147+
return Promise.all(fileCheckPromises).then(() => filenames);
128148
}
129149

130150
/**
@@ -209,6 +229,7 @@ Promise.all([
209229
// Read TOC and homepage text and assemble a homepage markdown file.
210230
// This file will be sourced by Typedoc to generate index.html.
211231
.then(([tocRaw, homeRaw]) => {
232+
tocText = tocRaw;
212233
return generateTempHomeMdFile(tocRaw, homeRaw);
213234
})
214235
// Run main Typedoc process (uses index.d.ts and generated temp file above).
@@ -223,7 +244,7 @@ Promise.all([
223244
})
224245
// Write out TOC file. Do this after Typedoc step to prevent Typedoc
225246
// erroring when it finds an unexpected file in the target dir.
226-
.then(() => fs.writeFile(`${docPath}/_toc.yaml`, tocLower))
247+
.then(() => fs.writeFile(`${docPath}/_toc.yaml`, tocText))
227248
// Flatten file structure. These categories don't matter to us and it makes
228249
// it easier to manage the docs directory.
229250
.then(() => {
@@ -235,7 +256,7 @@ Promise.all([
235256
})
236257
// Check for files listed in TOC that are missing and warn if so.
237258
// Not blocking.
238-
.then(checkForMissingFiles)
259+
.then(checkForMissingFilesAndFixFilenameCase)
239260
// Check for files that exist but aren't listed in the TOC and warn.
240261
// Not blocking.
241262
.then(filenamesFromToc => checkForUnlistedFiles(filenamesFromToc))

scripts/docgen/toc.yaml

Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -3,143 +3,143 @@ toc:
33
path: /docs/reference/js/firebase
44
section:
55
- title: "FirebaseError"
6-
path: /docs/reference/js/firebase.firebaseerror
6+
path: /docs/reference/js/firebase.FirebaseError
77

88
- title: "firebase.app"
99
path: /docs/reference/js/firebase.app
1010
section:
1111
- title: "App"
12-
path: /docs/reference/js/firebase.app.app
12+
path: /docs/reference/js/firebase.app.App
1313

1414
- title: "firebase.auth"
1515
path: /docs/reference/js/firebase.auth
1616
section:
1717
- title: "Auth"
18-
path: /docs/reference/js/firebase.auth.auth
18+
path: /docs/reference/js/firebase.auth.Auth
1919
- title: "ActionCodeInfo"
20-
path: /docs/reference/js/firebase.auth.actioncodeinfo
20+
path: /docs/reference/js/firebase.auth.ActionCodeInfo
2121
- title: "AuthCredential"
22-
path: /docs/reference/js/firebase.auth.authcredential
22+
path: /docs/reference/js/firebase.auth.AuthCredential
2323
- title: "OAuthCredential"
24-
path: /docs/reference/js/firebase.auth.oauthcredential
24+
path: /docs/reference/js/firebase.auth.OAuthCredential
2525
- title: "AuthProvider"
26-
path: /docs/reference/js/firebase.auth.authprovider
26+
path: /docs/reference/js/firebase.auth.AuthProvider
2727
- title: "EmailAuthProvider"
28-
path: /docs/reference/js/firebase.auth.emailauthprovider
28+
path: /docs/reference/js/firebase.auth.EmailAuthProvider
2929
- title: "Error"
30-
path: /docs/reference/js/firebase.auth.error
30+
path: /docs/reference/js/firebase.auth.Error
3131
- title: "FacebookAuthProvider"
32-
path: /docs/reference/js/firebase.auth.facebookauthprovider
32+
path: /docs/reference/js/firebase.auth.FacebookAuthProvider
3333
- title: "GithubAuthProvider"
34-
path: /docs/reference/js/firebase.auth.githubauthprovider
34+
path: /docs/reference/js/firebase.auth.GithubAuthProvider
3535
- title: "GoogleAuthProvider"
36-
path: /docs/reference/js/firebase.auth.googleauthprovider
36+
path: /docs/reference/js/firebase.auth.GoogleAuthProvider
3737
- title: "TwitterAuthProvider"
38-
path: /docs/reference/js/firebase.auth.twitterauthprovider
38+
path: /docs/reference/js/firebase.auth.TwitterAuthProvider
3939
- title: "OAuthProvider"
40-
path: /docs/reference/js/firebase.auth.oauthprovider
40+
path: /docs/reference/js/firebase.auth.OAuthProvider
4141
- title: "SAMLAuthProvider"
42-
path: /docs/reference/js/firebase.auth.samlauthprovider
42+
path: /docs/reference/js/firebase.auth.SAMLAuthProvider
4343
- title: "UserMetadata"
44-
path: /docs/reference/js/firebase.auth.usermetadata
44+
path: /docs/reference/js/firebase.auth.UserMetadata
4545
- title: "User"
46-
path: /docs/reference/js/firebase.user
46+
path: /docs/reference/js/firebase.User
4747
- title: "UserInfo"
48-
path: /docs/reference/js/firebase.userinfo
48+
path: /docs/reference/js/firebase.UserInfo
4949

5050
- title: "firebase.database"
5151
path: /docs/reference/js/firebase.database
5252
section:
5353
- title: "Database"
54-
path: /docs/reference/js/firebase.database.database
54+
path: /docs/reference/js/firebase.database.Database
5555
- title: "DataSnapshot"
56-
path: /docs/reference/js/firebase.database.datasnapshot
56+
path: /docs/reference/js/firebase.database.DataSnapshot
5757
- title: "OnDisconnect"
58-
path: /docs/reference/js/firebase.database.ondisconnect
58+
path: /docs/reference/js/firebase.database.OnDisconnect
5959
- title: "Reference"
60-
path: /docs/reference/js/firebase.database.reference
60+
path: /docs/reference/js/firebase.database.Reference
6161
- title: "ServerValue"
62-
path: /docs/reference/js/firebase.database.servervalue
62+
path: /docs/reference/js/firebase.database.ServerValue
6363
- title: "ThenableReference"
64-
path: /docs/reference/js/firebase.database.thenablereference
64+
path: /docs/reference/js/firebase.database.ThenableReference
6565
- title: "Query"
66-
path: /docs/reference/js/firebase.database.query
66+
path: /docs/reference/js/firebase.database.Query
6767
- title: "firebase.firestore"
6868
path: /docs/reference/js/firebase.firestore
6969
section:
7070
- title: "Blob"
71-
path: /docs/reference/js/firebase.firestore.blob
71+
path: /docs/reference/js/firebase.firestore.Blob
7272
- title: "CollectionReference"
73-
path: /docs/reference/js/firebase.firestore.collectionreference
73+
path: /docs/reference/js/firebase.firestore.CollectionReference
7474
- title: "DocumentChange"
75-
path: /docs/reference/js/firebase.firestore.documentchange
75+
path: /docs/reference/js/firebase.firestore.DocumentChange
7676
- title: "DocumentReference"
77-
path: /docs/reference/js/firebase.firestore.documentreference
77+
path: /docs/reference/js/firebase.firestore.DocumentReference
7878
- title: "DocumentSnapshot"
79-
path: /docs/reference/js/firebase.firestore.documentsnapshot
79+
path: /docs/reference/js/firebase.firestore.DocumentSnapshot
8080
- title: "FieldPath"
81-
path: /docs/reference/js/firebase.firestore.fieldpath
81+
path: /docs/reference/js/firebase.firestore.FieldPath
8282
- title: "FieldValue"
83-
path: /docs/reference/js/firebase.firestore.fieldvalue
83+
path: /docs/reference/js/firebase.firestore.FieldValue
8484
- title: "Firestore"
85-
path: /docs/reference/js/firebase.firestore.firestore
85+
path: /docs/reference/js/firebase.firestore.Firestore
8686
- title: "FirestoreError"
87-
path: /docs/reference/js/firebase.firestore.firestoreerror
87+
path: /docs/reference/js/firebase.firestore.FirestoreError
8888
- title: "GeoPoint"
89-
path: /docs/reference/js/firebase.firestore.geopoint
89+
path: /docs/reference/js/firebase.firestore.GeoPoint
9090
- title: "PersistenceSettings"
91-
path: /docs/reference/js/firebase.firestore.persistencesettings
91+
path: /docs/reference/js/firebase.firestore.PersistenceSettings
9292
- title: "Query"
93-
path: /docs/reference/js/firebase.firestore.query
93+
path: /docs/reference/js/firebase.firestore.Query
9494
- title: "QueryDocumentSnapshot"
95-
path: /docs/reference/js/firebase.firestore.querydocumentsnapshot
96-
- title: "SnapshotListenOptions"
97-
path: /docs/reference/js/firebase.firestore.snapshotlistenoptions
95+
path: /docs/reference/js/firebase.firestore.QueryDocumentSnapshot
96+
- title: "QueryListenOptions"
97+
path: /docs/reference/js/firebase.firestore.QueryListenOptions
9898
- title: "QuerySnapshot"
99-
path: /docs/reference/js/firebase.firestore.querysnapshot
99+
path: /docs/reference/js/firebase.firestore.QuerySnapshot
100100
- title: "SetOptions"
101-
path: /docs/reference/js/firebase.firestore.setoptions
101+
path: /docs/reference/js/firebase.firestore.SetOptions
102102
- title: "Settings"
103-
path: /docs/reference/js/firebase.firestore.settings
103+
path: /docs/reference/js/firebase.firestore.Settings
104104
- title: "SnapshotMetadata"
105-
path: /docs/reference/js/firebase.firestore.snapshotmetadata
105+
path: /docs/reference/js/firebase.firestore.SnapshotMetadata
106106
- title: "SnapshotOptions"
107-
path: /docs/reference/js/firebase.firestore.snapshotoptions
107+
path: /docs/reference/js/firebase.firestore.SnapshotOptions
108108
- title: "Transaction"
109-
path: /docs/reference/js/firebase.firestore.transaction
109+
path: /docs/reference/js/firebase.firestore.Transaction
110110
- title: "WriteBatch"
111-
path: /docs/reference/js/firebase.firestore.writebatch
111+
path: /docs/reference/js/firebase.firestore.WriteBatch
112112

113113
- title: "firebase.functions"
114114
path: /docs/reference/js/firebase.functions
115115
section:
116116
- title: "Functions"
117-
path: /docs/reference/js/firebase.functions.functions
117+
path: /docs/reference/js/firebase.functions.Functions
118118
- title: "HttpsCallableResult"
119-
path: /docs/reference/js/firebase.functions.httpscallableresult
119+
path: /docs/reference/js/firebase.functions.HttpsCallableResult
120120
- title: "HttpsError"
121-
path: /docs/reference/js/firebase.functions.httpserror
121+
path: /docs/reference/js/firebase.functions.HttpsError
122122

123123
- title: "firebase.messaging"
124124
path: /docs/reference/js/firebase.messaging
125125
section:
126126
- title: "Messaging"
127-
path: /docs/reference/js/firebase.messaging.messaging
127+
path: /docs/reference/js/firebase.messaging.Messaging
128128

129129
- title: "firebase.storage"
130130
path: /docs/reference/js/firebase.storage
131131
section:
132132
- title: "Storage"
133-
path: /docs/reference/js/firebase.storage.storage
133+
path: /docs/reference/js/firebase.storage.Storage
134134
- title: "FullMetadata"
135-
path: /docs/reference/js/firebase.storage.fullmetadata
135+
path: /docs/reference/js/firebase.storage.FullMetadata
136136
- title: "Reference"
137-
path: /docs/reference/js/firebase.storage.reference
137+
path: /docs/reference/js/firebase.storage.Reference
138138
- title: "SettableMetadata"
139-
path: /docs/reference/js/firebase.storage.settablemetadata
139+
path: /docs/reference/js/firebase.storage.SettableMetadata
140140
- title: "UploadMetadata"
141-
path: /docs/reference/js/firebase.storage.uploadmetadata
141+
path: /docs/reference/js/firebase.storage.UploadMetadata
142142
- title: "UploadTask"
143-
path: /docs/reference/js/firebase.storage.uploadtask
143+
path: /docs/reference/js/firebase.storage.UploadTask
144144
- title: "UploadTaskSnapshot"
145-
path: /docs/reference/js/firebase.storage.uploadtasksnapshot
145+
path: /docs/reference/js/firebase.storage.UploadTaskSnapshot

0 commit comments

Comments
 (0)