@effect-gql/cli 1.3.2 → 1.3.4
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/bin.cjs +38 -7
- package/bin.cjs.map +1 -1
- package/bin.js +39 -8
- package/bin.js.map +1 -1
- package/index.cjs +5 -5
- package/index.cjs.map +1 -1
- package/index.js +5 -5
- package/index.js.map +1 -1
- package/package.json +5 -2
package/bin.cjs
CHANGED
|
@@ -286,11 +286,11 @@ var parseArgs2 = (args) => {
|
|
|
286
286
|
|
|
287
287
|
// src/commands/create/templates/package-json.ts
|
|
288
288
|
var VERSIONS = {
|
|
289
|
-
core: "^1.3.
|
|
290
|
-
node: "^1.3.
|
|
291
|
-
bun: "^1.3.
|
|
292
|
-
express: "^1.3.
|
|
293
|
-
web: "^1.3.
|
|
289
|
+
core: "^1.3.4",
|
|
290
|
+
node: "^1.3.4",
|
|
291
|
+
bun: "^1.3.4",
|
|
292
|
+
express: "^1.3.4",
|
|
293
|
+
web: "^1.3.4",
|
|
294
294
|
effect: "^3.19.0",
|
|
295
295
|
platform: "^0.94.0",
|
|
296
296
|
platformNode: "^0.104.0",
|
|
@@ -1317,9 +1317,37 @@ var runCreate = (args) => effect.Effect.gen(function* () {
|
|
|
1317
1317
|
const options = "interactive" in parsed ? yield* runInteractive() : parsed.options;
|
|
1318
1318
|
yield* scaffold(options);
|
|
1319
1319
|
});
|
|
1320
|
-
|
|
1321
|
-
// src/bin.ts
|
|
1320
|
+
var require3 = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('bin.cjs', document.baseURI).href)));
|
|
1322
1321
|
var VERSION = "0.1.0";
|
|
1322
|
+
var isTsxLoaderActive = () => {
|
|
1323
|
+
const execArgv = process.execArgv.join(" ");
|
|
1324
|
+
return execArgv.includes("tsx") || execArgv.includes("ts-node");
|
|
1325
|
+
};
|
|
1326
|
+
var maybeReexecWithTsx = () => {
|
|
1327
|
+
const args = process.argv.slice(2);
|
|
1328
|
+
if (args[0] !== "generate-schema") {
|
|
1329
|
+
return false;
|
|
1330
|
+
}
|
|
1331
|
+
const modulePath = args.slice(1).find((arg) => !arg.startsWith("-"));
|
|
1332
|
+
if (!modulePath || !modulePath.endsWith(".ts")) {
|
|
1333
|
+
return false;
|
|
1334
|
+
}
|
|
1335
|
+
if (isTsxLoaderActive()) {
|
|
1336
|
+
return false;
|
|
1337
|
+
}
|
|
1338
|
+
try {
|
|
1339
|
+
const tsxPath = require3.resolve("tsx");
|
|
1340
|
+
const result = child_process.spawnSync(process.execPath, ["--import", tsxPath, ...process.argv.slice(1)], {
|
|
1341
|
+
stdio: "inherit",
|
|
1342
|
+
cwd: process.cwd(),
|
|
1343
|
+
env: process.env
|
|
1344
|
+
});
|
|
1345
|
+
process.exitCode = result.status ?? 1;
|
|
1346
|
+
return true;
|
|
1347
|
+
} catch (error) {
|
|
1348
|
+
return false;
|
|
1349
|
+
}
|
|
1350
|
+
};
|
|
1323
1351
|
var printHelp = () => {
|
|
1324
1352
|
console.log(`
|
|
1325
1353
|
Effect GraphQL CLI v${VERSION}
|
|
@@ -1345,6 +1373,9 @@ Run 'effect-gql <command> --help' for command-specific help.
|
|
|
1345
1373
|
var printVersion = () => {
|
|
1346
1374
|
console.log(`effect-gql v${VERSION}`);
|
|
1347
1375
|
};
|
|
1376
|
+
if (maybeReexecWithTsx()) {
|
|
1377
|
+
process.exit(process.exitCode ?? 0);
|
|
1378
|
+
}
|
|
1348
1379
|
var main = effect.Effect.gen(function* () {
|
|
1349
1380
|
const args = process.argv.slice(2);
|
|
1350
1381
|
if (args.length === 0 || args[0] === "-h" || args[0] === "--help") {
|
package/bin.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/generate-schema.ts","../src/commands/create/types.ts","../src/commands/create/args.ts","../src/commands/create/templates/package-json.ts","../src/commands/create/templates/tsconfig.ts","../src/commands/create/templates/server.ts","../src/commands/create/templates/index.ts","../src/commands/create/monorepo.ts","../src/commands/create/scaffolder.ts","../src/commands/create/index.ts","../src/bin.ts"],"names":["require","createRequire","defaultPrintSchema","defaultLexicographicSortSchema","Effect","path","fs","Console","watch","parseArgs","Option","fs2","path2","fs3","path3","spawn","pipe","readline"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,IAAMA,QAAAA,GAAUC,sBAAA,CAAc,yPAAe,CAAA;AAmB7C,IAAM,gBAAA,GAAqC;AAAA,EACzC,WAAA,EAAaC,mBAAA;AAAA,EACb,uBAAA,EAAyBC;AAC3B,CAAA;AAgBA,IAAM,oBAAA,GAAuB,CAAC,UAAA,KAC5BC,aAAA,CAAO,UAAA,CAAW;AAAA,EAChB,KAAK,YAAY;AAEf,IAAA,MAAM,aAAA,GAAgBH,uBAAc,UAAU,CAAA;AAG9C,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,OAAA,CAAQ,kBAAkB,CAAA;AAGzD,IAAA,MAAM,WAAA,GAAcA,uBAAc,QAAQ,CAAA;AAC1C,IAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA;AAGjD,IAAA,MAAM,OAAA,GAAU,MAAM,OAAO,WAAA,CAAA;AAE7B,IAAA,OAAO;AAAA,MACL,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,yBAAyB,OAAA,CAAQ;AAAA,KACnC;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAO,CAAC,KAAA,KACN,IAAI,KAAA;AAAA,IACF,2FAA2F,KAAK,CAAA;AAAA;AAEtG,CAAC,CAAA;AAMI,IAAM,UAAA,GAAa,CAAC,UAAA,KACzBG,aAAA,CAAO,IAAI,aAAa;AACtB,EAAA,MAAM,YAAA,GAAoBC,gBAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,UAAU,CAAA;AAG3D,EAAA,IAAI,CAAIC,cAAA,CAAA,UAAA,CAAW,YAAY,CAAA,EAAG;AAChC,IAAA,OAAO,OAAOF,cAAO,IAAA,CAAK,IAAI,MAAM,CAAA,gBAAA,EAAmB,YAAY,EAAE,CAAC,CAAA;AAAA,EACxE;AAGA,EAAA,MAAM,MAAA,GAAS,OAAOA,aAAA,CAAO,UAAA,CAAW;AAAA,IACtC,KAAK,YAAY;AAEf,MAAA,MAAM,QAAA,GAAWJ,QAAAA,CAAQ,OAAA,CAAQ,YAAY,CAAA;AAC7C,MAAA,OAAOA,QAAAA,CAAQ,MAAM,QAAQ,CAAA;AAG7B,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,OAAO,YAAA,CAAA;AAAA,MACtB,CAAA,CAAA,MAAQ;AACN,QAAA,OAAOA,SAAQ,YAAY,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,IACA,OAAO,CAAC,KAAA,KAAU,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAK,CAAA,CAAE;AAAA,GAC9D,CAAA;AAGD,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,UAAU,MAAA,CAAO,OAAA;AAE3D,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,OAAOI,aAAA,CAAO,IAAA;AAAA,MACnB,IAAI,KAAA;AAAA,QACF,CAAA,kGAAA;AAAA;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,QAAA,CAAS,WAAA,KAAgB,UAAA,EAAY;AAC9C,IAAA,OAAO,SAAS,WAAA,EAAY;AAAA,EAC9B;AAGA,EAAA,IAAI,QAAA,CAAS,YAAA,IAAgB,QAAA,CAAS,UAAA,EAAY;AAChD,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAOA,aAAA,CAAO,IAAA;AAAA,IACnB,IAAI,KAAA,CAAM,CAAA,4DAAA,EAA+D,OAAO,QAAQ,CAAA,CAAE;AAAA,GAC5F;AACF,CAAC,CAAA;AASI,IAAM,WAAA,GAAc,CACzB,MAAA,EACA,OAAA,GAA4D,EAAC,KAClD;AACX,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,gBAAA;AACvC,EAAA,MAAM,cAAc,OAAA,CAAQ,IAAA,KAAS,QAAQ,SAAA,CAAU,uBAAA,CAAwB,MAAM,CAAA,GAAI,MAAA;AACzF,EAAA,OAAO,SAAA,CAAU,YAAY,WAAW,CAAA;AAC1C,CAAA;AAmBA,IAAM,GAAA,GAAM,CAAC,OAAA,KACXA,aAAA,CAAO,IAAI,aAAa;AACtB,EAAA,MAAM,eAAoBC,gBAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAI,EAAG,QAAQ,UAAU,CAAA;AACnE,EAAA,MAAM,SAAA,GAAY,OAAO,oBAAA,CAAqB,YAAY,CAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,OAAO,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,YAAY,MAAA,EAAQ,EAAE,MAAM,OAAA,CAAQ,IAAA,EAAM,WAAW,CAAA;AAEjE,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAM,aAAkBA,gBAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAI,EAAG,QAAQ,MAAM,CAAA;AAC7D,IAAGC,cAAA,CAAA,aAAA,CAAc,YAAY,GAAG,CAAA;AAChC,IAAA,OAAOC,cAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqB,UAAU,CAAA,CAAE,CAAA;AAAA,EACtD,CAAA,MAAO;AACL,IAAA,OAAOA,cAAA,CAAQ,IAAI,GAAG,CAAA;AAAA,EACxB;AACF,CAAC,CAAA;AAKH,IAAMC,MAAAA,GAAQ,CAAC,OAAA,KACbJ,aAAA,CAAO,IAAI,aAAa;AACtB,EAAA,MAAM,eAAoBC,gBAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAI,EAAG,QAAQ,UAAU,CAAA;AACnE,EAAA,MAAM,GAAA,GAAWA,yBAAQ,YAAY,CAAA;AAErC,EAAA,OAAOE,cAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,GAAG,CAAA,GAAA,CAAK,CAAA;AAGtD,EAAA,OAAO,GAAA,CAAI,OAAO,CAAA,CAAE,IAAA,CAAKH,cAAO,QAAA,CAAS,CAAC,KAAA,KAAUG,cAAA,CAAQ,MAAM,CAAA,OAAA,EAAU,KAAA,CAAM,OAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AAG7F,EAAA,OAAOH,aAAA,CAAO,MAAmB,MAAM;AACrC,IAAA,MAAM,OAAA,GAAaE,qBAAM,GAAA,EAAK,EAAE,WAAW,IAAA,EAAK,EAAG,CAAC,CAAA,EAAG,QAAA,KAAa;AAClE,MAAA,IAAI,UAAU,QAAA,CAAS,KAAK,KAAK,QAAA,EAAU,QAAA,CAAS,KAAK,CAAA,EAAG;AAC1D,QAAAF,aAAA,CAAO,UAAA;AAAA,UACL,GAAA,CAAI,OAAO,CAAA,CAAE,IAAA;AAAA,YACXA,aAAA,CAAO,GAAA,CAAI,MAAMG,cAAA,CAAQ,GAAA,CAAI;AAAA,eAAA,EAAA,qBAAwB,IAAA,EAAK,EAAE,kBAAA,EAAoB,EAAE,CAAC,CAAA;AAAA,YACnFH,aAAA,CAAO,QAAA,CAAS,CAAC,KAAA,KAAUG,cAAA,CAAQ,MAAM,CAAA,OAAA,EAAU,KAAA,CAAM,OAAO,CAAA,CAAE,CAAC;AAAA;AACrE,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAOH,aAAA,CAAO,IAAA,CAAK,MAAM,OAAA,CAAQ,OAAO,CAAA;AAAA,EAC1C,CAAC,CAAA;AACH,CAAC,CAAA;AAKH,IAAM,SAAA,GAAY,CAAC,IAAA,KAAyE;AAC1F,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAElB,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,QAAA,EAAU;AACpC,MAAA,OAAO,EAAE,MAAM,IAAA,EAAK;AAAA,IACtB,CAAA,MAAA,IAAW,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,UAAA,EAAY;AAC7C,MAAA,MAAA,GAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACnB,CAAA,MAAA,IAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,IAAA,GAAO,KAAA;AAAA,IACT,CAAA,MAAA,IAAW,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,SAAA,EAAW;AAC5C,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA,MAAA,IAAW,CAAC,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/B,MAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,OAAO,EAAE,KAAA,EAAO,CAAA,gBAAA,EAAmB,GAAG,CAAA,CAAA,EAAG;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAE,OAAO,qBAAA,EAAsB;AAAA,EACxC;AAEA,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,WAAW,CAAC,CAAA;AAAA,IACxB,MAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AACF,CAAA;AAEO,IAAM,0BAA0B,MAAY;AACjD,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAuBb,CAAA;AACD,CAAA;AAKO,IAAM,iBAAA,GAAoB,CAAC,IAAA,KAChCA,aAAA,CAAO,IAAI,aAAa;AACtB,EAAA,MAAM,MAAA,GAAS,UAAU,IAAI,CAAA;AAE7B,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,uBAAA,EAAwB;AACxB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,OAAOG,cAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAC7C,IAAA,uBAAA,EAAwB;AACxB,IAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AACnB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,OAAOC,OAAM,MAAM,CAAA;AAAA,EACrB,CAAA,MAAO;AACL,IAAA,OAAO,IAAI,MAAM,CAAA;AAAA,EACnB;AACF,CAAC,CAAA;;;ACvOI,IAAM,YAAA,GAAsC,CAAC,MAAA,EAAQ,KAAA,EAAO,WAAW,KAAK,CAAA;AAK5E,IAAM,iBAAA,GAAoB,CAAC,KAAA,KAChC,YAAA,CAAa,SAAS,KAAmB,CAAA;AAKpC,IAAM,gBAAA,GAA8C,CAAC,KAAA,EAAO,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAKjF,IAAM,qBAAA,GAAwB,CAAC,KAAA,KACpC,gBAAA,CAAiB,SAAS,KAAuB,CAAA;;;ACpF5C,IAAMC,UAAAA,GAAY,CAAC,IAAA,KAA+B;AACvD,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,SAAA,GAAmCC,cAAO,IAAA,EAAK;AACnD,EAAA,IAAI,QAAA,GAAmCA,cAAO,IAAA,EAAK;AACnD,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,IAAI,cAAA,GAAgDA,cAAO,IAAA,EAAK;AAChE,EAAA,IAAI,WAAA,GAAc,KAAA;AAElB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAElB,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,QAAA,EAAU;AACpC,MAAA,OAAO,EAAE,MAAM,IAAA,EAAK;AAAA,IACtB,CAAA,MAAA,IAAW,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,eAAA,EAAiB;AAClD,MAAA,WAAA,GAAc,IAAA;AAAA,IAChB,CAAA,MAAA,IAAW,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,eAAA,EAAiB;AAClD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AACtB,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,EAAE,OAAO,iCAAA,EAAkC;AAAA,MACpD;AACA,MAAA,IAAI,CAAC,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC7B,QAAA,OAAO;AAAA,UACL,OAAO,CAAA,qBAAA,EAAwB,KAAK,qBAAqB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SAClF;AAAA,MACF;AACA,MAAA,UAAA,GAAa,KAAA;AAAA,IACf,CAAA,MAAA,IAAW,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,aAAA,EAAe;AAChD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AACtB,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,EAAE,OAAO,+BAAA,EAAgC;AAAA,MAClD;AACA,MAAA,SAAA,GAAYA,aAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,QAAA,GAAWA,aAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAC7B,CAAA,MAAA,IAAW,QAAQ,gBAAA,EAAkB;AACnC,MAAA,WAAA,GAAc,IAAA;AAAA,IAChB,CAAA,MAAA,IAAW,QAAQ,mBAAA,EAAqB;AACtC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AACtB,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,EAAE,OAAO,qCAAA,EAAsC;AAAA,MACxD;AACA,MAAA,IAAI,CAAC,qBAAA,CAAsB,KAAK,CAAA,EAAG;AACjC,QAAA,OAAO,EAAE,KAAA,EAAO,CAAA,yBAAA,EAA4B,KAAK,CAAA,sCAAA,CAAA,EAAyC;AAAA,MAC5F;AACA,MAAA,cAAA,GAAiBA,aAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACpC,CAAA,MAAA,IAAW,CAAC,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/B,MAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,OAAO,EAAE,KAAA,EAAO,CAAA,gBAAA,EAAmB,GAAG,CAAA,CAAA,EAAG;AAAA,IAC3C;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,EAAE,aAAa,IAAA,EAAK;AAAA,EAC7B;AAGA,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,EAAE,aAAa,IAAA,EAAK;AAAA,EAC7B;AAGA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO;AAAA,MACL,KAAA,EACE;AAAA,KACJ;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,EAAE,KAAA,EAAO,yCAAA,GAA4C,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,EACtF;AAEA,EAAA,MAAM,OAAA,GAAyB;AAAA,IAC7B,IAAA,EAAM,WAAW,CAAC,CAAA;AAAA,IAClB,UAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,EAAE,OAAA,EAAQ;AACnB,CAAA;;;AC1FA,IAAM,QAAA,GAAW;AAAA,EACf,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,GAAA,EAAK,QAAA;AAAA,EACL,OAAA,EAAS,QAAA;AAAA,EACT,GAAA,EAAK,QAAA;AAAA,EACL,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU,SAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,WAAA,EAAa,SAAA;AAAA,EACb,OAAA,EAAS,SAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,SAAA;AAAA,EACL,UAAA,EAAY;AACd,CAAA;AAUA,IAAM,eAAA,GAAkB,CAAC,UAAA,EAAwB,WAAA,KAAuC;AAEtF,EAAA,MAAM,QAAA,GAAmC;AAAA,IACvC,oBAAoB,QAAA,CAAS,IAAA;AAAA,IAC7B,oBAAoB,QAAA,CAAS,QAAA;AAAA,IAC7B,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,SAAS,QAAA,CAAS;AAAA,GACpB;AAEA,EAAA,MAAM,WAAA,GAAsC;AAAA,IAC1C,KAAK,QAAA,CAAS,GAAA;AAAA,IACd,YAAY,QAAA,CAAS;AAAA,GACvB;AAEA,EAAA,QAAQ,UAAA;AAAY,IAClB,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,YAAA,EAAc;AAAA,UACZ,GAAG,QAAA;AAAA,UACH,oBAAoB,QAAA,CAAS,IAAA;AAAA,UAC7B,yBAAyB,QAAA,CAAS;AAAA,SACpC;AAAA,QACA,eAAA,EAAiB;AAAA,OACnB;AAAA,IAEF,KAAK,KAAA;AACH,MAAA,OAAO;AAAA,QACL,YAAA,EAAc;AAAA,UACZ,GAAG,QAAA;AAAA,UACH,mBAAmB,QAAA,CAAS,GAAA;AAAA,UAC5B,wBAAwB,QAAA,CAAS;AAAA,SACnC;AAAA,QACA,eAAA,EAAiB;AAAA,UACf,YAAY,QAAA,CAAS;AAAA;AAAA;AAEvB,OACF;AAAA,IAEF,KAAK,SAAA;AACH,MAAA,OAAO;AAAA,QACL,YAAA,EAAc;AAAA,UACZ,GAAG,QAAA;AAAA,UACH,uBAAuB,QAAA,CAAS,OAAA;AAAA,UAChC,SAAS,QAAA,CAAS;AAAA,SACpB;AAAA,QACA,eAAA,EAAiB;AAAA,UACf,GAAG,WAAA;AAAA,UACH,gBAAA,EAAkB;AAAA;AACpB,OACF;AAAA,IAEF,KAAK,KAAA;AACH,MAAA,OAAO;AAAA,QACL,YAAA,EAAc;AAAA,UACZ,GAAG,QAAA;AAAA,UACH,mBAAmB,QAAA,CAAS;AAAA,SAC9B;AAAA,QACA,eAAA,EAAiB;AAAA,OACnB;AAAA;AAEN,CAAA;AAKA,IAAM,UAAA,GAAa,CAAC,UAAA,KAAmD;AACrE,EAAA,QAAQ,UAAA;AAAY,IAClB,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,kBAAA;AAAA,QACP,GAAA,EAAK,wBAAA;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACb;AAAA,IAEF,KAAK,KAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,sBAAA;AAAA,QACP,GAAA,EAAK,0BAAA;AAAA,QACL,KAAA,EAAO,mDAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACb;AAAA,IAEF,KAAK,SAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,kBAAA;AAAA,QACP,GAAA,EAAK,wBAAA;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACb;AAAA,IAEF,KAAK,KAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,kBAAA;AAAA,QACP,GAAA,EAAK,wBAAA;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,SAAA,EAAW;AAAA;AAAA,OAEb;AAAA;AAEN,CAAA;AAKO,IAAM,mBAAA,GAAsB,CAAC,GAAA,KAAiC;AACnE,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,GAAA,CAAI,UAA0B,CAAA;AAE3D,EAAA,MAAM,GAAA,GAAM;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,OAAA,EAAS,OAAA;AAAA,IACT,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,UAAA,CAAW,GAAA,CAAI,UAAU,CAAA;AAAA,IAClC,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,iBAAiB,IAAA,CAAK;AAAA,GACxB;AAEA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA;AACxC,CAAA;;;AChJO,IAAM,gBAAA,GAAmB,CAAC,GAAA,KAAiC;AAChE,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,GACf;AAAA;AAAA,IAEE,OAAA,EAAS,qBAAA;AAAA,IACT,eAAA,EAAiB;AAAA,MACf,MAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAS,OAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,OAAA,EAAS,CAAC,UAAU,CAAA;AAAA,IACpB,OAAA,EAAS,CAAC,cAAA,EAAgB,MAAM;AAAA,GAClC,GACA;AAAA;AAAA,IAEE,eAAA,EAAiB;AAAA,MACf,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,UAAA;AAAA,MACR,gBAAA,EAAkB,UAAA;AAAA,MAClB,GAAA,EAAK,CAAC,QAAQ,CAAA;AAAA,MACd,MAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAS,OAAA;AAAA,MACT,MAAA,EAAQ,IAAA;AAAA,MACR,eAAA,EAAiB,IAAA;AAAA,MACjB,YAAA,EAAc,IAAA;AAAA,MACd,gCAAA,EAAkC,IAAA;AAAA,MAClC,WAAA,EAAa,IAAA;AAAA,MACb,cAAA,EAAgB,IAAA;AAAA,MAChB,SAAA,EAAW,IAAA;AAAA,MACX,MAAA,EAAQ,IAAA;AAAA;AAAA,MAER,sBAAA,EAAwB,IAAA;AAAA,MACxB,qBAAA,EAAuB;AAAA,KACzB;AAAA,IACA,OAAA,EAAS,CAAC,UAAU,CAAA;AAAA,IACpB,OAAA,EAAS,CAAC,cAAA,EAAgB,MAAM;AAAA,GAClC;AAEJ,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA;AAC3C,CAAA;;;ACvCA,IAAM,kBAAA,GAAqB,CAAC,GAAA,KAAiC,CAAA;AAAA,GAAA,EACxD,IAAI,IAAI,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDAAA,EA8CqC,IAAI,IAAI,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA2E1D,IAAM,iBAAA,GAAoB,CAAC,GAAA,KAAiC,CAAA;AAAA,GAAA,EACvD,IAAI,IAAI,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDAAA,EAyCqC,IAAI,IAAI,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAwE1D,IAAM,qBAAA,GAAwB,CAAC,GAAA,KAAiC,CAAA;AAAA,GAAA,EAC3D,IAAI,IAAI,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDAAA,EAyCqC,IAAI,IAAI,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAiF1D,IAAM,kBAAA,GAAqB,CAAC,GAAA,KAAiC,CAAA;AAAA,GAAA,EACxD,IAAI,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDAAA,EAyCqC,IAAI,IAAI,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA2FnD,IAAM,sBAAA,GAAyB,CAAC,GAAA,KAAiC;AACtE,EAAA,QAAQ,IAAI,UAAA;AAAY,IACtB,KAAK,MAAA;AACH,MAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,IAC/B,KAAK,KAAA;AACH,MAAA,OAAO,kBAAkB,GAAG,CAAA;AAAA,IAC9B,KAAK,SAAA;AACH,MAAA,OAAO,sBAAsB,GAAG,CAAA;AAAA,IAClC,KAAK,KAAA;AACH,MAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA;AAEnC,CAAA;;;ACpfA,IAAM,oBAAoB,MAAc,CAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA;AAmCjC,IAAM,eAAA,GAAkB,CAAC,GAAA,KAA0C;AAAA,EACxE;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS,oBAAoB,GAAG;AAAA,GAClC;AAAA,EACA;AAAA,IACE,IAAA,EAAM,eAAA;AAAA,IACN,OAAA,EAAS,iBAAiB,GAAG;AAAA,GAC/B;AAAA,EACA;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS,uBAAuB,GAAG;AAAA,GACrC;AAAA,EACA;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,SAAS,iBAAA;AAAkB;AAE/B,CAAA;ACpDA,IAAM,UAAA,GAAa,CAAC,QAAA,KAClBN,aAAAA,CAAO,KAAK,MAASO,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAC,CAAA;AAK3C,IAAM,QAAA,GAAW,CAAC,QAAA,KAChBP,aAAAA,CAAO,GAAA,CAAI;AAAA,EACT,GAAA,EAAK,MAASO,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAAA,EAC5C,KAAA,EAAO,CAAC,KAAA,KAAU,IAAI,MAAM,CAAA,eAAA,EAAkB,QAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE;AACpE,CAAC,CAAA;AAKI,IAAM,oBAAA,GAAuB,CAAC,GAAA,KACnCP,aAAAA,CAAO,IAAI,aAAa;AACtB,EAAA,IAAI,OAAO,UAAA,CAAgBQ,gBAAA,CAAA,IAAA,CAAK,KAAK,gBAAgB,CAAC,GAAG,OAAO,MAAA;AAChE,EAAA,IAAI,OAAO,UAAA,CAAgBA,gBAAA,CAAA,IAAA,CAAK,KAAK,WAAW,CAAC,GAAG,OAAO,KAAA;AAC3D,EAAA,IAAI,OAAO,UAAA,CAAgBA,gBAAA,CAAA,IAAA,CAAK,KAAK,WAAW,CAAC,GAAG,OAAO,MAAA;AAC3D,EAAA,OAAO,KAAA;AACT,CAAC,CAAA;AAUI,IAAM,cAAA,GAAiB,CAAC,SAAA,KAC7BR,aAAAA,CAAO,IAAI,aAAa;AAEtB,EAAA,IAAI,UAAA,GAAkBQ,gBAAA,CAAA,OAAA,CAAaA,gBAAA,CAAA,OAAA,CAAQ,SAAS,CAAC,CAAA;AACrD,EAAA,MAAM,IAAA,GAAYA,gBAAA,CAAA,KAAA,CAAM,UAAU,CAAA,CAAE,IAAA;AAEpC,EAAA,OAAO,eAAe,IAAA,EAAM;AAE1B,IAAA,MAAM,iBAAA,GAAyBA,gBAAA,CAAA,IAAA,CAAK,UAAA,EAAY,qBAAqB,CAAA;AACrE,IAAA,IAAI,OAAO,UAAA,CAAW,iBAAiB,CAAA,EAAG;AACxC,MAAA,OAAO;AAAA,QACL,UAAA,EAAY,IAAA;AAAA,QACZ,cAAA,EAAgBF,aAAAA,CAAO,IAAA,CAAK,MAAwB,CAAA;AAAA,QACpD,cAAA,EAAgBA,aAAAA,CAAO,IAAA,CAAK,UAAU;AAAA,OACxC;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAeE,gBAAA,CAAA,IAAA,CAAK,UAAA,EAAY,cAAc,CAAA;AACpD,IAAA,IAAI,OAAO,UAAA,CAAW,OAAO,CAAA,EAAG;AAC9B,MAAA,MAAM,OAAA,GAAU,OAAO,QAAA,CAAS,OAAO,CAAA,CAAE,IAAA,CAAKR,aAAAA,CAAO,QAAA,CAAS,MAAMA,aAAAA,CAAO,OAAA,CAAQ,EAAE,CAAC,CAAC,CAAA;AACvF,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC9B,UAAA,IAAI,IAAI,UAAA,EAAY;AAClB,YAAA,MAAM,EAAA,GAAK,OAAO,oBAAA,CAAqB,UAAU,CAAA;AACjD,YAAA,OAAO;AAAA,cACL,UAAA,EAAY,IAAA;AAAA,cACZ,cAAA,EAAgBM,aAAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAAA,cAC9B,cAAA,EAAgBA,aAAAA,CAAO,IAAA,CAAK,UAAU;AAAA,aACxC;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAiBE,gBAAA,CAAA,IAAA,CAAK,UAAA,EAAY,YAAY,CAAA;AACpD,IAAA,IAAI,OAAO,UAAA,CAAW,SAAS,CAAA,EAAG;AAChC,MAAA,MAAM,EAAA,GAAK,OAAO,oBAAA,CAAqB,UAAU,CAAA;AACjD,MAAA,OAAO;AAAA,QACL,UAAA,EAAY,IAAA;AAAA,QACZ,cAAA,EAAgBF,aAAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAAA,QAC9B,cAAA,EAAgBA,aAAAA,CAAO,IAAA,CAAK,UAAU;AAAA,OACxC;AAAA,IACF;AAGA,IAAA,UAAA,GAAkBE,yBAAQ,UAAU,CAAA;AAAA,EACtC;AAGA,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,KAAA;AAAA,IACZ,cAAA,EAAgBF,cAAO,IAAA,EAAK;AAAA,IAC5B,cAAA,EAAgBA,cAAO,IAAA;AAAK,GAC9B;AACF,CAAC,CAAA;AAKI,IAAM,iBAAA,GAAoB,CAAC,EAAA,KAA+B;AAC/D,EAAA,QAAQ,EAAA;AAAI,IACV,KAAK,KAAA;AACH,MAAA,OAAO,aAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,aAAA;AAAA;AAEb,CAAA;AAKO,IAAM,YAAA,GAAe,CAAC,EAAA,KAA+B;AAC1D,EAAA,QAAQ,EAAA;AAAI,IACV,KAAK,KAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,SAAA;AAAA;AAEb,CAAA;;;ACvHA,IAAM,iBAAA,GAAoB,CAAC,SAAA,KACzBN,aAAAA,CAAO,GAAA,CAAI;AAAA,EACT,KAAK,MAAM;AACT,IAAA,IAAOS,cAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,KAAA,GAAWA,2BAAY,SAAS,CAAA;AACtC,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,SAAS,CAAA,aAAA,CAAe,CAAA;AAAA,MACvD;AAAA,IACF;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAO,CAAC,KAAA,KACN,KAAA,YAAiB,KAAA,GAAQ,QAAQ,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,KAAK,CAAA,CAAE;AACvF,CAAC,CAAA;AAKH,IAAM,MAAA,GAAS,CAAC,GAAA,KACdT,aAAAA,CAAO,GAAA,CAAI;AAAA,EACT,KAAK,MAASS,cAAA,CAAA,SAAA,CAAU,KAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAChD,KAAA,EAAO,CAAC,KAAA,KAAU,IAAI,MAAM,CAAA,2BAAA,EAA8B,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE;AAC3E,CAAC,CAAA;AAKH,IAAM,YAAY,CAAC,QAAA,EAAkB,OAAA,KACnCT,aAAAA,CAAO,IAAI,aAAa;AACtB,EAAA,OAAO,MAAA,CAAYU,gBAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACpC,EAAA,OAAOV,cAAO,GAAA,CAAI;AAAA,IAChB,GAAA,EAAK,MAASS,cAAA,CAAA,aAAA,CAAc,QAAA,EAAU,SAAS,OAAO,CAAA;AAAA,IACtD,KAAA,EAAO,CAAC,KAAA,KAAU,IAAI,MAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE;AAAA,GACpE,CAAA;AACH,CAAC,CAAA;AAKH,IAAM,UAAA,GAAa,CAAC,OAAA,EAAiB,IAAA,EAAgB,QACnDT,aAAAA,CAAO,KAAA,CAAmB,CAAC,MAAA,KAAW;AACpC,EAAA,MAAM,KAAA,GAAQW,mBAAA,CAAM,OAAA,EAAS,IAAA,EAAM;AAAA,IACjC,GAAA;AAAA,IACA,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAC1B,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,MAAA,CAAOX,aAAAA,CAAO,OAAA,CAAQ,MAAS,CAAC,CAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,MAAA,CAAOA,aAAAA,CAAO,KAAK,IAAI,KAAA,CAAM,iCAAiC,IAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IACxE;AAAA,EACF,CAAC,CAAA;AAED,EAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AAC3B,IAAA,MAAA,CAAOA,aAAAA,CAAO,KAAK,IAAI,KAAA,CAAM,0BAA0B,KAAA,CAAM,OAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAC1E,CAAC,CAAA;AAED,EAAA,OAAOA,aAAAA,CAAO,KAAK,MAAM;AACvB,IAAA,KAAA,CAAM,IAAA,EAAK;AAAA,EACb,CAAC,CAAA;AACH,CAAC,CAAA;AAKH,IAAM,sBAAsB,CAC1B,SAAA,EACA,cAAA,KAEAA,aAAAA,CAAO,IAAI,aAAa;AACtB,EAAA,OAAOG,cAAAA,CAAQ,IAAI,EAAE,CAAA;AACrB,EAAA,OAAOA,cAAAA,CAAQ,IAAI,4BAA4B,CAAA;AAE/C,EAAA,MAAM,UAAA,GAAa,kBAAkB,cAAc,CAAA;AACnD,EAAA,MAAM,CAAC,GAAA,EAAK,GAAG,IAAI,CAAA,GAAI,UAAA,CAAW,MAAM,GAAG,CAAA;AAE3C,EAAA,OAAO,UAAA,CAAW,GAAA,EAAK,IAAA,EAAM,SAAS,CAAA;AAEtC,EAAA,OAAOA,cAAAA,CAAQ,IAAI,sCAAsC,CAAA;AAC3D,CAAC,CAAA;AAKH,IAAM,sBAAsB,CAAC,GAAA,EAAsB,SAAA,KACjDH,aAAAA,CAAO,IAAI,aAAa;AACtB,EAAA,MAAM,eAAoBU,gBAAA,CAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,EAAI,EAAG,SAAS,CAAA,IAAK,GAAA;AAChE,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,GAAA,CAAI,cAAc,CAAA;AAEjD,EAAA,OAAOP,cAAAA,CAAQ,IAAI,EAAE,CAAA;AACrB,EAAA,OAAOA,cAAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,GAAA,CAAI,IAAI,CAAA,CAAA,CAAG,CAAA;AACtD,EAAA,OAAOA,cAAAA,CAAQ,IAAI,EAAE,CAAA;AACrB,EAAA,OAAOA,cAAAA,CAAQ,IAAI,aAAa,CAAA;AAChC,EAAA,OAAOA,cAAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,EAAQ,YAAY,CAAA,CAAE,CAAA;AACzC,EAAA,OAAOA,cAAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,SAAS,CAAA,IAAA,CAAM,CAAA;AACvC,EAAA,OAAOA,cAAAA,CAAQ,IAAI,EAAE,CAAA;AACrB,EAAA,OAAOA,cAAAA,CAAQ,IAAI,2CAA2C,CAAA;AAC9D,EAAA,OAAOA,cAAAA,CAAQ,IAAI,iCAAiC,CAAA;AACpD,EAAA,OAAOA,cAAAA,CAAQ,IAAI,+CAA+C,CAAA;AAClE,EAAA,OAAOA,cAAAA,CAAQ,IAAI,EAAE,CAAA;AACvB,CAAC,CAAA;AAKI,IAAM,QAAA,GAAW,CAAC,OAAA,KACvBH,aAAAA,CAAO,IAAI,aAAa;AACtB,EAAA,MAAM,SAAA,GAAYY,WAAA;AAAA,IAChB,OAAA,CAAQ,SAAA;AAAA,IACRN,aAAAA,CAAO,IAAI,CAAC,GAAA,KAAaI,yBAAQ,OAAA,CAAQ,GAAA,EAAI,EAAG,GAAG,CAAC,CAAA;AAAA,IACpDJ,aAAAA,CAAO,UAAU,MAAWI,gBAAA,CAAA,OAAA,CAAQ,QAAQ,GAAA,EAAI,EAAG,OAAA,CAAQ,IAAI,CAAC;AAAA,GAClE;AAGA,EAAA,MAAM,YAAA,GAAe,OAAO,cAAA,CAAe,SAAS,CAAA;AAIpD,EAAA,MAAM,UAAA,GAAaE,WAAA;AAAA,IACjB,OAAA,CAAQ,QAAA;AAAA,IACRN,aAAAA,CAAO,SAAA,CAAU,MAAM,YAAA,CAAa,UAAU;AAAA,GAChD;AAIA,EAAA,MAAM,iBAAiB,OAAOM,WAAA;AAAA,IAC5B,OAAA,CAAQ,cAAA;AAAA,IACRN,aAAAA,CAAO,MAAA,CAAO,MAAM,YAAA,CAAa,cAAc,CAAA;AAAA,IAC/CA,cAAO,KAAA,CAAM;AAAA,MACX,MAAA,EAAQ,MAAM,oBAAA,CAAqB,OAAA,CAAQ,KAAK,CAAA;AAAA,MAChD,MAAA,EAAQ,CAAC,EAAA,KAAON,aAAAA,CAAO,QAAQ,EAAE;AAAA,KAClC;AAAA,GACH;AAGA,EAAA,MAAM,GAAA,GAAuB;AAAA,IAC3B,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAOG,cAAAA,CAAQ,IAAI,EAAE,CAAA;AACrB,EAAA,OAAOA,cAAAA,CAAQ,IAAI,CAAA,SAAA,EAAY,GAAA,CAAI,IAAI,CAAA,MAAA,EAAS,GAAA,CAAI,UAAU,CAAA,UAAA,CAAY,CAAA;AAG1E,EAAA,OAAO,kBAAkB,SAAS,CAAA;AAGlC,EAAA,MAAM,KAAA,GAAQ,gBAAgB,GAAG,CAAA;AAGjC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,QAAA,GAAgBO,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,IAAI,CAAA;AAC/C,IAAA,OAAO,SAAA,CAAU,QAAA,EAAU,IAAA,CAAK,OAAO,CAAA;AACvC,IAAA,OAAOP,cAAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,IAAA,OAAO,mBAAA,CAAoB,SAAA,EAAW,cAAc,CAAA,CAAE,IAAA;AAAA,MACpDH,aAAAA,CAAO,QAAA;AAAA,QAAS,CAAC,UACfG,cAAAA,CAAQ,GAAA,CAAI,4CAA4C,KAAA,CAAM,OAAO,EAAE,CAAA,CAAE,IAAA;AAAA,UACvEH,aAAAA,CAAO,OAAA;AAAA,YACLG,cAAAA,CAAQ,GAAA;AAAA,cACN,4CAAA,GAA+C,kBAAkB,cAAc;AAAA;AACjF;AACF;AACF;AACF,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAOA,cAAAA,CAAQ,IAAI,EAAE,CAAA;AACrB,IAAA,OAAOA,cAAAA,CAAQ,GAAA;AAAA,MACb,CAAA,uCAAA,EAA0C,iBAAA,CAAkB,cAAc,CAAC,CAAA,aAAA;AAAA,KAC7E;AAAA,EACF;AAGA,EAAA,OAAO,mBAAA,CAAoB,KAAK,SAAS,CAAA;AAC3C,CAAC,CAAA;;;AC7KI,IAAM,kBAAkB,MAAY;AACzC,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAsCb,CAAA;AACD,CAAA;AAKA,IAAM,SAAS,CAAC,QAAA,KACdH,aAAAA,CAAO,KAAA,CAAqB,CAAC,MAAA,KAAW;AACtC,EAAA,MAAM,KAAca,mBAAA,CAAA,eAAA,CAAgB;AAAA,IAClC,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,EAAA,CAAG,QAAA,CAAS,QAAA,EAAU,CAAC,MAAA,KAAW;AAChC,IAAA,EAAA,CAAG,KAAA,EAAM;AACT,IAAA,MAAA,CAAOb,aAAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,CAAC,CAAA;AAAA,EACtC,CAAC,CAAA;AAED,EAAA,EAAA,CAAG,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AACxB,IAAA,EAAA,CAAG,KAAA,EAAM;AACT,IAAA,MAAA,CAAOA,aAAAA,CAAO,KAAK,IAAI,KAAA,CAAM,gBAAgB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAChE,CAAC,CAAA;AAED,EAAA,OAAOA,aAAAA,CAAO,IAAA,CAAK,MAAM,EAAA,CAAG,OAAO,CAAA;AACrC,CAAC,CAAA;AAKH,IAAM,eAAe,CACnB,QAAA,EACA,OAAA,KAEAA,aAAAA,CAAO,IAAI,aAAa;AACtB,EAAA,OAAOG,cAAAA,CAAQ,IAAI,QAAQ,CAAA;AAC3B,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AAC1B,IAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,CAAA,CAAE,CAAA;AAAA,EACxC,CAAC,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO,gBAAgB,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA,GAAI,CAAA;AAErC,EAAA,IAAI,MAAM,KAAK,CAAA,IAAK,QAAQ,CAAA,IAAK,KAAA,IAAS,QAAQ,MAAA,EAAQ;AACxD,IAAA,OAAOA,cAAAA,CAAQ,GAAA,CAAI,CAAA,kCAAA,EAAqC,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAG,CAAA;AACzE,IAAA,OAAO,OAAO,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,KAAA;AACxB,CAAC,CAAA;AAKH,IAAM,gBAAgB,CAAC,QAAA,EAAkB,YAAA,KACvCH,aAAAA,CAAO,IAAI,aAAa;AACtB,EAAA,MAAM,IAAA,GAAgC,OAAA;AACtC,EAAA,MAAM,SAAS,OAAO,MAAA,CAAO,GAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,CAAA;AAEnD,EAAA,IAAI,MAAA,KAAW,IAAI,OAAO,YAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,OAAO,WAAA,EAAY;AACjC,EAAA,IAAI,KAAA,KAAU,GAAA,IAAO,KAAA,KAAU,KAAA,EAAO,OAAO,IAAA;AAC7C,EAAA,IAAI,KAAA,KAAU,GAAA,IAAO,KAAA,KAAU,IAAA,EAAM,OAAO,KAAA;AAE5C,EAAA,OAAOG,cAAAA,CAAQ,IAAI,2BAA2B,CAAA;AAC9C,EAAA,OAAO,OAAO,aAAA,CAAc,QAAA,EAAU,YAAY,CAAA;AACpD,CAAC,CAAA;AAKH,IAAM,cAAA,GAAiB,MACrBH,aAAAA,CAAO,GAAA,CAAI,aAAa;AACtB,EAAA,OAAOG,cAAAA,CAAQ,IAAI,EAAE,CAAA;AACrB,EAAA,OAAOA,cAAAA,CAAQ,IAAI,qCAAqC,CAAA;AACxD,EAAA,OAAOA,cAAAA,CAAQ,IAAI,sCAAsC,CAAA;AACzD,EAAA,OAAOA,cAAAA,CAAQ,IAAI,EAAE,CAAA;AAGrB,EAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,gBAAgB,CAAA;AAC3C,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,OAAOH,aAAAA,CAAO,IAAA,CAAK,IAAI,KAAA,CAAM,0BAA0B,CAAC,CAAA;AAAA,EACjE;AAGA,EAAA,IAAI,CAAC,wDAAA,CAAyD,IAAA,CAAK,IAAI,CAAA,EAAG;AACxE,IAAA,OAAOG,cAAAA,CAAQ,IAAI,oDAAoD,CAAA;AAAA,EACzE;AAGA,EAAA,MAAM,UAAA,GAAa,OAAO,YAAA,CAAyB,qBAAA,EAAuB;AAAA,IACxE,EAAE,KAAA,EAAO,4BAAA,EAA8B,KAAA,EAAO,MAAA,EAAO;AAAA,IACrD,EAAE,KAAA,EAAO,uBAAA,EAAyB,KAAA,EAAO,KAAA,EAAM;AAAA,IAC/C,EAAE,KAAA,EAAO,+BAAA,EAAiC,KAAA,EAAO,SAAA,EAAU;AAAA,IAC3D,EAAE,KAAA,EAAO,+BAAA,EAAiC,KAAA,EAAO,KAAA;AAAM,GACxD,CAAA;AAGD,EAAA,MAAM,QAAA,GAAW,OAAO,aAAA,CAAc,uCAAA,EAAyC,KAAK,CAAA;AAGpF,EAAA,MAAM,cAAA,GAAgD,WAClDG,aAAAA,CAAO,IAAA;AAAA,IACL,OAAO,aAA6B,yBAAA,EAA2B;AAAA,MAC7D,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,MAC/B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,MAC7B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,MAC/B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA;AAAM,KAC9B;AAAA,GACH,GACAA,cAAO,IAAA,EAAK;AAEhB,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAWA,cAAO,IAAA,EAAK;AAAA,IACvB,QAAA,EAAUA,aAAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC9B,WAAA,EAAa,KAAA;AAAA,IACb;AAAA,GACF;AACF,CAAC,CAAA;AAKI,IAAM,SAAA,GAAY,CAAC,IAAA,KACxBN,aAAAA,CAAO,IAAI,aAAa;AACtB,EAAA,MAAM,MAAA,GAASK,WAAU,IAAI,CAAA;AAE7B,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,eAAA,EAAgB;AAChB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,OAAOF,cAAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAC7C,IAAA,OAAOA,cAAAA,CAAQ,IAAI,EAAE,CAAA;AACrB,IAAA,eAAA,EAAgB;AAChB,IAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AACnB,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,UACJ,aAAA,IAAiB,MAAA,GAAS,OAAO,cAAA,KAAmB,MAAA,CAAO,OAAA;AAG7D,EAAA,OAAO,SAAS,OAAO,CAAA;AACzB,CAAC,CAAA;;;ACjMH,IAAM,OAAA,GAAU,OAAA;AAEhB,IAAM,YAAY,MAAY;AAC5B,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,oBAAA,EACQ,OAAO;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAkB5B,CAAA;AACD,CAAA;AAEA,IAAM,eAAe,MAAY;AAC/B,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,OAAO,CAAA,CAAE,CAAA;AACtC,CAAA;AAEA,IAAM,IAAA,GAAOH,aAAAA,CAAO,GAAA,CAAI,aAAa;AACnC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAEjC,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,CAAC,MAAM,IAAA,IAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,EAAU;AACjE,IAAA,SAAA,EAAU;AACV,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,KAAK,CAAC,CAAA,KAAM,QAAQ,IAAA,CAAK,CAAC,MAAM,WAAA,EAAa;AAC/C,IAAA,YAAA,EAAa;AACb,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA;AACtB,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAEhC,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,iBAAA;AACH,MAAA,OAAO,kBAAkB,WAAW,CAAA;AACpC,MAAA;AAAA,IAEF,KAAK,QAAA;AACH,MAAA,OAAO,UAAU,WAAW,CAAA;AAC5B,MAAA;AAAA,IAEF;AACE,MAAA,OAAOG,cAAAA,CAAQ,KAAA,CAAM,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AAClD,MAAA,SAAA,EAAU;AACV,MAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AAAA;AAEzB,CAAC,CAAA;AAEDH,aAAAA,CAAO,UAAA;AAAA,EACL,IAAA,CAAK,IAAA;AAAA,IACHA,aAAAA,CAAO,QAAA;AAAA,MAAS,CAAC,UACfG,cAAAA,CAAQ,KAAA,CAAM,UAAU,KAAA,CAAM,OAAO,EAAE,CAAA,CAAE,IAAA;AAAA,QACvCH,aAAAA,CAAO,OAAA;AAAA,UACLA,aAAAA,CAAO,KAAK,MAAM;AAChB,YAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AAAA,UACrB,CAAC;AAAA;AACH;AACF;AACF;AAEJ,CAAA","file":"bin.cjs","sourcesContent":["/**\n * Generate GraphQL SDL from an effect-gql schema builder.\n *\n * Usage:\n * effect-gql generate-schema <module-path> [options]\n *\n * The module should export one of:\n * - `builder` - A GraphQLSchemaBuilder instance\n * - `schema` - A GraphQLSchema instance\n * - `default` - Either of the above as default export\n */\n\nimport { Effect, Console } from \"effect\"\nimport {\n printSchema as defaultPrintSchema,\n lexicographicSortSchema as defaultLexicographicSortSchema,\n type GraphQLSchema,\n} from \"graphql\"\nimport * as fs from \"fs\"\nimport * as path from \"path\"\nimport { createRequire } from \"module\"\n\n// Create a require function for ESM compatibility (needed for cache clearing in watch mode)\nconst require = createRequire(import.meta.url)\n\ninterface GenerateOptions {\n /** Path to the schema module */\n modulePath: string\n /** Output file path (stdout if not specified) */\n output?: string\n /** Sort schema alphabetically */\n sort?: boolean\n /** Watch for changes */\n watch?: boolean\n}\n\nexport interface GraphQLUtilities {\n printSchema: (schema: GraphQLSchema) => string\n lexicographicSortSchema: (schema: GraphQLSchema) => GraphQLSchema\n}\n\n/** Default utilities using the CLI's bundled graphql package */\nconst defaultUtilities: GraphQLUtilities = {\n printSchema: defaultPrintSchema,\n lexicographicSortSchema: defaultLexicographicSortSchema,\n}\n\n/**\n * Load graphql utilities from the same location as @effect-gql/core uses.\n * This resolves the \"Cannot use GraphQLScalarType from another module\" error that occurs\n * when the CLI's graphql version differs from the user's project.\n *\n * The key insight is that the schema is built using @effect-gql/core, which internally\n * uses graphql. We need to use the same graphql instance that @effect-gql/core uses.\n *\n * IMPORTANT: We use dynamic import() instead of require() because graphql has separate\n * ESM (index.mjs) and CJS (index.js) entry points. If the schema module was loaded via\n * ESM (e.g., by vitest or tsx), we need to import the ESM version to get the same instance.\n *\n * @param modulePath - The absolute path to the schema module being loaded\n */\nconst loadGraphQLUtilities = (modulePath: string): Effect.Effect<GraphQLUtilities, Error> =>\n Effect.tryPromise({\n try: async () => {\n // Create a require function that resolves from the module's directory\n const moduleRequire = createRequire(modulePath)\n\n // First, find where @effect-gql/core is located (this is what the schema module uses)\n const corePath = moduleRequire.resolve(\"@effect-gql/core\")\n\n // Then resolve graphql path from @effect-gql/core's location\n const coreRequire = createRequire(corePath)\n const graphqlPath = coreRequire.resolve(\"graphql\")\n\n // Use dynamic import to get the ESM version (matches how the schema module loads it)\n const graphql = await import(graphqlPath)\n\n return {\n printSchema: graphql.printSchema,\n lexicographicSortSchema: graphql.lexicographicSortSchema,\n }\n },\n catch: (error) =>\n new Error(\n `Failed to load graphql from project. Ensure @effect-gql/core and graphql are installed: ${error}`\n ),\n })\n\n/**\n * Load a schema from a module path.\n * Supports both GraphQLSchemaBuilder and GraphQLSchema exports.\n */\nexport const loadSchema = (modulePath: string): Effect.Effect<GraphQLSchema, Error> =>\n Effect.gen(function* () {\n const absolutePath = path.resolve(process.cwd(), modulePath)\n\n // Validate file exists\n if (!fs.existsSync(absolutePath)) {\n return yield* Effect.fail(new Error(`File not found: ${absolutePath}`))\n }\n\n // Dynamic import (works with both ESM and CJS via tsx/ts-node)\n const module = yield* Effect.tryPromise({\n try: async () => {\n // Clear require cache for watch mode\n const resolved = require.resolve(absolutePath)\n delete require.cache[resolved]\n\n // Try dynamic import first (ESM), fall back to require (CJS)\n try {\n return await import(absolutePath)\n } catch {\n return require(absolutePath)\n }\n },\n catch: (error) => new Error(`Failed to load module: ${error}`),\n })\n\n // Look for builder or schema export\n const exported = module.builder ?? module.schema ?? module.default\n\n if (!exported) {\n return yield* Effect.fail(\n new Error(\n `Module must export 'builder' (GraphQLSchemaBuilder), 'schema' (GraphQLSchema), or a default export`\n )\n )\n }\n\n // If it's a builder, call buildSchema()\n if (typeof exported.buildSchema === \"function\") {\n return exported.buildSchema() as GraphQLSchema\n }\n\n // If it's already a GraphQLSchema\n if (exported.getQueryType && exported.getTypeMap) {\n return exported as GraphQLSchema\n }\n\n return yield* Effect.fail(\n new Error(`Export is not a GraphQLSchemaBuilder or GraphQLSchema. Got: ${typeof exported}`)\n )\n })\n\n/**\n * Generate SDL from a schema.\n *\n * When called from the CLI, pass utilities loaded from the user's project\n * to avoid graphql version mismatch issues. When called directly (e.g., in tests),\n * the bundled graphql utilities are used as defaults.\n */\nexport const generateSDL = (\n schema: GraphQLSchema,\n options: { sort?: boolean; utilities?: GraphQLUtilities } = {}\n): string => {\n const utilities = options.utilities ?? defaultUtilities\n const finalSchema = options.sort !== false ? utilities.lexicographicSortSchema(schema) : schema\n return utilities.printSchema(finalSchema)\n}\n\n/**\n * Generate SDL from a module path\n */\nexport const generateSDLFromModule = (\n modulePath: string,\n options: { sort?: boolean } = {}\n): Effect.Effect<string, Error> =>\n Effect.gen(function* () {\n const absolutePath = path.resolve(process.cwd(), modulePath)\n const utilities = yield* loadGraphQLUtilities(absolutePath)\n const schema = yield* loadSchema(modulePath)\n return generateSDL(schema, { ...options, utilities })\n })\n\n/**\n * Run the generate-schema command\n */\nconst run = (options: GenerateOptions): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const absolutePath = path.resolve(process.cwd(), options.modulePath)\n const utilities = yield* loadGraphQLUtilities(absolutePath)\n const schema = yield* loadSchema(options.modulePath)\n const sdl = generateSDL(schema, { sort: options.sort, utilities })\n\n if (options.output) {\n const outputPath = path.resolve(process.cwd(), options.output)\n fs.writeFileSync(outputPath, sdl)\n yield* Console.log(`Schema written to ${outputPath}`)\n } else {\n yield* Console.log(sdl)\n }\n })\n\n/**\n * Watch mode - regenerate on file changes\n */\nconst watch = (options: GenerateOptions): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const absolutePath = path.resolve(process.cwd(), options.modulePath)\n const dir = path.dirname(absolutePath)\n\n yield* Console.log(`Watching for changes in ${dir}...`)\n\n // Initial generation\n yield* run(options).pipe(Effect.catchAll((error) => Console.error(`Error: ${error.message}`)))\n\n // Watch for changes\n yield* Effect.async<void, Error>(() => {\n const watcher = fs.watch(dir, { recursive: true }, (_, filename) => {\n if (filename?.endsWith(\".ts\") || filename?.endsWith(\".js\")) {\n Effect.runPromise(\n run(options).pipe(\n Effect.tap(() => Console.log(`\\nRegenerated at ${new Date().toLocaleTimeString()}`)),\n Effect.catchAll((error) => Console.error(`Error: ${error.message}`))\n )\n )\n }\n })\n\n return Effect.sync(() => watcher.close())\n })\n })\n\n/**\n * Parse CLI arguments for generate-schema command\n */\nconst parseArgs = (args: string[]): GenerateOptions | { help: true } | { error: string } => {\n const positional: string[] = []\n let output: string | undefined\n let sort = true\n let watchMode = false\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n\n if (arg === \"-h\" || arg === \"--help\") {\n return { help: true }\n } else if (arg === \"-o\" || arg === \"--output\") {\n output = args[++i]\n } else if (arg === \"--no-sort\") {\n sort = false\n } else if (arg === \"-w\" || arg === \"--watch\") {\n watchMode = true\n } else if (!arg.startsWith(\"-\")) {\n positional.push(arg)\n } else {\n return { error: `Unknown option: ${arg}` }\n }\n }\n\n if (positional.length === 0) {\n return { error: \"Missing module path\" }\n }\n\n return {\n modulePath: positional[0],\n output,\n sort,\n watch: watchMode,\n }\n}\n\nexport const printGenerateSchemaHelp = (): void => {\n console.log(`\nUsage: effect-gql generate-schema <module-path> [options]\n\nGenerate GraphQL SDL from an effect-gql schema builder.\n\nArguments:\n module-path Path to the schema module (.ts or .js)\n\nOptions:\n -o, --output Write SDL to file instead of stdout\n --no-sort Don't sort schema alphabetically\n -w, --watch Watch for changes and regenerate\n -h, --help Show this help message\n\nExamples:\n effect-gql generate-schema ./src/schema.ts\n effect-gql generate-schema ./src/schema.ts -o schema.graphql\n effect-gql generate-schema ./src/schema.ts --watch -o schema.graphql\n\nThe module should export one of:\n - builder: A GraphQLSchemaBuilder instance\n - schema: A GraphQLSchema instance\n - default: Either of the above as default export\n`)\n}\n\n/**\n * Entry point for the generate-schema command\n */\nexport const runGenerateSchema = (args: string[]): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const parsed = parseArgs(args)\n\n if (\"help\" in parsed) {\n printGenerateSchemaHelp()\n return\n }\n\n if (\"error\" in parsed) {\n yield* Console.error(`Error: ${parsed.error}`)\n printGenerateSchemaHelp()\n process.exitCode = 1\n return\n }\n\n if (parsed.watch) {\n yield* watch(parsed)\n } else {\n yield* run(parsed)\n }\n })\n","/**\n * Type definitions for the create command\n */\n\nimport { Option } from \"effect\"\n\n/**\n * Supported server types for scaffolding\n */\nexport type ServerType = \"node\" | \"bun\" | \"express\" | \"web\"\n\n/**\n * Supported package managers\n */\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\"\n\n/**\n * Options for the create command\n */\nexport interface CreateOptions {\n /** Package/project name */\n readonly name: string\n /** Server type to scaffold */\n readonly serverType: ServerType\n /** Target directory (defaults to ./<name>) */\n readonly directory: Option.Option<string>\n /** Create as monorepo workspace package */\n readonly monorepo: Option.Option<boolean>\n /** Skip npm install */\n readonly skipInstall: boolean\n /** Package manager to use */\n readonly packageManager: Option.Option<PackageManager>\n}\n\n/**\n * Result of parsing CLI arguments\n */\nexport type ParsedArgs =\n | { readonly options: CreateOptions }\n | { readonly help: true }\n | { readonly interactive: true }\n | { readonly error: string }\n\n/**\n * Context passed to template generators\n */\nexport interface TemplateContext {\n /** Package name */\n readonly name: string\n /** Server type */\n readonly serverType: ServerType\n /** Whether creating as monorepo workspace package */\n readonly isMonorepo: boolean\n /** Package manager being used */\n readonly packageManager: PackageManager\n}\n\n/**\n * A generated file with its relative path and content\n */\nexport interface GeneratedFile {\n /** Relative path from project root */\n readonly path: string\n /** File content */\n readonly content: string\n}\n\n/**\n * Information about a detected monorepo\n */\nexport interface MonorepoInfo {\n /** Whether a monorepo was detected */\n readonly isMonorepo: boolean\n /** Detected package manager */\n readonly packageManager: Option.Option<PackageManager>\n /** Path to the workspace root */\n readonly workspacesRoot: Option.Option<string>\n}\n\n/**\n * All valid server types\n */\nexport const SERVER_TYPES: readonly ServerType[] = [\"node\", \"bun\", \"express\", \"web\"]\n\n/**\n * Check if a string is a valid server type\n */\nexport const isValidServerType = (value: string): value is ServerType =>\n SERVER_TYPES.includes(value as ServerType)\n\n/**\n * All valid package managers\n */\nexport const PACKAGE_MANAGERS: readonly PackageManager[] = [\"npm\", \"pnpm\", \"yarn\", \"bun\"]\n\n/**\n * Check if a string is a valid package manager\n */\nexport const isValidPackageManager = (value: string): value is PackageManager =>\n PACKAGE_MANAGERS.includes(value as PackageManager)\n","/**\n * CLI argument parsing for the create command\n */\n\nimport { Option } from \"effect\"\nimport type { CreateOptions, ParsedArgs, PackageManager, ServerType } from \"./types\"\nimport { isValidServerType, isValidPackageManager, SERVER_TYPES } from \"./types\"\n\n/**\n * Parse CLI arguments for the create command\n *\n * Usage:\n * effect-gql create <name> --server-type <type> [options]\n * effect-gql create --interactive\n */\nexport const parseArgs = (args: string[]): ParsedArgs => {\n const positional: string[] = []\n let serverType: ServerType | undefined\n let directory: Option.Option<string> = Option.none()\n let monorepo: Option.Option<boolean> = Option.none()\n let skipInstall = false\n let packageManager: Option.Option<PackageManager> = Option.none()\n let interactive = false\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n\n if (arg === \"-h\" || arg === \"--help\") {\n return { help: true }\n } else if (arg === \"-i\" || arg === \"--interactive\") {\n interactive = true\n } else if (arg === \"-s\" || arg === \"--server-type\") {\n const value = args[++i]\n if (!value) {\n return { error: \"Missing value for --server-type\" }\n }\n if (!isValidServerType(value)) {\n return {\n error: `Invalid server type: ${value}. Must be one of: ${SERVER_TYPES.join(\", \")}`,\n }\n }\n serverType = value\n } else if (arg === \"-d\" || arg === \"--directory\") {\n const value = args[++i]\n if (!value) {\n return { error: \"Missing value for --directory\" }\n }\n directory = Option.some(value)\n } else if (arg === \"--monorepo\") {\n monorepo = Option.some(true)\n } else if (arg === \"--skip-install\") {\n skipInstall = true\n } else if (arg === \"--package-manager\") {\n const value = args[++i]\n if (!value) {\n return { error: \"Missing value for --package-manager\" }\n }\n if (!isValidPackageManager(value)) {\n return { error: `Invalid package manager: ${value}. Must be one of: npm, pnpm, yarn, bun` }\n }\n packageManager = Option.some(value)\n } else if (!arg.startsWith(\"-\")) {\n positional.push(arg)\n } else {\n return { error: `Unknown option: ${arg}` }\n }\n }\n\n // If interactive mode, return early\n if (interactive) {\n return { interactive: true }\n }\n\n // If no args at all, default to interactive\n if (args.length === 0) {\n return { interactive: true }\n }\n\n // Validate required arguments\n if (positional.length === 0) {\n return {\n error:\n \"Missing project name. Use --interactive or provide: effect-gql create <name> --server-type <type>\",\n }\n }\n\n if (!serverType) {\n return { error: \"Missing --server-type. Must be one of: \" + SERVER_TYPES.join(\", \") }\n }\n\n const options: CreateOptions = {\n name: positional[0],\n serverType,\n directory,\n monorepo,\n skipInstall,\n packageManager,\n }\n\n return { options }\n}\n","/**\n * Package.json template generation\n */\n\nimport type { ServerType, TemplateContext } from \"../types\"\n\n/**\n * Current dependency versions\n * Keep in sync with the main packages\n */\nconst VERSIONS = {\n core: \"^1.3.2\",\n node: \"^1.3.2\",\n bun: \"^1.3.2\",\n express: \"^1.3.2\",\n web: \"^1.3.2\",\n effect: \"^3.19.0\",\n platform: \"^0.94.0\",\n platformNode: \"^0.104.0\",\n platformBun: \"^0.87.0\",\n graphql: \"^16.0.0\",\n expressLib: \"^5.0.0\",\n tsx: \"^4.19.0\",\n typescript: \"^5.0.0\",\n} as const\n\ninterface Dependencies {\n readonly dependencies: Record<string, string>\n readonly devDependencies: Record<string, string>\n}\n\n/**\n * Get dependencies for each server type\n */\nconst getDependencies = (serverType: ServerType, _isMonorepo: boolean): Dependencies => {\n // Always use published versions - workspace:* is only for effect-gql internal development\n const baseDeps: Record<string, string> = {\n \"@effect-gql/core\": VERSIONS.core,\n \"@effect/platform\": VERSIONS.platform,\n effect: VERSIONS.effect,\n graphql: VERSIONS.graphql,\n }\n\n const baseDevDeps: Record<string, string> = {\n tsx: VERSIONS.tsx,\n typescript: VERSIONS.typescript,\n }\n\n switch (serverType) {\n case \"node\":\n return {\n dependencies: {\n ...baseDeps,\n \"@effect-gql/node\": VERSIONS.node,\n \"@effect/platform-node\": VERSIONS.platformNode,\n },\n devDependencies: baseDevDeps,\n }\n\n case \"bun\":\n return {\n dependencies: {\n ...baseDeps,\n \"@effect-gql/bun\": VERSIONS.bun,\n \"@effect/platform-bun\": VERSIONS.platformBun,\n },\n devDependencies: {\n typescript: VERSIONS.typescript,\n // Bun has built-in TypeScript support, no tsx needed\n },\n }\n\n case \"express\":\n return {\n dependencies: {\n ...baseDeps,\n \"@effect-gql/express\": VERSIONS.express,\n express: VERSIONS.expressLib,\n },\n devDependencies: {\n ...baseDevDeps,\n \"@types/express\": \"^5.0.0\",\n },\n }\n\n case \"web\":\n return {\n dependencies: {\n ...baseDeps,\n \"@effect-gql/web\": VERSIONS.web,\n },\n devDependencies: baseDevDeps,\n }\n }\n}\n\n/**\n * Get scripts for each server type\n */\nconst getScripts = (serverType: ServerType): Record<string, string> => {\n switch (serverType) {\n case \"node\":\n return {\n start: \"tsx src/index.ts\",\n dev: \"tsx watch src/index.ts\",\n build: \"tsc\",\n typecheck: \"tsc --noEmit\",\n }\n\n case \"bun\":\n return {\n start: \"bun run src/index.ts\",\n dev: \"bun --watch src/index.ts\",\n build: \"bun build src/index.ts --outdir dist --target bun\",\n typecheck: \"tsc --noEmit\",\n }\n\n case \"express\":\n return {\n start: \"tsx src/index.ts\",\n dev: \"tsx watch src/index.ts\",\n build: \"tsc\",\n typecheck: \"tsc --noEmit\",\n }\n\n case \"web\":\n return {\n start: \"tsx src/index.ts\",\n dev: \"tsx watch src/index.ts\",\n build: \"tsc\",\n typecheck: \"tsc --noEmit\",\n // Users will typically add wrangler/deno commands as needed\n }\n }\n}\n\n/**\n * Generate package.json content\n */\nexport const generatePackageJson = (ctx: TemplateContext): string => {\n const deps = getDependencies(ctx.serverType, ctx.isMonorepo)\n\n const pkg = {\n name: ctx.name,\n version: \"0.0.1\",\n private: true,\n type: \"module\",\n scripts: getScripts(ctx.serverType),\n dependencies: deps.dependencies,\n devDependencies: deps.devDependencies,\n }\n\n return JSON.stringify(pkg, null, 2) + \"\\n\"\n}\n","/**\n * tsconfig.json template generation\n */\n\nimport type { TemplateContext } from \"../types\"\n\n/**\n * Generate tsconfig.json content\n */\nexport const generateTsConfig = (ctx: TemplateContext): string => {\n const config = ctx.isMonorepo\n ? {\n // In a monorepo, extend from root tsconfig\n extends: \"../../tsconfig.json\",\n compilerOptions: {\n outDir: \"./dist\",\n rootDir: \"./src\",\n noEmit: true,\n },\n include: [\"src/**/*\"],\n exclude: [\"node_modules\", \"dist\"],\n }\n : {\n // Standalone project config\n compilerOptions: {\n target: \"ES2022\",\n module: \"NodeNext\",\n moduleResolution: \"NodeNext\",\n lib: [\"ES2022\"],\n outDir: \"./dist\",\n rootDir: \"./src\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n declaration: true,\n declarationMap: true,\n sourceMap: true,\n noEmit: true,\n // Effect requires these for decorators\n experimentalDecorators: true,\n emitDecoratorMetadata: true,\n },\n include: [\"src/**/*\"],\n exclude: [\"node_modules\", \"dist\"],\n }\n\n return JSON.stringify(config, null, 2) + \"\\n\"\n}\n","/**\n * Server template generation for each server type\n */\n\nimport type { TemplateContext } from \"../types\"\n\n/**\n * Generate Node.js server template\n */\nconst generateNodeServer = (ctx: TemplateContext): string => `/**\n * ${ctx.name} - GraphQL Server\n *\n * A GraphQL server built with Effect GQL and Node.js.\n */\n\nimport { Effect, Layer } from \"effect\"\nimport * as S from \"effect/Schema\"\nimport { HttpRouter, HttpServerResponse } from \"@effect/platform\"\nimport { GraphQLSchemaBuilder, query, mutation, makeGraphQLRouter } from \"@effect-gql/core\"\nimport { serve } from \"@effect-gql/node\"\n\n// =============================================================================\n// Domain Models\n// =============================================================================\n\n/**\n * Define your types with Effect Schema.\n * This single definition is used for both TypeScript types AND GraphQL types.\n */\nconst User = S.Struct({\n id: S.String,\n name: S.String,\n email: S.String,\n})\n\ntype User = S.Schema.Type<typeof User>\n\n// =============================================================================\n// In-Memory Data Store (replace with your database)\n// =============================================================================\n\nconst users: User[] = [\n { id: \"1\", name: \"Alice\", email: \"alice@example.com\" },\n { id: \"2\", name: \"Bob\", email: \"bob@example.com\" },\n]\n\n// =============================================================================\n// GraphQL Schema\n// =============================================================================\n\nconst schema = GraphQLSchemaBuilder.empty\n .pipe(\n // Simple query\n query(\"hello\", {\n type: S.String,\n description: \"Returns a friendly greeting\",\n resolve: () => Effect.succeed(\"Hello from ${ctx.name}!\"),\n }),\n\n // Query with arguments\n query(\"user\", {\n args: S.Struct({ id: S.String }),\n type: S.NullOr(User),\n description: \"Get a user by ID\",\n resolve: (args) => Effect.succeed(users.find((u) => u.id === args.id) ?? null),\n }),\n\n // Query that returns a list\n query(\"users\", {\n type: S.Array(User),\n description: \"Get all users\",\n resolve: () => Effect.succeed(users),\n }),\n\n // Mutation\n mutation(\"createUser\", {\n args: S.Struct({\n name: S.String,\n email: S.String,\n }),\n type: User,\n description: \"Create a new user\",\n resolve: (args) =>\n Effect.sync(() => {\n const newUser: User = {\n id: String(users.length + 1),\n name: args.name,\n email: args.email,\n }\n users.push(newUser)\n return newUser\n }),\n })\n )\n .buildSchema()\n\n// =============================================================================\n// HTTP Router\n// =============================================================================\n\nconst graphqlRouter = makeGraphQLRouter(schema, Layer.empty, {\n path: \"/graphql\",\n graphiql: {\n path: \"/graphiql\",\n endpoint: \"/graphql\",\n },\n})\n\nconst router = HttpRouter.empty.pipe(\n HttpRouter.get(\"/health\", HttpServerResponse.json({ status: \"ok\" })),\n HttpRouter.concat(graphqlRouter)\n)\n\n// =============================================================================\n// Server Startup\n// =============================================================================\n\nserve(router, Layer.empty, {\n port: 4000,\n onStart: (url: string) => {\n console.log(\\`Server ready at \\${url}\\`)\n console.log(\\`GraphQL endpoint: \\${url}/graphql\\`)\n console.log(\\`GraphiQL playground: \\${url}/graphiql\\`)\n console.log(\\`Health check: \\${url}/health\\`)\n },\n})\n`\n\n/**\n * Generate Bun server template\n */\nconst generateBunServer = (ctx: TemplateContext): string => `/**\n * ${ctx.name} - GraphQL Server\n *\n * A GraphQL server built with Effect GQL and Bun.\n */\n\nimport { Effect, Layer } from \"effect\"\nimport * as S from \"effect/Schema\"\nimport { HttpRouter, HttpServerResponse } from \"@effect/platform\"\nimport { GraphQLSchemaBuilder, query, mutation, makeGraphQLRouter } from \"@effect-gql/core\"\nimport { serve } from \"@effect-gql/bun\"\n\n// =============================================================================\n// Domain Models\n// =============================================================================\n\nconst User = S.Struct({\n id: S.String,\n name: S.String,\n email: S.String,\n})\n\ntype User = S.Schema.Type<typeof User>\n\n// =============================================================================\n// In-Memory Data Store (replace with your database)\n// =============================================================================\n\nconst users: User[] = [\n { id: \"1\", name: \"Alice\", email: \"alice@example.com\" },\n { id: \"2\", name: \"Bob\", email: \"bob@example.com\" },\n]\n\n// =============================================================================\n// GraphQL Schema\n// =============================================================================\n\nconst schema = GraphQLSchemaBuilder.empty\n .pipe(\n query(\"hello\", {\n type: S.String,\n description: \"Returns a friendly greeting\",\n resolve: () => Effect.succeed(\"Hello from ${ctx.name}!\"),\n }),\n\n query(\"user\", {\n args: S.Struct({ id: S.String }),\n type: S.NullOr(User),\n description: \"Get a user by ID\",\n resolve: (args) => Effect.succeed(users.find((u) => u.id === args.id) ?? null),\n }),\n\n query(\"users\", {\n type: S.Array(User),\n description: \"Get all users\",\n resolve: () => Effect.succeed(users),\n }),\n\n mutation(\"createUser\", {\n args: S.Struct({\n name: S.String,\n email: S.String,\n }),\n type: User,\n description: \"Create a new user\",\n resolve: (args) =>\n Effect.sync(() => {\n const newUser: User = {\n id: String(users.length + 1),\n name: args.name,\n email: args.email,\n }\n users.push(newUser)\n return newUser\n }),\n })\n )\n .buildSchema()\n\n// =============================================================================\n// HTTP Router\n// =============================================================================\n\nconst graphqlRouter = makeGraphQLRouter(schema, Layer.empty, {\n path: \"/graphql\",\n graphiql: {\n path: \"/graphiql\",\n endpoint: \"/graphql\",\n },\n})\n\nconst router = HttpRouter.empty.pipe(\n HttpRouter.get(\"/health\", HttpServerResponse.json({ status: \"ok\" })),\n HttpRouter.concat(graphqlRouter)\n)\n\n// =============================================================================\n// Server Startup\n// =============================================================================\n\nserve(router, Layer.empty, {\n port: 4000,\n onStart: (url: string) => {\n console.log(\\`Server ready at \\${url}\\`)\n console.log(\\`GraphQL endpoint: \\${url}/graphql\\`)\n console.log(\\`GraphiQL playground: \\${url}/graphiql\\`)\n console.log(\\`Health check: \\${url}/health\\`)\n },\n})\n`\n\n/**\n * Generate Express server template\n */\nconst generateExpressServer = (ctx: TemplateContext): string => `/**\n * ${ctx.name} - GraphQL Server\n *\n * A GraphQL server built with Effect GQL and Express.\n */\n\nimport express from \"express\"\nimport { Effect, Layer } from \"effect\"\nimport * as S from \"effect/Schema\"\nimport { GraphQLSchemaBuilder, query, mutation, makeGraphQLRouter } from \"@effect-gql/core\"\nimport { toMiddleware } from \"@effect-gql/express\"\n\n// =============================================================================\n// Domain Models\n// =============================================================================\n\nconst User = S.Struct({\n id: S.String,\n name: S.String,\n email: S.String,\n})\n\ntype User = S.Schema.Type<typeof User>\n\n// =============================================================================\n// In-Memory Data Store (replace with your database)\n// =============================================================================\n\nconst users: User[] = [\n { id: \"1\", name: \"Alice\", email: \"alice@example.com\" },\n { id: \"2\", name: \"Bob\", email: \"bob@example.com\" },\n]\n\n// =============================================================================\n// GraphQL Schema\n// =============================================================================\n\nconst schema = GraphQLSchemaBuilder.empty\n .pipe(\n query(\"hello\", {\n type: S.String,\n description: \"Returns a friendly greeting\",\n resolve: () => Effect.succeed(\"Hello from ${ctx.name}!\"),\n }),\n\n query(\"user\", {\n args: S.Struct({ id: S.String }),\n type: S.NullOr(User),\n description: \"Get a user by ID\",\n resolve: (args) => Effect.succeed(users.find((u) => u.id === args.id) ?? null),\n }),\n\n query(\"users\", {\n type: S.Array(User),\n description: \"Get all users\",\n resolve: () => Effect.succeed(users),\n }),\n\n mutation(\"createUser\", {\n args: S.Struct({\n name: S.String,\n email: S.String,\n }),\n type: User,\n description: \"Create a new user\",\n resolve: (args) =>\n Effect.sync(() => {\n const newUser: User = {\n id: String(users.length + 1),\n name: args.name,\n email: args.email,\n }\n users.push(newUser)\n return newUser\n }),\n })\n )\n .buildSchema()\n\n// =============================================================================\n// GraphQL Router\n// =============================================================================\n\nconst graphqlRouter = makeGraphQLRouter(schema, Layer.empty, {\n path: \"/graphql\",\n graphiql: {\n path: \"/graphiql\",\n endpoint: \"/graphql\",\n },\n})\n\n// =============================================================================\n// Express App\n// =============================================================================\n\nconst app = express()\napp.use(express.json())\n\n// Health check\napp.get(\"/health\", (_, res) => {\n res.json({ status: \"ok\" })\n})\n\n// Mount GraphQL middleware\napp.use(toMiddleware(graphqlRouter, Layer.empty))\n\n// =============================================================================\n// Server Startup\n// =============================================================================\n\nconst port = process.env.PORT || 4000\n\napp.listen(port, () => {\n console.log(\\`Server ready at http://localhost:\\${port}\\`)\n console.log(\\`GraphQL endpoint: http://localhost:\\${port}/graphql\\`)\n console.log(\\`GraphiQL playground: http://localhost:\\${port}/graphiql\\`)\n console.log(\\`Health check: http://localhost:\\${port}/health\\`)\n})\n`\n\n/**\n * Generate Web handler template (for Cloudflare Workers, Deno, etc.)\n */\nconst generateWebHandler = (ctx: TemplateContext): string => `/**\n * ${ctx.name} - GraphQL Server\n *\n * A GraphQL server built with Effect GQL using Web standard APIs.\n * Compatible with Cloudflare Workers, Deno, and other WASM runtimes.\n */\n\nimport { Effect, Layer } from \"effect\"\nimport * as S from \"effect/Schema\"\nimport { GraphQLSchemaBuilder, query, mutation, makeGraphQLRouter } from \"@effect-gql/core\"\nimport { toHandler } from \"@effect-gql/web\"\n\n// =============================================================================\n// Domain Models\n// =============================================================================\n\nconst User = S.Struct({\n id: S.String,\n name: S.String,\n email: S.String,\n})\n\ntype User = S.Schema.Type<typeof User>\n\n// =============================================================================\n// In-Memory Data Store (replace with your database)\n// =============================================================================\n\nconst users: User[] = [\n { id: \"1\", name: \"Alice\", email: \"alice@example.com\" },\n { id: \"2\", name: \"Bob\", email: \"bob@example.com\" },\n]\n\n// =============================================================================\n// GraphQL Schema\n// =============================================================================\n\nconst schema = GraphQLSchemaBuilder.empty\n .pipe(\n query(\"hello\", {\n type: S.String,\n description: \"Returns a friendly greeting\",\n resolve: () => Effect.succeed(\"Hello from ${ctx.name}!\"),\n }),\n\n query(\"user\", {\n args: S.Struct({ id: S.String }),\n type: S.NullOr(User),\n description: \"Get a user by ID\",\n resolve: (args) => Effect.succeed(users.find((u) => u.id === args.id) ?? null),\n }),\n\n query(\"users\", {\n type: S.Array(User),\n description: \"Get all users\",\n resolve: () => Effect.succeed(users),\n }),\n\n mutation(\"createUser\", {\n args: S.Struct({\n name: S.String,\n email: S.String,\n }),\n type: User,\n description: \"Create a new user\",\n resolve: (args) =>\n Effect.sync(() => {\n const newUser: User = {\n id: String(users.length + 1),\n name: args.name,\n email: args.email,\n }\n users.push(newUser)\n return newUser\n }),\n })\n )\n .buildSchema()\n\n// =============================================================================\n// GraphQL Router\n// =============================================================================\n\nconst graphqlRouter = makeGraphQLRouter(schema, Layer.empty, {\n path: \"/graphql\",\n graphiql: {\n path: \"/graphiql\",\n endpoint: \"/graphql\",\n },\n})\n\n// =============================================================================\n// Web Handler\n// =============================================================================\n\nconst { handler } = toHandler(graphqlRouter, Layer.empty)\n\n/**\n * Export for Cloudflare Workers\n */\nexport default {\n async fetch(request: Request): Promise<Response> {\n const url = new URL(request.url)\n\n // Health check\n if (url.pathname === \"/health\") {\n return new Response(JSON.stringify({ status: \"ok\" }), {\n headers: { \"Content-Type\": \"application/json\" },\n })\n }\n\n return handler(request)\n },\n}\n\n/**\n * For local development with Deno or other runtimes, you can use:\n *\n * Deno.serve((request) => {\n * const url = new URL(request.url)\n * if (url.pathname === \"/health\") {\n * return new Response(JSON.stringify({ status: \"ok\" }), {\n * headers: { \"Content-Type\": \"application/json\" },\n * })\n * }\n * return handler(request)\n * })\n */\n`\n\n/**\n * Generate the server template based on server type\n */\nexport const generateServerTemplate = (ctx: TemplateContext): string => {\n switch (ctx.serverType) {\n case \"node\":\n return generateNodeServer(ctx)\n case \"bun\":\n return generateBunServer(ctx)\n case \"express\":\n return generateExpressServer(ctx)\n case \"web\":\n return generateWebHandler(ctx)\n }\n}\n","/**\n * Template orchestration - generates all project files\n */\n\nimport type { GeneratedFile, TemplateContext } from \"../types\"\nimport { generatePackageJson } from \"./package-json\"\nimport { generateTsConfig } from \"./tsconfig\"\nimport { generateServerTemplate } from \"./server\"\n\n/**\n * Generate a .gitignore file\n */\nconst generateGitignore = (): string => `# Dependencies\nnode_modules/\n\n# Build output\ndist/\n*.tsbuildinfo\n\n# IDE\n.idea/\n.vscode/\n*.swp\n*.swo\n\n# OS\n.DS_Store\nThumbs.db\n\n# Environment\n.env\n.env.local\n.env.*.local\n\n# Logs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Testing\ncoverage/\n`\n\n/**\n * Generate all project files\n */\nexport const generateProject = (ctx: TemplateContext): GeneratedFile[] => [\n {\n path: \"package.json\",\n content: generatePackageJson(ctx),\n },\n {\n path: \"tsconfig.json\",\n content: generateTsConfig(ctx),\n },\n {\n path: \"src/index.ts\",\n content: generateServerTemplate(ctx),\n },\n {\n path: \".gitignore\",\n content: generateGitignore(),\n },\n]\n\nexport { generatePackageJson } from \"./package-json\"\nexport { generateTsConfig } from \"./tsconfig\"\nexport { generateServerTemplate } from \"./server\"\n","/**\n * Monorepo detection and support\n */\n\nimport { Effect, Option } from \"effect\"\nimport * as fs from \"fs\"\nimport * as path from \"path\"\nimport type { MonorepoInfo, PackageManager } from \"./types\"\n\n/**\n * Check if a file exists\n */\nconst fileExists = (filePath: string): Effect.Effect<boolean, never> =>\n Effect.sync(() => fs.existsSync(filePath))\n\n/**\n * Read a file as string\n */\nconst readFile = (filePath: string): Effect.Effect<string, Error> =>\n Effect.try({\n try: () => fs.readFileSync(filePath, \"utf-8\"),\n catch: (error) => new Error(`Failed to read ${filePath}: ${error}`),\n })\n\n/**\n * Detect the package manager based on lock files\n */\nexport const detectPackageManager = (dir: string): Effect.Effect<PackageManager, never> =>\n Effect.gen(function* () {\n if (yield* fileExists(path.join(dir, \"pnpm-lock.yaml\"))) return \"pnpm\"\n if (yield* fileExists(path.join(dir, \"bun.lockb\"))) return \"bun\"\n if (yield* fileExists(path.join(dir, \"yarn.lock\"))) return \"yarn\"\n return \"npm\"\n })\n\n/**\n * Detect if we're inside a monorepo and gather info\n *\n * Walks up the directory tree looking for:\n * - pnpm-workspace.yaml (pnpm workspaces)\n * - package.json with \"workspaces\" field (npm/yarn workspaces)\n * - turbo.json (Turborepo)\n */\nexport const detectMonorepo = (targetDir: string): Effect.Effect<MonorepoInfo, never> =>\n Effect.gen(function* () {\n // Start from the parent of the target directory\n let currentDir = path.dirname(path.resolve(targetDir))\n const root = path.parse(currentDir).root\n\n while (currentDir !== root) {\n // Check for pnpm-workspace.yaml\n const pnpmWorkspacePath = path.join(currentDir, \"pnpm-workspace.yaml\")\n if (yield* fileExists(pnpmWorkspacePath)) {\n return {\n isMonorepo: true,\n packageManager: Option.some(\"pnpm\" as PackageManager),\n workspacesRoot: Option.some(currentDir),\n }\n }\n\n // Check for package.json with workspaces\n const pkgPath = path.join(currentDir, \"package.json\")\n if (yield* fileExists(pkgPath)) {\n const content = yield* readFile(pkgPath).pipe(Effect.catchAll(() => Effect.succeed(\"\")))\n if (content) {\n try {\n const pkg = JSON.parse(content)\n if (pkg.workspaces) {\n const pm = yield* detectPackageManager(currentDir)\n return {\n isMonorepo: true,\n packageManager: Option.some(pm),\n workspacesRoot: Option.some(currentDir),\n }\n }\n } catch {\n // Invalid JSON, continue\n }\n }\n }\n\n // Check for turbo.json\n const turboPath = path.join(currentDir, \"turbo.json\")\n if (yield* fileExists(turboPath)) {\n const pm = yield* detectPackageManager(currentDir)\n return {\n isMonorepo: true,\n packageManager: Option.some(pm),\n workspacesRoot: Option.some(currentDir),\n }\n }\n\n // Move up one directory\n currentDir = path.dirname(currentDir)\n }\n\n // No monorepo detected\n return {\n isMonorepo: false,\n packageManager: Option.none(),\n workspacesRoot: Option.none(),\n }\n })\n\n/**\n * Get the install command for a package manager\n */\nexport const getInstallCommand = (pm: PackageManager): string => {\n switch (pm) {\n case \"npm\":\n return \"npm install\"\n case \"pnpm\":\n return \"pnpm install\"\n case \"yarn\":\n return \"yarn\"\n case \"bun\":\n return \"bun install\"\n }\n}\n\n/**\n * Get the run command prefix for a package manager\n */\nexport const getRunPrefix = (pm: PackageManager): string => {\n switch (pm) {\n case \"npm\":\n return \"npm run\"\n case \"pnpm\":\n return \"pnpm\"\n case \"yarn\":\n return \"yarn\"\n case \"bun\":\n return \"bun run\"\n }\n}\n","/**\n * Project scaffolding logic\n */\n\nimport { Effect, Console, Option, pipe } from \"effect\"\nimport * as fs from \"fs\"\nimport * as path from \"path\"\nimport { spawn } from \"child_process\"\nimport type { CreateOptions, TemplateContext, PackageManager } from \"./types\"\nimport { generateProject } from \"./templates\"\nimport { detectMonorepo, detectPackageManager, getInstallCommand, getRunPrefix } from \"./monorepo\"\n\n/**\n * Check if a directory exists and is empty (or doesn't exist)\n */\nconst validateDirectory = (targetDir: string): Effect.Effect<void, Error> =>\n Effect.try({\n try: () => {\n if (fs.existsSync(targetDir)) {\n const files = fs.readdirSync(targetDir)\n if (files.length > 0) {\n throw new Error(`Directory ${targetDir} is not empty`)\n }\n }\n },\n catch: (error) =>\n error instanceof Error ? error : new Error(`Failed to validate directory: ${error}`),\n })\n\n/**\n * Create a directory and all parent directories\n */\nconst mkdirp = (dir: string): Effect.Effect<void, Error> =>\n Effect.try({\n try: () => fs.mkdirSync(dir, { recursive: true }),\n catch: (error) => new Error(`Failed to create directory ${dir}: ${error}`),\n })\n\n/**\n * Write a file, creating parent directories as needed\n */\nconst writeFile = (filePath: string, content: string): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n yield* mkdirp(path.dirname(filePath))\n yield* Effect.try({\n try: () => fs.writeFileSync(filePath, content, \"utf-8\"),\n catch: (error) => new Error(`Failed to write ${filePath}: ${error}`),\n })\n })\n\n/**\n * Run a shell command\n */\nconst runCommand = (command: string, args: string[], cwd: string): Effect.Effect<void, Error> =>\n Effect.async<void, Error>((resume) => {\n const child = spawn(command, args, {\n cwd,\n stdio: \"inherit\",\n shell: true,\n })\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resume(Effect.succeed(undefined))\n } else {\n resume(Effect.fail(new Error(`Command failed with exit code ${code}`)))\n }\n })\n\n child.on(\"error\", (error) => {\n resume(Effect.fail(new Error(`Failed to run command: ${error.message}`)))\n })\n\n return Effect.sync(() => {\n child.kill()\n })\n })\n\n/**\n * Install dependencies using the detected package manager\n */\nconst installDependencies = (\n targetDir: string,\n packageManager: PackageManager\n): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n yield* Console.log(\"\")\n yield* Console.log(\"Installing dependencies...\")\n\n const installCmd = getInstallCommand(packageManager)\n const [cmd, ...args] = installCmd.split(\" \")\n\n yield* runCommand(cmd, args, targetDir)\n\n yield* Console.log(\"Dependencies installed successfully!\")\n })\n\n/**\n * Print success message with next steps\n */\nconst printSuccessMessage = (ctx: TemplateContext, targetDir: string): Effect.Effect<void, never> =>\n Effect.gen(function* () {\n const relativePath = path.relative(process.cwd(), targetDir) || \".\"\n const runPrefix = getRunPrefix(ctx.packageManager)\n\n yield* Console.log(\"\")\n yield* Console.log(`Successfully created ${ctx.name}!`)\n yield* Console.log(\"\")\n yield* Console.log(\"Next steps:\")\n yield* Console.log(` cd ${relativePath}`)\n yield* Console.log(` ${runPrefix} dev`)\n yield* Console.log(\"\")\n yield* Console.log(\"Your GraphQL server will be available at:\")\n yield* Console.log(\" http://localhost:4000/graphql\")\n yield* Console.log(\" http://localhost:4000/graphiql (playground)\")\n yield* Console.log(\"\")\n })\n\n/**\n * Main scaffolding function\n */\nexport const scaffold = (options: CreateOptions): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const targetDir = pipe(\n options.directory,\n Option.map((dir) => path.resolve(process.cwd(), dir)),\n Option.getOrElse(() => path.resolve(process.cwd(), options.name))\n )\n\n // Detect monorepo context\n const monorepoInfo = yield* detectMonorepo(targetDir)\n\n // Determine if we're in monorepo mode\n // Use explicit option if provided, otherwise use detected value\n const isMonorepo = pipe(\n options.monorepo,\n Option.getOrElse(() => monorepoInfo.isMonorepo)\n )\n\n // Determine package manager\n // Priority: explicit option > detected from monorepo > detected from cwd\n const packageManager = yield* pipe(\n options.packageManager,\n Option.orElse(() => monorepoInfo.packageManager),\n Option.match({\n onNone: () => detectPackageManager(process.cwd()),\n onSome: (pm) => Effect.succeed(pm),\n })\n )\n\n // Build template context\n const ctx: TemplateContext = {\n name: options.name,\n serverType: options.serverType,\n isMonorepo,\n packageManager,\n }\n\n yield* Console.log(\"\")\n yield* Console.log(`Creating ${ctx.name} with ${ctx.serverType} server...`)\n\n // Validate target directory\n yield* validateDirectory(targetDir)\n\n // Generate all files\n const files = generateProject(ctx)\n\n // Write files\n for (const file of files) {\n const filePath = path.join(targetDir, file.path)\n yield* writeFile(filePath, file.content)\n yield* Console.log(` Created ${file.path}`)\n }\n\n // Install dependencies unless skipped\n if (!options.skipInstall) {\n yield* installDependencies(targetDir, packageManager).pipe(\n Effect.catchAll((error) =>\n Console.log(`Warning: Failed to install dependencies: ${error.message}`).pipe(\n Effect.andThen(\n Console.log(\n \"You can install them manually by running: \" + getInstallCommand(packageManager)\n )\n )\n )\n )\n )\n } else {\n yield* Console.log(\"\")\n yield* Console.log(\n `Skipping dependency installation. Run '${getInstallCommand(packageManager)}' to install.`\n )\n }\n\n // Print success message\n yield* printSuccessMessage(ctx, targetDir)\n })\n","/**\n * Create command - scaffold a new Effect GraphQL project\n *\n * Usage:\n * effect-gql create <name> --server-type <type> [options]\n * effect-gql create --interactive\n *\n * Server types:\n * node - Node.js server using @effect-gql/node\n * bun - Bun server using @effect-gql/bun\n * express - Express middleware using @effect-gql/express\n * web - Web standard handler using @effect-gql/web\n */\n\nimport { Effect, Console, Option } from \"effect\"\nimport * as readline from \"readline\"\nimport type { CreateOptions, ServerType, PackageManager } from \"./types\"\nimport { parseArgs } from \"./args\"\nimport { scaffold } from \"./scaffolder\"\n\n/**\n * Print help for the create command\n */\nexport const printCreateHelp = (): void => {\n console.log(`\nUsage: effect-gql create <name> --server-type <type> [options]\n\nCreate a new Effect GraphQL project.\n\nArguments:\n name Package/project name\n\nRequired Options:\n -s, --server-type Server type: node, bun, express, web\n\nOptional Options:\n -d, --directory Target directory (default: ./<name>)\n --monorepo Create as workspace package (auto-detected)\n --skip-install Skip dependency installation\n --package-manager Package manager: npm, pnpm, yarn, bun\n -i, --interactive Interactive mode (prompts for options)\n -h, --help Show this help message\n\nServer Types:\n node Node.js server using @effect-gql/node\n Best for: General Node.js deployments\n\n bun Bun server using @effect-gql/bun\n Best for: Bun runtime with native WebSocket support\n\n express Express middleware using @effect-gql/express\n Best for: Integrating into existing Express apps\n\n web Web standard handler using @effect-gql/web\n Best for: Cloudflare Workers, Deno, edge runtimes\n\nExamples:\n effect-gql create my-api --server-type node\n effect-gql create my-api -s bun\n effect-gql create my-api -s express -d ./packages/api --monorepo\n effect-gql create my-api -s web --skip-install\n effect-gql create --interactive\n`)\n}\n\n/**\n * Simple prompt helper using readline\n */\nconst prompt = (question: string): Effect.Effect<string, Error> =>\n Effect.async<string, Error>((resume) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n })\n\n rl.question(question, (answer) => {\n rl.close()\n resume(Effect.succeed(answer.trim()))\n })\n\n rl.on(\"error\", (error) => {\n rl.close()\n resume(Effect.fail(new Error(`Input error: ${error.message}`)))\n })\n\n return Effect.sync(() => rl.close())\n })\n\n/**\n * Select from a list of options\n */\nconst selectPrompt = <T extends string>(\n question: string,\n options: readonly { label: string; value: T }[]\n): Effect.Effect<T, Error> =>\n Effect.gen(function* () {\n yield* Console.log(question)\n options.forEach((opt, i) => {\n console.log(` ${i + 1}) ${opt.label}`)\n })\n\n const answer = yield* prompt(\"Enter number: \")\n const index = parseInt(answer, 10) - 1\n\n if (isNaN(index) || index < 0 || index >= options.length) {\n yield* Console.log(`Invalid selection. Please enter 1-${options.length}.`)\n return yield* selectPrompt(question, options)\n }\n\n return options[index].value\n })\n\n/**\n * Yes/no confirmation prompt\n */\nconst confirmPrompt = (question: string, defaultValue: boolean): Effect.Effect<boolean, Error> =>\n Effect.gen(function* () {\n const hint = defaultValue ? \"[Y/n]\" : \"[y/N]\"\n const answer = yield* prompt(`${question} ${hint} `)\n\n if (answer === \"\") return defaultValue\n const lower = answer.toLowerCase()\n if (lower === \"y\" || lower === \"yes\") return true\n if (lower === \"n\" || lower === \"no\") return false\n\n yield* Console.log(\"Please answer 'y' or 'n'.\")\n return yield* confirmPrompt(question, defaultValue)\n })\n\n/**\n * Run interactive mode to gather options\n */\nconst runInteractive = (): Effect.Effect<CreateOptions, Error> =>\n Effect.gen(function* () {\n yield* Console.log(\"\")\n yield* Console.log(\"Create a new Effect GraphQL project\")\n yield* Console.log(\"====================================\")\n yield* Console.log(\"\")\n\n // Get project name\n const name = yield* prompt(\"Project name: \")\n if (!name) {\n return yield* Effect.fail(new Error(\"Project name is required\"))\n }\n\n // Validate name (basic npm package name validation)\n if (!/^(@[a-z0-9-~][a-z0-9-._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(name)) {\n yield* Console.log(\"Warning: Name may not be a valid npm package name.\")\n }\n\n // Get server type\n const serverType = yield* selectPrompt<ServerType>(\"Select server type:\", [\n { label: \"Node.js (@effect-gql/node)\", value: \"node\" },\n { label: \"Bun (@effect-gql/bun)\", value: \"bun\" },\n { label: \"Express (@effect-gql/express)\", value: \"express\" },\n { label: \"Web/Workers (@effect-gql/web)\", value: \"web\" },\n ])\n\n // Ask about monorepo\n const monorepo = yield* confirmPrompt(\"Create as monorepo workspace package?\", false)\n\n // Ask about package manager if monorepo\n const packageManager: Option.Option<PackageManager> = monorepo\n ? Option.some(\n yield* selectPrompt<PackageManager>(\"Select package manager:\", [\n { label: \"pnpm\", value: \"pnpm\" },\n { label: \"npm\", value: \"npm\" },\n { label: \"yarn\", value: \"yarn\" },\n { label: \"bun\", value: \"bun\" },\n ])\n )\n : Option.none()\n\n return {\n name,\n serverType,\n directory: Option.none(),\n monorepo: Option.some(monorepo),\n skipInstall: false,\n packageManager,\n }\n })\n\n/**\n * Entry point for the create command\n */\nexport const runCreate = (args: string[]): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const parsed = parseArgs(args)\n\n if (\"help\" in parsed) {\n printCreateHelp()\n return\n }\n\n if (\"error\" in parsed) {\n yield* Console.error(`Error: ${parsed.error}`)\n yield* Console.log(\"\")\n printCreateHelp()\n process.exitCode = 1\n return\n }\n\n // Get options either from args or interactive mode\n const options: CreateOptions =\n \"interactive\" in parsed ? yield* runInteractive() : parsed.options\n\n // Run scaffolding\n yield* scaffold(options)\n })\n\n// Re-export types for programmatic use\nexport type { CreateOptions, ServerType, PackageManager } from \"./types\"\nexport { SERVER_TYPES, isValidServerType } from \"./types\"\nexport { scaffold } from \"./scaffolder\"\n","#!/usr/bin/env node\n/**\n * Effect GraphQL CLI\n *\n * Usage:\n * effect-gql <command> [options]\n *\n * Commands:\n * generate-schema Generate GraphQL SDL from a schema module\n * create Create a new Effect GraphQL project (coming soon)\n */\n\nimport { Effect, Console } from \"effect\"\nimport { runGenerateSchema } from \"./commands/generate-schema\"\nimport { runCreate } from \"./commands/create\"\n\nconst VERSION = \"0.1.0\"\n\nconst printHelp = (): void => {\n console.log(`\nEffect GraphQL CLI v${VERSION}\n\nUsage: effect-gql <command> [options]\n\nCommands:\n generate-schema Generate GraphQL SDL from a schema module\n create Create a new Effect GraphQL project\n\nOptions:\n -h, --help Show this help message\n -v, --version Show version number\n\nExamples:\n effect-gql generate-schema ./src/schema.ts\n effect-gql generate-schema ./src/schema.ts -o schema.graphql\n effect-gql create my-app --server-type node\n\nRun 'effect-gql <command> --help' for command-specific help.\n`)\n}\n\nconst printVersion = (): void => {\n console.log(`effect-gql v${VERSION}`)\n}\n\nconst main = Effect.gen(function* () {\n const args = process.argv.slice(2)\n\n if (args.length === 0 || args[0] === \"-h\" || args[0] === \"--help\") {\n printHelp()\n return\n }\n\n if (args[0] === \"-v\" || args[0] === \"--version\") {\n printVersion()\n return\n }\n\n const command = args[0]\n const commandArgs = args.slice(1)\n\n switch (command) {\n case \"generate-schema\":\n yield* runGenerateSchema(commandArgs)\n break\n\n case \"create\":\n yield* runCreate(commandArgs)\n break\n\n default:\n yield* Console.error(`Unknown command: ${command}`)\n printHelp()\n process.exitCode = 1\n }\n})\n\nEffect.runPromise(\n main.pipe(\n Effect.catchAll((error) =>\n Console.error(`Error: ${error.message}`).pipe(\n Effect.andThen(\n Effect.sync(() => {\n process.exitCode = 1\n })\n )\n )\n )\n )\n)\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/generate-schema.ts","../src/commands/create/types.ts","../src/commands/create/args.ts","../src/commands/create/templates/package-json.ts","../src/commands/create/templates/tsconfig.ts","../src/commands/create/templates/server.ts","../src/commands/create/templates/index.ts","../src/commands/create/monorepo.ts","../src/commands/create/scaffolder.ts","../src/commands/create/index.ts","../src/bin.ts"],"names":["require","createRequire","defaultPrintSchema","defaultLexicographicSortSchema","Effect","path","fs","Console","watch","parseArgs","Option","fs2","path2","fs3","path3","spawn","pipe","readline","spawnSync"],"mappings":"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","file":"bin.cjs","sourcesContent":["/**\n * Generate GraphQL SDL from an effect-gql schema builder.\n *\n * Usage:\n * effect-gql generate-schema <module-path> [options]\n *\n * The module should export one of:\n * - `builder` - A GraphQLSchemaBuilder instance\n * - `schema` - A GraphQLSchema instance\n * - `default` - Either of the above as default export\n */\n\nimport { Effect, Console } from \"effect\"\nimport {\n printSchema as defaultPrintSchema,\n lexicographicSortSchema as defaultLexicographicSortSchema,\n type GraphQLSchema,\n} from \"graphql\"\nimport * as fs from \"fs\"\nimport * as path from \"path\"\nimport { createRequire } from \"module\"\n\n// Create a require function for ESM compatibility (needed for cache clearing in watch mode)\nconst require = createRequire(import.meta.url)\n\ninterface GenerateOptions {\n /** Path to the schema module */\n modulePath: string\n /** Output file path (stdout if not specified) */\n output?: string\n /** Sort schema alphabetically */\n sort?: boolean\n /** Watch for changes */\n watch?: boolean\n}\n\nexport interface GraphQLUtilities {\n printSchema: (schema: GraphQLSchema) => string\n lexicographicSortSchema: (schema: GraphQLSchema) => GraphQLSchema\n}\n\n/** Default utilities using the CLI's bundled graphql package */\nconst defaultUtilities: GraphQLUtilities = {\n printSchema: defaultPrintSchema,\n lexicographicSortSchema: defaultLexicographicSortSchema,\n}\n\n/**\n * Load graphql utilities from the same location as @effect-gql/core uses.\n * This resolves the \"Cannot use GraphQLScalarType from another module\" error that occurs\n * when the CLI's graphql version differs from the user's project.\n *\n * The key insight is that the schema is built using @effect-gql/core, which internally\n * uses graphql. We need to use the same graphql instance that @effect-gql/core uses.\n *\n * IMPORTANT: We use dynamic import() instead of require() because graphql has separate\n * ESM (index.mjs) and CJS (index.js) entry points. If the schema module was loaded via\n * ESM (e.g., by vitest or tsx), we need to import the ESM version to get the same instance.\n *\n * @param modulePath - The absolute path to the schema module being loaded\n */\nconst loadGraphQLUtilities = (modulePath: string): Effect.Effect<GraphQLUtilities, Error> =>\n Effect.tryPromise({\n try: async () => {\n // Create a require function that resolves from the module's directory\n const moduleRequire = createRequire(modulePath)\n\n // First, find where @effect-gql/core is located (this is what the schema module uses)\n const corePath = moduleRequire.resolve(\"@effect-gql/core\")\n\n // Then resolve graphql path from @effect-gql/core's location\n const coreRequire = createRequire(corePath)\n const graphqlPath = coreRequire.resolve(\"graphql\")\n\n // Use dynamic import to get the ESM version (matches how the schema module loads it)\n const graphql = await import(graphqlPath)\n\n return {\n printSchema: graphql.printSchema,\n lexicographicSortSchema: graphql.lexicographicSortSchema,\n }\n },\n catch: (error) =>\n new Error(\n `Failed to load graphql from project. Ensure @effect-gql/core and graphql are installed: ${error}`\n ),\n })\n\n/**\n * Load a schema from a module path.\n * Supports both GraphQLSchemaBuilder and GraphQLSchema exports.\n */\nexport const loadSchema = (modulePath: string): Effect.Effect<GraphQLSchema, Error> =>\n Effect.gen(function* () {\n const absolutePath = path.resolve(process.cwd(), modulePath)\n\n // Validate file exists\n if (!fs.existsSync(absolutePath)) {\n return yield* Effect.fail(new Error(`File not found: ${absolutePath}`))\n }\n\n // Dynamic import (works with both ESM and CJS via tsx/ts-node)\n const module = yield* Effect.tryPromise({\n try: async () => {\n // Clear require cache for watch mode\n const resolved = require.resolve(absolutePath)\n delete require.cache[resolved]\n\n // Try dynamic import first (ESM), fall back to require (CJS)\n try {\n return await import(absolutePath)\n } catch {\n return require(absolutePath)\n }\n },\n catch: (error) => new Error(`Failed to load module: ${error}`),\n })\n\n // Look for builder or schema export\n const exported = module.builder ?? module.schema ?? module.default\n\n if (!exported) {\n return yield* Effect.fail(\n new Error(\n `Module must export 'builder' (GraphQLSchemaBuilder), 'schema' (GraphQLSchema), or a default export`\n )\n )\n }\n\n // If it's a builder, call buildSchema()\n if (typeof exported.buildSchema === \"function\") {\n return exported.buildSchema() as GraphQLSchema\n }\n\n // If it's already a GraphQLSchema\n if (exported.getQueryType && exported.getTypeMap) {\n return exported as GraphQLSchema\n }\n\n return yield* Effect.fail(\n new Error(`Export is not a GraphQLSchemaBuilder or GraphQLSchema. Got: ${typeof exported}`)\n )\n })\n\n/**\n * Generate SDL from a schema.\n *\n * When called from the CLI, pass utilities loaded from the user's project\n * to avoid graphql version mismatch issues. When called directly (e.g., in tests),\n * the bundled graphql utilities are used as defaults.\n */\nexport const generateSDL = (\n schema: GraphQLSchema,\n options: { sort?: boolean; utilities?: GraphQLUtilities } = {}\n): string => {\n const utilities = options.utilities ?? defaultUtilities\n const finalSchema = options.sort !== false ? utilities.lexicographicSortSchema(schema) : schema\n return utilities.printSchema(finalSchema)\n}\n\n/**\n * Generate SDL from a module path\n */\nexport const generateSDLFromModule = (\n modulePath: string,\n options: { sort?: boolean } = {}\n): Effect.Effect<string, Error> =>\n Effect.gen(function* () {\n const absolutePath = path.resolve(process.cwd(), modulePath)\n const utilities = yield* loadGraphQLUtilities(absolutePath)\n const schema = yield* loadSchema(modulePath)\n return generateSDL(schema, { ...options, utilities })\n })\n\n/**\n * Run the generate-schema command\n */\nconst run = (options: GenerateOptions): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const absolutePath = path.resolve(process.cwd(), options.modulePath)\n const utilities = yield* loadGraphQLUtilities(absolutePath)\n const schema = yield* loadSchema(options.modulePath)\n const sdl = generateSDL(schema, { sort: options.sort, utilities })\n\n if (options.output) {\n const outputPath = path.resolve(process.cwd(), options.output)\n fs.writeFileSync(outputPath, sdl)\n yield* Console.log(`Schema written to ${outputPath}`)\n } else {\n yield* Console.log(sdl)\n }\n })\n\n/**\n * Watch mode - regenerate on file changes\n */\nconst watch = (options: GenerateOptions): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const absolutePath = path.resolve(process.cwd(), options.modulePath)\n const dir = path.dirname(absolutePath)\n\n yield* Console.log(`Watching for changes in ${dir}...`)\n\n // Initial generation\n yield* run(options).pipe(Effect.catchAll((error) => Console.error(`Error: ${error.message}`)))\n\n // Watch for changes\n yield* Effect.async<void, Error>(() => {\n const watcher = fs.watch(dir, { recursive: true }, (_, filename) => {\n if (filename?.endsWith(\".ts\") || filename?.endsWith(\".js\")) {\n Effect.runPromise(\n run(options).pipe(\n Effect.tap(() => Console.log(`\\nRegenerated at ${new Date().toLocaleTimeString()}`)),\n Effect.catchAll((error) => Console.error(`Error: ${error.message}`))\n )\n )\n }\n })\n\n return Effect.sync(() => watcher.close())\n })\n })\n\n/**\n * Parse CLI arguments for generate-schema command\n */\nconst parseArgs = (args: string[]): GenerateOptions | { help: true } | { error: string } => {\n const positional: string[] = []\n let output: string | undefined\n let sort = true\n let watchMode = false\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n\n if (arg === \"-h\" || arg === \"--help\") {\n return { help: true }\n } else if (arg === \"-o\" || arg === \"--output\") {\n output = args[++i]\n } else if (arg === \"--no-sort\") {\n sort = false\n } else if (arg === \"-w\" || arg === \"--watch\") {\n watchMode = true\n } else if (!arg.startsWith(\"-\")) {\n positional.push(arg)\n } else {\n return { error: `Unknown option: ${arg}` }\n }\n }\n\n if (positional.length === 0) {\n return { error: \"Missing module path\" }\n }\n\n return {\n modulePath: positional[0],\n output,\n sort,\n watch: watchMode,\n }\n}\n\nexport const printGenerateSchemaHelp = (): void => {\n console.log(`\nUsage: effect-gql generate-schema <module-path> [options]\n\nGenerate GraphQL SDL from an effect-gql schema builder.\n\nArguments:\n module-path Path to the schema module (.ts or .js)\n\nOptions:\n -o, --output Write SDL to file instead of stdout\n --no-sort Don't sort schema alphabetically\n -w, --watch Watch for changes and regenerate\n -h, --help Show this help message\n\nExamples:\n effect-gql generate-schema ./src/schema.ts\n effect-gql generate-schema ./src/schema.ts -o schema.graphql\n effect-gql generate-schema ./src/schema.ts --watch -o schema.graphql\n\nThe module should export one of:\n - builder: A GraphQLSchemaBuilder instance\n - schema: A GraphQLSchema instance\n - default: Either of the above as default export\n`)\n}\n\n/**\n * Entry point for the generate-schema command\n */\nexport const runGenerateSchema = (args: string[]): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const parsed = parseArgs(args)\n\n if (\"help\" in parsed) {\n printGenerateSchemaHelp()\n return\n }\n\n if (\"error\" in parsed) {\n yield* Console.error(`Error: ${parsed.error}`)\n printGenerateSchemaHelp()\n process.exitCode = 1\n return\n }\n\n if (parsed.watch) {\n yield* watch(parsed)\n } else {\n yield* run(parsed)\n }\n })\n","/**\n * Type definitions for the create command\n */\n\nimport { Option } from \"effect\"\n\n/**\n * Supported server types for scaffolding\n */\nexport type ServerType = \"node\" | \"bun\" | \"express\" | \"web\"\n\n/**\n * Supported package managers\n */\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\"\n\n/**\n * Options for the create command\n */\nexport interface CreateOptions {\n /** Package/project name */\n readonly name: string\n /** Server type to scaffold */\n readonly serverType: ServerType\n /** Target directory (defaults to ./<name>) */\n readonly directory: Option.Option<string>\n /** Create as monorepo workspace package */\n readonly monorepo: Option.Option<boolean>\n /** Skip npm install */\n readonly skipInstall: boolean\n /** Package manager to use */\n readonly packageManager: Option.Option<PackageManager>\n}\n\n/**\n * Result of parsing CLI arguments\n */\nexport type ParsedArgs =\n | { readonly options: CreateOptions }\n | { readonly help: true }\n | { readonly interactive: true }\n | { readonly error: string }\n\n/**\n * Context passed to template generators\n */\nexport interface TemplateContext {\n /** Package name */\n readonly name: string\n /** Server type */\n readonly serverType: ServerType\n /** Whether creating as monorepo workspace package */\n readonly isMonorepo: boolean\n /** Package manager being used */\n readonly packageManager: PackageManager\n}\n\n/**\n * A generated file with its relative path and content\n */\nexport interface GeneratedFile {\n /** Relative path from project root */\n readonly path: string\n /** File content */\n readonly content: string\n}\n\n/**\n * Information about a detected monorepo\n */\nexport interface MonorepoInfo {\n /** Whether a monorepo was detected */\n readonly isMonorepo: boolean\n /** Detected package manager */\n readonly packageManager: Option.Option<PackageManager>\n /** Path to the workspace root */\n readonly workspacesRoot: Option.Option<string>\n}\n\n/**\n * All valid server types\n */\nexport const SERVER_TYPES: readonly ServerType[] = [\"node\", \"bun\", \"express\", \"web\"]\n\n/**\n * Check if a string is a valid server type\n */\nexport const isValidServerType = (value: string): value is ServerType =>\n SERVER_TYPES.includes(value as ServerType)\n\n/**\n * All valid package managers\n */\nexport const PACKAGE_MANAGERS: readonly PackageManager[] = [\"npm\", \"pnpm\", \"yarn\", \"bun\"]\n\n/**\n * Check if a string is a valid package manager\n */\nexport const isValidPackageManager = (value: string): value is PackageManager =>\n PACKAGE_MANAGERS.includes(value as PackageManager)\n","/**\n * CLI argument parsing for the create command\n */\n\nimport { Option } from \"effect\"\nimport type { CreateOptions, ParsedArgs, PackageManager, ServerType } from \"./types\"\nimport { isValidServerType, isValidPackageManager, SERVER_TYPES } from \"./types\"\n\n/**\n * Parse CLI arguments for the create command\n *\n * Usage:\n * effect-gql create <name> --server-type <type> [options]\n * effect-gql create --interactive\n */\nexport const parseArgs = (args: string[]): ParsedArgs => {\n const positional: string[] = []\n let serverType: ServerType | undefined\n let directory: Option.Option<string> = Option.none()\n let monorepo: Option.Option<boolean> = Option.none()\n let skipInstall = false\n let packageManager: Option.Option<PackageManager> = Option.none()\n let interactive = false\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n\n if (arg === \"-h\" || arg === \"--help\") {\n return { help: true }\n } else if (arg === \"-i\" || arg === \"--interactive\") {\n interactive = true\n } else if (arg === \"-s\" || arg === \"--server-type\") {\n const value = args[++i]\n if (!value) {\n return { error: \"Missing value for --server-type\" }\n }\n if (!isValidServerType(value)) {\n return {\n error: `Invalid server type: ${value}. Must be one of: ${SERVER_TYPES.join(\", \")}`,\n }\n }\n serverType = value\n } else if (arg === \"-d\" || arg === \"--directory\") {\n const value = args[++i]\n if (!value) {\n return { error: \"Missing value for --directory\" }\n }\n directory = Option.some(value)\n } else if (arg === \"--monorepo\") {\n monorepo = Option.some(true)\n } else if (arg === \"--skip-install\") {\n skipInstall = true\n } else if (arg === \"--package-manager\") {\n const value = args[++i]\n if (!value) {\n return { error: \"Missing value for --package-manager\" }\n }\n if (!isValidPackageManager(value)) {\n return { error: `Invalid package manager: ${value}. Must be one of: npm, pnpm, yarn, bun` }\n }\n packageManager = Option.some(value)\n } else if (!arg.startsWith(\"-\")) {\n positional.push(arg)\n } else {\n return { error: `Unknown option: ${arg}` }\n }\n }\n\n // If interactive mode, return early\n if (interactive) {\n return { interactive: true }\n }\n\n // If no args at all, default to interactive\n if (args.length === 0) {\n return { interactive: true }\n }\n\n // Validate required arguments\n if (positional.length === 0) {\n return {\n error:\n \"Missing project name. Use --interactive or provide: effect-gql create <name> --server-type <type>\",\n }\n }\n\n if (!serverType) {\n return { error: \"Missing --server-type. Must be one of: \" + SERVER_TYPES.join(\", \") }\n }\n\n const options: CreateOptions = {\n name: positional[0],\n serverType,\n directory,\n monorepo,\n skipInstall,\n packageManager,\n }\n\n return { options }\n}\n","/**\n * Package.json template generation\n */\n\nimport type { ServerType, TemplateContext } from \"../types\"\n\n/**\n * Current dependency versions\n * Keep in sync with the main packages\n */\nconst VERSIONS = {\n core: \"^1.3.4\",\n node: \"^1.3.4\",\n bun: \"^1.3.4\",\n express: \"^1.3.4\",\n web: \"^1.3.4\",\n effect: \"^3.19.0\",\n platform: \"^0.94.0\",\n platformNode: \"^0.104.0\",\n platformBun: \"^0.87.0\",\n graphql: \"^16.0.0\",\n expressLib: \"^5.0.0\",\n tsx: \"^4.19.0\",\n typescript: \"^5.0.0\",\n} as const\n\ninterface Dependencies {\n readonly dependencies: Record<string, string>\n readonly devDependencies: Record<string, string>\n}\n\n/**\n * Get dependencies for each server type\n */\nconst getDependencies = (serverType: ServerType, _isMonorepo: boolean): Dependencies => {\n // Always use published versions - workspace:* is only for effect-gql internal development\n const baseDeps: Record<string, string> = {\n \"@effect-gql/core\": VERSIONS.core,\n \"@effect/platform\": VERSIONS.platform,\n effect: VERSIONS.effect,\n graphql: VERSIONS.graphql,\n }\n\n const baseDevDeps: Record<string, string> = {\n tsx: VERSIONS.tsx,\n typescript: VERSIONS.typescript,\n }\n\n switch (serverType) {\n case \"node\":\n return {\n dependencies: {\n ...baseDeps,\n \"@effect-gql/node\": VERSIONS.node,\n \"@effect/platform-node\": VERSIONS.platformNode,\n },\n devDependencies: baseDevDeps,\n }\n\n case \"bun\":\n return {\n dependencies: {\n ...baseDeps,\n \"@effect-gql/bun\": VERSIONS.bun,\n \"@effect/platform-bun\": VERSIONS.platformBun,\n },\n devDependencies: {\n typescript: VERSIONS.typescript,\n // Bun has built-in TypeScript support, no tsx needed\n },\n }\n\n case \"express\":\n return {\n dependencies: {\n ...baseDeps,\n \"@effect-gql/express\": VERSIONS.express,\n express: VERSIONS.expressLib,\n },\n devDependencies: {\n ...baseDevDeps,\n \"@types/express\": \"^5.0.0\",\n },\n }\n\n case \"web\":\n return {\n dependencies: {\n ...baseDeps,\n \"@effect-gql/web\": VERSIONS.web,\n },\n devDependencies: baseDevDeps,\n }\n }\n}\n\n/**\n * Get scripts for each server type\n */\nconst getScripts = (serverType: ServerType): Record<string, string> => {\n switch (serverType) {\n case \"node\":\n return {\n start: \"tsx src/index.ts\",\n dev: \"tsx watch src/index.ts\",\n build: \"tsc\",\n typecheck: \"tsc --noEmit\",\n }\n\n case \"bun\":\n return {\n start: \"bun run src/index.ts\",\n dev: \"bun --watch src/index.ts\",\n build: \"bun build src/index.ts --outdir dist --target bun\",\n typecheck: \"tsc --noEmit\",\n }\n\n case \"express\":\n return {\n start: \"tsx src/index.ts\",\n dev: \"tsx watch src/index.ts\",\n build: \"tsc\",\n typecheck: \"tsc --noEmit\",\n }\n\n case \"web\":\n return {\n start: \"tsx src/index.ts\",\n dev: \"tsx watch src/index.ts\",\n build: \"tsc\",\n typecheck: \"tsc --noEmit\",\n // Users will typically add wrangler/deno commands as needed\n }\n }\n}\n\n/**\n * Generate package.json content\n */\nexport const generatePackageJson = (ctx: TemplateContext): string => {\n const deps = getDependencies(ctx.serverType, ctx.isMonorepo)\n\n const pkg = {\n name: ctx.name,\n version: \"0.0.1\",\n private: true,\n type: \"module\",\n scripts: getScripts(ctx.serverType),\n dependencies: deps.dependencies,\n devDependencies: deps.devDependencies,\n }\n\n return JSON.stringify(pkg, null, 2) + \"\\n\"\n}\n","/**\n * tsconfig.json template generation\n */\n\nimport type { TemplateContext } from \"../types\"\n\n/**\n * Generate tsconfig.json content\n */\nexport const generateTsConfig = (ctx: TemplateContext): string => {\n const config = ctx.isMonorepo\n ? {\n // In a monorepo, extend from root tsconfig\n extends: \"../../tsconfig.json\",\n compilerOptions: {\n outDir: \"./dist\",\n rootDir: \"./src\",\n noEmit: true,\n },\n include: [\"src/**/*\"],\n exclude: [\"node_modules\", \"dist\"],\n }\n : {\n // Standalone project config\n compilerOptions: {\n target: \"ES2022\",\n module: \"NodeNext\",\n moduleResolution: \"NodeNext\",\n lib: [\"ES2022\"],\n outDir: \"./dist\",\n rootDir: \"./src\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n declaration: true,\n declarationMap: true,\n sourceMap: true,\n noEmit: true,\n // Effect requires these for decorators\n experimentalDecorators: true,\n emitDecoratorMetadata: true,\n },\n include: [\"src/**/*\"],\n exclude: [\"node_modules\", \"dist\"],\n }\n\n return JSON.stringify(config, null, 2) + \"\\n\"\n}\n","/**\n * Server template generation for each server type\n */\n\nimport type { TemplateContext } from \"../types\"\n\n/**\n * Generate Node.js server template\n */\nconst generateNodeServer = (ctx: TemplateContext): string => `/**\n * ${ctx.name} - GraphQL Server\n *\n * A GraphQL server built with Effect GQL and Node.js.\n */\n\nimport { Effect, Layer } from \"effect\"\nimport * as S from \"effect/Schema\"\nimport { HttpRouter, HttpServerResponse } from \"@effect/platform\"\nimport { GraphQLSchemaBuilder, query, mutation, makeGraphQLRouter } from \"@effect-gql/core\"\nimport { serve } from \"@effect-gql/node\"\n\n// =============================================================================\n// Domain Models\n// =============================================================================\n\n/**\n * Define your types with Effect Schema.\n * This single definition is used for both TypeScript types AND GraphQL types.\n */\nconst User = S.Struct({\n id: S.String,\n name: S.String,\n email: S.String,\n})\n\ntype User = S.Schema.Type<typeof User>\n\n// =============================================================================\n// In-Memory Data Store (replace with your database)\n// =============================================================================\n\nconst users: User[] = [\n { id: \"1\", name: \"Alice\", email: \"alice@example.com\" },\n { id: \"2\", name: \"Bob\", email: \"bob@example.com\" },\n]\n\n// =============================================================================\n// GraphQL Schema\n// =============================================================================\n\nconst schema = GraphQLSchemaBuilder.empty\n .pipe(\n // Simple query\n query(\"hello\", {\n type: S.String,\n description: \"Returns a friendly greeting\",\n resolve: () => Effect.succeed(\"Hello from ${ctx.name}!\"),\n }),\n\n // Query with arguments\n query(\"user\", {\n args: S.Struct({ id: S.String }),\n type: S.NullOr(User),\n description: \"Get a user by ID\",\n resolve: (args) => Effect.succeed(users.find((u) => u.id === args.id) ?? null),\n }),\n\n // Query that returns a list\n query(\"users\", {\n type: S.Array(User),\n description: \"Get all users\",\n resolve: () => Effect.succeed(users),\n }),\n\n // Mutation\n mutation(\"createUser\", {\n args: S.Struct({\n name: S.String,\n email: S.String,\n }),\n type: User,\n description: \"Create a new user\",\n resolve: (args) =>\n Effect.sync(() => {\n const newUser: User = {\n id: String(users.length + 1),\n name: args.name,\n email: args.email,\n }\n users.push(newUser)\n return newUser\n }),\n })\n )\n .buildSchema()\n\n// =============================================================================\n// HTTP Router\n// =============================================================================\n\nconst graphqlRouter = makeGraphQLRouter(schema, Layer.empty, {\n path: \"/graphql\",\n graphiql: {\n path: \"/graphiql\",\n endpoint: \"/graphql\",\n },\n})\n\nconst router = HttpRouter.empty.pipe(\n HttpRouter.get(\"/health\", HttpServerResponse.json({ status: \"ok\" })),\n HttpRouter.concat(graphqlRouter)\n)\n\n// =============================================================================\n// Server Startup\n// =============================================================================\n\nserve(router, Layer.empty, {\n port: 4000,\n onStart: (url: string) => {\n console.log(\\`Server ready at \\${url}\\`)\n console.log(\\`GraphQL endpoint: \\${url}/graphql\\`)\n console.log(\\`GraphiQL playground: \\${url}/graphiql\\`)\n console.log(\\`Health check: \\${url}/health\\`)\n },\n})\n`\n\n/**\n * Generate Bun server template\n */\nconst generateBunServer = (ctx: TemplateContext): string => `/**\n * ${ctx.name} - GraphQL Server\n *\n * A GraphQL server built with Effect GQL and Bun.\n */\n\nimport { Effect, Layer } from \"effect\"\nimport * as S from \"effect/Schema\"\nimport { HttpRouter, HttpServerResponse } from \"@effect/platform\"\nimport { GraphQLSchemaBuilder, query, mutation, makeGraphQLRouter } from \"@effect-gql/core\"\nimport { serve } from \"@effect-gql/bun\"\n\n// =============================================================================\n// Domain Models\n// =============================================================================\n\nconst User = S.Struct({\n id: S.String,\n name: S.String,\n email: S.String,\n})\n\ntype User = S.Schema.Type<typeof User>\n\n// =============================================================================\n// In-Memory Data Store (replace with your database)\n// =============================================================================\n\nconst users: User[] = [\n { id: \"1\", name: \"Alice\", email: \"alice@example.com\" },\n { id: \"2\", name: \"Bob\", email: \"bob@example.com\" },\n]\n\n// =============================================================================\n// GraphQL Schema\n// =============================================================================\n\nconst schema = GraphQLSchemaBuilder.empty\n .pipe(\n query(\"hello\", {\n type: S.String,\n description: \"Returns a friendly greeting\",\n resolve: () => Effect.succeed(\"Hello from ${ctx.name}!\"),\n }),\n\n query(\"user\", {\n args: S.Struct({ id: S.String }),\n type: S.NullOr(User),\n description: \"Get a user by ID\",\n resolve: (args) => Effect.succeed(users.find((u) => u.id === args.id) ?? null),\n }),\n\n query(\"users\", {\n type: S.Array(User),\n description: \"Get all users\",\n resolve: () => Effect.succeed(users),\n }),\n\n mutation(\"createUser\", {\n args: S.Struct({\n name: S.String,\n email: S.String,\n }),\n type: User,\n description: \"Create a new user\",\n resolve: (args) =>\n Effect.sync(() => {\n const newUser: User = {\n id: String(users.length + 1),\n name: args.name,\n email: args.email,\n }\n users.push(newUser)\n return newUser\n }),\n })\n )\n .buildSchema()\n\n// =============================================================================\n// HTTP Router\n// =============================================================================\n\nconst graphqlRouter = makeGraphQLRouter(schema, Layer.empty, {\n path: \"/graphql\",\n graphiql: {\n path: \"/graphiql\",\n endpoint: \"/graphql\",\n },\n})\n\nconst router = HttpRouter.empty.pipe(\n HttpRouter.get(\"/health\", HttpServerResponse.json({ status: \"ok\" })),\n HttpRouter.concat(graphqlRouter)\n)\n\n// =============================================================================\n// Server Startup\n// =============================================================================\n\nserve(router, Layer.empty, {\n port: 4000,\n onStart: (url: string) => {\n console.log(\\`Server ready at \\${url}\\`)\n console.log(\\`GraphQL endpoint: \\${url}/graphql\\`)\n console.log(\\`GraphiQL playground: \\${url}/graphiql\\`)\n console.log(\\`Health check: \\${url}/health\\`)\n },\n})\n`\n\n/**\n * Generate Express server template\n */\nconst generateExpressServer = (ctx: TemplateContext): string => `/**\n * ${ctx.name} - GraphQL Server\n *\n * A GraphQL server built with Effect GQL and Express.\n */\n\nimport express from \"express\"\nimport { Effect, Layer } from \"effect\"\nimport * as S from \"effect/Schema\"\nimport { GraphQLSchemaBuilder, query, mutation, makeGraphQLRouter } from \"@effect-gql/core\"\nimport { toMiddleware } from \"@effect-gql/express\"\n\n// =============================================================================\n// Domain Models\n// =============================================================================\n\nconst User = S.Struct({\n id: S.String,\n name: S.String,\n email: S.String,\n})\n\ntype User = S.Schema.Type<typeof User>\n\n// =============================================================================\n// In-Memory Data Store (replace with your database)\n// =============================================================================\n\nconst users: User[] = [\n { id: \"1\", name: \"Alice\", email: \"alice@example.com\" },\n { id: \"2\", name: \"Bob\", email: \"bob@example.com\" },\n]\n\n// =============================================================================\n// GraphQL Schema\n// =============================================================================\n\nconst schema = GraphQLSchemaBuilder.empty\n .pipe(\n query(\"hello\", {\n type: S.String,\n description: \"Returns a friendly greeting\",\n resolve: () => Effect.succeed(\"Hello from ${ctx.name}!\"),\n }),\n\n query(\"user\", {\n args: S.Struct({ id: S.String }),\n type: S.NullOr(User),\n description: \"Get a user by ID\",\n resolve: (args) => Effect.succeed(users.find((u) => u.id === args.id) ?? null),\n }),\n\n query(\"users\", {\n type: S.Array(User),\n description: \"Get all users\",\n resolve: () => Effect.succeed(users),\n }),\n\n mutation(\"createUser\", {\n args: S.Struct({\n name: S.String,\n email: S.String,\n }),\n type: User,\n description: \"Create a new user\",\n resolve: (args) =>\n Effect.sync(() => {\n const newUser: User = {\n id: String(users.length + 1),\n name: args.name,\n email: args.email,\n }\n users.push(newUser)\n return newUser\n }),\n })\n )\n .buildSchema()\n\n// =============================================================================\n// GraphQL Router\n// =============================================================================\n\nconst graphqlRouter = makeGraphQLRouter(schema, Layer.empty, {\n path: \"/graphql\",\n graphiql: {\n path: \"/graphiql\",\n endpoint: \"/graphql\",\n },\n})\n\n// =============================================================================\n// Express App\n// =============================================================================\n\nconst app = express()\napp.use(express.json())\n\n// Health check\napp.get(\"/health\", (_, res) => {\n res.json({ status: \"ok\" })\n})\n\n// Mount GraphQL middleware\napp.use(toMiddleware(graphqlRouter, Layer.empty))\n\n// =============================================================================\n// Server Startup\n// =============================================================================\n\nconst port = process.env.PORT || 4000\n\napp.listen(port, () => {\n console.log(\\`Server ready at http://localhost:\\${port}\\`)\n console.log(\\`GraphQL endpoint: http://localhost:\\${port}/graphql\\`)\n console.log(\\`GraphiQL playground: http://localhost:\\${port}/graphiql\\`)\n console.log(\\`Health check: http://localhost:\\${port}/health\\`)\n})\n`\n\n/**\n * Generate Web handler template (for Cloudflare Workers, Deno, etc.)\n */\nconst generateWebHandler = (ctx: TemplateContext): string => `/**\n * ${ctx.name} - GraphQL Server\n *\n * A GraphQL server built with Effect GQL using Web standard APIs.\n * Compatible with Cloudflare Workers, Deno, and other WASM runtimes.\n */\n\nimport { Effect, Layer } from \"effect\"\nimport * as S from \"effect/Schema\"\nimport { GraphQLSchemaBuilder, query, mutation, makeGraphQLRouter } from \"@effect-gql/core\"\nimport { toHandler } from \"@effect-gql/web\"\n\n// =============================================================================\n// Domain Models\n// =============================================================================\n\nconst User = S.Struct({\n id: S.String,\n name: S.String,\n email: S.String,\n})\n\ntype User = S.Schema.Type<typeof User>\n\n// =============================================================================\n// In-Memory Data Store (replace with your database)\n// =============================================================================\n\nconst users: User[] = [\n { id: \"1\", name: \"Alice\", email: \"alice@example.com\" },\n { id: \"2\", name: \"Bob\", email: \"bob@example.com\" },\n]\n\n// =============================================================================\n// GraphQL Schema\n// =============================================================================\n\nconst schema = GraphQLSchemaBuilder.empty\n .pipe(\n query(\"hello\", {\n type: S.String,\n description: \"Returns a friendly greeting\",\n resolve: () => Effect.succeed(\"Hello from ${ctx.name}!\"),\n }),\n\n query(\"user\", {\n args: S.Struct({ id: S.String }),\n type: S.NullOr(User),\n description: \"Get a user by ID\",\n resolve: (args) => Effect.succeed(users.find((u) => u.id === args.id) ?? null),\n }),\n\n query(\"users\", {\n type: S.Array(User),\n description: \"Get all users\",\n resolve: () => Effect.succeed(users),\n }),\n\n mutation(\"createUser\", {\n args: S.Struct({\n name: S.String,\n email: S.String,\n }),\n type: User,\n description: \"Create a new user\",\n resolve: (args) =>\n Effect.sync(() => {\n const newUser: User = {\n id: String(users.length + 1),\n name: args.name,\n email: args.email,\n }\n users.push(newUser)\n return newUser\n }),\n })\n )\n .buildSchema()\n\n// =============================================================================\n// GraphQL Router\n// =============================================================================\n\nconst graphqlRouter = makeGraphQLRouter(schema, Layer.empty, {\n path: \"/graphql\",\n graphiql: {\n path: \"/graphiql\",\n endpoint: \"/graphql\",\n },\n})\n\n// =============================================================================\n// Web Handler\n// =============================================================================\n\nconst { handler } = toHandler(graphqlRouter, Layer.empty)\n\n/**\n * Export for Cloudflare Workers\n */\nexport default {\n async fetch(request: Request): Promise<Response> {\n const url = new URL(request.url)\n\n // Health check\n if (url.pathname === \"/health\") {\n return new Response(JSON.stringify({ status: \"ok\" }), {\n headers: { \"Content-Type\": \"application/json\" },\n })\n }\n\n return handler(request)\n },\n}\n\n/**\n * For local development with Deno or other runtimes, you can use:\n *\n * Deno.serve((request) => {\n * const url = new URL(request.url)\n * if (url.pathname === \"/health\") {\n * return new Response(JSON.stringify({ status: \"ok\" }), {\n * headers: { \"Content-Type\": \"application/json\" },\n * })\n * }\n * return handler(request)\n * })\n */\n`\n\n/**\n * Generate the server template based on server type\n */\nexport const generateServerTemplate = (ctx: TemplateContext): string => {\n switch (ctx.serverType) {\n case \"node\":\n return generateNodeServer(ctx)\n case \"bun\":\n return generateBunServer(ctx)\n case \"express\":\n return generateExpressServer(ctx)\n case \"web\":\n return generateWebHandler(ctx)\n }\n}\n","/**\n * Template orchestration - generates all project files\n */\n\nimport type { GeneratedFile, TemplateContext } from \"../types\"\nimport { generatePackageJson } from \"./package-json\"\nimport { generateTsConfig } from \"./tsconfig\"\nimport { generateServerTemplate } from \"./server\"\n\n/**\n * Generate a .gitignore file\n */\nconst generateGitignore = (): string => `# Dependencies\nnode_modules/\n\n# Build output\ndist/\n*.tsbuildinfo\n\n# IDE\n.idea/\n.vscode/\n*.swp\n*.swo\n\n# OS\n.DS_Store\nThumbs.db\n\n# Environment\n.env\n.env.local\n.env.*.local\n\n# Logs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Testing\ncoverage/\n`\n\n/**\n * Generate all project files\n */\nexport const generateProject = (ctx: TemplateContext): GeneratedFile[] => [\n {\n path: \"package.json\",\n content: generatePackageJson(ctx),\n },\n {\n path: \"tsconfig.json\",\n content: generateTsConfig(ctx),\n },\n {\n path: \"src/index.ts\",\n content: generateServerTemplate(ctx),\n },\n {\n path: \".gitignore\",\n content: generateGitignore(),\n },\n]\n\nexport { generatePackageJson } from \"./package-json\"\nexport { generateTsConfig } from \"./tsconfig\"\nexport { generateServerTemplate } from \"./server\"\n","/**\n * Monorepo detection and support\n */\n\nimport { Effect, Option } from \"effect\"\nimport * as fs from \"fs\"\nimport * as path from \"path\"\nimport type { MonorepoInfo, PackageManager } from \"./types\"\n\n/**\n * Check if a file exists\n */\nconst fileExists = (filePath: string): Effect.Effect<boolean, never> =>\n Effect.sync(() => fs.existsSync(filePath))\n\n/**\n * Read a file as string\n */\nconst readFile = (filePath: string): Effect.Effect<string, Error> =>\n Effect.try({\n try: () => fs.readFileSync(filePath, \"utf-8\"),\n catch: (error) => new Error(`Failed to read ${filePath}: ${error}`),\n })\n\n/**\n * Detect the package manager based on lock files\n */\nexport const detectPackageManager = (dir: string): Effect.Effect<PackageManager, never> =>\n Effect.gen(function* () {\n if (yield* fileExists(path.join(dir, \"pnpm-lock.yaml\"))) return \"pnpm\"\n if (yield* fileExists(path.join(dir, \"bun.lockb\"))) return \"bun\"\n if (yield* fileExists(path.join(dir, \"yarn.lock\"))) return \"yarn\"\n return \"npm\"\n })\n\n/**\n * Detect if we're inside a monorepo and gather info\n *\n * Walks up the directory tree looking for:\n * - pnpm-workspace.yaml (pnpm workspaces)\n * - package.json with \"workspaces\" field (npm/yarn workspaces)\n * - turbo.json (Turborepo)\n */\nexport const detectMonorepo = (targetDir: string): Effect.Effect<MonorepoInfo, never> =>\n Effect.gen(function* () {\n // Start from the parent of the target directory\n let currentDir = path.dirname(path.resolve(targetDir))\n const root = path.parse(currentDir).root\n\n while (currentDir !== root) {\n // Check for pnpm-workspace.yaml\n const pnpmWorkspacePath = path.join(currentDir, \"pnpm-workspace.yaml\")\n if (yield* fileExists(pnpmWorkspacePath)) {\n return {\n isMonorepo: true,\n packageManager: Option.some(\"pnpm\" as PackageManager),\n workspacesRoot: Option.some(currentDir),\n }\n }\n\n // Check for package.json with workspaces\n const pkgPath = path.join(currentDir, \"package.json\")\n if (yield* fileExists(pkgPath)) {\n const content = yield* readFile(pkgPath).pipe(Effect.catchAll(() => Effect.succeed(\"\")))\n if (content) {\n try {\n const pkg = JSON.parse(content)\n if (pkg.workspaces) {\n const pm = yield* detectPackageManager(currentDir)\n return {\n isMonorepo: true,\n packageManager: Option.some(pm),\n workspacesRoot: Option.some(currentDir),\n }\n }\n } catch {\n // Invalid JSON, continue\n }\n }\n }\n\n // Check for turbo.json\n const turboPath = path.join(currentDir, \"turbo.json\")\n if (yield* fileExists(turboPath)) {\n const pm = yield* detectPackageManager(currentDir)\n return {\n isMonorepo: true,\n packageManager: Option.some(pm),\n workspacesRoot: Option.some(currentDir),\n }\n }\n\n // Move up one directory\n currentDir = path.dirname(currentDir)\n }\n\n // No monorepo detected\n return {\n isMonorepo: false,\n packageManager: Option.none(),\n workspacesRoot: Option.none(),\n }\n })\n\n/**\n * Get the install command for a package manager\n */\nexport const getInstallCommand = (pm: PackageManager): string => {\n switch (pm) {\n case \"npm\":\n return \"npm install\"\n case \"pnpm\":\n return \"pnpm install\"\n case \"yarn\":\n return \"yarn\"\n case \"bun\":\n return \"bun install\"\n }\n}\n\n/**\n * Get the run command prefix for a package manager\n */\nexport const getRunPrefix = (pm: PackageManager): string => {\n switch (pm) {\n case \"npm\":\n return \"npm run\"\n case \"pnpm\":\n return \"pnpm\"\n case \"yarn\":\n return \"yarn\"\n case \"bun\":\n return \"bun run\"\n }\n}\n","/**\n * Project scaffolding logic\n */\n\nimport { Effect, Console, Option, pipe } from \"effect\"\nimport * as fs from \"fs\"\nimport * as path from \"path\"\nimport { spawn } from \"child_process\"\nimport type { CreateOptions, TemplateContext, PackageManager } from \"./types\"\nimport { generateProject } from \"./templates\"\nimport { detectMonorepo, detectPackageManager, getInstallCommand, getRunPrefix } from \"./monorepo\"\n\n/**\n * Check if a directory exists and is empty (or doesn't exist)\n */\nconst validateDirectory = (targetDir: string): Effect.Effect<void, Error> =>\n Effect.try({\n try: () => {\n if (fs.existsSync(targetDir)) {\n const files = fs.readdirSync(targetDir)\n if (files.length > 0) {\n throw new Error(`Directory ${targetDir} is not empty`)\n }\n }\n },\n catch: (error) =>\n error instanceof Error ? error : new Error(`Failed to validate directory: ${error}`),\n })\n\n/**\n * Create a directory and all parent directories\n */\nconst mkdirp = (dir: string): Effect.Effect<void, Error> =>\n Effect.try({\n try: () => fs.mkdirSync(dir, { recursive: true }),\n catch: (error) => new Error(`Failed to create directory ${dir}: ${error}`),\n })\n\n/**\n * Write a file, creating parent directories as needed\n */\nconst writeFile = (filePath: string, content: string): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n yield* mkdirp(path.dirname(filePath))\n yield* Effect.try({\n try: () => fs.writeFileSync(filePath, content, \"utf-8\"),\n catch: (error) => new Error(`Failed to write ${filePath}: ${error}`),\n })\n })\n\n/**\n * Run a shell command\n */\nconst runCommand = (command: string, args: string[], cwd: string): Effect.Effect<void, Error> =>\n Effect.async<void, Error>((resume) => {\n const child = spawn(command, args, {\n cwd,\n stdio: \"inherit\",\n shell: true,\n })\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resume(Effect.succeed(undefined))\n } else {\n resume(Effect.fail(new Error(`Command failed with exit code ${code}`)))\n }\n })\n\n child.on(\"error\", (error) => {\n resume(Effect.fail(new Error(`Failed to run command: ${error.message}`)))\n })\n\n return Effect.sync(() => {\n child.kill()\n })\n })\n\n/**\n * Install dependencies using the detected package manager\n */\nconst installDependencies = (\n targetDir: string,\n packageManager: PackageManager\n): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n yield* Console.log(\"\")\n yield* Console.log(\"Installing dependencies...\")\n\n const installCmd = getInstallCommand(packageManager)\n const [cmd, ...args] = installCmd.split(\" \")\n\n yield* runCommand(cmd, args, targetDir)\n\n yield* Console.log(\"Dependencies installed successfully!\")\n })\n\n/**\n * Print success message with next steps\n */\nconst printSuccessMessage = (ctx: TemplateContext, targetDir: string): Effect.Effect<void, never> =>\n Effect.gen(function* () {\n const relativePath = path.relative(process.cwd(), targetDir) || \".\"\n const runPrefix = getRunPrefix(ctx.packageManager)\n\n yield* Console.log(\"\")\n yield* Console.log(`Successfully created ${ctx.name}!`)\n yield* Console.log(\"\")\n yield* Console.log(\"Next steps:\")\n yield* Console.log(` cd ${relativePath}`)\n yield* Console.log(` ${runPrefix} dev`)\n yield* Console.log(\"\")\n yield* Console.log(\"Your GraphQL server will be available at:\")\n yield* Console.log(\" http://localhost:4000/graphql\")\n yield* Console.log(\" http://localhost:4000/graphiql (playground)\")\n yield* Console.log(\"\")\n })\n\n/**\n * Main scaffolding function\n */\nexport const scaffold = (options: CreateOptions): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const targetDir = pipe(\n options.directory,\n Option.map((dir) => path.resolve(process.cwd(), dir)),\n Option.getOrElse(() => path.resolve(process.cwd(), options.name))\n )\n\n // Detect monorepo context\n const monorepoInfo = yield* detectMonorepo(targetDir)\n\n // Determine if we're in monorepo mode\n // Use explicit option if provided, otherwise use detected value\n const isMonorepo = pipe(\n options.monorepo,\n Option.getOrElse(() => monorepoInfo.isMonorepo)\n )\n\n // Determine package manager\n // Priority: explicit option > detected from monorepo > detected from cwd\n const packageManager = yield* pipe(\n options.packageManager,\n Option.orElse(() => monorepoInfo.packageManager),\n Option.match({\n onNone: () => detectPackageManager(process.cwd()),\n onSome: (pm) => Effect.succeed(pm),\n })\n )\n\n // Build template context\n const ctx: TemplateContext = {\n name: options.name,\n serverType: options.serverType,\n isMonorepo,\n packageManager,\n }\n\n yield* Console.log(\"\")\n yield* Console.log(`Creating ${ctx.name} with ${ctx.serverType} server...`)\n\n // Validate target directory\n yield* validateDirectory(targetDir)\n\n // Generate all files\n const files = generateProject(ctx)\n\n // Write files\n for (const file of files) {\n const filePath = path.join(targetDir, file.path)\n yield* writeFile(filePath, file.content)\n yield* Console.log(` Created ${file.path}`)\n }\n\n // Install dependencies unless skipped\n if (!options.skipInstall) {\n yield* installDependencies(targetDir, packageManager).pipe(\n Effect.catchAll((error) =>\n Console.log(`Warning: Failed to install dependencies: ${error.message}`).pipe(\n Effect.andThen(\n Console.log(\n \"You can install them manually by running: \" + getInstallCommand(packageManager)\n )\n )\n )\n )\n )\n } else {\n yield* Console.log(\"\")\n yield* Console.log(\n `Skipping dependency installation. Run '${getInstallCommand(packageManager)}' to install.`\n )\n }\n\n // Print success message\n yield* printSuccessMessage(ctx, targetDir)\n })\n","/**\n * Create command - scaffold a new Effect GraphQL project\n *\n * Usage:\n * effect-gql create <name> --server-type <type> [options]\n * effect-gql create --interactive\n *\n * Server types:\n * node - Node.js server using @effect-gql/node\n * bun - Bun server using @effect-gql/bun\n * express - Express middleware using @effect-gql/express\n * web - Web standard handler using @effect-gql/web\n */\n\nimport { Effect, Console, Option } from \"effect\"\nimport * as readline from \"readline\"\nimport type { CreateOptions, ServerType, PackageManager } from \"./types\"\nimport { parseArgs } from \"./args\"\nimport { scaffold } from \"./scaffolder\"\n\n/**\n * Print help for the create command\n */\nexport const printCreateHelp = (): void => {\n console.log(`\nUsage: effect-gql create <name> --server-type <type> [options]\n\nCreate a new Effect GraphQL project.\n\nArguments:\n name Package/project name\n\nRequired Options:\n -s, --server-type Server type: node, bun, express, web\n\nOptional Options:\n -d, --directory Target directory (default: ./<name>)\n --monorepo Create as workspace package (auto-detected)\n --skip-install Skip dependency installation\n --package-manager Package manager: npm, pnpm, yarn, bun\n -i, --interactive Interactive mode (prompts for options)\n -h, --help Show this help message\n\nServer Types:\n node Node.js server using @effect-gql/node\n Best for: General Node.js deployments\n\n bun Bun server using @effect-gql/bun\n Best for: Bun runtime with native WebSocket support\n\n express Express middleware using @effect-gql/express\n Best for: Integrating into existing Express apps\n\n web Web standard handler using @effect-gql/web\n Best for: Cloudflare Workers, Deno, edge runtimes\n\nExamples:\n effect-gql create my-api --server-type node\n effect-gql create my-api -s bun\n effect-gql create my-api -s express -d ./packages/api --monorepo\n effect-gql create my-api -s web --skip-install\n effect-gql create --interactive\n`)\n}\n\n/**\n * Simple prompt helper using readline\n */\nconst prompt = (question: string): Effect.Effect<string, Error> =>\n Effect.async<string, Error>((resume) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n })\n\n rl.question(question, (answer) => {\n rl.close()\n resume(Effect.succeed(answer.trim()))\n })\n\n rl.on(\"error\", (error) => {\n rl.close()\n resume(Effect.fail(new Error(`Input error: ${error.message}`)))\n })\n\n return Effect.sync(() => rl.close())\n })\n\n/**\n * Select from a list of options\n */\nconst selectPrompt = <T extends string>(\n question: string,\n options: readonly { label: string; value: T }[]\n): Effect.Effect<T, Error> =>\n Effect.gen(function* () {\n yield* Console.log(question)\n options.forEach((opt, i) => {\n console.log(` ${i + 1}) ${opt.label}`)\n })\n\n const answer = yield* prompt(\"Enter number: \")\n const index = parseInt(answer, 10) - 1\n\n if (isNaN(index) || index < 0 || index >= options.length) {\n yield* Console.log(`Invalid selection. Please enter 1-${options.length}.`)\n return yield* selectPrompt(question, options)\n }\n\n return options[index].value\n })\n\n/**\n * Yes/no confirmation prompt\n */\nconst confirmPrompt = (question: string, defaultValue: boolean): Effect.Effect<boolean, Error> =>\n Effect.gen(function* () {\n const hint = defaultValue ? \"[Y/n]\" : \"[y/N]\"\n const answer = yield* prompt(`${question} ${hint} `)\n\n if (answer === \"\") return defaultValue\n const lower = answer.toLowerCase()\n if (lower === \"y\" || lower === \"yes\") return true\n if (lower === \"n\" || lower === \"no\") return false\n\n yield* Console.log(\"Please answer 'y' or 'n'.\")\n return yield* confirmPrompt(question, defaultValue)\n })\n\n/**\n * Run interactive mode to gather options\n */\nconst runInteractive = (): Effect.Effect<CreateOptions, Error> =>\n Effect.gen(function* () {\n yield* Console.log(\"\")\n yield* Console.log(\"Create a new Effect GraphQL project\")\n yield* Console.log(\"====================================\")\n yield* Console.log(\"\")\n\n // Get project name\n const name = yield* prompt(\"Project name: \")\n if (!name) {\n return yield* Effect.fail(new Error(\"Project name is required\"))\n }\n\n // Validate name (basic npm package name validation)\n if (!/^(@[a-z0-9-~][a-z0-9-._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(name)) {\n yield* Console.log(\"Warning: Name may not be a valid npm package name.\")\n }\n\n // Get server type\n const serverType = yield* selectPrompt<ServerType>(\"Select server type:\", [\n { label: \"Node.js (@effect-gql/node)\", value: \"node\" },\n { label: \"Bun (@effect-gql/bun)\", value: \"bun\" },\n { label: \"Express (@effect-gql/express)\", value: \"express\" },\n { label: \"Web/Workers (@effect-gql/web)\", value: \"web\" },\n ])\n\n // Ask about monorepo\n const monorepo = yield* confirmPrompt(\"Create as monorepo workspace package?\", false)\n\n // Ask about package manager if monorepo\n const packageManager: Option.Option<PackageManager> = monorepo\n ? Option.some(\n yield* selectPrompt<PackageManager>(\"Select package manager:\", [\n { label: \"pnpm\", value: \"pnpm\" },\n { label: \"npm\", value: \"npm\" },\n { label: \"yarn\", value: \"yarn\" },\n { label: \"bun\", value: \"bun\" },\n ])\n )\n : Option.none()\n\n return {\n name,\n serverType,\n directory: Option.none(),\n monorepo: Option.some(monorepo),\n skipInstall: false,\n packageManager,\n }\n })\n\n/**\n * Entry point for the create command\n */\nexport const runCreate = (args: string[]): Effect.Effect<void, Error> =>\n Effect.gen(function* () {\n const parsed = parseArgs(args)\n\n if (\"help\" in parsed) {\n printCreateHelp()\n return\n }\n\n if (\"error\" in parsed) {\n yield* Console.error(`Error: ${parsed.error}`)\n yield* Console.log(\"\")\n printCreateHelp()\n process.exitCode = 1\n return\n }\n\n // Get options either from args or interactive mode\n const options: CreateOptions =\n \"interactive\" in parsed ? yield* runInteractive() : parsed.options\n\n // Run scaffolding\n yield* scaffold(options)\n })\n\n// Re-export types for programmatic use\nexport type { CreateOptions, ServerType, PackageManager } from \"./types\"\nexport { SERVER_TYPES, isValidServerType } from \"./types\"\nexport { scaffold } from \"./scaffolder\"\n","#!/usr/bin/env node\n/**\n * Effect GraphQL CLI\n *\n * Usage:\n * effect-gql <command> [options]\n *\n * Commands:\n * generate-schema Generate GraphQL SDL from a schema module\n * create Create a new Effect GraphQL project (coming soon)\n */\n\nimport { Effect, Console } from \"effect\"\nimport { runGenerateSchema } from \"./commands/generate-schema\"\nimport { runCreate } from \"./commands/create\"\nimport { spawnSync } from \"child_process\"\nimport { createRequire } from \"module\"\n\nconst require = createRequire(import.meta.url)\n\nconst VERSION = \"0.1.0\"\n\n/**\n * Check if tsx loader is already registered by looking at process flags.\n * When running with `node --import tsx`, the loader is active.\n */\nconst isTsxLoaderActive = (): boolean => {\n // Check if we're running under tsx or have tsx imported\n const execArgv = process.execArgv.join(\" \")\n return execArgv.includes(\"tsx\") || execArgv.includes(\"ts-node\")\n}\n\n/**\n * For generate-schema with TypeScript files, re-execute with tsx loader.\n * Returns true if we re-executed, false if we should continue normally.\n */\nconst maybeReexecWithTsx = (): boolean => {\n const args = process.argv.slice(2)\n\n // Only applies to generate-schema command with a TypeScript file\n if (args[0] !== \"generate-schema\") {\n return false\n }\n\n // Find the module path (first positional argument after command)\n const modulePath = args.slice(1).find((arg) => !arg.startsWith(\"-\"))\n if (!modulePath || !modulePath.endsWith(\".ts\")) {\n return false\n }\n\n // If tsx is already active, continue normally\n if (isTsxLoaderActive()) {\n return false\n }\n\n // Re-execute with tsx loader\n try {\n // Resolve the full path to tsx from this CLI's node_modules\n // This is necessary because --import resolves relative to cwd, not the CLI location\n const tsxPath = require.resolve(\"tsx\")\n\n // Use tsx to run the CLI again with the same arguments\n const result = spawnSync(process.execPath, [\"--import\", tsxPath, ...process.argv.slice(1)], {\n stdio: \"inherit\",\n cwd: process.cwd(),\n env: process.env,\n })\n\n process.exitCode = result.status ?? 1\n return true\n } catch (error) {\n // tsx not available, fall through to try direct import\n // This may fail for multi-file TypeScript schemas\n return false\n }\n}\n\nconst printHelp = (): void => {\n console.log(`\nEffect GraphQL CLI v${VERSION}\n\nUsage: effect-gql <command> [options]\n\nCommands:\n generate-schema Generate GraphQL SDL from a schema module\n create Create a new Effect GraphQL project\n\nOptions:\n -h, --help Show this help message\n -v, --version Show version number\n\nExamples:\n effect-gql generate-schema ./src/schema.ts\n effect-gql generate-schema ./src/schema.ts -o schema.graphql\n effect-gql create my-app --server-type node\n\nRun 'effect-gql <command> --help' for command-specific help.\n`)\n}\n\nconst printVersion = (): void => {\n console.log(`effect-gql v${VERSION}`)\n}\n\n// Check if we need to re-execute with tsx for TypeScript files\nif (maybeReexecWithTsx()) {\n // We re-executed, exit this process\n process.exit(process.exitCode ?? 0)\n}\n\nconst main = Effect.gen(function* () {\n const args = process.argv.slice(2)\n\n if (args.length === 0 || args[0] === \"-h\" || args[0] === \"--help\") {\n printHelp()\n return\n }\n\n if (args[0] === \"-v\" || args[0] === \"--version\") {\n printVersion()\n return\n }\n\n const command = args[0]\n const commandArgs = args.slice(1)\n\n switch (command) {\n case \"generate-schema\":\n yield* runGenerateSchema(commandArgs)\n break\n\n case \"create\":\n yield* runCreate(commandArgs)\n break\n\n default:\n yield* Console.error(`Unknown command: ${command}`)\n printHelp()\n process.exitCode = 1\n }\n})\n\nEffect.runPromise(\n main.pipe(\n Effect.catchAll((error) =>\n Console.error(`Error: ${error.message}`).pipe(\n Effect.andThen(\n Effect.sync(() => {\n process.exitCode = 1\n })\n )\n )\n )\n )\n)\n"]}
|
package/bin.js
CHANGED
|
@@ -5,7 +5,7 @@ import * as fs3 from 'fs';
|
|
|
5
5
|
import * as path2 from 'path';
|
|
6
6
|
import { createRequire } from 'module';
|
|
7
7
|
import * as readline from 'readline';
|
|
8
|
-
import { spawn } from 'child_process';
|
|
8
|
+
import { spawnSync, spawn } from 'child_process';
|
|
9
9
|
|
|
10
10
|
var require2 = createRequire(import.meta.url);
|
|
11
11
|
var defaultUtilities = {
|
|
@@ -261,11 +261,11 @@ var parseArgs2 = (args) => {
|
|
|
261
261
|
|
|
262
262
|
// src/commands/create/templates/package-json.ts
|
|
263
263
|
var VERSIONS = {
|
|
264
|
-
core: "^1.3.
|
|
265
|
-
node: "^1.3.
|
|
266
|
-
bun: "^1.3.
|
|
267
|
-
express: "^1.3.
|
|
268
|
-
web: "^1.3.
|
|
264
|
+
core: "^1.3.4",
|
|
265
|
+
node: "^1.3.4",
|
|
266
|
+
bun: "^1.3.4",
|
|
267
|
+
express: "^1.3.4",
|
|
268
|
+
web: "^1.3.4",
|
|
269
269
|
effect: "^3.19.0",
|
|
270
270
|
platform: "^0.94.0",
|
|
271
271
|
platformNode: "^0.104.0",
|
|
@@ -1292,9 +1292,37 @@ var runCreate = (args) => Effect.gen(function* () {
|
|
|
1292
1292
|
const options = "interactive" in parsed ? yield* runInteractive() : parsed.options;
|
|
1293
1293
|
yield* scaffold(options);
|
|
1294
1294
|
});
|
|
1295
|
-
|
|
1296
|
-
// src/bin.ts
|
|
1295
|
+
var require3 = createRequire(import.meta.url);
|
|
1297
1296
|
var VERSION = "0.1.0";
|
|
1297
|
+
var isTsxLoaderActive = () => {
|
|
1298
|
+
const execArgv = process.execArgv.join(" ");
|
|
1299
|
+
return execArgv.includes("tsx") || execArgv.includes("ts-node");
|
|
1300
|
+
};
|
|
1301
|
+
var maybeReexecWithTsx = () => {
|
|
1302
|
+
const args = process.argv.slice(2);
|
|
1303
|
+
if (args[0] !== "generate-schema") {
|
|
1304
|
+
return false;
|
|
1305
|
+
}
|
|
1306
|
+
const modulePath = args.slice(1).find((arg) => !arg.startsWith("-"));
|
|
1307
|
+
if (!modulePath || !modulePath.endsWith(".ts")) {
|
|
1308
|
+
return false;
|
|
1309
|
+
}
|
|
1310
|
+
if (isTsxLoaderActive()) {
|
|
1311
|
+
return false;
|
|
1312
|
+
}
|
|
1313
|
+
try {
|
|
1314
|
+
const tsxPath = require3.resolve("tsx");
|
|
1315
|
+
const result = spawnSync(process.execPath, ["--import", tsxPath, ...process.argv.slice(1)], {
|
|
1316
|
+
stdio: "inherit",
|
|
1317
|
+
cwd: process.cwd(),
|
|
1318
|
+
env: process.env
|
|
1319
|
+
});
|
|
1320
|
+
process.exitCode = result.status ?? 1;
|
|
1321
|
+
return true;
|
|
1322
|
+
} catch (error) {
|
|
1323
|
+
return false;
|
|
1324
|
+
}
|
|
1325
|
+
};
|
|
1298
1326
|
var printHelp = () => {
|
|
1299
1327
|
console.log(`
|
|
1300
1328
|
Effect GraphQL CLI v${VERSION}
|
|
@@ -1320,6 +1348,9 @@ Run 'effect-gql <command> --help' for command-specific help.
|
|
|
1320
1348
|
var printVersion = () => {
|
|
1321
1349
|
console.log(`effect-gql v${VERSION}`);
|
|
1322
1350
|
};
|
|
1351
|
+
if (maybeReexecWithTsx()) {
|
|
1352
|
+
process.exit(process.exitCode ?? 0);
|
|
1353
|
+
}
|
|
1323
1354
|
var main = Effect.gen(function* () {
|
|
1324
1355
|
const args = process.argv.slice(2);
|
|
1325
1356
|
if (args.length === 0 || args[0] === "-h" || args[0] === "--help") {
|