alchemy 0.68.0 → 0.69.1

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 (181) hide show
  1. package/bin/alchemy.js +32 -33
  2. package/bin/commands/init.ts +41 -55
  3. package/lib/aws/control/properties.d.ts +64 -0
  4. package/lib/aws/control/properties.d.ts.map +1 -1
  5. package/lib/aws/control/properties.js +554 -39
  6. package/lib/aws/control/properties.js.map +1 -1
  7. package/lib/aws/control/resource.d.ts.map +1 -1
  8. package/lib/aws/control/resource.js +33 -0
  9. package/lib/aws/control/resource.js.map +1 -1
  10. package/lib/aws/control/types.d.ts +5451 -1587
  11. package/lib/aws/control/types.d.ts.map +1 -1
  12. package/lib/aws/control/types.js.map +1 -1
  13. package/lib/aws/control/update-types.d.ts +12913 -0
  14. package/lib/aws/control/update-types.d.ts.map +1 -0
  15. package/lib/aws/control/update-types.js +12916 -0
  16. package/lib/aws/control/update-types.js.map +1 -0
  17. package/lib/cloudflare/api.d.ts +1 -1
  18. package/lib/cloudflare/api.d.ts.map +1 -1
  19. package/lib/cloudflare/api.js +9 -10
  20. package/lib/cloudflare/api.js.map +1 -1
  21. package/lib/cloudflare/astro/astro.d.ts.map +1 -1
  22. package/lib/cloudflare/astro/astro.js +3 -3
  23. package/lib/cloudflare/astro/astro.js.map +1 -1
  24. package/lib/cloudflare/bucket-object.d.ts +86 -0
  25. package/lib/cloudflare/bucket-object.d.ts.map +1 -0
  26. package/lib/cloudflare/bucket-object.js +67 -0
  27. package/lib/cloudflare/bucket-object.js.map +1 -0
  28. package/lib/cloudflare/bucket.d.ts +36 -6
  29. package/lib/cloudflare/bucket.d.ts.map +1 -1
  30. package/lib/cloudflare/bucket.js +154 -18
  31. package/lib/cloudflare/bucket.js.map +1 -1
  32. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  33. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  34. package/lib/cloudflare/container.d.ts.map +1 -1
  35. package/lib/cloudflare/container.js +2 -2
  36. package/lib/cloudflare/container.js.map +1 -1
  37. package/lib/cloudflare/index.d.ts +1 -0
  38. package/lib/cloudflare/index.d.ts.map +1 -1
  39. package/lib/cloudflare/index.js +1 -0
  40. package/lib/cloudflare/index.js.map +1 -1
  41. package/lib/cloudflare/miniflare/miniflare-worker-proxy.d.ts.map +1 -1
  42. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +44 -12
  43. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
  44. package/lib/cloudflare/next.js.map +1 -1
  45. package/lib/cloudflare/nuxt/nuxt.d.ts.map +1 -1
  46. package/lib/cloudflare/nuxt/nuxt.js +3 -3
  47. package/lib/cloudflare/nuxt/nuxt.js.map +1 -1
  48. package/lib/cloudflare/tanstack-start/plugin.d.ts +2 -15
  49. package/lib/cloudflare/tanstack-start/plugin.d.ts.map +1 -1
  50. package/lib/cloudflare/tanstack-start/plugin.js +5 -25
  51. package/lib/cloudflare/tanstack-start/plugin.js.map +1 -1
  52. package/lib/cloudflare/tanstack-start/tanstack-start.d.ts.map +1 -1
  53. package/lib/cloudflare/tanstack-start/tanstack-start.js +15 -4
  54. package/lib/cloudflare/tanstack-start/tanstack-start.js.map +1 -1
  55. package/lib/cloudflare/vite/vite.d.ts.map +1 -1
  56. package/lib/cloudflare/vite/vite.js +3 -3
  57. package/lib/cloudflare/vite/vite.js.map +1 -1
  58. package/lib/cloudflare/website.d.ts +7 -1
  59. package/lib/cloudflare/website.d.ts.map +1 -1
  60. package/lib/cloudflare/website.js +20 -1
  61. package/lib/cloudflare/website.js.map +1 -1
  62. package/lib/cloudflare/worker-metadata.d.ts +4 -1
  63. package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
  64. package/lib/cloudflare/worker-metadata.js +2 -0
  65. package/lib/cloudflare/worker-metadata.js.map +1 -1
  66. package/lib/cloudflare/worker.d.ts +6 -0
  67. package/lib/cloudflare/worker.d.ts.map +1 -1
  68. package/lib/cloudflare/worker.js +1 -0
  69. package/lib/cloudflare/worker.js.map +1 -1
  70. package/lib/cloudflare/wrangler.json.d.ts +34 -9
  71. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  72. package/lib/cloudflare/wrangler.json.js +12 -1
  73. package/lib/cloudflare/wrangler.json.js.map +1 -1
  74. package/lib/docker/api.d.ts +22 -1
  75. package/lib/docker/api.d.ts.map +1 -1
  76. package/lib/docker/api.js +64 -2
  77. package/lib/docker/api.js.map +1 -1
  78. package/lib/docker/container.d.ts +88 -0
  79. package/lib/docker/container.d.ts.map +1 -1
  80. package/lib/docker/container.js +36 -0
  81. package/lib/docker/container.js.map +1 -1
  82. package/lib/llms.cloudflare.txt +2 -2
  83. package/lib/neon/branch.d.ts +19 -3
  84. package/lib/neon/branch.d.ts.map +1 -1
  85. package/lib/neon/branch.js +4 -4
  86. package/lib/neon/branch.js.map +1 -1
  87. package/lib/neon/project.d.ts +17 -1
  88. package/lib/neon/project.d.ts.map +1 -1
  89. package/lib/neon/project.js +4 -4
  90. package/lib/neon/project.js.map +1 -1
  91. package/lib/serde.d.ts +3 -0
  92. package/lib/serde.d.ts.map +1 -1
  93. package/lib/serde.js +40 -0
  94. package/lib/serde.js.map +1 -1
  95. package/lib/test/bun.js.map +1 -1
  96. package/package.json +1 -1
  97. package/src/aws/control/properties.ts +554 -39
  98. package/src/aws/control/resource.ts +58 -0
  99. package/src/aws/control/types.ts +85281 -84914
  100. package/src/aws/control/update-types.ts +12917 -0
  101. package/src/cloudflare/api.ts +9 -10
  102. package/src/cloudflare/astro/astro.ts +8 -3
  103. package/src/cloudflare/bucket-object.ts +127 -0
  104. package/src/cloudflare/bucket.ts +218 -18
  105. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  106. package/src/cloudflare/container.ts +4 -5
  107. package/src/cloudflare/index.ts +1 -0
  108. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +57 -13
  109. package/src/cloudflare/next.ts +2 -2
  110. package/src/cloudflare/nuxt/nuxt.ts +8 -3
  111. package/src/cloudflare/tanstack-start/plugin.ts +7 -28
  112. package/src/cloudflare/tanstack-start/tanstack-start.ts +15 -4
  113. package/src/cloudflare/vite/vite.ts +8 -3
  114. package/src/cloudflare/website.ts +29 -2
  115. package/src/cloudflare/worker-metadata.ts +6 -1
  116. package/src/cloudflare/worker.ts +7 -0
  117. package/src/cloudflare/wrangler.json.ts +47 -18
  118. package/src/docker/api.ts +86 -2
  119. package/src/docker/container.ts +97 -0
  120. package/src/llms.cloudflare.txt +2 -2
  121. package/src/neon/branch.ts +6 -5
  122. package/src/neon/project.ts +4 -4
  123. package/src/serde.ts +50 -0
  124. package/src/test/bun.ts +1 -1
  125. package/templates/rwsdk/.cursor/rules/alchemy_cloudflare.mdc +2 -2
  126. package/templates/tanstack-start/.cta.json +13 -0
  127. package/templates/tanstack-start/README.md +267 -49
  128. package/templates/tanstack-start/_gitignore +9 -18
  129. package/templates/tanstack-start/alchemy.run.ts +2 -2
  130. package/templates/tanstack-start/package.json +24 -19
  131. package/templates/tanstack-start/public/favicon.ico +0 -0
  132. package/templates/tanstack-start/public/logo192.png +0 -0
  133. package/templates/tanstack-start/public/logo512.png +0 -0
  134. package/templates/tanstack-start/public/manifest.json +25 -0
  135. package/templates/tanstack-start/public/robots.txt +3 -0
  136. package/templates/tanstack-start/src/components/Header.tsx +21 -0
  137. package/templates/tanstack-start/src/logo.svg +12 -0
  138. package/templates/tanstack-start/src/router.tsx +7 -16
  139. package/templates/tanstack-start/src/routes/__root.tsx +13 -114
  140. package/templates/tanstack-start/src/routes/api.demo-names.ts +15 -0
  141. package/templates/tanstack-start/src/routes/demo.start.api-request.tsx +44 -0
  142. package/templates/tanstack-start/src/routes/demo.start.server-funcs.tsx +97 -0
  143. package/templates/tanstack-start/src/routes/index.tsx +31 -4
  144. package/templates/tanstack-start/src/styles.css +15 -0
  145. package/templates/tanstack-start/tsconfig.json +19 -22
  146. package/templates/tanstack-start/types/env.d.ts +2 -2
  147. package/templates/tanstack-start/vite.config.ts +16 -25
  148. package/workers/tunnel-proxy.js +1 -1
  149. package/templates/tanstack-start/_prettierignore +0 -4
  150. package/templates/tanstack-start/public/android-chrome-192x192.png +0 -0
  151. package/templates/tanstack-start/public/android-chrome-512x512.png +0 -0
  152. package/templates/tanstack-start/public/apple-touch-icon.png +0 -0
  153. package/templates/tanstack-start/public/favicon-16x16.png +0 -0
  154. package/templates/tanstack-start/public/favicon-32x32.png +0 -0
  155. package/templates/tanstack-start/public/favicon.png +0 -0
  156. package/templates/tanstack-start/public/site.webmanifest +0 -19
  157. package/templates/tanstack-start/src/components/DefaultCatchBoundary.tsx +0 -53
  158. package/templates/tanstack-start/src/components/NotFound.tsx +0 -25
  159. package/templates/tanstack-start/src/components/PostError.tsx +0 -5
  160. package/templates/tanstack-start/src/components/UserError.tsx +0 -5
  161. package/templates/tanstack-start/src/routes/_pathlessLayout/_nested-layout/route-a.tsx +0 -10
  162. package/templates/tanstack-start/src/routes/_pathlessLayout/_nested-layout/route-b.tsx +0 -10
  163. package/templates/tanstack-start/src/routes/_pathlessLayout/_nested-layout.tsx +0 -34
  164. package/templates/tanstack-start/src/routes/_pathlessLayout.tsx +0 -16
  165. package/templates/tanstack-start/src/routes/api/users.$userId.ts +0 -28
  166. package/templates/tanstack-start/src/routes/api/users.ts +0 -59
  167. package/templates/tanstack-start/src/routes/customScript[.]js.ts +0 -10
  168. package/templates/tanstack-start/src/routes/deferred.tsx +0 -62
  169. package/templates/tanstack-start/src/routes/posts.$postId.tsx +0 -34
  170. package/templates/tanstack-start/src/routes/posts.index.tsx +0 -8
  171. package/templates/tanstack-start/src/routes/posts.tsx +0 -38
  172. package/templates/tanstack-start/src/routes/posts_.$postId.deep.tsx +0 -29
  173. package/templates/tanstack-start/src/routes/redirect.tsx +0 -9
  174. package/templates/tanstack-start/src/routes/users.$userId.tsx +0 -44
  175. package/templates/tanstack-start/src/routes/users.index.tsx +0 -18
  176. package/templates/tanstack-start/src/routes/users.tsx +0 -49
  177. package/templates/tanstack-start/src/styles/app.css +0 -12
  178. package/templates/tanstack-start/src/utils/loggingMiddleware.tsx +0 -41
  179. package/templates/tanstack-start/src/utils/posts.tsx +0 -40
  180. package/templates/tanstack-start/src/utils/seo.ts +0 -33
  181. package/templates/tanstack-start/src/utils/users.tsx +0 -5
@@ -14,6 +14,7 @@ import {
14
14
  UpdateFailedError,
15
15
  } from "./error.ts";
16
16
  import readOnlyPropertiesMap from "./properties.ts";
17
+ import updateTypesMap from "./update-types.ts";
17
18
  const compare = jsonpatch.compare;
18
19
 
19
20
  /**
@@ -106,6 +107,44 @@ function filterReadOnlyProperties(
106
107
  return filtered;
107
108
  }
108
109
 
110
+ /**
111
+ * Checks if any immutable properties have changed between current and desired state
112
+ * @param typeName AWS resource type name (e.g., "AWS::S3::Bucket")
113
+ * @param currentState Current resource state
114
+ * @param desiredState Desired resource state
115
+ * @returns true if any immutable properties have changed
116
+ */
117
+ function hasImmutablePropertyChanges(
118
+ typeName: string,
119
+ currentState: Record<string, any>,
120
+ desiredState: Record<string, any>,
121
+ ): boolean {
122
+ // Parse the type name to get service and resource
123
+ const [service, resource] = typeName.replace("AWS::", "").split("::");
124
+ const propertyUpdateTypes =
125
+ (updateTypesMap as any)[service]?.[resource] || {};
126
+
127
+ // Check if any immutable properties have changed
128
+ for (const [propertyName, updateType] of Object.entries(
129
+ propertyUpdateTypes,
130
+ )) {
131
+ if (updateType === "Immutable") {
132
+ const currentValue = currentState[propertyName];
133
+ const desiredValue = desiredState[propertyName];
134
+
135
+ // Deep comparison of property values
136
+ if (JSON.stringify(currentValue) !== JSON.stringify(desiredValue)) {
137
+ logger.log(
138
+ `Immutable property '${propertyName}' changed from ${JSON.stringify(currentValue)} to ${JSON.stringify(desiredValue)}`,
139
+ );
140
+ return true;
141
+ }
142
+ }
143
+ }
144
+
145
+ return false;
146
+ }
147
+
109
148
  /**
110
149
  * Creates a memoized Resource handler for a CloudFormation resource type
111
150
  *
@@ -253,6 +292,25 @@ async function CloudControlLifecycle(
253
292
 
254
293
  let response: ProgressEvent | undefined;
255
294
  if (this.phase === "update" && this.output?.id) {
295
+ // Check if any immutable properties have changed
296
+ const currentResource = await client.getResource(
297
+ props.typeName,
298
+ this.output.id,
299
+ );
300
+ if (
301
+ currentResource &&
302
+ hasImmutablePropertyChanges(
303
+ props.typeName,
304
+ currentResource,
305
+ props.desiredState,
306
+ )
307
+ ) {
308
+ logger.log(
309
+ `Resource ${id} has immutable property changes, requiring replacement`,
310
+ );
311
+ return this.replace();
312
+ }
313
+
256
314
  // Update existing resource
257
315
  response = await updateResourceWithPatch(
258
316
  client,