@swoff/cli 0.3.14 → 0.3.15
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/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/cli/help.js +3 -3
- package/dist/lib/cli/help.js.map +1 -1
- package/dist/lib/commands/clean.js +8 -17
- package/dist/lib/commands/clean.js.map +1 -1
- package/dist/lib/commands/generate.js +4 -3
- package/dist/lib/commands/generate.js.map +1 -1
- package/dist/lib/commands/init.js +233 -174
- package/dist/lib/commands/init.js.map +1 -1
- package/dist/lib/commands/validate.js.map +1 -1
- package/dist/lib/config/minimal-config.js +64 -0
- package/dist/lib/config/minimal-config.js.map +1 -0
- package/dist/lib/config/validator.js +18 -15
- package/dist/lib/config/validator.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-generator-build.js +11 -5
- package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -1
- package/dist/lib/generators/sw-sections/activate-handler.js +4 -1
- package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/assemble-sw.js +8 -4
- package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
- package/dist/lib/generators/sw-sections/background-precache.js +126 -0
- package/dist/lib/generators/sw-sections/background-precache.js.map +1 -0
- package/dist/lib/generators/sw-sections/default-template.js +6 -2
- package/dist/lib/generators/sw-sections/default-template.js.map +1 -1
- package/dist/lib/generators/sw-sections/fetch-handler.js +2 -2
- package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/install-handler.js +8 -7
- package/dist/lib/generators/sw-sections/install-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/message-handler.js +9 -0
- package/dist/lib/generators/sw-sections/message-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/shared.js +2 -0
- package/dist/lib/generators/sw-sections/shared.js.map +1 -1
- package/dist/lib/shared/config-types.js +17 -16
- package/dist/lib/shared/config-types.js.map +1 -1
- package/dist/runtime/client-injector.js +15 -0
- package/dist/runtime/client-injector.js.map +1 -1
- package/package.json +9 -3
- package/dist/lib/commands/add.js +0 -62
- package/dist/lib/commands/add.js.map +0 -1
- package/dist/lib/commands/assets.js +0 -45
- package/dist/lib/commands/assets.js.map +0 -1
- package/dist/lib/commands/generate-assets.js +0 -44
- package/dist/lib/commands/generate-assets.js.map +0 -1
- package/dist/lib/commands/info.js +0 -183
- package/dist/lib/commands/info.js.map +0 -1
- package/dist/lib/generators/asset-generator/dependency-resolver.js +0 -85
- package/dist/lib/generators/asset-generator/dependency-resolver.js.map +0 -1
- package/dist/lib/generators/asset-generator/generate.js +0 -111
- package/dist/lib/generators/asset-generator/generate.js.map +0 -1
- package/dist/lib/generators/asset-generator/guide.js +0 -43
- package/dist/lib/generators/asset-generator/guide.js.map +0 -1
- package/dist/lib/generators/asset-generator/html-patcher.js +0 -65
- package/dist/lib/generators/asset-generator/html-patcher.js.map +0 -1
- package/dist/lib/generators/asset-generator/ico-encoder.js +0 -29
- package/dist/lib/generators/asset-generator/ico-encoder.js.map +0 -1
- package/dist/lib/generators/asset-generator/manifest-patcher.js +0 -23
- package/dist/lib/generators/asset-generator/manifest-patcher.js.map +0 -1
- package/dist/lib/generators/asset-generator/maskable.js +0 -15
- package/dist/lib/generators/asset-generator/maskable.js.map +0 -1
- package/dist/lib/generators/asset-generator/rasterize.js +0 -32
- package/dist/lib/generators/asset-generator/rasterize.js.map +0 -1
- package/dist/lib/generators/asset-generator/sizes.js +0 -25
- package/dist/lib/generators/asset-generator/sizes.js.map +0 -1
- package/dist/lib/generators/file-generators/auth-fetch.js +0 -151
- package/dist/lib/generators/file-generators/auth-fetch.js.map +0 -1
- package/dist/lib/generators/file-generators/auth-user.js +0 -13
- package/dist/lib/generators/file-generators/auth-user.js.map +0 -1
- package/dist/lib/generators/file-generators/connectivity-manager.js +0 -12
- package/dist/lib/generators/file-generators/connectivity-manager.js.map +0 -1
- package/dist/lib/generators/file-generators/fetch-state.js +0 -6
- package/dist/lib/generators/file-generators/fetch-state.js.map +0 -1
- package/dist/lib/generators/file-generators/generate-hooks.js +0 -44
- package/dist/lib/generators/file-generators/generate-hooks.js.map +0 -1
- package/dist/lib/generators/file-generators/indexeddb.js +0 -74
- package/dist/lib/generators/file-generators/indexeddb.js.map +0 -1
- package/dist/lib/generators/file-generators/manifest.js +0 -46
- package/dist/lib/generators/file-generators/manifest.js.map +0 -1
- package/dist/lib/generators/file-generators/mutation-reconcile.js +0 -57
- package/dist/lib/generators/file-generators/mutation-reconcile.js.map +0 -1
- package/dist/lib/generators/file-generators/notification-generator.js +0 -6
- package/dist/lib/generators/file-generators/notification-generator.js.map +0 -1
- package/dist/lib/generators/file-generators/quick-readme.js +0 -21
- package/dist/lib/generators/file-generators/quick-readme.js.map +0 -1
- package/dist/lib/generators/file-generators/reconcile.js +0 -50
- package/dist/lib/generators/file-generators/reconcile.js.map +0 -1
- package/dist/lib/generators/file-generators/storage-generator.js +0 -6
- package/dist/lib/generators/file-generators/storage-generator.js.map +0 -1
- package/dist/lib/generators/file-generators/storage-notify.js +0 -6
- package/dist/lib/generators/file-generators/storage-notify.js.map +0 -1
- package/dist/lib/generators/file-generators/store.js +0 -86
- package/dist/lib/generators/file-generators/store.js.map +0 -1
- package/dist/lib/generators/file-generators/sw-push.js +0 -67
- package/dist/lib/generators/file-generators/sw-push.js.map +0 -1
- package/dist/lib/generators/file-generators/sw-version-gen.js +0 -32
- package/dist/lib/generators/file-generators/sw-version-gen.js.map +0 -1
- package/dist/lib/generators/sw-sections/glob-matcher-code.js.map +0 -1
- package/dist/lib/utils/build-script.js +0 -35
- package/dist/lib/utils/build-script.js.map +0 -1
- package/dist/lib/utils/tty-status.js +0 -21
- package/dist/lib/utils/tty-status.js.map +0 -1
- package/dist/runtime/auth-user.js +0 -154
- package/dist/runtime/auth-user.js.map +0 -1
- package/dist/runtime/connectivity-manager.js +0 -83
- package/dist/runtime/connectivity-manager.js.map +0 -1
- package/dist/runtime/fetch-state.js +0 -42
- package/dist/runtime/fetch-state.js.map +0 -1
- package/dist/runtime/notification.js +0 -65
- package/dist/runtime/notification.js.map +0 -1
- package/dist/runtime/pwa-index.js +0 -11
- package/dist/runtime/pwa-index.js.map +0 -1
- package/dist/runtime/pwa-injector.js +0 -15
- package/dist/runtime/pwa-injector.js.map +0 -1
- package/dist/runtime/pwa-install.js +0 -83
- package/dist/runtime/pwa-install.js.map +0 -1
- package/dist/runtime/sw-version.js +0 -13
- package/dist/runtime/sw-version.js.map +0 -1
- package/dist/swoff-nkdhhmw8. +0 -18
- package/dist/swoff.js +0 -5
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import { readFileSync, existsSync, readdirSync } from "fs";
|
|
2
|
-
import { join, dirname } from "path";
|
|
3
|
-
import { fileURLToPath } from "url";
|
|
4
|
-
import { log } from "../cli/logger.js";
|
|
5
|
-
import { loadConfigAsync } from "../config/loader.js";
|
|
6
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
const FEATURES = {
|
|
8
|
-
"mutation-queue": {
|
|
9
|
-
label: "Mutation Queue",
|
|
10
|
-
description: "Queues offline write operations in IndexedDB and replays them when the connection returns. Supports configurable batch size, rate limiting between mutations, and exponential backoff on retry. Uses the Background Sync API or the online event listener.",
|
|
11
|
-
files: ["mutation-queue.ts", "mutation-state.ts"],
|
|
12
|
-
functions: [
|
|
13
|
-
"queueMutation(mutation) — store a write for later sync",
|
|
14
|
-
"processMutationQueue() — replay all queued writes (respects batchSize, batchDelayMs, maxRetries, retryBackoffMs)",
|
|
15
|
-
"flushMutations() — same as processMutationQueue, call after re-login",
|
|
16
|
-
"getPendingCount() — number of mutations waiting to sync",
|
|
17
|
-
"trackMutation(id, status) / getMutationState(id) / clearMutationState(id) — per-mutation state tracking",
|
|
18
|
-
],
|
|
19
|
-
},
|
|
20
|
-
"background-sync": {
|
|
21
|
-
label: "Background Sync",
|
|
22
|
-
description: "Registers Background Sync API events so mutations are processed even after the tab is closed. Falls back to online event listener in unsupported browsers (Firefox, Safari).",
|
|
23
|
-
files: ["background-sync.ts"],
|
|
24
|
-
functions: [
|
|
25
|
-
"syncWhenPossible(mutation) — queue and register background sync",
|
|
26
|
-
"retrySync() — re-register sync if mutations are still pending",
|
|
27
|
-
],
|
|
28
|
-
},
|
|
29
|
-
auth: {
|
|
30
|
-
label: "Auth",
|
|
31
|
-
description: "Token-based authentication with memory-only tokens, IndexedDB user caching, and auth-aware fetch with automatic 401 handling.",
|
|
32
|
-
files: ["auth/store.ts", "auth/user.ts", "auth/state.ts"],
|
|
33
|
-
functions: [
|
|
34
|
-
"setAuth(authData) / getAuth() / clearAuth() — manage auth state",
|
|
35
|
-
"isAuthValid(auth) — check expiry",
|
|
36
|
-
"createAuthFromResponse(response) — extract AuthData from login response (edit this)",
|
|
37
|
-
"fetchWithCache(input, { auth: true }) — auth-aware fetch (handles bearer, cookie, custom)",
|
|
38
|
-
"ensureValidAuth() — check expiry and refresh token",
|
|
39
|
-
"fetchCurrentUser() / getCachedUser() / cacheUser(user) / clearCachedUser() — user caching",
|
|
40
|
-
"getAuthState() — detect 4-state matrix (online/offline × authenticated/not)",
|
|
41
|
-
],
|
|
42
|
-
},
|
|
43
|
-
"tag-invalidation": {
|
|
44
|
-
label: "Tag Invalidation",
|
|
45
|
-
description: "Generates cache tags from URLs and invalidates stale cache entries after mutations. Keeps cached data fresh.",
|
|
46
|
-
files: ["invalidation-tags.ts", "cache.ts"],
|
|
47
|
-
functions: [
|
|
48
|
-
"generateTags(url) — extract tags from URL (e.g. /api/todos/42 → ['todos', 'todo:42'])",
|
|
49
|
-
"generateTagsFromMethod(method, url) — method-prefixed tags",
|
|
50
|
-
"invalidateUrl(url) — invalidate all cache entries matching a URL's tags",
|
|
51
|
-
"invalidateByTag(tag) / invalidateByTags(tags) — low-level invalidation",
|
|
52
|
-
],
|
|
53
|
-
},
|
|
54
|
-
"cross-tab": {
|
|
55
|
-
label: "Cross-tab Sync",
|
|
56
|
-
description: "Broadcasts cache invalidation and auth state changes across all open tabs via the service worker.",
|
|
57
|
-
files: ["client-injector.ts (internal handling)"],
|
|
58
|
-
functions: ["No separate imports needed — handled automatically by client-injector.ts"],
|
|
59
|
-
},
|
|
60
|
-
graphql: {
|
|
61
|
-
label: "GraphQL",
|
|
62
|
-
description: "A fetchWithGql wrapper that brings Swoff's caching, offline queue, and tag-based invalidation to GraphQL APIs. Hashes query + variables for deterministic cache keys, auto-detects queries vs mutations, and generates tags from operation names.",
|
|
63
|
-
files: ["gql-wrapper.ts"],
|
|
64
|
-
functions: [
|
|
65
|
-
"fetchWithGql<T>(query, options?) — unified GQL fetch with caching, auth, offline queue, auto-invalidation",
|
|
66
|
-
"queryGql<T>(query, variables?, options?) — shorthand for GQL queries (type: 'read')",
|
|
67
|
-
"mutateGql<T>(mutation, variables?, options?) — shorthand for GQL mutations (type: 'mutation')",
|
|
68
|
-
],
|
|
69
|
-
},
|
|
70
|
-
"push-notification": {
|
|
71
|
-
label: "Push Notifications",
|
|
72
|
-
description: "Push notification subscription management with IndexedDB persistence, VAPID key support, and service worker push/notificationclick event handlers.",
|
|
73
|
-
files: ["push.ts"],
|
|
74
|
-
functions: [
|
|
75
|
-
"subscribeToPush() — request permission and subscribe (uses VAPID key from config)",
|
|
76
|
-
"unsubscribeFromPush() — unsubscribe and clear stored subscription",
|
|
77
|
-
"isSubscribed() — check subscription status",
|
|
78
|
-
"getPushSubscription() — get current PushSubscription object",
|
|
79
|
-
"requestNotificationPermission() — request permission only",
|
|
80
|
-
],
|
|
81
|
-
},
|
|
82
|
-
"server-push": {
|
|
83
|
-
label: "Server Push Events",
|
|
84
|
-
description: "Real-time cache invalidation via SSE or WebSocket. The service worker connects to a push endpoint and invalidates cache tags when the server signals data changes — no polling needed.",
|
|
85
|
-
files: ["server-push.ts"],
|
|
86
|
-
functions: [
|
|
87
|
-
"startPushEvents() — connect to push endpoint and listen for invalidate events",
|
|
88
|
-
"stopPushEvents() — disconnect from push endpoint",
|
|
89
|
-
"isPushConnected() — check connection status",
|
|
90
|
-
],
|
|
91
|
-
},
|
|
92
|
-
pwa: {
|
|
93
|
-
label: "PWA",
|
|
94
|
-
description: "Install prompt handling, manifest generation, and React hooks for update management.",
|
|
95
|
-
files: ["pwa/install.ts", "manifest.json"],
|
|
96
|
-
functions: [
|
|
97
|
-
"setupPwaInstall() — listen for beforeinstallprompt/appinstalled events",
|
|
98
|
-
"isInstallable() — check if install prompt is available",
|
|
99
|
-
"promptInstall() — show native install prompt",
|
|
100
|
-
],
|
|
101
|
-
},
|
|
102
|
-
};
|
|
103
|
-
function countFilesRecursive(dir) {
|
|
104
|
-
let count = 0;
|
|
105
|
-
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
106
|
-
const full = join(dir, entry.name);
|
|
107
|
-
if (entry.isDirectory()) {
|
|
108
|
-
count += countFilesRecursive(full);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
count++;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return count;
|
|
115
|
-
}
|
|
116
|
-
function showFeatureDetail(feature) {
|
|
117
|
-
const key = feature.toLowerCase().replace(/[_-]/g, "-").replace(/^-+|-+$/g, "");
|
|
118
|
-
const info = FEATURES[key];
|
|
119
|
-
if (!info) {
|
|
120
|
-
log.error(`Unknown feature: ${feature}`);
|
|
121
|
-
log.info("Available: mutation-queue, background-sync, auth, tag-invalidation, cross-tab, graphql, push-notification, server-push, pwa");
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
log.header(info.label);
|
|
125
|
-
log.normal(info.description);
|
|
126
|
-
log.normal("\nGenerated files:");
|
|
127
|
-
info.files.forEach((f) => log.help(` swoff/${f}`));
|
|
128
|
-
log.normal("\nFunctions:");
|
|
129
|
-
info.functions.forEach((f) => log.help(` ${f}`));
|
|
130
|
-
log.help("\n Read swoff/GUIDE.md for documentation links.");
|
|
131
|
-
}
|
|
132
|
-
export async function infoCommand(projectRoot, feature) {
|
|
133
|
-
if (feature) {
|
|
134
|
-
return showFeatureDetail(feature);
|
|
135
|
-
}
|
|
136
|
-
const { config, configPath } = await loadConfigAsync(projectRoot);
|
|
137
|
-
if (!configPath) {
|
|
138
|
-
log.warn('No swoff.config.json found. Run "swoff init" first.');
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
log.header("Swoff");
|
|
142
|
-
try {
|
|
143
|
-
const pkgDir = join(__dirname, "..", "..", "..");
|
|
144
|
-
const pkg = JSON.parse(readFileSync(join(pkgDir, "package.json"), "utf8"));
|
|
145
|
-
log.normal(`Version: ${pkg.version}`);
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
// version not available
|
|
149
|
-
}
|
|
150
|
-
const enabled = [];
|
|
151
|
-
if (config.features.mutationQueue.enabled)
|
|
152
|
-
enabled.push("mutation-queue");
|
|
153
|
-
if (config.features.backgroundSync)
|
|
154
|
-
enabled.push("background-sync");
|
|
155
|
-
if (config.features.auth.enabled)
|
|
156
|
-
enabled.push("auth");
|
|
157
|
-
if (config.features.crossTabSync)
|
|
158
|
-
enabled.push("cross-tab");
|
|
159
|
-
if (config.features.graphql.enabled)
|
|
160
|
-
enabled.push("graphql");
|
|
161
|
-
if (config.features.pushNotifications?.enabled)
|
|
162
|
-
enabled.push("push-notification");
|
|
163
|
-
if (config.features.serverPush.enabled)
|
|
164
|
-
enabled.push("server-push");
|
|
165
|
-
if (config.features.pwa.enabled)
|
|
166
|
-
enabled.push("pwa");
|
|
167
|
-
enabled.push("tag-invalidation");
|
|
168
|
-
if (enabled.length > 0) {
|
|
169
|
-
log.normal(`\nEnabled features: ${enabled.join(", ")}`);
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
log.normal("\nEnabled features: (none)");
|
|
173
|
-
}
|
|
174
|
-
const swoffDir = join(projectRoot, "swoff");
|
|
175
|
-
if (existsSync(swoffDir)) {
|
|
176
|
-
const count = countFilesRecursive(swoffDir);
|
|
177
|
-
log.normal(`Generated files: ${count} in swoff/`);
|
|
178
|
-
}
|
|
179
|
-
log.help("\n swoff info <feature> — detailed info for a feature");
|
|
180
|
-
log.help(" Features: mutation-queue, background-sync, auth, tag-invalidation, cross-tab, graphql, push-notification, server-push, pwa");
|
|
181
|
-
log.help(" Read swoff/GUIDE.md for documentation links");
|
|
182
|
-
}
|
|
183
|
-
//# sourceMappingURL=info.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/lib/commands/info.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { mkdirSync, writeFileSync, readFileSync, existsSync, rmSync } from "fs";
|
|
2
|
-
import { join } from "path";
|
|
3
|
-
import { homedir } from "os";
|
|
4
|
-
const CACHE_DIR = join(homedir(), ".swoff", "cache", "assets");
|
|
5
|
-
const JIMP_VERSION = "1.6.0";
|
|
6
|
-
const RESVG_VERSION = "2.6.2";
|
|
7
|
-
const JIMP_URL = `https://esm.sh/jimp@${JIMP_VERSION}`;
|
|
8
|
-
const JIMP_FALLBACK_URL = `https://cdn.jsdelivr.net/npm/jimp@${JIMP_VERSION}/+esm`;
|
|
9
|
-
const RESVG_JS_URL = `https://cdn.jsdelivr.net/npm/@resvg/resvg-wasm@${RESVG_VERSION}/index.mjs`;
|
|
10
|
-
const RESVG_WASM_URL = `https://cdn.jsdelivr.net/npm/@resvg/resvg-wasm@${RESVG_VERSION}/index_bg.wasm`;
|
|
11
|
-
function cachePath(filename) {
|
|
12
|
-
return join(CACHE_DIR, filename);
|
|
13
|
-
}
|
|
14
|
-
async function download(url) {
|
|
15
|
-
const res = await fetch(url);
|
|
16
|
-
if (!res.ok) {
|
|
17
|
-
throw new Error(`swoff: failed to download ${url} (${res.status} ${res.statusText}). ` +
|
|
18
|
-
"Check your internet connection and run 'swoff assets' again.");
|
|
19
|
-
}
|
|
20
|
-
return Buffer.from(await res.arrayBuffer());
|
|
21
|
-
}
|
|
22
|
-
async function downloadWithFallback(primary, fallback) {
|
|
23
|
-
try {
|
|
24
|
-
return await download(primary);
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
return await download(fallback);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
function writeToCache(filename, data) {
|
|
31
|
-
mkdirSync(CACHE_DIR, { recursive: true });
|
|
32
|
-
writeFileSync(cachePath(filename), data);
|
|
33
|
-
}
|
|
34
|
-
export async function resolveJimp() {
|
|
35
|
-
try {
|
|
36
|
-
return await import("jimp");
|
|
37
|
-
}
|
|
38
|
-
catch { }
|
|
39
|
-
const filename = `jimp-v${JIMP_VERSION}.mjs`;
|
|
40
|
-
const filePath = cachePath(filename);
|
|
41
|
-
if (existsSync(filePath)) {
|
|
42
|
-
try {
|
|
43
|
-
return await import(`file://${filePath}`);
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
rmSync(filePath);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
const buf = await downloadWithFallback(JIMP_URL, JIMP_FALLBACK_URL);
|
|
50
|
-
writeToCache(filename, buf);
|
|
51
|
-
return await import(`file://${filePath}`);
|
|
52
|
-
}
|
|
53
|
-
export async function resolveResvg() {
|
|
54
|
-
try {
|
|
55
|
-
const mod = await import("@resvg/resvg-wasm");
|
|
56
|
-
const { createRequire } = await import("module");
|
|
57
|
-
const require = createRequire(import.meta.url);
|
|
58
|
-
try {
|
|
59
|
-
const wasmPath = require.resolve("@resvg/resvg-wasm/index_bg.wasm");
|
|
60
|
-
return { ...mod, wasmBuffer: readFileSync(wasmPath) };
|
|
61
|
-
}
|
|
62
|
-
catch { }
|
|
63
|
-
}
|
|
64
|
-
catch { }
|
|
65
|
-
const jsFilename = `resvg-v${RESVG_VERSION}.mjs`;
|
|
66
|
-
const wasmFilename = `resvg-v${RESVG_VERSION}.wasm`;
|
|
67
|
-
const jsPath = cachePath(jsFilename);
|
|
68
|
-
const wasmPath = cachePath(wasmFilename);
|
|
69
|
-
if (existsSync(jsPath) && existsSync(wasmPath)) {
|
|
70
|
-
try {
|
|
71
|
-
const mod = await import(`file://${jsPath}`);
|
|
72
|
-
return { ...mod, wasmBuffer: readFileSync(wasmPath) };
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
rmSync(jsPath);
|
|
76
|
-
rmSync(wasmPath);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
const [jsBuf, wasmBuf] = await Promise.all([download(RESVG_JS_URL), download(RESVG_WASM_URL)]);
|
|
80
|
-
writeToCache(jsFilename, jsBuf);
|
|
81
|
-
writeToCache(wasmFilename, wasmBuf);
|
|
82
|
-
const mod = await import(`file://${jsPath}`);
|
|
83
|
-
return { ...mod, wasmBuffer: readFileSync(wasmPath) };
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=dependency-resolver.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../../../src/lib/generators/asset-generator/dependency-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { mkdirSync, writeFileSync } from "fs";
|
|
2
|
-
import { dirname, join } from "path";
|
|
3
|
-
import { rasterizeSource } from "./rasterize.js";
|
|
4
|
-
import { createMaskable } from "./maskable.js";
|
|
5
|
-
import { encodeIco } from "./ico-encoder.js";
|
|
6
|
-
import { resolveJimp } from "./dependency-resolver.js";
|
|
7
|
-
import { PWA_ICONS, APPLE_ICONS, APPLE_SPLASH_SCREENS, FAVICON_SIZES, OG_IMAGE, } from "./sizes.js";
|
|
8
|
-
function writePng(filePath, buffer) {
|
|
9
|
-
mkdirSync(dirname(filePath), { recursive: true });
|
|
10
|
-
writeFileSync(filePath, buffer);
|
|
11
|
-
}
|
|
12
|
-
export async function generateAssets(options) {
|
|
13
|
-
const { Jimp } = await resolveJimp();
|
|
14
|
-
const { source, outputDir, appName, themeColor, bgColor, appleSplash } = options;
|
|
15
|
-
const warnings = [];
|
|
16
|
-
const files = [];
|
|
17
|
-
mkdirSync(outputDir, { recursive: true });
|
|
18
|
-
const themeColorInt = hexToRgbaInt(themeColor);
|
|
19
|
-
const bgColorInt = hexToRgbaInt(bgColor);
|
|
20
|
-
const basePng = await rasterizeSource(source, 1024);
|
|
21
|
-
const baseImg = await Jimp.read(basePng);
|
|
22
|
-
const baseW = baseImg.bitmap.width;
|
|
23
|
-
const baseH = baseImg.bitmap.height;
|
|
24
|
-
function resizeToSquare(size) {
|
|
25
|
-
return resizePng(basePng, size, size);
|
|
26
|
-
}
|
|
27
|
-
// 1. PWA icons
|
|
28
|
-
for (const icon of PWA_ICONS) {
|
|
29
|
-
if (icon.purpose === "maskable") {
|
|
30
|
-
const buf = await createMaskable(basePng, icon.width, bgColorInt);
|
|
31
|
-
const path = join(outputDir, `${icon.name}.png`);
|
|
32
|
-
writePng(path, buf);
|
|
33
|
-
files.push(path);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
const buf = await resizeToSquare(icon.width);
|
|
37
|
-
const path = join(outputDir, `${icon.name}.png`);
|
|
38
|
-
writePng(path, buf);
|
|
39
|
-
files.push(path);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
// 2. Apple touch icon
|
|
43
|
-
for (const icon of APPLE_ICONS) {
|
|
44
|
-
const buf = await resizeToSquare(icon.width);
|
|
45
|
-
const path = join(outputDir, `${icon.name}.png`);
|
|
46
|
-
writePng(path, buf);
|
|
47
|
-
files.push(path);
|
|
48
|
-
}
|
|
49
|
-
// 3. Favicon ICO
|
|
50
|
-
const icoPngs = [];
|
|
51
|
-
for (const size of FAVICON_SIZES) {
|
|
52
|
-
icoPngs.push(await resizeToSquare(size.width));
|
|
53
|
-
}
|
|
54
|
-
const icoPath = join(outputDir, "favicon.ico");
|
|
55
|
-
writePng(icoPath, encodeIco(icoPngs));
|
|
56
|
-
files.push(icoPath);
|
|
57
|
-
// 4. OG image 1200x630
|
|
58
|
-
{
|
|
59
|
-
const og = OG_IMAGE;
|
|
60
|
-
const img = await Jimp.read(basePng);
|
|
61
|
-
const canvas = new Jimp({ width: og.width, height: og.height, color: bgColorInt });
|
|
62
|
-
const maxW = og.width * 0.7;
|
|
63
|
-
const maxH = og.height * 0.6;
|
|
64
|
-
const scale = Math.min(maxW / img.bitmap.width, maxH / img.bitmap.height);
|
|
65
|
-
const newW = Math.round(img.bitmap.width * scale);
|
|
66
|
-
const newH = Math.round(img.bitmap.height * scale);
|
|
67
|
-
img.resize({ w: newW, h: newH });
|
|
68
|
-
canvas.composite(img, Math.round((og.width - newW) / 2), Math.round((og.height - newH) / 2 + og.height * 0.05));
|
|
69
|
-
const path = join(outputDir, `${og.name}.png`);
|
|
70
|
-
writePng(path, await canvas.getBuffer("image/png"));
|
|
71
|
-
files.push(path);
|
|
72
|
-
}
|
|
73
|
-
// 5. Apple splash screens
|
|
74
|
-
if (appleSplash !== false) {
|
|
75
|
-
for (const splash of APPLE_SPLASH_SCREENS) {
|
|
76
|
-
const img = await Jimp.read(basePng);
|
|
77
|
-
const canvas = new Jimp({ width: splash.width, height: splash.height, color: bgColorInt });
|
|
78
|
-
const maxLogoDim = Math.min(splash.width, splash.height) * 0.3;
|
|
79
|
-
const scale = Math.min(maxLogoDim / baseW, maxLogoDim / baseH);
|
|
80
|
-
const newW = Math.round(baseW * scale);
|
|
81
|
-
const newH = Math.round(baseH * scale);
|
|
82
|
-
img.resize({ w: newW, h: newH });
|
|
83
|
-
canvas.composite(img, Math.round((splash.width - newW) / 2), Math.round((splash.height - newH) / 2));
|
|
84
|
-
const path = join(outputDir, `${splash.name}.png`);
|
|
85
|
-
writePng(path, await canvas.getBuffer("image/png"));
|
|
86
|
-
files.push(path);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return { files, warnings };
|
|
90
|
-
}
|
|
91
|
-
async function resizePng(sourceBuf, w, h) {
|
|
92
|
-
const { Jimp } = await resolveJimp();
|
|
93
|
-
const img = await Jimp.read(sourceBuf);
|
|
94
|
-
const scale = Math.min(w / img.bitmap.width, h / img.bitmap.height);
|
|
95
|
-
const newW = Math.round(img.bitmap.width * scale);
|
|
96
|
-
const newH = Math.round(img.bitmap.height * scale);
|
|
97
|
-
img.resize({ w: newW, h: newH });
|
|
98
|
-
const canvas = new Jimp({ width: w, height: h, color: 0x00000000 });
|
|
99
|
-
canvas.composite(img, Math.round((w - newW) / 2), Math.round((h - newH) / 2));
|
|
100
|
-
return canvas.getBuffer("image/png");
|
|
101
|
-
}
|
|
102
|
-
function hexToRgbaInt(hex) {
|
|
103
|
-
let h = hex.replace("#", "");
|
|
104
|
-
if (h.length === 3)
|
|
105
|
-
h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2];
|
|
106
|
-
const r = parseInt(h.slice(0, 2), 16);
|
|
107
|
-
const g = parseInt(h.slice(2, 4), 16);
|
|
108
|
-
const b = parseInt(h.slice(4, 6), 16);
|
|
109
|
-
return ((r << 24) | (g << 16) | (b << 8) | 0xff) >>> 0;
|
|
110
|
-
}
|
|
111
|
-
//# sourceMappingURL=generate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../../src/lib/generators/asset-generator/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { log } from "../../cli/logger.js";
|
|
2
|
-
export function printAssetGuide(opts) {
|
|
3
|
-
log.normal("");
|
|
4
|
-
log.help("To use these assets, add the following to your app:");
|
|
5
|
-
if (opts.outputDir === "public") {
|
|
6
|
-
log.normal("");
|
|
7
|
-
log.help("In your HTML <head>:");
|
|
8
|
-
log.help(` <link rel="icon" type="image/x-icon" href="/favicon.ico">`);
|
|
9
|
-
log.help(` <link rel="apple-touch-icon" href="/apple-touch-icon.png">`);
|
|
10
|
-
log.help(` <link rel="manifest" href="/manifest.json">`);
|
|
11
|
-
log.help(` <meta name="theme-color" content="${opts.themeColor}">`);
|
|
12
|
-
log.help(` <meta name="apple-mobile-web-app-capable" content="yes">`);
|
|
13
|
-
log.normal("");
|
|
14
|
-
log.help("Open Graph / social sharing:");
|
|
15
|
-
log.help(` <meta property="og:image" content="/og-image.png">`);
|
|
16
|
-
log.help(` <meta property="og:image:width" content="1200">`);
|
|
17
|
-
log.help(` <meta property="og:image:height" content="630">`);
|
|
18
|
-
log.help(` <meta name="twitter:card" content="summary_large_image">`);
|
|
19
|
-
if (opts.hasSplash) {
|
|
20
|
-
log.normal("");
|
|
21
|
-
log.help("Apple splash screens (add to <head>):");
|
|
22
|
-
log.help(' <!-- iPad Pro 12.9" -->');
|
|
23
|
-
log.help(' <link rel="apple-touch-startup-image" href="/splash-2048x2732.png" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2)">');
|
|
24
|
-
log.help(' <!-- iPad Pro 10.5" -->');
|
|
25
|
-
log.help(' <link rel="apple-touch-startup-image" href="/splash-1668x2224.png" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2)">');
|
|
26
|
-
log.help(' <!-- iPad Mini / Air -->');
|
|
27
|
-
log.help(' <link rel="apple-touch-startup-image" href="/splash-1536x2048.png" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2)">');
|
|
28
|
-
log.help(' <!-- iPhone X/XS/11 Pro -->');
|
|
29
|
-
log.help(' <link rel="apple-touch-startup-image" href="/splash-1125x2436.png" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3)">');
|
|
30
|
-
log.help(' <!-- iPhone 6/7/8 Plus -->');
|
|
31
|
-
log.help(' <link rel="apple-touch-startup-image" href="/splash-1242x2208.png" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3)">');
|
|
32
|
-
log.help(' <!-- iPhone 6/7/8 -->');
|
|
33
|
-
log.help(' <link rel="apple-touch-startup-image" href="/splash-750x1334.png" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2)">');
|
|
34
|
-
log.help(' <!-- iPhone 5/SE -->');
|
|
35
|
-
log.help(' <link rel="apple-touch-startup-image" href="/splash-640x1136.png" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)">');
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
log.normal("");
|
|
40
|
-
log.help(`Assets written to "${opts.outputDir}/". Adapt the paths above to match your setup.`);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=guide.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"guide.js","sourceRoot":"","sources":["../../../../src/lib/generators/asset-generator/guide.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAU1C,MAAM,UAAU,eAAe,CAAC,IAAuB;IACrD,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACf,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAEhE,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QACxE,GAAG,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QACzE,GAAG,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,uCAAuC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;QACrE,GAAG,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAEvE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACjE,GAAG,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAC9D,GAAG,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAC9D,GAAG,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAEvE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YAClD,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACtC,GAAG,CAAC,IAAI,CAAC,sKAAsK,CAAC,CAAC;YACjL,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACtC,GAAG,CAAC,IAAI,CAAC,qKAAqK,CAAC,CAAC;YAChL,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,qKAAqK,CAAC,CAAC;YAChL,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC1C,GAAG,CAAC,IAAI,CAAC,oKAAoK,CAAC,CAAC;YAC/K,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YACzC,GAAG,CAAC,IAAI,CAAC,oKAAoK,CAAC,CAAC;YAC/K,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,mKAAmK,CAAC,CAAC;YAC9K,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,mKAAmK,CAAC,CAAC;QAChL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,SAAS,gDAAgD,CAAC,CAAC;IACjG,CAAC;AACH,CAAC"}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, existsSync } from "fs";
|
|
2
|
-
const SPLASH_MEDIA = {
|
|
3
|
-
"splash-2048x2732": "(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2)",
|
|
4
|
-
"splash-1668x2224": "(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2)",
|
|
5
|
-
"splash-1536x2048": "(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2)",
|
|
6
|
-
"splash-1125x2436": "(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3)",
|
|
7
|
-
"splash-1242x2208": "(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3)",
|
|
8
|
-
"splash-750x1334": "(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2)",
|
|
9
|
-
"splash-640x1136": "(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)",
|
|
10
|
-
};
|
|
11
|
-
export function patchHtml(htmlPath, meta) {
|
|
12
|
-
if (!existsSync(htmlPath))
|
|
13
|
-
return;
|
|
14
|
-
let html = readFileSync(htmlPath, "utf-8");
|
|
15
|
-
const insertBefore = "</head>";
|
|
16
|
-
if (!html.includes(insertBefore))
|
|
17
|
-
return;
|
|
18
|
-
const tags = [];
|
|
19
|
-
if (meta.faviconIcoPath && !html.includes("favicon.ico")) {
|
|
20
|
-
tags.push(` <link rel="icon" type="image/x-icon" href="${meta.faviconIcoPath}">`);
|
|
21
|
-
}
|
|
22
|
-
if (meta.appleTouchIconPath && !html.includes("apple-touch-icon")) {
|
|
23
|
-
tags.push(` <link rel="apple-touch-icon" href="${meta.appleTouchIconPath}">`);
|
|
24
|
-
}
|
|
25
|
-
if (!html.includes("apple-mobile-web-app-capable")) {
|
|
26
|
-
tags.push(` <meta name="apple-mobile-web-app-capable" content="yes">`);
|
|
27
|
-
}
|
|
28
|
-
if (meta.themeColor && !html.includes('name="theme-color"') && !html.includes("name='theme-color'")) {
|
|
29
|
-
tags.push(` <meta name="theme-color" content="${meta.themeColor}">`);
|
|
30
|
-
}
|
|
31
|
-
if (meta.bgColor && !html.includes('name="background-color"')) {
|
|
32
|
-
tags.push(` <meta name="background-color" content="${meta.bgColor}">`);
|
|
33
|
-
}
|
|
34
|
-
if (meta.ogImagePath) {
|
|
35
|
-
if (!html.includes('property="og:image"')) {
|
|
36
|
-
tags.push(` <meta property="og:image" content="${meta.ogImagePath}">`);
|
|
37
|
-
tags.push(` <meta property="og:image:width" content="1200">`);
|
|
38
|
-
tags.push(` <meta property="og:image:height" content="630">`);
|
|
39
|
-
}
|
|
40
|
-
if (!html.includes('name="twitter:card"') && !html.includes("name='twitter:card'")) {
|
|
41
|
-
tags.push(` <meta name="twitter:card" content="summary_large_image">`);
|
|
42
|
-
}
|
|
43
|
-
if (!html.includes('name="twitter:image"')) {
|
|
44
|
-
tags.push(` <meta name="twitter:image" content="${meta.ogImagePath}">`);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
if (meta.appName) {
|
|
48
|
-
if (!html.includes('property="og:title"') && !html.includes("name='twitter:title'")) {
|
|
49
|
-
tags.push(` <meta property="og:title" content="${meta.appName}">`);
|
|
50
|
-
tags.push(` <meta name="twitter:title" content="${meta.appName}">`);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
for (const splash of meta.splashPaths) {
|
|
54
|
-
const name = splash.replace(/\.png$/, "").replace(/^\//, "");
|
|
55
|
-
const media = SPLASH_MEDIA[name];
|
|
56
|
-
if (media && !html.includes(name)) {
|
|
57
|
-
tags.push(` <link rel="apple-touch-startup-image" href="${splash}" media="${media}">`);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
if (tags.length > 0) {
|
|
61
|
-
html = html.replace(insertBefore, `${tags.join("\n")}\n${insertBefore}`);
|
|
62
|
-
writeFileSync(htmlPath, html);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=html-patcher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"html-patcher.js","sourceRoot":"","sources":["../../../../src/lib/generators/asset-generator/html-patcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
export function encodeIco(pngBuffers) {
|
|
2
|
-
const count = pngBuffers.length;
|
|
3
|
-
const headerSize = 6;
|
|
4
|
-
const dirEntrySize = 16;
|
|
5
|
-
const totalDataSize = pngBuffers.reduce((a, b) => a + b.length, 0);
|
|
6
|
-
const buf = Buffer.alloc(headerSize + count * dirEntrySize + totalDataSize);
|
|
7
|
-
buf.writeUInt16LE(0, 0);
|
|
8
|
-
buf.writeUInt16LE(1, 2);
|
|
9
|
-
buf.writeUInt16LE(count, 4);
|
|
10
|
-
let offset = headerSize + count * dirEntrySize;
|
|
11
|
-
for (let i = 0; i < count; i++) {
|
|
12
|
-
const png = pngBuffers[i];
|
|
13
|
-
const w = png.readUInt32BE(16);
|
|
14
|
-
const h = png.readUInt32BE(20);
|
|
15
|
-
const pos = headerSize + i * dirEntrySize;
|
|
16
|
-
buf.writeUInt8(w === 256 ? 0 : w, pos);
|
|
17
|
-
buf.writeUInt8(h === 256 ? 0 : h, pos + 1);
|
|
18
|
-
buf.writeUInt8(0, pos + 2);
|
|
19
|
-
buf.writeUInt8(0, pos + 3);
|
|
20
|
-
buf.writeUInt16LE(1, pos + 4);
|
|
21
|
-
buf.writeUInt16LE(32, pos + 6);
|
|
22
|
-
buf.writeUInt32LE(png.length, pos + 8);
|
|
23
|
-
buf.writeUInt32LE(offset, pos + 12);
|
|
24
|
-
png.copy(buf, offset);
|
|
25
|
-
offset += png.length;
|
|
26
|
-
}
|
|
27
|
-
return buf;
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=ico-encoder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ico-encoder.js","sourceRoot":"","sources":["../../../../src/lib/generators/asset-generator/ico-encoder.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,UAAoB;IAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;IAChC,MAAM,UAAU,GAAG,CAAC,CAAC;IACrB,MAAM,YAAY,GAAG,EAAE,CAAC;IACxB,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,GAAG,YAAY,GAAG,aAAa,CAAC,CAAC;IAE5E,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxB,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxB,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAE5B,IAAI,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,YAAY,CAAC;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,UAAU,GAAG,CAAC,GAAG,YAAY,CAAC;QAC1C,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAC3C,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAC9B,GAAG,CAAC,aAAa,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAC/B,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACvC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;QACpC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync } from "fs";
|
|
2
|
-
export function patchManifest(manifestPath, assets) {
|
|
3
|
-
let manifest;
|
|
4
|
-
try {
|
|
5
|
-
manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
|
|
6
|
-
}
|
|
7
|
-
catch {
|
|
8
|
-
manifest = {
|
|
9
|
-
name: "App", short_name: "App", description: "",
|
|
10
|
-
start_url: "/", display: "standalone",
|
|
11
|
-
background_color: "#ffffff", theme_color: "#000000",
|
|
12
|
-
icons: [],
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
manifest.icons = assets.icons.map((ic) => ({
|
|
16
|
-
src: `/${ic.name}.png`,
|
|
17
|
-
sizes: `${ic.width}x${ic.height}`,
|
|
18
|
-
type: "image/png",
|
|
19
|
-
...(ic.purpose ? { purpose: ic.purpose } : {}),
|
|
20
|
-
}));
|
|
21
|
-
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=manifest-patcher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-patcher.js","sourceRoot":"","sources":["../../../../src/lib/generators/asset-generator/manifest-patcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AASjD,MAAM,UAAU,aAAa,CAAC,YAAoB,EAAE,MAAuB;IACzE,IAAI,QAAa,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG;YACT,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;YAC/C,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY;YACrC,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS;YACnD,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,MAAM;QACtB,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE;QACjC,IAAI,EAAE,WAAW;QACjB,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/C,CAAC,CAAC,CAAC;IAEJ,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { resolveJimp } from "./dependency-resolver.js";
|
|
2
|
-
const MASKABLE_SAFE_ZONE = 0.8;
|
|
3
|
-
export async function createMaskable(sourceBuffer, size, bgColor) {
|
|
4
|
-
const { Jimp } = await resolveJimp();
|
|
5
|
-
const image = await Jimp.read(sourceBuffer);
|
|
6
|
-
const canvas = new Jimp({ width: size, height: size, color: bgColor });
|
|
7
|
-
const logoSize = Math.round(size * MASKABLE_SAFE_ZONE);
|
|
8
|
-
image.resize({ w: logoSize, h: logoSize });
|
|
9
|
-
const scale = logoSize / Math.max(image.bitmap.width, image.bitmap.height);
|
|
10
|
-
const newW = Math.round(image.bitmap.width * scale);
|
|
11
|
-
const newH = Math.round(image.bitmap.height * scale);
|
|
12
|
-
canvas.composite(image, Math.round((size - newW) / 2), Math.round((size - newH) / 2));
|
|
13
|
-
return canvas.getBuffer("image/png");
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=maskable.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"maskable.js","sourceRoot":"","sources":["../../../../src/lib/generators/asset-generator/maskable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,YAAoB,EAAE,IAAY,EAAE,OAAe;IACtF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,kBAAkB,CAAC,CAAC;IACvD,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IACrD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtF,OAAO,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;AACvC,CAAC"}
|