instant-cli 1.0.43 → 1.0.44

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.
@@ -1,4 +1,4 @@
1
1
 
2
- > instant-cli@1.0.43 build /home/runner/work/instant/instant/client/packages/cli
2
+ > instant-cli@1.0.44 build /home/runner/work/instant/instant/client/packages/cli
3
3
  > rm -rf dist; tsc -p tsconfig.build.json
4
4
 
@@ -3,7 +3,7 @@ import { GlobalOpts } from './globalOpts.ts';
3
3
  import { BadArgsError } from '../errors.ts';
4
4
  declare const ProjectInfo_base: Context.TagClass<ProjectInfo, "instant-cli/new/context/projectInfo", {
5
5
  pkgDir: string;
6
- projectType: "node" | "deno";
6
+ projectType: "node" | "deno" | "python";
7
7
  instantModuleName: string;
8
8
  }>;
9
9
  export declare class ProjectInfo extends ProjectInfo_base {
@@ -1 +1 @@
1
- {"version":3,"file":"projectInfo.d.ts","sourceRoot":"","sources":["../../src/context/projectInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAUtD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;;YAOhC,MAAM;iBACD,MAAM,GAAG,MAAM;uBACT,MAAM;;AAP7B,qBAAa,WAAY,SAAQ,gBAS9B;CAAG;AAIN,eAAO,MAAM,4BAA4B;;;;;;;;CAQxC,CAAC;;;;AAEF,qBAAa,gBAAiB,SAAQ,sBAAqC;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;CAAG;AAwJL,eAAO,MAAM,eAAe,GAC1B,SAAQ,OAAc,EACtB,cAAc,MAAM,OAAO,4BAA4B,2GACU,CAAC"}
1
+ {"version":3,"file":"projectInfo.d.ts","sourceRoot":"","sources":["../../src/context/projectInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAUtD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;;YAOhC,MAAM;iBACD,MAAM,GAAG,MAAM,GAAG,QAAQ;uBACpB,MAAM;;AAP7B,qBAAa,WAAY,SAAQ,gBAS9B;CAAG;AAIN,eAAO,MAAM,4BAA4B;;;;;;;;CAQxC,CAAC;;;;AAEF,qBAAa,gBAAiB,SAAQ,sBAAqC;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;CAAG;AAwJL,eAAO,MAAM,eAAe,GAC1B,SAAQ,OAAc,EACtB,cAAc,MAAM,OAAO,4BAA4B,2GACU,CAAC"}
@@ -30,10 +30,10 @@ const getProjectInfo = (coerce = true, packageName) => Effect.gen(function* () {
30
30
  });
31
31
  if (!projectDir) {
32
32
  return yield* new ProjectInfoError({
33
- message: "Couldn't find a project directory (package.json). Is there a package.json or deno.json file?",
33
+ message: "Couldn't find a project directory. Is there a package.json, deno.json, or pyproject.toml file?",
34
34
  });
35
35
  }
36
- if (projectDir.type === 'deno') {
36
+ if (projectDir.type === 'deno' || projectDir.type === 'python') {
37
37
  return {
38
38
  pkgDir: projectDir.dir,
39
39
  projectType: projectDir.type,
@@ -1 +1 @@
1
- {"version":3,"file":"projectInfo.js","sourceRoot":"","sources":["../../src/context/projectInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, Data, Effect, Layer } from 'effect';\nimport { detect } from 'package-manager-detector/detect';\nimport { readPackage } from 'pkg-types';\nimport type { PackageJson } from 'pkg-types';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { UI } from '../ui/index.ts';\nimport { findProjectDir } from '../util/projectDir.ts';\nimport { runUIEffect } from '../lib/ui.ts';\nimport chalk from 'chalk';\nimport { GlobalOpts } from './globalOpts.ts';\nimport { BadArgsError } from '../errors.ts';\n\nexport class ProjectInfo extends Context.Tag(\n 'instant-cli/new/context/projectInfo',\n)<\n ProjectInfo,\n {\n pkgDir: string;\n projectType: 'node' | 'deno';\n instantModuleName: string;\n }\n>() {}\n\nconst execAsync = promisify(exec);\n\nexport const PACKAGE_ALIAS_AND_FULL_NAMES = {\n react: '@instantdb/react',\n 'react-native': '@instantdb/react-native',\n core: '@instantdb/core',\n admin: '@instantdb/admin',\n solid: '@instantdb/solidjs',\n svelte: '@instantdb/svelte',\n vue: '@instantdb/vue',\n};\n\nexport class ProjectInfoError extends Data.TaggedError('ProjectInfoError')<{\n message: string;\n cause?: unknown;\n}> {}\n\nconst getProjectInfo = (\n coerce: boolean = true,\n packageName?: keyof typeof PACKAGE_ALIAS_AND_FULL_NAMES,\n) =>\n Effect.gen(function* () {\n const projectDir = yield* Effect.tryPromise({\n try: () => findProjectDir(),\n catch: (e) =>\n new ProjectInfoError({ message: \"Couldn't get project dir\" }),\n });\n\n if (!projectDir) {\n return yield* new ProjectInfoError({\n message:\n \"Couldn't find a project directory (package.json). Is there a package.json or deno.json file?\",\n });\n }\n\n if (projectDir.type === 'deno') {\n return {\n pkgDir: projectDir.dir,\n projectType: projectDir.type,\n instantModuleName: '@instantdb/core',\n };\n }\n\n const pkgJson = yield* Effect.tryPromise({\n try: () => readPackage(),\n catch: () =>\n new ProjectInfoError({\n message:\n \"We couldn't find an Instant SDK. Install one, or run `init`\",\n }),\n });\n\n yield* Effect.log('Checking for an Instant SDK...');\n let moduleName = getInstantModuleName(pkgJson);\n if (!moduleName && !coerce) {\n return yield* new ProjectInfoError({\n message: \"We couldn't find an Instant SDK. Install one, or run `init`\",\n });\n }\n\n if (!moduleName && coerce) {\n yield* Effect.log(\n \"Couldn't find an Instant SDK in your package.json, let's install one!\",\n );\n } else {\n yield* Effect.log(\n `Found ${chalk.green(moduleName)} in your package.json.\\n`,\n );\n }\n\n // TODO: Clean up with option\n const packageManager = yield* Effect.tryPromise(() => detect()).pipe(\n Effect.flatMap(Effect.fromNullable),\n Effect.catchTag('NoSuchElementException', () =>\n Effect.succeed({\n name: 'npm',\n agent: 'npm',\n }),\n ),\n Effect.option,\n );\n\n const { yes } = yield* GlobalOpts;\n if (!moduleName && coerce) {\n // install the packages\n if (packageName) {\n moduleName = PACKAGE_ALIAS_AND_FULL_NAMES[packageName];\n } else {\n if (yes) {\n return yield* BadArgsError.make({\n message:\n '--yes was provided without a package specification and no Instant SDK was found',\n });\n }\n moduleName = yield* runUIEffect(\n new UI.Select({\n promptText: 'Which package would you like to use?',\n options: [\n { label: '@instantdb/react', value: '@instantdb/react' },\n {\n label: '@instantdb/react-native',\n value: '@instantdb/react-native',\n },\n { label: '@instantdb/core', value: '@instantdb/core' },\n { label: '@instantdb/admin', value: '@instantdb/admin' },\n { label: '@instantdb/solidjs', value: '@instantdb/solidjs' },\n { label: '@instantdb/svelte', value: '@instantdb/svelte' },\n { label: '@instantdb/vue', value: '@instantdb/vue' },\n ],\n }),\n ).pipe(\n Effect.flatMap(Effect.fromNullable),\n Effect.mapError(\n () =>\n new ProjectInfoError({\n message: 'Failed to select package',\n }),\n ),\n );\n }\n const packagesToInstall = [moduleName];\n if (moduleName === '@instantdb/react-native') {\n packagesToInstall.push(\n 'react-native-get-random-values',\n '@react-native-async-storage/async-storage',\n );\n }\n\n const pkgManager = yield* packageManager.pipe(\n Effect.mapError(\n (e) =>\n new ProjectInfoError({\n message: 'Failed to detect package manager',\n cause: e,\n }),\n ),\n );\n\n const installCommand = getInstallCommand(\n pkgManager.agent,\n packagesToInstall.join(' '),\n );\n yield* Effect.log(installCommand);\n yield* runUIEffect(\n new UI.Spinner({\n promise: execAsync(installCommand, {\n cwd: projectDir.dir,\n }),\n errorText: 'Failed to install packages',\n workingText: `Installing ${packagesToInstall.join(', ')} using ${pkgManager.agent}...`,\n doneText: `Installed ${packagesToInstall.join(', ')} using ${pkgManager.agent}.`,\n }),\n );\n return {\n pkgDir: projectDir.dir,\n projectType: projectDir.type,\n instantModuleName: moduleName,\n };\n } else {\n return {\n pkgDir: projectDir.dir,\n projectType: projectDir.type,\n instantModuleName: moduleName!,\n };\n }\n });\n\nexport const ProjectInfoLive = (\n coerce: boolean = true,\n packageName?: keyof typeof PACKAGE_ALIAS_AND_FULL_NAMES,\n) => Layer.effect(ProjectInfo, getProjectInfo(coerce, packageName));\n\nfunction getInstantModuleName(pkgJson: PackageJson) {\n const deps = pkgJson.dependencies || {};\n const devDeps = pkgJson.devDependencies || {};\n const instantModuleName = [\n '@instantdb/react',\n '@instantdb/react-native',\n '@instantdb/core',\n '@instantdb/admin',\n '@instantdb/solidjs',\n '@instantdb/svelte',\n '@instantdb/vue',\n ].find((name) => deps[name] || devDeps[name]);\n return instantModuleName;\n}\n\nfunction getInstallCommand(packageManager: string, moduleName: string) {\n if (packageManager === 'npm') {\n return `npm install ${moduleName}`;\n } else {\n return `${packageManager} add ${moduleName}`;\n }\n}\n"]}
1
+ {"version":3,"file":"projectInfo.js","sourceRoot":"","sources":["../../src/context/projectInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, Data, Effect, Layer } from 'effect';\nimport { detect } from 'package-manager-detector/detect';\nimport { readPackage } from 'pkg-types';\nimport type { PackageJson } from 'pkg-types';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { UI } from '../ui/index.ts';\nimport { findProjectDir } from '../util/projectDir.ts';\nimport { runUIEffect } from '../lib/ui.ts';\nimport chalk from 'chalk';\nimport { GlobalOpts } from './globalOpts.ts';\nimport { BadArgsError } from '../errors.ts';\n\nexport class ProjectInfo extends Context.Tag(\n 'instant-cli/new/context/projectInfo',\n)<\n ProjectInfo,\n {\n pkgDir: string;\n projectType: 'node' | 'deno' | 'python';\n instantModuleName: string;\n }\n>() {}\n\nconst execAsync = promisify(exec);\n\nexport const PACKAGE_ALIAS_AND_FULL_NAMES = {\n react: '@instantdb/react',\n 'react-native': '@instantdb/react-native',\n core: '@instantdb/core',\n admin: '@instantdb/admin',\n solid: '@instantdb/solidjs',\n svelte: '@instantdb/svelte',\n vue: '@instantdb/vue',\n};\n\nexport class ProjectInfoError extends Data.TaggedError('ProjectInfoError')<{\n message: string;\n cause?: unknown;\n}> {}\n\nconst getProjectInfo = (\n coerce: boolean = true,\n packageName?: keyof typeof PACKAGE_ALIAS_AND_FULL_NAMES,\n) =>\n Effect.gen(function* () {\n const projectDir = yield* Effect.tryPromise({\n try: () => findProjectDir(),\n catch: (e) =>\n new ProjectInfoError({ message: \"Couldn't get project dir\" }),\n });\n\n if (!projectDir) {\n return yield* new ProjectInfoError({\n message:\n \"Couldn't find a project directory. Is there a package.json, deno.json, or pyproject.toml file?\",\n });\n }\n\n if (projectDir.type === 'deno' || projectDir.type === 'python') {\n return {\n pkgDir: projectDir.dir,\n projectType: projectDir.type,\n instantModuleName: '@instantdb/core',\n };\n }\n\n const pkgJson = yield* Effect.tryPromise({\n try: () => readPackage(),\n catch: () =>\n new ProjectInfoError({\n message:\n \"We couldn't find an Instant SDK. Install one, or run `init`\",\n }),\n });\n\n yield* Effect.log('Checking for an Instant SDK...');\n let moduleName = getInstantModuleName(pkgJson);\n if (!moduleName && !coerce) {\n return yield* new ProjectInfoError({\n message: \"We couldn't find an Instant SDK. Install one, or run `init`\",\n });\n }\n\n if (!moduleName && coerce) {\n yield* Effect.log(\n \"Couldn't find an Instant SDK in your package.json, let's install one!\",\n );\n } else {\n yield* Effect.log(\n `Found ${chalk.green(moduleName)} in your package.json.\\n`,\n );\n }\n\n // TODO: Clean up with option\n const packageManager = yield* Effect.tryPromise(() => detect()).pipe(\n Effect.flatMap(Effect.fromNullable),\n Effect.catchTag('NoSuchElementException', () =>\n Effect.succeed({\n name: 'npm',\n agent: 'npm',\n }),\n ),\n Effect.option,\n );\n\n const { yes } = yield* GlobalOpts;\n if (!moduleName && coerce) {\n // install the packages\n if (packageName) {\n moduleName = PACKAGE_ALIAS_AND_FULL_NAMES[packageName];\n } else {\n if (yes) {\n return yield* BadArgsError.make({\n message:\n '--yes was provided without a package specification and no Instant SDK was found',\n });\n }\n moduleName = yield* runUIEffect(\n new UI.Select({\n promptText: 'Which package would you like to use?',\n options: [\n { label: '@instantdb/react', value: '@instantdb/react' },\n {\n label: '@instantdb/react-native',\n value: '@instantdb/react-native',\n },\n { label: '@instantdb/core', value: '@instantdb/core' },\n { label: '@instantdb/admin', value: '@instantdb/admin' },\n { label: '@instantdb/solidjs', value: '@instantdb/solidjs' },\n { label: '@instantdb/svelte', value: '@instantdb/svelte' },\n { label: '@instantdb/vue', value: '@instantdb/vue' },\n ],\n }),\n ).pipe(\n Effect.flatMap(Effect.fromNullable),\n Effect.mapError(\n () =>\n new ProjectInfoError({\n message: 'Failed to select package',\n }),\n ),\n );\n }\n const packagesToInstall = [moduleName];\n if (moduleName === '@instantdb/react-native') {\n packagesToInstall.push(\n 'react-native-get-random-values',\n '@react-native-async-storage/async-storage',\n );\n }\n\n const pkgManager = yield* packageManager.pipe(\n Effect.mapError(\n (e) =>\n new ProjectInfoError({\n message: 'Failed to detect package manager',\n cause: e,\n }),\n ),\n );\n\n const installCommand = getInstallCommand(\n pkgManager.agent,\n packagesToInstall.join(' '),\n );\n yield* Effect.log(installCommand);\n yield* runUIEffect(\n new UI.Spinner({\n promise: execAsync(installCommand, {\n cwd: projectDir.dir,\n }),\n errorText: 'Failed to install packages',\n workingText: `Installing ${packagesToInstall.join(', ')} using ${pkgManager.agent}...`,\n doneText: `Installed ${packagesToInstall.join(', ')} using ${pkgManager.agent}.`,\n }),\n );\n return {\n pkgDir: projectDir.dir,\n projectType: projectDir.type,\n instantModuleName: moduleName,\n };\n } else {\n return {\n pkgDir: projectDir.dir,\n projectType: projectDir.type,\n instantModuleName: moduleName!,\n };\n }\n });\n\nexport const ProjectInfoLive = (\n coerce: boolean = true,\n packageName?: keyof typeof PACKAGE_ALIAS_AND_FULL_NAMES,\n) => Layer.effect(ProjectInfo, getProjectInfo(coerce, packageName));\n\nfunction getInstantModuleName(pkgJson: PackageJson) {\n const deps = pkgJson.dependencies || {};\n const devDeps = pkgJson.devDependencies || {};\n const instantModuleName = [\n '@instantdb/react',\n '@instantdb/react-native',\n '@instantdb/core',\n '@instantdb/admin',\n '@instantdb/solidjs',\n '@instantdb/svelte',\n '@instantdb/vue',\n ].find((name) => deps[name] || devDeps[name]);\n return instantModuleName;\n}\n\nfunction getInstallCommand(packageManager: string, moduleName: string) {\n if (packageManager === 'npm') {\n return `npm install ${moduleName}`;\n } else {\n return `${packageManager} add ${moduleName}`;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"loadConfig.d.ts","sourceRoot":"","sources":["../../src/util/loadConfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAqElB,wBAAsB,UAAU,CAAC,CAAC,EAChC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAoB9B"}
1
+ {"version":3,"file":"loadConfig.d.ts","sourceRoot":"","sources":["../../src/util/loadConfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAkElB,wBAAsB,UAAU,CAAC,CAAC,EAChC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAmB9B"}
@@ -4,18 +4,15 @@ import path from 'node:path';
4
4
  import { findProjectDir } from "./projectDir.js";
5
5
  const toArray = (value) => Array.isArray(value) ? value : [value];
6
6
  /**
7
- * Resolve @instantdb packages from CLI's dependency tree.
8
- * For Deno projects, we alias all common @instantdb packages to @instantdb/core
9
- * since they all re-export the schema types from core.
7
+ * Resolve @instantdb packages from the CLI's own dependencies for
8
+ * projects without node_modules. All @instantdb packages re-export
9
+ * schema types from core, so a single core alias covers them all.
10
10
  */
11
11
  function getInstantAliases() {
12
12
  try {
13
13
  const require = createRequire(import.meta.url);
14
- // Resolve @instantdb/core directly from CLI's dependencies
15
14
  const corePackageJson = require.resolve('@instantdb/core/package.json');
16
15
  const coreDir = path.dirname(corePackageJson);
17
- // All @instantdb packages re-export schema types from core,
18
- // so we can alias them all to core for schema loading purposes
19
16
  return {
20
17
  '@instantdb/core': coreDir,
21
18
  '@instantdb/react': coreDir,
@@ -29,7 +26,7 @@ function getInstantAliases() {
29
26
  return null;
30
27
  }
31
28
  }
32
- function withDenoAliases(opts, alias) {
29
+ function withAliases(opts, alias) {
33
30
  return {
34
31
  ...opts,
35
32
  sources: toArray(opts.sources).map((source) => {
@@ -56,13 +53,11 @@ function withDenoAliases(opts, alias) {
56
53
  }
57
54
  export async function loadConfig(opts) {
58
55
  const projectInfo = await findProjectDir();
59
- const isDeno = projectInfo?.type === 'deno';
60
- // Deno projects don't have node_modules, so we need to alias @instantdb/*
61
- // packages to resolve from the CLI's own dependencies
56
+ const needsAliases = projectInfo?.type === 'deno' || projectInfo?.type === 'python';
62
57
  let res;
63
- if (isDeno) {
58
+ if (needsAliases) {
64
59
  const alias = getInstantAliases();
65
- res = await _loadConfig(alias ? withDenoAliases(opts, alias) : opts);
60
+ res = await _loadConfig(alias ? withAliases(opts, alias) : opts);
66
61
  }
67
62
  else {
68
63
  res = await _loadConfig(opts);
@@ -1 +1 @@
1
- {"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/util/loadConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,UAAU,CAAC;AAMrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,OAAO,GAAG,CAAI,KAAmB,EAAO,EAAE,CAC9C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAEzC;;;;GAIG;AACH,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,2DAA2D;QAC3D,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC9C,4DAA4D;QAC5D,+DAA+D;QAC/D,OAAO;YACL,iBAAiB,EAAE,OAAO;YAC1B,kBAAkB,EAAE,OAAO;YAC3B,yBAAyB,EAAE,OAAO;YAClC,mBAAmB,EAAE,OAAO;YAC5B,gBAAgB,EAAE,OAAO;YACzB,kBAAkB,EAAE,OAAO;SAC5B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACtB,IAA0B,EAC1B,KAA6B;IAE7B,OAAO;QACL,GAAG,IAAI;QACP,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAuB,EAAE;YACjE,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACpE,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,OAAO;gBACL,GAAG,MAAM;gBACT,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;oBACzB,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACpD,MAAM,eAAe,GAAG,aAAa,CACnC,YAAY,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAC9C,CAAC;oBACF,MAAM,EAAE,UAAU,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;oBAC/C,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;wBACvC,OAAO,EAAE,KAAK;wBACd,WAAW,EAAE,KAAK;wBAClB,cAAc,EAAE,IAAI;wBACpB,KAAK;qBACN,CAAC,CAAC;oBAEH,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,CAAC;aACF,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAA0B;IAE1B,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,WAAW,EAAE,IAAI,KAAK,MAAM,CAAC;IAE5C,0EAA0E;IAC1E,sDAAsD;IACtD,IAAI,GAAG,CAAC;IACR,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;QAClC,GAAG,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,oEAAoE;IACpE,eAAe;IACf,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,YAAY,IAAI,GAAG,CAAC,MAAO,EAAE,CAAC;QAClE,OAAO,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import { loadConfig as _loadConfig } from 'unconfig';\nimport type {\n LoadConfigOptions,\n LoadConfigResult,\n LoadConfigSource,\n} from 'unconfig';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { findProjectDir } from './projectDir.ts';\n\ntype Arrayable<T> = T | T[];\n\nconst toArray = <T>(value: Arrayable<T>): T[] =>\n Array.isArray(value) ? value : [value];\n\n/**\n * Resolve @instantdb packages from CLI's dependency tree.\n * For Deno projects, we alias all common @instantdb packages to @instantdb/core\n * since they all re-export the schema types from core.\n */\nfunction getInstantAliases(): Record<string, string> | null {\n try {\n const require = createRequire(import.meta.url);\n // Resolve @instantdb/core directly from CLI's dependencies\n const corePackageJson = require.resolve('@instantdb/core/package.json');\n const coreDir = path.dirname(corePackageJson);\n // All @instantdb packages re-export schema types from core,\n // so we can alias them all to core for schema loading purposes\n return {\n '@instantdb/core': coreDir,\n '@instantdb/react': coreDir,\n '@instantdb/react-native': coreDir,\n '@instantdb/svelte': coreDir,\n '@instantdb/vue': coreDir,\n '@instantdb/admin': coreDir,\n };\n } catch {\n return null;\n }\n}\n\nfunction withDenoAliases<T>(\n opts: LoadConfigOptions<T>,\n alias: Record<string, string>,\n): LoadConfigOptions<T> {\n return {\n ...opts,\n sources: toArray(opts.sources).map((source): LoadConfigSource<T> => {\n if (source.parser === 'json' || typeof source.parser === 'function') {\n return source;\n }\n\n return {\n ...source,\n parser: async (filepath) => {\n const localRequire = createRequire(import.meta.url);\n const unconfigRequire = createRequire(\n localRequire.resolve('unconfig/package.json'),\n );\n const { createJiti } = unconfigRequire('jiti');\n const jiti = createJiti(import.meta.url, {\n fsCache: false,\n moduleCache: false,\n interopDefault: true,\n alias,\n });\n\n return jiti.import(filepath, { default: true });\n },\n };\n }),\n };\n}\n\nexport async function loadConfig<T>(\n opts: LoadConfigOptions<T>,\n): Promise<LoadConfigResult<T>> {\n const projectInfo = await findProjectDir();\n const isDeno = projectInfo?.type === 'deno';\n\n // Deno projects don't have node_modules, so we need to alias @instantdb/*\n // packages to resolve from the CLI's own dependencies\n let res;\n if (isDeno) {\n const alias = getInstantAliases();\n res = await _loadConfig(alias ? withDenoAliases(opts, alias) : opts);\n } else {\n res = await _loadConfig(opts);\n }\n\n // Unconfig seems to add an __esModule property to the config object\n // Removing it.\n if (typeof res.config === 'object' && '__esModule' in res.config!) {\n delete res.config.__esModule;\n }\n return res;\n}\n"]}
1
+ {"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/util/loadConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,UAAU,CAAC;AAMrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,OAAO,GAAG,CAAI,KAAmB,EAAO,EAAE,CAC9C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAEzC;;;;GAIG;AACH,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC9C,OAAO;YACL,iBAAiB,EAAE,OAAO;YAC1B,kBAAkB,EAAE,OAAO;YAC3B,yBAAyB,EAAE,OAAO;YAClC,mBAAmB,EAAE,OAAO;YAC5B,gBAAgB,EAAE,OAAO;YACzB,kBAAkB,EAAE,OAAO;SAC5B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAClB,IAA0B,EAC1B,KAA6B;IAE7B,OAAO;QACL,GAAG,IAAI;QACP,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAuB,EAAE;YACjE,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACpE,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,OAAO;gBACL,GAAG,MAAM;gBACT,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;oBACzB,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACpD,MAAM,eAAe,GAAG,aAAa,CACnC,YAAY,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAC9C,CAAC;oBACF,MAAM,EAAE,UAAU,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;oBAC/C,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;wBACvC,OAAO,EAAE,KAAK;wBACd,WAAW,EAAE,KAAK;wBAClB,cAAc,EAAE,IAAI;wBACpB,KAAK;qBACN,CAAC,CAAC;oBAEH,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,CAAC;aACF,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAA0B;IAE1B,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAC3C,MAAM,YAAY,GAChB,WAAW,EAAE,IAAI,KAAK,MAAM,IAAI,WAAW,EAAE,IAAI,KAAK,QAAQ,CAAC;IAEjE,IAAI,GAAG,CAAC;IACR,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;QAClC,GAAG,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,oEAAoE;IACpE,eAAe;IACf,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,YAAY,IAAI,GAAG,CAAC,MAAO,EAAE,CAAC;QAClE,OAAO,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import { loadConfig as _loadConfig } from 'unconfig';\nimport type {\n LoadConfigOptions,\n LoadConfigResult,\n LoadConfigSource,\n} from 'unconfig';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { findProjectDir } from './projectDir.ts';\n\ntype Arrayable<T> = T | T[];\n\nconst toArray = <T>(value: Arrayable<T>): T[] =>\n Array.isArray(value) ? value : [value];\n\n/**\n * Resolve @instantdb packages from the CLI's own dependencies for\n * projects without node_modules. All @instantdb packages re-export\n * schema types from core, so a single core alias covers them all.\n */\nfunction getInstantAliases(): Record<string, string> | null {\n try {\n const require = createRequire(import.meta.url);\n const corePackageJson = require.resolve('@instantdb/core/package.json');\n const coreDir = path.dirname(corePackageJson);\n return {\n '@instantdb/core': coreDir,\n '@instantdb/react': coreDir,\n '@instantdb/react-native': coreDir,\n '@instantdb/svelte': coreDir,\n '@instantdb/vue': coreDir,\n '@instantdb/admin': coreDir,\n };\n } catch {\n return null;\n }\n}\n\nfunction withAliases<T>(\n opts: LoadConfigOptions<T>,\n alias: Record<string, string>,\n): LoadConfigOptions<T> {\n return {\n ...opts,\n sources: toArray(opts.sources).map((source): LoadConfigSource<T> => {\n if (source.parser === 'json' || typeof source.parser === 'function') {\n return source;\n }\n\n return {\n ...source,\n parser: async (filepath) => {\n const localRequire = createRequire(import.meta.url);\n const unconfigRequire = createRequire(\n localRequire.resolve('unconfig/package.json'),\n );\n const { createJiti } = unconfigRequire('jiti');\n const jiti = createJiti(import.meta.url, {\n fsCache: false,\n moduleCache: false,\n interopDefault: true,\n alias,\n });\n\n return jiti.import(filepath, { default: true });\n },\n };\n }),\n };\n}\n\nexport async function loadConfig<T>(\n opts: LoadConfigOptions<T>,\n): Promise<LoadConfigResult<T>> {\n const projectInfo = await findProjectDir();\n const needsAliases =\n projectInfo?.type === 'deno' || projectInfo?.type === 'python';\n\n let res;\n if (needsAliases) {\n const alias = getInstantAliases();\n res = await _loadConfig(alias ? withAliases(opts, alias) : opts);\n } else {\n res = await _loadConfig(opts);\n }\n\n // Unconfig seems to add an __esModule property to the config object\n // Removing it.\n if (typeof res.config === 'object' && '__esModule' in res.config!) {\n delete res.config.__esModule;\n }\n return res;\n}\n"]}
@@ -1,4 +1,4 @@
1
- export type ProjectType = 'node' | 'deno';
1
+ export type ProjectType = 'node' | 'deno' | 'python';
2
2
  export interface ProjectInfo {
3
3
  dir: string;
4
4
  type: ProjectType;
@@ -1 +1 @@
1
- {"version":3,"file":"projectDir.d.ts","sourceRoot":"","sources":["../../src/util/projectDir.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,wBAAsB,cAAc,CAClC,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAmB7B"}
1
+ {"version":3,"file":"projectDir.d.ts","sourceRoot":"","sources":["../../src/util/projectDir.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC;CACnB;AAYD,wBAAsB,cAAc,CAClC,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA8B7B"}
@@ -1,21 +1,43 @@
1
1
  import { packageDirectory } from 'package-directory';
2
2
  import { findUp } from 'find-up-simple';
3
3
  import path from 'node:path';
4
+ // Same-directory tie-breaker: Deno > Python > Node. Deno may coexist
5
+ // with package.json for npm interop; pyproject.toml signals Python.
6
+ const TYPE_PRIORITY = {
7
+ deno: 0,
8
+ python: 1,
9
+ node: 2,
10
+ };
11
+ const depth = (filepath) => filepath.split(path.sep).length;
4
12
  export async function findProjectDir(cwd) {
5
- // Check for Deno first. A Deno project may also have a package.json (for npm
6
- // compatibility), but if deno.json exists, the user intends to use Deno and
7
- // we should use Deno-specific behavior (e.g., resolving @instantdb/* from
8
- // CLI's dependencies instead of node_modules).
9
- const denoConfig = (await findUp('deno.json', { cwd })) ||
10
- (await findUp('deno.jsonc', { cwd }));
11
- if (denoConfig) {
12
- return { dir: path.dirname(denoConfig), type: 'deno' };
13
- }
14
- // Fall back to package-directory for Node
15
- const nodeDir = await packageDirectory({ cwd });
13
+ const [denoJson, denoJsonc, pyproject, nodeDir] = await Promise.all([
14
+ findUp('deno.json', { cwd }),
15
+ findUp('deno.jsonc', { cwd }),
16
+ findUp('pyproject.toml', { cwd }),
17
+ packageDirectory({ cwd }),
18
+ ]);
19
+ // Push deno.json and deno.jsonc independently so the depth-sort can
20
+ // pick the nearer one when both exist at different levels.
21
+ const candidates = [];
22
+ if (denoJson)
23
+ candidates.push({ file: denoJson, type: 'deno' });
24
+ if (denoJsonc)
25
+ candidates.push({ file: denoJsonc, type: 'deno' });
26
+ if (pyproject)
27
+ candidates.push({ file: pyproject, type: 'python' });
16
28
  if (nodeDir) {
17
- return { dir: nodeDir, type: 'node' };
29
+ candidates.push({ file: path.join(nodeDir, 'package.json'), type: 'node' });
18
30
  }
19
- return null;
31
+ if (candidates.length === 0)
32
+ return null;
33
+ // Nearest marker wins (deepest path), so a Python project nested in a
34
+ // Node monorepo isn't misclassified by a parent's package.json.
35
+ candidates.sort((a, b) => {
36
+ const depthDiff = depth(b.file) - depth(a.file);
37
+ return depthDiff !== 0
38
+ ? depthDiff
39
+ : TYPE_PRIORITY[a.type] - TYPE_PRIORITY[b.type];
40
+ });
41
+ return { dir: path.dirname(candidates[0].file), type: candidates[0].type };
20
42
  }
21
43
  //# sourceMappingURL=projectDir.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"projectDir.js","sourceRoot":"","sources":["../../src/util/projectDir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAY;IAEZ,6EAA6E;IAC7E,4EAA4E;IAC5E,0EAA0E;IAC1E,+CAA+C;IAC/C,MAAM,UAAU,GACd,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACpC,CAAC,MAAM,MAAM,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACxC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACzD,CAAC;IAED,0CAA0C;IAC1C,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAChD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { packageDirectory } from 'package-directory';\nimport { findUp } from 'find-up-simple';\nimport path from 'node:path';\n\nexport type ProjectType = 'node' | 'deno';\n\nexport interface ProjectInfo {\n dir: string;\n type: ProjectType;\n}\n\nexport async function findProjectDir(\n cwd?: string,\n): Promise<ProjectInfo | null> {\n // Check for Deno first. A Deno project may also have a package.json (for npm\n // compatibility), but if deno.json exists, the user intends to use Deno and\n // we should use Deno-specific behavior (e.g., resolving @instantdb/* from\n // CLI's dependencies instead of node_modules).\n const denoConfig =\n (await findUp('deno.json', { cwd })) ||\n (await findUp('deno.jsonc', { cwd }));\n if (denoConfig) {\n return { dir: path.dirname(denoConfig), type: 'deno' };\n }\n\n // Fall back to package-directory for Node\n const nodeDir = await packageDirectory({ cwd });\n if (nodeDir) {\n return { dir: nodeDir, type: 'node' };\n }\n\n return null;\n}\n"]}
1
+ {"version":3,"file":"projectDir.js","sourceRoot":"","sources":["../../src/util/projectDir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,qEAAqE;AACrE,oEAAoE;AACpE,MAAM,aAAa,GAAgC;IACjD,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAY;IAEZ,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAClE,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC;QAC5B,MAAM,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,CAAC;QAC7B,MAAM,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC;QACjC,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC;KAC1B,CAAC,CAAC;IAEH,oEAAoE;IACpE,2DAA2D;IAC3D,MAAM,UAAU,GAA0C,EAAE,CAAC;IAC7D,IAAI,QAAQ;QAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAChE,IAAI,SAAS;QAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,IAAI,SAAS;QAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,IAAI,OAAO,EAAE,CAAC;QACZ,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,sEAAsE;IACtE,gEAAgE;IAChE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChD,OAAO,SAAS,KAAK,CAAC;YACpB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7E,CAAC","sourcesContent":["import { packageDirectory } from 'package-directory';\nimport { findUp } from 'find-up-simple';\nimport path from 'node:path';\n\nexport type ProjectType = 'node' | 'deno' | 'python';\n\nexport interface ProjectInfo {\n dir: string;\n type: ProjectType;\n}\n\n// Same-directory tie-breaker: Deno > Python > Node. Deno may coexist\n// with package.json for npm interop; pyproject.toml signals Python.\nconst TYPE_PRIORITY: Record<ProjectType, number> = {\n deno: 0,\n python: 1,\n node: 2,\n};\n\nconst depth = (filepath: string) => filepath.split(path.sep).length;\n\nexport async function findProjectDir(\n cwd?: string,\n): Promise<ProjectInfo | null> {\n const [denoJson, denoJsonc, pyproject, nodeDir] = await Promise.all([\n findUp('deno.json', { cwd }),\n findUp('deno.jsonc', { cwd }),\n findUp('pyproject.toml', { cwd }),\n packageDirectory({ cwd }),\n ]);\n\n // Push deno.json and deno.jsonc independently so the depth-sort can\n // pick the nearer one when both exist at different levels.\n const candidates: { file: string; type: ProjectType }[] = [];\n if (denoJson) candidates.push({ file: denoJson, type: 'deno' });\n if (denoJsonc) candidates.push({ file: denoJsonc, type: 'deno' });\n if (pyproject) candidates.push({ file: pyproject, type: 'python' });\n if (nodeDir) {\n candidates.push({ file: path.join(nodeDir, 'package.json'), type: 'node' });\n }\n\n if (candidates.length === 0) return null;\n\n // Nearest marker wins (deepest path), so a Python project nested in a\n // Node monorepo isn't misclassified by a parent's package.json.\n candidates.sort((a, b) => {\n const depthDiff = depth(b.file) - depth(a.file);\n return depthDiff !== 0\n ? depthDiff\n : TYPE_PRIORITY[a.type] - TYPE_PRIORITY[b.type];\n });\n\n return { dir: path.dirname(candidates[0].file), type: candidates[0].type };\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "instant-cli",
3
3
  "type": "module",
4
- "version": "1.0.43",
4
+ "version": "1.0.44",
5
5
  "description": "Instant's CLI",
6
6
  "license": "Apache-2.0",
7
7
  "homepage": "https://github.com/instantdb/instant/tree/main/client/packages/cli",
@@ -50,9 +50,9 @@
50
50
  "strip-ansi": "^7.1.2",
51
51
  "supports-hyperlinks": "^4.4.0",
52
52
  "unconfig": "^7.5.0",
53
- "@instantdb/core": "1.0.43",
54
- "@instantdb/platform": "1.0.43",
55
- "@instantdb/version": "1.0.43"
53
+ "@instantdb/platform": "1.0.44",
54
+ "@instantdb/version": "1.0.44",
55
+ "@instantdb/core": "1.0.44"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@babel/core": "^7.17.9",
@@ -17,7 +17,7 @@ export class ProjectInfo extends Context.Tag(
17
17
  ProjectInfo,
18
18
  {
19
19
  pkgDir: string;
20
- projectType: 'node' | 'deno';
20
+ projectType: 'node' | 'deno' | 'python';
21
21
  instantModuleName: string;
22
22
  }
23
23
  >() {}
@@ -53,11 +53,11 @@ const getProjectInfo = (
53
53
  if (!projectDir) {
54
54
  return yield* new ProjectInfoError({
55
55
  message:
56
- "Couldn't find a project directory (package.json). Is there a package.json or deno.json file?",
56
+ "Couldn't find a project directory. Is there a package.json, deno.json, or pyproject.toml file?",
57
57
  });
58
58
  }
59
59
 
60
- if (projectDir.type === 'deno') {
60
+ if (projectDir.type === 'deno' || projectDir.type === 'python') {
61
61
  return {
62
62
  pkgDir: projectDir.dir,
63
63
  projectType: projectDir.type,
@@ -14,18 +14,15 @@ const toArray = <T>(value: Arrayable<T>): T[] =>
14
14
  Array.isArray(value) ? value : [value];
15
15
 
16
16
  /**
17
- * Resolve @instantdb packages from CLI's dependency tree.
18
- * For Deno projects, we alias all common @instantdb packages to @instantdb/core
19
- * since they all re-export the schema types from core.
17
+ * Resolve @instantdb packages from the CLI's own dependencies for
18
+ * projects without node_modules. All @instantdb packages re-export
19
+ * schema types from core, so a single core alias covers them all.
20
20
  */
21
21
  function getInstantAliases(): Record<string, string> | null {
22
22
  try {
23
23
  const require = createRequire(import.meta.url);
24
- // Resolve @instantdb/core directly from CLI's dependencies
25
24
  const corePackageJson = require.resolve('@instantdb/core/package.json');
26
25
  const coreDir = path.dirname(corePackageJson);
27
- // All @instantdb packages re-export schema types from core,
28
- // so we can alias them all to core for schema loading purposes
29
26
  return {
30
27
  '@instantdb/core': coreDir,
31
28
  '@instantdb/react': coreDir,
@@ -39,7 +36,7 @@ function getInstantAliases(): Record<string, string> | null {
39
36
  }
40
37
  }
41
38
 
42
- function withDenoAliases<T>(
39
+ function withAliases<T>(
43
40
  opts: LoadConfigOptions<T>,
44
41
  alias: Record<string, string>,
45
42
  ): LoadConfigOptions<T> {
@@ -76,14 +73,13 @@ export async function loadConfig<T>(
76
73
  opts: LoadConfigOptions<T>,
77
74
  ): Promise<LoadConfigResult<T>> {
78
75
  const projectInfo = await findProjectDir();
79
- const isDeno = projectInfo?.type === 'deno';
76
+ const needsAliases =
77
+ projectInfo?.type === 'deno' || projectInfo?.type === 'python';
80
78
 
81
- // Deno projects don't have node_modules, so we need to alias @instantdb/*
82
- // packages to resolve from the CLI's own dependencies
83
79
  let res;
84
- if (isDeno) {
80
+ if (needsAliases) {
85
81
  const alias = getInstantAliases();
86
- res = await _loadConfig(alias ? withDenoAliases(opts, alias) : opts);
82
+ res = await _loadConfig(alias ? withAliases(opts, alias) : opts);
87
83
  } else {
88
84
  res = await _loadConfig(opts);
89
85
  }
@@ -2,32 +2,53 @@ import { packageDirectory } from 'package-directory';
2
2
  import { findUp } from 'find-up-simple';
3
3
  import path from 'node:path';
4
4
 
5
- export type ProjectType = 'node' | 'deno';
5
+ export type ProjectType = 'node' | 'deno' | 'python';
6
6
 
7
7
  export interface ProjectInfo {
8
8
  dir: string;
9
9
  type: ProjectType;
10
10
  }
11
11
 
12
+ // Same-directory tie-breaker: Deno > Python > Node. Deno may coexist
13
+ // with package.json for npm interop; pyproject.toml signals Python.
14
+ const TYPE_PRIORITY: Record<ProjectType, number> = {
15
+ deno: 0,
16
+ python: 1,
17
+ node: 2,
18
+ };
19
+
20
+ const depth = (filepath: string) => filepath.split(path.sep).length;
21
+
12
22
  export async function findProjectDir(
13
23
  cwd?: string,
14
24
  ): Promise<ProjectInfo | null> {
15
- // Check for Deno first. A Deno project may also have a package.json (for npm
16
- // compatibility), but if deno.json exists, the user intends to use Deno and
17
- // we should use Deno-specific behavior (e.g., resolving @instantdb/* from
18
- // CLI's dependencies instead of node_modules).
19
- const denoConfig =
20
- (await findUp('deno.json', { cwd })) ||
21
- (await findUp('deno.jsonc', { cwd }));
22
- if (denoConfig) {
23
- return { dir: path.dirname(denoConfig), type: 'deno' };
24
- }
25
+ const [denoJson, denoJsonc, pyproject, nodeDir] = await Promise.all([
26
+ findUp('deno.json', { cwd }),
27
+ findUp('deno.jsonc', { cwd }),
28
+ findUp('pyproject.toml', { cwd }),
29
+ packageDirectory({ cwd }),
30
+ ]);
25
31
 
26
- // Fall back to package-directory for Node
27
- const nodeDir = await packageDirectory({ cwd });
32
+ // Push deno.json and deno.jsonc independently so the depth-sort can
33
+ // pick the nearer one when both exist at different levels.
34
+ const candidates: { file: string; type: ProjectType }[] = [];
35
+ if (denoJson) candidates.push({ file: denoJson, type: 'deno' });
36
+ if (denoJsonc) candidates.push({ file: denoJsonc, type: 'deno' });
37
+ if (pyproject) candidates.push({ file: pyproject, type: 'python' });
28
38
  if (nodeDir) {
29
- return { dir: nodeDir, type: 'node' };
39
+ candidates.push({ file: path.join(nodeDir, 'package.json'), type: 'node' });
30
40
  }
31
41
 
32
- return null;
42
+ if (candidates.length === 0) return null;
43
+
44
+ // Nearest marker wins (deepest path), so a Python project nested in a
45
+ // Node monorepo isn't misclassified by a parent's package.json.
46
+ candidates.sort((a, b) => {
47
+ const depthDiff = depth(b.file) - depth(a.file);
48
+ return depthDiff !== 0
49
+ ? depthDiff
50
+ : TYPE_PRIORITY[a.type] - TYPE_PRIORITY[b.type];
51
+ });
52
+
53
+ return { dir: path.dirname(candidates[0].file), type: candidates[0].type };
33
54
  }