@jakubmazanec/carson 0.1.0-11dd4a3
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.
- package/LICENSE.md +661 -0
- package/README.md +237 -0
- package/bin/carson.js +3 -0
- package/dist/commands/create-project/CreateProject.d.ts +8 -0
- package/dist/commands/create-project/CreateProject.js +138 -0
- package/dist/commands/create-project/CreateProject.js.map +1 -0
- package/dist/commands/create-project/CreateProjectInput.d.ts +20 -0
- package/dist/commands/create-project/CreateProjectInput.js +31 -0
- package/dist/commands/create-project/CreateProjectInput.js.map +1 -0
- package/dist/commands/create-project/createProjectCommand.d.ts +12 -0
- package/dist/commands/create-project/createProjectCommand.js +31 -0
- package/dist/commands/create-project/createProjectCommand.js.map +1 -0
- package/dist/commands/create-project/runCreateProject.d.ts +13 -0
- package/dist/commands/create-project/runCreateProject.js +34 -0
- package/dist/commands/create-project/runCreateProject.js.map +1 -0
- package/dist/commands/create-project.d.ts +4 -0
- package/dist/commands/create-project.js +6 -0
- package/dist/commands/create-project.js.map +1 -0
- package/dist/commands/create-workspace/CreateWorkspace.d.ts +7 -0
- package/dist/commands/create-workspace/CreateWorkspace.js +102 -0
- package/dist/commands/create-workspace/CreateWorkspace.js.map +1 -0
- package/dist/commands/create-workspace/CreateWorkspaceInput.d.ts +11 -0
- package/dist/commands/create-workspace/CreateWorkspaceInput.js +17 -0
- package/dist/commands/create-workspace/CreateWorkspaceInput.js.map +1 -0
- package/dist/commands/create-workspace/createWorkspaceCommand.d.ts +9 -0
- package/dist/commands/create-workspace/createWorkspaceCommand.js +30 -0
- package/dist/commands/create-workspace/createWorkspaceCommand.js.map +1 -0
- package/dist/commands/create-workspace/runCreateWorkspace.d.ts +10 -0
- package/dist/commands/create-workspace/runCreateWorkspace.js +33 -0
- package/dist/commands/create-workspace/runCreateWorkspace.js.map +1 -0
- package/dist/commands/create-workspace.d.ts +4 -0
- package/dist/commands/create-workspace.js +6 -0
- package/dist/commands/create-workspace.js.map +1 -0
- package/dist/commands/internals/packageNameToDirectory.d.ts +1 -0
- package/dist/commands/internals/packageNameToDirectory.js +12 -0
- package/dist/commands/internals/packageNameToDirectory.js.map +1 -0
- package/dist/commands/internals.d.ts +1 -0
- package/dist/commands/internals.js +3 -0
- package/dist/commands/internals.js.map +1 -0
- package/dist/commands/update-workspace/UpdateWorkspace.d.ts +8 -0
- package/dist/commands/update-workspace/UpdateWorkspace.js +71 -0
- package/dist/commands/update-workspace/UpdateWorkspace.js.map +1 -0
- package/dist/commands/update-workspace/runUpdateWorkspace.d.ts +10 -0
- package/dist/commands/update-workspace/runUpdateWorkspace.js +25 -0
- package/dist/commands/update-workspace/runUpdateWorkspace.js.map +1 -0
- package/dist/commands/update-workspace/updateWorkspaceCommand.d.ts +6 -0
- package/dist/commands/update-workspace/updateWorkspaceCommand.js +25 -0
- package/dist/commands/update-workspace/updateWorkspaceCommand.js.map +1 -0
- package/dist/commands/update-workspace.d.ts +3 -0
- package/dist/commands/update-workspace.js +5 -0
- package/dist/commands/update-workspace.js.map +1 -0
- package/dist/commands.d.ts +3 -0
- package/dist/commands.js +5 -0
- package/dist/commands.js.map +1 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.js +16 -0
- package/dist/constants.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.js +5 -0
- package/dist/main.js.map +1 -0
- package/dist/modules.d.js +2 -0
- package/dist/modules.d.js.map +1 -0
- package/dist/run.d.ts +1 -0
- package/dist/run.js +18 -0
- package/dist/run.js.map +1 -0
- package/dist/template/CarsonTemplate.d.ts +9 -0
- package/dist/template/CarsonTemplate.js +3 -0
- package/dist/template/CarsonTemplate.js.map +1 -0
- package/dist/template/CarsonTemplateConfig.d.ts +12 -0
- package/dist/template/CarsonTemplateConfig.js +7 -0
- package/dist/template/CarsonTemplateConfig.js.map +1 -0
- package/dist/template/TemplateAttributes.d.ts +9 -0
- package/dist/template/TemplateAttributes.js +16 -0
- package/dist/template/TemplateAttributes.js.map +1 -0
- package/dist/template/TemplateData.d.ts +35 -0
- package/dist/template/TemplateData.js +13 -0
- package/dist/template/TemplateData.js.map +1 -0
- package/dist/template/TemplateRender.d.ts +4 -0
- package/dist/template/TemplateRender.js +3 -0
- package/dist/template/TemplateRender.js.map +1 -0
- package/dist/template/TemplateRenderSnapshot.d.ts +27 -0
- package/dist/template/TemplateRenderSnapshot.js +11 -0
- package/dist/template/TemplateRenderSnapshot.js.map +1 -0
- package/dist/template/TemplateRenderSnapshots.d.ts +27 -0
- package/dist/template/TemplateRenderSnapshots.js +4 -0
- package/dist/template/TemplateRenderSnapshots.js.map +1 -0
- package/dist/template/TemplateRenders.d.ts +2 -0
- package/dist/template/TemplateRenders.js +3 -0
- package/dist/template/TemplateRenders.js.map +1 -0
- package/dist/template/applyTemplateRenders.d.ts +8 -0
- package/dist/template/applyTemplateRenders.js +60 -0
- package/dist/template/applyTemplateRenders.js.map +1 -0
- package/dist/template/createFileUsingTemplateRender.d.ts +2 -0
- package/dist/template/createFileUsingTemplateRender.js +12 -0
- package/dist/template/createFileUsingTemplateRender.js.map +1 -0
- package/dist/template/deleteFileUsingTemplateRender.d.ts +2 -0
- package/dist/template/deleteFileUsingTemplateRender.js +10 -0
- package/dist/template/deleteFileUsingTemplateRender.js.map +1 -0
- package/dist/template/importCarsonTemplate.d.ts +3 -0
- package/dist/template/importCarsonTemplate.js +8 -0
- package/dist/template/importCarsonTemplate.js.map +1 -0
- package/dist/template/insertUsingTemplateRender.d.ts +2 -0
- package/dist/template/insertUsingTemplateRender.js +29 -0
- package/dist/template/insertUsingTemplateRender.js.map +1 -0
- package/dist/template/internals/merge.d.ts +4 -0
- package/dist/template/internals/merge.js +30 -0
- package/dist/template/internals/merge.js.map +1 -0
- package/dist/template/internals/prettify.d.ts +1 -0
- package/dist/template/internals/prettify.js +25 -0
- package/dist/template/internals/prettify.js.map +1 -0
- package/dist/template/internals/unmerge.d.ts +4 -0
- package/dist/template/internals/unmerge.js +31 -0
- package/dist/template/internals/unmerge.js.map +1 -0
- package/dist/template/internals.d.ts +3 -0
- package/dist/template/internals.js +5 -0
- package/dist/template/internals.js.map +1 -0
- package/dist/template/loadTemplateRenderSnapshots.d.ts +7 -0
- package/dist/template/loadTemplateRenderSnapshots.js +14 -0
- package/dist/template/loadTemplateRenderSnapshots.js.map +1 -0
- package/dist/template/mergeFileUsingTemplateRender.d.ts +2 -0
- package/dist/template/mergeFileUsingTemplateRender.js +39 -0
- package/dist/template/mergeFileUsingTemplateRender.js.map +1 -0
- package/dist/template/overwriteFileUsingTemplateRender.d.ts +2 -0
- package/dist/template/overwriteFileUsingTemplateRender.js +12 -0
- package/dist/template/overwriteFileUsingTemplateRender.js.map +1 -0
- package/dist/template/parseTemplateId.d.ts +1 -0
- package/dist/template/parseTemplateId.js +12 -0
- package/dist/template/parseTemplateId.js.map +1 -0
- package/dist/template/readCarsonTemplate.d.ts +2 -0
- package/dist/template/readCarsonTemplate.js +39 -0
- package/dist/template/readCarsonTemplate.js.map +1 -0
- package/dist/template/renderTemplate.d.ts +7 -0
- package/dist/template/renderTemplate.js +19 -0
- package/dist/template/renderTemplate.js.map +1 -0
- package/dist/template/resolveTemplateModule.d.ts +1 -0
- package/dist/template/resolveTemplateModule.js +9 -0
- package/dist/template/resolveTemplateModule.js.map +1 -0
- package/dist/template/saveTemplateRenderSnapshots.d.ts +2 -0
- package/dist/template/saveTemplateRenderSnapshots.js +23 -0
- package/dist/template/saveTemplateRenderSnapshots.js.map +1 -0
- package/dist/template/uninsertUsingTemplateRender.d.ts +2 -0
- package/dist/template/uninsertUsingTemplateRender.js +29 -0
- package/dist/template/uninsertUsingTemplateRender.js.map +1 -0
- package/dist/template/unmergeFileUsingTemplateRender.d.ts +2 -0
- package/dist/template/unmergeFileUsingTemplateRender.js +39 -0
- package/dist/template/unmergeFileUsingTemplateRender.js.map +1 -0
- package/dist/template.d.ts +20 -0
- package/dist/template.js +22 -0
- package/dist/template.js.map +1 -0
- package/dist/workspace/Project.d.ts +33 -0
- package/dist/workspace/Project.js +184 -0
- package/dist/workspace/Project.js.map +1 -0
- package/dist/workspace/ProjectConfig.d.ts +9 -0
- package/dist/workspace/ProjectConfig.js +6 -0
- package/dist/workspace/ProjectConfig.js.map +1 -0
- package/dist/workspace/ProjectCreateOptions.d.ts +8 -0
- package/dist/workspace/ProjectCreateOptions.js +3 -0
- package/dist/workspace/ProjectCreateOptions.js.map +1 -0
- package/dist/workspace/ProjectError.d.ts +8 -0
- package/dist/workspace/ProjectError.js +11 -0
- package/dist/workspace/ProjectError.js.map +1 -0
- package/dist/workspace/ProjectOptions.d.ts +15 -0
- package/dist/workspace/ProjectOptions.js +3 -0
- package/dist/workspace/ProjectOptions.js.map +1 -0
- package/dist/workspace/ProjectUpdateOptions.d.ts +3 -0
- package/dist/workspace/ProjectUpdateOptions.js +3 -0
- package/dist/workspace/ProjectUpdateOptions.js.map +1 -0
- package/dist/workspace/Workspace.d.ts +68 -0
- package/dist/workspace/Workspace.js +426 -0
- package/dist/workspace/Workspace.js.map +1 -0
- package/dist/workspace/WorkspaceConfig.d.ts +9 -0
- package/dist/workspace/WorkspaceConfig.js +6 -0
- package/dist/workspace/WorkspaceConfig.js.map +1 -0
- package/dist/workspace/WorkspaceCreateOptions.d.ts +5 -0
- package/dist/workspace/WorkspaceCreateOptions.js +3 -0
- package/dist/workspace/WorkspaceCreateOptions.js.map +1 -0
- package/dist/workspace/WorkspaceCreateProjectOptions.d.ts +6 -0
- package/dist/workspace/WorkspaceCreateProjectOptions.js +3 -0
- package/dist/workspace/WorkspaceCreateProjectOptions.js.map +1 -0
- package/dist/workspace/WorkspaceDependencies.d.ts +30 -0
- package/dist/workspace/WorkspaceDependencies.js +126 -0
- package/dist/workspace/WorkspaceDependencies.js.map +1 -0
- package/dist/workspace/WorkspaceError.d.ts +8 -0
- package/dist/workspace/WorkspaceError.js +13 -0
- package/dist/workspace/WorkspaceError.js.map +1 -0
- package/dist/workspace/WorkspaceOptions.d.ts +25 -0
- package/dist/workspace/WorkspaceOptions.js +3 -0
- package/dist/workspace/WorkspaceOptions.js.map +1 -0
- package/dist/workspace/WorkspaceOptionsProjectOptions.d.ts +7 -0
- package/dist/workspace/WorkspaceOptionsProjectOptions.js +3 -0
- package/dist/workspace/WorkspaceOptionsProjectOptions.js.map +1 -0
- package/dist/workspace/WorkspacePackageJson.d.ts +2 -0
- package/dist/workspace/WorkspacePackageJson.js +3 -0
- package/dist/workspace/WorkspacePackageJson.js.map +1 -0
- package/dist/workspace/WorkspaceProjectGlobs.d.ts +1 -0
- package/dist/workspace/WorkspaceProjectGlobs.js +3 -0
- package/dist/workspace/WorkspaceProjectGlobs.js.map +1 -0
- package/dist/workspace/WorkspaceProjects.d.ts +2 -0
- package/dist/workspace/WorkspaceProjects.js +3 -0
- package/dist/workspace/WorkspaceProjects.js.map +1 -0
- package/dist/workspace/WorkspaceRepository.d.ts +4 -0
- package/dist/workspace/WorkspaceRepository.js +3 -0
- package/dist/workspace/WorkspaceRepository.js.map +1 -0
- package/dist/workspace/WorkspaceUpdateOptions.d.ts +3 -0
- package/dist/workspace/WorkspaceUpdateOptions.js +3 -0
- package/dist/workspace/WorkspaceUpdateOptions.js.map +1 -0
- package/dist/workspace/internals/compareSemver.d.ts +8 -0
- package/dist/workspace/internals/compareSemver.js +27 -0
- package/dist/workspace/internals/compareSemver.js.map +1 -0
- package/dist/workspace/internals/getPackageJsonWorkspaces.d.ts +2 -0
- package/dist/workspace/internals/getPackageJsonWorkspaces.js +11 -0
- package/dist/workspace/internals/getPackageJsonWorkspaces.js.map +1 -0
- package/dist/workspace/internals/getRepositoryBranches.d.ts +1 -0
- package/dist/workspace/internals/getRepositoryBranches.js +21 -0
- package/dist/workspace/internals/getRepositoryBranches.js.map +1 -0
- package/dist/workspace/internals/getRepositoryUrl.d.ts +1 -0
- package/dist/workspace/internals/getRepositoryUrl.js +21 -0
- package/dist/workspace/internals/getRepositoryUrl.js.map +1 -0
- package/dist/workspace/internals.d.ts +4 -0
- package/dist/workspace/internals.js +6 -0
- package/dist/workspace/internals.js.map +1 -0
- package/dist/workspace/saveProjectConfig.d.ts +6 -0
- package/dist/workspace/saveProjectConfig.js +13 -0
- package/dist/workspace/saveProjectConfig.js.map +1 -0
- package/dist/workspace/saveWorkspaceConfig.d.ts +6 -0
- package/dist/workspace/saveWorkspaceConfig.js +13 -0
- package/dist/workspace/saveWorkspaceConfig.js.map +1 -0
- package/dist/workspace.d.ts +10 -0
- package/dist/workspace.js +12 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +84 -0
- package/src/commands/create-project/CreateProject.tsx +130 -0
- package/src/commands/create-project/CreateProjectInput.ts +37 -0
- package/src/commands/create-project/createProjectCommand.tsx +33 -0
- package/src/commands/create-project/runCreateProject.ts +59 -0
- package/src/commands/create-project.ts +4 -0
- package/src/commands/create-workspace/CreateWorkspace.tsx +90 -0
- package/src/commands/create-workspace/CreateWorkspaceInput.ts +21 -0
- package/src/commands/create-workspace/createWorkspaceCommand.tsx +34 -0
- package/src/commands/create-workspace/runCreateWorkspace.ts +49 -0
- package/src/commands/create-workspace.ts +4 -0
- package/src/commands/internals/packageNameToDirectory.ts +13 -0
- package/src/commands/internals.ts +1 -0
- package/src/commands/update-workspace/UpdateWorkspace.tsx +59 -0
- package/src/commands/update-workspace/runUpdateWorkspace.ts +36 -0
- package/src/commands/update-workspace/updateWorkspaceCommand.tsx +27 -0
- package/src/commands/update-workspace.ts +3 -0
- package/src/commands.ts +3 -0
- package/src/constants.ts +21 -0
- package/src/main.ts +3 -0
- package/src/modules.d.ts +1 -0
- package/src/run.ts +21 -0
- package/src/template/CarsonTemplate.ts +11 -0
- package/src/template/CarsonTemplateConfig.ts +12 -0
- package/src/template/TemplateAttributes.ts +16 -0
- package/src/template/TemplateData.ts +17 -0
- package/src/template/TemplateRender.ts +9 -0
- package/src/template/TemplateRenderSnapshot.ts +13 -0
- package/src/template/TemplateRenderSnapshots.ts +7 -0
- package/src/template/TemplateRenders.ts +3 -0
- package/src/template/applyTemplateRenders.ts +89 -0
- package/src/template/createFileUsingTemplateRender.ts +12 -0
- package/src/template/deleteFileUsingTemplateRender.ts +15 -0
- package/src/template/importCarsonTemplate.ts +13 -0
- package/src/template/insertUsingTemplateRender.ts +33 -0
- package/src/template/internals/merge.ts +44 -0
- package/src/template/internals/prettify.ts +24 -0
- package/src/template/internals/unmerge.ts +48 -0
- package/src/template/internals.ts +3 -0
- package/src/template/loadTemplateRenderSnapshots.ts +18 -0
- package/src/template/mergeFileUsingTemplateRender.ts +39 -0
- package/src/template/overwriteFileUsingTemplateRender.ts +12 -0
- package/src/template/parseTemplateId.ts +9 -0
- package/src/template/readCarsonTemplate.ts +46 -0
- package/src/template/renderTemplate.ts +30 -0
- package/src/template/resolveTemplateModule.ts +9 -0
- package/src/template/saveTemplateRenderSnapshots.ts +34 -0
- package/src/template/uninsertUsingTemplateRender.ts +36 -0
- package/src/template/unmergeFileUsingTemplateRender.ts +42 -0
- package/src/template.ts +20 -0
- package/src/workspace/Project.ts +246 -0
- package/src/workspace/ProjectConfig.ts +9 -0
- package/src/workspace/ProjectCreateOptions.ts +9 -0
- package/src/workspace/ProjectError.ts +15 -0
- package/src/workspace/ProjectOptions.ts +17 -0
- package/src/workspace/ProjectUpdateOptions.ts +3 -0
- package/src/workspace/Workspace.ts +553 -0
- package/src/workspace/WorkspaceConfig.ts +9 -0
- package/src/workspace/WorkspaceCreateOptions.ts +5 -0
- package/src/workspace/WorkspaceCreateProjectOptions.ts +6 -0
- package/src/workspace/WorkspaceDependencies.ts +196 -0
- package/src/workspace/WorkspaceError.ts +18 -0
- package/src/workspace/WorkspaceOptions.ts +29 -0
- package/src/workspace/WorkspaceOptionsProjectOptions.ts +9 -0
- package/src/workspace/WorkspacePackageJson.ts +3 -0
- package/src/workspace/WorkspaceProjectGlobs.ts +1 -0
- package/src/workspace/WorkspaceProjects.ts +3 -0
- package/src/workspace/WorkspaceRepository.ts +4 -0
- package/src/workspace/WorkspaceUpdateOptions.ts +3 -0
- package/src/workspace/internals/compareSemver.ts +35 -0
- package/src/workspace/internals/getPackageJsonWorkspaces.ts +11 -0
- package/src/workspace/internals/getRepositoryBranches.ts +25 -0
- package/src/workspace/internals/getRepositoryUrl.ts +23 -0
- package/src/workspace/internals.ts +4 -0
- package/src/workspace/saveProjectConfig.ts +23 -0
- package/src/workspace/saveWorkspaceConfig.ts +30 -0
- package/src/workspace.ts +10 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import json from 'json5';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import yaml from 'yaml';
|
|
5
|
+
import { merge, prettify } from './internals.js';
|
|
6
|
+
export async function mergeFileUsingTemplateRender(render, basePath) {
|
|
7
|
+
let to = path.join(basePath, render.attributes.to);
|
|
8
|
+
let extension = path.extname(to);
|
|
9
|
+
switch(extension){
|
|
10
|
+
case '.json':
|
|
11
|
+
{
|
|
12
|
+
let targetFile = await fs.readJson(to);
|
|
13
|
+
let fileToMerge = json.parse(render.content);
|
|
14
|
+
let newFile = JSON.stringify(merge(targetFile, fileToMerge));
|
|
15
|
+
await fs.writeFile(to, await prettify(newFile, to), {
|
|
16
|
+
encoding: 'utf8'
|
|
17
|
+
});
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
case '.yaml':
|
|
21
|
+
{
|
|
22
|
+
let targetFile = yaml.parse(await fs.readFile(to, {
|
|
23
|
+
encoding: 'utf8'
|
|
24
|
+
}));
|
|
25
|
+
let fileToMerge = yaml.parse(render.content);
|
|
26
|
+
let newFile = yaml.stringify(merge(targetFile, fileToMerge));
|
|
27
|
+
await fs.writeFile(to, await prettify(newFile, to), {
|
|
28
|
+
encoding: 'utf8'
|
|
29
|
+
});
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
default:
|
|
33
|
+
{
|
|
34
|
+
throw new Error(`File extension "${extension}" is not supported!`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=mergeFileUsingTemplateRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/template/mergeFileUsingTemplateRender.ts"],"sourcesContent":["import {type Json} from '@jakubmazanec/zod-utils';\nimport fs from 'fs-extra';\nimport json from 'json5';\nimport path from 'node:path';\nimport yaml from 'yaml';\n\nimport {merge, prettify} from './internals.js';\nimport {type TemplateRender} from './TemplateRender.js';\n\nexport async function mergeFileUsingTemplateRender(render: TemplateRender, basePath: string) {\n let to = path.join(basePath, render.attributes.to);\n let extension = path.extname(to);\n\n switch (extension) {\n case '.json': {\n let targetFile = (await fs.readJson(to)) as Json;\n let fileToMerge = json.parse<Json>(render.content);\n let newFile = JSON.stringify(merge(targetFile, fileToMerge));\n\n await fs.writeFile(to, await prettify(newFile, to), {encoding: 'utf8'});\n\n break;\n }\n\n case '.yaml': {\n let targetFile = yaml.parse(await fs.readFile(to, {encoding: 'utf8'})) as unknown;\n let fileToMerge = yaml.parse(render.content) as unknown;\n let newFile = yaml.stringify(merge(targetFile, fileToMerge));\n\n await fs.writeFile(to, await prettify(newFile, to), {encoding: 'utf8'});\n\n break;\n }\n\n default: {\n throw new Error(`File extension \"${extension}\" is not supported!`);\n }\n }\n}\n"],"names":["fs","json","path","yaml","merge","prettify","mergeFileUsingTemplateRender","render","basePath","to","join","attributes","extension","extname","targetFile","readJson","fileToMerge","parse","content","newFile","JSON","stringify","writeFile","encoding","readFile","Error"],"mappings":"AACA,OAAOA,QAAQ,WAAW;AAC1B,OAAOC,UAAU,QAAQ;AACzB,OAAOC,UAAU,YAAY;AAC7B,OAAOC,UAAU,OAAO;AAExB,SAAQC,KAAK,EAAEC,QAAQ,QAAO,iBAAiB;AAG/C,OAAO,eAAeC,6BAA6BC,MAAsB,EAAEC,QAAgB;IACzF,IAAIC,KAAKP,KAAKQ,KAAKF,UAAUD,OAAOI,WAAWF;IAC/C,IAAIG,YAAYV,KAAKW,QAAQJ;IAE7B,OAAQG;QACN,KAAK;YAAS;gBACZ,IAAIE,aAAc,MAAMd,GAAGe,SAASN;gBACpC,IAAIO,cAAcf,KAAKgB,MAAYV,OAAOW;gBAC1C,IAAIC,UAAUC,KAAKC,UAAUjB,MAAMU,YAAYE;gBAE/C,MAAMhB,GAAGsB,UAAUb,IAAI,MAAMJ,SAASc,SAASV,KAAK;oBAACc,UAAU;gBAAM;gBAErE;YACF;QAEA,KAAK;YAAS;gBACZ,IAAIT,aAAaX,KAAKc,MAAM,MAAMjB,GAAGwB,SAASf,IAAI;oBAACc,UAAU;gBAAM;gBACnE,IAAIP,cAAcb,KAAKc,MAAMV,OAAOW;gBACpC,IAAIC,UAAUhB,KAAKkB,UAAUjB,MAAMU,YAAYE;gBAE/C,MAAMhB,GAAGsB,UAAUb,IAAI,MAAMJ,SAASc,SAASV,KAAK;oBAACc,UAAU;gBAAM;gBAErE;YACF;QAEA;YAAS;gBACP,MAAM,IAAIE,MAAM,CAAC,gBAAgB,EAAEb,UAAU,mBAAmB,CAAC;YACnE;IACF;AACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { prettify } from './internals.js';
|
|
4
|
+
export async function overwriteFileUsingTemplateRender(render, basePath) {
|
|
5
|
+
let to = path.join(basePath, render.attributes.to);
|
|
6
|
+
await fs.ensureDir(path.dirname(to));
|
|
7
|
+
await fs.writeFile(to, await prettify(render.content, to), {
|
|
8
|
+
encoding: 'utf8'
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=overwriteFileUsingTemplateRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/template/overwriteFileUsingTemplateRender.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport path from 'node:path';\n\nimport {prettify} from './internals.js';\nimport {type TemplateRender} from './TemplateRender.js';\n\nexport async function overwriteFileUsingTemplateRender(render: TemplateRender, basePath: string) {\n let to = path.join(basePath, render.attributes.to);\n\n await fs.ensureDir(path.dirname(to));\n await fs.writeFile(to, await prettify(render.content, to), {encoding: 'utf8'});\n}\n"],"names":["fs","path","prettify","overwriteFileUsingTemplateRender","render","basePath","to","join","attributes","ensureDir","dirname","writeFile","content","encoding"],"mappings":"AAAA,OAAOA,QAAQ,WAAW;AAC1B,OAAOC,UAAU,YAAY;AAE7B,SAAQC,QAAQ,QAAO,iBAAiB;AAGxC,OAAO,eAAeC,iCAAiCC,MAAsB,EAAEC,QAAgB;IAC7F,IAAIC,KAAKL,KAAKM,KAAKF,UAAUD,OAAOI,WAAWF;IAE/C,MAAMN,GAAGS,UAAUR,KAAKS,QAAQJ;IAChC,MAAMN,GAAGW,UAAUL,IAAI,MAAMJ,SAASE,OAAOQ,SAASN,KAAK;QAACO,UAAU;IAAM;AAC9E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function parseTemplateId(value: string): [moduleId: string, templateName: string];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/template/parseTemplateId.ts"],"sourcesContent":["export function parseTemplateId(value: string): [moduleId: string, templateName: string] {\n let parts = value.split(':');\n\n if (!parts[0] || !parts[1]) {\n throw new Error('Template id is invalid!');\n }\n\n return [parts[0], parts[1]];\n}\n"],"names":["parseTemplateId","value","parts","split","Error"],"mappings":"AAAA,OAAO,SAASA,gBAAgBC,KAAa;IAC3C,IAAIC,QAAQD,MAAME,MAAM;IAExB,IAAI,CAACD,KAAK,CAAC,EAAE,IAAI,CAACA,KAAK,CAAC,EAAE,EAAE;QAC1B,MAAM,IAAIE,MAAM;IAClB;IAEA,OAAO;QAACF,KAAK,CAAC,EAAE;QAAEA,KAAK,CAAC,EAAE;KAAC;AAC7B"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Template } from '@jakubmazanec/template';
|
|
2
|
+
import { readFile } from '@jakubmazanec/zod-utils';
|
|
3
|
+
import glob from 'fast-glob';
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { carsonTemplateConfigSchema } from './CarsonTemplateConfig.js';
|
|
7
|
+
import { parseTemplateId } from './parseTemplateId.js';
|
|
8
|
+
import { resolveTemplateModule } from './resolveTemplateModule.js';
|
|
9
|
+
import { templateAttributesSchema } from './TemplateAttributes.js';
|
|
10
|
+
import { TEMPLATES_PATH, TEMPLATE_CONFIG_FILENAME } from '../constants.js';
|
|
11
|
+
export async function readCarsonTemplate(templateId) {
|
|
12
|
+
let [moduleId, templateName] = parseTemplateId(templateId);
|
|
13
|
+
let modulePath = await resolveTemplateModule(moduleId);
|
|
14
|
+
let carsonTemplatePath = path.join(modulePath, TEMPLATES_PATH, templateName);
|
|
15
|
+
if (await fs.pathExists(carsonTemplatePath)) {
|
|
16
|
+
let templateConfigPath = path.join(carsonTemplatePath, TEMPLATE_CONFIG_FILENAME);
|
|
17
|
+
let templateConfig = await readFile(templateConfigPath, carsonTemplateConfigSchema, {
|
|
18
|
+
throwOnZodError: true
|
|
19
|
+
});
|
|
20
|
+
let templateFilePaths = await glob('**/*.ejs', {
|
|
21
|
+
cwd: carsonTemplatePath,
|
|
22
|
+
dot: true
|
|
23
|
+
});
|
|
24
|
+
let carsonTemplate = {
|
|
25
|
+
name: templateName,
|
|
26
|
+
config: templateConfig,
|
|
27
|
+
files: []
|
|
28
|
+
};
|
|
29
|
+
for (let templateFilePath of templateFilePaths){
|
|
30
|
+
carsonTemplate.files.push(await Template.read(path.join(carsonTemplatePath, templateFilePath), {
|
|
31
|
+
attributesSchema: templateAttributesSchema
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
return carsonTemplate;
|
|
35
|
+
}
|
|
36
|
+
throw new Error(`Template ${templateId} was not found in module ${moduleId}!`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=readCarsonTemplate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/template/readCarsonTemplate.ts"],"sourcesContent":["import {Template} from '@jakubmazanec/template';\nimport {readFile} from '@jakubmazanec/zod-utils';\nimport glob from 'fast-glob';\nimport fs from 'fs-extra';\nimport path from 'node:path';\n\nimport {type CarsonTemplate} from './CarsonTemplate.js';\nimport {carsonTemplateConfigSchema} from './CarsonTemplateConfig.js';\nimport {parseTemplateId} from './parseTemplateId.js';\nimport {resolveTemplateModule} from './resolveTemplateModule.js';\nimport {templateAttributesSchema} from './TemplateAttributes.js';\nimport {TEMPLATES_PATH, TEMPLATE_CONFIG_FILENAME} from '../constants.js';\n\nexport async function readCarsonTemplate(templateId: string): Promise<CarsonTemplate> {\n let [moduleId, templateName] = parseTemplateId(templateId);\n let modulePath = await resolveTemplateModule(moduleId);\n let carsonTemplatePath = path.join(modulePath, TEMPLATES_PATH, templateName);\n\n if (await fs.pathExists(carsonTemplatePath)) {\n let templateConfigPath = path.join(carsonTemplatePath, TEMPLATE_CONFIG_FILENAME);\n let templateConfig = await readFile(templateConfigPath, carsonTemplateConfigSchema, {\n throwOnZodError: true,\n });\n let templateFilePaths = await glob('**/*.ejs', {\n cwd: carsonTemplatePath,\n dot: true,\n });\n let carsonTemplate: CarsonTemplate = {\n name: templateName,\n config: templateConfig,\n files: [],\n };\n\n for (let templateFilePath of templateFilePaths) {\n carsonTemplate.files.push(\n await Template.read(path.join(carsonTemplatePath, templateFilePath), {\n attributesSchema: templateAttributesSchema,\n }),\n );\n }\n\n return carsonTemplate;\n }\n\n throw new Error(`Template ${templateId} was not found in module ${moduleId}!`);\n}\n"],"names":["Template","readFile","glob","fs","path","carsonTemplateConfigSchema","parseTemplateId","resolveTemplateModule","templateAttributesSchema","TEMPLATES_PATH","TEMPLATE_CONFIG_FILENAME","readCarsonTemplate","templateId","moduleId","templateName","modulePath","carsonTemplatePath","join","pathExists","templateConfigPath","templateConfig","throwOnZodError","templateFilePaths","cwd","dot","carsonTemplate","name","config","files","templateFilePath","push","read","attributesSchema","Error"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,yBAAyB;AAChD,SAAQC,QAAQ,QAAO,0BAA0B;AACjD,OAAOC,UAAU,YAAY;AAC7B,OAAOC,QAAQ,WAAW;AAC1B,OAAOC,UAAU,YAAY;AAG7B,SAAQC,0BAA0B,QAAO,4BAA4B;AACrE,SAAQC,eAAe,QAAO,uBAAuB;AACrD,SAAQC,qBAAqB,QAAO,6BAA6B;AACjE,SAAQC,wBAAwB,QAAO,0BAA0B;AACjE,SAAQC,cAAc,EAAEC,wBAAwB,QAAO,kBAAkB;AAEzE,OAAO,eAAeC,mBAAmBC,UAAkB;IACzD,IAAI,CAACC,UAAUC,aAAa,GAAGR,gBAAgBM;IAC/C,IAAIG,aAAa,MAAMR,sBAAsBM;IAC7C,IAAIG,qBAAqBZ,KAAKa,KAAKF,YAAYN,gBAAgBK;IAE/D,IAAI,MAAMX,GAAGe,WAAWF,qBAAqB;QAC3C,IAAIG,qBAAqBf,KAAKa,KAAKD,oBAAoBN;QACvD,IAAIU,iBAAiB,MAAMnB,SAASkB,oBAAoBd,4BAA4B;YAClFgB,iBAAiB;QACnB;QACA,IAAIC,oBAAoB,MAAMpB,KAAK,YAAY;YAC7CqB,KAAKP;YACLQ,KAAK;QACP;QACA,IAAIC,iBAAiC;YACnCC,MAAMZ;YACNa,QAAQP;YACRQ,OAAO,EAAE;QACX;QAEA,KAAK,IAAIC,oBAAoBP,kBAAmB;YAC9CG,eAAeG,MAAME,KACnB,MAAM9B,SAAS+B,KAAK3B,KAAKa,KAAKD,oBAAoBa,mBAAmB;gBACnEG,kBAAkBxB;YACpB;QAEJ;QAEA,OAAOiB;IACT;IAEA,MAAM,IAAIQ,MAAM,CAAC,SAAS,EAAErB,WAAW,yBAAyB,EAAEC,SAAS,CAAC,CAAC;AAC/E"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type TemplateData } from './TemplateData.js';
|
|
2
|
+
import { type TemplateRenders } from './TemplateRenders.js';
|
|
3
|
+
export type RenderTemplateOptions = {
|
|
4
|
+
templateId: string;
|
|
5
|
+
templateData: TemplateData;
|
|
6
|
+
};
|
|
7
|
+
export declare function renderTemplate(options: RenderTemplateOptions): Promise<TemplateRenders>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { importCarsonTemplate } from './importCarsonTemplate.js';
|
|
2
|
+
import { readCarsonTemplate } from './readCarsonTemplate.js';
|
|
3
|
+
export async function renderTemplate(options) {
|
|
4
|
+
let template = await readCarsonTemplate(options.templateId);
|
|
5
|
+
let templateModule = await importCarsonTemplate(options.templateId);
|
|
6
|
+
let templateRenders = [];
|
|
7
|
+
for (let file of template.files){
|
|
8
|
+
templateRenders.push(...await file.render({
|
|
9
|
+
...templateModule,
|
|
10
|
+
...options.templateData,
|
|
11
|
+
templateConfig: template.config
|
|
12
|
+
}, {
|
|
13
|
+
disablePrettier: true
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
16
|
+
return templateRenders;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=renderTemplate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/template/renderTemplate.ts"],"sourcesContent":["import {importCarsonTemplate} from './importCarsonTemplate.js';\nimport {readCarsonTemplate} from './readCarsonTemplate.js';\nimport {type TemplateData} from './TemplateData.js';\nimport {type TemplateRenders} from './TemplateRenders.js';\n\nexport type RenderTemplateOptions = {\n templateId: string;\n templateData: TemplateData;\n};\n\nexport async function renderTemplate(options: RenderTemplateOptions) {\n let template = await readCarsonTemplate(options.templateId);\n let templateModule = await importCarsonTemplate(options.templateId);\n let templateRenders: TemplateRenders = [];\n\n for (let file of template.files) {\n templateRenders.push(\n ...(await file.render(\n {\n ...templateModule,\n ...options.templateData,\n templateConfig: template.config,\n },\n {disablePrettier: true},\n )),\n );\n }\n\n return templateRenders;\n}\n"],"names":["importCarsonTemplate","readCarsonTemplate","renderTemplate","options","template","templateId","templateModule","templateRenders","file","files","push","render","templateData","templateConfig","config","disablePrettier"],"mappings":"AAAA,SAAQA,oBAAoB,QAAO,4BAA4B;AAC/D,SAAQC,kBAAkB,QAAO,0BAA0B;AAS3D,OAAO,eAAeC,eAAeC,OAA8B;IACjE,IAAIC,WAAW,MAAMH,mBAAmBE,QAAQE;IAChD,IAAIC,iBAAiB,MAAMN,qBAAqBG,QAAQE;IACxD,IAAIE,kBAAmC,EAAE;IAEzC,KAAK,IAAIC,QAAQJ,SAASK,MAAO;QAC/BF,gBAAgBG,QACV,MAAMF,KAAKG,OACb;YACE,GAAGL,cAAc;YACjB,GAAGH,QAAQS,YAAY;YACvBC,gBAAgBT,SAASU;QAC3B,GACA;YAACC,iBAAiB;QAAI;IAG5B;IAEA,OAAOR;AACT"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function resolveTemplateModule(moduleId: string): Promise<string>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export async function resolveTemplateModule(moduleId) {
|
|
4
|
+
let require = createRequire(import.meta.url);
|
|
5
|
+
let modulePath = path.dirname(require.resolve(`${moduleId}/package.json`));
|
|
6
|
+
return modulePath;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=resolveTemplateModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/template/resolveTemplateModule.ts"],"sourcesContent":["import {createRequire} from 'node:module';\nimport path from 'node:path';\n\nexport async function resolveTemplateModule(moduleId: string) {\n let require = createRequire(import.meta.url);\n let modulePath = path.dirname(require.resolve(`${moduleId}/package.json`));\n\n return modulePath;\n}\n"],"names":["createRequire","path","resolveTemplateModule","moduleId","require","url","modulePath","dirname","resolve"],"mappings":"AAAA,SAAQA,aAAa,QAAO,cAAc;AAC1C,OAAOC,UAAU,YAAY;AAE7B,OAAO,eAAeC,sBAAsBC,QAAgB;IAC1D,IAAIC,UAAUJ,cAAc,YAAYK;IACxC,IAAIC,aAAaL,KAAKM,QAAQH,QAAQI,QAAQ,CAAC,EAAEL,SAAS,aAAa,CAAC;IAExE,OAAOG;AACT"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { deflateSync, strToU8 } from 'fflate';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
export async function saveTemplateRenderSnapshots(templateRenders, templateRenderSnapshotsPath) {
|
|
4
|
+
let templateRendersSnapshots = [];
|
|
5
|
+
for (let templateRender of templateRenders){
|
|
6
|
+
if (templateRender.attributes.strategy === 'overwrite' || templateRender.attributes.strategy === 'merge' || templateRender.attributes.strategy[0] === 'insert') {
|
|
7
|
+
templateRendersSnapshots.push({
|
|
8
|
+
attributes: {
|
|
9
|
+
to: templateRender.attributes.to,
|
|
10
|
+
strategy: templateRender.attributes.strategy
|
|
11
|
+
},
|
|
12
|
+
content: templateRender.content
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
let uncompressedSnapshots = JSON.stringify(templateRendersSnapshots);
|
|
17
|
+
await fs.writeFile(templateRenderSnapshotsPath, deflateSync(strToU8(uncompressedSnapshots), {
|
|
18
|
+
level: 1,
|
|
19
|
+
mem: 0
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=saveTemplateRenderSnapshots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/template/saveTemplateRenderSnapshots.ts"],"sourcesContent":["import {deflateSync, strToU8} from 'fflate';\nimport fs from 'fs-extra';\n\nimport {type TemplateRenders} from './TemplateRenders.js';\nimport {type TemplateRenderSnapshots} from './TemplateRenderSnapshots.js';\n\nexport async function saveTemplateRenderSnapshots(\n templateRenders: TemplateRenders,\n templateRenderSnapshotsPath: string,\n) {\n let templateRendersSnapshots: TemplateRenderSnapshots = [];\n\n for (let templateRender of templateRenders) {\n if (\n templateRender.attributes.strategy === 'overwrite' ||\n templateRender.attributes.strategy === 'merge' ||\n templateRender.attributes.strategy[0] === 'insert'\n ) {\n templateRendersSnapshots.push({\n attributes: {\n to: templateRender.attributes.to,\n strategy: templateRender.attributes.strategy,\n },\n content: templateRender.content,\n });\n }\n }\n let uncompressedSnapshots = JSON.stringify(templateRendersSnapshots);\n\n await fs.writeFile(\n templateRenderSnapshotsPath,\n deflateSync(strToU8(uncompressedSnapshots), {level: 1, mem: 0}),\n );\n}\n"],"names":["deflateSync","strToU8","fs","saveTemplateRenderSnapshots","templateRenders","templateRenderSnapshotsPath","templateRendersSnapshots","templateRender","attributes","strategy","push","to","content","uncompressedSnapshots","JSON","stringify","writeFile","level","mem"],"mappings":"AAAA,SAAQA,WAAW,EAAEC,OAAO,QAAO,SAAS;AAC5C,OAAOC,QAAQ,WAAW;AAK1B,OAAO,eAAeC,4BACpBC,eAAgC,EAChCC,2BAAmC;IAEnC,IAAIC,2BAAoD,EAAE;IAE1D,KAAK,IAAIC,kBAAkBH,gBAAiB;QAC1C,IACEG,eAAeC,WAAWC,aAAa,eACvCF,eAAeC,WAAWC,aAAa,WACvCF,eAAeC,WAAWC,QAAQ,CAAC,EAAE,KAAK,UAC1C;YACAH,yBAAyBI,KAAK;gBAC5BF,YAAY;oBACVG,IAAIJ,eAAeC,WAAWG;oBAC9BF,UAAUF,eAAeC,WAAWC;gBACtC;gBACAG,SAASL,eAAeK;YAC1B;QACF;IACF;IACA,IAAIC,wBAAwBC,KAAKC,UAAUT;IAE3C,MAAMJ,GAAGc,UACPX,6BACAL,YAAYC,QAAQY,wBAAwB;QAACI,OAAO;QAAGC,KAAK;IAAC;AAEjE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { prettify } from './internals.js';
|
|
5
|
+
export async function uninsertUsingTemplateRender(render, basePath) {
|
|
6
|
+
let to = path.join(basePath, render.attributes.to);
|
|
7
|
+
let extension = path.extname(to);
|
|
8
|
+
switch(extension){
|
|
9
|
+
case '.md':
|
|
10
|
+
{
|
|
11
|
+
let targetFile = await fs.readFile(to, {
|
|
12
|
+
encoding: 'utf8'
|
|
13
|
+
});
|
|
14
|
+
let newContent = `<!-- ${render.attributes.strategy[1]} --><!-- ${render.attributes.strategy[1]} -->`;
|
|
15
|
+
let oldContentRegexp = new RegExp(`<!--\\s*${_.escapeRegExp(render.attributes.strategy[1])}\\s-->[\\s\\S]*<!--\\s*${_.escapeRegExp(render.attributes.strategy[1])}\\s-->`, 'u');
|
|
16
|
+
let newFile = targetFile.replace(oldContentRegexp, newContent);
|
|
17
|
+
await fs.writeFile(to, await prettify(newFile, to), {
|
|
18
|
+
encoding: 'utf8'
|
|
19
|
+
});
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
default:
|
|
23
|
+
{
|
|
24
|
+
throw new Error(`File extension "${extension}" is not supported!`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=uninsertUsingTemplateRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/template/uninsertUsingTemplateRender.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport _ from 'lodash';\nimport path from 'node:path';\n\nimport {prettify} from './internals.js';\nimport {type TemplateRenderSnapshot} from './TemplateRenderSnapshot.js';\n\nexport async function uninsertUsingTemplateRender(\n render: TemplateRenderSnapshot,\n basePath: string,\n) {\n let to = path.join(basePath, render.attributes.to);\n let extension = path.extname(to);\n\n switch (extension) {\n case '.md': {\n let targetFile = await fs.readFile(to, {encoding: 'utf8'});\n let newContent = `<!-- ${render.attributes.strategy[1]} --><!-- ${render.attributes.strategy[1]} -->`;\n let oldContentRegexp = new RegExp(\n `<!--\\\\s*${_.escapeRegExp(\n render.attributes.strategy[1],\n )}\\\\s-->[\\\\s\\\\S]*<!--\\\\s*${_.escapeRegExp(render.attributes.strategy[1])}\\\\s-->`,\n 'u',\n );\n let newFile = targetFile.replace(oldContentRegexp, newContent);\n\n await fs.writeFile(to, await prettify(newFile, to), {encoding: 'utf8'});\n\n break;\n }\n\n default: {\n throw new Error(`File extension \"${extension}\" is not supported!`);\n }\n }\n}\n"],"names":["fs","_","path","prettify","uninsertUsingTemplateRender","render","basePath","to","join","attributes","extension","extname","targetFile","readFile","encoding","newContent","strategy","oldContentRegexp","RegExp","escapeRegExp","newFile","replace","writeFile","Error"],"mappings":"AAAA,OAAOA,QAAQ,WAAW;AAC1B,OAAOC,OAAO,SAAS;AACvB,OAAOC,UAAU,YAAY;AAE7B,SAAQC,QAAQ,QAAO,iBAAiB;AAGxC,OAAO,eAAeC,4BACpBC,MAA8B,EAC9BC,QAAgB;IAEhB,IAAIC,KAAKL,KAAKM,KAAKF,UAAUD,OAAOI,WAAWF;IAC/C,IAAIG,YAAYR,KAAKS,QAAQJ;IAE7B,OAAQG;QACN,KAAK;YAAO;gBACV,IAAIE,aAAa,MAAMZ,GAAGa,SAASN,IAAI;oBAACO,UAAU;gBAAM;gBACxD,IAAIC,aAAa,CAAC,KAAK,EAAEV,OAAOI,WAAWO,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAEX,OAAOI,WAAWO,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC;gBACrG,IAAIC,mBAAmB,IAAIC,OACzB,CAAC,QAAQ,EAAEjB,EAAEkB,aACXd,OAAOI,WAAWO,QAAQ,CAAC,EAAE,EAC7B,uBAAuB,EAAEf,EAAEkB,aAAad,OAAOI,WAAWO,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,EAChF;gBAEF,IAAII,UAAUR,WAAWS,QAAQJ,kBAAkBF;gBAEnD,MAAMf,GAAGsB,UAAUf,IAAI,MAAMJ,SAASiB,SAASb,KAAK;oBAACO,UAAU;gBAAM;gBAErE;YACF;QAEA;YAAS;gBACP,MAAM,IAAIS,MAAM,CAAC,gBAAgB,EAAEb,UAAU,mBAAmB,CAAC;YACnE;IACF;AACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import json from 'json5';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import yaml from 'yaml';
|
|
5
|
+
import { unmerge, prettify } from './internals.js';
|
|
6
|
+
export async function unmergeFileUsingTemplateRender(render, outputPath) {
|
|
7
|
+
let to = path.join(outputPath, render.attributes.to);
|
|
8
|
+
let extension = path.extname(to);
|
|
9
|
+
switch(extension){
|
|
10
|
+
case '.json':
|
|
11
|
+
{
|
|
12
|
+
let targetFile = await fs.readJson(to);
|
|
13
|
+
let fileToMerge = json.parse(render.content);
|
|
14
|
+
let newFile = JSON.stringify(unmerge(targetFile, fileToMerge));
|
|
15
|
+
await fs.writeFile(to, await prettify(newFile, to), {
|
|
16
|
+
encoding: 'utf8'
|
|
17
|
+
});
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
case '.yaml':
|
|
21
|
+
{
|
|
22
|
+
let targetFile = yaml.parse(await fs.readFile(to, {
|
|
23
|
+
encoding: 'utf8'
|
|
24
|
+
}));
|
|
25
|
+
let fileToMerge = yaml.parse(render.content);
|
|
26
|
+
let newFile = yaml.stringify(unmerge(targetFile, fileToMerge));
|
|
27
|
+
await fs.writeFile(to, await prettify(newFile, to), {
|
|
28
|
+
encoding: 'utf8'
|
|
29
|
+
});
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
default:
|
|
33
|
+
{
|
|
34
|
+
throw new Error(`File extension "${extension}" is not supported!`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=unmergeFileUsingTemplateRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/template/unmergeFileUsingTemplateRender.ts"],"sourcesContent":["import {type Json} from '@jakubmazanec/zod-utils';\nimport fs from 'fs-extra';\nimport json from 'json5';\nimport path from 'node:path';\nimport yaml from 'yaml';\n\nimport {unmerge, prettify} from './internals.js';\nimport {type TemplateRenderSnapshot} from './TemplateRenderSnapshot.js';\n\nexport async function unmergeFileUsingTemplateRender(\n render: TemplateRenderSnapshot,\n outputPath: string,\n) {\n let to = path.join(outputPath, render.attributes.to);\n let extension = path.extname(to);\n\n switch (extension) {\n case '.json': {\n let targetFile = (await fs.readJson(to)) as Json;\n let fileToMerge = json.parse<Json>(render.content);\n let newFile = JSON.stringify(unmerge(targetFile, fileToMerge));\n\n await fs.writeFile(to, await prettify(newFile, to), {encoding: 'utf8'});\n\n break;\n }\n\n case '.yaml': {\n let targetFile = yaml.parse(await fs.readFile(to, {encoding: 'utf8'})) as unknown;\n let fileToMerge = yaml.parse(render.content) as unknown;\n let newFile = yaml.stringify(unmerge(targetFile, fileToMerge));\n\n await fs.writeFile(to, await prettify(newFile, to), {encoding: 'utf8'});\n\n break;\n }\n\n default: {\n throw new Error(`File extension \"${extension}\" is not supported!`);\n }\n }\n}\n"],"names":["fs","json","path","yaml","unmerge","prettify","unmergeFileUsingTemplateRender","render","outputPath","to","join","attributes","extension","extname","targetFile","readJson","fileToMerge","parse","content","newFile","JSON","stringify","writeFile","encoding","readFile","Error"],"mappings":"AACA,OAAOA,QAAQ,WAAW;AAC1B,OAAOC,UAAU,QAAQ;AACzB,OAAOC,UAAU,YAAY;AAC7B,OAAOC,UAAU,OAAO;AAExB,SAAQC,OAAO,EAAEC,QAAQ,QAAO,iBAAiB;AAGjD,OAAO,eAAeC,+BACpBC,MAA8B,EAC9BC,UAAkB;IAElB,IAAIC,KAAKP,KAAKQ,KAAKF,YAAYD,OAAOI,WAAWF;IACjD,IAAIG,YAAYV,KAAKW,QAAQJ;IAE7B,OAAQG;QACN,KAAK;YAAS;gBACZ,IAAIE,aAAc,MAAMd,GAAGe,SAASN;gBACpC,IAAIO,cAAcf,KAAKgB,MAAYV,OAAOW;gBAC1C,IAAIC,UAAUC,KAAKC,UAAUjB,QAAQU,YAAYE;gBAEjD,MAAMhB,GAAGsB,UAAUb,IAAI,MAAMJ,SAASc,SAASV,KAAK;oBAACc,UAAU;gBAAM;gBAErE;YACF;QAEA,KAAK;YAAS;gBACZ,IAAIT,aAAaX,KAAKc,MAAM,MAAMjB,GAAGwB,SAASf,IAAI;oBAACc,UAAU;gBAAM;gBACnE,IAAIP,cAAcb,KAAKc,MAAMV,OAAOW;gBACpC,IAAIC,UAAUhB,KAAKkB,UAAUjB,QAAQU,YAAYE;gBAEjD,MAAMhB,GAAGsB,UAAUb,IAAI,MAAMJ,SAASc,SAASV,KAAK;oBAACc,UAAU;gBAAM;gBAErE;YACF;QAEA;YAAS;gBACP,MAAM,IAAIE,MAAM,CAAC,gBAAgB,EAAEb,UAAU,mBAAmB,CAAC;YACnE;IACF;AACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export * from './template/applyTemplateRenders.js';
|
|
2
|
+
export * from './template/CarsonTemplate.js';
|
|
3
|
+
export * from './template/CarsonTemplateConfig.js';
|
|
4
|
+
export * from './template/createFileUsingTemplateRender.js';
|
|
5
|
+
export * from './template/deleteFileUsingTemplateRender.js';
|
|
6
|
+
export * from './template/loadTemplateRenderSnapshots.js';
|
|
7
|
+
export * from './template/mergeFileUsingTemplateRender.js';
|
|
8
|
+
export * from './template/overwriteFileUsingTemplateRender.js';
|
|
9
|
+
export * from './template/parseTemplateId.js';
|
|
10
|
+
export * from './template/readCarsonTemplate.js';
|
|
11
|
+
export * from './template/renderTemplate.js';
|
|
12
|
+
export * from './template/resolveTemplateModule.js';
|
|
13
|
+
export * from './template/saveTemplateRenderSnapshots.js';
|
|
14
|
+
export * from './template/TemplateAttributes.js';
|
|
15
|
+
export * from './template/TemplateData.js';
|
|
16
|
+
export * from './template/TemplateRender.js';
|
|
17
|
+
export * from './template/TemplateRenders.js';
|
|
18
|
+
export * from './template/TemplateRenderSnapshot.js';
|
|
19
|
+
export * from './template/TemplateRenderSnapshots.js';
|
|
20
|
+
export * from './template/unmergeFileUsingTemplateRender.js';
|
package/dist/template.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export * from './template/applyTemplateRenders.js';
|
|
2
|
+
export * from './template/CarsonTemplate.js';
|
|
3
|
+
export * from './template/CarsonTemplateConfig.js';
|
|
4
|
+
export * from './template/createFileUsingTemplateRender.js';
|
|
5
|
+
export * from './template/deleteFileUsingTemplateRender.js';
|
|
6
|
+
export * from './template/loadTemplateRenderSnapshots.js';
|
|
7
|
+
export * from './template/mergeFileUsingTemplateRender.js';
|
|
8
|
+
export * from './template/overwriteFileUsingTemplateRender.js';
|
|
9
|
+
export * from './template/parseTemplateId.js';
|
|
10
|
+
export * from './template/readCarsonTemplate.js';
|
|
11
|
+
export * from './template/renderTemplate.js';
|
|
12
|
+
export * from './template/resolveTemplateModule.js';
|
|
13
|
+
export * from './template/saveTemplateRenderSnapshots.js';
|
|
14
|
+
export * from './template/TemplateAttributes.js';
|
|
15
|
+
export * from './template/TemplateData.js';
|
|
16
|
+
export * from './template/TemplateRender.js';
|
|
17
|
+
export * from './template/TemplateRenders.js';
|
|
18
|
+
export * from './template/TemplateRenderSnapshot.js';
|
|
19
|
+
export * from './template/TemplateRenderSnapshots.js';
|
|
20
|
+
export * from './template/unmergeFileUsingTemplateRender.js';
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/template.ts"],"sourcesContent":["export * from './template/applyTemplateRenders.js';\nexport * from './template/CarsonTemplate.js';\nexport * from './template/CarsonTemplateConfig.js';\nexport * from './template/createFileUsingTemplateRender.js';\nexport * from './template/deleteFileUsingTemplateRender.js';\nexport * from './template/loadTemplateRenderSnapshots.js';\nexport * from './template/mergeFileUsingTemplateRender.js';\nexport * from './template/overwriteFileUsingTemplateRender.js';\nexport * from './template/parseTemplateId.js';\nexport * from './template/readCarsonTemplate.js';\nexport * from './template/renderTemplate.js';\nexport * from './template/resolveTemplateModule.js';\nexport * from './template/saveTemplateRenderSnapshots.js';\nexport * from './template/TemplateAttributes.js';\nexport * from './template/TemplateData.js';\nexport * from './template/TemplateRender.js';\nexport * from './template/TemplateRenders.js';\nexport * from './template/TemplateRenderSnapshot.js';\nexport * from './template/TemplateRenderSnapshots.js';\nexport * from './template/unmergeFileUsingTemplateRender.js';\n"],"names":[],"mappings":"AAAA,cAAc,qCAAqC;AACnD,cAAc,+BAA+B;AAC7C,cAAc,qCAAqC;AACnD,cAAc,8CAA8C;AAC5D,cAAc,8CAA8C;AAC5D,cAAc,4CAA4C;AAC1D,cAAc,6CAA6C;AAC3D,cAAc,iDAAiD;AAC/D,cAAc,gCAAgC;AAC9C,cAAc,mCAAmC;AACjD,cAAc,+BAA+B;AAC7C,cAAc,sCAAsC;AACpD,cAAc,4CAA4C;AAC1D,cAAc,mCAAmC;AACjD,cAAc,6BAA6B;AAC3C,cAAc,+BAA+B;AAC7C,cAAc,gCAAgC;AAC9C,cAAc,uCAAuC;AACrD,cAAc,wCAAwC;AACtD,cAAc,+CAA+C"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type PackageJson } from '@jakubmazanec/zod-utils';
|
|
2
|
+
import { type ProjectConfig } from './ProjectConfig.js';
|
|
3
|
+
import { type ProjectCreateOptions } from './ProjectCreateOptions.js';
|
|
4
|
+
import { ProjectError } from './ProjectError.js';
|
|
5
|
+
import { type ProjectOptions } from './ProjectOptions.js';
|
|
6
|
+
import { type ProjectUpdateOptions } from './ProjectUpdateOptions.js';
|
|
7
|
+
import { type Workspace } from './Workspace.js';
|
|
8
|
+
/**
|
|
9
|
+
* Project represent a self-contained piece of software (e.g. a package, or an app) that is part of a {@linkcode Workspace}. Currently only Node.js projects are supported.
|
|
10
|
+
*
|
|
11
|
+
* @typeParam M If true, the project belongs to a multi-project workspace.
|
|
12
|
+
*/
|
|
13
|
+
export declare class Project<M extends boolean = true> {
|
|
14
|
+
/** Project name. */
|
|
15
|
+
name?: string;
|
|
16
|
+
/** Project path. */
|
|
17
|
+
path: string;
|
|
18
|
+
/** Project path relative to workspace path. */
|
|
19
|
+
relativePath: string;
|
|
20
|
+
/** Project configuration; if it's not found, the default is an empty object. */
|
|
21
|
+
config: ProjectConfig;
|
|
22
|
+
/** Parsed project `package.json` file; if it's not found, the default is an empty object. */
|
|
23
|
+
packageJson: PackageJson;
|
|
24
|
+
/** Parent {@linkcode Workspace} instance. */
|
|
25
|
+
workspace: Workspace<M>;
|
|
26
|
+
/** Errors found during reading from the file system. */
|
|
27
|
+
errors: Array<InstanceType<typeof ProjectError>>;
|
|
28
|
+
constructor({ path: projectPath, name, config, packageJson, workspace, errors, }: ProjectOptions<M>);
|
|
29
|
+
static create<M extends boolean>({ templateId, workspace, projectPath, projectName, args, }: ProjectCreateOptions<M>): Promise<Project<M>>;
|
|
30
|
+
static read<M extends boolean>(projectPath: string, workspace: Workspace<M>): Promise<Project<M>>;
|
|
31
|
+
read(): Promise<this>;
|
|
32
|
+
update({ args }: ProjectUpdateOptions): Promise<this>;
|
|
33
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { ensureEmptyDirectory, pathToPosixPath } from '@jakubmazanec/fs-utils';
|
|
2
|
+
import { readFile, packageJsonSchema } from '@jakubmazanec/zod-utils';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import json5 from 'json5';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { projectConfigSchema } from './ProjectConfig.js';
|
|
8
|
+
import { ProjectError } from './ProjectError.js';
|
|
9
|
+
import { saveProjectConfig } from './saveProjectConfig.js';
|
|
10
|
+
import { CARSON_CONFIG_DIRECTORY, PROJECT_CONFIG_FILENAME } from '../constants.js';
|
|
11
|
+
import { applyTemplateRenders } from '../template/applyTemplateRenders.js';
|
|
12
|
+
import { renderTemplate } from '../template/renderTemplate.js';
|
|
13
|
+
/**
|
|
14
|
+
* Project represent a self-contained piece of software (e.g. a package, or an app) that is part of a {@linkcode Workspace}. Currently only Node.js projects are supported.
|
|
15
|
+
*
|
|
16
|
+
* @typeParam M If true, the project belongs to a multi-project workspace.
|
|
17
|
+
*/ export class Project {
|
|
18
|
+
/** Project name. */ name;
|
|
19
|
+
/** Project path. */ path;
|
|
20
|
+
/** Project path relative to workspace path. */ relativePath;
|
|
21
|
+
/** Project configuration; if it's not found, the default is an empty object. */ config;
|
|
22
|
+
/** Parsed project `package.json` file; if it's not found, the default is an empty object. */ packageJson;
|
|
23
|
+
/** Parent {@linkcode Workspace} instance. */ workspace;
|
|
24
|
+
/** Errors found during reading from the file system. */ errors = [];
|
|
25
|
+
constructor({ path: projectPath , name , config , packageJson , workspace , errors }){
|
|
26
|
+
var _this_packageJson_name;
|
|
27
|
+
// TODO: check that this path and workspace path are correct, i.e. project path must always be inside of workspace path
|
|
28
|
+
this.path = projectPath;
|
|
29
|
+
if (name) {
|
|
30
|
+
this.name = name;
|
|
31
|
+
}
|
|
32
|
+
if (config) {
|
|
33
|
+
this.config = config;
|
|
34
|
+
} else {
|
|
35
|
+
this.config = {};
|
|
36
|
+
}
|
|
37
|
+
if (packageJson) {
|
|
38
|
+
this.packageJson = packageJson;
|
|
39
|
+
} else {
|
|
40
|
+
this.packageJson = {};
|
|
41
|
+
}
|
|
42
|
+
this.workspace = workspace;
|
|
43
|
+
if (errors) {
|
|
44
|
+
this.errors = errors;
|
|
45
|
+
}
|
|
46
|
+
if ((_this_packageJson_name = this.packageJson.name) === null || _this_packageJson_name === void 0 ? void 0 : _this_packageJson_name.length) {
|
|
47
|
+
this.name = this.packageJson.name;
|
|
48
|
+
}
|
|
49
|
+
this.relativePath = pathToPosixPath(path.relative(this.workspace.path, this.path));
|
|
50
|
+
}
|
|
51
|
+
static async create({ templateId , workspace , projectPath , projectName , args }) {
|
|
52
|
+
let project = new this({
|
|
53
|
+
path: projectPath,
|
|
54
|
+
name: projectName,
|
|
55
|
+
config: {
|
|
56
|
+
template: templateId
|
|
57
|
+
},
|
|
58
|
+
workspace
|
|
59
|
+
});
|
|
60
|
+
await ensureEmptyDirectory(project.path);
|
|
61
|
+
await saveProjectConfig({
|
|
62
|
+
projectPath: project.path,
|
|
63
|
+
projectConfig: {
|
|
64
|
+
template: templateId
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
let templateRenders = await renderTemplate({
|
|
68
|
+
templateId,
|
|
69
|
+
templateData: {
|
|
70
|
+
workspace,
|
|
71
|
+
project,
|
|
72
|
+
args
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
await applyTemplateRenders({
|
|
76
|
+
templateRenders,
|
|
77
|
+
path: project.path,
|
|
78
|
+
ignoreCreateStrategies: false,
|
|
79
|
+
ignoreCheckStrategies: true
|
|
80
|
+
});
|
|
81
|
+
await project.read();
|
|
82
|
+
return project;
|
|
83
|
+
}
|
|
84
|
+
static async read(projectPath, workspace) {
|
|
85
|
+
let project = new this({
|
|
86
|
+
path: projectPath,
|
|
87
|
+
workspace
|
|
88
|
+
});
|
|
89
|
+
await project.read();
|
|
90
|
+
return project;
|
|
91
|
+
}
|
|
92
|
+
async read() {
|
|
93
|
+
var _packageJson_name;
|
|
94
|
+
if (!await fs.pathExists(this.path)) {
|
|
95
|
+
throw new ProjectError('NO_SUCH_PROJECT_PATH', {
|
|
96
|
+
messageParameters: [
|
|
97
|
+
this.path
|
|
98
|
+
],
|
|
99
|
+
data: {
|
|
100
|
+
path: this.path
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
let errors = [];
|
|
105
|
+
// load project config
|
|
106
|
+
let projectConfigPath = path.join(this.path, CARSON_CONFIG_DIRECTORY, PROJECT_CONFIG_FILENAME);
|
|
107
|
+
let doesProjectConfigExist = await fs.pathExists(projectConfigPath);
|
|
108
|
+
let projectConfig;
|
|
109
|
+
if (doesProjectConfigExist) {
|
|
110
|
+
projectConfig = await readFile(projectConfigPath, projectConfigSchema, {
|
|
111
|
+
parser: (rawString)=>json5.parse(rawString)
|
|
112
|
+
});
|
|
113
|
+
} else {
|
|
114
|
+
projectConfig = {};
|
|
115
|
+
}
|
|
116
|
+
if (projectConfig instanceof z.ZodError) {
|
|
117
|
+
let zodError = projectConfig;
|
|
118
|
+
errors.push(new ProjectError('INVALID_PROJECT_CONFIG', {
|
|
119
|
+
messageParameters: [
|
|
120
|
+
projectConfigPath
|
|
121
|
+
],
|
|
122
|
+
data: {
|
|
123
|
+
path: projectConfigPath,
|
|
124
|
+
zodIssues: zodError.issues
|
|
125
|
+
}
|
|
126
|
+
}));
|
|
127
|
+
projectConfig = {};
|
|
128
|
+
}
|
|
129
|
+
// load package.json
|
|
130
|
+
let packageJsonPath = path.join(this.path, 'package.json');
|
|
131
|
+
let doesPackageJsonExist = await fs.pathExists(packageJsonPath);
|
|
132
|
+
let packageJson;
|
|
133
|
+
if (doesPackageJsonExist) {
|
|
134
|
+
packageJson = await readFile(packageJsonPath, packageJsonSchema, {
|
|
135
|
+
parser: (rawString)=>json5.parse(rawString)
|
|
136
|
+
});
|
|
137
|
+
} else {
|
|
138
|
+
packageJson = {};
|
|
139
|
+
}
|
|
140
|
+
if (packageJson instanceof z.ZodError) {
|
|
141
|
+
let zodError = packageJson;
|
|
142
|
+
errors.push(new ProjectError('INVALID_PACKAGE_JSON', {
|
|
143
|
+
messageParameters: [
|
|
144
|
+
packageJsonPath
|
|
145
|
+
],
|
|
146
|
+
data: {
|
|
147
|
+
path: packageJsonPath,
|
|
148
|
+
zodIssues: zodError.issues
|
|
149
|
+
}
|
|
150
|
+
}));
|
|
151
|
+
packageJson = {};
|
|
152
|
+
}
|
|
153
|
+
if ((_packageJson_name = packageJson.name) === null || _packageJson_name === void 0 ? void 0 : _packageJson_name.length) {
|
|
154
|
+
this.name = packageJson.name;
|
|
155
|
+
}
|
|
156
|
+
this.config = projectConfig;
|
|
157
|
+
this.packageJson = packageJson;
|
|
158
|
+
this.errors = errors;
|
|
159
|
+
return this;
|
|
160
|
+
}
|
|
161
|
+
async update({ args }) {
|
|
162
|
+
if (!this.config.template) {
|
|
163
|
+
throw new Error('Template ID is missing in the project config!');
|
|
164
|
+
}
|
|
165
|
+
let templateRenders = await renderTemplate({
|
|
166
|
+
templateId: this.config.template,
|
|
167
|
+
templateData: {
|
|
168
|
+
workspace: this.workspace,
|
|
169
|
+
project: this,
|
|
170
|
+
args
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
await applyTemplateRenders({
|
|
174
|
+
templateRenders,
|
|
175
|
+
path: this.path,
|
|
176
|
+
ignoreCreateStrategies: true,
|
|
177
|
+
ignoreCheckStrategies: false
|
|
178
|
+
});
|
|
179
|
+
await this.read();
|
|
180
|
+
return this;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
//# sourceMappingURL=Project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/workspace/Project.ts"],"sourcesContent":["import {ensureEmptyDirectory, pathToPosixPath} from '@jakubmazanec/fs-utils';\nimport {readFile, packageJsonSchema, type PackageJson} from '@jakubmazanec/zod-utils';\nimport fs from 'fs-extra';\nimport json5 from 'json5';\nimport path from 'node:path';\nimport {z} from 'zod';\n\nimport {type ProjectConfig, projectConfigSchema} from './ProjectConfig.js';\nimport {type ProjectCreateOptions} from './ProjectCreateOptions.js';\nimport {ProjectError} from './ProjectError.js';\nimport {type ProjectOptions} from './ProjectOptions.js';\nimport {type ProjectUpdateOptions} from './ProjectUpdateOptions.js';\nimport {saveProjectConfig} from './saveProjectConfig.js';\nimport {type Workspace} from './Workspace.js';\nimport {CARSON_CONFIG_DIRECTORY, PROJECT_CONFIG_FILENAME} from '../constants.js';\nimport {applyTemplateRenders} from '../template/applyTemplateRenders.js';\nimport {renderTemplate} from '../template/renderTemplate.js';\n\n/**\n * Project represent a self-contained piece of software (e.g. a package, or an app) that is part of a {@linkcode Workspace}. Currently only Node.js projects are supported.\n *\n * @typeParam M If true, the project belongs to a multi-project workspace.\n */\nexport class Project<M extends boolean = true> {\n /** Project name. */\n name?: string;\n\n /** Project path. */\n path: string;\n\n /** Project path relative to workspace path. */\n relativePath: string;\n\n /** Project configuration; if it's not found, the default is an empty object. */\n config: ProjectConfig;\n\n /** Parsed project `package.json` file; if it's not found, the default is an empty object. */\n packageJson: PackageJson;\n\n /** Parent {@linkcode Workspace} instance. */\n workspace: Workspace<M>;\n\n /** Errors found during reading from the file system. */\n errors: Array<InstanceType<typeof ProjectError>> = [];\n\n constructor({\n path: projectPath,\n name,\n config,\n packageJson,\n workspace,\n errors,\n }: ProjectOptions<M>) {\n // TODO: check that this path and workspace path are correct, i.e. project path must always be inside of workspace path\n this.path = projectPath;\n\n if (name) {\n this.name = name;\n }\n\n if (config) {\n this.config = config;\n } else {\n this.config = {};\n }\n\n if (packageJson) {\n this.packageJson = packageJson;\n } else {\n this.packageJson = {};\n }\n\n this.workspace = workspace;\n\n if (errors) {\n this.errors = errors;\n }\n\n if (this.packageJson.name?.length) {\n this.name = this.packageJson.name;\n }\n\n this.relativePath = pathToPosixPath(path.relative(this.workspace.path, this.path));\n }\n\n static async create<M extends boolean>({\n templateId,\n workspace,\n projectPath,\n projectName,\n args,\n }: ProjectCreateOptions<M>): Promise<Project<M>> {\n let project = new this({\n path: projectPath,\n name: projectName,\n config: {\n template: templateId,\n },\n workspace,\n });\n\n await ensureEmptyDirectory(project.path);\n await saveProjectConfig({projectPath: project.path, projectConfig: {template: templateId}});\n\n let templateRenders = await renderTemplate({\n templateId,\n templateData: {\n workspace,\n project,\n args,\n },\n });\n\n await applyTemplateRenders({\n templateRenders,\n path: project.path,\n ignoreCreateStrategies: false,\n ignoreCheckStrategies: true,\n });\n\n await project.read();\n\n return project;\n }\n\n static async read<M extends boolean>(\n projectPath: string,\n workspace: Workspace<M>,\n ): Promise<Project<M>> {\n let project = new this({\n path: projectPath,\n workspace,\n });\n\n await project.read();\n\n return project;\n }\n\n async read() {\n if (!(await fs.pathExists(this.path))) {\n throw new ProjectError('NO_SUCH_PROJECT_PATH', {\n messageParameters: [this.path],\n data: {\n path: this.path,\n },\n });\n }\n\n let errors: Array<InstanceType<typeof ProjectError>> = [];\n\n // load project config\n let projectConfigPath = path.join(this.path, CARSON_CONFIG_DIRECTORY, PROJECT_CONFIG_FILENAME);\n let doesProjectConfigExist = await fs.pathExists(projectConfigPath);\n let projectConfig: ProjectConfig | z.ZodError;\n\n if (doesProjectConfigExist) {\n projectConfig = await readFile(projectConfigPath, projectConfigSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n });\n } else {\n projectConfig = {};\n }\n\n if (projectConfig instanceof z.ZodError) {\n let zodError = projectConfig;\n\n errors.push(\n new ProjectError('INVALID_PROJECT_CONFIG', {\n messageParameters: [projectConfigPath],\n data: {\n path: projectConfigPath,\n zodIssues: zodError.issues,\n },\n }),\n );\n\n projectConfig = {};\n }\n\n // load package.json\n let packageJsonPath = path.join(this.path, 'package.json');\n let doesPackageJsonExist = await fs.pathExists(packageJsonPath);\n let packageJson: PackageJson | z.ZodError;\n\n if (doesPackageJsonExist) {\n packageJson = await readFile(packageJsonPath, packageJsonSchema, {\n parser: (rawString: string) => json5.parse<unknown>(rawString),\n });\n } else {\n packageJson = {};\n }\n\n if (packageJson instanceof z.ZodError) {\n let zodError = packageJson;\n\n errors.push(\n new ProjectError('INVALID_PACKAGE_JSON', {\n messageParameters: [packageJsonPath],\n data: {\n path: packageJsonPath,\n zodIssues: zodError.issues,\n },\n }),\n );\n\n packageJson = {};\n }\n\n if (packageJson.name?.length) {\n this.name = packageJson.name;\n }\n\n this.config = projectConfig;\n this.packageJson = packageJson;\n this.errors = errors;\n\n return this;\n }\n\n async update({args}: ProjectUpdateOptions): Promise<this> {\n if (!this.config.template) {\n throw new Error('Template ID is missing in the project config!');\n }\n\n let templateRenders = await renderTemplate({\n templateId: this.config.template,\n templateData: {\n workspace: this.workspace,\n project: this,\n args,\n },\n });\n\n await applyTemplateRenders({\n templateRenders,\n path: this.path,\n ignoreCreateStrategies: true,\n ignoreCheckStrategies: false,\n });\n\n await this.read();\n\n return this;\n }\n}\n"],"names":["ensureEmptyDirectory","pathToPosixPath","readFile","packageJsonSchema","fs","json5","path","z","projectConfigSchema","ProjectError","saveProjectConfig","CARSON_CONFIG_DIRECTORY","PROJECT_CONFIG_FILENAME","applyTemplateRenders","renderTemplate","Project","name","relativePath","config","packageJson","workspace","errors","constructor","projectPath","length","relative","create","templateId","projectName","args","project","template","projectConfig","templateRenders","templateData","ignoreCreateStrategies","ignoreCheckStrategies","read","pathExists","messageParameters","data","projectConfigPath","join","doesProjectConfigExist","parser","rawString","parse","ZodError","zodError","push","zodIssues","issues","packageJsonPath","doesPackageJsonExist","update","Error"],"mappings":"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"}
|