alchemy-effect 0.6.3 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,6 +18,7 @@ import * as ChildProcess from "effect/unstable/process/ChildProcess";
18
18
 
19
19
  import packageJson from "../package.json" with { type: "json" };
20
20
  import { apply } from "../src/Apply.ts";
21
+ import { provideFreshArtifactStore } from "../src/Artifacts.ts";
21
22
  import * as AWSAccount from "../src/AWS/Account.ts";
22
23
  import {
23
24
  bootstrap as bootstrapAws,
@@ -230,33 +231,35 @@ const execStack = Effect.fn(function* ({
230
231
  const cli = yield* CLI.Cli;
231
232
  const stack = yield* stackEffect;
232
233
 
233
- yield* Effect.gen(function* () {
234
- const updatePlan = yield* Plan.make(
235
- destroy
236
- ? {
237
- ...stack,
238
- // zero these out (destroy will treat all as orphans)
239
- // TODO(sam): probably better to have Plan.destroy and Plan.update
240
- resources: {},
241
- bindings: {},
242
- output: {},
234
+ yield* provideFreshArtifactStore(
235
+ Effect.gen(function* () {
236
+ const updatePlan = yield* Plan.make(
237
+ destroy
238
+ ? {
239
+ ...stack,
240
+ // zero these out (destroy will treat all as orphans)
241
+ // TODO(sam): probably better to have Plan.destroy and Plan.update
242
+ resources: {},
243
+ bindings: {},
244
+ output: {},
245
+ }
246
+ : stack,
247
+ );
248
+ if (dryRun) {
249
+ yield* cli.displayPlan(updatePlan);
250
+ } else {
251
+ if (!yes) {
252
+ const approved = yield* cli.approvePlan(updatePlan);
253
+ if (!approved) {
254
+ return;
243
255
  }
244
- : stack,
245
- );
246
- if (dryRun) {
247
- yield* cli.displayPlan(updatePlan);
248
- } else {
249
- if (!yes) {
250
- const approved = yield* cli.approvePlan(updatePlan);
251
- if (!approved) {
252
- return;
253
256
  }
254
- }
255
- const outputs = yield* apply(updatePlan);
257
+ const outputs = yield* apply(updatePlan);
256
258
 
257
- yield* Console.log(outputs);
258
- }
259
- }).pipe(
259
+ yield* Console.log(outputs);
260
+ }
261
+ }),
262
+ ).pipe(
260
263
  Effect.provide(stack.services),
261
264
  // Effect.provide(Logger.layer([fileLogger("stacks", stack.name, stage)])),
262
265
  );
@@ -184,6 +184,7 @@ interface Output<A = any, Req$1 = any> extends Pipeable {
184
184
  [Symbol.iterator](): Iterator<Yieldable<any, void, never, Req$1>, Accessor<A>, void>;
185
185
  bind(id: string): Effect$1.Effect<Effect$1.Effect<A>, never, ExecutionContext>;
186
186
  asEffect(): Effect$1.Effect<Accessor<A>, never, Req$1>;
187
+ as<T>(): Output<T, Req$1>;
187
188
  }
188
189
  interface Accessor<A> extends Effect$1.Effect<A> {}
189
190
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/Util/data.ts","../../src/Http.ts","../../src/ExecutionContext.ts","../../src/Namespace.ts","../../src/RemovalPolicy.ts","../../src/Resource.ts","../../src/State/ResourceState.ts","../../src/Output.ts","../../src/Input.ts","../../src/Diff.ts","../../src/Provider.ts","../../src/Plan.ts","../../src/Cli/Event.ts","../../src/Cli/Cli.ts","../../src/Cli/InkCLI.tsx"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;KAAY,SAAA;;;KCsBA,4BAA0B,QAAA,CAAO,OAC3C,kBAAA,CAAmB,oBACnB,kBAAkB,eAClB,oBAAoB,QAAQ;;;UClBb,oBAAA;;;OAGV;uBACgB,QAAA,CAAO,OAAO;0BACX,SAAS,QAAA,CAAO;YAC9B,QAAA,CAAO,OAAO;iCAEb,WAAW,SACnB,QAAA,CAAO,oBAAoB;;UAGf,6BACH,uBAAuB,8BAC3B,UAAA,CAAW,4BAA4B,gBAAgB;cAEpD,kBAAgB,iBAAA,sCACd,4BAA4B,gBAAc,iBAAiB;;;UCpBzD,aAAA;;WAEN;;;;cCLqC,oBAAA,UAAA,CAAA,aAAA;cAEnC,aAAA,SAAsB,kBAAA;;;AHsBb,KIqBV,SAAA,GJrBU,MAAA;AAAQ,UIuBb,eJvBa,CAAA,OAAA,GAAA,CAAA,CAAA;EAHQ,GAAA,EAAA,MAAO;EAAM,IAAA,EI4B3C,IJ5B2C;;UI+BlC;;AH9CjB;;EAIqC,SAAA,EGmDxB,aHnDwB,GAAA,SAAA;EAAd;;;;EAEX,GAAA,EAAA,MAAO;EAEK;;;EACnB,IAAA,EGuDG,IHvDI;EAAM;AAGlB;;EACqC,SAAA,EGuDxB,SHvDwB;EACY;;;EAArB,KAAA,EG0DnB,OH1DmB;EAEf;;;EACE,aAAA,EG2DE,aH3DF,CAAA,SAAA,CAAA;EAA4B;EAA+B,UAAA,EG6D5D,YH7D4D;EAAjB;EAAgB,OAAA,EG+D9D,OH/D8D;;;;KIpB7D,aAAA,GACR,wBACA,uBACA,uBACA,uBACA,wBACA,yBACA;KAEQ,OAAA,GAAQ;KACR,IAAA,GAAO;KAEP,cAAA,GAAiB;KACjB,wBAAA,GACR,yBACA;KACQ,2BAAA,GACR,wBACA,uBACA,uBACA,uBACA,wBACA;UAEM,iBAAA;;;;aAIG;;;;ENhCD,SAAA,EAAA,MAAS;;;;ECsBT,eAAU,EAAA,MAAA;EACpB;EACA,MAAA,EKkBQ,cLlBR;EAAkB;EAClB,UAAA,EAAA,MAAA,EAAA;EAAoB;EAAQ,QAAA,EKqBlB,eLrBkB,EAAA;EAHQ;EAAa,KAAA,CAAA,EK0BzC,OL1ByC;;SK4B1C;;EJ3CQ,aAAA,CAAA,EI6CC,aJ7CmB,CAAA,SAAA,CAAA;;AAIA,UI4CpB,qBAAA,SAA8B,iBJ5CV,CAAA;EAAd,MAAO,EAAA,UAAA;EACJ;EAAS,KAAA,EI8C1B,OJ9CiC;;AAC9B,UIgDK,oBAAA,SAA6B,iBJhD3B,CAAA;EAEK,MAAA,EAAA,SAAA;EAAX;EACmB,KAAA,EIgDvB,OJhDuB;EAA3B;EAAa,IAAA,EIkDV,IJlDU;AAGlB;AACc,UIiDG,oBAAA,SAA6B,iBJjDhC,CAAA;EAAuB,MAAA,EAAA,UAAA;EACY;EAAgB,KAAA,EImDxD,OJnDwD;EAAvD,GAAA,EAAA;IAAkB;IAEf,KAAA,EIoDF,OJpDE;IAAgB;IAAA,QAAA,EAAA,GAAA,EAAA;IACd;IAA4B,IAAA,EIuDjC,IJvDiC;EAA+B,CAAA;;AAAD,UI6DxD,oBAAA,SAA6B,iBJ7D2B,CAAA;;;SIgEhE;EHpFQ;QGsFT;;UAGS,qBAAA,SAA8B;EF5FC,MAAA,EAAA,UAAA;EAEnC;QE6FL;;UAGS,sBAAA,SAA+B;EDrDpC,MAAA,EAAA,WAAS;EAEJ;EAKA,KAAA,ECiDR,ODjDQ;EASJ;EASL,GAAA,ECiCD,2BDjCC;EAIK;EAIJ,WAAA,EAAA,OAAA;;AAMK,UCwBG,qBAAA,SAA8B,iBDxBjC,CAAA;EAEH,MAAA,EAAA,UAAA;EAAO;SCyBT;;QAED;EA9GI;EACR,GAAA,EA+GG,2BA/GH;EACA;EACA,WAAA,EAAA,OAAA;;;;UCiCa,qCAAmC;;;;cAItC;;EP5CF,SAAA,GAAS,EO8CL,KP9CK;;uBOgDE,SACnB,4BAA4B,QAC5B,SAAS;oBAGO,QAAA,CAAO,OAAO,QAAA,CAAO,OAAO,WAAW;EN/B/C,QAAA,EAAA,EMgCE,QAAA,CAAO,MNhCC,CMgCM,QNhCN,CMgCe,CNhCf,CAAA,EAAA,KAAA,EMgC0B,KNhC1B,CAAA;;AAEpB,UMiCe,QNjCf,CAAA,CAAA,CAAA,SMiCmC,QAAA,CAAO,MNjC1C,CMiCiD,CNjCjD,CAAA,CAAA;;;KOnBU,QAAA;KACA,WAAA;KACP,UAAA;;;KAEO,WACR,IACA,OAAO,KAEP,OAAO,gBACN,UAAU,CAAA,CAAE,sBAGL,OAAO,WACN,UAAU,oBAEP,iCACiB,cACb,MAAM,eACN,OAAO,KACT,iCACgB,IAAI,MAAM,EAAE;kBAUrB,KAAA;oBACE;IRpCf,IAAA,EAAA,MAAS;;oBQyCD,aAAa,QAAQ,WAAW,KPnBxC,GOqBN,CPrBM,SOqBI,MPrBM,CAAA,KAAA,EAAA,CAAA,GOsBd,CPtBc,GOuBd,CPvBc,SOwBR,SPxBQ,GOyBR,WPzBQ,GO0BR,QP1BQ,GO2BR,CAAA,CAAE,MP3BM,CAAA,GAAA,CAAA,GO4BR,UP5BQ,GO6BZ,CP7BY,GO8BZ,CP9BY,SAAA,GAAA,EAAA,GO+BV,YP/BU,CO+BG,CP/BH,CAAA,GOgCV,CPhCU,SOgCA,MPhCA,CAAA,MAAA,EAAA,GAAA,CAAA,GAAA,QACpB,MOiC0B,CPjCP,GOiCW,KAAA,CAAM,OPjCjB,COiCyB,CPjCzB,COiC2B,CPjC3B,CAAA,CAAA,EACnB,GAAA,KAAA;EAAkB,KAAA,YAAA,CAAA,UAAA,GAAA,EAAA,CAAA,GAAA,MAAA,SOoCyC,CPpCzC,CAAA,QAAA,CAAA,GOqCd,OPrCc,COqCN,CPrCM,CAAA,MAAA,CAAA,CAAA,EAAA,GOsCd,YPtCc,COsCD,CPtCC,CAAA;EAClB,KAAA,YAAA,CAAA,UAAA,GAAA,EAAA,EAAA,cAAA,GAAA,EAAA,GAAA,EAAA,CAAA,GO2CI,CP3CJ,SAAA,CAAA,KAAA,EAAA,EAAA,GAAA,KAAA,KAAA,CAAA,GO4CI,YP5CJ,CO4CiB,IP5CjB,EAAA,CAAA,GO4C2B,KP5C3B,EO4CkC,KAAA,CAAM,OP5CxC,CO4CgD,CP5ChD,CAAA,CAAA,CAAA,GO6CI,KP7CJ;EAAoB,KAAA,YAAA,CAAA,gBO+CmB,MP/CnB,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,GAAA,QAAQ,MOgDd,OPhDc,GOgDN,KAAA,CAAM,OPhDA,COgDQ,OPhDR,COgDc,CPhDd,CAAA,CAAA,EAHQ;EAAa,KAAA,aAAA,CAAA,CAAA,CAAA,GAAA,IAAA,SOyDlC,KPzDkC,COyD5B,CPzD4B,CAAA,GOyDvB,UPzDuB,COyDZ,CPzDY,CAAA,GOyDP,OPzDO,COyDC,CPzDD,CAAA;kBO0D1B,UAAU;uBAEL,UAAU,kBAAkB;;AN3EzC,KM8EL,MN9EK,CAAA,UAAoB,GAAA,EAAA,EAAA,YAAA,GAAA,EAAA,GAAA,EAAA,CAAA,GM8EyB,CN9EzB,SAAA,CAG9B,KAAA,EAAA,EAC8B,GAAA,KAAA,EAAA,CAAd,GM8EnB,MN9E0B,CM8EnB,CN9EmB,EAAA,CAAA,GM8EZ,GN9EY,EM8EP,KN9EO,CM8ED,CN9EC,CAAA,CAAA,CAAA,GM+E1B,GN/E0B;;;KOJlB,IAAA,GAAO,WAAW,aAAa;UAE1B,QAAA;;;;UAKA,UAAA;;;;;UAMA,WAAA;;;;ATpBjB;;;KUyBK,wBAAwB,iBAAiB;;KAG1C,gBAAgB;KAGf,kBAAkB,sBAAsB,6BACzC,2BACA;UAEa,OAAA;EVnCL,SAAA,EUoCC,IVpCQ;;;UUwCJ,SAAA;ETlBL,KAAA,CAAA,ESmBF,ITnBE;EACV,KAAA,CAAA,EAAA,MAAA;;AACkB,USqBH,eTrBG,CAAA,YSsBN,YTtBM,GSsBS,YTtBT,EAAA,UAAA,KAAA,EAAA,UAAA,KAAA,EAAA,eAAA,KAAA,EAAA,YAAA,KAAA,EAAA,YAAA,KAAA,EAAA,YAAA,KAAA,EAAA,UAAA,KAAA,EAAA,UAAA,KAAA,CAAA,CAAA;EAClB;;;;;;;;AClBF;;EAIqC,IAAA,EAAA,KAAA,EAAA;IAAd,EAAO,EAAA,MAAA;IACJ,UAAA,EAAA,MAAA;IAAS,KAAO,EQyD/B,KRzD+B,CQyDzB,GRzDyB,CAAA;IAChB,MAAA,EQyDd,GRzDc,CAAA,YAAA,CAAA;EAAd,CAAA,CAAA,EQ0DN,MAAA,CAAO,MR1DM,CQ0DC,OR1DD,EAAA,GAAA,EQ0De,OR1Df,CAAA;EAEK;;;;EACN,IAAA,EAAA,KAAA,EAAA;IAGD,EAAA,EAAA,MAAA;IACH,UAAA,EAAA,MAAA;IAAuB,KAAA,EQ2D1B,KR3D0B,CQ2DpB,GR3DoB,CAAA;IACY,MAAA,EQ2DrC,GR3DqC,CAAA,YAAA,CAAA;IAAgB,OAAA,EQ4DpD,SR5DoD;EAAvD,CAAA,CAAA,EQ6DJ,QAAA,CAAO,MR7DQ,CQ6DD,OR7DC,EAAA,EAAA,GAAA,EQ6De,OR7Df,CAAA;EAAO,IAAA,EAAA,KAAA,EAAA;IAEf,EAAA,EAAA,MAAA;IAAgB,UAAA,EAAA,MAAA;IAAA,IAAA,EQoEnB,KRpEmB,CQoEb,GRpEa,CAAA;IACd,MAAA,EQqEH,GRrEG,CAAA,YAAA,CAAA,GAAA,SAAA;EAA4B,CAAA,CAAA,EQsErC,QAAA,CAAO,MRtE8B,CQsEvB,GRtEuB,CAAA,YAAA,CAAA,GAAA,SAAA,EAAA,GAAA,EQsEa,ORtEb,CAAA;EAA+B;;;YQ0E9D,cAAc;;;IP9FT,UAAA,EAAa,MAAA;UOkGpB,MAAM;UAGN,MAAM,MAAM;iBACL,YAAY;INzGmB,WAAA,EM0G/B,KN1G+B,CM0GzB,WN1GyB,CM0Gb,GN1Ga,CAAA,CAAA;IAEnC,MAAA,EMyGD,GNzGC,CAAc,YAAA,CAAQ,GAAA,SAAA;MM0G7B,QAAA,CAAO,OAAO,kBAAkB;;;IL/D1B,IAAA,EKmEF,KLnEW,CKmEL,GLnEK,CAAA;IAEJ,UAAA,EAAA,MAAe;IAKf,OAAA,EK8DJ,uBL9DgB;EAShB,CAAA,CAAA,EKsDP,QAAA,CAAO,MLtDA,CKsDO,GLtDP,CAAA,YAAA,CAAA,EAAA,GAAA,EKsD+B,YLtD/B,CAAA;EASL,MAAA,CAAA,KAAA,EAAA;IAIK,EAAA,EAAA,MAAA;IAIJ,UAAA,EAAA,MAAA;IAIQ,IAAA,EKqCP,KLrCO,CKqCD,GLrCC,CAAA;IAEH,OAAA,EKoCD,uBLpCC;IAEH,QAAA,EKmCG,WLnCH,CKmCe,GLnCf,CAAA;IAAO,MAAA,CAAA,EKoCL,GLpCK,CAAA,YAAA,CAAA;MKqCZ,QAAA,CAAO,OAAO,wBAAwB;;;IJxHhC,UAAA,EAAa,MAAA;IACrB,IAAA,EI2HM,KJ3HN,CI2HY,GJ3HZ,CAAA;IACA,IAAA,EI2HM,KJ3HN,CI2HY,GJ3HZ,CAAA;IACA,MAAA,EI2HQ,GJ3HR,CAAA,YAAA,CAAA;IACA,OAAA,EI2HS,uBJ3HT;IACA,QAAA,EI2HU,WJ3HV,CI2HsB,GJ3HtB,CAAA;EACA,CAAA,CAAA,EI2HE,QAAA,CAAO,MJ3HT,CI2HgB,GJ3HhB,CAAA,YAAA,CAAA,EAAA,GAAA,EI2HwC,SJ3HxC,CAAA;EACA,MAAA,CAAA,KAAA,EAAA;IAAqB,EAAA,EAAA,MAAA;IAEb,UAAK,EAAA,MAAG;IACR,IAAI,EI2HN,KJ3HM,CI2HA,GJ3HG,CAAA;IAEP,MAAA,EI0HA,GJ1HA,CAAA,YAAc,CAAG;IACjB,OAAA,EI0HC,uBJ1HuB;IAGxB,QAAA,EIwHE,WJxHF,CIwHc,GJxHd,CAA2B;EACnC,CAAA,CAAA,EIwHE,QAAA,CAAO,MJxHT,CAAA,IAAA,EAAA,GAAA,EIwH2B,SJxH3B,CAAA;;;;KKoCQ,gBAAgB,eAAe,gBACvC,OAAO,KACP,OAAO,KACP,QAAQ,KACR,WAAW;KAEH,aAAA;UAEK,gCAAgC;UACvC;QACF;;AXnEI,UWsEK,QXtEI,CAAA,UWuET,YXvES,CAAA,MAAA,CAAA,GWuEc,YXvEd,CAAA,MAAA,CAAA,CAAA,CAAA;YWyET;YACA,gBAAgB;;EVpDhB,QAAA,EUsDA,WVtDU,CUsDE,CVtDF,CAAA,SAAA,CAAA,CAAA,EAAA;;AAEpB,UUuDe,MVvDf,CAAA,UUwDU,YVxDV,GUwDyB,YVxDzB,CAAA,SUyDQ,QVzDR,CUyDiB,CVzDjB,CAAA,CAAA;EAAkB,MAAA,EAAA,QAAA;EAClB,KAAA,EU0DO,CV1DP,CAAA,OAAA,CAAA;EAAoB,KAAA,EU2Db,qBV3Da,GAAA,SAAA;;AAHgB,UUiErB,MVjE4B,CAAA,UUkEjC,YVlEiC,GUkElB,YVlEkB,CAAA,SUmEnC,QVnEmC,CUmE1B,CVnE0B,CAAA,CAAA;EAAM,MAAA,EAAA,QAAA;SUqE1C;SAEH,uBACA,uBACA,uBAGA;;AT3FW,US8FA,MT9FA,CAAA,US+FL,YT/FyB,GS+FV,YT/FU,CAAA,SSgG3B,QThG2B,CSgGlB,CThGkB,CAAA,CAAA;EAG9B,MAAA,EAAA,QAAA;EAC8B,KAAA,ES+F5B,aT/F4B;;AACX,USiGT,UTjGS,CAAA,USkGd,YTlGc,GSkGC,YTlGD,CAAA,SSmGhB,QTnGgB,CSmGP,CTnGO,CAAA,CAAA;EAAS,MAAO,EAAA,MAAA;EAChB,KAAA,ESoGjB,oBTpGiB,GSoGM,oBTpGN;;AAEF,USqGP,OTrGO,CAAA,USsGZ,YTtGY,GSsGG,YTtGH,CAAA,SSuGd,QTvGc,CSuGL,CTvGK,CAAA,CAAA;EAAX,MAAA,EAAA,SAAA;EACmB,KAAA,EAAA,GAAA;EAA3B,WAAO,EAAA,OAAA;EAAM,OAAA,CAAA,EAAA,OAAA;EAGD,KAAA,ESyGX,qBTzG2B,GS0G3B,oBT1G2B,GS2G3B,oBT3G2B,GS4G3B,oBT5G2B,GS6G3B,sBT7G2B,GS8G3B,qBT9G2B;;AACI,KSgHzB,IThHyB,CAAA,WAAA,GAAA,CAAA,GAAA;EACY,SAAA,EAAA,SAAgB,MAAA,GSiH7C,KTjH6C,CAAA,GAAA,CAAA,EAAvD;EAAkB,SAAA,EAAA,SAEf,MAAA,ISkHQ,MThHY,CSgHL,YThHK,CAAA,EAFJ;EAAA,MAAA,ESoHnB,QTpHmB;CACd;;;KUxBH,WAAA;KAgBA,UAAA,GAAa,gBAAgB;UAExB,aAAA;;;;;UAMA,iBAAA;;;;UAIP;;;;;;UCvBO,iBAAA;gBACD,eAAe,QAAA,CAAO;cACxB,QAAA,CAAO;;UAGJ,uBAAA,SAAgC;0BACvB,QAAA,CAAO;;UAGhB,UAAA;4BACS,YAAY,QAAM,QAAA,CAAO;4BACzB,YAAY,QAAM,QAAA,CAAO;kCACnB,YACtB,QACH,QAAA,CAAO,OAAO;;cACpB;AbpBW,casBC,GAAA,SAAY,QAAA,CbtBJ;;;ccWR,cAAM,KAAA,CAAA,MAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/Util/data.ts","../../src/Http.ts","../../src/ExecutionContext.ts","../../src/Namespace.ts","../../src/RemovalPolicy.ts","../../src/Resource.ts","../../src/State/ResourceState.ts","../../src/Output.ts","../../src/Input.ts","../../src/Diff.ts","../../src/Provider.ts","../../src/Plan.ts","../../src/Cli/Event.ts","../../src/Cli/Cli.ts","../../src/Cli/InkCLI.tsx"],"sourcesContent":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alchemy-effect",
3
- "version": "0.6.3",
3
+ "version": "0.7.0",
4
4
  "homepage": "https://alchemy.run",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Sam Goodwin <sam@alchemy.run>",
@@ -146,6 +146,11 @@
146
146
  "bun": "./src/State/index.ts",
147
147
  "import": "./lib/State/index.js"
148
148
  },
149
+ "./Test/Bun": {
150
+ "types": "./src/Test/Bun.d.ts",
151
+ "bun": "./src/Test/Bun.ts",
152
+ "import": "./lib/Test/Bun.js"
153
+ },
149
154
  "./Util": {
150
155
  "types": "./src/Util/index.d.ts",
151
156
  "bun": "./src/Util/index.ts",
@@ -170,7 +175,8 @@
170
175
  "@aws-sdk/credential-providers": "^3.0.0",
171
176
  "@distilled.cloud/aws": "^0.7.11",
172
177
  "@distilled.cloud/cloudflare": "^0.7.11",
173
- "@distilled.cloud/cloudflare-rolldown-plugin": "^0.1.2",
178
+ "@distilled.cloud/cloudflare-rolldown-plugin": "0.2.0",
179
+ "@distilled.cloud/cloudflare-vite-plugin": "0.1.0",
174
180
  "@distilled.cloud/core": "^0.7.11",
175
181
  "@effect/vitest": "4.0.0-beta.43",
176
182
  "@libsql/client": "^0.17.0",
@@ -216,7 +222,8 @@
216
222
  "peerDependencies": {
217
223
  "@effect/platform-bun": "*",
218
224
  "@effect/platform-node": "*",
219
- "effect": "*"
225
+ "effect": "*",
226
+ "vite": "^8.0.7"
220
227
  },
221
228
  "peerDependenciesMeta": {
222
229
  "@effect/platform-node": {
@@ -227,6 +234,9 @@
227
234
  },
228
235
  "effect": {
229
236
  "optional": true
237
+ },
238
+ "vite": {
239
+ "optional": true
230
240
  }
231
241
  }
232
242
  }
@@ -189,13 +189,11 @@ export const StaticSite = Construct.fn(function* (
189
189
  ? yield* Command("Build", {
190
190
  command: props.build.command,
191
191
  cwd: sitePath,
192
- hash: props.build.include ?? ["**/*"],
193
- exclude: [
194
- ...(props.build.exclude ?? []),
195
- `**/${props.build.output}/**`,
196
- "**/node_modules/**",
197
- "**/.git/**",
198
- ],
192
+ memo: {
193
+ include: props.build.include,
194
+ exclude: props.build.exclude,
195
+ lockfile: props.build.lockfile,
196
+ },
199
197
  outdir: props.build.output,
200
198
  env: props.environment,
201
199
  })
@@ -91,14 +91,26 @@ export interface StaticSiteBuildProps {
91
91
  */
92
92
  output: string;
93
93
  /**
94
- * Optional glob list used to hash build inputs.
95
- * @default all files under `path`
94
+ * Glob patterns of files to hash. Paths are relative to `path`.
95
+ * When the hash of matched files changes, the build will re-run.
96
+ *
97
+ * @default ["**\/*"] (all files, filtered by `exclude`)
98
+ * @example ["src/**", "package.json", "tsconfig.json"]
96
99
  */
97
100
  include?: string[];
98
101
  /**
99
- * Optional glob list excluded from build input hashing.
102
+ * Glob patterns to exclude from input hashing. Paths are relative to `path`.
103
+ *
104
+ * @default gitignore rules collected from the working directory up to the repo root
100
105
  */
101
106
  exclude?: string[];
107
+ /**
108
+ * Whether to include the nearest package-manager lockfile in the hash,
109
+ * even when it lives above the site directory (e.g. monorepo root).
110
+ *
111
+ * @default true when both `include` and `exclude` are unset; false otherwise
112
+ */
113
+ lockfile?: boolean;
102
114
  }
103
115
 
104
116
  export interface StaticSiteAssetsProps {
package/src/Apply.ts CHANGED
@@ -1,7 +1,14 @@
1
1
  import * as Deferred from "effect/Deferred";
2
2
  import * as Effect from "effect/Effect";
3
- import * as Layer from "effect/Layer";
4
3
  import type { Simplify } from "effect/Types";
4
+ import {
5
+ Artifacts,
6
+ ArtifactStore,
7
+ createArtifactStore,
8
+ ensureArtifactStore,
9
+ makeScopedArtifacts,
10
+ } from "./Artifacts.ts";
11
+ import * as Option from "effect/Option";
5
12
  import {
6
13
  type PlanStatusSession,
7
14
  type ScopedPlanStatusSession,
@@ -59,6 +66,21 @@ interface ResourceTracker {
59
66
  instanceId: string;
60
67
  }
61
68
 
69
+ const provideLifecycleScope =
70
+ (fqn: string, instanceId: string) =>
71
+ <A, E, R>(
72
+ effect: Effect.Effect<A, E, R>,
73
+ ): Effect.Effect<A, E, Exclude<R, InstanceId | Artifacts>> =>
74
+ Effect.serviceOption(ArtifactStore).pipe(
75
+ Effect.map(Option.getOrElse(createArtifactStore)),
76
+ Effect.flatMap((store) =>
77
+ effect.pipe(
78
+ Effect.provideService(Artifacts, makeScopedArtifacts(store, fqn)),
79
+ Effect.provideService(InstanceId, instanceId),
80
+ ),
81
+ ),
82
+ ) as Effect.Effect<A, E, Exclude<R, InstanceId | Artifacts>>;
83
+
62
84
  export const apply = <P extends Plan>(
63
85
  plan: P,
64
86
  ): Effect.Effect<
@@ -66,68 +88,70 @@ export const apply = <P extends Plan>(
66
88
  Output.InvalidReferenceError | Output.MissingSourceError | StateStoreError,
67
89
  Cli | State | Stack | Stage
68
90
  > =>
69
- Effect.gen(function* () {
70
- const cli = yield* Cli;
71
- const session = yield* cli.startApplySession(plan);
72
- const state = yield* State;
73
- const stack = yield* Stack;
74
- const stage = yield* Stage;
75
- const stackName = stack.name;
76
-
77
- const tracker: Record<string, ResourceTracker> = {};
78
- const terminalStatuses = new Map<
79
- string,
80
- {
81
- id: string;
82
- type: string;
83
- status: Extract<ApplyStatus, "created" | "updated">;
84
- }
85
- >();
86
-
87
- yield* executePlan(
88
- plan,
89
- tracker,
90
- terminalStatuses,
91
- session,
92
- state,
93
- stackName,
94
- stage,
95
- );
91
+ ensureArtifactStore(
92
+ Effect.gen(function* () {
93
+ const cli = yield* Cli;
94
+ const session = yield* cli.startApplySession(plan);
95
+ const state = yield* State;
96
+ const stack = yield* Stack;
97
+ const stage = yield* Stage;
98
+ const stackName = stack.name;
99
+
100
+ const tracker: Record<string, ResourceTracker> = {};
101
+ const terminalStatuses = new Map<
102
+ string,
103
+ {
104
+ id: string;
105
+ type: string;
106
+ status: Extract<ApplyStatus, "created" | "updated">;
107
+ }
108
+ >();
96
109
 
97
- // TODO(sam): support roll back to previous state if errors occur during expansion
98
- // -> RISK: some UPDATEs may not be reversible (i.e. trigger replacements)
99
- // TODO(sam): should pivot be done separately? E.g shift traffic?
110
+ yield* executePlan(
111
+ plan,
112
+ tracker,
113
+ terminalStatuses,
114
+ session,
115
+ state,
116
+ stackName,
117
+ stage,
118
+ );
100
119
 
101
- yield* collectGarbage(plan, session);
120
+ // TODO(sam): support roll back to previous state if errors occur during expansion
121
+ // -> RISK: some UPDATEs may not be reversible (i.e. trigger replacements)
122
+ // TODO(sam): should pivot be done separately? E.g shift traffic?
102
123
 
103
- yield* converge(
104
- plan,
105
- tracker,
106
- terminalStatuses,
107
- session,
108
- state,
109
- stackName,
110
- stage,
111
- );
124
+ yield* collectGarbage(plan, session);
112
125
 
113
- yield* Effect.forEach(
114
- Array.from(terminalStatuses.values()),
115
- ({ id, type, status }) =>
116
- session.emit({ kind: "status-change", id, type, status }),
117
- { concurrency: "unbounded" },
118
- );
126
+ yield* converge(
127
+ plan,
128
+ tracker,
129
+ terminalStatuses,
130
+ session,
131
+ state,
132
+ stackName,
133
+ stage,
134
+ );
119
135
 
120
- yield* session.done();
136
+ yield* Effect.forEach(
137
+ Array.from(terminalStatuses.values()),
138
+ ({ id, type, status }) =>
139
+ session.emit({ kind: "status-change", id, type, status }),
140
+ { concurrency: "unbounded" },
141
+ );
121
142
 
122
- if (!plan.output) {
123
- return undefined;
124
- }
143
+ yield* session.done();
125
144
 
126
- const outputs = Object.fromEntries(
127
- Object.entries(tracker).map(([fqn, t]) => [fqn, t.output]),
128
- );
129
- return yield* Output.evaluate(plan.output, outputs);
130
- });
145
+ if (!plan.output) {
146
+ return undefined;
147
+ }
148
+
149
+ const outputs = Object.fromEntries(
150
+ Object.entries(tracker).map(([fqn, t]) => [fqn, t.output]),
151
+ );
152
+ return yield* Output.evaluate(plan.output, outputs);
153
+ }),
154
+ );
131
155
 
132
156
  // ── Phase 1: concurrent initial execution ──────────────────────────────────
133
157
  //
@@ -381,12 +405,14 @@ const executeNode = (
381
405
  // Some resources need a placeholder physical resource before their real
382
406
  // create can finish. Persist that stub so downstream evaluation can proceed.
383
407
  yield* report("pre-creating");
384
- attr = yield* node.provider.precreate({
385
- id: logicalId,
386
- news: node.props,
387
- session: scopedSession,
388
- instanceId,
389
- });
408
+ attr = yield* node.provider
409
+ .precreate({
410
+ id: logicalId,
411
+ news: node.props,
412
+ session: scopedSession,
413
+ instanceId,
414
+ })
415
+ .pipe(provideLifecycleScope(fqn, instanceId));
390
416
  yield* commit<CreatingResourceState>({
391
417
  status: "creating",
392
418
  fqn,
@@ -424,14 +450,16 @@ const executeNode = (
424
450
  yield* Output.evaluate(node.bindings, outputs),
425
451
  );
426
452
 
427
- attr = yield* node.provider.create({
428
- id: logicalId,
429
- news,
430
- instanceId,
431
- bindings: bindingOutputs,
432
- session: scopedSession,
433
- output: attr,
434
- });
453
+ attr = yield* node.provider
454
+ .create({
455
+ id: logicalId,
456
+ news,
457
+ instanceId,
458
+ bindings: bindingOutputs,
459
+ session: scopedSession,
460
+ output: attr,
461
+ })
462
+ .pipe(provideLifecycleScope(fqn, instanceId));
435
463
 
436
464
  yield* commit<CreatedResourceState>({
437
465
  status: "created",
@@ -519,16 +547,18 @@ const executeNode = (
519
547
  yield* Output.evaluate(node.bindings, outputs),
520
548
  );
521
549
 
522
- const attr = yield* node.provider.update({
523
- id: logicalId,
524
- news,
525
- instanceId,
526
- bindings: bindingOutputs,
527
- session: scopedSession,
528
- olds: previousProps,
529
- // @ts-expect-error - type system says this can be undefined, can it be?
530
- output: node.state.attr,
531
- });
550
+ const attr = yield* node.provider
551
+ .update({
552
+ id: logicalId,
553
+ news,
554
+ instanceId,
555
+ bindings: bindingOutputs,
556
+ session: scopedSession,
557
+ olds: previousProps,
558
+ // @ts-expect-error - type system says this can be undefined, can it be?
559
+ output: node.state.attr,
560
+ })
561
+ .pipe(provideLifecycleScope(fqn, instanceId));
532
562
 
533
563
  if (node.state.status === "replaced") {
534
564
  yield* commit<ReplacedResourceState>({
@@ -620,12 +650,14 @@ const executeNode = (
620
650
 
621
651
  if (node.provider.precreate && attr === undefined) {
622
652
  yield* report("pre-creating");
623
- attr = yield* node.provider.precreate({
624
- id: logicalId,
625
- news: node.props,
626
- session: scopedSession,
627
- instanceId,
628
- });
653
+ attr = yield* node.provider
654
+ .precreate({
655
+ id: logicalId,
656
+ news: node.props,
657
+ session: scopedSession,
658
+ instanceId,
659
+ })
660
+ .pipe(provideLifecycleScope(fqn, instanceId));
629
661
  yield* commit<ReplacingResourceState>({
630
662
  status: "replacing",
631
663
  fqn,
@@ -665,14 +697,16 @@ const executeNode = (
665
697
  yield* Output.evaluate(node.bindings, outputs),
666
698
  );
667
699
 
668
- attr = yield* node.provider.create({
669
- id: logicalId,
670
- news,
671
- instanceId,
672
- bindings: bindingOutputs,
673
- session: scopedSession,
674
- output: attr,
675
- });
700
+ attr = yield* node.provider
701
+ .create({
702
+ id: logicalId,
703
+ news,
704
+ instanceId,
705
+ bindings: bindingOutputs,
706
+ session: scopedSession,
707
+ output: attr,
708
+ })
709
+ .pipe(provideLifecycleScope(fqn, instanceId));
676
710
 
677
711
  yield* commit<ReplacedResourceState>({
678
712
  // Creation of the new generation succeeded; from here on the only remaining
@@ -710,7 +744,7 @@ const executeNode = (
710
744
 
711
745
  // @ts-expect-error - node is never, this should be unreachable
712
746
  return yield* Effect.die(`Unknown action: ${node.action}`);
713
- }).pipe(Effect.provide(Layer.succeed(InstanceId, instanceId)));
747
+ });
714
748
  }) as Effect.Effect<void, never, never>;
715
749
 
716
750
  // ── Phase 3: imperative convergence loop ───────────────────────────────────
@@ -796,7 +830,7 @@ const converge = Effect.fnUntraced(function* (
796
830
  olds: oldProps,
797
831
  output: tracker[fqn].output,
798
832
  })
799
- .pipe(Effect.provide(Layer.succeed(InstanceId, instanceId)));
833
+ .pipe(provideLifecycleScope(fqn, instanceId));
800
834
 
801
835
  tracker[fqn] = {
802
836
  output: attr,
@@ -851,13 +885,13 @@ const collectGarbage = Effect.fnUntraced(function* (
851
885
  deletionGraph: Record<string, Delete | ReplacedResourceState | undefined>,
852
886
  ) {
853
887
  const deletions: {
854
- [fqn in string]: Effect.Effect<void, StateStoreError, never>;
888
+ [fqn in string]: Effect.Effect<void, StateStoreError, ArtifactStore>;
855
889
  } = {};
856
890
 
857
891
  const deleteResource = (
858
892
  node: Delete | ReplacedResourceState,
859
893
  ancestors: ReadonlySet<string> = new Set(),
860
- ): Effect.Effect<void, StateStoreError, never> =>
894
+ ): Effect.Effect<void, StateStoreError, ArtifactStore> =>
861
895
  Effect.gen(function* () {
862
896
  const isDeleteNode = (
863
897
  node: Delete | ReplacedResourceState,
@@ -964,14 +998,16 @@ const collectGarbage = Effect.fnUntraced(function* (
964
998
  }
965
999
 
966
1000
  if (attr !== undefined) {
967
- yield* provider.delete({
968
- id: logicalId,
969
- instanceId,
970
- olds: props as never,
971
- output: attr,
972
- session: scopedSession,
973
- bindings: [],
974
- });
1001
+ yield* provider
1002
+ .delete({
1003
+ id: logicalId,
1004
+ instanceId,
1005
+ olds: props as never,
1006
+ output: attr,
1007
+ session: scopedSession,
1008
+ bindings: [],
1009
+ })
1010
+ .pipe(provideLifecycleScope(fqn, instanceId));
975
1011
  }
976
1012
 
977
1013
  if (isDeleteNode(node)) {
@@ -1024,7 +1060,7 @@ const collectGarbage = Effect.fnUntraced(function* (
1024
1060
  }
1025
1061
  yield* scopedSession.note("Replaced resource cleanup complete.");
1026
1062
  }
1027
- }).pipe(Effect.provide(Layer.succeed(InstanceId, instanceId))),
1063
+ }),
1028
1064
  ));
1029
1065
  });
1030
1066