@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.
- package/CHANGELOG.md +19 -0
- package/README.md +4 -0
- package/dist/cli.js +83 -80
- package/dist/createApp.d.ts +3 -2
- package/dist/createApp.d.ts.map +1 -1
- package/dist/createApp.js +7 -17
- package/dist/createApp.js.map +1 -1
- package/dist/generation.d.ts +21 -0
- package/dist/generation.d.ts.map +1 -0
- package/dist/generation.js +31 -0
- package/dist/generation.js.map +1 -0
- package/dist/historicalTemplate.d.ts +6 -0
- package/dist/historicalTemplate.d.ts.map +1 -0
- package/dist/historicalTemplate.js +17 -0
- package/dist/historicalTemplate.js.map +1 -0
- package/dist/packTemplate.js +1 -1
- package/dist/packTemplate.js.map +1 -1
- package/dist/runProcess.d.ts +10 -0
- package/dist/runProcess.d.ts.map +1 -0
- package/dist/runProcess.js +19 -0
- package/dist/runProcess.js.map +1 -0
- package/dist/starterPatch.d.ts +12 -0
- package/dist/starterPatch.d.ts.map +1 -0
- package/dist/starterPatch.js +36 -0
- package/dist/starterPatch.js.map +1 -0
- package/dist/template.js +2 -2
- package/dist/template.js.map +1 -1
- package/dist/updateApp.d.ts +4 -0
- package/dist/updateApp.d.ts.map +1 -0
- package/dist/updateApp.js +36 -0
- package/dist/updateApp.js.map +1 -0
- package/package.json +9 -4
- package/src/cli.ts +12 -4
- package/src/createApp.ts +12 -18
- package/src/generation.ts +35 -0
- package/src/historicalTemplate.ts +17 -0
- package/src/packTemplate.ts +1 -1
- package/src/runProcess.ts +25 -0
- package/src/starterPatch.ts +43 -0
- package/src/template.ts +2 -2
- package/src/updateApp.ts +40 -0
- package/template.json +1 -1
package/dist/createApp.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Effect, FileSystem
|
|
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
|
-
|
|
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
|
package/dist/createApp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createApp.d.ts","sourceRoot":"","sources":["../src/createApp.ts"],"names":[],"mappings":"
|
|
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,
|
|
4
|
-
import { Console, Effect, FileSystem
|
|
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 {
|
|
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*
|
|
19
|
+
const template = yield* readTemplate(templatePath);
|
|
21
20
|
yield* fs.makeDirectory(target, { recursive: true });
|
|
22
|
-
|
|
23
|
-
|
|
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 });
|
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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"}
|
|
@@ -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"}
|
package/dist/packTemplate.js
CHANGED
|
@@ -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
|
}
|
package/dist/packTemplate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packTemplate.js","sourceRoot":"","sources":["../src/packTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAsB,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAiB,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACxB,CAAC,eAAe,EAAE,WAAW,CAAC;IAC9B,CAAC,eAAe,EAAE,WAAW,CAAC;IAC9B,CAAC,0BAA0B,EAAE,qBAAqB,CAAC;CACnD,CAAC,CAAC;AACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;AACzF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,yBAAyB,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;
|
|
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/
|
|
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;
|
package/dist/template.js.map
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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 }) =>
|
|
17
|
-
|
|
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,
|
|
4
|
-
import { Console, Effect, FileSystem
|
|
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 {
|
|
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* (
|
|
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*
|
|
24
|
+
const template = yield* readTemplate(templatePath);
|
|
22
25
|
yield* fs.makeDirectory(target, { recursive: true });
|
|
23
|
-
|
|
24
|
-
|
|
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
|
+
});
|
package/src/packTemplate.ts
CHANGED
|
@@ -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
|
+
});
|