jskelet 0.6.3 → 0.6.4
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/AGENTS.md +136 -136
- package/CHANGELOG.md +628 -620
- package/LICENSE +21 -21
- package/README.md +2 -0
- package/bin/jskelet.mjs +130 -130
- package/docs/01-baslangic.md +291 -291
- package/docs/02-mimari.md +310 -310
- package/docs/03-routing.md +515 -515
- package/docs/04-render-ve-sablonlar.md +667 -661
- package/docs/05-islands.md +486 -486
- package/docs/06-cache.md +1467 -1443
- package/docs/07-yapilandirma.md +1208 -1197
- package/docs/08-build.md +429 -429
- package/docs/09-dev-araclari.md +364 -364
- package/docs/10-dagitim.md +348 -338
- package/docs/12-panel-ve-oturum.md +479 -478
- package/docs/README.md +83 -83
- package/docs/en/01-getting-started.md +298 -298
- package/docs/en/02-architecture.md +329 -329
- package/docs/en/03-routing.md +531 -531
- package/docs/en/04-rendering.md +675 -669
- package/docs/en/05-islands.md +497 -497
- package/docs/en/06-caching.md +1476 -1453
- package/docs/en/07-configuration.md +1229 -1219
- package/docs/en/08-build.md +447 -447
- package/docs/en/09-dev-tools.md +373 -373
- package/docs/en/10-deployment.md +351 -340
- package/docs/en/11-migration.md +398 -398
- package/docs/en/12-dashboards-and-sessions.md +489 -488
- package/docs/en/README.md +87 -87
- package/package.json +137 -137
- package/src/build/ensure-build.mjs +19 -19
- package/src/build/paths.mjs +153 -153
- package/src/build/resolve-peer.mjs +36 -36
- package/src/build/tasks/client.mjs +349 -349
- package/src/build/tasks/css.mjs +235 -235
- package/src/build/tasks/fonts.mjs +146 -146
- package/src/build/tasks/icons.mjs +357 -357
- package/src/build/tasks/images.mjs +244 -244
- package/src/build/tasks/precompress.mjs +78 -78
- package/src/build/tasks/templates.mjs +20 -20
- package/src/client/admin/i18n.js +764 -764
- package/src/client/admin/login.html +74 -74
- package/src/client/admin/panel.css +809 -809
- package/src/client/admin/panel.html +495 -495
- package/src/client/admin/panel.js +1251 -1251
- package/src/client/devtools/report.html +185 -185
- package/src/client/devtools/report.js +745 -745
- package/src/client/devtools/seo.js +628 -628
- package/src/client/dom.js +95 -95
- package/src/client/form.js +192 -192
- package/src/client/index.js +45 -45
- package/src/client/registry.js +305 -305
- package/src/client/safe-image.js +91 -91
- package/src/client/shared-cookie.js +225 -225
- package/src/client/store.js +36 -36
- package/src/client/swap.js +188 -188
- package/src/compile/codegen.js +336 -336
- package/src/compile/compile-all.js +149 -149
- package/src/compile/errors.js +66 -66
- package/src/compile/expr.js +409 -409
- package/src/compile/index.js +17 -17
- package/src/compile/parse.js +541 -541
- package/src/compile/resolve.js +211 -211
- package/src/compile/scan-exports.js +51 -51
- package/src/config/defaults.js +541 -534
- package/src/config/index.js +1500 -1469
- package/src/config/pattern.js +107 -107
- package/src/generate.mjs +163 -163
- package/src/http/control-flow.js +71 -71
- package/src/http/cookies-entry.js +21 -21
- package/src/http/cookies.js +277 -277
- package/src/http/request-cache.js +46 -46
- package/src/http/request-context.js +165 -165
- package/src/http/shared-cookie.js +178 -178
- package/src/index.js +101 -101
- package/src/init.mjs +232 -230
- package/src/migrate/apply.mjs +262 -262
- package/src/migrate/babel.mjs +79 -79
- package/src/migrate/classify.mjs +155 -155
- package/src/migrate/config.mjs +126 -126
- package/src/migrate/fs-walk.mjs +191 -191
- package/src/migrate/parse.mjs +26 -26
- package/src/migrate/scan.mjs +177 -177
- package/src/migrate/transform/expr-source.mjs +168 -168
- package/src/migrate/transform/island.mjs +67 -67
- package/src/migrate/transform/jsx-to-component.mjs +302 -302
- package/src/migrate/transform/jsx-to-jsk.mjs +330 -330
- package/src/migrate/transform/page-split.mjs +435 -435
- package/src/migrate/write.mjs +81 -81
- package/src/migrate.mjs +171 -171
- package/src/runtime/alias-hooks.mjs +119 -119
- package/src/runtime/register.mjs +4 -4
- package/src/server/admin/actions.js +229 -229
- package/src/server/admin/auth.js +125 -125
- package/src/server/admin/event-log.js +151 -151
- package/src/server/admin/gate.js +209 -209
- package/src/server/admin/inventory.js +188 -188
- package/src/server/admin/mount.js +56 -56
- package/src/server/admin/router.js +216 -216
- package/src/server/admin/snapshot.js +241 -241
- package/src/server/assets.js +147 -147
- package/src/server/auth/handoff.js +309 -309
- package/src/server/cache-blob.js +70 -70
- package/src/server/cache-control.js +45 -0
- package/src/server/cache-deps.js +42 -42
- package/src/server/cache-vary.js +113 -113
- package/src/server/cloudflare.js +607 -607
- package/src/server/create-app.js +366 -366
- package/src/server/data-cache.js +553 -553
- package/src/server/dev/report.js +485 -485
- package/src/server/dev/socket.js +170 -170
- package/src/server/dev/version-check.mjs +139 -139
- package/src/server/disk-cache.js +233 -233
- package/src/server/ejs-adapter.js +59 -59
- package/src/server/html-cache.js +1196 -1196
- package/src/server/image-optimizer.js +500 -500
- package/src/server/logs/access-middleware.js +66 -66
- package/src/server/logs/file-sink.js +193 -193
- package/src/server/logs/pipeline.js +165 -165
- package/src/server/logs/s3-put.js +214 -214
- package/src/server/logs/s3-sink.js +112 -112
- package/src/server/metadata.js +102 -102
- package/src/server/middleware/compression.js +205 -205
- package/src/server/middleware/csrf.js +134 -134
- package/src/server/middleware/dev-gate.js +75 -75
- package/src/server/middleware/headers.js +37 -37
- package/src/server/middleware/redirects.js +32 -32
- package/src/server/middleware/robots-txt.js +341 -341
- package/src/server/middleware/static-precompressed.js +121 -121
- package/src/server/middleware/trailing-slash.js +53 -53
- package/src/server/middleware/upstream-proxy.js +141 -141
- package/src/server/og-image.js +369 -356
- package/src/server/port-guard.js +255 -255
- package/src/server/prewarm.js +1082 -1082
- package/src/server/redis.js +588 -588
- package/src/server/render.js +910 -910
- package/src/server/router.js +157 -157
- package/src/server/status-page.js +265 -265
- package/src/server/upstream-limiter.js +376 -376
- package/src/server/upstream-tracking.js +166 -166
- package/src/shared/cookie-domain.js +66 -66
- package/src/start.mjs +22 -22
- package/src/templates/layout.ejs +30 -30
- package/src/templates/layout.jsk +30 -30
- package/src/version.mjs +31 -31
- package/src/views/components/loader.js +101 -101
- package/src/views/helpers/html.js +102 -102
- package/src/views/helpers/tags.js +375 -375
- package/types/config/defaults.d.ts +6 -0
- package/types/config/index.d.ts +6 -0
- package/types/server/cache-control.d.ts +28 -0
- package/types/server/og-image.d.ts +5 -0
package/src/build/paths.mjs
CHANGED
|
@@ -1,153 +1,153 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Build çıktısı yolları ve hash'li varlık yazımı.
|
|
3
|
-
*
|
|
4
|
-
* Yollar `jskelet.config.mjs`'den gelir; `initBuildPaths()` çağrılmadan
|
|
5
|
-
* kullanılamazlar. Tek bir mutasyon noktası olması bilinçli: framework
|
|
6
|
-
* `node_modules/` içine girdiğinde `../..` sayarak kök bulmaya çalışan her
|
|
7
|
-
* dosya bozulur.
|
|
8
|
-
*/
|
|
9
|
-
import fs from "node:fs";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
import crypto from "node:crypto";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @type {{ root: string, generated: string, public: string, assets: string,
|
|
15
|
-
* fonts: string, client: string, views: string, routes: string, styles: string }}
|
|
16
|
-
*/
|
|
17
|
-
export const paths = {
|
|
18
|
-
root: "",
|
|
19
|
-
generated: "",
|
|
20
|
-
public: "",
|
|
21
|
-
assets: "",
|
|
22
|
-
fonts: "",
|
|
23
|
-
client: "",
|
|
24
|
-
views: "",
|
|
25
|
-
routes: "",
|
|
26
|
-
styles: "",
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* @param {import('../config/index.js').ResolvedConfig} config
|
|
31
|
-
* @returns {void}
|
|
32
|
-
*/
|
|
33
|
-
export function initBuildPaths(config) {
|
|
34
|
-
Object.assign(paths, config.dirs, { root: config.root });
|
|
35
|
-
|
|
36
|
-
fs.mkdirSync(paths.generated, { recursive: true });
|
|
37
|
-
fs.mkdirSync(paths.assets, { recursive: true });
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* İçeriğe göre kısa hash. 10 hex karakter çakışma için fazlasıyla yeterli ve
|
|
42
|
-
* dosya adlarını okunur tutuyor.
|
|
43
|
-
*
|
|
44
|
-
* @param {string | Buffer} content
|
|
45
|
-
* @returns {string}
|
|
46
|
-
*/
|
|
47
|
-
export function hash(content) {
|
|
48
|
-
return crypto.createHash("sha256").update(content).digest("hex").slice(0, 10);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Hash'li dosyayı `public/assets` altına yazar ve public yolunu döner.
|
|
53
|
-
*
|
|
54
|
-
* @param {string} name Örn. "app.css"
|
|
55
|
-
* @param {string | Buffer} content
|
|
56
|
-
* @returns {string}
|
|
57
|
-
*/
|
|
58
|
-
export function writeAsset(name, content) {
|
|
59
|
-
const ext = path.extname(name);
|
|
60
|
-
const base = name.slice(0, name.length - ext.length);
|
|
61
|
-
const fileName = `${base}.${hash(content)}${ext}`;
|
|
62
|
-
|
|
63
|
-
fs.mkdirSync(paths.assets, { recursive: true });
|
|
64
|
-
fs.writeFileSync(path.join(paths.assets, fileName), content);
|
|
65
|
-
|
|
66
|
-
return `/assets/${fileName}`;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/** @returns {string} */
|
|
70
|
-
function manifestFile() {
|
|
71
|
-
return path.join(paths.generated, "manifest.json");
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/** @param {Record<string, string>} manifest */
|
|
75
|
-
export function writeManifest(manifest) {
|
|
76
|
-
fs.mkdirSync(paths.generated, { recursive: true });
|
|
77
|
-
const json = `${JSON.stringify(manifest, null, 2)}\n`;
|
|
78
|
-
fs.writeFileSync(manifestFile(), json);
|
|
79
|
-
writeBuildId(json);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Build kimliği: manifest içeriğinin hash'i.
|
|
84
|
-
*
|
|
85
|
-
* Paylaşımlı bir önbellekte (Redis) HTML anahtarları bu kimliği taşımak
|
|
86
|
-
* zorunda. Saklanan HTML hash'li varlık yollarını gömüyor; yeni bir deploy'dan
|
|
87
|
-
* sonra eski HTML başka bir node'dan geri gelirse artık var olmayan
|
|
88
|
-
* `/assets/app.<eskihash>.css` istenir ve sayfa stilsiz kalır. Kimlik önekte
|
|
89
|
-
* durduğunda yeni build kendiliğinden yeni bir isim alanına yazar, eskisi TTL
|
|
90
|
-
* ile ölür — elle temizlik gerekmez.
|
|
91
|
-
*
|
|
92
|
-
* Kimlik manifest'in **içine** yazılmaz: oradaki her anahtar `asset()`
|
|
93
|
-
* yüzeyine sızıyor.
|
|
94
|
-
*
|
|
95
|
-
* @param {string} manifestJson
|
|
96
|
-
*/
|
|
97
|
-
function writeBuildId(manifestJson) {
|
|
98
|
-
const payload = { id: hash(manifestJson), createdAt: new Date().toISOString() };
|
|
99
|
-
fs.writeFileSync(
|
|
100
|
-
path.join(paths.generated, "build.json"),
|
|
101
|
-
`${JSON.stringify(payload, null, 2)}\n`,
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Tek bir girdiyi günceller, diğerlerini korur.
|
|
107
|
-
*
|
|
108
|
-
* Watch modunda yeniden derlenen varlık yeni bir hash'e yazılıp eskisi
|
|
109
|
-
* silindiği için manifest de güncellenmek zorunda: aksi hâlde HTML silinmiş
|
|
110
|
-
* dosyayı isteyip 404 alır ve sayfa dev oturumunun kalanında stilsiz/JS'siz
|
|
111
|
-
* kalır.
|
|
112
|
-
*
|
|
113
|
-
* @param {string} key
|
|
114
|
-
* @param {string} url
|
|
115
|
-
*/
|
|
116
|
-
export function patchManifest(key, url) {
|
|
117
|
-
/** @type {Record<string, string>} */
|
|
118
|
-
let current = {};
|
|
119
|
-
try {
|
|
120
|
-
current = JSON.parse(fs.readFileSync(manifestFile(), "utf8"));
|
|
121
|
-
} catch {
|
|
122
|
-
// Manifest henüz yoksa ilk yazımda oluşur.
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
if (current[key] === url) return;
|
|
126
|
-
|
|
127
|
-
current[key] = url;
|
|
128
|
-
writeManifest(current);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Eski hash'li çıktıları temizler.
|
|
133
|
-
*
|
|
134
|
-
* Yeni dosya **önce** yazılmalı, prune sonra gelmeli: aynı içerik aynı hash'i
|
|
135
|
-
* üretir ve önce silmek `/assets/app.<hash>.css` için kısa bir 404 penceresi
|
|
136
|
-
* açar. CDN o 404'ü `immutable` ile saklarsa (eski headersMiddleware
|
|
137
|
-
* davranışı) tarayıcı bir yıl boyunca stilsiz kalır.
|
|
138
|
-
*
|
|
139
|
-
* @param {string[]} prefixes
|
|
140
|
-
* @param {{ keep?: string[] }} [options] Korunacak dosya adları (ör. yeni
|
|
141
|
-
* yazılan `app.<hash>.css`); `.br` / `.gz` sonekleri de eşleşir.
|
|
142
|
-
*/
|
|
143
|
-
export function pruneAssets(prefixes, { keep = [] } = {}) {
|
|
144
|
-
if (!fs.existsSync(paths.assets)) return;
|
|
145
|
-
|
|
146
|
-
for (const file of fs.readdirSync(paths.assets)) {
|
|
147
|
-
if (!prefixes.some((prefix) => file.startsWith(prefix))) continue;
|
|
148
|
-
if (keep.some((name) => file === name || file.startsWith(`${name}.`))) {
|
|
149
|
-
continue;
|
|
150
|
-
}
|
|
151
|
-
fs.rmSync(path.join(paths.assets, file), { force: true });
|
|
152
|
-
}
|
|
153
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Build çıktısı yolları ve hash'li varlık yazımı.
|
|
3
|
+
*
|
|
4
|
+
* Yollar `jskelet.config.mjs`'den gelir; `initBuildPaths()` çağrılmadan
|
|
5
|
+
* kullanılamazlar. Tek bir mutasyon noktası olması bilinçli: framework
|
|
6
|
+
* `node_modules/` içine girdiğinde `../..` sayarak kök bulmaya çalışan her
|
|
7
|
+
* dosya bozulur.
|
|
8
|
+
*/
|
|
9
|
+
import fs from "node:fs";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import crypto from "node:crypto";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @type {{ root: string, generated: string, public: string, assets: string,
|
|
15
|
+
* fonts: string, client: string, views: string, routes: string, styles: string }}
|
|
16
|
+
*/
|
|
17
|
+
export const paths = {
|
|
18
|
+
root: "",
|
|
19
|
+
generated: "",
|
|
20
|
+
public: "",
|
|
21
|
+
assets: "",
|
|
22
|
+
fonts: "",
|
|
23
|
+
client: "",
|
|
24
|
+
views: "",
|
|
25
|
+
routes: "",
|
|
26
|
+
styles: "",
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @param {import('../config/index.js').ResolvedConfig} config
|
|
31
|
+
* @returns {void}
|
|
32
|
+
*/
|
|
33
|
+
export function initBuildPaths(config) {
|
|
34
|
+
Object.assign(paths, config.dirs, { root: config.root });
|
|
35
|
+
|
|
36
|
+
fs.mkdirSync(paths.generated, { recursive: true });
|
|
37
|
+
fs.mkdirSync(paths.assets, { recursive: true });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* İçeriğe göre kısa hash. 10 hex karakter çakışma için fazlasıyla yeterli ve
|
|
42
|
+
* dosya adlarını okunur tutuyor.
|
|
43
|
+
*
|
|
44
|
+
* @param {string | Buffer} content
|
|
45
|
+
* @returns {string}
|
|
46
|
+
*/
|
|
47
|
+
export function hash(content) {
|
|
48
|
+
return crypto.createHash("sha256").update(content).digest("hex").slice(0, 10);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Hash'li dosyayı `public/assets` altına yazar ve public yolunu döner.
|
|
53
|
+
*
|
|
54
|
+
* @param {string} name Örn. "app.css"
|
|
55
|
+
* @param {string | Buffer} content
|
|
56
|
+
* @returns {string}
|
|
57
|
+
*/
|
|
58
|
+
export function writeAsset(name, content) {
|
|
59
|
+
const ext = path.extname(name);
|
|
60
|
+
const base = name.slice(0, name.length - ext.length);
|
|
61
|
+
const fileName = `${base}.${hash(content)}${ext}`;
|
|
62
|
+
|
|
63
|
+
fs.mkdirSync(paths.assets, { recursive: true });
|
|
64
|
+
fs.writeFileSync(path.join(paths.assets, fileName), content);
|
|
65
|
+
|
|
66
|
+
return `/assets/${fileName}`;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** @returns {string} */
|
|
70
|
+
function manifestFile() {
|
|
71
|
+
return path.join(paths.generated, "manifest.json");
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** @param {Record<string, string>} manifest */
|
|
75
|
+
export function writeManifest(manifest) {
|
|
76
|
+
fs.mkdirSync(paths.generated, { recursive: true });
|
|
77
|
+
const json = `${JSON.stringify(manifest, null, 2)}\n`;
|
|
78
|
+
fs.writeFileSync(manifestFile(), json);
|
|
79
|
+
writeBuildId(json);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Build kimliği: manifest içeriğinin hash'i.
|
|
84
|
+
*
|
|
85
|
+
* Paylaşımlı bir önbellekte (Redis) HTML anahtarları bu kimliği taşımak
|
|
86
|
+
* zorunda. Saklanan HTML hash'li varlık yollarını gömüyor; yeni bir deploy'dan
|
|
87
|
+
* sonra eski HTML başka bir node'dan geri gelirse artık var olmayan
|
|
88
|
+
* `/assets/app.<eskihash>.css` istenir ve sayfa stilsiz kalır. Kimlik önekte
|
|
89
|
+
* durduğunda yeni build kendiliğinden yeni bir isim alanına yazar, eskisi TTL
|
|
90
|
+
* ile ölür — elle temizlik gerekmez.
|
|
91
|
+
*
|
|
92
|
+
* Kimlik manifest'in **içine** yazılmaz: oradaki her anahtar `asset()`
|
|
93
|
+
* yüzeyine sızıyor.
|
|
94
|
+
*
|
|
95
|
+
* @param {string} manifestJson
|
|
96
|
+
*/
|
|
97
|
+
function writeBuildId(manifestJson) {
|
|
98
|
+
const payload = { id: hash(manifestJson), createdAt: new Date().toISOString() };
|
|
99
|
+
fs.writeFileSync(
|
|
100
|
+
path.join(paths.generated, "build.json"),
|
|
101
|
+
`${JSON.stringify(payload, null, 2)}\n`,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Tek bir girdiyi günceller, diğerlerini korur.
|
|
107
|
+
*
|
|
108
|
+
* Watch modunda yeniden derlenen varlık yeni bir hash'e yazılıp eskisi
|
|
109
|
+
* silindiği için manifest de güncellenmek zorunda: aksi hâlde HTML silinmiş
|
|
110
|
+
* dosyayı isteyip 404 alır ve sayfa dev oturumunun kalanında stilsiz/JS'siz
|
|
111
|
+
* kalır.
|
|
112
|
+
*
|
|
113
|
+
* @param {string} key
|
|
114
|
+
* @param {string} url
|
|
115
|
+
*/
|
|
116
|
+
export function patchManifest(key, url) {
|
|
117
|
+
/** @type {Record<string, string>} */
|
|
118
|
+
let current = {};
|
|
119
|
+
try {
|
|
120
|
+
current = JSON.parse(fs.readFileSync(manifestFile(), "utf8"));
|
|
121
|
+
} catch {
|
|
122
|
+
// Manifest henüz yoksa ilk yazımda oluşur.
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (current[key] === url) return;
|
|
126
|
+
|
|
127
|
+
current[key] = url;
|
|
128
|
+
writeManifest(current);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Eski hash'li çıktıları temizler.
|
|
133
|
+
*
|
|
134
|
+
* Yeni dosya **önce** yazılmalı, prune sonra gelmeli: aynı içerik aynı hash'i
|
|
135
|
+
* üretir ve önce silmek `/assets/app.<hash>.css` için kısa bir 404 penceresi
|
|
136
|
+
* açar. CDN o 404'ü `immutable` ile saklarsa (eski headersMiddleware
|
|
137
|
+
* davranışı) tarayıcı bir yıl boyunca stilsiz kalır.
|
|
138
|
+
*
|
|
139
|
+
* @param {string[]} prefixes
|
|
140
|
+
* @param {{ keep?: string[] }} [options] Korunacak dosya adları (ör. yeni
|
|
141
|
+
* yazılan `app.<hash>.css`); `.br` / `.gz` sonekleri de eşleşir.
|
|
142
|
+
*/
|
|
143
|
+
export function pruneAssets(prefixes, { keep = [] } = {}) {
|
|
144
|
+
if (!fs.existsSync(paths.assets)) return;
|
|
145
|
+
|
|
146
|
+
for (const file of fs.readdirSync(paths.assets)) {
|
|
147
|
+
if (!prefixes.some((prefix) => file.startsWith(prefix))) continue;
|
|
148
|
+
if (keep.some((name) => file === name || file.startsWith(`${name}.`))) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
fs.rmSync(path.join(paths.assets, file), { force: true });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Opsiyonel peer bağımlılıklarını **uygulamanın** node_modules'ünden yükler.
|
|
3
|
-
*
|
|
4
|
-
* Framework `file:` ya da workspace bağlantısıyla kuruluysa kaynak dosyaları
|
|
5
|
-
* kendi dizininde çalışır ve düz bir `import "postcss"` framework'ün
|
|
6
|
-
* node_modules'üne bakar — uygulamanınkine değil. Tailwind/PostCSS/sharp gibi
|
|
7
|
-
* paketler uygulamanın devDependency'si olduğu için çözümlemeyi uygulama
|
|
8
|
-
* kökünden başlatmak zorundayız.
|
|
9
|
-
*/
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
import { createRequire } from "node:module";
|
|
12
|
-
import { pathToFileURL } from "node:url";
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* @param {string} root Uygulama kökü.
|
|
16
|
-
* @param {string} specifier
|
|
17
|
-
* @returns {Promise<any>}
|
|
18
|
-
* @throws Paket bulunamazsa; zorunlu bağımlılıklar için.
|
|
19
|
-
*/
|
|
20
|
-
export async function importFromApp(root, specifier) {
|
|
21
|
-
const require = createRequire(path.join(root, "package.json"));
|
|
22
|
-
return import(pathToFileURL(require.resolve(specifier)).href);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* @param {string} root
|
|
27
|
-
* @param {string} specifier
|
|
28
|
-
* @returns {Promise<any | null>} Paket yoksa `null`; adım atlanabilsin diye.
|
|
29
|
-
*/
|
|
30
|
-
export async function tryImportFromApp(root, specifier) {
|
|
31
|
-
try {
|
|
32
|
-
return await importFromApp(root, specifier);
|
|
33
|
-
} catch {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Opsiyonel peer bağımlılıklarını **uygulamanın** node_modules'ünden yükler.
|
|
3
|
+
*
|
|
4
|
+
* Framework `file:` ya da workspace bağlantısıyla kuruluysa kaynak dosyaları
|
|
5
|
+
* kendi dizininde çalışır ve düz bir `import "postcss"` framework'ün
|
|
6
|
+
* node_modules'üne bakar — uygulamanınkine değil. Tailwind/PostCSS/sharp gibi
|
|
7
|
+
* paketler uygulamanın devDependency'si olduğu için çözümlemeyi uygulama
|
|
8
|
+
* kökünden başlatmak zorundayız.
|
|
9
|
+
*/
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { createRequire } from "node:module";
|
|
12
|
+
import { pathToFileURL } from "node:url";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param {string} root Uygulama kökü.
|
|
16
|
+
* @param {string} specifier
|
|
17
|
+
* @returns {Promise<any>}
|
|
18
|
+
* @throws Paket bulunamazsa; zorunlu bağımlılıklar için.
|
|
19
|
+
*/
|
|
20
|
+
export async function importFromApp(root, specifier) {
|
|
21
|
+
const require = createRequire(path.join(root, "package.json"));
|
|
22
|
+
return import(pathToFileURL(require.resolve(specifier)).href);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @param {string} root
|
|
27
|
+
* @param {string} specifier
|
|
28
|
+
* @returns {Promise<any | null>} Paket yoksa `null`; adım atlanabilsin diye.
|
|
29
|
+
*/
|
|
30
|
+
export async function tryImportFromApp(root, specifier) {
|
|
31
|
+
try {
|
|
32
|
+
return await importFromApp(root, specifier);
|
|
33
|
+
} catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|