first commit

This commit is contained in:
2024-01-19 11:09:11 +01:00
commit b18af7a943
29473 changed files with 4500547 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import type { CommandContext } from '../command-builder/command-module';
import { EventCustomDimension, EventCustomMetric, PrimitiveTypes } from './analytics-parameters';
export declare class AnalyticsCollector {
private context;
private trackingEventsQueue;
private readonly requestParameterStringified;
private readonly userParameters;
constructor(context: CommandContext, userId: string);
reportWorkspaceInfoEvent(parameters: Partial<Record<EventCustomMetric, string | boolean | number | undefined>>): void;
reportRebuildRunEvent(parameters: Partial<Record<EventCustomMetric & EventCustomDimension, string | boolean | number | undefined>>): void;
reportBuildRunEvent(parameters: Partial<Record<EventCustomMetric & EventCustomDimension, string | boolean | number | undefined>>): void;
reportArchitectRunEvent(parameters: Partial<Record<EventCustomDimension, PrimitiveTypes>>): void;
reportSchematicRunEvent(parameters: Partial<Record<EventCustomDimension, PrimitiveTypes>>): void;
reportCommandRunEvent(command: string): void;
private event;
/**
* Flush on an interval (if the event loop is waiting).
*
* @returns a method that when called will terminate the periodic
* flush and call flush one last time.
*/
periodFlush(): () => Promise<void>;
flush(): Promise<void>;
private send;
}

View File

@@ -0,0 +1,184 @@
"use strict";
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AnalyticsCollector = void 0;
const crypto_1 = require("crypto");
const https = __importStar(require("https"));
const os = __importStar(require("os"));
const querystring = __importStar(require("querystring"));
const semver = __importStar(require("semver"));
const environment_options_1 = require("../utilities/environment-options");
const error_1 = require("../utilities/error");
const version_1 = require("../utilities/version");
const analytics_parameters_1 = require("./analytics-parameters");
const TRACKING_ID_PROD = 'G-VETNJBW8L4';
const TRACKING_ID_STAGING = 'G-TBMPRL1BTM';
class AnalyticsCollector {
context;
trackingEventsQueue;
requestParameterStringified;
userParameters;
constructor(context, userId) {
this.context = context;
const requestParameters = {
[analytics_parameters_1.RequestParameter.ProtocolVersion]: 2,
[analytics_parameters_1.RequestParameter.ClientId]: userId,
[analytics_parameters_1.RequestParameter.UserId]: userId,
[analytics_parameters_1.RequestParameter.TrackingId]: /^\d+\.\d+\.\d+$/.test(version_1.VERSION.full) && version_1.VERSION.full !== '0.0.0'
? TRACKING_ID_PROD
: TRACKING_ID_STAGING,
// Built-in user properties
[analytics_parameters_1.RequestParameter.SessionId]: (0, crypto_1.randomUUID)(),
[analytics_parameters_1.RequestParameter.UserAgentArchitecture]: os.arch(),
[analytics_parameters_1.RequestParameter.UserAgentPlatform]: os.platform(),
[analytics_parameters_1.RequestParameter.UserAgentPlatformVersion]: os.release(),
[analytics_parameters_1.RequestParameter.UserAgentMobile]: 0,
[analytics_parameters_1.RequestParameter.SessionEngaged]: 1,
// The below is needed for tech details to be collected.
[analytics_parameters_1.RequestParameter.UserAgentFullVersionList]: 'Google%20Chrome;111.0.5563.64|Not(A%3ABrand;8.0.0.0|Chromium;111.0.5563.64',
};
if (environment_options_1.ngDebug) {
requestParameters[analytics_parameters_1.RequestParameter.DebugView] = 1;
}
this.requestParameterStringified = querystring.stringify(requestParameters);
const parsedVersion = semver.parse(process.version);
const packageManagerVersion = context.packageManager.version;
this.userParameters = {
// While architecture is being collect by GA as UserAgentArchitecture.
// It doesn't look like there is a way to query this. Therefore we collect this as a custom user dimension too.
[analytics_parameters_1.UserCustomDimension.OsArchitecture]: os.arch(),
// While User ID is being collected by GA, this is not visible in reports/for filtering.
[analytics_parameters_1.UserCustomDimension.UserId]: userId,
[analytics_parameters_1.UserCustomDimension.NodeVersion]: parsedVersion
? `${parsedVersion.major}.${parsedVersion.minor}.${parsedVersion.patch}`
: 'other',
[analytics_parameters_1.UserCustomDimension.NodeMajorVersion]: parsedVersion?.major,
[analytics_parameters_1.UserCustomDimension.PackageManager]: context.packageManager.name,
[analytics_parameters_1.UserCustomDimension.PackageManagerVersion]: packageManagerVersion,
[analytics_parameters_1.UserCustomDimension.PackageManagerMajorVersion]: packageManagerVersion
? +packageManagerVersion.split('.', 1)[0]
: undefined,
[analytics_parameters_1.UserCustomDimension.AngularCLIVersion]: version_1.VERSION.full,
[analytics_parameters_1.UserCustomDimension.AngularCLIMajorVersion]: version_1.VERSION.major,
};
}
reportWorkspaceInfoEvent(parameters) {
this.event('workspace_info', parameters);
}
reportRebuildRunEvent(parameters) {
this.event('run_rebuild', parameters);
}
reportBuildRunEvent(parameters) {
this.event('run_build', parameters);
}
reportArchitectRunEvent(parameters) {
this.event('run_architect', parameters);
}
reportSchematicRunEvent(parameters) {
this.event('run_schematic', parameters);
}
reportCommandRunEvent(command) {
this.event('run_command', { [analytics_parameters_1.EventCustomDimension.Command]: command });
}
event(eventName, parameters) {
this.trackingEventsQueue ??= [];
this.trackingEventsQueue.push({
...this.userParameters,
...parameters,
'en': eventName,
});
}
/**
* Flush on an interval (if the event loop is waiting).
*
* @returns a method that when called will terminate the periodic
* flush and call flush one last time.
*/
periodFlush() {
let analyticsFlushPromise = Promise.resolve();
const analyticsFlushInterval = setInterval(() => {
if (this.trackingEventsQueue?.length) {
analyticsFlushPromise = analyticsFlushPromise.then(() => this.flush());
}
}, 4000);
return () => {
clearInterval(analyticsFlushInterval);
// Flush one last time.
return analyticsFlushPromise.then(() => this.flush());
};
}
async flush() {
const pendingTrackingEvents = this.trackingEventsQueue;
this.context.logger.debug(`Analytics flush size. ${pendingTrackingEvents?.length}.`);
if (!pendingTrackingEvents?.length) {
return;
}
// The below is needed so that if flush is called multiple times,
// we don't report the same event multiple times.
this.trackingEventsQueue = undefined;
try {
await this.send(pendingTrackingEvents);
}
catch (error) {
// Failure to report analytics shouldn't crash the CLI.
(0, error_1.assertIsError)(error);
this.context.logger.debug(`Send analytics error. ${error.message}.`);
}
}
async send(data) {
return new Promise((resolve, reject) => {
const request = https.request({
host: 'www.google-analytics.com',
method: 'POST',
path: '/g/collect?' + this.requestParameterStringified,
headers: {
// The below is needed for tech details to be collected even though we provide our own information from the OS Node.js module
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
},
}, (response) => {
// The below is needed as otherwise the response will never close which will cause the CLI not to terminate.
response.on('data', () => { });
if (response.statusCode !== 200 && response.statusCode !== 204) {
reject(new Error(`Analytics reporting failed with status code: ${response.statusCode}.`));
}
else {
resolve();
}
});
request.on('error', reject);
const queryParameters = data.map((p) => querystring.stringify(p)).join('\n');
request.write(queryParameters);
request.end();
});
}
}
exports.AnalyticsCollector = AnalyticsCollector;

View File

@@ -0,0 +1,100 @@
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
export type PrimitiveTypes = string | number | boolean;
/**
* GA built-in request parameters
* @see https://www.thyngster.com/ga4-measurement-protocol-cheatsheet
* @see http://go/depot/google3/analytics/container_tag/templates/common/gold/mpv2_schema.js
*/
export declare enum RequestParameter {
ClientId = "cid",
DebugView = "_dbg",
GtmVersion = "gtm",
Language = "ul",
NewToSite = "_nsi",
NonInteraction = "ni",
PageLocation = "dl",
PageTitle = "dt",
ProtocolVersion = "v",
SessionEngaged = "seg",
SessionId = "sid",
SessionNumber = "sct",
SessionStart = "_ss",
TrackingId = "tid",
TrafficType = "tt",
UserAgentArchitecture = "uaa",
UserAgentBitness = "uab",
UserAgentFullVersionList = "uafvl",
UserAgentMobile = "uamb",
UserAgentModel = "uam",
UserAgentPlatform = "uap",
UserAgentPlatformVersion = "uapv",
UserId = "uid"
}
/**
* User scoped custom dimensions.
* @notes
* - User custom dimensions limit is 25.
* - `up.*` string type.
* - `upn.*` number type.
* @see https://support.google.com/analytics/answer/10075209?hl=en
*/
export declare enum UserCustomDimension {
UserId = "up.ng_user_id",
OsArchitecture = "up.ng_os_architecture",
NodeVersion = "up.ng_node_version",
NodeMajorVersion = "upn.ng_node_major_version",
AngularCLIVersion = "up.ng_cli_version",
AngularCLIMajorVersion = "upn.ng_cli_major_version",
PackageManager = "up.ng_package_manager",
PackageManagerVersion = "up.ng_pkg_manager_version",
PackageManagerMajorVersion = "upn.ng_pkg_manager_major_v"
}
/**
* Event scoped custom dimensions.
* @notes
* - Event custom dimensions limit is 50.
* - `ep.*` string type.
* - `epn.*` number type.
* @see https://support.google.com/analytics/answer/10075209?hl=en
*/
export declare enum EventCustomDimension {
Command = "ep.ng_command",
SchematicCollectionName = "ep.ng_schematic_collection_name",
SchematicName = "ep.ng_schematic_name",
Standalone = "ep.ng_standalone",
SSR = "ep.ng_ssr",
Style = "ep.ng_style",
Routing = "ep.ng_routing",
InlineTemplate = "ep.ng_inline_template",
InlineStyle = "ep.ng_inline_style",
BuilderTarget = "ep.ng_builder_target",
Aot = "ep.ng_aot",
Optimization = "ep.ng_optimization"
}
/**
* Event scoped custom mertics.
* @notes
* - Event scoped custom mertics limit is 50.
* - `ep.*` string type.
* - `epn.*` number type.
* @see https://support.google.com/analytics/answer/10075209?hl=en
*/
export declare enum EventCustomMetric {
AllChunksCount = "epn.ng_all_chunks_count",
LazyChunksCount = "epn.ng_lazy_chunks_count",
InitialChunksCount = "epn.ng_initial_chunks_count",
ChangedChunksCount = "epn.ng_changed_chunks_count",
DurationInMs = "epn.ng_duration_ms",
CssSizeInBytes = "epn.ng_css_size_bytes",
JsSizeInBytes = "epn.ng_js_size_bytes",
NgComponentCount = "epn.ng_component_count",
AllProjectsCount = "epn.all_projects_count",
LibraryProjectsCount = "epn.libs_projects_count",
ApplicationProjectsCount = "epn.apps_projects_count"
}

View File

@@ -0,0 +1,106 @@
"use strict";
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventCustomMetric = exports.EventCustomDimension = exports.UserCustomDimension = exports.RequestParameter = void 0;
/**
* GA built-in request parameters
* @see https://www.thyngster.com/ga4-measurement-protocol-cheatsheet
* @see http://go/depot/google3/analytics/container_tag/templates/common/gold/mpv2_schema.js
*/
var RequestParameter;
(function (RequestParameter) {
RequestParameter["ClientId"] = "cid";
RequestParameter["DebugView"] = "_dbg";
RequestParameter["GtmVersion"] = "gtm";
RequestParameter["Language"] = "ul";
RequestParameter["NewToSite"] = "_nsi";
RequestParameter["NonInteraction"] = "ni";
RequestParameter["PageLocation"] = "dl";
RequestParameter["PageTitle"] = "dt";
RequestParameter["ProtocolVersion"] = "v";
RequestParameter["SessionEngaged"] = "seg";
RequestParameter["SessionId"] = "sid";
RequestParameter["SessionNumber"] = "sct";
RequestParameter["SessionStart"] = "_ss";
RequestParameter["TrackingId"] = "tid";
RequestParameter["TrafficType"] = "tt";
RequestParameter["UserAgentArchitecture"] = "uaa";
RequestParameter["UserAgentBitness"] = "uab";
RequestParameter["UserAgentFullVersionList"] = "uafvl";
RequestParameter["UserAgentMobile"] = "uamb";
RequestParameter["UserAgentModel"] = "uam";
RequestParameter["UserAgentPlatform"] = "uap";
RequestParameter["UserAgentPlatformVersion"] = "uapv";
RequestParameter["UserId"] = "uid";
})(RequestParameter || (exports.RequestParameter = RequestParameter = {}));
/**
* User scoped custom dimensions.
* @notes
* - User custom dimensions limit is 25.
* - `up.*` string type.
* - `upn.*` number type.
* @see https://support.google.com/analytics/answer/10075209?hl=en
*/
var UserCustomDimension;
(function (UserCustomDimension) {
UserCustomDimension["UserId"] = "up.ng_user_id";
UserCustomDimension["OsArchitecture"] = "up.ng_os_architecture";
UserCustomDimension["NodeVersion"] = "up.ng_node_version";
UserCustomDimension["NodeMajorVersion"] = "upn.ng_node_major_version";
UserCustomDimension["AngularCLIVersion"] = "up.ng_cli_version";
UserCustomDimension["AngularCLIMajorVersion"] = "upn.ng_cli_major_version";
UserCustomDimension["PackageManager"] = "up.ng_package_manager";
UserCustomDimension["PackageManagerVersion"] = "up.ng_pkg_manager_version";
UserCustomDimension["PackageManagerMajorVersion"] = "upn.ng_pkg_manager_major_v";
})(UserCustomDimension || (exports.UserCustomDimension = UserCustomDimension = {}));
/**
* Event scoped custom dimensions.
* @notes
* - Event custom dimensions limit is 50.
* - `ep.*` string type.
* - `epn.*` number type.
* @see https://support.google.com/analytics/answer/10075209?hl=en
*/
var EventCustomDimension;
(function (EventCustomDimension) {
EventCustomDimension["Command"] = "ep.ng_command";
EventCustomDimension["SchematicCollectionName"] = "ep.ng_schematic_collection_name";
EventCustomDimension["SchematicName"] = "ep.ng_schematic_name";
EventCustomDimension["Standalone"] = "ep.ng_standalone";
EventCustomDimension["SSR"] = "ep.ng_ssr";
EventCustomDimension["Style"] = "ep.ng_style";
EventCustomDimension["Routing"] = "ep.ng_routing";
EventCustomDimension["InlineTemplate"] = "ep.ng_inline_template";
EventCustomDimension["InlineStyle"] = "ep.ng_inline_style";
EventCustomDimension["BuilderTarget"] = "ep.ng_builder_target";
EventCustomDimension["Aot"] = "ep.ng_aot";
EventCustomDimension["Optimization"] = "ep.ng_optimization";
})(EventCustomDimension || (exports.EventCustomDimension = EventCustomDimension = {}));
/**
* Event scoped custom mertics.
* @notes
* - Event scoped custom mertics limit is 50.
* - `ep.*` string type.
* - `epn.*` number type.
* @see https://support.google.com/analytics/answer/10075209?hl=en
*/
var EventCustomMetric;
(function (EventCustomMetric) {
EventCustomMetric["AllChunksCount"] = "epn.ng_all_chunks_count";
EventCustomMetric["LazyChunksCount"] = "epn.ng_lazy_chunks_count";
EventCustomMetric["InitialChunksCount"] = "epn.ng_initial_chunks_count";
EventCustomMetric["ChangedChunksCount"] = "epn.ng_changed_chunks_count";
EventCustomMetric["DurationInMs"] = "epn.ng_duration_ms";
EventCustomMetric["CssSizeInBytes"] = "epn.ng_css_size_bytes";
EventCustomMetric["JsSizeInBytes"] = "epn.ng_js_size_bytes";
EventCustomMetric["NgComponentCount"] = "epn.ng_component_count";
EventCustomMetric["AllProjectsCount"] = "epn.all_projects_count";
EventCustomMetric["LibraryProjectsCount"] = "epn.libs_projects_count";
EventCustomMetric["ApplicationProjectsCount"] = "epn.apps_projects_count";
})(EventCustomMetric || (exports.EventCustomMetric = EventCustomMetric = {}));

27
node_modules/@angular/cli/src/analytics/analytics.d.ts generated vendored Executable file
View File

@@ -0,0 +1,27 @@
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import type { CommandContext } from '../command-builder/command-module';
/**
* This is the ultimate safelist for checking if a package name is safe to report to analytics.
*/
export declare const analyticsPackageSafelist: (string | RegExp)[];
export declare function isPackageNameSafeForAnalytics(name: string): boolean;
/**
* Set analytics settings. This does not work if the user is not inside a project.
* @param global Which config to use. "global" for user-level, and "local" for project-level.
* @param value Either a user ID, true to generate a new User ID, or false to disable analytics.
*/
export declare function setAnalyticsConfig(global: boolean, value: string | boolean): Promise<void>;
/**
* Prompt the user for usage gathering permission.
* @param force Whether to ask regardless of whether or not the user is using an interactive shell.
* @return Whether or not the user was shown a prompt.
*/
export declare function promptAnalytics(context: CommandContext, global: boolean, force?: boolean): Promise<boolean>;
export declare function getAnalyticsUserId(context: CommandContext, skipPrompt?: boolean): Promise<string | undefined>;
export declare function getAnalyticsInfoString(context: CommandContext): Promise<string>;

190
node_modules/@angular/cli/src/analytics/analytics.js generated vendored Executable file
View File

@@ -0,0 +1,190 @@
"use strict";
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.getAnalyticsInfoString = exports.getAnalyticsUserId = exports.promptAnalytics = exports.setAnalyticsConfig = exports.isPackageNameSafeForAnalytics = exports.analyticsPackageSafelist = void 0;
const core_1 = require("@angular-devkit/core");
const crypto_1 = require("crypto");
const color_1 = require("../utilities/color");
const config_1 = require("../utilities/config");
const environment_options_1 = require("../utilities/environment-options");
const load_esm_1 = require("../utilities/load-esm");
const tty_1 = require("../utilities/tty");
/* eslint-disable no-console */
/**
* This is the ultimate safelist for checking if a package name is safe to report to analytics.
*/
exports.analyticsPackageSafelist = [
/^@angular\//,
/^@angular-devkit\//,
/^@nguniversal\//,
'@schematics/angular',
];
function isPackageNameSafeForAnalytics(name) {
return exports.analyticsPackageSafelist.some((pattern) => {
if (typeof pattern == 'string') {
return pattern === name;
}
else {
return pattern.test(name);
}
});
}
exports.isPackageNameSafeForAnalytics = isPackageNameSafeForAnalytics;
/**
* Set analytics settings. This does not work if the user is not inside a project.
* @param global Which config to use. "global" for user-level, and "local" for project-level.
* @param value Either a user ID, true to generate a new User ID, or false to disable analytics.
*/
async function setAnalyticsConfig(global, value) {
const level = global ? 'global' : 'local';
const workspace = await (0, config_1.getWorkspace)(level);
if (!workspace) {
throw new Error(`Could not find ${level} workspace.`);
}
const cli = (workspace.extensions['cli'] ??= {});
if (!workspace || !core_1.json.isJsonObject(cli)) {
throw new Error(`Invalid config found at ${workspace.filePath}. CLI should be an object.`);
}
cli.analytics = value === true ? (0, crypto_1.randomUUID)() : value;
await workspace.save();
}
exports.setAnalyticsConfig = setAnalyticsConfig;
/**
* Prompt the user for usage gathering permission.
* @param force Whether to ask regardless of whether or not the user is using an interactive shell.
* @return Whether or not the user was shown a prompt.
*/
async function promptAnalytics(context, global, force = false) {
const level = global ? 'global' : 'local';
const workspace = await (0, config_1.getWorkspace)(level);
if (!workspace) {
throw new Error(`Could not find a ${level} workspace. Are you in a project?`);
}
if (force || (0, tty_1.isTTY)()) {
const { default: inquirer } = await (0, load_esm_1.loadEsmModule)('inquirer');
const answers = await inquirer.prompt([
{
type: 'confirm',
name: 'analytics',
message: core_1.tags.stripIndents `
Would you like to share pseudonymous usage data about this project with the Angular Team
at Google under Google's Privacy Policy at https://policies.google.com/privacy. For more
details and how to change this setting, see https://angular.io/analytics.
`,
default: false,
},
]);
await setAnalyticsConfig(global, answers.analytics);
if (answers.analytics) {
console.log('');
console.log(core_1.tags.stripIndent `
Thank you for sharing pseudonymous usage data. Should you change your mind, the following
command will disable this feature entirely:
${color_1.colors.yellow(`ng analytics disable${global ? ' --global' : ''}`)}
`);
console.log('');
}
process.stderr.write(await getAnalyticsInfoString(context));
return true;
}
return false;
}
exports.promptAnalytics = promptAnalytics;
/**
* Get the analytics user id.
*
* @returns
* - `string` user id.
* - `false` when disabled.
* - `undefined` when not configured.
*/
async function getAnalyticsUserIdForLevel(level) {
if (environment_options_1.analyticsDisabled) {
return false;
}
const workspace = await (0, config_1.getWorkspace)(level);
const analyticsConfig = workspace?.getCli()?.['analytics'];
if (analyticsConfig === false) {
return false;
}
else if (analyticsConfig === undefined || analyticsConfig === null) {
return undefined;
}
else {
if (typeof analyticsConfig == 'string') {
return analyticsConfig;
}
else if (typeof analyticsConfig == 'object' && typeof analyticsConfig['uid'] == 'string') {
return analyticsConfig['uid'];
}
return undefined;
}
}
async function getAnalyticsUserId(context, skipPrompt = false) {
const { workspace } = context;
// Global config takes precedence over local config only for the disabled check.
// IE:
// global: disabled & local: enabled = disabled
// global: id: 123 & local: id: 456 = 456
// check global
const globalConfig = await getAnalyticsUserIdForLevel('global');
if (globalConfig === false) {
return undefined;
}
// Not disabled globally, check locally or not set globally and command is run outside of workspace example: `ng new`
if (workspace || globalConfig === undefined) {
const level = workspace ? 'local' : 'global';
let localOrGlobalConfig = await getAnalyticsUserIdForLevel(level);
if (localOrGlobalConfig === undefined) {
if (!skipPrompt) {
// config is unset, prompt user.
// TODO: This should honor the `no-interactive` option.
// It is currently not an `ng` option but rather only an option for specific commands.
// The concept of `ng`-wide options are needed to cleanly handle this.
await promptAnalytics(context, !workspace /** global */);
localOrGlobalConfig = await getAnalyticsUserIdForLevel(level);
}
}
if (localOrGlobalConfig === false) {
return undefined;
}
else if (typeof localOrGlobalConfig === 'string') {
return localOrGlobalConfig;
}
}
return globalConfig;
}
exports.getAnalyticsUserId = getAnalyticsUserId;
function analyticsConfigValueToHumanFormat(value) {
if (value === false) {
return 'disabled';
}
else if (typeof value === 'string' || value === true) {
return 'enabled';
}
else {
return 'not set';
}
}
async function getAnalyticsInfoString(context) {
const analyticsInstance = await getAnalyticsUserId(context, true /** skipPrompt */);
const { globalConfiguration, workspace: localWorkspace } = context;
const globalSetting = globalConfiguration?.getCli()?.['analytics'];
const localSetting = localWorkspace?.getCli()?.['analytics'];
return (core_1.tags.stripIndents `
Global setting: ${analyticsConfigValueToHumanFormat(globalSetting)}
Local setting: ${localWorkspace
? analyticsConfigValueToHumanFormat(localSetting)
: 'No local workspace configuration file.'}
Effective status: ${analyticsInstance ? 'enabled' : 'disabled'}
` + '\n');
}
exports.getAnalyticsInfoString = getAnalyticsInfoString;