@casekit/orm2-cli 0.0.0-20250322230249
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/build/cli.d.ts +1 -0
- package/build/cli.js +20 -0
- package/build/commands/db-drop/handler.d.ts +3 -0
- package/build/commands/db-drop/handler.js +19 -0
- package/build/commands/db-drop/options.d.ts +1 -0
- package/build/commands/db-drop/options.js +1 -0
- package/build/commands/db-drop.d.ts +6 -0
- package/build/commands/db-drop.js +8 -0
- package/build/commands/db-drop.test.d.ts +1 -0
- package/build/commands/db-drop.test.js +21 -0
- package/build/commands/db-pull/handler.d.ts +3 -0
- package/build/commands/db-pull/handler.js +20 -0
- package/build/commands/db-pull/options.d.ts +8 -0
- package/build/commands/db-pull/options.js +8 -0
- package/build/commands/db-pull.d.ts +20 -0
- package/build/commands/db-pull.js +8 -0
- package/build/commands/db-push/handler.d.ts +3 -0
- package/build/commands/db-push/handler.js +18 -0
- package/build/commands/db-push/options.d.ts +2 -0
- package/build/commands/db-push/options.js +1 -0
- package/build/commands/db-push.d.ts +6 -0
- package/build/commands/db-push.js +8 -0
- package/build/commands/db-push.test.d.ts +1 -0
- package/build/commands/db-push.test.js +21 -0
- package/build/commands/generate-model/handler.d.ts +3 -0
- package/build/commands/generate-model/handler.js +10 -0
- package/build/commands/generate-model/options.d.ts +18 -0
- package/build/commands/generate-model/options.js +18 -0
- package/build/commands/generate-model/util/generateModelFile.d.ts +3 -0
- package/build/commands/generate-model/util/generateModelFile.js +59 -0
- package/build/commands/generate-model/util/generateModelFile.test.d.ts +1 -0
- package/build/commands/generate-model/util/generateModelFile.test.js +67 -0
- package/build/commands/generate-model/util/regenerateModelsFile.d.ts +2 -0
- package/build/commands/generate-model/util/regenerateModelsFile.js +50 -0
- package/build/commands/generate-model.d.ts +40 -0
- package/build/commands/generate-model.js +8 -0
- package/build/commands/generate-model.test.d.ts +1 -0
- package/build/commands/generate-model.test.js +55 -0
- package/build/commands/init/handler.d.ts +3 -0
- package/build/commands/init/handler.js +20 -0
- package/build/commands/init/options.d.ts +12 -0
- package/build/commands/init/options.js +12 -0
- package/build/commands/init/util/generateConfigFile.d.ts +1 -0
- package/build/commands/init/util/generateConfigFile.js +12 -0
- package/build/commands/init/util/generateDbFile.d.ts +1 -0
- package/build/commands/init/util/generateDbFile.js +61 -0
- package/build/commands/init/util/generateModelsFile.d.ts +1 -0
- package/build/commands/init/util/generateModelsFile.js +4 -0
- package/build/commands/init.d.ts +28 -0
- package/build/commands/init.js +8 -0
- package/build/commands/init.test.d.ts +1 -0
- package/build/commands/init.test.js +112 -0
- package/build/index.d.ts +1 -0
- package/build/index.js +1 -0
- package/build/options.d.ts +12 -0
- package/build/options.js +12 -0
- package/build/test/setup.d.ts +1 -0
- package/build/test/setup.js +31 -0
- package/build/types.d.ts +19 -0
- package/build/types.js +1 -0
- package/build/util/createOrOverwriteFile.d.ts +1 -0
- package/build/util/createOrOverwriteFile.js +17 -0
- package/build/util/loadConfig.d.ts +3 -0
- package/build/util/loadConfig.js +14 -0
- package/build/util/prettify.d.ts +1 -0
- package/build/util/prettify.js +8 -0
- package/build/util/usesDevServer.d.ts +1 -0
- package/build/util/usesDevServer.js +10 -0
- package/build/util/usesDevServer.test.d.ts +1 -0
- package/build/util/usesDevServer.test.js +54 -0
- package/package.json +71 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const builder = {
|
|
2
|
+
force: {
|
|
3
|
+
type: "boolean",
|
|
4
|
+
desc: "Overwrite existing files without asking for confirmation",
|
|
5
|
+
default: false,
|
|
6
|
+
},
|
|
7
|
+
directory: {
|
|
8
|
+
alias: "d",
|
|
9
|
+
type: "string",
|
|
10
|
+
desc: "Location to keep your database configuration",
|
|
11
|
+
},
|
|
12
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const generateConfigFile: (directory: string) => string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { unindent } from "@casekit/unindent";
|
|
2
|
+
export const generateConfigFile = (directory) => unindent `
|
|
3
|
+
import { orm } from "@casekit/orm2";
|
|
4
|
+
import type { OrmCLIConfig } from "@casekit/orm2-cli";
|
|
5
|
+
|
|
6
|
+
import { models } from "./${directory.replace(/^\.\//, "")}/models";
|
|
7
|
+
|
|
8
|
+
export default {
|
|
9
|
+
db: orm({ models }),
|
|
10
|
+
directory: "${directory}",
|
|
11
|
+
} satisfies OrmCLIConfig;
|
|
12
|
+
`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const generateDbFile: () => string;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { unindent } from "@casekit/unindent";
|
|
2
|
+
import { usesDevServer } from "#util/usesDevServer.js";
|
|
3
|
+
export const generateDbFile = () => {
|
|
4
|
+
return usesDevServer()
|
|
5
|
+
? unindent `
|
|
6
|
+
import { Config, ModelType, Orm, orm } from "@casekit/orm2";
|
|
7
|
+
|
|
8
|
+
import { models } from "./models";
|
|
9
|
+
|
|
10
|
+
export type Models = typeof models;
|
|
11
|
+
|
|
12
|
+
export type Model<M extends keyof Models> = ModelType<Models, M>;
|
|
13
|
+
|
|
14
|
+
export const config: Config<Models> = {
|
|
15
|
+
models,
|
|
16
|
+
pool: true,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
let db: Orm<Models>;
|
|
20
|
+
|
|
21
|
+
declare global {
|
|
22
|
+
// eslint-disable-next-line no-var
|
|
23
|
+
var __db: Orm<Models>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// we do this because in development we don't want to restart
|
|
27
|
+
// the server with every change, but we want to make sure we don't
|
|
28
|
+
// create a new connection to the DB with every change either.
|
|
29
|
+
if (process.env.NODE_ENV === "production") {
|
|
30
|
+
db = orm(config);
|
|
31
|
+
await db.connect();
|
|
32
|
+
} else {
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
34
|
+
if (!global.__db) {
|
|
35
|
+
global.__db = orm(config);
|
|
36
|
+
await global.__db.connect();
|
|
37
|
+
}
|
|
38
|
+
db = global.__db;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { db };
|
|
42
|
+
`
|
|
43
|
+
: unindent `
|
|
44
|
+
import { Config, ModelType, Orm, orm } from "@casekit/orm2";
|
|
45
|
+
|
|
46
|
+
import { models } from "./models";
|
|
47
|
+
|
|
48
|
+
export type Models = typeof models;
|
|
49
|
+
export type Model<M extends keyof Models> = ModelType<Models, M>;
|
|
50
|
+
|
|
51
|
+
export const config: Config<Models> = {
|
|
52
|
+
models,
|
|
53
|
+
pool: true,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const db: Orm<Models> = orm(config);
|
|
57
|
+
await db.connect();
|
|
58
|
+
|
|
59
|
+
export { db };
|
|
60
|
+
`;
|
|
61
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const generateModelsFile: () => string;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare const init: {
|
|
2
|
+
command: string;
|
|
3
|
+
desc: string;
|
|
4
|
+
builder: {
|
|
5
|
+
readonly force: {
|
|
6
|
+
readonly type: "boolean";
|
|
7
|
+
readonly desc: "Overwrite existing files without asking for confirmation";
|
|
8
|
+
readonly default: false;
|
|
9
|
+
};
|
|
10
|
+
readonly directory: {
|
|
11
|
+
readonly alias: "d";
|
|
12
|
+
readonly type: "string";
|
|
13
|
+
readonly desc: "Location to keep your database configuration";
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
handler: import("../types.js").Handler<{
|
|
17
|
+
readonly force: {
|
|
18
|
+
readonly type: "boolean";
|
|
19
|
+
readonly desc: "Overwrite existing files without asking for confirmation";
|
|
20
|
+
readonly default: false;
|
|
21
|
+
};
|
|
22
|
+
readonly directory: {
|
|
23
|
+
readonly alias: "d";
|
|
24
|
+
readonly type: "string";
|
|
25
|
+
readonly desc: "Location to keep your database configuration";
|
|
26
|
+
};
|
|
27
|
+
}>;
|
|
28
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import * as prompts from "@inquirer/prompts";
|
|
2
|
+
import { vol } from "memfs";
|
|
3
|
+
import { describe, expect, test, vi } from "vitest";
|
|
4
|
+
import yargs from "yargs";
|
|
5
|
+
import { unindent } from "@casekit/unindent";
|
|
6
|
+
import { init } from "./init.js";
|
|
7
|
+
describe("init", () => {
|
|
8
|
+
test("creating config files for a react-router app", async () => {
|
|
9
|
+
vol.fromJSON({
|
|
10
|
+
"package.json": JSON.stringify({
|
|
11
|
+
dependencies: {
|
|
12
|
+
"react-router": "^6.0.0",
|
|
13
|
+
},
|
|
14
|
+
}),
|
|
15
|
+
}, "/project");
|
|
16
|
+
vi.spyOn(prompts, "input").mockResolvedValueOnce("./app/db.server");
|
|
17
|
+
vi.spyOn(prompts, "confirm").mockResolvedValueOnce(true);
|
|
18
|
+
await yargs().command(init).parseAsync("init");
|
|
19
|
+
const dbFile = vol.readFileSync("./app/db.server/db.ts", "utf-8");
|
|
20
|
+
const modelFile = vol.readFileSync("./app/db.server/models/index.ts", "utf-8");
|
|
21
|
+
const configFile = vol.readFileSync("./orm.config.ts", "utf-8");
|
|
22
|
+
expect(dbFile).toEqual(unindent `
|
|
23
|
+
import { Config, ModelType, Orm, orm } from "@casekit/orm2";
|
|
24
|
+
|
|
25
|
+
import { models } from "./models";
|
|
26
|
+
|
|
27
|
+
export type Models = typeof models;
|
|
28
|
+
|
|
29
|
+
export type Model<M extends keyof Models> = ModelType<Models, M>;
|
|
30
|
+
|
|
31
|
+
export const config: Config<Models> = {
|
|
32
|
+
models,
|
|
33
|
+
pool: true,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
let db: Orm<Models>;
|
|
37
|
+
|
|
38
|
+
declare global {
|
|
39
|
+
// eslint-disable-next-line no-var
|
|
40
|
+
var __db: Orm<Models>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// we do this because in development we don't want to restart
|
|
44
|
+
// the server with every change, but we want to make sure we don't
|
|
45
|
+
// create a new connection to the DB with every change either.
|
|
46
|
+
if (process.env.NODE_ENV === "production") {
|
|
47
|
+
db = orm(config);
|
|
48
|
+
await db.connect();
|
|
49
|
+
} else {
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
51
|
+
if (!global.__db) {
|
|
52
|
+
global.__db = orm(config);
|
|
53
|
+
await global.__db.connect();
|
|
54
|
+
}
|
|
55
|
+
db = global.__db;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export { db };
|
|
59
|
+
`);
|
|
60
|
+
expect(modelFile).toEqual(unindent `
|
|
61
|
+
export const models = {};
|
|
62
|
+
`);
|
|
63
|
+
expect(configFile).toEqual(unindent `
|
|
64
|
+
import { orm } from "@casekit/orm2";
|
|
65
|
+
import type { OrmCLIConfig } from "@casekit/orm2-cli";
|
|
66
|
+
|
|
67
|
+
import { models } from "./app/db.server/models";
|
|
68
|
+
|
|
69
|
+
export default {
|
|
70
|
+
db: orm({ models }),
|
|
71
|
+
directory: "./app/db.server",
|
|
72
|
+
} satisfies OrmCLIConfig;
|
|
73
|
+
`);
|
|
74
|
+
});
|
|
75
|
+
test("optionally overwriting existing files", async () => {
|
|
76
|
+
vol.fromJSON({
|
|
77
|
+
"package.json": JSON.stringify({ dependencies: {} }),
|
|
78
|
+
"app/db.server/models/index.ts": "original",
|
|
79
|
+
"orm.config.ts": "original",
|
|
80
|
+
"app/db.server/db.ts": "original",
|
|
81
|
+
}, "/project");
|
|
82
|
+
vi.spyOn(prompts, "input").mockResolvedValueOnce("./app/db.server");
|
|
83
|
+
vi.spyOn(prompts, "confirm")
|
|
84
|
+
.mockResolvedValueOnce(true)
|
|
85
|
+
.mockResolvedValueOnce(false)
|
|
86
|
+
.mockResolvedValueOnce(false);
|
|
87
|
+
await yargs().command(init).parseAsync("init");
|
|
88
|
+
const dbFile = vol.readFileSync("./app/db.server/db.ts", "utf-8");
|
|
89
|
+
const modelFile = vol.readFileSync("./app/db.server/models/index.ts", "utf-8");
|
|
90
|
+
const configFile = vol.readFileSync("./orm.config.ts", "utf-8");
|
|
91
|
+
expect(dbFile).toEqual(unindent `
|
|
92
|
+
import { Config, ModelType, Orm, orm } from "@casekit/orm2";
|
|
93
|
+
|
|
94
|
+
import { models } from "./models";
|
|
95
|
+
|
|
96
|
+
export type Models = typeof models;
|
|
97
|
+
export type Model<M extends keyof Models> = ModelType<Models, M>;
|
|
98
|
+
|
|
99
|
+
export const config: Config<Models> = {
|
|
100
|
+
models,
|
|
101
|
+
pool: true,
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const db: Orm<Models> = orm(config);
|
|
105
|
+
await db.connect();
|
|
106
|
+
|
|
107
|
+
export { db };
|
|
108
|
+
`);
|
|
109
|
+
expect(modelFile).toEqual("original");
|
|
110
|
+
expect(configFile).toEqual("original");
|
|
111
|
+
});
|
|
112
|
+
});
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { OrmCLIConfig } from "./types.js";
|
package/build/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const globalOptions: {
|
|
2
|
+
readonly config: {
|
|
3
|
+
readonly type: "string";
|
|
4
|
+
readonly alias: "c";
|
|
5
|
+
readonly describe: "Path to the orm CLIs configuration file";
|
|
6
|
+
readonly default: "orm.config.ts";
|
|
7
|
+
};
|
|
8
|
+
readonly force: {
|
|
9
|
+
readonly type: "boolean";
|
|
10
|
+
readonly desc: "Skip all prompts, use defaults, and overwrite existing files without asking for confirmation";
|
|
11
|
+
};
|
|
12
|
+
};
|
package/build/options.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const globalOptions = {
|
|
2
|
+
config: {
|
|
3
|
+
type: "string",
|
|
4
|
+
alias: "c",
|
|
5
|
+
describe: "Path to the orm CLIs configuration file",
|
|
6
|
+
default: "orm.config.ts",
|
|
7
|
+
},
|
|
8
|
+
force: {
|
|
9
|
+
type: "boolean",
|
|
10
|
+
desc: "Skip all prompts, use defaults, and overwrite existing files without asking for confirmation",
|
|
11
|
+
},
|
|
12
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { vol } from "memfs";
|
|
2
|
+
import pg from "pg";
|
|
3
|
+
import { register } from "tsx/esm/api";
|
|
4
|
+
import { afterAll, afterEach, beforeAll, beforeEach, vi } from "vitest";
|
|
5
|
+
import * as loadConfig from "#util/loadConfig.js";
|
|
6
|
+
vi.mock("fs");
|
|
7
|
+
vi.mock("prettier");
|
|
8
|
+
vi.mock("@inquirer/prompts");
|
|
9
|
+
let unregister;
|
|
10
|
+
beforeAll(async () => {
|
|
11
|
+
const client = new pg.Client();
|
|
12
|
+
await client.connect();
|
|
13
|
+
await client.query("DROP SCHEMA IF EXISTS orm_cli_test CASCADE");
|
|
14
|
+
unregister = register();
|
|
15
|
+
});
|
|
16
|
+
afterAll(async () => {
|
|
17
|
+
await unregister();
|
|
18
|
+
});
|
|
19
|
+
beforeEach(async () => {
|
|
20
|
+
const path = "./orm.config.ts";
|
|
21
|
+
const { default: config } = await import(path);
|
|
22
|
+
vi.spyOn(loadConfig, "loadConfig").mockResolvedValue(config);
|
|
23
|
+
const originalFs = await vi.importActual("fs");
|
|
24
|
+
const ormConfig = originalFs.readFileSync("./src/test/orm.config.ts", "utf8");
|
|
25
|
+
const prettierConfig = originalFs.readFileSync("../../.prettierrc.json", "utf8");
|
|
26
|
+
vol.fromJSON({ "orm.config.ts": ormConfig, ".prettierrc.json": prettierConfig }, "/project");
|
|
27
|
+
vi.spyOn(process, "cwd").mockReturnValue("/project");
|
|
28
|
+
});
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
vol.reset();
|
|
31
|
+
});
|
package/build/types.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ConnectionConfig } from "pg";
|
|
2
|
+
import { ArgumentsCamelCase, InferredOptionTypes, Options } from "yargs";
|
|
3
|
+
import { ZodSchema } from "zod";
|
|
4
|
+
import { ModelDefinition, Orm } from "@casekit/orm2";
|
|
5
|
+
import { globalOptions } from "#options.js";
|
|
6
|
+
export interface OrmCLIConfig {
|
|
7
|
+
db: Orm;
|
|
8
|
+
directory: string;
|
|
9
|
+
generate?: {
|
|
10
|
+
templates?: Record<string, ModelDefinition>;
|
|
11
|
+
defaultSchemas?: Record<string, ZodSchema>;
|
|
12
|
+
};
|
|
13
|
+
migrate?: {
|
|
14
|
+
connection?: ConnectionConfig;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export type Builder = Record<string, Options>;
|
|
18
|
+
export type CommandOptions<T extends Builder = Record<string, never>> = ArgumentsCamelCase<InferredOptionTypes<T & typeof globalOptions>>;
|
|
19
|
+
export type Handler<T extends Builder = Record<string, never>> = (opts: ArgumentsCamelCase<InferredOptionTypes<T & typeof globalOptions>>) => void | Promise<void>;
|
package/build/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const createOrOverwriteFile: (filePath: string, content: string, force?: boolean) => Promise<void>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { confirm } from "@inquirer/prompts";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
export const createOrOverwriteFile = async (filePath, content, force) => {
|
|
5
|
+
const fullPath = path.join(process.cwd(), filePath);
|
|
6
|
+
if (fs.existsSync(fullPath) && !force) {
|
|
7
|
+
const overwrite = await confirm({
|
|
8
|
+
message: `${filePath} already exists - overwrite it?`,
|
|
9
|
+
default: false,
|
|
10
|
+
});
|
|
11
|
+
if (!overwrite)
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
|
15
|
+
fs.writeFileSync(fullPath, content);
|
|
16
|
+
console.log(`- Created ${filePath}`);
|
|
17
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { register } from "tsx/esm/api";
|
|
3
|
+
export const loadConfig = async (options) => {
|
|
4
|
+
try {
|
|
5
|
+
const unregister = register();
|
|
6
|
+
const { default: config } = await import(path.join(process.cwd(), options.config));
|
|
7
|
+
await unregister();
|
|
8
|
+
return "default" in config ? config.default : config;
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
console.error(e instanceof Error ? e.message : e);
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const prettify: (path: string, content: string) => Promise<string>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const usesDevServer: () => boolean;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
export const usesDevServer = () => {
|
|
3
|
+
try {
|
|
4
|
+
const manifest = JSON.parse(fs.readFileSync("./package.json", "utf-8"));
|
|
5
|
+
return !!Object.keys(manifest.dependencies).find((dep) => /(^react-router$|^@remix-run|^next$)/.test(dep));
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { vol } from "memfs";
|
|
2
|
+
import { describe, expect, test } from "vitest";
|
|
3
|
+
import { usesDevServer } from "./usesDevServer.js";
|
|
4
|
+
describe("usesDevServer", () => {
|
|
5
|
+
test("returns true when package.json has react-router dependency", () => {
|
|
6
|
+
vol.fromJSON({
|
|
7
|
+
"package.json": JSON.stringify({
|
|
8
|
+
dependencies: {
|
|
9
|
+
"react-router": "^6.0.0",
|
|
10
|
+
},
|
|
11
|
+
}),
|
|
12
|
+
}, "/project");
|
|
13
|
+
expect(usesDevServer()).toBe(true);
|
|
14
|
+
});
|
|
15
|
+
test("returns true when package.json has @remix-run dependency", () => {
|
|
16
|
+
vol.fromJSON({
|
|
17
|
+
"package.json": JSON.stringify({
|
|
18
|
+
dependencies: {
|
|
19
|
+
"@remix-run/react": "^1.0.0",
|
|
20
|
+
},
|
|
21
|
+
}),
|
|
22
|
+
}, "/project");
|
|
23
|
+
expect(usesDevServer()).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
test("returns true when package.json has next.js dependency", () => {
|
|
26
|
+
vol.fromJSON({
|
|
27
|
+
"package.json": JSON.stringify({
|
|
28
|
+
dependencies: {
|
|
29
|
+
next: "^12.0.0",
|
|
30
|
+
},
|
|
31
|
+
}),
|
|
32
|
+
}, "/project");
|
|
33
|
+
expect(usesDevServer()).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
test("returns false when package.json has no next, remix, or react-router dependencies", () => {
|
|
36
|
+
vol.fromJSON({
|
|
37
|
+
"package.json": JSON.stringify({
|
|
38
|
+
dependencies: {
|
|
39
|
+
lodash: "^4.0.0",
|
|
40
|
+
},
|
|
41
|
+
}),
|
|
42
|
+
}, "/project");
|
|
43
|
+
expect(usesDevServer()).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
test("returns false when package.json is missing", () => {
|
|
46
|
+
expect(usesDevServer()).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
test("returns false when package.json is invalid JSON", () => {
|
|
49
|
+
vol.fromJSON({
|
|
50
|
+
"package.json": "invalid json",
|
|
51
|
+
}, "/project");
|
|
52
|
+
expect(usesDevServer()).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@casekit/orm2-cli",
|
|
3
|
+
"description": "",
|
|
4
|
+
"version": "0.0.0-20250322230249",
|
|
5
|
+
"author": "",
|
|
6
|
+
"bin": {
|
|
7
|
+
"orm": "./build/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"@casekit/unindent": "^1.0.5",
|
|
11
|
+
"@inquirer/prompts": "^7.4.0",
|
|
12
|
+
"@inquirer/testing": "^2.1.45",
|
|
13
|
+
"byline": "^5.0.0",
|
|
14
|
+
"camelcase": "^8.0.0",
|
|
15
|
+
"es-toolkit": "^1.33.0",
|
|
16
|
+
"jscodeshift": "^17.2.0",
|
|
17
|
+
"tsx": "^4.19.3",
|
|
18
|
+
"yargs": "^17.7.2",
|
|
19
|
+
"@casekit/orm2": "0.0.0-20250322230249",
|
|
20
|
+
"@casekit/toolbox": "0.0.0-20250322230249",
|
|
21
|
+
"@casekit/sql": "0.0.0-20250322230249",
|
|
22
|
+
"@casekit/orm2-migrate": "0.0.0-20250322230249"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@trivago/prettier-plugin-sort-imports": "^5.2.2",
|
|
26
|
+
"@types/byline": "^4.2.36",
|
|
27
|
+
"@types/jscodeshift": "^0.12.0",
|
|
28
|
+
"@types/node": "^22.13.11",
|
|
29
|
+
"@types/pg": "^8.11.11",
|
|
30
|
+
"@types/yargs": "^17.0.33",
|
|
31
|
+
"@vitest/coverage-v8": "^3.0.9",
|
|
32
|
+
"dotenv": "^16.4.7",
|
|
33
|
+
"memfs": "^4.17.0",
|
|
34
|
+
"prettier": "^3.5.3",
|
|
35
|
+
"prettier-plugin-svelte": "^3.3.3",
|
|
36
|
+
"typescript": "^5.8.2",
|
|
37
|
+
"vite-tsconfig-paths": "^5.1.4",
|
|
38
|
+
"vitest": "^3.0.9",
|
|
39
|
+
"zod": "^3.24.2",
|
|
40
|
+
"@casekit/tsconfig": "0.0.0-20250322230249",
|
|
41
|
+
"@casekit/prettier-config": "0.0.0-20250322230249",
|
|
42
|
+
"@casekit/orm2-fixtures": "0.0.0-20250322230249"
|
|
43
|
+
},
|
|
44
|
+
"exports": {
|
|
45
|
+
".": "./build/index.js"
|
|
46
|
+
},
|
|
47
|
+
"files": [
|
|
48
|
+
"/build"
|
|
49
|
+
],
|
|
50
|
+
"imports": {
|
|
51
|
+
"#*": "./build/*"
|
|
52
|
+
},
|
|
53
|
+
"keywords": [],
|
|
54
|
+
"license": "ISC",
|
|
55
|
+
"main": "index.js",
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"pg": "^8.13.1"
|
|
58
|
+
},
|
|
59
|
+
"prettier": "@casekit/prettier-config",
|
|
60
|
+
"type": "module",
|
|
61
|
+
"scripts": {
|
|
62
|
+
"build": "rm -rf ./build && tsc",
|
|
63
|
+
"db:create": "tsx src/cli.ts db drop && tsx src/cli.ts db push",
|
|
64
|
+
"format:check": "prettier --check .",
|
|
65
|
+
"format": "prettier --write .",
|
|
66
|
+
"lint": "eslint src --max-warnings 0",
|
|
67
|
+
"test": "vitest --run --typecheck --coverage",
|
|
68
|
+
"test:watch": "vitest",
|
|
69
|
+
"typecheck": "tsc --noEmit"
|
|
70
|
+
}
|
|
71
|
+
}
|