@jakubmazanec/carson 0.1.0-9029e49 → 0.1.0-c5ebb6f

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 (180) hide show
  1. package/README.md +124 -12
  2. package/dist/commands/create-project/CreateProject.js +2 -2
  3. package/dist/commands/create-project/CreateProject.js.map +1 -1
  4. package/dist/commands/create-project/CreateProjectInput.js.map +1 -1
  5. package/dist/commands/create-project/createProjectCommand.js.map +1 -1
  6. package/dist/commands/create-project/runCreateProject.js +1 -1
  7. package/dist/commands/create-project/runCreateProject.js.map +1 -1
  8. package/dist/commands/create-workspace/CreateWorkspace.js +2 -2
  9. package/dist/commands/create-workspace/CreateWorkspace.js.map +1 -1
  10. package/dist/commands/create-workspace/CreateWorkspaceInput.js.map +1 -1
  11. package/dist/commands/create-workspace/createWorkspaceCommand.js.map +1 -1
  12. package/dist/commands/create-workspace/runCreateWorkspace.js +1 -1
  13. package/dist/commands/create-workspace/runCreateWorkspace.js.map +1 -1
  14. package/dist/commands/internals/packageNameToDirectory.js.map +1 -1
  15. package/dist/commands/update-workspace/UpdateWorkspace.js +2 -2
  16. package/dist/commands/update-workspace/UpdateWorkspace.js.map +1 -1
  17. package/dist/commands/update-workspace/runUpdateWorkspace.js +1 -1
  18. package/dist/commands/update-workspace/runUpdateWorkspace.js.map +1 -1
  19. package/dist/commands/update-workspace/updateWorkspaceCommand.js.map +1 -1
  20. package/dist/constants.js +0 -4
  21. package/dist/constants.js.map +1 -1
  22. package/dist/run.js.map +1 -1
  23. package/dist/template/CarsonTemplate.d.ts +6 -0
  24. package/dist/template/CarsonTemplate.js.map +1 -1
  25. package/dist/template/CarsonTemplateConfig.d.ts +3 -0
  26. package/dist/template/CarsonTemplateConfig.js.map +1 -1
  27. package/dist/template/TemplateAttributes.js +11 -10
  28. package/dist/template/TemplateAttributes.js.map +1 -1
  29. package/dist/template/TemplateData.d.ts +0 -18
  30. package/dist/template/TemplateData.js +1 -3
  31. package/dist/template/TemplateData.js.map +1 -1
  32. package/dist/template/TemplateRender.d.ts +3 -0
  33. package/dist/template/TemplateRender.js.map +1 -1
  34. package/dist/template/TemplateRenders.d.ts +3 -0
  35. package/dist/template/TemplateRenders.js.map +1 -1
  36. package/dist/template/applyTemplateRenders.d.ts +2 -3
  37. package/dist/template/applyTemplateRenders.js +17 -17
  38. package/dist/template/applyTemplateRenders.js.map +1 -1
  39. package/dist/template/{TemplateRenderSnapshot.js → internals/TemplateRenderSnapshot.js} +1 -1
  40. package/dist/template/internals/TemplateRenderSnapshot.js.map +1 -0
  41. package/dist/template/internals/TemplateRenderSnapshots.js.map +1 -0
  42. package/dist/template/internals/createUsingTemplateRender.d.ts +3 -0
  43. package/dist/template/internals/createUsingTemplateRender.js +12 -0
  44. package/dist/template/internals/createUsingTemplateRender.js.map +1 -0
  45. package/dist/template/internals/deleteUsingTemplateRender.d.ts +3 -0
  46. package/dist/template/internals/deleteUsingTemplateRender.js +10 -0
  47. package/dist/template/internals/deleteUsingTemplateRender.js.map +1 -0
  48. package/dist/template/internals/importCarsonTemplate.js +8 -0
  49. package/dist/template/internals/importCarsonTemplate.js.map +1 -0
  50. package/dist/template/internals/insertUsingTemplateRender.d.ts +3 -0
  51. package/dist/template/internals/insertUsingTemplateRender.js +31 -0
  52. package/dist/template/internals/insertUsingTemplateRender.js.map +1 -0
  53. package/dist/template/internals/loadTemplateRenderSnapshots.js.map +1 -0
  54. package/dist/template/internals/merge.js.map +1 -1
  55. package/dist/template/internals/mergeUsingTemplateRender.d.ts +3 -0
  56. package/dist/template/{mergeFileUsingTemplateRender.js → internals/mergeUsingTemplateRender.js} +7 -6
  57. package/dist/template/internals/mergeUsingTemplateRender.js.map +1 -0
  58. package/dist/template/internals/overwriteUsingTemplateRender.d.ts +3 -0
  59. package/dist/template/internals/overwriteUsingTemplateRender.js +12 -0
  60. package/dist/template/internals/overwriteUsingTemplateRender.js.map +1 -0
  61. package/dist/template/internals/parseCarsonTemplateId.d.ts +1 -0
  62. package/dist/template/{parseTemplateId.js → internals/parseCarsonTemplateId.js} +2 -2
  63. package/dist/template/internals/parseCarsonTemplateId.js.map +1 -0
  64. package/dist/template/internals/prettify.js.map +1 -1
  65. package/dist/template/{readCarsonTemplate.d.ts → internals/readCarsonTemplate.d.ts} +1 -1
  66. package/dist/template/{readCarsonTemplate.js → internals/readCarsonTemplate.js} +7 -7
  67. package/dist/template/internals/readCarsonTemplate.js.map +1 -0
  68. package/dist/template/internals/resolveModule.d.ts +1 -0
  69. package/dist/template/{resolveTemplateModule.js → internals/resolveModule.js} +2 -2
  70. package/dist/template/internals/resolveModule.js.map +1 -0
  71. package/dist/template/{saveTemplateRenderSnapshots.d.ts → internals/saveTemplateRenderSnapshots.d.ts} +1 -1
  72. package/dist/template/internals/saveTemplateRenderSnapshots.js.map +1 -0
  73. package/dist/template/internals/uninsertUsingTemplateRender.d.ts +3 -0
  74. package/dist/template/internals/uninsertUsingTemplateRender.js +31 -0
  75. package/dist/template/internals/uninsertUsingTemplateRender.js.map +1 -0
  76. package/dist/template/internals/unmerge.js.map +1 -1
  77. package/dist/template/internals/unmergeUsingTemplateRender.d.ts +3 -0
  78. package/dist/template/{unmergeFileUsingTemplateRender.js → internals/unmergeUsingTemplateRender.js} +7 -6
  79. package/dist/template/internals/unmergeUsingTemplateRender.js.map +1 -0
  80. package/dist/template/internals.d.ts +16 -1
  81. package/dist/template/internals.js +16 -1
  82. package/dist/template/internals.js.map +1 -1
  83. package/dist/template/{renderTemplate.d.ts → renderCarsonTemplate.d.ts} +2 -2
  84. package/dist/template/renderCarsonTemplate.js +23 -0
  85. package/dist/template/renderCarsonTemplate.js.map +1 -0
  86. package/dist/template.d.ts +1 -13
  87. package/dist/template.js +1 -13
  88. package/dist/template.js.map +1 -1
  89. package/dist/workspace/Project.js +12 -10
  90. package/dist/workspace/Project.js.map +1 -1
  91. package/dist/workspace/ProjectConfig.js.map +1 -1
  92. package/dist/workspace/Workspace.js +16 -13
  93. package/dist/workspace/Workspace.js.map +1 -1
  94. package/dist/workspace/WorkspaceConfig.js.map +1 -1
  95. package/dist/workspace/WorkspaceDependencies.d.ts +0 -3
  96. package/dist/workspace/WorkspaceDependencies.js +7 -4
  97. package/dist/workspace/WorkspaceDependencies.js.map +1 -1
  98. package/dist/workspace/internals/compareSemver.js.map +1 -1
  99. package/dist/workspace/internals/getPackageJsonWorkspaces.js.map +1 -1
  100. package/dist/workspace/internals/getRepositoryBranches.js.map +1 -1
  101. package/dist/workspace/internals/getRepositoryUrl.js +1 -1
  102. package/dist/workspace/internals/getRepositoryUrl.js.map +1 -1
  103. package/dist/workspace/saveProjectConfig.js +1 -1
  104. package/dist/workspace/saveProjectConfig.js.map +1 -1
  105. package/dist/workspace/saveWorkspaceConfig.js +1 -1
  106. package/dist/workspace/saveWorkspaceConfig.js.map +1 -1
  107. package/package.json +9 -10
  108. package/src/constants.ts +0 -8
  109. package/src/template/CarsonTemplate.ts +9 -0
  110. package/src/template/CarsonTemplateConfig.ts +3 -0
  111. package/src/template/TemplateAttributes.ts +9 -7
  112. package/src/template/TemplateData.ts +0 -2
  113. package/src/template/TemplateRender.ts +3 -0
  114. package/src/template/TemplateRenders.ts +3 -0
  115. package/src/template/applyTemplateRenders.ts +38 -20
  116. package/src/template/{TemplateRenderSnapshot.ts → internals/TemplateRenderSnapshot.ts} +1 -1
  117. package/src/template/internals/createUsingTemplateRender.ts +16 -0
  118. package/src/template/internals/deleteUsingTemplateRender.ts +16 -0
  119. package/src/template/{importCarsonTemplate.ts → internals/importCarsonTemplate.ts} +2 -2
  120. package/src/template/internals/insertUsingTemplateRender.ts +39 -0
  121. package/src/template/{mergeFileUsingTemplateRender.ts → internals/mergeUsingTemplateRender.ts} +12 -7
  122. package/src/template/internals/overwriteUsingTemplateRender.ts +16 -0
  123. package/src/template/{parseTemplateId.ts → internals/parseCarsonTemplateId.ts} +1 -1
  124. package/src/template/{readCarsonTemplate.ts → internals/readCarsonTemplate.ts} +8 -8
  125. package/src/template/{resolveTemplateModule.ts → internals/resolveModule.ts} +1 -1
  126. package/src/template/{saveTemplateRenderSnapshots.ts → internals/saveTemplateRenderSnapshots.ts} +1 -1
  127. package/src/template/internals/uninsertUsingTemplateRender.ts +39 -0
  128. package/src/template/{unmergeFileUsingTemplateRender.ts → internals/unmergeUsingTemplateRender.ts} +8 -6
  129. package/src/template/internals.ts +16 -1
  130. package/src/template/{renderTemplate.ts → renderCarsonTemplate.ts} +13 -5
  131. package/src/template.ts +1 -13
  132. package/src/workspace/Project.ts +5 -7
  133. package/src/workspace/Workspace.ts +5 -7
  134. package/src/workspace/WorkspaceDependencies.ts +0 -4
  135. package/dist/template/TemplateRenderSnapshot.js.map +0 -1
  136. package/dist/template/TemplateRenderSnapshots.js.map +0 -1
  137. package/dist/template/createFileUsingTemplateRender.d.ts +0 -2
  138. package/dist/template/createFileUsingTemplateRender.js +0 -12
  139. package/dist/template/createFileUsingTemplateRender.js.map +0 -1
  140. package/dist/template/deleteFileUsingTemplateRender.d.ts +0 -2
  141. package/dist/template/deleteFileUsingTemplateRender.js +0 -10
  142. package/dist/template/deleteFileUsingTemplateRender.js.map +0 -1
  143. package/dist/template/importCarsonTemplate.js +0 -8
  144. package/dist/template/importCarsonTemplate.js.map +0 -1
  145. package/dist/template/insertUsingTemplateRender.d.ts +0 -2
  146. package/dist/template/insertUsingTemplateRender.js +0 -29
  147. package/dist/template/insertUsingTemplateRender.js.map +0 -1
  148. package/dist/template/loadTemplateRenderSnapshots.js.map +0 -1
  149. package/dist/template/mergeFileUsingTemplateRender.d.ts +0 -2
  150. package/dist/template/mergeFileUsingTemplateRender.js.map +0 -1
  151. package/dist/template/overwriteFileUsingTemplateRender.d.ts +0 -2
  152. package/dist/template/overwriteFileUsingTemplateRender.js +0 -12
  153. package/dist/template/overwriteFileUsingTemplateRender.js.map +0 -1
  154. package/dist/template/parseTemplateId.d.ts +0 -1
  155. package/dist/template/parseTemplateId.js.map +0 -1
  156. package/dist/template/readCarsonTemplate.js.map +0 -1
  157. package/dist/template/renderTemplate.js +0 -19
  158. package/dist/template/renderTemplate.js.map +0 -1
  159. package/dist/template/resolveTemplateModule.d.ts +0 -1
  160. package/dist/template/resolveTemplateModule.js.map +0 -1
  161. package/dist/template/saveTemplateRenderSnapshots.js.map +0 -1
  162. package/dist/template/uninsertUsingTemplateRender.d.ts +0 -2
  163. package/dist/template/uninsertUsingTemplateRender.js +0 -29
  164. package/dist/template/uninsertUsingTemplateRender.js.map +0 -1
  165. package/dist/template/unmergeFileUsingTemplateRender.d.ts +0 -2
  166. package/dist/template/unmergeFileUsingTemplateRender.js.map +0 -1
  167. package/src/template/createFileUsingTemplateRender.ts +0 -12
  168. package/src/template/deleteFileUsingTemplateRender.ts +0 -15
  169. package/src/template/insertUsingTemplateRender.ts +0 -33
  170. package/src/template/overwriteFileUsingTemplateRender.ts +0 -12
  171. package/src/template/uninsertUsingTemplateRender.ts +0 -36
  172. /package/dist/template/{TemplateRenderSnapshot.d.ts → internals/TemplateRenderSnapshot.d.ts} +0 -0
  173. /package/dist/template/{TemplateRenderSnapshots.d.ts → internals/TemplateRenderSnapshots.d.ts} +0 -0
  174. /package/dist/template/{TemplateRenderSnapshots.js → internals/TemplateRenderSnapshots.js} +0 -0
  175. /package/dist/template/{importCarsonTemplate.d.ts → internals/importCarsonTemplate.d.ts} +0 -0
  176. /package/dist/template/{loadTemplateRenderSnapshots.d.ts → internals/loadTemplateRenderSnapshots.d.ts} +0 -0
  177. /package/dist/template/{loadTemplateRenderSnapshots.js → internals/loadTemplateRenderSnapshots.js} +0 -0
  178. /package/dist/template/{saveTemplateRenderSnapshots.js → internals/saveTemplateRenderSnapshots.js} +0 -0
  179. /package/src/template/{TemplateRenderSnapshots.ts → internals/TemplateRenderSnapshots.ts} +0 -0
  180. /package/src/template/{loadTemplateRenderSnapshots.ts → internals/loadTemplateRenderSnapshots.ts} +0 -0
package/README.md CHANGED
@@ -1,10 +1,12 @@
1
+ <!-- header -->
1
2
  <div align="center">
2
3
 
3
4
  # @jakubmazanec/carson
4
5
 
5
- <!-- description -->Tool for managing workspace and project configuration.<!-- description -->
6
+ Tool for managing workspace and project configuration.
6
7
 
7
8
  </div>
9
+ <!-- header -->
8
10
 
9
11
  ## Installation
10
12
 
@@ -47,7 +49,7 @@ See [CLI documentation](#cli) for the complete overview.
47
49
  ### How it works
48
50
 
49
51
  Carson assumes your codebase is organized in a workspace, which is simply a directory, and also
50
- usually a git repository, that contains one or multiple projects. A project is a self-contained
52
+ usually a Git repository, that contains one or multiple projects. A project is a self-contained
51
53
  piece of code, e.g. a package, or an app.
52
54
 
53
55
  > ⚠️ Currently only Node.js projects are supported.
@@ -100,8 +102,9 @@ YAML front matter. Please read [`@jakubmazanec/template` documentation](../templ
100
102
  find out in more detail how they work. Simply, they're for generating content using JavaScript as a
101
103
  templating language.
102
104
 
103
- > Yes, each "Carson template" is composed of multiple "EJS templates". Hopefully, the existence of
104
- > these two different template "types" isn't very confusing.
105
+ > Yes, each "Carson template" is composed of multiple template files, and each of these files
106
+ > contains an "EJS template". Hopefully, the existence of these two different templates "types"
107
+ > isn't very confusing.
105
108
 
106
109
  Take a look at this simplified example of `carson-templates` with two templates named `workspace`
107
110
  and `project`:
@@ -146,13 +149,13 @@ strategy: merge
146
149
  When Carson performs a workspace update, `carson-templates:project` template is rendered for each
147
150
  project that uses it, and `foo`, and `bar` have their files changed accordingly. In this example
148
151
  that means `foo/package.json` and `bar/package.json` are recursively merged with the JSONs obtained
149
- from the EJS template above (so SWC is added to development dependencies, or field
150
- `repository.directory` is set to always be the value of a variable `project.relativePath`, i.e.
151
- `'packages/foo'` or `'packages/bar'`). Updating the workspace works the same way (although using a
152
- different Carson template, e.g. `carson-templates:workspace`).
152
+ from the EJS template above (SWC is added to development dependencies, field `repository.directory`
153
+ is set to always be the value of a variable `project.relativePath`, i.e. `'packages/foo'` or
154
+ `'packages/bar'`, and so on). Updating the workspace works the same way (although using a different
155
+ Carson template, e.g. `carson-templates:workspace`).
153
156
 
154
157
  When you install a newer version of `carson-templates` that e.g. replaces SWC with another tool,
155
- before Carson does fresh update, it first uses saved (and committed to git) snapshots from the
158
+ before Carson does a fresh update, it first uses saved (and committed to Git) snapshots from the
156
159
  previous update to revert all its changes. This way you don't need to keep the previous version of
157
160
  `carson-templates` around and the updates can be always done automatically from the current state of
158
161
  the workspace.
@@ -174,8 +177,8 @@ See [API reference](./docs) for auto-generated documentation.
174
177
  ### Configuration
175
178
 
176
179
  Carson configuration files are located in a directory named `.carson` directory. Files named
177
- `workspace.json` and `project.json` are used to configure workspace and project respectively (in
178
- case of single-project workspace they're both in the same `.carson` directory).
180
+ `workspace.json` and `project.json` are used to configure the workspace and project respectively (in
181
+ the case of single-project workspace they're both in the same `.carson` directory).
179
182
 
180
183
  You can add arbitrary data to these JSONs in addition to the options described below. Because
181
184
  workspace and project configurations are available as JavaScript variables during the rendering of
@@ -200,6 +203,8 @@ configuration.
200
203
 
201
204
  Updates workspace and all projects using the configured Carson templates.
202
205
 
206
+ > ⚠️ Make sure to have committed all changes to Git, in case the update doesn't work as you expect.
207
+
203
208
  | Option | Description |
204
209
  | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
205
210
  | --path | Path to the workspace. A relative path is appended to the current working directory. The file system is traversed up to the root when looking for a workspace. |
@@ -225,7 +230,114 @@ Creates new workspace.
225
230
 
226
231
  ### Carson templates
227
232
 
228
- 🚧 This section is under development. Please check back later for updates.
233
+ Carson template is just a directory containing `*.ejs` files and `config.json` file. The purpose of
234
+ a Carson template is to describe what files with what content should exist in a project or workspace
235
+ the template is applied to.
236
+
237
+ Carson templates are identified using a template ID consisting of two colon-separated parts: a bare
238
+ module specifier and a template name, e.g. `@jakubmazanec/carson-templates:projects/library`.
239
+
240
+ Because of this, you should organize your Carson templates by putting all of them into a single
241
+ package that has to look like this:
242
+
243
+ ```
244
+ carson-templates@1.0.0/
245
+ ├── src/
246
+ │ └── main.js
247
+ ├── templates/
248
+ │ ├── projects/
249
+ │ │ ├── app/
250
+ │ │ │ ├── config.json
251
+ │ │ │ └── package.json.ejs
252
+ │ │ └── library/
253
+ │ │ ├── config.json
254
+ │ │ └── package.json.ejs
255
+ │ └── workspace/
256
+ │ ├── config.json
257
+ │ └── package.json.ejs
258
+ └── package.json
259
+ ```
260
+
261
+ This package must export `package.json` and right next to it contain a directory named `templates`
262
+ in which each template is located (under a path that corresponds to its name). In the example above,
263
+ there are 3 templates (for simplicity, each contains only one `*.ejs` file and a config file):
264
+
265
+ 1. `carson-templates:projects/app` located in `templates/projects/app`.
266
+ 2. `carson-templates:projects/library` located in `templates/projects/library`.
267
+ 3. `carson-templates:workspace` located in `templates/workspace`.
268
+
269
+ The package can also export some JavaScript code (defined in the `package.json` as usual); all named
270
+ export are available as global variables during the rendering of the template files.
271
+
272
+ #### Template files
273
+
274
+ All those `*.ejs` files are parsed and rendered via `@jakubmazanec/template` package; they are
275
+ actually [EJS](https://ejs.co/) templates with YAML front matter. Please read
276
+ [`@jakubmazanec/template` documentation](../template/README.md) to find out in more detail how they
277
+ work. Simply, they're for generating content using JavaScript as a templating language.
278
+
279
+ For a quick overview, look at the file `templates/projects/library/package.json.ejs`:
280
+
281
+ ```
282
+ ---
283
+ to: 'package.json'
284
+ strategy: merge
285
+ ---
286
+ {
287
+ "repository": {
288
+ "directory": "<%- project.relativePath %>"
289
+ },
290
+ "type": "module",
291
+ "exports": "./dist/main.js",
292
+ "files": [
293
+ "dist",
294
+ "src"
295
+ ],
296
+ "scripts": {
297
+ "build": "swc src -d dist"
298
+ },
299
+ "devDependencies": {
300
+ "@swc/cli": "^0.1.62",
301
+ "@swc/core": "^1.3.56"
302
+ }
303
+ }
304
+ ```
305
+
306
+ The YAML front matter contains metadata describing what to do with the content generated during the
307
+ rendering of the EJS template.
308
+
309
+ Attribute `to` is the path of the target file the resulting template render is supposed to be
310
+ written into. The path is appended to the project or workspace path. The extension is also used for
311
+ file format detection by Prettier.
312
+
313
+ Attribute `strategy` describes how exactly should the template render be written, or whether it
314
+ should be written at all.
315
+
316
+ | Strategy name | Example `strategy` value | Description |
317
+ | ------------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
318
+ | Create | `create` | The template render is written to the target file, but only when the Carson template is used to create a new workspace or project; when Carson performs an update, the template files with this strategy are not even rendered. |
319
+ | Overwrite | `overwrite` | The template render is written to the target file, overwriting its existing content. |
320
+ | Merge | `merge` | The template render is merged with the target file's existing content. Only simple objects, not arrays, are merged recursively. The only supported file formats are JSON and YAML. |
321
+ | Check | `check` | Only the target file's existence is checked, the template render is discarded; when Carson doesn't perform an update, the template files with this strategy are not even rendered. |
322
+ | Insert | `[insert, foobar]` | The template render is inserted between the first and last occurrence of an HTML comment containing configured string, e.g. `<!-- foobar -->`. The only supported file format is Markdown. |
323
+
324
+ The rest of the template file after the front matter is the actual EJS template.
325
+
326
+ > ⚠️ Because EJS templates can contain arbitrary JavaScript code which Carson will run, you
327
+ > shouldn't use Carson templates from untrusted sources! Only use templates that you've written or
328
+ > extensively reviewed.
329
+
330
+ Global variables available during the rendering:
331
+
332
+ | Variable name | Description |
333
+ | ------------- | ------------------------------------------------------------------------------------- |
334
+ | `workspace` | The workspace Carson is being run in. |
335
+ | `project` | The project Carson is creating or updating; is undefined when working on a workspace. |
336
+ | `args` | Parsed command line arguments that were used to execute Carson. |
337
+
338
+ #### Carson template config
339
+
340
+ Currently, the config isn't used for anything yet.
229
341
 
230
342
  ## Contributing
231
343
 
@@ -8,7 +8,7 @@ import { CreateProjectInput } from './CreateProjectInput.js';
8
8
  import { runCreateProject } from './runCreateProject.js';
9
9
  import { packageNameToDirectory } from '../internals.js';
10
10
  const ONLY_ONE_STAR_REGEXP = /^(?!(.*?\*){2,}|.*? |\*$).*?\*.*$/;
11
- export function CreateProject({ args , workspace }) {
11
+ export function CreateProject({ args, workspace }) {
12
12
  let [status, setStatus] = useState('not-started');
13
13
  let [subscription, setSubscription] = useState(null);
14
14
  let [jobs, setJobs] = useState([]);
@@ -26,7 +26,7 @@ export function CreateProject({ args , workspace }) {
26
26
  isComplete: !!args.options.template
27
27
  }
28
28
  }));
29
- let { exit } = useProgram();
29
+ let { exit } = useProgram();
30
30
  useEffect(()=>{
31
31
  if (Object.entries(createProjectInputResult).every(([, result])=>result.isComplete)) {
32
32
  setStatus('in-progress');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/create-project/CreateProject.tsx"],"sourcesContent":["import {Header, icons, colors, type CommandArguments, useProgram} from '@jakubmazanec/cli';\nimport chalk from 'chalk';\nimport {Box, Text} from 'ink';\nimport path from 'node:path';\nimport {useEffect, useState} from 'react';\n\nimport {type createProjectCommand} from './createProjectCommand.js';\nimport {CreateProjectInput, type CreateProjectInputResult} from './CreateProjectInput.js';\nimport {runCreateProject} from './runCreateProject.js';\nimport {type Workspace} from '../../workspace.js';\nimport {packageNameToDirectory} from '../internals.js';\n\nconst ONLY_ONE_STAR_REGEXP = /^(?!(.*?\\*){2,}|.*? |\\*$).*?\\*.*$/;\n\nexport type CreateProjectProps = {\n args: CommandArguments<typeof createProjectCommand>;\n workspace: Workspace | Workspace<false>;\n};\n\nexport function CreateProject({args, workspace}: CreateProjectProps) {\n let [status, setStatus] = useState<'finished' | 'in-progress' | 'not-started'>('not-started');\n let [subscription, setSubscription] = useState<ZenObservable.Subscription | null>(null);\n let [jobs, setJobs] = useState<string[]>([]);\n let [createProjectInputResult, setCreateProjectInputResult] = useState<CreateProjectInputResult>(\n () => ({\n projectName: {value: args.options.name ?? '', isComplete: !!args.options.name},\n projectPath: {value: '', isComplete: false},\n templateId: {value: args.options.template ?? '', isComplete: !!args.options.template},\n }),\n );\n let {exit} = useProgram();\n\n useEffect(() => {\n if (Object.entries(createProjectInputResult).every(([, result]) => result.isComplete)) {\n setStatus('in-progress');\n }\n }, [createProjectInputResult]);\n\n useEffect(() => {\n if (status === 'in-progress' && !subscription) {\n let newSubscription = runCreateProject({\n projectPath: createProjectInputResult.projectPath.value,\n templateId: createProjectInputResult.templateId.value,\n projectName: createProjectInputResult.projectName.value,\n workspace,\n args,\n }).subscribe({\n next(value) {\n setJobs((previousJobs) => [...previousJobs, value]);\n },\n error(error) {\n exit(error);\n },\n complete() {\n newSubscription.unsubscribe();\n setStatus('finished');\n },\n });\n setSubscription(newSubscription);\n }\n\n return () => {\n if (subscription) {\n subscription.unsubscribe();\n }\n };\n }, [args, createProjectInputResult, exit, status, subscription, workspace]);\n\n let possiblePaths: Array<{value: string; label: string}> = [];\n\n if (createProjectInputResult.projectName.value) {\n let destinationDirectory = packageNameToDirectory(createProjectInputResult.projectName.value);\n\n if (workspace.projectGlobs) {\n possiblePaths = workspace.projectGlobs\n .filter((projectGlob) => ONLY_ONE_STAR_REGEXP.test(projectGlob))\n .map((projectGlob) => projectGlob.replace(/\\*/, destinationDirectory))\n .map((projectGlob) => path.join(workspace.path, projectGlob))\n .map((projectPath) => ({\n value: projectPath,\n label: path.relative(workspace.path, projectPath).replace('\\\\', '/'),\n }));\n } else {\n possiblePaths = [\n {\n value: workspace.path,\n label: workspace.path,\n },\n ];\n }\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text color={colors.body}>\n {`Creating project in the workspace at ${chalk[colors.info](workspace.path)}.`}\n </Text>\n\n <CreateProjectInput\n rows={{\n projectPath: {\n choices: possiblePaths,\n },\n }}\n values={createProjectInputResult}\n marginTop={1}\n onChange={setCreateProjectInputResult}\n onComplete={setCreateProjectInputResult}\n />\n\n {status === 'in-progress' || status === 'finished' ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Header showSpinner={status === 'in-progress'} icon={icons.success} marginBottom={1}>\n <Text>Creating project...</Text>\n </Header>\n\n {jobs.map((job) => (\n <Text key={job}>{`${icons.info} ${job}`}</Text>\n ))}\n </Box>\n ) : null}\n\n {status === 'finished' ? (\n <Header marginTop={1} icon={icons.success}>\n <Text>Done.</Text>\n </Header>\n ) : null}\n </Box>\n );\n}\n"],"names":["Header","icons","colors","useProgram","chalk","Box","Text","path","useEffect","useState","CreateProjectInput","runCreateProject","packageNameToDirectory","ONLY_ONE_STAR_REGEXP","CreateProject","args","workspace","status","setStatus","subscription","setSubscription","jobs","setJobs","createProjectInputResult","setCreateProjectInputResult","projectName","value","options","name","isComplete","projectPath","templateId","template","exit","Object","entries","every","result","newSubscription","subscribe","next","previousJobs","error","complete","unsubscribe","possiblePaths","destinationDirectory","projectGlobs","filter","projectGlob","test","map","replace","join","label","relative","flexDirection","color","body","info","rows","choices","values","marginTop","onChange","onComplete","showSpinner","icon","success","marginBottom","job"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/create-project/CreateProject.tsx"],"sourcesContent":["import {Header, icons, colors, type CommandArguments, useProgram} from '@jakubmazanec/cli';\nimport chalk from 'chalk';\nimport {Box, Text} from 'ink';\nimport path from 'node:path';\nimport {useEffect, useState} from 'react';\n\nimport {type createProjectCommand} from './createProjectCommand.js';\nimport {CreateProjectInput, type CreateProjectInputResult} from './CreateProjectInput.js';\nimport {runCreateProject} from './runCreateProject.js';\nimport {type Workspace} from '../../workspace.js';\nimport {packageNameToDirectory} from '../internals.js';\n\nconst ONLY_ONE_STAR_REGEXP = /^(?!(.*?\\*){2,}|.*? |\\*$).*?\\*.*$/;\n\nexport type CreateProjectProps = {\n args: CommandArguments<typeof createProjectCommand>;\n workspace: Workspace | Workspace<false>;\n};\n\nexport function CreateProject({args, workspace}: CreateProjectProps) {\n let [status, setStatus] = useState<'finished' | 'in-progress' | 'not-started'>('not-started');\n let [subscription, setSubscription] = useState<ZenObservable.Subscription | null>(null);\n let [jobs, setJobs] = useState<string[]>([]);\n let [createProjectInputResult, setCreateProjectInputResult] = useState<CreateProjectInputResult>(\n () => ({\n projectName: {value: args.options.name ?? '', isComplete: !!args.options.name},\n projectPath: {value: '', isComplete: false},\n templateId: {value: args.options.template ?? '', isComplete: !!args.options.template},\n }),\n );\n let {exit} = useProgram();\n\n useEffect(() => {\n if (Object.entries(createProjectInputResult).every(([, result]) => result.isComplete)) {\n setStatus('in-progress');\n }\n }, [createProjectInputResult]);\n\n useEffect(() => {\n if (status === 'in-progress' && !subscription) {\n let newSubscription = runCreateProject({\n projectPath: createProjectInputResult.projectPath.value,\n templateId: createProjectInputResult.templateId.value,\n projectName: createProjectInputResult.projectName.value,\n workspace,\n args,\n }).subscribe({\n next(value) {\n setJobs((previousJobs) => [...previousJobs, value]);\n },\n error(error) {\n exit(error);\n },\n complete() {\n newSubscription.unsubscribe();\n setStatus('finished');\n },\n });\n setSubscription(newSubscription);\n }\n\n return () => {\n if (subscription) {\n subscription.unsubscribe();\n }\n };\n }, [args, createProjectInputResult, exit, status, subscription, workspace]);\n\n let possiblePaths: Array<{value: string; label: string}> = [];\n\n if (createProjectInputResult.projectName.value) {\n let destinationDirectory = packageNameToDirectory(createProjectInputResult.projectName.value);\n\n if (workspace.projectGlobs) {\n possiblePaths = workspace.projectGlobs\n .filter((projectGlob) => ONLY_ONE_STAR_REGEXP.test(projectGlob))\n .map((projectGlob) => projectGlob.replace(/\\*/, destinationDirectory))\n .map((projectGlob) => path.join(workspace.path, projectGlob))\n .map((projectPath) => ({\n value: projectPath,\n label: path.relative(workspace.path, projectPath).replace('\\\\', '/'),\n }));\n } else {\n possiblePaths = [\n {\n value: workspace.path,\n label: workspace.path,\n },\n ];\n }\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text color={colors.body}>\n {`Creating project in the workspace at ${chalk[colors.info](workspace.path)}.`}\n </Text>\n\n <CreateProjectInput\n rows={{\n projectPath: {\n choices: possiblePaths,\n },\n }}\n values={createProjectInputResult}\n marginTop={1}\n onChange={setCreateProjectInputResult}\n onComplete={setCreateProjectInputResult}\n />\n\n {status === 'in-progress' || status === 'finished' ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Header showSpinner={status === 'in-progress'} icon={icons.success} marginBottom={1}>\n <Text>Creating project...</Text>\n </Header>\n\n {jobs.map((job) => (\n <Text key={job}>{`${icons.info} ${job}`}</Text>\n ))}\n </Box>\n ) : null}\n\n {status === 'finished' ? (\n <Header marginTop={1} icon={icons.success}>\n <Text>Done.</Text>\n </Header>\n ) : null}\n </Box>\n );\n}\n"],"names":["Header","icons","colors","useProgram","chalk","Box","Text","path","useEffect","useState","CreateProjectInput","runCreateProject","packageNameToDirectory","ONLY_ONE_STAR_REGEXP","CreateProject","args","workspace","status","setStatus","subscription","setSubscription","jobs","setJobs","createProjectInputResult","setCreateProjectInputResult","projectName","value","options","name","isComplete","projectPath","templateId","template","exit","Object","entries","every","result","newSubscription","subscribe","next","previousJobs","error","complete","unsubscribe","possiblePaths","destinationDirectory","projectGlobs","filter","projectGlob","test","map","replace","join","label","relative","flexDirection","color","body","info","rows","choices","values","marginTop","onChange","onComplete","showSpinner","icon","success","marginBottom","job"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/create-project/CreateProjectInput.ts"],"sourcesContent":["import {type FormResult, createForm} from '@jakubmazanec/cli';\n\nconst TEMPLATE_ID_REGEXP = /^.+:.+$/;\nconst PROJECT_NAME_ID_REGEXP = /^[\\d./@a-z-]+$/;\n\nexport const CreateProjectInput = createForm({\n rows: {\n templateId: {\n type: 'text',\n label: 'What template do you want to use?',\n validate: (value: string) => {\n if (!TEMPLATE_ID_REGEXP.test(value)) {\n throw new Error(\n 'Template ID must consist of a module ID and a template name separated by a colon.',\n );\n }\n },\n },\n projectName: {\n type: 'text',\n label: 'What is the project name?',\n validate: (value: string) => {\n if (!PROJECT_NAME_ID_REGEXP.test(value)) {\n throw new Error(\n 'Project name can containg only lowercase letters, numbers, hyphen, @, dot or /.',\n );\n }\n },\n },\n projectPath: {\n type: 'select',\n label: 'What is the project location?',\n },\n },\n});\n\nexport type CreateProjectInputResult = FormResult<typeof CreateProjectInput>;\n"],"names":["createForm","TEMPLATE_ID_REGEXP","PROJECT_NAME_ID_REGEXP","CreateProjectInput","rows","templateId","type","label","validate","value","test","Error","projectName","projectPath"],"mappings":"AAAA,SAAyBA,UAAU,QAAO,oBAAoB;AAE9D,MAAMC,qBAAqB;AAC3B,MAAMC,yBAAyB;AAE/B,OAAO,MAAMC,qBAAqBH,WAAW;IAC3CI,MAAM;QACJC,YAAY;YACVC,MAAM;YACNC,OAAO;YACPC,UAAU,CAACC;gBACT,IAAI,CAACR,mBAAmBS,KAAKD,QAAQ;oBACnC,MAAM,IAAIE,MACR;gBAEJ;YACF;QACF;QACAC,aAAa;YACXN,MAAM;YACNC,OAAO;YACPC,UAAU,CAACC;gBACT,IAAI,CAACP,uBAAuBQ,KAAKD,QAAQ;oBACvC,MAAM,IAAIE,MACR;gBAEJ;YACF;QACF;QACAE,aAAa;YACXP,MAAM;YACNC,OAAO;QACT;IACF;AACF,GAAG"}
1
+ {"version":3,"sources":["../../../src/commands/create-project/CreateProjectInput.ts"],"sourcesContent":["import {type FormResult, createForm} from '@jakubmazanec/cli';\n\nconst TEMPLATE_ID_REGEXP = /^.+:.+$/;\nconst PROJECT_NAME_ID_REGEXP = /^[\\d./@a-z-]+$/;\n\nexport const CreateProjectInput = createForm({\n rows: {\n templateId: {\n type: 'text',\n label: 'What template do you want to use?',\n validate: (value: string) => {\n if (!TEMPLATE_ID_REGEXP.test(value)) {\n throw new Error(\n 'Template ID must consist of a module ID and a template name separated by a colon.',\n );\n }\n },\n },\n projectName: {\n type: 'text',\n label: 'What is the project name?',\n validate: (value: string) => {\n if (!PROJECT_NAME_ID_REGEXP.test(value)) {\n throw new Error(\n 'Project name can containg only lowercase letters, numbers, hyphen, @, dot or /.',\n );\n }\n },\n },\n projectPath: {\n type: 'select',\n label: 'What is the project location?',\n },\n },\n});\n\nexport type CreateProjectInputResult = FormResult<typeof CreateProjectInput>;\n"],"names":["createForm","TEMPLATE_ID_REGEXP","PROJECT_NAME_ID_REGEXP","CreateProjectInput","rows","templateId","type","label","validate","value","test","Error","projectName","projectPath"],"mappings":"AAAA,SAAyBA,UAAU,QAAO,oBAAoB;AAE9D,MAAMC,qBAAqB;AAC3B,MAAMC,yBAAyB;AAE/B,OAAO,MAAMC,qBAAqBH,WAAW;IAC3CI,MAAM;QACJC,YAAY;YACVC,MAAM;YACNC,OAAO;YACPC,UAAU,CAACC;gBACT,IAAI,CAACR,mBAAmBS,IAAI,CAACD,QAAQ;oBACnC,MAAM,IAAIE,MACR;gBAEJ;YACF;QACF;QACAC,aAAa;YACXN,MAAM;YACNC,OAAO;YACPC,UAAU,CAACC;gBACT,IAAI,CAACP,uBAAuBQ,IAAI,CAACD,QAAQ;oBACvC,MAAM,IAAIE,MACR;gBAEJ;YACF;QACF;QACAE,aAAa;YACXP,MAAM;YACNC,OAAO;QACT;IACF;AACF,GAAG"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/create-project/createProjectCommand.tsx"],"sourcesContent":["import {Command} from '@jakubmazanec/cli';\nimport path from 'node:path';\n\nimport {CreateProject} from './CreateProject.js';\nimport {Workspace} from '../../workspace.js';\n\nexport const createProjectCommand = new Command(\n 'create project',\n async (args, program) => {\n let targetPath = path.resolve(process.cwd(), args.options.path ?? '');\n let workspace = await Workspace.findAndRead(targetPath);\n\n if (!workspace) {\n throw new Error(`No workspace found at \"${targetPath}\"!`);\n }\n\n await program.renderElement(<CreateProject args={args} workspace={workspace} />);\n },\n {\n description: 'Creates a new project in an existing workspace.',\n options: {\n path: {\n type: 'string',\n },\n template: {\n type: 'string',\n },\n name: {\n type: 'string',\n },\n },\n },\n);\n"],"names":["Command","path","CreateProject","Workspace","createProjectCommand","args","program","targetPath","resolve","process","cwd","options","workspace","findAndRead","Error","renderElement","description","type","template","name"],"mappings":";AAAA,SAAQA,OAAO,QAAO,oBAAoB;AAC1C,OAAOC,UAAU,YAAY;AAE7B,SAAQC,aAAa,QAAO,qBAAqB;AACjD,SAAQC,SAAS,QAAO,qBAAqB;AAE7C,OAAO,MAAMC,uBAAuB,IAAIJ,QACtC,kBACA,OAAOK,MAAMC;IACX,IAAIC,aAAaN,KAAKO,QAAQC,QAAQC,OAAOL,KAAKM,QAAQV,QAAQ;IAClE,IAAIW,YAAY,MAAMT,UAAUU,YAAYN;IAE5C,IAAI,CAACK,WAAW;QACd,MAAM,IAAIE,MAAM,CAAC,uBAAuB,EAAEP,WAAW,EAAE,CAAC;IAC1D;IAEA,MAAMD,QAAQS,4BAAc,KAACb;QAAcG,MAAMA;QAAMO,WAAWA;;AACpE,GACA;IACEI,aAAa;IACbL,SAAS;QACPV,MAAM;YACJgB,MAAM;QACR;QACAC,UAAU;YACRD,MAAM;QACR;QACAE,MAAM;YACJF,MAAM;QACR;IACF;AACF,GACA"}
1
+ {"version":3,"sources":["../../../src/commands/create-project/createProjectCommand.tsx"],"sourcesContent":["import {Command} from '@jakubmazanec/cli';\nimport path from 'node:path';\n\nimport {CreateProject} from './CreateProject.js';\nimport {Workspace} from '../../workspace.js';\n\nexport const createProjectCommand = new Command(\n 'create project',\n async (args, program) => {\n let targetPath = path.resolve(process.cwd(), args.options.path ?? '');\n let workspace = await Workspace.findAndRead(targetPath);\n\n if (!workspace) {\n throw new Error(`No workspace found at \"${targetPath}\"!`);\n }\n\n await program.renderElement(<CreateProject args={args} workspace={workspace} />);\n },\n {\n description: 'Creates a new project in an existing workspace.',\n options: {\n path: {\n type: 'string',\n },\n template: {\n type: 'string',\n },\n name: {\n type: 'string',\n },\n },\n },\n);\n"],"names":["Command","path","CreateProject","Workspace","createProjectCommand","args","program","targetPath","resolve","process","cwd","options","workspace","findAndRead","Error","renderElement","description","type","template","name"],"mappings":";AAAA,SAAQA,OAAO,QAAO,oBAAoB;AAC1C,OAAOC,UAAU,YAAY;AAE7B,SAAQC,aAAa,QAAO,qBAAqB;AACjD,SAAQC,SAAS,QAAO,qBAAqB;AAE7C,OAAO,MAAMC,uBAAuB,IAAIJ,QACtC,kBACA,OAAOK,MAAMC;IACX,IAAIC,aAAaN,KAAKO,OAAO,CAACC,QAAQC,GAAG,IAAIL,KAAKM,OAAO,CAACV,IAAI,IAAI;IAClE,IAAIW,YAAY,MAAMT,UAAUU,WAAW,CAACN;IAE5C,IAAI,CAACK,WAAW;QACd,MAAM,IAAIE,MAAM,CAAC,uBAAuB,EAAEP,WAAW,EAAE,CAAC;IAC1D;IAEA,MAAMD,QAAQS,aAAa,eAAC,KAACb;QAAcG,MAAMA;QAAMO,WAAWA;;AACpE,GACA;IACEI,aAAa;IACbL,SAAS;QACPV,MAAM;YACJgB,MAAM;QACR;QACAC,UAAU;YACRD,MAAM;QACR;QACAE,MAAM;YACJF,MAAM;QACR;IACF;AACF,GACA"}
@@ -2,7 +2,7 @@ import { isEmptyDirectory } from '@jakubmazanec/fs-utils';
2
2
  import fs from 'fs-extra';
3
3
  import path from 'node:path';
4
4
  import Observable from 'zen-observable';
5
- export function runCreateProject({ projectPath , templateId , projectName , workspace , args }) {
5
+ export function runCreateProject({ projectPath, templateId, projectName, workspace, args }) {
6
6
  return new Observable((observer)=>{
7
7
  (async ()=>{
8
8
  observer.next('TODO');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/create-project/runCreateProject.ts"],"sourcesContent":["import {type CommandArguments} from '@jakubmazanec/cli';\nimport {isEmptyDirectory} from '@jakubmazanec/fs-utils';\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport Observable from 'zen-observable';\n\nimport {type createProjectCommand} from './createProjectCommand.js';\nimport {type Workspace} from '../../workspace.js';\n\nexport type CreateProjectOptions = {\n projectPath: string;\n projectName: string;\n templateId: string;\n workspace: Workspace | Workspace<false>;\n args: CommandArguments<typeof createProjectCommand>;\n};\n\nexport type CreateProjectStatus = string;\n\nexport function runCreateProject({\n projectPath,\n templateId,\n projectName,\n workspace,\n args,\n}: CreateProjectOptions) {\n return new Observable<CreateProjectStatus>((observer) => {\n (async () => {\n observer.next('TODO');\n\n let resolvedProjectPath = path.resolve(projectPath);\n\n // check if path is ok\n await fs.ensureDir(resolvedProjectPath);\n\n let isProjectPathEmpty = await isEmptyDirectory(resolvedProjectPath);\n\n if (!isProjectPathEmpty) {\n throw new Error(`Directory \"${resolvedProjectPath}\" must be empty`);\n }\n\n // create new project\n let project = await workspace.createProject({\n projectPath: resolvedProjectPath,\n projectName,\n templateId,\n args,\n });\n\n await project.update({args});\n })()\n .then(() => {\n observer.complete();\n })\n .catch((error) => {\n observer.error(error);\n });\n });\n}\n"],"names":["isEmptyDirectory","fs","path","Observable","runCreateProject","projectPath","templateId","projectName","workspace","args","observer","next","resolvedProjectPath","resolve","ensureDir","isProjectPathEmpty","Error","project","createProject","update","then","complete","catch","error"],"mappings":"AACA,SAAQA,gBAAgB,QAAO,yBAAyB;AACxD,OAAOC,QAAQ,WAAW;AAC1B,OAAOC,UAAU,YAAY;AAC7B,OAAOC,gBAAgB,iBAAiB;AAexC,OAAO,SAASC,iBAAiB,EAC/BC,YAAW,EACXC,WAAU,EACVC,YAAW,EACXC,UAAS,EACTC,KAAI,EACiB;IACrB,OAAO,IAAIN,WAAgC,CAACO;QACzC,CAAA;YACCA,SAASC,KAAK;YAEd,IAAIC,sBAAsBV,KAAKW,QAAQR;YAEvC,sBAAsB;YACtB,MAAMJ,GAAGa,UAAUF;YAEnB,IAAIG,qBAAqB,MAAMf,iBAAiBY;YAEhD,IAAI,CAACG,oBAAoB;gBACvB,MAAM,IAAIC,MAAM,CAAC,WAAW,EAAEJ,oBAAoB,eAAe,CAAC;YACpE;YAEA,qBAAqB;YACrB,IAAIK,UAAU,MAAMT,UAAUU,cAAc;gBAC1Cb,aAAaO;gBACbL;gBACAD;gBACAG;YACF;YAEA,MAAMQ,QAAQE,OAAO;gBAACV;YAAI;QAC5B,CAAA,IACGW,KAAK;YACJV,SAASW;QACX,GACCC,MAAM,CAACC;YACNb,SAASa,MAAMA;QACjB;IACJ;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/create-project/runCreateProject.ts"],"sourcesContent":["import {type CommandArguments} from '@jakubmazanec/cli';\nimport {isEmptyDirectory} from '@jakubmazanec/fs-utils';\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport Observable from 'zen-observable';\n\nimport {type createProjectCommand} from './createProjectCommand.js';\nimport {type Workspace} from '../../workspace.js';\n\nexport type CreateProjectOptions = {\n projectPath: string;\n projectName: string;\n templateId: string;\n workspace: Workspace | Workspace<false>;\n args: CommandArguments<typeof createProjectCommand>;\n};\n\nexport type CreateProjectStatus = string;\n\nexport function runCreateProject({\n projectPath,\n templateId,\n projectName,\n workspace,\n args,\n}: CreateProjectOptions) {\n return new Observable<CreateProjectStatus>((observer) => {\n (async () => {\n observer.next('TODO');\n\n let resolvedProjectPath = path.resolve(projectPath);\n\n // check if path is ok\n await fs.ensureDir(resolvedProjectPath);\n\n let isProjectPathEmpty = await isEmptyDirectory(resolvedProjectPath);\n\n if (!isProjectPathEmpty) {\n throw new Error(`Directory \"${resolvedProjectPath}\" must be empty`);\n }\n\n // create new project\n let project = await workspace.createProject({\n projectPath: resolvedProjectPath,\n projectName,\n templateId,\n args,\n });\n\n await project.update({args});\n })()\n .then(() => {\n observer.complete();\n })\n .catch((error) => {\n observer.error(error);\n });\n });\n}\n"],"names":["isEmptyDirectory","fs","path","Observable","runCreateProject","projectPath","templateId","projectName","workspace","args","observer","next","resolvedProjectPath","resolve","ensureDir","isProjectPathEmpty","Error","project","createProject","update","then","complete","catch","error"],"mappings":"AACA,SAAQA,gBAAgB,QAAO,yBAAyB;AACxD,OAAOC,QAAQ,WAAW;AAC1B,OAAOC,UAAU,YAAY;AAC7B,OAAOC,gBAAgB,iBAAiB;AAexC,OAAO,SAASC,iBAAiB,EAC/BC,WAAW,EACXC,UAAU,EACVC,WAAW,EACXC,SAAS,EACTC,IAAI,EACiB;IACrB,OAAO,IAAIN,WAAgC,CAACO;QACzC,CAAA;YACCA,SAASC,IAAI,CAAC;YAEd,IAAIC,sBAAsBV,KAAKW,OAAO,CAACR;YAEvC,sBAAsB;YACtB,MAAMJ,GAAGa,SAAS,CAACF;YAEnB,IAAIG,qBAAqB,MAAMf,iBAAiBY;YAEhD,IAAI,CAACG,oBAAoB;gBACvB,MAAM,IAAIC,MAAM,CAAC,WAAW,EAAEJ,oBAAoB,eAAe,CAAC;YACpE;YAEA,qBAAqB;YACrB,IAAIK,UAAU,MAAMT,UAAUU,aAAa,CAAC;gBAC1Cb,aAAaO;gBACbL;gBACAD;gBACAG;YACF;YAEA,MAAMQ,QAAQE,MAAM,CAAC;gBAACV;YAAI;QAC5B,CAAA,IACGW,IAAI,CAAC;YACJV,SAASW,QAAQ;QACnB,GACCC,KAAK,CAAC,CAACC;YACNb,SAASa,KAAK,CAACA;QACjB;IACJ;AACF"}
@@ -5,7 +5,7 @@ import { Box, Text } from 'ink';
5
5
  import { useEffect, useState } from 'react';
6
6
  import { CreateWorkspaceInput } from './CreateWorkspaceInput.js';
7
7
  import { runCreateWorkspace } from './runCreateWorkspace.js';
8
- export function CreateWorkspace({ args , path }) {
8
+ export function CreateWorkspace({ args, path }) {
9
9
  let [status, setStatus] = useState('not-started');
10
10
  let [subscription, setSubscription] = useState(null);
11
11
  let [jobs, setJobs] = useState([]);
@@ -15,7 +15,7 @@ export function CreateWorkspace({ args , path }) {
15
15
  isComplete: !!args.options.template
16
16
  }
17
17
  }));
18
- let { exit } = useProgram();
18
+ let { exit } = useProgram();
19
19
  useEffect(()=>{
20
20
  if (Object.entries(createWorkspaceInputResult).every(([, result])=>result.isComplete)) {
21
21
  setStatus('in-progress');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/create-workspace/CreateWorkspace.tsx"],"sourcesContent":["import {Header, icons, colors, type CommandArguments, useProgram} from '@jakubmazanec/cli';\nimport chalk from 'chalk';\nimport {Box, Text} from 'ink';\nimport {useEffect, useState} from 'react';\n\nimport {type createWorkspaceCommand} from './createWorkspaceCommand.js';\nimport {CreateWorkspaceInput, type CreateWorkspaceInputResult} from './CreateWorkspaceInput.js';\nimport {runCreateWorkspace} from './runCreateWorkspace.js';\n\nexport type CreateWorkspaceProps = {\n args: CommandArguments<typeof createWorkspaceCommand>;\n path: string;\n};\n\nexport function CreateWorkspace({args, path}: CreateWorkspaceProps) {\n let [status, setStatus] = useState<'finished' | 'in-progress' | 'not-started'>('not-started');\n let [subscription, setSubscription] = useState<ZenObservable.Subscription | null>(null);\n let [jobs, setJobs] = useState<string[]>([]);\n let [createWorkspaceInputResult, setCreateWorkspaceInputResult] =\n useState<CreateWorkspaceInputResult>(() => ({\n templateId: {value: args.options.template ?? '', isComplete: !!args.options.template},\n }));\n let {exit} = useProgram();\n\n useEffect(() => {\n if (Object.entries(createWorkspaceInputResult).every(([, result]) => result.isComplete)) {\n setStatus('in-progress');\n }\n }, [createWorkspaceInputResult]);\n\n useEffect(() => {\n if (status === 'in-progress' && !subscription) {\n let newSubscription = runCreateWorkspace({\n workspacePath: path,\n templateId: createWorkspaceInputResult.templateId.value,\n args,\n }).subscribe({\n next(value) {\n setJobs((previousJobs) => [...previousJobs, value]);\n },\n error(error) {\n exit(error);\n },\n complete() {\n newSubscription.unsubscribe();\n setStatus('finished');\n },\n });\n\n setSubscription(newSubscription);\n }\n\n return () => {\n if (subscription) {\n subscription.unsubscribe();\n }\n };\n }, [createWorkspaceInputResult, path, status, subscription, args, exit]);\n\n return (\n <Box flexDirection=\"column\">\n <Text>{`Creating workspace at ${chalk[colors.highlighted](path)}.`}</Text>\n\n <CreateWorkspaceInput\n values={createWorkspaceInputResult}\n marginTop={1}\n onChange={setCreateWorkspaceInputResult}\n onComplete={setCreateWorkspaceInputResult}\n />\n\n {status === 'in-progress' || status === 'finished' ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Header showSpinner={status === 'in-progress'} icon={icons.success} marginBottom={1}>\n <Text>Creating workspace...</Text>\n </Header>\n\n {jobs.map((job) => (\n <Text key={job}>{`${icons.info} ${job}`}</Text>\n ))}\n </Box>\n ) : null}\n\n {status === 'finished' ? (\n <Header marginTop={1} icon={icons.success}>\n <Text>Done.</Text>\n </Header>\n ) : null}\n </Box>\n );\n}\n"],"names":["Header","icons","colors","useProgram","chalk","Box","Text","useEffect","useState","CreateWorkspaceInput","runCreateWorkspace","CreateWorkspace","args","path","status","setStatus","subscription","setSubscription","jobs","setJobs","createWorkspaceInputResult","setCreateWorkspaceInputResult","templateId","value","options","template","isComplete","exit","Object","entries","every","result","newSubscription","workspacePath","subscribe","next","previousJobs","error","complete","unsubscribe","flexDirection","highlighted","values","marginTop","onChange","onComplete","showSpinner","icon","success","marginBottom","map","job","info"],"mappings":";AAAA,SAAQA,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAyBC,UAAU,QAAO,oBAAoB;AAC3F,OAAOC,WAAW,QAAQ;AAC1B,SAAQC,GAAG,EAAEC,IAAI,QAAO,MAAM;AAC9B,SAAQC,SAAS,EAAEC,QAAQ,QAAO,QAAQ;AAG1C,SAAQC,oBAAoB,QAAwC,4BAA4B;AAChG,SAAQC,kBAAkB,QAAO,0BAA0B;AAO3D,OAAO,SAASC,gBAAgB,EAACC,KAAI,EAAEC,KAAI,EAAuB;IAChE,IAAI,CAACC,QAAQC,UAAU,GAAGP,SAAqD;IAC/E,IAAI,CAACQ,cAAcC,gBAAgB,GAAGT,SAA4C;IAClF,IAAI,CAACU,MAAMC,QAAQ,GAAGX,SAAmB,EAAE;IAC3C,IAAI,CAACY,4BAA4BC,8BAA8B,GAC7Db,SAAqC,IAAO,CAAA;YAC1Cc,YAAY;gBAACC,OAAOX,KAAKY,QAAQC,YAAY;gBAAIC,YAAY,CAAC,CAACd,KAAKY,QAAQC;YAAQ;QACtF,CAAA;IACF,IAAI,EAACE,KAAI,EAAC,GAAGxB;IAEbI,UAAU;QACR,IAAIqB,OAAOC,QAAQT,4BAA4BU,MAAM,CAAC,GAAGC,OAAO,GAAKA,OAAOL,aAAa;YACvFX,UAAU;QACZ;IACF,GAAG;QAACK;KAA2B;IAE/Bb,UAAU;QACR,IAAIO,WAAW,iBAAiB,CAACE,cAAc;YAC7C,IAAIgB,kBAAkBtB,mBAAmB;gBACvCuB,eAAepB;gBACfS,YAAYF,2BAA2BE,WAAWC;gBAClDX;YACF,GAAGsB,UAAU;gBACXC,MAAKZ,KAAK;oBACRJ,QAAQ,CAACiB,eAAiB;+BAAIA;4BAAcb;yBAAM;gBACpD;gBACAc,OAAMA,KAAK;oBACTV,KAAKU;gBACP;gBACAC;oBACEN,gBAAgBO;oBAChBxB,UAAU;gBACZ;YACF;YAEAE,gBAAgBe;QAClB;QAEA,OAAO;YACL,IAAIhB,cAAc;gBAChBA,aAAauB;YACf;QACF;IACF,GAAG;QAACnB;QAA4BP;QAAMC;QAAQE;QAAcJ;QAAMe;KAAK;IAEvE,qBACE,MAACtB;QAAImC,eAAc;;0BACjB,KAAClC;0BAAM,CAAC,sBAAsB,EAAEF,KAAK,CAACF,OAAOuC,YAAY,CAAC5B,MAAM,CAAC,CAAC;;0BAElE,KAACJ;gBACCiC,QAAQtB;gBACRuB,WAAW;gBACXC,UAAUvB;gBACVwB,YAAYxB;;YAGbP,WAAW,iBAAiBA,WAAW,2BACtC,MAACT;gBAAIsC,WAAW;gBAAGH,eAAc;;kCAC/B,KAACxC;wBAAO8C,aAAahC,WAAW;wBAAeiC,MAAM9C,MAAM+C;wBAASC,cAAc;kCAChF,cAAA,KAAC3C;sCAAK;;;oBAGPY,KAAKgC,IAAI,CAACC,oBACT,KAAC7C;sCAAgB,CAAC,EAAEL,MAAMmD,KAAK,CAAC,EAAED,IAAI,CAAC;2BAA5BA;;iBAGb;YAEHrC,WAAW,2BACV,KAACd;gBAAO2C,WAAW;gBAAGI,MAAM9C,MAAM+C;0BAChC,cAAA,KAAC1C;8BAAK;;iBAEN;;;AAGV"}
1
+ {"version":3,"sources":["../../../src/commands/create-workspace/CreateWorkspace.tsx"],"sourcesContent":["import {Header, icons, colors, type CommandArguments, useProgram} from '@jakubmazanec/cli';\nimport chalk from 'chalk';\nimport {Box, Text} from 'ink';\nimport {useEffect, useState} from 'react';\n\nimport {type createWorkspaceCommand} from './createWorkspaceCommand.js';\nimport {CreateWorkspaceInput, type CreateWorkspaceInputResult} from './CreateWorkspaceInput.js';\nimport {runCreateWorkspace} from './runCreateWorkspace.js';\n\nexport type CreateWorkspaceProps = {\n args: CommandArguments<typeof createWorkspaceCommand>;\n path: string;\n};\n\nexport function CreateWorkspace({args, path}: CreateWorkspaceProps) {\n let [status, setStatus] = useState<'finished' | 'in-progress' | 'not-started'>('not-started');\n let [subscription, setSubscription] = useState<ZenObservable.Subscription | null>(null);\n let [jobs, setJobs] = useState<string[]>([]);\n let [createWorkspaceInputResult, setCreateWorkspaceInputResult] =\n useState<CreateWorkspaceInputResult>(() => ({\n templateId: {value: args.options.template ?? '', isComplete: !!args.options.template},\n }));\n let {exit} = useProgram();\n\n useEffect(() => {\n if (Object.entries(createWorkspaceInputResult).every(([, result]) => result.isComplete)) {\n setStatus('in-progress');\n }\n }, [createWorkspaceInputResult]);\n\n useEffect(() => {\n if (status === 'in-progress' && !subscription) {\n let newSubscription = runCreateWorkspace({\n workspacePath: path,\n templateId: createWorkspaceInputResult.templateId.value,\n args,\n }).subscribe({\n next(value) {\n setJobs((previousJobs) => [...previousJobs, value]);\n },\n error(error) {\n exit(error);\n },\n complete() {\n newSubscription.unsubscribe();\n setStatus('finished');\n },\n });\n\n setSubscription(newSubscription);\n }\n\n return () => {\n if (subscription) {\n subscription.unsubscribe();\n }\n };\n }, [createWorkspaceInputResult, path, status, subscription, args, exit]);\n\n return (\n <Box flexDirection=\"column\">\n <Text>{`Creating workspace at ${chalk[colors.highlighted](path)}.`}</Text>\n\n <CreateWorkspaceInput\n values={createWorkspaceInputResult}\n marginTop={1}\n onChange={setCreateWorkspaceInputResult}\n onComplete={setCreateWorkspaceInputResult}\n />\n\n {status === 'in-progress' || status === 'finished' ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Header showSpinner={status === 'in-progress'} icon={icons.success} marginBottom={1}>\n <Text>Creating workspace...</Text>\n </Header>\n\n {jobs.map((job) => (\n <Text key={job}>{`${icons.info} ${job}`}</Text>\n ))}\n </Box>\n ) : null}\n\n {status === 'finished' ? (\n <Header marginTop={1} icon={icons.success}>\n <Text>Done.</Text>\n </Header>\n ) : null}\n </Box>\n );\n}\n"],"names":["Header","icons","colors","useProgram","chalk","Box","Text","useEffect","useState","CreateWorkspaceInput","runCreateWorkspace","CreateWorkspace","args","path","status","setStatus","subscription","setSubscription","jobs","setJobs","createWorkspaceInputResult","setCreateWorkspaceInputResult","templateId","value","options","template","isComplete","exit","Object","entries","every","result","newSubscription","workspacePath","subscribe","next","previousJobs","error","complete","unsubscribe","flexDirection","highlighted","values","marginTop","onChange","onComplete","showSpinner","icon","success","marginBottom","map","job","info"],"mappings":";AAAA,SAAQA,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAyBC,UAAU,QAAO,oBAAoB;AAC3F,OAAOC,WAAW,QAAQ;AAC1B,SAAQC,GAAG,EAAEC,IAAI,QAAO,MAAM;AAC9B,SAAQC,SAAS,EAAEC,QAAQ,QAAO,QAAQ;AAG1C,SAAQC,oBAAoB,QAAwC,4BAA4B;AAChG,SAAQC,kBAAkB,QAAO,0BAA0B;AAO3D,OAAO,SAASC,gBAAgB,EAACC,IAAI,EAAEC,IAAI,EAAuB;IAChE,IAAI,CAACC,QAAQC,UAAU,GAAGP,SAAqD;IAC/E,IAAI,CAACQ,cAAcC,gBAAgB,GAAGT,SAA4C;IAClF,IAAI,CAACU,MAAMC,QAAQ,GAAGX,SAAmB,EAAE;IAC3C,IAAI,CAACY,4BAA4BC,8BAA8B,GAC7Db,SAAqC,IAAO,CAAA;YAC1Cc,YAAY;gBAACC,OAAOX,KAAKY,OAAO,CAACC,QAAQ,IAAI;gBAAIC,YAAY,CAAC,CAACd,KAAKY,OAAO,CAACC,QAAQ;YAAA;QACtF,CAAA;IACF,IAAI,EAACE,IAAI,EAAC,GAAGxB;IAEbI,UAAU;QACR,IAAIqB,OAAOC,OAAO,CAACT,4BAA4BU,KAAK,CAAC,CAAC,GAAGC,OAAO,GAAKA,OAAOL,UAAU,GAAG;YACvFX,UAAU;QACZ;IACF,GAAG;QAACK;KAA2B;IAE/Bb,UAAU;QACR,IAAIO,WAAW,iBAAiB,CAACE,cAAc;YAC7C,IAAIgB,kBAAkBtB,mBAAmB;gBACvCuB,eAAepB;gBACfS,YAAYF,2BAA2BE,UAAU,CAACC,KAAK;gBACvDX;YACF,GAAGsB,SAAS,CAAC;gBACXC,MAAKZ,KAAK;oBACRJ,QAAQ,CAACiB,eAAiB;+BAAIA;4BAAcb;yBAAM;gBACpD;gBACAc,OAAMA,KAAK;oBACTV,KAAKU;gBACP;gBACAC;oBACEN,gBAAgBO,WAAW;oBAC3BxB,UAAU;gBACZ;YACF;YAEAE,gBAAgBe;QAClB;QAEA,OAAO;YACL,IAAIhB,cAAc;gBAChBA,aAAauB,WAAW;YAC1B;QACF;IACF,GAAG;QAACnB;QAA4BP;QAAMC;QAAQE;QAAcJ;QAAMe;KAAK;IAEvE,qBACE,MAACtB;QAAImC,eAAc;;0BACjB,KAAClC;0BAAM,CAAC,sBAAsB,EAAEF,KAAK,CAACF,OAAOuC,WAAW,CAAC,CAAC5B,MAAM,CAAC,CAAC;;0BAElE,KAACJ;gBACCiC,QAAQtB;gBACRuB,WAAW;gBACXC,UAAUvB;gBACVwB,YAAYxB;;YAGbP,WAAW,iBAAiBA,WAAW,2BACtC,MAACT;gBAAIsC,WAAW;gBAAGH,eAAc;;kCAC/B,KAACxC;wBAAO8C,aAAahC,WAAW;wBAAeiC,MAAM9C,MAAM+C,OAAO;wBAAEC,cAAc;kCAChF,cAAA,KAAC3C;sCAAK;;;oBAGPY,KAAKgC,GAAG,CAAC,CAACC,oBACT,KAAC7C;sCAAgB,CAAC,EAAEL,MAAMmD,IAAI,CAAC,CAAC,EAAED,IAAI,CAAC;2BAA5BA;;iBAGb;YAEHrC,WAAW,2BACV,KAACd;gBAAO2C,WAAW;gBAAGI,MAAM9C,MAAM+C,OAAO;0BACvC,cAAA,KAAC1C;8BAAK;;iBAEN;;;AAGV"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/create-workspace/CreateWorkspaceInput.ts"],"sourcesContent":["import {type FormResult, createForm} from '@jakubmazanec/cli';\n\nconst TEMPLATE_ID_REGEXP = /^.+:.+$/;\n\nexport const CreateWorkspaceInput = createForm({\n rows: {\n templateId: {\n type: 'text',\n label: 'Enter template ID:',\n validate: (value: string) => {\n if (!TEMPLATE_ID_REGEXP.test(value)) {\n throw new Error(\n 'Template ID must consist of a module ID and a template name separated by a colon.',\n );\n }\n },\n },\n },\n});\n\nexport type CreateWorkspaceInputResult = FormResult<typeof CreateWorkspaceInput>;\n"],"names":["createForm","TEMPLATE_ID_REGEXP","CreateWorkspaceInput","rows","templateId","type","label","validate","value","test","Error"],"mappings":"AAAA,SAAyBA,UAAU,QAAO,oBAAoB;AAE9D,MAAMC,qBAAqB;AAE3B,OAAO,MAAMC,uBAAuBF,WAAW;IAC7CG,MAAM;QACJC,YAAY;YACVC,MAAM;YACNC,OAAO;YACPC,UAAU,CAACC;gBACT,IAAI,CAACP,mBAAmBQ,KAAKD,QAAQ;oBACnC,MAAM,IAAIE,MACR;gBAEJ;YACF;QACF;IACF;AACF,GAAG"}
1
+ {"version":3,"sources":["../../../src/commands/create-workspace/CreateWorkspaceInput.ts"],"sourcesContent":["import {type FormResult, createForm} from '@jakubmazanec/cli';\n\nconst TEMPLATE_ID_REGEXP = /^.+:.+$/;\n\nexport const CreateWorkspaceInput = createForm({\n rows: {\n templateId: {\n type: 'text',\n label: 'Enter template ID:',\n validate: (value: string) => {\n if (!TEMPLATE_ID_REGEXP.test(value)) {\n throw new Error(\n 'Template ID must consist of a module ID and a template name separated by a colon.',\n );\n }\n },\n },\n },\n});\n\nexport type CreateWorkspaceInputResult = FormResult<typeof CreateWorkspaceInput>;\n"],"names":["createForm","TEMPLATE_ID_REGEXP","CreateWorkspaceInput","rows","templateId","type","label","validate","value","test","Error"],"mappings":"AAAA,SAAyBA,UAAU,QAAO,oBAAoB;AAE9D,MAAMC,qBAAqB;AAE3B,OAAO,MAAMC,uBAAuBF,WAAW;IAC7CG,MAAM;QACJC,YAAY;YACVC,MAAM;YACNC,OAAO;YACPC,UAAU,CAACC;gBACT,IAAI,CAACP,mBAAmBQ,IAAI,CAACD,QAAQ;oBACnC,MAAM,IAAIE,MACR;gBAEJ;YACF;QACF;IACF;AACF,GAAG"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/create-workspace/createWorkspaceCommand.tsx"],"sourcesContent":["import {Command} from '@jakubmazanec/cli';\nimport {isEmptyDirectory} from '@jakubmazanec/fs-utils';\nimport fs from 'fs-extra';\nimport path from 'node:path';\n\nimport {CreateWorkspace} from './CreateWorkspace.js';\n\nexport const createWorkspaceCommand = new Command(\n 'create workspace',\n async (args, program) => {\n let workspacePath = path.resolve(process.cwd(), args.options.path ?? '');\n\n await fs.ensureDir(workspacePath);\n\n let isWorkspacePathEmpty = await isEmptyDirectory(workspacePath);\n\n if (!isWorkspacePathEmpty) {\n throw new Error(`Directory \"${workspacePath}\" must be empty`);\n }\n\n await program.renderElement(<CreateWorkspace args={args} path={workspacePath} />);\n },\n {\n description: 'Creates a new workspacee.',\n options: {\n path: {\n type: 'string',\n },\n template: {\n type: 'string',\n },\n },\n },\n);\n"],"names":["Command","isEmptyDirectory","fs","path","CreateWorkspace","createWorkspaceCommand","args","program","workspacePath","resolve","process","cwd","options","ensureDir","isWorkspacePathEmpty","Error","renderElement","description","type","template"],"mappings":";AAAA,SAAQA,OAAO,QAAO,oBAAoB;AAC1C,SAAQC,gBAAgB,QAAO,yBAAyB;AACxD,OAAOC,QAAQ,WAAW;AAC1B,OAAOC,UAAU,YAAY;AAE7B,SAAQC,eAAe,QAAO,uBAAuB;AAErD,OAAO,MAAMC,yBAAyB,IAAIL,QACxC,oBACA,OAAOM,MAAMC;IACX,IAAIC,gBAAgBL,KAAKM,QAAQC,QAAQC,OAAOL,KAAKM,QAAQT,QAAQ;IAErE,MAAMD,GAAGW,UAAUL;IAEnB,IAAIM,uBAAuB,MAAMb,iBAAiBO;IAElD,IAAI,CAACM,sBAAsB;QACzB,MAAM,IAAIC,MAAM,CAAC,WAAW,EAAEP,cAAc,eAAe,CAAC;IAC9D;IAEA,MAAMD,QAAQS,4BAAc,KAACZ;QAAgBE,MAAMA;QAAMH,MAAMK;;AACjE,GACA;IACES,aAAa;IACbL,SAAS;QACPT,MAAM;YACJe,MAAM;QACR;QACAC,UAAU;YACRD,MAAM;QACR;IACF;AACF,GACA"}
1
+ {"version":3,"sources":["../../../src/commands/create-workspace/createWorkspaceCommand.tsx"],"sourcesContent":["import {Command} from '@jakubmazanec/cli';\nimport {isEmptyDirectory} from '@jakubmazanec/fs-utils';\nimport fs from 'fs-extra';\nimport path from 'node:path';\n\nimport {CreateWorkspace} from './CreateWorkspace.js';\n\nexport const createWorkspaceCommand = new Command(\n 'create workspace',\n async (args, program) => {\n let workspacePath = path.resolve(process.cwd(), args.options.path ?? '');\n\n await fs.ensureDir(workspacePath);\n\n let isWorkspacePathEmpty = await isEmptyDirectory(workspacePath);\n\n if (!isWorkspacePathEmpty) {\n throw new Error(`Directory \"${workspacePath}\" must be empty`);\n }\n\n await program.renderElement(<CreateWorkspace args={args} path={workspacePath} />);\n },\n {\n description: 'Creates a new workspacee.',\n options: {\n path: {\n type: 'string',\n },\n template: {\n type: 'string',\n },\n },\n },\n);\n"],"names":["Command","isEmptyDirectory","fs","path","CreateWorkspace","createWorkspaceCommand","args","program","workspacePath","resolve","process","cwd","options","ensureDir","isWorkspacePathEmpty","Error","renderElement","description","type","template"],"mappings":";AAAA,SAAQA,OAAO,QAAO,oBAAoB;AAC1C,SAAQC,gBAAgB,QAAO,yBAAyB;AACxD,OAAOC,QAAQ,WAAW;AAC1B,OAAOC,UAAU,YAAY;AAE7B,SAAQC,eAAe,QAAO,uBAAuB;AAErD,OAAO,MAAMC,yBAAyB,IAAIL,QACxC,oBACA,OAAOM,MAAMC;IACX,IAAIC,gBAAgBL,KAAKM,OAAO,CAACC,QAAQC,GAAG,IAAIL,KAAKM,OAAO,CAACT,IAAI,IAAI;IAErE,MAAMD,GAAGW,SAAS,CAACL;IAEnB,IAAIM,uBAAuB,MAAMb,iBAAiBO;IAElD,IAAI,CAACM,sBAAsB;QACzB,MAAM,IAAIC,MAAM,CAAC,WAAW,EAAEP,cAAc,eAAe,CAAC;IAC9D;IAEA,MAAMD,QAAQS,aAAa,eAAC,KAACZ;QAAgBE,MAAMA;QAAMH,MAAMK;;AACjE,GACA;IACES,aAAa;IACbL,SAAS;QACPT,MAAM;YACJe,MAAM;QACR;QACAC,UAAU;YACRD,MAAM;QACR;IACF;AACF,GACA"}
@@ -3,7 +3,7 @@ import fs from 'fs-extra';
3
3
  import path from 'node:path';
4
4
  import Observable from 'zen-observable';
5
5
  import { Workspace } from '../../workspace.js';
6
- export function runCreateWorkspace({ workspacePath , templateId , args }) {
6
+ export function runCreateWorkspace({ workspacePath, templateId, args }) {
7
7
  return new Observable((observer)=>{
8
8
  (async ()=>{
9
9
  observer.next('TODO');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/create-workspace/runCreateWorkspace.ts"],"sourcesContent":["import {type CommandArguments} from '@jakubmazanec/cli';\nimport {isEmptyDirectory} from '@jakubmazanec/fs-utils';\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport Observable from 'zen-observable';\n\nimport {type createWorkspaceCommand} from './createWorkspaceCommand.js';\nimport {Workspace} from '../../workspace.js';\n\nexport type CreateWorkspaceOptions = {\n workspacePath: string;\n templateId: string;\n args: CommandArguments<typeof createWorkspaceCommand>;\n};\n\nexport type CreateWorkspaceStatus = string;\n\nexport function runCreateWorkspace({workspacePath, templateId, args}: CreateWorkspaceOptions) {\n return new Observable<CreateWorkspaceStatus>((observer) => {\n (async () => {\n observer.next('TODO');\n\n let resolvedWorkspacePath = path.resolve(workspacePath);\n\n await fs.ensureDir(resolvedWorkspacePath);\n\n let isWorkspacePathEmpty = await isEmptyDirectory(resolvedWorkspacePath);\n\n if (!isWorkspacePathEmpty) {\n throw new Error(`Directory \"${resolvedWorkspacePath}\" must be empty`);\n }\n\n // create new workspace\n let workspace = await Workspace.create({\n args,\n path: resolvedWorkspacePath,\n templateId,\n });\n\n await workspace.update({args});\n })()\n .then(() => {\n observer.complete();\n })\n .catch((error) => {\n observer.error(error);\n });\n });\n}\n"],"names":["isEmptyDirectory","fs","path","Observable","Workspace","runCreateWorkspace","workspacePath","templateId","args","observer","next","resolvedWorkspacePath","resolve","ensureDir","isWorkspacePathEmpty","Error","workspace","create","update","then","complete","catch","error"],"mappings":"AACA,SAAQA,gBAAgB,QAAO,yBAAyB;AACxD,OAAOC,QAAQ,WAAW;AAC1B,OAAOC,UAAU,YAAY;AAC7B,OAAOC,gBAAgB,iBAAiB;AAGxC,SAAQC,SAAS,QAAO,qBAAqB;AAU7C,OAAO,SAASC,mBAAmB,EAACC,cAAa,EAAEC,WAAU,EAAEC,KAAI,EAAyB;IAC1F,OAAO,IAAIL,WAAkC,CAACM;QAC3C,CAAA;YACCA,SAASC,KAAK;YAEd,IAAIC,wBAAwBT,KAAKU,QAAQN;YAEzC,MAAML,GAAGY,UAAUF;YAEnB,IAAIG,uBAAuB,MAAMd,iBAAiBW;YAElD,IAAI,CAACG,sBAAsB;gBACzB,MAAM,IAAIC,MAAM,CAAC,WAAW,EAAEJ,sBAAsB,eAAe,CAAC;YACtE;YAEA,uBAAuB;YACvB,IAAIK,YAAY,MAAMZ,UAAUa,OAAO;gBACrCT;gBACAN,MAAMS;gBACNJ;YACF;YAEA,MAAMS,UAAUE,OAAO;gBAACV;YAAI;QAC9B,CAAA,IACGW,KAAK;YACJV,SAASW;QACX,GACCC,MAAM,CAACC;YACNb,SAASa,MAAMA;QACjB;IACJ;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/create-workspace/runCreateWorkspace.ts"],"sourcesContent":["import {type CommandArguments} from '@jakubmazanec/cli';\nimport {isEmptyDirectory} from '@jakubmazanec/fs-utils';\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport Observable from 'zen-observable';\n\nimport {type createWorkspaceCommand} from './createWorkspaceCommand.js';\nimport {Workspace} from '../../workspace.js';\n\nexport type CreateWorkspaceOptions = {\n workspacePath: string;\n templateId: string;\n args: CommandArguments<typeof createWorkspaceCommand>;\n};\n\nexport type CreateWorkspaceStatus = string;\n\nexport function runCreateWorkspace({workspacePath, templateId, args}: CreateWorkspaceOptions) {\n return new Observable<CreateWorkspaceStatus>((observer) => {\n (async () => {\n observer.next('TODO');\n\n let resolvedWorkspacePath = path.resolve(workspacePath);\n\n await fs.ensureDir(resolvedWorkspacePath);\n\n let isWorkspacePathEmpty = await isEmptyDirectory(resolvedWorkspacePath);\n\n if (!isWorkspacePathEmpty) {\n throw new Error(`Directory \"${resolvedWorkspacePath}\" must be empty`);\n }\n\n // create new workspace\n let workspace = await Workspace.create({\n args,\n path: resolvedWorkspacePath,\n templateId,\n });\n\n await workspace.update({args});\n })()\n .then(() => {\n observer.complete();\n })\n .catch((error) => {\n observer.error(error);\n });\n });\n}\n"],"names":["isEmptyDirectory","fs","path","Observable","Workspace","runCreateWorkspace","workspacePath","templateId","args","observer","next","resolvedWorkspacePath","resolve","ensureDir","isWorkspacePathEmpty","Error","workspace","create","update","then","complete","catch","error"],"mappings":"AACA,SAAQA,gBAAgB,QAAO,yBAAyB;AACxD,OAAOC,QAAQ,WAAW;AAC1B,OAAOC,UAAU,YAAY;AAC7B,OAAOC,gBAAgB,iBAAiB;AAGxC,SAAQC,SAAS,QAAO,qBAAqB;AAU7C,OAAO,SAASC,mBAAmB,EAACC,aAAa,EAAEC,UAAU,EAAEC,IAAI,EAAyB;IAC1F,OAAO,IAAIL,WAAkC,CAACM;QAC3C,CAAA;YACCA,SAASC,IAAI,CAAC;YAEd,IAAIC,wBAAwBT,KAAKU,OAAO,CAACN;YAEzC,MAAML,GAAGY,SAAS,CAACF;YAEnB,IAAIG,uBAAuB,MAAMd,iBAAiBW;YAElD,IAAI,CAACG,sBAAsB;gBACzB,MAAM,IAAIC,MAAM,CAAC,WAAW,EAAEJ,sBAAsB,eAAe,CAAC;YACtE;YAEA,uBAAuB;YACvB,IAAIK,YAAY,MAAMZ,UAAUa,MAAM,CAAC;gBACrCT;gBACAN,MAAMS;gBACNJ;YACF;YAEA,MAAMS,UAAUE,MAAM,CAAC;gBAACV;YAAI;QAC9B,CAAA,IACGW,IAAI,CAAC;YACJV,SAASW,QAAQ;QACnB,GACCC,KAAK,CAAC,CAACC;YACNb,SAASa,KAAK,CAACA;QACjB;IACJ;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/internals/packageNameToDirectory.ts"],"sourcesContent":["export function packageNameToDirectory(packageName: string): string {\n const packageNameParts = packageName.split('/');\n\n if (packageNameParts.length === 1) {\n return packageNameParts[0] as string;\n }\n\n if (packageNameParts.length > 1 && packageName[0] !== '@') {\n return packageNameParts[0] as string;\n }\n\n return packageNameParts[1] as string;\n}\n"],"names":["packageNameToDirectory","packageName","packageNameParts","split","length"],"mappings":"AAAA,OAAO,SAASA,uBAAuBC,WAAmB;IACxD,MAAMC,mBAAmBD,YAAYE,MAAM;IAE3C,IAAID,iBAAiBE,WAAW,GAAG;QACjC,OAAOF,gBAAgB,CAAC,EAAE;IAC5B;IAEA,IAAIA,iBAAiBE,SAAS,KAAKH,WAAW,CAAC,EAAE,KAAK,KAAK;QACzD,OAAOC,gBAAgB,CAAC,EAAE;IAC5B;IAEA,OAAOA,gBAAgB,CAAC,EAAE;AAC5B"}
1
+ {"version":3,"sources":["../../../src/commands/internals/packageNameToDirectory.ts"],"sourcesContent":["export function packageNameToDirectory(packageName: string): string {\n const packageNameParts = packageName.split('/');\n\n if (packageNameParts.length === 1) {\n return packageNameParts[0] as string;\n }\n\n if (packageNameParts.length > 1 && packageName[0] !== '@') {\n return packageNameParts[0] as string;\n }\n\n return packageNameParts[1] as string;\n}\n"],"names":["packageNameToDirectory","packageName","packageNameParts","split","length"],"mappings":"AAAA,OAAO,SAASA,uBAAuBC,WAAmB;IACxD,MAAMC,mBAAmBD,YAAYE,KAAK,CAAC;IAE3C,IAAID,iBAAiBE,MAAM,KAAK,GAAG;QACjC,OAAOF,gBAAgB,CAAC,EAAE;IAC5B;IAEA,IAAIA,iBAAiBE,MAAM,GAAG,KAAKH,WAAW,CAAC,EAAE,KAAK,KAAK;QACzD,OAAOC,gBAAgB,CAAC,EAAE;IAC5B;IAEA,OAAOA,gBAAgB,CAAC,EAAE;AAC5B"}
@@ -4,10 +4,10 @@ import chalk from 'chalk';
4
4
  import { Box, Text } from 'ink';
5
5
  import { useEffect, useState } from 'react';
6
6
  import { runUpdateWorkspace } from './runUpdateWorkspace.js';
7
- export function UpdateWorkspace({ workspace , args }) {
7
+ export function UpdateWorkspace({ workspace, args }) {
8
8
  let [isFinished, setIsFinished] = useState(false);
9
9
  let [jobs, setJobs] = useState([]);
10
- let { exit } = useProgram();
10
+ let { exit } = useProgram();
11
11
  useEffect(()=>{
12
12
  let subscription = runUpdateWorkspace({
13
13
  workspace,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/update-workspace/UpdateWorkspace.tsx"],"sourcesContent":["import {type CommandArguments, Header, icons, colors, useProgram} from '@jakubmazanec/cli';\nimport chalk from 'chalk';\nimport {Box, Text} from 'ink';\nimport {useEffect, useState} from 'react';\n\nimport {runUpdateWorkspace} from './runUpdateWorkspace.js';\nimport {type updateWorkspaceCommand} from './updateWorkspaceCommand.js';\nimport {type Workspace} from '../../workspace.js';\n\nexport type UpdateWorkspaceProps = {\n args: CommandArguments<typeof updateWorkspaceCommand>;\n workspace: Workspace | Workspace<false>;\n};\n\nexport function UpdateWorkspace({workspace, args}: UpdateWorkspaceProps) {\n let [isFinished, setIsFinished] = useState(false);\n let [jobs, setJobs] = useState<string[]>([]);\n let {exit} = useProgram();\n\n useEffect(() => {\n let subscription = runUpdateWorkspace({workspace, args}).subscribe({\n next(value) {\n setJobs((previousJobs) => [...previousJobs, value]);\n },\n error(error) {\n exit(error);\n },\n complete() {\n setIsFinished(true);\n },\n });\n\n return () => {\n subscription.unsubscribe();\n };\n }, [args, exit, workspace]);\n\n return (\n <Box flexDirection=\"column\">\n <Text>{`Updating workspace at ${chalk[colors.info](workspace.path)}.`}</Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Header showSpinner={!isFinished} icon={icons.success} marginBottom={1}>\n <Text>Updating workspace...</Text>\n </Header>\n\n {jobs.map((job) => (\n <Text key={job}>{`${icons.info} ${job}`}</Text>\n ))}\n </Box>\n\n {isFinished ? (\n <Header marginTop={1} icon={icons.success}>\n <Text>Done.</Text>\n </Header>\n ) : null}\n </Box>\n );\n}\n"],"names":["Header","icons","colors","useProgram","chalk","Box","Text","useEffect","useState","runUpdateWorkspace","UpdateWorkspace","workspace","args","isFinished","setIsFinished","jobs","setJobs","exit","subscription","subscribe","next","value","previousJobs","error","complete","unsubscribe","flexDirection","info","path","marginTop","showSpinner","icon","success","marginBottom","map","job"],"mappings":";AAAA,SAA+BA,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAEC,UAAU,QAAO,oBAAoB;AAC3F,OAAOC,WAAW,QAAQ;AAC1B,SAAQC,GAAG,EAAEC,IAAI,QAAO,MAAM;AAC9B,SAAQC,SAAS,EAAEC,QAAQ,QAAO,QAAQ;AAE1C,SAAQC,kBAAkB,QAAO,0BAA0B;AAS3D,OAAO,SAASC,gBAAgB,EAACC,UAAS,EAAEC,KAAI,EAAuB;IACrE,IAAI,CAACC,YAAYC,cAAc,GAAGN,SAAS;IAC3C,IAAI,CAACO,MAAMC,QAAQ,GAAGR,SAAmB,EAAE;IAC3C,IAAI,EAACS,KAAI,EAAC,GAAGd;IAEbI,UAAU;QACR,IAAIW,eAAeT,mBAAmB;YAACE;YAAWC;QAAI,GAAGO,UAAU;YACjEC,MAAKC,KAAK;gBACRL,QAAQ,CAACM,eAAiB;2BAAIA;wBAAcD;qBAAM;YACpD;YACAE,OAAMA,KAAK;gBACTN,KAAKM;YACP;YACAC;gBACEV,cAAc;YAChB;QACF;QAEA,OAAO;YACLI,aAAaO;QACf;IACF,GAAG;QAACb;QAAMK;QAAMN;KAAU;IAE1B,qBACE,MAACN;QAAIqB,eAAc;;0BACjB,KAACpB;0BAAM,CAAC,sBAAsB,EAAEF,KAAK,CAACF,OAAOyB,KAAK,CAAChB,UAAUiB,MAAM,CAAC,CAAC;;0BAErE,MAACvB;gBAAIwB,WAAW;gBAAGH,eAAc;;kCAC/B,KAAC1B;wBAAO8B,aAAa,CAACjB;wBAAYkB,MAAM9B,MAAM+B;wBAASC,cAAc;kCACnE,cAAA,KAAC3B;sCAAK;;;oBAGPS,KAAKmB,IAAI,CAACC,oBACT,KAAC7B;sCAAgB,CAAC,EAAEL,MAAM0B,KAAK,CAAC,EAAEQ,IAAI,CAAC;2BAA5BA;;;YAIdtB,2BACC,KAACb;gBAAO6B,WAAW;gBAAGE,MAAM9B,MAAM+B;0BAChC,cAAA,KAAC1B;8BAAK;;iBAEN;;;AAGV"}
1
+ {"version":3,"sources":["../../../src/commands/update-workspace/UpdateWorkspace.tsx"],"sourcesContent":["import {type CommandArguments, Header, icons, colors, useProgram} from '@jakubmazanec/cli';\nimport chalk from 'chalk';\nimport {Box, Text} from 'ink';\nimport {useEffect, useState} from 'react';\n\nimport {runUpdateWorkspace} from './runUpdateWorkspace.js';\nimport {type updateWorkspaceCommand} from './updateWorkspaceCommand.js';\nimport {type Workspace} from '../../workspace.js';\n\nexport type UpdateWorkspaceProps = {\n args: CommandArguments<typeof updateWorkspaceCommand>;\n workspace: Workspace | Workspace<false>;\n};\n\nexport function UpdateWorkspace({workspace, args}: UpdateWorkspaceProps) {\n let [isFinished, setIsFinished] = useState(false);\n let [jobs, setJobs] = useState<string[]>([]);\n let {exit} = useProgram();\n\n useEffect(() => {\n let subscription = runUpdateWorkspace({workspace, args}).subscribe({\n next(value) {\n setJobs((previousJobs) => [...previousJobs, value]);\n },\n error(error) {\n exit(error);\n },\n complete() {\n setIsFinished(true);\n },\n });\n\n return () => {\n subscription.unsubscribe();\n };\n }, [args, exit, workspace]);\n\n return (\n <Box flexDirection=\"column\">\n <Text>{`Updating workspace at ${chalk[colors.info](workspace.path)}.`}</Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Header showSpinner={!isFinished} icon={icons.success} marginBottom={1}>\n <Text>Updating workspace...</Text>\n </Header>\n\n {jobs.map((job) => (\n <Text key={job}>{`${icons.info} ${job}`}</Text>\n ))}\n </Box>\n\n {isFinished ? (\n <Header marginTop={1} icon={icons.success}>\n <Text>Done.</Text>\n </Header>\n ) : null}\n </Box>\n );\n}\n"],"names":["Header","icons","colors","useProgram","chalk","Box","Text","useEffect","useState","runUpdateWorkspace","UpdateWorkspace","workspace","args","isFinished","setIsFinished","jobs","setJobs","exit","subscription","subscribe","next","value","previousJobs","error","complete","unsubscribe","flexDirection","info","path","marginTop","showSpinner","icon","success","marginBottom","map","job"],"mappings":";AAAA,SAA+BA,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAEC,UAAU,QAAO,oBAAoB;AAC3F,OAAOC,WAAW,QAAQ;AAC1B,SAAQC,GAAG,EAAEC,IAAI,QAAO,MAAM;AAC9B,SAAQC,SAAS,EAAEC,QAAQ,QAAO,QAAQ;AAE1C,SAAQC,kBAAkB,QAAO,0BAA0B;AAS3D,OAAO,SAASC,gBAAgB,EAACC,SAAS,EAAEC,IAAI,EAAuB;IACrE,IAAI,CAACC,YAAYC,cAAc,GAAGN,SAAS;IAC3C,IAAI,CAACO,MAAMC,QAAQ,GAAGR,SAAmB,EAAE;IAC3C,IAAI,EAACS,IAAI,EAAC,GAAGd;IAEbI,UAAU;QACR,IAAIW,eAAeT,mBAAmB;YAACE;YAAWC;QAAI,GAAGO,SAAS,CAAC;YACjEC,MAAKC,KAAK;gBACRL,QAAQ,CAACM,eAAiB;2BAAIA;wBAAcD;qBAAM;YACpD;YACAE,OAAMA,KAAK;gBACTN,KAAKM;YACP;YACAC;gBACEV,cAAc;YAChB;QACF;QAEA,OAAO;YACLI,aAAaO,WAAW;QAC1B;IACF,GAAG;QAACb;QAAMK;QAAMN;KAAU;IAE1B,qBACE,MAACN;QAAIqB,eAAc;;0BACjB,KAACpB;0BAAM,CAAC,sBAAsB,EAAEF,KAAK,CAACF,OAAOyB,IAAI,CAAC,CAAChB,UAAUiB,IAAI,EAAE,CAAC,CAAC;;0BAErE,MAACvB;gBAAIwB,WAAW;gBAAGH,eAAc;;kCAC/B,KAAC1B;wBAAO8B,aAAa,CAACjB;wBAAYkB,MAAM9B,MAAM+B,OAAO;wBAAEC,cAAc;kCACnE,cAAA,KAAC3B;sCAAK;;;oBAGPS,KAAKmB,GAAG,CAAC,CAACC,oBACT,KAAC7B;sCAAgB,CAAC,EAAEL,MAAM0B,IAAI,CAAC,CAAC,EAAEQ,IAAI,CAAC;2BAA5BA;;;YAIdtB,2BACC,KAACb;gBAAO6B,WAAW;gBAAGE,MAAM9B,MAAM+B,OAAO;0BACvC,cAAA,KAAC1B;8BAAK;;iBAEN;;;AAGV"}
@@ -1,5 +1,5 @@
1
1
  import Observable from 'zen-observable';
2
- export function runUpdateWorkspace({ workspace , args }) {
2
+ export function runUpdateWorkspace({ workspace, args }) {
3
3
  return new Observable((observer)=>{
4
4
  (async ()=>{
5
5
  // update workspace
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/update-workspace/runUpdateWorkspace.ts"],"sourcesContent":["import {type CommandArguments} from '@jakubmazanec/cli';\nimport Observable from 'zen-observable';\n\nimport {type updateWorkspaceCommand} from './updateWorkspaceCommand.js';\nimport {type Workspace} from '../../workspace.js';\n\nexport type UpdateWorkspaceAndProjectsOptions = {\n workspace: Workspace | Workspace<false>;\n args: CommandArguments<typeof updateWorkspaceCommand>;\n};\n\nexport type UpdateWorkspaceAndProjectsStatus = string;\n\nexport function runUpdateWorkspace({workspace, args}: UpdateWorkspaceAndProjectsOptions) {\n return new Observable<UpdateWorkspaceAndProjectsStatus>((observer) => {\n (async () => {\n // update workspace\n observer.next('Updating workspace');\n\n await workspace.update({args});\n\n // update projects\n for (let project of workspace.projects) {\n observer.next(`Updating project ${project.name ?? '?'}`);\n\n await project.update({args});\n }\n })()\n .then(() => {\n observer.complete();\n })\n .catch((error) => {\n observer.error(error);\n });\n });\n}\n"],"names":["Observable","runUpdateWorkspace","workspace","args","observer","next","update","project","projects","name","then","complete","catch","error"],"mappings":"AACA,OAAOA,gBAAgB,iBAAiB;AAYxC,OAAO,SAASC,mBAAmB,EAACC,UAAS,EAAEC,KAAI,EAAoC;IACrF,OAAO,IAAIH,WAA6C,CAACI;QACtD,CAAA;YACC,mBAAmB;YACnBA,SAASC,KAAK;YAEd,MAAMH,UAAUI,OAAO;gBAACH;YAAI;YAE5B,kBAAkB;YAClB,KAAK,IAAII,WAAWL,UAAUM,SAAU;gBACtCJ,SAASC,KAAK,CAAC,iBAAiB,EAAEE,QAAQE,QAAQ,IAAI,CAAC;gBAEvD,MAAMF,QAAQD,OAAO;oBAACH;gBAAI;YAC5B;QACF,CAAA,IACGO,KAAK;YACJN,SAASO;QACX,GACCC,MAAM,CAACC;YACNT,SAASS,MAAMA;QACjB;IACJ;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/update-workspace/runUpdateWorkspace.ts"],"sourcesContent":["import {type CommandArguments} from '@jakubmazanec/cli';\nimport Observable from 'zen-observable';\n\nimport {type updateWorkspaceCommand} from './updateWorkspaceCommand.js';\nimport {type Workspace} from '../../workspace.js';\n\nexport type UpdateWorkspaceAndProjectsOptions = {\n workspace: Workspace | Workspace<false>;\n args: CommandArguments<typeof updateWorkspaceCommand>;\n};\n\nexport type UpdateWorkspaceAndProjectsStatus = string;\n\nexport function runUpdateWorkspace({workspace, args}: UpdateWorkspaceAndProjectsOptions) {\n return new Observable<UpdateWorkspaceAndProjectsStatus>((observer) => {\n (async () => {\n // update workspace\n observer.next('Updating workspace');\n\n await workspace.update({args});\n\n // update projects\n for (let project of workspace.projects) {\n observer.next(`Updating project ${project.name ?? '?'}`);\n\n await project.update({args});\n }\n })()\n .then(() => {\n observer.complete();\n })\n .catch((error) => {\n observer.error(error);\n });\n });\n}\n"],"names":["Observable","runUpdateWorkspace","workspace","args","observer","next","update","project","projects","name","then","complete","catch","error"],"mappings":"AACA,OAAOA,gBAAgB,iBAAiB;AAYxC,OAAO,SAASC,mBAAmB,EAACC,SAAS,EAAEC,IAAI,EAAoC;IACrF,OAAO,IAAIH,WAA6C,CAACI;QACtD,CAAA;YACC,mBAAmB;YACnBA,SAASC,IAAI,CAAC;YAEd,MAAMH,UAAUI,MAAM,CAAC;gBAACH;YAAI;YAE5B,kBAAkB;YAClB,KAAK,IAAII,WAAWL,UAAUM,QAAQ,CAAE;gBACtCJ,SAASC,IAAI,CAAC,CAAC,iBAAiB,EAAEE,QAAQE,IAAI,IAAI,IAAI,CAAC;gBAEvD,MAAMF,QAAQD,MAAM,CAAC;oBAACH;gBAAI;YAC5B;QACF,CAAA,IACGO,IAAI,CAAC;YACJN,SAASO,QAAQ;QACnB,GACCC,KAAK,CAAC,CAACC;YACNT,SAASS,KAAK,CAACA;QACjB;IACJ;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/update-workspace/updateWorkspaceCommand.tsx"],"sourcesContent":["import {Command} from '@jakubmazanec/cli';\nimport path from 'node:path';\n\nimport {UpdateWorkspace} from './UpdateWorkspace.js';\nimport {Workspace} from '../../workspace.js';\n\nexport const updateWorkspaceCommand = new Command(\n 'update workspace',\n async (args, program) => {\n let resolvedPath = path.resolve(process.cwd(), args.options.path ?? '');\n let workspace = await Workspace.findAndRead(resolvedPath);\n\n if (!workspace) {\n throw new Error(`No workspace found at \"${resolvedPath}\"!`);\n }\n\n await program.renderElement(<UpdateWorkspace workspace={workspace} args={args} />);\n },\n {\n description: 'Updates files in a workspace.',\n options: {\n path: {\n type: 'string',\n },\n },\n },\n);\n"],"names":["Command","path","UpdateWorkspace","Workspace","updateWorkspaceCommand","args","program","resolvedPath","resolve","process","cwd","options","workspace","findAndRead","Error","renderElement","description","type"],"mappings":";AAAA,SAAQA,OAAO,QAAO,oBAAoB;AAC1C,OAAOC,UAAU,YAAY;AAE7B,SAAQC,eAAe,QAAO,uBAAuB;AACrD,SAAQC,SAAS,QAAO,qBAAqB;AAE7C,OAAO,MAAMC,yBAAyB,IAAIJ,QACxC,oBACA,OAAOK,MAAMC;IACX,IAAIC,eAAeN,KAAKO,QAAQC,QAAQC,OAAOL,KAAKM,QAAQV,QAAQ;IACpE,IAAIW,YAAY,MAAMT,UAAUU,YAAYN;IAE5C,IAAI,CAACK,WAAW;QACd,MAAM,IAAIE,MAAM,CAAC,uBAAuB,EAAEP,aAAa,EAAE,CAAC;IAC5D;IAEA,MAAMD,QAAQS,4BAAc,KAACb;QAAgBU,WAAWA;QAAWP,MAAMA;;AAC3E,GACA;IACEW,aAAa;IACbL,SAAS;QACPV,MAAM;YACJgB,MAAM;QACR;IACF;AACF,GACA"}
1
+ {"version":3,"sources":["../../../src/commands/update-workspace/updateWorkspaceCommand.tsx"],"sourcesContent":["import {Command} from '@jakubmazanec/cli';\nimport path from 'node:path';\n\nimport {UpdateWorkspace} from './UpdateWorkspace.js';\nimport {Workspace} from '../../workspace.js';\n\nexport const updateWorkspaceCommand = new Command(\n 'update workspace',\n async (args, program) => {\n let resolvedPath = path.resolve(process.cwd(), args.options.path ?? '');\n let workspace = await Workspace.findAndRead(resolvedPath);\n\n if (!workspace) {\n throw new Error(`No workspace found at \"${resolvedPath}\"!`);\n }\n\n await program.renderElement(<UpdateWorkspace workspace={workspace} args={args} />);\n },\n {\n description: 'Updates files in a workspace.',\n options: {\n path: {\n type: 'string',\n },\n },\n },\n);\n"],"names":["Command","path","UpdateWorkspace","Workspace","updateWorkspaceCommand","args","program","resolvedPath","resolve","process","cwd","options","workspace","findAndRead","Error","renderElement","description","type"],"mappings":";AAAA,SAAQA,OAAO,QAAO,oBAAoB;AAC1C,OAAOC,UAAU,YAAY;AAE7B,SAAQC,eAAe,QAAO,uBAAuB;AACrD,SAAQC,SAAS,QAAO,qBAAqB;AAE7C,OAAO,MAAMC,yBAAyB,IAAIJ,QACxC,oBACA,OAAOK,MAAMC;IACX,IAAIC,eAAeN,KAAKO,OAAO,CAACC,QAAQC,GAAG,IAAIL,KAAKM,OAAO,CAACV,IAAI,IAAI;IACpE,IAAIW,YAAY,MAAMT,UAAUU,WAAW,CAACN;IAE5C,IAAI,CAACK,WAAW;QACd,MAAM,IAAIE,MAAM,CAAC,uBAAuB,EAAEP,aAAa,EAAE,CAAC;IAC5D;IAEA,MAAMD,QAAQS,aAAa,eAAC,KAACb;QAAgBU,WAAWA;QAAWP,MAAMA;;AAC3E,GACA;IACEW,aAAa;IACbL,SAAS;QACPV,MAAM;YACJgB,MAAM;QACR;IACF;AACF,GACA"}
package/dist/constants.js CHANGED
@@ -2,15 +2,11 @@ import path from 'node:path';
2
2
  import url from 'node:url';
3
3
  let directory = path.dirname(url.fileURLToPath(import.meta.url));
4
4
  export const PACKAGE_PATH = path.resolve(directory, '..');
5
- // import path from 'node:path';
6
- // import url from 'node:url';
7
- // let directory = path.dirname(url.fileURLToPath(import.meta.url));
8
5
  export const CARSON_CONFIG_DIRECTORY = '.carson';
9
6
  export const PROJECT_CONFIG_FILENAME = 'project.json';
10
7
  export const WORKSPACE_CONFIG_FILENAME = 'workspace.json';
11
8
  export const SNAPSHOTS_FILENAME = '.snapshots';
12
9
  export const TEMPLATES_PATH = 'templates';
13
- // config files in carson template package
14
10
  export const TEMPLATE_CONFIG_FILENAME = 'config.json';
15
11
 
16
12
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["import path from 'node:path';\nimport url from 'node:url';\n\nlet directory = path.dirname(url.fileURLToPath(import.meta.url));\n\nexport const PACKAGE_PATH = path.resolve(directory, '..');\n\n// import path from 'node:path';\n// import url from 'node:url';\n\n// let directory = path.dirname(url.fileURLToPath(import.meta.url));\n\nexport const CARSON_CONFIG_DIRECTORY = '.carson';\nexport const PROJECT_CONFIG_FILENAME = 'project.json';\nexport const WORKSPACE_CONFIG_FILENAME = 'workspace.json';\nexport const SNAPSHOTS_FILENAME = '.snapshots';\n\nexport const TEMPLATES_PATH = 'templates';\n\n// config files in carson template package\nexport const TEMPLATE_CONFIG_FILENAME = 'config.json';\n"],"names":["path","url","directory","dirname","fileURLToPath","PACKAGE_PATH","resolve","CARSON_CONFIG_DIRECTORY","PROJECT_CONFIG_FILENAME","WORKSPACE_CONFIG_FILENAME","SNAPSHOTS_FILENAME","TEMPLATES_PATH","TEMPLATE_CONFIG_FILENAME"],"mappings":"AAAA,OAAOA,UAAU,YAAY;AAC7B,OAAOC,SAAS,WAAW;AAE3B,IAAIC,YAAYF,KAAKG,QAAQF,IAAIG,cAAc,YAAYH;AAE3D,OAAO,MAAMI,eAAeL,KAAKM,QAAQJ,WAAW,MAAM;AAE1D,gCAAgC;AAChC,8BAA8B;AAE9B,oEAAoE;AAEpE,OAAO,MAAMK,0BAA0B,UAAU;AACjD,OAAO,MAAMC,0BAA0B,eAAe;AACtD,OAAO,MAAMC,4BAA4B,iBAAiB;AAC1D,OAAO,MAAMC,qBAAqB,aAAa;AAE/C,OAAO,MAAMC,iBAAiB,YAAY;AAE1C,0CAA0C;AAC1C,OAAO,MAAMC,2BAA2B,cAAc"}
1
+ {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["import path from 'node:path';\nimport url from 'node:url';\n\nlet directory = path.dirname(url.fileURLToPath(import.meta.url));\n\nexport const PACKAGE_PATH = path.resolve(directory, '..');\n\nexport const CARSON_CONFIG_DIRECTORY = '.carson';\nexport const PROJECT_CONFIG_FILENAME = 'project.json';\nexport const WORKSPACE_CONFIG_FILENAME = 'workspace.json';\nexport const SNAPSHOTS_FILENAME = '.snapshots';\nexport const TEMPLATES_PATH = 'templates';\nexport const TEMPLATE_CONFIG_FILENAME = 'config.json';\n"],"names":["path","url","directory","dirname","fileURLToPath","PACKAGE_PATH","resolve","CARSON_CONFIG_DIRECTORY","PROJECT_CONFIG_FILENAME","WORKSPACE_CONFIG_FILENAME","SNAPSHOTS_FILENAME","TEMPLATES_PATH","TEMPLATE_CONFIG_FILENAME"],"mappings":"AAAA,OAAOA,UAAU,YAAY;AAC7B,OAAOC,SAAS,WAAW;AAE3B,IAAIC,YAAYF,KAAKG,OAAO,CAACF,IAAIG,aAAa,CAAC,YAAYH,GAAG;AAE9D,OAAO,MAAMI,eAAeL,KAAKM,OAAO,CAACJ,WAAW,MAAM;AAE1D,OAAO,MAAMK,0BAA0B,UAAU;AACjD,OAAO,MAAMC,0BAA0B,eAAe;AACtD,OAAO,MAAMC,4BAA4B,iBAAiB;AAC1D,OAAO,MAAMC,qBAAqB,aAAa;AAC/C,OAAO,MAAMC,iBAAiB,YAAY;AAC1C,OAAO,MAAMC,2BAA2B,cAAc"}
package/dist/run.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/run.ts"],"sourcesContent":["import {Program, getProgramDetail} from '@jakubmazanec/cli';\nimport {readPackageJson} from '@jakubmazanec/zod-utils';\nimport path from 'node:path';\n\nimport {createWorkspaceCommand, updateWorkspaceCommand, createProjectCommand} from './commands.js';\nimport {PACKAGE_PATH} from './constants.js';\n\nlet programDetail = getProgramDetail(\n await readPackageJson(path.join(PACKAGE_PATH, 'package.json'), {throwOnZodError: true}),\n);\n\nlet program = new Program({\n ...programDetail,\n name: 'Carson',\n});\n\nprogram.addCommand(createWorkspaceCommand);\nprogram.addCommand(createProjectCommand);\nprogram.addCommand(updateWorkspaceCommand);\n\nawait program.run(process.argv.slice(2));\n"],"names":["Program","getProgramDetail","readPackageJson","path","createWorkspaceCommand","updateWorkspaceCommand","createProjectCommand","PACKAGE_PATH","programDetail","join","throwOnZodError","program","name","addCommand","run","process","argv","slice"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,gBAAgB,QAAO,oBAAoB;AAC5D,SAAQC,eAAe,QAAO,0BAA0B;AACxD,OAAOC,UAAU,YAAY;AAE7B,SAAQC,sBAAsB,EAAEC,sBAAsB,EAAEC,oBAAoB,QAAO,gBAAgB;AACnG,SAAQC,YAAY,QAAO,iBAAiB;AAE5C,IAAIC,gBAAgBP,iBAClB,MAAMC,gBAAgBC,KAAKM,KAAKF,cAAc,iBAAiB;IAACG,iBAAiB;AAAI;AAGvF,IAAIC,UAAU,IAAIX,QAAQ;IACxB,GAAGQ,aAAa;IAChBI,MAAM;AACR;AAEAD,QAAQE,WAAWT;AACnBO,QAAQE,WAAWP;AACnBK,QAAQE,WAAWR;AAEnB,MAAMM,QAAQG,IAAIC,QAAQC,KAAKC,MAAM"}
1
+ {"version":3,"sources":["../src/run.ts"],"sourcesContent":["import {Program, getProgramDetail} from '@jakubmazanec/cli';\nimport {readPackageJson} from '@jakubmazanec/zod-utils';\nimport path from 'node:path';\n\nimport {createWorkspaceCommand, updateWorkspaceCommand, createProjectCommand} from './commands.js';\nimport {PACKAGE_PATH} from './constants.js';\n\nlet programDetail = getProgramDetail(\n await readPackageJson(path.join(PACKAGE_PATH, 'package.json'), {throwOnZodError: true}),\n);\n\nlet program = new Program({\n ...programDetail,\n name: 'Carson',\n});\n\nprogram.addCommand(createWorkspaceCommand);\nprogram.addCommand(createProjectCommand);\nprogram.addCommand(updateWorkspaceCommand);\n\nawait program.run(process.argv.slice(2));\n"],"names":["Program","getProgramDetail","readPackageJson","path","createWorkspaceCommand","updateWorkspaceCommand","createProjectCommand","PACKAGE_PATH","programDetail","join","throwOnZodError","program","name","addCommand","run","process","argv","slice"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,gBAAgB,QAAO,oBAAoB;AAC5D,SAAQC,eAAe,QAAO,0BAA0B;AACxD,OAAOC,UAAU,YAAY;AAE7B,SAAQC,sBAAsB,EAAEC,sBAAsB,EAAEC,oBAAoB,QAAO,gBAAgB;AACnG,SAAQC,YAAY,QAAO,iBAAiB;AAE5C,IAAIC,gBAAgBP,iBAClB,MAAMC,gBAAgBC,KAAKM,IAAI,CAACF,cAAc,iBAAiB;IAACG,iBAAiB;AAAI;AAGvF,IAAIC,UAAU,IAAIX,QAAQ;IACxB,GAAGQ,aAAa;IAChBI,MAAM;AACR;AAEAD,QAAQE,UAAU,CAACT;AACnBO,QAAQE,UAAU,CAACP;AACnBK,QAAQE,UAAU,CAACR;AAEnB,MAAMM,QAAQG,GAAG,CAACC,QAAQC,IAAI,CAACC,KAAK,CAAC"}
@@ -2,8 +2,14 @@ import { type Template } from '@jakubmazanec/template';
2
2
  import { type CarsonTemplateConfig } from './CarsonTemplateConfig.js';
3
3
  import { type templateAttributesSchema } from './TemplateAttributes.js';
4
4
  import { type templateDataSchema } from './TemplateData.js';
5
+ /**
6
+ * Carson template.
7
+ */
5
8
  export type CarsonTemplate = {
9
+ /** Carson template name. */
6
10
  name: string;
11
+ /** Carson template config. */
7
12
  config: CarsonTemplateConfig;
13
+ /** Carson template files, actually instances of {@linkcode Template}. */
8
14
  files: Array<Template<typeof templateAttributesSchema, typeof templateDataSchema>>;
9
15
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/template/CarsonTemplate.ts"],"sourcesContent":["import {type Template} from '@jakubmazanec/template';\n\nimport {type CarsonTemplateConfig} from './CarsonTemplateConfig.js';\nimport {type templateAttributesSchema} from './TemplateAttributes.js';\nimport {type templateDataSchema} from './TemplateData.js';\n\nexport type CarsonTemplate = {\n name: string;\n config: CarsonTemplateConfig;\n files: Array<Template<typeof templateAttributesSchema, typeof templateDataSchema>>;\n};\n"],"names":[],"mappings":"AAAA,WAUE"}
1
+ {"version":3,"sources":["../../src/template/CarsonTemplate.ts"],"sourcesContent":["import {type Template} from '@jakubmazanec/template';\n\nimport {type CarsonTemplateConfig} from './CarsonTemplateConfig.js';\nimport {type templateAttributesSchema} from './TemplateAttributes.js';\nimport {type templateDataSchema} from './TemplateData.js';\n\n/**\n * Carson template.\n */\nexport type CarsonTemplate = {\n /** Carson template name. */\n\n name: string;\n\n /** Carson template config. */\n config: CarsonTemplateConfig;\n\n /** Carson template files, actually instances of {@linkcode Template}. */\n files: Array<Template<typeof templateAttributesSchema, typeof templateDataSchema>>;\n};\n"],"names":[],"mappings":"AAAA,WAmBE"}
@@ -9,4 +9,7 @@ export declare const carsonTemplateConfigSchema: z.ZodObject<{
9
9
  disallowMultiProjectWorkspace?: boolean | undefined;
10
10
  disallowSingleProjectWorkspace?: boolean | undefined;
11
11
  }>;
12
+ /**
13
+ * Carson teamplate config.
14
+ */
12
15
  export type CarsonTemplateConfig = z.infer<typeof carsonTemplateConfigSchema>;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/template/CarsonTemplateConfig.ts"],"sourcesContent":["import {z} from 'zod';\n\nexport const carsonTemplateConfigSchema = z\n .object({\n disallowMultiProjectWorkspace: z.boolean().optional(),\n disallowSingleProjectWorkspace: z.boolean().optional(),\n\n // TODO: add extends property to allow reuisng template files from another carson template\n })\n .strict();\n\nexport type CarsonTemplateConfig = z.infer<typeof carsonTemplateConfigSchema>;\n"],"names":["z","carsonTemplateConfigSchema","object","disallowMultiProjectWorkspace","boolean","optional","disallowSingleProjectWorkspace","strict"],"mappings":"AAAA,SAAQA,CAAC,QAAO,MAAM;AAEtB,OAAO,MAAMC,6BAA6BD,EACvCE,OAAO;IACNC,+BAA+BH,EAAEI,UAAUC;IAC3CC,gCAAgCN,EAAEI,UAAUC;AAG9C,GACCE,SAAS"}
1
+ {"version":3,"sources":["../../src/template/CarsonTemplateConfig.ts"],"sourcesContent":["import {z} from 'zod';\n\nexport const carsonTemplateConfigSchema = z\n .object({\n disallowMultiProjectWorkspace: z.boolean().optional(),\n disallowSingleProjectWorkspace: z.boolean().optional(),\n\n // TODO: add extends property to allow reuisng template files from another carson template\n })\n .strict();\n\n/**\n * Carson teamplate config.\n */\nexport type CarsonTemplateConfig = z.infer<typeof carsonTemplateConfigSchema>;\n"],"names":["z","carsonTemplateConfigSchema","object","disallowMultiProjectWorkspace","boolean","optional","disallowSingleProjectWorkspace","strict"],"mappings":"AAAA,SAAQA,CAAC,QAAO,MAAM;AAEtB,OAAO,MAAMC,6BAA6BD,EACvCE,MAAM,CAAC;IACNC,+BAA+BH,EAAEI,OAAO,GAAGC,QAAQ;IACnDC,gCAAgCN,EAAEI,OAAO,GAAGC,QAAQ;AAGtD,GACCE,MAAM,GAAG"}
@@ -1,16 +1,17 @@
1
1
  import { z } from 'zod';
2
+ let strategyTemplateAttributeSchema = z.union([
3
+ z.literal('create'),
4
+ z.literal('overwrite'),
5
+ z.literal('merge'),
6
+ z.literal('check'),
7
+ z.tuple([
8
+ z.literal('insert'),
9
+ z.string()
10
+ ])
11
+ ]);
2
12
  export const templateAttributesSchema = z.object({
3
13
  // TODO: add strategy 'none' so when you using template A that extends template B, you can overwrite template files to no-op
4
- strategy: z.union([
5
- z.literal('create'),
6
- z.literal('overwrite'),
7
- z.literal('merge'),
8
- z.literal('check'),
9
- z.tuple([
10
- z.literal('insert'),
11
- z.string()
12
- ])
13
- ])
14
+ strategy: strategyTemplateAttributeSchema
14
15
  }).strict();
15
16
 
16
17
  //# sourceMappingURL=TemplateAttributes.js.map