cyberia 3.2.9 → 3.2.12

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 (169) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +6 -0
  2. package/.github/workflows/npmpkg.ci.yml +1 -0
  3. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  4. package/.github/workflows/release.cd.yml +1 -0
  5. package/.vscode/extensions.json +9 -9
  6. package/.vscode/settings.json +20 -4
  7. package/CHANGELOG.md +213 -1
  8. package/CLI-HELP.md +92 -23
  9. package/README.md +190 -348
  10. package/bin/build.js +24 -8
  11. package/bin/build.template.js +187 -0
  12. package/bin/cyberia.js +229 -52
  13. package/bin/deploy.js +12 -2
  14. package/bin/index.js +229 -52
  15. package/bump.config.js +26 -0
  16. package/conf.js +130 -24
  17. package/deployment.yaml +4 -2
  18. package/hardhat/package-lock.json +113 -144
  19. package/hardhat/package.json +4 -3
  20. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  21. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
  22. package/manifests/deployment/dd-cyberia-development/deployment.yaml +4 -2
  23. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  24. package/manifests/deployment/dd-test-development/deployment.yaml +4 -2
  25. package/manifests/kind-config-dev.yaml +8 -0
  26. package/manifests/lxd/lxd-admin-profile.yaml +12 -3
  27. package/manifests/mongodb/pv-pvc.yaml +44 -8
  28. package/manifests/mongodb/statefulset.yaml +55 -68
  29. package/manifests/mongodb-4.4/headless-service.yaml +10 -0
  30. package/manifests/mongodb-4.4/kustomization.yaml +3 -1
  31. package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
  32. package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
  33. package/manifests/mongodb-4.4/statefulset.yaml +79 -0
  34. package/manifests/mongodb-4.4/storage-class.yaml +9 -0
  35. package/manifests/valkey/statefulset.yaml +1 -1
  36. package/manifests/valkey/valkey-nodeport.yaml +17 -0
  37. package/package.json +27 -15
  38. package/scripts/ipxe-setup.sh +52 -49
  39. package/scripts/k3s-node-setup.sh +81 -46
  40. package/scripts/lxd-vm-setup.sh +193 -8
  41. package/scripts/maas-nat-firewalld.sh +145 -0
  42. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
  43. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +16 -16
  44. package/src/api/core/core.router.js +19 -14
  45. package/src/api/core/core.service.js +5 -5
  46. package/src/api/crypto/crypto.router.js +18 -12
  47. package/src/api/crypto/crypto.service.js +3 -3
  48. package/src/api/cyberia-action/cyberia-action.model.js +1 -1
  49. package/src/api/cyberia-action/cyberia-action.router.js +22 -18
  50. package/src/api/cyberia-action/cyberia-action.service.js +5 -5
  51. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
  52. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
  53. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
  54. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
  55. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
  56. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +6 -6
  57. package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
  58. package/src/api/cyberia-entity/cyberia-entity.service.js +5 -5
  59. package/src/api/cyberia-instance/cyberia-fallback-world.js +79 -4
  60. package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
  61. package/src/api/cyberia-instance/cyberia-instance.service.js +10 -10
  62. package/src/api/cyberia-instance/cyberia-world-generator.js +3 -3
  63. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +14 -48
  64. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
  65. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +5 -5
  66. package/src/api/cyberia-map/cyberia-map.router.js +35 -30
  67. package/src/api/cyberia-map/cyberia-map.service.js +7 -7
  68. package/src/api/cyberia-quest/cyberia-quest.model.js +1 -1
  69. package/src/api/cyberia-quest/cyberia-quest.router.js +22 -18
  70. package/src/api/cyberia-quest/cyberia-quest.service.js +5 -5
  71. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +22 -18
  72. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +5 -5
  73. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
  74. package/src/api/default/default.router.js +22 -18
  75. package/src/api/default/default.service.js +5 -5
  76. package/src/api/document/document.router.js +28 -23
  77. package/src/api/document/document.service.js +100 -23
  78. package/src/api/file/file.router.js +19 -13
  79. package/src/api/file/file.service.js +9 -7
  80. package/src/api/instance/instance.router.js +29 -24
  81. package/src/api/instance/instance.service.js +6 -6
  82. package/src/api/ipfs/ipfs.router.js +21 -16
  83. package/src/api/ipfs/ipfs.service.js +8 -8
  84. package/src/api/object-layer/object-layer.router.js +512 -507
  85. package/src/api/object-layer/object-layer.service.js +17 -14
  86. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
  87. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +5 -5
  88. package/src/api/test/test.router.js +17 -12
  89. package/src/api/types.js +24 -0
  90. package/src/api/user/guest.service.js +5 -4
  91. package/src/api/user/user.router.js +297 -288
  92. package/src/api/user/user.service.js +100 -35
  93. package/src/cli/baremetal.js +132 -101
  94. package/src/cli/cluster.js +700 -232
  95. package/src/cli/db.js +59 -60
  96. package/src/cli/deploy.js +216 -137
  97. package/src/cli/fs.js +13 -3
  98. package/src/cli/index.js +80 -15
  99. package/src/cli/ipfs.js +4 -6
  100. package/src/cli/kubectl.js +4 -1
  101. package/src/cli/lxd.js +1099 -223
  102. package/src/cli/monitor.js +9 -3
  103. package/src/cli/release.js +334 -140
  104. package/src/cli/repository.js +68 -23
  105. package/src/cli/run.js +193 -49
  106. package/src/cli/secrets.js +11 -2
  107. package/src/cli/test.js +9 -3
  108. package/src/client/Default.index.js +9 -3
  109. package/src/client/components/core/Auth.js +5 -0
  110. package/src/client/components/core/ClientEvents.js +76 -0
  111. package/src/client/components/core/EventBus.js +4 -0
  112. package/src/client/components/core/Modal.js +82 -41
  113. package/src/client/components/core/PanelForm.js +56 -52
  114. package/src/client/components/core/Worker.js +162 -363
  115. package/src/client/components/cyberia/MapEngineCyberia.js +1 -1
  116. package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
  117. package/src/client/public/cyberia-docs/ARCHITECTURE.md +50 -410
  118. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +114 -327
  119. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +200 -222
  120. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +203 -185
  121. package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
  122. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +2 -2
  123. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  124. package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
  125. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  126. package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
  127. package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
  128. package/src/client/sw/core.sw.js +174 -112
  129. package/src/db/DataBaseProvider.js +115 -15
  130. package/src/db/mariadb/MariaDB.js +2 -1
  131. package/src/db/mongo/MongoBootstrap.js +657 -0
  132. package/src/db/mongo/MongooseDB.js +129 -21
  133. package/src/grpc/cyberia/grpc-server.js +25 -57
  134. package/src/index.js +1 -1
  135. package/src/runtime/cyberia-client/Dockerfile +24 -3
  136. package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
  137. package/src/runtime/cyberia-server/Dockerfile +29 -4
  138. package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
  139. package/src/runtime/express/Express.js +2 -2
  140. package/src/runtime/wp/Wp.js +8 -5
  141. package/src/server/auth.js +2 -2
  142. package/src/server/client-build-docs.js +1 -1
  143. package/src/server/client-build.js +94 -129
  144. package/src/server/conf.js +86 -83
  145. package/src/server/process.js +180 -19
  146. package/src/server/proxy.js +9 -2
  147. package/src/server/runtime.js +1 -1
  148. package/src/server/start.js +17 -5
  149. package/src/server/valkey.js +2 -0
  150. package/src/ws/IoInterface.js +16 -16
  151. package/src/ws/core/channels/core.ws.chat.js +11 -11
  152. package/src/ws/core/channels/core.ws.mailer.js +29 -29
  153. package/src/ws/core/channels/core.ws.stream.js +19 -19
  154. package/src/ws/core/core.ws.connection.js +8 -8
  155. package/src/ws/core/core.ws.server.js +6 -5
  156. package/src/ws/default/channels/default.ws.main.js +10 -10
  157. package/src/ws/default/default.ws.connection.js +4 -4
  158. package/src/ws/default/default.ws.server.js +4 -3
  159. package/bin/file.js +0 -202
  160. package/bin/vs.js +0 -74
  161. package/bin/zed.js +0 -84
  162. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -574
  163. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -467
  164. package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
  165. package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
  166. package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
  167. /package/src/client/ssr/{offline → views}/Maintenance.js +0 -0
  168. /package/src/client/ssr/{offline → views}/NoNetworkConnection.js +0 -0
  169. /package/src/client/ssr/{pages → views}/Test.js +0 -0
package/bin/build.js CHANGED
@@ -69,6 +69,7 @@ if (process.argv.includes('conf')) {
69
69
  ` && underpost push . ${privateGitUri}`,
70
70
  {
71
71
  silent: true,
72
+ silentOnError: true,
72
73
  },
73
74
  );
74
75
  }
@@ -163,32 +164,46 @@ const { DefaultConf } = await import(`../conf.${confName}.js`);
163
164
  `./.github/workflows/publish.cyberia.ci.yml`,
164
165
  `${basePath}/.github/workflows/publish.cyberia.ci.yml`,
165
166
  );
166
- delete packageJson.bin.underpost;
167
+ if (packageJson.bin) delete packageJson.bin.underpost;
168
+ if (!packageJson.bin) packageJson.bin = {};
167
169
  packageJson.bin.cyberia = 'bin/index.js';
168
170
  packageJson.keywords = [
169
171
  'cyberia',
172
+ 'cyberia-cli',
173
+ 'engine-cyberia',
174
+ 'sidecar',
175
+ 'data-layer',
176
+ 'engine-cyberia',
170
177
  'object-layer',
171
- 'game-engine',
172
- 'assets-management',
173
- 'web3',
174
178
  'atlas-sprite-sheet',
179
+ 'ipfs',
180
+ 'erc-1155',
181
+ 'object-layer-token',
182
+ 'hardhat',
183
+ 'hyperledger-besu',
184
+ 'blockchain',
185
+ 'web3',
186
+ 'underpost-platform',
187
+ 'mmorpg',
175
188
  ];
176
- packageJson.description = 'Cyberia Engine - Object Layer and Assets Management Microservice';
177
- const { CyberiaDependencies } = await import(`../src/client/components/cyberia-portal/CommonCyberiaPortal.js`);
189
+ packageJson.description =
190
+ 'Cyberia CLI toolchain for the Cyberia MMO data layer, content pipeline, persistence, gRPC services, and ERC-1155 lifecycle on Hyperledger Besu.';
191
+ const { CyberiaDependencies } = await import(`../src/api/cyberia-server-defaults/cyberia-server-defaults.js`);
178
192
  packageJson.dependencies = {
179
193
  ...originPackageJson.dependencies,
180
194
  ...CyberiaDependencies,
181
195
  };
182
196
  fs.writeFileSync(`${basePath}/bin/index.js`, fs.readFileSync(`./bin/cyberia.js`, 'utf8'), 'utf8');
197
+ // Canonical Cyberia doc; engine-cyberia/README.md is a generated copy — never hand-edited.
183
198
  fs.writeFileSync(
184
199
  `${basePath}/README.md`,
185
- fs.readFileSync(`./src/client/public/cyberia-docs/CYBERIA-CLI.md`, 'utf8'),
200
+ fs.readFileSync(`./src/client/public/cyberia-docs/CYBERIA.md`, 'utf8'),
186
201
  'utf8',
187
202
  );
188
203
  fs.copySync(`./hardhat`, `${basePath}/hardhat`);
189
204
  for (const path of [
190
205
  '/src/grpc/cyberia',
191
- '/src/client/ssr/pages/CyberiaServerMetrics.js',
206
+ '/src/client/ssr/views/CyberiaServerMetrics.js',
192
207
  '/src/server/object-layer.js',
193
208
  '/src/server/atlas-sprite-sheet-generator.js',
194
209
  '/src/server/shape-generator.js',
@@ -202,6 +217,7 @@ const { DefaultConf } = await import(`../conf.${confName}.js`);
202
217
  '/src/runtime/cyberia-client',
203
218
  '/.github/workflows/hardhat.ci.yml',
204
219
  '/src/client/public/cyberia-docs',
220
+ '/src/api/cyberia-server-defaults',
205
221
  ])
206
222
  fs.copySync(`.${path}`, `${basePath}${path}`);
207
223
 
@@ -0,0 +1,187 @@
1
+ import fs from 'fs-extra';
2
+
3
+ import { loggerFactory } from '../src/server/logger.js';
4
+ import { getDirname, newInstance, uniqueArray } from '../src/client/components/core/CommonJs.js';
5
+ import { shellExec } from '../src/server/process.js';
6
+ import walk from 'ignore-walk';
7
+ import { validateTemplatePath } from '../src/server/conf.js';
8
+ import dotenv from 'dotenv';
9
+
10
+ const logger = loggerFactory(import.meta);
11
+
12
+ if (fs.existsSync('./engine-private/conf/dd-cron/.env.production'))
13
+ dotenv.config({
14
+ path: `./engine-private/conf/dd-cron/.env.production`,
15
+ override: true,
16
+ });
17
+ else dotenv.config();
18
+
19
+ // Engine-only paths stripped from the template after the source sync.
20
+ const TEMPLATE_DELETE_PATHS = [
21
+ './.github',
22
+ './manifests/deployment/dd-lampp-development',
23
+ './manifests/deployment/dd-cyberia-development',
24
+ './manifests/deployment/dd-core-development',
25
+ './manifests/deployment/dd-template-development',
26
+ './src/server/object-layer.js',
27
+ './src/server/atlas-sprite-sheet-generator.js',
28
+ './src/server/shape-generator.js',
29
+ './src/server/semantic-layer-generator.js',
30
+ './src/server/semantic-layer-generator-floor.js',
31
+ './src/server/semantic-layer-generator-skin.js',
32
+ './src/server/semantic-layer-generator-resource.js',
33
+ './src/server/besu-genesis-generator.js',
34
+ './src/grpc/cyberia',
35
+ './src/runtime/cyberia-server',
36
+ './src/runtime/cyberia-client',
37
+ './test/shape-generator.test.js',
38
+ './src/client/public/cyberia-docs',
39
+ 'bin/cyberia.js',
40
+ './hardhat',
41
+ ];
42
+
43
+ // Workflow + service files re-added to the template after the engine-only strip above.
44
+ const TEMPLATE_RESTORE_PATHS = [
45
+ `./.github/workflows/pwa-microservices-template-page.cd.yml`,
46
+ `./.github/workflows/pwa-microservices-template-test.ci.yml`,
47
+ `./.github/workflows/npmpkg.ci.yml`,
48
+ `./.github/workflows/ghpkg.ci.yml`,
49
+ `./.github/workflows/gitlab.ci.yml`,
50
+ `./.github/workflows/publish.ci.yml`,
51
+ `./.github/workflows/release.cd.yml`,
52
+ `./src/client/services/user/guest.service.js`,
53
+ './src/api/user/guest.service.js',
54
+ './src/ws/IoInterface.js',
55
+ './src/ws/IoServer.js',
56
+ ];
57
+
58
+ const TEMPLATE_KEYWORDS = [
59
+ 'underpost',
60
+ 'underpost-platform',
61
+ 'cli',
62
+ 'toolchain',
63
+ 'ci-cd',
64
+ 'devops',
65
+ 'kubernetes',
66
+ 'k3s',
67
+ 'kubeadm',
68
+ 'lxd',
69
+ 'bare-metal',
70
+ 'container-orchestration',
71
+ 'image-management',
72
+ 'pwa',
73
+ 'workbox',
74
+ 'microservices',
75
+ ];
76
+
77
+ const TEMPLATE_DESCRIPTION =
78
+ 'Underpost Platform — end-to-end CI/CD and application-delivery toolchain CLI. Covers bare metal, Kubernetes, K3s, kubeadm, LXD, container/image orchestration, secrets, databases, cron jobs, monitoring, SSH, runners, PWA + Workbox delivery, and release orchestration. Extensible via downstream CLIs.';
79
+
80
+ /**
81
+ * Builds the pwa-microservices-template from scratch out of the current engine source tree.
82
+ *
83
+ * Clones (or resets) the template repo next to the engine, syncs every engine-tracked file the
84
+ * template is allowed to carry (validateTemplatePath), strips engine-only modules, restores the
85
+ * template's own CI workflows + guest services, and rewrites package.json / package-lock.json /
86
+ * README so the template is a standalone, installable project.
87
+ *
88
+ * Usage: node bin/build.template [srcPath=./] [toPath=../pwa-microservices-template]
89
+ */
90
+ const srcPath = (process.argv[2] ?? './').replaceAll(`'`, '');
91
+ const toPath = (process.argv[3] ?? '../pwa-microservices-template').replaceAll(`'`, '');
92
+ const githubUsername = process.env.GITHUB_USERNAME;
93
+
94
+ logger.info('Build template', { srcPath, toPath });
95
+
96
+ try {
97
+ const sourceFiles = (
98
+ await new Promise((resolve) =>
99
+ walk(
100
+ {
101
+ path: srcPath,
102
+ ignoreFiles: [`.gitignore`],
103
+ includeEmpty: false,
104
+ follow: false,
105
+ },
106
+ (...args) => resolve(args[1]),
107
+ ),
108
+ )
109
+ ).filter((p) => !p.startsWith('.git'));
110
+
111
+ // Clone the template from 0 if missing; otherwise reset it to a clean pristine checkout.
112
+ if (!fs.existsSync(toPath)) {
113
+ shellExec(`cd .. && node engine/bin clone ${githubUsername}/pwa-microservices-template`);
114
+ } else {
115
+ shellExec(`cd ${toPath} && git reset && git checkout . && git clean -f -d`);
116
+ shellExec(`node bin pull ${toPath} ${githubUsername}/pwa-microservices-template`);
117
+ shellExec(`sudo rm -rf ${toPath}/engine-private`);
118
+ shellExec(`sudo rm -rf ${toPath}/logs`);
119
+ }
120
+ shellExec(`cd ${toPath} && git config core.filemode false`);
121
+
122
+ for (const copyPath of sourceFiles) {
123
+ if (copyPath === 'NaN') continue;
124
+ const absolutePath = `${srcPath}/${copyPath}`;
125
+ if (!validateTemplatePath(absolutePath)) continue;
126
+
127
+ const folder = getDirname(`${toPath}/${copyPath}`);
128
+ if (!fs.existsSync(folder)) fs.mkdirSync(folder, { recursive: true });
129
+
130
+ logger.info('build', `${toPath}/${copyPath}`);
131
+ fs.copyFileSync(absolutePath, `${toPath}/${copyPath}`);
132
+ }
133
+
134
+ fs.copySync(`./.vscode`, `${toPath}/.vscode`);
135
+ fs.copySync(`./src/client/public/default`, `${toPath}/src/client/public/default`);
136
+
137
+ // Preserve the template's own README + package.json identity before merging engine metadata.
138
+ for (const checkoutPath of ['README.md', 'package.json']) shellExec(`cd ${toPath} && git checkout ${checkoutPath}`);
139
+
140
+ for (const deletePath of TEMPLATE_DELETE_PATHS) {
141
+ const target = `${toPath}/${deletePath}`;
142
+ if (fs.existsSync(target)) fs.removeSync(target);
143
+ }
144
+
145
+ fs.mkdirSync(`${toPath}/.github/workflows`, { recursive: true });
146
+ for (const restorePath of TEMPLATE_RESTORE_PATHS) fs.copyFileSync(restorePath, `${toPath}/${restorePath}`);
147
+
148
+ // ── package.json: take engine deps/scripts/version, keep template identity. ──
149
+ const originPackageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8'));
150
+ const templatePackageJson = JSON.parse(fs.readFileSync(`${toPath}/package.json`, 'utf8'));
151
+ const templateName = templatePackageJson.name;
152
+
153
+ templatePackageJson.dependencies = originPackageJson.dependencies;
154
+ templatePackageJson.devDependencies = originPackageJson.devDependencies;
155
+ templatePackageJson.version = originPackageJson.version;
156
+ templatePackageJson.scripts = originPackageJson.scripts;
157
+ templatePackageJson.overrides = originPackageJson.overrides;
158
+ templatePackageJson.name = templateName;
159
+ templatePackageJson.description = TEMPLATE_DESCRIPTION;
160
+ templatePackageJson.keywords = uniqueArray(TEMPLATE_KEYWORDS.concat(templatePackageJson.keywords || []));
161
+ delete templatePackageJson.scripts['update:template'];
162
+ fs.writeFileSync(`${toPath}/package.json`, JSON.stringify(templatePackageJson, null, 4), 'utf8');
163
+
164
+ // ── package-lock.json: mirror engine packages, keep template name/version on the root entry. ──
165
+ const originPackageLockJson = JSON.parse(fs.readFileSync('./package-lock.json', 'utf8'));
166
+ const templatePackageLockJson = JSON.parse(fs.readFileSync(`${toPath}/package-lock.json`, 'utf8'));
167
+ const originBasePackageLock = newInstance(templatePackageLockJson.packages['']);
168
+ templatePackageLockJson.name = templateName;
169
+ templatePackageLockJson.version = originPackageLockJson.version;
170
+ templatePackageLockJson.packages = originPackageLockJson.packages;
171
+ templatePackageLockJson.packages[''].name = templateName;
172
+ templatePackageLockJson.packages[''].version = originPackageLockJson.version;
173
+ templatePackageLockJson.packages[''].hasInstallScript = originBasePackageLock.hasInstallScript;
174
+ templatePackageLockJson.packages[''].license = originBasePackageLock.license;
175
+ fs.writeFileSync(`${toPath}/package-lock.json`, JSON.stringify(templatePackageLockJson, null, 4), 'utf8');
176
+
177
+ fs.writeFileSync(
178
+ `${toPath}/README.md`,
179
+ fs
180
+ .readFileSync('./README.md', 'utf8')
181
+ .replace('<!-- template-title -->', '#### Base template for pwa/api-rest projects.'),
182
+ 'utf8',
183
+ );
184
+ } catch (error) {
185
+ logger.error(error, error.stack);
186
+ process.exit(1);
187
+ }