Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# jscodeshift Plugin

The `jscodeshift` plugin is a tool used for running codemods over JavaScript and TypeScript codebases. It leverages the `jscodeshift` library, which provides a simple API for transforming code using the power of abstract syntax trees (ASTs).
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { createGrid } from '@ag-grid-community/core';

const gridApi = createGrid(document.body, {
columnDefs: [],
rowData: [],
});

const flag = true;

gridApi.autoSizeAllColumns();
gridApi?.autoSizeAllColumns(true);
gridApi?.autoSizeAllColumns(false);
gridApi.autoSizeAllColumns(flag);
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = [];
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { createGrid } from '@ag-grid-community/core';

const gridApi = createGrid(document.body, {
columnDefs: [],
rowData: [],
});

const flag = true;

gridApi.autoSizeAllColumns();
gridApi?.autoSizeAllColumns({
skipHeaders: true
});
gridApi?.autoSizeAllColumns({
skipHeaders: false
});
gridApi.autoSizeAllColumns({
skipHeaders: flag
});
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = [];
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"scenario": {
"input": "input.js",
"output": "output.js",
"errors": "output.errors.cjs",
"warnings": "output.warnings.cjs"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { createGrid } from '@ag-grid-community/core';

const gridApi = createGrid(document.body, {
columnDefs: [],
rowData: [],
});

const array = ['bar'];
const flag = true;

gridApi.autoSizeColumns(['foo'], true);
gridApi?.autoSizeColumns(['foo'], false);
gridApi.autoSizeColumns(array, flag);
gridApi.autoSizeColumns(array);
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = [];
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { createGrid } from '@ag-grid-community/core';

const gridApi = createGrid(document.body, {
columnDefs: [],
rowData: [],
});

const array = ['bar'];
const flag = true;

gridApi.autoSizeColumns({
colIds: ['foo'],
skipHeader: true
});
gridApi?.autoSizeColumns({
colIds: ['foo'],
skipHeader: false
});
gridApi.autoSizeColumns({
colIds: array,
skipHeader: flag
});
gridApi.autoSizeColumns({
colIds: array
});
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = [];
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"scenario": {
"input": "input.js",
"output": "output.js",
"errors": "output.errors.cjs",
"warnings": "output.warnings.cjs"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
export * from './jscodeshift.adapter';

import { type AstCliContext, type AstTransform } from '@ag-grid-devtools/ast';
import {
transformAutoSizeColumnsArguments,
transformAutoSizeAllColumnsArguments,
} from './transforms';
import { jsCodeShiftTransform } from '../../plugins/jscodeshift';

const transform: AstTransform<AstCliContext> = function (_babel) {
return jsCodeShiftTransform(
transformAutoSizeColumnsArguments,
transformAutoSizeAllColumnsArguments,
)(_babel);
};

export default transform;
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import j, { Collection } from 'jscodeshift';
import { AstCliContext, AstTransform, NodePath } from '@ag-grid-devtools/ast';

export type JSCodeShiftTransformer = (root: Collection) => void | any;

// Use https://astexplorer.net/ to iterate on your transformer
// Parser: Typescript
// Transform: jscodeshift
//
// NOTE: Less efficient than the raw visitor pattern, but:
// * + easier to write (the tree is already parsed)
// * + easier to reason about
// * + easier to iterate over
// * - multiple passes through parse/transform cycle
export const jsCodeShiftTransform = (
...transforms: JSCodeShiftTransformer[]
): AstTransform<AstCliContext> => {
return (_babel) => ({
visitor: {
Program: {
exit(path: NodePath) {
const root: Collection<any> = j((path.hub as any).file.ast);
const getFirstNode = () => root.find(j.Program).get('body', 0).node;

// save initial comment if any
const firstNode = getFirstNode();
const { comments } = firstNode;

// transform
for (const transform of transforms) {
transform(root);
}

// restore initial comment if any
const firstNode2 = getFirstNode();
if (firstNode2 !== firstNode) {
firstNode2.comments = comments;
}

// inject result back into babel AST
const program = root.getAST()[0].node.program;
path.replaceWith(program);
},
},
},
});
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { type TransformManifest } from '@ag-grid-devtools/types';

const manifest: TransformManifest = {
name: 'Transform Grid API Methods v34.0',
description: 'Transform deprecated Grid API methods',
};

export default manifest;
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"name": "JSCodeshift",
"description": "Transform using JSCodeshift"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
import { describe, expect, onTestFinished, test } from 'vitest';
import { loadTransformScenarios } from '../../test/runners/transform';

import transformGridApiMethodsV34_0 from '.';

const __dirname = dirname(fileURLToPath(import.meta.url));

describe(transformGridApiMethodsV34_0, () => {
const scenariosPath = join(__dirname, './__fixtures__/scenarios');
loadTransformScenarios(scenariosPath, {
transforms: [transformGridApiMethodsV34_0],
vitest: { describe, expect, test, onTestFinished },
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import j from 'jscodeshift';
import { JSCodeShiftTransformer } from '../jscodeshift.adapter';

export const transformAutoSizeColumnsArguments: JSCodeShiftTransformer = (root) =>
root
.find(j.CallExpression, {
callee: {
property: {
name: 'autoSizeColumns',
},
},
})
.forEach((path) => {
const args = path.node.arguments;

if (args.some((a) => j.SpreadElement.check(a))) {
// can't support spread arguments
return;
}

const [colKeys, skipHeader] = args;

const properties = [];
if (!j.SpreadElement.check(colKeys)) {
properties.push(j.objectProperty(j.identifier('colIds'), colKeys));
}
if (skipHeader && !j.SpreadElement.check(skipHeader)) {
properties.push(j.objectProperty(j.identifier('skipHeader'), skipHeader));
}

path.node.arguments = [j.objectExpression(properties)];
});

export const transformAutoSizeAllColumnsArguments: JSCodeShiftTransformer = (root) =>
root
.find(j.CallExpression, {
callee: {
property: {
name: 'autoSizeAllColumns',
},
},
})
.forEach((path) => {
const args = path.node.arguments;

if (args.length === 0) {
return;
}

if (args.some((a) => j.SpreadElement.check(a))) {
// can't support spread arguments
return;
}

const properties = [];
if (!j.SpreadElement.check(args[0])) {
properties.push(j.objectProperty(j.identifier('skipHeaders'), args[0]));
}

path.node.arguments = [j.objectExpression(properties)];
});
35 changes: 35 additions & 0 deletions packages/cli/src/codemods/versions/34.0.0/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# 34.0.0

Codemod for upgrading to [AG Grid v34.0.0](https://github.com/ag-grid/ag-grid/releases/tag/v34.0.0)

## Usage

```
npx @ag-grid-devtools/cli migrate --to 34.0.0
```

Source code transformations applied by this codemod are specified in [`transforms.ts`](./transforms.ts).

## Common tasks

### Add a transform

Option 1: Create a new source code transformation to add to this codemod release version:

```
pnpm run task:create-transform --release 34.0.0
```

Option 2: Add an existing source code transformation to this codemod release version:

```
pnpm run task:include-transform --version 34.0.0
```

### Add a test case

Create a new unit test scenario for this version:

```
pnpm run task:create-test --type version --target 34.0.0
```
16 changes: 16 additions & 0 deletions packages/cli/src/codemods/versions/34.0.0/codemod.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
import { describe, expect, onTestFinished, test } from 'vitest';
import { loadCodemodExampleScenarios } from '../../test/runners/codemod';

import codemod from './codemod';

const __dirname = dirname(fileURLToPath(import.meta.url));

describe(codemod, () => {
const scenariosPath = join(__dirname, './__fixtures__/scenarios');
loadCodemodExampleScenarios(scenariosPath, {
codemod,
vitest: { describe, expect, test, onTestFinished },
});
});
24 changes: 24 additions & 0 deletions packages/cli/src/codemods/versions/34.0.0/codemod.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { transformFileAst } from '@ag-grid-devtools/codemod-utils';
import {
type Codemod,
type CodemodInput,
type CodemodOptions,
type CodemodResult,
} from '@ag-grid-devtools/types';

import transforms from './transforms';

const codemod: Codemod = function codemodV34_0_0(
file: CodemodInput,
options: CodemodOptions,
): CodemodResult {
const { path, source } = file;
const { fs, userConfig } = options;
return transformFileAst(source, transforms, {
filename: path,
fs,
userConfig,
});
};

export default codemod;
13 changes: 13 additions & 0 deletions packages/cli/src/codemods/versions/34.0.0/manifest.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { type TransformManifest, type VersionManifest } from '@ag-grid-devtools/types';

import transformGridApiMethodsV34_0 from '../../transforms/transform-grid-api-methods-v34-0/manifest.ts';

const transforms: Array<TransformManifest> = [transformGridApiMethodsV34_0];

const manifest: VersionManifest = {
version: '34.0.0',
codemodPath: 'versions/34.0.0',
transforms,
};

export default manifest;
7 changes: 7 additions & 0 deletions packages/cli/src/codemods/versions/34.0.0/transforms.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { type AstCliContext, type AstTransform } from '@ag-grid-devtools/ast';

import transformGridApiMethodsV34_0 from '../../transforms/transform-grid-api-methods-v34-0';

const transforms: Array<AstTransform<AstCliContext>> = [transformGridApiMethodsV34_0];

export default transforms;
3 changes: 3 additions & 0 deletions packages/cli/src/codemods/versions/manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import v33_2_0 from './33.2.0/manifest';

import v33_3_0 from './33.3.0/manifest';

import v34_0_0 from './34.0.0/manifest';

const versions: Array<VersionManifest> = [
v31_0_0,
v31_1_0,
Expand All @@ -31,6 +33,7 @@ const versions: Array<VersionManifest> = [
v33_1_0,
v33_2_0,
v33_3_0,
v34_0_0,
];

export default versions;
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
import { describe, expect, onTestFinished, test } from 'vitest';
import { loadTransformScenarios } from '../../test/runners/transform';

import <%= identifier %> from '.';

const __dirname = dirname(fileURLToPath(import.meta.url));

describe(<%= identifier %>, () => {
const scenariosPath = join(__dirname, './__fixtures__/scenarios');
loadTransformScenarios(scenariosPath, {
transforms: [<%= identifier %>],
vitest: { describe, expect, test, onTestFinished },
});
});
Loading