@intentius/chant-lexicon-render 0.53.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.
Files changed (168) hide show
  1. package/README.md +89 -0
  2. package/dist/catalog.d.ts +100 -0
  3. package/dist/catalog.d.ts.map +1 -0
  4. package/dist/codegen/docs-cli.d.ts +3 -0
  5. package/dist/codegen/docs-cli.d.ts.map +1 -0
  6. package/dist/codegen/docs.d.ts +21 -0
  7. package/dist/codegen/docs.d.ts.map +1 -0
  8. package/dist/codegen/generate-cli.d.ts +6 -0
  9. package/dist/codegen/generate-cli.d.ts.map +1 -0
  10. package/dist/codegen/generate-lexicon.d.ts +18 -0
  11. package/dist/codegen/generate-lexicon.d.ts.map +1 -0
  12. package/dist/codegen/generate-typescript.d.ts +12 -0
  13. package/dist/codegen/generate-typescript.d.ts.map +1 -0
  14. package/dist/codegen/generate.d.ts +15 -0
  15. package/dist/codegen/generate.d.ts.map +1 -0
  16. package/dist/codegen/naming.d.ts +14 -0
  17. package/dist/codegen/naming.d.ts.map +1 -0
  18. package/dist/codegen/package.d.ts +17 -0
  19. package/dist/codegen/package.d.ts.map +1 -0
  20. package/dist/composites/render-deploy.d.ts +88 -0
  21. package/dist/composites/render-deploy.d.ts.map +1 -0
  22. package/dist/coverage.d.ts +15 -0
  23. package/dist/coverage.d.ts.map +1 -0
  24. package/dist/describe-resources.d.ts +60 -0
  25. package/dist/describe-resources.d.ts.map +1 -0
  26. package/dist/detect.d.ts +12 -0
  27. package/dist/detect.d.ts.map +1 -0
  28. package/dist/generated/index.d.ts +38 -0
  29. package/dist/generated/index.d.ts.map +1 -0
  30. package/dist/generated/runtime.d.ts +5 -0
  31. package/dist/generated/runtime.d.ts.map +1 -0
  32. package/dist/index.d.ts +11 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/integrity.json +18 -0
  35. package/dist/lint/audit-catalog.d.ts +13 -0
  36. package/dist/lint/audit-catalog.d.ts.map +1 -0
  37. package/dist/lint/post-synth/index.d.ts +3 -0
  38. package/dist/lint/post-synth/index.d.ts.map +1 -0
  39. package/dist/lint/post-synth/ren010-native-runtime-requires-commands.d.ts +12 -0
  40. package/dist/lint/post-synth/ren010-native-runtime-requires-commands.d.ts.map +1 -0
  41. package/dist/lint/post-synth/ren011-service-requires-source.d.ts +12 -0
  42. package/dist/lint/post-synth/ren011-service-requires-source.d.ts.map +1 -0
  43. package/dist/lint/post-synth/ren012-free-plan-cannot-scale.d.ts +11 -0
  44. package/dist/lint/post-synth/ren012-free-plan-cannot-scale.d.ts.map +1 -0
  45. package/dist/lint/post-synth/render-helpers.d.ts +19 -0
  46. package/dist/lint/post-synth/render-helpers.d.ts.map +1 -0
  47. package/dist/lint/rules/index.d.ts +7 -0
  48. package/dist/lint/rules/index.d.ts.map +1 -0
  49. package/dist/lint/rules/no-secret-literals.d.ts +13 -0
  50. package/dist/lint/rules/no-secret-literals.d.ts.map +1 -0
  51. package/dist/lint/rules/valid-cron-schedule.d.ts +12 -0
  52. package/dist/lint/rules/valid-cron-schedule.d.ts.map +1 -0
  53. package/dist/lint/rules/valid-region.d.ts +16 -0
  54. package/dist/lint/rules/valid-region.d.ts.map +1 -0
  55. package/dist/lsp/completions.d.ts +8 -0
  56. package/dist/lsp/completions.d.ts.map +1 -0
  57. package/dist/lsp/hover.d.ts +6 -0
  58. package/dist/lsp/hover.d.ts.map +1 -0
  59. package/dist/manifest.json +6 -0
  60. package/dist/meta.json +304 -0
  61. package/dist/okf/index.md +29 -0
  62. package/dist/okf/rules/REN001.md +11 -0
  63. package/dist/okf/rules/REN002.md +15 -0
  64. package/dist/okf/rules/REN003.md +15 -0
  65. package/dist/okf/rules/REN010.md +11 -0
  66. package/dist/okf/rules/REN011.md +11 -0
  67. package/dist/okf/rules/REN012.md +11 -0
  68. package/dist/okf/types/BackgroundWorker.md +24 -0
  69. package/dist/okf/types/CronJob.md +28 -0
  70. package/dist/okf/types/CustomDomain.md +14 -0
  71. package/dist/okf/types/Disk.md +16 -0
  72. package/dist/okf/types/EnvGroup.md +22 -0
  73. package/dist/okf/types/Environment.md +17 -0
  74. package/dist/okf/types/KeyValue.md +20 -0
  75. package/dist/okf/types/Postgres.md +29 -0
  76. package/dist/okf/types/PrivateService.md +24 -0
  77. package/dist/okf/types/Project.md +15 -0
  78. package/dist/okf/types/RegistryCredential.md +17 -0
  79. package/dist/okf/types/StaticSite.md +24 -0
  80. package/dist/okf/types/WebService.md +24 -0
  81. package/dist/okf/types/Webhook.md +17 -0
  82. package/dist/op/activities/fake-render.d.ts +52 -0
  83. package/dist/op/activities/fake-render.d.ts.map +1 -0
  84. package/dist/op/activities/index.d.ts +10 -0
  85. package/dist/op/activities/index.d.ts.map +1 -0
  86. package/dist/op/activities/render-apply.d.ts +229 -0
  87. package/dist/op/activities/render-apply.d.ts.map +1 -0
  88. package/dist/ownership.d.ts +32 -0
  89. package/dist/ownership.d.ts.map +1 -0
  90. package/dist/package-cli.d.ts +3 -0
  91. package/dist/package-cli.d.ts.map +1 -0
  92. package/dist/plugin.d.ts +8 -0
  93. package/dist/plugin.d.ts.map +1 -0
  94. package/dist/pseudo.d.ts +21 -0
  95. package/dist/pseudo.d.ts.map +1 -0
  96. package/dist/rules/no-secret-literals.ts +73 -0
  97. package/dist/rules/ren010-native-runtime-requires-commands.ts +47 -0
  98. package/dist/rules/ren011-service-requires-source.ts +50 -0
  99. package/dist/rules/ren012-free-plan-cannot-scale.ts +43 -0
  100. package/dist/rules/render-helpers.ts +38 -0
  101. package/dist/rules/valid-cron-schedule.ts +51 -0
  102. package/dist/rules/valid-region.ts +49 -0
  103. package/dist/serializer.d.ts +99 -0
  104. package/dist/serializer.d.ts.map +1 -0
  105. package/dist/skills/chant-render-patterns.md +126 -0
  106. package/dist/skills/chant-render.md +112 -0
  107. package/dist/spec/fetch.d.ts +21 -0
  108. package/dist/spec/fetch.d.ts.map +1 -0
  109. package/dist/spec/parse.d.ts +120 -0
  110. package/dist/spec/parse.d.ts.map +1 -0
  111. package/dist/types/index.d.ts +573 -0
  112. package/dist/validate-cli.d.ts +3 -0
  113. package/dist/validate-cli.d.ts.map +1 -0
  114. package/dist/validate.d.ts +15 -0
  115. package/dist/validate.d.ts.map +1 -0
  116. package/package.json +73 -0
  117. package/src/catalog.ts +286 -0
  118. package/src/codegen/docs-cli.ts +7 -0
  119. package/src/codegen/docs.ts +120 -0
  120. package/src/codegen/generate-cli.ts +36 -0
  121. package/src/codegen/generate-lexicon.ts +52 -0
  122. package/src/codegen/generate-typescript.ts +70 -0
  123. package/src/codegen/generate.ts +106 -0
  124. package/src/codegen/naming.ts +55 -0
  125. package/src/codegen/package.ts +30 -0
  126. package/src/composites/render-deploy.ts +133 -0
  127. package/src/coverage.ts +49 -0
  128. package/src/describe-resources.test.ts +143 -0
  129. package/src/describe-resources.ts +366 -0
  130. package/src/detect.ts +29 -0
  131. package/src/generated/index.d.ts +573 -0
  132. package/src/generated/index.ts +43 -0
  133. package/src/generated/lexicon-render.json +304 -0
  134. package/src/generated/runtime.ts +4 -0
  135. package/src/index.ts +30 -0
  136. package/src/lint/audit-catalog.ts +47 -0
  137. package/src/lint/post-synth/index.ts +11 -0
  138. package/src/lint/post-synth/post-synth.test.ts +151 -0
  139. package/src/lint/post-synth/ren010-native-runtime-requires-commands.ts +47 -0
  140. package/src/lint/post-synth/ren011-service-requires-source.ts +50 -0
  141. package/src/lint/post-synth/ren012-free-plan-cannot-scale.ts +43 -0
  142. package/src/lint/post-synth/render-helpers.ts +38 -0
  143. package/src/lint/rules/index.ts +11 -0
  144. package/src/lint/rules/no-secret-literals.ts +73 -0
  145. package/src/lint/rules/rules.test.ts +73 -0
  146. package/src/lint/rules/valid-cron-schedule.ts +51 -0
  147. package/src/lint/rules/valid-region.ts +49 -0
  148. package/src/lsp/completions.test.ts +28 -0
  149. package/src/lsp/completions.ts +22 -0
  150. package/src/lsp/hover.test.ts +32 -0
  151. package/src/lsp/hover.ts +50 -0
  152. package/src/op/activities/fake-render.ts +275 -0
  153. package/src/op/activities/index.ts +51 -0
  154. package/src/op/activities/render-apply.test.ts +403 -0
  155. package/src/op/activities/render-apply.ts +1042 -0
  156. package/src/ownership.ts +44 -0
  157. package/src/package-cli.ts +23 -0
  158. package/src/plugin.test.ts +54 -0
  159. package/src/plugin.ts +258 -0
  160. package/src/pseudo.ts +26 -0
  161. package/src/serializer.test.ts +221 -0
  162. package/src/serializer.ts +286 -0
  163. package/src/skills/chant-render-patterns.md +126 -0
  164. package/src/skills/chant-render.md +112 -0
  165. package/src/spec/fetch.ts +33 -0
  166. package/src/spec/parse.ts +721 -0
  167. package/src/validate-cli.ts +5 -0
  168. package/src/validate.ts +47 -0
@@ -0,0 +1,275 @@
1
+ /**
2
+ * An in-memory stand-in for the Render Public API, for tests. Implements the
3
+ * slice of routes the applier and the observation seam use — list/create/
4
+ * patch/delete for every collection in the catalog, service env vars, env
5
+ * group vars and links, deploys, connection-info, owners — with Render's list
6
+ * envelope (`[{ service: {...}, cursor }]`) and id prefixes. Not an emulator of
7
+ * Render's semantics beyond what chant relies on; it exists so the reconcile
8
+ * loop is tested end to end without an account.
9
+ */
10
+
11
+ import type { RenderHttp } from "./render-apply";
12
+
13
+ type Rec = Record<string, unknown>;
14
+
15
+ interface Collection {
16
+ key: string;
17
+ prefix: string;
18
+ items: Map<string, Rec>;
19
+ }
20
+
21
+ export class FakeRender {
22
+ readonly owners: Rec[] = [{ id: "tea-1", name: "Acme", email: "ops@acme.test", type: "team" }];
23
+ readonly collections: Record<string, Collection> = {
24
+ "/services": { key: "service", prefix: "srv", items: new Map() },
25
+ "/postgres": { key: "postgres", prefix: "dpg", items: new Map() },
26
+ "/key-value": { key: "keyValue", prefix: "red", items: new Map() },
27
+ "/env-groups": { key: "envGroup", prefix: "evg", items: new Map() },
28
+ "/projects": { key: "project", prefix: "prj", items: new Map() },
29
+ "/environments": { key: "environment", prefix: "evm", items: new Map() },
30
+ "/disks": { key: "disk", prefix: "dsk", items: new Map() },
31
+ "/registrycredentials": { key: "registryCredential", prefix: "rgc", items: new Map() },
32
+ "/webhooks": { key: "webhook", prefix: "whk", items: new Map() },
33
+ };
34
+ /** serviceId → env vars */
35
+ readonly serviceEnv = new Map<string, Array<{ key: string; value: string }>>();
36
+ /** serviceId → deploys (newest first) */
37
+ readonly deploys = new Map<string, Array<{ id: string; status: string }>>();
38
+ /** serviceId → custom domains */
39
+ readonly domains = new Map<string, Rec[]>();
40
+ /** Every call, for assertions. */
41
+ readonly calls: Array<{ method: string; path: string; body?: unknown }> = [];
42
+ /** Deploys go live after this many polls (0 = immediately). */
43
+ deployPolls = 0;
44
+ private counter = 0;
45
+
46
+ id(prefix: string): string {
47
+ this.counter++;
48
+ return `${prefix}-${String(this.counter).padStart(20, "0")}`;
49
+ }
50
+
51
+ /** Seed a resource directly. */
52
+ seed(collection: string, rec: Rec): Rec {
53
+ const c = this.collections[collection];
54
+ const id = typeof rec.id === "string" ? rec.id : this.id(c.prefix);
55
+ const full = { id, createdAt: "2026-01-01T00:00:00Z", updatedAt: "2026-01-01T00:00:00Z", ...rec };
56
+ c.items.set(id, full);
57
+ if (collection === "/services") {
58
+ this.serviceEnv.set(id, [...((rec.envVars as Array<{ key: string; value: string }>) ?? [])]);
59
+ this.deploys.set(id, [{ id: this.id("dep"), status: "live" }]);
60
+ }
61
+ return full;
62
+ }
63
+
64
+ service(name: string): Rec | undefined {
65
+ return [...this.collections["/services"].items.values()].find((s) => s.name === name);
66
+ }
67
+
68
+ http(): RenderHttp {
69
+ return async (method, url, body) => {
70
+ const u = new URL(url);
71
+ const path = u.pathname.replace(/^\/v1/, "");
72
+ this.calls.push({ method, path, body });
73
+ return this.route(method, path, u.searchParams, body);
74
+ };
75
+ }
76
+
77
+ private json(status: number, value: unknown): { status: number; text: string } {
78
+ return { status, text: value === undefined ? "" : JSON.stringify(value) };
79
+ }
80
+
81
+ private route(method: string, path: string, q: URLSearchParams, body: unknown): { status: number; text: string } {
82
+ const b = (body ?? {}) as Rec;
83
+
84
+ if (path === "/owners" && method === "GET") {
85
+ return this.json(200, this.owners.map((o) => ({ owner: o, cursor: String(o.id) })));
86
+ }
87
+
88
+ // Service sub-resources.
89
+ let m = path.match(/^\/services\/([^/]+)\/env-vars$/);
90
+ if (m) {
91
+ const id = m[1];
92
+ if (!this.collections["/services"].items.has(id)) return this.json(404, { message: "not found" });
93
+ if (method === "GET") {
94
+ return this.json(200, (this.serviceEnv.get(id) ?? []).map((e) => ({ envVar: e, cursor: e.key })));
95
+ }
96
+ if (method === "PUT") {
97
+ const list = (body as Array<{ key: string; value?: string; generateValue?: boolean }>).map((e) => ({
98
+ key: e.key,
99
+ value: e.value ?? (e.generateValue ? `gen-${e.key}` : ""),
100
+ }));
101
+ this.serviceEnv.set(id, list);
102
+ return this.json(200, list.map((e) => ({ envVar: e, cursor: e.key })));
103
+ }
104
+ }
105
+ m = path.match(/^\/services\/([^/]+)\/deploys$/);
106
+ if (m && method === "GET") {
107
+ const list = this.deploys.get(m[1]) ?? [];
108
+ return this.json(200, list.map((d) => ({ deploy: this.tickDeploy(d), cursor: d.id })));
109
+ }
110
+ m = path.match(/^\/services\/([^/]+)\/deploys\/([^/]+)$/);
111
+ if (m && method === "GET") {
112
+ const d = (this.deploys.get(m[1]) ?? []).find((x) => x.id === m![2]);
113
+ if (!d) return this.json(404, { message: "not found" });
114
+ return this.json(200, this.tickDeploy(d));
115
+ }
116
+ m = path.match(/^\/services\/([^/]+)\/custom-domains$/);
117
+ if (m) {
118
+ const id = m[1];
119
+ if (!this.collections["/services"].items.has(id)) return this.json(404, { message: "not found" });
120
+ const list = this.domains.get(id) ?? [];
121
+ if (method === "GET") return this.json(200, list.map((d) => ({ customDomain: d, cursor: d.id })));
122
+ if (method === "POST") {
123
+ const d = { id: this.id("cd"), name: b.name, domainType: "apex", verificationStatus: "unverified", createdAt: "2026-01-01T00:00:00Z" };
124
+ list.push(d);
125
+ this.domains.set(id, list);
126
+ return this.json(201, [d]);
127
+ }
128
+ }
129
+ m = path.match(/^\/services\/([^/]+)\/custom-domains\/([^/]+)$/);
130
+ if (m && method === "DELETE") {
131
+ const list = this.domains.get(m[1]) ?? [];
132
+ const idx = list.findIndex((d) => d.id === m![2] || d.name === m![2]);
133
+ if (idx < 0) return this.json(404, {});
134
+ list.splice(idx, 1);
135
+ return this.json(204, undefined);
136
+ }
137
+
138
+ // Datastore connection info.
139
+ m = path.match(/^\/(postgres|key-value)\/([^/]+)\/connection-info$/);
140
+ if (m && method === "GET") {
141
+ const c = this.collections[`/${m[1]}`];
142
+ const rec = c.items.get(m[2]);
143
+ if (!rec) return this.json(404, {});
144
+ return this.json(200, {
145
+ internalConnectionString: `internal://${rec.name}`,
146
+ externalConnectionString: `external://${rec.name}`,
147
+ psqlCommand: `psql ${rec.name}`,
148
+ cliCommand: `redis-cli ${rec.name}`,
149
+ });
150
+ }
151
+
152
+ // Env group vars and links.
153
+ m = path.match(/^\/env-groups\/([^/]+)\/env-vars\/([^/]+)$/);
154
+ if (m) {
155
+ const grp = this.collections["/env-groups"].items.get(m[1]);
156
+ if (!grp) return this.json(404, {});
157
+ const vars = (grp.envVars as Array<{ key: string; value: string }>) ?? [];
158
+ const key = decodeURIComponent(m[2]);
159
+ if (method === "PUT") {
160
+ const value = typeof b.value === "string" ? b.value : `gen-${key}`;
161
+ const idx = vars.findIndex((v) => v.key === key);
162
+ if (idx >= 0) vars[idx] = { key, value };
163
+ else vars.push({ key, value });
164
+ grp.envVars = vars;
165
+ return this.json(200, { key, value });
166
+ }
167
+ if (method === "DELETE") {
168
+ grp.envVars = vars.filter((v) => v.key !== key);
169
+ return this.json(204, undefined);
170
+ }
171
+ }
172
+ m = path.match(/^\/env-groups\/([^/]+)\/services\/([^/]+)$/);
173
+ if (m && method === "POST") {
174
+ const grp = this.collections["/env-groups"].items.get(m[1]);
175
+ if (!grp) return this.json(404, {});
176
+ const links = (grp.serviceLinks as Rec[]) ?? [];
177
+ if (!links.some((l) => l.id === m![2])) links.push({ id: m[2], name: m[2], type: "web_service" });
178
+ grp.serviceLinks = links;
179
+ return this.json(200, grp);
180
+ }
181
+
182
+ // Collections.
183
+ for (const [collection, c] of Object.entries(this.collections)) {
184
+ if (path === collection) {
185
+ if (method === "GET") {
186
+ let items = [...c.items.values()];
187
+ const name = q.get("name");
188
+ const ownerId = q.get("ownerId");
189
+ const projectId = q.get("projectId");
190
+ const serviceId = q.get("serviceId");
191
+ if (name) items = items.filter((i) => i.name === name);
192
+ // Disks/domains carry no ownerId field on the wire; Render scopes them
193
+ // server-side. The fake has one owner, so only filter what has one.
194
+ if (ownerId) items = items.filter((i) => (i.ownerId === undefined && i.owner === undefined) || i.ownerId === ownerId || (i.owner as Rec | undefined)?.id === ownerId);
195
+ if (projectId) items = items.filter((i) => i.projectId === projectId);
196
+ if (serviceId) items = items.filter((i) => i.serviceId === serviceId);
197
+ return this.json(200, items.map((i) => ({ [c.key]: i, cursor: String(i.id) })));
198
+ }
199
+ if (method === "POST") {
200
+ const id = this.id(c.prefix);
201
+ const rec: Rec = { ...b, id, createdAt: "2026-01-01T00:00:00Z", updatedAt: "2026-01-01T00:00:00Z" };
202
+ if (collection === "/services") {
203
+ const env = ((b.envVars as Array<{ key: string; value?: string; generateValue?: boolean }>) ?? []).map((e) => ({
204
+ key: e.key,
205
+ value: e.value ?? `gen-${e.key}`,
206
+ }));
207
+ delete rec.envVars;
208
+ delete rec.secretFiles;
209
+ rec.dashboardUrl = `https://dashboard.render.com/web/${id}`;
210
+ rec.slug = String(b.name);
211
+ rec.suspended = "not_suspended";
212
+ this.serviceEnv.set(id, env);
213
+ const dep = { id: this.id("dep"), status: this.deployPolls > 0 ? "build_in_progress" : "live" };
214
+ this.deploys.set(id, [dep]);
215
+ c.items.set(id, rec);
216
+ return this.json(201, { service: rec, deployId: dep.id });
217
+ }
218
+ if (collection === "/env-groups") {
219
+ rec.envVars = ((b.envVars as Array<{ key: string; value?: string; generateValue?: boolean }>) ?? []).map((e) => ({
220
+ key: e.key,
221
+ value: e.value ?? `gen-${e.key}`,
222
+ }));
223
+ rec.serviceLinks = ((b.serviceIds as string[]) ?? []).map((sid) => ({ id: sid, name: sid, type: "web_service" }));
224
+ delete rec.serviceIds;
225
+ }
226
+ if (collection === "/projects") {
227
+ rec.owner = { id: b.ownerId, name: "Acme", email: "", type: "team" };
228
+ rec.environmentIds = [];
229
+ }
230
+ if (collection === "/postgres" || collection === "/key-value") {
231
+ rec.owner = { id: b.ownerId, name: "Acme", email: "", type: "team" };
232
+ rec.status = "available";
233
+ rec.dashboardUrl = `https://dashboard.render.com/d/${id}`;
234
+ }
235
+ c.items.set(id, rec);
236
+ return this.json(201, rec);
237
+ }
238
+ }
239
+ const one = path.match(new RegExp(`^${collection.replace(/[-/]/g, "\\$&")}/([^/]+)$`));
240
+ if (one) {
241
+ const id = one[1];
242
+ const rec = c.items.get(id);
243
+ if (!rec) return this.json(404, { message: "not found" });
244
+ if (method === "GET") return this.json(200, rec);
245
+ if (method === "PATCH") {
246
+ const updated: Rec = { ...rec, ...b, updatedAt: "2026-01-02T00:00:00Z" };
247
+ if (rec.serviceDetails && b.serviceDetails) {
248
+ updated.serviceDetails = { ...(rec.serviceDetails as Rec), ...(b.serviceDetails as Rec) };
249
+ }
250
+ c.items.set(id, updated);
251
+ if (collection === "/services") {
252
+ const deps = this.deploys.get(id) ?? [];
253
+ deps.unshift({ id: this.id("dep"), status: "live" });
254
+ }
255
+ return this.json(200, updated);
256
+ }
257
+ if (method === "DELETE") {
258
+ c.items.delete(id);
259
+ return this.json(204, undefined);
260
+ }
261
+ }
262
+ }
263
+
264
+ return this.json(404, { message: `fake-render: no route for ${method} ${path}` });
265
+ }
266
+
267
+ /** Advance a pending deploy toward `live` on each poll. */
268
+ private tickDeploy(d: { id: string; status: string }): { id: string; status: string } {
269
+ if (d.status !== "live" && this.deployPolls > 0) {
270
+ this.deployPolls--;
271
+ if (this.deployPolls === 0) d.status = "live";
272
+ }
273
+ return { ...d };
274
+ }
275
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * render Op activities — resolved by the core activity registry when a
3
+ * project's `chant.config.ts` lists the `render` lexicon. Contributes the
4
+ * native Render API applier (`renderApply`), which speaks the Render Public
5
+ * API directly (no CLI, no Blueprint, no state file), and its teardown twin
6
+ * (`renderDelete`).
7
+ */
8
+ export {
9
+ renderApply,
10
+ renderApplyDetailed,
11
+ renderDelete,
12
+ toApplyResult,
13
+ resolveEndpoint,
14
+ parsePlan,
15
+ orderPlan,
16
+ collectDependencies,
17
+ configEqual,
18
+ diffForPatch,
19
+ envVarsToMap,
20
+ declaredEnvVarsToMap,
21
+ envVarsDiffer,
22
+ isChantOwned,
23
+ ownershipOf,
24
+ planOwnership,
25
+ inStack,
26
+ defaultRenderHttp,
27
+ listAll,
28
+ getOne,
29
+ resolveOwner,
30
+ findExisting,
31
+ resolveAttribute,
32
+ resolveMarkers,
33
+ create,
34
+ patch,
35
+ remove,
36
+ readServiceEnvVars,
37
+ putServiceEnvVars,
38
+ reconcileEnvGroupVars,
39
+ linkEnvGroupServices,
40
+ latestDeploy,
41
+ waitForDeploy,
42
+ DEFAULT_RENDER_BASE_URL,
43
+ } from "./render-apply";
44
+ export type {
45
+ RenderApplyArgs,
46
+ RenderApplyOutcome,
47
+ RenderHttp,
48
+ WaitOpts,
49
+ ApplyCtx,
50
+ LiveEntity,
51
+ } from "./render-apply";