@shivaedev/create-app 0.28.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +60 -0
- package/README.md +1 -1
- package/dist/cli.js +76 -71
- package/dist/createApp.d.ts +2 -2
- package/dist/createApp.d.ts.map +1 -1
- package/dist/createApp.js +9 -3
- package/dist/createApp.js.map +1 -1
- package/dist/updateApp.d.ts.map +1 -1
- package/dist/updateApp.js +11 -6
- package/dist/updateApp.js.map +1 -1
- package/dist/updateChecks.d.ts +4 -0
- package/dist/updateChecks.d.ts.map +1 -0
- package/dist/updateChecks.js +44 -0
- package/dist/updateChecks.js.map +1 -0
- package/package.json +3 -3
- package/src/createApp.ts +9 -3
- package/src/updateApp.ts +11 -6
- package/src/updateChecks.ts +47 -0
- package/template.json +1 -1
package/dist/createApp.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Effect, FileSystem } from "effect";
|
|
1
|
+
import { Crypto, Effect, FileSystem } from "effect";
|
|
2
2
|
import { ChildProcessSpawner } from "effect/process";
|
|
3
3
|
import { CreateAppError } from "./CreateAppError.ts";
|
|
4
4
|
export declare const createApp: (folder: string, templatePath: string, options: {
|
|
5
5
|
readonly git: boolean;
|
|
6
6
|
readonly minimal: boolean;
|
|
7
7
|
readonly version: string;
|
|
8
|
-
}) => Effect.Effect<undefined, CreateAppError | import("effect/PlatformError").PlatformError | import("effect/Schema").SchemaError, ChildProcessSpawner.ChildProcessSpawner | FileSystem.FileSystem>;
|
|
8
|
+
}) => Effect.Effect<undefined, CreateAppError | import("effect/PlatformError").PlatformError | import("effect/Schema").SchemaError, ChildProcessSpawner.ChildProcessSpawner | Crypto.Crypto | FileSystem.FileSystem>;
|
|
9
9
|
//# sourceMappingURL=createApp.d.ts.map
|
package/dist/createApp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createApp.d.ts","sourceRoot":"","sources":["../src/createApp.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"createApp.d.ts","sourceRoot":"","sources":["../src/createApp.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAgB,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAKrD,eAAO,MAAM,SAAS;kBAGI,OAAO;sBAAoB,OAAO;sBAAoB,MAAM;oNAiDpF,CAAC"}
|
package/dist/createApp.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
2
|
import { basename, join, resolve } from "node:path";
|
|
3
|
-
import { Console, Effect, FileSystem } from "effect";
|
|
3
|
+
import { Console, Crypto, Effect, FileSystem } from "effect";
|
|
4
4
|
import { ChildProcess, ChildProcessSpawner } from "effect/process";
|
|
5
5
|
import { databaseName } from "./appFiles.js";
|
|
6
6
|
import { CreateAppError } from "./CreateAppError.js";
|
|
@@ -23,7 +23,9 @@ export const createApp = Effect.fn("CreateApp.createApp")(function* (folder, tem
|
|
|
23
23
|
yield* writeGeneration(target, { ...(options.minimal ? { minimal: true } : {}), name, version: options.version });
|
|
24
24
|
yield* fs.symlink("AGENTS.md", join(target, "CLAUDE.md"));
|
|
25
25
|
const database = databaseName(name);
|
|
26
|
-
|
|
26
|
+
const crypto = yield* Crypto.Crypto;
|
|
27
|
+
const secret = Buffer.from(yield* crypto.randomBytes(32)).toString("base64url");
|
|
28
|
+
yield* fs.writeFileString(join(target, ".env.local"), `DATABASE_URL=postgresql://postgres:postgres@127.0.0.1:55432/${database}_dev\nTEST_DATABASE_URL=postgresql://postgres:postgres@127.0.0.1:55432/${database}_test\nBETTER_AUTH_SECRET=${secret}\n`, { flag: "wx", mode: 0o600 });
|
|
27
29
|
const initialized = options.git && (yield* initializeGit(target));
|
|
28
30
|
const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
|
|
29
31
|
const code = yield* spawner.exitCode(ChildProcess.make("pnpm", ["run", "setup"], { cwd: target, stderr: "inherit", stdout: "inherit" }));
|
|
@@ -41,6 +43,10 @@ export const createApp = Effect.fn("CreateApp.createApp")(function* (folder, tem
|
|
|
41
43
|
}
|
|
42
44
|
}
|
|
43
45
|
if (initialized) {
|
|
46
|
+
const pruned = yield* spawner.exitCode(ChildProcess.make("pnpm", ["baseline", "prune"], { cwd: target, stderr: "inherit", stdout: "inherit" }));
|
|
47
|
+
if (pruned !== 0) {
|
|
48
|
+
return yield* new CreateAppError({ message: `pnpm baseline prune failed (exit ${pruned}). Run pnpm baseline prune in ${folder} to retry.` });
|
|
49
|
+
}
|
|
44
50
|
yield* commitGit(target);
|
|
45
51
|
}
|
|
46
52
|
const quotedFolder = `'${folder.replaceAll("'", "'\"'\"'")}'`;
|
package/dist/createApp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createApp.js","sourceRoot":"","sources":["../src/createApp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"createApp.js","sourceRoot":"","sources":["../src/createApp.ts"],"names":[],"mappings":"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"}
|
package/dist/updateApp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateApp.d.ts","sourceRoot":"","sources":["../src/updateApp.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"updateApp.d.ts","sourceRoot":"","sources":["../src/updateApp.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAQrD,eAAO,MAAM,SAAS,mQAyCpB,CAAC"}
|
package/dist/updateApp.js
CHANGED
|
@@ -6,6 +6,7 @@ import { historicalTemplate } from "./historicalTemplate.js";
|
|
|
6
6
|
import { checkedProcess, runProcess } from "./runProcess.js";
|
|
7
7
|
import { starterPatch } from "./starterPatch.js";
|
|
8
8
|
import { appTemplate } from "./template.js";
|
|
9
|
+
import { updateChecks } from "./updateChecks.js";
|
|
9
10
|
export const updateApp = Effect.fn("CreateApp.updateApp")(function* (folder, templatePath, version) {
|
|
10
11
|
return yield* Effect.scoped(Effect.gen(function* () {
|
|
11
12
|
const fs = yield* FileSystem.FileSystem;
|
|
@@ -23,15 +24,19 @@ export const updateApp = Effect.fn("CreateApp.updateApp")(function* (folder, tem
|
|
|
23
24
|
const result = yield* runProcess(target, "git", ["apply", "--3way", patch.path]);
|
|
24
25
|
if (result.code !== 0) {
|
|
25
26
|
const conflicts = (yield* checkedProcess(target, "git", ["diff", "--name-only", "--diff-filter=U"])).trim();
|
|
26
|
-
|
|
27
|
-
message:
|
|
28
|
-
|
|
29
|
-
: result.stderr.trim(),
|
|
30
|
-
});
|
|
27
|
+
if (!conflicts) {
|
|
28
|
+
return yield* new CreateAppError({ message: result.stderr.trim() });
|
|
29
|
+
}
|
|
31
30
|
}
|
|
32
31
|
}
|
|
33
32
|
yield* writeGeneration(target, { ...generation, version });
|
|
34
|
-
yield*
|
|
33
|
+
const failures = yield* updateChecks(target);
|
|
34
|
+
if (failures.length > 0) {
|
|
35
|
+
return yield* new CreateAppError({
|
|
36
|
+
message: `Recorded create-app ${version}. Finish the update before committing:\n${failures.join("\n\n")}`,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
yield* Console.log(`Applied create-app ${version}. Install and typecheck passed. Review the changes and commit when ready.`);
|
|
35
40
|
}));
|
|
36
41
|
});
|
|
37
42
|
//# sourceMappingURL=updateApp.js.map
|
package/dist/updateApp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateApp.js","sourceRoot":"","sources":["../src/updateApp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"updateApp.js","sourceRoot":"","sources":["../src/updateApp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { CreateAppError } from "./CreateAppError.ts";
|
|
3
|
+
export declare const updateChecks: (target: string) => Effect.Effect<string[], CreateAppError | import("effect/PlatformError").PlatformError, import("effect/process/ChildProcessSpawner").ChildProcessSpawner>;
|
|
4
|
+
//# sourceMappingURL=updateChecks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateChecks.d.ts","sourceRoot":"","sources":["../src/updateChecks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAsBrD,eAAO,MAAM,YAAY,8KAuBvB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Console, Effect } from "effect";
|
|
2
|
+
import { CreateAppError } from "./CreateAppError.js";
|
|
3
|
+
import { checkedProcess, runProcess } from "./runProcess.js";
|
|
4
|
+
const conflictMarkers = Effect.fn("CreateApp.conflictMarkers")(function* (target) {
|
|
5
|
+
const result = yield* runProcess(target, "git", [
|
|
6
|
+
"grep",
|
|
7
|
+
"--untracked",
|
|
8
|
+
"--exclude-standard",
|
|
9
|
+
"-I",
|
|
10
|
+
"-l",
|
|
11
|
+
"-z",
|
|
12
|
+
"-E",
|
|
13
|
+
"^((<{7}|[|]{7}|>{7})( |$)|={7}$)",
|
|
14
|
+
"--",
|
|
15
|
+
".",
|
|
16
|
+
]);
|
|
17
|
+
if (result.code > 1) {
|
|
18
|
+
return yield* new CreateAppError({ message: `Could not check conflict markers: ${result.stderr.trim()}` });
|
|
19
|
+
}
|
|
20
|
+
return result.stdout.split("\0").filter(Boolean);
|
|
21
|
+
});
|
|
22
|
+
export const updateChecks = Effect.fn("CreateApp.updateChecks")(function* (target) {
|
|
23
|
+
const failures = [];
|
|
24
|
+
for (const args of [["install"], ["run", "typecheck"]]) {
|
|
25
|
+
yield* Console.log(`Running pnpm ${args.join(" ")}...`);
|
|
26
|
+
const result = yield* runProcess(target, "pnpm", args);
|
|
27
|
+
if (result.code !== 0) {
|
|
28
|
+
failures.push(`pnpm ${args.join(" ")} failed (exit ${result.code}):\n${result.stdout}${result.stderr}`.trim());
|
|
29
|
+
if (`${result.stdout}${result.stderr}`.includes("ERR_PNPM_TRUST_DOWNGRADE")) {
|
|
30
|
+
failures.push("To re-resolve transitive packages pinned by the old lockfile while keeping trustPolicy enabled, run pnpm update --depth Infinity, then pnpm run typecheck. If a flagged version is pinned exactly in the manifest or catalog, change that pin to a trusted version first.");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const markers = yield* conflictMarkers(target);
|
|
35
|
+
if (markers.length > 0) {
|
|
36
|
+
failures.unshift(`Files with conflict markers:\n${markers.join("\n")}`);
|
|
37
|
+
}
|
|
38
|
+
const unresolved = (yield* checkedProcess(target, "git", ["diff", "--name-only", "--diff-filter=U"])).trim();
|
|
39
|
+
if (unresolved !== "") {
|
|
40
|
+
failures.push(`Unresolved Git conflicts:\n${unresolved}`);
|
|
41
|
+
}
|
|
42
|
+
return failures;
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=updateChecks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateChecks.js","sourceRoot":"","sources":["../src/updateChecks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAc;IACvF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE;QAC/C,MAAM;QACN,aAAa;QACb,oBAAoB;QACpB,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,kCAAkC;QAClC,IAAI;QACJ,GAAG;KACH,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,qCAAqC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAc;IACxF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QACxD,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/G,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;gBAC7E,QAAQ,CAAC,IAAI,CACZ,2QAA2Q,CAC3Q,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,QAAQ,CAAC,OAAO,CAAC,iCAAiC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7G,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/create-app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.30.0",
|
|
4
4
|
"description": "Create and install a Platform application from the maintained starter",
|
|
5
5
|
"homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/create-app#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -49,8 +49,8 @@
|
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@effect/platform-node": "4.0.6",
|
|
51
51
|
"@effect/platform-node-shared": "4.0.6",
|
|
52
|
-
"@shivaedev/quality": "0.
|
|
53
|
-
"@shivaedev/test-story": "0.
|
|
52
|
+
"@shivaedev/quality": "0.50.0",
|
|
53
|
+
"@shivaedev/test-story": "0.30.0",
|
|
54
54
|
"@types/node": "24.19.2",
|
|
55
55
|
"effect": "4.0.6",
|
|
56
56
|
"esbuild": "0.28.2",
|
package/src/createApp.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
2
|
import { basename, join, resolve } from "node:path";
|
|
3
|
-
import { Console, Effect, FileSystem } from "effect";
|
|
3
|
+
import { Console, Crypto, Effect, FileSystem } from "effect";
|
|
4
4
|
import { ChildProcess, ChildProcessSpawner } from "effect/process";
|
|
5
5
|
import { databaseName } from "./appFiles.ts";
|
|
6
6
|
import { CreateAppError } from "./CreateAppError.ts";
|
|
@@ -28,9 +28,11 @@ export const createApp = Effect.fn("CreateApp.createApp")(function* (
|
|
|
28
28
|
yield* writeGeneration(target, { ...(options.minimal ? { minimal: true } : {}), name, version: options.version });
|
|
29
29
|
yield* fs.symlink("AGENTS.md", join(target, "CLAUDE.md"));
|
|
30
30
|
const database = databaseName(name);
|
|
31
|
+
const crypto = yield* Crypto.Crypto;
|
|
32
|
+
const secret = Buffer.from(yield* crypto.randomBytes(32)).toString("base64url");
|
|
31
33
|
yield* fs.writeFileString(
|
|
32
34
|
join(target, ".env.local"),
|
|
33
|
-
`DATABASE_URL=postgresql://postgres:postgres@127.0.0.1:55432/${database}_dev\nTEST_DATABASE_URL=postgresql://postgres:postgres@127.0.0.1:55432/${database}_test\nBETTER_AUTH_SECRET=${
|
|
35
|
+
`DATABASE_URL=postgresql://postgres:postgres@127.0.0.1:55432/${database}_dev\nTEST_DATABASE_URL=postgresql://postgres:postgres@127.0.0.1:55432/${database}_test\nBETTER_AUTH_SECRET=${secret}\n`,
|
|
34
36
|
{ flag: "wx", mode: 0o600 },
|
|
35
37
|
);
|
|
36
38
|
const initialized = options.git && (yield* initializeGit(target));
|
|
@@ -50,6 +52,10 @@ export const createApp = Effect.fn("CreateApp.createApp")(function* (
|
|
|
50
52
|
}
|
|
51
53
|
}
|
|
52
54
|
if (initialized) {
|
|
55
|
+
const pruned = yield* spawner.exitCode(ChildProcess.make("pnpm", ["baseline", "prune"], { cwd: target, stderr: "inherit", stdout: "inherit" }));
|
|
56
|
+
if (pruned !== 0) {
|
|
57
|
+
return yield* new CreateAppError({ message: `pnpm baseline prune failed (exit ${pruned}). Run pnpm baseline prune in ${folder} to retry.` });
|
|
58
|
+
}
|
|
53
59
|
yield* commitGit(target);
|
|
54
60
|
}
|
|
55
61
|
const quotedFolder = `'${folder.replaceAll("'", "'\"'\"'")}'`;
|
package/src/updateApp.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { historicalTemplate } from "./historicalTemplate.ts";
|
|
|
6
6
|
import { checkedProcess, runProcess } from "./runProcess.ts";
|
|
7
7
|
import { starterPatch } from "./starterPatch.ts";
|
|
8
8
|
import { appTemplate } from "./template.ts";
|
|
9
|
+
import { updateChecks } from "./updateChecks.ts";
|
|
9
10
|
|
|
10
11
|
export const updateApp = Effect.fn("CreateApp.updateApp")(function* (folder: string, templatePath: string, version: string) {
|
|
11
12
|
return yield* Effect.scoped(
|
|
@@ -33,15 +34,19 @@ export const updateApp = Effect.fn("CreateApp.updateApp")(function* (folder: str
|
|
|
33
34
|
const result = yield* runProcess(target, "git", ["apply", "--3way", patch.path]);
|
|
34
35
|
if (result.code !== 0) {
|
|
35
36
|
const conflicts = (yield* checkedProcess(target, "git", ["diff", "--name-only", "--diff-filter=U"])).trim();
|
|
36
|
-
|
|
37
|
-
message:
|
|
38
|
-
|
|
39
|
-
: result.stderr.trim(),
|
|
40
|
-
});
|
|
37
|
+
if (!conflicts) {
|
|
38
|
+
return yield* new CreateAppError({ message: result.stderr.trim() });
|
|
39
|
+
}
|
|
41
40
|
}
|
|
42
41
|
}
|
|
43
42
|
yield* writeGeneration(target, { ...generation, version });
|
|
44
|
-
yield*
|
|
43
|
+
const failures = yield* updateChecks(target);
|
|
44
|
+
if (failures.length > 0) {
|
|
45
|
+
return yield* new CreateAppError({
|
|
46
|
+
message: `Recorded create-app ${version}. Finish the update before committing:\n${failures.join("\n\n")}`,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
yield* Console.log(`Applied create-app ${version}. Install and typecheck passed. Review the changes and commit when ready.`);
|
|
45
50
|
}),
|
|
46
51
|
);
|
|
47
52
|
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Console, Effect } from "effect";
|
|
2
|
+
import { CreateAppError } from "./CreateAppError.ts";
|
|
3
|
+
import { checkedProcess, runProcess } from "./runProcess.ts";
|
|
4
|
+
|
|
5
|
+
const conflictMarkers = Effect.fn("CreateApp.conflictMarkers")(function* (target: string) {
|
|
6
|
+
const result = yield* runProcess(target, "git", [
|
|
7
|
+
"grep",
|
|
8
|
+
"--untracked",
|
|
9
|
+
"--exclude-standard",
|
|
10
|
+
"-I",
|
|
11
|
+
"-l",
|
|
12
|
+
"-z",
|
|
13
|
+
"-E",
|
|
14
|
+
"^((<{7}|[|]{7}|>{7})( |$)|={7}$)",
|
|
15
|
+
"--",
|
|
16
|
+
".",
|
|
17
|
+
]);
|
|
18
|
+
if (result.code > 1) {
|
|
19
|
+
return yield* new CreateAppError({ message: `Could not check conflict markers: ${result.stderr.trim()}` });
|
|
20
|
+
}
|
|
21
|
+
return result.stdout.split("\0").filter(Boolean);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export const updateChecks = Effect.fn("CreateApp.updateChecks")(function* (target: string) {
|
|
25
|
+
const failures: string[] = [];
|
|
26
|
+
for (const args of [["install"], ["run", "typecheck"]]) {
|
|
27
|
+
yield* Console.log(`Running pnpm ${args.join(" ")}...`);
|
|
28
|
+
const result = yield* runProcess(target, "pnpm", args);
|
|
29
|
+
if (result.code !== 0) {
|
|
30
|
+
failures.push(`pnpm ${args.join(" ")} failed (exit ${result.code}):\n${result.stdout}${result.stderr}`.trim());
|
|
31
|
+
if (`${result.stdout}${result.stderr}`.includes("ERR_PNPM_TRUST_DOWNGRADE")) {
|
|
32
|
+
failures.push(
|
|
33
|
+
"To re-resolve transitive packages pinned by the old lockfile while keeping trustPolicy enabled, run pnpm update --depth Infinity, then pnpm run typecheck. If a flagged version is pinned exactly in the manifest or catalog, change that pin to a trusted version first.",
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const markers = yield* conflictMarkers(target);
|
|
39
|
+
if (markers.length > 0) {
|
|
40
|
+
failures.unshift(`Files with conflict markers:\n${markers.join("\n")}`);
|
|
41
|
+
}
|
|
42
|
+
const unresolved = (yield* checkedProcess(target, "git", ["diff", "--name-only", "--diff-filter=U"])).trim();
|
|
43
|
+
if (unresolved !== "") {
|
|
44
|
+
failures.push(`Unresolved Git conflicts:\n${unresolved}`);
|
|
45
|
+
}
|
|
46
|
+
return failures;
|
|
47
|
+
});
|