@angular/localize
Version:
Angular - library for localizing messages
8 lines (7 loc) • 8.14 kB
Source Map (JSON)
{
"version": 3,
"sources": ["index.ts"],
"sourcesContent": ["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n *\n * @fileoverview Schematics for `ng add @angular/localize` schematic.\n */\n\nimport {chain, noop, Rule, SchematicsException, Tree} from '@angular-devkit/schematics';\nimport {\n AngularBuilder,\n addDependency,\n readWorkspace,\n updateWorkspace,\n} from '@schematics/angular/utility';\nimport {removePackageJsonDependency} from '@schematics/angular/utility/dependencies';\nimport {JSONFile, JSONPath} from '@schematics/angular/utility/json-file';\n\nimport {Schema} from './schema';\n\nconst localizeType = `@angular/localize`;\nconst localizePolyfill = '@angular/localize/init';\nconst localizeTripleSlashType = `/// <reference types=\"@angular/localize\" />`;\n\nfunction addPolyfillToConfig(projectName: string): Rule {\n return updateWorkspace((workspace) => {\n const project = workspace.projects.get(projectName);\n if (!project) {\n throw new SchematicsException(`Invalid project name '${projectName}'.`);\n }\n\n const isLocalizePolyfill = (path: string) => path.startsWith('@angular/localize');\n\n for (const target of project.targets.values()) {\n switch (target.builder) {\n case AngularBuilder.Karma:\n case AngularBuilder.BuildKarma:\n case AngularBuilder.Server:\n case AngularBuilder.Browser:\n case AngularBuilder.BrowserEsbuild:\n case AngularBuilder.Application:\n case AngularBuilder.BuildApplication:\n target.options ??= {};\n const value = target.options['polyfills'];\n if (typeof value === 'string') {\n if (!isLocalizePolyfill(value)) {\n target.options['polyfills'] = [value, localizePolyfill];\n }\n } else if (Array.isArray(value)) {\n if (!(value as string[]).some(isLocalizePolyfill)) {\n value.push(localizePolyfill);\n }\n } else {\n target.options['polyfills'] = [localizePolyfill];\n }\n\n break;\n }\n }\n });\n}\n\nfunction addTypeScriptConfigTypes(projectName: string): Rule {\n return async (host: Tree) => {\n const workspace = await readWorkspace(host);\n const project = workspace.projects.get(projectName);\n if (!project) {\n throw new SchematicsException(`Invalid project name '${projectName}'.`);\n }\n\n // We add the root workspace tsconfig for better IDE support.\n const tsConfigFiles = new Set<string>();\n for (const target of project.targets.values()) {\n switch (target.builder) {\n case AngularBuilder.Karma:\n case AngularBuilder.Server:\n case AngularBuilder.BrowserEsbuild:\n case AngularBuilder.Browser:\n case AngularBuilder.Application:\n case AngularBuilder.BuildApplication:\n const value = target.options?.['tsConfig'];\n if (typeof value === 'string') {\n tsConfigFiles.add(value);\n }\n\n break;\n }\n\n if (\n target.builder === AngularBuilder.Browser ||\n target.builder === AngularBuilder.BrowserEsbuild\n ) {\n const value = target.options?.['main'];\n if (typeof value === 'string') {\n addTripleSlashType(host, value);\n }\n } else if (\n target.builder === AngularBuilder.Application ||\n target.builder === AngularBuilder.BuildApplication\n ) {\n const value = target.options?.['browser'];\n if (typeof value === 'string') {\n addTripleSlashType(host, value);\n }\n }\n }\n\n const typesJsonPath: JSONPath = ['compilerOptions', 'types'];\n for (const path of tsConfigFiles) {\n if (!host.exists(path)) {\n continue;\n }\n\n const json = new JSONFile(host, path);\n const types = json.get(typesJsonPath) ?? [];\n if (!Array.isArray(types)) {\n throw new SchematicsException(\n `TypeScript configuration file '${path}' has an invalid 'types' property. It must be an array.`,\n );\n }\n\n const hasLocalizeType = types.some(\n (t) => t === localizeType || t === '@angular/localize/init',\n );\n if (hasLocalizeType) {\n // Skip has already localize type.\n continue;\n }\n\n json.modify(typesJsonPath, [...types, localizeType]);\n }\n };\n}\n\nfunction addTripleSlashType(host: Tree, path: string): void {\n const content = host.readText(path);\n if (!content.includes(localizeTripleSlashType)) {\n host.overwrite(path, localizeTripleSlashType + '\\n\\n' + content);\n }\n}\n\nfunction moveToDependencies(host: Tree): Rule | void {\n if (!host.exists('package.json')) {\n return;\n }\n\n // Remove the previous dependency and add in a new one under the desired type.\n removePackageJsonDependency(host, '@angular/localize');\n\n return addDependency('@angular/localize', `~20.1.0`);\n}\n\nexport default function (options: Schema): Rule {\n const projectName = options.project;\n\n if (!projectName) {\n throw new SchematicsException('Option \"project\" is required.');\n }\n\n return chain([\n addTypeScriptConfigTypes(projectName),\n addPolyfillToConfig(projectName),\n // If `$localize` will be used at runtime then must install `@angular/localize`\n // into `dependencies`, rather than the default of `devDependencies`.\n options.useAtRuntime ? moveToDependencies : noop(),\n ]);\n}\n"],
"mappings": "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",
"names": []
}