@jakubmazanec/carson 1.2.5 → 1.3.0-unstable.4fde3536

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 (56) hide show
  1. package/build/template/CarsonTemplateError.d.ts +2 -2
  2. package/build/template/CarsonTemplateError.js +2 -1
  3. package/build/template/CarsonTemplateError.js.map +2 -2
  4. package/build/template/applyTemplateRenders.js +7 -7
  5. package/build/template/applyTemplateRenders.js.map +2 -2
  6. package/build/template/internals/TemplateRenderSnapshot.d.ts +3 -16
  7. package/build/template/internals/TemplateRenderSnapshot.js +1 -4
  8. package/build/template/internals/TemplateRenderSnapshot.js.map +2 -2
  9. package/build/template/internals/TemplateRenderSnapshots.d.ts +3 -16
  10. package/build/template/internals/createUsingTemplateRender.d.ts +1 -2
  11. package/build/template/internals/createUsingTemplateRender.js.map +2 -2
  12. package/build/template/internals/deleteUsingTemplateRenderSnapshot.d.ts +5 -0
  13. package/build/template/internals/deleteUsingTemplateRenderSnapshot.js +24 -0
  14. package/build/template/internals/deleteUsingTemplateRenderSnapshot.js.map +7 -0
  15. package/build/template/internals/insertUsingTemplateRender.d.ts +1 -2
  16. package/build/template/internals/insertUsingTemplateRender.js.map +2 -2
  17. package/build/template/internals/loadTemplateRenderSnapshots.d.ts +1 -4
  18. package/build/template/internals/mergeUsingTemplateRender.d.ts +1 -2
  19. package/build/template/internals/mergeUsingTemplateRender.js.map +2 -2
  20. package/build/template/internals/overwriteUsingTemplateRender.d.ts +1 -2
  21. package/build/template/internals/overwriteUsingTemplateRender.js.map +2 -2
  22. package/build/template/internals/saveTemplateRenderSnapshots.js +40 -3
  23. package/build/template/internals/saveTemplateRenderSnapshots.js.map +2 -2
  24. package/build/template/internals/simplify.d.ts +4 -0
  25. package/build/template/internals/simplify.js +20 -0
  26. package/build/template/internals/simplify.js.map +7 -0
  27. package/build/template/internals/uninsertUsingTemplateRenderSnapshot.d.ts +2 -0
  28. package/build/template/internals/{uninsertUsingTemplateRender.js → uninsertUsingTemplateRenderSnapshot.js} +7 -16
  29. package/build/template/internals/uninsertUsingTemplateRenderSnapshot.js.map +7 -0
  30. package/build/template/internals/unmergeUsingTemplateRenderSnapshot.d.ts +2 -0
  31. package/build/template/internals/{unmergeUsingTemplateRender.js → unmergeUsingTemplateRenderSnapshot.js} +9 -15
  32. package/build/template/internals/unmergeUsingTemplateRenderSnapshot.js.map +7 -0
  33. package/build/template/internals.d.ts +4 -3
  34. package/build/template/internals.js +4 -3
  35. package/build/template/internals.js.map +2 -2
  36. package/package.json +18 -18
  37. package/source/template/CarsonTemplateError.ts +1 -0
  38. package/source/template/applyTemplateRenders.ts +7 -7
  39. package/source/template/internals/TemplateRenderSnapshot.ts +1 -6
  40. package/source/template/internals/createUsingTemplateRender.ts +1 -5
  41. package/source/template/internals/{deleteUsingTemplateRender.ts → deleteUsingTemplateRenderSnapshot.ts} +9 -5
  42. package/source/template/internals/insertUsingTemplateRender.ts +1 -5
  43. package/source/template/internals/mergeUsingTemplateRender.ts +1 -5
  44. package/source/template/internals/overwriteUsingTemplateRender.ts +1 -2
  45. package/source/template/internals/saveTemplateRenderSnapshots.ts +49 -3
  46. package/source/template/internals/simplify.ts +30 -0
  47. package/source/template/internals/{uninsertUsingTemplateRender.ts → uninsertUsingTemplateRenderSnapshot.ts} +7 -17
  48. package/source/template/internals/{unmergeUsingTemplateRender.ts → unmergeUsingTemplateRenderSnapshot.ts} +10 -16
  49. package/source/template/internals.ts +4 -3
  50. package/build/template/internals/deleteUsingTemplateRender.d.ts +0 -6
  51. package/build/template/internals/deleteUsingTemplateRender.js +0 -20
  52. package/build/template/internals/deleteUsingTemplateRender.js.map +0 -7
  53. package/build/template/internals/uninsertUsingTemplateRender.d.ts +0 -3
  54. package/build/template/internals/uninsertUsingTemplateRender.js.map +0 -7
  55. package/build/template/internals/unmergeUsingTemplateRender.d.ts +0 -3
  56. package/build/template/internals/unmergeUsingTemplateRender.js.map +0 -7
@@ -6,36 +6,30 @@ import yaml from "yaml";
6
6
  import { CarsonTemplateError } from "../CarsonTemplateError.js";
7
7
  import { prettify } from "./prettify.js";
8
8
  import { unmerge } from "./unmerge.js";
9
- export async function unmergeUsingTemplateRender(templateRender, outputPath) {
10
- let to = path.join(outputPath, templateRender.attributes.to);
9
+ export async function unmergeUsingTemplateRenderSnapshot(templateRenderSnapshot, outputPath) {
10
+ let to = path.join(outputPath, templateRenderSnapshot.attributes.to);
11
11
  let extension = path.extname(to);
12
+ if (!templateRenderSnapshot.content) {
13
+ throw new CarsonTemplateError("INVALID_SNAPSHOT");
14
+ }
12
15
  switch (extension) {
13
16
  case ".json": {
14
17
  let targetFile = await fs.readJson(to);
15
- let fileToMerge = json.parse(templateRender.content);
18
+ let fileToMerge = json.parse(templateRenderSnapshot.content);
16
19
  let newFile = JSON.stringify(unmerge(targetFile, fileToMerge));
17
20
  await fs.writeFile(to, await prettify(newFile, to), { encoding: "utf8" });
18
21
  break;
19
22
  }
20
23
  case ".yaml": {
21
24
  let targetFile = yaml.parse(await fs.readFile(to, { encoding: "utf8" }));
22
- let fileToMerge = yaml.parse(templateRender.content);
25
+ let fileToMerge = yaml.parse(templateRenderSnapshot.content);
23
26
  let newFile = yaml.stringify(unmerge(targetFile, fileToMerge));
24
27
  await fs.writeFile(to, await prettify(newFile, to), { encoding: "utf8" });
25
28
  break;
26
29
  }
27
30
  default: {
28
- throw new CarsonTemplateError("STRATEGY_UNSUPPORTED_EXTENSION", {
29
- messageParameters: [
30
- templateRender.attributes.strategy,
31
- templateRender.template.path,
32
- extension
33
- ],
34
- data: {
35
- path: templateRender.template.path
36
- }
37
- });
31
+ throw new CarsonTemplateError("INVALID_SNAPSHOT");
38
32
  }
39
33
  }
40
34
  }
41
- //# sourceMappingURL=unmergeUsingTemplateRender.js.map
35
+ //# sourceMappingURL=unmergeUsingTemplateRenderSnapshot.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../source/template/internals/unmergeUsingTemplateRenderSnapshot.ts"],
4
+ "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 {CarsonTemplateError} from '../CarsonTemplateError.js';\nimport {prettify} from './prettify.js';\nimport {type TemplateRenderSnapshot} from './TemplateRenderSnapshot.js';\nimport {unmerge} from './unmerge.js';\n\nexport async function unmergeUsingTemplateRenderSnapshot(\n templateRenderSnapshot: TemplateRenderSnapshot,\n outputPath: string,\n) {\n let to = path.join(outputPath, templateRenderSnapshot.attributes.to);\n let extension = path.extname(to);\n\n if (!templateRenderSnapshot.content) {\n throw new CarsonTemplateError('INVALID_SNAPSHOT');\n }\n\n switch (extension) {\n case '.json': {\n let targetFile = (await fs.readJson(to)) as Json;\n let fileToMerge = json.parse<Json>(templateRenderSnapshot.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(templateRenderSnapshot.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 CarsonTemplateError('INVALID_SNAPSHOT');\n }\n }\n}\n"],
5
+ "mappings": ";AACA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,OAAO,UAAU;AAEjB,SAAQ,2BAA0B;AAClC,SAAQ,gBAAe;AAEvB,SAAQ,eAAc;AAEtB,sBAAsB,mCACpB,wBACA,YACA;AACA,MAAI,KAAK,KAAK,KAAK,YAAY,uBAAuB,WAAW,EAAE;AACnE,MAAI,YAAY,KAAK,QAAQ,EAAE;AAE/B,MAAI,CAAC,uBAAuB,SAAS;AACnC,UAAM,IAAI,oBAAoB,kBAAkB;AAAA,EAClD;AAEA,UAAQ,WAAW;AAAA,IACjB,KAAK,SAAS;AACZ,UAAI,aAAc,MAAM,GAAG,SAAS,EAAE;AACtC,UAAI,cAAc,KAAK,MAAY,uBAAuB,OAAO;AACjE,UAAI,UAAU,KAAK,UAAU,QAAQ,YAAY,WAAW,CAAC;AAE7D,YAAM,GAAG,UAAU,IAAI,MAAM,SAAS,SAAS,EAAE,GAAG,EAAC,UAAU,OAAM,CAAC;AAEtE;AAAA,IACF;AAAA,IAEA,KAAK,SAAS;AACZ,UAAI,aAAa,KAAK,MAAM,MAAM,GAAG,SAAS,IAAI,EAAC,UAAU,OAAM,CAAC,CAAC;AACrE,UAAI,cAAc,KAAK,MAAM,uBAAuB,OAAO;AAC3D,UAAI,UAAU,KAAK,UAAU,QAAQ,YAAY,WAAW,CAAC;AAE7D,YAAM,GAAG,UAAU,IAAI,MAAM,SAAS,SAAS,EAAE,GAAG,EAAC,UAAU,OAAM,CAAC;AAEtE;AAAA,IACF;AAAA,IAEA,SAAS;AACP,YAAM,IAAI,oBAAoB,kBAAkB;AAAA,IAClD;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -1,5 +1,5 @@
1
1
  export * from './internals/createUsingTemplateRender.js';
2
- export * from './internals/deleteUsingTemplateRender.js';
2
+ export * from './internals/deleteUsingTemplateRenderSnapshot.js';
3
3
  export * from './internals/importCarsonTemplate.js';
4
4
  export * from './internals/insertUsingTemplateRender.js';
5
5
  export * from './internals/loadTemplateRenderSnapshots.js';
@@ -11,8 +11,9 @@ export * from './internals/prettify.js';
11
11
  export * from './internals/readCarsonTemplate.js';
12
12
  export * from './internals/resolveModule.js';
13
13
  export * from './internals/saveTemplateRenderSnapshots.js';
14
+ export * from './internals/simplify.js';
14
15
  export * from './internals/TemplateRenderSnapshot.js';
15
16
  export * from './internals/TemplateRenderSnapshots.js';
16
- export * from './internals/uninsertUsingTemplateRender.js';
17
+ export * from './internals/uninsertUsingTemplateRenderSnapshot.js';
17
18
  export * from './internals/unmerge.js';
18
- export * from './internals/unmergeUsingTemplateRender.js';
19
+ export * from './internals/unmergeUsingTemplateRenderSnapshot.js';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  export * from "./internals/createUsingTemplateRender.js";
3
- export * from "./internals/deleteUsingTemplateRender.js";
3
+ export * from "./internals/deleteUsingTemplateRenderSnapshot.js";
4
4
  export * from "./internals/importCarsonTemplate.js";
5
5
  export * from "./internals/insertUsingTemplateRender.js";
6
6
  export * from "./internals/loadTemplateRenderSnapshots.js";
@@ -12,9 +12,10 @@ export * from "./internals/prettify.js";
12
12
  export * from "./internals/readCarsonTemplate.js";
13
13
  export * from "./internals/resolveModule.js";
14
14
  export * from "./internals/saveTemplateRenderSnapshots.js";
15
+ export * from "./internals/simplify.js";
15
16
  export * from "./internals/TemplateRenderSnapshot.js";
16
17
  export * from "./internals/TemplateRenderSnapshots.js";
17
- export * from "./internals/uninsertUsingTemplateRender.js";
18
+ export * from "./internals/uninsertUsingTemplateRenderSnapshot.js";
18
19
  export * from "./internals/unmerge.js";
19
- export * from "./internals/unmergeUsingTemplateRender.js";
20
+ export * from "./internals/unmergeUsingTemplateRenderSnapshot.js";
20
21
  //# sourceMappingURL=internals.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/template/internals.ts"],
4
- "sourcesContent": ["export * from './internals/createUsingTemplateRender.js';\nexport * from './internals/deleteUsingTemplateRender.js';\nexport * from './internals/importCarsonTemplate.js';\nexport * from './internals/insertUsingTemplateRender.js';\nexport * from './internals/loadTemplateRenderSnapshots.js';\nexport * from './internals/merge.js';\nexport * from './internals/mergeUsingTemplateRender.js';\nexport * from './internals/overwriteUsingTemplateRender.js';\nexport * from './internals/parseCarsonTemplateId.js';\nexport * from './internals/prettify.js';\nexport * from './internals/readCarsonTemplate.js';\nexport * from './internals/resolveModule.js';\nexport * from './internals/saveTemplateRenderSnapshots.js';\nexport * from './internals/TemplateRenderSnapshot.js';\nexport * from './internals/TemplateRenderSnapshots.js';\nexport * from './internals/uninsertUsingTemplateRender.js';\nexport * from './internals/unmerge.js';\nexport * from './internals/unmergeUsingTemplateRender.js';\n"],
5
- "mappings": ";AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
4
+ "sourcesContent": ["export * from './internals/createUsingTemplateRender.js';\nexport * from './internals/deleteUsingTemplateRenderSnapshot.js';\nexport * from './internals/importCarsonTemplate.js';\nexport * from './internals/insertUsingTemplateRender.js';\nexport * from './internals/loadTemplateRenderSnapshots.js';\nexport * from './internals/merge.js';\nexport * from './internals/mergeUsingTemplateRender.js';\nexport * from './internals/overwriteUsingTemplateRender.js';\nexport * from './internals/parseCarsonTemplateId.js';\nexport * from './internals/prettify.js';\nexport * from './internals/readCarsonTemplate.js';\nexport * from './internals/resolveModule.js';\nexport * from './internals/saveTemplateRenderSnapshots.js';\nexport * from './internals/simplify.js';\nexport * from './internals/TemplateRenderSnapshot.js';\nexport * from './internals/TemplateRenderSnapshots.js';\nexport * from './internals/uninsertUsingTemplateRenderSnapshot.js';\nexport * from './internals/unmerge.js';\nexport * from './internals/unmergeUsingTemplateRenderSnapshot.js';\n"],
5
+ "mappings": ";AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jakubmazanec/carson",
3
- "version": "1.2.5",
3
+ "version": "1.3.0-unstable.4fde3536",
4
4
  "description": "Tool for managing workspace and project configuration.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -32,13 +32,13 @@
32
32
  "typecheck": "tsc --project tsconfig.typecheck.json"
33
33
  },
34
34
  "dependencies": {
35
- "@jakubmazanec/args": "^2.0.0",
36
- "@jakubmazanec/cli": "^0.3.0",
37
- "@jakubmazanec/error": "^3.0.0",
38
- "@jakubmazanec/fs-utils": "^0.2.0",
39
- "@jakubmazanec/template": "^2.0.0",
40
- "@jakubmazanec/ts-utils": "^3.0.0",
41
- "@jakubmazanec/zod-utils": "^2.0.0",
35
+ "@jakubmazanec/args": "2.0.8-unstable.4fde3536",
36
+ "@jakubmazanec/cli": "0.3.8-unstable.4fde3536",
37
+ "@jakubmazanec/error": "3.0.8-unstable.4fde3536",
38
+ "@jakubmazanec/fs-utils": "0.2.8-unstable.4fde3536",
39
+ "@jakubmazanec/template": "2.0.9-unstable.4fde3536",
40
+ "@jakubmazanec/ts-utils": "3.0.9-unstable.4fde3536",
41
+ "@jakubmazanec/zod-utils": "2.0.8-unstable.4fde3536",
42
42
  "chalk": "^5.3.0",
43
43
  "fast-glob": "^3.3.2",
44
44
  "fflate": "^0.8.2",
@@ -46,16 +46,16 @@
46
46
  "json5": "^2.2.3",
47
47
  "lodash": "^4.17.21",
48
48
  "micromatch": "^4.0.8",
49
- "prettier": "^3.3.3",
50
- "prettier-plugin-packagejson": "^2.5.3",
49
+ "prettier": "^3.4.2",
50
+ "prettier-plugin-packagejson": "^2.5.6",
51
51
  "semver": "^7.6.3",
52
52
  "simple-git": "^3.27.0",
53
53
  "yaml": "^2.6.1",
54
54
  "zen-observable": "^0.10.0",
55
- "zod": "^3.23.8"
55
+ "zod": "^3.24.1"
56
56
  },
57
57
  "devDependencies": {
58
- "@jakubmazanec/eslint-config": "^4.1.0",
58
+ "@jakubmazanec/eslint-config": "4.1.2-unstable.4fde3536",
59
59
  "@types/fs-extra": "^11.0.4",
60
60
  "@types/lodash": "^4.17.13",
61
61
  "@types/micromatch": "^4.0.9",
@@ -64,19 +64,19 @@
64
64
  "@types/semver": "^7.5.8",
65
65
  "@types/zen-observable": "^0.8.7",
66
66
  "@vitest/coverage-v8": "^2.1.5",
67
- "concurrently": "^9.1.0",
67
+ "concurrently": "^9.1.2",
68
68
  "del-cli": "^6.0.0",
69
- "esbuild": "^0.24.0",
69
+ "esbuild": "^0.24.2",
70
70
  "eslint": "^9.15.0",
71
- "ink": "^5.0.1",
71
+ "ink": "^5.1.0",
72
72
  "lodash": "^4.17.21",
73
- "prettier": "^3.3.3",
74
- "prettier-plugin-packagejson": "^2.5.3",
73
+ "prettier": "^3.4.2",
74
+ "prettier-plugin-packagejson": "^2.5.6",
75
75
  "react": "^18.3.1",
76
76
  "ts-node": "^10.9.2",
77
77
  "typedoc": "^0.27.6",
78
78
  "typedoc-plugin-markdown": "^4.3.3",
79
- "typescript": "^5.6.3",
79
+ "typescript": "^5.7.2",
80
80
  "vitest": "^2.1.5"
81
81
  },
82
82
  "peerDependencies": {
@@ -12,6 +12,7 @@ export const CarsonTemplateError = createCustomErrorWithData(
12
12
  STRATEGY_UNSUPPORTED_EXTENSION:
13
13
  'Strategy "{0}" in the template file "{1}" doesn\'t support extension "{2}".',
14
14
  STRATEGY_MISSING_FILE: 'Strategy "{0}" in the template file "{1}" is missing file "{2}".',
15
+ INVALID_SNAPSHOT: 'Invalid Carson template render snapshot.',
15
16
  },
16
17
  class CarsonTemplateErrorData {
17
18
  path?: string;
@@ -6,14 +6,14 @@ import {CARSON_CONFIG_DIRECTORY} from '../constants.js';
6
6
  import {CarsonTemplateError} from './CarsonTemplateError.js';
7
7
  import {
8
8
  createUsingTemplateRender,
9
- deleteUsingTemplateRender,
9
+ deleteUsingTemplateRenderSnapshot,
10
10
  insertUsingTemplateRender,
11
11
  loadTemplateRenderSnapshots,
12
12
  mergeUsingTemplateRender,
13
13
  overwriteUsingTemplateRender,
14
14
  saveTemplateRenderSnapshots,
15
- uninsertUsingTemplateRender,
16
- unmergeUsingTemplateRender,
15
+ uninsertUsingTemplateRenderSnapshot,
16
+ unmergeUsingTemplateRenderSnapshot,
17
17
  } from './internals.js';
18
18
  import {type TemplateRenders} from './TemplateRenders.js';
19
19
 
@@ -51,21 +51,21 @@ export async function applyTemplateRenders({
51
51
  }
52
52
 
53
53
  if (templateRenderSnapshot.attributes.strategy === 'ensure') {
54
- await deleteUsingTemplateRender(templateRenderSnapshot, targetPath, {
54
+ await deleteUsingTemplateRenderSnapshot(templateRenderSnapshot, targetPath, {
55
55
  onlyDeleteWhenContentsMatch: true,
56
56
  });
57
57
  }
58
58
 
59
59
  if (templateRenderSnapshot.attributes.strategy === 'overwrite') {
60
- await deleteUsingTemplateRender(templateRenderSnapshot, targetPath);
60
+ await deleteUsingTemplateRenderSnapshot(templateRenderSnapshot, targetPath);
61
61
  }
62
62
 
63
63
  if (templateRenderSnapshot.attributes.strategy === 'merge') {
64
- await unmergeUsingTemplateRender(templateRenderSnapshot, targetPath);
64
+ await unmergeUsingTemplateRenderSnapshot(templateRenderSnapshot, targetPath);
65
65
  }
66
66
 
67
67
  if (templateRenderSnapshot.attributes.strategy[0] === 'insert') {
68
- await uninsertUsingTemplateRender(templateRenderSnapshot, targetPath);
68
+ await uninsertUsingTemplateRenderSnapshot(templateRenderSnapshot, targetPath);
69
69
  }
70
70
  }
71
71
  }
@@ -6,12 +6,7 @@ import {templateAttributesSchema} from '../TemplateAttributes.js';
6
6
  export const templateRenderSnapshotSchema = z
7
7
  .object({
8
8
  attributes: baseTemplateAttributesSchema.pick({to: true}).merge(templateAttributesSchema),
9
- content: z.string(),
10
- template: z
11
- .object({
12
- path: z.string(),
13
- })
14
- .strict(),
9
+ content: z.string().optional(),
15
10
  })
16
11
  .strict();
17
12
 
@@ -7,12 +7,8 @@ import yaml from 'yaml';
7
7
  import {type TemplateRender} from '../TemplateRender.js';
8
8
  import {merge} from './merge.js';
9
9
  import {prettify} from './prettify.js';
10
- import {type TemplateRenderSnapshot} from './TemplateRenderSnapshot.js';
11
10
 
12
- export async function createUsingTemplateRender(
13
- templateRender: TemplateRender | TemplateRenderSnapshot,
14
- basePath: string,
15
- ) {
11
+ export async function createUsingTemplateRender(templateRender: TemplateRender, basePath: string) {
16
12
  let to = path.join(basePath, templateRender.attributes.to);
17
13
  let extension = path.extname(to);
18
14
 
@@ -1,7 +1,7 @@
1
1
  import fs from 'fs-extra';
2
2
  import path from 'node:path';
3
3
 
4
- import {type TemplateRender} from '../TemplateRender.js';
4
+ import {CarsonTemplateError} from '../CarsonTemplateError.js';
5
5
  import {prettify} from './prettify.js';
6
6
  import {type TemplateRenderSnapshot} from './TemplateRenderSnapshot.js';
7
7
 
@@ -9,20 +9,24 @@ export type DeleteUsingTemplateRenderOptions = {
9
9
  onlyDeleteWhenContentsMatch?: boolean;
10
10
  };
11
11
 
12
- export async function deleteUsingTemplateRender(
13
- templateRender: TemplateRender | TemplateRenderSnapshot,
12
+ export async function deleteUsingTemplateRenderSnapshot(
13
+ templateRenderSnapshot: TemplateRenderSnapshot,
14
14
  basePath: string,
15
15
  options?: DeleteUsingTemplateRenderOptions,
16
16
  ) {
17
- let to = path.join(basePath, templateRender.attributes.to);
17
+ let to = path.join(basePath, templateRenderSnapshot.attributes.to);
18
18
 
19
19
  if (!(await fs.pathExists(to))) {
20
20
  return;
21
21
  }
22
22
 
23
23
  if (options?.onlyDeleteWhenContentsMatch) {
24
+ if (!templateRenderSnapshot.content) {
25
+ throw new CarsonTemplateError('INVALID_SNAPSHOT');
26
+ }
27
+
24
28
  let existingContent = await fs.readFile(to, {encoding: 'utf8'});
25
- let newContent = await prettify(templateRender.content, to);
29
+ let newContent = await prettify(templateRenderSnapshot.content, to);
26
30
 
27
31
  if (existingContent.trim() === newContent.trim()) {
28
32
  await fs.rm(to);
@@ -5,12 +5,8 @@ import path from 'node:path';
5
5
  import {CarsonTemplateError} from '../CarsonTemplateError.js';
6
6
  import {type TemplateRender} from '../TemplateRender.js';
7
7
  import {prettify} from './prettify.js';
8
- import {type TemplateRenderSnapshot} from './TemplateRenderSnapshot.js';
9
8
 
10
- export async function insertUsingTemplateRender(
11
- templateRender: TemplateRender | TemplateRenderSnapshot,
12
- basePath: string,
13
- ) {
9
+ export async function insertUsingTemplateRender(templateRender: TemplateRender, basePath: string) {
14
10
  let to = path.join(basePath, templateRender.attributes.to);
15
11
  let extension = path.extname(to);
16
12
 
@@ -8,12 +8,8 @@ import {CarsonTemplateError} from '../CarsonTemplateError.js';
8
8
  import {type TemplateRender} from '../TemplateRender.js';
9
9
  import {merge} from './merge.js';
10
10
  import {prettify} from './prettify.js';
11
- import {type TemplateRenderSnapshot} from './TemplateRenderSnapshot.js';
12
11
 
13
- export async function mergeUsingTemplateRender(
14
- templateRender: TemplateRender | TemplateRenderSnapshot,
15
- basePath: string,
16
- ) {
12
+ export async function mergeUsingTemplateRender(templateRender: TemplateRender, basePath: string) {
17
13
  let to = path.join(basePath, templateRender.attributes.to);
18
14
  let extension = path.extname(to);
19
15
 
@@ -3,10 +3,9 @@ import path from 'node:path';
3
3
 
4
4
  import {type TemplateRender} from '../TemplateRender.js';
5
5
  import {prettify} from './prettify.js';
6
- import {type TemplateRenderSnapshot} from './TemplateRenderSnapshot.js';
7
6
 
8
7
  export async function overwriteUsingTemplateRender(
9
- templateRender: TemplateRender | TemplateRenderSnapshot,
8
+ templateRender: TemplateRender,
10
9
  basePath: string,
11
10
  ) {
12
11
  let to = path.join(basePath, templateRender.attributes.to);
@@ -1,7 +1,10 @@
1
1
  import {deflateSync, strToU8} from 'fflate';
2
2
  import fs from 'fs-extra';
3
+ import path from 'node:path';
4
+ import yaml from 'yaml';
3
5
 
4
6
  import {type TemplateRenders} from '../TemplateRenders.js';
7
+ import {simplify} from './simplify.js';
5
8
  import {type TemplateRenderSnapshots} from './TemplateRenderSnapshots.js';
6
9
 
7
10
  export async function saveTemplateRenderSnapshots(
@@ -12,19 +15,62 @@ export async function saveTemplateRenderSnapshots(
12
15
 
13
16
  for (let templateRender of templateRenders) {
14
17
  if (
15
- templateRender.attributes.strategy === 'ensure' ||
16
18
  templateRender.attributes.strategy === 'overwrite' ||
17
- templateRender.attributes.strategy === 'merge' ||
18
19
  templateRender.attributes.strategy[0] === 'insert'
19
20
  ) {
21
+ templateRendersSnapshots.push({
22
+ attributes: {
23
+ to: templateRender.attributes.to,
24
+ strategy: templateRender.attributes.strategy,
25
+ },
26
+ });
27
+
28
+ continue;
29
+ }
30
+
31
+ if (templateRender.attributes.strategy === 'ensure') {
20
32
  templateRendersSnapshots.push({
21
33
  attributes: {
22
34
  to: templateRender.attributes.to,
23
35
  strategy: templateRender.attributes.strategy,
24
36
  },
25
37
  content: templateRender.content,
26
- template: templateRender.template,
27
38
  });
39
+
40
+ continue;
41
+ }
42
+
43
+ if (templateRender.attributes.strategy === 'merge') {
44
+ let extension = path.extname(templateRender.attributes.to);
45
+ let content;
46
+
47
+ switch (extension) {
48
+ case '.json': {
49
+ content = JSON.stringify(simplify(JSON.parse(templateRender.content)));
50
+
51
+ break;
52
+ }
53
+
54
+ case '.yaml': {
55
+ content = yaml.stringify(simplify(yaml.parse(templateRender.content)));
56
+
57
+ break;
58
+ }
59
+
60
+ default: {
61
+ content = templateRender.content;
62
+ }
63
+ }
64
+
65
+ templateRendersSnapshots.push({
66
+ attributes: {
67
+ to: templateRender.attributes.to,
68
+ strategy: templateRender.attributes.strategy,
69
+ },
70
+ content,
71
+ });
72
+
73
+ continue;
28
74
  }
29
75
  }
30
76
 
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Simplifies JSON for usage in snapshots: string, number or boolean values are replaced with `null`.
3
+ */
4
+ export function simplify(a: unknown) {
5
+ if (a === undefined || a == null) {
6
+ return null;
7
+ }
8
+
9
+ if (typeof a !== 'object' || Array.isArray(a)) {
10
+ return null;
11
+ }
12
+
13
+ const newA: Record<string, unknown> = {...a};
14
+
15
+ for (let [key] of Object.entries(a)) {
16
+ if (
17
+ (a as Record<string, unknown>)[key] &&
18
+ typeof (a as Record<string, unknown>)[key] === 'object' &&
19
+ !Array.isArray((a as Record<string, unknown>)[key])
20
+ ) {
21
+ const result = simplify((a as Record<string, unknown>)[key]);
22
+
23
+ newA[key] = result;
24
+ } else {
25
+ newA[key] = null;
26
+ }
27
+ }
28
+
29
+ return newA;
30
+ }
@@ -3,26 +3,25 @@ import _ from 'lodash';
3
3
  import path from 'node:path';
4
4
 
5
5
  import {CarsonTemplateError} from '../CarsonTemplateError.js';
6
- import {type TemplateRender} from '../TemplateRender.js';
7
6
  import {prettify} from './prettify.js';
8
7
  import {type TemplateRenderSnapshot} from './TemplateRenderSnapshot.js';
9
8
 
10
- export async function uninsertUsingTemplateRender(
11
- templateRender: TemplateRender | TemplateRenderSnapshot,
9
+ export async function uninsertUsingTemplateRenderSnapshot(
10
+ templateRenderSnapshot: TemplateRenderSnapshot,
12
11
  basePath: string,
13
12
  ) {
14
- let to = path.join(basePath, templateRender.attributes.to);
13
+ let to = path.join(basePath, templateRenderSnapshot.attributes.to);
15
14
  let extension = path.extname(to);
16
15
 
17
16
  switch (extension) {
18
17
  case '.md': {
19
18
  if (await fs.pathExists(to)) {
20
19
  let targetFile = await fs.readFile(to, {encoding: 'utf8'});
21
- let newContent = `<!-- ${templateRender.attributes.strategy[1]} --><!-- ${templateRender.attributes.strategy[1]} -->`;
20
+ let newContent = `<!-- ${templateRenderSnapshot.attributes.strategy[1]} --><!-- ${templateRenderSnapshot.attributes.strategy[1]} -->`;
22
21
  let oldContentRegexp = new RegExp(
23
22
  `<!--\\s*${_.escapeRegExp(
24
- templateRender.attributes.strategy[1],
25
- )}\\s-->[\\s\\S]*<!--\\s*${_.escapeRegExp(templateRender.attributes.strategy[1])}\\s-->`,
23
+ templateRenderSnapshot.attributes.strategy[1],
24
+ )}\\s-->[\\s\\S]*<!--\\s*${_.escapeRegExp(templateRenderSnapshot.attributes.strategy[1])}\\s-->`,
26
25
  'u',
27
26
  );
28
27
  let newFile = targetFile.replace(oldContentRegexp, newContent);
@@ -34,16 +33,7 @@ export async function uninsertUsingTemplateRender(
34
33
  }
35
34
 
36
35
  default: {
37
- throw new CarsonTemplateError('STRATEGY_UNSUPPORTED_EXTENSION', {
38
- messageParameters: [
39
- templateRender.attributes.strategy,
40
- templateRender.template.path,
41
- extension,
42
- ],
43
- data: {
44
- path: templateRender.template.path,
45
- },
46
- });
36
+ throw new CarsonTemplateError('INVALID_SNAPSHOT');
47
37
  }
48
38
  }
49
39
  }
@@ -5,22 +5,25 @@ import path from 'node:path';
5
5
  import yaml from 'yaml';
6
6
 
7
7
  import {CarsonTemplateError} from '../CarsonTemplateError.js';
8
- import {type TemplateRender} from '../TemplateRender.js';
9
8
  import {prettify} from './prettify.js';
10
9
  import {type TemplateRenderSnapshot} from './TemplateRenderSnapshot.js';
11
10
  import {unmerge} from './unmerge.js';
12
11
 
13
- export async function unmergeUsingTemplateRender(
14
- templateRender: TemplateRender | TemplateRenderSnapshot,
12
+ export async function unmergeUsingTemplateRenderSnapshot(
13
+ templateRenderSnapshot: TemplateRenderSnapshot,
15
14
  outputPath: string,
16
15
  ) {
17
- let to = path.join(outputPath, templateRender.attributes.to);
16
+ let to = path.join(outputPath, templateRenderSnapshot.attributes.to);
18
17
  let extension = path.extname(to);
19
18
 
19
+ if (!templateRenderSnapshot.content) {
20
+ throw new CarsonTemplateError('INVALID_SNAPSHOT');
21
+ }
22
+
20
23
  switch (extension) {
21
24
  case '.json': {
22
25
  let targetFile = (await fs.readJson(to)) as Json;
23
- let fileToMerge = json.parse<Json>(templateRender.content);
26
+ let fileToMerge = json.parse<Json>(templateRenderSnapshot.content);
24
27
  let newFile = JSON.stringify(unmerge(targetFile, fileToMerge));
25
28
 
26
29
  await fs.writeFile(to, await prettify(newFile, to), {encoding: 'utf8'});
@@ -30,7 +33,7 @@ export async function unmergeUsingTemplateRender(
30
33
 
31
34
  case '.yaml': {
32
35
  let targetFile = yaml.parse(await fs.readFile(to, {encoding: 'utf8'})) as unknown;
33
- let fileToMerge = yaml.parse(templateRender.content) as unknown;
36
+ let fileToMerge = yaml.parse(templateRenderSnapshot.content) as unknown;
34
37
  let newFile = yaml.stringify(unmerge(targetFile, fileToMerge));
35
38
 
36
39
  await fs.writeFile(to, await prettify(newFile, to), {encoding: 'utf8'});
@@ -39,16 +42,7 @@ export async function unmergeUsingTemplateRender(
39
42
  }
40
43
 
41
44
  default: {
42
- throw new CarsonTemplateError('STRATEGY_UNSUPPORTED_EXTENSION', {
43
- messageParameters: [
44
- templateRender.attributes.strategy,
45
- templateRender.template.path,
46
- extension,
47
- ],
48
- data: {
49
- path: templateRender.template.path,
50
- },
51
- });
45
+ throw new CarsonTemplateError('INVALID_SNAPSHOT');
52
46
  }
53
47
  }
54
48
  }
@@ -1,5 +1,5 @@
1
1
  export * from './internals/createUsingTemplateRender.js';
2
- export * from './internals/deleteUsingTemplateRender.js';
2
+ export * from './internals/deleteUsingTemplateRenderSnapshot.js';
3
3
  export * from './internals/importCarsonTemplate.js';
4
4
  export * from './internals/insertUsingTemplateRender.js';
5
5
  export * from './internals/loadTemplateRenderSnapshots.js';
@@ -11,8 +11,9 @@ export * from './internals/prettify.js';
11
11
  export * from './internals/readCarsonTemplate.js';
12
12
  export * from './internals/resolveModule.js';
13
13
  export * from './internals/saveTemplateRenderSnapshots.js';
14
+ export * from './internals/simplify.js';
14
15
  export * from './internals/TemplateRenderSnapshot.js';
15
16
  export * from './internals/TemplateRenderSnapshots.js';
16
- export * from './internals/uninsertUsingTemplateRender.js';
17
+ export * from './internals/uninsertUsingTemplateRenderSnapshot.js';
17
18
  export * from './internals/unmerge.js';
18
- export * from './internals/unmergeUsingTemplateRender.js';
19
+ export * from './internals/unmergeUsingTemplateRenderSnapshot.js';
@@ -1,6 +0,0 @@
1
- import { type TemplateRender } from '../TemplateRender.js';
2
- import { type TemplateRenderSnapshot } from './TemplateRenderSnapshot.js';
3
- export type DeleteUsingTemplateRenderOptions = {
4
- onlyDeleteWhenContentsMatch?: boolean;
5
- };
6
- export declare function deleteUsingTemplateRender(templateRender: TemplateRender | TemplateRenderSnapshot, basePath: string, options?: DeleteUsingTemplateRenderOptions): Promise<void>;
@@ -1,20 +0,0 @@
1
- "use strict";
2
- import fs from "fs-extra";
3
- import path from "node:path";
4
- import { prettify } from "./prettify.js";
5
- export async function deleteUsingTemplateRender(templateRender, basePath, options) {
6
- let to = path.join(basePath, templateRender.attributes.to);
7
- if (!await fs.pathExists(to)) {
8
- return;
9
- }
10
- if (options?.onlyDeleteWhenContentsMatch) {
11
- let existingContent = await fs.readFile(to, { encoding: "utf8" });
12
- let newContent = await prettify(templateRender.content, to);
13
- if (existingContent.trim() === newContent.trim()) {
14
- await fs.rm(to);
15
- }
16
- return;
17
- }
18
- await fs.rm(to);
19
- }
20
- //# sourceMappingURL=deleteUsingTemplateRender.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../source/template/internals/deleteUsingTemplateRender.ts"],
4
- "sourcesContent": ["import fs from 'fs-extra';\nimport path from 'node:path';\n\nimport {type TemplateRender} from '../TemplateRender.js';\nimport {prettify} from './prettify.js';\nimport {type TemplateRenderSnapshot} from './TemplateRenderSnapshot.js';\n\nexport type DeleteUsingTemplateRenderOptions = {\n onlyDeleteWhenContentsMatch?: boolean;\n};\n\nexport async function deleteUsingTemplateRender(\n templateRender: TemplateRender | TemplateRenderSnapshot,\n basePath: string,\n options?: DeleteUsingTemplateRenderOptions,\n) {\n let to = path.join(basePath, templateRender.attributes.to);\n\n if (!(await fs.pathExists(to))) {\n return;\n }\n\n if (options?.onlyDeleteWhenContentsMatch) {\n let existingContent = await fs.readFile(to, {encoding: 'utf8'});\n let newContent = await prettify(templateRender.content, to);\n\n if (existingContent.trim() === newContent.trim()) {\n await fs.rm(to);\n }\n\n return;\n }\n\n await fs.rm(to);\n}\n"],
5
- "mappings": ";AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAGjB,SAAQ,gBAAe;AAOvB,sBAAsB,0BACpB,gBACA,UACA,SACA;AACA,MAAI,KAAK,KAAK,KAAK,UAAU,eAAe,WAAW,EAAE;AAEzD,MAAI,CAAE,MAAM,GAAG,WAAW,EAAE,GAAI;AAC9B;AAAA,EACF;AAEA,MAAI,SAAS,6BAA6B;AACxC,QAAI,kBAAkB,MAAM,GAAG,SAAS,IAAI,EAAC,UAAU,OAAM,CAAC;AAC9D,QAAI,aAAa,MAAM,SAAS,eAAe,SAAS,EAAE;AAE1D,QAAI,gBAAgB,KAAK,MAAM,WAAW,KAAK,GAAG;AAChD,YAAM,GAAG,GAAG,EAAE;AAAA,IAChB;AAEA;AAAA,EACF;AAEA,QAAM,GAAG,GAAG,EAAE;AAChB;",
6
- "names": []
7
- }
@@ -1,3 +0,0 @@
1
- import { type TemplateRender } from '../TemplateRender.js';
2
- import { type TemplateRenderSnapshot } from './TemplateRenderSnapshot.js';
3
- export declare function uninsertUsingTemplateRender(templateRender: TemplateRender | TemplateRenderSnapshot, basePath: string): Promise<void>;