Scripts for token migration
Instructions:
1. Install packages with `npm i`
2. Update migration list resources/migrationList.csv
3. Check run scripts in package.json
4. To run with script use `npm run main`
5. To run with debg tokens `npm run main -- debug`
6. To reset all repos `npm run resetRepo`
Test: Manual
Bug: 241778903
Change-Id: I0f828f1d75fdbd39ef8dfe2ca25ac02aaff4bfca
This commit is contained in:
31
packages/SystemUI/scripts/token_alignment/.eslintrc.json
Normal file
31
packages/SystemUI/scripts/token_alignment/.eslintrc.json
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"env": {
|
||||
"es2021": true,
|
||||
"node": true
|
||||
},
|
||||
"parserOptions": {
|
||||
"ecmaVersion": "latest",
|
||||
"sourceType": "module"
|
||||
},
|
||||
"plugins": ["prettier", "@typescript-eslint", "eslint-plugin-simple-import-sort", "import"],
|
||||
"extends": ["prettier", "eslint:recommended", "plugin:@typescript-eslint/recommended"],
|
||||
"rules": {
|
||||
"prettier/prettier": ["error"],
|
||||
"no-unused-vars": "off",
|
||||
"@typescript-eslint/no-unused-vars": [
|
||||
"warn",
|
||||
{
|
||||
"argsIgnorePattern": "^_",
|
||||
"varsIgnorePattern": "^_",
|
||||
"caughtErrorsIgnorePattern": "^_"
|
||||
}
|
||||
],
|
||||
"no-multiple-empty-lines": ["error", { "max": 2 }],
|
||||
"no-multi-spaces": "error",
|
||||
"simple-import-sort/imports": "error",
|
||||
"simple-import-sort/exports": "error",
|
||||
"import/first": "error",
|
||||
"import/newline-after-import": "error",
|
||||
"import/no-duplicates": "error"
|
||||
}
|
||||
}
|
||||
2
packages/SystemUI/scripts/token_alignment/.gitignore
vendored
Normal file
2
packages/SystemUI/scripts/token_alignment/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
vscode
|
||||
node_modules
|
||||
9
packages/SystemUI/scripts/token_alignment/.prettierrc
Normal file
9
packages/SystemUI/scripts/token_alignment/.prettierrc
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"tabWidth": 4,
|
||||
"printWidth": 100,
|
||||
"semi": true,
|
||||
"singleQuote": true,
|
||||
"bracketSameLine": true,
|
||||
"bracketSpacing": true,
|
||||
"arrowParens": "always"
|
||||
}
|
||||
297
packages/SystemUI/scripts/token_alignment/helpers/DOMFuncs.ts
Normal file
297
packages/SystemUI/scripts/token_alignment/helpers/DOMFuncs.ts
Normal file
@@ -0,0 +1,297 @@
|
||||
// Copyright 2022 Google LLC
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
type IElementComment =
|
||||
| { commentNode: undefined; textContent: undefined; hidden: undefined }
|
||||
| { commentNode: Node; textContent: string; hidden: boolean };
|
||||
|
||||
interface ITag {
|
||||
attrs?: Record<string, string | number>;
|
||||
tagName: string;
|
||||
}
|
||||
|
||||
export interface INewTag extends ITag {
|
||||
content?: string | number;
|
||||
comment?: string;
|
||||
}
|
||||
|
||||
export type IUpdateTag = Partial<Omit<INewTag, 'tagName'>>;
|
||||
|
||||
export default class DOM {
|
||||
static addEntry(containerElement: Element, tagOptions: INewTag) {
|
||||
const doc = containerElement.ownerDocument;
|
||||
const exists = this.alreadyHasEntry(containerElement, tagOptions);
|
||||
|
||||
if (exists) {
|
||||
console.log('Ignored adding entry already available: ', exists.outerHTML);
|
||||
return;
|
||||
}
|
||||
|
||||
let insertPoint: Node | null = containerElement.lastElementChild; //.childNodes[containerElement.childNodes.length - 1];
|
||||
|
||||
if (!insertPoint) {
|
||||
console.log('Ignored adding entry in empity parent: ', containerElement.outerHTML);
|
||||
return;
|
||||
}
|
||||
|
||||
const { attrs, comment, content, tagName } = tagOptions;
|
||||
|
||||
if (comment) {
|
||||
const commentNode = doc.createComment(comment);
|
||||
this.insertAfterIdented(commentNode, insertPoint);
|
||||
insertPoint = commentNode;
|
||||
}
|
||||
|
||||
const newEl = doc.createElement(tagName);
|
||||
if (content) newEl.innerHTML = content.toString();
|
||||
if (attrs)
|
||||
Object.entries(attrs).forEach(([attr, value]) =>
|
||||
newEl.setAttribute(attr, value.toString())
|
||||
);
|
||||
this.insertAfterIdented(newEl, insertPoint);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static insertBeforeIndented(newNode: Node, referenceNode: Node) {
|
||||
const paddingNode = referenceNode.previousSibling;
|
||||
const ownerDoc = referenceNode.ownerDocument;
|
||||
const containerNode = referenceNode.parentNode;
|
||||
|
||||
if (!paddingNode || !ownerDoc || !containerNode) return;
|
||||
|
||||
const currentPadding = paddingNode.textContent || '';
|
||||
const textNode = referenceNode.ownerDocument.createTextNode(currentPadding);
|
||||
|
||||
containerNode.insertBefore(newNode, referenceNode);
|
||||
containerNode.insertBefore(textNode, newNode);
|
||||
}
|
||||
|
||||
static insertAfterIdented(newNode: Node, referenceNode: Node) {
|
||||
const paddingNode = referenceNode.previousSibling;
|
||||
const ownerDoc = referenceNode.ownerDocument;
|
||||
const containerNode = referenceNode.parentNode;
|
||||
|
||||
if (!paddingNode || !ownerDoc || !containerNode) return;
|
||||
|
||||
const currentPadding = paddingNode.textContent || '';
|
||||
const textNode = ownerDoc.createTextNode(currentPadding);
|
||||
|
||||
containerNode.insertBefore(newNode, referenceNode.nextSibling);
|
||||
containerNode.insertBefore(textNode, newNode);
|
||||
}
|
||||
|
||||
static getElementComment(el: Element): IElementComment {
|
||||
const commentNode = el.previousSibling?.previousSibling;
|
||||
|
||||
const out = { commentNode: undefined, textContent: undefined, hidden: undefined };
|
||||
|
||||
if (!commentNode) return out;
|
||||
|
||||
const textContent = commentNode.textContent || '';
|
||||
const hidden = textContent.substring(textContent.length - 6) == '@hide ';
|
||||
|
||||
if (!(commentNode && commentNode.nodeName == '#comment')) return out;
|
||||
|
||||
return { commentNode, textContent, hidden: hidden };
|
||||
}
|
||||
|
||||
static duplicateEntryWithChange(
|
||||
templateElement: Element,
|
||||
options: Omit<IUpdateTag, 'content'>
|
||||
) {
|
||||
const exists = this.futureEntryAlreadyExist(templateElement, options);
|
||||
if (exists) {
|
||||
console.log('Ignored duplicating entry already available: ', exists.outerHTML);
|
||||
return;
|
||||
}
|
||||
|
||||
const { commentNode } = this.getElementComment(templateElement);
|
||||
let insertPoint: Node = templateElement;
|
||||
|
||||
if (commentNode) {
|
||||
const newComment = commentNode.cloneNode();
|
||||
this.insertAfterIdented(newComment, insertPoint);
|
||||
insertPoint = newComment;
|
||||
}
|
||||
|
||||
const newEl = templateElement.cloneNode(true) as Element;
|
||||
this.insertAfterIdented(newEl, insertPoint);
|
||||
|
||||
this.updateElement(newEl, options);
|
||||
return true;
|
||||
}
|
||||
|
||||
static replaceStringInAttributeValueOnQueried(
|
||||
root: Element,
|
||||
query: string,
|
||||
attrArray: string[],
|
||||
replaceMap: Map<string, string>
|
||||
): boolean {
|
||||
let updated = false;
|
||||
const queried = [...Array.from(root.querySelectorAll(query)), root];
|
||||
|
||||
queried.forEach((el) => {
|
||||
attrArray.forEach((attr) => {
|
||||
if (el.hasAttribute(attr)) {
|
||||
const currentAttrValue = el.getAttribute(attr);
|
||||
|
||||
if (!currentAttrValue) return;
|
||||
|
||||
[...replaceMap.entries()].some(([oldStr, newStr]) => {
|
||||
if (
|
||||
currentAttrValue.length >= oldStr.length &&
|
||||
currentAttrValue.indexOf(oldStr) ==
|
||||
currentAttrValue.length - oldStr.length
|
||||
) {
|
||||
el.setAttribute(attr, currentAttrValue.replace(oldStr, newStr));
|
||||
updated = true;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return updated;
|
||||
}
|
||||
|
||||
static updateElement(el: Element, updateOptions: IUpdateTag) {
|
||||
const exists = this.futureEntryAlreadyExist(el, updateOptions);
|
||||
if (exists) {
|
||||
console.log('Ignored updating entry already available: ', exists.outerHTML);
|
||||
return;
|
||||
}
|
||||
|
||||
const { comment, attrs, content } = updateOptions;
|
||||
|
||||
if (comment) {
|
||||
const { commentNode } = this.getElementComment(el);
|
||||
if (commentNode) {
|
||||
commentNode.textContent = comment;
|
||||
}
|
||||
}
|
||||
|
||||
if (attrs) {
|
||||
for (const attr in attrs) {
|
||||
const value = attrs[attr];
|
||||
|
||||
if (value != undefined) {
|
||||
el.setAttribute(attr, `${value}`);
|
||||
} else {
|
||||
el.removeAttribute(attr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (content != undefined) {
|
||||
el.innerHTML = `${content}`;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static elementToOptions(el: Element): ITag {
|
||||
return {
|
||||
attrs: this.getAllElementAttributes(el),
|
||||
tagName: el.tagName,
|
||||
};
|
||||
}
|
||||
|
||||
static getAllElementAttributes(el: Element): Record<string, string> {
|
||||
return el
|
||||
.getAttributeNames()
|
||||
.reduce(
|
||||
(acc, attr) => ({ ...acc, [attr]: el.getAttribute(attr) || '' }),
|
||||
{} as Record<string, string>
|
||||
);
|
||||
}
|
||||
|
||||
static futureEntryAlreadyExist(el: Element, updateOptions: IUpdateTag) {
|
||||
const currentElOptions = this.elementToOptions(el);
|
||||
|
||||
if (!el.parentElement) {
|
||||
console.log('Checked el has no parent');
|
||||
process.exit();
|
||||
}
|
||||
|
||||
return this.alreadyHasEntry(el.parentElement, {
|
||||
...currentElOptions,
|
||||
...updateOptions,
|
||||
attrs: { ...currentElOptions.attrs, ...updateOptions.attrs },
|
||||
});
|
||||
}
|
||||
|
||||
static alreadyHasEntry(
|
||||
containerElement: Element,
|
||||
{ attrs, tagName }: Pick<INewTag, 'attrs' | 'tagName'>
|
||||
) {
|
||||
const qAttrs = attrs
|
||||
? Object.entries(attrs)
|
||||
.map(([a, v]) => `[${a}="${v}"]`)
|
||||
.join('')
|
||||
: '';
|
||||
|
||||
return containerElement.querySelector(tagName + qAttrs);
|
||||
}
|
||||
|
||||
static replaceContentTextOnQueried(
|
||||
root: Element,
|
||||
query: string,
|
||||
replacePairs: Array<[string, string]>
|
||||
) {
|
||||
let updated = false;
|
||||
let queried = Array.from(root.querySelectorAll(query));
|
||||
|
||||
if (queried.length == 0) queried = [...Array.from(root.querySelectorAll(query)), root];
|
||||
|
||||
queried.forEach((el) => {
|
||||
replacePairs.forEach(([oldStr, newStr]) => {
|
||||
if (el.innerHTML == oldStr) {
|
||||
el.innerHTML = newStr;
|
||||
updated = true;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return updated;
|
||||
}
|
||||
|
||||
static XMLDocToString(doc: XMLDocument) {
|
||||
let str = '';
|
||||
|
||||
doc.childNodes.forEach((node) => {
|
||||
switch (node.nodeType) {
|
||||
case 8: // comment
|
||||
str += `<!--${node.nodeValue}-->\n`;
|
||||
break;
|
||||
|
||||
case 3: // text
|
||||
str += node.textContent;
|
||||
break;
|
||||
|
||||
case 1: // element
|
||||
str += (node as Element).outerHTML;
|
||||
break;
|
||||
|
||||
default:
|
||||
console.log('Unhandled node type: ' + node.nodeType);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
return str;
|
||||
}
|
||||
}
|
||||
112
packages/SystemUI/scripts/token_alignment/helpers/FileIO.ts
Normal file
112
packages/SystemUI/scripts/token_alignment/helpers/FileIO.ts
Normal file
@@ -0,0 +1,112 @@
|
||||
// Copyright 2022 Google LLC
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.import { exec } from 'child_process';
|
||||
|
||||
import { exec } from 'child_process';
|
||||
import { parse } from 'csv-parse';
|
||||
import { promises as fs } from 'fs';
|
||||
import jsdom from 'jsdom';
|
||||
|
||||
const DOMParser = new jsdom.JSDOM('').window.DOMParser as typeof window.DOMParser;
|
||||
|
||||
type TFileList = string[];
|
||||
|
||||
export type TCSVRecord = Array<string | boolean | number>;
|
||||
|
||||
class _FileIO {
|
||||
public parser = new DOMParser();
|
||||
public saved: string[] = [];
|
||||
|
||||
public loadXML = async (path: string): Promise<XMLDocument> => {
|
||||
try {
|
||||
const src = await this.loadFileAsText(path);
|
||||
return this.parser.parseFromString(src, 'text/xml') as XMLDocument;
|
||||
} catch (error) {
|
||||
console.log(`Failed to parse XML file '${path}'.`, error);
|
||||
process.exit();
|
||||
}
|
||||
};
|
||||
|
||||
public loadFileAsText = async (path: string): Promise<string> => {
|
||||
try {
|
||||
return await fs.readFile(path, { encoding: 'utf8' });
|
||||
} catch (error) {
|
||||
console.log(`Failed to read file '${path}'.`, error);
|
||||
process.exit();
|
||||
}
|
||||
};
|
||||
|
||||
public saveFile = async (data: string, path: string) => {
|
||||
try {
|
||||
await fs.writeFile(path, data, { encoding: 'utf8' });
|
||||
this.saved.push(path);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
console.log(`Failed to write file '${path}'.`);
|
||||
process.exit();
|
||||
}
|
||||
};
|
||||
|
||||
public loadFileList = async (path: string): Promise<TFileList> => {
|
||||
const src = await this.loadFileAsText(path);
|
||||
|
||||
try {
|
||||
return JSON.parse(src) as TFileList;
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
console.log(`Failed to parse JSON file '${path}'.`);
|
||||
process.exit();
|
||||
}
|
||||
};
|
||||
|
||||
public loadCSV = (path: string): Promise<Array<TCSVRecord>> => {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.loadFileAsText(path).then((src) => {
|
||||
parse(
|
||||
src,
|
||||
{
|
||||
delimiter: ' ',
|
||||
},
|
||||
(err, records) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
|
||||
resolve(records);
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
formatSaved = () => {
|
||||
const cmd = `idea format ${this.saved.join(' ')}`;
|
||||
|
||||
exec(cmd, (error, out, stderr) => {
|
||||
if (error) {
|
||||
console.log(error.message);
|
||||
return;
|
||||
}
|
||||
|
||||
if (stderr) {
|
||||
console.log(stderr);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(out);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
export const FileIO = new _FileIO();
|
||||
@@ -0,0 +1,70 @@
|
||||
// Copyright 2022 Google LLC
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.import { exec } from 'child_process';
|
||||
|
||||
import { FileIO, TCSVRecord } from './FileIO';
|
||||
import ProcessArgs from './processArgs';
|
||||
|
||||
interface IInputMigItem {
|
||||
migrationToken: string;
|
||||
materialToken: string;
|
||||
newDefaultValue?: string;
|
||||
newComment?: string;
|
||||
}
|
||||
|
||||
interface IAditionalKeys {
|
||||
step: ('update' | 'duplicate' | 'add' | 'ignore')[];
|
||||
isHidden: boolean;
|
||||
replaceToken: string;
|
||||
}
|
||||
|
||||
export type IMigItem = Omit<IInputMigItem, 'materialToken' | 'migrationToken'> & IAditionalKeys;
|
||||
|
||||
export type IMigrationMap = Map<string, IMigItem>;
|
||||
|
||||
function isMigrationRecord(record: TCSVRecord): record is string[] {
|
||||
return !record.some((value) => typeof value != 'string') || record.length != 5;
|
||||
}
|
||||
|
||||
export const loadMIgrationList = async function (): Promise<IMigrationMap> {
|
||||
const out: IMigrationMap = new Map();
|
||||
const csv = await FileIO.loadCSV('resources/migrationList.csv');
|
||||
|
||||
csv.forEach((record, i) => {
|
||||
if (i == 0) return; // header
|
||||
|
||||
if (typeof record[0] != 'string') return;
|
||||
|
||||
if (!isMigrationRecord(record)) {
|
||||
console.log(`Failed to validade CSV record as string[5].`, record);
|
||||
process.exit();
|
||||
}
|
||||
|
||||
const [originalToken, materialToken, newDefaultValue, newComment, migrationToken] = record;
|
||||
|
||||
if (out.has(originalToken)) {
|
||||
console.log('Duplicated entry on Migration CSV file: ', originalToken);
|
||||
return;
|
||||
}
|
||||
|
||||
out.set(originalToken, {
|
||||
replaceToken: ProcessArgs.isDebug ? migrationToken : materialToken,
|
||||
...(!!newDefaultValue && { newDefaultValue }),
|
||||
...(!!newComment && { newComment }),
|
||||
step: [],
|
||||
isHidden: false,
|
||||
});
|
||||
});
|
||||
|
||||
return new Map([...out].sort((a, b) => b[0].length - a[0].length));
|
||||
};
|
||||
@@ -0,0 +1,21 @@
|
||||
// Copyright 2022 Google LLC
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.import { exec } from 'child_process';
|
||||
|
||||
const myArgs = process.argv.slice(2);
|
||||
|
||||
const ProcessArgs = {
|
||||
isDebug: myArgs.includes('debug'),
|
||||
};
|
||||
|
||||
export default ProcessArgs;
|
||||
102
packages/SystemUI/scripts/token_alignment/helpers/processXML.ts
Normal file
102
packages/SystemUI/scripts/token_alignment/helpers/processXML.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
// Copyright 2022 Google LLC
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.import { exec } from 'child_process';
|
||||
|
||||
import DOM, { INewTag, IUpdateTag } from './DOMFuncs';
|
||||
import { FileIO } from './FileIO';
|
||||
import { IMigItem, IMigrationMap } from './migrationList';
|
||||
|
||||
export type TResultExistingEval = ['update' | 'duplicate', IUpdateTag] | void;
|
||||
export type TResultMissingEval = INewTag | void;
|
||||
|
||||
interface IProcessXML {
|
||||
attr?: string;
|
||||
containerQuery?: string;
|
||||
evalExistingEntry?: TEvalExistingEntry;
|
||||
evalMissingEntry?: TEvalMissingEntry;
|
||||
hidable?: boolean;
|
||||
path: string;
|
||||
step: number;
|
||||
tagName: string;
|
||||
}
|
||||
|
||||
export type TEvalExistingEntry = (
|
||||
attrname: string,
|
||||
migItem: IMigItem,
|
||||
qItem: Element
|
||||
) => TResultExistingEval;
|
||||
|
||||
export type TEvalMissingEntry = (originalToken: string, migItem: IMigItem) => TResultMissingEval;
|
||||
|
||||
export async function processQueriedEntries(
|
||||
migrationMap: IMigrationMap,
|
||||
{
|
||||
attr = 'name',
|
||||
containerQuery = '*',
|
||||
evalExistingEntry,
|
||||
path,
|
||||
step,
|
||||
tagName,
|
||||
evalMissingEntry,
|
||||
}: IProcessXML
|
||||
) {
|
||||
const doc = await FileIO.loadXML(path);
|
||||
|
||||
const containerElement =
|
||||
(containerQuery && doc.querySelector(containerQuery)) || doc.documentElement;
|
||||
|
||||
migrationMap.forEach((migItem, originalToken) => {
|
||||
migItem.step[step] = 'ignore';
|
||||
|
||||
const queryTiems = containerElement.querySelectorAll(
|
||||
`${tagName}[${attr}="${originalToken}"]`
|
||||
);
|
||||
|
||||
if (evalMissingEntry) {
|
||||
const addinOptions = evalMissingEntry(originalToken, migItem);
|
||||
|
||||
if (queryTiems.length == 0 && containerElement && addinOptions) {
|
||||
DOM.addEntry(containerElement, addinOptions);
|
||||
migItem.step[step] = 'add';
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (evalExistingEntry)
|
||||
queryTiems.forEach((qEl) => {
|
||||
const attrName = qEl.getAttribute(attr);
|
||||
const migItem = migrationMap.get(attrName || '');
|
||||
|
||||
if (!attrName || !migItem) return;
|
||||
|
||||
const updateOptions = evalExistingEntry(attrName, migItem, qEl);
|
||||
|
||||
if (!updateOptions) return;
|
||||
|
||||
const [processType, processOptions] = updateOptions;
|
||||
|
||||
switch (processType) {
|
||||
case 'update':
|
||||
if (DOM.updateElement(qEl, processOptions)) migItem.step[step] = 'update';
|
||||
break;
|
||||
|
||||
case 'duplicate':
|
||||
if (DOM.duplicateEntryWithChange(qEl, processOptions))
|
||||
migItem.step[step] = 'duplicate';
|
||||
break;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
await FileIO.saveFile(doc.documentElement.outerHTML, path);
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
// Copyright 2022 Google LLC
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.import { exec } from 'child_process';
|
||||
|
||||
if (!process?.env?.ANDROID_BUILD_TOP) {
|
||||
console.log(
|
||||
"Error: Couldn't find 'ANDROID_BUILD_TOP' environment variable. Make sure to run 'lunch' in this terminal"
|
||||
);
|
||||
}
|
||||
|
||||
export const repoPath = process?.env?.ANDROID_BUILD_TOP;
|
||||
@@ -0,0 +1,27 @@
|
||||
// Copyright 2022 Google LLC
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.import { exec } from 'child_process';
|
||||
|
||||
export function groupReplace(src: string, replaceMap: Map<string, string>, pattern: string) {
|
||||
const fullPattern = pattern.replace('#group#', [...replaceMap.keys()].join('|'));
|
||||
|
||||
const regEx = new RegExp(fullPattern, 'g');
|
||||
|
||||
''.replace;
|
||||
|
||||
return src.replace(regEx, (...args) => {
|
||||
//match, ...matches, offset, string, groups
|
||||
const [match, key] = args as string[];
|
||||
return match.replace(key, replaceMap.get(key) || '');
|
||||
});
|
||||
}
|
||||
240
packages/SystemUI/scripts/token_alignment/index.ts
Normal file
240
packages/SystemUI/scripts/token_alignment/index.ts
Normal file
@@ -0,0 +1,240 @@
|
||||
// Copyright 2022 Google LLC
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.import { exec } from 'child_process';
|
||||
|
||||
import DOM from './helpers/DOMFuncs';
|
||||
import { FileIO } from './helpers/FileIO';
|
||||
import { loadMIgrationList } from './helpers/migrationList';
|
||||
import { processQueriedEntries, TEvalExistingEntry } from './helpers/processXML';
|
||||
import { repoPath } from './helpers/rootPath';
|
||||
import { groupReplace } from './helpers/textFuncs';
|
||||
|
||||
async function init() {
|
||||
const migrationMap = await loadMIgrationList();
|
||||
const basePath = `${repoPath}/../tm-qpr-dev/frameworks/base/core/res/res/values/`;
|
||||
|
||||
await processQueriedEntries(migrationMap, {
|
||||
containerQuery: 'declare-styleable[name="Theme"]',
|
||||
hidable: true,
|
||||
path: `${basePath}attrs.xml`,
|
||||
step: 0,
|
||||
tagName: 'attr',
|
||||
evalExistingEntry: (_attrValue, migItem, qItem) => {
|
||||
const { hidden, textContent: currentComment } = DOM.getElementComment(qItem);
|
||||
|
||||
if (hidden) migItem.isHidden = hidden;
|
||||
|
||||
const { newComment } = migItem;
|
||||
return [
|
||||
hidden ? 'update' : 'duplicate',
|
||||
{
|
||||
attrs: { name: migItem.replaceToken },
|
||||
...(newComment
|
||||
? { comment: `${newComment} @hide ` }
|
||||
: currentComment
|
||||
? { comment: hidden ? currentComment : `${currentComment} @hide ` }
|
||||
: {}),
|
||||
},
|
||||
];
|
||||
},
|
||||
evalMissingEntry: (_originalToken, { replaceToken, newComment }) => {
|
||||
return {
|
||||
tagName: 'attr',
|
||||
attrs: {
|
||||
name: replaceToken,
|
||||
format: 'color',
|
||||
},
|
||||
comment: `${newComment} @hide `,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
// only update all existing entries
|
||||
await processQueriedEntries(migrationMap, {
|
||||
tagName: 'item',
|
||||
path: `${basePath}themes_device_defaults.xml`,
|
||||
containerQuery: 'resources',
|
||||
step: 2,
|
||||
evalExistingEntry: (_attrValue, { isHidden, replaceToken, step }, _qItem) => {
|
||||
if (step[0] != 'ignore')
|
||||
return [
|
||||
isHidden ? 'update' : 'duplicate',
|
||||
{
|
||||
attrs: { name: replaceToken },
|
||||
},
|
||||
];
|
||||
},
|
||||
});
|
||||
|
||||
// add missing entries on specific container
|
||||
await processQueriedEntries(migrationMap, {
|
||||
tagName: 'item',
|
||||
path: `${basePath}themes_device_defaults.xml`,
|
||||
containerQuery: 'resources style[parent="Theme.Material"]',
|
||||
step: 3,
|
||||
evalMissingEntry: (originalToken, { newDefaultValue, replaceToken }) => {
|
||||
return {
|
||||
tagName: 'item',
|
||||
content: newDefaultValue,
|
||||
attrs: {
|
||||
name: replaceToken,
|
||||
},
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
const evalExistingEntry: TEvalExistingEntry = (_attrValue, { replaceToken, step }, _qItem) => {
|
||||
if (step[0] == 'update')
|
||||
return [
|
||||
'update',
|
||||
{
|
||||
attrs: { name: replaceToken },
|
||||
},
|
||||
];
|
||||
};
|
||||
|
||||
await processQueriedEntries(migrationMap, {
|
||||
tagName: 'item',
|
||||
containerQuery: 'resources',
|
||||
path: `${basePath}../values-night/themes_device_defaults.xml`,
|
||||
step: 4,
|
||||
evalExistingEntry,
|
||||
});
|
||||
|
||||
await processQueriedEntries(migrationMap, {
|
||||
tagName: 'java-symbol',
|
||||
path: `${basePath}symbols.xml`,
|
||||
containerQuery: 'resources',
|
||||
step: 5,
|
||||
evalExistingEntry,
|
||||
});
|
||||
|
||||
// update attributes on tracked XML files
|
||||
{
|
||||
const searchAttrs = [
|
||||
'android:color',
|
||||
'android:indeterminateTint',
|
||||
'app:tint',
|
||||
'app:backgroundTint',
|
||||
'android:background',
|
||||
'android:tint',
|
||||
'android:drawableTint',
|
||||
'android:textColor',
|
||||
'android:fillColor',
|
||||
'android:startColor',
|
||||
'android:endColor',
|
||||
'name',
|
||||
'ns1:color',
|
||||
];
|
||||
|
||||
const filtered = new Map(
|
||||
[...migrationMap]
|
||||
.filter(([_originalToken, { step }]) => step[0] == 'update')
|
||||
.map(([originalToken, { replaceToken }]) => [originalToken, replaceToken])
|
||||
);
|
||||
|
||||
const query =
|
||||
searchAttrs.map((str) => `*[${str}]`).join(',') +
|
||||
[...filtered.keys()].map((originalToken) => `item[name*="${originalToken}"]`).join(',');
|
||||
|
||||
const trackedFiles = await FileIO.loadFileList(
|
||||
`${__dirname}/resources/whitelist/xmls1.json`
|
||||
);
|
||||
|
||||
const promises = trackedFiles.map(async (locaFilePath) => {
|
||||
const filePath = `${repoPath}/${locaFilePath}`;
|
||||
|
||||
const doc = await FileIO.loadXML(filePath);
|
||||
const docUpdated = DOM.replaceStringInAttributeValueOnQueried(
|
||||
doc.documentElement,
|
||||
query,
|
||||
searchAttrs,
|
||||
filtered
|
||||
);
|
||||
if (docUpdated) {
|
||||
await FileIO.saveFile(DOM.XMLDocToString(doc), filePath);
|
||||
} else {
|
||||
console.warn(`Failed to update tracked file: '${locaFilePath}'`);
|
||||
}
|
||||
});
|
||||
await Promise.all(promises);
|
||||
}
|
||||
|
||||
// updates tag content on tracked files
|
||||
{
|
||||
const searchPrefixes = ['?android:attr/', '?androidprv:attr/'];
|
||||
const filtered = searchPrefixes
|
||||
.reduce<Array<[string, string]>>((acc, prefix) => {
|
||||
return [
|
||||
...acc,
|
||||
...[...migrationMap.entries()]
|
||||
.filter(([_originalToken, { step }]) => step[0] == 'update')
|
||||
.map(
|
||||
([originalToken, { replaceToken }]) =>
|
||||
[`${prefix}${originalToken}`, `${prefix}${replaceToken}`] as [
|
||||
string,
|
||||
string
|
||||
]
|
||||
),
|
||||
];
|
||||
}, [])
|
||||
.sort((a, b) => b[0].length - a[0].length);
|
||||
|
||||
const trackedFiles = await FileIO.loadFileList(
|
||||
`${__dirname}/resources/whitelist/xmls2.json`
|
||||
);
|
||||
|
||||
const promises = trackedFiles.map(async (locaFilePath) => {
|
||||
const filePath = `${repoPath}/${locaFilePath}`;
|
||||
const doc = await FileIO.loadXML(filePath);
|
||||
const docUpdated = DOM.replaceContentTextOnQueried(
|
||||
doc.documentElement,
|
||||
'item, color',
|
||||
filtered
|
||||
);
|
||||
if (docUpdated) {
|
||||
await FileIO.saveFile(DOM.XMLDocToString(doc), filePath);
|
||||
} else {
|
||||
console.warn(`Failed to update tracked file: '${locaFilePath}'`);
|
||||
}
|
||||
});
|
||||
await Promise.all(promises);
|
||||
}
|
||||
|
||||
// replace imports on Java / Kotlin
|
||||
{
|
||||
const replaceMap = new Map(
|
||||
[...migrationMap.entries()]
|
||||
.filter(([_originalToken, { step }]) => step[0] == 'update')
|
||||
.map(
|
||||
([originalToken, { replaceToken }]) =>
|
||||
[originalToken, replaceToken] as [string, string]
|
||||
)
|
||||
.sort((a, b) => b[0].length - a[0].length)
|
||||
);
|
||||
|
||||
const trackedFiles = await FileIO.loadFileList(
|
||||
`${__dirname}/resources/whitelist/java.json`
|
||||
);
|
||||
|
||||
const promises = trackedFiles.map(async (locaFilePath) => {
|
||||
const filePath = `${repoPath}/${locaFilePath}`;
|
||||
const fileContent = await FileIO.loadFileAsText(filePath);
|
||||
const str = groupReplace(fileContent, replaceMap, 'R.attr.(#group#)(?![a-zA-Z])');
|
||||
await FileIO.saveFile(str, filePath);
|
||||
});
|
||||
await Promise.all(promises);
|
||||
}
|
||||
}
|
||||
|
||||
init();
|
||||
3356
packages/SystemUI/scripts/token_alignment/package-lock.json
generated
Normal file
3356
packages/SystemUI/scripts/token_alignment/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
22
packages/SystemUI/scripts/token_alignment/package.json
Normal file
22
packages/SystemUI/scripts/token_alignment/package.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"csv-parse": "^5.3.3",
|
||||
"high5": "^1.0.0",
|
||||
"jsdom": "^20.0.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jsdom": "^20.0.1",
|
||||
"@types/node": "^18.11.18",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.0",
|
||||
"eslint-config-prettier": "^8.6.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-prettier": "^4.2.1",
|
||||
"eslint-plugin-simple-import-sort": "^8.0.0",
|
||||
"ts-node": "^10.9.1",
|
||||
"typescript": "^4.9.4"
|
||||
},
|
||||
"scripts": {
|
||||
"main": "ts-node ./index.ts",
|
||||
"resetRepo": "repo forall -j100 -c 'git restore .'"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
android material newDefaultValue newComment migrationToken
|
||||
colorAccentPrimaryVariant colorPrimaryContainer MigTok02
|
||||
colorAccentSecondaryVariant colorSecondaryContainer MigTok04
|
||||
colorAccentTertiary colorTertiary MigTok05
|
||||
colorAccentTertiaryVariant colorTertiaryContainer MigTok06
|
||||
colorBackground colorSurfaceContainer MigTok07
|
||||
colorSurface colorSurfaceContainer MigTok08
|
||||
colorSurfaceHeader colorSurfaceContainerHighest MigTok09
|
||||
colorSurfaceHighlight colorSurfaceBright MigTok10
|
||||
colorSurfaceVariant colorSurfaceContainerHigh MigTok11
|
||||
textColorOnAccent colorOnPrimary MigTok12
|
||||
textColorPrimary colorOnSurface MigTok13
|
||||
textColorPrimaryInverse colorOnShadeInactive MigTok14
|
||||
textColorSecondary colorOnSurfaceVariant MigTok15
|
||||
textColorSecondaryInverse colorOnShadeInactiveVariant MigTok16
|
||||
textColorTertiary colorOutline MigTok17
|
||||
|
@@ -0,0 +1,30 @@
|
||||
[
|
||||
"frameworks/base/core/java/android/app/Notification.java",
|
||||
"packages/apps/Settings/src/com/android/settings/dashboard/profileselector/UserAdapter.java",
|
||||
"packages/apps/Settings/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java",
|
||||
"frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt",
|
||||
"frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/ManageEducationView.kt",
|
||||
"packages/apps/WallpaperPicker2/src/com/android/wallpaper/picker/PreviewFragment.java",
|
||||
"packages/apps/WallpaperPicker2/src/com/android/wallpaper/picker/CategorySelectorFragment.java",
|
||||
"packages/apps/Launcher3/quickstep/src/com/android/quickstep/views/TaskMenuViewWithArrow.kt",
|
||||
"frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/src/com/google/android/apps/nexuslauncher/customize/WallpaperCarouselView.java",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/src/com/google/android/apps/nexuslauncher/quickstep/TaskOverlayFactoryImpl.java",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/people/ui/view/PeopleViewBinder.kt",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModel.kt",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserViewBinder.kt",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/BaseTooltipView.java",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java",
|
||||
"frameworks/base/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java"
|
||||
]
|
||||
@@ -0,0 +1,184 @@
|
||||
[
|
||||
"frameworks/base/core/res/res/color/resolver_profile_tab_selected_bg.xml",
|
||||
"frameworks/base/core/res/res/color-night/resolver_profile_tab_selected_bg.xml",
|
||||
"frameworks/base/core/res/res/drawable/autofill_bottomsheet_background.xml",
|
||||
"frameworks/base/core/res/res/drawable/btn_outlined.xml",
|
||||
"frameworks/base/core/res/res/drawable/btn_tonal.xml",
|
||||
"frameworks/base/core/res/res/drawable/chooser_action_button_bg.xml",
|
||||
"frameworks/base/core/res/res/drawable/chooser_row_layer_list.xml",
|
||||
"frameworks/base/core/res/res/drawable/resolver_outlined_button_bg.xml",
|
||||
"frameworks/base/core/res/res/drawable/resolver_profile_tab_bg.xml",
|
||||
"frameworks/base/core/res/res/drawable/toast_frame.xml",
|
||||
"frameworks/base/core/res/res/drawable/work_widget_mask_view_background.xml",
|
||||
"frameworks/base/core/res/res/layout/app_language_picker_current_locale_item.xml",
|
||||
"frameworks/base/core/res/res/layout/app_language_picker_system_current.xml",
|
||||
"frameworks/base/core/res/res/layout/autofill_save.xml",
|
||||
"frameworks/base/core/res/res/layout/chooser_grid.xml",
|
||||
"frameworks/base/core/res/res/layout/user_switching_dialog.xml",
|
||||
"frameworks/base/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_left_bk.xml",
|
||||
"frameworks/base/packages/SettingsLib/ActionButtonsPreference/res/drawable/half_rounded_right_bk.xml",
|
||||
"frameworks/base/packages/SettingsLib/ActionButtonsPreference/res/drawable/rounded_bk.xml",
|
||||
"frameworks/base/packages/SettingsLib/ActionButtonsPreference/res/drawable/square_bk.xml",
|
||||
"packages/modules/IntentResolver/java/res/drawable/chooser_action_button_bg.xml",
|
||||
"packages/modules/IntentResolver/java/res/drawable/chooser_row_layer_list.xml",
|
||||
"packages/modules/IntentResolver/java/res/drawable/resolver_outlined_button_bg.xml",
|
||||
"packages/modules/IntentResolver/java/res/drawable/resolver_profile_tab_bg.xml",
|
||||
"packages/modules/IntentResolver/java/res/layout/chooser_grid.xml",
|
||||
"frameworks/base/libs/WindowManager/Shell/res/color/one_handed_tutorial_background_color.xml",
|
||||
"frameworks/base/libs/WindowManager/Shell/res/drawable/bubble_manage_menu_bg.xml",
|
||||
"frameworks/base/libs/WindowManager/Shell/res/drawable/bubble_stack_user_education_bg.xml",
|
||||
"frameworks/base/libs/WindowManager/Shell/res/drawable/bubble_stack_user_education_bg_rtl.xml",
|
||||
"vendor/unbundled_google/packages/SystemUIGoogle/bcsmartspace/res/drawable/bg_smartspace_combination_sub_card.xml",
|
||||
"vendor/unbundled_google/packages/SystemUIGoogle/bcsmartspace/res/layout/smartspace_combination_sub_card.xml",
|
||||
"packages/apps/Launcher3/res/drawable/bg_rounded_corner_bottom_sheet_handle.xml",
|
||||
"packages/apps/Launcher3/res/drawable/rounded_action_button.xml",
|
||||
"packages/apps/Launcher3/res/drawable/work_card.xml",
|
||||
"packages/apps/Nfc/res/color/nfc_icon.xml",
|
||||
"packages/apps/Nfc/res/color-night/nfc_icon.xml",
|
||||
"packages/apps/Launcher3/quickstep/res/drawable/bg_overview_clear_all_button.xml",
|
||||
"packages/apps/Launcher3/quickstep/res/drawable/bg_sandbox_feedback.xml",
|
||||
"packages/apps/Launcher3/quickstep/res/drawable/bg_wellbeing_toast.xml",
|
||||
"packages/apps/Launcher3/quickstep/res/drawable/button_taskbar_edu_bordered.xml",
|
||||
"packages/apps/Launcher3/quickstep/res/drawable/button_taskbar_edu_colored.xml",
|
||||
"packages/apps/Launcher3/quickstep/res/drawable/split_instructions_background.xml",
|
||||
"packages/apps/Launcher3/quickstep/res/drawable/task_menu_item_bg.xml",
|
||||
"packages/apps/Launcher3/quickstep/res/layout/digital_wellbeing_toast.xml",
|
||||
"packages/apps/Launcher3/quickstep/res/layout/split_instructions_view.xml",
|
||||
"packages/apps/Launcher3/quickstep/res/layout/taskbar_edu.xml",
|
||||
"frameworks/base/packages/SettingsLib/res/drawable/broadcast_dialog_btn_bg.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/color/share_target_text.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/color-v31/all_apps_tab_background_selected.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/color-v31/all_apps_tabs_background.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/color-v31/arrow_tip_view_bg.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/color-v31/button_bg.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/color-v31/shortcut_halo.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/color-v31/surface.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/color-night-v31/all_apps_tab_background_selected.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/color-night-v31/surface.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/drawable/bg_pin_keyboard_snackbar_accept_button.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/drawable/bg_search_edu_preferences_button.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/drawable/circle_accentprimary_32dp.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/drawable/ic_search.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/drawable/ic_suggest_icon_background.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/drawable/share_target_background.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/drawable/sticky_snackbar_accept_btn_background.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/drawable/sticky_snackbar_background.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/drawable/sticky_snackbar_dismiss_btn_background.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/drawable/tall_card_btn_background.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/layout/section_header.xml",
|
||||
"packages/apps/Settings/res/color/dream_card_color_state_list.xml",
|
||||
"packages/apps/Settings/res/color/dream_card_icon_color_state_list.xml",
|
||||
"packages/apps/Settings/res/color/dream_card_text_color_state_list.xml",
|
||||
"packages/apps/Settings/res/drawable/accessibility_text_reading_preview.xml",
|
||||
"packages/apps/Settings/res/drawable/broadcast_button_outline.xml",
|
||||
"packages/apps/Settings/res/drawable/button_border_selected.xml",
|
||||
"packages/apps/Settings/res/drawable/dream_preview_rounded_bg.xml",
|
||||
"packages/apps/Settings/res/drawable/rounded_bg.xml",
|
||||
"packages/apps/Settings/res/drawable/sim_confirm_dialog_btn_outline.xml",
|
||||
"packages/apps/Settings/res/drawable/user_select_background.xml",
|
||||
"packages/apps/Settings/res/drawable/volume_dialog_button_background_outline.xml",
|
||||
"packages/apps/Settings/res/drawable/volume_dialog_button_background_solid.xml",
|
||||
"packages/apps/Settings/res/layout/dream_preview_button.xml",
|
||||
"packages/apps/Settings/res/layout/qrcode_scanner_fragment.xml",
|
||||
"frameworks/base/packages/SystemUI/res/values-television/styles.xml",
|
||||
"frameworks/base/packages/SystemUI/res/color/media_player_album_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res/color/media_player_outline_button_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res/color/media_player_solid_button_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res-keyguard/color/numpad_key_color_secondary.xml",
|
||||
"frameworks/base/packages/SystemUI/res/color/settingslib_state_on.xml",
|
||||
"frameworks/base/packages/SystemUI/res/color/settingslib_track_off.xml",
|
||||
"frameworks/base/packages/SystemUI/res/color/settingslib_track_on.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/accessibility_floating_tooltip_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/action_chip_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/action_chip_container_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/availability_dot_10dp.xml",
|
||||
"frameworks/base/packages/SystemUI/res-keyguard/drawable/bouncer_user_switcher_header_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res-keyguard/drawable/bouncer_user_switcher_item_selected_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res-keyguard/drawable/bouncer_user_switcher_popup_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/brightness_progress_full_drawable.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/broadcast_dialog_btn_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/fgs_dot.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/fingerprint_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/ic_avatar_with_badge.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/keyguard_bottom_affordance_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res-keyguard/drawable/kg_bouncer_secondary_button.xml",
|
||||
"frameworks/base/packages/SystemUI/res-keyguard/drawable/kg_emergency_button_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/logout_button_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/media_ttt_chip_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/media_ttt_chip_background_receiver.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/media_ttt_undo_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/notif_footer_btn_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/notification_guts_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/notification_material_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/overlay_badge_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/overlay_border.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/overlay_button_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/overlay_cancel.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/people_space_messages_count_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/people_tile_status_scrim.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/people_tile_suppressed_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/qs_dialog_btn_filled.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/qs_dialog_btn_filled_large.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/qs_dialog_btn_outline.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/qs_media_outline_button.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/qs_media_solid_button.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/rounded_bg_full.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/rounded_bg_full_large_radius.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/screenrecord_button_background_solid.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/screenrecord_options_spinner_popup_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/screenrecord_spinner_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/screenshot_edit_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/user_switcher_fullscreen_button_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/vector_drawable_progress_indeterminate_horizontal_trimmed.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/volume_background_bottom.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/volume_background_top.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/volume_background_top_rounded.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/volume_row_rounded_background.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/volume_row_seekbar.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/volume_row_seekbar_progress.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/wallet_action_button_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/wallet_app_button_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res/drawable/wallet_empty_state_bg.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/alert_dialog_title_systemui.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/chipbar.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/chipbar.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/clipboard_overlay.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/clipboard_overlay.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/clipboard_overlay_legacy.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/clipboard_overlay_legacy.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/internet_connectivity_dialog.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/notification_snooze.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_space_activity_no_conversations.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_space_activity_with_conversations.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_space_activity_with_conversations.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_space_tile_view.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_tile_large_with_content.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_tile_medium_with_content.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_tile_punctuation_background_large.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_tile_punctuation_background_large.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_tile_punctuation_background_large.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/chipbar.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/notification_snooze.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_tile_punctuation_background_medium.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_tile_punctuation_background_medium.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_tile_punctuation_background_medium.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_tile_punctuation_background_medium.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_tile_punctuation_background_medium.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_tile_small.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/people_tile_small_horizontal.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/screen_share_dialog.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/user_switcher_fullscreen.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/user_switcher_fullscreen.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/wallet_empty_state.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/wallet_fullscreen.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/wallet_fullscreen.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/chipbar.xml",
|
||||
"frameworks/base/packages/SystemUI/res/layout/notification_snooze.xml",
|
||||
"vendor/unbundled_google/packages/SystemUIGoogle/res/drawable/columbus_chip_background_raw.xml",
|
||||
"vendor/unbundled_google/packages/SystemUIGoogle/res/drawable/columbus_chip_background_raw.xml",
|
||||
"vendor/unbundled_google/packages/SystemUIGoogle/res/drawable/columbus_dialog_background.xml",
|
||||
"vendor/unbundled_google/packages/SystemUIGoogle/res/layout/columbus_target_request_dialog.xml",
|
||||
"vendor/unbundled_google/packages/SettingsGoogle/res/color/dream_card_suw_color_state_list.xml",
|
||||
"vendor/unbundled_google/packages/SettingsGoogle/res/drawable/dream_item_suw_rounded_bg.xml"
|
||||
]
|
||||
@@ -0,0 +1,13 @@
|
||||
[
|
||||
"vendor/google/nexus_overlay/PixelDocumentsUIGoogleOverlay/res/values-v31/themes.xml",
|
||||
"vendor/google/nexus_overlay/PixelDocumentsUIGoogleOverlay/res/values-night-v31/themes.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/values/colors.xml",
|
||||
"vendor/unbundled_google/packages/NexusLauncher/res/values/styles.xml",
|
||||
"packages/apps/Settings/res/values-night/colors.xml",
|
||||
"packages/apps/Settings/res/values/colors.xml",
|
||||
"packages/apps/Settings/res/values/styles.xml",
|
||||
"frameworks/base/packages/SystemUI/res-keyguard/values/styles.xml",
|
||||
"frameworks/base/packages/SystemUI/res/values/styles.xml",
|
||||
"vendor/unbundled_google/packages/SettingsGoogle/res/values/styles.xml",
|
||||
"vendor/unbundled_google/packages/SettingsGoogle/res/values/styles.xml"
|
||||
]
|
||||
103
packages/SystemUI/scripts/token_alignment/tsconfig.json
Normal file
103
packages/SystemUI/scripts/token_alignment/tsconfig.json
Normal file
@@ -0,0 +1,103 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
/* Visit https://aka.ms/tsconfig to read more about this file */
|
||||
|
||||
/* Projects */
|
||||
// "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
|
||||
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
|
||||
// "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
|
||||
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
|
||||
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
|
||||
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
|
||||
|
||||
/* Language and Environment */
|
||||
"target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
|
||||
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
|
||||
// "jsx": "preserve", /* Specify what JSX code is generated. */
|
||||
// "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
|
||||
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
|
||||
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
|
||||
// "jsxFragmentFactory": "", /* Speciffy the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
|
||||
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
|
||||
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
|
||||
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
|
||||
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
|
||||
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
|
||||
|
||||
/* Modules */
|
||||
"module": "commonjs", /* Specify what module code is generated. */
|
||||
// "rootDir": "./", /* Specify the root folder within your source files. */
|
||||
// "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
|
||||
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
|
||||
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
|
||||
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
|
||||
"typeRoots": ["../node_modules/@types"], /* Specify multiple folders that act like './node_modules/@types'. */
|
||||
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
|
||||
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
|
||||
"resolveJsonModule": true, /* Enable importing .json files. */
|
||||
// "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
|
||||
|
||||
/* JavaScript Support */
|
||||
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
|
||||
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
|
||||
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
|
||||
|
||||
/* Emit */
|
||||
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
|
||||
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
|
||||
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
|
||||
"sourceMap": true, /* Create source map files for emitted JavaScript files. */
|
||||
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
|
||||
// "outDir": "./", /* Specify an output folder for all emitted files. */
|
||||
// "removeComments": true, /* Disable emitting comments. */
|
||||
// "noEmit": true, /* Disable emitting files from a compilation. */
|
||||
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
|
||||
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */
|
||||
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
|
||||
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
|
||||
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
|
||||
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
|
||||
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
|
||||
// "newLine": "crlf", /* Set the newline character for emitting files. */
|
||||
// "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
|
||||
// "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
|
||||
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
|
||||
// "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
|
||||
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
|
||||
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
|
||||
|
||||
/* Interop Constraints */
|
||||
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
|
||||
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
|
||||
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
|
||||
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
|
||||
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
|
||||
|
||||
/* Type Checking */
|
||||
"strict": true, /* Enable all strict type-checking options. */
|
||||
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
|
||||
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
|
||||
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
|
||||
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
|
||||
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
|
||||
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
|
||||
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
|
||||
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
|
||||
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
|
||||
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
|
||||
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
|
||||
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
|
||||
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
|
||||
// "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
|
||||
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
|
||||
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
|
||||
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
|
||||
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
|
||||
|
||||
/* Completeness */
|
||||
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
|
||||
"skipLibCheck": true /* Skip type checking all .d.ts files. */
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user