tthr 0.3.23 → 0.3.24

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.
@@ -87,23 +87,31 @@ async function resolveEnvironmentFromApiKey(cwd = process.cwd()) {
87
87
  }
88
88
  }
89
89
  var DEFAULT_API_URL = "https://api.tetherdb.co.uk";
90
+ function normaliseApiBase(raw) {
91
+ const trimmed = raw.trim().replace(/\/+$/, "");
92
+ try {
93
+ return new URL(trimmed).origin;
94
+ } catch {
95
+ return trimmed;
96
+ }
97
+ }
90
98
  function getApiUrl(config) {
91
99
  if (process.env.TETHER_API_URL) {
92
- return process.env.TETHER_API_URL.replace(/\/+$/, "");
100
+ return normaliseApiBase(process.env.TETHER_API_URL);
93
101
  }
94
102
  if (config?.url) {
95
- return config.url.replace(/\/+$/, "");
103
+ return normaliseApiBase(config.url);
96
104
  }
97
105
  const isDev = process.env.NODE_ENV === "development" || process.env.TETHER_DEV === "true";
98
106
  return isDev ? "http://localhost:3001" : DEFAULT_API_URL;
99
107
  }
100
108
  async function resolveApiUrl(config) {
101
109
  if (process.env.TETHER_API_URL) {
102
- return process.env.TETHER_API_URL.replace(/\/+$/, "");
110
+ return normaliseApiBase(process.env.TETHER_API_URL);
103
111
  }
104
112
  const resolved = config ?? await loadConfig();
105
113
  if (resolved?.url) {
106
- return resolved.url.replace(/\/+$/, "");
114
+ return normaliseApiBase(resolved.url);
107
115
  }
108
116
  const isDev = process.env.NODE_ENV === "development" || process.env.TETHER_DEV === "true";
109
117
  return isDev ? "http://localhost:3001" : DEFAULT_API_URL;
@@ -233,6 +241,19 @@ async function clearCredentials() {
233
241
  }
234
242
 
235
243
  // src/commands/generate.ts
244
+ function stripTimestamp(source) {
245
+ return source.replace(/^\/\/ Generated at: .*$\n?/m, "");
246
+ }
247
+ async function writeIfChanged(filePath, content) {
248
+ if (await fs3.pathExists(filePath)) {
249
+ const existing = await fs3.readFile(filePath, "utf-8");
250
+ if (stripTimestamp(existing) === stripTimestamp(content)) {
251
+ return false;
252
+ }
253
+ }
254
+ await fs3.writeFile(filePath, content);
255
+ return true;
256
+ }
236
257
  function parseSchemaFile(source) {
237
258
  const tables = [];
238
259
  const schemaMatch = source.match(/defineSchema\s*\(\s*\{([\s\S]*)\}\s*\)/);
@@ -651,19 +672,19 @@ async function generateTypes(options = {}) {
651
672
  const apiUrl = `${await resolveApiUrl(config)}/api/v1`;
652
673
  const envVarKeys = projectId ? await fetchEnvVarKeys(projectId, environment, apiUrl) : [];
653
674
  await fs3.ensureDir(outputDir);
654
- await fs3.writeFile(
675
+ await writeIfChanged(
655
676
  path3.join(outputDir, "db.ts"),
656
677
  generateDbFile(tables, schemaSource)
657
678
  );
658
- await fs3.writeFile(
679
+ await writeIfChanged(
659
680
  path3.join(outputDir, "api.ts"),
660
681
  await generateApiFile(functionsDir)
661
682
  );
662
- await fs3.writeFile(
683
+ await writeIfChanged(
663
684
  path3.join(outputDir, "env.ts"),
664
685
  generateEnvFile(envVarKeys)
665
686
  );
666
- await fs3.writeFile(
687
+ await writeIfChanged(
667
688
  path3.join(outputDir, "index.ts"),
668
689
  `// Auto-generated by Tether CLI - do not edit manually
669
690
  export * from './db';
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  generateCommand,
3
3
  generateTypes
4
- } from "./chunk-5S4QNCO2.js";
4
+ } from "./chunk-4X6M7K3X.js";
5
5
  export {
6
6
  generateCommand,
7
7
  generateTypes
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  resolveEnvironmentFromApiKey,
14
14
  resolvePath,
15
15
  saveCredentials
16
- } from "./chunk-5S4QNCO2.js";
16
+ } from "./chunk-4X6M7K3X.js";
17
17
 
18
18
  // src/index.ts
19
19
  import { Command } from "commander";
@@ -1754,7 +1754,7 @@ async function runGenerate(spinner) {
1754
1754
  }
1755
1755
  isGenerating = true;
1756
1756
  try {
1757
- const { generateTypes: generateTypes2 } = await import("./generate-FEUPHOUR.js");
1757
+ const { generateTypes: generateTypes2 } = await import("./generate-VX2WJHYQ.js");
1758
1758
  spinner.text = "Regenerating types...";
1759
1759
  await generateTypes2({ silent: true });
1760
1760
  spinner.succeed("Types regenerated");
@@ -2026,7 +2026,7 @@ async function devCommand(options) {
2026
2026
  }
2027
2027
  }
2028
2028
  spinner.text = "Generating types...";
2029
- const { generateTypes: generateTypes2 } = await import("./generate-FEUPHOUR.js");
2029
+ const { generateTypes: generateTypes2 } = await import("./generate-VX2WJHYQ.js");
2030
2030
  await generateTypes2({ silent: true });
2031
2031
  spinner.succeed("Types generated");
2032
2032
  if (config.projectId) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tthr",
3
- "version": "0.3.23",
3
+ "version": "0.3.24",
4
4
  "description": "Tether CLI - project scaffolding and deployment",
5
5
  "type": "module",
6
6
  "bin": {