@decohere/create 0.0.1-dev.5 → 0.0.1-dev.50

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.
@@ -3,13 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- const _nodepath = require("node:path");
7
- const _commander = require("commander");
8
- const _scaffold = require("./scaffold.js");
9
- const program = new _commander.Command();
10
- program.name("decohere").description("Scaffold a new Decohere project").argument("[directory]", "Target directory (default: current directory)", ".").option("-y, --yes", "Skip confirmation prompts").action(async (directory, opts)=>{
11
- await (0, _scaffold.scaffold)((0, _nodepath.resolve)(directory), opts);
12
- });
13
- program.parse();
6
+ const _runner = require("./runner.js");
7
+ (0, _runner.runInBuilder)(process.argv.slice(2));
14
8
 
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvY3JlYXRlL3NyYy9jbGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgeyBzY2FmZm9sZCB9IGZyb20gXCIuL3NjYWZmb2xkLmpzXCI7XG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXG5wcm9ncmFtXG5cdC5uYW1lKFwiZGVjb2hlcmVcIilcblx0LmRlc2NyaXB0aW9uKFwiU2NhZmZvbGQgYSBuZXcgRGVjb2hlcmUgcHJvamVjdFwiKVxuXHQuYXJndW1lbnQoXCJbZGlyZWN0b3J5XVwiLCBcIlRhcmdldCBkaXJlY3RvcnkgKGRlZmF1bHQ6IGN1cnJlbnQgZGlyZWN0b3J5KVwiLCBcIi5cIilcblx0Lm9wdGlvbihcIi15LCAtLXllc1wiLCBcIlNraXAgY29uZmlybWF0aW9uIHByb21wdHNcIilcblx0LmFjdGlvbihhc3luYyAoZGlyZWN0b3J5OiBzdHJpbmcsIG9wdHM6IHsgeWVzPzogYm9vbGVhbiB9KSA9PiB7XG5cdFx0YXdhaXQgc2NhZmZvbGQocmVzb2x2ZShkaXJlY3RvcnkpLCBvcHRzKTtcblx0fSk7XG5cbnByb2dyYW0ucGFyc2UoKTtcbiJdLCJuYW1lcyI6WyJwcm9ncmFtIiwiQ29tbWFuZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsImFyZ3VtZW50Iiwib3B0aW9uIiwiYWN0aW9uIiwiZGlyZWN0b3J5Iiwib3B0cyIsInNjYWZmb2xkIiwicmVzb2x2ZSIsInBhcnNlIl0sIm1hcHBpbmdzIjoiOzs7OzswQkFDd0I7MkJBQ0E7MEJBQ0M7QUFFekIsTUFBTUEsVUFBVSxJQUFJQyxrQkFBTztBQUUzQkQsUUFDRUUsSUFBSSxDQUFDLFlBQ0xDLFdBQVcsQ0FBQyxtQ0FDWkMsUUFBUSxDQUFDLGVBQWUsaURBQWlELEtBQ3pFQyxNQUFNLENBQUMsYUFBYSw2QkFDcEJDLE1BQU0sQ0FBQyxPQUFPQyxXQUFtQkM7SUFDakMsTUFBTUMsSUFBQUEsa0JBQVEsRUFBQ0MsSUFBQUEsaUJBQU8sRUFBQ0gsWUFBWUM7QUFDcEM7QUFFRFIsUUFBUVcsS0FBSyJ9
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCB7IHJ1bkluQnVpbGRlciB9IGZyb20gXCIuL3J1bm5lci5qc1wiO1xuXG5ydW5JbkJ1aWxkZXIocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKTtcbiJdLCJuYW1lcyI6WyJydW5JbkJ1aWxkZXIiLCJwcm9jZXNzIiwiYXJndiIsInNsaWNlIl0sIm1hcHBpbmdzIjoiOzs7Ozt3QkFDNkI7QUFFN0JBLElBQUFBLG9CQUFZLEVBQUNDLFFBQVFDLElBQUksQ0FBQ0MsS0FBSyxDQUFDIn0=
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "resolveLaunch", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return resolveLaunch;
9
+ }
10
+ });
11
+ const _nodepath = require("node:path");
12
+ function resolveLaunch(argv, cwd = process.cwd()) {
13
+ if (argv.length === 1 && (argv[0] === "--help" || argv[0] === "-h" || argv[0] === "--version")) {
14
+ return {
15
+ targetDir: cwd,
16
+ containerArgv: argv,
17
+ projectName: (0, _nodepath.basename)(cwd)
18
+ };
19
+ }
20
+ let directoryFlag;
21
+ const withoutD = [];
22
+ for(let i = 0; i < argv.length; i++){
23
+ const arg = argv[i];
24
+ if (arg === "-d") {
25
+ directoryFlag = argv[i + 1];
26
+ i++;
27
+ continue;
28
+ }
29
+ if (arg != null) withoutD.push(arg);
30
+ }
31
+ const isAdd = withoutD[0] === "webapi" && withoutD[1] === "add";
32
+ let positional;
33
+ let withoutPositional = withoutD;
34
+ if (!isAdd && withoutD[0] === "webapi" && withoutD[1] != null && !withoutD[1].startsWith("-")) {
35
+ positional = withoutD[1];
36
+ withoutPositional = [
37
+ withoutD[0],
38
+ ...withoutD.slice(2)
39
+ ];
40
+ }
41
+ const targetDir = (0, _nodepath.resolve)(cwd, positional?.trim() || directoryFlag?.trim() || ".");
42
+ return {
43
+ targetDir,
44
+ containerArgv: [
45
+ ...withoutPositional,
46
+ "-d",
47
+ "."
48
+ ],
49
+ projectName: (0, _nodepath.basename)(targetDir)
50
+ };
51
+ }
52
+
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvcmVzb2x2ZS1sYXVuY2gudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmFzZW5hbWUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmV4cG9ydCB0eXBlIExhdW5jaFBsYW4gPSB7XG5cdHRhcmdldERpcjogc3RyaW5nO1xuXHRjb250YWluZXJBcmd2OiBzdHJpbmdbXTtcblx0cHJvamVjdE5hbWU6IHN0cmluZztcbn07XG5cbi8qKlxuICogSG9zdCBgbnBtIGNyZWF0ZWAgYXJndiDihpIgZGlyZWN0b3J5IHRvIG1vdW50IGFuZCBhcmd2IGZvciB0aGUgaW4taW1hZ2UgQ0xJLlxuICogUG9zaXRpb25hbCBgd2ViYXBpIG15LWFwcGAgd2lucyBvdmVyIGAtZGAgKG5wbSB0cmVhdHMgYC1kYCBhcyBpdHMgb3duIGxvZ2xldmVsKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVMYXVuY2goYXJndjogc3RyaW5nW10sIGN3ZCA9IHByb2Nlc3MuY3dkKCkpOiBMYXVuY2hQbGFuIHtcblx0aWYgKFxuXHRcdGFyZ3YubGVuZ3RoID09PSAxICYmXG5cdFx0KGFyZ3ZbMF0gPT09IFwiLS1oZWxwXCIgfHwgYXJndlswXSA9PT0gXCItaFwiIHx8IGFyZ3ZbMF0gPT09IFwiLS12ZXJzaW9uXCIpXG5cdCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXREaXI6IGN3ZCxcblx0XHRcdGNvbnRhaW5lckFyZ3Y6IGFyZ3YsXG5cdFx0XHRwcm9qZWN0TmFtZTogYmFzZW5hbWUoY3dkKSxcblx0XHR9O1xuXHR9XG5cdGxldCBkaXJlY3RvcnlGbGFnOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGNvbnN0IHdpdGhvdXREOiBzdHJpbmdbXSA9IFtdO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBhcmcgPSBhcmd2W2ldO1xuXHRcdGlmIChhcmcgPT09IFwiLWRcIikge1xuXHRcdFx0ZGlyZWN0b3J5RmxhZyA9IGFyZ3ZbaSArIDFdO1xuXHRcdFx0aSsrO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGlmIChhcmcgIT0gbnVsbCkgd2l0aG91dEQucHVzaChhcmcpO1xuXHR9XG5cblx0Y29uc3QgaXNBZGQgPSB3aXRob3V0RFswXSA9PT0gXCJ3ZWJhcGlcIiAmJiB3aXRob3V0RFsxXSA9PT0gXCJhZGRcIjtcblx0bGV0IHBvc2l0aW9uYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0bGV0IHdpdGhvdXRQb3NpdGlvbmFsID0gd2l0aG91dEQ7XG5cdGlmIChcblx0XHQhaXNBZGQgJiZcblx0XHR3aXRob3V0RFswXSA9PT0gXCJ3ZWJhcGlcIiAmJlxuXHRcdHdpdGhvdXREWzFdICE9IG51bGwgJiZcblx0XHQhd2l0aG91dERbMV0uc3RhcnRzV2l0aChcIi1cIilcblx0KSB7XG5cdFx0cG9zaXRpb25hbCA9IHdpdGhvdXREWzFdO1xuXHRcdHdpdGhvdXRQb3NpdGlvbmFsID0gW3dpdGhvdXREWzBdLCAuLi53aXRob3V0RC5zbGljZSgyKV07XG5cdH1cblxuXHRjb25zdCB0YXJnZXREaXIgPSByZXNvbHZlKGN3ZCwgcG9zaXRpb25hbD8udHJpbSgpIHx8IGRpcmVjdG9yeUZsYWc/LnRyaW0oKSB8fCBcIi5cIik7XG5cdHJldHVybiB7XG5cdFx0dGFyZ2V0RGlyLFxuXHRcdGNvbnRhaW5lckFyZ3Y6IFsuLi53aXRob3V0UG9zaXRpb25hbCwgXCItZFwiLCBcIi5cIl0sXG5cdFx0cHJvamVjdE5hbWU6IGJhc2VuYW1lKHRhcmdldERpciksXG5cdH07XG59XG4iXSwibmFtZXMiOlsicmVzb2x2ZUxhdW5jaCIsImFyZ3YiLCJjd2QiLCJwcm9jZXNzIiwibGVuZ3RoIiwidGFyZ2V0RGlyIiwiY29udGFpbmVyQXJndiIsInByb2plY3ROYW1lIiwiYmFzZW5hbWUiLCJkaXJlY3RvcnlGbGFnIiwid2l0aG91dEQiLCJpIiwiYXJnIiwicHVzaCIsImlzQWRkIiwicG9zaXRpb25hbCIsIndpdGhvdXRQb3NpdGlvbmFsIiwic3RhcnRzV2l0aCIsInNsaWNlIiwicmVzb2x2ZSIsInRyaW0iXSwibWFwcGluZ3MiOiI7Ozs7K0JBWWdCQTs7O2VBQUFBOzs7MEJBWmtCO0FBWTNCLFNBQVNBLGNBQWNDLElBQWMsRUFBRUMsTUFBTUMsUUFBUUQsR0FBRyxFQUFFO0lBQ2hFLElBQ0NELEtBQUtHLE1BQU0sS0FBSyxLQUNmSCxDQUFBQSxJQUFJLENBQUMsRUFBRSxLQUFLLFlBQVlBLElBQUksQ0FBQyxFQUFFLEtBQUssUUFBUUEsSUFBSSxDQUFDLEVBQUUsS0FBSyxXQUFVLEdBQ2xFO1FBQ0QsT0FBTztZQUNOSSxXQUFXSDtZQUNYSSxlQUFlTDtZQUNmTSxhQUFhQyxJQUFBQSxrQkFBUSxFQUFDTjtRQUN2QjtJQUNEO0lBQ0EsSUFBSU87SUFDSixNQUFNQyxXQUFxQixFQUFFO0lBQzdCLElBQUssSUFBSUMsSUFBSSxHQUFHQSxJQUFJVixLQUFLRyxNQUFNLEVBQUVPLElBQUs7UUFDckMsTUFBTUMsTUFBTVgsSUFBSSxDQUFDVSxFQUFFO1FBQ25CLElBQUlDLFFBQVEsTUFBTTtZQUNqQkgsZ0JBQWdCUixJQUFJLENBQUNVLElBQUksRUFBRTtZQUMzQkE7WUFDQTtRQUNEO1FBQ0EsSUFBSUMsT0FBTyxNQUFNRixTQUFTRyxJQUFJLENBQUNEO0lBQ2hDO0lBRUEsTUFBTUUsUUFBUUosUUFBUSxDQUFDLEVBQUUsS0FBSyxZQUFZQSxRQUFRLENBQUMsRUFBRSxLQUFLO0lBQzFELElBQUlLO0lBQ0osSUFBSUMsb0JBQW9CTjtJQUN4QixJQUNDLENBQUNJLFNBQ0RKLFFBQVEsQ0FBQyxFQUFFLEtBQUssWUFDaEJBLFFBQVEsQ0FBQyxFQUFFLElBQUksUUFDZixDQUFDQSxRQUFRLENBQUMsRUFBRSxDQUFDTyxVQUFVLENBQUMsTUFDdkI7UUFDREYsYUFBYUwsUUFBUSxDQUFDLEVBQUU7UUFDeEJNLG9CQUFvQjtZQUFDTixRQUFRLENBQUMsRUFBRTtlQUFLQSxTQUFTUSxLQUFLLENBQUM7U0FBRztJQUN4RDtJQUVBLE1BQU1iLFlBQVljLElBQUFBLGlCQUFPLEVBQUNqQixLQUFLYSxZQUFZSyxVQUFVWCxlQUFlVyxVQUFVO0lBQzlFLE9BQU87UUFDTmY7UUFDQUMsZUFBZTtlQUFJVTtZQUFtQjtZQUFNO1NBQUk7UUFDaERULGFBQWFDLElBQUFBLGtCQUFRLEVBQUNIO0lBQ3ZCO0FBQ0QifQ==
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "runInBuilder", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return runInBuilder;
9
+ }
10
+ });
11
+ const _nodechild_process = require("node:child_process");
12
+ const _nodefs = require("node:fs");
13
+ const _nodeos = require("node:os");
14
+ const _nodepath = require("node:path");
15
+ const _resolvelaunch = require("./resolve-launch.js");
16
+ const _version = require("./version.js");
17
+ const BUILDER_IMAGE = `${_version.CREATE_IMAGE_REPOSITORY}:${_version.CREATE_VERSION}`;
18
+ function runInBuilder(argv) {
19
+ const { targetDir, containerArgv, projectName } = (0, _resolvelaunch.resolveLaunch)(argv);
20
+ (0, _nodefs.mkdirSync)(targetDir, {
21
+ recursive: true
22
+ });
23
+ (0, _nodefs.mkdirSync)((0, _nodepath.resolve)(targetDir, ".devcontainer", "npm-auth"), {
24
+ recursive: true
25
+ });
26
+ try {
27
+ (0, _nodechild_process.execFileSync)("docker", [
28
+ "info"
29
+ ], {
30
+ stdio: "pipe"
31
+ });
32
+ } catch {
33
+ console.error("\n Docker is required to scaffold a Decohere project.\n" + " Install Docker Desktop: https://www.docker.com/products/docker-desktop\n");
34
+ process.exit(1);
35
+ }
36
+ const hostUid = process.getuid?.();
37
+ const hostGid = process.getgid?.() ?? hostUid;
38
+ const runAsHostUser = hostUid != null && hostGid != null;
39
+ const npmCacheDir = (0, _nodepath.resolve)((0, _nodeos.homedir)(), ".cache/decohere-create/npm");
40
+ (0, _nodefs.mkdirSync)(npmCacheDir, {
41
+ recursive: true
42
+ });
43
+ const builderHome = "/tmp/decohere-create-home";
44
+ const volumes = [
45
+ "-v",
46
+ `${targetDir}:/workspace`,
47
+ "-v",
48
+ `${npmCacheDir}:/npm-cache`
49
+ ];
50
+ const envArgs = [
51
+ "-e",
52
+ "DECOHERE_BUILDER=1",
53
+ "-e",
54
+ `DECOHERE_PROJECT_NAME=${projectName}`,
55
+ "-e",
56
+ "NPM_CONFIG_CACHE=/npm-cache",
57
+ "-e",
58
+ "NPM_CONFIG_PREFER_OFFLINE=true",
59
+ "-e",
60
+ `HOME=${builderHome}`
61
+ ];
62
+ const npmrcPath = (0, _nodepath.resolve)((0, _nodeos.homedir)(), ".npmrc");
63
+ if ((0, _nodefs.existsSync)(npmrcPath)) {
64
+ volumes.push("-v", `${npmrcPath}:/tmp/host-npmrc:ro`);
65
+ envArgs.push("-e", "NPM_CONFIG_USERCONFIG=/tmp/host-npmrc");
66
+ }
67
+ const auth0ConfigDir = (0, _nodepath.resolve)((0, _nodeos.homedir)(), ".config/auth0");
68
+ if ((0, _nodefs.existsSync)(auth0ConfigDir)) {
69
+ volumes.push("-v", `${auth0ConfigDir}:${builderHome}/.config/auth0`);
70
+ }
71
+ const userArgs = [];
72
+ if (runAsHostUser) {
73
+ userArgs.push("--user", `${hostUid}:${hostGid}`);
74
+ } else if (hostUid != null) {
75
+ envArgs.push("-e", `HOST_UID=${hostUid}`);
76
+ if (hostGid != null) envArgs.push("-e", `HOST_GID=${hostGid}`);
77
+ }
78
+ console.log(" Running scaffolding in a sandboxed container...\n");
79
+ const ttyFlags = process.stdin.isTTY ? [
80
+ "-it"
81
+ ] : [
82
+ "-i"
83
+ ];
84
+ const result = (0, _nodechild_process.spawnSync)("docker", [
85
+ "run",
86
+ "--rm",
87
+ ...ttyFlags,
88
+ ...userArgs,
89
+ ...volumes,
90
+ ...envArgs,
91
+ "-w",
92
+ "/workspace",
93
+ BUILDER_IMAGE,
94
+ ...containerArgv
95
+ ], {
96
+ stdio: "inherit"
97
+ });
98
+ if (result.status === 0) {
99
+ console.log(`\n Scaffold complete!\n\n Open your project:\n\n code ${targetDir}\n`);
100
+ }
101
+ process.exit(result.status ?? 0);
102
+ }
103
+
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvcnVubmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNGaWxlU3luYywgc3Bhd25TeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgbWtkaXJTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHJlc29sdmVMYXVuY2ggfSBmcm9tIFwiLi9yZXNvbHZlLWxhdW5jaC5qc1wiO1xuaW1wb3J0IHsgQ1JFQVRFX0lNQUdFX1JFUE9TSVRPUlksIENSRUFURV9WRVJTSU9OIH0gZnJvbSBcIi4vdmVyc2lvbi5qc1wiO1xuXG5jb25zdCBCVUlMREVSX0lNQUdFID0gYCR7Q1JFQVRFX0lNQUdFX1JFUE9TSVRPUll9OiR7Q1JFQVRFX1ZFUlNJT059YDtcblxuLyoqXG4gKiBQdWxsL3J1biB0aGUgRGVjb2hlcmUgQ0xJIGltYWdlLiBIb3N0IGBAZGVjb2hlcmUvY3JlYXRlYCBkb2VzIG5vdCBsb2FkIHRoZVxuICogYEBkZWNvaGVyZS9jbGlgIGRlcGVuZGVuY3kgdHJlZSDigJQgdGhhdCBsaXZlcyBpbiB0aGUgaW1hZ2Ugb25seS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkluQnVpbGRlcihhcmd2OiBzdHJpbmdbXSk6IG5ldmVyIHtcblx0Y29uc3QgeyB0YXJnZXREaXIsIGNvbnRhaW5lckFyZ3YsIHByb2plY3ROYW1lIH0gPSByZXNvbHZlTGF1bmNoKGFyZ3YpO1xuXHRta2RpclN5bmModGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0bWtkaXJTeW5jKHJlc29sdmUodGFyZ2V0RGlyLCBcIi5kZXZjb250YWluZXJcIiwgXCJucG0tYXV0aFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0dHJ5IHtcblx0XHRleGVjRmlsZVN5bmMoXCJkb2NrZXJcIiwgW1wiaW5mb1wiXSwgeyBzdGRpbzogXCJwaXBlXCIgfSk7XG5cdH0gY2F0Y2gge1xuXHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRcIlxcbiAgRG9ja2VyIGlzIHJlcXVpcmVkIHRvIHNjYWZmb2xkIGEgRGVjb2hlcmUgcHJvamVjdC5cXG5cIiArXG5cdFx0XHRcdFwiICBJbnN0YWxsIERvY2tlciBEZXNrdG9wOiBodHRwczovL3d3dy5kb2NrZXIuY29tL3Byb2R1Y3RzL2RvY2tlci1kZXNrdG9wXFxuXCIsXG5cdFx0KTtcblx0XHRwcm9jZXNzLmV4aXQoMSk7XG5cdH1cblxuXHRjb25zdCBob3N0VWlkID0gcHJvY2Vzcy5nZXR1aWQ/LigpO1xuXHRjb25zdCBob3N0R2lkID0gcHJvY2Vzcy5nZXRnaWQ/LigpID8/IGhvc3RVaWQ7XG5cdGNvbnN0IHJ1bkFzSG9zdFVzZXIgPSBob3N0VWlkICE9IG51bGwgJiYgaG9zdEdpZCAhPSBudWxsO1xuXG5cdGNvbnN0IG5wbUNhY2hlRGlyID0gcmVzb2x2ZShob21lZGlyKCksIFwiLmNhY2hlL2RlY29oZXJlLWNyZWF0ZS9ucG1cIik7XG5cdG1rZGlyU3luYyhucG1DYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0Y29uc3QgYnVpbGRlckhvbWUgPSBcIi90bXAvZGVjb2hlcmUtY3JlYXRlLWhvbWVcIjtcblxuXHRjb25zdCB2b2x1bWVzOiBzdHJpbmdbXSA9IFtcblx0XHRcIi12XCIsXG5cdFx0YCR7dGFyZ2V0RGlyfTovd29ya3NwYWNlYCxcblx0XHRcIi12XCIsXG5cdFx0YCR7bnBtQ2FjaGVEaXJ9Oi9ucG0tY2FjaGVgLFxuXHRdO1xuXG5cdGNvbnN0IGVudkFyZ3M6IHN0cmluZ1tdID0gW1xuXHRcdFwiLWVcIixcblx0XHRcIkRFQ09IRVJFX0JVSUxERVI9MVwiLFxuXHRcdFwiLWVcIixcblx0XHRgREVDT0hFUkVfUFJPSkVDVF9OQU1FPSR7cHJvamVjdE5hbWV9YCxcblx0XHRcIi1lXCIsXG5cdFx0XCJOUE1fQ09ORklHX0NBQ0hFPS9ucG0tY2FjaGVcIixcblx0XHRcIi1lXCIsXG5cdFx0XCJOUE1fQ09ORklHX1BSRUZFUl9PRkZMSU5FPXRydWVcIixcblx0XHRcIi1lXCIsXG5cdFx0YEhPTUU9JHtidWlsZGVySG9tZX1gLFxuXHRdO1xuXG5cdGNvbnN0IG5wbXJjUGF0aCA9IHJlc29sdmUoaG9tZWRpcigpLCBcIi5ucG1yY1wiKTtcblx0aWYgKGV4aXN0c1N5bmMobnBtcmNQYXRoKSkge1xuXHRcdHZvbHVtZXMucHVzaChcIi12XCIsIGAke25wbXJjUGF0aH06L3RtcC9ob3N0LW5wbXJjOnJvYCk7XG5cdFx0ZW52QXJncy5wdXNoKFwiLWVcIiwgXCJOUE1fQ09ORklHX1VTRVJDT05GSUc9L3RtcC9ob3N0LW5wbXJjXCIpO1xuXHR9XG5cblx0Y29uc3QgYXV0aDBDb25maWdEaXIgPSByZXNvbHZlKGhvbWVkaXIoKSwgXCIuY29uZmlnL2F1dGgwXCIpO1xuXHRpZiAoZXhpc3RzU3luYyhhdXRoMENvbmZpZ0RpcikpIHtcblx0XHR2b2x1bWVzLnB1c2goXCItdlwiLCBgJHthdXRoMENvbmZpZ0Rpcn06JHtidWlsZGVySG9tZX0vLmNvbmZpZy9hdXRoMGApO1xuXHR9XG5cblx0Y29uc3QgdXNlckFyZ3M6IHN0cmluZ1tdID0gW107XG5cdGlmIChydW5Bc0hvc3RVc2VyKSB7XG5cdFx0dXNlckFyZ3MucHVzaChcIi0tdXNlclwiLCBgJHtob3N0VWlkfToke2hvc3RHaWR9YCk7XG5cdH0gZWxzZSBpZiAoaG9zdFVpZCAhPSBudWxsKSB7XG5cdFx0ZW52QXJncy5wdXNoKFwiLWVcIiwgYEhPU1RfVUlEPSR7aG9zdFVpZH1gKTtcblx0XHRpZiAoaG9zdEdpZCAhPSBudWxsKSBlbnZBcmdzLnB1c2goXCItZVwiLCBgSE9TVF9HSUQ9JHtob3N0R2lkfWApO1xuXHR9XG5cblx0Y29uc29sZS5sb2coXCIgIFJ1bm5pbmcgc2NhZmZvbGRpbmcgaW4gYSBzYW5kYm94ZWQgY29udGFpbmVyLi4uXFxuXCIpO1xuXG5cdGNvbnN0IHR0eUZsYWdzID0gcHJvY2Vzcy5zdGRpbi5pc1RUWSA/IFtcIi1pdFwiXSA6IFtcIi1pXCJdO1xuXG5cdGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhcblx0XHRcImRvY2tlclwiLFxuXHRcdFtcblx0XHRcdFwicnVuXCIsXG5cdFx0XHRcIi0tcm1cIixcblx0XHRcdC4uLnR0eUZsYWdzLFxuXHRcdFx0Li4udXNlckFyZ3MsXG5cdFx0XHQuLi52b2x1bWVzLFxuXHRcdFx0Li4uZW52QXJncyxcblx0XHRcdFwiLXdcIixcblx0XHRcdFwiL3dvcmtzcGFjZVwiLFxuXHRcdFx0QlVJTERFUl9JTUFHRSxcblx0XHRcdC4uLmNvbnRhaW5lckFyZ3YsXG5cdFx0XSxcblx0XHR7IHN0ZGlvOiBcImluaGVyaXRcIiB9LFxuXHQpO1xuXG5cdGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XG5cdFx0Y29uc29sZS5sb2coYFxcbiAgU2NhZmZvbGQgY29tcGxldGUhXFxuXFxuICBPcGVuIHlvdXIgcHJvamVjdDpcXG5cXG4gICAgY29kZSAke3RhcmdldERpcn1cXG5gKTtcblx0fVxuXG5cdHByb2Nlc3MuZXhpdChyZXN1bHQuc3RhdHVzID8/IDApO1xufVxuIl0sIm5hbWVzIjpbInJ1bkluQnVpbGRlciIsIkJVSUxERVJfSU1BR0UiLCJDUkVBVEVfSU1BR0VfUkVQT1NJVE9SWSIsIkNSRUFURV9WRVJTSU9OIiwiYXJndiIsInRhcmdldERpciIsImNvbnRhaW5lckFyZ3YiLCJwcm9qZWN0TmFtZSIsInJlc29sdmVMYXVuY2giLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJyZXNvbHZlIiwiZXhlY0ZpbGVTeW5jIiwic3RkaW8iLCJjb25zb2xlIiwiZXJyb3IiLCJwcm9jZXNzIiwiZXhpdCIsImhvc3RVaWQiLCJnZXR1aWQiLCJob3N0R2lkIiwiZ2V0Z2lkIiwicnVuQXNIb3N0VXNlciIsIm5wbUNhY2hlRGlyIiwiaG9tZWRpciIsImJ1aWxkZXJIb21lIiwidm9sdW1lcyIsImVudkFyZ3MiLCJucG1yY1BhdGgiLCJleGlzdHNTeW5jIiwicHVzaCIsImF1dGgwQ29uZmlnRGlyIiwidXNlckFyZ3MiLCJsb2ciLCJ0dHlGbGFncyIsInN0ZGluIiwiaXNUVFkiLCJyZXN1bHQiLCJzcGF3blN5bmMiLCJzdGF0dXMiXSwibWFwcGluZ3MiOiI7Ozs7K0JBYWdCQTs7O2VBQUFBOzs7bUNBYndCO3dCQUNGO3dCQUNkOzBCQUNBOytCQUNNO3lCQUMwQjtBQUV4RCxNQUFNQyxnQkFBZ0IsR0FBR0MsZ0NBQXVCLENBQUMsQ0FBQyxFQUFFQyx1QkFBYyxFQUFFO0FBTTdELFNBQVNILGFBQWFJLElBQWM7SUFDMUMsTUFBTSxFQUFFQyxTQUFTLEVBQUVDLGFBQWEsRUFBRUMsV0FBVyxFQUFFLEdBQUdDLElBQUFBLDRCQUFhLEVBQUNKO0lBQ2hFSyxJQUFBQSxpQkFBUyxFQUFDSixXQUFXO1FBQUVLLFdBQVc7SUFBSztJQUN2Q0QsSUFBQUEsaUJBQVMsRUFBQ0UsSUFBQUEsaUJBQU8sRUFBQ04sV0FBVyxpQkFBaUIsYUFBYTtRQUFFSyxXQUFXO0lBQUs7SUFFN0UsSUFBSTtRQUNIRSxJQUFBQSwrQkFBWSxFQUFDLFVBQVU7WUFBQztTQUFPLEVBQUU7WUFBRUMsT0FBTztRQUFPO0lBQ2xELEVBQUUsT0FBTTtRQUNQQyxRQUFRQyxLQUFLLENBQ1osNkRBQ0M7UUFFRkMsUUFBUUMsSUFBSSxDQUFDO0lBQ2Q7SUFFQSxNQUFNQyxVQUFVRixRQUFRRyxNQUFNO0lBQzlCLE1BQU1DLFVBQVVKLFFBQVFLLE1BQU0sUUFBUUg7SUFDdEMsTUFBTUksZ0JBQWdCSixXQUFXLFFBQVFFLFdBQVc7SUFFcEQsTUFBTUcsY0FBY1osSUFBQUEsaUJBQU8sRUFBQ2EsSUFBQUEsZUFBTyxLQUFJO0lBQ3ZDZixJQUFBQSxpQkFBUyxFQUFDYyxhQUFhO1FBQUViLFdBQVc7SUFBSztJQUV6QyxNQUFNZSxjQUFjO0lBRXBCLE1BQU1DLFVBQW9CO1FBQ3pCO1FBQ0EsR0FBR3JCLFVBQVUsV0FBVyxDQUFDO1FBQ3pCO1FBQ0EsR0FBR2tCLFlBQVksV0FBVyxDQUFDO0tBQzNCO0lBRUQsTUFBTUksVUFBb0I7UUFDekI7UUFDQTtRQUNBO1FBQ0EsQ0FBQyxzQkFBc0IsRUFBRXBCLGFBQWE7UUFDdEM7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLENBQUMsS0FBSyxFQUFFa0IsYUFBYTtLQUNyQjtJQUVELE1BQU1HLFlBQVlqQixJQUFBQSxpQkFBTyxFQUFDYSxJQUFBQSxlQUFPLEtBQUk7SUFDckMsSUFBSUssSUFBQUEsa0JBQVUsRUFBQ0QsWUFBWTtRQUMxQkYsUUFBUUksSUFBSSxDQUFDLE1BQU0sR0FBR0YsVUFBVSxtQkFBbUIsQ0FBQztRQUNwREQsUUFBUUcsSUFBSSxDQUFDLE1BQU07SUFDcEI7SUFFQSxNQUFNQyxpQkFBaUJwQixJQUFBQSxpQkFBTyxFQUFDYSxJQUFBQSxlQUFPLEtBQUk7SUFDMUMsSUFBSUssSUFBQUEsa0JBQVUsRUFBQ0UsaUJBQWlCO1FBQy9CTCxRQUFRSSxJQUFJLENBQUMsTUFBTSxHQUFHQyxlQUFlLENBQUMsRUFBRU4sWUFBWSxjQUFjLENBQUM7SUFDcEU7SUFFQSxNQUFNTyxXQUFxQixFQUFFO0lBQzdCLElBQUlWLGVBQWU7UUFDbEJVLFNBQVNGLElBQUksQ0FBQyxVQUFVLEdBQUdaLFFBQVEsQ0FBQyxFQUFFRSxTQUFTO0lBQ2hELE9BQU8sSUFBSUYsV0FBVyxNQUFNO1FBQzNCUyxRQUFRRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRVosU0FBUztRQUN4QyxJQUFJRSxXQUFXLE1BQU1PLFFBQVFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFVixTQUFTO0lBQzlEO0lBRUFOLFFBQVFtQixHQUFHLENBQUM7SUFFWixNQUFNQyxXQUFXbEIsUUFBUW1CLEtBQUssQ0FBQ0MsS0FBSyxHQUFHO1FBQUM7S0FBTSxHQUFHO1FBQUM7S0FBSztJQUV2RCxNQUFNQyxTQUFTQyxJQUFBQSw0QkFBUyxFQUN2QixVQUNBO1FBQ0M7UUFDQTtXQUNHSjtXQUNBRjtXQUNBTjtXQUNBQztRQUNIO1FBQ0E7UUFDQTFCO1dBQ0dLO0tBQ0gsRUFDRDtRQUFFTyxPQUFPO0lBQVU7SUFHcEIsSUFBSXdCLE9BQU9FLE1BQU0sS0FBSyxHQUFHO1FBQ3hCekIsUUFBUW1CLEdBQUcsQ0FBQyxDQUFDLDJEQUEyRCxFQUFFNUIsVUFBVSxFQUFFLENBQUM7SUFDeEY7SUFFQVcsUUFBUUMsSUFBSSxDQUFDb0IsT0FBT0UsTUFBTSxJQUFJO0FBQy9CIn0=
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get CREATE_IMAGE_REPOSITORY () {
13
+ return CREATE_IMAGE_REPOSITORY;
14
+ },
15
+ get CREATE_VERSION () {
16
+ return CREATE_VERSION;
17
+ }
18
+ });
19
+ const _nodemodule = require("node:module");
20
+ const _nodepath = require("node:path");
21
+ const _nodeurl = require("node:url");
22
+ const _require = (0, _nodemodule.createRequire)(require("url").pathToFileURL(__filename).toString());
23
+ const DEFAULT_CREATE_VERSION = "0.0.1-dev";
24
+ const DEFAULT_CREATE_IMAGE_REPOSITORY = "ghcr.io/typesmiths/decohere/create";
25
+ function resolveCreateMetadata() {
26
+ let dir = (0, _nodepath.dirname)((0, _nodeurl.fileURLToPath)(require("url").pathToFileURL(__filename).toString()));
27
+ for(let i = 0; i < 5; i++){
28
+ try {
29
+ const pkg = _require((0, _nodepath.join)(dir, "package.json"));
30
+ if (pkg.name === "@decohere/create") {
31
+ return {
32
+ version: pkg.version ?? DEFAULT_CREATE_VERSION,
33
+ imageRepository: pkg.decohere?.dockerImageRepository ?? DEFAULT_CREATE_IMAGE_REPOSITORY
34
+ };
35
+ }
36
+ } catch {}
37
+ const parent = (0, _nodepath.dirname)(dir);
38
+ if (parent === dir) break;
39
+ dir = parent;
40
+ }
41
+ return {
42
+ version: DEFAULT_CREATE_VERSION,
43
+ imageRepository: DEFAULT_CREATE_IMAGE_REPOSITORY
44
+ };
45
+ }
46
+ const createMetadata = resolveCreateMetadata();
47
+ const CREATE_VERSION = createMetadata.version;
48
+ const CREATE_IMAGE_REPOSITORY = createMetadata.imageRepository;
49
+
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvdmVyc2lvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiO1xuXG5jb25zdCBfcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxudHlwZSBDcmVhdGVQYWNrYWdlTWV0YWRhdGEgPSB7XG5cdG5hbWU/OiBzdHJpbmc7XG5cdHZlcnNpb24/OiBzdHJpbmc7XG5cdGRlY29oZXJlPzoge1xuXHRcdGRvY2tlckltYWdlUmVwb3NpdG9yeT86IHN0cmluZztcblx0fTtcbn07XG5cbmNvbnN0IERFRkFVTFRfQ1JFQVRFX1ZFUlNJT04gPSBcIjAuMC4xLWRldlwiO1xuY29uc3QgREVGQVVMVF9DUkVBVEVfSU1BR0VfUkVQT1NJVE9SWSA9IFwiZ2hjci5pby90eXBlc21pdGhzL2RlY29oZXJlL2NyZWF0ZVwiO1xuXG5mdW5jdGlvbiByZXNvbHZlQ3JlYXRlTWV0YWRhdGEoKSB7XG5cdGxldCBkaXIgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHBrZyA9IF9yZXF1aXJlKGpvaW4oZGlyLCBcInBhY2thZ2UuanNvblwiKSkgYXMgQ3JlYXRlUGFja2FnZU1ldGFkYXRhO1xuXHRcdFx0aWYgKHBrZy5uYW1lID09PSBcIkBkZWNvaGVyZS9jcmVhdGVcIikge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHZlcnNpb246IHBrZy52ZXJzaW9uID8/IERFRkFVTFRfQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcdFx0aW1hZ2VSZXBvc2l0b3J5OlxuXHRcdFx0XHRcdFx0cGtnLmRlY29oZXJlPy5kb2NrZXJJbWFnZVJlcG9zaXRvcnkgPz8gREVGQVVMVF9DUkVBVEVfSU1BR0VfUkVQT1NJVE9SWSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIHt9XG5cdFx0Y29uc3QgcGFyZW50ID0gZGlybmFtZShkaXIpO1xuXHRcdGlmIChwYXJlbnQgPT09IGRpcikgYnJlYWs7XG5cdFx0ZGlyID0gcGFyZW50O1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHR2ZXJzaW9uOiBERUZBVUxUX0NSRUFURV9WRVJTSU9OLFxuXHRcdGltYWdlUmVwb3NpdG9yeTogREVGQVVMVF9DUkVBVEVfSU1BR0VfUkVQT1NJVE9SWSxcblx0fTtcbn1cblxuY29uc3QgY3JlYXRlTWV0YWRhdGEgPSByZXNvbHZlQ3JlYXRlTWV0YWRhdGEoKTtcblxuZXhwb3J0IGNvbnN0IENSRUFURV9WRVJTSU9OID0gY3JlYXRlTWV0YWRhdGEudmVyc2lvbjtcblxuZXhwb3J0IGNvbnN0IENSRUFURV9JTUFHRV9SRVBPU0lUT1JZID0gY3JlYXRlTWV0YWRhdGEuaW1hZ2VSZXBvc2l0b3J5O1xuIl0sIm5hbWVzIjpbIkNSRUFURV9JTUFHRV9SRVBPU0lUT1JZIiwiQ1JFQVRFX1ZFUlNJT04iLCJfcmVxdWlyZSIsImNyZWF0ZVJlcXVpcmUiLCJERUZBVUxUX0NSRUFURV9WRVJTSU9OIiwiREVGQVVMVF9DUkVBVEVfSU1BR0VfUkVQT1NJVE9SWSIsInJlc29sdmVDcmVhdGVNZXRhZGF0YSIsImRpciIsImRpcm5hbWUiLCJmaWxlVVJMVG9QYXRoIiwiaSIsInBrZyIsImpvaW4iLCJuYW1lIiwidmVyc2lvbiIsImltYWdlUmVwb3NpdG9yeSIsImRlY29oZXJlIiwiZG9ja2VySW1hZ2VSZXBvc2l0b3J5IiwicGFyZW50IiwiY3JlYXRlTWV0YWRhdGEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBNkNhQTtlQUFBQTs7UUFGQUM7ZUFBQUE7Ozs0QkEzQ2lCOzBCQUNBO3lCQUNBO0FBRTlCLE1BQU1DLFdBQVdDLElBQUFBLHlCQUFhLEVBQUM7QUFVL0IsTUFBTUMseUJBQXlCO0FBQy9CLE1BQU1DLGtDQUFrQztBQUV4QyxTQUFTQztJQUNSLElBQUlDLE1BQU1DLElBQUFBLGlCQUFPLEVBQUNDLElBQUFBLHNCQUFhLEVBQUM7SUFDaEMsSUFBSyxJQUFJQyxJQUFJLEdBQUdBLElBQUksR0FBR0EsSUFBSztRQUMzQixJQUFJO1lBQ0gsTUFBTUMsTUFBTVQsU0FBU1UsSUFBQUEsY0FBSSxFQUFDTCxLQUFLO1lBQy9CLElBQUlJLElBQUlFLElBQUksS0FBSyxvQkFBb0I7Z0JBQ3BDLE9BQU87b0JBQ05DLFNBQVNILElBQUlHLE9BQU8sSUFBSVY7b0JBQ3hCVyxpQkFDQ0osSUFBSUssUUFBUSxFQUFFQyx5QkFBeUJaO2dCQUN6QztZQUNEO1FBQ0QsRUFBRSxPQUFNLENBQUM7UUFDVCxNQUFNYSxTQUFTVixJQUFBQSxpQkFBTyxFQUFDRDtRQUN2QixJQUFJVyxXQUFXWCxLQUFLO1FBQ3BCQSxNQUFNVztJQUNQO0lBRUEsT0FBTztRQUNOSixTQUFTVjtRQUNUVyxpQkFBaUJWO0lBQ2xCO0FBQ0Q7QUFFQSxNQUFNYyxpQkFBaUJiO0FBRWhCLE1BQU1MLGlCQUFpQmtCLGVBQWVMLE9BQU87QUFFN0MsTUFBTWQsMEJBQTBCbUIsZUFBZUosZUFBZSJ9
package/es6/src/cli.js CHANGED
@@ -1,11 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { resolve } from "node:path";
3
- import { Command } from "commander";
4
- import { scaffold } from "./scaffold.js";
5
- const program = new Command();
6
- program.name("decohere").description("Scaffold a new Decohere project").argument("[directory]", "Target directory (default: current directory)", ".").option("-y, --yes", "Skip confirmation prompts").action(async (directory, opts)=>{
7
- await scaffold(resolve(directory), opts);
8
- });
9
- program.parse();
2
+ import { runInBuilder } from "./runner.js";
3
+ runInBuilder(process.argv.slice(2));
10
4
 
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvY3JlYXRlL3NyYy9jbGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgeyBzY2FmZm9sZCB9IGZyb20gXCIuL3NjYWZmb2xkLmpzXCI7XG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXG5wcm9ncmFtXG5cdC5uYW1lKFwiZGVjb2hlcmVcIilcblx0LmRlc2NyaXB0aW9uKFwiU2NhZmZvbGQgYSBuZXcgRGVjb2hlcmUgcHJvamVjdFwiKVxuXHQuYXJndW1lbnQoXCJbZGlyZWN0b3J5XVwiLCBcIlRhcmdldCBkaXJlY3RvcnkgKGRlZmF1bHQ6IGN1cnJlbnQgZGlyZWN0b3J5KVwiLCBcIi5cIilcblx0Lm9wdGlvbihcIi15LCAtLXllc1wiLCBcIlNraXAgY29uZmlybWF0aW9uIHByb21wdHNcIilcblx0LmFjdGlvbihhc3luYyAoZGlyZWN0b3J5OiBzdHJpbmcsIG9wdHM6IHsgeWVzPzogYm9vbGVhbiB9KSA9PiB7XG5cdFx0YXdhaXQgc2NhZmZvbGQocmVzb2x2ZShkaXJlY3RvcnkpLCBvcHRzKTtcblx0fSk7XG5cbnByb2dyYW0ucGFyc2UoKTtcbiJdLCJuYW1lcyI6WyJyZXNvbHZlIiwiQ29tbWFuZCIsInNjYWZmb2xkIiwicHJvZ3JhbSIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsImFyZ3VtZW50Iiwib3B0aW9uIiwiYWN0aW9uIiwiZGlyZWN0b3J5Iiwib3B0cyIsInBhcnNlIl0sIm1hcHBpbmdzIjoiO0FBQ0EsU0FBU0EsT0FBTyxRQUFRLFlBQVk7QUFDcEMsU0FBU0MsT0FBTyxRQUFRLFlBQVk7QUFDcEMsU0FBU0MsUUFBUSxRQUFRLGdCQUFnQjtBQUV6QyxNQUFNQyxVQUFVLElBQUlGO0FBRXBCRSxRQUNFQyxJQUFJLENBQUMsWUFDTEMsV0FBVyxDQUFDLG1DQUNaQyxRQUFRLENBQUMsZUFBZSxpREFBaUQsS0FDekVDLE1BQU0sQ0FBQyxhQUFhLDZCQUNwQkMsTUFBTSxDQUFDLE9BQU9DLFdBQW1CQztJQUNqQyxNQUFNUixTQUFTRixRQUFRUyxZQUFZQztBQUNwQztBQUVEUCxRQUFRUSxLQUFLIn0=
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCB7IHJ1bkluQnVpbGRlciB9IGZyb20gXCIuL3J1bm5lci5qc1wiO1xuXG5ydW5JbkJ1aWxkZXIocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKTtcbiJdLCJuYW1lcyI6WyJydW5JbkJ1aWxkZXIiLCJwcm9jZXNzIiwiYXJndiIsInNsaWNlIl0sIm1hcHBpbmdzIjoiO0FBQ0EsU0FBU0EsWUFBWSxRQUFRLGNBQWM7QUFFM0NBLGFBQWFDLFFBQVFDLElBQUksQ0FBQ0MsS0FBSyxDQUFDIn0=
@@ -0,0 +1,46 @@
1
+ import { basename, resolve } from "node:path";
2
+ /**
3
+ * Host `npm create` argv → directory to mount and argv for the in-image CLI.
4
+ * Positional `webapi my-app` wins over `-d` (npm treats `-d` as its own loglevel).
5
+ */ export function resolveLaunch(argv, cwd = process.cwd()) {
6
+ if (argv.length === 1 && (argv[0] === "--help" || argv[0] === "-h" || argv[0] === "--version")) {
7
+ return {
8
+ targetDir: cwd,
9
+ containerArgv: argv,
10
+ projectName: basename(cwd)
11
+ };
12
+ }
13
+ let directoryFlag;
14
+ const withoutD = [];
15
+ for(let i = 0; i < argv.length; i++){
16
+ const arg = argv[i];
17
+ if (arg === "-d") {
18
+ directoryFlag = argv[i + 1];
19
+ i++;
20
+ continue;
21
+ }
22
+ if (arg != null) withoutD.push(arg);
23
+ }
24
+ const isAdd = withoutD[0] === "webapi" && withoutD[1] === "add";
25
+ let positional;
26
+ let withoutPositional = withoutD;
27
+ if (!isAdd && withoutD[0] === "webapi" && withoutD[1] != null && !withoutD[1].startsWith("-")) {
28
+ positional = withoutD[1];
29
+ withoutPositional = [
30
+ withoutD[0],
31
+ ...withoutD.slice(2)
32
+ ];
33
+ }
34
+ const targetDir = resolve(cwd, positional?.trim() || directoryFlag?.trim() || ".");
35
+ return {
36
+ targetDir,
37
+ containerArgv: [
38
+ ...withoutPositional,
39
+ "-d",
40
+ "."
41
+ ],
42
+ projectName: basename(targetDir)
43
+ };
44
+ }
45
+
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvcmVzb2x2ZS1sYXVuY2gudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmFzZW5hbWUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmV4cG9ydCB0eXBlIExhdW5jaFBsYW4gPSB7XG5cdHRhcmdldERpcjogc3RyaW5nO1xuXHRjb250YWluZXJBcmd2OiBzdHJpbmdbXTtcblx0cHJvamVjdE5hbWU6IHN0cmluZztcbn07XG5cbi8qKlxuICogSG9zdCBgbnBtIGNyZWF0ZWAgYXJndiDihpIgZGlyZWN0b3J5IHRvIG1vdW50IGFuZCBhcmd2IGZvciB0aGUgaW4taW1hZ2UgQ0xJLlxuICogUG9zaXRpb25hbCBgd2ViYXBpIG15LWFwcGAgd2lucyBvdmVyIGAtZGAgKG5wbSB0cmVhdHMgYC1kYCBhcyBpdHMgb3duIGxvZ2xldmVsKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVMYXVuY2goYXJndjogc3RyaW5nW10sIGN3ZCA9IHByb2Nlc3MuY3dkKCkpOiBMYXVuY2hQbGFuIHtcblx0aWYgKFxuXHRcdGFyZ3YubGVuZ3RoID09PSAxICYmXG5cdFx0KGFyZ3ZbMF0gPT09IFwiLS1oZWxwXCIgfHwgYXJndlswXSA9PT0gXCItaFwiIHx8IGFyZ3ZbMF0gPT09IFwiLS12ZXJzaW9uXCIpXG5cdCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXREaXI6IGN3ZCxcblx0XHRcdGNvbnRhaW5lckFyZ3Y6IGFyZ3YsXG5cdFx0XHRwcm9qZWN0TmFtZTogYmFzZW5hbWUoY3dkKSxcblx0XHR9O1xuXHR9XG5cdGxldCBkaXJlY3RvcnlGbGFnOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGNvbnN0IHdpdGhvdXREOiBzdHJpbmdbXSA9IFtdO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBhcmcgPSBhcmd2W2ldO1xuXHRcdGlmIChhcmcgPT09IFwiLWRcIikge1xuXHRcdFx0ZGlyZWN0b3J5RmxhZyA9IGFyZ3ZbaSArIDFdO1xuXHRcdFx0aSsrO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGlmIChhcmcgIT0gbnVsbCkgd2l0aG91dEQucHVzaChhcmcpO1xuXHR9XG5cblx0Y29uc3QgaXNBZGQgPSB3aXRob3V0RFswXSA9PT0gXCJ3ZWJhcGlcIiAmJiB3aXRob3V0RFsxXSA9PT0gXCJhZGRcIjtcblx0bGV0IHBvc2l0aW9uYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0bGV0IHdpdGhvdXRQb3NpdGlvbmFsID0gd2l0aG91dEQ7XG5cdGlmIChcblx0XHQhaXNBZGQgJiZcblx0XHR3aXRob3V0RFswXSA9PT0gXCJ3ZWJhcGlcIiAmJlxuXHRcdHdpdGhvdXREWzFdICE9IG51bGwgJiZcblx0XHQhd2l0aG91dERbMV0uc3RhcnRzV2l0aChcIi1cIilcblx0KSB7XG5cdFx0cG9zaXRpb25hbCA9IHdpdGhvdXREWzFdO1xuXHRcdHdpdGhvdXRQb3NpdGlvbmFsID0gW3dpdGhvdXREWzBdLCAuLi53aXRob3V0RC5zbGljZSgyKV07XG5cdH1cblxuXHRjb25zdCB0YXJnZXREaXIgPSByZXNvbHZlKGN3ZCwgcG9zaXRpb25hbD8udHJpbSgpIHx8IGRpcmVjdG9yeUZsYWc/LnRyaW0oKSB8fCBcIi5cIik7XG5cdHJldHVybiB7XG5cdFx0dGFyZ2V0RGlyLFxuXHRcdGNvbnRhaW5lckFyZ3Y6IFsuLi53aXRob3V0UG9zaXRpb25hbCwgXCItZFwiLCBcIi5cIl0sXG5cdFx0cHJvamVjdE5hbWU6IGJhc2VuYW1lKHRhcmdldERpciksXG5cdH07XG59XG4iXSwibmFtZXMiOlsiYmFzZW5hbWUiLCJyZXNvbHZlIiwicmVzb2x2ZUxhdW5jaCIsImFyZ3YiLCJjd2QiLCJwcm9jZXNzIiwibGVuZ3RoIiwidGFyZ2V0RGlyIiwiY29udGFpbmVyQXJndiIsInByb2plY3ROYW1lIiwiZGlyZWN0b3J5RmxhZyIsIndpdGhvdXREIiwiaSIsImFyZyIsInB1c2giLCJpc0FkZCIsInBvc2l0aW9uYWwiLCJ3aXRob3V0UG9zaXRpb25hbCIsInN0YXJ0c1dpdGgiLCJzbGljZSIsInRyaW0iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFFBQVEsRUFBRUMsT0FBTyxRQUFRLFlBQVk7QUFROUM7OztDQUdDLEdBQ0QsT0FBTyxTQUFTQyxjQUFjQyxJQUFjLEVBQUVDLE1BQU1DLFFBQVFELEdBQUcsRUFBRTtJQUNoRSxJQUNDRCxLQUFLRyxNQUFNLEtBQUssS0FDZkgsQ0FBQUEsSUFBSSxDQUFDLEVBQUUsS0FBSyxZQUFZQSxJQUFJLENBQUMsRUFBRSxLQUFLLFFBQVFBLElBQUksQ0FBQyxFQUFFLEtBQUssV0FBVSxHQUNsRTtRQUNELE9BQU87WUFDTkksV0FBV0g7WUFDWEksZUFBZUw7WUFDZk0sYUFBYVQsU0FBU0k7UUFDdkI7SUFDRDtJQUNBLElBQUlNO0lBQ0osTUFBTUMsV0FBcUIsRUFBRTtJQUM3QixJQUFLLElBQUlDLElBQUksR0FBR0EsSUFBSVQsS0FBS0csTUFBTSxFQUFFTSxJQUFLO1FBQ3JDLE1BQU1DLE1BQU1WLElBQUksQ0FBQ1MsRUFBRTtRQUNuQixJQUFJQyxRQUFRLE1BQU07WUFDakJILGdCQUFnQlAsSUFBSSxDQUFDUyxJQUFJLEVBQUU7WUFDM0JBO1lBQ0E7UUFDRDtRQUNBLElBQUlDLE9BQU8sTUFBTUYsU0FBU0csSUFBSSxDQUFDRDtJQUNoQztJQUVBLE1BQU1FLFFBQVFKLFFBQVEsQ0FBQyxFQUFFLEtBQUssWUFBWUEsUUFBUSxDQUFDLEVBQUUsS0FBSztJQUMxRCxJQUFJSztJQUNKLElBQUlDLG9CQUFvQk47SUFDeEIsSUFDQyxDQUFDSSxTQUNESixRQUFRLENBQUMsRUFBRSxLQUFLLFlBQ2hCQSxRQUFRLENBQUMsRUFBRSxJQUFJLFFBQ2YsQ0FBQ0EsUUFBUSxDQUFDLEVBQUUsQ0FBQ08sVUFBVSxDQUFDLE1BQ3ZCO1FBQ0RGLGFBQWFMLFFBQVEsQ0FBQyxFQUFFO1FBQ3hCTSxvQkFBb0I7WUFBQ04sUUFBUSxDQUFDLEVBQUU7ZUFBS0EsU0FBU1EsS0FBSyxDQUFDO1NBQUc7SUFDeEQ7SUFFQSxNQUFNWixZQUFZTixRQUFRRyxLQUFLWSxZQUFZSSxVQUFVVixlQUFlVSxVQUFVO0lBQzlFLE9BQU87UUFDTmI7UUFDQUMsZUFBZTtlQUFJUztZQUFtQjtZQUFNO1NBQUk7UUFDaERSLGFBQWFULFNBQVNPO0lBQ3ZCO0FBQ0QifQ==
@@ -0,0 +1,97 @@
1
+ import { execFileSync, spawnSync } from "node:child_process";
2
+ import { existsSync, mkdirSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { resolve } from "node:path";
5
+ import { resolveLaunch } from "./resolve-launch.js";
6
+ import { CREATE_IMAGE_REPOSITORY, CREATE_VERSION } from "./version.js";
7
+ const BUILDER_IMAGE = `${CREATE_IMAGE_REPOSITORY}:${CREATE_VERSION}`;
8
+ /**
9
+ * Pull/run the Decohere CLI image. Host `@decohere/create` does not load the
10
+ * `@decohere/cli` dependency tree — that lives in the image only.
11
+ */ export function runInBuilder(argv) {
12
+ const { targetDir, containerArgv, projectName } = resolveLaunch(argv);
13
+ mkdirSync(targetDir, {
14
+ recursive: true
15
+ });
16
+ mkdirSync(resolve(targetDir, ".devcontainer", "npm-auth"), {
17
+ recursive: true
18
+ });
19
+ try {
20
+ execFileSync("docker", [
21
+ "info"
22
+ ], {
23
+ stdio: "pipe"
24
+ });
25
+ } catch {
26
+ console.error("\n Docker is required to scaffold a Decohere project.\n" + " Install Docker Desktop: https://www.docker.com/products/docker-desktop\n");
27
+ process.exit(1);
28
+ }
29
+ const hostUid = process.getuid?.();
30
+ const hostGid = process.getgid?.() ?? hostUid;
31
+ const runAsHostUser = hostUid != null && hostGid != null;
32
+ const npmCacheDir = resolve(homedir(), ".cache/decohere-create/npm");
33
+ mkdirSync(npmCacheDir, {
34
+ recursive: true
35
+ });
36
+ const builderHome = "/tmp/decohere-create-home";
37
+ const volumes = [
38
+ "-v",
39
+ `${targetDir}:/workspace`,
40
+ "-v",
41
+ `${npmCacheDir}:/npm-cache`
42
+ ];
43
+ const envArgs = [
44
+ "-e",
45
+ "DECOHERE_BUILDER=1",
46
+ "-e",
47
+ `DECOHERE_PROJECT_NAME=${projectName}`,
48
+ "-e",
49
+ "NPM_CONFIG_CACHE=/npm-cache",
50
+ "-e",
51
+ "NPM_CONFIG_PREFER_OFFLINE=true",
52
+ "-e",
53
+ `HOME=${builderHome}`
54
+ ];
55
+ const npmrcPath = resolve(homedir(), ".npmrc");
56
+ if (existsSync(npmrcPath)) {
57
+ volumes.push("-v", `${npmrcPath}:/tmp/host-npmrc:ro`);
58
+ envArgs.push("-e", "NPM_CONFIG_USERCONFIG=/tmp/host-npmrc");
59
+ }
60
+ const auth0ConfigDir = resolve(homedir(), ".config/auth0");
61
+ if (existsSync(auth0ConfigDir)) {
62
+ volumes.push("-v", `${auth0ConfigDir}:${builderHome}/.config/auth0`);
63
+ }
64
+ const userArgs = [];
65
+ if (runAsHostUser) {
66
+ userArgs.push("--user", `${hostUid}:${hostGid}`);
67
+ } else if (hostUid != null) {
68
+ envArgs.push("-e", `HOST_UID=${hostUid}`);
69
+ if (hostGid != null) envArgs.push("-e", `HOST_GID=${hostGid}`);
70
+ }
71
+ console.log(" Running scaffolding in a sandboxed container...\n");
72
+ const ttyFlags = process.stdin.isTTY ? [
73
+ "-it"
74
+ ] : [
75
+ "-i"
76
+ ];
77
+ const result = spawnSync("docker", [
78
+ "run",
79
+ "--rm",
80
+ ...ttyFlags,
81
+ ...userArgs,
82
+ ...volumes,
83
+ ...envArgs,
84
+ "-w",
85
+ "/workspace",
86
+ BUILDER_IMAGE,
87
+ ...containerArgv
88
+ ], {
89
+ stdio: "inherit"
90
+ });
91
+ if (result.status === 0) {
92
+ console.log(`\n Scaffold complete!\n\n Open your project:\n\n code ${targetDir}\n`);
93
+ }
94
+ process.exit(result.status ?? 0);
95
+ }
96
+
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvcnVubmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNGaWxlU3luYywgc3Bhd25TeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgbWtkaXJTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHJlc29sdmVMYXVuY2ggfSBmcm9tIFwiLi9yZXNvbHZlLWxhdW5jaC5qc1wiO1xuaW1wb3J0IHsgQ1JFQVRFX0lNQUdFX1JFUE9TSVRPUlksIENSRUFURV9WRVJTSU9OIH0gZnJvbSBcIi4vdmVyc2lvbi5qc1wiO1xuXG5jb25zdCBCVUlMREVSX0lNQUdFID0gYCR7Q1JFQVRFX0lNQUdFX1JFUE9TSVRPUll9OiR7Q1JFQVRFX1ZFUlNJT059YDtcblxuLyoqXG4gKiBQdWxsL3J1biB0aGUgRGVjb2hlcmUgQ0xJIGltYWdlLiBIb3N0IGBAZGVjb2hlcmUvY3JlYXRlYCBkb2VzIG5vdCBsb2FkIHRoZVxuICogYEBkZWNvaGVyZS9jbGlgIGRlcGVuZGVuY3kgdHJlZSDigJQgdGhhdCBsaXZlcyBpbiB0aGUgaW1hZ2Ugb25seS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkluQnVpbGRlcihhcmd2OiBzdHJpbmdbXSk6IG5ldmVyIHtcblx0Y29uc3QgeyB0YXJnZXREaXIsIGNvbnRhaW5lckFyZ3YsIHByb2plY3ROYW1lIH0gPSByZXNvbHZlTGF1bmNoKGFyZ3YpO1xuXHRta2RpclN5bmModGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0bWtkaXJTeW5jKHJlc29sdmUodGFyZ2V0RGlyLCBcIi5kZXZjb250YWluZXJcIiwgXCJucG0tYXV0aFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0dHJ5IHtcblx0XHRleGVjRmlsZVN5bmMoXCJkb2NrZXJcIiwgW1wiaW5mb1wiXSwgeyBzdGRpbzogXCJwaXBlXCIgfSk7XG5cdH0gY2F0Y2gge1xuXHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRcIlxcbiAgRG9ja2VyIGlzIHJlcXVpcmVkIHRvIHNjYWZmb2xkIGEgRGVjb2hlcmUgcHJvamVjdC5cXG5cIiArXG5cdFx0XHRcdFwiICBJbnN0YWxsIERvY2tlciBEZXNrdG9wOiBodHRwczovL3d3dy5kb2NrZXIuY29tL3Byb2R1Y3RzL2RvY2tlci1kZXNrdG9wXFxuXCIsXG5cdFx0KTtcblx0XHRwcm9jZXNzLmV4aXQoMSk7XG5cdH1cblxuXHRjb25zdCBob3N0VWlkID0gcHJvY2Vzcy5nZXR1aWQ/LigpO1xuXHRjb25zdCBob3N0R2lkID0gcHJvY2Vzcy5nZXRnaWQ/LigpID8/IGhvc3RVaWQ7XG5cdGNvbnN0IHJ1bkFzSG9zdFVzZXIgPSBob3N0VWlkICE9IG51bGwgJiYgaG9zdEdpZCAhPSBudWxsO1xuXG5cdGNvbnN0IG5wbUNhY2hlRGlyID0gcmVzb2x2ZShob21lZGlyKCksIFwiLmNhY2hlL2RlY29oZXJlLWNyZWF0ZS9ucG1cIik7XG5cdG1rZGlyU3luYyhucG1DYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0Y29uc3QgYnVpbGRlckhvbWUgPSBcIi90bXAvZGVjb2hlcmUtY3JlYXRlLWhvbWVcIjtcblxuXHRjb25zdCB2b2x1bWVzOiBzdHJpbmdbXSA9IFtcblx0XHRcIi12XCIsXG5cdFx0YCR7dGFyZ2V0RGlyfTovd29ya3NwYWNlYCxcblx0XHRcIi12XCIsXG5cdFx0YCR7bnBtQ2FjaGVEaXJ9Oi9ucG0tY2FjaGVgLFxuXHRdO1xuXG5cdGNvbnN0IGVudkFyZ3M6IHN0cmluZ1tdID0gW1xuXHRcdFwiLWVcIixcblx0XHRcIkRFQ09IRVJFX0JVSUxERVI9MVwiLFxuXHRcdFwiLWVcIixcblx0XHRgREVDT0hFUkVfUFJPSkVDVF9OQU1FPSR7cHJvamVjdE5hbWV9YCxcblx0XHRcIi1lXCIsXG5cdFx0XCJOUE1fQ09ORklHX0NBQ0hFPS9ucG0tY2FjaGVcIixcblx0XHRcIi1lXCIsXG5cdFx0XCJOUE1fQ09ORklHX1BSRUZFUl9PRkZMSU5FPXRydWVcIixcblx0XHRcIi1lXCIsXG5cdFx0YEhPTUU9JHtidWlsZGVySG9tZX1gLFxuXHRdO1xuXG5cdGNvbnN0IG5wbXJjUGF0aCA9IHJlc29sdmUoaG9tZWRpcigpLCBcIi5ucG1yY1wiKTtcblx0aWYgKGV4aXN0c1N5bmMobnBtcmNQYXRoKSkge1xuXHRcdHZvbHVtZXMucHVzaChcIi12XCIsIGAke25wbXJjUGF0aH06L3RtcC9ob3N0LW5wbXJjOnJvYCk7XG5cdFx0ZW52QXJncy5wdXNoKFwiLWVcIiwgXCJOUE1fQ09ORklHX1VTRVJDT05GSUc9L3RtcC9ob3N0LW5wbXJjXCIpO1xuXHR9XG5cblx0Y29uc3QgYXV0aDBDb25maWdEaXIgPSByZXNvbHZlKGhvbWVkaXIoKSwgXCIuY29uZmlnL2F1dGgwXCIpO1xuXHRpZiAoZXhpc3RzU3luYyhhdXRoMENvbmZpZ0RpcikpIHtcblx0XHR2b2x1bWVzLnB1c2goXCItdlwiLCBgJHthdXRoMENvbmZpZ0Rpcn06JHtidWlsZGVySG9tZX0vLmNvbmZpZy9hdXRoMGApO1xuXHR9XG5cblx0Y29uc3QgdXNlckFyZ3M6IHN0cmluZ1tdID0gW107XG5cdGlmIChydW5Bc0hvc3RVc2VyKSB7XG5cdFx0dXNlckFyZ3MucHVzaChcIi0tdXNlclwiLCBgJHtob3N0VWlkfToke2hvc3RHaWR9YCk7XG5cdH0gZWxzZSBpZiAoaG9zdFVpZCAhPSBudWxsKSB7XG5cdFx0ZW52QXJncy5wdXNoKFwiLWVcIiwgYEhPU1RfVUlEPSR7aG9zdFVpZH1gKTtcblx0XHRpZiAoaG9zdEdpZCAhPSBudWxsKSBlbnZBcmdzLnB1c2goXCItZVwiLCBgSE9TVF9HSUQ9JHtob3N0R2lkfWApO1xuXHR9XG5cblx0Y29uc29sZS5sb2coXCIgIFJ1bm5pbmcgc2NhZmZvbGRpbmcgaW4gYSBzYW5kYm94ZWQgY29udGFpbmVyLi4uXFxuXCIpO1xuXG5cdGNvbnN0IHR0eUZsYWdzID0gcHJvY2Vzcy5zdGRpbi5pc1RUWSA/IFtcIi1pdFwiXSA6IFtcIi1pXCJdO1xuXG5cdGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhcblx0XHRcImRvY2tlclwiLFxuXHRcdFtcblx0XHRcdFwicnVuXCIsXG5cdFx0XHRcIi0tcm1cIixcblx0XHRcdC4uLnR0eUZsYWdzLFxuXHRcdFx0Li4udXNlckFyZ3MsXG5cdFx0XHQuLi52b2x1bWVzLFxuXHRcdFx0Li4uZW52QXJncyxcblx0XHRcdFwiLXdcIixcblx0XHRcdFwiL3dvcmtzcGFjZVwiLFxuXHRcdFx0QlVJTERFUl9JTUFHRSxcblx0XHRcdC4uLmNvbnRhaW5lckFyZ3YsXG5cdFx0XSxcblx0XHR7IHN0ZGlvOiBcImluaGVyaXRcIiB9LFxuXHQpO1xuXG5cdGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XG5cdFx0Y29uc29sZS5sb2coYFxcbiAgU2NhZmZvbGQgY29tcGxldGUhXFxuXFxuICBPcGVuIHlvdXIgcHJvamVjdDpcXG5cXG4gICAgY29kZSAke3RhcmdldERpcn1cXG5gKTtcblx0fVxuXG5cdHByb2Nlc3MuZXhpdChyZXN1bHQuc3RhdHVzID8/IDApO1xufVxuIl0sIm5hbWVzIjpbImV4ZWNGaWxlU3luYyIsInNwYXduU3luYyIsImV4aXN0c1N5bmMiLCJta2RpclN5bmMiLCJob21lZGlyIiwicmVzb2x2ZSIsInJlc29sdmVMYXVuY2giLCJDUkVBVEVfSU1BR0VfUkVQT1NJVE9SWSIsIkNSRUFURV9WRVJTSU9OIiwiQlVJTERFUl9JTUFHRSIsInJ1bkluQnVpbGRlciIsImFyZ3YiLCJ0YXJnZXREaXIiLCJjb250YWluZXJBcmd2IiwicHJvamVjdE5hbWUiLCJyZWN1cnNpdmUiLCJzdGRpbyIsImNvbnNvbGUiLCJlcnJvciIsInByb2Nlc3MiLCJleGl0IiwiaG9zdFVpZCIsImdldHVpZCIsImhvc3RHaWQiLCJnZXRnaWQiLCJydW5Bc0hvc3RVc2VyIiwibnBtQ2FjaGVEaXIiLCJidWlsZGVySG9tZSIsInZvbHVtZXMiLCJlbnZBcmdzIiwibnBtcmNQYXRoIiwicHVzaCIsImF1dGgwQ29uZmlnRGlyIiwidXNlckFyZ3MiLCJsb2ciLCJ0dHlGbGFncyIsInN0ZGluIiwiaXNUVFkiLCJyZXN1bHQiLCJzdGF0dXMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFlBQVksRUFBRUMsU0FBUyxRQUFRLHFCQUFxQjtBQUM3RCxTQUFTQyxVQUFVLEVBQUVDLFNBQVMsUUFBUSxVQUFVO0FBQ2hELFNBQVNDLE9BQU8sUUFBUSxVQUFVO0FBQ2xDLFNBQVNDLE9BQU8sUUFBUSxZQUFZO0FBQ3BDLFNBQVNDLGFBQWEsUUFBUSxzQkFBc0I7QUFDcEQsU0FBU0MsdUJBQXVCLEVBQUVDLGNBQWMsUUFBUSxlQUFlO0FBRXZFLE1BQU1DLGdCQUFnQixHQUFHRix3QkFBd0IsQ0FBQyxFQUFFQyxnQkFBZ0I7QUFFcEU7OztDQUdDLEdBQ0QsT0FBTyxTQUFTRSxhQUFhQyxJQUFjO0lBQzFDLE1BQU0sRUFBRUMsU0FBUyxFQUFFQyxhQUFhLEVBQUVDLFdBQVcsRUFBRSxHQUFHUixjQUFjSztJQUNoRVIsVUFBVVMsV0FBVztRQUFFRyxXQUFXO0lBQUs7SUFDdkNaLFVBQVVFLFFBQVFPLFdBQVcsaUJBQWlCLGFBQWE7UUFBRUcsV0FBVztJQUFLO0lBRTdFLElBQUk7UUFDSGYsYUFBYSxVQUFVO1lBQUM7U0FBTyxFQUFFO1lBQUVnQixPQUFPO1FBQU87SUFDbEQsRUFBRSxPQUFNO1FBQ1BDLFFBQVFDLEtBQUssQ0FDWiw2REFDQztRQUVGQyxRQUFRQyxJQUFJLENBQUM7SUFDZDtJQUVBLE1BQU1DLFVBQVVGLFFBQVFHLE1BQU07SUFDOUIsTUFBTUMsVUFBVUosUUFBUUssTUFBTSxRQUFRSDtJQUN0QyxNQUFNSSxnQkFBZ0JKLFdBQVcsUUFBUUUsV0FBVztJQUVwRCxNQUFNRyxjQUFjckIsUUFBUUQsV0FBVztJQUN2Q0QsVUFBVXVCLGFBQWE7UUFBRVgsV0FBVztJQUFLO0lBRXpDLE1BQU1ZLGNBQWM7SUFFcEIsTUFBTUMsVUFBb0I7UUFDekI7UUFDQSxHQUFHaEIsVUFBVSxXQUFXLENBQUM7UUFDekI7UUFDQSxHQUFHYyxZQUFZLFdBQVcsQ0FBQztLQUMzQjtJQUVELE1BQU1HLFVBQW9CO1FBQ3pCO1FBQ0E7UUFDQTtRQUNBLENBQUMsc0JBQXNCLEVBQUVmLGFBQWE7UUFDdEM7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLENBQUMsS0FBSyxFQUFFYSxhQUFhO0tBQ3JCO0lBRUQsTUFBTUcsWUFBWXpCLFFBQVFELFdBQVc7SUFDckMsSUFBSUYsV0FBVzRCLFlBQVk7UUFDMUJGLFFBQVFHLElBQUksQ0FBQyxNQUFNLEdBQUdELFVBQVUsbUJBQW1CLENBQUM7UUFDcERELFFBQVFFLElBQUksQ0FBQyxNQUFNO0lBQ3BCO0lBRUEsTUFBTUMsaUJBQWlCM0IsUUFBUUQsV0FBVztJQUMxQyxJQUFJRixXQUFXOEIsaUJBQWlCO1FBQy9CSixRQUFRRyxJQUFJLENBQUMsTUFBTSxHQUFHQyxlQUFlLENBQUMsRUFBRUwsWUFBWSxjQUFjLENBQUM7SUFDcEU7SUFFQSxNQUFNTSxXQUFxQixFQUFFO0lBQzdCLElBQUlSLGVBQWU7UUFDbEJRLFNBQVNGLElBQUksQ0FBQyxVQUFVLEdBQUdWLFFBQVEsQ0FBQyxFQUFFRSxTQUFTO0lBQ2hELE9BQU8sSUFBSUYsV0FBVyxNQUFNO1FBQzNCUSxRQUFRRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRVYsU0FBUztRQUN4QyxJQUFJRSxXQUFXLE1BQU1NLFFBQVFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFUixTQUFTO0lBQzlEO0lBRUFOLFFBQVFpQixHQUFHLENBQUM7SUFFWixNQUFNQyxXQUFXaEIsUUFBUWlCLEtBQUssQ0FBQ0MsS0FBSyxHQUFHO1FBQUM7S0FBTSxHQUFHO1FBQUM7S0FBSztJQUV2RCxNQUFNQyxTQUFTckMsVUFDZCxVQUNBO1FBQ0M7UUFDQTtXQUNHa0M7V0FDQUY7V0FDQUw7V0FDQUM7UUFDSDtRQUNBO1FBQ0FwQjtXQUNHSTtLQUNILEVBQ0Q7UUFBRUcsT0FBTztJQUFVO0lBR3BCLElBQUlzQixPQUFPQyxNQUFNLEtBQUssR0FBRztRQUN4QnRCLFFBQVFpQixHQUFHLENBQUMsQ0FBQywyREFBMkQsRUFBRXRCLFVBQVUsRUFBRSxDQUFDO0lBQ3hGO0lBRUFPLFFBQVFDLElBQUksQ0FBQ2tCLE9BQU9DLE1BQU0sSUFBSTtBQUMvQiJ9
@@ -0,0 +1,32 @@
1
+ import { createRequire } from "node:module";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ const _require = createRequire(import.meta.url);
5
+ const DEFAULT_CREATE_VERSION = "0.0.1-dev";
6
+ const DEFAULT_CREATE_IMAGE_REPOSITORY = "ghcr.io/typesmiths/decohere/create";
7
+ function resolveCreateMetadata() {
8
+ let dir = dirname(fileURLToPath(import.meta.url));
9
+ for(let i = 0; i < 5; i++){
10
+ try {
11
+ const pkg = _require(join(dir, "package.json"));
12
+ if (pkg.name === "@decohere/create") {
13
+ return {
14
+ version: pkg.version ?? DEFAULT_CREATE_VERSION,
15
+ imageRepository: pkg.decohere?.dockerImageRepository ?? DEFAULT_CREATE_IMAGE_REPOSITORY
16
+ };
17
+ }
18
+ } catch {}
19
+ const parent = dirname(dir);
20
+ if (parent === dir) break;
21
+ dir = parent;
22
+ }
23
+ return {
24
+ version: DEFAULT_CREATE_VERSION,
25
+ imageRepository: DEFAULT_CREATE_IMAGE_REPOSITORY
26
+ };
27
+ }
28
+ const createMetadata = resolveCreateMetadata();
29
+ export const CREATE_VERSION = createMetadata.version;
30
+ export const CREATE_IMAGE_REPOSITORY = createMetadata.imageRepository;
31
+
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvdmVyc2lvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiO1xuXG5jb25zdCBfcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxudHlwZSBDcmVhdGVQYWNrYWdlTWV0YWRhdGEgPSB7XG5cdG5hbWU/OiBzdHJpbmc7XG5cdHZlcnNpb24/OiBzdHJpbmc7XG5cdGRlY29oZXJlPzoge1xuXHRcdGRvY2tlckltYWdlUmVwb3NpdG9yeT86IHN0cmluZztcblx0fTtcbn07XG5cbmNvbnN0IERFRkFVTFRfQ1JFQVRFX1ZFUlNJT04gPSBcIjAuMC4xLWRldlwiO1xuY29uc3QgREVGQVVMVF9DUkVBVEVfSU1BR0VfUkVQT1NJVE9SWSA9IFwiZ2hjci5pby90eXBlc21pdGhzL2RlY29oZXJlL2NyZWF0ZVwiO1xuXG5mdW5jdGlvbiByZXNvbHZlQ3JlYXRlTWV0YWRhdGEoKSB7XG5cdGxldCBkaXIgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHBrZyA9IF9yZXF1aXJlKGpvaW4oZGlyLCBcInBhY2thZ2UuanNvblwiKSkgYXMgQ3JlYXRlUGFja2FnZU1ldGFkYXRhO1xuXHRcdFx0aWYgKHBrZy5uYW1lID09PSBcIkBkZWNvaGVyZS9jcmVhdGVcIikge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHZlcnNpb246IHBrZy52ZXJzaW9uID8/IERFRkFVTFRfQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcdFx0aW1hZ2VSZXBvc2l0b3J5OlxuXHRcdFx0XHRcdFx0cGtnLmRlY29oZXJlPy5kb2NrZXJJbWFnZVJlcG9zaXRvcnkgPz8gREVGQVVMVF9DUkVBVEVfSU1BR0VfUkVQT1NJVE9SWSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIHt9XG5cdFx0Y29uc3QgcGFyZW50ID0gZGlybmFtZShkaXIpO1xuXHRcdGlmIChwYXJlbnQgPT09IGRpcikgYnJlYWs7XG5cdFx0ZGlyID0gcGFyZW50O1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHR2ZXJzaW9uOiBERUZBVUxUX0NSRUFURV9WRVJTSU9OLFxuXHRcdGltYWdlUmVwb3NpdG9yeTogREVGQVVMVF9DUkVBVEVfSU1BR0VfUkVQT1NJVE9SWSxcblx0fTtcbn1cblxuY29uc3QgY3JlYXRlTWV0YWRhdGEgPSByZXNvbHZlQ3JlYXRlTWV0YWRhdGEoKTtcblxuZXhwb3J0IGNvbnN0IENSRUFURV9WRVJTSU9OID0gY3JlYXRlTWV0YWRhdGEudmVyc2lvbjtcblxuZXhwb3J0IGNvbnN0IENSRUFURV9JTUFHRV9SRVBPU0lUT1JZID0gY3JlYXRlTWV0YWRhdGEuaW1hZ2VSZXBvc2l0b3J5O1xuIl0sIm5hbWVzIjpbImNyZWF0ZVJlcXVpcmUiLCJkaXJuYW1lIiwiam9pbiIsImZpbGVVUkxUb1BhdGgiLCJfcmVxdWlyZSIsInVybCIsIkRFRkFVTFRfQ1JFQVRFX1ZFUlNJT04iLCJERUZBVUxUX0NSRUFURV9JTUFHRV9SRVBPU0lUT1JZIiwicmVzb2x2ZUNyZWF0ZU1ldGFkYXRhIiwiZGlyIiwiaSIsInBrZyIsIm5hbWUiLCJ2ZXJzaW9uIiwiaW1hZ2VSZXBvc2l0b3J5IiwiZGVjb2hlcmUiLCJkb2NrZXJJbWFnZVJlcG9zaXRvcnkiLCJwYXJlbnQiLCJjcmVhdGVNZXRhZGF0YSIsIkNSRUFURV9WRVJTSU9OIiwiQ1JFQVRFX0lNQUdFX1JFUE9TSVRPUlkiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGFBQWEsUUFBUSxjQUFjO0FBQzVDLFNBQVNDLE9BQU8sRUFBRUMsSUFBSSxRQUFRLFlBQVk7QUFDMUMsU0FBU0MsYUFBYSxRQUFRLFdBQVc7QUFFekMsTUFBTUMsV0FBV0osY0FBYyxZQUFZSyxHQUFHO0FBVTlDLE1BQU1DLHlCQUF5QjtBQUMvQixNQUFNQyxrQ0FBa0M7QUFFeEMsU0FBU0M7SUFDUixJQUFJQyxNQUFNUixRQUFRRSxjQUFjLFlBQVlFLEdBQUc7SUFDL0MsSUFBSyxJQUFJSyxJQUFJLEdBQUdBLElBQUksR0FBR0EsSUFBSztRQUMzQixJQUFJO1lBQ0gsTUFBTUMsTUFBTVAsU0FBU0YsS0FBS08sS0FBSztZQUMvQixJQUFJRSxJQUFJQyxJQUFJLEtBQUssb0JBQW9CO2dCQUNwQyxPQUFPO29CQUNOQyxTQUFTRixJQUFJRSxPQUFPLElBQUlQO29CQUN4QlEsaUJBQ0NILElBQUlJLFFBQVEsRUFBRUMseUJBQXlCVDtnQkFDekM7WUFDRDtRQUNELEVBQUUsT0FBTSxDQUFDO1FBQ1QsTUFBTVUsU0FBU2hCLFFBQVFRO1FBQ3ZCLElBQUlRLFdBQVdSLEtBQUs7UUFDcEJBLE1BQU1RO0lBQ1A7SUFFQSxPQUFPO1FBQ05KLFNBQVNQO1FBQ1RRLGlCQUFpQlA7SUFDbEI7QUFDRDtBQUVBLE1BQU1XLGlCQUFpQlY7QUFFdkIsT0FBTyxNQUFNVyxpQkFBaUJELGVBQWVMLE9BQU8sQ0FBQztBQUVyRCxPQUFPLE1BQU1PLDBCQUEwQkYsZUFBZUosZUFBZSxDQUFDIn0=
@@ -0,0 +1,177 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Vendor `@decohere/cli` for the builder image: resolve `@decohere/*` from
4
+ * dist/release via `file:` (not `overrides`), `npm install --install-links`,
5
+ * then tar the installed tree including `node_modules`. `--install-links`
6
+ * materializes `file:` packages (and their deps) instead of leaving symlinks
7
+ * whose nested installs live outside the create directory.
8
+ */
9
+ import { spawnSync } from "node:child_process";
10
+ import { readdirSync, readFileSync, writeFileSync } from "node:fs";
11
+ import { dirname, join, relative, resolve } from "node:path";
12
+ import { fileURLToPath } from "node:url";
13
+
14
+ /**
15
+ * @typedef {{ name: string, dir: string }} WorkspacePackage
16
+ */
17
+
18
+ /**
19
+ * @param {string} rootDir
20
+ * @returns {WorkspacePackage[]}
21
+ */
22
+ export function collectWorkspacePackages(rootDir) {
23
+ /** @type {WorkspacePackage[]} */
24
+ const found = [];
25
+ const walk = (dir) => {
26
+ let entries;
27
+ try {
28
+ entries = readdirSync(dir, { withFileTypes: true });
29
+ } catch {
30
+ return;
31
+ }
32
+ for (const entry of entries) {
33
+ if (entry.name === "node_modules" || entry.name === ".git") continue;
34
+ const path = join(dir, entry.name);
35
+ if (entry.isDirectory()) {
36
+ walk(path);
37
+ continue;
38
+ }
39
+ if (entry.name !== "package.json") continue;
40
+ const pkg = JSON.parse(readFileSync(path, "utf8"));
41
+ if (typeof pkg.name === "string" && pkg.name.startsWith("@decohere/")) {
42
+ found.push({ name: pkg.name, dir });
43
+ }
44
+ }
45
+ };
46
+ walk(rootDir);
47
+ return found;
48
+ }
49
+
50
+ /**
51
+ * @param {string} fromDir
52
+ * @param {string} pkgDir
53
+ */
54
+ export function fileSpec(fromDir, pkgDir) {
55
+ let rel = relative(fromDir, pkgDir) || ".";
56
+ rel = rel.replaceAll("\\", "/");
57
+ if (!rel.startsWith(".")) rel = `./${rel}`;
58
+ return `file:${rel}`;
59
+ }
60
+
61
+ /**
62
+ * Rewrite `@decohere/*` dependency specs to local `file:` paths.
63
+ * Must mutate `dependencies` (not `overrides`) — npm throws EOVERRIDE when an
64
+ * override conflicts with a direct dependency.
65
+ *
66
+ * @param {Record<string, unknown>} pkg
67
+ * @param {string} fromDir
68
+ * @param {WorkspacePackage[]} packages
69
+ */
70
+ export function rewriteDecohereDepsToFile(pkg, fromDir, packages) {
71
+ const byName = new Map(packages.map((item) => [item.name, item.dir]));
72
+ const from = resolve(fromDir);
73
+ const rewrite = (deps) => {
74
+ if (deps == null || typeof deps !== "object" || Array.isArray(deps)) return deps;
75
+ const next = { .../** @type {Record<string, unknown>} */ (deps) };
76
+ for (const name of Object.keys(next)) {
77
+ const dir = byName.get(name);
78
+ if (dir == null || resolve(dir) === from) continue;
79
+ next[name] = fileSpec(fromDir, dir);
80
+ }
81
+ return next;
82
+ };
83
+ return {
84
+ ...pkg,
85
+ dependencies: rewrite(pkg.dependencies),
86
+ optionalDependencies: rewrite(pkg.optionalDependencies),
87
+ };
88
+ }
89
+
90
+ function writeJson(path, value) {
91
+ writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`);
92
+ }
93
+
94
+ function runNpm(cwd, args) {
95
+ const result = spawnSync("npm", args, { cwd, encoding: "utf8" });
96
+ if (result.status !== 0) {
97
+ throw new Error(
98
+ `npm ${args.join(" ")} failed (exit ${result.status}):\n${result.stderr}${result.stdout}`,
99
+ );
100
+ }
101
+ return result.stdout.trim();
102
+ }
103
+
104
+ function packInstalledTree(outDir, dest) {
105
+ const result = spawnSync(
106
+ "tar",
107
+ ["--create", "--gzip", "--dereference", "--file", dest, "-C", outDir, "."],
108
+ { encoding: "utf8" },
109
+ );
110
+ if (result.status !== 0) {
111
+ throw new Error(`tar failed (exit ${result.status}):\n${result.stderr}${result.stdout}`);
112
+ }
113
+ }
114
+
115
+ export function packBuilderTgz(options) {
116
+ const outDir = resolve(options.outDir);
117
+ const workspaceOut = resolve(options.workspaceOut);
118
+ const dest = resolve(options.dest);
119
+ const packageJsonPath = join(outDir, "package.json");
120
+ const packages = collectWorkspacePackages(workspaceOut);
121
+ const originals = packages.map((pkg) => {
122
+ const path = join(pkg.dir, "package.json");
123
+ return { path, original: JSON.parse(readFileSync(path, "utf8")) };
124
+ });
125
+ const createOriginal = originals.find((entry) => entry.path === packageJsonPath)?.original;
126
+ if (createOriginal == null) {
127
+ throw new Error(`No @decohere package.json at ${packageJsonPath}`);
128
+ }
129
+
130
+ try {
131
+ for (const { path, original } of originals) {
132
+ writeJson(path, rewriteDecohereDepsToFile(original, dirname(path), packages));
133
+ }
134
+ runNpm(outDir, ["install", "--omit=dev", "--ignore-scripts", "--install-links"]);
135
+ } finally {
136
+ for (const { path, original } of originals) {
137
+ writeJson(path, original);
138
+ }
139
+ }
140
+
141
+ packInstalledTree(outDir, dest);
142
+ return dest;
143
+ }
144
+
145
+ function parseArgs(argv) {
146
+ /** @type {Record<string, string>} */
147
+ const parsed = {};
148
+ for (let i = 0; i < argv.length; i++) {
149
+ const arg = argv[i];
150
+ if (arg == null || !arg.startsWith("--")) continue;
151
+ const key = arg.slice(2);
152
+ const value = argv[i + 1];
153
+ if (value == null || value.startsWith("--")) {
154
+ throw new Error(`Missing value for --${key}`);
155
+ }
156
+ parsed[key] = value;
157
+ i++;
158
+ }
159
+ return parsed;
160
+ }
161
+
162
+ function main() {
163
+ const args = parseArgs(process.argv.slice(2));
164
+ const outDir = args["out-dir"];
165
+ const workspaceOut = args["workspace-out"];
166
+ const dest = args.dest;
167
+ if (outDir == null || workspaceOut == null || dest == null) {
168
+ throw new Error(
169
+ "Usage: pack-builder-tgz.mjs --out-dir <dir> --workspace-out <dir> --dest <create.tgz>",
170
+ );
171
+ }
172
+ packBuilderTgz({ outDir, workspaceOut, dest });
173
+ }
174
+
175
+ if (process.argv[1] != null && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
176
+ main();
177
+ }
package/package.json CHANGED
@@ -1,15 +1,12 @@
1
1
  {
2
2
  "name": "@decohere/create",
3
- "version": "0.0.1-dev.5",
4
- "description": "Scaffold a new Decohere project — build with Forge, serve with Flux",
3
+ "version": "0.0.1-dev.50",
4
+ "description": "Download the Decohere scaffolder image and run it (npm create @decohere)",
5
5
  "keywords": [
6
6
  "decohere",
7
7
  "create",
8
8
  "scaffold",
9
- "cli",
10
- "forge",
11
- "flux",
12
- "typescript"
9
+ "cli"
13
10
  ],
14
11
  "license": "ISC",
15
12
  "author": "Typesmiths",
@@ -20,8 +17,9 @@
20
17
  "scripts": {
21
18
  "test": "echo \"Error: no test specified\" && exit 1"
22
19
  },
23
- "dependencies": {
24
- "commander": "^13.1.0"
25
- },
26
- "devDependencies": {}
20
+ "dependencies": {},
21
+ "devDependencies": {},
22
+ "decohere": {
23
+ "dockerImageRepository": "ghcr.io/typesmiths/decohere/create"
24
+ }
27
25
  }
@@ -0,0 +1,10 @@
1
+ export type LaunchPlan = {
2
+ targetDir: string;
3
+ containerArgv: string[];
4
+ projectName: string;
5
+ };
6
+ /**
7
+ * Host `npm create` argv → directory to mount and argv for the in-image CLI.
8
+ * Positional `webapi my-app` wins over `-d` (npm treats `-d` as its own loglevel).
9
+ */
10
+ export declare function resolveLaunch(argv: string[], cwd?: string): LaunchPlan;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Pull/run the Decohere CLI image. Host `@decohere/create` does not load the
3
+ * `@decohere/cli` dependency tree — that lives in the image only.
4
+ */
5
+ export declare function runInBuilder(argv: string[]): never;
@@ -0,0 +1,2 @@
1
+ export declare const CREATE_VERSION: string;
2
+ export declare const CREATE_IMAGE_REPOSITORY: string;
@@ -1,48 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "scaffold", {
6
- enumerable: true,
7
- get: function() {
8
- return scaffold;
9
- }
10
- });
11
- const _nodefs = require("node:fs");
12
- const _promises = require("node:fs/promises");
13
- const _nodepath = require("node:path");
14
- const _promises1 = require("node:readline/promises");
15
- const _templates = require("./templates.js");
16
- async function scaffold(targetDir, opts) {
17
- const name = (0, _nodepath.basename)(targetDir);
18
- if ((0, _nodefs.existsSync)(targetDir) && (0, _nodefs.readdirSync)(targetDir).length > 0 && !opts.yes) {
19
- const rl = (0, _promises1.createInterface)({
20
- input: process.stdin,
21
- output: process.stdout
22
- });
23
- const answer = await rl.question(`Directory "${name}" is not empty. Continue? [y/N] `);
24
- rl.close();
25
- if (!answer.trim().toLowerCase().startsWith("y")) {
26
- console.log("Aborted.");
27
- process.exit(0);
28
- }
29
- }
30
- await (0, _promises.mkdir)((0, _nodepath.join)(targetDir, "projects", "app", "src"), {
31
- recursive: true
32
- });
33
- await Promise.all([
34
- (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "package.json"), (0, _templates.ROOT_PACKAGE_JSON)(name)),
35
- (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "tsconfig.json"), _templates.TSCONFIG),
36
- (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "projects", "app", "package.json"), (0, _templates.APP_PACKAGE_JSON)(name)),
37
- (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "projects", "app", "src", "main.ts"), _templates.MAIN_TS)
38
- ]);
39
- console.log(`\nScaffolded ${name}. Next steps:\n`);
40
- if ((0, _nodepath.basename)(targetDir) !== targetDir) {
41
- console.log(` cd ${name}`);
42
- }
43
- console.log(" pnpm install");
44
- console.log(" pnpm build # forge build");
45
- console.log(" pnpm dev # flux serve\n");
46
- }
47
-
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvY3JlYXRlL3NyYy9zY2FmZm9sZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkZGlyU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBta2Rpciwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGJhc2VuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgY3JlYXRlSW50ZXJmYWNlIH0gZnJvbSBcIm5vZGU6cmVhZGxpbmUvcHJvbWlzZXNcIjtcbmltcG9ydCB7IEFQUF9QQUNLQUdFX0pTT04sIE1BSU5fVFMsIFJPT1RfUEFDS0FHRV9KU09OLCBUU0NPTkZJRyB9IGZyb20gXCIuL3RlbXBsYXRlcy5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjYWZmb2xkT3B0aW9ucyB7XG5cdHllcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY2FmZm9sZCh0YXJnZXREaXI6IHN0cmluZywgb3B0czogU2NhZmZvbGRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IG5hbWUgPSBiYXNlbmFtZSh0YXJnZXREaXIpO1xuXG5cdGlmIChleGlzdHNTeW5jKHRhcmdldERpcikgJiYgcmVhZGRpclN5bmModGFyZ2V0RGlyKS5sZW5ndGggPiAwICYmICFvcHRzLnllcykge1xuXHRcdGNvbnN0IHJsID0gY3JlYXRlSW50ZXJmYWNlKHtcblx0XHRcdGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuXHRcdFx0b3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcblx0XHR9KTtcblx0XHRjb25zdCBhbnN3ZXIgPSBhd2FpdCBybC5xdWVzdGlvbihgRGlyZWN0b3J5IFwiJHtuYW1lfVwiIGlzIG5vdCBlbXB0eS4gQ29udGludWU/IFt5L05dIGApO1xuXHRcdHJsLmNsb3NlKCk7XG5cdFx0aWYgKCFhbnN3ZXIudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcInlcIikpIHtcblx0XHRcdGNvbnNvbGUubG9nKFwiQWJvcnRlZC5cIik7XG5cdFx0XHRwcm9jZXNzLmV4aXQoMCk7XG5cdFx0fVxuXHR9XG5cblx0YXdhaXQgbWtkaXIoam9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcHBcIiwgXCJzcmNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdGF3YWl0IFByb21pc2UuYWxsKFtcblx0XHR3cml0ZUZpbGUoam9pbih0YXJnZXREaXIsIFwicGFja2FnZS5qc29uXCIpLCBST09UX1BBQ0tBR0VfSlNPTihuYW1lKSksXG5cdFx0d3JpdGVGaWxlKGpvaW4odGFyZ2V0RGlyLCBcInRzY29uZmlnLmpzb25cIiksIFRTQ09ORklHKSxcblx0XHR3cml0ZUZpbGUoam9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcHBcIiwgXCJwYWNrYWdlLmpzb25cIiksIEFQUF9QQUNLQUdFX0pTT04obmFtZSkpLFxuXHRcdHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwcFwiLCBcInNyY1wiLCBcIm1haW4udHNcIiksIE1BSU5fVFMpLFxuXHRdKTtcblxuXHRjb25zb2xlLmxvZyhgXFxuU2NhZmZvbGRlZCAke25hbWV9LiBOZXh0IHN0ZXBzOlxcbmApO1xuXHRpZiAoYmFzZW5hbWUodGFyZ2V0RGlyKSAhPT0gdGFyZ2V0RGlyKSB7XG5cdFx0Y29uc29sZS5sb2coYCAgY2QgJHtuYW1lfWApO1xuXHR9XG5cdGNvbnNvbGUubG9nKFwiICBwbnBtIGluc3RhbGxcIik7XG5cdGNvbnNvbGUubG9nKFwiICBwbnBtIGJ1aWxkICAgICAjIGZvcmdlIGJ1aWxkXCIpO1xuXHRjb25zb2xlLmxvZyhcIiAgcG5wbSBkZXYgICAgICAgIyBmbHV4IHNlcnZlXFxuXCIpO1xufVxuIl0sIm5hbWVzIjpbInNjYWZmb2xkIiwidGFyZ2V0RGlyIiwib3B0cyIsIm5hbWUiLCJiYXNlbmFtZSIsImV4aXN0c1N5bmMiLCJyZWFkZGlyU3luYyIsImxlbmd0aCIsInllcyIsInJsIiwiY3JlYXRlSW50ZXJmYWNlIiwiaW5wdXQiLCJwcm9jZXNzIiwic3RkaW4iLCJvdXRwdXQiLCJzdGRvdXQiLCJhbnN3ZXIiLCJxdWVzdGlvbiIsImNsb3NlIiwidHJpbSIsInRvTG93ZXJDYXNlIiwic3RhcnRzV2l0aCIsImNvbnNvbGUiLCJsb2ciLCJleGl0IiwibWtkaXIiLCJqb2luIiwicmVjdXJzaXZlIiwiUHJvbWlzZSIsImFsbCIsIndyaXRlRmlsZSIsIlJPT1RfUEFDS0FHRV9KU09OIiwiVFNDT05GSUciLCJBUFBfUEFDS0FHRV9KU09OIiwiTUFJTl9UUyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFVc0JBOzs7ZUFBQUE7Ozt3QkFWa0I7MEJBQ1A7MEJBQ0Y7MkJBQ0M7MkJBQ3VDO0FBTWhFLGVBQWVBLFNBQVNDLFNBQWlCLEVBQUVDLElBQXFCO0lBQ3RFLE1BQU1DLE9BQU9DLElBQUFBLGtCQUFRLEVBQUNIO0lBRXRCLElBQUlJLElBQUFBLGtCQUFVLEVBQUNKLGNBQWNLLElBQUFBLG1CQUFXLEVBQUNMLFdBQVdNLE1BQU0sR0FBRyxLQUFLLENBQUNMLEtBQUtNLEdBQUcsRUFBRTtRQUM1RSxNQUFNQyxLQUFLQyxJQUFBQSwwQkFBZSxFQUFDO1lBQzFCQyxPQUFPQyxRQUFRQyxLQUFLO1lBQ3BCQyxRQUFRRixRQUFRRyxNQUFNO1FBQ3ZCO1FBQ0EsTUFBTUMsU0FBUyxNQUFNUCxHQUFHUSxRQUFRLENBQUMsQ0FBQyxXQUFXLEVBQUVkLEtBQUssZ0NBQWdDLENBQUM7UUFDckZNLEdBQUdTLEtBQUs7UUFDUixJQUFJLENBQUNGLE9BQU9HLElBQUksR0FBR0MsV0FBVyxHQUFHQyxVQUFVLENBQUMsTUFBTTtZQUNqREMsUUFBUUMsR0FBRyxDQUFDO1lBQ1pYLFFBQVFZLElBQUksQ0FBQztRQUNkO0lBQ0Q7SUFFQSxNQUFNQyxJQUFBQSxlQUFLLEVBQUNDLElBQUFBLGNBQUksRUFBQ3pCLFdBQVcsWUFBWSxPQUFPLFFBQVE7UUFBRTBCLFdBQVc7SUFBSztJQUV6RSxNQUFNQyxRQUFRQyxHQUFHLENBQUM7UUFDakJDLElBQUFBLG1CQUFTLEVBQUNKLElBQUFBLGNBQUksRUFBQ3pCLFdBQVcsaUJBQWlCOEIsSUFBQUEsNEJBQWlCLEVBQUM1QjtRQUM3RDJCLElBQUFBLG1CQUFTLEVBQUNKLElBQUFBLGNBQUksRUFBQ3pCLFdBQVcsa0JBQWtCK0IsbUJBQVE7UUFDcERGLElBQUFBLG1CQUFTLEVBQUNKLElBQUFBLGNBQUksRUFBQ3pCLFdBQVcsWUFBWSxPQUFPLGlCQUFpQmdDLElBQUFBLDJCQUFnQixFQUFDOUI7UUFDL0UyQixJQUFBQSxtQkFBUyxFQUFDSixJQUFBQSxjQUFJLEVBQUN6QixXQUFXLFlBQVksT0FBTyxPQUFPLFlBQVlpQyxrQkFBTztLQUN2RTtJQUVEWixRQUFRQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUVwQixLQUFLLGVBQWUsQ0FBQztJQUNqRCxJQUFJQyxJQUFBQSxrQkFBUSxFQUFDSCxlQUFlQSxXQUFXO1FBQ3RDcUIsUUFBUUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFcEIsTUFBTTtJQUMzQjtJQUNBbUIsUUFBUUMsR0FBRyxDQUFDO0lBQ1pELFFBQVFDLEdBQUcsQ0FBQztJQUNaRCxRQUFRQyxHQUFHLENBQUM7QUFDYiJ9
@@ -1,64 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: Object.getOwnPropertyDescriptor(all, name).get
9
- });
10
- }
11
- _export(exports, {
12
- get APP_PACKAGE_JSON () {
13
- return APP_PACKAGE_JSON;
14
- },
15
- get MAIN_TS () {
16
- return MAIN_TS;
17
- },
18
- get ROOT_PACKAGE_JSON () {
19
- return ROOT_PACKAGE_JSON;
20
- },
21
- get TSCONFIG () {
22
- return TSCONFIG;
23
- }
24
- });
25
- function ROOT_PACKAGE_JSON(name) {
26
- return JSON.stringify({
27
- name,
28
- version: "0.0.1",
29
- type: "module",
30
- scripts: {
31
- build: "forge build",
32
- "build:watch": "forge build --watch",
33
- dev: "flux serve"
34
- },
35
- devDependencies: {
36
- "@decohere/terminal": "0.0.1-dev.14",
37
- typescript: "^6.0.3"
38
- }
39
- }, null, 2);
40
- }
41
- function APP_PACKAGE_JSON(name) {
42
- return JSON.stringify({
43
- name: `@${name}/app`,
44
- version: "0.0.1",
45
- type: "module",
46
- main: "src/main.ts"
47
- }, null, 2);
48
- }
49
- const TSCONFIG = JSON.stringify({
50
- compilerOptions: {
51
- target: "ES2022",
52
- module: "NodeNext",
53
- moduleResolution: "NodeNext",
54
- strict: true,
55
- skipLibCheck: true
56
- },
57
- include: [
58
- "projects"
59
- ]
60
- }, null, 2);
61
- const MAIN_TS = `console.log("Hello from Decohere!");
62
- `;
63
-
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvY3JlYXRlL3NyYy90ZW1wbGF0ZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIFJPT1RfUEFDS0FHRV9KU09OKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBKU09OLnN0cmluZ2lmeShcblx0XHR7XG5cdFx0XHRuYW1lLFxuXHRcdFx0dmVyc2lvbjogXCIwLjAuMVwiLFxuXHRcdFx0dHlwZTogXCJtb2R1bGVcIixcblx0XHRcdHNjcmlwdHM6IHtcblx0XHRcdFx0YnVpbGQ6IFwiZm9yZ2UgYnVpbGRcIixcblx0XHRcdFx0XCJidWlsZDp3YXRjaFwiOiBcImZvcmdlIGJ1aWxkIC0td2F0Y2hcIixcblx0XHRcdFx0ZGV2OiBcImZsdXggc2VydmVcIixcblx0XHRcdH0sXG5cdFx0XHRkZXZEZXBlbmRlbmNpZXM6IHtcblx0XHRcdFx0XCJAZGVjb2hlcmUvdGVybWluYWxcIjogXCIwLjAuMS1kZXYuMTRcIixcblx0XHRcdFx0dHlwZXNjcmlwdDogXCJeNi4wLjNcIixcblx0XHRcdH0sXG5cdFx0fSxcblx0XHRudWxsLFxuXHRcdDIsXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBBUFBfUEFDS0FHRV9KU09OKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBKU09OLnN0cmluZ2lmeShcblx0XHR7XG5cdFx0XHRuYW1lOiBgQCR7bmFtZX0vYXBwYCxcblx0XHRcdHZlcnNpb246IFwiMC4wLjFcIixcblx0XHRcdHR5cGU6IFwibW9kdWxlXCIsXG5cdFx0XHRtYWluOiBcInNyYy9tYWluLnRzXCIsXG5cdFx0fSxcblx0XHRudWxsLFxuXHRcdDIsXG5cdCk7XG59XG5cbmV4cG9ydCBjb25zdCBUU0NPTkZJRyA9IEpTT04uc3RyaW5naWZ5KFxuXHR7XG5cdFx0Y29tcGlsZXJPcHRpb25zOiB7XG5cdFx0XHR0YXJnZXQ6IFwiRVMyMDIyXCIsXG5cdFx0XHRtb2R1bGU6IFwiTm9kZU5leHRcIixcblx0XHRcdG1vZHVsZVJlc29sdXRpb246IFwiTm9kZU5leHRcIixcblx0XHRcdHN0cmljdDogdHJ1ZSxcblx0XHRcdHNraXBMaWJDaGVjazogdHJ1ZSxcblx0XHR9LFxuXHRcdGluY2x1ZGU6IFtcInByb2plY3RzXCJdLFxuXHR9LFxuXHRudWxsLFxuXHQyLFxuKTtcblxuZXhwb3J0IGNvbnN0IE1BSU5fVFMgPSBgY29uc29sZS5sb2coXCJIZWxsbyBmcm9tIERlY29oZXJlIVwiKTtcbmA7XG4iXSwibmFtZXMiOlsiQVBQX1BBQ0tBR0VfSlNPTiIsIk1BSU5fVFMiLCJST09UX1BBQ0tBR0VfSlNPTiIsIlRTQ09ORklHIiwibmFtZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2ZXJzaW9uIiwidHlwZSIsInNjcmlwdHMiLCJidWlsZCIsImRldiIsImRldkRlcGVuZGVuY2llcyIsInR5cGVzY3JpcHQiLCJtYWluIiwiY29tcGlsZXJPcHRpb25zIiwidGFyZ2V0IiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsInN0cmljdCIsInNraXBMaWJDaGVjayIsImluY2x1ZGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBcUJnQkE7ZUFBQUE7O1FBNEJIQztlQUFBQTs7UUFqREdDO2VBQUFBOztRQWtDSEM7ZUFBQUE7OztBQWxDTixTQUFTRCxrQkFBa0JFLElBQVk7SUFDN0MsT0FBT0MsS0FBS0MsU0FBUyxDQUNwQjtRQUNDRjtRQUNBRyxTQUFTO1FBQ1RDLE1BQU07UUFDTkMsU0FBUztZQUNSQyxPQUFPO1lBQ1AsZUFBZTtZQUNmQyxLQUFLO1FBQ047UUFDQUMsaUJBQWlCO1lBQ2hCLHNCQUFzQjtZQUN0QkMsWUFBWTtRQUNiO0lBQ0QsR0FDQSxNQUNBO0FBRUY7QUFFTyxTQUFTYixpQkFBaUJJLElBQVk7SUFDNUMsT0FBT0MsS0FBS0MsU0FBUyxDQUNwQjtRQUNDRixNQUFNLENBQUMsQ0FBQyxFQUFFQSxLQUFLLElBQUksQ0FBQztRQUNwQkcsU0FBUztRQUNUQyxNQUFNO1FBQ05NLE1BQU07SUFDUCxHQUNBLE1BQ0E7QUFFRjtBQUVPLE1BQU1YLFdBQVdFLEtBQUtDLFNBQVMsQ0FDckM7SUFDQ1MsaUJBQWlCO1FBQ2hCQyxRQUFRO1FBQ1JDLFFBQVE7UUFDUkMsa0JBQWtCO1FBQ2xCQyxRQUFRO1FBQ1JDLGNBQWM7SUFDZjtJQUNBQyxTQUFTO1FBQUM7S0FBVztBQUN0QixHQUNBLE1BQ0E7QUFHTSxNQUFNcEIsVUFBVSxDQUFDO0FBQ3hCLENBQUMifQ==
@@ -1,38 +0,0 @@
1
- import { existsSync, readdirSync } from "node:fs";
2
- import { mkdir, writeFile } from "node:fs/promises";
3
- import { basename, join } from "node:path";
4
- import { createInterface } from "node:readline/promises";
5
- import { APP_PACKAGE_JSON, MAIN_TS, ROOT_PACKAGE_JSON, TSCONFIG } from "./templates.js";
6
- export async function scaffold(targetDir, opts) {
7
- const name = basename(targetDir);
8
- if (existsSync(targetDir) && readdirSync(targetDir).length > 0 && !opts.yes) {
9
- const rl = createInterface({
10
- input: process.stdin,
11
- output: process.stdout
12
- });
13
- const answer = await rl.question(`Directory "${name}" is not empty. Continue? [y/N] `);
14
- rl.close();
15
- if (!answer.trim().toLowerCase().startsWith("y")) {
16
- console.log("Aborted.");
17
- process.exit(0);
18
- }
19
- }
20
- await mkdir(join(targetDir, "projects", "app", "src"), {
21
- recursive: true
22
- });
23
- await Promise.all([
24
- writeFile(join(targetDir, "package.json"), ROOT_PACKAGE_JSON(name)),
25
- writeFile(join(targetDir, "tsconfig.json"), TSCONFIG),
26
- writeFile(join(targetDir, "projects", "app", "package.json"), APP_PACKAGE_JSON(name)),
27
- writeFile(join(targetDir, "projects", "app", "src", "main.ts"), MAIN_TS)
28
- ]);
29
- console.log(`\nScaffolded ${name}. Next steps:\n`);
30
- if (basename(targetDir) !== targetDir) {
31
- console.log(` cd ${name}`);
32
- }
33
- console.log(" pnpm install");
34
- console.log(" pnpm build # forge build");
35
- console.log(" pnpm dev # flux serve\n");
36
- }
37
-
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvY3JlYXRlL3NyYy9zY2FmZm9sZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkZGlyU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBta2Rpciwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGJhc2VuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgY3JlYXRlSW50ZXJmYWNlIH0gZnJvbSBcIm5vZGU6cmVhZGxpbmUvcHJvbWlzZXNcIjtcbmltcG9ydCB7IEFQUF9QQUNLQUdFX0pTT04sIE1BSU5fVFMsIFJPT1RfUEFDS0FHRV9KU09OLCBUU0NPTkZJRyB9IGZyb20gXCIuL3RlbXBsYXRlcy5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjYWZmb2xkT3B0aW9ucyB7XG5cdHllcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY2FmZm9sZCh0YXJnZXREaXI6IHN0cmluZywgb3B0czogU2NhZmZvbGRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IG5hbWUgPSBiYXNlbmFtZSh0YXJnZXREaXIpO1xuXG5cdGlmIChleGlzdHNTeW5jKHRhcmdldERpcikgJiYgcmVhZGRpclN5bmModGFyZ2V0RGlyKS5sZW5ndGggPiAwICYmICFvcHRzLnllcykge1xuXHRcdGNvbnN0IHJsID0gY3JlYXRlSW50ZXJmYWNlKHtcblx0XHRcdGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuXHRcdFx0b3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcblx0XHR9KTtcblx0XHRjb25zdCBhbnN3ZXIgPSBhd2FpdCBybC5xdWVzdGlvbihgRGlyZWN0b3J5IFwiJHtuYW1lfVwiIGlzIG5vdCBlbXB0eS4gQ29udGludWU/IFt5L05dIGApO1xuXHRcdHJsLmNsb3NlKCk7XG5cdFx0aWYgKCFhbnN3ZXIudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcInlcIikpIHtcblx0XHRcdGNvbnNvbGUubG9nKFwiQWJvcnRlZC5cIik7XG5cdFx0XHRwcm9jZXNzLmV4aXQoMCk7XG5cdFx0fVxuXHR9XG5cblx0YXdhaXQgbWtkaXIoam9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcHBcIiwgXCJzcmNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdGF3YWl0IFByb21pc2UuYWxsKFtcblx0XHR3cml0ZUZpbGUoam9pbih0YXJnZXREaXIsIFwicGFja2FnZS5qc29uXCIpLCBST09UX1BBQ0tBR0VfSlNPTihuYW1lKSksXG5cdFx0d3JpdGVGaWxlKGpvaW4odGFyZ2V0RGlyLCBcInRzY29uZmlnLmpzb25cIiksIFRTQ09ORklHKSxcblx0XHR3cml0ZUZpbGUoam9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcHBcIiwgXCJwYWNrYWdlLmpzb25cIiksIEFQUF9QQUNLQUdFX0pTT04obmFtZSkpLFxuXHRcdHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwcFwiLCBcInNyY1wiLCBcIm1haW4udHNcIiksIE1BSU5fVFMpLFxuXHRdKTtcblxuXHRjb25zb2xlLmxvZyhgXFxuU2NhZmZvbGRlZCAke25hbWV9LiBOZXh0IHN0ZXBzOlxcbmApO1xuXHRpZiAoYmFzZW5hbWUodGFyZ2V0RGlyKSAhPT0gdGFyZ2V0RGlyKSB7XG5cdFx0Y29uc29sZS5sb2coYCAgY2QgJHtuYW1lfWApO1xuXHR9XG5cdGNvbnNvbGUubG9nKFwiICBwbnBtIGluc3RhbGxcIik7XG5cdGNvbnNvbGUubG9nKFwiICBwbnBtIGJ1aWxkICAgICAjIGZvcmdlIGJ1aWxkXCIpO1xuXHRjb25zb2xlLmxvZyhcIiAgcG5wbSBkZXYgICAgICAgIyBmbHV4IHNlcnZlXFxuXCIpO1xufVxuIl0sIm5hbWVzIjpbImV4aXN0c1N5bmMiLCJyZWFkZGlyU3luYyIsIm1rZGlyIiwid3JpdGVGaWxlIiwiYmFzZW5hbWUiLCJqb2luIiwiY3JlYXRlSW50ZXJmYWNlIiwiQVBQX1BBQ0tBR0VfSlNPTiIsIk1BSU5fVFMiLCJST09UX1BBQ0tBR0VfSlNPTiIsIlRTQ09ORklHIiwic2NhZmZvbGQiLCJ0YXJnZXREaXIiLCJvcHRzIiwibmFtZSIsImxlbmd0aCIsInllcyIsInJsIiwiaW5wdXQiLCJwcm9jZXNzIiwic3RkaW4iLCJvdXRwdXQiLCJzdGRvdXQiLCJhbnN3ZXIiLCJxdWVzdGlvbiIsImNsb3NlIiwidHJpbSIsInRvTG93ZXJDYXNlIiwic3RhcnRzV2l0aCIsImNvbnNvbGUiLCJsb2ciLCJleGl0IiwicmVjdXJzaXZlIiwiUHJvbWlzZSIsImFsbCJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsVUFBVSxFQUFFQyxXQUFXLFFBQVEsVUFBVTtBQUNsRCxTQUFTQyxLQUFLLEVBQUVDLFNBQVMsUUFBUSxtQkFBbUI7QUFDcEQsU0FBU0MsUUFBUSxFQUFFQyxJQUFJLFFBQVEsWUFBWTtBQUMzQyxTQUFTQyxlQUFlLFFBQVEseUJBQXlCO0FBQ3pELFNBQVNDLGdCQUFnQixFQUFFQyxPQUFPLEVBQUVDLGlCQUFpQixFQUFFQyxRQUFRLFFBQVEsaUJBQWlCO0FBTXhGLE9BQU8sZUFBZUMsU0FBU0MsU0FBaUIsRUFBRUMsSUFBcUI7SUFDdEUsTUFBTUMsT0FBT1YsU0FBU1E7SUFFdEIsSUFBSVosV0FBV1ksY0FBY1gsWUFBWVcsV0FBV0csTUFBTSxHQUFHLEtBQUssQ0FBQ0YsS0FBS0csR0FBRyxFQUFFO1FBQzVFLE1BQU1DLEtBQUtYLGdCQUFnQjtZQUMxQlksT0FBT0MsUUFBUUMsS0FBSztZQUNwQkMsUUFBUUYsUUFBUUcsTUFBTTtRQUN2QjtRQUNBLE1BQU1DLFNBQVMsTUFBTU4sR0FBR08sUUFBUSxDQUFDLENBQUMsV0FBVyxFQUFFVixLQUFLLGdDQUFnQyxDQUFDO1FBQ3JGRyxHQUFHUSxLQUFLO1FBQ1IsSUFBSSxDQUFDRixPQUFPRyxJQUFJLEdBQUdDLFdBQVcsR0FBR0MsVUFBVSxDQUFDLE1BQU07WUFDakRDLFFBQVFDLEdBQUcsQ0FBQztZQUNaWCxRQUFRWSxJQUFJLENBQUM7UUFDZDtJQUNEO0lBRUEsTUFBTTdCLE1BQU1HLEtBQUtPLFdBQVcsWUFBWSxPQUFPLFFBQVE7UUFBRW9CLFdBQVc7SUFBSztJQUV6RSxNQUFNQyxRQUFRQyxHQUFHLENBQUM7UUFDakIvQixVQUFVRSxLQUFLTyxXQUFXLGlCQUFpQkgsa0JBQWtCSztRQUM3RFgsVUFBVUUsS0FBS08sV0FBVyxrQkFBa0JGO1FBQzVDUCxVQUFVRSxLQUFLTyxXQUFXLFlBQVksT0FBTyxpQkFBaUJMLGlCQUFpQk87UUFDL0VYLFVBQVVFLEtBQUtPLFdBQVcsWUFBWSxPQUFPLE9BQU8sWUFBWUo7S0FDaEU7SUFFRHFCLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRWhCLEtBQUssZUFBZSxDQUFDO0lBQ2pELElBQUlWLFNBQVNRLGVBQWVBLFdBQVc7UUFDdENpQixRQUFRQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUVoQixNQUFNO0lBQzNCO0lBQ0FlLFFBQVFDLEdBQUcsQ0FBQztJQUNaRCxRQUFRQyxHQUFHLENBQUM7SUFDWkQsUUFBUUMsR0FBRyxDQUFDO0FBQ2IifQ==
@@ -1,40 +0,0 @@
1
- export function ROOT_PACKAGE_JSON(name) {
2
- return JSON.stringify({
3
- name,
4
- version: "0.0.1",
5
- type: "module",
6
- scripts: {
7
- build: "forge build",
8
- "build:watch": "forge build --watch",
9
- dev: "flux serve"
10
- },
11
- devDependencies: {
12
- "@decohere/terminal": "0.0.1-dev.14",
13
- typescript: "^6.0.3"
14
- }
15
- }, null, 2);
16
- }
17
- export function APP_PACKAGE_JSON(name) {
18
- return JSON.stringify({
19
- name: `@${name}/app`,
20
- version: "0.0.1",
21
- type: "module",
22
- main: "src/main.ts"
23
- }, null, 2);
24
- }
25
- export const TSCONFIG = JSON.stringify({
26
- compilerOptions: {
27
- target: "ES2022",
28
- module: "NodeNext",
29
- moduleResolution: "NodeNext",
30
- strict: true,
31
- skipLibCheck: true
32
- },
33
- include: [
34
- "projects"
35
- ]
36
- }, null, 2);
37
- export const MAIN_TS = `console.log("Hello from Decohere!");
38
- `;
39
-
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvY3JlYXRlL3NyYy90ZW1wbGF0ZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIFJPT1RfUEFDS0FHRV9KU09OKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBKU09OLnN0cmluZ2lmeShcblx0XHR7XG5cdFx0XHRuYW1lLFxuXHRcdFx0dmVyc2lvbjogXCIwLjAuMVwiLFxuXHRcdFx0dHlwZTogXCJtb2R1bGVcIixcblx0XHRcdHNjcmlwdHM6IHtcblx0XHRcdFx0YnVpbGQ6IFwiZm9yZ2UgYnVpbGRcIixcblx0XHRcdFx0XCJidWlsZDp3YXRjaFwiOiBcImZvcmdlIGJ1aWxkIC0td2F0Y2hcIixcblx0XHRcdFx0ZGV2OiBcImZsdXggc2VydmVcIixcblx0XHRcdH0sXG5cdFx0XHRkZXZEZXBlbmRlbmNpZXM6IHtcblx0XHRcdFx0XCJAZGVjb2hlcmUvdGVybWluYWxcIjogXCIwLjAuMS1kZXYuMTRcIixcblx0XHRcdFx0dHlwZXNjcmlwdDogXCJeNi4wLjNcIixcblx0XHRcdH0sXG5cdFx0fSxcblx0XHRudWxsLFxuXHRcdDIsXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBBUFBfUEFDS0FHRV9KU09OKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBKU09OLnN0cmluZ2lmeShcblx0XHR7XG5cdFx0XHRuYW1lOiBgQCR7bmFtZX0vYXBwYCxcblx0XHRcdHZlcnNpb246IFwiMC4wLjFcIixcblx0XHRcdHR5cGU6IFwibW9kdWxlXCIsXG5cdFx0XHRtYWluOiBcInNyYy9tYWluLnRzXCIsXG5cdFx0fSxcblx0XHRudWxsLFxuXHRcdDIsXG5cdCk7XG59XG5cbmV4cG9ydCBjb25zdCBUU0NPTkZJRyA9IEpTT04uc3RyaW5naWZ5KFxuXHR7XG5cdFx0Y29tcGlsZXJPcHRpb25zOiB7XG5cdFx0XHR0YXJnZXQ6IFwiRVMyMDIyXCIsXG5cdFx0XHRtb2R1bGU6IFwiTm9kZU5leHRcIixcblx0XHRcdG1vZHVsZVJlc29sdXRpb246IFwiTm9kZU5leHRcIixcblx0XHRcdHN0cmljdDogdHJ1ZSxcblx0XHRcdHNraXBMaWJDaGVjazogdHJ1ZSxcblx0XHR9LFxuXHRcdGluY2x1ZGU6IFtcInByb2plY3RzXCJdLFxuXHR9LFxuXHRudWxsLFxuXHQyLFxuKTtcblxuZXhwb3J0IGNvbnN0IE1BSU5fVFMgPSBgY29uc29sZS5sb2coXCJIZWxsbyBmcm9tIERlY29oZXJlIVwiKTtcbmA7XG4iXSwibmFtZXMiOlsiUk9PVF9QQUNLQUdFX0pTT04iLCJuYW1lIiwiSlNPTiIsInN0cmluZ2lmeSIsInZlcnNpb24iLCJ0eXBlIiwic2NyaXB0cyIsImJ1aWxkIiwiZGV2IiwiZGV2RGVwZW5kZW5jaWVzIiwidHlwZXNjcmlwdCIsIkFQUF9QQUNLQUdFX0pTT04iLCJtYWluIiwiVFNDT05GSUciLCJjb21waWxlck9wdGlvbnMiLCJ0YXJnZXQiLCJtb2R1bGUiLCJtb2R1bGVSZXNvbHV0aW9uIiwic3RyaWN0Iiwic2tpcExpYkNoZWNrIiwiaW5jbHVkZSIsIk1BSU5fVFMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sU0FBU0Esa0JBQWtCQyxJQUFZO0lBQzdDLE9BQU9DLEtBQUtDLFNBQVMsQ0FDcEI7UUFDQ0Y7UUFDQUcsU0FBUztRQUNUQyxNQUFNO1FBQ05DLFNBQVM7WUFDUkMsT0FBTztZQUNQLGVBQWU7WUFDZkMsS0FBSztRQUNOO1FBQ0FDLGlCQUFpQjtZQUNoQixzQkFBc0I7WUFDdEJDLFlBQVk7UUFDYjtJQUNELEdBQ0EsTUFDQTtBQUVGO0FBRUEsT0FBTyxTQUFTQyxpQkFBaUJWLElBQVk7SUFDNUMsT0FBT0MsS0FBS0MsU0FBUyxDQUNwQjtRQUNDRixNQUFNLENBQUMsQ0FBQyxFQUFFQSxLQUFLLElBQUksQ0FBQztRQUNwQkcsU0FBUztRQUNUQyxNQUFNO1FBQ05PLE1BQU07SUFDUCxHQUNBLE1BQ0E7QUFFRjtBQUVBLE9BQU8sTUFBTUMsV0FBV1gsS0FBS0MsU0FBUyxDQUNyQztJQUNDVyxpQkFBaUI7UUFDaEJDLFFBQVE7UUFDUkMsUUFBUTtRQUNSQyxrQkFBa0I7UUFDbEJDLFFBQVE7UUFDUkMsY0FBYztJQUNmO0lBQ0FDLFNBQVM7UUFBQztLQUFXO0FBQ3RCLEdBQ0EsTUFDQSxHQUNDO0FBRUYsT0FBTyxNQUFNQyxVQUFVLENBQUM7QUFDeEIsQ0FBQyxDQUFDIn0=
@@ -1,4 +0,0 @@
1
- export interface ScaffoldOptions {
2
- yes?: boolean;
3
- }
4
- export declare function scaffold(targetDir: string, opts: ScaffoldOptions): Promise<void>;
@@ -1,4 +0,0 @@
1
- export declare function ROOT_PACKAGE_JSON(name: string): string;
2
- export declare function APP_PACKAGE_JSON(name: string): string;
3
- export declare const TSCONFIG: string;
4
- export declare const MAIN_TS = "console.log(\"Hello from Decohere!\");\n";