@shivaedev/create-app 0.12.0 → 0.13.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.
Files changed (42) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +4 -0
  3. package/dist/cli.js +83 -80
  4. package/dist/createApp.d.ts +3 -2
  5. package/dist/createApp.d.ts.map +1 -1
  6. package/dist/createApp.js +7 -17
  7. package/dist/createApp.js.map +1 -1
  8. package/dist/generation.d.ts +21 -0
  9. package/dist/generation.d.ts.map +1 -0
  10. package/dist/generation.js +31 -0
  11. package/dist/generation.js.map +1 -0
  12. package/dist/historicalTemplate.d.ts +6 -0
  13. package/dist/historicalTemplate.d.ts.map +1 -0
  14. package/dist/historicalTemplate.js +17 -0
  15. package/dist/historicalTemplate.js.map +1 -0
  16. package/dist/packTemplate.js +1 -1
  17. package/dist/packTemplate.js.map +1 -1
  18. package/dist/runProcess.d.ts +10 -0
  19. package/dist/runProcess.d.ts.map +1 -0
  20. package/dist/runProcess.js +19 -0
  21. package/dist/runProcess.js.map +1 -0
  22. package/dist/starterPatch.d.ts +12 -0
  23. package/dist/starterPatch.d.ts.map +1 -0
  24. package/dist/starterPatch.js +36 -0
  25. package/dist/starterPatch.js.map +1 -0
  26. package/dist/template.js +2 -2
  27. package/dist/template.js.map +1 -1
  28. package/dist/updateApp.d.ts +4 -0
  29. package/dist/updateApp.d.ts.map +1 -0
  30. package/dist/updateApp.js +36 -0
  31. package/dist/updateApp.js.map +1 -0
  32. package/package.json +9 -4
  33. package/src/cli.ts +12 -4
  34. package/src/createApp.ts +12 -18
  35. package/src/generation.ts +35 -0
  36. package/src/historicalTemplate.ts +17 -0
  37. package/src/packTemplate.ts +1 -1
  38. package/src/runProcess.ts +25 -0
  39. package/src/starterPatch.ts +43 -0
  40. package/src/template.ts +2 -2
  41. package/src/updateApp.ts +40 -0
  42. package/template.json +1 -1
@@ -1,7 +1,8 @@
1
- import { Effect, FileSystem, Schema } from "effect";
1
+ import { 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
- }) => Effect.Effect<undefined, CreateAppError | import("effect/PlatformError").PlatformError | Schema.SchemaError, ChildProcessSpawner.ChildProcessSpawner | FileSystem.FileSystem>;
6
+ readonly version: string;
7
+ }) => Effect.Effect<undefined, CreateAppError | import("effect/PlatformError").PlatformError | import("effect/Schema").SchemaError, ChildProcessSpawner.ChildProcessSpawner | FileSystem.FileSystem>;
7
8
  //# sourceMappingURL=createApp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createApp.d.ts","sourceRoot":"","sources":["../src/createApp.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAgB,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,eAAO,MAAM,SAAS;kBAA8G,OAAO;mLA+CzI,CAAC"}
1
+ {"version":3,"file":"createApp.d.ts","sourceRoot":"","sources":["../src/createApp.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAgB,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,eAAO,MAAM,SAAS;kBAGI,OAAO;sBAAoB,MAAM;oMAuCzD,CAAC"}
package/dist/createApp.js CHANGED
@@ -1,12 +1,11 @@
1
- import { Buffer } from "node:buffer";
2
1
  import { randomBytes } from "node:crypto";
3
- import { basename, dirname, join, resolve } from "node:path";
4
- import { Console, Effect, FileSystem, Schema } from "effect";
2
+ import { basename, join, resolve } from "node:path";
3
+ import { Console, Effect, FileSystem } from "effect";
5
4
  import { ChildProcess, ChildProcessSpawner } from "effect/process";
6
- import { appFile, databaseName } from "./appFiles.js";
5
+ import { databaseName } from "./appFiles.js";
7
6
  import { CreateAppError } from "./CreateAppError.js";
7
+ import { readTemplate, renderTemplate, writeGeneration } from "./generation.js";
8
8
  import { commitGit, initializeGit } from "./initializeGit.js";
9
- import { Template } from "./template.js";
10
9
  export const createApp = Effect.fn("CreateApp.createApp")(function* (folder, templatePath, options) {
11
10
  const fs = yield* FileSystem.FileSystem;
12
11
  const target = resolve(folder);
@@ -17,19 +16,10 @@ export const createApp = Effect.fn("CreateApp.createApp")(function* (folder, tem
17
16
  if ((yield* fs.exists(target)) && ((yield* fs.stat(target)).type !== "Directory" || (yield* fs.readDirectory(target)).length > 0)) {
18
17
  return yield* new CreateAppError({ message: `Refusing to write into ${folder}: the destination must be an empty folder.` });
19
18
  }
20
- const template = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Template))(yield* fs.readFileString(templatePath));
19
+ const template = yield* readTemplate(templatePath);
21
20
  yield* fs.makeDirectory(target, { recursive: true });
22
- for (const entry of template) {
23
- const path = join(target, entry.path);
24
- const source = Buffer.from(entry.content, "base64");
25
- const content = yield* Effect.try({
26
- catch: (cause) => new CreateAppError({ message: String(cause) }),
27
- try: () => appFile(entry.path, source, name),
28
- });
29
- yield* fs.makeDirectory(dirname(path), { recursive: true });
30
- yield* fs.writeFile(path, content, { mode: 0o644 });
31
- yield* fs.chmod(path, 0o644);
32
- }
21
+ yield* renderTemplate(target, template, name);
22
+ yield* writeGeneration(target, { name, version: options.version });
33
23
  yield* fs.symlink("AGENTS.md", join(target, "CLAUDE.md"));
34
24
  const database = databaseName(name);
35
25
  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=${randomBytes(32).toString("base64url")}\n`, { flag: "wx", mode: 0o600 });
@@ -1 +1 @@
1
- {"version":3,"file":"createApp.js","sourceRoot":"","sources":["../src/createApp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createApp.js","sourceRoot":"","sources":["../src/createApp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Effect, FileSystem, Schema } from "effect";
2
+ import { CreateAppError } from "./CreateAppError.ts";
3
+ export declare const Generation: Schema.Struct<{
4
+ readonly name: Schema.String;
5
+ readonly version: Schema.String;
6
+ }>;
7
+ export type Generation = typeof Generation.Type;
8
+ export declare const GENERATION_FILE = ".create-app.json";
9
+ export declare const readTemplate: (path: string) => Effect.Effect<readonly {
10
+ readonly content: string;
11
+ readonly path: string;
12
+ }[], import("effect/PlatformError").PlatformError | Schema.SchemaError, FileSystem.FileSystem>;
13
+ export declare const writeGeneration: (target: string, generation: {
14
+ readonly name: string;
15
+ readonly version: string;
16
+ }) => Effect.Effect<void, import("effect/PlatformError").PlatformError, FileSystem.FileSystem>;
17
+ export declare const renderTemplate: (target: string, template: readonly {
18
+ readonly content: string;
19
+ readonly path: string;
20
+ }[], name: string) => Effect.Effect<void, CreateAppError | import("effect/PlatformError").PlatformError, FileSystem.FileSystem>;
21
+ //# sourceMappingURL=generation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation.d.ts","sourceRoot":"","sources":["../src/generation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,eAAO,MAAM,UAAU;;;EAAiE,CAAC;AACzF,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAC;AAChD,eAAO,MAAM,eAAe,qBAAqB,CAAC;AAElD,eAAO,MAAM,YAAY;;;8FAGvB,CAAC;AAEH,eAAO,MAAM,eAAe;;;8FAI1B,CAAC;AAEH,eAAO,MAAM,cAAc;;;+HAYzB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { dirname, join } from "node:path";
3
+ import { Effect, FileSystem, Schema } from "effect";
4
+ import { appFile } from "./appFiles.js";
5
+ import { CreateAppError } from "./CreateAppError.js";
6
+ import { Template } from "./template.js";
7
+ export const Generation = Schema.Struct({ name: Schema.String, version: Schema.String });
8
+ export const GENERATION_FILE = ".create-app.json";
9
+ export const readTemplate = Effect.fn("CreateApp.readTemplate")(function* (path) {
10
+ const fs = yield* FileSystem.FileSystem;
11
+ return yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Template))(yield* fs.readFileString(path));
12
+ });
13
+ export const writeGeneration = Effect.fn("CreateApp.writeGeneration")(function* (target, generation) {
14
+ const fs = yield* FileSystem.FileSystem;
15
+ yield* fs.writeFileString(join(target, GENERATION_FILE), `${JSON.stringify(generation, null, "\t")}\n`, { mode: 0o644 });
16
+ yield* fs.chmod(join(target, GENERATION_FILE), 0o644);
17
+ });
18
+ export const renderTemplate = Effect.fn("CreateApp.renderTemplate")(function* (target, template, name) {
19
+ const fs = yield* FileSystem.FileSystem;
20
+ for (const entry of template) {
21
+ const path = join(target, entry.path);
22
+ const content = yield* Effect.try({
23
+ catch: (cause) => new CreateAppError({ message: String(cause) }),
24
+ try: () => appFile(entry.path, Buffer.from(entry.content, "base64"), name),
25
+ });
26
+ yield* fs.makeDirectory(dirname(path), { recursive: true });
27
+ yield* fs.writeFile(path, content, { mode: 0o644 });
28
+ yield* fs.chmod(path, 0o644);
29
+ }
30
+ });
31
+ //# sourceMappingURL=generation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation.js","sourceRoot":"","sources":["../src/generation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Effect } from "effect";
2
+ export declare const historicalTemplate: (directory: string, version: string) => Effect.Effect<readonly {
3
+ readonly content: string;
4
+ readonly path: string;
5
+ }[], import("./CreateAppError.ts").CreateAppError | import("effect/PlatformError").PlatformError | import("effect/Schema").SchemaError, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("effect/FileSystem").FileSystem>;
6
+ //# sourceMappingURL=historicalTemplate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historicalTemplate.d.ts","sourceRoot":"","sources":["../src/historicalTemplate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,eAAO,MAAM,kBAAkB;;;kPAW7B,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { join } from "node:path";
2
+ import { Effect } from "effect";
3
+ import { readTemplate } from "./generation.js";
4
+ import { checkedProcess } from "./runProcess.js";
5
+ export const historicalTemplate = Effect.fn("CreateApp.historicalTemplate")(function* (directory, version) {
6
+ const archive = (yield* checkedProcess(directory, "npm", [
7
+ "pack",
8
+ `@shivaedev/create-app@${version}`,
9
+ "--ignore-scripts",
10
+ "--loglevel=error",
11
+ "--pack-destination",
12
+ directory,
13
+ ])).trim();
14
+ yield* checkedProcess(directory, "tar", ["-xzf", join(directory, archive), "-C", directory]);
15
+ return yield* readTemplate(join(directory, "package/template.json"));
16
+ });
17
+ //# sourceMappingURL=historicalTemplate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historicalTemplate.js","sourceRoot":"","sources":["../src/historicalTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,8BAA8B,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAiB,EAAE,OAAe;IACxH,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,EAAE;QACxD,MAAM;QACN,yBAAyB,OAAO,EAAE;QAClC,kBAAkB;QAClB,kBAAkB;QAClB,oBAAoB;QACpB,SAAS;KACT,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACX,KAAK,CAAC,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7F,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC"}
@@ -10,7 +10,7 @@ const appPaths = new Map([
10
10
  ["pnpm-workspace.copy.yaml", "pnpm-workspace.yaml"],
11
11
  ]);
12
12
  const excluded = new Set(["node_modules", "dist", "coverage", "pnpm-lock.yaml", ".git"]);
13
- const rootExcluded = new Set(["published-versions.json", "AGENTS.md", "CLAUDE.md", "README.md"]);
13
+ const rootExcluded = new Set(["published-versions.json", "AGENTS.md", "CLAUDE.md", "README.md", "quality.config.ts"]);
14
14
  function included(path) {
15
15
  return !(rootExcluded.has(path) || excluded.has(basename(path))) && (!basename(path).startsWith(".env") || basename(path) === ".env.example");
16
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"packTemplate.js","sourceRoot":"","sources":["../src/packTemplate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"packTemplate.js","sourceRoot":"","sources":["../src/packTemplate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Effect } from "effect";
2
+ import { ChildProcessSpawner } from "effect/process";
3
+ import { CreateAppError } from "./CreateAppError.ts";
4
+ export declare const runProcess: (cwd: string, command: string, args: readonly string[]) => Effect.Effect<{
5
+ code: number;
6
+ stderr: string;
7
+ stdout: string;
8
+ }, import("effect/PlatformError").PlatformError, ChildProcessSpawner.ChildProcessSpawner>;
9
+ export declare const checkedProcess: (cwd: string, command: string, args: readonly string[]) => Effect.Effect<string, CreateAppError | import("effect/PlatformError").PlatformError, ChildProcessSpawner.ChildProcessSpawner>;
10
+ //# sourceMappingURL=runProcess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runProcess.d.ts","sourceRoot":"","sources":["../src/runProcess.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAgB,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,eAAO,MAAM,UAAU;;;;yFAYrB,CAAC;AAEH,eAAO,MAAM,cAAc,0LAMzB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { Effect, Stream } from "effect";
2
+ import { ChildProcess, ChildProcessSpawner } from "effect/process";
3
+ import { CreateAppError } from "./CreateAppError.js";
4
+ export const runProcess = Effect.fn("CreateApp.runProcess")(function* (cwd, command, args) {
5
+ return yield* Effect.scoped(Effect.gen(function* () {
6
+ const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
7
+ const child = yield* spawner.spawn(ChildProcess.make(command, args, { cwd, stdin: "ignore" }));
8
+ const [stdout, stderr, code] = yield* Effect.all([Stream.mkString(Stream.decodeText(child.stdout)), Stream.mkString(Stream.decodeText(child.stderr)), child.exitCode], { concurrency: "unbounded" });
9
+ return { code: Number(code), stderr, stdout };
10
+ }));
11
+ });
12
+ export const checkedProcess = Effect.fn("CreateApp.checkedProcess")(function* (cwd, command, args) {
13
+ const result = yield* runProcess(cwd, command, args);
14
+ if (result.code !== 0) {
15
+ return yield* new CreateAppError({ message: `${command} ${args[0]} failed: ${result.stderr.trim()}` });
16
+ }
17
+ return result.stdout;
18
+ });
19
+ //# sourceMappingURL=runProcess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runProcess.js","sourceRoot":"","sources":["../src/runProcess.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAW,EAAE,OAAe,EAAE,IAAuB;IAC3H,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,mBAAmB,CAAC;QAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC/F,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAC/C,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,EACpH,EAAE,WAAW,EAAE,WAAW,EAAE,CAC5B,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC,CAAC,CACF,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAW,EAAE,OAAe,EAAE,IAAuB;IACnI,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACtB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { Effect, FileSystem } from "effect";
2
+ export declare const starterPatch: (target: string, directory: string, name: string, before: readonly {
3
+ readonly content: string;
4
+ readonly path: string;
5
+ }[], after: readonly {
6
+ readonly content: string;
7
+ readonly path: string;
8
+ }[]) => Effect.Effect<{
9
+ empty: boolean;
10
+ path: string;
11
+ }, import("./CreateAppError.ts").CreateAppError | import("effect/PlatformError").PlatformError, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | FileSystem.FileSystem>;
12
+ //# sourceMappingURL=starterPatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"starterPatch.d.ts","sourceRoot":"","sources":["../src/starterPatch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAK5C,eAAO,MAAM,YAAY;;;;;;;;;yLAoCvB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { join } from "node:path";
2
+ import { Effect, FileSystem } from "effect";
3
+ import { renderTemplate } from "./generation.js";
4
+ import { checkedProcess } from "./runProcess.js";
5
+ export const starterPatch = Effect.fn("CreateApp.starterPatch")(function* (target, directory, name, before, after) {
6
+ const fs = yield* FileSystem.FileSystem;
7
+ const deleted = new Set();
8
+ for (const entry of before) {
9
+ if (!(yield* fs.exists(join(target, entry.path)))) {
10
+ deleted.add(entry.path);
11
+ }
12
+ }
13
+ const base = before.filter((entry) => !deleted.has(entry.path));
14
+ const incoming = after.filter((entry) => !deleted.has(entry.path));
15
+ const repository = join(directory, "merge");
16
+ yield* fs.makeDirectory(repository);
17
+ yield* checkedProcess(repository, "git", ["init", "--quiet"]);
18
+ yield* renderTemplate(repository, base, name);
19
+ yield* checkedProcess(repository, "git", ["add", "--all"]);
20
+ const tree = (yield* checkedProcess(repository, "git", ["write-tree"])).trim();
21
+ for (const entry of base) {
22
+ yield* checkedProcess(target, "git", ["hash-object", "-w", "--", join(repository, entry.path)]);
23
+ }
24
+ for (const path of yield* fs.readDirectory(repository)) {
25
+ if (path !== ".git") {
26
+ yield* fs.remove(join(repository, path), { recursive: true });
27
+ }
28
+ }
29
+ yield* renderTemplate(repository, incoming, name);
30
+ yield* checkedProcess(repository, "git", ["add", "--all"]);
31
+ const patch = yield* checkedProcess(repository, "git", ["diff", "--cached", "--binary", "--full-index", "--no-renames", tree]);
32
+ const path = join(directory, "starter.patch");
33
+ yield* fs.writeFileString(path, patch);
34
+ return { empty: patch.length === 0, path };
35
+ });
36
+ //# sourceMappingURL=starterPatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"starterPatch.js","sourceRoot":"","sources":["../src/starterPatch.ts"],"names":[],"mappings":"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"}
package/dist/template.js CHANGED
@@ -54,13 +54,13 @@ export function prepareManifest(source, versions) {
54
54
  return `${JSON.stringify(Object.fromEntries(manifestOrder.map((key) => [key, prepared[key]])), null, "\t")}\n`;
55
55
  }
56
56
  export function prepareFile(path, content, versions) {
57
- if (["src/server/dev.ts", "src/test-support/adminCommand.ts", "src/test-support/deployChild.ts"].includes(path)) {
57
+ if (["src/test-support/adminCommand.ts", "src/test-support/deployChild.ts"].includes(path)) {
58
58
  return Buffer.from(content.toString().replaceAll('"--conditions=source", ', ""));
59
59
  }
60
60
  if (path === "package.json") {
61
61
  return Buffer.from(prepareManifest(content.toString(), versions));
62
62
  }
63
- if (["tsconfig.json", "vite.config.ts", "vitest.config.ts"].includes(path)) {
63
+ if (["tsconfig.json", "vite.config.ts", "vitest.config.ts", "src/server/dev.ts"].includes(path)) {
64
64
  return Buffer.from(content.toString().replaceAll('"source", ', "").replaceAll('["source"]', "[]"));
65
65
  }
66
66
  return content;
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Effect, FileSystem, Schema } from "effect";
2
+ import { CreateAppError } from "./CreateAppError.ts";
3
+ export declare const updateApp: (folder: string, templatePath: string, version: string) => Effect.Effect<undefined, CreateAppError | import("effect/PlatformError").PlatformError | Schema.SchemaError, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | FileSystem.FileSystem>;
4
+ //# sourceMappingURL=updateApp.d.ts.map
@@ -0,0 +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;AAMrD,eAAO,MAAM,SAAS,mQA+BpB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { join, resolve } from "node:path";
2
+ import { Console, Effect, FileSystem, Schema } from "effect";
3
+ import { CreateAppError } from "./CreateAppError.js";
4
+ import { GENERATION_FILE, Generation, readTemplate, writeGeneration } from "./generation.js";
5
+ import { historicalTemplate } from "./historicalTemplate.js";
6
+ import { checkedProcess, runProcess } from "./runProcess.js";
7
+ import { starterPatch } from "./starterPatch.js";
8
+ export const updateApp = Effect.fn("CreateApp.updateApp")(function* (folder, templatePath, version) {
9
+ return yield* Effect.scoped(Effect.gen(function* () {
10
+ const fs = yield* FileSystem.FileSystem;
11
+ const target = resolve(folder);
12
+ yield* checkedProcess(target, "git", ["rev-parse", "--show-toplevel"]);
13
+ if ((yield* checkedProcess(target, "git", ["status", "--porcelain"])).trim() !== "") {
14
+ return yield* new CreateAppError({ message: "Refusing to update a dirty working tree. Commit or stash your changes first." });
15
+ }
16
+ const generation = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Generation))(yield* fs.readFileString(join(target, GENERATION_FILE)));
17
+ const directory = yield* fs.makeTempDirectoryScoped({ prefix: "create-app-update-" });
18
+ const current = yield* readTemplate(templatePath);
19
+ const previous = generation.version === version ? current : yield* historicalTemplate(directory, generation.version);
20
+ const patch = yield* starterPatch(target, directory, generation.name, previous, current);
21
+ if (!patch.empty) {
22
+ const result = yield* runProcess(target, "git", ["apply", "--3way", patch.path]);
23
+ if (result.code !== 0) {
24
+ const conflicts = (yield* checkedProcess(target, "git", ["diff", "--name-only", "--diff-filter=U"])).trim();
25
+ return yield* new CreateAppError({
26
+ message: conflicts
27
+ ? `Resolve these conflicts, then commit your changes:\n${conflicts}\nThe recorded version remains ${generation.version}.`
28
+ : result.stderr.trim(),
29
+ });
30
+ }
31
+ }
32
+ yield* writeGeneration(target, { ...generation, version });
33
+ yield* Console.log(`Applied create-app ${version}. Review the changes, run pnpm install and commit when ready.`);
34
+ }));
35
+ });
36
+ //# sourceMappingURL=updateApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateApp.js","sourceRoot":"","sources":["../src/updateApp.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shivaedev/create-app",
3
- "version": "0.12.0",
3
+ "version": "0.13.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": {
@@ -37,7 +37,12 @@
37
37
  "./pack.ts": null,
38
38
  "./packTemplate.ts": null,
39
39
  "./template.ts": null,
40
- "./test-support/*": null
40
+ "./test-support/*": null,
41
+ "./generation.ts": null,
42
+ "./historicalTemplate.ts": null,
43
+ "./runProcess.ts": null,
44
+ "./starterPatch.ts": null,
45
+ "./updateApp.ts": null
41
46
  },
42
47
  "bin": {
43
48
  "create-app": "./dist/cli.js"
@@ -53,12 +58,12 @@
53
58
  "README.md"
54
59
  ],
55
60
  "dependencies": {
56
- "@shivaedev/effect-sql": "0.13.1"
61
+ "@shivaedev/effect-sql": "0.14.0"
57
62
  },
58
63
  "devDependencies": {
59
64
  "@effect/platform-node": "4.0.5",
60
65
  "@effect/platform-node-shared": "4.0.5",
61
- "@shivaedev/quality": "0.34.0",
66
+ "@shivaedev/quality": "0.35.0",
62
67
  "@shivaedev/test-story": "0.18.2",
63
68
  "@types/node": "24.19.2",
64
69
  "effect": "4.0.5",
package/src/cli.ts CHANGED
@@ -2,19 +2,27 @@
2
2
  import { fileURLToPath } from "node:url";
3
3
  import * as NodeRuntime from "@effect/platform-node/NodeRuntime";
4
4
  import * as NodeServices from "@effect/platform-node/NodeServices";
5
- import { Console, Effect, FileSystem, Schema } from "effect";
5
+ import { Console, Effect, FileSystem, Option, Schema } from "effect";
6
6
  import { Argument, Command, Flag } from "effect/cli";
7
+ import { CreateAppError } from "./CreateAppError.ts";
7
8
  import { createApp } from "./createApp.ts";
9
+ import { updateApp } from "./updateApp.ts";
8
10
 
9
11
  const program = Effect.gen(function* () {
10
12
  const fs = yield* FileSystem.FileSystem;
11
13
  const manifest = yield* fs.readFileString(fileURLToPath(new URL("../package.json", import.meta.url)));
12
14
  const { version } = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Struct({ version: Schema.String })))(manifest);
15
+ const templatePath = fileURLToPath(new URL("../template.json", import.meta.url));
16
+ const update = Command.make("update", {}, () => updateApp(".", templatePath, version));
13
17
  const cli = Command.make(
14
18
  "create-app",
15
- { folder: Argument.String("folder"), git: Flag.Boolean("git").pipe(Flag.withDefault(true)) },
16
- ({ folder, git }) => createApp(folder, fileURLToPath(new URL("../template.json", import.meta.url)), { git }),
17
- ).pipe(Command.withDescription("Create and install a Platform application from the maintained starter."));
19
+ { folder: Argument.String("folder").pipe(Argument.optional), git: Flag.Boolean("git").pipe(Flag.withDefault(true)) },
20
+ ({ folder, git }) =>
21
+ Option.match(folder, {
22
+ onNone: () => Effect.fail(new CreateAppError({ message: "Provide an app folder or use create-app update." })),
23
+ onSome: (destination) => createApp(destination, templatePath, { git, version }),
24
+ }),
25
+ ).pipe(Command.withSubcommands([update]), Command.withDescription("Create and install a Platform application from the maintained starter."));
18
26
  yield* Command.run(cli, { version });
19
27
  });
20
28
 
package/src/createApp.ts CHANGED
@@ -1,14 +1,17 @@
1
- import { Buffer } from "node:buffer";
2
1
  import { randomBytes } from "node:crypto";
3
- import { basename, dirname, join, resolve } from "node:path";
4
- import { Console, Effect, FileSystem, Schema } from "effect";
2
+ import { basename, join, resolve } from "node:path";
3
+ import { Console, Effect, FileSystem } from "effect";
5
4
  import { ChildProcess, ChildProcessSpawner } from "effect/process";
6
- import { appFile, databaseName } from "./appFiles.ts";
5
+ import { databaseName } from "./appFiles.ts";
7
6
  import { CreateAppError } from "./CreateAppError.ts";
7
+ import { readTemplate, renderTemplate, writeGeneration } from "./generation.ts";
8
8
  import { commitGit, initializeGit } from "./initializeGit.ts";
9
- import { Template } from "./template.ts";
10
9
 
11
- export const createApp = Effect.fn("CreateApp.createApp")(function* (folder: string, templatePath: string, options: { readonly git: boolean }) {
10
+ export const createApp = Effect.fn("CreateApp.createApp")(function* (
11
+ folder: string,
12
+ templatePath: string,
13
+ options: { readonly git: boolean; readonly version: string },
14
+ ) {
12
15
  const fs = yield* FileSystem.FileSystem;
13
16
  const target = resolve(folder);
14
17
  const name = basename(target);
@@ -18,19 +21,10 @@ export const createApp = Effect.fn("CreateApp.createApp")(function* (folder: str
18
21
  if ((yield* fs.exists(target)) && ((yield* fs.stat(target)).type !== "Directory" || (yield* fs.readDirectory(target)).length > 0)) {
19
22
  return yield* new CreateAppError({ message: `Refusing to write into ${folder}: the destination must be an empty folder.` });
20
23
  }
21
- const template = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Template))(yield* fs.readFileString(templatePath));
24
+ const template = yield* readTemplate(templatePath);
22
25
  yield* fs.makeDirectory(target, { recursive: true });
23
- for (const entry of template) {
24
- const path = join(target, entry.path);
25
- const source = Buffer.from(entry.content, "base64");
26
- const content = yield* Effect.try({
27
- catch: (cause) => new CreateAppError({ message: String(cause) }),
28
- try: () => appFile(entry.path, source, name),
29
- });
30
- yield* fs.makeDirectory(dirname(path), { recursive: true });
31
- yield* fs.writeFile(path, content, { mode: 0o644 });
32
- yield* fs.chmod(path, 0o644);
33
- }
26
+ yield* renderTemplate(target, template, name);
27
+ yield* writeGeneration(target, { name, version: options.version });
34
28
  yield* fs.symlink("AGENTS.md", join(target, "CLAUDE.md"));
35
29
  const database = databaseName(name);
36
30
  yield* fs.writeFileString(
@@ -0,0 +1,35 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { dirname, join } from "node:path";
3
+ import { Effect, FileSystem, Schema } from "effect";
4
+ import { appFile } from "./appFiles.ts";
5
+ import { CreateAppError } from "./CreateAppError.ts";
6
+ import { Template } from "./template.ts";
7
+
8
+ export const Generation = Schema.Struct({ name: Schema.String, version: Schema.String });
9
+ export type Generation = typeof Generation.Type;
10
+ export const GENERATION_FILE = ".create-app.json";
11
+
12
+ export const readTemplate = Effect.fn("CreateApp.readTemplate")(function* (path: string) {
13
+ const fs = yield* FileSystem.FileSystem;
14
+ return yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Template))(yield* fs.readFileString(path));
15
+ });
16
+
17
+ export const writeGeneration = Effect.fn("CreateApp.writeGeneration")(function* (target: string, generation: Generation) {
18
+ const fs = yield* FileSystem.FileSystem;
19
+ yield* fs.writeFileString(join(target, GENERATION_FILE), `${JSON.stringify(generation, null, "\t")}\n`, { mode: 0o644 });
20
+ yield* fs.chmod(join(target, GENERATION_FILE), 0o644);
21
+ });
22
+
23
+ export const renderTemplate = Effect.fn("CreateApp.renderTemplate")(function* (target: string, template: Template, name: string) {
24
+ const fs = yield* FileSystem.FileSystem;
25
+ for (const entry of template) {
26
+ const path = join(target, entry.path);
27
+ const content = yield* Effect.try({
28
+ catch: (cause) => new CreateAppError({ message: String(cause) }),
29
+ try: () => appFile(entry.path, Buffer.from(entry.content, "base64"), name),
30
+ });
31
+ yield* fs.makeDirectory(dirname(path), { recursive: true });
32
+ yield* fs.writeFile(path, content, { mode: 0o644 });
33
+ yield* fs.chmod(path, 0o644);
34
+ }
35
+ });
@@ -0,0 +1,17 @@
1
+ import { join } from "node:path";
2
+ import { Effect } from "effect";
3
+ import { readTemplate } from "./generation.ts";
4
+ import { checkedProcess } from "./runProcess.ts";
5
+
6
+ export const historicalTemplate = Effect.fn("CreateApp.historicalTemplate")(function* (directory: string, version: string) {
7
+ const archive = (yield* checkedProcess(directory, "npm", [
8
+ "pack",
9
+ `@shivaedev/create-app@${version}`,
10
+ "--ignore-scripts",
11
+ "--loglevel=error",
12
+ "--pack-destination",
13
+ directory,
14
+ ])).trim();
15
+ yield* checkedProcess(directory, "tar", ["-xzf", join(directory, archive), "-C", directory]);
16
+ return yield* readTemplate(join(directory, "package/template.json"));
17
+ });
@@ -11,7 +11,7 @@ const appPaths = new Map([
11
11
  ["pnpm-workspace.copy.yaml", "pnpm-workspace.yaml"],
12
12
  ]);
13
13
  const excluded = new Set(["node_modules", "dist", "coverage", "pnpm-lock.yaml", ".git"]);
14
- const rootExcluded = new Set(["published-versions.json", "AGENTS.md", "CLAUDE.md", "README.md"]);
14
+ const rootExcluded = new Set(["published-versions.json", "AGENTS.md", "CLAUDE.md", "README.md", "quality.config.ts"]);
15
15
  function included(path: string) {
16
16
  return !(rootExcluded.has(path) || excluded.has(basename(path))) && (!basename(path).startsWith(".env") || basename(path) === ".env.example");
17
17
  }
@@ -0,0 +1,25 @@
1
+ import { Effect, Stream } from "effect";
2
+ import { ChildProcess, ChildProcessSpawner } from "effect/process";
3
+ import { CreateAppError } from "./CreateAppError.ts";
4
+
5
+ export const runProcess = Effect.fn("CreateApp.runProcess")(function* (cwd: string, command: string, args: readonly string[]) {
6
+ return yield* Effect.scoped(
7
+ Effect.gen(function* () {
8
+ const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
9
+ const child = yield* spawner.spawn(ChildProcess.make(command, args, { cwd, stdin: "ignore" }));
10
+ const [stdout, stderr, code] = yield* Effect.all(
11
+ [Stream.mkString(Stream.decodeText(child.stdout)), Stream.mkString(Stream.decodeText(child.stderr)), child.exitCode],
12
+ { concurrency: "unbounded" },
13
+ );
14
+ return { code: Number(code), stderr, stdout };
15
+ }),
16
+ );
17
+ });
18
+
19
+ export const checkedProcess = Effect.fn("CreateApp.checkedProcess")(function* (cwd: string, command: string, args: readonly string[]) {
20
+ const result = yield* runProcess(cwd, command, args);
21
+ if (result.code !== 0) {
22
+ return yield* new CreateAppError({ message: `${command} ${args[0]} failed: ${result.stderr.trim()}` });
23
+ }
24
+ return result.stdout;
25
+ });