glotfile 0.1.0 → 0.1.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.
@@ -4189,6 +4189,7 @@ import { serve } from "@hono/node-server";
4189
4189
  import { fileURLToPath } from "url";
4190
4190
  import { dirname as dirname6, join as join7, resolve as resolve8, extname as extname3, sep as sep2 } from "path";
4191
4191
  import { readFile, stat } from "fs/promises";
4192
+ import { createServer } from "net";
4192
4193
  import open from "open";
4193
4194
  async function readFileResponse(absPath) {
4194
4195
  try {
@@ -4236,10 +4237,25 @@ function buildApp(opts) {
4236
4237
  }
4237
4238
  return app;
4238
4239
  }
4239
- function startServer(opts) {
4240
+ function findAvailablePort(start) {
4241
+ return new Promise((resolveP, reject) => {
4242
+ const probe = createServer();
4243
+ probe.listen(start, "127.0.0.1", () => {
4244
+ probe.close(() => resolveP(start));
4245
+ });
4246
+ probe.on("error", (err) => {
4247
+ if (err.code === "EADDRINUSE") {
4248
+ findAvailablePort(start + 1).then(resolveP, reject);
4249
+ } else {
4250
+ reject(err);
4251
+ }
4252
+ });
4253
+ });
4254
+ }
4255
+ async function startServer(opts) {
4240
4256
  const app = buildApp(opts);
4257
+ const port = await findAvailablePort(opts.dev ? DEV_PORT : DEFAULT_PORT);
4241
4258
  return new Promise((resolveP) => {
4242
- const port = opts.dev ? 8787 : 0;
4243
4259
  const server = serve({ fetch: app.fetch, hostname: "127.0.0.1", port }, (info) => {
4244
4260
  const url = `http://127.0.0.1:${info.port}`;
4245
4261
  if (opts.open !== false && !opts.dev) void open(url);
@@ -4261,7 +4277,7 @@ function backgroundScan(statePath) {
4261
4277
  console.warn("[scan] failed:", err instanceof Error ? err.message : String(err));
4262
4278
  });
4263
4279
  }
4264
- var here, DEFAULT_UI_DIR, MIME;
4280
+ var here, DEFAULT_UI_DIR, MIME, DEFAULT_PORT, DEV_PORT;
4265
4281
  var init_server = __esm({
4266
4282
  "src/server/server.ts"() {
4267
4283
  "use strict";
@@ -4285,6 +4301,8 @@ var init_server = __esm({
4285
4301
  ".woff2": "font/woff2",
4286
4302
  ".woff": "font/woff"
4287
4303
  };
4304
+ DEFAULT_PORT = 3e3;
4305
+ DEV_PORT = 8787;
4288
4306
  }
4289
4307
  });
4290
4308
 
@@ -31,6 +31,7 @@ import { serve } from "@hono/node-server";
31
31
  import { fileURLToPath } from "url";
32
32
  import { dirname as dirname6, join as join7, resolve as resolve7, extname as extname3, sep as sep2 } from "path";
33
33
  import { readFile, stat } from "fs/promises";
34
+ import { createServer } from "net";
34
35
  import open from "open";
35
36
 
36
37
  // src/server/api.ts
@@ -3905,10 +3906,27 @@ function buildApp(opts) {
3905
3906
  }
3906
3907
  return app;
3907
3908
  }
3908
- function startServer(opts) {
3909
+ var DEFAULT_PORT = 3e3;
3910
+ var DEV_PORT = 8787;
3911
+ function findAvailablePort(start) {
3912
+ return new Promise((resolveP, reject) => {
3913
+ const probe = createServer();
3914
+ probe.listen(start, "127.0.0.1", () => {
3915
+ probe.close(() => resolveP(start));
3916
+ });
3917
+ probe.on("error", (err) => {
3918
+ if (err.code === "EADDRINUSE") {
3919
+ findAvailablePort(start + 1).then(resolveP, reject);
3920
+ } else {
3921
+ reject(err);
3922
+ }
3923
+ });
3924
+ });
3925
+ }
3926
+ async function startServer(opts) {
3909
3927
  const app = buildApp(opts);
3928
+ const port = await findAvailablePort(opts.dev ? DEV_PORT : DEFAULT_PORT);
3910
3929
  return new Promise((resolveP) => {
3911
- const port = opts.dev ? 8787 : 0;
3912
3930
  const server = serve({ fetch: app.fetch, hostname: "127.0.0.1", port }, (info) => {
3913
3931
  const url = `http://127.0.0.1:${info.port}`;
3914
3932
  if (opts.open !== false && !opts.dev) void open(url);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "glotfile",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Local-first, git-native translation management.",
5
5
  "type": "module",
6
6
  "bin": {