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,18 @@
1
+ import type { PackageManager } from "./helpers/get-package-manager";
2
+ export interface DbConfig {
3
+ host: string;
4
+ port: string;
5
+ user: string;
6
+ password: string;
7
+ name: string;
8
+ }
9
+ export interface CreateAppOptions {
10
+ projectPath: string;
11
+ projectName: string;
12
+ template: "basic" | "graphql";
13
+ packageManager: PackageManager;
14
+ skipInstall: boolean;
15
+ dbConfig: DbConfig;
16
+ }
17
+ export declare function createApp(options: CreateAppOptions): Promise<void>;
18
+ //# sourceMappingURL=create-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-app.d.ts","sourceRoot":"","sources":["../src/create-app.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAKpE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAUD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DxE"}
@@ -0,0 +1,73 @@
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.createApp = createApp;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const picocolors_1 = __importDefault(require("picocolors"));
10
+ const create_db_dockerfile_1 = require("./create-db-dockerfile");
11
+ const create_docker_compose_1 = require("./create-docker-compose");
12
+ const create_env_1 = require("./create-env");
13
+ const copy_1 = require("./helpers/copy");
14
+ const install_1 = require("./helpers/install");
15
+ const replace_sentinels_1 = require("./replace-sentinels");
16
+ const update_package_json_1 = require("./update-package-json");
17
+ const templateNameMap = {
18
+ basic: "basic-template",
19
+ graphql: "graphql-template",
20
+ };
21
+ /** Directories/files to skip when copying templates to a new project. */
22
+ const SKIP_ENTRIES = new Set(["node_modules", "build", "codegen", ".env", ".tsbuildinfo"]);
23
+ async function createApp(options) {
24
+ const { projectPath, projectName, template, packageManager, skipInstall, dbConfig } = options;
25
+ // Determine template directory - check for published templates/ first, then packages/
26
+ const templatePkgName = templateNameMap[template];
27
+ let templateDir = path_1.default.join(__dirname, "..", "templates", template);
28
+ if (!fs_1.default.existsSync(templateDir)) {
29
+ // Dev mode: templates live in sibling packages
30
+ templateDir = path_1.default.join(__dirname, "..", "..", templatePkgName);
31
+ }
32
+ if (!fs_1.default.existsSync(templateDir)) {
33
+ throw new Error(`Template "${template}" not found`);
34
+ }
35
+ console.log(`Using template: ${picocolors_1.default.cyan(template)}`);
36
+ console.log(`Using package manager: ${picocolors_1.default.cyan(packageManager)}`);
37
+ console.log();
38
+ // Copy template files (skipping dev-only dirs)
39
+ console.log("Copying template files...");
40
+ (0, copy_1.copyDirectory)(templateDir, projectPath, SKIP_ENTRIES);
41
+ // Rename .gitignore handling: the template package has .gitignore,
42
+ // but npm publish strips it; also check for "gitignore" fallback
43
+ const gitignorePath = path_1.default.join(projectPath, "gitignore");
44
+ const dotGitignorePath = path_1.default.join(projectPath, ".gitignore");
45
+ if (fs_1.default.existsSync(gitignorePath) && !fs_1.default.existsSync(dotGitignorePath)) {
46
+ fs_1.default.renameSync(gitignorePath, dotGitignorePath);
47
+ }
48
+ // Generate .env file with user's DB config
49
+ (0, create_env_1.createEnv)(projectPath, { template, dbConfig });
50
+ // Generate docker-compose.yml with user's DB config
51
+ (0, create_docker_compose_1.createDockerCompose)(projectPath, dbConfig);
52
+ // Generate db.dockerfile
53
+ (0, create_db_dockerfile_1.createDbDockerfile)(projectPath);
54
+ // Replace the template package name with the user's project name in all text files.
55
+ // DB values are NOT replaced via sentinel matching (too fragile — "joist" appears in
56
+ // package names). Instead, .env, docker-compose.yml, db.dockerfile, and package.json
57
+ // scripts are all generated/updated inline above and below.
58
+ (0, replace_sentinels_1.replaceSentinelValues)(projectPath, { [templatePkgName]: projectName });
59
+ // Update package.json with project name and add scaffolding scripts
60
+ (0, update_package_json_1.updatePackageJson)(projectPath, projectName);
61
+ // Add package manager specific files
62
+ if (packageManager === "yarn") {
63
+ fs_1.default.writeFileSync(path_1.default.join(projectPath, ".yarnrc.yml"), "nodeLinker: node-modules\n");
64
+ }
65
+ // Install dependencies
66
+ if (!skipInstall) {
67
+ console.log();
68
+ console.log("Installing dependencies...");
69
+ console.log();
70
+ await (0, install_1.install)(packageManager, projectPath);
71
+ }
72
+ }
73
+ //# sourceMappingURL=create-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-app.js","sourceRoot":"","sources":["../src/create-app.ts"],"names":[],"mappings":";;;;;AAqCA,8BA6DC;AAlGD,4CAAoB;AACpB,gDAAwB;AACxB,4DAA4B;AAC5B,iEAA4D;AAC5D,mEAA8D;AAC9D,6CAAyC;AACzC,yCAA+C;AAE/C,+CAA4C;AAC5C,2DAA4D;AAC5D,+DAA0D;AAmB1D,MAAM,eAAe,GAA2B;IAC9C,KAAK,EAAE,gBAAgB;IACvB,OAAO,EAAE,kBAAkB;CAC5B,CAAC;AAEF,yEAAyE;AACzE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AAEpF,KAAK,UAAU,SAAS,CAAC,OAAyB;IACvD,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE9F,sFAAsF;IACtF,MAAM,eAAe,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACpE,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,+CAA+C;QAC/C,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,aAAa,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,oBAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,0BAA0B,oBAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,+CAA+C;IAC/C,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,IAAA,oBAAa,EAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAEtD,mEAAmE;IACnE,iEAAiE;IACjE,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC9D,IAAI,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrE,YAAE,CAAC,UAAU,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IACjD,CAAC;IAED,2CAA2C;IAC3C,IAAA,sBAAS,EAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE/C,oDAAoD;IACpD,IAAA,2CAAmB,EAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAE3C,yBAAyB;IACzB,IAAA,yCAAkB,EAAC,WAAW,CAAC,CAAC;IAEhC,oFAAoF;IACpF,qFAAqF;IACrF,qFAAqF;IACrF,4DAA4D;IAC5D,IAAA,yCAAqB,EAAC,WAAW,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAEvE,oEAAoE;IACpE,IAAA,uCAAiB,EAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAE5C,qCAAqC;IACrC,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QAC9B,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,4BAA4B,CAAC,CAAC;IACxF,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,IAAA,iBAAO,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=create-app.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-app.test.d.ts","sourceRoot":"","sources":["../src/create-app.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,176 @@
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 create_app_1 = require("./create-app");
10
+ describe("createApp", () => {
11
+ let tempDir;
12
+ beforeEach(() => {
13
+ tempDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), "create-joist-app-test-"));
14
+ });
15
+ afterEach(() => {
16
+ fs_1.default.rmSync(tempDir, { recursive: true, force: true });
17
+ });
18
+ describe("basic template", () => {
19
+ it("creates all expected files", async () => {
20
+ const projectPath = path_1.default.join(tempDir, "test-project");
21
+ fs_1.default.mkdirSync(projectPath);
22
+ await (0, create_app_1.createApp)({
23
+ projectPath,
24
+ projectName: "test-project",
25
+ template: "basic",
26
+ packageManager: "yarn",
27
+ skipInstall: true,
28
+ dbConfig: {
29
+ host: "localhost",
30
+ port: "5432",
31
+ user: "test_user",
32
+ password: "test_password",
33
+ name: "test_db",
34
+ },
35
+ });
36
+ // Check essential files exist
37
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "package.json"))).toBe(true);
38
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "tsconfig.json"))).toBe(true);
39
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "jest.config.js"))).toBe(true);
40
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "joist-config.json"))).toBe(true);
41
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "docker-compose.yml"))).toBe(true);
42
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, ".env"))).toBe(true);
43
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, ".gitignore"))).toBe(true);
44
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, ".yarnrc.yml"))).toBe(true);
45
+ // Check source files
46
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "src/context.ts"))).toBe(true);
47
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "src/entities/Author.ts"))).toBe(true);
48
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "src/entities/Book.ts"))).toBe(true);
49
+ // Check migrations
50
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "migrations"))).toBe(true);
51
+ const migrations = fs_1.default.readdirSync(path_1.default.join(projectPath, "migrations"));
52
+ expect(migrations.length).toBeGreaterThan(0);
53
+ });
54
+ it("substitutes template variables", async () => {
55
+ const projectPath = path_1.default.join(tempDir, "my-app");
56
+ fs_1.default.mkdirSync(projectPath);
57
+ await (0, create_app_1.createApp)({
58
+ projectPath,
59
+ projectName: "my-app",
60
+ template: "basic",
61
+ packageManager: "yarn",
62
+ skipInstall: true,
63
+ dbConfig: {
64
+ host: "localhost",
65
+ port: "5432",
66
+ user: "my_app_user",
67
+ password: "secret",
68
+ name: "my_app_db",
69
+ },
70
+ });
71
+ // Check package.json has project name
72
+ const pkgJson = JSON.parse(fs_1.default.readFileSync(path_1.default.join(projectPath, "package.json"), "utf-8"));
73
+ expect(pkgJson.name).toBe("my-app");
74
+ // Check .env has correct database URL
75
+ const envContent = fs_1.default.readFileSync(path_1.default.join(projectPath, ".env"), "utf-8");
76
+ expect(envContent).toContain("my_app_user");
77
+ expect(envContent).toContain("my_app_db");
78
+ expect(envContent).toContain("secret");
79
+ // Check docker-compose has correct user
80
+ const dockerCompose = fs_1.default.readFileSync(path_1.default.join(projectPath, "docker-compose.yml"), "utf-8");
81
+ expect(dockerCompose).toContain("my_app_user");
82
+ expect(dockerCompose).toContain("my_app_db");
83
+ });
84
+ it("does not create .yarnrc.yml for npm", async () => {
85
+ const projectPath = path_1.default.join(tempDir, "npm-project");
86
+ fs_1.default.mkdirSync(projectPath);
87
+ await (0, create_app_1.createApp)({
88
+ projectPath,
89
+ projectName: "npm-project",
90
+ template: "basic",
91
+ packageManager: "npm",
92
+ skipInstall: true,
93
+ dbConfig: {
94
+ host: "localhost",
95
+ port: "5432",
96
+ user: "test_user",
97
+ password: "test_password",
98
+ name: "test_db",
99
+ },
100
+ });
101
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, ".yarnrc.yml"))).toBe(false);
102
+ });
103
+ });
104
+ describe("graphql template", () => {
105
+ it("creates all expected files", async () => {
106
+ const projectPath = path_1.default.join(tempDir, "graphql-project");
107
+ fs_1.default.mkdirSync(projectPath);
108
+ await (0, create_app_1.createApp)({
109
+ projectPath,
110
+ projectName: "graphql-project",
111
+ template: "graphql",
112
+ packageManager: "yarn",
113
+ skipInstall: true,
114
+ dbConfig: {
115
+ host: "localhost",
116
+ port: "5432",
117
+ user: "test_user",
118
+ password: "test_password",
119
+ name: "test_db",
120
+ },
121
+ });
122
+ // Check basic files
123
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "package.json"))).toBe(true);
124
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "joist-config.json"))).toBe(true);
125
+ // Check GraphQL-specific files
126
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "codegen.yml"))).toBe(true);
127
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "src/schema.graphql"))).toBe(true);
128
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "src/server.ts"))).toBe(true);
129
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "src/resolvers/index.ts"))).toBe(true);
130
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "src/resolvers/authorResolvers.ts"))).toBe(true);
131
+ expect(fs_1.default.existsSync(path_1.default.join(projectPath, "src/resolvers/bookResolvers.ts"))).toBe(true);
132
+ });
133
+ it("includes graphql codegen plugin in joist-config", async () => {
134
+ const projectPath = path_1.default.join(tempDir, "graphql-project");
135
+ fs_1.default.mkdirSync(projectPath);
136
+ await (0, create_app_1.createApp)({
137
+ projectPath,
138
+ projectName: "graphql-project",
139
+ template: "graphql",
140
+ packageManager: "yarn",
141
+ skipInstall: true,
142
+ dbConfig: {
143
+ host: "localhost",
144
+ port: "5432",
145
+ user: "test_user",
146
+ password: "test_password",
147
+ name: "test_db",
148
+ },
149
+ });
150
+ const joistConfig = JSON.parse(fs_1.default.readFileSync(path_1.default.join(projectPath, "joist-config.json"), "utf-8"));
151
+ expect(joistConfig.codegenPlugins).toContain("joist-graphql-codegen");
152
+ });
153
+ it("includes apollo server dependency", async () => {
154
+ const projectPath = path_1.default.join(tempDir, "graphql-project");
155
+ fs_1.default.mkdirSync(projectPath);
156
+ await (0, create_app_1.createApp)({
157
+ projectPath,
158
+ projectName: "graphql-project",
159
+ template: "graphql",
160
+ packageManager: "yarn",
161
+ skipInstall: true,
162
+ dbConfig: {
163
+ host: "localhost",
164
+ port: "5432",
165
+ user: "test_user",
166
+ password: "test_password",
167
+ name: "test_db",
168
+ },
169
+ });
170
+ const pkgJson = JSON.parse(fs_1.default.readFileSync(path_1.default.join(projectPath, "package.json"), "utf-8"));
171
+ expect(pkgJson.dependencies["@apollo/server"]).toBeDefined();
172
+ expect(pkgJson.dependencies["graphql"]).toBeDefined();
173
+ });
174
+ });
175
+ });
176
+ //# sourceMappingURL=create-app.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-app.test.js","sourceRoot":"","sources":["../src/create-app.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function createDbDockerfile(projectPath: string): void;
2
+ //# sourceMappingURL=create-db-dockerfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-db-dockerfile.d.ts","sourceRoot":"","sources":["../src/create-db-dockerfile.ts"],"names":[],"mappings":"AAGA,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAiC5D"}
@@ -0,0 +1,43 @@
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.createDbDockerfile = createDbDockerfile;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ function createDbDockerfile(projectPath) {
10
+ const dbDockerfile = `FROM postgres:16
11
+
12
+ # Script to reset the database
13
+ COPY <<EOF /docker-entrypoint-initdb.d/reset.sh
14
+ #!/bin/bash
15
+ set -e
16
+ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname postgres <<-EOSQL
17
+ DROP DATABASE IF EXISTS "$POSTGRES_DB";
18
+ CREATE DATABASE "$POSTGRES_DB";
19
+ EOSQL
20
+ EOF
21
+ RUN chmod +x /docker-entrypoint-initdb.d/reset.sh
22
+
23
+ # Copy reset script to accessible location
24
+ COPY <<EOF /reset.sh
25
+ #!/bin/bash
26
+ set -e
27
+ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname postgres <<-EOSQL
28
+ DROP DATABASE IF EXISTS "$POSTGRES_DB";
29
+ CREATE DATABASE "$POSTGRES_DB";
30
+ EOSQL
31
+ EOF
32
+ RUN chmod +x /reset.sh
33
+
34
+ # Console script for easy database access
35
+ COPY <<EOF /console.sh
36
+ #!/bin/bash
37
+ psql -U "$POSTGRES_USER" -d "$POSTGRES_DB"
38
+ EOF
39
+ RUN chmod +x /console.sh
40
+ `;
41
+ fs_1.default.writeFileSync(path_1.default.join(projectPath, "db.dockerfile"), dbDockerfile);
42
+ }
43
+ //# sourceMappingURL=create-db-dockerfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-db-dockerfile.js","sourceRoot":"","sources":["../src/create-db-dockerfile.ts"],"names":[],"mappings":";;;;;AAGA,gDAiCC;AApCD,4CAAoB;AACpB,gDAAwB;AAExB,SAAgB,kBAAkB,CAAC,WAAmB;IACpD,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BtB,CAAC;IACA,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,YAAY,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DbConfig } from "./create-app";
2
+ export declare function createDockerCompose(projectPath: string, dbConfig: DbConfig): void;
3
+ //# sourceMappingURL=create-docker-compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-docker-compose.d.ts","sourceRoot":"","sources":["../src/create-docker-compose.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAyBjF"}
@@ -0,0 +1,35 @@
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.createDockerCompose = createDockerCompose;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ function createDockerCompose(projectPath, dbConfig) {
10
+ const dockerCompose = `services:
11
+ db:
12
+ build:
13
+ context: .
14
+ dockerfile: db.dockerfile
15
+ ports:
16
+ - "${dbConfig.port}:5432"
17
+ environment:
18
+ POSTGRES_USER: ${dbConfig.user}
19
+ POSTGRES_PASSWORD: ${dbConfig.password}
20
+ POSTGRES_DB: ${dbConfig.name}
21
+ command: ["postgres", "-c", "fsync=off", "-c", "log_statement=all"]
22
+ volumes:
23
+ - db_data:/var/lib/postgresql/data
24
+ healthcheck:
25
+ test: ["CMD-SHELL", "pg_isready -U ${dbConfig.user} -d ${dbConfig.name}"]
26
+ interval: 5s
27
+ timeout: 5s
28
+ retries: 5
29
+
30
+ volumes:
31
+ db_data:
32
+ `;
33
+ fs_1.default.writeFileSync(path_1.default.join(projectPath, "docker-compose.yml"), dockerCompose);
34
+ }
35
+ //# sourceMappingURL=create-docker-compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-docker-compose.js","sourceRoot":"","sources":["../src/create-docker-compose.ts"],"names":[],"mappings":";;;;;AAIA,kDAyBC;AA7BD,4CAAoB;AACpB,gDAAwB;AAGxB,SAAgB,mBAAmB,CAAC,WAAmB,EAAE,QAAkB;IACzE,MAAM,aAAa,GAAG;;;;;;WAMb,QAAQ,CAAC,IAAI;;uBAED,QAAQ,CAAC,IAAI;2BACT,QAAQ,CAAC,QAAQ;qBACvB,QAAQ,CAAC,IAAI;;;;;2CAKS,QAAQ,CAAC,IAAI,OAAO,QAAQ,CAAC,IAAI;;;;;;;CAO3E,CAAC;IACA,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,EAAE,aAAa,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CreateAppOptions } from "./create-app";
2
+ export declare function createEnv(projectPath: string, options: Pick<CreateAppOptions, "template" | "dbConfig">): void;
3
+ //# sourceMappingURL=create-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-env.d.ts","sourceRoot":"","sources":["../src/create-env.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,GAAG,UAAU,CAAC,GAAG,IAAI,CAO7G"}
@@ -0,0 +1,16 @@
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.createEnv = createEnv;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ function createEnv(projectPath, options) {
10
+ const { template, dbConfig } = options;
11
+ const envContent = template === "graphql"
12
+ ? `DATABASE_URL=postgres://${dbConfig.user}:${dbConfig.password}@${dbConfig.host}:${dbConfig.port}/${dbConfig.name}\nPORT=4000\n`
13
+ : `DATABASE_URL=postgres://${dbConfig.user}:${dbConfig.password}@${dbConfig.host}:${dbConfig.port}/${dbConfig.name}\n`;
14
+ fs_1.default.writeFileSync(path_1.default.join(projectPath, ".env"), envContent);
15
+ }
16
+ //# sourceMappingURL=create-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-env.js","sourceRoot":"","sources":["../src/create-env.ts"],"names":[],"mappings":";;;;;AAIA,8BAOC;AAXD,4CAAoB;AACpB,gDAAwB;AAGxB,SAAgB,SAAS,CAAC,WAAmB,EAAE,OAAwD;IACrG,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,UAAU,GACd,QAAQ,KAAK,SAAS;QACpB,CAAC,CAAC,2BAA2B,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,eAAe;QACjI,CAAC,CAAC,2BAA2B,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,IAAI,CAAC;IAC3H,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function copyDirectory(src: string, dest: string, skip?: Set<string>): void;
2
+ export declare function copyFile(src: string, dest: string): void;
3
+ //# sourceMappingURL=copy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/helpers/copy.ts"],"names":[],"mappings":"AAGA,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAiBjF;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAMxD"}
@@ -0,0 +1,33 @@
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.copyDirectory = copyDirectory;
7
+ exports.copyFile = copyFile;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ function copyDirectory(src, dest, skip) {
11
+ fs_1.default.mkdirSync(dest, { recursive: true });
12
+ const entries = fs_1.default.readdirSync(src, { withFileTypes: true });
13
+ for (const entry of entries) {
14
+ if (skip?.has(entry.name))
15
+ continue;
16
+ const srcPath = path_1.default.join(src, entry.name);
17
+ const destPath = path_1.default.join(dest, entry.name);
18
+ if (entry.isDirectory()) {
19
+ copyDirectory(srcPath, destPath, skip);
20
+ }
21
+ else {
22
+ fs_1.default.copyFileSync(srcPath, destPath);
23
+ }
24
+ }
25
+ }
26
+ function copyFile(src, dest) {
27
+ const destDir = path_1.default.dirname(dest);
28
+ if (!fs_1.default.existsSync(destDir)) {
29
+ fs_1.default.mkdirSync(destDir, { recursive: true });
30
+ }
31
+ fs_1.default.copyFileSync(src, dest);
32
+ }
33
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/helpers/copy.ts"],"names":[],"mappings":";;;;;AAGA,sCAiBC;AAED,4BAMC;AA5BD,4CAAoB;AACpB,gDAAwB;AAExB,SAAgB,aAAa,CAAC,GAAW,EAAE,IAAY,EAAE,IAAkB;IACzE,YAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAEpC,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,YAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,QAAQ,CAAC,GAAW,EAAE,IAAY;IAChD,MAAM,OAAO,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,YAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,YAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export type PackageManager = "npm" | "yarn" | "pnpm" | "bun";
2
+ export declare function getPackageManager(): PackageManager;
3
+ //# sourceMappingURL=get-package-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-package-manager.d.ts","sourceRoot":"","sources":["../../src/helpers/get-package-manager.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7D,wBAAgB,iBAAiB,IAAI,cAAc,CAgBlD"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPackageManager = getPackageManager;
4
+ function getPackageManager() {
5
+ const userAgent = process.env.npm_config_user_agent || "";
6
+ if (userAgent.startsWith("yarn")) {
7
+ return "yarn";
8
+ }
9
+ if (userAgent.startsWith("pnpm")) {
10
+ return "pnpm";
11
+ }
12
+ if (userAgent.startsWith("bun")) {
13
+ return "bun";
14
+ }
15
+ return "npm";
16
+ }
17
+ //# sourceMappingURL=get-package-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-package-manager.js","sourceRoot":"","sources":["../../src/helpers/get-package-manager.ts"],"names":[],"mappings":";;AAEA,8CAgBC;AAhBD,SAAgB,iBAAiB;IAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAE1D,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PackageManager } from "./get-package-manager";
2
+ export declare function install(packageManager: PackageManager, cwd: string): Promise<void>;
3
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/helpers/install.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,wBAAsB,OAAO,CAC3B,cAAc,EAAE,cAAc,EAC9B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.install = install;
4
+ const child_process_1 = require("child_process");
5
+ async function install(packageManager, cwd) {
6
+ const args = ["install"];
7
+ return new Promise((resolve, reject) => {
8
+ const child = (0, child_process_1.spawn)(packageManager, args, {
9
+ cwd,
10
+ stdio: "inherit",
11
+ env: {
12
+ ...process.env,
13
+ ADBLOCK: "1",
14
+ DISABLE_OPENCOLLECTIVE: "1",
15
+ },
16
+ });
17
+ child.on("close", (code) => {
18
+ if (code !== 0) {
19
+ reject(new Error(`${packageManager} install failed with exit code ${code}`));
20
+ return;
21
+ }
22
+ resolve();
23
+ });
24
+ child.on("error", (err) => {
25
+ reject(err);
26
+ });
27
+ });
28
+ }
29
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/helpers/install.ts"],"names":[],"mappings":";;AAGA,0BA6BC;AAhCD,iDAAsC;AAG/B,KAAK,UAAU,OAAO,CAC3B,cAA8B,EAC9B,GAAW;IAEX,MAAM,IAAI,GAAa,CAAC,SAAS,CAAC,CAAC;IAEnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,cAAc,EAAE,IAAI,EAAE;YACxC,GAAG;YACH,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,OAAO,EAAE,GAAG;gBACZ,sBAAsB,EAAE,GAAG;aAC5B;SACF,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,cAAc,kCAAkC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC7E,OAAO;YACT,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function isFolderEmpty(dirPath: string): boolean;
2
+ //# sourceMappingURL=is-folder-empty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-folder-empty.d.ts","sourceRoot":"","sources":["../../src/helpers/is-folder-empty.ts"],"names":[],"mappings":"AAIA,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAItD"}
@@ -0,0 +1,14 @@
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.isFolderEmpty = isFolderEmpty;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const ALLOWED_FILES = [".DS_Store", ".git", ".gitattributes", ".gitignore", "Thumbs.db"];
9
+ function isFolderEmpty(dirPath) {
10
+ const files = fs_1.default.readdirSync(dirPath);
11
+ const relevantFiles = files.filter((file) => !ALLOWED_FILES.includes(file));
12
+ return relevantFiles.length === 0;
13
+ }
14
+ //# sourceMappingURL=is-folder-empty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-folder-empty.js","sourceRoot":"","sources":["../../src/helpers/is-folder-empty.ts"],"names":[],"mappings":";;;;;AAIA,sCAIC;AARD,4CAAoB;AAEpB,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;AAEzF,SAAgB,aAAa,CAAC,OAAe;IAC3C,MAAM,KAAK,GAAG,YAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,OAAO,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=is-folder-empty.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-folder-empty.test.d.ts","sourceRoot":"","sources":["../../src/helpers/is-folder-empty.test.ts"],"names":[],"mappings":""}