reylo-effect-tooling 0.5.0 → 0.5.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.
package/dist/esbuild.js CHANGED
@@ -7,8 +7,8 @@ import { Effect as Effect7, FileSystem as FileSystem3, Option as Option6 } from
7
7
 
8
8
  // src/analysis.ts
9
9
  import { createHash as createHash3, randomUUID } from "node:crypto";
10
- import { existsSync as existsSync4 } from "node:fs";
11
- import { dirname as dirname3, join as join5, relative as relative2, resolve as resolve2 } from "node:path";
10
+ import { existsSync as existsSync4, readFileSync as readFileSync4 } from "node:fs";
11
+ import { dirname as dirname3, join as join5, posix, relative as relative2, resolve as resolve2, sep } from "node:path";
12
12
  import {
13
13
  Effect as Effect3,
14
14
  Exit,
@@ -402,12 +402,12 @@ var DIALECTS = ["postgres", "sqlite", "mysql"];
402
402
  function declaredEngines(dir) {
403
403
  try {
404
404
  const parsed = JSON.parse(readFileSync(join(dir, "package.json"), "utf8"));
405
- const listed = /* @__PURE__ */ new Set();
405
+ const listed2 = /* @__PURE__ */ new Set();
406
406
  for (const key of ["dependencies", "devDependencies", "optionalDependencies"]) {
407
407
  const group = Predicate.hasProperty(parsed, key) ? parsed[key] : void 0;
408
- if (Predicate.isObject(group)) for (const name of Object.keys(group)) listed.add(name);
408
+ if (Predicate.isObject(group)) for (const name of Object.keys(group)) listed2.add(name);
409
409
  }
410
- return DIALECTS.filter((dialect) => listed.has(ENGINE_PACKAGES[dialect]));
410
+ return DIALECTS.filter((dialect) => listed2.has(ENGINE_PACKAGES[dialect]));
411
411
  } catch {
412
412
  return [];
413
413
  }
@@ -704,17 +704,17 @@ function wranglerVersion(entry) {
704
704
  function projectDrivers(root) {
705
705
  const file = join2(packageDir(root), "package.json");
706
706
  if (!existsSync2(file)) return [];
707
- const listed = /* @__PURE__ */ new Set();
707
+ const listed2 = /* @__PURE__ */ new Set();
708
708
  try {
709
709
  const parsed = JSON.parse(readFileSync2(file, "utf8"));
710
710
  for (const key of ["dependencies", "devDependencies", "optionalDependencies"]) {
711
711
  const group = Predicate2.hasProperty(parsed, key) ? parsed[key] : void 0;
712
- if (Predicate2.isObject(group)) for (const name of Object.keys(group)) listed.add(name);
712
+ if (Predicate2.isObject(group)) for (const name of Object.keys(group)) listed2.add(name);
713
713
  }
714
714
  } catch {
715
715
  return [];
716
716
  }
717
- return DRIVERS.flatMap(([name]) => listed.has(name) ? [name] : []);
717
+ return DRIVERS.flatMap(([name]) => listed2.has(name) ? [name] : []);
718
718
  }
719
719
  async function openProjectDrivers(root, path) {
720
720
  if (path === ":memory:") return [];
@@ -1546,13 +1546,61 @@ var StoredAnalysis = Schema4.fromJsonString(
1546
1546
  function findProject(from) {
1547
1547
  const configured = process.env.REYLO_CONFIG;
1548
1548
  if (configured) return { dir: packageDir(from), file: resolve2(configured) };
1549
+ let owner;
1549
1550
  for (let dir = resolve2(from); ; dir = dirname3(dir)) {
1550
1551
  const file = PROJECT_FILES.map((name) => join5(dir, name)).find((path) => existsSync4(path));
1551
1552
  if (file !== void 0) return { dir, file };
1552
- if (existsSync4(join5(dir, "package.json"))) return { dir };
1553
+ if (owner === void 0 && existsSync4(join5(dir, "package.json")))
1554
+ owner = { dir, stop: workspaceRoot(dir) ?? dir };
1555
+ if (dir === owner?.stop) return { dir: owner.dir };
1553
1556
  if (dirname3(dir) === dir) return { dir: resolve2(from) };
1554
1557
  }
1555
1558
  }
1559
+ var WorkspacePatterns = Schema4.Array(Schema4.String);
1560
+ var PackageWorkspaces = Schema4.Struct({
1561
+ workspaces: Schema4.Union([WorkspacePatterns, Schema4.Struct({ packages: WorkspacePatterns })])
1562
+ });
1563
+ var PnpmWorkspace = Schema4.Struct({ packages: WorkspacePatterns });
1564
+ function workspaceRoot(member) {
1565
+ for (let dir = member; dirname3(dir) !== dir; ) {
1566
+ dir = dirname3(dir);
1567
+ const patterns = workspacePatterns(dir);
1568
+ if (patterns !== void 0) return listed(relative2(dir, member), patterns) ? dir : void 0;
1569
+ }
1570
+ return void 0;
1571
+ }
1572
+ function listed(path, patterns) {
1573
+ const posixPath = path.split(sep).join("/");
1574
+ const matches = (pattern) => posix.matchesGlob(posixPath, pattern.replace(/^\.\//u, "").replace(/\/+$/u, ""));
1575
+ return patterns.some((pattern) => !pattern.startsWith("!") && matches(pattern)) && !patterns.some((pattern) => pattern.startsWith("!") && matches(pattern.slice(1)));
1576
+ }
1577
+ function workspacePatterns(dir) {
1578
+ const pnpm = join5(dir, "pnpm-workspace.yaml");
1579
+ if (existsSync4(pnpm)) {
1580
+ let parsed2;
1581
+ try {
1582
+ parsed2 = parseDocument(readFileSync4(pnpm, "utf8")).toJS();
1583
+ } catch {
1584
+ return [];
1585
+ }
1586
+ return Option4.match(Schema4.decodeUnknownOption(PnpmWorkspace)(parsed2), {
1587
+ onNone: () => [],
1588
+ onSome: (workspace) => workspace.packages
1589
+ });
1590
+ }
1591
+ const manifest = join5(dir, "package.json");
1592
+ if (!existsSync4(manifest)) return void 0;
1593
+ let parsed;
1594
+ try {
1595
+ parsed = JSON.parse(readFileSync4(manifest, "utf8"));
1596
+ } catch {
1597
+ return void 0;
1598
+ }
1599
+ return Option4.match(Schema4.decodeUnknownOption(PackageWorkspaces)(parsed), {
1600
+ onNone: () => void 0,
1601
+ onSome: ({ workspaces }) => "packages" in workspaces ? workspaces.packages : workspaces
1602
+ });
1603
+ }
1556
1604
  function projectDirectory(from) {
1557
1605
  return findProject(from).dir;
1558
1606
  }
package/dist/loader.js CHANGED
@@ -8,8 +8,8 @@ import { Effect as Effect7, FileSystem as FileSystem3, Option as Option6 } from
8
8
 
9
9
  // src/analysis.ts
10
10
  import { createHash as createHash3, randomUUID } from "node:crypto";
11
- import { existsSync as existsSync4 } from "node:fs";
12
- import { dirname as dirname3, join as join5, relative as relative2, resolve as resolve2 } from "node:path";
11
+ import { existsSync as existsSync4, readFileSync as readFileSync4 } from "node:fs";
12
+ import { dirname as dirname3, join as join5, posix, relative as relative2, resolve as resolve2, sep } from "node:path";
13
13
  import {
14
14
  Effect as Effect3,
15
15
  Exit,
@@ -403,12 +403,12 @@ var DIALECTS = ["postgres", "sqlite", "mysql"];
403
403
  function declaredEngines(dir) {
404
404
  try {
405
405
  const parsed = JSON.parse(readFileSync(join(dir, "package.json"), "utf8"));
406
- const listed = /* @__PURE__ */ new Set();
406
+ const listed2 = /* @__PURE__ */ new Set();
407
407
  for (const key of ["dependencies", "devDependencies", "optionalDependencies"]) {
408
408
  const group = Predicate.hasProperty(parsed, key) ? parsed[key] : void 0;
409
- if (Predicate.isObject(group)) for (const name of Object.keys(group)) listed.add(name);
409
+ if (Predicate.isObject(group)) for (const name of Object.keys(group)) listed2.add(name);
410
410
  }
411
- return DIALECTS.filter((dialect) => listed.has(ENGINE_PACKAGES[dialect]));
411
+ return DIALECTS.filter((dialect) => listed2.has(ENGINE_PACKAGES[dialect]));
412
412
  } catch {
413
413
  return [];
414
414
  }
@@ -705,17 +705,17 @@ function wranglerVersion(entry) {
705
705
  function projectDrivers(root) {
706
706
  const file = join2(packageDir(root), "package.json");
707
707
  if (!existsSync2(file)) return [];
708
- const listed = /* @__PURE__ */ new Set();
708
+ const listed2 = /* @__PURE__ */ new Set();
709
709
  try {
710
710
  const parsed = JSON.parse(readFileSync2(file, "utf8"));
711
711
  for (const key of ["dependencies", "devDependencies", "optionalDependencies"]) {
712
712
  const group = Predicate2.hasProperty(parsed, key) ? parsed[key] : void 0;
713
- if (Predicate2.isObject(group)) for (const name of Object.keys(group)) listed.add(name);
713
+ if (Predicate2.isObject(group)) for (const name of Object.keys(group)) listed2.add(name);
714
714
  }
715
715
  } catch {
716
716
  return [];
717
717
  }
718
- return DRIVERS.flatMap(([name]) => listed.has(name) ? [name] : []);
718
+ return DRIVERS.flatMap(([name]) => listed2.has(name) ? [name] : []);
719
719
  }
720
720
  async function openProjectDrivers(root, path) {
721
721
  if (path === ":memory:") return [];
@@ -1547,13 +1547,61 @@ var StoredAnalysis = Schema4.fromJsonString(
1547
1547
  function findProject(from) {
1548
1548
  const configured = process.env.REYLO_CONFIG;
1549
1549
  if (configured) return { dir: packageDir(from), file: resolve2(configured) };
1550
+ let owner;
1550
1551
  for (let dir = resolve2(from); ; dir = dirname3(dir)) {
1551
1552
  const file = PROJECT_FILES.map((name) => join5(dir, name)).find((path) => existsSync4(path));
1552
1553
  if (file !== void 0) return { dir, file };
1553
- if (existsSync4(join5(dir, "package.json"))) return { dir };
1554
+ if (owner === void 0 && existsSync4(join5(dir, "package.json")))
1555
+ owner = { dir, stop: workspaceRoot(dir) ?? dir };
1556
+ if (dir === owner?.stop) return { dir: owner.dir };
1554
1557
  if (dirname3(dir) === dir) return { dir: resolve2(from) };
1555
1558
  }
1556
1559
  }
1560
+ var WorkspacePatterns = Schema4.Array(Schema4.String);
1561
+ var PackageWorkspaces = Schema4.Struct({
1562
+ workspaces: Schema4.Union([WorkspacePatterns, Schema4.Struct({ packages: WorkspacePatterns })])
1563
+ });
1564
+ var PnpmWorkspace = Schema4.Struct({ packages: WorkspacePatterns });
1565
+ function workspaceRoot(member) {
1566
+ for (let dir = member; dirname3(dir) !== dir; ) {
1567
+ dir = dirname3(dir);
1568
+ const patterns = workspacePatterns(dir);
1569
+ if (patterns !== void 0) return listed(relative2(dir, member), patterns) ? dir : void 0;
1570
+ }
1571
+ return void 0;
1572
+ }
1573
+ function listed(path, patterns) {
1574
+ const posixPath = path.split(sep).join("/");
1575
+ const matches = (pattern) => posix.matchesGlob(posixPath, pattern.replace(/^\.\//u, "").replace(/\/+$/u, ""));
1576
+ return patterns.some((pattern) => !pattern.startsWith("!") && matches(pattern)) && !patterns.some((pattern) => pattern.startsWith("!") && matches(pattern.slice(1)));
1577
+ }
1578
+ function workspacePatterns(dir) {
1579
+ const pnpm = join5(dir, "pnpm-workspace.yaml");
1580
+ if (existsSync4(pnpm)) {
1581
+ let parsed2;
1582
+ try {
1583
+ parsed2 = parseDocument(readFileSync4(pnpm, "utf8")).toJS();
1584
+ } catch {
1585
+ return [];
1586
+ }
1587
+ return Option4.match(Schema4.decodeUnknownOption(PnpmWorkspace)(parsed2), {
1588
+ onNone: () => [],
1589
+ onSome: (workspace) => workspace.packages
1590
+ });
1591
+ }
1592
+ const manifest = join5(dir, "package.json");
1593
+ if (!existsSync4(manifest)) return void 0;
1594
+ let parsed;
1595
+ try {
1596
+ parsed = JSON.parse(readFileSync4(manifest, "utf8"));
1597
+ } catch {
1598
+ return void 0;
1599
+ }
1600
+ return Option4.match(Schema4.decodeUnknownOption(PackageWorkspaces)(parsed), {
1601
+ onNone: () => void 0,
1602
+ onSome: ({ workspaces }) => "packages" in workspaces ? workspaces.packages : workspaces
1603
+ });
1604
+ }
1557
1605
  function projectDirectory(from) {
1558
1606
  return findProject(from).dir;
1559
1607
  }
package/dist/mapper.js CHANGED
@@ -1,12 +1,12 @@
1
1
  // src/mapper.ts
2
2
  import { createHash as createHash5 } from "node:crypto";
3
- import { dirname as dirname5, join as join7, resolve as resolve4, sep } from "node:path";
3
+ import { dirname as dirname5, join as join7, resolve as resolve4 } from "node:path";
4
4
  import { Deferred, Effect as Effect8, Exit as Exit3, FileSystem as FileSystem4, Predicate as Predicate8, Schema as Schema7 } from "effect";
5
5
 
6
6
  // src/analysis.ts
7
7
  import { createHash as createHash3, randomUUID } from "node:crypto";
8
- import { existsSync as existsSync4 } from "node:fs";
9
- import { dirname as dirname3, join as join5, relative as relative2, resolve as resolve2 } from "node:path";
8
+ import { existsSync as existsSync4, readFileSync as readFileSync4 } from "node:fs";
9
+ import { dirname as dirname3, join as join5, posix, relative as relative2, resolve as resolve2, sep } from "node:path";
10
10
  import {
11
11
  Effect as Effect3,
12
12
  Exit,
@@ -400,12 +400,12 @@ var DIALECTS = ["postgres", "sqlite", "mysql"];
400
400
  function declaredEngines(dir) {
401
401
  try {
402
402
  const parsed = JSON.parse(readFileSync(join(dir, "package.json"), "utf8"));
403
- const listed = /* @__PURE__ */ new Set();
403
+ const listed2 = /* @__PURE__ */ new Set();
404
404
  for (const key of ["dependencies", "devDependencies", "optionalDependencies"]) {
405
405
  const group = Predicate.hasProperty(parsed, key) ? parsed[key] : void 0;
406
- if (Predicate.isObject(group)) for (const name of Object.keys(group)) listed.add(name);
406
+ if (Predicate.isObject(group)) for (const name of Object.keys(group)) listed2.add(name);
407
407
  }
408
- return DIALECTS.filter((dialect) => listed.has(ENGINE_PACKAGES[dialect]));
408
+ return DIALECTS.filter((dialect) => listed2.has(ENGINE_PACKAGES[dialect]));
409
409
  } catch {
410
410
  return [];
411
411
  }
@@ -702,17 +702,17 @@ function wranglerVersion(entry) {
702
702
  function projectDrivers(root) {
703
703
  const file = join2(packageDir(root), "package.json");
704
704
  if (!existsSync2(file)) return [];
705
- const listed = /* @__PURE__ */ new Set();
705
+ const listed2 = /* @__PURE__ */ new Set();
706
706
  try {
707
707
  const parsed = JSON.parse(readFileSync2(file, "utf8"));
708
708
  for (const key of ["dependencies", "devDependencies", "optionalDependencies"]) {
709
709
  const group = Predicate2.hasProperty(parsed, key) ? parsed[key] : void 0;
710
- if (Predicate2.isObject(group)) for (const name of Object.keys(group)) listed.add(name);
710
+ if (Predicate2.isObject(group)) for (const name of Object.keys(group)) listed2.add(name);
711
711
  }
712
712
  } catch {
713
713
  return [];
714
714
  }
715
- return DRIVERS.flatMap(([name]) => listed.has(name) ? [name] : []);
715
+ return DRIVERS.flatMap(([name]) => listed2.has(name) ? [name] : []);
716
716
  }
717
717
  async function openProjectDrivers(root, path) {
718
718
  if (path === ":memory:") return [];
@@ -1599,13 +1599,61 @@ var StoredAnalysis = Schema5.fromJsonString(
1599
1599
  function findProject(from) {
1600
1600
  const configured = process.env.REYLO_CONFIG;
1601
1601
  if (configured) return { dir: packageDir(from), file: resolve2(configured) };
1602
+ let owner;
1602
1603
  for (let dir = resolve2(from); ; dir = dirname3(dir)) {
1603
1604
  const file = PROJECT_FILES.map((name) => join5(dir, name)).find((path) => existsSync4(path));
1604
1605
  if (file !== void 0) return { dir, file };
1605
- if (existsSync4(join5(dir, "package.json"))) return { dir };
1606
+ if (owner === void 0 && existsSync4(join5(dir, "package.json")))
1607
+ owner = { dir, stop: workspaceRoot(dir) ?? dir };
1608
+ if (dir === owner?.stop) return { dir: owner.dir };
1606
1609
  if (dirname3(dir) === dir) return { dir: resolve2(from) };
1607
1610
  }
1608
1611
  }
1612
+ var WorkspacePatterns = Schema5.Array(Schema5.String);
1613
+ var PackageWorkspaces = Schema5.Struct({
1614
+ workspaces: Schema5.Union([WorkspacePatterns, Schema5.Struct({ packages: WorkspacePatterns })])
1615
+ });
1616
+ var PnpmWorkspace = Schema5.Struct({ packages: WorkspacePatterns });
1617
+ function workspaceRoot(member) {
1618
+ for (let dir = member; dirname3(dir) !== dir; ) {
1619
+ dir = dirname3(dir);
1620
+ const patterns = workspacePatterns(dir);
1621
+ if (patterns !== void 0) return listed(relative2(dir, member), patterns) ? dir : void 0;
1622
+ }
1623
+ return void 0;
1624
+ }
1625
+ function listed(path, patterns) {
1626
+ const posixPath = path.split(sep).join("/");
1627
+ const matches = (pattern) => posix.matchesGlob(posixPath, pattern.replace(/^\.\//u, "").replace(/\/+$/u, ""));
1628
+ return patterns.some((pattern) => !pattern.startsWith("!") && matches(pattern)) && !patterns.some((pattern) => pattern.startsWith("!") && matches(pattern.slice(1)));
1629
+ }
1630
+ function workspacePatterns(dir) {
1631
+ const pnpm = join5(dir, "pnpm-workspace.yaml");
1632
+ if (existsSync4(pnpm)) {
1633
+ let parsed2;
1634
+ try {
1635
+ parsed2 = parseDocument(readFileSync4(pnpm, "utf8")).toJS();
1636
+ } catch {
1637
+ return [];
1638
+ }
1639
+ return Option5.match(Schema5.decodeUnknownOption(PnpmWorkspace)(parsed2), {
1640
+ onNone: () => [],
1641
+ onSome: (workspace) => workspace.packages
1642
+ });
1643
+ }
1644
+ const manifest = join5(dir, "package.json");
1645
+ if (!existsSync4(manifest)) return void 0;
1646
+ let parsed;
1647
+ try {
1648
+ parsed = JSON.parse(readFileSync4(manifest, "utf8"));
1649
+ } catch {
1650
+ return void 0;
1651
+ }
1652
+ return Option5.match(Schema5.decodeUnknownOption(PackageWorkspaces)(parsed), {
1653
+ onNone: () => void 0,
1654
+ onSome: ({ workspaces }) => "packages" in workspaces ? workspaces.packages : workspaces
1655
+ });
1656
+ }
1609
1657
  function projectDirectory(from) {
1610
1658
  return findProject(from).dir;
1611
1659
  }
@@ -3681,7 +3729,7 @@ var configDirectories = Effect8.fn("Mapper.configDirectories")(function* (projec
3681
3729
  const dirs = /* @__PURE__ */ new Set([root, ...nested.flat().map((file) => dirname5(file))]);
3682
3730
  const candidates = /* @__PURE__ */ new Set();
3683
3731
  for (const query of queries) {
3684
- for (let dir = dirname5(query); !dirs.has(dir) && dir.startsWith(`${projectDir}${sep}`); ) {
3732
+ for (let dir = dirname5(query); !dirs.has(dir) && dirname5(dir) !== dir; ) {
3685
3733
  for (const name of PROJECT_FILES) candidates.add(join7(dir, name));
3686
3734
  dir = dirname5(dir);
3687
3735
  }
@@ -1,6 +1,6 @@
1
1
  // src/vite-owner.ts
2
2
  import { statSync as statSync3 } from "node:fs";
3
- import { basename as basename2, dirname as dirname5, join as join7, sep } from "node:path";
3
+ import { basename as basename2, dirname as dirname5, join as join7, sep as sep2 } from "node:path";
4
4
  import {
5
5
  Cause,
6
6
  Deferred,
@@ -302,8 +302,8 @@ import { Effect as Effect7, FileSystem as FileSystem3, Option as Option6 } from
302
302
 
303
303
  // src/analysis.ts
304
304
  import { createHash as createHash3, randomUUID } from "node:crypto";
305
- import { existsSync as existsSync4 } from "node:fs";
306
- import { dirname as dirname3, join as join5, relative as relative2, resolve as resolve2 } from "node:path";
305
+ import { existsSync as existsSync4, readFileSync as readFileSync4 } from "node:fs";
306
+ import { dirname as dirname3, join as join5, posix, relative as relative2, resolve as resolve2, sep } from "node:path";
307
307
  import {
308
308
  Effect as Effect3,
309
309
  Exit,
@@ -697,12 +697,12 @@ var DIALECTS = ["postgres", "sqlite", "mysql"];
697
697
  function declaredEngines(dir) {
698
698
  try {
699
699
  const parsed = JSON.parse(readFileSync(join2(dir, "package.json"), "utf8"));
700
- const listed = /* @__PURE__ */ new Set();
700
+ const listed2 = /* @__PURE__ */ new Set();
701
701
  for (const key of ["dependencies", "devDependencies", "optionalDependencies"]) {
702
702
  const group = Predicate2.hasProperty(parsed, key) ? parsed[key] : void 0;
703
- if (Predicate2.isObject(group)) for (const name of Object.keys(group)) listed.add(name);
703
+ if (Predicate2.isObject(group)) for (const name of Object.keys(group)) listed2.add(name);
704
704
  }
705
- return DIALECTS.filter((dialect) => listed.has(ENGINE_PACKAGES[dialect]));
705
+ return DIALECTS.filter((dialect) => listed2.has(ENGINE_PACKAGES[dialect]));
706
706
  } catch {
707
707
  return [];
708
708
  }
@@ -999,17 +999,17 @@ function wranglerVersion(entry) {
999
999
  function projectDrivers(root) {
1000
1000
  const file = join3(packageDir(root), "package.json");
1001
1001
  if (!existsSync2(file)) return [];
1002
- const listed = /* @__PURE__ */ new Set();
1002
+ const listed2 = /* @__PURE__ */ new Set();
1003
1003
  try {
1004
1004
  const parsed = JSON.parse(readFileSync2(file, "utf8"));
1005
1005
  for (const key of ["dependencies", "devDependencies", "optionalDependencies"]) {
1006
1006
  const group = Predicate3.hasProperty(parsed, key) ? parsed[key] : void 0;
1007
- if (Predicate3.isObject(group)) for (const name of Object.keys(group)) listed.add(name);
1007
+ if (Predicate3.isObject(group)) for (const name of Object.keys(group)) listed2.add(name);
1008
1008
  }
1009
1009
  } catch {
1010
1010
  return [];
1011
1011
  }
1012
- return DRIVERS.flatMap(([name]) => listed.has(name) ? [name] : []);
1012
+ return DRIVERS.flatMap(([name]) => listed2.has(name) ? [name] : []);
1013
1013
  }
1014
1014
  async function openProjectDrivers(root, path) {
1015
1015
  if (path === ":memory:") return [];
@@ -1566,13 +1566,61 @@ var StoredAnalysis = Schema4.fromJsonString(
1566
1566
  function findProject(from) {
1567
1567
  const configured = process.env.REYLO_CONFIG;
1568
1568
  if (configured) return { dir: packageDir(from), file: resolve2(configured) };
1569
+ let owner;
1569
1570
  for (let dir = resolve2(from); ; dir = dirname3(dir)) {
1570
1571
  const file = PROJECT_FILES.map((name) => join5(dir, name)).find((path) => existsSync4(path));
1571
1572
  if (file !== void 0) return { dir, file };
1572
- if (existsSync4(join5(dir, "package.json"))) return { dir };
1573
+ if (owner === void 0 && existsSync4(join5(dir, "package.json")))
1574
+ owner = { dir, stop: workspaceRoot(dir) ?? dir };
1575
+ if (dir === owner?.stop) return { dir: owner.dir };
1573
1576
  if (dirname3(dir) === dir) return { dir: resolve2(from) };
1574
1577
  }
1575
1578
  }
1579
+ var WorkspacePatterns = Schema4.Array(Schema4.String);
1580
+ var PackageWorkspaces = Schema4.Struct({
1581
+ workspaces: Schema4.Union([WorkspacePatterns, Schema4.Struct({ packages: WorkspacePatterns })])
1582
+ });
1583
+ var PnpmWorkspace = Schema4.Struct({ packages: WorkspacePatterns });
1584
+ function workspaceRoot(member) {
1585
+ for (let dir = member; dirname3(dir) !== dir; ) {
1586
+ dir = dirname3(dir);
1587
+ const patterns = workspacePatterns(dir);
1588
+ if (patterns !== void 0) return listed(relative2(dir, member), patterns) ? dir : void 0;
1589
+ }
1590
+ return void 0;
1591
+ }
1592
+ function listed(path, patterns) {
1593
+ const posixPath = path.split(sep).join("/");
1594
+ const matches = (pattern) => posix.matchesGlob(posixPath, pattern.replace(/^\.\//u, "").replace(/\/+$/u, ""));
1595
+ return patterns.some((pattern) => !pattern.startsWith("!") && matches(pattern)) && !patterns.some((pattern) => pattern.startsWith("!") && matches(pattern.slice(1)));
1596
+ }
1597
+ function workspacePatterns(dir) {
1598
+ const pnpm = join5(dir, "pnpm-workspace.yaml");
1599
+ if (existsSync4(pnpm)) {
1600
+ let parsed2;
1601
+ try {
1602
+ parsed2 = parseDocument(readFileSync4(pnpm, "utf8")).toJS();
1603
+ } catch {
1604
+ return [];
1605
+ }
1606
+ return Option4.match(Schema4.decodeUnknownOption(PnpmWorkspace)(parsed2), {
1607
+ onNone: () => [],
1608
+ onSome: (workspace) => workspace.packages
1609
+ });
1610
+ }
1611
+ const manifest = join5(dir, "package.json");
1612
+ if (!existsSync4(manifest)) return void 0;
1613
+ let parsed;
1614
+ try {
1615
+ parsed = JSON.parse(readFileSync4(manifest, "utf8"));
1616
+ } catch {
1617
+ return void 0;
1618
+ }
1619
+ return Option4.match(Schema4.decodeUnknownOption(PackageWorkspaces)(parsed), {
1620
+ onNone: () => void 0,
1621
+ onSome: ({ workspaces }) => "packages" in workspaces ? workspaces.packages : workspaces
1622
+ });
1623
+ }
1576
1624
  function projectDirectory(from) {
1577
1625
  return findProject(from).dir;
1578
1626
  }
@@ -4199,11 +4247,11 @@ function collect(project, changed) {
4199
4247
  }
4200
4248
  function nestedProjectFile(key, path) {
4201
4249
  const name = basename2(path);
4202
- return PROJECT_FILES.some((file) => file === name) && path.startsWith(`${key}${sep}`);
4250
+ return PROJECT_FILES.some((file) => file === name) && path.startsWith(`${key}${sep2}`);
4203
4251
  }
4204
4252
  function underWatch(project, path) {
4205
4253
  for (const dir of project.watchDirs) {
4206
- if (path === dir || path.startsWith(`${dir}${sep}`)) return true;
4254
+ if (path === dir || path.startsWith(`${dir}${sep2}`)) return true;
4207
4255
  }
4208
4256
  return false;
4209
4257
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reylo-effect-tooling",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "The SQL compiler host behind reylo-effect: the Node loader, Vite and esbuild plugins, and the TypeScript content mapper.",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -40,7 +40,7 @@
40
40
  "@reylosql/postgres": "0.5.0",
41
41
  "@reylosql/sqlite": "0.5.0",
42
42
  "effect": "4.0.6",
43
- "reylo-effect": "0.5.0",
43
+ "reylo-effect": "0.5.1",
44
44
  "vite": ">=8.0.0 <9.0.0"
45
45
  },
46
46
  "peerDependenciesMeta": {