@phosart/common 0.4.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -0
- package/dist/FullGallery.svelte +51 -0
- package/dist/FullGallery.svelte.d.ts +17 -0
- package/dist/FullGallery.svelte.d.ts.map +1 -0
- package/dist/Gallery.svelte +30 -0
- package/dist/Gallery.svelte.d.ts +14 -0
- package/dist/Gallery.svelte.d.ts.map +1 -0
- package/dist/GalleryPreview.svelte +60 -0
- package/dist/GalleryPreview.svelte.d.ts +9 -0
- package/dist/GalleryPreview.svelte.d.ts.map +1 -0
- package/dist/HighResContext.svelte +21 -0
- package/dist/HighResContext.svelte.d.ts +8 -0
- package/dist/HighResContext.svelte.d.ts.map +1 -0
- package/dist/Image.svelte +171 -0
- package/dist/Image.svelte.d.ts +14 -0
- package/dist/Image.svelte.d.ts.map +1 -0
- package/dist/Modal.svelte +87 -0
- package/dist/Modal.svelte.d.ts +9 -0
- package/dist/Modal.svelte.d.ts.map +1 -0
- package/dist/ModalGallery/Carousel.svelte +76 -0
- package/dist/ModalGallery/Carousel.svelte.d.ts +10 -0
- package/dist/ModalGallery/Carousel.svelte.d.ts.map +1 -0
- package/dist/ModalGallery/ImageSection.svelte +156 -0
- package/dist/ModalGallery/ImageSection.svelte.d.ts +11 -0
- package/dist/ModalGallery/ImageSection.svelte.d.ts.map +1 -0
- package/dist/ModalGallery/ImageView.svelte +92 -0
- package/dist/ModalGallery/ImageView.svelte.d.ts +9 -0
- package/dist/ModalGallery/ImageView.svelte.d.ts.map +1 -0
- package/dist/ModalGallery/Spinner.svelte +71 -0
- package/dist/ModalGallery/Spinner.svelte.d.ts +7 -0
- package/dist/ModalGallery/Spinner.svelte.d.ts.map +1 -0
- package/dist/ModalGallery.svelte +165 -0
- package/dist/ModalGallery.svelte.d.ts +16 -0
- package/dist/ModalGallery.svelte.d.ts.map +1 -0
- package/dist/OpengraphMeta.svelte +125 -0
- package/dist/OpengraphMeta.svelte.d.ts +15 -0
- package/dist/OpengraphMeta.svelte.d.ts.map +1 -0
- package/dist/Postcard/ArtistLink.svelte +46 -0
- package/dist/Postcard/ArtistLink.svelte.d.ts +9 -0
- package/dist/Postcard/ArtistLink.svelte.d.ts.map +1 -0
- package/dist/Postcard/Chip.svelte +100 -0
- package/dist/Postcard/Chip.svelte.d.ts +12 -0
- package/dist/Postcard/Chip.svelte.d.ts.map +1 -0
- package/dist/Postcard/Description/Character.svelte +79 -0
- package/dist/Postcard/Description/Character.svelte.d.ts +9 -0
- package/dist/Postcard/Description/Character.svelte.d.ts.map +1 -0
- package/dist/Postcard/Description.svelte +146 -0
- package/dist/Postcard/Description.svelte.d.ts +13 -0
- package/dist/Postcard/Description.svelte.d.ts.map +1 -0
- package/dist/Postcard/Headline.svelte +70 -0
- package/dist/Postcard/Headline.svelte.d.ts +10 -0
- package/dist/Postcard/Headline.svelte.d.ts.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/server/artist.d.ts +7 -0
- package/dist/server/artist.d.ts.map +1 -0
- package/dist/server/artist.js +40 -0
- package/dist/server/character.d.ts +9 -0
- package/dist/server/character.d.ts.map +1 -0
- package/dist/server/character.js +76 -0
- package/dist/server/directories.d.ts +4 -0
- package/dist/server/directories.d.ts.map +1 -0
- package/dist/server/directories.js +39 -0
- package/dist/server/fastcache.d.ts +11 -0
- package/dist/server/fastcache.d.ts.map +1 -0
- package/dist/server/fastcache.js +43 -0
- package/dist/server/filter.d.ts +6 -0
- package/dist/server/filter.d.ts.map +1 -0
- package/dist/server/filter.js +53 -0
- package/dist/server/gallery.d.ts +16 -0
- package/dist/server/gallery.d.ts.map +1 -0
- package/dist/server/gallery.js +162 -0
- package/dist/server/imageprocess.d.ts +18 -0
- package/dist/server/imageprocess.d.ts.map +1 -0
- package/dist/server/imageprocess.js +243 -0
- package/dist/server/index.d.ts +15 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +15 -0
- package/dist/server/models/Artist.d.ts +7 -0
- package/dist/server/models/Artist.d.ts.map +1 -0
- package/dist/server/models/Artist.js +15 -0
- package/dist/server/models/Character.d.ts +108 -0
- package/dist/server/models/Character.d.ts.map +1 -0
- package/dist/server/models/Character.js +21 -0
- package/dist/server/models/Gallery.d.ts +373 -0
- package/dist/server/models/Gallery.d.ts.map +1 -0
- package/dist/server/models/Gallery.js +60 -0
- package/dist/server/models/image.d.ts +64 -0
- package/dist/server/models/image.d.ts.map +1 -0
- package/dist/server/models/image.js +17 -0
- package/dist/server/pack.d.ts +3 -0
- package/dist/server/pack.d.ts.map +1 -0
- package/dist/server/pack.js +26 -0
- package/dist/server/theme/schema.d.ts +57 -0
- package/dist/server/theme/schema.d.ts.map +1 -0
- package/dist/server/theme/schema.js +217 -0
- package/dist/server/util.d.ts +24 -0
- package/dist/server/util.d.ts.map +1 -0
- package/dist/server/util.js +71 -0
- package/dist/util/art.d.ts +52 -0
- package/dist/util/art.d.ts.map +1 -0
- package/dist/util/art.js +57 -0
- package/dist/util/artistcontext.svelte.d.ts +8 -0
- package/dist/util/artistcontext.svelte.d.ts.map +1 -0
- package/dist/util/artistcontext.svelte.js +18 -0
- package/dist/util/charactercontext.svelte.d.ts +4 -0
- package/dist/util/charactercontext.svelte.d.ts.map +1 -0
- package/dist/util/charactercontext.svelte.js +11 -0
- package/dist/util/date.d.ts +2 -0
- package/dist/util/date.d.ts.map +1 -0
- package/dist/util/date.js +6 -0
- package/dist/util/index.d.ts +13 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +10 -0
- package/dist/util/markdown.d.ts +2 -0
- package/dist/util/markdown.d.ts.map +1 -0
- package/dist/util/markdown.js +16 -0
- package/dist/util/phosart_config.svelte.d.ts +44 -0
- package/dist/util/phosart_config.svelte.d.ts.map +1 -0
- package/dist/util/phosart_config.svelte.js +51 -0
- package/dist/util/search.d.ts +3 -0
- package/dist/util/search.d.ts.map +1 -0
- package/dist/util/search.js +24 -0
- package/dist/util/smoothscroll.d.ts +4 -0
- package/dist/util/smoothscroll.d.ts.map +1 -0
- package/dist/util/smoothscroll.js +21 -0
- package/dist/util/tree.d.ts +19 -0
- package/dist/util/tree.d.ts.map +1 -0
- package/dist/util/tree.js +58 -0
- package/dist/util/util.d.ts +4 -0
- package/dist/util/util.d.ts.map +1 -0
- package/dist/util/util.js +22 -0
- package/package.json +102 -0
- package/src/lib/FullGallery.svelte +51 -0
- package/src/lib/Gallery.svelte +30 -0
- package/src/lib/GalleryPreview.svelte +60 -0
- package/src/lib/HighResContext.svelte +21 -0
- package/src/lib/Image.svelte +171 -0
- package/src/lib/Modal.svelte +87 -0
- package/src/lib/ModalGallery/Carousel.svelte +76 -0
- package/src/lib/ModalGallery/ImageSection.svelte +156 -0
- package/src/lib/ModalGallery/ImageView.svelte +92 -0
- package/src/lib/ModalGallery/Spinner.svelte +71 -0
- package/src/lib/ModalGallery.svelte +165 -0
- package/src/lib/OpengraphMeta.svelte +125 -0
- package/src/lib/Postcard/ArtistLink.svelte +46 -0
- package/src/lib/Postcard/Chip.svelte +100 -0
- package/src/lib/Postcard/Description/Character.svelte +79 -0
- package/src/lib/Postcard/Description.svelte +146 -0
- package/src/lib/Postcard/Headline.svelte +70 -0
- package/src/lib/index.ts +20 -0
- package/src/lib/server/artist.ts +50 -0
- package/src/lib/server/character.ts +113 -0
- package/src/lib/server/directories.ts +45 -0
- package/src/lib/server/fastcache.ts +66 -0
- package/src/lib/server/filter.ts +71 -0
- package/src/lib/server/gallery.ts +259 -0
- package/src/lib/server/imageprocess.ts +382 -0
- package/src/lib/server/index.ts +57 -0
- package/src/lib/server/models/Artist.ts +19 -0
- package/src/lib/server/models/Character.ts +24 -0
- package/src/lib/server/models/Gallery.ts +70 -0
- package/src/lib/server/models/image.ts +20 -0
- package/src/lib/server/pack.ts +31 -0
- package/src/lib/server/theme/schema.ts +286 -0
- package/src/lib/server/util.ts +102 -0
- package/src/lib/util/art.ts +136 -0
- package/src/lib/util/artistcontext.svelte.ts +25 -0
- package/src/lib/util/charactercontext.svelte.ts +15 -0
- package/src/lib/util/date.ts +7 -0
- package/src/lib/util/index.ts +29 -0
- package/src/lib/util/markdown.ts +17 -0
- package/src/lib/util/phosart_config.svelte.ts +101 -0
- package/src/lib/util/search.ts +28 -0
- package/src/lib/util/smoothscroll.ts +21 -0
- package/src/lib/util/tree.ts +75 -0
- package/src/lib/util/util.ts +37 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import sharp, {} from 'sharp';
|
|
2
|
+
import { Logger } from 'tslog';
|
|
3
|
+
import * as fs from 'node:fs/promises';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { getLogLevel, hashUrl } from "./util.js";
|
|
6
|
+
import { $PUBLIC } from "./directories.js";
|
|
7
|
+
import { getFastHash, updateFastCache } from "./fastcache.js";
|
|
8
|
+
import sharpPhash from 'sharp-phash';
|
|
9
|
+
import { Sema } from 'async-sema';
|
|
10
|
+
import os from 'node:os';
|
|
11
|
+
const ImageProcessLog = new Logger({ minLevel: getLogLevel() });
|
|
12
|
+
const sema = new Sema(os.cpus().length, { capacity: 1000 });
|
|
13
|
+
const phash = sharpPhash;
|
|
14
|
+
let processedHashes = new Set();
|
|
15
|
+
const LQIP_WIDTH = 64;
|
|
16
|
+
const FORMATS = ['avif', 'webp'];
|
|
17
|
+
const WIDTHS = [640, 960, 1280, 1920, 3840];
|
|
18
|
+
const THUMBS = [160, 320];
|
|
19
|
+
export function getProcessedHashes() {
|
|
20
|
+
return processedHashes;
|
|
21
|
+
}
|
|
22
|
+
export function clearProcessedHashes() {
|
|
23
|
+
processedHashes = new Set();
|
|
24
|
+
}
|
|
25
|
+
export async function getUnusedHashes() {
|
|
26
|
+
const eligible = new Set();
|
|
27
|
+
const pubdir = await fs.readdir($PUBLIC(), { withFileTypes: true, recursive: false });
|
|
28
|
+
await Promise.all(pubdir.map(async (dirent) => {
|
|
29
|
+
if (!dirent.isDirectory()) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const ents = await fs.readdir(path.resolve(path.join($PUBLIC(), dirent.name)));
|
|
33
|
+
if (!ents.includes('.keep.mark')) {
|
|
34
|
+
eligible.add(dirent.name);
|
|
35
|
+
}
|
|
36
|
+
}));
|
|
37
|
+
return eligible.difference(processedHashes);
|
|
38
|
+
}
|
|
39
|
+
export async function deleteHashes(unused) {
|
|
40
|
+
if (unused.size === 0) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
ImageProcessLog.warn('Cleaning up generated directory:', unused.size, 'unused folders found...');
|
|
44
|
+
const respub = path.resolve($PUBLIC());
|
|
45
|
+
for (const hash of unused) {
|
|
46
|
+
const resolved = path.resolve(path.join($PUBLIC(), hash));
|
|
47
|
+
if (!resolved.startsWith(respub)) {
|
|
48
|
+
ImageProcessLog.warn('Tried to clean hash at path', resolved, 'which is not a subdirectory of public', respub, '??');
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
ImageProcessLog.debug('Deleting', resolved, '...');
|
|
52
|
+
await fs.rm(resolved, { recursive: true, force: true });
|
|
53
|
+
ImageProcessLog.info('Deleted unused generated directory', resolved, '...');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export async function cleanUnusedHashes() {
|
|
58
|
+
await deleteHashes(await getUnusedHashes());
|
|
59
|
+
}
|
|
60
|
+
async function getPictureDetails(h) {
|
|
61
|
+
try {
|
|
62
|
+
return JSON.parse(await fs.readFile(path.join($PUBLIC(), h, 'details.json'), { encoding: 'utf-8' }));
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export async function processVideoFastcache(fc, fullpath, relpath, name, processOptions = {}) {
|
|
69
|
+
const [prehash, mtime] = await getFastHash(fc, fullpath, relpath);
|
|
70
|
+
const [path, hash] = await doProcessVideo(fullpath, name, prehash, processOptions);
|
|
71
|
+
if (!prehash) {
|
|
72
|
+
await updateFastCache(fc, fullpath, relpath, hash, mtime);
|
|
73
|
+
}
|
|
74
|
+
return path;
|
|
75
|
+
}
|
|
76
|
+
export async function processVideo(url, name) {
|
|
77
|
+
return (await doProcessVideo(url, name, null))[0];
|
|
78
|
+
}
|
|
79
|
+
async function doProcessVideo(url, name, prehash, processOptions = {}) {
|
|
80
|
+
const h = prehash ?? (await hashUrl(url));
|
|
81
|
+
processedHashes.add(h);
|
|
82
|
+
name = name + path.extname(url);
|
|
83
|
+
const outputDir = path.join($PUBLIC(), h);
|
|
84
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
85
|
+
await fs.copyFile(url, path.join(outputDir, name));
|
|
86
|
+
if (processOptions?.forceKeep) {
|
|
87
|
+
await fs.writeFile(path.join(outputDir, '.keep.mark'), '');
|
|
88
|
+
}
|
|
89
|
+
return [`/_/${h}/${name}`, h];
|
|
90
|
+
}
|
|
91
|
+
export async function processImageFastcache(fc, fullpath, relpath, processOptions = {}) {
|
|
92
|
+
const [prehash, mtime] = await getFastHash(fc, fullpath, relpath);
|
|
93
|
+
const [image, hash] = await doProcessImage(fullpath, prehash, processOptions);
|
|
94
|
+
if (!prehash) {
|
|
95
|
+
await updateFastCache(fc, fullpath, relpath, hash, mtime);
|
|
96
|
+
}
|
|
97
|
+
return image;
|
|
98
|
+
}
|
|
99
|
+
export async function processImage(url, processOptions = {}) {
|
|
100
|
+
return (await doProcessImage(url, null, processOptions))[0];
|
|
101
|
+
}
|
|
102
|
+
async function doProcessImage(url, prehash, processOptions = {}) {
|
|
103
|
+
const h = prehash ?? (await hashUrl(url));
|
|
104
|
+
processedHashes.add(h);
|
|
105
|
+
ImageProcessLog.silly('[IMAGE] Got image with hash', h);
|
|
106
|
+
const cached = await getPictureDetails(h);
|
|
107
|
+
if (cached) {
|
|
108
|
+
ImageProcessLog.debug('[IMAGE] Found cached details for', url, h);
|
|
109
|
+
return [cached, h];
|
|
110
|
+
}
|
|
111
|
+
const tok = await sema.acquire();
|
|
112
|
+
try {
|
|
113
|
+
ImageProcessLog.debug('[IMAGE] Starting to process', url);
|
|
114
|
+
const image = sharp(url, { animated: true });
|
|
115
|
+
const details = await _doProcessImage(url, image, h, processOptions);
|
|
116
|
+
ImageProcessLog.info('[IMAGE] Finished processing', url, details);
|
|
117
|
+
return [details, h];
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
sema.release(tok);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function removeDuplicates(images) {
|
|
124
|
+
for (let i = images.length - 1; i >= 0; i--) {
|
|
125
|
+
const me = images[i];
|
|
126
|
+
if (images.findIndex((v) => v.format === me.format && v.h === me.h && v.w === me.w && v.src === me.src) !== i) {
|
|
127
|
+
images.splice(i, 1);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return images;
|
|
131
|
+
}
|
|
132
|
+
async function _doProcessImage(url, image, hash, processOptions = {}) {
|
|
133
|
+
const meta = await image.metadata();
|
|
134
|
+
const fullTransformations = meta.format === 'gif'
|
|
135
|
+
? [
|
|
136
|
+
{ format: 'gif', width: meta.width },
|
|
137
|
+
{ format: 'webp', width: meta.width }
|
|
138
|
+
]
|
|
139
|
+
: FORMATS.flatMap((format) => WIDTHS.flatMap((width) => ({ format, width, position: processOptions?.position })));
|
|
140
|
+
const thumbnailTransformations = (meta.format === 'gif' ? ['gif', 'webp'] : FORMATS).flatMap((format) => THUMBS.flatMap((width) => ({
|
|
141
|
+
format,
|
|
142
|
+
width,
|
|
143
|
+
height: width,
|
|
144
|
+
position: processOptions?.position
|
|
145
|
+
})));
|
|
146
|
+
const fulls = Promise.all(fullTransformations.map((tf) => doSaveImage(url, hash, doTransformImage(image, tf), tf, meta.pages ?? 1))).then(removeDuplicates);
|
|
147
|
+
const thumbs = Promise.all(thumbnailTransformations.map((tf) => doSaveImage(url, hash, doTransformImage(image, tf), tf, meta.pages ?? 1))).then(removeDuplicates);
|
|
148
|
+
const phPromise = phash(url);
|
|
149
|
+
const fullLqip = doLQIP(image, {
|
|
150
|
+
format: 'webp',
|
|
151
|
+
width: LQIP_WIDTH,
|
|
152
|
+
position: processOptions?.position
|
|
153
|
+
});
|
|
154
|
+
const thumbLqip = doLQIP(image, {
|
|
155
|
+
format: 'webp',
|
|
156
|
+
width: LQIP_WIDTH,
|
|
157
|
+
height: LQIP_WIDTH,
|
|
158
|
+
position: processOptions?.position
|
|
159
|
+
});
|
|
160
|
+
const data = {
|
|
161
|
+
phash: await phPromise,
|
|
162
|
+
full: {
|
|
163
|
+
sha256: hash,
|
|
164
|
+
lqip: await fullLqip,
|
|
165
|
+
sources: (await fulls).reduce((all, cur) => ({
|
|
166
|
+
...all,
|
|
167
|
+
[cur.format]: [...(all[cur.format] ?? []), cur]
|
|
168
|
+
}), {}),
|
|
169
|
+
fallback: (await fulls).reduce((best, cur) => (cur.format === 'webp' && cur.w > best.w ? cur : best), (await fulls)[0])
|
|
170
|
+
},
|
|
171
|
+
thumbnail: {
|
|
172
|
+
sha256: hash,
|
|
173
|
+
lqip: await thumbLqip,
|
|
174
|
+
sources: (await thumbs).reduce((all, cur) => ({
|
|
175
|
+
...all,
|
|
176
|
+
[cur.format]: [...(all[cur.format] ?? []), cur]
|
|
177
|
+
}), {}),
|
|
178
|
+
fallback: (await thumbs).reduce((best, cur) => (cur.format === 'webp' && cur.w > best.w ? cur : best), (await thumbs)[0])
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
await fs.writeFile(path.join($PUBLIC(), hash, 'details.json'), JSON.stringify(data, null, 4), {
|
|
182
|
+
encoding: 'utf-8'
|
|
183
|
+
});
|
|
184
|
+
if (processOptions?.forceKeep) {
|
|
185
|
+
await fs.writeFile(path.join($PUBLIC(), hash, '.keep.mark'), '');
|
|
186
|
+
}
|
|
187
|
+
ImageProcessLog.info('[IMAGE] Processed image ', hash);
|
|
188
|
+
return data;
|
|
189
|
+
}
|
|
190
|
+
async function doSaveImage(url, hash, image, tf, pages) {
|
|
191
|
+
const base = path.join($PUBLIC(), hash);
|
|
192
|
+
await fs.mkdir(base, { recursive: true });
|
|
193
|
+
ImageProcessLog.silly('[IMAGE] Starting transformation of', url, 'to', tf);
|
|
194
|
+
return await new Promise((resolve, reject) => image.toBuffer(async (err, buf, info) => {
|
|
195
|
+
if (err)
|
|
196
|
+
return void reject(err);
|
|
197
|
+
if (info.format === 'heif')
|
|
198
|
+
info.format = 'avif';
|
|
199
|
+
const name = `${info.width}x${info.height / pages}.${info.format}`;
|
|
200
|
+
const output = path.join(base, name);
|
|
201
|
+
await fs.writeFile(output, buf);
|
|
202
|
+
ImageProcessLog.debug('[IMAGE] Saved new image', output, 'for transformation of', url, tf);
|
|
203
|
+
resolve({
|
|
204
|
+
src: `/_/${hash}/${name}`,
|
|
205
|
+
w: info.width,
|
|
206
|
+
h: info.height / pages,
|
|
207
|
+
format: info.format
|
|
208
|
+
});
|
|
209
|
+
}));
|
|
210
|
+
}
|
|
211
|
+
function doTransformImage(image, { format, width, height = -1, position = 'north' }) {
|
|
212
|
+
return image
|
|
213
|
+
.clone()
|
|
214
|
+
.resize({
|
|
215
|
+
width: width,
|
|
216
|
+
height: height === -1 ? undefined : height,
|
|
217
|
+
position,
|
|
218
|
+
withoutEnlargement: true
|
|
219
|
+
})
|
|
220
|
+
.toFormat(format);
|
|
221
|
+
}
|
|
222
|
+
async function doLQIP(image, { width, height = -1, position = 'north' }) {
|
|
223
|
+
return await new Promise((resolve, reject) => image
|
|
224
|
+
.clone()
|
|
225
|
+
.resize({
|
|
226
|
+
width: width,
|
|
227
|
+
height: height === -1 ? undefined : height,
|
|
228
|
+
position,
|
|
229
|
+
withoutEnlargement: true
|
|
230
|
+
})
|
|
231
|
+
.toFormat('webp', { quality: 20 })
|
|
232
|
+
.toBuffer((err, buffer, info) => {
|
|
233
|
+
if (err)
|
|
234
|
+
return void reject(err);
|
|
235
|
+
const dataUrl = `data:image/webp;base64,${buffer.toString('base64')}`;
|
|
236
|
+
resolve({
|
|
237
|
+
format: 'webp',
|
|
238
|
+
w: info.width,
|
|
239
|
+
h: info.height,
|
|
240
|
+
src: dataUrl
|
|
241
|
+
});
|
|
242
|
+
}));
|
|
243
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { type ArtistCache, artists, getAllArtists } from './artist.ts';
|
|
2
|
+
export { type CharacterCache, characters, type RawCharacterCache, rawCharacters, getAllCharacters } from './character.ts';
|
|
3
|
+
export { $DATA as $ART, $PUBLIC, $ROOT } from './directories.ts';
|
|
4
|
+
export { filter } from './filter.ts';
|
|
5
|
+
export { type GalleryCache, type RawGalleryCache, galleries, rawGalleries, allPieces, getPieceBySlug } from './gallery.ts';
|
|
6
|
+
export { processImage, processVideo, processImageFastcache, processVideoFastcache, clearProcessedHashes, cleanUnusedHashes } from './imageprocess.ts';
|
|
7
|
+
export { Artist } from './models/Artist.ts';
|
|
8
|
+
export { FullCharacter, RawCharacter } from './models/Character.ts';
|
|
9
|
+
export { BaseArtPiece, BaseGallery, FullArtPiece, FullGallery, RawGallery, Video, BaseArtist, ExtendedGallery } from './models/Gallery.ts';
|
|
10
|
+
export { Image, Picture, Source } from './models/image.ts';
|
|
11
|
+
export { clearCache } from './util.ts';
|
|
12
|
+
export { getFastHash, readFastCache, flushFastCache, updateFastCache } from './fastcache.ts';
|
|
13
|
+
export { readThemeConfig, readThemeSchema, type BuiltinSettings, type SettingsFor, type ThemeSettingsSchema, ZThemeSettingsSchema, builtinSettings, validateSchema, writeThemeConfig } from './theme/schema.ts';
|
|
14
|
+
export { readPack, writePack } from './pack.ts';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EACN,KAAK,cAAc,EACnB,UAAU,EACV,KAAK,iBAAiB,EACtB,aAAa,EACb,gBAAgB,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,SAAS,EACT,YAAY,EACZ,SAAS,EACT,cAAc,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EACN,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,KAAK,EACL,UAAU,EACV,eAAe,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE7F,OAAO,EACN,eAAe,EACf,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Reexport server-only modules here
|
|
2
|
+
export { artists, getAllArtists } from "./artist.js";
|
|
3
|
+
export { characters, rawCharacters, getAllCharacters } from "./character.js";
|
|
4
|
+
export { $DATA as $ART, $PUBLIC, $ROOT } from "./directories.js";
|
|
5
|
+
export { filter } from "./filter.js";
|
|
6
|
+
export { galleries, rawGalleries, allPieces, getPieceBySlug } from "./gallery.js";
|
|
7
|
+
export { processImage, processVideo, processImageFastcache, processVideoFastcache, clearProcessedHashes, cleanUnusedHashes } from "./imageprocess.js";
|
|
8
|
+
export { Artist } from "./models/Artist.js";
|
|
9
|
+
export { FullCharacter, RawCharacter } from "./models/Character.js";
|
|
10
|
+
export { BaseArtPiece, BaseGallery, FullArtPiece, FullGallery, RawGallery, Video, BaseArtist, ExtendedGallery } from "./models/Gallery.js";
|
|
11
|
+
export { Image, Picture, Source } from "./models/image.js";
|
|
12
|
+
export { clearCache } from "./util.js";
|
|
13
|
+
export { getFastHash, readFastCache, flushFastCache, updateFastCache } from "./fastcache.js";
|
|
14
|
+
export { readThemeConfig, readThemeSchema, ZThemeSettingsSchema, builtinSettings, validateSchema, writeThemeConfig } from "./theme/schema.js";
|
|
15
|
+
export { readPack, writePack } from "./pack.js";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const Artist: z.ZodObject<{
|
|
3
|
+
name: z.ZodString;
|
|
4
|
+
links: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodLiteral<"twitter">, z.ZodLiteral<"facebook">, z.ZodLiteral<"instagram">, z.ZodLiteral<"tumblr">, z.ZodLiteral<"toyhouse">, z.ZodLiteral<"website">, z.ZodLiteral<"linktree">, z.ZodString]>>;
|
|
5
|
+
type: z.ZodDefault<z.ZodLiteral<"Artist">>;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
//# sourceMappingURL=Artist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Artist.d.ts","sourceRoot":"","sources":["../../../src/lib/server/models/Artist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,MAAM;;;;iBAgBjB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const Artist = z.object({
|
|
3
|
+
name: z.string(),
|
|
4
|
+
links: z.record(z.string(), z.union([
|
|
5
|
+
z.literal('twitter'),
|
|
6
|
+
z.literal('facebook'),
|
|
7
|
+
z.literal('instagram'),
|
|
8
|
+
z.literal('tumblr'),
|
|
9
|
+
z.literal('toyhouse'),
|
|
10
|
+
z.literal('website'),
|
|
11
|
+
z.literal('linktree'),
|
|
12
|
+
z.string()
|
|
13
|
+
])),
|
|
14
|
+
type: z.literal('Artist').default('Artist')
|
|
15
|
+
});
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const RawCharacter: z.ZodObject<{
|
|
3
|
+
name: z.ZodString;
|
|
4
|
+
pronouns: z.ZodString;
|
|
5
|
+
thumbnail: z.ZodOptional<z.ZodObject<{
|
|
6
|
+
image: z.ZodString;
|
|
7
|
+
alt: z.ZodString;
|
|
8
|
+
}, z.core.$strip>>;
|
|
9
|
+
picture: z.ZodObject<{
|
|
10
|
+
image: z.ZodString;
|
|
11
|
+
alt: z.ZodString;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
description: z.ZodString;
|
|
14
|
+
short_description: z.ZodOptional<z.ZodString>;
|
|
15
|
+
index: z.ZodNumber;
|
|
16
|
+
type: z.ZodDefault<z.ZodLiteral<"Character">>;
|
|
17
|
+
}, z.core.$strip>;
|
|
18
|
+
export declare const FullCharacter: z.ZodObject<{
|
|
19
|
+
name: z.ZodString;
|
|
20
|
+
pronouns: z.ZodString;
|
|
21
|
+
thumbnail: z.ZodOptional<z.ZodIntersection<z.ZodObject<{
|
|
22
|
+
full: z.ZodObject<{
|
|
23
|
+
sources: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
|
|
24
|
+
src: z.ZodString;
|
|
25
|
+
w: z.ZodNumber;
|
|
26
|
+
h: z.ZodNumber;
|
|
27
|
+
}, z.core.$strip>>>;
|
|
28
|
+
fallback: z.ZodObject<{
|
|
29
|
+
src: z.ZodString;
|
|
30
|
+
w: z.ZodNumber;
|
|
31
|
+
h: z.ZodNumber;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
lqip: z.ZodObject<{
|
|
34
|
+
src: z.ZodString;
|
|
35
|
+
w: z.ZodNumber;
|
|
36
|
+
h: z.ZodNumber;
|
|
37
|
+
}, z.core.$strip>;
|
|
38
|
+
sha256: z.ZodString;
|
|
39
|
+
}, z.core.$strip>;
|
|
40
|
+
thumbnail: z.ZodObject<{
|
|
41
|
+
sources: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
|
|
42
|
+
src: z.ZodString;
|
|
43
|
+
w: z.ZodNumber;
|
|
44
|
+
h: z.ZodNumber;
|
|
45
|
+
}, z.core.$strip>>>;
|
|
46
|
+
fallback: z.ZodObject<{
|
|
47
|
+
src: z.ZodString;
|
|
48
|
+
w: z.ZodNumber;
|
|
49
|
+
h: z.ZodNumber;
|
|
50
|
+
}, z.core.$strip>;
|
|
51
|
+
lqip: z.ZodObject<{
|
|
52
|
+
src: z.ZodString;
|
|
53
|
+
w: z.ZodNumber;
|
|
54
|
+
h: z.ZodNumber;
|
|
55
|
+
}, z.core.$strip>;
|
|
56
|
+
sha256: z.ZodString;
|
|
57
|
+
}, z.core.$strip>;
|
|
58
|
+
phash: z.ZodString;
|
|
59
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
60
|
+
alt: z.ZodString;
|
|
61
|
+
}, z.core.$strip>>>;
|
|
62
|
+
picture: z.ZodIntersection<z.ZodObject<{
|
|
63
|
+
full: z.ZodObject<{
|
|
64
|
+
sources: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
|
|
65
|
+
src: z.ZodString;
|
|
66
|
+
w: z.ZodNumber;
|
|
67
|
+
h: z.ZodNumber;
|
|
68
|
+
}, z.core.$strip>>>;
|
|
69
|
+
fallback: z.ZodObject<{
|
|
70
|
+
src: z.ZodString;
|
|
71
|
+
w: z.ZodNumber;
|
|
72
|
+
h: z.ZodNumber;
|
|
73
|
+
}, z.core.$strip>;
|
|
74
|
+
lqip: z.ZodObject<{
|
|
75
|
+
src: z.ZodString;
|
|
76
|
+
w: z.ZodNumber;
|
|
77
|
+
h: z.ZodNumber;
|
|
78
|
+
}, z.core.$strip>;
|
|
79
|
+
sha256: z.ZodString;
|
|
80
|
+
}, z.core.$strip>;
|
|
81
|
+
thumbnail: z.ZodObject<{
|
|
82
|
+
sources: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
|
|
83
|
+
src: z.ZodString;
|
|
84
|
+
w: z.ZodNumber;
|
|
85
|
+
h: z.ZodNumber;
|
|
86
|
+
}, z.core.$strip>>>;
|
|
87
|
+
fallback: z.ZodObject<{
|
|
88
|
+
src: z.ZodString;
|
|
89
|
+
w: z.ZodNumber;
|
|
90
|
+
h: z.ZodNumber;
|
|
91
|
+
}, z.core.$strip>;
|
|
92
|
+
lqip: z.ZodObject<{
|
|
93
|
+
src: z.ZodString;
|
|
94
|
+
w: z.ZodNumber;
|
|
95
|
+
h: z.ZodNumber;
|
|
96
|
+
}, z.core.$strip>;
|
|
97
|
+
sha256: z.ZodString;
|
|
98
|
+
}, z.core.$strip>;
|
|
99
|
+
phash: z.ZodString;
|
|
100
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
101
|
+
alt: z.ZodString;
|
|
102
|
+
}, z.core.$strip>>;
|
|
103
|
+
description: z.ZodString;
|
|
104
|
+
short_description: z.ZodOptional<z.ZodString>;
|
|
105
|
+
index: z.ZodNumber;
|
|
106
|
+
type: z.ZodDefault<z.ZodLiteral<"Character">>;
|
|
107
|
+
}, z.core.$strip>;
|
|
108
|
+
//# sourceMappingURL=Character.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Character.d.ts","sourceRoot":"","sources":["../../../src/lib/server/models/Character.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsBxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;iBAA4B,CAAC;AACtD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAwB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Picture } from "./image.js";
|
|
3
|
+
const AltPicture = Picture.and(z.object({ alt: z.string() }));
|
|
4
|
+
const BaseAltPicture = z.object({
|
|
5
|
+
image: z.string(),
|
|
6
|
+
alt: z.string()
|
|
7
|
+
});
|
|
8
|
+
function Character(imageType) {
|
|
9
|
+
return z.object({
|
|
10
|
+
name: z.string(),
|
|
11
|
+
pronouns: z.string(),
|
|
12
|
+
thumbnail: imageType.optional(),
|
|
13
|
+
picture: imageType,
|
|
14
|
+
description: z.string(),
|
|
15
|
+
short_description: z.string().optional(),
|
|
16
|
+
index: z.number(),
|
|
17
|
+
type: z.literal('Character').default('Character')
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export const RawCharacter = Character(BaseAltPicture);
|
|
21
|
+
export const FullCharacter = Character(AltPicture);
|