@shivaedev/create-app 0.29.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.
@@ -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;AAOrD,eAAO,MAAM,SAAS,mQAqCpB,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
- return yield* new CreateAppError({
27
- message: conflicts
28
- ? `Resolve these conflicts, then commit your changes:\n${conflicts}\nThe recorded version remains ${generation.version}.`
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* Console.log(`Applied create-app ${version}. Review the changes, run pnpm install and commit when ready.`);
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
@@ -1 +1 @@
1
- {"version":3,"file":"updateApp.js","sourceRoot":"","sources":["../src/updateApp.ts"],"names":[],"mappings":"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"}
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.29.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.49.0",
53
- "@shivaedev/test-story": "0.29.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/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
- return yield* new CreateAppError({
37
- message: conflicts
38
- ? `Resolve these conflicts, then commit your changes:\n${conflicts}\nThe recorded version remains ${generation.version}.`
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* Console.log(`Applied create-app ${version}. Review the changes, run pnpm install and commit when ready.`);
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
+ });