@devoplus/one-sdk 0.0.0-stage → 0.2.0-next.117
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/CHANGELOG.md +268 -0
- package/README.md +893 -2
- package/bin/accessRequest.d.mts +96 -0
- package/bin/accessRequest.mjs +340 -0
- package/bin/appOps.d.mts +97 -0
- package/bin/appOps.mjs +336 -0
- package/bin/dataCommand.mjs +131 -0
- package/bin/devConfig.mjs +132 -0
- package/bin/one.mjs +341 -0
- package/bin/session.mjs +239 -0
- package/dist/agentInput.d.ts +9 -0
- package/dist/agentInput.d.ts.map +1 -0
- package/dist/agentInput.js +102 -0
- package/dist/agentInput.js.map +1 -0
- package/dist/agentTools.d.ts +83 -0
- package/dist/agentTools.d.ts.map +1 -0
- package/dist/agentTools.js +164 -0
- package/dist/agentTools.js.map +1 -0
- package/dist/ai.d.ts +67 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +129 -0
- package/dist/ai.js.map +1 -0
- package/dist/audit.d.ts +21 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +58 -0
- package/dist/audit.js.map +1 -0
- package/dist/backend.d.ts +27 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +63 -0
- package/dist/backend.js.map +1 -0
- package/dist/cache.d.ts +20 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +84 -0
- package/dist/cache.js.map +1 -0
- package/dist/client.d.ts +147 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +469 -0
- package/dist/client.js.map +1 -0
- package/dist/components.d.ts +235 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +1491 -0
- package/dist/components.js.map +1 -0
- package/dist/context.d.ts +110 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +126 -0
- package/dist/context.js.map +1 -0
- package/dist/data/crud.d.ts +74 -0
- package/dist/data/crud.d.ts.map +1 -0
- package/dist/data/crud.js +614 -0
- package/dist/data/crud.js.map +1 -0
- package/dist/data/ddl.d.ts +76 -0
- package/dist/data/ddl.d.ts.map +1 -0
- package/dist/data/ddl.js +362 -0
- package/dist/data/ddl.js.map +1 -0
- package/dist/data/fold.d.ts +14 -0
- package/dist/data/fold.d.ts.map +1 -0
- package/dist/data/fold.js +76 -0
- package/dist/data/fold.js.map +1 -0
- package/dist/data/model.d.ts +113 -0
- package/dist/data/model.d.ts.map +1 -0
- package/dist/data/model.js +408 -0
- package/dist/data/model.js.map +1 -0
- package/dist/data/values.d.ts +29 -0
- package/dist/data/values.d.ts.map +1 -0
- package/dist/data/values.js +152 -0
- package/dist/data/values.js.map +1 -0
- package/dist/dexa.d.ts +44 -0
- package/dist/dexa.d.ts.map +1 -0
- package/dist/dexa.js +74 -0
- package/dist/dexa.js.map +1 -0
- package/dist/dexaCommand.d.ts +116 -0
- package/dist/dexaCommand.d.ts.map +1 -0
- package/dist/dexaCommand.js +226 -0
- package/dist/dexaCommand.js.map +1 -0
- package/dist/export/columns.d.ts +62 -0
- package/dist/export/columns.d.ts.map +1 -0
- package/dist/export/columns.js +127 -0
- package/dist/export/columns.js.map +1 -0
- package/dist/export/csv.d.ts +10 -0
- package/dist/export/csv.d.ts.map +1 -0
- package/dist/export/csv.js +30 -0
- package/dist/export/csv.js.map +1 -0
- package/dist/export/report.d.ts +19 -0
- package/dist/export/report.d.ts.map +1 -0
- package/dist/export/report.js +91 -0
- package/dist/export/report.js.map +1 -0
- package/dist/export/response.d.ts +14 -0
- package/dist/export/response.d.ts.map +1 -0
- package/dist/export/response.js +70 -0
- package/dist/export/response.js.map +1 -0
- package/dist/export/xlsx.d.ts +15 -0
- package/dist/export/xlsx.d.ts.map +1 -0
- package/dist/export/xlsx.js +167 -0
- package/dist/export/xlsx.js.map +1 -0
- package/dist/export/zip.d.ts +7 -0
- package/dist/export/zip.d.ts.map +1 -0
- package/dist/export/zip.js +83 -0
- package/dist/export/zip.js.map +1 -0
- package/dist/files.d.ts +52 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +137 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs.d.ts +57 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +157 -0
- package/dist/jobs.js.map +1 -0
- package/dist/log.d.ts +22 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +107 -0
- package/dist/log.js.map +1 -0
- package/dist/notify.d.ts +41 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +11 -0
- package/dist/notify.js.map +1 -0
- package/dist/org.d.ts +184 -0
- package/dist/org.d.ts.map +1 -0
- package/dist/org.js +114 -0
- package/dist/org.js.map +1 -0
- package/dist/people.d.ts +39 -0
- package/dist/people.d.ts.map +1 -0
- package/dist/people.js +88 -0
- package/dist/people.js.map +1 -0
- package/dist/problem.d.ts +12 -0
- package/dist/problem.d.ts.map +1 -0
- package/dist/problem.js +33 -0
- package/dist/problem.js.map +1 -0
- package/dist/runtime.d.ts +92 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +8 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scenarios.d.ts +125 -0
- package/dist/scenarios.d.ts.map +1 -0
- package/dist/scenarios.js +251 -0
- package/dist/scenarios.js.map +1 -0
- package/package.json +55 -3
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Türkçe katlanmış kayıt araması (karar defteri S15, 18.10.2026): `içerir` araması büyük/küçük harfe ve Türkçe
|
|
2
|
+
// harflere duyarsızdır — "istanbul" "İSTANBUL"u, "cay" "Çay"ı bulur.
|
|
3
|
+
//
|
|
4
|
+
// Her metin alanının (text · longText) yanında bir GÖLGE kolon durur: `<alan>_fold`. Kayıt işlemleri (createCrudHandler)
|
|
5
|
+
// alanı yazarken gölgeyi `foldSearchText` ile doldurur; arama gölgede yapılır ve aranan ifade de AYNI işlevle katlanır.
|
|
6
|
+
//
|
|
7
|
+
// Katlama kuralı (iki tarafta BİREBİR aynı — testle kilitli):
|
|
8
|
+
// 1. Türkçe harfler: Ç ç → c · Ğ ğ → g · İ ı → i · Ö ö → o · Ş ş → s · Ü ü → u · Â â → a · Î î → i · Û û → u
|
|
9
|
+
// 2. Kalan A-Z → a-z (yalnız ASCII). "I" da "i" olur: Türkçede I ile ı, İ ile i ayrı harflerdir ama aramada dördü
|
|
10
|
+
// aynı sayılır (kullanıcı "ı"yı "i" yazabilir).
|
|
11
|
+
// Diğer harfler (é, ß …) olduğu gibi kalır.
|
|
12
|
+
//
|
|
13
|
+
// Gölgesi boş (NULL) kayıt — gölge kolondan ÖNCE yazılmış kayıt ya da uygulamanın elle yazdığı SQL — aramadan düşmez:
|
|
14
|
+
// arama boş gölgede aynı kuralı veritabanında `foldSqlExpression` ile anında uygular (COALESCE). Bu yüzden gölge kolonu
|
|
15
|
+
// ekleyen migration var olan satırları doldurmaz (veri değiştirmez, yalnız ekler).
|
|
16
|
+
//
|
|
17
|
+
// ⚠️ Sınır: uygulama bir metin alanını ELLE yazdığı SQL ile GÜNCELLİYORSA gölge eski değerde kalır ve arama eski metne
|
|
18
|
+
// göre bulur. Elle güncelleyen SQL gölgeyi de yazar (`"<alan>_fold" = ?` + `foldSearchText(değer)`) ya da `NULL` yapar.
|
|
19
|
+
// ⚠️ Ölçülmedi: platform veritabanının `lower()` işlevi ASCII dışı büyük harfleri de küçültüyorsa (ICU) yalnız boş gölgeli
|
|
20
|
+
// satırlarda é/É gibi harfler farklı katlanır; Türkçe harfler ve ASCII her durumda aynıdır.
|
|
21
|
+
/** Gölge kolon eki: alanın kolonu `ad` ise gölgesi `ad_fold`. Alan adı bu ekle bitemez. */
|
|
22
|
+
export const FOLD_COLUMN_SUFFIX = '_fold';
|
|
23
|
+
/** Katlanan Türkçe harfler → karşılığı. Sıra SQL ifadesinin sırasıdır. */
|
|
24
|
+
export const FOLD_PAIRS = [
|
|
25
|
+
['Ç', 'c'],
|
|
26
|
+
['ç', 'c'],
|
|
27
|
+
['Ğ', 'g'],
|
|
28
|
+
['ğ', 'g'],
|
|
29
|
+
['İ', 'i'],
|
|
30
|
+
['ı', 'i'],
|
|
31
|
+
['Ö', 'o'],
|
|
32
|
+
['ö', 'o'],
|
|
33
|
+
['Ş', 's'],
|
|
34
|
+
['ş', 's'],
|
|
35
|
+
['Ü', 'u'],
|
|
36
|
+
['ü', 'u'],
|
|
37
|
+
['Â', 'a'],
|
|
38
|
+
['â', 'a'],
|
|
39
|
+
['Î', 'i'],
|
|
40
|
+
['î', 'i'],
|
|
41
|
+
['Û', 'u'],
|
|
42
|
+
['û', 'u'],
|
|
43
|
+
];
|
|
44
|
+
const FOLD_MAP = new Map(FOLD_PAIRS);
|
|
45
|
+
const FOLD_RE = new RegExp(`[${FOLD_PAIRS.map(([from]) => from).join('')}]`, 'g');
|
|
46
|
+
/** Metni arama için katlar (gölge kolon ve aranan ifade). Önce NFC: ayrık yazılmış "s + ̧" da "ş" sayılır. */
|
|
47
|
+
export function foldSearchText(value) {
|
|
48
|
+
return value
|
|
49
|
+
.normalize('NFC')
|
|
50
|
+
.replace(FOLD_RE, (c) => FOLD_MAP.get(c) ?? c)
|
|
51
|
+
.replace(/[A-Z]/g, (c) => c.toLowerCase());
|
|
52
|
+
}
|
|
53
|
+
/** Gölge kolonun adı. */
|
|
54
|
+
export function foldColumnName(column) {
|
|
55
|
+
return `${column}${FOLD_COLUMN_SUFFIX}`;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* SQL'in çevirdiği diziler. SQL NFC yapamaz: ayrık yazılmış harfler ("S" + birleşen çengel, "I" + üst nokta) ÖNCE
|
|
59
|
+
* çevrilir, sonra birleşik harfler. Yoksa elle yazılmış ya da gölgesiz eski bir satırdaki "şeker" "seker" aramasında
|
|
60
|
+
* bulunmazdı, JS katlaması ise onu bulur (Codex #21).
|
|
61
|
+
*/
|
|
62
|
+
const SQL_FOLD_PAIRS = [
|
|
63
|
+
...FOLD_PAIRS.map(([from, to]) => [from.normalize('NFD'), to]).filter(([from], i) => from !== FOLD_PAIRS[i][0]),
|
|
64
|
+
...FOLD_PAIRS,
|
|
65
|
+
];
|
|
66
|
+
/**
|
|
67
|
+
* Aynı katlamanın SQL karşılığı (boş gölgede arama için). `column` modelden gelir ve tırnaklanır — değer GİRMEZ.
|
|
68
|
+
* SQLite'ın yerleşik `lower()`'ı yalnız ASCII harfleri küçültür (ICU yoksa); Türkçe harfler önce `replace` ile çevrilir.
|
|
69
|
+
*/
|
|
70
|
+
export function foldSqlExpression(column) {
|
|
71
|
+
let sql = `"${column}"`;
|
|
72
|
+
for (const [from, to] of SQL_FOLD_PAIRS)
|
|
73
|
+
sql = `replace(${sql}, '${from}', '${to}')`;
|
|
74
|
+
return `lower(${sql})`;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=fold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold.js","sourceRoot":"","sources":["../../src/data/fold.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAC/G,qEAAqE;AACrE,EAAE;AACF,yHAAyH;AACzH,wHAAwH;AACxH,EAAE;AACF,8DAA8D;AAC9D,+GAA+G;AAC/G,oHAAoH;AACpH,qDAAqD;AACrD,8CAA8C;AAC9C,EAAE;AACF,sHAAsH;AACtH,wHAAwH;AACxH,mFAAmF;AACnF,EAAE;AACF,uHAAuH;AACvH,wHAAwH;AACxH,2HAA2H;AAC3H,4FAA4F;AAE5F,2FAA2F;AAC3F,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAA;AAEzC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,UAAU,GAA6C;IAClE,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,GAAG,CAAC;CACX,CAAA;AAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAA;AACpC,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AAEjF,8GAA8G;AAC9G,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK;SACT,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC7C,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;AAC9C,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,GAAG,MAAM,GAAG,kBAAkB,EAAE,CAAA;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,cAAc,GAA6C;IAC/D,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,CAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;IACzH,GAAG,UAAU;CACd,CAAA;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,GAAG,GAAG,IAAI,MAAM,GAAG,CAAA;IACvB,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,cAAc;QAAE,GAAG,GAAG,WAAW,GAAG,MAAM,IAAI,OAAO,EAAE,IAAI,CAAA;IACpF,OAAO,SAAS,GAAG,GAAG,CAAA;AACxB,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/** Alan türleri (D-84). Veritabanı karşılığı `ddl.ts`'te, değer kuralları `values.ts`'tedir. */
|
|
2
|
+
export declare const DATA_FIELD_TYPES: readonly ['text', 'longText', 'number', 'money', 'date', 'datetime', 'boolean', 'choice', 'person', 'file'];
|
|
3
|
+
export type DataFieldType = (typeof DATA_FIELD_TYPES)[number];
|
|
4
|
+
/** Varlık ve alan adı: küçük harf, rakam, alt çizgi; harfle başlar; en çok 40 karakter (tablo/kolon adı olarak SQL güvenli). */
|
|
5
|
+
export declare const DATA_NAME_RE: RegExp;
|
|
6
|
+
/** Seçim değeri (veritabanında saklanan kod): küçük harf, rakam, `_`, `-`; en çok 40 karakter. Görünen ad `title`'dadır. */
|
|
7
|
+
export declare const DATA_CHOICE_VALUE_RE: RegExp;
|
|
8
|
+
export declare const DATA_MAX_ENTITIES = 30;
|
|
9
|
+
export declare const DATA_MAX_FIELDS = 60;
|
|
10
|
+
export declare const DATA_MAX_CHOICES = 100;
|
|
11
|
+
export declare const DATA_TITLE_MAX_LENGTH = 120;
|
|
12
|
+
/** Metin alanlarının varsayılan ve en büyük uzunluğu (karakter). Satır tavanı 2 MB'dir; uzun metin bu yüzden sınırlı. */
|
|
13
|
+
export declare const TEXT_DEFAULT_MAX_LENGTH = 200;
|
|
14
|
+
export declare const TEXT_MAX_LENGTH = 1000;
|
|
15
|
+
export declare const LONG_TEXT_DEFAULT_MAX_LENGTH = 10000;
|
|
16
|
+
export declare const LONG_TEXT_MAX_LENGTH = 50000;
|
|
17
|
+
/**
|
|
18
|
+
* Tabloda en çok kolon (platform belgesi, okundu 18.10.2026: 100). Otomatik kolonlar + alan kolonları + metin alanlarının
|
|
19
|
+
* arama gölgeleri (`<alan>_fold`, S15) birlikte sayılır.
|
|
20
|
+
*/
|
|
21
|
+
export declare const DATA_MAX_COLUMNS = 100;
|
|
22
|
+
/** Platformun her tabloya eklediği kolonlar; alan adı olarak kullanılamaz. */
|
|
23
|
+
export declare const SYSTEM_COLUMNS: readonly ['id', 'created_at', 'created_by', 'updated_at', 'updated_by', 'deleted_at'];
|
|
24
|
+
export interface DataTitle {
|
|
25
|
+
tr: string;
|
|
26
|
+
en: string;
|
|
27
|
+
}
|
|
28
|
+
export interface DataChoice {
|
|
29
|
+
value: string;
|
|
30
|
+
title: DataTitle;
|
|
31
|
+
}
|
|
32
|
+
/** `one.data.json` içindeki bir alan (yazıldığı biçim). */
|
|
33
|
+
export interface DataFieldInput {
|
|
34
|
+
type: DataFieldType;
|
|
35
|
+
title: DataTitle;
|
|
36
|
+
required?: boolean;
|
|
37
|
+
unique?: boolean;
|
|
38
|
+
index?: boolean;
|
|
39
|
+
default?: string | number | boolean;
|
|
40
|
+
choices?: DataChoice[];
|
|
41
|
+
maxLength?: number;
|
|
42
|
+
min?: number;
|
|
43
|
+
max?: number;
|
|
44
|
+
}
|
|
45
|
+
export interface DataEntityInput {
|
|
46
|
+
title: DataTitle;
|
|
47
|
+
fields: Record<string, DataFieldInput>;
|
|
48
|
+
/** Silme kaydı yok etmez, `deleted_at`'i doldurur (varsayılan `true`). */
|
|
49
|
+
softDelete?: boolean;
|
|
50
|
+
}
|
|
51
|
+
/** `one.data.json` — tanımlayıcı veri modeli. */
|
|
52
|
+
export interface OneDataModel {
|
|
53
|
+
version: 1;
|
|
54
|
+
entities: Record<string, DataEntityInput>;
|
|
55
|
+
}
|
|
56
|
+
/** Doğrulanmış ve varsayılanları doldurulmuş alan. Sıra `one.data.json`'daki yazılış sırasıdır. */
|
|
57
|
+
export interface DataField {
|
|
58
|
+
name: string;
|
|
59
|
+
/** Veritabanı kolonu: `money` alanında `<ad>_minor` (kuruş), diğerlerinde alan adı. */
|
|
60
|
+
column: string;
|
|
61
|
+
type: DataFieldType;
|
|
62
|
+
title: DataTitle;
|
|
63
|
+
required: boolean;
|
|
64
|
+
unique: boolean;
|
|
65
|
+
index: boolean;
|
|
66
|
+
/** API biçiminde varsayılan (para: "12.50" gibi ondalıklı metin); yoksa `undefined`. */
|
|
67
|
+
default: string | number | boolean | undefined;
|
|
68
|
+
choices: DataChoice[];
|
|
69
|
+
/** Metin alanlarında karakter sınırı; diğerlerinde `undefined`. */
|
|
70
|
+
maxLength: number | undefined;
|
|
71
|
+
/**
|
|
72
|
+
* Metin alanlarının (text · longText) Türkçe katlanmış arama gölgesi `<alan>_fold` (S15, `fold.ts`); diğerlerinde
|
|
73
|
+
* `undefined`. API'de görünmez; kayıt işlemleri yazar, `içerir` araması okur.
|
|
74
|
+
*/
|
|
75
|
+
foldColumn: string | undefined;
|
|
76
|
+
min: number | undefined;
|
|
77
|
+
max: number | undefined;
|
|
78
|
+
}
|
|
79
|
+
export interface DataEntity {
|
|
80
|
+
name: string;
|
|
81
|
+
title: DataTitle;
|
|
82
|
+
softDelete: boolean;
|
|
83
|
+
fields: DataField[];
|
|
84
|
+
}
|
|
85
|
+
export interface DataModel {
|
|
86
|
+
version: 1;
|
|
87
|
+
entities: DataEntity[];
|
|
88
|
+
}
|
|
89
|
+
/** Model kuralına aykırılık. `issues` her biri tek bir yeri anlatan Türkçe iletilerdir. */
|
|
90
|
+
export declare class DataModelError extends Error {
|
|
91
|
+
readonly issues: readonly string[];
|
|
92
|
+
constructor(issues: readonly string[]);
|
|
93
|
+
}
|
|
94
|
+
/** Ondalıklı para metni ("12", "12.5", "-0,05") → kuruş. Biçim dışı ya da güvenli tamsayı aralığı dışı → `null`. */
|
|
95
|
+
export declare function moneyToMinor(raw: string | number): number | null;
|
|
96
|
+
/** Kuruş → ondalıklı metin ("1234.50"). */
|
|
97
|
+
export declare function minorToMoney(minor: number): string;
|
|
98
|
+
export declare const DATE_RE: RegExp;
|
|
99
|
+
export declare const DATETIME_RE: RegExp;
|
|
100
|
+
/** `YYYY-MM-DD` gerçek bir takvim günü mü? */
|
|
101
|
+
export declare function isCalendarDate(text: string): boolean;
|
|
102
|
+
/** ISO 8601 tarih-saat (bölge zorunlu) → UTC `toISOString()` biçimi; geçersizse `null`. */
|
|
103
|
+
export declare function normalizeDateTime(text: string): string | null;
|
|
104
|
+
/**
|
|
105
|
+
* `one.data.json` içeriğini doğrular ve varsayılanları doldurur. Bütün sorunlar TEK seferde toplanır (ajan hepsini bir
|
|
106
|
+
* turda düzeltsin diye); sorun varsa `DataModelError` fırlatılır.
|
|
107
|
+
*/
|
|
108
|
+
export declare function parseDataModel(raw: unknown): DataModel;
|
|
109
|
+
/** Doğrulanmış modeli `one.data.json` biçimine geri yazar (anlık görüntü ve üretilen tipler bunu taşır; sıra korunur). */
|
|
110
|
+
export declare function toModelInput(model: DataModel): OneDataModel;
|
|
111
|
+
/** Varlığı adıyla bulur; yoksa `undefined`. */
|
|
112
|
+
export declare function findEntity(model: DataModel, name: string): DataEntity | undefined;
|
|
113
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/data/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
// Tanımlayıcı veri modeli (karar defteri D-84 — ÖNERİ): `one.data.json` şeması ve bağımlılıksız doğrulayıcısı.
|
|
2
|
+
//
|
|
3
|
+
// Niçin SDK'da (manifest paketinde değil): model hem `one data generate` komutunda (SDK'nın `one` komutu) hem çalışma
|
|
4
|
+
// anında `createCrudHandler`'da okunur; SDK yayımlanan TEK pakettir ve bağımlılıksızdır, manifest paketi ise özel ve
|
|
5
|
+
// zod'a bağlıdır. Kural tek yerde durur: komut ve çalışma anı aynı doğrulayıcıyı kullanır.
|
|
6
|
+
//
|
|
7
|
+
// ⛔ Bu dosya `one data generate` tarafından TypeScript derlemesi OLMADAN da yüklenir (çalışma alanında tip ayıklamayla):
|
|
8
|
+
// yalnız silinebilir tip sözdizimi kullanılır (enum yok, yapıcı parametre özelliği yok) ve `../context.ts` içe
|
|
9
|
+
// aktarılmaz. Hatalar `DataModelError` ile döner; çalışma anı onları kendi hata koduna çevirir.
|
|
10
|
+
import { FOLD_COLUMN_SUFFIX, foldColumnName } from './fold.js';
|
|
11
|
+
/** Alan türleri (D-84). Veritabanı karşılığı `ddl.ts`'te, değer kuralları `values.ts`'tedir. */
|
|
12
|
+
export const DATA_FIELD_TYPES = ['text', 'longText', 'number', 'money', 'date', 'datetime', 'boolean', 'choice', 'person', 'file'];
|
|
13
|
+
/** Varlık ve alan adı: küçük harf, rakam, alt çizgi; harfle başlar; en çok 40 karakter (tablo/kolon adı olarak SQL güvenli). */
|
|
14
|
+
export const DATA_NAME_RE = /^[a-z][a-z0-9_]{0,39}$/;
|
|
15
|
+
/** Seçim değeri (veritabanında saklanan kod): küçük harf, rakam, `_`, `-`; en çok 40 karakter. Görünen ad `title`'dadır. */
|
|
16
|
+
export const DATA_CHOICE_VALUE_RE = /^[a-z0-9][a-z0-9_-]{0,39}$/;
|
|
17
|
+
export const DATA_MAX_ENTITIES = 30;
|
|
18
|
+
export const DATA_MAX_FIELDS = 60;
|
|
19
|
+
export const DATA_MAX_CHOICES = 100;
|
|
20
|
+
export const DATA_TITLE_MAX_LENGTH = 120;
|
|
21
|
+
/** Metin alanlarının varsayılan ve en büyük uzunluğu (karakter). Satır tavanı 2 MB'dir; uzun metin bu yüzden sınırlı. */
|
|
22
|
+
export const TEXT_DEFAULT_MAX_LENGTH = 200;
|
|
23
|
+
export const TEXT_MAX_LENGTH = 1000;
|
|
24
|
+
export const LONG_TEXT_DEFAULT_MAX_LENGTH = 10_000;
|
|
25
|
+
export const LONG_TEXT_MAX_LENGTH = 50_000;
|
|
26
|
+
/**
|
|
27
|
+
* Tabloda en çok kolon (platform belgesi, okundu 18.10.2026: 100). Otomatik kolonlar + alan kolonları + metin alanlarının
|
|
28
|
+
* arama gölgeleri (`<alan>_fold`, S15) birlikte sayılır.
|
|
29
|
+
*/
|
|
30
|
+
export const DATA_MAX_COLUMNS = 100;
|
|
31
|
+
/** Platformun her tabloya eklediği kolonlar; alan adı olarak kullanılamaz. */
|
|
32
|
+
export const SYSTEM_COLUMNS = ['id', 'created_at', 'created_by', 'updated_at', 'updated_by', 'deleted_at'];
|
|
33
|
+
/**
|
|
34
|
+
* SQLite anahtar sözcükleri (sqlite.org/lang_keywords.html, 147 sözcük) + satır kimliği takma adları. Adlar SQL'de
|
|
35
|
+
* her zaman tırnaklı yazılır; yine de anahtar sözcük reddedilir ki elle yazılan sorgular (ör. `SELECT order FROM …`)
|
|
36
|
+
* kırılmasın.
|
|
37
|
+
*/
|
|
38
|
+
const SQL_KEYWORDS = new Set(('abort action add after all alter always analyze and as asc attach autoincrement before begin between by cascade case ' +
|
|
39
|
+
'cast check collate column commit conflict constraint create cross current current_date current_time current_timestamp ' +
|
|
40
|
+
'database default deferrable deferred delete desc detach distinct do drop each else end escape except exclude exclusive ' +
|
|
41
|
+
'exists explain fail filter first following for foreign from full generated glob group groups having if ignore immediate ' +
|
|
42
|
+
'in index indexed initially inner insert instead intersect into is isnull join key last left like limit match materialized ' +
|
|
43
|
+
'natural no not nothing notnull null nulls of offset on or order others outer over partition plan pragma preceding primary ' +
|
|
44
|
+
'query raise range recursive references regexp reindex release rename replace restrict returning right rollback row rows ' +
|
|
45
|
+
'savepoint select set table temp temporary then ties to transaction trigger unbounded union unique update using vacuum ' +
|
|
46
|
+
'values view virtual when where window with without rowid oid _rowid_').split(' '));
|
|
47
|
+
/** Platformun ve veritabanının iç tabloları bu öneklerle başlar; varlık adı olarak kullanılamaz. */
|
|
48
|
+
const RESERVED_TABLE_PREFIXES = ['sqlite_', 'd1_', 'cf_', 'one_'];
|
|
49
|
+
/** Model kuralına aykırılık. `issues` her biri tek bir yeri anlatan Türkçe iletilerdir. */
|
|
50
|
+
export class DataModelError extends Error {
|
|
51
|
+
issues;
|
|
52
|
+
constructor(issues) {
|
|
53
|
+
super(issues.length === 1 ? issues[0] : `Veri modelinde ${issues.length} sorun var:\n- ${issues.join('\n- ')}`);
|
|
54
|
+
this.name = 'DataModelError';
|
|
55
|
+
this.issues = issues;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
59
|
+
function nameIssue(name, kind) {
|
|
60
|
+
if (!DATA_NAME_RE.test(name))
|
|
61
|
+
return `${kind} adı "${name}" geçersiz: küçük harfle başlamalı, yalnız küçük harf (a-z), rakam ve alt çizgi içermeli, en çok 40 karakter olmalı.`;
|
|
62
|
+
if (name.includes('__') || name.endsWith('_'))
|
|
63
|
+
return `${kind} adı "${name}" çift alt çizgi içeremez ve alt çizgiyle bitemez.`;
|
|
64
|
+
if (SQL_KEYWORDS.has(name))
|
|
65
|
+
return `${kind} adı "${name}" veritabanı dilinde ayrılmış bir sözcüktür; başka bir ad seçin (ör. "${name}_value").`;
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
function titleIssue(raw, where) {
|
|
69
|
+
if (!isRecord(raw))
|
|
70
|
+
return `${where}: "title" { "tr": "…", "en": "…" } biçiminde olmalı.`;
|
|
71
|
+
for (const lang of ['tr', 'en']) {
|
|
72
|
+
const v = raw[lang];
|
|
73
|
+
if (typeof v !== 'string' || v.trim() === '')
|
|
74
|
+
return `${where}: "title.${lang}" boş olamaz (Türkçe ve İngilizce ad zorunlu).`;
|
|
75
|
+
if (v.length > DATA_TITLE_MAX_LENGTH)
|
|
76
|
+
return `${where}: "title.${lang}" en çok ${DATA_TITLE_MAX_LENGTH} karakter olabilir.`;
|
|
77
|
+
}
|
|
78
|
+
for (const k of Object.keys(raw))
|
|
79
|
+
if (k !== 'tr' && k !== 'en')
|
|
80
|
+
return `${where}: "title" içinde bilinmeyen dil "${k}" (yalnız "tr" ve "en").`;
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const FIELD_KEYS = new Set(['type', 'title', 'required', 'unique', 'index', 'default', 'choices', 'maxLength', 'min', 'max']);
|
|
84
|
+
const ENTITY_KEYS = new Set(['title', 'fields', 'softDelete']);
|
|
85
|
+
const NOT_UNIQUE = new Set(['longText', 'boolean']);
|
|
86
|
+
const NOT_INDEXED = new Set(['longText']);
|
|
87
|
+
const NO_DEFAULT = new Set(['person', 'file']);
|
|
88
|
+
/** Ondalıklı para metni ("12", "12.5", "-0,05") → kuruş. Biçim dışı ya da güvenli tamsayı aralığı dışı → `null`. */
|
|
89
|
+
export function moneyToMinor(raw) {
|
|
90
|
+
let text;
|
|
91
|
+
if (typeof raw === 'number') {
|
|
92
|
+
if (!Number.isFinite(raw))
|
|
93
|
+
return null;
|
|
94
|
+
text = String(raw);
|
|
95
|
+
if (/e/i.test(text))
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
else
|
|
99
|
+
text = raw.trim();
|
|
100
|
+
const m = /^(-)?(\d{1,16})(?:[.,](\d{1,2}))?$/.exec(text);
|
|
101
|
+
if (!m)
|
|
102
|
+
return null;
|
|
103
|
+
const minor = Number(m[2]) * 100 + Number((m[3] ?? '').padEnd(2, '0') || '0');
|
|
104
|
+
if (!Number.isSafeInteger(minor))
|
|
105
|
+
return null;
|
|
106
|
+
return m[1] && minor !== 0 ? -minor : minor;
|
|
107
|
+
}
|
|
108
|
+
/** Kuruş → ondalıklı metin ("1234.50"). */
|
|
109
|
+
export function minorToMoney(minor) {
|
|
110
|
+
const abs = Math.abs(minor);
|
|
111
|
+
const major = Math.floor(abs / 100);
|
|
112
|
+
const cents = String(abs % 100).padStart(2, '0');
|
|
113
|
+
return `${minor < 0 ? '-' : ''}${major}.${cents}`;
|
|
114
|
+
}
|
|
115
|
+
export const DATE_RE = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
116
|
+
export const DATETIME_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,3})?)?(?:Z|[+-]\d{2}:\d{2})$/;
|
|
117
|
+
/** `YYYY-MM-DD` gerçek bir takvim günü mü? */
|
|
118
|
+
export function isCalendarDate(text) {
|
|
119
|
+
const m = DATE_RE.exec(text);
|
|
120
|
+
if (!m)
|
|
121
|
+
return false;
|
|
122
|
+
const [y, mo, d] = [Number(m[1]), Number(m[2]), Number(m[3])];
|
|
123
|
+
const date = new Date(Date.UTC(y, mo - 1, d));
|
|
124
|
+
return y >= 1 && date.getUTCFullYear() === y && date.getUTCMonth() === mo - 1 && date.getUTCDate() === d;
|
|
125
|
+
}
|
|
126
|
+
/** ISO 8601 tarih-saat (bölge zorunlu) → UTC `toISOString()` biçimi; geçersizse `null`. */
|
|
127
|
+
export function normalizeDateTime(text) {
|
|
128
|
+
if (!DATETIME_RE.test(text) || !isCalendarDate(text.slice(0, 10)))
|
|
129
|
+
return null;
|
|
130
|
+
const t = Date.parse(text);
|
|
131
|
+
if (!Number.isFinite(t))
|
|
132
|
+
return null;
|
|
133
|
+
return new Date(t).toISOString();
|
|
134
|
+
}
|
|
135
|
+
function defaultIssue(field, value, where) {
|
|
136
|
+
const bad = (expected) => `${where}: "default" ${expected} olmalı.`;
|
|
137
|
+
switch (field.type) {
|
|
138
|
+
case 'text':
|
|
139
|
+
case 'longText':
|
|
140
|
+
return typeof value === 'string' ? null : bad('metin');
|
|
141
|
+
case 'number':
|
|
142
|
+
return typeof value === 'number' && Number.isFinite(value) ? null : bad('sayı');
|
|
143
|
+
case 'money':
|
|
144
|
+
return (typeof value === 'number' || typeof value === 'string') && moneyToMinor(value) !== null
|
|
145
|
+
? null
|
|
146
|
+
: bad('en çok iki ondalık basamaklı tutar (ör. 12.50)');
|
|
147
|
+
case 'boolean':
|
|
148
|
+
return typeof value === 'boolean' ? null : bad('true ya da false');
|
|
149
|
+
case 'date':
|
|
150
|
+
return typeof value === 'string' && isCalendarDate(value) ? null : bad('YYYY-AA-GG biçiminde tarih');
|
|
151
|
+
case 'datetime':
|
|
152
|
+
return typeof value === 'string' && normalizeDateTime(value) !== null ? null : bad('bölgeli ISO tarih-saat (ör. 2026-01-31T09:00:00Z)');
|
|
153
|
+
case 'choice':
|
|
154
|
+
return typeof value === 'string' && field.choices.some((c) => c.value === value) ? null : bad('seçeneklerden birinin "value" değeri');
|
|
155
|
+
default:
|
|
156
|
+
return `${where}: bu alan türünde varsayılan verilemez.`;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* `one.data.json` içeriğini doğrular ve varsayılanları doldurur. Bütün sorunlar TEK seferde toplanır (ajan hepsini bir
|
|
161
|
+
* turda düzeltsin diye); sorun varsa `DataModelError` fırlatılır.
|
|
162
|
+
*/
|
|
163
|
+
export function parseDataModel(raw) {
|
|
164
|
+
const issues = [];
|
|
165
|
+
if (!isRecord(raw))
|
|
166
|
+
throw new DataModelError(['one.data.json bir JSON nesnesi olmalı: { "version": 1, "entities": { … } }.']);
|
|
167
|
+
if (raw.version !== 1)
|
|
168
|
+
issues.push('"version" 1 olmalı.');
|
|
169
|
+
for (const k of Object.keys(raw))
|
|
170
|
+
if (k !== 'version' && k !== 'entities' && k !== '$schema')
|
|
171
|
+
issues.push(`Bilinmeyen üst alan "${k}" (yalnız "version" ve "entities").`);
|
|
172
|
+
if (!isRecord(raw.entities)) {
|
|
173
|
+
issues.push('"entities" bir nesne olmalı: { "<varlık adı>": { "title": …, "fields": { … } } }.');
|
|
174
|
+
throw new DataModelError(issues);
|
|
175
|
+
}
|
|
176
|
+
const entityNames = Object.keys(raw.entities);
|
|
177
|
+
if (entityNames.length > DATA_MAX_ENTITIES)
|
|
178
|
+
issues.push(`En çok ${DATA_MAX_ENTITIES} varlık tanımlanabilir (${entityNames.length}).`);
|
|
179
|
+
const entities = [];
|
|
180
|
+
for (const entityName of entityNames) {
|
|
181
|
+
const where = `"${entityName}"`;
|
|
182
|
+
const ni = nameIssue(entityName, 'varlık');
|
|
183
|
+
if (ni)
|
|
184
|
+
issues.push(ni);
|
|
185
|
+
else if (RESERVED_TABLE_PREFIXES.some((p) => entityName.startsWith(p)))
|
|
186
|
+
issues.push(`varlık adı "${entityName}" platform için ayrılmış bir önekle başlıyor (${RESERVED_TABLE_PREFIXES.join(', ')}).`);
|
|
187
|
+
const e = raw.entities[entityName];
|
|
188
|
+
if (!isRecord(e)) {
|
|
189
|
+
issues.push(`${where}: varlık bir nesne olmalı.`);
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
for (const k of Object.keys(e))
|
|
193
|
+
if (!ENTITY_KEYS.has(k))
|
|
194
|
+
issues.push(`${where}: bilinmeyen alan "${k}" (title · fields · softDelete).`);
|
|
195
|
+
const ti = titleIssue(e.title, where);
|
|
196
|
+
if (ti)
|
|
197
|
+
issues.push(ti);
|
|
198
|
+
if (e.softDelete !== undefined && typeof e.softDelete !== 'boolean')
|
|
199
|
+
issues.push(`${where}: "softDelete" true ya da false olmalı.`);
|
|
200
|
+
if (!isRecord(e.fields)) {
|
|
201
|
+
issues.push(`${where}: "fields" bir nesne olmalı.`);
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
const fieldNames = Object.keys(e.fields);
|
|
205
|
+
if (fieldNames.length === 0)
|
|
206
|
+
issues.push(`${where}: en az bir alan tanımlanmalı.`);
|
|
207
|
+
if (fieldNames.length > DATA_MAX_FIELDS)
|
|
208
|
+
issues.push(`${where}: bir varlıkta en çok ${DATA_MAX_FIELDS} alan olabilir (${fieldNames.length}).`);
|
|
209
|
+
const fields = [];
|
|
210
|
+
const columns = new Set(SYSTEM_COLUMNS);
|
|
211
|
+
for (const fieldName of fieldNames) {
|
|
212
|
+
const fw = `${where}.${fieldName}`;
|
|
213
|
+
const fni = nameIssue(fieldName, 'alan');
|
|
214
|
+
if (fni)
|
|
215
|
+
issues.push(fni);
|
|
216
|
+
else if (SYSTEM_COLUMNS.includes(fieldName))
|
|
217
|
+
issues.push(`alan adı "${fieldName}" platformun otomatik kolonudur (${SYSTEM_COLUMNS.join(', ')}); başka bir ad seçin.`);
|
|
218
|
+
else if (fieldName.endsWith('_minor'))
|
|
219
|
+
issues.push(`alan adı "${fieldName}" "_minor" ile bitemez (para alanlarının kolon eki).`);
|
|
220
|
+
else if (fieldName.endsWith(FOLD_COLUMN_SUFFIX))
|
|
221
|
+
issues.push(`alan adı "${fieldName}" "${FOLD_COLUMN_SUFFIX}" ile bitemez (metin alanlarının arama kolonu eki).`);
|
|
222
|
+
const f = e.fields[fieldName];
|
|
223
|
+
if (!isRecord(f)) {
|
|
224
|
+
issues.push(`${fw}: alan bir nesne olmalı.`);
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
for (const k of Object.keys(f))
|
|
228
|
+
if (!FIELD_KEYS.has(k))
|
|
229
|
+
issues.push(`${fw}: bilinmeyen özellik "${k}".`);
|
|
230
|
+
const type = f.type;
|
|
231
|
+
if (typeof type !== 'string' || !DATA_FIELD_TYPES.includes(type)) {
|
|
232
|
+
issues.push(`${fw}: "type" şunlardan biri olmalı: ${DATA_FIELD_TYPES.join(', ')}.`);
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const t = type;
|
|
236
|
+
const fti = titleIssue(f.title, fw);
|
|
237
|
+
if (fti)
|
|
238
|
+
issues.push(fti);
|
|
239
|
+
for (const flag of ['required', 'unique', 'index'])
|
|
240
|
+
if (f[flag] !== undefined && typeof f[flag] !== 'boolean')
|
|
241
|
+
issues.push(`${fw}: "${flag}" true ya da false olmalı.`);
|
|
242
|
+
const unique = f.unique === true;
|
|
243
|
+
if (unique && NOT_UNIQUE.has(t))
|
|
244
|
+
issues.push(`${fw}: "${t}" türündeki alan tekil (unique) olamaz.`);
|
|
245
|
+
if (f.index === true && NOT_INDEXED.has(t))
|
|
246
|
+
issues.push(`${fw}: "${t}" türündeki alana dizin (index) eklenemez.`);
|
|
247
|
+
let choices = [];
|
|
248
|
+
if (t === 'choice') {
|
|
249
|
+
if (!Array.isArray(f.choices) || f.choices.length === 0)
|
|
250
|
+
issues.push(`${fw}: seçim alanında "choices" en az bir seçenek içermeli.`);
|
|
251
|
+
else if (f.choices.length > DATA_MAX_CHOICES)
|
|
252
|
+
issues.push(`${fw}: en çok ${DATA_MAX_CHOICES} seçenek olabilir.`);
|
|
253
|
+
else {
|
|
254
|
+
const seen = new Set();
|
|
255
|
+
f.choices.forEach((c, i) => {
|
|
256
|
+
const cw = `${fw}.choices[${i}]`;
|
|
257
|
+
if (!isRecord(c) || typeof c.value !== 'string' || !DATA_CHOICE_VALUE_RE.test(c.value)) {
|
|
258
|
+
issues.push(`${cw}: "value" küçük harf, rakam, "_" ya da "-" içeren en çok 40 karakterlik bir kod olmalı (ör. "beklemede").`);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (seen.has(c.value))
|
|
262
|
+
issues.push(`${cw}: "${c.value}" değeri tekrar ediyor.`);
|
|
263
|
+
seen.add(c.value);
|
|
264
|
+
const cti = titleIssue(c.title, cw);
|
|
265
|
+
if (cti)
|
|
266
|
+
issues.push(cti);
|
|
267
|
+
for (const k of Object.keys(c))
|
|
268
|
+
if (k !== 'value' && k !== 'title')
|
|
269
|
+
issues.push(`${cw}: bilinmeyen özellik "${k}".`);
|
|
270
|
+
if (!cti)
|
|
271
|
+
choices.push({ value: c.value, title: { tr: c.title.tr, en: c.title.en } });
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
else if (f.choices !== undefined)
|
|
276
|
+
issues.push(`${fw}: "choices" yalnız seçim (choice) alanında kullanılır.`);
|
|
277
|
+
let maxLength;
|
|
278
|
+
if (t === 'text' || t === 'longText') {
|
|
279
|
+
const cap = t === 'text' ? TEXT_MAX_LENGTH : LONG_TEXT_MAX_LENGTH;
|
|
280
|
+
if (f.maxLength === undefined)
|
|
281
|
+
maxLength = t === 'text' ? TEXT_DEFAULT_MAX_LENGTH : LONG_TEXT_DEFAULT_MAX_LENGTH;
|
|
282
|
+
else if (typeof f.maxLength !== 'number' || !Number.isInteger(f.maxLength) || f.maxLength < 1 || f.maxLength > cap)
|
|
283
|
+
issues.push(`${fw}: "maxLength" 1 ile ${cap} arasında bir tamsayı olmalı.`);
|
|
284
|
+
else
|
|
285
|
+
maxLength = f.maxLength;
|
|
286
|
+
}
|
|
287
|
+
else if (f.maxLength !== undefined)
|
|
288
|
+
issues.push(`${fw}: "maxLength" yalnız metin alanlarında kullanılır.`);
|
|
289
|
+
let min;
|
|
290
|
+
let max;
|
|
291
|
+
for (const bound of ['min', 'max']) {
|
|
292
|
+
const v = f[bound];
|
|
293
|
+
if (v === undefined)
|
|
294
|
+
continue;
|
|
295
|
+
if (t !== 'number' && t !== 'money') {
|
|
296
|
+
issues.push(`${fw}: "${bound}" yalnız sayı ve para alanlarında kullanılır.`);
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
if (typeof v !== 'number' || !Number.isFinite(v) || (t === 'money' && moneyToMinor(v) === null))
|
|
300
|
+
issues.push(`${fw}: "${bound}" geçerli bir sayı olmalı${t === 'money' ? ' (en çok iki ondalık basamak)' : ''}.`);
|
|
301
|
+
else if (bound === 'min')
|
|
302
|
+
min = v;
|
|
303
|
+
else
|
|
304
|
+
max = v;
|
|
305
|
+
}
|
|
306
|
+
if (min !== undefined && max !== undefined && min > max)
|
|
307
|
+
issues.push(`${fw}: "min" "max"tan büyük olamaz.`);
|
|
308
|
+
let def;
|
|
309
|
+
if (f.default !== undefined) {
|
|
310
|
+
if (NO_DEFAULT.has(t))
|
|
311
|
+
issues.push(`${fw}: "${t}" türündeki alanda varsayılan verilemez.`);
|
|
312
|
+
else if (unique)
|
|
313
|
+
issues.push(`${fw}: tekil (unique) alanda varsayılan verilemez (her kayıt aynı değeri alırdı).`);
|
|
314
|
+
else {
|
|
315
|
+
const di = defaultIssue({ type: t, choices }, f.default, fw);
|
|
316
|
+
if (di)
|
|
317
|
+
issues.push(di);
|
|
318
|
+
else if (t === 'money')
|
|
319
|
+
def = minorToMoney(moneyToMinor(f.default));
|
|
320
|
+
else if (t === 'datetime')
|
|
321
|
+
def = normalizeDateTime(f.default);
|
|
322
|
+
else
|
|
323
|
+
def = f.default;
|
|
324
|
+
if (def !== undefined && (t === 'number' || t === 'money')) {
|
|
325
|
+
const n = t === 'money' ? moneyToMinor(def) / 100 : def;
|
|
326
|
+
if ((min !== undefined && n < min) || (max !== undefined && n > max))
|
|
327
|
+
issues.push(`${fw}: "default" min/max aralığının dışında.`);
|
|
328
|
+
}
|
|
329
|
+
if (def !== undefined && maxLength !== undefined && [...String(def)].length > maxLength)
|
|
330
|
+
issues.push(`${fw}: "default" "maxLength" sınırını aşıyor.`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
const column = t === 'money' ? `${fieldName}_minor` : fieldName;
|
|
334
|
+
if (columns.has(column))
|
|
335
|
+
issues.push(`${fw}: kolon adı "${column}" başka bir kolonla çakışıyor.`);
|
|
336
|
+
columns.add(column);
|
|
337
|
+
const foldColumn = t === 'text' || t === 'longText' ? foldColumnName(column) : undefined;
|
|
338
|
+
if (foldColumn !== undefined) {
|
|
339
|
+
if (columns.has(foldColumn))
|
|
340
|
+
issues.push(`${fw}: arama kolonu "${foldColumn}" başka bir kolonla çakışıyor.`);
|
|
341
|
+
columns.add(foldColumn);
|
|
342
|
+
}
|
|
343
|
+
if (!fti)
|
|
344
|
+
fields.push({
|
|
345
|
+
name: fieldName,
|
|
346
|
+
column,
|
|
347
|
+
type: t,
|
|
348
|
+
title: { tr: f.title.tr, en: f.title.en },
|
|
349
|
+
required: f.required === true,
|
|
350
|
+
unique,
|
|
351
|
+
index: f.index === true,
|
|
352
|
+
default: def,
|
|
353
|
+
choices,
|
|
354
|
+
maxLength,
|
|
355
|
+
foldColumn,
|
|
356
|
+
min,
|
|
357
|
+
max,
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
if (columns.size > DATA_MAX_COLUMNS)
|
|
361
|
+
issues.push(`${where}: tabloda en çok ${DATA_MAX_COLUMNS} kolon olabilir; bu varlık ${columns.size} kolon gerektiriyor ` +
|
|
362
|
+
`(${SYSTEM_COLUMNS.length} otomatik + alanlar + her metin alanı için bir arama kolonu). Alanları iki varlığa bölün.`);
|
|
363
|
+
if (!ti)
|
|
364
|
+
entities.push({
|
|
365
|
+
name: entityName,
|
|
366
|
+
title: { tr: e.title.tr, en: e.title.en },
|
|
367
|
+
softDelete: e.softDelete !== false,
|
|
368
|
+
fields,
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
if (issues.length > 0)
|
|
372
|
+
throw new DataModelError(issues);
|
|
373
|
+
return { version: 1, entities };
|
|
374
|
+
}
|
|
375
|
+
/** Doğrulanmış modeli `one.data.json` biçimine geri yazar (anlık görüntü ve üretilen tipler bunu taşır; sıra korunur). */
|
|
376
|
+
export function toModelInput(model) {
|
|
377
|
+
const entities = {};
|
|
378
|
+
for (const e of model.entities) {
|
|
379
|
+
const fields = {};
|
|
380
|
+
for (const f of e.fields) {
|
|
381
|
+
const out = { type: f.type, title: { ...f.title } };
|
|
382
|
+
if (f.required)
|
|
383
|
+
out.required = true;
|
|
384
|
+
if (f.unique)
|
|
385
|
+
out.unique = true;
|
|
386
|
+
if (f.index)
|
|
387
|
+
out.index = true;
|
|
388
|
+
if (f.default !== undefined)
|
|
389
|
+
out.default = f.default;
|
|
390
|
+
if (f.choices.length > 0)
|
|
391
|
+
out.choices = f.choices.map((c) => ({ value: c.value, title: { ...c.title } }));
|
|
392
|
+
if (f.maxLength !== undefined)
|
|
393
|
+
out.maxLength = f.maxLength;
|
|
394
|
+
if (f.min !== undefined)
|
|
395
|
+
out.min = f.min;
|
|
396
|
+
if (f.max !== undefined)
|
|
397
|
+
out.max = f.max;
|
|
398
|
+
fields[f.name] = out;
|
|
399
|
+
}
|
|
400
|
+
entities[e.name] = { title: { ...e.title }, fields, softDelete: e.softDelete };
|
|
401
|
+
}
|
|
402
|
+
return { version: 1, entities };
|
|
403
|
+
}
|
|
404
|
+
/** Varlığı adıyla bulur; yoksa `undefined`. */
|
|
405
|
+
export function findEntity(model, name) {
|
|
406
|
+
return model.entities.find((e) => e.name === name);
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/data/model.ts"],"names":[],"mappings":"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"}
|