@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,136 +0,0 @@
1
- import path from 'path';
2
- import * as cheerio from 'cheerio';
3
- import { OpengraphImageHeight, OpengraphImageWidth, } from '@luzzle/web.utils';
4
- import { getPalette } from '@luzzle/web.utils/server';
5
- async function getProps(piece, Icon, pieces, config) {
6
- const props = {
7
- Icon: Icon || undefined,
8
- piece: piece,
9
- metadata: JSON.parse(piece.json_metadata || '{}'),
10
- tags: JSON.parse(piece.keywords || '[]'),
11
- size: {
12
- width: OpengraphImageWidth,
13
- height: OpengraphImageHeight,
14
- },
15
- helpers: getHelpers(piece, config),
16
- };
17
- if (piece.media) {
18
- const imageBuffer = await pieces.getPieceAsset(piece.media);
19
- const palette = (await getPalette(imageBuffer));
20
- return {
21
- ...props,
22
- palette,
23
- };
24
- }
25
- return props;
26
- }
27
- async function luzzleImageUrlToBase64(url, pieces) {
28
- const srcPath = url.replace('luzzle://', '').trim();
29
- const ext = path.extname(srcPath).slice(1);
30
- const newSrc = await pieces.getPieceAsset(srcPath);
31
- return bufferToBase64(newSrc, 'image', ext);
32
- }
33
- async function replaceAsync(str, regex, asyncFn) {
34
- const matches = Array.from(str.matchAll(regex));
35
- const replacements = await Promise.all(matches.map((match) => asyncFn(match[0], ...match.slice(1))));
36
- let result = '';
37
- let lastIndex = 0;
38
- matches.forEach((match, index) => {
39
- result += str.substring(lastIndex, match.index);
40
- result += replacements[index];
41
- lastIndex = (match.index || 0) + match[0].length;
42
- });
43
- result += str.substring(lastIndex);
44
- return result;
45
- }
46
- async function findAndReplaceLuzzleUrls(html, pieces) {
47
- const $ = cheerio.load(html);
48
- const tasks = [];
49
- $('img').each((_, el) => {
50
- const $el = $(el);
51
- const src = $el.attr('src');
52
- if (src && src.startsWith('luzzle://')) {
53
- const task = (async () => {
54
- const base64 = await luzzleImageUrlToBase64(src, pieces);
55
- $el.attr('src', base64);
56
- })();
57
- tasks.push(task);
58
- }
59
- });
60
- $('img[srcset], picture source[srcset]').each((_, el) => {
61
- const $el = $(el);
62
- const srcset = $el.attr('srcset');
63
- if (srcset) {
64
- const task = (async () => {
65
- const sourcePromises = srcset.split(',').map(async (source) => {
66
- const [url, ...descriptors] = source.trim().split(/\s+/);
67
- if (url && url.startsWith('luzzle://')) {
68
- const base64 = await luzzleImageUrlToBase64(url, pieces);
69
- return [base64, ...descriptors].join(' ');
70
- }
71
- return source;
72
- });
73
- const newSources = await Promise.all(sourcePromises);
74
- $el.attr('srcset', newSources.join(', '));
75
- })();
76
- tasks.push(task);
77
- }
78
- });
79
- const urlRegex = /url\((['"]?\s*)(.*?)\1\)/g;
80
- $('style').each((_, el) => {
81
- const $el = $(el);
82
- const styleContent = $el.html(); // Get the raw text content of the style tag
83
- if (styleContent) {
84
- const task = (async () => {
85
- const newStyleContent = await replaceAsync(styleContent, urlRegex, async (_, quote, url) => {
86
- if (url.startsWith('luzzle://')) {
87
- const base64 = await luzzleImageUrlToBase64(url, pieces);
88
- return `url(${quote}${base64}${quote})`;
89
- }
90
- return `url(${quote}${url}${quote})`;
91
- });
92
- $el.html(newStyleContent); // Set the modified CSS back
93
- })();
94
- tasks.push(task);
95
- }
96
- });
97
- $('[style*="url("]').each((_, el) => {
98
- const $el = $(el);
99
- const style = $el.attr('style');
100
- if (style) {
101
- const task = (async () => {
102
- const newStyle = await replaceAsync(style, urlRegex, async (_, quote, url) => {
103
- if (url.startsWith('luzzle://')) {
104
- const base64 = await luzzleImageUrlToBase64(url, pieces);
105
- return `url(${quote}${base64}${quote})`;
106
- }
107
- return `url(${quote}${url}${quote})`;
108
- });
109
- $el.attr('style', newStyle);
110
- })();
111
- tasks.push(task);
112
- }
113
- });
114
- await Promise.all(tasks);
115
- return $.html();
116
- }
117
- function bufferToBase64(buffer, type, format) {
118
- const base64 = buffer.toString('base64');
119
- return `data:${type}/${format};base64,${base64}`;
120
- }
121
- function getHelpers(item, config) {
122
- return {
123
- getPieceUrl: function () {
124
- return `${config.url.app}/pieces/${item.type}/${item.slug}`;
125
- },
126
- getPieceImageUrl: function (image,
127
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
128
- _minWidth,
129
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
130
- _format) {
131
- return `luzzle://${image}`;
132
- },
133
- };
134
- }
135
- export { getProps, findAndReplaceLuzzleUrls, bufferToBase64, replaceAsync };
136
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/commands/opengraph/utils.ts"],"names":[],"mappings":"AAEA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,EACN,oBAAoB,EACpB,mBAAmB,GAOnB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAErD,KAAK,UAAU,QAAQ,CACtB,KAAgB,EAChB,IAAsC,EACtC,MAAc,EACd,MAAc;IAEd,MAAM,KAAK,GAAG;QACb,IAAI,EAAE,IAAI,IAAI,SAAS;QACvB,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAA4B;QAC5E,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAa;QACpD,IAAI,EAAE;YACL,KAAK,EAAE,mBAAmB;YAC1B,MAAM,EAAE,oBAAoB;SAC5B;QACD,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC;KAClC,CAAA;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC3D,MAAM,OAAO,GAAG,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,CAAqB,CAAA;QAEnE,OAAO;YACN,GAAG,KAAK;YACR,OAAO;SACP,CAAA;IACF,CAAC;IAED,OAAO,KAAK,CAAA;AACb,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,GAAW,EAAE,MAAc;IAChE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IAClD,OAAO,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;AAC5C,CAAC;AAED,KAAK,UAAU,YAAY,CAC1B,GAAW,EACX,KAAa,EACb,OAA8D;IAE9D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;IAC/C,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACrC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAC5D,CAAA;IAED,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAChC,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;QAC/C,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,CAAA;QAC7B,SAAS,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAClC,OAAO,MAAM,CAAA;AACd,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,IAAY,EAAE,MAAc;IACnE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,KAAK,GAAoB,EAAE,CAAA;IAEjC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QACvB,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAA;QACjB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3B,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;gBACxB,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;gBACxD,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YACxB,CAAC,CAAC,EAAE,CAAA;YACJ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjB,CAAC;IACF,CAAC,CAAC,CAAA;IAEF,CAAC,CAAC,qCAAqC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QACvD,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAA;QACjB,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAEjC,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;gBACxB,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAC7D,MAAM,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;oBAExD,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wBACxC,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;wBACxD,OAAO,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBAC1C,CAAC;oBAED,OAAO,MAAM,CAAA;gBACd,CAAC,CAAC,CAAA;gBAEF,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;gBACpD,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;YAC1C,CAAC,CAAC,EAAE,CAAA;YACJ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjB,CAAC;IACF,CAAC,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,2BAA2B,CAAA;IAE5C,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAA;QACjB,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA,CAAC,4CAA4C;QAE5E,IAAI,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;gBACxB,MAAM,eAAe,GAAG,MAAM,YAAY,CACzC,YAAY,EACZ,QAAQ,EACR,KAAK,EAAE,CAAS,EAAE,KAAa,EAAE,GAAW,EAAE,EAAE;oBAC/C,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wBACjC,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;wBACxD,OAAO,OAAO,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,CAAA;oBACxC,CAAC;oBACD,OAAO,OAAO,KAAK,GAAG,GAAG,GAAG,KAAK,GAAG,CAAA;gBACrC,CAAC,CACD,CAAA;gBACD,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA,CAAC,4BAA4B;YACvD,CAAC,CAAC,EAAE,CAAA;YACJ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjB,CAAC;IACF,CAAC,CAAC,CAAA;IAEF,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QACnC,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAA;QACjB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAE/B,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;gBACxB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAClC,KAAK,EACL,QAAQ,EACR,KAAK,EAAE,CAAS,EAAE,KAAa,EAAE,GAAW,EAAE,EAAE;oBAC/C,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wBACjC,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;wBACxD,OAAO,OAAO,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,CAAA;oBACxC,CAAC;oBACD,OAAO,OAAO,KAAK,GAAG,GAAG,GAAG,KAAK,GAAG,CAAA;gBACrC,CAAC,CACD,CAAA;gBACD,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;YAC5B,CAAC,CAAC,EAAE,CAAA;YACJ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjB,CAAC;IACF,CAAC,CAAC,CAAA;IAEF,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACxB,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,IAAY,EAAE,MAAc;IACnE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACxC,OAAO,QAAQ,IAAI,IAAI,MAAM,WAAW,MAAM,EAAE,CAAA;AACjD,CAAC;AAED,SAAS,UAAU,CAAC,IAAe,EAAE,MAAc;IAClD,OAAO;QACN,WAAW,EAAE;YACZ,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAA;QAC5D,CAAC;QACD,gBAAgB,EAAE,UACjB,KAAa;QACb,6DAA6D;QAC7D,SAAiB;QACjB,6DAA6D;QAC7D,OAAuB;YAEvB,OAAO,YAAY,KAAK,EAAE,CAAA;QAC3B,CAAC;KACD,CAAA;AACF,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,wBAAwB,EAAE,cAAc,EAAE,YAAY,EAAE,CAAA"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,215 +0,0 @@
1
- import { describe, test, expect, vi, afterEach } from 'vitest';
2
- import { getProps, findAndReplaceLuzzleUrls, bufferToBase64, replaceAsync } from './utils.js';
3
- import { Pieces } from '@luzzle/cli';
4
- import { Vibrant } from 'node-vibrant/node';
5
- import Sharp from 'sharp';
6
- import path from 'path';
7
- import * as cheerio from 'cheerio';
8
- import { getPalette } from '@luzzle/web.utils/server';
9
- vi.mock('@luzzle/cli');
10
- vi.mock('path');
11
- vi.mock('@luzzle/web.utils/server');
12
- const mocks = {
13
- Pieces: vi.mocked(Pieces),
14
- Vibrant: vi.mocked(Vibrant),
15
- Sharp: vi.mocked(Sharp),
16
- pathExtname: vi.spyOn(path, 'extname'),
17
- getPalette: vi.mocked(getPalette),
18
- };
19
- describe('src/commands/opengraph/utils', () => {
20
- afterEach(() => {
21
- vi.clearAllMocks();
22
- });
23
- describe('getProps', () => {
24
- test('should return opengraph props with correct data', async () => {
25
- const mockItem = {
26
- json_metadata: '{"title": "Test Title"}',
27
- keywords: '["tag1", "tag2"]',
28
- type: 'book',
29
- slug: 'test-book',
30
- };
31
- const mockIcon = {};
32
- const mockPieces = {};
33
- const mockConfig = {
34
- url: { app: 'http://localhost' },
35
- };
36
- const props = await getProps(mockItem, mockIcon, mockPieces, mockConfig);
37
- expect(props.metadata).toEqual({ title: 'Test Title' });
38
- expect(props.tags).toEqual(['tag1', 'tag2']);
39
- expect(props.size).toEqual({ width: 1200, height: 630 });
40
- expect(props.helpers.getPieceUrl()).toBe('http://localhost/pieces/book/test-book');
41
- expect(props.helpers.getPieceImageUrl('image.jpg', 100, 'jpg')).toBe('luzzle://image.jpg');
42
- });
43
- test('should return opengraph props with initial JSON parse data', async () => {
44
- const mockItem = {
45
- type: 'book',
46
- slug: 'test-book',
47
- };
48
- const mockIcon = {};
49
- const mockPieces = {};
50
- const mockConfig = {
51
- url: { app: 'http://localhost' },
52
- };
53
- const props = await getProps(mockItem, mockIcon, mockPieces, mockConfig);
54
- expect(props.metadata).toEqual({});
55
- expect(props.tags).toEqual([]);
56
- expect(props.size).toEqual({ width: 1200, height: 630 });
57
- expect(props.helpers.getPieceUrl()).toBe('http://localhost/pieces/book/test-book');
58
- expect(props.helpers.getPieceImageUrl('image.jpg', 100, 'jpg')).toBe('luzzle://image.jpg');
59
- });
60
- test('should return opengraph props with palette', async () => {
61
- const mockItem = {
62
- type: 'book',
63
- slug: 'test-book',
64
- media: 'media-id',
65
- };
66
- const mockIcon = {};
67
- const mockPieces = {
68
- getPieceAsset: vi.fn().mockResolvedValue(Buffer.from('image_data')),
69
- };
70
- const mockConfig = {
71
- url: { app: 'http://localhost' },
72
- };
73
- const mockPalette = { VIBRANT: { hex: '#FFFFFF' } };
74
- mocks.getPalette.mockResolvedValue(mockPalette);
75
- const props = await getProps(mockItem, mockIcon, mockPieces, mockConfig);
76
- expect(props.metadata).toEqual({});
77
- expect(props.tags).toEqual([]);
78
- expect(props.palette).toBe(mockPalette);
79
- expect(props.size).toEqual({ width: 1200, height: 630 });
80
- expect(props.helpers.getPieceUrl()).toBe('http://localhost/pieces/book/test-book');
81
- expect(props.helpers.getPieceImageUrl('image.jpg', 100, 'jpg')).toBe('luzzle://image.jpg');
82
- });
83
- });
84
- describe('replaceAsync', () => {
85
- test('should replace all matches asynchronously', async () => {
86
- const str = 'Hello world, hello universe!';
87
- const regex = /hello/gi;
88
- const asyncFn = async (match) => Promise.resolve(match.toUpperCase());
89
- const result = await replaceAsync(str, regex, asyncFn);
90
- expect(result).toBe('HELLO world, HELLO universe!');
91
- });
92
- test('should handle no matches', async () => {
93
- const str = 'Hello world!';
94
- const regex = /foo/gi;
95
- const asyncFn = async (match) => Promise.resolve(match.toUpperCase());
96
- const result = await replaceAsync(str, regex, asyncFn);
97
- expect(result).toBe('Hello world!');
98
- });
99
- test('should handle multiple capture groups', async () => {
100
- const str = 'url("luzzle://image.png")';
101
- const regex = /url\(([\\'"]?)(.*?)\1\)/g;
102
- const asyncFn = async (_, quote, url) => {
103
- return `url(${quote}data:image/png;base64,${btoa(url)}${quote})`;
104
- };
105
- const result = await replaceAsync(str, regex, asyncFn);
106
- expect(result).toBe('url("data:image/png;base64,bHV6emxlOi8vaW1hZ2UucG5n")');
107
- });
108
- });
109
- describe('findAndReplaceLuzzleUrls', () => {
110
- test('should replace luzzle:// in img src', async () => {
111
- const html = '<html><body><img src="luzzle://image.jpg"></body></html>';
112
- const mockPieces = {
113
- getPieceAsset: vi.fn().mockResolvedValue(Buffer.from('image_data')),
114
- };
115
- mocks.pathExtname.mockReturnValue('.jpg');
116
- const result = await findAndReplaceLuzzleUrls(html, mockPieces);
117
- const $ = cheerio.load(result);
118
- expect($('img').attr('src')).toBe('data:image/jpg;base64,aW1hZ2VfZGF0YQ==');
119
- });
120
- test('should replace luzzle:// in img srcset', async () => {
121
- const html = '<html><body><img srcset="luzzle://image.jpg 1x, luzzle://image@2x.jpg 2x"></body></html>';
122
- const mockPieces = {
123
- getPieceAsset: vi.fn().mockResolvedValue(Buffer.from('image_data')),
124
- };
125
- mocks.pathExtname.mockReturnValue('.jpg');
126
- const result = await findAndReplaceLuzzleUrls(html, mockPieces);
127
- const $ = cheerio.load(result);
128
- expect($('img').attr('srcset')).toContain('data:image/jpg;base64,aW1hZ2VfZGF0YQ== 1x');
129
- expect($('img').attr('srcset')).toContain('data:image/jpg;base64,aW1hZ2VfZGF0YQ== 2x');
130
- });
131
- test('should replace luzzle:// in style tag url()', async () => {
132
- const html = '<html><head><style>body { background-image: url(luzzle://bg.png); }</style></head></html>';
133
- const mockPieces = {
134
- getPieceAsset: vi.fn().mockResolvedValue(Buffer.from('image_data')),
135
- };
136
- mocks.pathExtname.mockReturnValue('.png');
137
- const result = await findAndReplaceLuzzleUrls(html, mockPieces);
138
- const $ = cheerio.load(result);
139
- expect($('style').html()).toContain('background-image: url(data:image/png;base64,aW1hZ2VfZGF0YQ==);');
140
- });
141
- test('should replace luzzle:// in inline style url()', async () => {
142
- const html = '<html><body><div style="background-image: url(\'luzzle://bg.png\');"></div></body></html>';
143
- const mockPieces = {
144
- getPieceAsset: vi.fn().mockResolvedValue(Buffer.from('image_data')),
145
- };
146
- mocks.pathExtname.mockReturnValue('.png');
147
- const result = await findAndReplaceLuzzleUrls(html, mockPieces);
148
- const $ = cheerio.load(result);
149
- expect($('div').attr('style')).toContain("background-image: url('data:image/png;base64,aW1hZ2VfZGF0YQ==');");
150
- });
151
- test('should handle multiple luzzle urls in different elements', async () => {
152
- const html = `
153
- <html>
154
- <body>
155
- <img src="luzzle://img1.jpg">
156
- <img srcset="luzzle://img2.jpg 1x">
157
- <div style="background: url(luzzle://bg.png);"></div>
158
- <style>
159
- .hero { background: url("luzzle://hero.jpg"); }
160
- </style>
161
- </body>
162
- </html>
163
- `;
164
- const mockPieces = {
165
- getPieceAsset: vi.fn().mockResolvedValue(Buffer.from('image_data')),
166
- };
167
- mocks.pathExtname
168
- .mockReturnValueOnce('.jpg')
169
- .mockReturnValueOnce('.jpg')
170
- .mockReturnValueOnce('.png')
171
- .mockReturnValueOnce('.png');
172
- const result = await findAndReplaceLuzzleUrls(html, mockPieces);
173
- const $ = cheerio.load(result);
174
- expect($('img').eq(0).attr('src')).toBe('data:image/jpg;base64,aW1hZ2VfZGF0YQ==');
175
- expect($('img').eq(1).attr('srcset')).toContain('data:image/jpg;base64,aW1hZ2VfZGF0YQ== 1x');
176
- expect($('div').attr('style')).toContain('background: url(data:image/png;base64,aW1hZ2VfZGF0YQ==);');
177
- expect($('style').html()).toContain('background: url("data:image/png;base64,aW1hZ2VfZGF0YQ==");');
178
- });
179
- test('should not modify non-luzzle urls', async () => {
180
- const html = `
181
- <html>
182
- <body>
183
- <img src="http://example.com/image.jpg">
184
- <img srcset="/image.jpg 1x">
185
- <div style="background: url(/bg.png);"></div>
186
- <style>
187
- .hero { background: url("http://example.com/hero.jpg"); }
188
- </style>
189
- </body>
190
- </html>
191
- `;
192
- const mockPieces = {
193
- getPieceAsset: vi.fn().mockResolvedValue(Buffer.from('image_data')),
194
- };
195
- mocks.pathExtname.mockReturnValue('.jpg');
196
- const result = await findAndReplaceLuzzleUrls(html, mockPieces);
197
- const $ = cheerio.load(result);
198
- expect($('img').eq(0).attr('src')).toBe('http://example.com/image.jpg');
199
- expect($('img').eq(1).attr('srcset')).toBe('/image.jpg 1x');
200
- // Cheerio might strip url() for simple cases, so check for the content
201
- expect($('div').attr('style')).toContain('background: url(/bg.png);');
202
- expect($('style').html()).toContain('background: url("http://example.com/hero.jpg");');
203
- expect($('style').html()).not.toContain('data:image/');
204
- expect(mockPieces.getPieceAsset).not.toHaveBeenCalled();
205
- });
206
- });
207
- describe('bufferToBase64', () => {
208
- test('should convert a buffer to a base64 data URL', () => {
209
- const buffer = Buffer.from('test_data');
210
- const base64 = bufferToBase64(buffer, 'text', 'plain');
211
- expect(base64).toBe('data:text/plain;base64,dGVzdF9kYXRh');
212
- });
213
- });
214
- });
215
- //# sourceMappingURL=utils.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../../src/commands/opengraph/utils.test.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import { Argv } from 'yargs';
2
- export default function command(cli: Argv): Argv<import("yargs").Omit<{}, "config"> & import("yargs").InferredOptionTypes<{
3
- config: {
4
- type: "string";
5
- description: string;
6
- demandOption: true;
7
- };
8
- }>>;
@@ -1,16 +0,0 @@
1
- import generateSqlite from './index.js';
2
- export default function command(cli) {
3
- return cli.command('sqlite', 'generate sqlite database for web', function (yargs) {
4
- const options = yargs.options({
5
- config: {
6
- type: 'string',
7
- description: 'path to config.yaml',
8
- demandOption: true,
9
- }
10
- });
11
- return options;
12
- }, async function (argv) {
13
- await generateSqlite(argv.config);
14
- });
15
- }
16
- //# sourceMappingURL=command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../../src/commands/sqlite/command.ts"],"names":[],"mappings":"AACA,OAAO,cAAc,MAAM,YAAY,CAAA;AAEvC,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,GAAS;IACxC,OAAO,GAAG,CAAC,OAAO,CACjB,QAAQ,EACR,kCAAkC,EAClC,UAAS,KAAK;QACb,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAC7B,MAAM,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,qBAAqB;gBAClC,YAAY,EAAE,IAAI;aAClB;SACD,CAAC,CAAA;QACF,OAAO,OAAO,CAAA;IACf,CAAC,EACD,KAAK,WAAU,IAAI;QAClB,MAAM,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAClC,CAAC,CACD,CAAA;AACF,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,42 +0,0 @@
1
- import { describe, test, expect, vi, afterEach } from 'vitest';
2
- import command from './command.js';
3
- import generateSqlite from './index.js';
4
- vi.mock('./index.js');
5
- const mocks = {
6
- generateSqlite: vi.mocked(generateSqlite),
7
- };
8
- describe('sqlite command', () => {
9
- afterEach(() => {
10
- vi.clearAllMocks();
11
- });
12
- test('should configure the command and call generateSqlite', async () => {
13
- const handler = vi.fn();
14
- const builder = vi.fn();
15
- const cli = {
16
- command: vi.fn((_cmd, _desc, b, h) => {
17
- builder.mockImplementation(b);
18
- handler.mockImplementation(h);
19
- return cli;
20
- }),
21
- };
22
- command(cli);
23
- expect(cli.command).toHaveBeenCalledWith('sqlite', 'generate sqlite database for web', expect.any(Function), expect.any(Function));
24
- const yargsMock = { options: vi.fn() };
25
- builder(yargsMock);
26
- expect(yargsMock.options).toHaveBeenCalledWith({
27
- config: {
28
- type: 'string',
29
- description: 'path to config.yaml',
30
- demandOption: true,
31
- },
32
- });
33
- const argv = {
34
- config: '/path/to/config.yaml',
35
- $0: '',
36
- _: [],
37
- };
38
- await handler(argv);
39
- expect(mocks.generateSqlite).toHaveBeenCalledWith('/path/to/config.yaml');
40
- });
41
- });
42
- //# sourceMappingURL=command.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command.test.js","sourceRoot":"","sources":["../../../../src/commands/sqlite/command.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAC9D,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,cAAc,MAAM,YAAY,CAAA;AAGvC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;AAErB,MAAM,KAAK,GAAG;IACb,cAAc,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC;CACzC,CAAA;AAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC/B,SAAS,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACvB,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACvB,MAAM,GAAG,GAAG;YACX,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBACpC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAA;gBAC7B,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAA;gBAC7B,OAAO,GAAG,CAAA;YACX,CAAC,CAAC;SACF,CAAA;QAED,OAAO,CAAC,GAAsB,CAAC,CAAA;QAE/B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,oBAAoB,CACvC,QAAQ,EACR,kCAAkC,EAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EACpB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CACpB,CAAA;QAED,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;QACtC,OAAO,CAAC,SAAS,CAAC,CAAA;QAClB,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC;YAC9C,MAAM,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,qBAAqB;gBAClC,YAAY,EAAE,IAAI;aAClB;SACD,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG;YACZ,MAAM,EAAE,sBAAsB;YAC9B,EAAE,EAAE,EAAE;YACN,CAAC,EAAE,EAAE;SACL,CAAA;QACD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;QAEnB,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -1,9 +0,0 @@
1
- import { type LuzzleDatabase } from '@luzzle/core';
2
- import { type Config } from '@luzzle/web.utils';
3
- declare function dropWebTables(db: LuzzleDatabase): Promise<void>;
4
- declare function createWebTables(db: LuzzleDatabase): Promise<void>;
5
- declare function populateWebPieceItems(db: LuzzleDatabase, config: Config): Promise<void>;
6
- declare function populateWebPieceSearch(db: LuzzleDatabase): Promise<void>;
7
- declare function populateWebPieceTags(db: LuzzleDatabase): Promise<void>;
8
- declare function generateWebSqlite(db: LuzzleDatabase, config: Config): Promise<void>;
9
- export { dropWebTables, createWebTables, populateWebPieceItems, populateWebPieceTags, populateWebPieceSearch, generateWebSqlite, };
@@ -1,174 +0,0 @@
1
- import { sql } from '@luzzle/core';
2
- import path from 'path';
3
- function batchArray(array, batchSize) {
4
- const batches = [];
5
- for (let i = 0; i < array.length; i += batchSize) {
6
- batches.push(array.slice(i, i + batchSize));
7
- }
8
- return batches;
9
- }
10
- function slugify(text) {
11
- return text
12
- .toString()
13
- .normalize('NFD') // Efficiently handle accented characters
14
- .replace(/[\u0300-\u036f]/g, '')
15
- .toLowerCase()
16
- .trim()
17
- .replace(/\s+/g, '-')
18
- .replace(/[^\w-]+/g, '')
19
- .replace(/--+/g, '-');
20
- }
21
- async function dropWebTables(db) {
22
- await db.schema.dropTable('web_pieces_tags').ifExists().execute();
23
- await db.schema.dropTable('web_pieces').ifExists().execute();
24
- await db.schema.dropTable('web_pieces_fts5').ifExists().execute();
25
- }
26
- async function createWebTables(db) {
27
- await db.schema
28
- .createTable('web_pieces_tags')
29
- .ifNotExists()
30
- .addColumn('piece_type', 'text', (col) => col.notNull())
31
- .addColumn('piece_slug', 'text', (col) => col.notNull())
32
- .addColumn('piece_id', 'text', (col) => col.notNull())
33
- .addColumn('tag', 'text', (col) => col.notNull())
34
- .addColumn('slug', 'text', (col) => col.notNull())
35
- .execute();
36
- await db.schema
37
- .createTable('web_pieces')
38
- .ifNotExists()
39
- .addColumn('id', 'text', (col) => col.primaryKey().notNull())
40
- .addColumn('slug', 'text', (col) => col.notNull())
41
- .addColumn('type', 'text', (col) => col.notNull())
42
- .addColumn('file_path', 'text', (col) => col.notNull())
43
- .addColumn('title', 'text')
44
- .addColumn('summary', 'text')
45
- .addColumn('note', 'text')
46
- .addColumn('media', 'text')
47
- .addColumn('keywords', 'text')
48
- .addColumn('json_metadata', 'text')
49
- .addColumn('date_added', 'datetime')
50
- .addColumn('date_updated', 'datetime')
51
- .addColumn('date_consumed', 'datetime')
52
- .addUniqueConstraint('slug-type', ['slug', 'type'])
53
- .execute();
54
- await sql `CREATE VIRTUAL TABLE IF NOT EXISTS "web_pieces_fts5" USING fts5(id UNINDEXED, slug, type UNINDEXED, title, summary, note, media UNINDEXED, keywords, json_metadata, date_added UNINDEXED, date_updated UNINDEXED, date_consumed UNINDEXED, file_path UNINDEXED, tokenize = 'porter ascii', prefix='3 4 5', content = 'web_pieces', content_rowid="rowid")`.execute(db);
55
- await sql `CREATE TRIGGER IF NOT EXISTS web_pieces_after_insert AFTER INSERT ON web_pieces BEGIN
56
- INSERT INTO web_pieces_fts5(rowid, slug, type, title, summary, note, media, keywords, json_metadata, date_added, date_updated, date_consumed)
57
- VALUES(new.rowid, new.slug, new.type, new.title, new.summary, new.note, new.media, new.keywords, new.json_metadata, new.date_added, new.date_updated, new.date_consumed);
58
- END;`.execute(db);
59
- await sql `CREATE TRIGGER web_pieces_after_delete AFTER DELETE ON web_pieces
60
- BEGIN
61
- INSERT INTO web_pieces_fts5(web_pieces_fts5, rowid, slug, title, summary, note, keywords, json_metadata)
62
- VALUES('delete', old.rowid, old.slug, old.title, old.summary, old.note, old.keywords, old.json_metadata);
63
- END;`.execute(db);
64
- await sql `CREATE TRIGGER web_pieces_after_update AFTER UPDATE ON web_pieces
65
- BEGIN
66
- INSERT INTO web_pieces_fts5(web_pieces_fts5, rowid, slug, title, summary, note, keywords, json_metadata)
67
- VALUES('delete', old.rowid, old.slug, old.title, old.summary, old.note, old.keywords, old.json_metadata);
68
-
69
- INSERT INTO web_pieces_fts5(rowid, slug, title, summary, note, keywords, json_metadata)
70
- VALUES (new.rowid, new.slug, new.title, new.summary, new.note, new.keywords, new.json_metadata);
71
- END;`.execute(db);
72
- }
73
- async function mapPieceItemToWebPiece(item, pieceConfig, slug) {
74
- const frontmatter = JSON.parse(item.frontmatter_json);
75
- const title = frontmatter[pieceConfig.fields.title];
76
- const dateConsumed = frontmatter[pieceConfig.fields.date_consumed];
77
- return {
78
- slug,
79
- type: item.type,
80
- id: item.id,
81
- file_path: item.file_path,
82
- title: title,
83
- summary: pieceConfig.fields.summary ? frontmatter[pieceConfig.fields.summary] : undefined,
84
- note: item.note_markdown,
85
- media: pieceConfig.fields.media ? frontmatter[pieceConfig.fields.media] : undefined,
86
- keywords: pieceConfig.fields.tags ? frontmatter[pieceConfig.fields.tags] : undefined,
87
- date_added: item.date_added,
88
- date_consumed: dateConsumed,
89
- json_metadata: item.frontmatter_json,
90
- ...(item.date_updated && { date_updated: item.date_updated }),
91
- };
92
- }
93
- function getUniqueSlug(existingSlugs, filename, type) {
94
- const slug = slugify(filename);
95
- let finalSlug = slug;
96
- let count = 0;
97
- while (existingSlugs.has(`${type}-${slug}-${count}`)) {
98
- count++;
99
- finalSlug = `${slug}--${count}`;
100
- }
101
- existingSlugs.add(`${type}-${slug}-${count}`);
102
- return finalSlug;
103
- }
104
- async function populateWebPieceItems(db, config) {
105
- const webDb = db.withTables();
106
- const items = await db.selectFrom('pieces_items').selectAll().execute();
107
- const values = [];
108
- const typeSlugs = new Set();
109
- for (const item of items) {
110
- const pieceConfig = config.pieces.find((p) => p.type === item.type);
111
- if (pieceConfig) {
112
- const filename = path.basename(item.file_path, '.md').split('.')[0];
113
- const slug = getUniqueSlug(typeSlugs, filename, item.type);
114
- const mapping = await mapPieceItemToWebPiece(item, pieceConfig, slug);
115
- values.push(mapping);
116
- }
117
- }
118
- await webDb.transaction().execute(async (tx) => {
119
- if (values.length) {
120
- const batches = batchArray(values, 1000);
121
- for (const batch of batches) {
122
- await tx.insertInto('web_pieces').values(batch).execute();
123
- }
124
- }
125
- });
126
- }
127
- async function populateWebPieceSearch(db) {
128
- await sql `INSERT INTO web_pieces_fts5(web_pieces_fts5) VALUES('rebuild')`.execute(db);
129
- }
130
- async function populateWebPieceTags(db) {
131
- const tags = await sql `SELECT web_pieces.slug, web_pieces.id, web_pieces.type, json_each.value as tag FROM web_pieces, json_each(web_pieces.keywords)`.execute(db);
132
- const webDb = db.withTables();
133
- const values = [];
134
- tags.rows.forEach((tag) => {
135
- const name = tag.tag.trim();
136
- if (name) {
137
- values.push({
138
- piece_slug: tag.slug,
139
- piece_type: tag.type,
140
- tag: name,
141
- slug: slugify(name),
142
- piece_id: tag.id,
143
- });
144
- }
145
- });
146
- await webDb.transaction().execute(async (tx) => {
147
- if (values.length) {
148
- const batches = batchArray(values, 1000);
149
- for (const batch of batches) {
150
- await tx.insertInto('web_pieces_tags').values(batch).execute();
151
- }
152
- }
153
- });
154
- }
155
- async function generateWebSqlite(db, config) {
156
- await dropWebTables(db);
157
- await createWebTables(db);
158
- await populateWebPieceItems(db, config);
159
- await populateWebPieceTags(db);
160
- await populateWebPieceSearch(db);
161
- const pieces = await db
162
- .withTables()
163
- .selectFrom('web_pieces')
164
- .selectAll()
165
- .execute();
166
- const tags = await db
167
- .withTables()
168
- .selectFrom('web_pieces_tags')
169
- .selectAll()
170
- .execute();
171
- console.log(`${config.paths.database} has ${pieces.length} pieces and ${tags.length} tags`);
172
- }
173
- export { dropWebTables, createWebTables, populateWebPieceItems, populateWebPieceTags, populateWebPieceSearch, generateWebSqlite, };
174
- //# sourceMappingURL=database.js.map