From 79a11faaa6daf492e4197ae24b83a7b592e4c878 Mon Sep 17 00:00:00 2001 From: Avior Date: Sun, 2 May 2021 17:03:10 +0200 Subject: [PATCH] Added Codeshift file Signed-off-by: Avior --- codeshift/index.ts | 107 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 codeshift/index.ts diff --git a/codeshift/index.ts b/codeshift/index.ts new file mode 100644 index 000000000..b41976cbb --- /dev/null +++ b/codeshift/index.ts @@ -0,0 +1,107 @@ +import { ArrayExpression, Identifier, JSCodeshift, Literal, ObjectExpression, Property, Transform } from "jscodeshift"; + +/** + * This file is ran when there is mass changes being done + */ + +interface ObjectField { + type: 'Object' + items: Record + item: ObjectExpression +} + +interface EndField { + type: 'Literal' + item: Literal +} + +interface ArrayField { + type: 'Array' + items: Array + item: ArrayExpression +} + +type Field = ObjectField | EndField | ArrayField +type Possible = ObjectExpression | ArrayExpression | Literal + +function processItem(value: Possible): Field { + + if (value.type === 'ObjectExpression') { + return simplify(value) + } else if (value.type === 'ArrayExpression') { + const field: Field = { + type: 'Array', + items: [], + item: value + } + value.elements.forEach((it) => { + field.items.push(processItem(it as Possible)) + }) + return field + } else { + return { + type: 'Literal', + item: value + } + } +} + +function simplify(base: ObjectExpression): ObjectField { + const list: ObjectField['items'] = {} + base.properties.forEach((it) => { + const item = it as Property + const key = (item.key as Identifier).name + list[key] = processItem(item.value as Possible) + }) + return { + type: 'Object', + items: list, + item: base + } +} + +function set(j: JSCodeshift, path: ObjectExpression | ArrayExpression, value: Possible, key: string | number, options?: {override?: boolean}) { + + let exists = false + if (path.type === 'ObjectExpression') { + path.properties.forEach((p) => { + const prop = p as Property + if ((prop.key as Identifier).name === (key + '')) { + exists = true + if (!options?.override) { + console.warn('Property already exist, add the option override to change it') + return + } + prop.value = value + } + }) + if (exists) {return} + path.properties.push(j.property('init', j.identifier(key + ''), value)) + } else { + + } +} + +const transformer: Transform = (file, api) => { + const j = api.jscodeshift + + const root = j(file.source) + return root + .find(j.ObjectExpression) + .forEach((path, index) => { + if (index !== 0) return + let simplified = simplify(path.node) + + // Run sodechanges + // set(j, simplified.item, j.objectExpression([ + // j.property('init', j.identifier('normal'), j.booleanLiteral(true)), + // j.property('init', j.identifier('reverse'), j.booleanLiteral(true)), + // j.property('init', j.identifier('holo'), j.booleanLiteral(false)), + // j.property('init', j.identifier('firstEdition'), j.booleanLiteral(false)), + // ]), 'variants') + }) + .toSource({useTabs: true, lineTerminator: '\n'}).replace(/ /g, ' ') +} + +module.exports = transformer +module.exports.parser = 'ts'