Skip to content

Commit 8a3d84b

Browse files
committed
codemod learn using codemod AI
1 parent 724b5a5 commit 8a3d84b

File tree

32 files changed

+1150
-392
lines changed

32 files changed

+1150
-392
lines changed

.github/workflows/build.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ jobs:
2626
run: pnpm build
2727
env:
2828
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: 'pk_test_c3VtbWFyeS13YWxydXMtMjUuY2xlcmsuYWNjb3VudHMuZGV2JA'
29-
NEXT_PUBLIC_API_URL: 'http://localhost:8081'
30-
NEXT_PUBLIC_AI_API_URL: 'http://localhost:8081'
3129
NEXT_PUBLIC_AUTH_API_URL: 'http://localhost:8080'
32-
NEXT_PUBLIC_WS_URL: 'ws://localhost:8000'
30+
NEXT_PUBLIC_API_URL: 'http://localhost:8081'
31+
NEXT_PUBLIC_MODGPT_API_URL: 'http://localhost:8082'
32+
NEXT_PUBLIC_CODEMODAI_API_URL: 'http://localhost:8091'
3333
HUBSPOT_CONTACT_FORM_ID: ${{ secrets.HUBSPOT_CONTACT_FORM_ID }}
3434
HUBSPOT_JOB_FORM_ID: ${{ secrets.HUBSPOT_JOB_FORM_ID }}
3535
HUBSPOT_NEWSLETTER_FORM_ID: ${{ secrets.HUBSPOT_NEWSLETTER_FORM_ID }}

apps/backend/package.json

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@codemod-com/backend",
3-
"version": "0.0.157",
3+
"version": "0.0.159",
44
"scripts": {
55
"build": "tsc && node esbuild.config.js",
66
"start": "node build/index.js",
@@ -13,11 +13,10 @@
1313
"@codemod-com/telemetry": "workspace:*",
1414
"@codemod-com/tsconfig": "workspace:*",
1515
"@faker-js/faker": "catalog:",
16-
"@total-typescript/ts-reset": "catalog:",
1716
"@types/node": "20.10.5",
1817
"@types/parse-github-url": "catalog:",
1918
"@types/pg": "catalog:",
20-
"@types/semver": "7.5.8",
19+
"@types/semver": "catalog:",
2120
"@types/supertest": "catalog:",
2221
"@types/ws": "^8.5.11",
2322
"dotenv-cli": "catalog:",
@@ -59,7 +58,7 @@
5958
"parse-github-url": "catalog:",
6059
"pg": "catalog:",
6160
"replicate": "catalog:",
62-
"semver": "7.6.0",
61+
"semver": "catalog:",
6362
"tar": "^6.2.0",
6463
"valibot": "catalog:",
6564
"ws": "^8.18.0",

apps/backend/src/schemata/schema.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,7 @@ export const ivObjectSchema = object({
141141
export const parseIv = (input: unknown) => parse(ivObjectSchema, input);
142142

143143
export const diffCreationBodySchema = object({
144-
before: string(),
145-
after: string(),
144+
diffs: array(object({ before: string(), after: string() })),
146145
source: union([literal("cli"), literal("studio")]),
147146
name: optional(string(), "untitled"),
148147
});
@@ -154,6 +153,17 @@ export const getCodeDiffSchema = object({
154153
id: string(),
155154
});
156155

156+
export const beforeAfterDiffSchema = object({
157+
before: string(),
158+
after: string(),
159+
});
160+
161+
export const parseBeforeAfterDiff = (input: unknown) =>
162+
parse(beforeAfterDiffSchema, input);
163+
164+
export const parseBeforeAfterDiffArray = (input: unknown) =>
165+
parse(array(beforeAfterDiffSchema), input);
166+
157167
export const parseGetCodeDiffParams = (input: unknown) =>
158168
parse(getCodeDiffSchema, input);
159169

apps/backend/src/server.ts

+49-46
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { randomBytes } from "node:crypto";
2-
import type { CodemodListResponse } from "@codemod-com/api-types";
2+
import {
3+
type ApiResponse,
4+
BAD_REQUEST,
5+
type CodemodListResponse,
6+
INTERNAL_SERVER_ERROR,
7+
} from "@codemod-com/api-types";
38
import { getAuthPlugin } from "@codemod-com/auth";
49
import { prisma } from "@codemod-com/database";
510
import { decryptWithIv, encryptWithIv } from "@codemod-com/utilities";
@@ -10,6 +15,7 @@ import Fastify, {
1015
type FastifyPluginCallback,
1116
type FastifyRequest,
1217
} from "fastify";
18+
import type { InferOutput } from "valibot";
1319
import {
1420
type GetCodemodDownloadLinkResponse,
1521
getCodemodDownloadLink,
@@ -25,6 +31,8 @@ import {
2531
publishHandler,
2632
} from "./publishHandler.js";
2733
import {
34+
type beforeAfterDiffSchema,
35+
parseBeforeAfterDiffArray,
2836
parseCreateIssueBody,
2937
parseCreateIssueParams,
3038
parseDiffCreationBody,
@@ -189,48 +197,46 @@ const routes: FastifyPluginCallback = (instance, _opts, done) => {
189197
getCodemodsListHandler,
190198
);
191199

192-
instance.get<{ Reply: { before: string; after: string } }>(
193-
"/diffs/:id",
194-
async (request, reply) => {
195-
const { id } = parseGetCodeDiffParams(request.params);
196-
const { iv: ivStr } = parseIv(request.query);
200+
instance.get<{
201+
Reply: ApiResponse<{ diffs: InferOutput<typeof beforeAfterDiffSchema>[] }>;
202+
}>("/diffs/:id", async (request, reply) => {
203+
const { id } = parseGetCodeDiffParams(request.params);
204+
const { iv: ivStr } = parseIv(request.query);
197205

198-
const key = Buffer.from(environment.ENCRYPTION_KEY, "base64url");
199-
const iv = Buffer.from(ivStr, "base64url");
206+
const key = Buffer.from(environment.ENCRYPTION_KEY, "base64url");
207+
const iv = Buffer.from(ivStr, "base64url");
200208

201-
const codeDiff = await prisma.codeDiff.findUnique({
202-
where: { id },
203-
});
209+
const codeDiff = await prisma.codeDiff.findUnique({
210+
where: { id },
211+
});
204212

205-
if (!codeDiff) {
206-
reply.code(400).send();
207-
return;
208-
}
213+
if (!codeDiff) {
214+
return reply
215+
.code(400)
216+
.send({ errorText: "Code diff not found", error: BAD_REQUEST });
217+
}
209218

210-
let before: string;
211-
let after: string;
212-
try {
213-
before = decryptWithIv(
214-
"aes-256-cbc",
215-
{ key, iv },
216-
Buffer.from(codeDiff.before, "base64url"),
217-
).toString();
218-
after = decryptWithIv(
219-
"aes-256-cbc",
220-
{ key, iv },
221-
Buffer.from(codeDiff.after, "base64url"),
222-
).toString();
223-
} catch (err) {
224-
reply.code(400).send();
225-
return;
226-
}
219+
try {
220+
const diffs = parseBeforeAfterDiffArray(
221+
JSON.parse(
222+
decryptWithIv(
223+
"aes-256-cbc",
224+
{ key, iv },
225+
Buffer.from(codeDiff.diffs, "base64url"),
226+
).toString(),
227+
),
228+
);
227229

228-
reply.type("application/json").code(200);
229-
return { before, after };
230-
},
231-
);
230+
reply.type("application/json").code(200).send({ diffs });
231+
} catch (err) {
232+
return reply.code(400).send({
233+
errorText: `Failed to decrypt the diffs array: ${(err as Error).message}`,
234+
error: INTERNAL_SERVER_ERROR,
235+
});
236+
}
237+
});
232238

233-
instance.post<{ Reply: { id: string; iv: string } }>(
239+
instance.post<{ Reply: ApiResponse<{ id: string; iv: string }> }>(
234240
"/diffs",
235241
async (request, reply) => {
236242
const body = parseDiffCreationBody(request.body);
@@ -242,21 +248,18 @@ const routes: FastifyPluginCallback = (instance, _opts, done) => {
242248
data: {
243249
name: body.name,
244250
source: body.source,
245-
before: encryptWithIv(
251+
diffs: encryptWithIv(
246252
"aes-256-cbc",
247253
{ key, iv },
248-
Buffer.from(body.before),
249-
).toString("base64url"),
250-
after: encryptWithIv(
251-
"aes-256-cbc",
252-
{ key, iv },
253-
Buffer.from(body.after),
254+
Buffer.from(JSON.stringify(body.diffs)),
254255
).toString("base64url"),
255256
},
256257
});
257258

258-
reply.type("application/json").code(200);
259-
return { id: codeDiff.id, iv: iv.toString("base64url") };
259+
return reply
260+
.type("application/json")
261+
.code(200)
262+
.send({ id: codeDiff.id, iv: iv.toString("base64url") });
260263
},
261264
);
262265

apps/cli/build.js

+18-5
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,31 @@ import { hideBin } from "yargs/helpers";
44
// Build envs for local production build, can be used by running `pnpm build --prod`
55
const localProdBuildEnvs = {
66
"process.env.NODE_ENV": '"production"',
7+
"process.env.IGNORE_TELEMETRY": "true",
8+
79
"process.env.BACKEND_URL": '"https://backend.codemod.com"',
810
"process.env.AUTH_BACKEND_URL": '"https://backend.codemod.com/auth"',
11+
"process.env.RUNNER_URL": '"http://backend.codemod.com/run"',
12+
"process.env.MODGPT_URL": '"http://backend.codemod.com/modgpt"',
13+
"process.env.CODEMODAI_URL": '"http://backend.codemod.com/ai"',
14+
915
"process.env.CODEMOD_HOME_PAGE_URL": '"https://codemod.com"',
1016
"process.env.CODEMOD_STUDIO_URL": '"https://codemod.com/studio"',
11-
"process.env.IGNORE_TELEMETRY": "true",
12-
"process.env.RUNNER_URL": '"https://backend.codemod.com/run"',
1317
};
1418

1519
// Build envs for staging, it is the default when running `pnpm build`
1620
const stagingBuildEnvs = {
1721
"process.env.NODE_ENV": '"staging"',
22+
"process.env.IGNORE_TELEMETRY": "true",
23+
1824
"process.env.BACKEND_URL": '"https://staging-backend.codemod.com"',
1925
"process.env.AUTH_BACKEND_URL": '"https://staging-backend.codemod.com/auth"',
26+
"process.env.RUNNER_URL": '"http://staging-backend.codemod.com/run"',
27+
"process.env.MODGPT_URL": '"http://staging-backend.codemod.com/modgpt"',
28+
"process.env.CODEMODAI_URL": '"http://staging-backend.codemod.com/ai"',
29+
2030
"process.env.CODEMOD_HOME_PAGE_URL": '"https://staging.codemod.com"',
2131
"process.env.CODEMOD_STUDIO_URL": '"https://staging.codemod.com/studio"',
22-
"process.env.IGNORE_TELEMETRY": "true",
2332
};
2433

2534
// Build envs for publishing to npm, it would usually happen during prepublishOnly script
@@ -32,12 +41,16 @@ const publishEnvs = {
3241
// Can be used by running `pnpm build --local`
3342
const localEnvs = {
3443
"process.env.NODE_ENV": '"development"',
44+
"process.env.IGNORE_TELEMETRY": "true",
45+
3546
"process.env.BACKEND_URL": '"http://localhost:8081"',
3647
"process.env.AUTH_BACKEND_URL": '"http://localhost:8080"',
48+
"process.env.RUNNER_URL": '"http://localhost:8083"',
49+
"process.env.MODGPT_URL": '"http://localhost:8084"',
50+
"process.env.CODEMODAI_URL": '"http://localhost:8091"',
51+
3752
"process.env.CODEMOD_HOME_PAGE_URL": '"http://localhost:3000"',
3853
"process.env.CODEMOD_STUDIO_URL": '"http://localhost:3000/studio"',
39-
"process.env.IGNORE_TELEMETRY": "true",
40-
"process.env.RUNNER_URL": '"http://localhost:8083"',
4154
};
4255

4356
const argv = hideBin(process.argv);

apps/cli/env.d.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,16 @@ declare global {
22
namespace NodeJS {
33
interface ProcessEnv {
44
NODE_ENV: "development" | "production";
5+
IGNORE_TELEMETRY: boolean;
6+
57
BACKEND_URL: string;
68
AUTH_BACKEND_URL: string;
9+
RUNNER_URL: string;
10+
MODGPT_URL: string;
11+
CODEMODAI_URL: string
12+
713
CODEMOD_HOME_PAGE_URL: string;
814
CODEMOD_STUDIO_URL: string;
9-
IGNORE_TELEMETRY: boolean;
1015
}
1116
}
1217
}

apps/cli/package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"imports": {
55
"#*": "./src/*"
66
},
7-
"version": "0.13.7",
7+
"version": "0.14.0",
88
"description": "A codemod engine for Node.js libraries (jscodeshift, ts-morph, etc.)",
99
"type": "module",
1010
"exports": null,
@@ -47,7 +47,7 @@
4747
"@types/inquirer": "catalog:",
4848
"@types/node": "18.11.9",
4949
"@types/prettyjson": "catalog:",
50-
"@types/semver": "^7.5.8",
50+
"@types/semver": "catalog:",
5151
"@types/yargs": "catalog:",
5252
"@vitest/coverage-v8": "catalog:",
5353
"axios": "catalog:",
@@ -61,7 +61,7 @@
6161
"open": "catalog:",
6262
"prettier": "^3.2.5",
6363
"prettyjson": "catalog:",
64-
"semver": "^7.6.2",
64+
"semver": "catalog:",
6565
"terminal-link": "catalog:",
6666
"ts-morph": "18.0.0",
6767
"valibot": "catalog:",

0 commit comments

Comments
 (0)