instant-cli 1.0.43 → 1.0.44-branch-python-sdk-v1.27158555091.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/.turbo/turbo-build.log +1 -1
- package/dist/context/projectInfo.d.ts +1 -1
- package/dist/context/projectInfo.d.ts.map +1 -1
- package/dist/context/projectInfo.js +2 -2
- package/dist/context/projectInfo.js.map +1 -1
- package/dist/util/loadConfig.d.ts.map +1 -1
- package/dist/util/loadConfig.js +7 -12
- package/dist/util/loadConfig.js.map +1 -1
- package/dist/util/projectDir.d.ts +1 -1
- package/dist/util/projectDir.d.ts.map +1 -1
- package/dist/util/projectDir.js +35 -13
- package/dist/util/projectDir.js.map +1 -1
- package/package.json +4 -4
- package/src/context/projectInfo.ts +3 -3
- package/src/util/loadConfig.ts +8 -12
- package/src/util/projectDir.ts +36 -15
package/.turbo/turbo-build.log
CHANGED
|
@@ -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;
|
|
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
|
|
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;
|
|
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"}
|
package/dist/util/loadConfig.js
CHANGED
|
@@ -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
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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
|
|
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
|
|
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 (
|
|
58
|
+
if (needsAliases) {
|
|
64
59
|
const alias = getInstantAliases();
|
|
65
|
-
res = await _loadConfig(alias ?
|
|
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,
|
|
1
|
+
{"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/util/loadConfig.ts"],"names":[],"mappings":"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","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 +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;
|
|
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"}
|
package/dist/util/projectDir.js
CHANGED
|
@@ -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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
29
|
+
candidates.push({ file: path.join(nodeDir, 'package.json'), type: 'node' });
|
|
18
30
|
}
|
|
19
|
-
|
|
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,
|
|
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.
|
|
4
|
+
"version": "1.0.44-branch-python-sdk-v1.27158555091.1",
|
|
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.
|
|
54
|
-
"@instantdb/platform": "1.0.
|
|
55
|
-
"@instantdb/version": "1.0.
|
|
53
|
+
"@instantdb/core": "1.0.44-branch-python-sdk-v1.27158555091.1",
|
|
54
|
+
"@instantdb/platform": "1.0.44-branch-python-sdk-v1.27158555091.1",
|
|
55
|
+
"@instantdb/version": "1.0.44-branch-python-sdk-v1.27158555091.1"
|
|
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
|
|
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,
|
package/src/util/loadConfig.ts
CHANGED
|
@@ -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
|
|
18
|
-
*
|
|
19
|
-
*
|
|
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
|
|
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
|
|
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 (
|
|
80
|
+
if (needsAliases) {
|
|
85
81
|
const alias = getInstantAliases();
|
|
86
|
-
res = await _loadConfig(alias ?
|
|
82
|
+
res = await _loadConfig(alias ? withAliases(opts, alias) : opts);
|
|
87
83
|
} else {
|
|
88
84
|
res = await _loadConfig(opts);
|
|
89
85
|
}
|
package/src/util/projectDir.ts
CHANGED
|
@@ -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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
//
|
|
27
|
-
|
|
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
|
-
|
|
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
|
}
|