alchemy 0.78.0 → 0.80.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 (81) hide show
  1. package/bin/alchemy.js +2 -1
  2. package/lib/cloudflare/bindings.d.ts +2 -2
  3. package/lib/cloudflare/bindings.d.ts.map +1 -1
  4. package/lib/cloudflare/bindings.js.map +1 -1
  5. package/lib/cloudflare/bound.d.ts +1 -1
  6. package/lib/cloudflare/bound.d.ts.map +1 -1
  7. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  8. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  9. package/lib/cloudflare/miniflare/build-worker-options.d.ts.map +1 -1
  10. package/lib/cloudflare/miniflare/build-worker-options.js +10 -0
  11. package/lib/cloudflare/miniflare/build-worker-options.js.map +1 -1
  12. package/lib/cloudflare/miniflare/miniflare-controller.d.ts.map +1 -1
  13. package/lib/cloudflare/miniflare/miniflare-controller.js +2 -2
  14. package/lib/cloudflare/miniflare/miniflare-controller.js.map +1 -1
  15. package/lib/cloudflare/website.d.ts +4 -0
  16. package/lib/cloudflare/website.d.ts.map +1 -1
  17. package/lib/cloudflare/website.js +36 -2
  18. package/lib/cloudflare/website.js.map +1 -1
  19. package/lib/cloudflare/worker-metadata.d.ts +1 -1
  20. package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
  21. package/lib/cloudflare/worker-metadata.js +16 -1
  22. package/lib/cloudflare/worker-metadata.js.map +1 -1
  23. package/lib/cloudflare/worker-subdomain.d.ts +1 -0
  24. package/lib/cloudflare/worker-subdomain.d.ts.map +1 -1
  25. package/lib/cloudflare/worker-subdomain.js +10 -2
  26. package/lib/cloudflare/worker-subdomain.js.map +1 -1
  27. package/lib/cloudflare/worker.d.ts +10 -0
  28. package/lib/cloudflare/worker.d.ts.map +1 -1
  29. package/lib/cloudflare/worker.js +23 -3
  30. package/lib/cloudflare/worker.js.map +1 -1
  31. package/lib/cloudflare/workflow.d.ts +1 -0
  32. package/lib/cloudflare/workflow.d.ts.map +1 -1
  33. package/lib/cloudflare/workflow.js +6 -0
  34. package/lib/cloudflare/workflow.js.map +1 -1
  35. package/lib/cloudflare/wrangler.json.d.ts +1 -1
  36. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  37. package/lib/cloudflare/wrangler.json.js +16 -3
  38. package/lib/cloudflare/wrangler.json.js.map +1 -1
  39. package/lib/docker/api.d.ts +14 -0
  40. package/lib/docker/api.d.ts.map +1 -1
  41. package/lib/docker/api.js +18 -2
  42. package/lib/docker/api.js.map +1 -1
  43. package/lib/docker/container.d.ts +5 -0
  44. package/lib/docker/container.d.ts.map +1 -1
  45. package/lib/docker/container.js +69 -49
  46. package/lib/docker/container.js.map +1 -1
  47. package/lib/docker/volume.d.ts +5 -0
  48. package/lib/docker/volume.d.ts.map +1 -1
  49. package/lib/docker/volume.js +43 -19
  50. package/lib/docker/volume.js.map +1 -1
  51. package/lib/neon/project.d.ts +30 -16
  52. package/lib/neon/project.d.ts.map +1 -1
  53. package/lib/neon/project.js +123 -1
  54. package/lib/neon/project.js.map +1 -1
  55. package/lib/util/camel-to-snake.d.ts +1 -1
  56. package/lib/util/camel-to-snake.d.ts.map +1 -1
  57. package/lib/util/camel-to-snake.js +26 -13
  58. package/lib/util/camel-to-snake.js.map +1 -1
  59. package/lib/util/find-open-port.d.ts +1 -0
  60. package/lib/util/find-open-port.d.ts.map +1 -1
  61. package/lib/util/find-open-port.js +15 -0
  62. package/lib/util/find-open-port.js.map +1 -1
  63. package/package.json +1 -1
  64. package/src/cloudflare/bindings.ts +3 -1
  65. package/src/cloudflare/bound.ts +19 -13
  66. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  67. package/src/cloudflare/miniflare/build-worker-options.ts +10 -0
  68. package/src/cloudflare/miniflare/miniflare-controller.ts +3 -2
  69. package/src/cloudflare/website.ts +43 -2
  70. package/src/cloudflare/worker-metadata.ts +19 -1
  71. package/src/cloudflare/worker-subdomain.ts +14 -2
  72. package/src/cloudflare/worker.ts +36 -2
  73. package/src/cloudflare/workflow.ts +9 -0
  74. package/src/cloudflare/wrangler.json.ts +14 -1
  75. package/src/docker/api.ts +24 -2
  76. package/src/docker/container.ts +83 -52
  77. package/src/docker/volume.ts +64 -27
  78. package/src/neon/project.ts +157 -2
  79. package/src/util/camel-to-snake.ts +34 -19
  80. package/src/util/find-open-port.ts +18 -0
  81. package/workers/tunnel-proxy.js +1 -1
@@ -87,62 +87,82 @@ export const Container = Resource("docker::Container", async function (id, props
87
87
  // Return destroyed state
88
88
  return this.destroy();
89
89
  }
90
- else {
91
- let containerState = "created";
90
+ let containerState = "created";
91
+ // Check if container already exists
92
+ const containerExists = await api.containerExists(containerName);
93
+ if (containerExists) {
92
94
  if (this.phase === "update") {
93
- // Check if container already exists (for update)
94
- const containerExists = await api.containerExists(containerName);
95
- if (containerExists) {
96
- // Remove existing container for update
97
- await api.removeContainer(containerName, true);
98
- }
95
+ // Remove existing container for update
96
+ await api.removeContainer(containerName, true);
99
97
  }
100
- // Prepare port mappings
101
- const portMappings = {};
102
- if (props.ports) {
103
- for (const port of props.ports) {
104
- const protocol = port.protocol || "tcp";
105
- portMappings[`${port.external}`] = `${port.internal}/${protocol}`;
98
+ else {
99
+ // Create phase - check for adoption
100
+ if (!props.adopt) {
101
+ throw new Error(`Container "${containerName}" already exists. Use adopt: true to adopt it.`);
106
102
  }
107
- }
108
- // Prepare volume mappings
109
- const volumeMappings = {};
110
- if (props.volumes) {
111
- for (const volume of props.volumes) {
112
- const readOnlyFlag = volume.readOnly ? ":ro" : "";
113
- volumeMappings[volume.hostPath] =
114
- `${volume.containerPath}${readOnlyFlag}`;
103
+ // Adopt existing container
104
+ const containerInfos = await api.inspectContainer(containerName);
105
+ const containerInfo = containerInfos[0];
106
+ let adoptedState = containerInfo.State.Status;
107
+ // Optionally start the container if requested
108
+ if (props.start && containerInfo.State.Status !== "running") {
109
+ await api.startContainer(containerName);
110
+ adoptedState = "running";
115
111
  }
112
+ return {
113
+ ...props,
114
+ id: containerInfo.Id,
115
+ name: containerName,
116
+ state: adoptedState,
117
+ createdAt: new Date(containerInfo.Created).getTime(),
118
+ };
116
119
  }
117
- // Create new container
118
- const containerId = await api.createContainer(imageRef, containerName, {
119
- ports: portMappings,
120
- env: props.environment,
121
- volumes: volumeMappings,
122
- cmd: props.command,
123
- healthcheck: props.healthcheck,
124
- });
125
- // Connect to networks if specified
126
- if (props.networks) {
127
- for (const network of props.networks) {
128
- const networkId = typeof network === "string" ? network : network.name;
129
- await api.connectNetwork(containerId, networkId, {
130
- aliases: network.aliases,
131
- });
132
- }
120
+ }
121
+ // Prepare port mappings
122
+ const portMappings = {};
123
+ if (props.ports) {
124
+ for (const port of props.ports) {
125
+ const protocol = port.protocol || "tcp";
126
+ portMappings[`${port.external}`] = `${port.internal}/${protocol}`;
133
127
  }
134
- // Start container if requested
135
- if (props.start) {
136
- await api.startContainer(containerId);
137
- containerState = "running";
128
+ }
129
+ // Prepare volume mappings
130
+ const volumeMappings = {};
131
+ if (props.volumes) {
132
+ for (const volume of props.volumes) {
133
+ const readOnlyFlag = volume.readOnly ? ":ro" : "";
134
+ volumeMappings[volume.hostPath] =
135
+ `${volume.containerPath}${readOnlyFlag}`;
136
+ }
137
+ }
138
+ // Create new container
139
+ const containerId = await api.createContainer(imageRef, containerName, {
140
+ ports: portMappings,
141
+ env: props.environment,
142
+ volumes: volumeMappings,
143
+ cmd: props.command,
144
+ healthcheck: props.healthcheck,
145
+ });
146
+ // Connect to networks if specified
147
+ if (props.networks) {
148
+ for (const network of props.networks) {
149
+ const networkId = typeof network === "string" ? network : network.name;
150
+ await api.connectNetwork(containerId, networkId, {
151
+ aliases: network.aliases,
152
+ });
138
153
  }
139
- return {
140
- ...props,
141
- id: containerId,
142
- name: containerName,
143
- state: containerState,
144
- createdAt: Date.now(),
145
- };
146
154
  }
155
+ // Start container if requested
156
+ if (props.start) {
157
+ await api.startContainer(containerId);
158
+ containerState = "running";
159
+ }
160
+ return {
161
+ ...props,
162
+ id: containerId,
163
+ name: containerName,
164
+ state: containerState,
165
+ createdAt: Date.now(),
166
+ };
147
167
  });
148
168
  //# sourceMappingURL=container.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/docker/container.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/docker/container.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,11 @@ export interface VolumeProps {
35
35
  * Custom metadata labels for the volume
36
36
  */
37
37
  labels?: VolumeLabel[] | Record<string, string>;
38
+ /**
39
+ * Whether to adopt the volume if it already exists
40
+ * @default false
41
+ */
42
+ adopt?: boolean;
38
43
  }
39
44
  /**
40
45
  * Docker Volume resource
@@ -1 +1 @@
1
- {"version":3,"file":"volume.d.ts","sourceRoot":"","sources":["../../src/docker/volume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,MAAO,SAAQ,WAAW;IACzC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,MAAM,yFAGT,OAAO,CAAC,MAAM,CAAC,MACjB,MAAM,SACH,WAAW,KACjB,OAAO,CAAC,MAAM,CAAC,CA2DnB,CAAC"}
1
+ {"version":3,"file":"volume.d.ts","sourceRoot":"","sources":["../../src/docker/volume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhD;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,MAAO,SAAQ,WAAW;IACzC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,MAAM,yFAGT,OAAO,CAAC,MAAM,CAAC,MACjB,MAAM,SACH,WAAW,KACjB,OAAO,CAAC,MAAM,CAAC,CA0FnB,CAAC"}
@@ -54,25 +54,49 @@ export const Volume = Resource("docker::Volume", async function (id, props) {
54
54
  // Return destroyed state
55
55
  return this.destroy();
56
56
  }
57
- else {
58
- // Set default driver if not provided
59
- const driver = props.driver || "local";
60
- const driverOpts = props.driverOpts || {};
61
- // Create the volume
62
- const volumeId = await api.createVolume(volumeName, driver, driverOpts, processedLabels);
63
- // Get volume details to retrieve mountpoint
64
- const volumeInfos = await api.inspectVolume(volumeId);
65
- const mountpoint = volumeInfos[0].Mountpoint;
66
- return {
67
- ...props,
68
- driver: driver,
69
- id: volumeId,
70
- name: volumeName,
71
- mountpoint,
72
- createdAt: Date.now(),
73
- labels: Array.isArray(props.labels) ? props.labels : undefined,
74
- driverOpts: props.driverOpts,
75
- };
57
+ // Check if volume already exists
58
+ const volumeExists = await api.volumeExists(volumeName);
59
+ if (volumeExists) {
60
+ if (this.phase === "update") {
61
+ this.replace();
62
+ }
63
+ else {
64
+ // Create phase - check for adoption
65
+ if (!props.adopt) {
66
+ throw new Error(`Volume "${volumeName}" already exists. Use adopt: true to adopt it.`);
67
+ }
68
+ // Adopt existing volume
69
+ const volumeInfos = await api.inspectVolume(volumeName);
70
+ const volumeInfo = volumeInfos[0];
71
+ return {
72
+ ...props,
73
+ id: volumeInfo.Name,
74
+ name: volumeInfo.Name,
75
+ driver: volumeInfo.Driver,
76
+ mountpoint: volumeInfo.Mountpoint,
77
+ createdAt: new Date(volumeInfo.CreatedAt).getTime(),
78
+ labels: Array.isArray(props.labels) ? props.labels : undefined,
79
+ driverOpts: volumeInfo.Options,
80
+ };
81
+ }
76
82
  }
83
+ // Set default driver if not provided
84
+ const driver = props.driver || "local";
85
+ const driverOpts = props.driverOpts || {};
86
+ // Create the volume
87
+ const volumeId = await api.createVolume(volumeName, driver, driverOpts, processedLabels);
88
+ // Get volume details to retrieve mountpoint
89
+ const volumeInfos = await api.inspectVolume(volumeId);
90
+ const mountpoint = volumeInfos[0].Mountpoint;
91
+ return {
92
+ ...props,
93
+ driver: driver,
94
+ id: volumeId,
95
+ name: volumeName,
96
+ mountpoint,
97
+ createdAt: Date.now(),
98
+ labels: Array.isArray(props.labels) ? props.labels : undefined,
99
+ driverOpts: props.driverOpts,
100
+ };
77
101
  });
78
102
  //# sourceMappingURL=volume.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"volume.js","sourceRoot":"","sources":["../../src/docker/volume.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAsErC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAC5B,gBAAgB,EAChB,KAAK,WAEH,EAAU,EACV,KAAkB;IAElB,+BAA+B;IAC/B,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC;IAE5B,MAAM,UAAU,GACd,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAEvE,6CAA6C;IAC7C,MAAM,eAAe,GAA2B,EAAE,CAAC;IACnD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,2CAA2C;YAC3C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;YAC5C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,sBAAsB;YACtB,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;YACtB,gBAAgB;YAChB,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QAED,yBAAyB;QACzB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,qCAAqC;QACrC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC;QACvC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;QAE1C,oBAAoB;QACpB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,YAAY,CACrC,UAAU,EACV,MAAM,EACN,UAAU,EACV,eAAe,CAChB,CAAC;QAEF,4CAA4C;QAC5C,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QAE7C,OAAO;YACL,GAAG,KAAK;YACR,MAAM,EAAE,MAAM;YACd,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,UAAU;YAChB,UAAU;YACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAC9D,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC"}
1
+ {"version":3,"file":"volume.js","sourceRoot":"","sources":["../../src/docker/volume.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,16 @@ export type NeonPgVersion = 14 | 15 | 16 | 17 | 18;
11
11
  * Properties for creating or updating a Neon project
12
12
  */
13
13
  export interface NeonProjectProps extends NeonApiOptions {
14
+ /**
15
+ * When `true`, will adopt an existing project by `name`
16
+ */
17
+ adopt?: true;
18
+ /**
19
+ * Whether to delete the database when the resource is destroyed.
20
+ * When false, the database will only be removed from the state but not deleted via API.
21
+ * @default true, unless the resource was adopted
22
+ */
23
+ delete?: boolean;
14
24
  /**
15
25
  * Name of the project
16
26
  *
@@ -122,6 +132,13 @@ export interface NeonProject {
122
132
  * });
123
133
  *
124
134
  * @example
135
+ * // Adopt an existing Neon project by name:
136
+ * const project = await NeonProject("my-project", {
137
+ * adopt: true
138
+ * name: "adjective-noun-123",
139
+ * });
140
+ *
141
+ * @example
125
142
  * // Create a Neon project in a specific region with a specific PostgreSQL version:
126
143
  * const euProject = await NeonProject("my-eu-project", {
127
144
  * name: "My EU Project",
@@ -137,21 +154,18 @@ export interface NeonProject {
137
154
  * default_branch_name: "development"
138
155
  * });
139
156
  */
140
- export declare const NeonProject: (((this: any, id: string, props?: {}) => never) & (new (_: never) => never)) | ((this: Context<NeonProject>, id: string, props: NeonProjectProps) => Promise<{
141
- id: string;
157
+ export declare const NeonProject: (((this: any, id: string, props?: {}) => never) & (new (_: never) => never)) | ((this: Context<NeonProject>, id: string, props: NeonProjectProps) => Promise<NeonProject>);
158
+ /**
159
+ * References an existing Neon project by name. You can use this to reference an existing NeonProject without adopting it.
160
+ *
161
+ * @example
162
+ * const project = await NeonProjectRef({
163
+ * name: "my-project"
164
+ * });
165
+ *
166
+ * @warning Project names must be unique when referencing existing projects. If multiple projects are found with the same name, an error will be thrown.
167
+ */
168
+ export declare function NeonProjectRef(props: NeonProjectProps & {
142
169
  name: string;
143
- created_at: string;
144
- updated_at: string;
145
- proxy_host: string;
146
- region_id: NeonRegion;
147
- pg_version: NeonPgVersion;
148
- settings: neon.ProjectSettingsData | undefined;
149
- default_endpoint_settings: neon.DefaultEndpointSettings | undefined;
150
- history_retention_seconds: number;
151
- connection_uris: [NeonConnectionUri, ...NeonConnectionUri[]];
152
- roles: [NeonRole, ...NeonRole[]];
153
- databases: [neon.Database, ...neon.Database[]];
154
- branch: neon.Branch;
155
- endpoints: [neon.Endpoint, ...neon.Endpoint[]];
156
- }>);
170
+ }): Promise<NeonProject>;
157
171
  //# sourceMappingURL=project.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/neon/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACd,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,eAAe,GACf,eAAe,GACf,eAAe,GACf,kBAAkB,GAClB,eAAe,GACf,oBAAoB,GACpB,oBAAoB,GACpB,eAAe,GACf,eAAe,GACf,eAAe,GACf,WAAW,CAAC;AAEhB,MAAM,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,SAAS,CAAC,EAAE,UAAU,CAAC;IAEvB;;;OAGG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC;IAE3B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC;IAEpC;;OAEG;IACH,yBAAyB,CAAC,EAAE,IAAI,CAAC,uBAAuB,CAAC;IAEzD;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,EAAE,UAAU,CAAC;IAEtB;;OAEG;IACH,QAAQ,EAAE,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAE/C;;OAEG;IACH,yBAAyB,EAAE,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAEpE;;OAEG;IACH,yBAAyB,EAAE,MAAM,CAAC;IAElC;;OAEG;IACH,UAAU,EAAE,aAAa,CAAC;IAE1B;;OAEG;IACH,eAAe,EAAE,CAAC,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAAC,CAAC;IAE7D;;OAEG;IACH,KAAK,EAAE,CAAC,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;IAEjC;;OAEG;IACH,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE/C;;OAEG;IACH,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,WAAW,yFAGd,OAAO,CAAC,WAAW,CAAC,MACtB,MAAM,SACH,gBAAgB;;;;;;eAkDoB,UAAU;gBACR,aAAa;;;;qBAIc,CAChE,iBAAiB,EACjB,GAAG,iBAAiB,EAAE,CACvB;WACoC,CAAC,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;eACjC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;;eAExC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;GAkDpE,CAAC"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/neon/project.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAE9D,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EAEd,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,eAAe,GACf,eAAe,GACf,eAAe,GACf,kBAAkB,GAClB,eAAe,GACf,oBAAoB,GACpB,oBAAoB,GACpB,eAAe,GACf,eAAe,GACf,eAAe,GACf,WAAW,CAAC;AAEhB,MAAM,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD;;OAEG;IACH,KAAK,CAAC,EAAE,IAAI,CAAC;IAEb;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,SAAS,CAAC,EAAE,UAAU,CAAC;IAEvB;;;OAGG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC;IAE3B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC;IAEpC;;OAEG;IACH,yBAAyB,CAAC,EAAE,IAAI,CAAC,uBAAuB,CAAC;IAEzD;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,EAAE,UAAU,CAAC;IAEtB;;OAEG;IACH,QAAQ,EAAE,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAE/C;;OAEG;IACH,yBAAyB,EAAE,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAEpE;;OAEG;IACH,yBAAyB,EAAE,MAAM,CAAC;IAElC;;OAEG;IACH,UAAU,EAAE,aAAa,CAAC;IAE1B;;OAEG;IACH,eAAe,EAAE,CAAC,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAAC,CAAC;IAE7D;;OAEG;IACH,KAAK,EAAE,CAAC,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;IAEjC;;OAEG;IACH,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE/C;;OAEG;IACH,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,WAAW,yFAGd,OAAO,CAAC,WAAW,CAAC,MACtB,MAAM,SACH,gBAAgB,0BA4H1B,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GACzC,OAAO,CAAC,WAAW,CAAC,CAEtB"}
@@ -1,3 +1,4 @@
1
+ import { alchemy } from "../alchemy.js";
1
2
  import { Resource } from "../resource.js";
2
3
  import { createNeonApi } from "./api.js";
3
4
  import { formatConnectionUri, formatRole, waitForOperations, } from "./utils.js";
@@ -11,6 +12,13 @@ import { formatConnectionUri, formatRole, waitForOperations, } from "./utils.js"
11
12
  * });
12
13
  *
13
14
  * @example
15
+ * // Adopt an existing Neon project by name:
16
+ * const project = await NeonProject("my-project", {
17
+ * adopt: true
18
+ * name: "adjective-noun-123",
19
+ * });
20
+ *
21
+ * @example
14
22
  * // Create a Neon project in a specific region with a specific PostgreSQL version:
15
23
  * const euProject = await NeonProject("my-eu-project", {
16
24
  * name: "My EU Project",
@@ -31,6 +39,17 @@ export const NeonProject = Resource("neon::Project", async function (id, props)
31
39
  const name = props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
32
40
  switch (this.phase) {
33
41
  case "create": {
42
+ if (props.adopt) {
43
+ try {
44
+ return await fetchProject(api, { ...props, name });
45
+ }
46
+ catch (error) {
47
+ if (!(error instanceof NeonProjectNotFound)) {
48
+ throw error;
49
+ }
50
+ // project not found, continue with creation
51
+ }
52
+ }
34
53
  const { data } = await api.createProject({
35
54
  body: {
36
55
  project: {
@@ -110,7 +129,7 @@ export const NeonProject = Resource("neon::Project", async function (id, props)
110
129
  };
111
130
  }
112
131
  case "delete": {
113
- if (this.output?.id) {
132
+ if (props.delete !== false && this.output?.id) {
114
133
  const response = await api.deleteProject({
115
134
  path: {
116
135
  project_id: this.output.id,
@@ -127,4 +146,107 @@ export const NeonProject = Resource("neon::Project", async function (id, props)
127
146
  }
128
147
  }
129
148
  });
149
+ /**
150
+ * References an existing Neon project by name. You can use this to reference an existing NeonProject without adopting it.
151
+ *
152
+ * @example
153
+ * const project = await NeonProjectRef({
154
+ * name: "my-project"
155
+ * });
156
+ *
157
+ * @warning Project names must be unique when referencing existing projects. If multiple projects are found with the same name, an error will be thrown.
158
+ */
159
+ export async function NeonProjectRef(props) {
160
+ return await fetchProject(createNeonApi(props), props);
161
+ }
162
+ async function fetchProject(api, props) {
163
+ const project = await api
164
+ .listProjects({
165
+ query: { search: props.name },
166
+ })
167
+ .then(({ data: { projects } }) => {
168
+ if (!projects.length) {
169
+ throw new NeonProjectNotFound(props.name);
170
+ }
171
+ if (projects.length > 1) {
172
+ throw new Error(`Multiple projects found with name "${props.name}". Name must be unique when referencing existing projects.`);
173
+ }
174
+ return projects[0];
175
+ });
176
+ const endpointsPromise = api
177
+ .listProjectEndpoints({
178
+ path: { project_id: project.id },
179
+ })
180
+ .then((res) => res.data.endpoints);
181
+ const branch = await api
182
+ .listProjectBranches({
183
+ path: { project_id: project.id },
184
+ query: { search: props.default_branch_name ?? "main" },
185
+ })
186
+ .then((res) => {
187
+ if (!res.data.branches.length) {
188
+ throw new Error(`Branch ${props.default_branch_name ?? "main"} does not exist in Neon project "${props.name}" (${project.id}).`);
189
+ }
190
+ return res.data.branches[0];
191
+ });
192
+ const rolesPromise = api
193
+ .listProjectBranchRoles({
194
+ path: { project_id: project.id, branch_id: branch.id },
195
+ })
196
+ .then((res) => res.data.roles.map(formatRole));
197
+ const databases = await api
198
+ .listProjectBranchDatabases({
199
+ path: { project_id: project.id, branch_id: branch.id },
200
+ })
201
+ .then((res) => res.data.databases);
202
+ const [connection_uris, endpoints, roles] = await Promise.all([
203
+ Promise.all(databases.map(fetchConnectionUri)),
204
+ endpointsPromise,
205
+ rolesPromise,
206
+ ]);
207
+ return {
208
+ id: project.id,
209
+ name: project.name,
210
+ created_at: project.created_at,
211
+ updated_at: project.updated_at,
212
+ proxy_host: project.proxy_host,
213
+ region_id: project.region_id,
214
+ pg_version: project.pg_version,
215
+ settings: project.settings,
216
+ default_endpoint_settings: project.default_endpoint_settings,
217
+ history_retention_seconds: project.history_retention_seconds ?? 86400,
218
+ connection_uris,
219
+ roles,
220
+ databases,
221
+ branch,
222
+ endpoints,
223
+ };
224
+ async function fetchConnectionUri(database) {
225
+ const { data: { uri }, } = await api.getConnectionUri({
226
+ path: { project_id: project.id },
227
+ query: {
228
+ branch_id: database.branch_id,
229
+ database_name: database.name,
230
+ role_name: database.owner_name,
231
+ pooled: false, // match default behavior from create endpoint (should this be true?)
232
+ },
233
+ });
234
+ const url = new URL(uri);
235
+ return {
236
+ connection_uri: alchemy.secret(uri),
237
+ connection_parameters: {
238
+ database: database.name,
239
+ host: url.host,
240
+ port: 5432,
241
+ user: url.username,
242
+ password: alchemy.secret(url.password),
243
+ },
244
+ };
245
+ }
246
+ }
247
+ class NeonProjectNotFound extends Error {
248
+ constructor(name) {
249
+ super(`Failed to find existing project "${name}".`);
250
+ }
251
+ }
130
252
  //# sourceMappingURL=project.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/neon/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/neon/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAuB,MAAM,UAAU,CAAC;AAG9D,OAAO,EACL,mBAAmB,EACnB,UAAU,EAGV,iBAAiB,GAClB,MAAM,YAAY,CAAC;AA+JpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CACjC,eAAe,EACf,KAAK,WAEH,EAAU,EACV,KAAuB;IAEvB,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,IAAI,GACR,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAEvE,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC;oBACH,OAAO,MAAM,YAAY,CAAC,GAAG,EAAE,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,CAAC,KAAK,YAAY,mBAAmB,CAAC,EAAE,CAAC;wBAC5C,MAAM,KAAK,CAAC;oBACd,CAAC;oBACD,4CAA4C;gBAC9C,CAAC;YACH,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC;gBACvC,IAAI,EAAE;oBACJ,OAAO,EAAE;wBACP,IAAI;wBACJ,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;wBAC5B,yBAAyB,EAAE,KAAK,CAAC,yBAAyB;wBAC1D,MAAM,EAAE;4BACN,IAAI,EAAE,KAAK,CAAC,mBAAmB;yBAChC;wBACD,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,yBAAyB,EAAE,KAAK,CAAC,yBAAyB;qBAC3D;iBACF;aACF,CAAC,CAAC;YAEH,mFAAmF;YACnF,MAAM,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC5C,GAAG;qBACA,gBAAgB,CAAC;oBAChB,IAAI,EAAE;wBACJ,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;wBAC3B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;qBAC1B;iBACF,CAAC;qBACD,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBACjC,GAAG;qBACA,oBAAoB,CAAC;oBACpB,IAAI,EAAE;wBACJ,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;qBAC5B;iBACF,CAAC;qBACD,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;aACrC,CAAC,CAAC;YAEH,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;gBACnB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;gBACvB,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;gBACnC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;gBACnC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;gBACnC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAuB;gBAC/C,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAA2B;gBACpD,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;gBAC/B,yBAAyB,EAAE,IAAI,CAAC,OAAO,CAAC,yBAAyB;gBACjE,yBAAyB,EAAE,IAAI,CAAC,OAAO,CAAC,yBAAyB;gBACjE,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,mBAAmB,CAG5D;gBACD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAA8B;gBAC9D,SAAS,EAAE,IAAI,CAAC,SAAgD;gBAChE,MAAM;gBACN,SAAS,EAAE,SAAgD;aAC5D,CAAC;QACJ,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC;gBACvC,IAAI,EAAE;oBACJ,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;iBAC3B;gBACD,IAAI,EAAE;oBACJ,OAAO,EAAE;wBACP,IAAI;wBACJ,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,yBAAyB,EAAE,KAAK,CAAC,yBAAyB;wBAC1D,yBAAyB,EAAE,KAAK,CAAC,yBAAyB;qBAC3D;iBACF;aACF,CAAC,CAAC;YACH,OAAO;gBACL,GAAG,IAAI,CAAC,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;gBACvB,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;gBACnC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;gBACnC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAuB;gBAC/C,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAA2B;gBACpD,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;gBAC/B,yBAAyB,EAAE,IAAI,CAAC,OAAO,CAAC,yBAAyB;gBACjE,yBAAyB,EAAE,IAAI,CAAC,OAAO,CAAC,yBAAyB;aAClE,CAAC;QACJ,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;gBAC9C,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC;oBACvC,IAAI,EAAE;wBACJ,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;qBAC3B;oBACD,YAAY,EAAE,KAAK;iBACpB,CAAC,CAAC;gBACH,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACvD,MAAM,IAAI,KAAK,CACb,6BAA6B,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EACrD;wBACE,KAAK,EAAE,QAAQ,CAAC,KAAK;qBACtB,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC,CACF,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAA0C;IAE1C,OAAO,MAAM,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,GAAe,EACf,KAA0C;IAE1C,MAAM,OAAO,GAAG,MAAM,GAAG;SACtB,YAAY,CAAC;QACZ,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE;KAC9B,CAAC;SACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE;QAC/B,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,sCAAsC,KAAK,CAAC,IAAI,4DAA4D,CAC7G,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IACL,MAAM,gBAAgB,GAAG,GAAG;SACzB,oBAAoB,CAAC;QACpB,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;KACjC,CAAC;SACD,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAgD,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,MAAM,GAAG;SACrB,mBAAmB,CAAC;QACnB,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;QAChC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,mBAAmB,IAAI,MAAM,EAAE;KACvD,CAAC;SACD,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;QACZ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,UAAU,KAAK,CAAC,mBAAmB,IAAI,MAAM,oCAAoC,KAAK,CAAC,IAAI,MAAM,OAAO,CAAC,EAAE,IAAI,CAChH,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IACL,MAAM,YAAY,GAAG,GAAG;SACrB,sBAAsB,CAAC;QACtB,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE;KACvD,CAAC;SACD,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAA8B,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,MAAM,GAAG;SACxB,0BAA0B,CAAC;QAC1B,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE;KACvD,CAAC;SACD,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAgD,CAAC,CAAC;IAC5E,MAAM,CAAC,eAAe,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAE5C;QACD,gBAAgB;QAChB,YAAY;KACb,CAAC,CAAC;IACH,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAuB;QAC1C,UAAU,EAAE,OAAO,CAAC,UAA2B;QAC/C,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,yBAAyB,EAAE,OAAO,CAAC,yBAAyB;QAC5D,yBAAyB,EAAE,OAAO,CAAC,yBAAyB,IAAI,KAAK;QACrE,eAAe;QACf,KAAK;QACL,SAAS;QACT,MAAM;QACN,SAAS;KACV,CAAC;IAEF,KAAK,UAAU,kBAAkB,CAC/B,QAAuB;QAEvB,MAAM,EACJ,IAAI,EAAE,EAAE,GAAG,EAAE,GACd,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC;YAC7B,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;YAChC,KAAK,EAAE;gBACL,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,aAAa,EAAE,QAAQ,CAAC,IAAI;gBAC5B,SAAS,EAAE,QAAQ,CAAC,UAAU;gBAC9B,MAAM,EAAE,KAAK,EAAE,qEAAqE;aACrF;SACF,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO;YACL,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;YACnC,qBAAqB,EAAE;gBACrB,QAAQ,EAAE,QAAQ,CAAC,IAAI;gBACvB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,GAAG,CAAC,QAAQ;gBAClB,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;aACvC;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,mBAAoB,SAAQ,KAAK;IACrC,YAAY,IAAY;QACtB,KAAK,CAAC,oCAAoC,IAAI,IAAI,CAAC,CAAC;IACtD,CAAC;CACF"}
@@ -1,7 +1,7 @@
1
1
  export interface LogPushProps {
2
2
  maxFooBar: string;
3
3
  }
4
- export declare function camelToSnakeObjectDeep<T extends object | undefined>(obj: T): T extends undefined ? undefined : CamelToSnake<T>;
4
+ export declare function camelToSnakeObjectDeep<T>(obj: T): T extends undefined ? undefined : T extends object ? CamelToSnake<T> : T;
5
5
  type IsUpper<C extends string> = C extends Uppercase<C> ? C extends Lowercase<C> ? false : true : false;
6
6
  type IsLower<C extends string> = C extends Lowercase<C> ? C extends Uppercase<C> ? false : true : false;
7
7
  type CamelToSnakeString<S extends string, Acc extends string = ""> = S extends `${infer First}${infer Second}${infer Rest}` ? IsUpper<First> extends true ? IsUpper<Second> extends true ? Rest extends `${infer Third}${infer _}` ? IsLower<Third> extends true ? CamelToSnakeString<Rest, `${Acc}${Lowercase<First>}_${Lowercase<Second>}`> : CamelToSnakeString<`${Second}${Rest}`, `${Acc}${Lowercase<First>}`> : CamelToSnakeString<`${Second}${Rest}`, `${Acc}${Lowercase<First>}`> : CamelToSnakeString<`${Second}${Rest}`, Acc extends "" ? `${Lowercase<First>}` : `${Acc}_${Lowercase<First>}`> : IsLower<First> extends true ? IsUpper<Second> extends true ? CamelToSnakeString<`${Second}${Rest}`, `${Acc}${First}`> : CamelToSnakeString<`${Second}${Rest}`, `${Acc}${First}`> : CamelToSnakeString<`${Second}${Rest}`, `${Acc}${First}`> : S extends `${infer Last}` ? `${Acc}${Lowercase<Last>}` : Acc;
@@ -1 +1 @@
1
- {"version":3,"file":"camel-to-snake.d.ts","sourceRoot":"","sources":["../../src/util/camel-to-snake.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,EACjE,GAAG,EAAE,CAAC,GACL,CAAC,SAAS,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,CAkBnD;AAGD,KAAK,OAAO,CAAC,CAAC,SAAS,MAAM,IAC3B,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,GAClB,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,GACpB,KAAK,GACL,IAAI,GACN,KAAK,CAAC;AAGZ,KAAK,OAAO,CAAC,CAAC,SAAS,MAAM,IAC3B,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,GAClB,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,GACpB,KAAK,GACL,IAAI,GACN,KAAK,CAAC;AAGZ,KAAK,kBAAkB,CACrB,CAAC,SAAS,MAAM,EAChB,GAAG,SAAS,MAAM,GAAG,EAAE,IACrB,CAAC,SAAS,GAAG,MAAM,KAAK,GAAG,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,GACtD,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,GACzB,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,GAE1B,IAAI,SAAS,GAAG,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,GACrC,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,GAEzB,kBAAkB,CAChB,IAAI,EACJ,GAAG,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CACjD,GAED,kBAAkB,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,GAErE,kBAAkB,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,GAErE,kBAAkB,CAChB,GAAG,MAAM,GAAG,IAAI,EAAE,EAClB,GAAG,SAAS,EAAE,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CACtE,GACH,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,GACzB,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,GAE1B,kBAAkB,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC,GAExD,kBAAkB,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC,GAE1D,kBAAkB,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC,GAC5D,CAAC,SAAS,GAAG,MAAM,IAAI,EAAE,GACvB,GAAG,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,GAC1B,GAAG,CAAC;AAGV,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GACnC,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GACtB,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GACtB,CAAC,SAAS,IAAI,GAAG,MAAM,GAAG,QAAQ,GAChC,CAAC,GACD;KACG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,GAC7B,kBAAkB,CAAC,CAAC,CAAC,GACrB,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC3B,GACL,CAAC,CAAC"}
1
+ {"version":3,"file":"camel-to-snake.d.ts","sourceRoot":"","sources":["../../src/util/camel-to-snake.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,GAAG,EAAE,CAAC,GACL,CAAC,SAAS,SAAS,GAAG,SAAS,GAAG,CAAC,SAAS,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAiC1E;AAGD,KAAK,OAAO,CAAC,CAAC,SAAS,MAAM,IAC3B,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,GAClB,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,GACpB,KAAK,GACL,IAAI,GACN,KAAK,CAAC;AAGZ,KAAK,OAAO,CAAC,CAAC,SAAS,MAAM,IAC3B,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,GAClB,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,GACpB,KAAK,GACL,IAAI,GACN,KAAK,CAAC;AAGZ,KAAK,kBAAkB,CACrB,CAAC,SAAS,MAAM,EAChB,GAAG,SAAS,MAAM,GAAG,EAAE,IACrB,CAAC,SAAS,GAAG,MAAM,KAAK,GAAG,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,GACtD,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,GACzB,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,GAE1B,IAAI,SAAS,GAAG,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,GACrC,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,GAEzB,kBAAkB,CAChB,IAAI,EACJ,GAAG,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CACjD,GAED,kBAAkB,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,GAErE,kBAAkB,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,GAErE,kBAAkB,CAChB,GAAG,MAAM,GAAG,IAAI,EAAE,EAClB,GAAG,SAAS,EAAE,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CACtE,GACH,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,GACzB,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,GAE1B,kBAAkB,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC,GAExD,kBAAkB,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC,GAE1D,kBAAkB,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC,GAC5D,CAAC,SAAS,GAAG,MAAM,IAAI,EAAE,GACvB,GAAG,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,GAC1B,GAAG,CAAC;AAGV,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GACnC,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GACtB,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GACtB,CAAC,SAAS,IAAI,GAAG,MAAM,GAAG,QAAQ,GAChC,CAAC,GACD;KACG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,GAC7B,kBAAkB,CAAC,CAAC,CAAC,GACrB,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC3B,GACL,CAAC,CAAC"}
@@ -1,16 +1,29 @@
1
1
  export function camelToSnakeObjectDeep(obj) {
2
- return (obj
3
- ? Object.fromEntries(Object.entries(obj).map(([key, value]) => [
4
- key
5
- .replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2") // Handle consecutive capitals: "FOOBar" -> "FOO_Bar"
6
- .replace(/([a-z])([A-Z])/g, "$1_$2") // Handle normal camelCase: "fooBar" -> "foo_Bar"
7
- .toLowerCase(),
8
- Array.isArray(value)
9
- ? value.map(camelToSnakeObjectDeep)
10
- : typeof value === "object" && value !== null
11
- ? camelToSnakeObjectDeep(value)
12
- : value,
13
- ]))
14
- : undefined);
2
+ if (obj === undefined || obj === null) {
3
+ return obj;
4
+ }
5
+ // If it's not an object (primitive types), return as-is
6
+ if (typeof obj !== "object") {
7
+ return obj;
8
+ }
9
+ if (obj instanceof RegExp) {
10
+ return obj;
11
+ }
12
+ // Handle arrays
13
+ if (Array.isArray(obj)) {
14
+ return obj.map(camelToSnakeObjectDeep);
15
+ }
16
+ // Handle objects
17
+ return Object.fromEntries(Object.entries(obj).map(([key, value]) => [
18
+ key
19
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2") // Handle consecutive capitals: "FOOBar" -> "FOO_Bar"
20
+ .replace(/([a-z])([A-Z])/g, "$1_$2") // Handle normal camelCase: "fooBar" -> "foo_Bar"
21
+ .toLowerCase(),
22
+ Array.isArray(value)
23
+ ? value.map(camelToSnakeObjectDeep)
24
+ : typeof value === "object" && value !== null
25
+ ? camelToSnakeObjectDeep(value)
26
+ : value,
27
+ ]));
15
28
  }
16
29
  //# sourceMappingURL=camel-to-snake.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"camel-to-snake.js","sourceRoot":"","sources":["../../src/util/camel-to-snake.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,sBAAsB,CACpC,GAAM;IAEN,OAAO,CACL,GAAG;QACD,CAAC,CAAC,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;YACxC,GAAG;iBACA,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC,qDAAqD;iBAC/F,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,iDAAiD;iBACrF,WAAW,EAAE;YAChB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAClB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;gBACnC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;oBAC3C,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC;oBAC/B,CAAC,CAAC,KAAK;SACZ,CAAC,CACH;QACH,CAAC,CAAC,SAAS,CACuC,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"camel-to-snake.js","sourceRoot":"","sources":["../../src/util/camel-to-snake.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,sBAAsB,CACpC,GAAM;IAEN,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACtC,OAAO,GAAU,CAAC;IACpB,CAAC;IAED,wDAAwD;IACxD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAU,CAAC;IACpB,CAAC;IAED,IAAI,GAAG,YAAY,MAAM,EAAE,CAAC;QAC1B,OAAO,GAAU,CAAC;IACpB,CAAC;IAED,gBAAgB;IAChB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,sBAAsB,CAAQ,CAAC;IAChD,CAAC;IAED,iBAAiB;IACjB,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QACxC,GAAG;aACA,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC,qDAAqD;aAC/F,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,iDAAiD;aACrF,WAAW,EAAE;QAChB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAClB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACnC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;gBAC3C,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC;gBAC/B,CAAC,CAAC,KAAK;KACZ,CAAC,CACI,CAAC;AACX,CAAC"}
@@ -1,2 +1,3 @@
1
+ export declare function reservePort(key: string): Promise<number>;
1
2
  export declare function findOpenPort(min?: number, max?: number): Promise<number>;
2
3
  //# sourceMappingURL=find-open-port.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"find-open-port.d.ts","sourceRoot":"","sources":["../../src/util/find-open-port.ts"],"names":[],"mappings":"AAEA,wBAAsB,YAAY,CAAC,GAAG,SAAO,EAAE,GAAG,SAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAO3E"}
1
+ {"version":3,"file":"find-open-port.d.ts","sourceRoot":"","sources":["../../src/util/find-open-port.ts"],"names":[],"mappings":"AAQA,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,mBAU5C;AAED,wBAAsB,YAAY,CAAC,GAAG,SAAO,EAAE,GAAG,SAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAO3E"}
@@ -1,4 +1,19 @@
1
1
  import net from "node:net";
2
+ import { AsyncMutex } from "./mutex.js";
3
+ const owners = new Map();
4
+ const ports = new Map();
5
+ const mutex = new AsyncMutex();
6
+ export async function reservePort(key) {
7
+ if (owners.has(key)) {
8
+ return owners.get(key);
9
+ }
10
+ return mutex.lock(async () => {
11
+ const port = await findOpenPort();
12
+ owners.set(key, port);
13
+ ports.set(port, key);
14
+ return port;
15
+ });
16
+ }
2
17
  export async function findOpenPort(min = 1337, max = 65535) {
3
18
  for (let port = min; port <= max; port++) {
4
19
  if (await isPortAvailable("0.0.0.0", port)) {
@@ -1 +1 @@
1
- {"version":3,"file":"find-open-port.js","sourceRoot":"","sources":["../../src/util/find-open-port.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,KAAK;IACxD,KAAK,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,QAAQ,GAAG,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,IAAY;IACvD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEf,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,iBAAiB;YACjB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YAC7B,oBAAoB;YACpB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"find-open-port.js","sourceRoot":"","sources":["../../src/util/find-open-port.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;AACzC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;AAExC,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QAC3B,MAAM,IAAI,GAAG,MAAM,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtB,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,KAAK;IACxD,KAAK,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,QAAQ,GAAG,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,IAAY;IACvD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEf,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,iBAAiB;YACjB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YAC7B,oBAAoB;YACpB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}