jskelet 0.5.5 → 0.6.1

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 (156) hide show
  1. package/AGENTS.md +19 -15
  2. package/CHANGELOG.md +165 -15
  3. package/README.md +16 -21
  4. package/bin/jskelet.mjs +23 -9
  5. package/docs/01-baslangic.md +4 -3
  6. package/docs/02-mimari.md +10 -4
  7. package/docs/03-routing.md +14 -7
  8. package/docs/04-render-ve-sablonlar.md +60 -43
  9. package/docs/05-islands.md +12 -8
  10. package/docs/06-cache.md +18 -7
  11. package/docs/07-yapilandirma.md +69 -27
  12. package/docs/08-build.md +15 -9
  13. package/docs/09-dev-araclari.md +22 -8
  14. package/docs/10-dagitim.md +14 -13
  15. package/docs/11-tasima.md +51 -17
  16. package/docs/12-panel-ve-oturum.md +10 -4
  17. package/docs/README.md +10 -33
  18. package/docs/en/01-getting-started.md +4 -3
  19. package/docs/en/02-architecture.md +12 -6
  20. package/docs/en/03-routing.md +15 -8
  21. package/docs/en/04-rendering.md +71 -59
  22. package/docs/en/05-islands.md +13 -8
  23. package/docs/en/06-caching.md +21 -7
  24. package/docs/en/07-configuration.md +69 -29
  25. package/docs/en/08-build.md +16 -10
  26. package/docs/en/09-dev-tools.md +24 -8
  27. package/docs/en/10-deployment.md +14 -14
  28. package/docs/en/11-migration.md +51 -16
  29. package/docs/en/12-dashboards-and-sessions.md +9 -4
  30. package/docs/en/README.md +10 -35
  31. package/package.json +48 -13
  32. package/src/build/tasks/client.mjs +91 -10
  33. package/src/build/tasks/icons.mjs +11 -1
  34. package/src/client/index.js +2 -2
  35. package/src/compile/codegen.js +4 -0
  36. package/src/compile/compile-all.js +12 -21
  37. package/src/compile/expr.js +5 -0
  38. package/src/compile/parse.js +64 -8
  39. package/src/compile/resolve.js +3 -0
  40. package/src/config/defaults.js +48 -5
  41. package/src/config/index.js +138 -27
  42. package/src/dev-server.mjs +26 -3
  43. package/src/http/cookies-entry.js +1 -0
  44. package/src/http/cookies.js +18 -0
  45. package/src/logo.png +0 -0
  46. package/src/migrate/apply.mjs +262 -0
  47. package/src/migrate/babel.mjs +79 -0
  48. package/src/migrate/classify.mjs +155 -0
  49. package/src/migrate/config.mjs +126 -0
  50. package/src/migrate/fs-walk.mjs +191 -0
  51. package/src/migrate/parse.mjs +26 -0
  52. package/src/migrate/scan.mjs +177 -0
  53. package/src/migrate/transform/expr-source.mjs +168 -0
  54. package/src/migrate/transform/island.mjs +67 -0
  55. package/src/migrate/transform/jsx-to-component.mjs +302 -0
  56. package/src/migrate/transform/jsx-to-jsk.mjs +330 -0
  57. package/src/migrate/transform/page-split.mjs +435 -0
  58. package/src/migrate/write.mjs +81 -0
  59. package/src/migrate.mjs +171 -0
  60. package/src/server/auth/handoff.js +94 -11
  61. package/src/server/create-app.js +37 -10
  62. package/src/server/ejs-adapter.js +59 -0
  63. package/src/server/html-cache.js +178 -32
  64. package/src/server/image-optimizer.js +94 -26
  65. package/src/server/middleware/dev-gate.js +21 -8
  66. package/src/server/middleware/robots-txt.js +341 -0
  67. package/src/server/port-guard.js +255 -0
  68. package/src/server/prewarm.js +137 -51
  69. package/src/server/render.js +30 -10
  70. package/src/server/status-page.js +105 -4
  71. package/src/start.mjs +18 -3
  72. package/src/templates/layout.ejs +8 -28
  73. package/src/templates/layout.jsk +30 -0
  74. package/src/templates/layout.render.js +41 -0
  75. package/src/views/helpers/tags.js +86 -3
  76. package/types/build/resolve-peer.d.mts +13 -0
  77. package/types/client/dom.d.ts +55 -0
  78. package/types/client/form.d.ts +19 -0
  79. package/types/client/index.d.ts +20 -0
  80. package/types/client/registry.d.ts +53 -0
  81. package/types/client/safe-image.d.ts +19 -0
  82. package/types/client/shared-cookie.d.ts +82 -0
  83. package/types/client/store.d.ts +18 -0
  84. package/types/client/swap.d.ts +46 -0
  85. package/types/compile/codegen.d.ts +32 -0
  86. package/types/compile/compile-all.d.ts +42 -0
  87. package/types/compile/errors.d.ts +30 -0
  88. package/types/compile/expr.d.ts +67 -0
  89. package/types/compile/index.d.ts +10 -0
  90. package/types/compile/parse.d.ts +82 -0
  91. package/types/compile/resolve.d.ts +46 -0
  92. package/types/compile/scan-exports.d.ts +9 -0
  93. package/types/config/defaults.d.ts +477 -0
  94. package/types/config/index.d.ts +304 -0
  95. package/types/config/pattern.d.ts +38 -0
  96. package/types/http/control-flow.d.ts +45 -0
  97. package/types/http/cookies-entry.d.ts +5 -0
  98. package/types/http/cookies.d.ts +113 -0
  99. package/types/http/request-cache.d.ts +13 -0
  100. package/types/http/request-context.d.ts +67 -0
  101. package/types/http/shared-cookie.d.ts +73 -0
  102. package/types/index.d.ts +30 -0
  103. package/types/log.d.mts +153 -0
  104. package/types/server/admin/actions.d.ts +16 -0
  105. package/types/server/admin/auth.d.ts +52 -0
  106. package/types/server/admin/event-log.d.ts +38 -0
  107. package/types/server/admin/gate.d.ts +43 -0
  108. package/types/server/admin/inventory.d.ts +40 -0
  109. package/types/server/admin/mount.d.ts +6 -0
  110. package/types/server/admin/router.d.ts +6 -0
  111. package/types/server/admin/snapshot.d.ts +6 -0
  112. package/types/server/assets.d.ts +47 -0
  113. package/types/server/auth/handoff.d.ts +12 -0
  114. package/types/server/cache-deps.d.ts +16 -0
  115. package/types/server/cache-vary.d.ts +30 -0
  116. package/types/server/cloudflare.d.ts +163 -0
  117. package/types/server/create-app.d.ts +25 -0
  118. package/types/server/data-cache.d.ts +116 -0
  119. package/types/server/dev/devtools.d.ts +44 -0
  120. package/types/server/dev/report.d.ts +229 -0
  121. package/types/server/dev/socket.d.ts +17 -0
  122. package/types/server/dev/version-check.d.mts +15 -0
  123. package/types/server/ejs-adapter.d.ts +11 -0
  124. package/types/server/head-hints.d.ts +40 -0
  125. package/types/server/html-cache.d.ts +207 -0
  126. package/types/server/image-optimizer.d.ts +68 -0
  127. package/types/server/logs/access-middleware.d.ts +7 -0
  128. package/types/server/logs/file-sink.d.ts +17 -0
  129. package/types/server/logs/pipeline.d.ts +37 -0
  130. package/types/server/logs/s3-put.d.ts +85 -0
  131. package/types/server/logs/s3-sink.d.ts +26 -0
  132. package/types/server/metadata.d.ts +38 -0
  133. package/types/server/middleware/compression.d.ts +17 -0
  134. package/types/server/middleware/csrf.d.ts +4 -0
  135. package/types/server/middleware/dev-gate.d.ts +2 -0
  136. package/types/server/middleware/headers.d.ts +2 -0
  137. package/types/server/middleware/redirects.d.ts +2 -0
  138. package/types/server/middleware/robots-txt.d.ts +33 -0
  139. package/types/server/middleware/static-precompressed.d.ts +5 -0
  140. package/types/server/middleware/trailing-slash.d.ts +11 -0
  141. package/types/server/middleware/upstream-proxy.d.ts +21 -0
  142. package/types/server/og-image.d.ts +149 -0
  143. package/types/server/port-guard.d.ts +50 -0
  144. package/types/server/prewarm.d.ts +131 -0
  145. package/types/server/redis.d.ts +163 -0
  146. package/types/server/render.d.ts +101 -0
  147. package/types/server/router.d.ts +5 -0
  148. package/types/server/status-page.d.ts +24 -0
  149. package/types/server/upstream-limiter.d.ts +123 -0
  150. package/types/server/upstream-tracking.d.ts +42 -0
  151. package/types/shared/cookie-domain.d.ts +29 -0
  152. package/types/templates/layout.render.d.ts +7 -0
  153. package/types/version.d.mts +10 -0
  154. package/types/views/components/loader.d.ts +5 -0
  155. package/types/views/helpers/html.d.ts +39 -0
  156. package/types/views/helpers/tags.d.ts +127 -0
@@ -0,0 +1,46 @@
1
+ export type SwapOptions = {
2
+ /**
3
+ * Varsayılan `GET`.
4
+ */
5
+ method?: string;
6
+ body?: BodyInit | null;
7
+ headers?: Record<string, string>;
8
+ signal?: AbortSignal;
9
+ /**
10
+ * `true` → adres çubuğu `url` ile güncellenir.
11
+ */
12
+ history?: boolean;
13
+ /**
14
+ * Varsayılan `replace`.
15
+ */
16
+ mode?: "replace" | "append";
17
+ };
18
+ /**
19
+ * @typedef {object} SwapOptions
20
+ * @property {string} [method] Varsayılan `GET`.
21
+ * @property {BodyInit | null} [body]
22
+ * @property {Record<string, string>} [headers]
23
+ * @property {AbortSignal} [signal]
24
+ * @property {boolean} [history] `true` → adres çubuğu `url` ile güncellenir.
25
+ * @property {"replace" | "append"} [mode] Varsayılan `replace`.
26
+ */
27
+ /**
28
+ * @param {Element | string} target Takas edilecek bölge.
29
+ * @param {string} url Parçayı döndüren uç.
30
+ * @param {SwapOptions} [options]
31
+ * @returns {Promise<boolean>} Başarılıysa `true`; hata durumunda mevcut
32
+ * içerik korunur ve `false` döner.
33
+ */
34
+ export declare function swap(target: Element | string, url: string, options?: SwapOptions): Promise<boolean>;
35
+ /**
36
+ * `data-swap` taşıyan bağlantı ve butonları otomatik bağlar.
37
+ *
38
+ * <a href="/_fragment/rows?page=2" data-swap="#rows" data-swap-history>…</a>
39
+ *
40
+ * Tek bir delege dinleyici: sonradan DOM'a giren bağlantılar da çalışır ve
41
+ * her takastan sonra yeniden bağlama gerekmez.
42
+ *
43
+ * @param {ParentNode} [root]
44
+ * @returns {() => void} Dinleyiciyi söken fonksiyon.
45
+ */
46
+ export declare function startSwapLinks(root?: ParentNode): () => void;
@@ -0,0 +1,32 @@
1
+ export type AstNode = import('./parse.js').AstNode;
2
+ export type AttrNode = import('./parse.js').AttrNode;
3
+ /**
4
+ * @typedef {import('./parse.js').AstNode} AstNode
5
+ * @typedef {import('./parse.js').AttrNode} AttrNode
6
+ */
7
+ /**
8
+ * @param {AstNode[]} ast
9
+ * @param {{ viewId: string, file?: string, knownComponents?: Set<string> }} options
10
+ * @returns {{ code: string, includes: string[], components: string[] }}
11
+ */
12
+ export declare function codegen(ast: AstNode[], options: {
13
+ viewId: string;
14
+ file?: string;
15
+ knownComponents?: Set<string>;
16
+ }): {
17
+ code: string;
18
+ includes: string[];
19
+ components: string[];
20
+ };
21
+ /**
22
+ * Include yolunu view id'ye çevir (uzantısız, `/` ayırıcılı).
23
+ * @param {string} includePath
24
+ * @returns {string}
25
+ */
26
+ export declare function normalizeIncludeId(includePath: string): string;
27
+ /**
28
+ * `market-hero` / `MarketHero` → `MarketHero`
29
+ * @param {string} name
30
+ * @returns {string}
31
+ */
32
+ export declare function toPascalCase(name: string): string;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @param {{ root: string, dirs: Record<string, string> }} config
3
+ * @param {{ quiet?: boolean }} [options]
4
+ * @returns {Promise<{ count: number, manifest: Record<string, string>, outDir: string }>}
5
+ */
6
+ export declare function compileAll(config: {
7
+ root: string;
8
+ dirs: Record<string, string>;
9
+ }, _options?: {}): Promise<{
10
+ count: number;
11
+ manifest: Record<string, string>;
12
+ outDir: string;
13
+ }>;
14
+ /**
15
+ * Manifest yoksa veya herhangi bir `.jsk` daha yeniyse yeniden derler.
16
+ * Dev sunucu restart'ında build watch kaçırmış olsa bile şablonlar güncel kalır.
17
+ *
18
+ * @param {{ root: string, dirs: Record<string, string> }} config
19
+ * @returns {Promise<{ count: number, rebuilt: boolean }>}
20
+ */
21
+ export declare function ensureTemplatesCompiled(config: {
22
+ root: string;
23
+ dirs: Record<string, string>;
24
+ }): Promise<{
25
+ count: number;
26
+ rebuilt: boolean;
27
+ }>;
28
+ /**
29
+ * Tek kaynak dizgisini derler (birim testleri).
30
+ * @param {string} source
31
+ * @param {{ viewId?: string, file?: string, knownComponents?: Set<string> }} [options]
32
+ * @returns {{ code: string, includes: string[], components: string[] }}
33
+ */
34
+ export declare function compileSource(source: string, options?: {
35
+ viewId?: string;
36
+ file?: string;
37
+ knownComponents?: Set<string>;
38
+ }): {
39
+ code: string;
40
+ includes: string[];
41
+ components: string[];
42
+ };
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Şablon derleme hataları. Satır/sütun korunur ki DX overlay ve CLI
3
+ * çıktısı kaynağa işaret edebilsin.
4
+ */
5
+ /**
6
+ * @param {string} source
7
+ * @param {number} index
8
+ * @returns {{ line: number, column: number }}
9
+ */
10
+ export declare function indexToLocation(source: string, index: number): {
11
+ line: number;
12
+ column: number;
13
+ };
14
+ export declare class CompileError extends Error {
15
+ file: string | undefined;
16
+ line: number | undefined;
17
+ column: number | undefined;
18
+ /**
19
+ * @param {string} message
20
+ * @param {{ file?: string, source?: string, index?: number,
21
+ * line?: number, column?: number }} [opts]
22
+ */
23
+ constructor(message: string, opts?: {
24
+ file?: string;
25
+ source?: string;
26
+ index?: number;
27
+ line?: number;
28
+ column?: number;
29
+ });
30
+ }
@@ -0,0 +1,67 @@
1
+ export type LiteralNode = {
2
+ type: 'Literal';
3
+ value: string | number | boolean | null;
4
+ raw: string;
5
+ };
6
+ export type IdentNode = {
7
+ type: 'Ident';
8
+ name: string;
9
+ };
10
+ export type MemberNode = {
11
+ type: 'Member';
12
+ object: ExprNode;
13
+ property: string;
14
+ optional: boolean;
15
+ };
16
+ export type IndexNode = {
17
+ type: 'Index';
18
+ object: ExprNode;
19
+ index: ExprNode;
20
+ optional: boolean;
21
+ };
22
+ export type UnaryNode = {
23
+ type: 'Unary';
24
+ op: '!' | '-';
25
+ argument: ExprNode;
26
+ };
27
+ export type BinaryNode = {
28
+ type: 'Binary';
29
+ op: string;
30
+ left: ExprNode;
31
+ right: ExprNode;
32
+ };
33
+ export type CondNode = {
34
+ type: 'Cond';
35
+ test: ExprNode;
36
+ consequent: ExprNode;
37
+ alternate: ExprNode;
38
+ };
39
+ export type ExprNode = LiteralNode | IdentNode | MemberNode | IndexNode | UnaryNode | BinaryNode | CondNode;
40
+ /**
41
+ * @param {string} source
42
+ * @param {number} start
43
+ * @param {number} end
44
+ * @param {{ file?: string, templateSource?: string, templateIndex?: number }} [meta]
45
+ * @returns {ExprNode}
46
+ */
47
+ export declare function parseExpr(source: string, start?: number, end?: number, meta?: {
48
+ file?: string;
49
+ templateSource?: string;
50
+ templateIndex?: number;
51
+ }): ExprNode;
52
+ /**
53
+ * İfadeyi JS kaynak metnine çevirir. `locals` içindeki isimler çıplak kalır;
54
+ * diğerleri `data.` öneki alır.
55
+ *
56
+ * @param {ExprNode} node
57
+ * @param {Set<string>} [locals]
58
+ * @returns {string}
59
+ */
60
+ export declare function codegenExpr(node: ExprNode, locals?: Set<string>): string;
61
+ /**
62
+ * İfadede geçen kök tanımlayıcılar (data alanları / local adayları).
63
+ * @param {ExprNode} node
64
+ * @param {Set<string>} [out]
65
+ * @returns {Set<string>}
66
+ */
67
+ export declare function collectIdents(node: ExprNode, out?: Set<string>): Set<string>;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Build-time `.jsk` derleyici yüzeyi.
3
+ */
4
+ export { CompileError, indexToLocation } from "./errors.js";
5
+ export { parseExpr, codegenExpr } from "./expr.js";
6
+ export { parseTemplate, isComponentTag } from "./parse.js";
7
+ export { codegen, toPascalCase, normalizeIncludeId } from "./codegen.js";
8
+ export { getViewRoots, getComponentDirs, discoverJskFiles, componentNameFromViewId, collectKnownComponents, toComponentTag, } from "./resolve.js";
9
+ export { scanNamedExports } from "./scan-exports.js";
10
+ export { compileAll, compileSource, ensureTemplatesCompiled } from "./compile-all.js";
@@ -0,0 +1,82 @@
1
+ export type ExprNode = import('./expr.js').ExprNode;
2
+ export type TextNode = {
3
+ type: 'Text';
4
+ value: string;
5
+ };
6
+ export type InterpNode = {
7
+ type: 'Interp';
8
+ expr: ExprNode;
9
+ raw: boolean;
10
+ index: number;
11
+ };
12
+ export type AttrNode = {
13
+ name: string;
14
+ value: string | null;
15
+ expr: ExprNode | null;
16
+ bound: boolean;
17
+ boolean: boolean;
18
+ index: number;
19
+ };
20
+ export type ElementNode = {
21
+ type: 'Element';
22
+ name: string;
23
+ attrs: AttrNode[];
24
+ children: AstNode[];
25
+ selfClosing: boolean;
26
+ index: number;
27
+ };
28
+ export type ComponentNode = {
29
+ type: 'Component';
30
+ name: string;
31
+ attrs: AttrNode[];
32
+ children: AstNode[];
33
+ selfClosing: boolean;
34
+ index: number;
35
+ };
36
+ export type IfNode = {
37
+ type: 'If';
38
+ test: ExprNode;
39
+ consequent: AstNode[];
40
+ alternate: AstNode[];
41
+ index: number;
42
+ };
43
+ export type EachNode = {
44
+ type: 'Each';
45
+ list: ExprNode;
46
+ item: string;
47
+ indexName: string | null;
48
+ children: AstNode[];
49
+ index: number;
50
+ };
51
+ export type IncludeNode = {
52
+ type: 'Include';
53
+ path: string;
54
+ index: number;
55
+ };
56
+ export type AstNode = TextNode | InterpNode | ElementNode | ComponentNode | IfNode | EachNode | IncludeNode;
57
+ /**
58
+ * @typedef {import('./expr.js').ExprNode} ExprNode
59
+ * @typedef {{ type: 'Text', value: string }} TextNode
60
+ * @typedef {{ type: 'Interp', expr: ExprNode, raw: boolean, index: number }} InterpNode
61
+ * @typedef {{ name: string, value: string | null, expr: ExprNode | null, bound: boolean, boolean: boolean, index: number }} AttrNode
62
+ * @typedef {{ type: 'Element', name: string, attrs: AttrNode[], children: AstNode[], selfClosing: boolean, index: number }} ElementNode
63
+ * @typedef {{ type: 'Component', name: string, attrs: AttrNode[], children: AstNode[], selfClosing: boolean, index: number }} ComponentNode
64
+ * @typedef {{ type: 'If', test: ExprNode, consequent: AstNode[], alternate: AstNode[], index: number }} IfNode
65
+ * @typedef {{ type: 'Each', list: ExprNode, item: string, indexName: string | null, children: AstNode[], index: number }} EachNode
66
+ * @typedef {{ type: 'Include', path: string, index: number }} IncludeNode
67
+ * @typedef {TextNode | InterpNode | ElementNode | ComponentNode | IfNode | EachNode | IncludeNode} AstNode
68
+ */
69
+ /**
70
+ * @param {string} source
71
+ * @param {{ file?: string }} [options]
72
+ * @returns {AstNode[]}
73
+ */
74
+ export declare function parseTemplate(source: string, options?: {
75
+ file?: string;
76
+ }): AstNode[];
77
+ /**
78
+ * PascalCase bileşen mi?
79
+ * @param {string} name
80
+ * @returns {boolean}
81
+ */
82
+ export declare function isComponentTag(name: string): boolean;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Runtime'ın camelCase → PascalCase alias'ı ile aynı kural.
3
+ * @param {string} name
4
+ * @returns {string}
5
+ */
6
+ export declare function toComponentTag(name: string): string;
7
+ /**
8
+ * @param {{ root: string, dirs: Record<string, string> }} config
9
+ * @returns {string[]} Mutlak view kökleri (var olanlar).
10
+ */
11
+ export declare function getViewRoots(config: {
12
+ root: string;
13
+ dirs: Record<string, string>;
14
+ }): string[];
15
+ /**
16
+ * Bileşen dizinleri: her view kökü altındaki `components/`.
17
+ * @param {{ root: string, dirs: Record<string, string> }} config
18
+ * @returns {string[]}
19
+ */
20
+ export declare function getComponentDirs(config: {
21
+ root: string;
22
+ dirs: Record<string, string>;
23
+ }): string[];
24
+ /**
25
+ * @param {string[]} viewRoots
26
+ * @returns {Map<string, string>} viewId → mutlak `.jsk` yolu
27
+ */
28
+ export declare function discoverJskFiles(viewRoots: string[]): Map<string, string>;
29
+ /**
30
+ * `components/foo-bar.jsk` → `FooBar`
31
+ * @param {string} viewId
32
+ * @returns {string | null}
33
+ */
34
+ export declare function componentNameFromViewId(viewId: string): string | null;
35
+ /**
36
+ * Bilinen bileşen adları: JS named export'lar + derlenecek `.jsk` bileşenleri
37
+ * + yerleşik etiketler.
38
+ *
39
+ * JS tarafında dosya adı varsayılmaz; kaynak metinden `export` adları okunur.
40
+ * Aynı export (veya aynı PascalCase etiket) iki dosyada varsa derleme hatası.
41
+ *
42
+ * @param {string[]} componentDirs
43
+ * @param {Map<string, string>} jskFiles
44
+ * @returns {Set<string>}
45
+ */
46
+ export declare function collectKnownComponents(componentDirs: string[], jskFiles: Map<string, string>): Set<string>;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Kaynak metinden named export adlarını çıkarır — modülü çalıştırmadan.
3
+ * Compile-time bilinen bileşen listesi için; `default` yok sayılır.
4
+ */
5
+ /**
6
+ * @param {string} source
7
+ * @returns {string[]}
8
+ */
9
+ export declare function scanNamedExports(source: string): string[];