create-joist-app 0.0.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.
Files changed (119) hide show
  1. package/build/create-app.d.ts +18 -0
  2. package/build/create-app.d.ts.map +1 -0
  3. package/build/create-app.js +73 -0
  4. package/build/create-app.js.map +1 -0
  5. package/build/create-app.test.d.ts +2 -0
  6. package/build/create-app.test.d.ts.map +1 -0
  7. package/build/create-app.test.js +176 -0
  8. package/build/create-app.test.js.map +1 -0
  9. package/build/create-db-dockerfile.d.ts +2 -0
  10. package/build/create-db-dockerfile.d.ts.map +1 -0
  11. package/build/create-db-dockerfile.js +43 -0
  12. package/build/create-db-dockerfile.js.map +1 -0
  13. package/build/create-docker-compose.d.ts +3 -0
  14. package/build/create-docker-compose.d.ts.map +1 -0
  15. package/build/create-docker-compose.js +35 -0
  16. package/build/create-docker-compose.js.map +1 -0
  17. package/build/create-env.d.ts +3 -0
  18. package/build/create-env.d.ts.map +1 -0
  19. package/build/create-env.js +16 -0
  20. package/build/create-env.js.map +1 -0
  21. package/build/helpers/copy.d.ts +3 -0
  22. package/build/helpers/copy.d.ts.map +1 -0
  23. package/build/helpers/copy.js +33 -0
  24. package/build/helpers/copy.js.map +1 -0
  25. package/build/helpers/get-package-manager.d.ts +3 -0
  26. package/build/helpers/get-package-manager.d.ts.map +1 -0
  27. package/build/helpers/get-package-manager.js +17 -0
  28. package/build/helpers/get-package-manager.js.map +1 -0
  29. package/build/helpers/install.d.ts +3 -0
  30. package/build/helpers/install.d.ts.map +1 -0
  31. package/build/helpers/install.js +29 -0
  32. package/build/helpers/install.js.map +1 -0
  33. package/build/helpers/is-folder-empty.d.ts +2 -0
  34. package/build/helpers/is-folder-empty.d.ts.map +1 -0
  35. package/build/helpers/is-folder-empty.js +14 -0
  36. package/build/helpers/is-folder-empty.js.map +1 -0
  37. package/build/helpers/is-folder-empty.test.d.ts +2 -0
  38. package/build/helpers/is-folder-empty.test.d.ts.map +1 -0
  39. package/build/helpers/is-folder-empty.test.js +38 -0
  40. package/build/helpers/is-folder-empty.test.js.map +1 -0
  41. package/build/helpers/is-writeable.d.ts +2 -0
  42. package/build/helpers/is-writeable.d.ts.map +1 -0
  43. package/build/helpers/is-writeable.js +17 -0
  44. package/build/helpers/is-writeable.js.map +1 -0
  45. package/build/index.d.ts +3 -0
  46. package/build/index.d.ts.map +1 -0
  47. package/build/index.js +213 -0
  48. package/build/index.js.map +1 -0
  49. package/build/replace-sentinels.d.ts +2 -0
  50. package/build/replace-sentinels.d.ts.map +1 -0
  51. package/build/replace-sentinels.js +59 -0
  52. package/build/replace-sentinels.js.map +1 -0
  53. package/build/update-package-json.d.ts +2 -0
  54. package/build/update-package-json.d.ts.map +1 -0
  55. package/build/update-package-json.js +25 -0
  56. package/build/update-package-json.js.map +1 -0
  57. package/package.json +55 -0
  58. package/templates/basic/README.md +70 -0
  59. package/templates/basic/gitignore +28 -0
  60. package/templates/basic/jest.config.js +14 -0
  61. package/templates/basic/joist-config.json +7 -0
  62. package/templates/basic/migrations/1580658856631_initial.ts +22 -0
  63. package/templates/basic/package.json +28 -0
  64. package/templates/basic/src/context.ts +14 -0
  65. package/templates/basic/src/entities/Author.test.ts +17 -0
  66. package/templates/basic/src/entities/Author.ts +7 -0
  67. package/templates/basic/src/entities/Book.ts +3 -0
  68. package/templates/basic/src/entities/entities.ts +14 -0
  69. package/templates/basic/src/entities/factories/index.ts +2 -0
  70. package/templates/basic/src/entities/factories/newAuthor.ts +6 -0
  71. package/templates/basic/src/entities/factories/newBook.ts +6 -0
  72. package/templates/basic/src/entities/index.ts +3 -0
  73. package/templates/basic/src/setupTestEnv.ts +5 -0
  74. package/templates/basic/src/setupTests.ts +29 -0
  75. package/templates/basic/tsconfig.json +23 -0
  76. package/templates/graphql/README.md +84 -0
  77. package/templates/graphql/codegen.yml +11 -0
  78. package/templates/graphql/gitignore +28 -0
  79. package/templates/graphql/graphql-codegen-joist.js +5 -0
  80. package/templates/graphql/graphql-codegen.js +26 -0
  81. package/templates/graphql/jest.config.js +14 -0
  82. package/templates/graphql/joist-config.json +8 -0
  83. package/templates/graphql/migrations/1580658856631_initial.ts +38 -0
  84. package/templates/graphql/package.json +41 -0
  85. package/templates/graphql/schema/.history.json +9 -0
  86. package/templates/graphql/schema/author.graphql +20 -0
  87. package/templates/graphql/schema/book.graphql +19 -0
  88. package/templates/graphql/schema/enums.graphql +0 -0
  89. package/templates/graphql/schema/root.graphql +0 -0
  90. package/templates/graphql/src/.history.json +12 -0
  91. package/templates/graphql/src/context.ts +14 -0
  92. package/templates/graphql/src/entities/Author.test.ts +36 -0
  93. package/templates/graphql/src/entities/Author.ts +7 -0
  94. package/templates/graphql/src/entities/Book.ts +3 -0
  95. package/templates/graphql/src/entities/entities.ts +14 -0
  96. package/templates/graphql/src/entities/factories/index.ts +2 -0
  97. package/templates/graphql/src/entities/factories/newAuthor.ts +6 -0
  98. package/templates/graphql/src/entities/factories/newBook.ts +6 -0
  99. package/templates/graphql/src/entities/index.ts +3 -0
  100. package/templates/graphql/src/jest.d.ts +9 -0
  101. package/templates/graphql/src/resolvers/author/authorResolvers.test.ts +17 -0
  102. package/templates/graphql/src/resolvers/author/authorResolvers.ts +5 -0
  103. package/templates/graphql/src/resolvers/author/saveAuthorMutation.test.ts +13 -0
  104. package/templates/graphql/src/resolvers/author/saveAuthorMutation.ts +9 -0
  105. package/templates/graphql/src/resolvers/book/bookResolvers.test.ts +17 -0
  106. package/templates/graphql/src/resolvers/book/bookResolvers.ts +5 -0
  107. package/templates/graphql/src/resolvers/book/saveBookMutation.test.ts +16 -0
  108. package/templates/graphql/src/resolvers/book/saveBookMutation.ts +9 -0
  109. package/templates/graphql/src/resolvers/enumResolvers.ts +5 -0
  110. package/templates/graphql/src/resolvers/index.ts +15 -0
  111. package/templates/graphql/src/resolvers/mutations/index.ts +7 -0
  112. package/templates/graphql/src/resolvers/objects/index.ts +6 -0
  113. package/templates/graphql/src/resolvers/testUtils.ts +10 -0
  114. package/templates/graphql/src/resolvers/utils.ts +1 -0
  115. package/templates/graphql/src/server.ts +37 -0
  116. package/templates/graphql/src/setupIt.ts +17 -0
  117. package/templates/graphql/src/setupTestEnv.ts +5 -0
  118. package/templates/graphql/src/setupTests.ts +37 -0
  119. package/templates/graphql/tsconfig.json +23 -0
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = __importDefault(require("fs"));
7
+ const os_1 = __importDefault(require("os"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const is_folder_empty_1 = require("./is-folder-empty");
10
+ describe("isFolderEmpty", () => {
11
+ let tempDir;
12
+ beforeEach(() => {
13
+ tempDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), "joist-test-"));
14
+ });
15
+ afterEach(() => {
16
+ fs_1.default.rmSync(tempDir, { recursive: true, force: true });
17
+ });
18
+ it("returns true for empty directory", () => {
19
+ expect((0, is_folder_empty_1.isFolderEmpty)(tempDir)).toBe(true);
20
+ });
21
+ it("returns false for non-empty directory", () => {
22
+ fs_1.default.writeFileSync(path_1.default.join(tempDir, "test.txt"), "hello");
23
+ expect((0, is_folder_empty_1.isFolderEmpty)(tempDir)).toBe(false);
24
+ });
25
+ it("ignores allowed files like .DS_Store", () => {
26
+ fs_1.default.writeFileSync(path_1.default.join(tempDir, ".DS_Store"), "");
27
+ expect((0, is_folder_empty_1.isFolderEmpty)(tempDir)).toBe(true);
28
+ });
29
+ it("ignores .git directory", () => {
30
+ fs_1.default.mkdirSync(path_1.default.join(tempDir, ".git"));
31
+ expect((0, is_folder_empty_1.isFolderEmpty)(tempDir)).toBe(true);
32
+ });
33
+ it("ignores .gitignore", () => {
34
+ fs_1.default.writeFileSync(path_1.default.join(tempDir, ".gitignore"), "");
35
+ expect((0, is_folder_empty_1.isFolderEmpty)(tempDir)).toBe(true);
36
+ });
37
+ });
38
+ //# sourceMappingURL=is-folder-empty.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-folder-empty.test.js","sourceRoot":"","sources":["../../src/helpers/is-folder-empty.test.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,4CAAoB;AACpB,gDAAwB;AACxB,uDAAkD;AAElD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,YAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,IAAA,+BAAa,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAA,+BAAa,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,IAAA,+BAAa,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,IAAA,+BAAa,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,IAAA,+BAAa,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function isWriteable(directory: string): Promise<boolean>;
2
+ //# sourceMappingURL=is-writeable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-writeable.d.ts","sourceRoot":"","sources":["../../src/helpers/is-writeable.ts"],"names":[],"mappings":"AAEA,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOrE"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isWriteable = isWriteable;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ async function isWriteable(directory) {
9
+ try {
10
+ await fs_1.default.promises.access(directory, fs_1.default.constants.W_OK);
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ //# sourceMappingURL=is-writeable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-writeable.js","sourceRoot":"","sources":["../../src/helpers/is-writeable.ts"],"names":[],"mappings":";;;;;AAEA,kCAOC;AATD,4CAAoB;AAEb,KAAK,UAAU,WAAW,CAAC,SAAiB;IACjD,IAAI,CAAC;QACH,MAAM,YAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,YAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/build/index.js ADDED
@@ -0,0 +1,213 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const commander_1 = require("commander");
8
+ const picocolors_1 = __importDefault(require("picocolors"));
9
+ const prompts_1 = __importDefault(require("prompts"));
10
+ const validate_npm_package_name_1 = __importDefault(require("validate-npm-package-name"));
11
+ const create_app_1 = require("./create-app");
12
+ const get_package_manager_1 = require("./helpers/get-package-manager");
13
+ const is_folder_empty_1 = require("./helpers/is-folder-empty");
14
+ const is_writeable_1 = require("./helpers/is-writeable");
15
+ const path_1 = __importDefault(require("path"));
16
+ const fs_1 = __importDefault(require("fs"));
17
+ const packageJson = JSON.parse(fs_1.default.readFileSync(path_1.default.join(__dirname, "..", "package.json"), "utf-8"));
18
+ async function main() {
19
+ const program = new commander_1.Command()
20
+ .name("create-joist-app")
21
+ .version(packageJson.version)
22
+ .description("Create a new Joist ORM project")
23
+ .argument("[project-directory]", "Directory to create the project in")
24
+ .option("-t, --template <template>", "Template to use (basic, graphql)", "basic")
25
+ .option("--use-yarn", "Use Yarn as the package manager")
26
+ .option("--use-npm", "Use npm as the package manager")
27
+ .option("--use-pnpm", "Use pnpm as the package manager")
28
+ .option("--use-bun", "Use Bun as the package manager")
29
+ .option("--skip-install", "Skip installing dependencies")
30
+ .option("-y, --yes", "Use default options (non-interactive mode)")
31
+ .option("--db-host <host>", "Database host", "localhost")
32
+ .option("--db-port <port>", "Database port", "5432")
33
+ .option("--db-user <user>", "Database user")
34
+ .option("--db-password <password>", "Database password", "local")
35
+ .option("--db-name <name>", "Database name")
36
+ .parse(process.argv);
37
+ const opts = program.opts();
38
+ let projectPath = program.args[0];
39
+ console.log();
40
+ console.log(picocolors_1.default.bold(picocolors_1.default.cyan("create-joist-app")), picocolors_1.default.gray(`v${packageJson.version}`));
41
+ console.log();
42
+ // Handle ctrl+c gracefully
43
+ prompts_1.default.override({ onCancel: () => process.exit(1) });
44
+ // Prompt for project directory if not provided
45
+ if (!projectPath) {
46
+ if (opts.yes) {
47
+ console.error(picocolors_1.default.red("Error: Project directory is required in non-interactive mode"));
48
+ process.exit(1);
49
+ }
50
+ const response = await (0, prompts_1.default)({
51
+ type: "text",
52
+ name: "projectPath",
53
+ message: "What is your project named?",
54
+ initial: "my-joist-app",
55
+ validate: (value) => {
56
+ const validation = (0, validate_npm_package_name_1.default)(path_1.default.basename(value));
57
+ if (!validation.validForNewPackages) {
58
+ return `Invalid project name: ${validation.errors?.[0] || validation.warnings?.[0]}`;
59
+ }
60
+ return true;
61
+ },
62
+ });
63
+ if (!response.projectPath) {
64
+ console.log(picocolors_1.default.red("Cancelled."));
65
+ process.exit(1);
66
+ }
67
+ projectPath = response.projectPath;
68
+ }
69
+ // Resolve absolute path
70
+ const resolvedPath = path_1.default.resolve(projectPath);
71
+ const projectName = path_1.default.basename(resolvedPath);
72
+ // Validate project name
73
+ const validation = (0, validate_npm_package_name_1.default)(projectName);
74
+ if (!validation.validForNewPackages) {
75
+ console.error(picocolors_1.default.red(`Invalid project name "${projectName}"`));
76
+ console.error(picocolors_1.default.red(validation.errors?.[0] || validation.warnings?.[0] || "Unknown error"));
77
+ process.exit(1);
78
+ }
79
+ // Check if directory is writeable
80
+ const parentDir = path_1.default.dirname(resolvedPath);
81
+ if (!fs_1.default.existsSync(parentDir)) {
82
+ console.error(picocolors_1.default.red(`Parent directory does not exist: ${parentDir}`));
83
+ process.exit(1);
84
+ }
85
+ if (!(await (0, is_writeable_1.isWriteable)(parentDir))) {
86
+ console.error(picocolors_1.default.red(`Cannot write to directory: ${parentDir}`));
87
+ process.exit(1);
88
+ }
89
+ // Create directory if it doesn't exist
90
+ if (!fs_1.default.existsSync(resolvedPath)) {
91
+ fs_1.default.mkdirSync(resolvedPath, { recursive: true });
92
+ }
93
+ // Check if directory is empty
94
+ if (!(0, is_folder_empty_1.isFolderEmpty)(resolvedPath)) {
95
+ console.error(picocolors_1.default.red(`Directory is not empty: ${resolvedPath}`));
96
+ process.exit(1);
97
+ }
98
+ // Determine template
99
+ let template = opts.template || "basic";
100
+ if (!opts.yes && !opts.template) {
101
+ const response = await (0, prompts_1.default)({
102
+ type: "select",
103
+ name: "template",
104
+ message: "Which template would you like to use?",
105
+ choices: [
106
+ { title: "Basic", value: "basic", description: "A minimal Joist project with entities" },
107
+ {
108
+ title: "GraphQL",
109
+ value: "graphql",
110
+ description: "Joist with GraphQL server and resolvers",
111
+ },
112
+ ],
113
+ initial: 0,
114
+ });
115
+ if (!response.template) {
116
+ console.log(picocolors_1.default.red("Cancelled."));
117
+ process.exit(1);
118
+ }
119
+ template = response.template;
120
+ }
121
+ // Determine package manager
122
+ let packageManager;
123
+ if (opts.useYarn) {
124
+ packageManager = "yarn";
125
+ }
126
+ else if (opts.useNpm) {
127
+ packageManager = "npm";
128
+ }
129
+ else if (opts.usePnpm) {
130
+ packageManager = "pnpm";
131
+ }
132
+ else if (opts.useBun) {
133
+ packageManager = "bun";
134
+ }
135
+ else {
136
+ packageManager = (0, get_package_manager_1.getPackageManager)();
137
+ }
138
+ // Get database configuration
139
+ let dbConfig = {
140
+ host: opts.dbHost || "localhost",
141
+ port: opts.dbPort || "5432",
142
+ user: opts.dbUser || projectName.replace(/-/g, "_") + "_user",
143
+ password: opts.dbPassword || "local",
144
+ name: opts.dbName || projectName.replace(/-/g, "_"),
145
+ };
146
+ if (!opts.yes) {
147
+ const response = await (0, prompts_1.default)([
148
+ {
149
+ type: "text",
150
+ name: "dbName",
151
+ message: "Database name:",
152
+ initial: dbConfig.name,
153
+ },
154
+ {
155
+ type: "text",
156
+ name: "dbUser",
157
+ message: "Database user:",
158
+ initial: dbConfig.user,
159
+ },
160
+ ]);
161
+ if (response.dbName === undefined) {
162
+ console.log(picocolors_1.default.red("Cancelled."));
163
+ process.exit(1);
164
+ }
165
+ dbConfig = {
166
+ ...dbConfig,
167
+ name: response.dbName || dbConfig.name,
168
+ user: response.dbUser || dbConfig.user,
169
+ };
170
+ }
171
+ console.log();
172
+ console.log(`Creating a new Joist app in ${picocolors_1.default.green(resolvedPath)}`);
173
+ console.log();
174
+ try {
175
+ await (0, create_app_1.createApp)({
176
+ projectPath: resolvedPath,
177
+ projectName,
178
+ template,
179
+ packageManager,
180
+ skipInstall: opts.skipInstall || false,
181
+ dbConfig,
182
+ });
183
+ console.log();
184
+ console.log(picocolors_1.default.green("Success!"), `Created ${picocolors_1.default.bold(projectName)} at ${resolvedPath}`);
185
+ console.log();
186
+ console.log("Inside that directory, you can run several commands:");
187
+ console.log();
188
+ console.log(picocolors_1.default.cyan(` ${packageManager}${packageManager === "npm" ? " run" : ""} db`));
189
+ console.log(" Start the database, run migrations, and generate code.");
190
+ console.log();
191
+ console.log(picocolors_1.default.cyan(` ${packageManager}${packageManager === "npm" ? " run" : ""} test`));
192
+ console.log(" Run the test suite.");
193
+ console.log();
194
+ console.log(picocolors_1.default.cyan(` ${packageManager}${packageManager === "npm" ? " run" : ""} build`));
195
+ console.log(" Build the project for production.");
196
+ console.log();
197
+ console.log("We suggest that you begin by typing:");
198
+ console.log();
199
+ console.log(picocolors_1.default.cyan(` cd ${projectPath}`));
200
+ console.log(picocolors_1.default.cyan(` ${packageManager}${packageManager === "npm" ? " run" : ""} db`));
201
+ console.log();
202
+ }
203
+ catch (error) {
204
+ console.error(picocolors_1.default.red("Error creating project:"));
205
+ console.error(error instanceof Error ? error.message : error);
206
+ process.exit(1);
207
+ }
208
+ }
209
+ main().catch((error) => {
210
+ console.error(error);
211
+ process.exit(1);
212
+ });
213
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function replaceSentinelValues(dirPath: string, replacements: Record<string, string>): void;
2
+ //# sourceMappingURL=replace-sentinels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-sentinels.d.ts","sourceRoot":"","sources":["../src/replace-sentinels.ts"],"names":[],"mappings":"AAGA,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CA0BjG"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.replaceSentinelValues = replaceSentinelValues;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ function replaceSentinelValues(dirPath, replacements) {
10
+ const entries = fs_1.default.readdirSync(dirPath, { withFileTypes: true });
11
+ for (const entry of entries) {
12
+ const fullPath = path_1.default.join(dirPath, entry.name);
13
+ if (entry.isDirectory()) {
14
+ if (entry.name !== "node_modules" && entry.name !== ".git" && entry.name !== "codegen") {
15
+ replaceSentinelValues(fullPath, replacements);
16
+ }
17
+ }
18
+ else if (isTextFile(entry.name)) {
19
+ let content = fs_1.default.readFileSync(fullPath, "utf-8");
20
+ let modified = false;
21
+ for (const [sentinel, replacement] of Object.entries(replacements)) {
22
+ if (content.includes(sentinel)) {
23
+ content = content.split(sentinel).join(replacement);
24
+ modified = true;
25
+ }
26
+ }
27
+ if (modified) {
28
+ fs_1.default.writeFileSync(fullPath, content);
29
+ }
30
+ }
31
+ }
32
+ }
33
+ function isTextFile(filename) {
34
+ const textExtensions = [
35
+ ".ts",
36
+ ".tsx",
37
+ ".js",
38
+ ".jsx",
39
+ ".json",
40
+ ".md",
41
+ ".yml",
42
+ ".yaml",
43
+ ".env",
44
+ ".gitignore",
45
+ ".dockerignore",
46
+ ".sql",
47
+ ".graphql",
48
+ ".gql",
49
+ ".sh",
50
+ ".template",
51
+ ];
52
+ const basename = path_1.default.basename(filename).toLowerCase();
53
+ if (basename === "dockerfile" || basename === "db.dockerfile" || basename === "gitignore" || basename === ".env") {
54
+ return true;
55
+ }
56
+ const ext = path_1.default.extname(filename).toLowerCase();
57
+ return textExtensions.includes(ext);
58
+ }
59
+ //# sourceMappingURL=replace-sentinels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-sentinels.js","sourceRoot":"","sources":["../src/replace-sentinels.ts"],"names":[],"mappings":";;;;;AAGA,sDA0BC;AA7BD,4CAAoB;AACpB,gDAAwB;AAExB,SAAgB,qBAAqB,CAAC,OAAe,EAAE,YAAoC;IACzF,MAAM,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvF,qBAAqB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,IAAI,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACjD,IAAI,QAAQ,GAAG,KAAK,CAAC;YAErB,KAAK,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;gBACnE,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBACpD,QAAQ,GAAG,IAAI,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,YAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB;IAClC,MAAM,cAAc,GAAG;QACrB,KAAK;QACL,MAAM;QACN,KAAK;QACL,MAAM;QACN,OAAO;QACP,KAAK;QACL,MAAM;QACN,OAAO;QACP,MAAM;QACN,YAAY;QACZ,eAAe;QACf,MAAM;QACN,UAAU;QACV,MAAM;QACN,KAAK;QACL,WAAW;KACZ,CAAC;IAEF,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAEvD,IAAI,QAAQ,KAAK,YAAY,IAAI,QAAQ,KAAK,eAAe,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACjH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,OAAO,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function updatePackageJson(projectPath: string, projectName: string): void;
2
+ //# sourceMappingURL=update-package-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-package-json.d.ts","sourceRoot":"","sources":["../src/update-package-json.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAehF"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.updatePackageJson = updatePackageJson;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ function updatePackageJson(projectPath, projectName) {
10
+ const pkgJsonPath = path_1.default.join(projectPath, "package.json");
11
+ if (!fs_1.default.existsSync(pkgJsonPath))
12
+ return;
13
+ const pkgJson = JSON.parse(fs_1.default.readFileSync(pkgJsonPath, "utf-8"));
14
+ pkgJson.name = projectName;
15
+ // Add db/migration scripts that reference the user's DB config
16
+ pkgJson.scripts = {
17
+ ...pkgJson.scripts,
18
+ db: "docker compose up -d --wait db && yarn migrate && yarn codegen",
19
+ redb: "docker compose exec db ./reset.sh && yarn migrate && yarn codegen",
20
+ migrate: "env-cmd joist-pg-migrate",
21
+ "migrate:new": "env-cmd joist-pg-migrate create",
22
+ };
23
+ fs_1.default.writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + "\n");
24
+ }
25
+ //# sourceMappingURL=update-package-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-package-json.js","sourceRoot":"","sources":["../src/update-package-json.ts"],"names":[],"mappings":";;;;;AAEA,8CAeC;AAjBD,4CAAoB;AACpB,gDAAwB;AACxB,SAAgB,iBAAiB,CAAC,WAAmB,EAAE,WAAmB;IACxE,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC3D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO;IAExC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,GAAG,WAAW,CAAC;IAC3B,+DAA+D;IAC/D,OAAO,CAAC,OAAO,GAAG;QAChB,GAAG,OAAO,CAAC,OAAO;QAClB,EAAE,EAAE,gEAAgE;QACpE,IAAI,EAAE,mEAAmE;QACzE,OAAO,EAAE,0BAA0B;QACnC,aAAa,EAAE,iCAAiC;KACjD,CAAC;IACF,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACzE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "create-joist-app",
3
+ "version": "0.0.1",
4
+ "description": "Create a new Joist ORM project with a single command",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/joist-orm/joist-orm.git",
9
+ "directory": "packages/create-joist-app"
10
+ },
11
+ "keywords": [
12
+ "joist",
13
+ "orm",
14
+ "typescript",
15
+ "postgresql",
16
+ "scaffolding",
17
+ "cli"
18
+ ],
19
+ "main": "build/index.js",
20
+ "types": "build/index.d.ts",
21
+ "bin": "./build/index.js",
22
+ "files": [
23
+ "build",
24
+ "templates"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "test": "jest",
29
+ "test:scaffolded": "./scripts/test-scaffolded-project.sh",
30
+ "prepublishOnly": "../../scripts/prepublish.sh",
31
+ "format": "prettier --write 'src/**/*.{ts,js}'"
32
+ },
33
+ "dependencies": {
34
+ "commander": "^12.1.0",
35
+ "picocolors": "^1.1.1",
36
+ "prompts": "^2.4.2",
37
+ "validate-npm-package-name": "^6.0.2"
38
+ },
39
+ "devDependencies": {
40
+ "@swc/core": "^1.15.18",
41
+ "@swc/jest": "^0.2.39",
42
+ "@tsconfig/node20": "^20.1.9",
43
+ "@types/jest": "^30.0.0",
44
+ "@types/node": "^24.11.0",
45
+ "@types/prompts": "^2.4.9",
46
+ "@types/validate-npm-package-name": "^4.0.2",
47
+ "jest": "30.2.0",
48
+ "prettier": "^3.8.1",
49
+ "prettier-plugin-organize-imports": "^4.3.0",
50
+ "typescript": "5.9.3"
51
+ },
52
+ "engines": {
53
+ "node": ">=18.0.0"
54
+ }
55
+ }
@@ -0,0 +1,70 @@
1
+ # {{PROJECT_NAME}}
2
+
3
+ A [Joist ORM](https://joist-orm.io/) project.
4
+
5
+ ## Getting Started
6
+
7
+ ### Prerequisites
8
+
9
+ - Node.js 18+
10
+ - Docker (for PostgreSQL)
11
+
12
+ ### Setup
13
+
14
+ 1. Start the database and run initial setup:
15
+
16
+ ```bash
17
+ yarn db
18
+ ```
19
+
20
+ This command will:
21
+ - Start a PostgreSQL container
22
+ - Run database migrations
23
+ - Generate Joist entity code
24
+
25
+ ### Development
26
+
27
+ #### Running Tests
28
+
29
+ ```bash
30
+ yarn test
31
+ ```
32
+
33
+ #### Creating a New Migration
34
+
35
+ ```bash
36
+ yarn migrate:new my-migration-name
37
+ ```
38
+
39
+ Then edit the generated file in `migrations/` and run:
40
+
41
+ ```bash
42
+ yarn migrate
43
+ yarn codegen
44
+ ```
45
+
46
+ #### Resetting the Database
47
+
48
+ ```bash
49
+ yarn redb
50
+ ```
51
+
52
+ ### Project Structure
53
+
54
+ ```
55
+ ├── migrations/ # Database migrations
56
+ ├── src/
57
+ │ ├── entities/ # Joist entities
58
+ │ │ ├── codegen/ # Generated code (do not edit)
59
+ │ │ └── factories/ # Test factories
60
+ │ ├── context.ts # Request context
61
+ │ ├── setupTestEnv.ts # Global test setup
62
+ │ └── setupTests.ts # Per-suite test setup
63
+ ├── docker-compose.yml # PostgreSQL service
64
+ └── joist-config.json # Joist configuration
65
+ ```
66
+
67
+ ## Learn More
68
+
69
+ - [Joist Documentation](https://joist-orm.io/)
70
+ - [GitHub Repository](https://github.com/joist-orm/joist-orm)
@@ -0,0 +1,28 @@
1
+ # Dependencies
2
+ node_modules/
3
+
4
+ # Build output
5
+ build/
6
+ dist/
7
+
8
+ # IDE
9
+ .idea/
10
+ .vscode/
11
+ *.swp
12
+ *.swo
13
+
14
+ # OS
15
+ .DS_Store
16
+ Thumbs.db
17
+
18
+ # Test output
19
+ coverage/
20
+
21
+ # Logs
22
+ *.log
23
+ npm-debug.log*
24
+ yarn-debug.log*
25
+ yarn-error.log*
26
+
27
+ # TypeScript
28
+ *.tsbuildinfo
@@ -0,0 +1,14 @@
1
+ /** @type {import('jest').Config} */
2
+ module.exports = {
3
+ transform: {
4
+ "^.+\\.tsx?$": "@swc/jest",
5
+ },
6
+ moduleNameMapper: {
7
+ "^src/(.*)$": "<rootDir>/src/$1",
8
+ },
9
+ testMatch: ["<rootDir>/src/**/*.test.{ts,tsx}"],
10
+ testEnvironment: "node",
11
+ globalSetup: "./src/setupTestEnv.ts",
12
+ setupFilesAfterEnv: ["./src/setupTests.ts"],
13
+ maxWorkers: 1,
14
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "contextType": "Context@src/context",
3
+ "entities": { "Author": { "tag": "a" }, "Book": { "tag": "b" } },
4
+ "entitiesDirectory": "./src/entities",
5
+ "idType": "tagged-string",
6
+ "version": "0.0.0"
7
+ }
@@ -0,0 +1,22 @@
1
+ import {
2
+ createCreatedAtFunction,
3
+ createEntityTable,
4
+ createUpdatedAtFunction,
5
+ foreignKey,
6
+ } from "joist-migration-utils";
7
+ import { MigrationBuilder } from "node-pg-migrate";
8
+
9
+ export function up(b: MigrationBuilder): void {
10
+ createUpdatedAtFunction(b);
11
+ createCreatedAtFunction(b);
12
+
13
+ createEntityTable(b, "authors", {
14
+ first_name: { type: "varchar(255)", notNull: true },
15
+ last_name: { type: "varchar(255)", notNull: false },
16
+ });
17
+
18
+ createEntityTable(b, "books", {
19
+ title: { type: "varchar(255)", notNull: true },
20
+ author_id: foreignKey("authors", { notNull: true }),
21
+ });
22
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "basic-template",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "build": "tsc",
7
+ "test": "env-cmd jest --runInBand",
8
+ "codegen": "env-cmd yarn joist-codegen",
9
+ "format": "prettier --write \"src/**/*.{ts,tsx}\""
10
+ },
11
+ "dependencies": {
12
+ "@types/pg": "^8.18.0",
13
+ "joist-orm": "2.0.3-next.36",
14
+ "pg": "^8.16.3"
15
+ },
16
+ "devDependencies": {
17
+ "@swc/core": "^1.13.0",
18
+ "@swc/jest": "^0.2.39",
19
+ "@types/jest": "^30.0.0",
20
+ "@types/node": "^24.0.0",
21
+ "env-cmd": "^11.0.0",
22
+ "jest": "^30.0.0",
23
+ "node-pg-migrate": "^8.0.4",
24
+ "prettier": "^3.6.0",
25
+ "tsx": "^4.20.0",
26
+ "typescript": "^5.9.0"
27
+ }
28
+ }