@luzzle/web.tools 0.0.69 → 0.0.70

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 (160) hide show
  1. package/package.json +6 -7
  2. package/dist/src/browser.d.ts +0 -1
  3. package/dist/src/browser.js +0 -2
  4. package/dist/src/browser.js.map +0 -1
  5. package/dist/src/cli.d.ts +0 -2
  6. package/dist/src/cli.js +0 -19
  7. package/dist/src/cli.js.map +0 -1
  8. package/dist/src/commands/assets/command.d.ts +0 -30
  9. package/dist/src/commands/assets/command.js +0 -41
  10. package/dist/src/commands/assets/command.js.map +0 -1
  11. package/dist/src/commands/assets/index.d.ts +0 -4
  12. package/dist/src/commands/assets/index.js +0 -79
  13. package/dist/src/commands/assets/index.js.map +0 -1
  14. package/dist/src/commands/assets/index.test.d.ts +0 -1
  15. package/dist/src/commands/assets/index.test.js +0 -419
  16. package/dist/src/commands/assets/index.test.js.map +0 -1
  17. package/dist/src/commands/assets/variants.d.ts +0 -8
  18. package/dist/src/commands/assets/variants.js +0 -23
  19. package/dist/src/commands/assets/variants.js.map +0 -1
  20. package/dist/src/commands/assets/variants.test.d.ts +0 -1
  21. package/dist/src/commands/assets/variants.test.js +0 -48
  22. package/dist/src/commands/assets/variants.test.js.map +0 -1
  23. package/dist/src/commands/config/command.d.ts +0 -2
  24. package/dist/src/commands/config/command.js +0 -42
  25. package/dist/src/commands/config/command.js.map +0 -1
  26. package/dist/src/commands/config/index.d.ts +0 -3
  27. package/dist/src/commands/config/index.js +0 -37
  28. package/dist/src/commands/config/index.js.map +0 -1
  29. package/dist/src/commands/config/index.test.d.ts +0 -1
  30. package/dist/src/commands/config/index.test.js +0 -93
  31. package/dist/src/commands/config/index.test.js.map +0 -1
  32. package/dist/src/commands/opengraph/browser.d.ts +0 -3
  33. package/dist/src/commands/opengraph/browser.js +0 -23
  34. package/dist/src/commands/opengraph/browser.js.map +0 -1
  35. package/dist/src/commands/opengraph/browser.test.d.ts +0 -1
  36. package/dist/src/commands/opengraph/browser.test.js +0 -30
  37. package/dist/src/commands/opengraph/browser.test.js.map +0 -1
  38. package/dist/src/commands/opengraph/command.d.ts +0 -30
  39. package/dist/src/commands/opengraph/command.js +0 -41
  40. package/dist/src/commands/opengraph/command.js.map +0 -1
  41. package/dist/src/commands/opengraph/command.test.d.ts +0 -1
  42. package/dist/src/commands/opengraph/command.test.js +0 -68
  43. package/dist/src/commands/opengraph/command.test.js.map +0 -1
  44. package/dist/src/commands/opengraph/html.d.ts +0 -4
  45. package/dist/src/commands/opengraph/html.js +0 -47
  46. package/dist/src/commands/opengraph/html.js.map +0 -1
  47. package/dist/src/commands/opengraph/html.test.d.ts +0 -1
  48. package/dist/src/commands/opengraph/html.test.js +0 -79
  49. package/dist/src/commands/opengraph/html.test.js.map +0 -1
  50. package/dist/src/commands/opengraph/index.d.ts +0 -4
  51. package/dist/src/commands/opengraph/index.js +0 -47
  52. package/dist/src/commands/opengraph/index.js.map +0 -1
  53. package/dist/src/commands/opengraph/index.test.d.ts +0 -1
  54. package/dist/src/commands/opengraph/index.test.js +0 -162
  55. package/dist/src/commands/opengraph/index.test.js.map +0 -1
  56. package/dist/src/commands/opengraph/png.d.ts +0 -3
  57. package/dist/src/commands/opengraph/png.js +0 -26
  58. package/dist/src/commands/opengraph/png.js.map +0 -1
  59. package/dist/src/commands/opengraph/png.test.d.ts +0 -1
  60. package/dist/src/commands/opengraph/png.test.js +0 -50
  61. package/dist/src/commands/opengraph/png.test.js.map +0 -1
  62. package/dist/src/commands/opengraph/svelte.d.ts +0 -7
  63. package/dist/src/commands/opengraph/svelte.js +0 -77
  64. package/dist/src/commands/opengraph/svelte.js.map +0 -1
  65. package/dist/src/commands/opengraph/svelte.test.d.ts +0 -1
  66. package/dist/src/commands/opengraph/svelte.test.js +0 -189
  67. package/dist/src/commands/opengraph/svelte.test.js.map +0 -1
  68. package/dist/src/commands/opengraph/utils.d.ts +0 -8
  69. package/dist/src/commands/opengraph/utils.js +0 -136
  70. package/dist/src/commands/opengraph/utils.js.map +0 -1
  71. package/dist/src/commands/opengraph/utils.test.d.ts +0 -1
  72. package/dist/src/commands/opengraph/utils.test.js +0 -215
  73. package/dist/src/commands/opengraph/utils.test.js.map +0 -1
  74. package/dist/src/commands/sqlite/command.d.ts +0 -8
  75. package/dist/src/commands/sqlite/command.js +0 -16
  76. package/dist/src/commands/sqlite/command.js.map +0 -1
  77. package/dist/src/commands/sqlite/command.test.d.ts +0 -1
  78. package/dist/src/commands/sqlite/command.test.js +0 -42
  79. package/dist/src/commands/sqlite/command.test.js.map +0 -1
  80. package/dist/src/commands/sqlite/database.d.ts +0 -9
  81. package/dist/src/commands/sqlite/database.js +0 -174
  82. package/dist/src/commands/sqlite/database.js.map +0 -1
  83. package/dist/src/commands/sqlite/database.mock.d.ts +0 -24
  84. package/dist/src/commands/sqlite/database.mock.js +0 -58
  85. package/dist/src/commands/sqlite/database.mock.js.map +0 -1
  86. package/dist/src/commands/sqlite/database.test.d.ts +0 -1
  87. package/dist/src/commands/sqlite/database.test.js +0 -211
  88. package/dist/src/commands/sqlite/database.test.js.map +0 -1
  89. package/dist/src/commands/sqlite/index.d.ts +0 -1
  90. package/dist/src/commands/sqlite/index.js +0 -26
  91. package/dist/src/commands/sqlite/index.js.map +0 -1
  92. package/dist/src/commands/sqlite/index.test.d.ts +0 -1
  93. package/dist/src/commands/sqlite/index.test.js +0 -48
  94. package/dist/src/commands/sqlite/index.test.js.map +0 -1
  95. package/dist/src/commands/theme/command.d.ts +0 -13
  96. package/dist/src/commands/theme/command.js +0 -21
  97. package/dist/src/commands/theme/command.js.map +0 -1
  98. package/dist/src/commands/theme/command.test.d.ts +0 -1
  99. package/dist/src/commands/theme/command.test.js +0 -40
  100. package/dist/src/commands/theme/command.test.js.map +0 -1
  101. package/dist/src/commands/theme/index.d.ts +0 -1
  102. package/dist/src/commands/theme/index.js +0 -9
  103. package/dist/src/commands/theme/index.js.map +0 -1
  104. package/dist/src/commands/theme/index.test.d.ts +0 -1
  105. package/dist/src/commands/theme/index.test.js +0 -46
  106. package/dist/src/commands/theme/index.test.js.map +0 -1
  107. package/dist/src/commands/theme/theme.d.ts +0 -4
  108. package/dist/src/commands/theme/theme.js +0 -76
  109. package/dist/src/commands/theme/theme.js.map +0 -1
  110. package/dist/src/commands/theme/theme.test.d.ts +0 -1
  111. package/dist/src/commands/theme/theme.test.js +0 -54
  112. package/dist/src/commands/theme/theme.test.js.map +0 -1
  113. package/dist/src/lib/browser.d.ts +0 -55
  114. package/dist/src/lib/browser.js +0 -52
  115. package/dist/src/lib/browser.js.map +0 -1
  116. package/dist/src/lib/browser.test.d.ts +0 -1
  117. package/dist/src/lib/browser.test.js +0 -67
  118. package/dist/src/lib/browser.test.js.map +0 -1
  119. package/dist/src/lib/config/config.d.ts +0 -9
  120. package/dist/src/lib/config/config.js +0 -56
  121. package/dist/src/lib/config/config.js.map +0 -1
  122. package/dist/src/lib/config/config.test.d.ts +0 -1
  123. package/dist/src/lib/config/config.test.js +0 -71
  124. package/dist/src/lib/config/config.test.js.map +0 -1
  125. package/dist/src/lib/config/config.test.ts +0 -88
  126. package/dist/src/lib/config/config.ts +0 -74
  127. package/dist/src/lib/config/defaults.json +0 -145
  128. package/dist/src/lib/config/defaults.yaml +0 -151
  129. package/dist/src/lib/config/schema.d.ts +0 -172
  130. package/dist/src/lib/config/schema.js +0 -8
  131. package/dist/src/lib/config/schema.js.map +0 -1
  132. package/dist/src/lib/config/schema.json +0 -663
  133. package/dist/src/lib/config/schema.ts +0 -294
  134. package/dist/src/lib/config/user-error.config.yaml +0 -2
  135. package/dist/src/lib/config/user.config.yaml +0 -2
  136. package/dist/src/lib/deep-merge.d.ts +0 -1
  137. package/dist/src/lib/deep-merge.js +0 -27
  138. package/dist/src/lib/deep-merge.js.map +0 -1
  139. package/dist/src/lib/deep-merge.test.d.ts +0 -1
  140. package/dist/src/lib/deep-merge.test.js +0 -29
  141. package/dist/src/lib/deep-merge.test.js.map +0 -1
  142. package/dist/src/lib/lastRun.d.ts +0 -4
  143. package/dist/src/lib/lastRun.js +0 -23
  144. package/dist/src/lib/lastRun.js.map +0 -1
  145. package/dist/src/lib/lastRun.test.d.ts +0 -1
  146. package/dist/src/lib/lastRun.test.js +0 -47
  147. package/dist/src/lib/lastRun.test.js.map +0 -1
  148. package/dist/src/lib/vibrant.d.ts +0 -21
  149. package/dist/src/lib/vibrant.js +0 -78
  150. package/dist/src/lib/vibrant.js.map +0 -1
  151. package/dist/src/lib/vibrant.test.d.ts +0 -1
  152. package/dist/src/lib/vibrant.test.js +0 -164
  153. package/dist/src/lib/vibrant.test.js.map +0 -1
  154. package/dist/src/sdk.d.ts +0 -4
  155. package/dist/src/sdk.js +0 -4
  156. package/dist/src/sdk.js.map +0 -1
  157. package/dist/src/types.d.ts +0 -2
  158. package/dist/src/types.js +0 -2
  159. package/dist/src/types.js.map +0 -1
  160. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,76 +0,0 @@
1
- import { transform } from 'lightningcss';
2
- import { Buffer } from 'buffer';
3
- const createCssVariableBlock = (variables) => {
4
- return Object.keys(variables).map((key) => {
5
- const value = variables[key];
6
- if (typeof value === 'object') {
7
- return createCssVariableBlock(value).join('\n');
8
- }
9
- else {
10
- return ` --${key}: ${value};`;
11
- }
12
- });
13
- };
14
- function minifyCss(css) {
15
- try {
16
- const { code } = transform({
17
- filename: 'theme.css',
18
- code: Buffer.from(css),
19
- minify: true,
20
- });
21
- return code.toString();
22
- }
23
- catch (error) {
24
- console.error('Error minifying CSS with Lightning CSS:', error);
25
- return css;
26
- }
27
- }
28
- const generateThemeCss = (config) => {
29
- const themeConfig = config.theme;
30
- const globalsBlock = createCssVariableBlock(themeConfig.globals).join('\n');
31
- const lightBlock = createCssVariableBlock(themeConfig.light).join('\n');
32
- const darkBlock = createCssVariableBlock(themeConfig.dark).join('\n');
33
- const markdownBlock = createCssVariableBlock(themeConfig.markdown).join('\n');
34
- return `
35
- html {
36
- ${globalsBlock}
37
- ${markdownBlock}
38
- }
39
-
40
- html[data-theme='light'] {
41
- ${lightBlock}
42
- }
43
-
44
- html[data-theme='dark'] {
45
- ${darkBlock}
46
- }
47
-
48
- @font-face {
49
- font-family: ${config.theme.globals['font-sans-name']};
50
- font-optical-sizing: auto;
51
- font-weight: ${config.theme.globals['font-sans-weight']};
52
- font-style: normal;
53
- font-variation-settings: 'wdth' 300;
54
- src: url(${config.theme.globals['font-sans-url']}) format('woff2');
55
- font-display: swap;
56
- }
57
-
58
- @font-face {
59
- font-family: 'Adjusted Sans';
60
- src: local(Dejavu Sans), local(Verdana), sans-serif;
61
- size-adjust: 92%;
62
- }
63
-
64
- html {
65
- font-family: var(--font-sans-name), 'Adjusted Sans';
66
- }
67
-
68
- @media (prefers-color-scheme: dark) {
69
- html:not([data-theme='light']) {
70
- ${darkBlock}
71
- }
72
- }
73
- `;
74
- };
75
- export { generateThemeCss, minifyCss };
76
- //# sourceMappingURL=theme.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../../src/commands/theme/theme.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,sBAAsB,GAAG,CAAC,SAAkC,EAAE,EAAE;IACrE,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAqB,EAAE;QAC5D,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,sBAAsB,CAAC,KAAgC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3E,CAAC;aAAM,CAAC;YACP,OAAO,MAAM,GAAG,KAAK,KAAK,GAAG,CAAA;QAC9B,CAAC;IACF,CAAC,CAAC,CAAA;AACH,CAAC,CAAA;AAED,SAAS,SAAS,CAAC,GAAW;IAC7B,IAAI,CAAC;QACJ,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;YAC1B,QAAQ,EAAE,WAAW;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YACtB,MAAM,EAAE,IAAI;SACZ,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAA;QAC/D,OAAO,GAAG,CAAA;IACX,CAAC;AACF,CAAC;AAED,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,EAAE;IAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAA;IAEhC,MAAM,YAAY,GAAG,sBAAsB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC3E,MAAM,UAAU,GAAG,sBAAsB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACvE,MAAM,SAAS,GAAG,sBAAsB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrE,MAAM,aAAa,GAAG,sBAAsB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7E,OAAO;;EAEN,YAAY;EACZ,aAAa;;;;EAIb,UAAU;;;;EAIV,SAAS;;;;gBAIK,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC;;gBAEtC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC;;;YAG5C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;EAgB/C,SAAS;;;CAGV,CAAA;AACD,CAAC,CAAA;AAED,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAA"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,54 +0,0 @@
1
- import { describe, test, expect, vi } from 'vitest';
2
- import { generateThemeCss, minifyCss } from './theme.js';
3
- import { transform } from 'lightningcss';
4
- vi.mock('lightningcss');
5
- const mocks = {
6
- transform: vi.mocked(transform),
7
- };
8
- describe('generate-theme/theme', () => {
9
- test('should generate theme CSS', () => {
10
- const config = {
11
- url: { app: '', app_assets: '', luzzle_assets: '', editor: '' },
12
- text: { title: '', description: '' },
13
- paths: { database: '' },
14
- content: { block: { root: '', feed: '' } },
15
- pieces: [{ type: 'test', fields: { title: 'test', date_consumed: 'test' } }],
16
- theme: {
17
- globals: {
18
- 'font-sans-name': '"Test Sans"',
19
- 'font-sans-weight': '300 600',
20
- 'font-sans-url': '"/test.woff2"',
21
- },
22
- light: {
23
- 'colors-primary': '#000000',
24
- },
25
- dark: {
26
- 'colors-primary': '#ffffff',
27
- },
28
- markdown: {
29
- code: {
30
- light: 'github-light',
31
- dark: 'github-dark',
32
- },
33
- sidenote: {}
34
- },
35
- },
36
- };
37
- const css = generateThemeCss(config);
38
- expect(css).toContain('--font-sans-name: "Test Sans";');
39
- expect(css).toContain('--colors-primary: #000000;');
40
- expect(css).toContain('--colors-primary: #ffffff;');
41
- });
42
- test('should handle errors during CSS minification', () => {
43
- const originalCss = 'body { color: red; }';
44
- mocks.transform.mockImplementation(() => {
45
- throw new Error('Minification failed');
46
- });
47
- const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
48
- const minifiedCss = minifyCss(originalCss);
49
- expect(minifiedCss).toEqual(originalCss);
50
- expect(consoleErrorSpy).toHaveBeenCalledWith('Error minifying CSS with Lightning CSS:', expect.any(Error));
51
- consoleErrorSpy.mockRestore();
52
- });
53
- });
54
- //# sourceMappingURL=theme.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme.test.js","sourceRoot":"","sources":["../../../../src/commands/theme/theme.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;AAEvB,MAAM,KAAK,GAAG;IACb,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC;CAC/B,CAAA;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACrC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG;YACd,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAC/D,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;YACpC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YACvB,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;YAC1C,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC;YAC5E,KAAK,EAAE;gBACN,OAAO,EAAE;oBACR,gBAAgB,EAAE,aAAa;oBAC/B,kBAAkB,EAAE,SAAS;oBAC7B,eAAe,EAAE,eAAe;iBAChC;gBACD,KAAK,EAAE;oBACN,gBAAgB,EAAE,SAAS;iBAC3B;gBACD,IAAI,EAAE;oBACL,gBAAgB,EAAE,SAAS;iBAC3B;gBACD,QAAQ,EAAE;oBACT,IAAI,EAAE;wBACL,KAAK,EAAE,cAAc;wBACrB,IAAI,EAAE,aAAa;qBACnB;oBACD,QAAQ,EAAE,EACT;iBACD;aACD;SACS,CAAA;QAEX,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;QAEpC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAA;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;QACnD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACzD,MAAM,WAAW,GAAG,sBAAsB,CAAA;QAC1C,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QACF,MAAM,eAAe,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QAEhF,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC,CAAA;QAE1C,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QACxC,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAC3C,yCAAyC,EACzC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CACjB,CAAA;QACD,eAAe,CAAC,WAAW,EAAE,CAAA;IAC9B,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -1,55 +0,0 @@
1
- import { WebPieces } from "../types.js";
2
- import { Component } from "svelte";
3
- declare const ASSET_IMAGE_MATCHER: RegExp;
4
- declare const ASSET_PATH_MATCHER: RegExp;
5
- declare const OpengraphImageWidth = 1200;
6
- declare const OpengraphImageHeight = 630;
7
- declare const ASSET_SIZES: {
8
- readonly s: 125;
9
- readonly m: 250;
10
- readonly l: 500;
11
- readonly xl: 1000;
12
- };
13
- declare function getOpenGraphPath(type: string, id: string): string;
14
- declare function isImage(asset: string): boolean;
15
- declare function getAssetDir(type: string, id: string): string;
16
- declare function widthToSize(minWidth: number): keyof typeof ASSET_SIZES;
17
- declare function getImageAssetPath(type: string, id: string, asset: string, width: number, format: 'jpg' | 'avif'): string;
18
- declare function getAssetPath(type: string, id: string, asset: string): string;
19
- type PieceIconProps = {
20
- piece: WebPieces & {
21
- frontmatter: Record<string, unknown>;
22
- tags: string[];
23
- };
24
- size: {
25
- width: number;
26
- height: number;
27
- };
28
- lazy?: boolean;
29
- helpers: PieceComponentHelpers;
30
- };
31
- type PieceIconPalette = {
32
- accent: string;
33
- background: string;
34
- bodyText: string;
35
- muted: string;
36
- titleText: string;
37
- };
38
- type PieceComponentHelpers = {
39
- getPieceUrl: () => string;
40
- getPieceImageUrl: (image: string, minWidth: number, format: 'jpg' | 'avif') => string;
41
- };
42
- type PieceOpengraphProps = {
43
- Icon?: Component<PieceIconProps>;
44
- piece: WebPieces & {
45
- frontmatter: Record<string, unknown>;
46
- tags: string[];
47
- };
48
- size: {
49
- width: number;
50
- height: number;
51
- };
52
- palette?: PieceIconPalette;
53
- helpers: PieceComponentHelpers;
54
- };
55
- export { getOpenGraphPath, isImage, getAssetDir, widthToSize, getImageAssetPath, getAssetPath, ASSET_SIZES, ASSET_IMAGE_MATCHER, ASSET_PATH_MATCHER, OpengraphImageWidth, OpengraphImageHeight, type PieceIconProps, type PieceOpengraphProps, type PieceIconPalette, type PieceComponentHelpers, };
@@ -1,52 +0,0 @@
1
- const ASSET_IMAGE_MATCHER = /\.(jpg|jpeg|png|webp|avif|gif)$/i;
2
- const ASSET_PATH_MATCHER = /^(?:.*[\\/])?(([^/\\]+?)(?:\.([^.]+))?)$/;
3
- const OpengraphImageWidth = 1200;
4
- const OpengraphImageHeight = 630;
5
- const ASSET_SIZES = {
6
- s: 125,
7
- m: 250,
8
- l: 500,
9
- xl: 1000,
10
- };
11
- function getOpenGraphPath(type, id) {
12
- return `${type}/${id}/opengraph.png`;
13
- }
14
- function isImage(asset) {
15
- const match = asset.match(ASSET_PATH_MATCHER);
16
- const filename = match ? match[1] : asset;
17
- return ASSET_IMAGE_MATCHER.test(filename);
18
- }
19
- function getAssetDir(type, id) {
20
- return `${type}/${id}`;
21
- }
22
- function widthToSize(minWidth) {
23
- if (minWidth <= ASSET_SIZES.s) {
24
- return 's';
25
- }
26
- else if (minWidth <= ASSET_SIZES.m) {
27
- return 'm';
28
- }
29
- else if (minWidth <= ASSET_SIZES.l) {
30
- return 'l';
31
- }
32
- else {
33
- return 'xl';
34
- }
35
- }
36
- function getImageAssetPath(type, id, asset, width, format) {
37
- const match = asset.match(ASSET_PATH_MATCHER);
38
- const filename = match ? match[1] : asset;
39
- const basename = match ? match[2] : filename;
40
- const dir = getAssetDir(type, id);
41
- const size = widthToSize(width);
42
- return `${dir}/${basename}.${size}.${format}`;
43
- }
44
- function getAssetPath(type, id, asset) {
45
- const dir = getAssetDir(type, id);
46
- const match = asset.match(ASSET_PATH_MATCHER);
47
- /* v8 ignore next */
48
- const filename = match ? match[1] : asset;
49
- return `${dir}/${filename}`;
50
- }
51
- export { getOpenGraphPath, isImage, getAssetDir, widthToSize, getImageAssetPath, getAssetPath, ASSET_SIZES, ASSET_IMAGE_MATCHER, ASSET_PATH_MATCHER, OpengraphImageWidth, OpengraphImageHeight, };
52
- //# sourceMappingURL=browser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/lib/browser.ts"],"names":[],"mappings":"AAGA,MAAM,mBAAmB,GAAG,kCAAkC,CAAA;AAC9D,MAAM,kBAAkB,GAAG,0CAA0C,CAAA;AACrE,MAAM,mBAAmB,GAAG,IAAI,CAAA;AAChC,MAAM,oBAAoB,GAAG,GAAG,CAAA;AAChC,MAAM,WAAW,GAAG;IACnB,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,EAAE,EAAE,IAAI;CACC,CAAA;AAEV,SAAS,gBAAgB,CAAC,IAAY,EAAE,EAAU;IACjD,OAAO,GAAG,IAAI,IAAI,EAAE,gBAAgB,CAAA;AACrC,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACzC,OAAO,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAC1C,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,EAAU;IAC5C,OAAO,GAAG,IAAI,IAAI,EAAE,EAAE,CAAA;AACvB,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB;IACpC,IAAI,QAAQ,IAAI,WAAW,CAAC,CAAC,EAAE,CAAC;QAC/B,OAAO,GAAG,CAAA;IACX,CAAC;SAAM,IAAI,QAAQ,IAAI,WAAW,CAAC,CAAC,EAAE,CAAC;QACtC,OAAO,GAAG,CAAA;IACX,CAAC;SAAM,IAAI,QAAQ,IAAI,WAAW,CAAC,CAAC,EAAE,CAAC;QACtC,OAAO,GAAG,CAAA;IACX,CAAC;SAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CACzB,IAAY,EACZ,EAAU,EACV,KAAa,EACb,KAAa,EACb,MAAsB;IAEtB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IAC5C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACjC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;IAE/B,OAAO,GAAG,GAAG,IAAI,QAAQ,IAAI,IAAI,IAAI,MAAM,EAAE,CAAA;AAC9C,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,EAAU,EAAE,KAAa;IAC5D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAC7C,oBAAoB;IACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAEzC,OAAO,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAA;AAC5B,CAAC;AAoCD,OAAO,EACN,gBAAgB,EAChB,OAAO,EACP,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GAKpB,CAAA"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,67 +0,0 @@
1
- import { describe, test, expect } from 'vitest';
2
- import { getImageAssetPath, isImage, getAssetPath, getAssetDir, getOpenGraphPath, } from './browser.js';
3
- describe('src/commands/assets/utils', () => {
4
- test('should return the path to the asset directory', () => {
5
- const path = getAssetDir('books', '1');
6
- expect(path).toBe('books/1');
7
- });
8
- test('should return the path to the variant for size s', () => {
9
- const path = getImageAssetPath('books', '1', 'image.jpg', 100, 'jpg');
10
- expect(path).toBe('books/1/image.s.jpg');
11
- });
12
- test('should return the path to the variant for size m', () => {
13
- const path = getImageAssetPath('books', '1', 'image.jpg', 200, 'jpg');
14
- expect(path).toBe('books/1/image.m.jpg');
15
- });
16
- test('should return the path to the variant for size l', () => {
17
- const path = getImageAssetPath('books', '1', 'image.jpg', 350, 'jpg');
18
- expect(path).toBe('books/1/image.l.jpg');
19
- });
20
- test('should return the path to the variant for size xl', () => {
21
- const path = getImageAssetPath('books', '1', 'image.jpg', 600, 'jpg');
22
- expect(path).toBe('books/1/image.xl.jpg');
23
- });
24
- test('should return the path to the variant for size xl when width is larger than 1000', () => {
25
- const path = getImageAssetPath('books', '1', 'image.jpg', 1200, 'jpg');
26
- expect(path).toBe('books/1/image.xl.jpg');
27
- });
28
- test('should return the path to the variant with avif format', () => {
29
- const path = getImageAssetPath('books', '1', 'image.jpg', 350, 'avif');
30
- expect(path).toBe('books/1/image.l.avif');
31
- });
32
- test('should return false if the asset is not an image', () => {
33
- expect(isImage('document.pdf')).toBe(false);
34
- });
35
- test('should return true if the asset is an image', () => {
36
- expect(isImage('image.jpg')).toBe(true);
37
- expect(isImage('image.jpeg')).toBe(true);
38
- expect(isImage('image.png')).toBe(true);
39
- expect(isImage('image.webp')).toBe(true);
40
- expect(isImage('image.avif')).toBe(true);
41
- expect(isImage('image.gif')).toBe(true);
42
- });
43
- test('should return false if the asset has no extension', () => {
44
- expect(isImage('image')).toBe(false);
45
- });
46
- test('isImage should handle asset without matching path', () => {
47
- expect(isImage('')).toBe(false);
48
- expect(isImage('invalid-asset-name')).toBe(false);
49
- });
50
- test('getImageAssetPath should handle asset without matching path', () => {
51
- const path = getImageAssetPath('books', '1', '', 350, 'jpg');
52
- expect(path).toBe('books/1/.l.jpg');
53
- const path2 = getImageAssetPath('books', '1', 'invalid-asset-name', 350, 'jpg');
54
- expect(path2).toBe('books/1/invalid-asset-name.l.jpg');
55
- });
56
- describe('getOpenGraphPath', () => {
57
- test('should return the correct opengraph path', () => {
58
- const path = getOpenGraphPath('post', '123');
59
- expect(path).toBe('post/123/opengraph.png');
60
- });
61
- });
62
- test('getAssetPath should handle asset with matching path', () => {
63
- const path = getAssetPath('books', '1', '/path/to/asset.jpg');
64
- expect(path).toBe('books/1/asset.jpg');
65
- });
66
- });
67
- //# sourceMappingURL=browser.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser.test.js","sourceRoot":"","sources":["../../../src/lib/browser.test.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import { type Schema as Config } from './schema.js';
2
- export type ConfigPublic = {
3
- url: Pick<Config['url'], 'app' | 'luzzle_assets' | 'app_assets'>;
4
- text: Config['text'];
5
- };
6
- declare function loadConfig(userConfigPath?: string): Config;
7
- declare function getConfigValue(obj: Config, path: string): unknown;
8
- declare function setConfigValue(obj: Config, path: string, value: unknown): void;
9
- export { loadConfig, getConfigValue, setConfigValue, type Config };
@@ -1,56 +0,0 @@
1
- import { readFileSync, existsSync } from 'fs';
2
- import { parse as yamlParse } from 'yaml';
3
- import { Ajv } from 'ajv';
4
- import { deepMerge } from '../deep-merge.js';
5
- import defaults from './defaults.json' with { type: 'json' };
6
- import schemaJson from './schema.json' with { type: 'json' };
7
- function loadConfig(userConfigPath) {
8
- const schema = schemaJson;
9
- const config = defaults;
10
- const ajv = new Ajv();
11
- const validate = ajv.compile(schema);
12
- config.paths.config = userConfigPath;
13
- if (userConfigPath) {
14
- if (existsSync(userConfigPath)) {
15
- const userConfig = yamlParse(readFileSync(userConfigPath, 'utf8'));
16
- const mergedConfig = deepMerge(config, userConfig);
17
- if (!validate(mergedConfig)) {
18
- throw new Error(`Configuration validation failed: ${ajv.errorsText(validate.errors)}`);
19
- }
20
- return mergedConfig;
21
- }
22
- else {
23
- /* v8 ignore start */
24
- console.warn(`User config file not found at: ${userConfigPath}`);
25
- /* v8 ignore stop */
26
- }
27
- }
28
- /* v8 ignore start */
29
- if (!validate(config)) {
30
- throw new Error(`Configuration validation failed: ${ajv.errorsText(validate.errors)}`);
31
- }
32
- /* v8 ignore stop */
33
- return config;
34
- }
35
- function getConfigValue(obj, path) {
36
- return path.split('.').reduce((acc, key) => {
37
- if (acc && typeof acc === 'object' && key in acc) {
38
- return acc[key];
39
- }
40
- return undefined;
41
- }, obj);
42
- }
43
- function setConfigValue(obj, path, value) {
44
- const keys = path.split('.');
45
- const lastKey = keys.pop();
46
- let current = obj;
47
- for (const key of keys) {
48
- if (typeof current[key] !== 'object' || current[key] === null) {
49
- current[key] = {};
50
- }
51
- current = current[key];
52
- }
53
- current[lastKey] = value;
54
- }
55
- export { loadConfig, getConfigValue, setConfigValue };
56
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/lib/config/config.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,71 +0,0 @@
1
- import { describe, expect, test } from 'vitest';
2
- import { loadConfig, getConfigValue, setConfigValue } from './config.js';
3
- describe('lib/config/config', () => {
4
- test('should validate default config against schema', async () => {
5
- try {
6
- const config = loadConfig();
7
- expect(config).toBeDefined();
8
- }
9
- catch (e) {
10
- if (e) {
11
- expect(e).toBeUndefined();
12
- }
13
- }
14
- });
15
- test('should load a user config', () => {
16
- const config = loadConfig(`${import.meta.dirname}/user.config.yaml`);
17
- expect(config).toBeDefined();
18
- });
19
- test('should load a user config', () => {
20
- const config = loadConfig(`${import.meta.dirname}/not.user.config.yaml`);
21
- expect(config).toBeDefined();
22
- });
23
- test('should throw an error if config validation fails with user config', () => {
24
- expect(() => loadConfig(`${import.meta.dirname}/user-error.config.yaml`)).toThrow('Configuration validation failed');
25
- });
26
- describe('getConfigValue', () => {
27
- test('should return the correct value for a given path', () => {
28
- const config = {
29
- a: {
30
- b: {
31
- c: 'value'
32
- }
33
- }
34
- };
35
- const value = getConfigValue(config, 'a.b.c');
36
- expect(value).toBe('value');
37
- });
38
- test('should return undefined for a non-existent path', () => {
39
- const config = {
40
- a: {
41
- b: {
42
- c: 'value'
43
- }
44
- }
45
- };
46
- const value = getConfigValue(config, 'a.b.d');
47
- expect(value).toBeUndefined();
48
- });
49
- });
50
- describe('setConfigValue', () => {
51
- test('should correctly set a value at a given path', () => {
52
- const config = {
53
- a: {
54
- b: {
55
- c: 'value'
56
- }
57
- }
58
- };
59
- setConfigValue(config, 'a.b.c', 'new-value');
60
- expect(config.a.b.c).toBe('new-value');
61
- });
62
- test('should create intermediate objects if they don\'t exist', () => {
63
- const config = {
64
- a: {}
65
- };
66
- setConfigValue(config, 'a.b.c', 'value');
67
- expect(config.a.b.c).toBe('value');
68
- });
69
- });
70
- });
71
- //# sourceMappingURL=config.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../../../src/lib/config/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAU,MAAM,aAAa,CAAA;AAUhF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAClC,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAChE,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;YAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;QAC7B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC;gBACP,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;YAC1B,CAAC;QACF,CAAC;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,mBAAmB,CAAC,CAAA;QACpE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,uBAAuB,CAAC,CAAA;QACxE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC9E,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,OAAO,CAChF,iCAAiC,CACjC,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC/B,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC7D,MAAM,MAAM,GAAG;gBACd,CAAC,EAAE;oBACF,CAAC,EAAE;wBACF,CAAC,EAAE,OAAO;qBACV;iBACD;aACwB,CAAA;YAC1B,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;YAC5D,MAAM,MAAM,GAAG;gBACd,CAAC,EAAE;oBACF,CAAC,EAAE;wBACF,CAAC,EAAE,OAAO;qBACV;iBACD;aACwB,CAAA;YAC1B,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAA;QAC9B,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC/B,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACzD,MAAM,MAAM,GAAG;gBACd,CAAC,EAAE;oBACF,CAAC,EAAE;wBACF,CAAC,EAAE,OAAO;qBACV;iBACD;aACwB,CAAA;YAC1B,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;YAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACpE,MAAM,MAAM,GAAG;gBACd,CAAC,EAAE,EAAE;aACoB,CAAA;YAC1B,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;YACxC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -1,88 +0,0 @@
1
- import { describe, expect, test } from 'vitest'
2
- import { loadConfig, getConfigValue, setConfigValue, Config } from './config.js'
3
-
4
- interface TestConfig extends Config {
5
- a: {
6
- b: {
7
- c: string
8
- }
9
- }
10
- }
11
-
12
- describe('lib/config/config', () => {
13
- test('should validate default config against schema', async () => {
14
- try {
15
- const config = loadConfig()
16
- expect(config).toBeDefined()
17
- } catch (e) {
18
- if (e) {
19
- expect(e).toBeUndefined()
20
- }
21
- }
22
- })
23
-
24
- test('should load a user config', () => {
25
- const config = loadConfig(`${import.meta.dirname}/user.config.yaml`)
26
- expect(config).toBeDefined()
27
- })
28
-
29
- test('should load a user config', () => {
30
- const config = loadConfig(`${import.meta.dirname}/not.user.config.yaml`)
31
- expect(config).toBeDefined()
32
- })
33
-
34
- test('should throw an error if config validation fails with user config', () => {
35
- expect(() => loadConfig(`${import.meta.dirname}/user-error.config.yaml`)).toThrow(
36
- 'Configuration validation failed'
37
- )
38
- })
39
-
40
- describe('getConfigValue', () => {
41
- test('should return the correct value for a given path', () => {
42
- const config = {
43
- a: {
44
- b: {
45
- c: 'value'
46
- }
47
- }
48
- } as unknown as TestConfig
49
- const value = getConfigValue(config, 'a.b.c')
50
- expect(value).toBe('value')
51
- })
52
-
53
- test('should return undefined for a non-existent path', () => {
54
- const config = {
55
- a: {
56
- b: {
57
- c: 'value'
58
- }
59
- }
60
- } as unknown as TestConfig
61
- const value = getConfigValue(config, 'a.b.d')
62
- expect(value).toBeUndefined()
63
- })
64
- })
65
-
66
- describe('setConfigValue', () => {
67
- test('should correctly set a value at a given path', () => {
68
- const config = {
69
- a: {
70
- b: {
71
- c: 'value'
72
- }
73
- }
74
- } as unknown as TestConfig
75
- setConfigValue(config, 'a.b.c', 'new-value')
76
- expect(config.a.b.c).toBe('new-value')
77
- })
78
-
79
- test('should create intermediate objects if they don\'t exist', () => {
80
- const config = {
81
- a: {}
82
- } as unknown as TestConfig
83
- setConfigValue(config, 'a.b.c', 'value')
84
- expect(config.a.b.c).toBe('value')
85
- })
86
- })
87
- })
88
-
@@ -1,74 +0,0 @@
1
- import { readFileSync, existsSync } from 'fs'
2
- import { parse as yamlParse } from 'yaml'
3
- import { Ajv } from 'ajv'
4
- import { deepMerge } from '../deep-merge.js'
5
- import { type Schema as Config } from './schema.js'
6
- import defaults from './defaults.json' with { type: 'json' }
7
- import schemaJson from './schema.json' with { type: 'json' }
8
-
9
- export type ConfigPublic = {
10
- url: Pick<Config['url'], 'app' | 'luzzle_assets' | 'app_assets'>
11
- text: Config['text']
12
- }
13
-
14
- function loadConfig(userConfigPath?: string): Config {
15
- const schema = schemaJson
16
- const config = defaults as Config
17
- const ajv = new Ajv()
18
- const validate = ajv.compile(schema)
19
-
20
- config.paths.config = userConfigPath
21
-
22
- if (userConfigPath) {
23
- if (existsSync(userConfigPath)) {
24
- const userConfig = yamlParse(readFileSync(userConfigPath, 'utf8')) as Partial<Config>
25
- const mergedConfig = deepMerge(config, userConfig) as Config
26
-
27
- if (!validate(mergedConfig)) {
28
- throw new Error(`Configuration validation failed: ${ajv.errorsText(validate.errors)}`)
29
- }
30
-
31
- return mergedConfig
32
- } else {
33
- /* v8 ignore start */
34
- console.warn(`User config file not found at: ${userConfigPath}`)
35
- /* v8 ignore stop */
36
- }
37
- }
38
-
39
- /* v8 ignore start */
40
- if (!validate(config)) {
41
- throw new Error(`Configuration validation failed: ${ajv.errorsText(validate.errors)}`)
42
- }
43
- /* v8 ignore stop */
44
-
45
- return config
46
- }
47
-
48
- function getConfigValue(obj: Config, path: string): unknown {
49
- return path.split('.').reduce(
50
- (acc, key) => {
51
- if (acc && typeof acc === 'object' && key in acc) {
52
- return acc[key] as Record<string, unknown>
53
- }
54
- return undefined
55
- },
56
- obj as unknown as undefined | Record<string, unknown>
57
- )
58
- }
59
-
60
- function setConfigValue(obj: Config, path: string, value: unknown): void {
61
- const keys = path.split('.')
62
- const lastKey = keys.pop()!
63
- let current: Record<string, unknown> = obj as unknown as Record<string, unknown>
64
-
65
- for (const key of keys) {
66
- if (typeof current[key] !== 'object' || current[key] === null) {
67
- current[key] = {}
68
- }
69
- current = current[key] as Record<string, unknown>
70
- }
71
- current[lastKey] = value
72
- }
73
-
74
- export { loadConfig, getConfigValue, setConfigValue, type Config }