angular-server-side-configuration
Version:
Configure an angular application on the server
139 lines • 6.67 kB
JavaScript
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.ngsscBuild = ngsscBuild;
exports.detectVariablesAndBuildNgsscJson = detectVariablesAndBuildNgsscJson;
exports.detectVariables = detectVariables;
exports.buildNgssc = buildNgssc;
const fs_1 = require("fs");
const path_1 = require("path");
const architect_1 = require("@angular-devkit/architect");
const glob = __importStar(require("glob"));
const variable_detector_1 = require("./variable-detector");
async function ngsscBuild(options, context) {
const buildTarget = (0, architect_1.targetFromTargetString)(options.buildTarget || options.browserTarget);
const rawBuilderOptions = await context.getTargetOptions(buildTarget);
const builderName = await context.getBuilderNameForTarget(buildTarget);
const builderOptions = await context.validateOptions(rawBuilderOptions, builderName);
const scheduledTarget = await context.scheduleTarget(buildTarget);
const result = await scheduledTarget.result;
if (!result.success) {
const buildConfig = buildTarget.configuration ? `:${buildTarget.configuration}` : '';
context.logger.warn(`ngssc: Failed build of ${buildTarget.project}:${buildTarget.target}${buildConfig}. Skipping ngssc build.`);
return result;
}
await detectVariablesAndBuildNgsscJson(options, builderOptions, context, false, builderName !== '@angular-devkit/build-angular:application'
? undefined
: 'server' in builderOptions && builderOptions.server
? 'server'
: 'browser-only');
return result;
}
async function detectVariablesAndBuildNgsscJson(options, builderOptions, context, multiple = false, applicationBuilderVariant = undefined) {
const ngsscContext = await detectVariables(context, options.searchPattern);
const builderOutputPath = typeof builderOptions.outputPath === 'string'
? builderOptions.outputPath
: builderOptions.outputPath.base;
let outputPath = (0, path_1.join)(context.workspaceRoot, builderOutputPath);
const ngssc = buildNgssc(ngsscContext, options, builderOptions, multiple, applicationBuilderVariant);
const browserOutputPaths = [(0, path_1.join)(outputPath, 'browser')];
if (typeof builderOptions.outputPath !== 'string' && builderOptions.outputPath.browser) {
browserOutputPaths.unshift((0, path_1.join)(outputPath, builderOptions.outputPath.browser));
}
outputPath = browserOutputPaths.find(fs_1.existsSync) ?? outputPath;
(0, fs_1.writeFileSync)((0, path_1.join)(outputPath, 'ngssc.json'), JSON.stringify(ngssc, null, 2), 'utf8');
}
async function detectVariables(context, searchPattern) {
const projectName = context.target && context.target.project;
if (!projectName) {
throw new Error('The builder requires a target.');
}
const projectMetadata = await context.getProjectMetadata(projectName);
const sourceRoot = projectMetadata.sourceRoot;
const defaultSearchPattern = sourceRoot
? `${sourceRoot}/**/environments/environment*.ts`
: '**/environments/environment*.ts';
const detector = new variable_detector_1.VariableDetector(context.logger);
const typeScriptFiles = await glob.glob(searchPattern || defaultSearchPattern, {
absolute: true,
cwd: context.workspaceRoot,
ignore: ['**/node_modules/**', '**/*.spec.ts', '**/*.d.ts'],
});
let ngsscContext = null;
for (const file of typeScriptFiles) {
const fileContent = (0, fs_1.readFileSync)(file, 'utf8');
const innerNgsscContext = detector.detect(fileContent);
if (!innerNgsscContext.variables.length) {
continue;
}
else if (!ngsscContext) {
ngsscContext = innerNgsscContext;
continue;
}
if (ngsscContext.variant !== innerNgsscContext.variant) {
context.logger.info(`ngssc: Detected conflicting variants (${ngsscContext.variant} and ${innerNgsscContext.variant}) being used`);
}
ngsscContext.variables.push(...innerNgsscContext.variables.filter((v) => !ngsscContext.variables.includes(v)));
}
if (!ngsscContext) {
return { variant: 'process', variables: [] };
}
context.logger.info(`ngssc: Detected variant '${ngsscContext.variant}' with variables ` +
`'${ngsscContext.variables.join(', ')}'`);
return ngsscContext;
}
function buildNgssc(ngsscContext, options, builderOptions, multiple = false, applicationBuilderVariant = undefined) {
return {
environmentVariables: [
...ngsscContext.variables,
...(options.additionalEnvironmentVariables || []),
],
filePattern: options.filePattern ||
extractFilePattern(builderOptions, multiple, applicationBuilderVariant),
variant: ngsscContext.variant,
};
}
function extractFilePattern(builderOptions, multiple, applicationBuilderVariant = undefined) {
if (builderOptions && applicationBuilderVariant === 'server') {
return '**/index{.,.server.}html';
}
const index = builderOptions?.index;
let result = '**/index.html';
if (!index || typeof index === 'boolean') {
return result;
}
else if (typeof index === 'string') {
result = (0, path_1.basename)(index);
}
else if (index.output) {
result = (0, path_1.basename)(index.output);
}
else {
result = (0, path_1.basename)(index.input);
}
return multiple && !result.startsWith('*') ? `**/${result}` : result;
}
exports.default = (0, architect_1.createBuilder)(ngsscBuild);
//# sourceMappingURL=index.js.map
;