Skip to content

Commit 8e6554f

Browse files
authored
feat: Added ESM entry points to the package (#1249)
* feat: Added ESM entry points to the package * fix: Removed postcheck ts files from compilation * fix: Version change revert
1 parent ec08bfc commit 8e6554f

13 files changed

+328
-47
lines changed

.github/scripts/verify_package.sh

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ trap cleanup EXIT
5353

5454
# Copy package and test sources into working directory
5555
cp "${PKG_NAME}" "${WORK_DIR}"
56-
cp -r test/integration/typescript/* "${WORK_DIR}"
56+
cp -r test/integration/postcheck/* "${WORK_DIR}"
5757
cp test/resources/mock.key.json "${WORK_DIR}"
5858

5959
# Enter work dir
@@ -68,6 +68,10 @@ npm install -S "${PKG_NAME}"
6868
echo "> tsc -p tsconfig.json"
6969
./node_modules/.bin/tsc -p tsconfig.json
7070

71-
MOCHA_CLI="./node_modules/.bin/mocha -r ts-node/register"
72-
echo "> $MOCHA_CLI src/*.test.ts"
73-
$MOCHA_CLI src/*.test.ts
71+
MOCHA_CLI="./node_modules/.bin/mocha"
72+
TS_MOCHA_CLI="${MOCHA_CLI} -r ts-node/register"
73+
echo "> $TS_MOCHA_CLI typescript/*.test.ts"
74+
$TS_MOCHA_CLI typescript/*.test.ts
75+
76+
echo "> $MOCHA_CLI esm/*.js"
77+
$MOCHA_CLI esm/*.js

entrypoints.json

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
{
2+
"firebase-admin": {
3+
"legacy": true,
4+
"typings": "./lib/default-namespace.d.ts",
5+
"dist": "./lib/index.js"
6+
},
7+
"firebase-admin/app": {
8+
"typings": "./lib/app/index.d.ts",
9+
"dist": "./lib/app/index.js"
10+
},
11+
"firebase-admin/auth": {
12+
"typings": "./lib/auth/index.d.ts",
13+
"dist": "./lib/auth/index.js"
14+
},
15+
"firebase-admin/database": {
16+
"typings": "./lib/database/index.d.ts",
17+
"dist": "./lib/database/index.js"
18+
},
19+
"firebase-admin/firestore": {
20+
"typings": "./lib/firestore/index.d.ts",
21+
"dist": "./lib/firestore/index.js"
22+
},
23+
"firebase-admin/instance-id": {
24+
"typings": "./lib/instance-id/index.d.ts",
25+
"dist": "./lib/instance-id/index.js"
26+
},
27+
"firebase-admin/messaging": {
28+
"typings": "./lib/messaging/index.d.ts",
29+
"dist": "./lib/messaging/index.js"
30+
},
31+
"firebase-admin/machine-learning": {
32+
"typings": "./lib/machine-learning/index.d.ts",
33+
"dist": "./lib/machine-learning/index.js"
34+
},
35+
"firebase-admin/project-management": {
36+
"typings": "./lib/project-management/index.d.ts",
37+
"dist": "./lib/project-management/index.js"
38+
},
39+
"firebase-admin/security-rules": {
40+
"typings": "./lib/security-rules/index.d.ts",
41+
"dist": "./lib/security-rules/index.js"
42+
},
43+
"firebase-admin/storage": {
44+
"typings": "./lib/storage/index.d.ts",
45+
"dist": "./lib/storage/index.js"
46+
},
47+
"firebase-admin/remote-config": {
48+
"typings": "./lib/remote-config/index.d.ts",
49+
"dist": "./lib/remote-config/index.js"
50+
}
51+
}

generate-esm-wrapper.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/**
2+
* @license
3+
* Copyright 2021 Google Inc.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
const path = require('path');
19+
const fs = require('mz/fs');
20+
21+
async function main() {
22+
const entryPoints = require('./entrypoints.json');
23+
for (const entryPoint in entryPoints) {
24+
const info = entryPoints[entryPoint];
25+
if (info.legacy) {
26+
continue;
27+
}
28+
29+
await generateEsmWrapper(entryPoint, info.dist);
30+
}
31+
}
32+
33+
async function generateEsmWrapper(entryPoint, source) {
34+
console.log(`Generating ESM wrapper for ${entryPoint}`);
35+
const target = getTarget(entryPoint);
36+
const output = getEsmOutput(source, target);
37+
await fs.mkdir(path.dirname(target), { recursive: true });
38+
await fs.writeFile(target, output);
39+
await fs.writeFile('./lib/esm/package.json', JSON.stringify({type: 'module'}));
40+
}
41+
42+
function getTarget(entryPoint) {
43+
const child = entryPoint.replace('firebase-admin/', '');
44+
return `./lib/esm/${child}/index.js`;
45+
}
46+
47+
function getEsmOutput(source, target) {
48+
const sourcePath = path.resolve(source);
49+
const cjsSource = require.resolve(sourcePath);
50+
const keys = getExports(cjsSource);
51+
const targetPath = path.resolve(target);
52+
const importPath = getImportPath(targetPath, cjsSource);
53+
54+
let output = `import mod from ${JSON.stringify(importPath)};`;
55+
output += '\n\n';
56+
for (const key of keys) {
57+
output += `export const ${key} = mod.${key};\n`;
58+
}
59+
60+
return output;
61+
}
62+
63+
function getImportPath(from, to) {
64+
const fromDir = path.dirname(from);
65+
return path.relative(fromDir, to).replace(/\\/g, '/');
66+
}
67+
68+
function getExports(cjsSource) {
69+
const mod = require(cjsSource);
70+
const keys = new Set(Object.getOwnPropertyNames(mod));
71+
keys.delete('__esModule');
72+
return [...keys].sort();
73+
}
74+
75+
(async () => {
76+
try {
77+
await main();
78+
} catch (err) {
79+
console.log(err);
80+
process.exit(1);
81+
}
82+
})();

generate-reports.js

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,38 +31,24 @@ const { local: localMode } = yargs
3131
// API Extractor configuration file.
3232
const config = require('./api-extractor.json');
3333

34-
// List of module entry points. We generate a separate report for each entry point.
35-
const entryPoints = {
36-
'firebase-admin': './lib/default-namespace.d.ts',
37-
'firebase-admin/app': './lib/app/index.d.ts',
38-
'firebase-admin/auth': './lib/auth/index.d.ts',
39-
'firebase-admin/database': './lib/database/index.d.ts',
40-
'firebase-admin/firestore': './lib/firestore/index.d.ts',
41-
'firebase-admin/instance-id': './lib/instance-id/index.d.ts',
42-
'firebase-admin/messaging': './lib/messaging/index.d.ts',
43-
'firebase-admin/machine-learning': './lib/machine-learning/index.d.ts',
44-
'firebase-admin/project-management': './lib/project-management/index.d.ts',
45-
'firebase-admin/security-rules': './lib/security-rules/index.d.ts',
46-
'firebase-admin/storage': './lib/storage/index.d.ts',
47-
'firebase-admin/remote-config': './lib/remote-config/index.d.ts',
48-
};
49-
5034
const tempConfigFile = 'api-extractor.tmp';
5135

5236
async function generateReports() {
53-
for (const key in entryPoints) {
54-
await generateReportForEntryPoint(key);
37+
const entryPoints = require('./entrypoints.json');
38+
for (const entryPoint in entryPoints) {
39+
const filePath = entryPoints[entryPoint].typings;
40+
await generateReportForEntryPoint(entryPoint, filePath);
5541
}
5642
}
5743

58-
async function generateReportForEntryPoint(key) {
59-
console.log(`\nGenerating API report for ${key}`)
44+
async function generateReportForEntryPoint(entryPoint, filePath) {
45+
console.log(`\nGenerating API report for ${entryPoint}`)
6046
console.log('========================================================\n');
6147

62-
const safeName = key.replace('/', '.');
48+
const safeName = entryPoint.replace('/', '.');
6349
console.log('Updating configuration for entry point...');
6450
config.apiReport.reportFileName = `${safeName}.api.md`;
65-
config.mainEntryPointFilePath = entryPoints[key];
51+
config.mainEntryPointFilePath = filePath;
6652
console.log(`Report file name: ${config.apiReport.reportFileName}`);
6753
console.log(`Entry point declaration: ${config.mainEntryPointFilePath}`);
6854
await fs.writeFile(tempConfigFile, JSON.stringify(config));

gulpfile.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ var paths = {
4141

4242
test: [
4343
'test/**/*.ts',
44-
'!test/integration/typescript/src/example*.ts',
44+
'!test/integration/postcheck/typescript/*.ts',
4545
],
4646

4747
build: 'lib/',

package.json

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"scripts": {
1212
"build": "gulp build",
1313
"build:tests": "gulp compile_test",
14-
"prepare": "npm run build",
14+
"prepare": "npm run build && npm run esm-wrap",
1515
"lint": "run-p lint:src lint:test",
1616
"test": "run-s lint test:unit",
1717
"integration": "run-s build test:integration",
@@ -22,7 +22,8 @@
2222
"lint:test": "eslint test/ --ext .ts",
2323
"apidocs": "node docgen/generate-docs.js --api node",
2424
"api-extractor": "node generate-reports.js",
25-
"api-extractor:local": "npm run build && node generate-reports.js --local"
25+
"api-extractor:local": "npm run build && node generate-reports.js --local",
26+
"esm-wrap": "node generate-esm-wrapper.js"
2627
},
2728
"nyc": {
2829
"extension": [
@@ -94,17 +95,50 @@
9495
},
9596
"exports": {
9697
".": "./lib/index.js",
97-
"./app": "./lib/app/index.js",
98-
"./auth": "./lib/auth/index.js",
99-
"./database": "./lib/database/index.js",
100-
"./firestore": "./lib/firestore/index.js",
101-
"./instance-id": "./lib/instance-id/index.js",
102-
"./machine-learning": "./lib/machine-learning/index.js",
103-
"./messaging": "./lib/messaging/index.js",
104-
"./project-management": "./lib/project-management/index.js",
105-
"./remote-config": "./lib/remote-config/index.js",
106-
"./security-rules": "./lib/security-rules/index.js",
107-
"./storage": "./lib/storage/index.js"
98+
"./app": {
99+
"require": "./lib/app/index.js",
100+
"import": "./lib/esm/app/index.js"
101+
},
102+
"./auth": {
103+
"require": "./lib/auth/index.js",
104+
"import": "./lib/esm/auth/index.js"
105+
},
106+
"./database": {
107+
"require": "./lib/database/index.js",
108+
"import": "./lib/esm/database/index.js"
109+
},
110+
"./firestore": {
111+
"require": "./lib/firestore/index.js",
112+
"import": "./lib/esm/firestore/index.js"
113+
},
114+
"./instance-id": {
115+
"require": "./lib/instance-id/index.js",
116+
"import": "./lib/esm/instance-id/index.js"
117+
},
118+
"./machine-learning": {
119+
"require": "./lib/machine-learning/index.js",
120+
"import": "./lib/esm/machine-learning/index.js"
121+
},
122+
"./messaging": {
123+
"require": "./lib/messaging/index.js",
124+
"import": "./lib/esm/messaging/index.js"
125+
},
126+
"./project-management": {
127+
"require": "./lib/project-management/index.js",
128+
"import": "./lib/esm/project-management/index.js"
129+
},
130+
"./remote-config": {
131+
"require": "./lib/remote-config/index.js",
132+
"import": "./lib/esm/remote-config/index.js"
133+
},
134+
"./security-rules": {
135+
"require": "./lib/security-rules/index.js",
136+
"import": "./lib/esm/security-rules/index.js"
137+
},
138+
"./storage": {
139+
"require": "./lib/storage/index.js",
140+
"import": "./lib/esm/storage/index.js"
141+
}
108142
},
109143
"dependencies": {
110144
"@firebase/database": "^0.8.1",

0 commit comments

Comments
 (0)