jskelet 0.6.1 → 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/AGENTS.md +136 -136
  2. package/CHANGELOG.md +620 -596
  3. package/LICENSE +21 -21
  4. package/bin/jskelet.mjs +130 -130
  5. package/docs/01-baslangic.md +291 -291
  6. package/docs/02-mimari.md +310 -309
  7. package/docs/03-routing.md +515 -515
  8. package/docs/04-render-ve-sablonlar.md +661 -661
  9. package/docs/05-islands.md +486 -486
  10. package/docs/06-cache.md +1443 -1423
  11. package/docs/07-yapilandirma.md +12 -6
  12. package/docs/08-build.md +429 -428
  13. package/docs/09-dev-araclari.md +364 -364
  14. package/docs/10-dagitim.md +338 -338
  15. package/docs/12-panel-ve-oturum.md +478 -478
  16. package/docs/README.md +83 -83
  17. package/docs/en/01-getting-started.md +298 -298
  18. package/docs/en/02-architecture.md +329 -328
  19. package/docs/en/03-routing.md +531 -531
  20. package/docs/en/04-rendering.md +669 -669
  21. package/docs/en/05-islands.md +497 -497
  22. package/docs/en/06-caching.md +1453 -1431
  23. package/docs/en/07-configuration.md +1219 -1214
  24. package/docs/en/08-build.md +447 -446
  25. package/docs/en/09-dev-tools.md +373 -373
  26. package/docs/en/10-deployment.md +340 -340
  27. package/docs/en/11-migration.md +398 -398
  28. package/docs/en/12-dashboards-and-sessions.md +488 -488
  29. package/docs/en/README.md +87 -87
  30. package/package.json +137 -137
  31. package/src/build/ensure-build.mjs +19 -19
  32. package/src/build/paths.mjs +153 -153
  33. package/src/build/resolve-peer.mjs +36 -36
  34. package/src/build/tasks/client.mjs +349 -349
  35. package/src/build/tasks/css.mjs +235 -235
  36. package/src/build/tasks/fonts.mjs +146 -146
  37. package/src/build/tasks/icons.mjs +357 -357
  38. package/src/build/tasks/images.mjs +244 -244
  39. package/src/build/tasks/precompress.mjs +78 -78
  40. package/src/build/tasks/templates.mjs +20 -20
  41. package/src/client/admin/i18n.js +764 -764
  42. package/src/client/admin/login.html +74 -74
  43. package/src/client/admin/panel.css +809 -809
  44. package/src/client/admin/panel.html +495 -495
  45. package/src/client/admin/panel.js +1251 -1251
  46. package/src/client/devtools/report.html +185 -185
  47. package/src/client/devtools/report.js +745 -745
  48. package/src/client/devtools/seo.js +628 -628
  49. package/src/client/dom.js +95 -95
  50. package/src/client/form.js +192 -192
  51. package/src/client/index.js +45 -45
  52. package/src/client/registry.js +305 -305
  53. package/src/client/safe-image.js +91 -91
  54. package/src/client/shared-cookie.js +225 -225
  55. package/src/client/store.js +36 -36
  56. package/src/client/swap.js +188 -188
  57. package/src/compile/codegen.js +336 -336
  58. package/src/compile/compile-all.js +149 -149
  59. package/src/compile/errors.js +66 -66
  60. package/src/compile/expr.js +409 -409
  61. package/src/compile/index.js +17 -17
  62. package/src/compile/parse.js +541 -541
  63. package/src/compile/resolve.js +211 -211
  64. package/src/compile/scan-exports.js +51 -51
  65. package/src/config/defaults.js +17 -1
  66. package/src/config/index.js +13 -0
  67. package/src/config/pattern.js +107 -107
  68. package/src/generate.mjs +163 -163
  69. package/src/http/control-flow.js +71 -71
  70. package/src/http/cookies-entry.js +21 -21
  71. package/src/http/cookies.js +277 -277
  72. package/src/http/request-cache.js +46 -46
  73. package/src/http/request-context.js +165 -165
  74. package/src/http/shared-cookie.js +178 -178
  75. package/src/index.js +101 -101
  76. package/src/init.mjs +230 -230
  77. package/src/migrate/apply.mjs +262 -262
  78. package/src/migrate/babel.mjs +79 -79
  79. package/src/migrate/classify.mjs +155 -155
  80. package/src/migrate/config.mjs +126 -126
  81. package/src/migrate/fs-walk.mjs +191 -191
  82. package/src/migrate/parse.mjs +26 -26
  83. package/src/migrate/scan.mjs +177 -177
  84. package/src/migrate/transform/expr-source.mjs +168 -168
  85. package/src/migrate/transform/island.mjs +67 -67
  86. package/src/migrate/transform/jsx-to-component.mjs +302 -302
  87. package/src/migrate/transform/jsx-to-jsk.mjs +330 -330
  88. package/src/migrate/transform/page-split.mjs +435 -435
  89. package/src/migrate/write.mjs +81 -81
  90. package/src/migrate.mjs +171 -171
  91. package/src/runtime/alias-hooks.mjs +119 -119
  92. package/src/runtime/register.mjs +4 -4
  93. package/src/server/admin/actions.js +229 -229
  94. package/src/server/admin/auth.js +125 -125
  95. package/src/server/admin/event-log.js +151 -151
  96. package/src/server/admin/gate.js +209 -209
  97. package/src/server/admin/inventory.js +188 -188
  98. package/src/server/admin/mount.js +56 -56
  99. package/src/server/admin/router.js +216 -216
  100. package/src/server/admin/snapshot.js +241 -241
  101. package/src/server/assets.js +147 -147
  102. package/src/server/auth/handoff.js +309 -309
  103. package/src/server/cache-blob.js +70 -0
  104. package/src/server/cache-deps.js +42 -42
  105. package/src/server/cache-vary.js +113 -113
  106. package/src/server/cloudflare.js +607 -607
  107. package/src/server/create-app.js +366 -366
  108. package/src/server/data-cache.js +553 -462
  109. package/src/server/dev/report.js +485 -485
  110. package/src/server/dev/socket.js +170 -170
  111. package/src/server/dev/version-check.mjs +139 -139
  112. package/src/server/disk-cache.js +233 -0
  113. package/src/server/ejs-adapter.js +59 -59
  114. package/src/server/html-cache.js +1196 -1122
  115. package/src/server/image-optimizer.js +500 -407
  116. package/src/server/logs/access-middleware.js +66 -66
  117. package/src/server/logs/file-sink.js +193 -66
  118. package/src/server/logs/pipeline.js +165 -158
  119. package/src/server/logs/s3-put.js +214 -214
  120. package/src/server/logs/s3-sink.js +112 -112
  121. package/src/server/metadata.js +102 -102
  122. package/src/server/middleware/compression.js +205 -205
  123. package/src/server/middleware/csrf.js +134 -134
  124. package/src/server/middleware/dev-gate.js +75 -75
  125. package/src/server/middleware/headers.js +37 -37
  126. package/src/server/middleware/redirects.js +32 -32
  127. package/src/server/middleware/robots-txt.js +341 -341
  128. package/src/server/middleware/static-precompressed.js +121 -100
  129. package/src/server/middleware/trailing-slash.js +53 -53
  130. package/src/server/middleware/upstream-proxy.js +141 -141
  131. package/src/server/og-image.js +356 -356
  132. package/src/server/port-guard.js +255 -255
  133. package/src/server/prewarm.js +1082 -1058
  134. package/src/server/redis.js +588 -569
  135. package/src/server/render.js +4 -4
  136. package/src/server/router.js +157 -157
  137. package/src/server/status-page.js +265 -265
  138. package/src/server/upstream-limiter.js +376 -376
  139. package/src/server/upstream-tracking.js +166 -166
  140. package/src/shared/cookie-domain.js +66 -66
  141. package/src/start.mjs +22 -22
  142. package/src/templates/layout.ejs +30 -30
  143. package/src/templates/layout.jsk +30 -30
  144. package/src/version.mjs +31 -31
  145. package/src/views/components/loader.js +101 -101
  146. package/src/views/helpers/html.js +102 -102
  147. package/src/views/helpers/tags.js +375 -375
  148. package/types/config/defaults.d.ts +15 -1
  149. package/types/config/index.d.ts +8 -0
  150. package/types/server/cache-blob.d.ts +13 -0
  151. package/types/server/data-cache.d.ts +9 -0
  152. package/types/server/disk-cache.d.ts +36 -0
  153. package/types/server/html-cache.d.ts +26 -3
  154. package/types/server/logs/file-sink.d.ts +16 -5
  155. package/types/server/redis.d.ts +2 -1
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Ayberk Enis and JSkelet contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ayberk Enis and JSkelet contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/bin/jskelet.mjs CHANGED
@@ -1,131 +1,131 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * JSkelet CLI.
4
- *
5
- * jskelet dev [--murder] build watch + sunucu, canlı yenileme, dev overlay
6
- * jskelet build tek seferlik prod build (fontlar, sprite, CSS, JS, görseller)
7
- * jskelet start [--murder] prod sunucu (build eksikse önce üretir)
8
- * jskelet init bulunduğun dizine minimal iskelet kurar
9
- * jskelet generate feature / page / island iskeleti
10
- * jskelet migrate Next.js App Router → JSkelet codemod
11
- *
12
- * Alt komutlar ayrı süreçlerde çalışır. Sebep: `dev` iki uzun ömürlü süreci
13
- * (build watch + sunucu) yönetiyor ve sunucunun ESM resolve hook'larına
14
- * (`--import`) ihtiyacı var; bunlar süreç başlarken kurulmak zorunda.
15
- */
16
- import { spawn } from "node:child_process";
17
- import fs from "node:fs";
18
- import path from "node:path";
19
- import process from "node:process";
20
- import { fileURLToPath, pathToFileURL } from "node:url";
21
-
22
- const SRC = path.resolve(fileURLToPath(import.meta.url), "..", "..", "src");
23
-
24
- /**
25
- * `--import` bir modül **belirteci** bekler, dosya yolu değil. Windows'ta
26
- * `H:\...` mutlak yolu `h:` şemalı bir URL sanılıp reddediliyor; file:// URL'e
27
- * çevirmek her platformda doğru.
28
- */
29
- const REGISTER = pathToFileURL(path.join(SRC, "runtime", "register.mjs")).href;
30
-
31
- const [command, ...rest] = process.argv.slice(2);
32
-
33
- /**
34
- * `.env` yalnızca varsa geçilir: `--env-file-if-exists` dosya yokken de bir
35
- * bildirim satırı basıyor ve bu satır dev çıktısında hata gibi görünüyor.
36
- * `--import` alias hook'larını kurar; uygulama kodu `@/…` yazabilsin diye.
37
- *
38
- * @param {string} file
39
- * @param {{ env?: Record<string, string>, args?: string[], hooks?: boolean }} [options]
40
- * @returns {import('node:child_process').ChildProcess}
41
- */
42
- function run(file, options = {}) {
43
- const args = [
44
- ...(fs.existsSync(path.join(process.cwd(), ".env"))
45
- ? ["--env-file=.env"]
46
- : []),
47
- ...(options.hooks === false ? [] : ["--import", REGISTER]),
48
- file,
49
- ...(options.args ?? []),
50
- ];
51
-
52
- return spawn(process.execPath, args, {
53
- stdio: "inherit",
54
- env: { ...process.env, ...(options.env ?? {}) },
55
- });
56
- }
57
-
58
- /** @param {import('node:child_process').ChildProcess} child */
59
- function exitWith(child) {
60
- child.on("exit", (code) => process.exit(code ?? 0));
61
- }
62
-
63
- switch (command) {
64
- case "dev": {
65
- exitWith(run(path.join(SRC, "dev-server.mjs"), { hooks: false, args: rest }));
66
- break;
67
- }
68
-
69
- case "build": {
70
- exitWith(
71
- run(path.join(SRC, "build", "build.mjs"), {
72
- env: { NODE_ENV: process.env.NODE_ENV ?? "production" },
73
- args: rest,
74
- }),
75
- );
76
- break;
77
- }
78
-
79
- case "start": {
80
- exitWith(
81
- run(path.join(SRC, "start.mjs"), {
82
- env: { NODE_ENV: process.env.NODE_ENV ?? "production" },
83
- args: rest,
84
- }),
85
- );
86
- break;
87
- }
88
-
89
- case "init": {
90
- const { init } = await import("../src/init.mjs");
91
- await init(process.cwd());
92
- break;
93
- }
94
-
95
- case "generate": {
96
- const { generate } = await import("../src/generate.mjs");
97
- try {
98
- await generate(process.cwd(), rest);
99
- } catch (error) {
100
- process.stderr.write(`${error instanceof Error ? error.message : error}\n`);
101
- process.exit(1);
102
- }
103
- break;
104
- }
105
-
106
- case "migrate": {
107
- const { migrate } = await import("../src/migrate.mjs");
108
- try {
109
- await migrate(process.cwd(), rest);
110
- } catch (error) {
111
- process.stderr.write(`${error instanceof Error ? error.message : error}\n`);
112
- process.exit(1);
113
- }
114
- break;
115
- }
116
-
117
- default: {
118
- const known = command ? `unknown command: ${command}\n\n` : "";
119
- process.stderr.write(
120
- `${known}usage: jskelet <dev|build|start|init|generate|migrate> [options]\n\n` +
121
- " dev [--murder] build watch + server (live reload, dev overlay)\n" +
122
- " build production build\n" +
123
- " start [--murder] production server\n" +
124
- " init scaffold a minimal skeleton in the current directory\n" +
125
- " generate scaffold feature | page | island\n" +
126
- " migrate Next.js App Router → JSkelet codemod (scan | apply | config)\n\n" +
127
- " --murder if the listen port is busy, kill the listener and start\n",
128
- );
129
- process.exit(command ? 1 : 0);
130
- }
131
- }
2
+ /**
3
+ * JSkelet CLI.
4
+ *
5
+ * jskelet dev [--murder] build watch + sunucu, canlı yenileme, dev overlay
6
+ * jskelet build tek seferlik prod build (fontlar, sprite, CSS, JS, görseller)
7
+ * jskelet start [--murder] prod sunucu (build eksikse önce üretir)
8
+ * jskelet init bulunduğun dizine minimal iskelet kurar
9
+ * jskelet generate feature / page / island iskeleti
10
+ * jskelet migrate Next.js App Router → JSkelet codemod
11
+ *
12
+ * Alt komutlar ayrı süreçlerde çalışır. Sebep: `dev` iki uzun ömürlü süreci
13
+ * (build watch + sunucu) yönetiyor ve sunucunun ESM resolve hook'larına
14
+ * (`--import`) ihtiyacı var; bunlar süreç başlarken kurulmak zorunda.
15
+ */
16
+ import { spawn } from "node:child_process";
17
+ import fs from "node:fs";
18
+ import path from "node:path";
19
+ import process from "node:process";
20
+ import { fileURLToPath, pathToFileURL } from "node:url";
21
+
22
+ const SRC = path.resolve(fileURLToPath(import.meta.url), "..", "..", "src");
23
+
24
+ /**
25
+ * `--import` bir modül **belirteci** bekler, dosya yolu değil. Windows'ta
26
+ * `H:\...` mutlak yolu `h:` şemalı bir URL sanılıp reddediliyor; file:// URL'e
27
+ * çevirmek her platformda doğru.
28
+ */
29
+ const REGISTER = pathToFileURL(path.join(SRC, "runtime", "register.mjs")).href;
30
+
31
+ const [command, ...rest] = process.argv.slice(2);
32
+
33
+ /**
34
+ * `.env` yalnızca varsa geçilir: `--env-file-if-exists` dosya yokken de bir
35
+ * bildirim satırı basıyor ve bu satır dev çıktısında hata gibi görünüyor.
36
+ * `--import` alias hook'larını kurar; uygulama kodu `@/…` yazabilsin diye.
37
+ *
38
+ * @param {string} file
39
+ * @param {{ env?: Record<string, string>, args?: string[], hooks?: boolean }} [options]
40
+ * @returns {import('node:child_process').ChildProcess}
41
+ */
42
+ function run(file, options = {}) {
43
+ const args = [
44
+ ...(fs.existsSync(path.join(process.cwd(), ".env"))
45
+ ? ["--env-file=.env"]
46
+ : []),
47
+ ...(options.hooks === false ? [] : ["--import", REGISTER]),
48
+ file,
49
+ ...(options.args ?? []),
50
+ ];
51
+
52
+ return spawn(process.execPath, args, {
53
+ stdio: "inherit",
54
+ env: { ...process.env, ...(options.env ?? {}) },
55
+ });
56
+ }
57
+
58
+ /** @param {import('node:child_process').ChildProcess} child */
59
+ function exitWith(child) {
60
+ child.on("exit", (code) => process.exit(code ?? 0));
61
+ }
62
+
63
+ switch (command) {
64
+ case "dev": {
65
+ exitWith(run(path.join(SRC, "dev-server.mjs"), { hooks: false, args: rest }));
66
+ break;
67
+ }
68
+
69
+ case "build": {
70
+ exitWith(
71
+ run(path.join(SRC, "build", "build.mjs"), {
72
+ env: { NODE_ENV: process.env.NODE_ENV ?? "production" },
73
+ args: rest,
74
+ }),
75
+ );
76
+ break;
77
+ }
78
+
79
+ case "start": {
80
+ exitWith(
81
+ run(path.join(SRC, "start.mjs"), {
82
+ env: { NODE_ENV: process.env.NODE_ENV ?? "production" },
83
+ args: rest,
84
+ }),
85
+ );
86
+ break;
87
+ }
88
+
89
+ case "init": {
90
+ const { init } = await import("../src/init.mjs");
91
+ await init(process.cwd());
92
+ break;
93
+ }
94
+
95
+ case "generate": {
96
+ const { generate } = await import("../src/generate.mjs");
97
+ try {
98
+ await generate(process.cwd(), rest);
99
+ } catch (error) {
100
+ process.stderr.write(`${error instanceof Error ? error.message : error}\n`);
101
+ process.exit(1);
102
+ }
103
+ break;
104
+ }
105
+
106
+ case "migrate": {
107
+ const { migrate } = await import("../src/migrate.mjs");
108
+ try {
109
+ await migrate(process.cwd(), rest);
110
+ } catch (error) {
111
+ process.stderr.write(`${error instanceof Error ? error.message : error}\n`);
112
+ process.exit(1);
113
+ }
114
+ break;
115
+ }
116
+
117
+ default: {
118
+ const known = command ? `unknown command: ${command}\n\n` : "";
119
+ process.stderr.write(
120
+ `${known}usage: jskelet <dev|build|start|init|generate|migrate> [options]\n\n` +
121
+ " dev [--murder] build watch + server (live reload, dev overlay)\n" +
122
+ " build production build\n" +
123
+ " start [--murder] production server\n" +
124
+ " init scaffold a minimal skeleton in the current directory\n" +
125
+ " generate scaffold feature | page | island\n" +
126
+ " migrate Next.js App Router → JSkelet codemod (scan | apply | config)\n\n" +
127
+ " --murder if the listen port is busy, kill the listener and start\n",
128
+ );
129
+ process.exit(command ? 1 : 0);
130
+ }
131
+ }