alchemy 0.46.1 → 0.47.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.
@@ -72,75 +72,57 @@ export const Zone = Resource("cloudflare::Zone", async function (_id, props) {
72
72
  }
73
73
  return this.destroy();
74
74
  }
75
+ let zoneData;
75
76
  if (this.phase === "update" && this.output?.id) {
76
77
  // Get zone details to verify it exists
77
78
  const response = await api.get(`/zones/${this.output.id}`);
78
79
  if (!response.ok) {
79
80
  throw new Error(`Error getting zone '${props.name}': ${response.statusText}`);
80
81
  }
81
- const zoneData = (await response.json())
82
- .result;
83
- // Update zone settings if provided
84
- if (props.settings) {
85
- await updateZoneSettings(api, this.output.id, props.settings);
86
- // Add a small delay to ensure settings are propagated
87
- await new Promise((resolve) => setTimeout(resolve, 2000));
88
- }
89
- return this({
90
- id: zoneData.id,
91
- name: zoneData.name,
92
- type: zoneData.type,
93
- status: zoneData.status,
94
- paused: zoneData.paused,
95
- accountId: zoneData.account.id,
96
- nameservers: zoneData.name_servers,
97
- originalNameservers: zoneData.original_name_servers,
98
- createdAt: new Date(zoneData.created_on).getTime(),
99
- modifiedAt: new Date(zoneData.modified_on).getTime(),
100
- activatedAt: zoneData.activated_on
101
- ? new Date(zoneData.activated_on).getTime()
102
- : null,
103
- settings: await getZoneSettings(api, zoneData.id),
104
- });
82
+ zoneData = (await response.json()).result;
105
83
  }
106
- // Create new zone
107
- const response = await api.post("/zones", {
108
- name: props.name,
109
- type: props.type || "full",
110
- jump_start: props.jumpStart !== false,
111
- account: {
112
- id: api.accountId,
113
- },
114
- });
115
- const body = await response.text();
116
- let zoneData;
117
- if (!response.ok) {
118
- if (response.status === 400 && body.includes("already exists")) {
119
- // Zone already exists, fetch it instead
120
- logger.warn(`Zone '${props.name}' already exists during Zone create, adopting it...`);
121
- const getResponse = await api.get(`/zones?name=${props.name}`);
122
- if (!getResponse.ok) {
123
- throw new Error(`Error fetching existing zone '${props.name}': ${getResponse.statusText}`);
84
+ else {
85
+ const response = await api.post("/zones", {
86
+ name: props.name,
87
+ type: props.type || "full",
88
+ jump_start: props.jumpStart !== false,
89
+ account: {
90
+ id: api.accountId,
91
+ },
92
+ });
93
+ const body = await response.text();
94
+ if (!response.ok) {
95
+ if (response.status === 400 && body.includes("already exists")) {
96
+ // Zone already exists, fetch it instead
97
+ logger.warn(`Zone '${props.name}' already exists during Zone create, adopting it...`);
98
+ const getResponse = await api.get(`/zones?name=${props.name}`);
99
+ if (!getResponse.ok) {
100
+ throw new Error(`Error fetching existing zone '${props.name}': ${getResponse.statusText}`);
101
+ }
102
+ const zones = (await getResponse.json()).result;
103
+ if (zones.length === 0) {
104
+ throw new Error(`Zone '${props.name}' does not exist, but the name is reserved for another user.`);
105
+ }
106
+ zoneData = zones[0];
124
107
  }
125
- const zones = (await getResponse.json()).result;
126
- if (zones.length === 0) {
127
- throw new Error(`Zone '${props.name}' does not exist, but the name is reserved for another user.`);
108
+ else {
109
+ throw new Error(`Error creating zone '${props.name}': ${response.statusText}\n${body}`);
128
110
  }
129
- zoneData = zones[0];
130
111
  }
131
112
  else {
132
- throw new Error(`Error creating zone '${props.name}': ${response.statusText}\n${body}`);
113
+ zoneData = JSON.parse(body).result;
133
114
  }
134
115
  }
135
- else {
136
- zoneData = JSON.parse(body).result;
137
- }
138
- // Update zone settings if provided
139
- if (props.settings) {
140
- await updateZoneSettings(api, zoneData.id, props.settings);
141
- // Add a small delay to ensure settings are propagated
142
- await new Promise((resolve) => setTimeout(resolve, 2000));
143
- }
116
+ // Apply defaults to settings
117
+ const settingsToApply = {
118
+ ...props.settings,
119
+ alwaysUseHttps: props.settings?.alwaysUseHttps ?? "on",
120
+ };
121
+ await updateZoneSettings(api, zoneData.id, settingsToApply);
122
+ // Add a small delay to ensure settings are propagated
123
+ // TODO(michael): do we need this?
124
+ // https://github.com/sam-goodwin/alchemy/issues/681
125
+ await new Promise((resolve) => setTimeout(resolve, 2000));
144
126
  return this({
145
127
  id: zoneData.id,
146
128
  name: zoneData.name,
@@ -1 +1 @@
1
- {"version":3,"file":"zone.js","sourceRoot":"","sources":["../../src/cloudflare/zone.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"zone.js","sourceRoot":"","sources":["../../src/cloudflare/zone.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { createXdgAppPaths } from "../xdg-paths.js";
2
- const xdg = createXdgAppPaths("alchemy");
1
+ import xdgAppPaths from "xdg-app-paths";
2
+ const xdg = xdgAppPaths("alchemy");
3
3
  export const CONFIG_DIR = xdg.config();
4
4
  export const TELEMETRY_DISABLED = !!process.env.ALCHEMY_TELEMETRY_DISABLED || !!process.env.DO_NOT_TRACK;
5
5
  // TODO(sam): replace with permanent URL
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/util/telemetry/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,GAAG,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAEzC,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;AAEvC,MAAM,CAAC,MAAM,kBAAkB,GAC7B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAEzE,wCAAwC;AACxC,MAAM,CAAC,MAAM,uBAAuB,GAClC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,wBAAwB,CAAC;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,OAAO,CAAC,GAAG,CAAC,kBAAkB;IAC9B,iDAAiD,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/util/telemetry/constants.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,eAAe,CAAC;AAExC,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;AAEnC,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;AAEvC,MAAM,CAAC,MAAM,kBAAkB,GAC7B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAEzE,wCAAwC;AACxC,MAAM,CAAC,MAAM,uBAAuB,GAClC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,wBAAwB,CAAC;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,OAAO,CAAC,GAAG,CAAC,kBAAkB;IAC9B,iDAAiD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alchemy",
3
- "version": "0.46.1",
3
+ "version": "0.47.0",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Sam Goodwin <sam@alchemy.run>",
6
6
  "homepage": "https://alchemy.run",
@@ -155,6 +155,7 @@
155
155
  "turndown": "^7.0.0",
156
156
  "unenv": "2.0.0-rc.15",
157
157
  "ws": "^8.18.3",
158
+ "xdg-app-paths": "^8.3.0",
158
159
  "yaml": "^2.0.0"
159
160
  },
160
161
  "peerDependencies": {
package/src/build-date.ts CHANGED
@@ -5,4 +5,4 @@
5
5
  * The build date used as the default worker compatibility date.
6
6
  * This is set to the date when the package was built.
7
7
  */
8
- export const BUILD_DATE = "2025-07-15";
8
+ export const BUILD_DATE = "2025-07-16";
@@ -6,6 +6,7 @@ import fs from "node:fs/promises";
6
6
  import os from "node:os";
7
7
  import path from "node:path";
8
8
  import open from "open";
9
+ import xdgAppPaths from "xdg-app-paths";
9
10
  import { HTTPServer } from "../util/http-server.ts";
10
11
  import { memoize } from "../util/memoize.ts";
11
12
  import {
@@ -15,7 +16,6 @@ import {
15
16
  HTTPError,
16
17
  singleFlight,
17
18
  } from "../util/neverthrow.ts";
18
- import { createXdgAppPaths } from "../util/xdg-paths.ts";
19
19
 
20
20
  const CLIENT_ID = "54d11594-84e4-41aa-b438-e81b8fa78ee7";
21
21
  const REDIRECT_URI = "http://localhost:8976/oauth/callback";
@@ -70,7 +70,7 @@ export const getRefreshedWranglerConfig = singleFlight(() =>
70
70
  );
71
71
 
72
72
  const getWranglerConfigPath = memoize(async () => {
73
- const xdgConfigDir = createXdgAppPaths(".wrangler").config();
73
+ const xdgConfigDir = xdgAppPaths(".wrangler").config();
74
74
  const legacyConfigDir = path.join(os.homedir(), ".wrangler");
75
75
  const configDir = (await fs
76
76
  .stat(legacyConfigDir)
@@ -92,12 +92,12 @@ const readWranglerConfig = () => {
92
92
  const config = toml.parse(text.replace(/\r\n/g, "\n"));
93
93
  assert(typeof config.oauth_token === "string");
94
94
  assert(typeof config.refresh_token === "string");
95
- assert(config.expiration_time instanceof Date);
95
+ assert(!!config.expiration_time);
96
96
  assert(Array.isArray(config.scopes));
97
97
  return {
98
98
  oauth_token: config.oauth_token,
99
99
  refresh_token: config.refresh_token,
100
- expiration_time: new Date(config.expiration_time),
100
+ expiration_time: new Date(config.expiration_time as any),
101
101
  scopes: config.scopes as string[],
102
102
  };
103
103
  }),
@@ -110,6 +110,7 @@ const writeWranglerConfig = (config: WranglerConfig) => {
110
110
  return ResultAsync.fromSafePromise(getWranglerConfigPath()).map(
111
111
  async (configPath) => {
112
112
  const toml = await import("@iarna/toml");
113
+ await fs.mkdir(path.dirname(configPath), { recursive: true });
113
114
  await fs.writeFile(
114
115
  configPath,
115
116
  toml.stringify({
@@ -197,6 +197,9 @@ export interface WorkerMetadata {
197
197
  suspended: boolean;
198
198
  }[];
199
199
  containers?: { class_name: string }[];
200
+ placement?: {
201
+ mode: "smart";
202
+ };
200
203
  }
201
204
 
202
205
  export async function prepareWorkerMetadata(
@@ -213,6 +216,9 @@ export async function prepareWorkerMetadata(
213
216
  };
214
217
  tags?: string[];
215
218
  unstable_cacheWorkerSettings?: boolean;
219
+ placement?: {
220
+ mode: "smart";
221
+ };
216
222
  },
217
223
  ): Promise<WorkerMetadata> {
218
224
  const oldSettings = await (props.unstable_cacheWorkerSettings
@@ -336,6 +342,7 @@ export async function prepareWorkerMetadata(
336
342
  transferred_classes: [],
337
343
  new_sqlite_classes: [],
338
344
  },
345
+ placement: props.placement,
339
346
  };
340
347
 
341
348
  const assetUploadResult = props.assetUploadResult;
@@ -181,6 +181,8 @@ export interface BaseWorkerProps<
181
181
  * Environment variables to attach to the worker
182
182
  *
183
183
  * These will be converted to plain_text bindings
184
+ *
185
+ * @deprecated - use `bindings` instead
184
186
  */
185
187
  env?: {
186
188
  [key: string]: string;
@@ -369,6 +371,24 @@ export interface BaseWorkerProps<
369
371
  url: string;
370
372
  cwd?: string;
371
373
  };
374
+
375
+ /**
376
+ * Smart placement configuration for the worker.
377
+ *
378
+ * Controls how Cloudflare places the worker across its network for optimal performance.
379
+ *
380
+ * When omitted, smart placement is disabled (default behavior).
381
+ */
382
+ placement?: {
383
+ /**
384
+ * The placement mode for the worker.
385
+ *
386
+ * - "smart": Automatically optimize placement based on performance metrics
387
+ *
388
+ * @default undefined (smart placement disabled)
389
+ */
390
+ mode: "smart";
391
+ };
372
392
  }
373
393
 
374
394
  export interface InlineWorkerProps<
@@ -563,6 +583,13 @@ export type Worker<
563
583
  * Version label for this worker deployment
564
584
  */
565
585
  version?: string;
586
+
587
+ /**
588
+ * Smart placement configuration for the worker
589
+ */
590
+ placement?: {
591
+ mode: "smart";
592
+ };
566
593
  };
567
594
 
568
595
  /**
@@ -1091,6 +1118,8 @@ export const _Worker = Resource(
1091
1118
  assets: props.assets,
1092
1119
  // Include cron triggers in the output
1093
1120
  crons: props.crons,
1121
+ // Include placement configuration in the output
1122
+ placement: props.placement,
1094
1123
  // phantom property
1095
1124
  Env: undefined!,
1096
1125
  } as unknown as Worker<B>);
@@ -1383,6 +1412,8 @@ export const _Worker = Resource(
1383
1412
  namespace: props.namespace,
1384
1413
  // Include version information in the output
1385
1414
  version: props.version,
1415
+ // Include placement configuration in the output
1416
+ placement: props.placement,
1386
1417
  // phantom property
1387
1418
  Env: undefined!,
1388
1419
  } as unknown as Worker<B>);
@@ -74,7 +74,7 @@ export interface ZoneProps extends CloudflareApiOptions {
74
74
  /**
75
75
  * Enable Always Use HTTPS
76
76
  * Redirects all HTTP traffic to HTTPS
77
- * @default "off"
77
+ * @default "on" (unless explicitly set to "off")
78
78
  */
79
79
  alwaysUseHttps?: AlwaysUseHTTPSValue;
80
80
 
@@ -339,6 +339,7 @@ export const Zone = Resource(
339
339
  return this.destroy();
340
340
  }
341
341
 
342
+ let zoneData: CloudflareZone;
342
343
  if (this.phase === "update" && this.output?.id) {
343
344
  // Get zone details to verify it exists
344
345
  const response = await api.get(`/zones/${this.output.id}`);
@@ -349,84 +350,63 @@ export const Zone = Resource(
349
350
  );
350
351
  }
351
352
 
352
- const zoneData = ((await response.json()) as { result: CloudflareZone })
353
- .result;
354
-
355
- // Update zone settings if provided
356
- if (props.settings) {
357
- await updateZoneSettings(api, this.output.id, props.settings);
358
- // Add a small delay to ensure settings are propagated
359
- await new Promise((resolve) => setTimeout(resolve, 2000));
360
- }
361
-
362
- return this({
363
- id: zoneData.id,
364
- name: zoneData.name,
365
- type: zoneData.type,
366
- status: zoneData.status,
367
- paused: zoneData.paused,
368
- accountId: zoneData.account.id,
369
- nameservers: zoneData.name_servers,
370
- originalNameservers: zoneData.original_name_servers,
371
- createdAt: new Date(zoneData.created_on).getTime(),
372
- modifiedAt: new Date(zoneData.modified_on).getTime(),
373
- activatedAt: zoneData.activated_on
374
- ? new Date(zoneData.activated_on).getTime()
375
- : null,
376
- settings: await getZoneSettings(api, zoneData.id),
353
+ zoneData = ((await response.json()) as { result: CloudflareZone }).result;
354
+ } else {
355
+ const response = await api.post("/zones", {
356
+ name: props.name,
357
+ type: props.type || "full",
358
+ jump_start: props.jumpStart !== false,
359
+ account: {
360
+ id: api.accountId,
361
+ },
377
362
  });
378
- }
379
- // Create new zone
380
-
381
- const response = await api.post("/zones", {
382
- name: props.name,
383
- type: props.type || "full",
384
- jump_start: props.jumpStart !== false,
385
- account: {
386
- id: api.accountId,
387
- },
388
- });
389
-
390
- const body = await response.text();
391
- let zoneData;
392
- if (!response.ok) {
393
- if (response.status === 400 && body.includes("already exists")) {
394
- // Zone already exists, fetch it instead
395
- logger.warn(
396
- `Zone '${props.name}' already exists during Zone create, adopting it...`,
397
- );
398
- const getResponse = await api.get(`/zones?name=${props.name}`);
399
363
 
400
- if (!getResponse.ok) {
401
- throw new Error(
402
- `Error fetching existing zone '${props.name}': ${getResponse.statusText}`,
364
+ const body = await response.text();
365
+ if (!response.ok) {
366
+ if (response.status === 400 && body.includes("already exists")) {
367
+ // Zone already exists, fetch it instead
368
+ logger.warn(
369
+ `Zone '${props.name}' already exists during Zone create, adopting it...`,
403
370
  );
404
- }
371
+ const getResponse = await api.get(`/zones?name=${props.name}`);
405
372
 
406
- const zones = (
407
- (await getResponse.json()) as { result: CloudflareZone[] }
408
- ).result;
409
- if (zones.length === 0) {
373
+ if (!getResponse.ok) {
374
+ throw new Error(
375
+ `Error fetching existing zone '${props.name}': ${getResponse.statusText}`,
376
+ );
377
+ }
378
+
379
+ const zones = (
380
+ (await getResponse.json()) as { result: CloudflareZone[] }
381
+ ).result;
382
+ if (zones.length === 0) {
383
+ throw new Error(
384
+ `Zone '${props.name}' does not exist, but the name is reserved for another user.`,
385
+ );
386
+ }
387
+ zoneData = zones[0];
388
+ } else {
410
389
  throw new Error(
411
- `Zone '${props.name}' does not exist, but the name is reserved for another user.`,
390
+ `Error creating zone '${props.name}': ${response.statusText}\n${body}`,
412
391
  );
413
392
  }
414
- zoneData = zones[0];
415
393
  } else {
416
- throw new Error(
417
- `Error creating zone '${props.name}': ${response.statusText}\n${body}`,
418
- );
394
+ zoneData = (JSON.parse(body) as { result: CloudflareZone }).result;
419
395
  }
420
- } else {
421
- zoneData = (JSON.parse(body) as { result: CloudflareZone }).result;
422
396
  }
423
397
 
424
- // Update zone settings if provided
425
- if (props.settings) {
426
- await updateZoneSettings(api, zoneData.id, props.settings);
427
- // Add a small delay to ensure settings are propagated
428
- await new Promise((resolve) => setTimeout(resolve, 2000));
429
- }
398
+ // Apply defaults to settings
399
+ const settingsToApply = {
400
+ ...props.settings,
401
+ alwaysUseHttps: props.settings?.alwaysUseHttps ?? "on",
402
+ };
403
+
404
+ await updateZoneSettings(api, zoneData.id, settingsToApply);
405
+
406
+ // Add a small delay to ensure settings are propagated
407
+ // TODO(michael): do we need this?
408
+ // https://github.com/sam-goodwin/alchemy/issues/681
409
+ await new Promise((resolve) => setTimeout(resolve, 2000));
430
410
 
431
411
  return this({
432
412
  id: zoneData.id,
@@ -451,7 +431,7 @@ export const Zone = Resource(
451
431
  * Helper function to update zone settings
452
432
  */
453
433
  async function updateZoneSettings(
454
- api: any,
434
+ api: CloudflareApi,
455
435
  zoneId: string,
456
436
  settings: ZoneProps["settings"],
457
437
  ): Promise<void> {
@@ -508,7 +488,7 @@ async function updateZoneSettings(
508
488
  * Helper function to get current zone settings
509
489
  */
510
490
  async function getZoneSettings(
511
- api: any,
491
+ api: CloudflareApi,
512
492
  zoneId: string,
513
493
  ): Promise<Zone["settings"]> {
514
494
  const settingsResponse = await api.get(`/zones/${zoneId}/settings`);
@@ -1,6 +1,6 @@
1
- import { createXdgAppPaths } from "../xdg-paths.js";
1
+ import xdgAppPaths from "xdg-app-paths";
2
2
 
3
- const xdg = createXdgAppPaths("alchemy");
3
+ const xdg = xdgAppPaths("alchemy");
4
4
 
5
5
  export const CONFIG_DIR = xdg.config();
6
6
 
@@ -1,9 +0,0 @@
1
- /**
2
- * Vendored XDG Base Directory Specification implementation
3
- * Provides cross-platform directory paths for config and state
4
- */
5
- export declare function createXdgAppPaths(appName: string): {
6
- config: () => string;
7
- state: () => string;
8
- };
9
- //# sourceMappingURL=xdg-paths.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"xdg-paths.d.ts","sourceRoot":"","sources":["../../src/util/xdg-paths.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM;kBAI5B,MAAM;iBAgBP,MAAM;EAoBzB"}
@@ -1,41 +0,0 @@
1
- import { join } from "node:path";
2
- import { homedir } from "node:os";
3
- /**
4
- * Vendored XDG Base Directory Specification implementation
5
- * Provides cross-platform directory paths for config and state
6
- */
7
- export function createXdgAppPaths(appName) {
8
- const platform = process.platform;
9
- const home = homedir();
10
- function config() {
11
- if (platform === "win32") {
12
- return join(process.env.LOCALAPPDATA || join(home, "AppData", "Local"), appName);
13
- }
14
- else if (platform === "darwin") {
15
- return join(home, "Library", "Preferences", appName);
16
- }
17
- else {
18
- // Linux/Unix - follow XDG Base Directory Specification
19
- const xdgConfigHome = process.env.XDG_CONFIG_HOME || join(home, ".config");
20
- return join(xdgConfigHome, appName);
21
- }
22
- }
23
- function state() {
24
- if (platform === "win32") {
25
- return join(process.env.LOCALAPPDATA || join(home, "AppData", "Local"), appName);
26
- }
27
- else if (platform === "darwin") {
28
- return join(home, "Library", "Application Support", appName);
29
- }
30
- else {
31
- // Linux/Unix - follow XDG Base Directory Specification
32
- const xdgStateHome = process.env.XDG_STATE_HOME || join(home, ".local", "state");
33
- return join(xdgStateHome, appName);
34
- }
35
- }
36
- return {
37
- config,
38
- state,
39
- };
40
- }
41
- //# sourceMappingURL=xdg-paths.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"xdg-paths.js","sourceRoot":"","sources":["../../src/util/xdg-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,SAAS,MAAM;QACb,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,IAAI,CACT,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAC1D,OAAO,CACR,CAAC;QACJ,CAAC;aAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,uDAAuD;YACvD,MAAM,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,SAAS,KAAK;QACZ,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,IAAI,CACT,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAC1D,OAAO,CACR,CAAC;QACJ,CAAC;aAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,uDAAuD;YACvD,MAAM,YAAY,GAChB,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -1,48 +0,0 @@
1
- import { join } from "node:path";
2
- import { homedir } from "node:os";
3
-
4
- /**
5
- * Vendored XDG Base Directory Specification implementation
6
- * Provides cross-platform directory paths for config and state
7
- */
8
- export function createXdgAppPaths(appName: string) {
9
- const platform = process.platform;
10
- const home = homedir();
11
-
12
- function config(): string {
13
- if (platform === "win32") {
14
- return join(
15
- process.env.LOCALAPPDATA || join(home, "AppData", "Local"),
16
- appName,
17
- );
18
- } else if (platform === "darwin") {
19
- return join(home, "Library", "Preferences", appName);
20
- } else {
21
- // Linux/Unix - follow XDG Base Directory Specification
22
- const xdgConfigHome =
23
- process.env.XDG_CONFIG_HOME || join(home, ".config");
24
- return join(xdgConfigHome, appName);
25
- }
26
- }
27
-
28
- function state(): string {
29
- if (platform === "win32") {
30
- return join(
31
- process.env.LOCALAPPDATA || join(home, "AppData", "Local"),
32
- appName,
33
- );
34
- } else if (platform === "darwin") {
35
- return join(home, "Library", "Application Support", appName);
36
- } else {
37
- // Linux/Unix - follow XDG Base Directory Specification
38
- const xdgStateHome =
39
- process.env.XDG_STATE_HOME || join(home, ".local", "state");
40
- return join(xdgStateHome, appName);
41
- }
42
- }
43
-
44
- return {
45
- config,
46
- state,
47
- };
48
- }