@ackee/create-node-app 1.0.0 → 2.0.0

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 (149) hide show
  1. package/AUTHORS +2 -1
  2. package/README.md +26 -18
  3. package/docs/development.md +42 -0
  4. package/lib/Bootstrap.js +106 -65
  5. package/lib/Bootstrap.js.map +1 -1
  6. package/lib/Builder.js +111 -0
  7. package/lib/Builder.js.map +1 -0
  8. package/lib/Files.js +21 -0
  9. package/lib/Files.js.map +1 -0
  10. package/lib/Logger.js +26 -8
  11. package/lib/Logger.js.map +1 -1
  12. package/lib/Mergers/ConfigMerger.js +22 -0
  13. package/lib/Mergers/ConfigMerger.js.map +1 -0
  14. package/lib/Mergers/ContainerMerger.js +172 -0
  15. package/lib/Mergers/ContainerMerger.js.map +1 -0
  16. package/lib/Mergers/EnvJsoncMerger.js +20 -0
  17. package/lib/Mergers/EnvJsoncMerger.js.map +1 -0
  18. package/lib/Mergers/Merger.js +36 -0
  19. package/lib/Mergers/Merger.js.map +1 -0
  20. package/lib/Mergers/PackageJsonMerger.js +36 -0
  21. package/lib/Mergers/PackageJsonMerger.js.map +1 -0
  22. package/lib/Npm.js +40 -12
  23. package/lib/Npm.js.map +1 -1
  24. package/lib/PackageJson.js +4 -4
  25. package/lib/PackageJson.js.map +1 -1
  26. package/lib/StarterLoader.js +86 -0
  27. package/lib/StarterLoader.js.map +1 -0
  28. package/package.json +8 -5
  29. package/src/Bootstrap.ts +123 -82
  30. package/src/Builder.ts +172 -0
  31. package/src/Files.ts +22 -0
  32. package/src/Logger.ts +26 -7
  33. package/src/Mergers/ConfigMerger.ts +28 -0
  34. package/src/Mergers/ContainerMerger.ts +241 -0
  35. package/src/Mergers/EnvJsoncMerger.ts +24 -0
  36. package/src/Mergers/Merger.ts +51 -0
  37. package/src/Mergers/PackageJsonMerger.ts +45 -0
  38. package/src/Npm.ts +60 -15
  39. package/src/PackageJson.ts +6 -4
  40. package/src/Starter.ts +2 -2
  41. package/src/StarterLoader.ts +148 -0
  42. package/starter/{cloudrun → _base}/.env.jsonc +1 -5
  43. package/starter/{cloudrun → _base}/.eslintrc.cjs +3 -2
  44. package/starter/_base/README.md +53 -0
  45. package/starter/_base/package.json +45 -0
  46. package/starter/{cloudrun → _base}/src/adapters/pino.logger.ts +1 -1
  47. package/starter/_base/src/config.ts +16 -0
  48. package/starter/{cloudrun-graphql → _base}/src/container.ts +3 -1
  49. package/starter/_base/src/index.ts +14 -0
  50. package/starter/{cloudrun → _base}/src/view/cli/README.md +2 -6
  51. package/starter/api/graphql/.env.jsonc +8 -0
  52. package/starter/{cloudrun-graphql → api/graphql}/.eslintrc.cjs +4 -5
  53. package/starter/api/graphql/node-app.jsonc +6 -0
  54. package/starter/api/graphql/package.json +36 -0
  55. package/starter/{cloudrun-graphql → api/graphql}/src/config.ts +0 -4
  56. package/starter/api/graphql/src/index.ts +11 -0
  57. package/starter/{cloudrun-graphql → api/graphql}/src/test/helloWorld.test.ts +14 -3
  58. package/starter/api/graphql/src/view/graphql/context-factory.ts +13 -0
  59. package/starter/{cloudrun-graphql → api/graphql}/src/view/server.ts +16 -6
  60. package/starter/api/rest/.env.jsonc +6 -0
  61. package/starter/api/rest/.eslintrc.cjs +8 -0
  62. package/starter/api/rest/node-app.jsonc +6 -0
  63. package/starter/api/rest/package.json +25 -0
  64. package/starter/{cloudrun → api/rest}/src/config.ts +0 -5
  65. package/starter/api/rest/src/container.ts +13 -0
  66. package/starter/{cloudrun → api/rest}/src/index.ts +4 -4
  67. package/starter/{cloudrun → api/rest}/src/test/health-check.test.ts +3 -5
  68. package/starter/{cloudrun → api/rest}/src/test/util/openapi-test.util.ts +3 -3
  69. package/starter/{cloudrun → api/rest}/src/view/rest/middleware/error-handler.ts +1 -1
  70. package/starter/{cloudrun → api/rest}/src/view/rest/routes.ts +1 -1
  71. package/starter/{cloudrun → api/rest}/src/view/rest/util/openapi.util.ts +19 -19
  72. package/starter/{cloudrun → api/rest}/src/view/server.ts +6 -4
  73. package/starter/infra/postgresql-knex/.env.jsonc +5 -0
  74. package/starter/{shared → infra/postgresql-knex}/docker-compose/docker-compose.yml +1 -1
  75. package/starter/infra/postgresql-knex/knexfile.ts +16 -0
  76. package/starter/infra/postgresql-knex/node-app.jsonc +6 -0
  77. package/starter/infra/postgresql-knex/package.json +13 -0
  78. package/starter/infra/postgresql-knex/src/adapters/knex.database.test.ts +21 -0
  79. package/starter/infra/postgresql-knex/src/adapters/knex.database.ts +14 -0
  80. package/starter/infra/postgresql-knex/src/adapters/repositories/migration.repository.ts +24 -0
  81. package/starter/infra/postgresql-knex/src/config.ts +14 -0
  82. package/starter/infra/postgresql-knex/src/container.ts +23 -0
  83. package/starter/infra/postgresql-knex/src/db/migration.template.ts +4 -0
  84. package/starter/infra/postgresql-knex/src/db/migrations/.gitkeep +0 -0
  85. package/starter/infra/postgresql-knex/src/db/seed.template.ts +3 -0
  86. package/starter/infra/postgresql-knex/src/db/seeds/.gitkeep +0 -0
  87. package/starter/infra/postgresql-knex/src/domain/ports/database.d.ts +4 -0
  88. package/starter/infra/postgresql-knex/src/domain/ports/repositories/migration.repository.d.ts +9 -0
  89. package/starter/infra/postgresql-knex/src/test/setup.ts +16 -0
  90. package/starter/{shared → pipeline/cloudrun-gitlab}/.gitlab-ci.yml +15 -6
  91. package/starter/pipeline/cloudrun-gitlab/node-app.jsonc +6 -0
  92. package/tsconfig.tsbuildinfo +1 -1
  93. package/lib/Toolbelt.js +0 -102
  94. package/lib/Toolbelt.js.map +0 -1
  95. package/lib/cloudrun/CloudRunStarter.js +0 -126
  96. package/lib/cloudrun/CloudRunStarter.js.map +0 -1
  97. package/lib/cloudrun-graphql/GraphQLStarter.js +0 -118
  98. package/lib/cloudrun-graphql/GraphQLStarter.js.map +0 -1
  99. package/src/Toolbelt.ts +0 -132
  100. package/src/cloudrun/CloudRunStarter.ts +0 -181
  101. package/src/cloudrun-graphql/GraphQLStarter.ts +0 -182
  102. package/starter/cloudrun/README.md +0 -69
  103. package/starter/cloudrun/src/container.ts +0 -18
  104. package/starter/cloudrun/src/context.ts +0 -39
  105. package/starter/cloudrun/src/domain/errors/codes.ts +0 -9
  106. package/starter/cloudrun/src/domain/errors/errors.ts +0 -25
  107. package/starter/cloudrun/src/domain/ports/logger.d.ts +0 -21
  108. package/starter/cloudrun-graphql/.env.jsonc +0 -12
  109. package/starter/cloudrun-graphql/README.md +0 -53
  110. package/starter/cloudrun-graphql/src/adapters/pino.logger.ts +0 -44
  111. package/starter/cloudrun-graphql/src/index.ts +0 -11
  112. package/starter/shared/.gitignore_ +0 -5
  113. package/starter/shared/ci-branch-config/common.env +0 -7
  114. package/starter/shared/ci-branch-config/development.env +0 -7
  115. package/starter/shared/ci-branch-config/master.env +0 -7
  116. package/starter/shared/ci-branch-config/stage.env +0 -7
  117. package/starter/shared/docker-compose/docker-compose.override.yml +0 -5
  118. package/starter/shared/jest.config.js +0 -12
  119. /package/starter/{shared → _base}/.dockerignore +0 -0
  120. /package/starter/{cloudrun → _base}/.eslint.tsconfig.json +0 -0
  121. /package/starter/{shared → _base}/.mocha-junit-config.json +0 -0
  122. /package/starter/{shared → _base}/.mocharc.json +0 -0
  123. /package/starter/{shared → _base}/.nvmrc +0 -0
  124. /package/starter/{shared → _base}/Dockerfile +0 -0
  125. /package/starter/{shared → _base}/prettier.config.cjs +0 -0
  126. /package/starter/{cloudrun-graphql → _base}/src/context.ts +0 -0
  127. /package/starter/{cloudrun-graphql → _base}/src/domain/errors/codes.ts +0 -0
  128. /package/starter/{cloudrun-graphql → _base}/src/domain/errors/errors.ts +0 -0
  129. /package/starter/{cloudrun-graphql → _base}/src/domain/ports/logger.d.ts +0 -0
  130. /package/starter/{shared → _base}/src/test/setup.ts +0 -0
  131. /package/starter/{cloudrun → _base}/src/view/cli/cli.ts +0 -0
  132. /package/starter/{shared → _base}/tsconfig.json +0 -0
  133. /package/starter/{cloudrun-graphql → api/graphql}/.eslint.tsconfig.json +0 -0
  134. /package/starter/{cloudrun-graphql → api/graphql}/codegen.yml +0 -0
  135. /package/starter/{cloudrun-graphql → api/graphql}/src/view/controller.ts +0 -0
  136. /package/starter/{cloudrun-graphql → api/graphql}/src/view/graphql/resolvers/greeting.resolver.ts +0 -0
  137. /package/starter/{cloudrun-graphql → api/graphql}/src/view/graphql/resolvers.ts +0 -0
  138. /package/starter/{cloudrun-graphql → api/graphql}/src/view/graphql/schema/schema.graphql +0 -0
  139. /package/starter/{cloudrun-graphql → api/graphql}/src/view/graphql/schema.ts +0 -0
  140. /package/starter/{cloudrun → api/rest}/src/domain/health-check.service.ts +0 -0
  141. /package/starter/{cloudrun → api/rest}/src/view/cli/openapi/generate.ts +0 -0
  142. /package/starter/{cloudrun/src/view/rest/controller → api/rest/src/view/rest/controllers}/health-check.controller.ts +0 -0
  143. /package/starter/{cloudrun → api/rest}/src/view/rest/middleware/context-middleware.ts +0 -0
  144. /package/starter/{cloudrun → api/rest}/src/view/rest/middleware/request-logger.ts +0 -0
  145. /package/starter/{cloudrun → api/rest}/src/view/rest/request.d.ts +0 -0
  146. /package/starter/{cloudrun → api/rest}/src/view/rest/spec/openapi.yml +0 -0
  147. /package/starter/{shared → infra/postgresql-knex}/docker-compose/docker-compose-entrypoint.sh +0 -0
  148. /package/starter/{shared → infra/postgresql-knex}/docker-compose/docker-compose.ci.yml +0 -0
  149. /package/starter/{shared → infra/postgresql-knex}/docker-compose/docker-compose.local.yml +0 -0
@@ -0,0 +1,172 @@
1
+ import { Merger } from './Merger.js';
2
+ import * as ts from 'typescript';
3
+ import { Files } from '../Files.js';
4
+ export class ContainerMerger extends Merger {
5
+ async merge(originDir) {
6
+ const content = await this.getWhichExistsOrNull(originDir);
7
+ if (content) {
8
+ return content;
9
+ }
10
+ const { originPath, destPath } = this.getPaths(originDir);
11
+ const [originContainer, destContainer] = await Promise.all([
12
+ Files.readUtf8File(originPath),
13
+ Files.readUtf8File(destPath),
14
+ ]);
15
+ const originAst = this.parseFile(originContainer);
16
+ const destAst = this.parseFile(destContainer);
17
+ const mergedImports = this.mergeImports(originAst, destAst);
18
+ const mergedInterface = this.mergeInterface(originAst, destAst);
19
+ const mergedFunction = this.mergeFunction(originAst, destAst);
20
+ return `${mergedImports}\n\n${mergedInterface}\n\nexport type ContainerFactory = () => Promise<Container>\n\n${mergedFunction}\n`;
21
+ }
22
+ parseFile(content) {
23
+ return ts.createSourceFile('temp.ts', content, ts.ScriptTarget.Latest, true);
24
+ }
25
+ mergeImports(originAst, destAst) {
26
+ const imports = [];
27
+ const addImports = (node) => {
28
+ if (!ts.isImportDeclaration(node)) {
29
+ node.forEachChild(addImports);
30
+ return;
31
+ }
32
+ const importText = node.getText();
33
+ if (!imports.includes(importText)) {
34
+ imports.push(importText);
35
+ }
36
+ node.forEachChild(addImports);
37
+ };
38
+ addImports(originAst);
39
+ addImports(destAst);
40
+ return imports.join('\n');
41
+ }
42
+ mergeInterface(originAst, destAst) {
43
+ const properties = [];
44
+ const extractProperties = (node) => {
45
+ if (!ts.isInterfaceDeclaration(node) || node.name.text !== 'Container') {
46
+ node.forEachChild(extractProperties);
47
+ return;
48
+ }
49
+ node.members.forEach(member => {
50
+ if (!ts.isPropertySignature(member)) {
51
+ return;
52
+ }
53
+ const propText = member.getText().trim();
54
+ if (!properties.includes(propText)) {
55
+ properties.push(propText);
56
+ }
57
+ });
58
+ node.forEachChild(extractProperties);
59
+ };
60
+ extractProperties(originAst);
61
+ extractProperties(destAst);
62
+ return `export interface Container {\n ${properties.join('\n ')}\n}`;
63
+ }
64
+ mergeFunction(originAst, destAst) {
65
+ const originFunctionBody = this.extractFunctionBody(originAst);
66
+ const destFunctionBody = this.extractFunctionBody(destAst);
67
+ const allFunctionContent = [
68
+ ...originFunctionBody.content,
69
+ ...destFunctionBody.content,
70
+ ];
71
+ const mergedReturnProps = this.mergeReturnProperties(originFunctionBody.returnProps, destFunctionBody.returnProps);
72
+ let body = '';
73
+ if (allFunctionContent.length > 0) {
74
+ body += allFunctionContent.join('\n') + '\n\n';
75
+ }
76
+ body += ` return {\n ${mergedReturnProps.join(',\n ')}\n }`;
77
+ return `export const createContainer = async (): Promise<Container> => {\n${body}\n}`;
78
+ }
79
+ mergeReturnProperties(originProps, destProps) {
80
+ const mergedProps = new Map();
81
+ originProps.forEach(prop => {
82
+ const propName = this.getPropertyName(prop);
83
+ if (propName) {
84
+ mergedProps.set(propName, prop);
85
+ }
86
+ });
87
+ destProps.forEach(prop => {
88
+ const propName = this.getPropertyName(prop);
89
+ if (propName) {
90
+ mergedProps.set(propName, prop);
91
+ }
92
+ });
93
+ return Array.from(mergedProps.values()).map(prop => {
94
+ const propText = prop.getText();
95
+ if (ts.isPropertyAssignment(prop) &&
96
+ ts.isObjectLiteralExpression(prop.initializer)) {
97
+ return this.formatNestedObject(propText);
98
+ }
99
+ return propText;
100
+ });
101
+ }
102
+ getPropertyName(prop) {
103
+ if (ts.isPropertyAssignment(prop)) {
104
+ if (ts.isIdentifier(prop.name) || ts.isStringLiteral(prop.name)) {
105
+ return prop.name.text;
106
+ }
107
+ }
108
+ else if (ts.isShorthandPropertyAssignment(prop)) {
109
+ return prop.name.text;
110
+ }
111
+ return null;
112
+ }
113
+ formatNestedObject(propText) {
114
+ const lines = propText.split('\n');
115
+ return lines
116
+ .map((line, index) => {
117
+ if (index === 0) {
118
+ return line;
119
+ }
120
+ return ' ' + line;
121
+ })
122
+ .join('\n');
123
+ }
124
+ extractFunctionBody(ast) {
125
+ const content = [];
126
+ const returnProps = [];
127
+ const visit = (node) => {
128
+ if (!this.isCreateContainer(node)) {
129
+ ts.forEachChild(node, visit);
130
+ return;
131
+ }
132
+ if (!node.initializer || !ts.isArrowFunction(node.initializer)) {
133
+ ts.forEachChild(node, visit);
134
+ return;
135
+ }
136
+ const body = node.initializer.body;
137
+ if (!ts.isBlock(body)) {
138
+ ts.forEachChild(node, visit);
139
+ return;
140
+ }
141
+ body.statements.forEach(statement => {
142
+ if (this.isContentStatement(statement)) {
143
+ content.push(statement.getText().trim());
144
+ }
145
+ else if (this.isReturnWithObject(statement)) {
146
+ // Extract the actual property nodes, not just their names
147
+ statement.expression.properties.forEach(prop => {
148
+ returnProps.push(prop);
149
+ });
150
+ }
151
+ });
152
+ ts.forEachChild(node, visit);
153
+ };
154
+ visit(ast);
155
+ return { content, returnProps };
156
+ }
157
+ isCreateContainer(node) {
158
+ return (ts.isVariableDeclaration(node) &&
159
+ node.name.getText() === 'createContainer');
160
+ }
161
+ isContentStatement(statement) {
162
+ return (ts.isVariableStatement(statement) ||
163
+ (ts.isExpressionStatement(statement) &&
164
+ ts.isCallExpression(statement.expression)));
165
+ }
166
+ isReturnWithObject(statement) {
167
+ return (ts.isReturnStatement(statement) &&
168
+ !!statement.expression &&
169
+ ts.isObjectLiteralExpression(statement.expression));
170
+ }
171
+ }
172
+ //# sourceMappingURL=ContainerMerger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContainerMerger.js","sourceRoot":"","sources":["../../src/Mergers/ContainerMerger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Merger } from './Merger.js';
2
+ import { Files } from '../Files.js';
3
+ export class EnvJsoncMerger extends Merger {
4
+ async merge(originDir) {
5
+ const content = await this.getWhichExistsOrNull(originDir);
6
+ if (content) {
7
+ return content;
8
+ }
9
+ const { originPath, destPath } = this.getPaths(originDir);
10
+ const [destEnvConfig, originEnvConfig] = await Promise.all([
11
+ Files.readUtf8File(destPath),
12
+ Files.readUtf8File(originPath),
13
+ ]);
14
+ const originWithoutOpenBracket = originEnvConfig.replace('{\n', '');
15
+ return destEnvConfig
16
+ .replace(',\n}\n', '\n}\n')
17
+ .replace('\n}\n', `,\n${originWithoutOpenBracket}`);
18
+ }
19
+ }
20
+ //# sourceMappingURL=EnvJsoncMerger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnvJsoncMerger.js","sourceRoot":"","sources":["../../src/Mergers/EnvJsoncMerger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC,MAAM,OAAO,cAAe,SAAQ,MAAM;IACxC,KAAK,CAAC,KAAK,CAAC,SAAiB;QAC3B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAA;QAC1D,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QAEzD,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACzD,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC5B,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC;SAC/B,CAAC,CAAA;QAEF,MAAM,wBAAwB,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAEnE,OAAO,aAAa;aACjB,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC;aAC1B,OAAO,CAAC,OAAO,EAAE,MAAM,wBAAwB,EAAE,CAAC,CAAA;IACvD,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ import path from 'path';
2
+ import { Files } from '../Files.js';
3
+ export class Merger {
4
+ constructor(destDir, pathToFile) {
5
+ this.destDir = destDir;
6
+ this.pathToFile = pathToFile;
7
+ this.destPath = path.join(this.destDir, this.pathToFile);
8
+ }
9
+ getDestPath() {
10
+ return this.destPath;
11
+ }
12
+ getPaths(originDir) {
13
+ return {
14
+ originPath: path.join(originDir, this.pathToFile),
15
+ destPath: this.getDestPath(),
16
+ };
17
+ }
18
+ async getWhichExistsOrNull(originDir) {
19
+ const { originPath, destPath } = this.getPaths(originDir);
20
+ const [originExists, destExists] = await Promise.all([
21
+ Files.exists(originPath),
22
+ Files.exists(destPath),
23
+ ]);
24
+ if (!originExists && destExists) {
25
+ return Files.readUtf8File(destPath);
26
+ }
27
+ if (!destExists && originExists) {
28
+ return Files.readUtf8File(originPath);
29
+ }
30
+ if (!originExists && !destExists) {
31
+ throw new Error(`No file found to merge: ${this.pathToFile}`);
32
+ }
33
+ return null;
34
+ }
35
+ }
36
+ //# sourceMappingURL=Merger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Merger.js","sourceRoot":"","sources":["../../src/Mergers/Merger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC,MAAM,OAAgB,MAAM;IAK1B,YACqB,OAAe,EACf,UAAkB;QADlB,YAAO,GAAP,OAAO,CAAQ;QACf,eAAU,GAAV,UAAU,CAAQ;QAErC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;IAC1D,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAES,QAAQ,CAAC,SAAiB;QAClC,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC;YACjD,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;SAC7B,CAAA;IACH,CAAC;IAES,KAAK,CAAC,oBAAoB,CAClC,SAAiB;QAEjB,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QAEzD,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACnD,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC;YACxB,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;SACvB,CAAC,CAAA;QAEF,IAAI,CAAC,YAAY,IAAI,UAAU,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;QACrC,CAAC;QAED,IAAI,CAAC,UAAU,IAAI,YAAY,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAA;QACvC,CAAC;QAED,IAAI,CAAC,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;QAC/D,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ import { Merger } from './Merger.js';
2
+ import { Files } from '../Files.js';
3
+ export class PackageJsonMerger extends Merger {
4
+ constructor(projectName, destDir, pathToFile) {
5
+ super(destDir, pathToFile);
6
+ this.projectName = projectName;
7
+ }
8
+ async merge(originDir) {
9
+ const content = await this.getWhichExistsOrNull(originDir);
10
+ if (content) {
11
+ return content;
12
+ }
13
+ const { originPath, destPath } = this.getPaths(originDir);
14
+ const [destPckgJson, starterPckgJson] = await Promise.all([
15
+ Files.readUtf8File(destPath),
16
+ Files.readUtf8File(originPath),
17
+ ]);
18
+ const destPckgJsonObj = JSON.parse(destPckgJson);
19
+ const starterPckgJsonObj = JSON.parse(starterPckgJson);
20
+ destPckgJsonObj.name = this.projectName;
21
+ destPckgJsonObj.scripts = {
22
+ ...destPckgJsonObj.scripts,
23
+ ...starterPckgJsonObj.scripts,
24
+ };
25
+ destPckgJsonObj.dependencies = {
26
+ ...destPckgJsonObj.dependencies,
27
+ ...starterPckgJsonObj.dependencies,
28
+ };
29
+ destPckgJsonObj.devDependencies = {
30
+ ...destPckgJsonObj.devDependencies,
31
+ ...starterPckgJsonObj.devDependencies,
32
+ };
33
+ return JSON.stringify(destPckgJsonObj, null, 2);
34
+ }
35
+ }
36
+ //# sourceMappingURL=PackageJsonMerger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageJsonMerger.js","sourceRoot":"","sources":["../../src/Mergers/PackageJsonMerger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC,MAAM,OAAO,iBAAkB,SAAQ,MAAM;IAC3C,YACmB,WAAmB,EACpC,OAAe,EACf,UAAkB;QAElB,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;QAJT,gBAAW,GAAX,WAAW,CAAQ;IAKtC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,SAAiB;QAC3B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAA;QAC1D,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QAEzD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACxD,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC5B,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC;SAC/B,CAAC,CAAA;QAEF,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAChD,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QAEtD,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAA;QACvC,eAAe,CAAC,OAAO,GAAG;YACxB,GAAG,eAAe,CAAC,OAAO;YAC1B,GAAG,kBAAkB,CAAC,OAAO;SAC9B,CAAA;QACD,eAAe,CAAC,YAAY,GAAG;YAC7B,GAAG,eAAe,CAAC,YAAY;YAC/B,GAAG,kBAAkB,CAAC,YAAY;SACnC,CAAA;QACD,eAAe,CAAC,eAAe,GAAG;YAChC,GAAG,eAAe,CAAC,eAAe;YAClC,GAAG,kBAAkB,CAAC,eAAe;SACtC,CAAA;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACjD,CAAC;CACF"}
package/lib/Npm.js CHANGED
@@ -1,33 +1,61 @@
1
1
  import * as childProcess from 'child_process';
2
- import { logger } from './Logger.js';
2
+ import { Logger } from './Logger.js';
3
+ export class NpmError extends Error {
4
+ constructor(message, code) {
5
+ super(message);
6
+ this.code = code;
7
+ this.name = 'NpmError';
8
+ }
9
+ }
3
10
  export class Npm {
4
11
  constructor(settings) {
12
+ this.logger = settings?.logger ?? new Logger();
5
13
  this.dir = settings?.dir;
6
14
  }
15
+ spawn(cmd, args, options = {}) {
16
+ return new Promise((resolve, reject) => {
17
+ const cp = childProcess.spawn(cmd, args, options);
18
+ const error = [];
19
+ const stdout = [];
20
+ cp.stdout?.on('data', data => {
21
+ stdout.push(data.toString());
22
+ });
23
+ cp.on('error', e => {
24
+ error.push(e.toString());
25
+ });
26
+ cp.on('close', code => {
27
+ if (error.length || (code !== null && code > 0)) {
28
+ reject(new NpmError(error.length ? error.join('') : stdout.join(''), code ?? null));
29
+ }
30
+ else {
31
+ resolve(undefined);
32
+ }
33
+ });
34
+ });
35
+ }
7
36
  run(args) {
8
- logger.info(`> npm ${args.join(' ')}`);
9
- const result = this.dir
10
- ? childProcess.spawnSync('npm', args, {
37
+ this.logger.debug(`> npm ${args.join(' ')}`);
38
+ const options = this.dir
39
+ ? {
11
40
  cwd: this.dir,
12
- })
13
- : childProcess.spawnSync('npm', args);
14
- if ((result?.status ?? 0) > 0) {
15
- logger.info(`Failed npm command: npm ${args.join(' ')}. ${String(result.output)}`);
16
- }
41
+ stdio: this.logger.enableDebug ? 'inherit' : 'pipe',
42
+ }
43
+ : { stdio: this.logger.enableDebug ? 'inherit' : 'pipe' };
44
+ return this.spawn('npm', args, options);
17
45
  }
18
46
  init() {
19
- this.run(['init', '--yes']);
47
+ return this.run(['init', '--yes']);
20
48
  }
21
49
  i(module) {
22
50
  if (!module) {
23
51
  return this.run(['i']);
24
52
  }
25
53
  const args = ['i', module];
26
- this.run(args);
54
+ return this.run(args);
27
55
  }
28
56
  iDev(module) {
29
57
  const args = ['i', '-D', module];
30
- this.run(args);
58
+ return this.run(args);
31
59
  }
32
60
  }
33
61
  //# sourceMappingURL=Npm.js.map
package/lib/Npm.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Npm.js","sourceRoot":"","sources":["../src/Npm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,MAAM,OAAO,GAAG;IAEd,YAAY,QAAyB;QACnC,IAAI,CAAC,GAAG,GAAG,QAAQ,EAAE,GAAW,CAAA;IAClC,CAAC;IACM,GAAG,CAAC,IAAc;QACvB,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG;YACrB,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE;gBAClC,GAAG,EAAE,IAAI,CAAC,GAAG;aACd,CAAC;YACJ,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACvC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CACT,2BAA2B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CACtE,CAAA;QACH,CAAC;IACH,CAAC;IACM,IAAI;QACT,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC7B,CAAC;IAEM,CAAC,CAAC,MAAe;QACtB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACxB,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QAC1B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAChB,CAAC;IACM,IAAI,CAAC,MAAc;QACxB,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QAChC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"Npm.js","sourceRoot":"","sources":["../src/Npm.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,15 @@
1
1
  import * as path from 'path';
2
2
  import * as fs from 'fs';
3
3
  import * as lodash from 'lodash-es';
4
- import { logger } from './Logger.js';
5
4
  export class PackageJson {
6
- constructor(npm) {
5
+ constructor(npm, logger) {
7
6
  let packagejsonPath = './package.json';
8
7
  if (npm.dir) {
9
8
  packagejsonPath = path.normalize(`${npm.dir}/${packagejsonPath}`);
10
9
  }
11
10
  this.path = packagejsonPath;
12
11
  this.npm = npm;
12
+ this.logger = logger;
13
13
  }
14
14
  setType(type) {
15
15
  this.mergeWith({
@@ -20,7 +20,7 @@ export class PackageJson {
20
20
  return JSON.parse(fs.readFileSync(this.path, 'utf-8'));
21
21
  }
22
22
  runScript(name) {
23
- this.npm.run(['run', name]);
23
+ return this.npm.run(['run', name]);
24
24
  }
25
25
  addNpmScript(name, command) {
26
26
  this.mergeWith({
@@ -32,7 +32,7 @@ export class PackageJson {
32
32
  // Updated package json using merge with given object
33
33
  mergeWith(partialWith) {
34
34
  const json = lodash.merge(this.toJSON(), partialWith);
35
- logger.info(`> package.json updated ${JSON.stringify(partialWith)}`);
35
+ this.logger.debug(`> package.json updated ${JSON.stringify(partialWith)}`);
36
36
  fs.writeFileSync(path.join(this.path), JSON.stringify(json, null, 2), 'utf-8');
37
37
  }
38
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PackageJson.js","sourceRoot":"","sources":["../src/PackageJson.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,MAAM,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,MAAM,OAAO,WAAW;IAGtB,YAAY,GAAQ;QAClB,IAAI,eAAe,GAAG,gBAAwB,CAAA;QAC9C,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,eAAe,EAAE,CAAS,CAAA;QAC3E,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,eAAe,CAAA;QAC3B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IACM,OAAO,CAAC,IAA2B;QACxC,IAAI,CAAC,SAAS,CAAC;YACb,IAAI;SACL,CAAC,CAAA;IACJ,CAAC;IACM,MAAM;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IACxD,CAAC;IACM,SAAS,CAAC,IAAY;QAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;IAC7B,CAAC;IACM,YAAY,CAAC,IAAY,EAAE,OAAe;QAC/C,IAAI,CAAC,SAAS,CAAC;YACb,OAAO,EAAE;gBACP,CAAC,IAAI,CAAC,EAAE,OAAO;aAChB;SACF,CAAC,CAAA;IACJ,CAAC;IACD,qDAAqD;IAC9C,SAAS,CAAC,WAAgB;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAA;QACrD,MAAM,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;QACpE,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EACpB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAC7B,OAAO,CACR,CAAA;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"PackageJson.js","sourceRoot":"","sources":["../src/PackageJson.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,MAAM,MAAM,WAAW,CAAA;AAKnC,MAAM,OAAO,WAAW;IAItB,YAAY,GAAQ,EAAE,MAAc;QAClC,IAAI,eAAe,GAAG,gBAAwB,CAAA;QAC9C,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,eAAe,EAAE,CAAS,CAAA;QAC3E,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,eAAe,CAAA;QAC3B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IACM,OAAO,CAAC,IAA2B;QACxC,IAAI,CAAC,SAAS,CAAC;YACb,IAAI;SACL,CAAC,CAAA;IACJ,CAAC;IACM,MAAM;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IACxD,CAAC;IACM,SAAS,CAAC,IAAY;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;IACpC,CAAC;IACM,YAAY,CAAC,IAAY,EAAE,OAAe;QAC/C,IAAI,CAAC,SAAS,CAAC;YACb,OAAO,EAAE;gBACP,CAAC,IAAI,CAAC,EAAE,OAAO;aAChB;SACF,CAAC,CAAA;IACJ,CAAC;IACD,qDAAqD;IAC9C,SAAS,CAAC,WAAgB;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAA;QACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;QAC1E,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EACpB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAC7B,OAAO,CACR,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,86 @@
1
+ import glob from 'fast-glob';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { Files } from './Files.js';
5
+ export class StarterLoader {
6
+ constructor() {
7
+ this.starters = new Map();
8
+ this.modules = [];
9
+ const configFiles = glob.sync(`${StarterLoader.starterPath}/**/node-app.jsonc`);
10
+ for (const configFile of configFiles) {
11
+ const config = StarterLoader.validateConfig(configFile, JSON.parse(fs.readFileSync(configFile, 'utf8')));
12
+ const original = this.starters.get(config.id);
13
+ if (original) {
14
+ throw new Error(`Duplicate starter: ${config.name}\n` +
15
+ `> Starter 1: ${original.path}\n` +
16
+ `> Starter 2: ${path.dirname(configFile)}`);
17
+ }
18
+ this.starters.set(config.id, {
19
+ name: config.name,
20
+ config,
21
+ path: path.dirname(configFile),
22
+ configPath: configFile,
23
+ });
24
+ const module = this.modules.find(module => module.name === config.module);
25
+ if (module) {
26
+ module.starters.push(config.id);
27
+ continue;
28
+ }
29
+ this.modules.push({
30
+ name: config.module,
31
+ starters: [config.id],
32
+ });
33
+ }
34
+ this.modules.sort((a, b) => a.name.localeCompare(b.name));
35
+ }
36
+ getOptions() {
37
+ return this.modules;
38
+ }
39
+ getStarter(id) {
40
+ const starter = this.starters.get(id);
41
+ if (!starter) {
42
+ throw new Error(`Starter ${id} not found`);
43
+ }
44
+ return starter;
45
+ }
46
+ static validateConfig(configPath, config) {
47
+ if (!config.module) {
48
+ throw new Error(`Invalid config at ${configPath}: module key is required`);
49
+ }
50
+ if (!config.name) {
51
+ throw new Error(`Invalid config at ${configPath}: name key is required`);
52
+ }
53
+ if (!config.id) {
54
+ throw new Error(`Invalid config at ${configPath}: id key is required`);
55
+ }
56
+ if (!StarterLoader.isValidOptionalStringArray(config.prebuild)) {
57
+ throw new Error(`Invalid config at ${configPath}: "prebuild" must be array of npm script names or empty`);
58
+ }
59
+ if (!StarterLoader.isValidOptionalStringArray(config.replace)) {
60
+ throw new Error(`Invalid config at ${configPath}: "replace" must be array of files where strings should be replaced`);
61
+ }
62
+ if (config.replace) {
63
+ const configDir = path.dirname(configPath);
64
+ const invalidReplace = config.replace.find((replace) => {
65
+ const replacePath = path.join(configDir, replace);
66
+ return (!fs.existsSync(replacePath) ||
67
+ !Files.isInSameTree(configDir, path.join(configDir, replacePath)));
68
+ });
69
+ if (invalidReplace) {
70
+ throw new Error(`Invalid config at ${configPath}: "replace" must be array of files in the project directory, got: ${invalidReplace}`);
71
+ }
72
+ }
73
+ const invalidKeys = Object.keys(config).filter(key => !['module', 'name', 'prebuild', 'replace', 'id'].includes(key));
74
+ if (invalidKeys.length > 0) {
75
+ throw new Error(`Invalid config at ${configPath}: Unknown key(s): ${invalidKeys.join(', ')}`);
76
+ }
77
+ return config;
78
+ }
79
+ static isValidOptionalStringArray(array) {
80
+ return (!array ||
81
+ (Array.isArray(array) &&
82
+ array.every((item) => typeof item === 'string')));
83
+ }
84
+ }
85
+ StarterLoader.starterPath = path.normalize(path.join(import.meta.dirname, '..', 'starter'));
86
+ //# sourceMappingURL=StarterLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StarterLoader.js","sourceRoot":"","sources":["../src/StarterLoader.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@ackee/create-node-app",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "type": "module",
7
7
  "scripts": {
8
8
  "build": "tsc",
9
- "prettier:check": "prettier --ignore-path .gitignore --check '**/*.{ts,js,json,md}'",
10
- "prettier:fix": "npm run prettier:check -- --write '**/*.{ts,js,json,md}'",
9
+ "prettier:check": "prettier --ignore-path .gitignore --check '**/*.{ts,js,json,jsonc,md}'",
10
+ "prettier:fix": "npm run prettier:check -- --write '**/*.{ts,js,json,jsonc,md}'",
11
11
  "lint:check": "eslint --ignore-path .gitignore 'src/**/*.ts' -f codeframe",
12
12
  "lint:fix": "npm run lint:check -- --fix"
13
13
  },
@@ -27,14 +27,17 @@
27
27
  },
28
28
  "homepage": "https://github.com/AckeeCZ/create-node-app#readme",
29
29
  "devDependencies": {
30
- "@ackee/styleguide-backend-config": "^1.0.0",
30
+ "@ackee/styleguide-backend-config": "^1.0.1",
31
31
  "@types/lodash-es": "^4.17.12",
32
32
  "@types/node": "^20.19.0",
33
33
  "@types/yargs": "^17.0.33",
34
- "prettier": "^2.8.1",
34
+ "prettier": "^3.0.0",
35
35
  "typescript": "^5.4.5"
36
36
  },
37
37
  "dependencies": {
38
+ "fast-glob": "^3.3.3",
39
+ "inquirer": "^12.9.0",
40
+ "ora": "^8.2.0",
38
41
  "source-map-support": "^0.5.21",
39
42
  "yargs": "^18.0.0",
40
43
  "lodash-es": "^4.17.21"