firebase-tools 11.30.0 → 12.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api.js +4 -2
- package/lib/commands/ext-configure.js +2 -1
- package/lib/commands/ext-dev-deprecate.js +24 -20
- package/lib/commands/ext-dev-list.js +12 -11
- package/lib/commands/ext-dev-publish.js +13 -47
- package/lib/commands/ext-dev-register.js +8 -5
- package/lib/commands/ext-dev-undeprecate.js +4 -4
- package/lib/commands/ext-dev-upload.js +88 -0
- package/lib/commands/ext-dev-usage.js +3 -3
- package/lib/commands/ext-install.js +5 -10
- package/lib/commands/ext-uninstall.js +0 -1
- package/lib/commands/ext-update.js +4 -10
- package/lib/commands/index.js +9 -19
- package/lib/deploy/extensions/planner.js +13 -7
- package/lib/deploy/extensions/prepare.js +16 -32
- package/lib/emulator/storage/rules/config.js +17 -7
- package/lib/experiments.js +7 -6
- package/lib/extensions/extensionsApi.js +24 -151
- package/lib/extensions/extensionsHelper.js +282 -145
- package/lib/extensions/manifest.js +1 -8
- package/lib/extensions/publisherApi.js +215 -0
- package/lib/extensions/refs.js +1 -1
- package/lib/extensions/resolveSource.js +1 -18
- package/lib/extensions/tos.js +78 -0
- package/lib/extensions/warnings.js +21 -41
- package/lib/frameworks/angular/index.js +67 -185
- package/lib/frameworks/angular/interfaces.js +2 -0
- package/lib/frameworks/angular/utils.js +274 -0
- package/lib/frameworks/constants.js +5 -2
- package/lib/frameworks/index.js +60 -28
- package/lib/frameworks/next/index.js +86 -40
- package/lib/frameworks/next/utils.js +29 -12
- package/lib/frameworks/utils.js +11 -4
- package/lib/functions/python.js +1 -1
- package/lib/hosting/api.js +32 -1
- package/package.json +2 -2
- package/templates/extensions/POSTINSTALL.md +2 -2
- package/templates/extensions/PREINSTALL.md +1 -1
- package/templates/extensions/extension.yaml +10 -6
- package/templates/extensions/javascript/WELCOME.md +1 -1
- package/templates/extensions/typescript/WELCOME.md +1 -1
- package/templates/extensions/typescript/index.ts +1 -1
- package/templates/init/functions/javascript/index.js +16 -6
- package/templates/init/functions/javascript/package.lint.json +4 -4
- package/templates/init/functions/javascript/package.nolint.json +4 -4
- package/templates/init/functions/typescript/index.ts +16 -6
- package/templates/init/functions/typescript/package.lint.json +4 -4
- package/templates/init/functions/typescript/package.nolint.json +4 -4
- package/lib/commands/ext-dev-emulators-exec.js +0 -27
- package/lib/commands/ext-dev-emulators-start.js +0 -24
- package/lib/commands/ext-dev-extension-delete.js +0 -45
- package/lib/commands/ext-dev-unpublish.js +0 -49
- package/lib/commands/ext-sources-create.js +0 -24
- package/lib/extensions/askUserForConsent.js +0 -33
- package/npm-shrinkwrap.json +0 -12368
|
@@ -8,6 +8,8 @@ const fs_extra_1 = require("fs-extra");
|
|
|
8
8
|
const promises_1 = require("fs/promises");
|
|
9
9
|
const prompt_1 = require("../../prompt");
|
|
10
10
|
const utils_1 = require("../utils");
|
|
11
|
+
const utils_2 = require("./utils");
|
|
12
|
+
const constants_1 = require("../constants");
|
|
11
13
|
exports.name = "Angular";
|
|
12
14
|
exports.support = "preview";
|
|
13
15
|
exports.type = 3;
|
|
@@ -18,8 +20,7 @@ async function discover(dir) {
|
|
|
18
20
|
return;
|
|
19
21
|
if (!(await (0, fs_extra_1.pathExists)((0, path_1.join)(dir, "angular.json"))))
|
|
20
22
|
return;
|
|
21
|
-
|
|
22
|
-
return { mayWantBackend: !!serverTarget, publicDirectory: (0, path_1.join)(dir, "src", "assets") };
|
|
23
|
+
return { mayWantBackend: true, publicDirectory: (0, path_1.join)(dir, "src", "assets") };
|
|
23
24
|
}
|
|
24
25
|
exports.discover = discover;
|
|
25
26
|
async function init(setup, config) {
|
|
@@ -42,36 +43,23 @@ async function init(setup, config) {
|
|
|
42
43
|
}
|
|
43
44
|
exports.init = init;
|
|
44
45
|
async function build(dir) {
|
|
45
|
-
const {
|
|
46
|
-
const { architect, browserTarget, prerenderTarget, serverTarget } = await getContext(dir);
|
|
47
|
-
const scheduleTarget = async (target) => {
|
|
48
|
-
const run = await architect.scheduleTarget(target, undefined);
|
|
49
|
-
const { success, error } = await run.output.toPromise();
|
|
50
|
-
if (!success)
|
|
51
|
-
throw new Error(error);
|
|
52
|
-
};
|
|
46
|
+
const { targets, serverTarget, serveOptimizedImages, locales } = await (0, utils_2.getBuildConfig)(dir);
|
|
53
47
|
await (0, utils_1.warnIfCustomBuildScript)(dir, exports.name, DEFAULT_BUILD_SCRIPT);
|
|
54
|
-
|
|
55
|
-
throw new Error("No build target...");
|
|
56
|
-
if (prerenderTarget) {
|
|
48
|
+
for (const target of targets) {
|
|
57
49
|
const cli = (0, utils_1.getNodeModuleBin)("ng", dir);
|
|
58
|
-
(0,
|
|
50
|
+
(0, cross_spawn_1.sync)(cli, ["run", target], {
|
|
59
51
|
cwd: dir,
|
|
60
52
|
stdio: "inherit",
|
|
61
53
|
});
|
|
62
54
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
await scheduleTarget(serverTarget);
|
|
67
|
-
}
|
|
68
|
-
const wantsBackend = !!serverTarget;
|
|
69
|
-
return { wantsBackend };
|
|
55
|
+
const wantsBackend = !!serverTarget || serveOptimizedImages;
|
|
56
|
+
const i18n = !!locales;
|
|
57
|
+
return { wantsBackend, i18n };
|
|
70
58
|
}
|
|
71
59
|
exports.build = build;
|
|
72
60
|
async function getDevModeHandle(dir) {
|
|
73
61
|
const { targetStringFromTarget } = (0, utils_1.relativeRequire)(dir, "@angular-devkit/architect");
|
|
74
|
-
const { serveTarget } = await getContext(dir);
|
|
62
|
+
const { serveTarget } = await (0, utils_2.getContext)(dir);
|
|
75
63
|
if (!serveTarget)
|
|
76
64
|
return;
|
|
77
65
|
const host = new Promise((resolve) => {
|
|
@@ -93,186 +81,80 @@ async function getDevModeHandle(dir) {
|
|
|
93
81
|
}
|
|
94
82
|
exports.getDevModeHandle = getDevModeHandle;
|
|
95
83
|
async function ɵcodegenPublicDirectory(sourceDir, destDir) {
|
|
96
|
-
const {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
84
|
+
const { outputPath, baseHref, defaultLocale, locales } = await (0, utils_2.getBrowserConfig)(sourceDir);
|
|
85
|
+
await (0, promises_1.mkdir)((0, path_1.join)(destDir, baseHref), { recursive: true });
|
|
86
|
+
if (locales) {
|
|
87
|
+
await Promise.all([
|
|
88
|
+
defaultLocale
|
|
89
|
+
? await (0, fs_extra_1.copy)((0, path_1.join)(sourceDir, outputPath, defaultLocale), (0, path_1.join)(destDir, baseHref))
|
|
90
|
+
: Promise.resolve(),
|
|
91
|
+
...locales.map(async (locale) => {
|
|
92
|
+
await (0, promises_1.mkdir)((0, path_1.join)(destDir, constants_1.I18N_ROOT, locale, baseHref), { recursive: true });
|
|
93
|
+
await (0, fs_extra_1.copy)((0, path_1.join)(sourceDir, outputPath, locale), (0, path_1.join)(destDir, constants_1.I18N_ROOT, locale, baseHref));
|
|
94
|
+
}),
|
|
95
|
+
]);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
await (0, fs_extra_1.copy)((0, path_1.join)(sourceDir, outputPath), (0, path_1.join)(destDir, baseHref));
|
|
99
|
+
}
|
|
105
100
|
}
|
|
106
101
|
exports.ɵcodegenPublicDirectory = ɵcodegenPublicDirectory;
|
|
107
102
|
async function ɵcodegenFunctionsDirectory(sourceDir, destDir) {
|
|
108
103
|
var _a;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const browserTargetOptions = await architectHost.getOptionsForTarget(browserTarget);
|
|
119
|
-
if (typeof (browserTargetOptions === null || browserTargetOptions === void 0 ? void 0 : browserTargetOptions.outputPath) !== "string")
|
|
120
|
-
throw new Error("browserTarget output path is not a string");
|
|
121
|
-
const browserOutputPath = browserTargetOptions.outputPath;
|
|
122
|
-
const serverOutputPath = serverTargetOptions.outputPath;
|
|
123
|
-
await (0, promises_1.mkdir)((0, path_1.join)(destDir, serverOutputPath), { recursive: true });
|
|
124
|
-
await (0, promises_1.mkdir)((0, path_1.join)(destDir, browserOutputPath), { recursive: true });
|
|
125
|
-
await (0, fs_extra_1.copy)((0, path_1.join)(sourceDir, serverOutputPath), (0, path_1.join)(destDir, serverOutputPath));
|
|
126
|
-
await (0, fs_extra_1.copy)((0, path_1.join)(sourceDir, browserOutputPath), (0, path_1.join)(destDir, browserOutputPath));
|
|
127
|
-
const bootstrapScript = `exports.handle = require('./${serverOutputPath}/main.js').app();\n`;
|
|
128
|
-
const bundleDependencies = (_a = serverTargetOptions.bundleDependencies) !== null && _a !== void 0 ? _a : true;
|
|
104
|
+
var _b;
|
|
105
|
+
const { packageJson, serverOutputPath, browserOutputPath, defaultLocale, serverLocales, browserLocales, bundleDependencies, externalDependencies, baseHref: baseUrl, serveOptimizedImages, } = await (0, utils_2.getServerConfig)(sourceDir);
|
|
106
|
+
const dotEnv = { __NG_BROWSER_OUTPUT_PATH__: browserOutputPath };
|
|
107
|
+
await Promise.all([
|
|
108
|
+
serverOutputPath
|
|
109
|
+
? (0, promises_1.mkdir)((0, path_1.join)(destDir, serverOutputPath), { recursive: true }).then(() => (0, fs_extra_1.copy)((0, path_1.join)(sourceDir, serverOutputPath), (0, path_1.join)(destDir, serverOutputPath)))
|
|
110
|
+
: Promise.resolve(),
|
|
111
|
+
(0, promises_1.mkdir)((0, path_1.join)(destDir, browserOutputPath), { recursive: true }).then(() => (0, fs_extra_1.copy)((0, path_1.join)(sourceDir, browserOutputPath), (0, path_1.join)(destDir, browserOutputPath))),
|
|
112
|
+
]);
|
|
129
113
|
if (bundleDependencies) {
|
|
130
114
|
const dependencies = {};
|
|
131
|
-
const
|
|
132
|
-
externalDependencies.forEach((externalDependency) => {
|
|
133
|
-
var _a;
|
|
115
|
+
for (const externalDependency of externalDependencies) {
|
|
134
116
|
const packageVersion = (_a = (0, utils_1.findDependency)(externalDependency)) === null || _a === void 0 ? void 0 : _a.version;
|
|
135
117
|
if (packageVersion) {
|
|
136
118
|
dependencies[externalDependency] = packageVersion;
|
|
137
119
|
}
|
|
138
|
-
}
|
|
120
|
+
}
|
|
139
121
|
packageJson.dependencies = dependencies;
|
|
140
122
|
}
|
|
141
|
-
|
|
142
|
-
}
|
|
143
|
-
exports.ɵcodegenFunctionsDirectory = ɵcodegenFunctionsDirectory;
|
|
144
|
-
async function getContext(dir) {
|
|
145
|
-
const { NodeJsAsyncHost } = (0, utils_1.relativeRequire)(dir, "@angular-devkit/core/node");
|
|
146
|
-
const { workspaces } = (0, utils_1.relativeRequire)(dir, "@angular-devkit/core");
|
|
147
|
-
const { WorkspaceNodeModulesArchitectHost } = (0, utils_1.relativeRequire)(dir, "@angular-devkit/architect/node");
|
|
148
|
-
const { Architect, targetFromTargetString, targetStringFromTarget } = (0, utils_1.relativeRequire)(dir, "@angular-devkit/architect");
|
|
149
|
-
const { parse } = (0, utils_1.relativeRequire)(dir, "jsonc-parser");
|
|
150
|
-
const host = workspaces.createWorkspaceHost(new NodeJsAsyncHost());
|
|
151
|
-
const { workspace } = await workspaces.readWorkspace(dir, host);
|
|
152
|
-
const architectHost = new WorkspaceNodeModulesArchitectHost(workspace, dir);
|
|
153
|
-
const architect = new Architect(architectHost);
|
|
154
|
-
let project = globalThis.NG_DEPLOY_PROJECT;
|
|
155
|
-
let browserTarget;
|
|
156
|
-
let serverTarget;
|
|
157
|
-
let prerenderTarget;
|
|
158
|
-
let serveTarget;
|
|
159
|
-
if (!project) {
|
|
160
|
-
const angularJson = parse(await host.readFile((0, path_1.join)(dir, "angular.json")));
|
|
161
|
-
project = angularJson.defaultProject;
|
|
123
|
+
else if (serverOutputPath) {
|
|
124
|
+
packageJson.dependencies || (packageJson.dependencies = {});
|
|
162
125
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
workspace.projects.forEach((value, key) => {
|
|
166
|
-
if (value.extensions.projectType === "application")
|
|
167
|
-
apps.push(key);
|
|
168
|
-
});
|
|
169
|
-
if (apps.length === 1)
|
|
170
|
-
project = apps[0];
|
|
126
|
+
else {
|
|
127
|
+
packageJson.dependencies = {};
|
|
171
128
|
}
|
|
172
|
-
if (
|
|
173
|
-
|
|
174
|
-
const workspaceProject = workspace.projects.get(project);
|
|
175
|
-
if (!workspaceProject)
|
|
176
|
-
throw new Error(`No project ${project} found.`);
|
|
177
|
-
const deployTargetDefinition = workspaceProject.targets.get("deploy");
|
|
178
|
-
if ((deployTargetDefinition === null || deployTargetDefinition === void 0 ? void 0 : deployTargetDefinition.builder) === "@angular/fire:deploy") {
|
|
179
|
-
const options = deployTargetDefinition.options;
|
|
180
|
-
if (typeof (options === null || options === void 0 ? void 0 : options.prerenderTarget) === "string")
|
|
181
|
-
prerenderTarget = targetFromTargetString(options.prerenderTarget);
|
|
182
|
-
if (typeof (options === null || options === void 0 ? void 0 : options.browserTarget) === "string")
|
|
183
|
-
browserTarget = targetFromTargetString(options.browserTarget);
|
|
184
|
-
if (typeof (options === null || options === void 0 ? void 0 : options.serverTarget) === "string")
|
|
185
|
-
serverTarget = targetFromTargetString(options.serverTarget);
|
|
186
|
-
if (!browserTarget)
|
|
187
|
-
throw new Error("ng-deploy is missing a browser target. Plase check your angular.json.");
|
|
188
|
-
if (prerenderTarget) {
|
|
189
|
-
const prerenderOptions = await architectHost.getOptionsForTarget(prerenderTarget);
|
|
190
|
-
if (targetStringFromTarget(browserTarget) !== (prerenderOptions === null || prerenderOptions === void 0 ? void 0 : prerenderOptions.browserTarget))
|
|
191
|
-
throw new Error("ng-deploy's browserTarget and prerender's browserTarget do not match. Please check your angular.json");
|
|
192
|
-
if (serverTarget && targetStringFromTarget(serverTarget) !== (prerenderOptions === null || prerenderOptions === void 0 ? void 0 : prerenderOptions.serverTarget))
|
|
193
|
-
throw new Error("ng-deploy's serverTarget and prerender's serverTarget do not match. Please check your angular.json");
|
|
194
|
-
if (!serverTarget)
|
|
195
|
-
console.warn("Treating the application as fully rendered. Add a serverTarget to your deploy target in angular.json to utilize server-side rendering.");
|
|
196
|
-
}
|
|
129
|
+
if (serveOptimizedImages) {
|
|
130
|
+
(_b = packageJson.dependencies)["sharp"] || (_b["sharp"] = constants_1.SHARP_VERSION);
|
|
197
131
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
const
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
throw new Error("Prerender serverTarget expected to be string, check your angular.json.");
|
|
215
|
-
serverTarget = targetFromTargetString(production.serverTarget);
|
|
132
|
+
let bootstrapScript;
|
|
133
|
+
if (browserLocales) {
|
|
134
|
+
const locales = serverLocales === null || serverLocales === void 0 ? void 0 : serverLocales.filter((it) => browserLocales.includes(it));
|
|
135
|
+
bootstrapScript = `const localizedApps = new Map();
|
|
136
|
+
const ffi18n = import("firebase-frameworks/i18n");
|
|
137
|
+
exports.handle = function(req,res) {
|
|
138
|
+
ffi18n.then(({ getPreferredLocale }) => {
|
|
139
|
+
const locale = ${locales
|
|
140
|
+
? `getPreferredLocale(req, ${JSON.stringify(locales)}, ${JSON.stringify(defaultLocale)})`
|
|
141
|
+
: `""`};
|
|
142
|
+
if (localizedApps.has(locale)) {
|
|
143
|
+
localizedApps.get(locale)(req,res);
|
|
144
|
+
} else {
|
|
145
|
+
const app = require(\`./${serverOutputPath}/\${locale}/main.js\`).app(locale);
|
|
146
|
+
localizedApps.set(locale, app);
|
|
147
|
+
app(req,res);
|
|
216
148
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
const target = workspaceProject.targets.get("build");
|
|
220
|
-
const configurations = Object.keys(target.configurations);
|
|
221
|
-
const configuration = configurations.includes("production")
|
|
222
|
-
? "production"
|
|
223
|
-
: target.defaultConfiguration;
|
|
224
|
-
if (!configuration)
|
|
225
|
-
throw new Error("No production or default configutation found for build.");
|
|
226
|
-
if (configuration !== "production")
|
|
227
|
-
console.warn(`Using ${configuration} configuration for the browser deploy, we suggest adding a production target.`);
|
|
228
|
-
browserTarget = { project, target: "build", configuration };
|
|
229
|
-
}
|
|
230
|
-
if (workspaceProject.targets.has("server")) {
|
|
231
|
-
const target = workspaceProject.targets.get("server");
|
|
232
|
-
const configurations = Object.keys(target.configurations);
|
|
233
|
-
const configuration = configurations.includes("production")
|
|
234
|
-
? "production"
|
|
235
|
-
: target.defaultConfiguration;
|
|
236
|
-
if (!configuration)
|
|
237
|
-
throw new Error("No production or default configutation found for server.");
|
|
238
|
-
if (configuration !== "production")
|
|
239
|
-
console.warn(`Using ${configuration} configuration for the server deploy, we suggest adding a production target.`);
|
|
240
|
-
serverTarget = { project, target: "server", configuration };
|
|
241
|
-
}
|
|
149
|
+
});
|
|
150
|
+
};\n`;
|
|
242
151
|
}
|
|
243
|
-
if (
|
|
244
|
-
|
|
245
|
-
const configurations = Object.keys(target.configurations);
|
|
246
|
-
const configuration = configurations.includes("development")
|
|
247
|
-
? "development"
|
|
248
|
-
: target.defaultConfiguration;
|
|
249
|
-
if (!configuration)
|
|
250
|
-
throw new Error("No development or default configutation found for serve-ssr.");
|
|
251
|
-
if (configuration !== "development")
|
|
252
|
-
console.warn(`Using ${configuration} configuration for the local server, we suggest adding a development target.`);
|
|
253
|
-
serveTarget = { project, target: "serve-ssr", configuration };
|
|
152
|
+
else if (serverOutputPath) {
|
|
153
|
+
bootstrapScript = `exports.handle = require('./${serverOutputPath}/main.js').app();\n`;
|
|
254
154
|
}
|
|
255
|
-
else
|
|
256
|
-
|
|
257
|
-
console.warn(`No server-ssr target found.`);
|
|
258
|
-
const target = workspaceProject.targets.get("serve");
|
|
259
|
-
const configurations = Object.keys(target.configurations);
|
|
260
|
-
const configuration = configurations.includes("development")
|
|
261
|
-
? "development"
|
|
262
|
-
: target.defaultConfiguration;
|
|
263
|
-
if (!configuration)
|
|
264
|
-
throw new Error("No development or default configutation found for serve.");
|
|
265
|
-
if (configuration !== "development")
|
|
266
|
-
console.warn(`Using ${configuration} configuration for the local server, we suggest adding a development target.`);
|
|
267
|
-
serveTarget = { project, target: "serve", configuration };
|
|
155
|
+
else {
|
|
156
|
+
bootstrapScript = `exports.handle = (res, req) => req.sendStatus(404);\n`;
|
|
268
157
|
}
|
|
269
|
-
return {
|
|
270
|
-
architect,
|
|
271
|
-
architectHost,
|
|
272
|
-
host,
|
|
273
|
-
browserTarget,
|
|
274
|
-
prerenderTarget,
|
|
275
|
-
serverTarget,
|
|
276
|
-
serveTarget,
|
|
277
|
-
};
|
|
158
|
+
return { bootstrapScript, packageJson, baseUrl, dotEnv };
|
|
278
159
|
}
|
|
160
|
+
exports.ɵcodegenFunctionsDirectory = ɵcodegenFunctionsDirectory;
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getBuildConfig = exports.getServerConfig = exports.getBrowserConfig = exports.getContext = void 0;
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const error_1 = require("../../error");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
async function localesForTarget(dir, architectHost, target, workspaceProject) {
|
|
8
|
+
var _a;
|
|
9
|
+
const { targetStringFromTarget } = (0, utils_1.relativeRequire)(dir, "@angular-devkit/architect");
|
|
10
|
+
const targetOptions = await architectHost.getOptionsForTarget(target);
|
|
11
|
+
if (!targetOptions)
|
|
12
|
+
throw new error_1.FirebaseError(`Couldn't find options for ${targetStringFromTarget(target)}.`);
|
|
13
|
+
let locales = undefined;
|
|
14
|
+
let defaultLocale = undefined;
|
|
15
|
+
if (targetOptions.localize) {
|
|
16
|
+
const i18n = (_a = workspaceProject.extensions) === null || _a === void 0 ? void 0 : _a.i18n;
|
|
17
|
+
if (!i18n)
|
|
18
|
+
throw new error_1.FirebaseError(`No i18n config on project.`);
|
|
19
|
+
if (typeof i18n.sourceLocale === "string") {
|
|
20
|
+
throw new error_1.FirebaseError(`All your i18n locales must have a baseHref of "" on Firebase, use an object for sourceLocale in your angular.json:
|
|
21
|
+
"i18n": {
|
|
22
|
+
"sourceLocale": {
|
|
23
|
+
"code": "${i18n.sourceLocale}",
|
|
24
|
+
"baseHref": ""
|
|
25
|
+
},
|
|
26
|
+
...
|
|
27
|
+
}`);
|
|
28
|
+
}
|
|
29
|
+
if (i18n.sourceLocale.baseHref !== "")
|
|
30
|
+
throw new error_1.FirebaseError('All your i18n locales must have a baseHref of "" on Firebase, errored on sourceLocale.');
|
|
31
|
+
defaultLocale = i18n.sourceLocale.code;
|
|
32
|
+
if (targetOptions.localize === true) {
|
|
33
|
+
locales = [defaultLocale];
|
|
34
|
+
for (const [locale, { baseHref }] of Object.entries(i18n.locales)) {
|
|
35
|
+
if (baseHref !== "")
|
|
36
|
+
throw new error_1.FirebaseError(`All your i18n locales must have a baseHref of \"\" on Firebase, errored on ${locale}.`);
|
|
37
|
+
locales.push(locale);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else if (Array.isArray(targetOptions.localize)) {
|
|
41
|
+
locales = [defaultLocale];
|
|
42
|
+
for (const locale of targetOptions.localize) {
|
|
43
|
+
if (typeof locale !== "string")
|
|
44
|
+
continue;
|
|
45
|
+
locales.push(locale);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
(0, utils_1.validateLocales)(locales);
|
|
50
|
+
return { locales, defaultLocale };
|
|
51
|
+
}
|
|
52
|
+
async function getContext(dir) {
|
|
53
|
+
const { NodeJsAsyncHost } = (0, utils_1.relativeRequire)(dir, "@angular-devkit/core/node");
|
|
54
|
+
const { workspaces } = (0, utils_1.relativeRequire)(dir, "@angular-devkit/core");
|
|
55
|
+
const { WorkspaceNodeModulesArchitectHost } = (0, utils_1.relativeRequire)(dir, "@angular-devkit/architect/node");
|
|
56
|
+
const { Architect, targetFromTargetString, targetStringFromTarget } = (0, utils_1.relativeRequire)(dir, "@angular-devkit/architect");
|
|
57
|
+
const { parse } = (0, utils_1.relativeRequire)(dir, "jsonc-parser");
|
|
58
|
+
const host = workspaces.createWorkspaceHost(new NodeJsAsyncHost());
|
|
59
|
+
const { workspace } = await workspaces.readWorkspace(dir, host);
|
|
60
|
+
const architectHost = new WorkspaceNodeModulesArchitectHost(workspace, dir);
|
|
61
|
+
const architect = new Architect(architectHost);
|
|
62
|
+
let project = globalThis.NG_DEPLOY_PROJECT;
|
|
63
|
+
let browserTarget;
|
|
64
|
+
let serverTarget;
|
|
65
|
+
let prerenderTarget;
|
|
66
|
+
let serveTarget;
|
|
67
|
+
let serveOptimizedImages = false;
|
|
68
|
+
if (!project) {
|
|
69
|
+
const angularJson = parse(await host.readFile((0, path_1.join)(dir, "angular.json")));
|
|
70
|
+
project = angularJson.defaultProject;
|
|
71
|
+
}
|
|
72
|
+
if (!project) {
|
|
73
|
+
const apps = [];
|
|
74
|
+
workspace.projects.forEach((value, key) => {
|
|
75
|
+
if (value.extensions.projectType === "application")
|
|
76
|
+
apps.push(key);
|
|
77
|
+
});
|
|
78
|
+
if (apps.length === 1)
|
|
79
|
+
project = apps[0];
|
|
80
|
+
}
|
|
81
|
+
if (!project)
|
|
82
|
+
throw new error_1.FirebaseError("Unable to determine the application to deploy, you should use `ng deploy` via @angular/fire.");
|
|
83
|
+
const workspaceProject = workspace.projects.get(project);
|
|
84
|
+
if (!workspaceProject)
|
|
85
|
+
throw new error_1.FirebaseError(`No project ${project} found.`);
|
|
86
|
+
const deployTargetDefinition = workspaceProject.targets.get("deploy");
|
|
87
|
+
if ((deployTargetDefinition === null || deployTargetDefinition === void 0 ? void 0 : deployTargetDefinition.builder) === "@angular/fire:deploy") {
|
|
88
|
+
const options = deployTargetDefinition.options;
|
|
89
|
+
if (typeof (options === null || options === void 0 ? void 0 : options.prerenderTarget) === "string")
|
|
90
|
+
prerenderTarget = targetFromTargetString(options.prerenderTarget);
|
|
91
|
+
if (typeof (options === null || options === void 0 ? void 0 : options.browserTarget) === "string")
|
|
92
|
+
browserTarget = targetFromTargetString(options.browserTarget);
|
|
93
|
+
if (typeof (options === null || options === void 0 ? void 0 : options.serverTarget) === "string")
|
|
94
|
+
serverTarget = targetFromTargetString(options.serverTarget);
|
|
95
|
+
if (options === null || options === void 0 ? void 0 : options.serveOptimizedImages) {
|
|
96
|
+
serveOptimizedImages = true;
|
|
97
|
+
}
|
|
98
|
+
if (!browserTarget)
|
|
99
|
+
throw new Error("ng-deploy is missing a browser target. Plase check your angular.json.");
|
|
100
|
+
if (prerenderTarget) {
|
|
101
|
+
const prerenderOptions = await architectHost.getOptionsForTarget(prerenderTarget);
|
|
102
|
+
if (targetStringFromTarget(browserTarget) !== (prerenderOptions === null || prerenderOptions === void 0 ? void 0 : prerenderOptions.browserTarget))
|
|
103
|
+
throw new Error("ng-deploy's browserTarget and prerender's browserTarget do not match. Please check your angular.json");
|
|
104
|
+
if (serverTarget && targetStringFromTarget(serverTarget) !== (prerenderOptions === null || prerenderOptions === void 0 ? void 0 : prerenderOptions.serverTarget))
|
|
105
|
+
throw new Error("ng-deploy's serverTarget and prerender's serverTarget do not match. Please check your angular.json");
|
|
106
|
+
if (!serverTarget)
|
|
107
|
+
console.warn("Treating the application as fully rendered. Add a serverTarget to your deploy target in angular.json to utilize server-side rendering.");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else if (workspaceProject.targets.has("prerender")) {
|
|
111
|
+
const target = workspaceProject.targets.get("prerender");
|
|
112
|
+
const configurations = Object.keys(target.configurations);
|
|
113
|
+
const configuration = configurations.includes("production")
|
|
114
|
+
? "production"
|
|
115
|
+
: target.defaultConfiguration;
|
|
116
|
+
if (!configuration)
|
|
117
|
+
throw new Error("No production or default configutation found for prerender.");
|
|
118
|
+
if (configuration !== "production")
|
|
119
|
+
console.warn(`Using ${configuration} configuration for the prerender, we suggest adding a production target.`);
|
|
120
|
+
prerenderTarget = { project, target: "prerender", configuration };
|
|
121
|
+
const production = await architectHost.getOptionsForTarget(prerenderTarget);
|
|
122
|
+
if (typeof (production === null || production === void 0 ? void 0 : production.browserTarget) !== "string")
|
|
123
|
+
throw new Error("Prerender browserTarget expected to be string, check your angular.json.");
|
|
124
|
+
browserTarget = targetFromTargetString(production.browserTarget);
|
|
125
|
+
if (typeof (production === null || production === void 0 ? void 0 : production.serverTarget) !== "string")
|
|
126
|
+
throw new Error("Prerender serverTarget expected to be string, check your angular.json.");
|
|
127
|
+
serverTarget = targetFromTargetString(production.serverTarget);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
if (workspaceProject.targets.has("build")) {
|
|
131
|
+
const target = workspaceProject.targets.get("build");
|
|
132
|
+
const configurations = Object.keys(target.configurations);
|
|
133
|
+
const configuration = configurations.includes("production")
|
|
134
|
+
? "production"
|
|
135
|
+
: target.defaultConfiguration;
|
|
136
|
+
if (!configuration)
|
|
137
|
+
throw new Error("No production or default configutation found for build.");
|
|
138
|
+
if (configuration !== "production")
|
|
139
|
+
console.warn(`Using ${configuration} configuration for the browser deploy, we suggest adding a production target.`);
|
|
140
|
+
browserTarget = { project, target: "build", configuration };
|
|
141
|
+
}
|
|
142
|
+
if (workspaceProject.targets.has("server")) {
|
|
143
|
+
const target = workspaceProject.targets.get("server");
|
|
144
|
+
const configurations = Object.keys(target.configurations);
|
|
145
|
+
const configuration = configurations.includes("production")
|
|
146
|
+
? "production"
|
|
147
|
+
: target.defaultConfiguration;
|
|
148
|
+
if (!configuration)
|
|
149
|
+
throw new Error("No production or default configutation found for server.");
|
|
150
|
+
if (configuration !== "production")
|
|
151
|
+
console.warn(`Using ${configuration} configuration for the server deploy, we suggest adding a production target.`);
|
|
152
|
+
serverTarget = { project, target: "server", configuration };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (serverTarget && workspaceProject.targets.has("serve-ssr")) {
|
|
156
|
+
const target = workspaceProject.targets.get("serve-ssr");
|
|
157
|
+
const configurations = Object.keys(target.configurations);
|
|
158
|
+
const configuration = configurations.includes("development")
|
|
159
|
+
? "development"
|
|
160
|
+
: target.defaultConfiguration;
|
|
161
|
+
if (!configuration)
|
|
162
|
+
throw new Error("No development or default configutation found for serve-ssr.");
|
|
163
|
+
if (configuration !== "development")
|
|
164
|
+
console.warn(`Using ${configuration} configuration for the local server, we suggest adding a development target.`);
|
|
165
|
+
serveTarget = { project, target: "serve-ssr", configuration };
|
|
166
|
+
}
|
|
167
|
+
else if (workspaceProject.targets.has("serve")) {
|
|
168
|
+
if (serverTarget)
|
|
169
|
+
console.warn(`No server-ssr target found.`);
|
|
170
|
+
const target = workspaceProject.targets.get("serve");
|
|
171
|
+
const configurations = Object.keys(target.configurations);
|
|
172
|
+
const configuration = configurations.includes("development")
|
|
173
|
+
? "development"
|
|
174
|
+
: target.defaultConfiguration;
|
|
175
|
+
if (!configuration)
|
|
176
|
+
throw new Error("No development or default configutation found for serve.");
|
|
177
|
+
if (configuration !== "development")
|
|
178
|
+
console.warn(`Using ${configuration} configuration for the local server, we suggest adding a development target.`);
|
|
179
|
+
serveTarget = { project, target: "serve", configuration };
|
|
180
|
+
}
|
|
181
|
+
if (!browserTarget)
|
|
182
|
+
throw new error_1.FirebaseError(`No browser target on ${project}`);
|
|
183
|
+
const browserTargetOptions = await architectHost.getOptionsForTarget(browserTarget);
|
|
184
|
+
if (!browserTargetOptions) {
|
|
185
|
+
throw new error_1.FirebaseError(`Couldn't find options for ${targetStringFromTarget(browserTarget)}.`);
|
|
186
|
+
}
|
|
187
|
+
const baseHref = browserTargetOptions.baseHref || "";
|
|
188
|
+
if (typeof baseHref !== "string") {
|
|
189
|
+
throw new error_1.FirebaseError(`baseHref on ${targetStringFromTarget(browserTarget)} was not a string`);
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
architect,
|
|
193
|
+
architectHost,
|
|
194
|
+
baseHref,
|
|
195
|
+
host,
|
|
196
|
+
browserTarget,
|
|
197
|
+
prerenderTarget,
|
|
198
|
+
serverTarget,
|
|
199
|
+
serveTarget,
|
|
200
|
+
workspaceProject,
|
|
201
|
+
serveOptimizedImages,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
exports.getContext = getContext;
|
|
205
|
+
async function getBrowserConfig(sourceDir) {
|
|
206
|
+
const { architectHost, browserTarget, baseHref, workspaceProject } = await getContext(sourceDir);
|
|
207
|
+
const { locales, defaultLocale } = await localesForTarget(sourceDir, architectHost, browserTarget, workspaceProject);
|
|
208
|
+
const browserTargetOptions = await architectHost.getOptionsForTarget(browserTarget);
|
|
209
|
+
if (typeof (browserTargetOptions === null || browserTargetOptions === void 0 ? void 0 : browserTargetOptions.outputPath) !== "string")
|
|
210
|
+
throw new Error("browserTarget output path is not a string");
|
|
211
|
+
const outputPath = browserTargetOptions.outputPath;
|
|
212
|
+
return { locales, baseHref, outputPath, defaultLocale };
|
|
213
|
+
}
|
|
214
|
+
exports.getBrowserConfig = getBrowserConfig;
|
|
215
|
+
async function getServerConfig(sourceDir) {
|
|
216
|
+
var _a;
|
|
217
|
+
const { architectHost, host, serverTarget, browserTarget, baseHref, workspaceProject, serveOptimizedImages, } = await getContext(sourceDir);
|
|
218
|
+
const browserTargetOptions = await architectHost.getOptionsForTarget(browserTarget);
|
|
219
|
+
if (typeof (browserTargetOptions === null || browserTargetOptions === void 0 ? void 0 : browserTargetOptions.outputPath) !== "string")
|
|
220
|
+
throw new Error("browserTarget output path is not a string");
|
|
221
|
+
const browserOutputPath = browserTargetOptions.outputPath;
|
|
222
|
+
const packageJson = JSON.parse(await host.readFile((0, path_1.join)(sourceDir, "package.json")));
|
|
223
|
+
if (!serverTarget) {
|
|
224
|
+
return {
|
|
225
|
+
packageJson,
|
|
226
|
+
browserOutputPath,
|
|
227
|
+
serverOutputPath: undefined,
|
|
228
|
+
baseHref,
|
|
229
|
+
bundleDependencies: false,
|
|
230
|
+
externalDependencies: [],
|
|
231
|
+
serverLocales: [],
|
|
232
|
+
browserLocales: undefined,
|
|
233
|
+
defaultLocale: undefined,
|
|
234
|
+
serveOptimizedImages,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
const { locales: serverLocales, defaultLocale } = await localesForTarget(sourceDir, architectHost, serverTarget, workspaceProject);
|
|
238
|
+
const serverTargetOptions = await architectHost.getOptionsForTarget(serverTarget);
|
|
239
|
+
if (typeof (serverTargetOptions === null || serverTargetOptions === void 0 ? void 0 : serverTargetOptions.outputPath) !== "string")
|
|
240
|
+
throw new Error("serverTarget output path is not a string");
|
|
241
|
+
const serverOutputPath = serverTargetOptions.outputPath;
|
|
242
|
+
if (serverLocales && !defaultLocale) {
|
|
243
|
+
throw new error_1.FirebaseError("It's required that your source locale to be one of the localize options");
|
|
244
|
+
}
|
|
245
|
+
const externalDependencies = serverTargetOptions.externalDependencies || [];
|
|
246
|
+
const bundleDependencies = (_a = serverTargetOptions.bundleDependencies) !== null && _a !== void 0 ? _a : true;
|
|
247
|
+
const { locales: browserLocales } = await localesForTarget(sourceDir, architectHost, browserTarget, workspaceProject);
|
|
248
|
+
return {
|
|
249
|
+
packageJson,
|
|
250
|
+
browserOutputPath,
|
|
251
|
+
serverOutputPath,
|
|
252
|
+
baseHref,
|
|
253
|
+
bundleDependencies,
|
|
254
|
+
externalDependencies,
|
|
255
|
+
serverLocales,
|
|
256
|
+
browserLocales,
|
|
257
|
+
defaultLocale,
|
|
258
|
+
serveOptimizedImages,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
exports.getServerConfig = getServerConfig;
|
|
262
|
+
async function getBuildConfig(sourceDir) {
|
|
263
|
+
const { targetStringFromTarget } = (0, utils_1.relativeRequire)(sourceDir, "@angular-devkit/architect");
|
|
264
|
+
const { browserTarget, prerenderTarget, serverTarget, architectHost, workspaceProject, serveOptimizedImages, } = await getContext(sourceDir);
|
|
265
|
+
const targets = (prerenderTarget ? [prerenderTarget] : [browserTarget, serverTarget].filter((it) => !!it)).map((it) => targetStringFromTarget(it));
|
|
266
|
+
const locales = await localesForTarget(sourceDir, architectHost, browserTarget, workspaceProject);
|
|
267
|
+
return {
|
|
268
|
+
targets,
|
|
269
|
+
serverTarget,
|
|
270
|
+
locales,
|
|
271
|
+
serveOptimizedImages,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
exports.getBuildConfig = getBuildConfig;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WebFrameworks = exports.ALLOWED_SSR_REGIONS = exports.DEFAULT_REGION = exports.VALID_ENGINES = exports.NODE_VERSION = exports.FIREBASE_ADMIN_VERSION = exports.FIREBASE_FUNCTIONS_VERSION = exports.FIREBASE_FRAMEWORKS_VERSION = exports.MAILING_LIST_URL = exports.FEATURE_REQUEST_URL = exports.FILE_BUG_URL = exports.DEFAULT_DOCS_URL = exports.SupportLevelWarnings = exports.NPM_COMMAND_TIMEOUT_MILLIES = void 0;
|
|
3
|
+
exports.WebFrameworks = exports.I18N_ROOT = exports.ALLOWED_SSR_REGIONS = exports.DEFAULT_REGION = exports.VALID_LOCALE_FORMATS = exports.VALID_ENGINES = exports.NODE_VERSION = exports.SHARP_VERSION = exports.FIREBASE_ADMIN_VERSION = exports.FIREBASE_FUNCTIONS_VERSION = exports.FIREBASE_FRAMEWORKS_VERSION = exports.MAILING_LIST_URL = exports.FEATURE_REQUEST_URL = exports.FILE_BUG_URL = exports.DEFAULT_DOCS_URL = exports.SupportLevelWarnings = exports.NPM_COMMAND_TIMEOUT_MILLIES = void 0;
|
|
4
4
|
const fs_1 = require("fs");
|
|
5
5
|
const path_1 = require("path");
|
|
6
6
|
const clc = require("colorette");
|
|
@@ -16,11 +16,13 @@ exports.DEFAULT_DOCS_URL = "https://firebase.google.com/docs/hosting/frameworks/
|
|
|
16
16
|
exports.FILE_BUG_URL = "https://github.com/firebase/firebase-tools/issues/new?template=bug_report.md";
|
|
17
17
|
exports.FEATURE_REQUEST_URL = "https://github.com/firebase/firebase-tools/issues/new?template=feature_request.md";
|
|
18
18
|
exports.MAILING_LIST_URL = "https://goo.gle/41enW5X";
|
|
19
|
-
exports.FIREBASE_FRAMEWORKS_VERSION = "^0.
|
|
19
|
+
exports.FIREBASE_FRAMEWORKS_VERSION = "^0.10.1";
|
|
20
20
|
exports.FIREBASE_FUNCTIONS_VERSION = "^4.3.0";
|
|
21
21
|
exports.FIREBASE_ADMIN_VERSION = "^11.0.1";
|
|
22
|
+
exports.SHARP_VERSION = "^0.32.1";
|
|
22
23
|
exports.NODE_VERSION = parseInt(process.versions.node, 10);
|
|
23
24
|
exports.VALID_ENGINES = { node: [16, 18] };
|
|
25
|
+
exports.VALID_LOCALE_FORMATS = [/^ALL_[a-z]+$/, /^[a-z]+_ALL$/, /^[a-z]+(_[a-z]+)?$/];
|
|
24
26
|
exports.DEFAULT_REGION = "us-central1";
|
|
25
27
|
exports.ALLOWED_SSR_REGIONS = [
|
|
26
28
|
{ name: "us-central1 (Iowa)", value: "us-central1" },
|
|
@@ -29,6 +31,7 @@ exports.ALLOWED_SSR_REGIONS = [
|
|
|
29
31
|
{ name: "europe-west1 (Belgium)", value: "europe-west1" },
|
|
30
32
|
{ name: "asia-east1 (Taiwan)", value: "asia-east1" },
|
|
31
33
|
];
|
|
34
|
+
exports.I18N_ROOT = "/";
|
|
32
35
|
exports.WebFrameworks = Object.fromEntries((0, fs_1.readdirSync)(__dirname)
|
|
33
36
|
.filter((path) => (0, fs_1.statSync)((0, path_1.join)(__dirname, path)).isDirectory())
|
|
34
37
|
.map((path) => {
|