@samebase/alchemy-convex 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,19 +12,22 @@ This is a community provider, maintained by [Samebase](https://samebase.com). Th
12
12
  follows the "Convex Plain" mode of [rjdellecese/confect#408](https://github.com/rjdellecese/confect/issues/408).
13
13
  [docs/design/convex-plane.md](docs/design/convex-plane.md) records the decisions.
14
14
 
15
- Status: pinned to `alchemy@2.0.0-beta.83` and Effect 4. Alchemy ships breaking changes between
15
+ Status: pinned to `alchemy@2.0.0-beta.84` and Effect 4. Alchemy ships breaking changes between
16
16
  betas; upgrade this package and Alchemy together. A live test runs the full sequence with the real
17
17
  Convex CLI: create, push, no-op, change, preview, deploy keys alone, and destroy.
18
18
 
19
19
  ## Install
20
20
 
21
21
  ```sh
22
- pnpm add -D @samebase/alchemy-convex alchemy@2.0.0-beta.83 effect@^4.0.0 @effect/platform-node@^4.0.0 convex
22
+ pnpm add -D @samebase/alchemy-convex alchemy@2.0.0-beta.84 effect@^4.0.5 @effect/platform-node@^4.0.5 convex
23
23
  ```
24
24
 
25
25
  Use one version for `effect` and for each `@effect/*` package. A mix fails at load time, such as
26
26
  `@effect/platform-node-shared` 4.0.5 next to `effect` 4.0.3.
27
27
 
28
+ Alchemy providers are separate packages. The example below also needs
29
+ `@alchemy.run/cloudflare@2.0.0-beta.84`, the same version as `alchemy`.
30
+
28
31
  ## Example
29
32
 
30
33
  ```ts
@@ -60,7 +63,7 @@ export default Alchemy.Stack(
60
63
  );
61
64
  ```
62
65
 
63
- The imports are `alchemy`, `alchemy/Cloudflare`, `alchemy/RemovalPolicy`, `effect/Config`,
66
+ The imports are `alchemy`, `@alchemy.run/cloudflare`, `alchemy/RemovalPolicy`, `effect/Config`,
64
67
  `effect/Effect`, `effect/Layer`, and `@samebase/alchemy-convex` as `Convex`. Order follows the
65
68
  outputs: the project exists before its deployment, and the push finishes before the site build. The
66
69
  first `alchemy deploy --stage prod` takes over the existing project, and its production
@@ -91,6 +94,55 @@ Effect.gen(function* () {
91
94
  State always holds `rootDir`, `"."` included, so a reader of the state finds the app directory of
92
95
  each deployment.
93
96
 
97
+ ### Resources associated with an installed component
98
+
99
+ Keep the component's native Alchemy resource declarations. Connect their namespace to the installed
100
+ component name in the consuming app's stack. The name comes from the app's `convex.config.ts`:
101
+ `app.use(mail, { name: "mail" })` installs the component as `"mail"`.
102
+
103
+ ```ts
104
+ import { bindComponent } from "@samebase/alchemy-convex";
105
+ import * as Effect from "effect/Effect";
106
+
107
+ // `production` is this app's Convex.Deployment. EmailInbox creates its resources under "Mail".
108
+ Effect.gen(function* () {
109
+ const inbox = yield* EmailInbox("Mail", {
110
+ convexSiteUrl: production.siteUrl,
111
+ zone,
112
+ sendingDomain,
113
+ });
114
+ yield* bindComponent({
115
+ deployment: production,
116
+ component: "mail",
117
+ namespace: inbox.worker.Namespace,
118
+ });
119
+ });
120
+ ```
121
+
122
+ The deployment's Alchemy state row stores this entry in its native `bindings` array:
123
+
124
+ ```json
125
+ {
126
+ "sid": "convex.component:[\"Mail\"]",
127
+ "data": { "type": "component", "path": "mail", "namespace": ["Mail"] }
128
+ }
129
+ ```
130
+
131
+ Readers inspect each binding's `data`. The deployment attributes identify the Convex deployment;
132
+ the row's stack and stage identify the Alchemy scope. The live repository reader includes the
133
+ binding through its existing resource JSON. No extra resource list, state table, or subscription
134
+ is needed.
135
+
136
+ Use actual namespace ancestry when grouping resources. A slash in a resource's logical ID is not a
137
+ namespace boundary. For a nested install, join the installed names with slashes, such as
138
+ `"workspace/mail"`. An undefined namespace means the stack root. Each namespace can be assigned to
139
+ one component per deployment; a component can have multiple namespaces. A more specific child
140
+ namespace takes precedence when displaying resources.
141
+
142
+ The connection is declared metadata. It does not check that the component is installed, push code,
143
+ set environment values, or change resource deletion policies. Removing the call removes the binding
144
+ on the next apply.
145
+
94
146
  ## Credentials
95
147
 
96
148
  Credentials are a layer, never props, so they do not go into Alchemy state. `Convex.providers()`
package/lib/index.d.ts CHANGED
@@ -1,14 +1,16 @@
1
- import * as Context from "effect/Context";
1
+ import { Stack } from "alchemy/Stack";
2
2
  import * as Effect from "effect/Effect";
3
+ import * as Schema from "effect/Schema";
4
+ import * as Context from "effect/Context";
3
5
  import * as Layer from "effect/Layer";
4
6
  import * as Redacted from "effect/Redacted";
5
- import * as Schema from "effect/Schema";
6
7
  import { Resource } from "alchemy";
7
8
  import * as Provider from "alchemy/Provider";
8
9
  import * as ChildProcessSpawner from "effect/process/ChildProcessSpawner";
9
10
  import { createDeploymentClient, createManagementClient } from "@convex-dev/platform";
10
11
  import "effect/Scope";
11
12
  import { State, StateStoreError } from "alchemy/State";
13
+ import { NamespaceNode } from "alchemy/Namespace";
12
14
  import { InputProps } from "alchemy/Input";
13
15
  import { components } from "@convex-dev/platform/managementApi";
14
16
  //#region src/Credentials.d.ts
@@ -250,7 +252,7 @@ interface DeploymentAttributes extends DeploymentTarget {
250
252
  /** The names of the `env` variables that this resource set on the deployment, sorted. */
251
253
  readonly envNames: readonly string[];
252
254
  }
253
- export type Deployment = Resource<"Convex.Deployment", DeploymentProps, DeploymentAttributes, never, Providers>;
255
+ export type Deployment = Resource<"Convex.Deployment", DeploymentProps, DeploymentAttributes, ComponentBinding, Providers>;
254
256
  /** The props of a `Convex.Deployment` call: Alchemy inputs, with `rootDir` a plain string. */
255
257
  type DeploymentInput = DeploymentProps extends (infer P) ? P extends DeploymentProps ? InputProps<P, "rootDir"> : never : never;
256
258
  declare const AbsoluteRootDir_base: Schema.Class<AbsoluteRootDir, Schema.TaggedStruct<"AbsoluteRootDir", {
@@ -310,6 +312,26 @@ export declare class AmbiguousDeployment extends AmbiguousDeployment_base {
310
312
  get message(): string;
311
313
  }
312
314
  //#endregion
315
+ //#region src/Component.d.ts
316
+ /** A component's resources occupy this namespace in the deployment's Alchemy stack and stage. */
317
+ interface ComponentBinding {
318
+ readonly type: "component";
319
+ readonly path: string;
320
+ readonly namespace: readonly string[];
321
+ }
322
+ /**
323
+ * Associate a native namespace with an installed component. `component` is the
324
+ * installed name from the app's `convex.config.ts`; a nested install joins the
325
+ * names with slashes, such as `"workspace/mail"`. An undefined namespace
326
+ * associates the stack root. This records display metadata; it does not install
327
+ * the component, set its environment, or change removal policies.
328
+ */
329
+ export declare const bindComponent: (options: {
330
+ deployment: Deployment;
331
+ component: string;
332
+ namespace: NamespaceNode | undefined;
333
+ }) => Effect.Effect<undefined, never, Stack>;
334
+ //#endregion
313
335
  //#region src/Project.d.ts
314
336
  /** Region names the Management API accepts, from the generated schema. */
315
337
  type DeploymentRegion = components["schemas"]["RegionName"];
@@ -448,5 +470,5 @@ export declare const state: (options?: {
448
470
  readonly team?: string | number;
449
471
  }) => Layer.Layer<State, never, ChildProcessSpawner.ChildProcessSpawner>;
450
472
  //#endregion
451
- export type { DeploymentAttributes, DeploymentInput, DeploymentProps, DeploymentRegion, EnvValue, ProjectAttributes, ProjectProps, RunRecord, Source };
473
+ export type { ComponentBinding, DeploymentAttributes, DeploymentInput, DeploymentProps, DeploymentRegion, EnvValue, ProjectAttributes, ProjectProps, RunRecord, Source };
452
474
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/Credentials.ts","../src/ManagementApi.ts","../src/Providers.ts","../src/Push.ts","../src/Deployment.ts","../src/Project.ts","../src/RunRecord.ts","../src/State.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/Credentials.ts","../src/ManagementApi.ts","../src/Providers.ts","../src/Push.ts","../src/Deployment.ts","../src/Component.ts","../src/Project.ts","../src/RunRecord.ts","../src/State.ts"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -1,22 +1,23 @@
1
1
  import { createRequire } from "node:module";
2
+ import { toPath } from "alchemy/FQN";
3
+ import { Stack } from "alchemy/Stack";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Schema from "effect/Schema";
2
6
  import { access, mkdtemp, readFile, realpath, rm, writeFile } from "node:fs/promises";
3
7
  import { homedir, tmpdir } from "node:os";
4
8
  import { dirname, join, posix, relative, resolve, sep, win32 } from "node:path";
5
9
  import * as Config from "effect/Config";
6
10
  import * as Context from "effect/Context";
7
- import * as Effect from "effect/Effect";
8
11
  import * as Layer from "effect/Layer";
9
12
  import * as Option from "effect/Option";
10
13
  import * as Redacted from "effect/Redacted";
11
14
  import * as Result from "effect/Result";
12
- import * as Schema from "effect/Schema";
13
15
  import { Resource } from "alchemy";
14
16
  import { AdoptPolicy, OwnedBySomeoneElse, Unowned } from "alchemy/AdoptPolicy";
15
- import { isResolved } from "alchemy/Diff";
17
+ import { diffBindings, isResolved } from "alchemy/Diff";
16
18
  import * as Provider from "alchemy/Provider";
17
19
  import * as ChildProcessSpawner from "effect/process/ChildProcessSpawner";
18
20
  import { AlchemyContext } from "alchemy/AlchemyContext";
19
- import { Stack } from "alchemy/Stack";
20
21
  import { createDeploymentClient, createManagementClient } from "@convex-dev/platform";
21
22
  import * as Schedule from "effect/Schedule";
22
23
  import { createHash } from "node:crypto";
@@ -29,6 +30,31 @@ import { execFile } from "node:child_process";
29
30
  import { fileURLToPath } from "node:url";
30
31
  import * as Scope from "effect/Scope";
31
32
  import { STATE_STORE_VERSION, State, StateStoreError, encodeState, reviveState } from "alchemy/State";
33
+ //#region src/Component.ts
34
+ /**
35
+ * Associate a native namespace with an installed component. `component` is the
36
+ * installed name from the app's `convex.config.ts`; a nested install joins the
37
+ * names with slashes, such as `"workspace/mail"`. An undefined namespace
38
+ * associates the stack root. This records display metadata; it does not install
39
+ * the component, set its environment, or change removal policies.
40
+ */
41
+ const bindComponent = (options) => Effect.gen(function* () {
42
+ if (options.component === "") return yield* Effect.die(/* @__PURE__ */ new Error("The component name is empty."));
43
+ const namespace = toPath(options.namespace);
44
+ const sid = `convex.component:${JSON.stringify(namespace)}`;
45
+ const previous = (yield* Stack).bindings[options.deployment.FQN]?.find((binding) => binding.sid === sid);
46
+ if (previous !== void 0) {
47
+ const existing = Schema.decodeUnknownSync(Schema.Struct({ path: Schema.String }))(previous.data);
48
+ if (existing.path !== options.component) return yield* Effect.die(/* @__PURE__ */ new Error(`Alchemy namespace ${JSON.stringify(namespace)} is already bound to ${existing.path}.`));
49
+ return;
50
+ }
51
+ yield* options.deployment.bind(sid, {
52
+ type: "component",
53
+ path: options.component,
54
+ namespace
55
+ });
56
+ });
57
+ //#endregion
32
58
  //#region src/Credentials.ts
33
59
  var Credentials = class extends Context.Service()("@samebase/alchemy-convex/Credentials") {};
34
60
  /** Environment variable for the access token, read by {@link fromConfig}. */
@@ -898,15 +924,34 @@ const DeploymentProvider = () => Provider.effect(DeploymentResource, Effect.gen(
898
924
  "type",
899
925
  "previewName"
900
926
  ],
901
- diff: Effect.fn(function* ({ news, olds, output }) {
927
+ diff: Effect.fn(function* ({ news, olds, output, oldBindings, newBindings }) {
902
928
  if (!isResolved(news) || output === void 0) return void 0;
903
929
  yield* checkIdentity(output, news);
930
+ if (!isResolved(newBindings)) return void 0;
904
931
  const rootDir = news.rootDir ?? ".";
905
932
  if (news.source !== void 0) yield* checkSource(rootDir, news.source);
906
933
  if (olds.rootDir !== rootDir) return { action: "update" };
907
934
  const access = yield* accessFor(addressOf(news), changesEnv(news, output));
908
- if ((yield* live(access, output))?.name !== output.name) return { action: "update" };
909
- return (yield* wantedHash(news, rootDir, output.name)) === output.hash ? { action: "noop" } : { action: "update" };
935
+ const current = yield* live(access, output);
936
+ if (current?.name !== output.name) return { action: "update" };
937
+ if ((yield* wantedHash(news, rootDir, output.name)) !== output.hash) return { action: "update" };
938
+ if (diffBindings(oldBindings, newBindings).every((binding) => binding.action === "noop")) return { action: "noop" };
939
+ return {
940
+ action: "update",
941
+ stables: [
942
+ "hash",
943
+ "envNames",
944
+ ...[
945
+ "projectId",
946
+ "type",
947
+ "previewName",
948
+ "name",
949
+ "reference",
950
+ "url",
951
+ "siteUrl"
952
+ ].filter((key) => current[key] === output[key])
953
+ ]
954
+ };
910
955
  }),
911
956
  read: Effect.fn(function* ({ olds, output }) {
912
957
  if (output !== void 0) {
@@ -1769,6 +1814,6 @@ const state = (options = {}) => Layer.effect(State, Effect.gen(function* () {
1769
1814
  }).pipe(Effect.provideContext(context), Effect.orDie));
1770
1815
  }));
1771
1816
  //#endregion
1772
- export { ACCESS_TOKEN_ENV, AbsoluteRootDir, AmbiguousDeployment, AmbiguousProject, CodePushFailed, ConvexApiError, ConvexAppNotFound, ConvexCliNotFound, CreatedProjectNotFound, Credentials, CredentialsError, DEPLOY_KEY_ENV, Deployment, DeploymentIdentityChange, EnvironmentNeedsDeployKey, ManagementApi, ProductionDeploymentNotFound, Project, ProjectDeploymentChange, ProjectNotFound, ProjectTeamChange, Providers, PushTargetMismatch, RUN_RECORD_KEY, RunRecordError, STORE_PROJECT_NAME, VariablesOwnedBySomeoneElse, fromConfig, fromValues, parseDeployOutput, providers, runRecord, state, withRunRecord };
1817
+ export { ACCESS_TOKEN_ENV, AbsoluteRootDir, AmbiguousDeployment, AmbiguousProject, CodePushFailed, ConvexApiError, ConvexAppNotFound, ConvexCliNotFound, CreatedProjectNotFound, Credentials, CredentialsError, DEPLOY_KEY_ENV, Deployment, DeploymentIdentityChange, EnvironmentNeedsDeployKey, ManagementApi, ProductionDeploymentNotFound, Project, ProjectDeploymentChange, ProjectNotFound, ProjectTeamChange, Providers, PushTargetMismatch, RUN_RECORD_KEY, RunRecordError, STORE_PROJECT_NAME, VariablesOwnedBySomeoneElse, bindComponent, fromConfig, fromValues, parseDeployOutput, providers, runRecord, state, withRunRecord };
1773
1818
 
1774
1819
  //# sourceMappingURL=index.js.map