sonamu 0.7.3 → 0.7.5

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 (133) hide show
  1. package/dist/api/config.d.ts +1 -4
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +1 -1
  4. package/dist/api/sonamu.d.ts +2 -0
  5. package/dist/api/sonamu.d.ts.map +1 -1
  6. package/dist/api/sonamu.js +19 -47
  7. package/dist/bin/cli.js +6 -6
  8. package/dist/database/base-model.d.ts +1 -1
  9. package/dist/database/base-model.d.ts.map +1 -1
  10. package/dist/database/base-model.js +15 -4
  11. package/dist/database/code-generator.d.ts.map +1 -1
  12. package/dist/database/code-generator.js +3 -3
  13. package/dist/database/db.d.ts.map +1 -1
  14. package/dist/database/db.js +1 -1
  15. package/dist/database/puri-wrapper.d.ts +11 -11
  16. package/dist/database/puri-wrapper.d.ts.map +1 -1
  17. package/dist/database/puri-wrapper.js +7 -11
  18. package/dist/database/puri.d.ts +36 -17
  19. package/dist/database/puri.d.ts.map +1 -1
  20. package/dist/database/puri.js +54 -7
  21. package/dist/database/puri.types.d.ts +54 -17
  22. package/dist/database/puri.types.d.ts.map +1 -1
  23. package/dist/database/puri.types.js +2 -4
  24. package/dist/database/puri.types.test-d.js +129 -0
  25. package/dist/database/upsert-builder.d.ts +16 -10
  26. package/dist/database/upsert-builder.d.ts.map +1 -1
  27. package/dist/database/upsert-builder.js +10 -19
  28. package/dist/entity/entity-manager.d.ts +113 -22
  29. package/dist/entity/entity-manager.d.ts.map +1 -1
  30. package/dist/entity/entity-manager.js +1 -1
  31. package/dist/entity/entity.d.ts +34 -0
  32. package/dist/entity/entity.d.ts.map +1 -1
  33. package/dist/entity/entity.js +110 -37
  34. package/dist/index.d.ts +5 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +8 -2
  37. package/dist/migration/code-generation.d.ts.map +1 -1
  38. package/dist/migration/code-generation.js +341 -149
  39. package/dist/migration/migration-set.d.ts.map +1 -1
  40. package/dist/migration/migration-set.js +21 -5
  41. package/dist/migration/migrator.d.ts.map +1 -1
  42. package/dist/migration/migrator.js +7 -1
  43. package/dist/migration/postgresql-schema-reader.d.ts +11 -1
  44. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  45. package/dist/migration/postgresql-schema-reader.js +111 -10
  46. package/dist/syncer/syncer.d.ts.map +1 -1
  47. package/dist/syncer/syncer.js +5 -4
  48. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  49. package/dist/template/implementations/generated.template.js +12 -2
  50. package/dist/template/implementations/generated_sso.template.d.ts +3 -3
  51. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  52. package/dist/template/implementations/generated_sso.template.js +50 -2
  53. package/dist/template/implementations/model.template.js +6 -6
  54. package/dist/template/implementations/model_test.template.js +4 -4
  55. package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
  56. package/dist/template/implementations/view_enums_select.template.js +2 -2
  57. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  58. package/dist/template/implementations/view_form.template.js +12 -9
  59. package/dist/template/implementations/view_id_async_select.template.js +4 -4
  60. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  61. package/dist/template/implementations/view_list.template.js +12 -9
  62. package/dist/template/implementations/view_search_input.template.js +2 -2
  63. package/dist/template/template.js +2 -2
  64. package/dist/template/zod-converter.d.ts.map +1 -1
  65. package/dist/template/zod-converter.js +17 -2
  66. package/dist/testing/fixture-manager.d.ts +2 -1
  67. package/dist/testing/fixture-manager.d.ts.map +1 -1
  68. package/dist/testing/fixture-manager.js +29 -29
  69. package/dist/types/types.d.ts +593 -68
  70. package/dist/types/types.d.ts.map +1 -1
  71. package/dist/types/types.js +113 -9
  72. package/dist/vector/chunking.d.ts +25 -0
  73. package/dist/vector/chunking.d.ts.map +1 -0
  74. package/dist/vector/chunking.js +97 -0
  75. package/dist/vector/config.d.ts +12 -0
  76. package/dist/vector/config.d.ts.map +1 -0
  77. package/dist/vector/config.js +83 -0
  78. package/dist/vector/embedding.d.ts +42 -0
  79. package/dist/vector/embedding.d.ts.map +1 -0
  80. package/dist/vector/embedding.js +147 -0
  81. package/dist/vector/types.d.ts +105 -0
  82. package/dist/vector/types.d.ts.map +1 -0
  83. package/dist/vector/types.js +5 -0
  84. package/dist/vector/vector-search.d.ts +47 -0
  85. package/dist/vector/vector-search.d.ts.map +1 -0
  86. package/dist/vector/vector-search.js +176 -0
  87. package/package.json +11 -11
  88. package/src/api/config.ts +0 -4
  89. package/src/api/sonamu.ts +21 -36
  90. package/src/bin/cli.ts +5 -5
  91. package/src/database/base-model.ts +20 -11
  92. package/src/database/code-generator.ts +6 -2
  93. package/src/database/db.ts +1 -0
  94. package/src/database/puri-wrapper.ts +22 -16
  95. package/src/database/puri.ts +150 -27
  96. package/src/database/puri.types.test-d.ts +457 -0
  97. package/src/database/puri.types.ts +231 -33
  98. package/src/database/upsert-builder.ts +43 -34
  99. package/src/entity/entity-manager.ts +2 -2
  100. package/src/entity/entity.ts +134 -44
  101. package/src/index.ts +6 -0
  102. package/src/migration/code-generation.ts +377 -174
  103. package/src/migration/migration-set.ts +22 -3
  104. package/src/migration/migrator.ts +6 -0
  105. package/src/migration/postgresql-schema-reader.ts +121 -21
  106. package/src/syncer/syncer.ts +4 -3
  107. package/src/template/implementations/generated.template.ts +51 -9
  108. package/src/template/implementations/generated_sso.template.ts +71 -2
  109. package/src/template/implementations/model.template.ts +5 -5
  110. package/src/template/implementations/model_test.template.ts +3 -3
  111. package/src/template/implementations/view_enums_dropdown.template.ts +1 -1
  112. package/src/template/implementations/view_enums_select.template.ts +1 -1
  113. package/src/template/implementations/view_form.template.ts +11 -8
  114. package/src/template/implementations/view_id_async_select.template.ts +3 -3
  115. package/src/template/implementations/view_list.template.ts +11 -8
  116. package/src/template/implementations/view_search_input.template.ts +1 -1
  117. package/src/template/template.ts +1 -1
  118. package/src/template/zod-converter.ts +20 -0
  119. package/src/testing/fixture-manager.ts +31 -30
  120. package/src/types/types.ts +226 -48
  121. package/src/vector/chunking.ts +115 -0
  122. package/src/vector/config.ts +68 -0
  123. package/src/vector/embedding.ts +193 -0
  124. package/src/vector/types.ts +122 -0
  125. package/src/vector/vector-search.ts +261 -0
  126. package/dist/template/implementations/view_enums_buttonset.template.d.ts +0 -17
  127. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +0 -1
  128. package/dist/template/implementations/view_enums_buttonset.template.js +0 -31
  129. package/dist/template/implementations/view_list_columns.template.d.ts +0 -17
  130. package/dist/template/implementations/view_list_columns.template.d.ts.map +0 -1
  131. package/dist/template/implementations/view_list_columns.template.js +0 -49
  132. package/src/template/implementations/view_enums_buttonset.template.ts +0 -34
  133. package/src/template/implementations/view_list_columns.template.ts +0 -53
@@ -0,0 +1,261 @@
1
+ import type { Knex } from "knex";
2
+ import pgvector from "pgvector/knex";
3
+ import { DEFAULT_VECTOR_CONFIG } from "./config";
4
+ import { Embedding } from "./embedding";
5
+ import type {
6
+ EmbeddingItem,
7
+ EmbeddingProvider,
8
+ HybridSearchOptions,
9
+ HybridSearchResult,
10
+ ProgressCallback,
11
+ VectorConfig,
12
+ VectorSearchOptions,
13
+ VectorSearchResult,
14
+ } from "./types";
15
+
16
+ /**
17
+ * 벡터 검색
18
+ * pgvector를 활용한 벡터 검색 및 하이브리드 검색 지원
19
+ */
20
+ export class VectorSearch<T = Record<string, unknown>> {
21
+ private db: Knex;
22
+ private config: VectorConfig;
23
+ private embedding: Embedding;
24
+ private tableName: string;
25
+
26
+ constructor(db: Knex, tableName: string, config: Partial<VectorConfig> = {}) {
27
+ this.db = db;
28
+ this.tableName = tableName;
29
+ this.config = {
30
+ voyage: { ...DEFAULT_VECTOR_CONFIG.voyage, ...config.voyage },
31
+ openai: { ...DEFAULT_VECTOR_CONFIG.openai, ...config.openai },
32
+ chunking: { ...DEFAULT_VECTOR_CONFIG.chunking, ...config.chunking },
33
+ search: { ...DEFAULT_VECTOR_CONFIG.search, ...config.search },
34
+ pgvector: { ...DEFAULT_VECTOR_CONFIG.pgvector, ...config.pgvector },
35
+ };
36
+ this.embedding = new Embedding(config);
37
+ }
38
+
39
+ /**
40
+ * 단일 항목에 임베딩 저장
41
+ */
42
+ async saveEmbedding(
43
+ id: number,
44
+ text: string,
45
+ provider: EmbeddingProvider,
46
+ embeddingColumn: string = "content_embedding",
47
+ ): Promise<void> {
48
+ const { embedding } = await this.embedding.embedOne(text, provider, "document");
49
+
50
+ await this.db(this.tableName)
51
+ .where("id", id)
52
+ .update({
53
+ [embeddingColumn]: pgvector.toSql(embedding),
54
+ });
55
+ }
56
+
57
+ /**
58
+ * 여러 항목에 임베딩 일괄 저장
59
+ */
60
+ async saveEmbeddingsBatch(
61
+ items: EmbeddingItem[],
62
+ provider: EmbeddingProvider,
63
+ embeddingColumn: string = "content_embedding",
64
+ onProgress?: ProgressCallback,
65
+ ): Promise<void> {
66
+ const texts = items.map((item) => item.text);
67
+ const embeddings = await this.embedding.embedBatch(texts, provider, "document", onProgress);
68
+
69
+ await this.db.transaction(async (trx) => {
70
+ for (let i = 0; i < items.length; i++) {
71
+ await trx(this.tableName)
72
+ .where("id", items[i].id)
73
+ .update({
74
+ [embeddingColumn]: pgvector.toSql(embeddings[i].embedding),
75
+ });
76
+ }
77
+ });
78
+ }
79
+
80
+ /**
81
+ * 벡터 검색 (코사인 유사도)
82
+ */
83
+ async search(
84
+ query: string,
85
+ provider: EmbeddingProvider,
86
+ options: VectorSearchOptions = {},
87
+ ): Promise<VectorSearchResult<T>[]> {
88
+ const {
89
+ embeddingColumn = "content_embedding",
90
+ limit = this.config.search.defaultLimit,
91
+ threshold = this.config.search.similarityThreshold,
92
+ where,
93
+ } = options;
94
+
95
+ // 쿼리 임베딩 (input_type: 'query' 중요!)
96
+ const { embedding } = await this.embedding.embedOne(query, provider, "query");
97
+
98
+ // pgvector 세션 설정
99
+ if (this.config.pgvector.iterativeScan) {
100
+ await this.db.raw("SET hnsw.iterative_scan = relaxed_order");
101
+ }
102
+ await this.db.raw(`SET hnsw.ef_search = ${this.config.pgvector.efSearch}`);
103
+
104
+ // 코사인 유사도 = 1 - 코사인 거리
105
+ const vectorStr = pgvector.toSql(embedding);
106
+ let queryBuilder = this.db(this.tableName)
107
+ .select("*")
108
+ .select(this.db.raw(`1 - (${embeddingColumn} <=> ?::vector) AS similarity`, [vectorStr]))
109
+ .whereNotNull(embeddingColumn)
110
+ .orderByRaw(`${embeddingColumn} <=> ?::vector`, [vectorStr])
111
+ .limit(limit);
112
+
113
+ if (where) {
114
+ queryBuilder = queryBuilder.whereRaw(where);
115
+ }
116
+
117
+ const rows = await queryBuilder;
118
+
119
+ return rows
120
+ .filter((row: { similarity: number }) => row.similarity >= threshold)
121
+ .map((row: T & { similarity: number }) => ({
122
+ id: (row as unknown as { id: number }).id,
123
+ similarity: parseFloat(String(row.similarity)),
124
+ data: row as T,
125
+ }));
126
+ }
127
+
128
+ /**
129
+ * 하이브리드 검색 (Vector + FTS)
130
+ */
131
+ async hybridSearch(
132
+ query: string,
133
+ provider: EmbeddingProvider,
134
+ options: HybridSearchOptions = {},
135
+ ): Promise<HybridSearchResult<T>[]> {
136
+ const {
137
+ embeddingColumn = "content_embedding",
138
+ ftsColumn = "content_tsv",
139
+ limit = this.config.search.defaultLimit,
140
+ vectorWeight = this.config.search.vectorWeight,
141
+ ftsWeight = this.config.search.ftsWeight,
142
+ } = options;
143
+
144
+ const { embedding } = await this.embedding.embedOne(query, provider, "query");
145
+ const vectorStr = pgvector.toSql(embedding);
146
+
147
+ // pgvector 세션 설정
148
+ if (this.config.pgvector.iterativeScan) {
149
+ await this.db.raw("SET hnsw.iterative_scan = relaxed_order");
150
+ }
151
+ await this.db.raw(`SET hnsw.ef_search = ${this.config.pgvector.efSearch}`);
152
+
153
+ const sql = `
154
+ WITH vector_search AS (
155
+ SELECT
156
+ id,
157
+ ROW_NUMBER() OVER (ORDER BY ${embeddingColumn} <=> ?::vector) AS rank
158
+ FROM ${this.tableName}
159
+ WHERE ${embeddingColumn} IS NOT NULL
160
+ ORDER BY ${embeddingColumn} <=> ?::vector
161
+ LIMIT 50
162
+ ),
163
+ fts_search AS (
164
+ SELECT
165
+ id,
166
+ ROW_NUMBER() OVER (ORDER BY ts_rank(${ftsColumn}, query) DESC) AS rank
167
+ FROM ${this.tableName}, plainto_tsquery('simple', ?) query
168
+ WHERE ${ftsColumn} @@ query
169
+ LIMIT 50
170
+ ),
171
+ combined AS (
172
+ SELECT
173
+ COALESCE(v.id, f.id) AS id,
174
+ COALESCE(1.0 / (60 + v.rank), 0) AS vector_score,
175
+ COALESCE(1.0 / (60 + f.rank), 0) AS fts_score
176
+ FROM vector_search v
177
+ FULL OUTER JOIN fts_search f ON v.id = f.id
178
+ )
179
+ SELECT
180
+ t.*,
181
+ c.vector_score,
182
+ c.fts_score,
183
+ (c.vector_score * ? + c.fts_score * ?) AS similarity
184
+ FROM combined c
185
+ JOIN ${this.tableName} t ON c.id = t.id
186
+ ORDER BY similarity DESC
187
+ LIMIT ?
188
+ `;
189
+
190
+ const { rows } = await this.db.raw(sql, [
191
+ vectorStr,
192
+ vectorStr,
193
+ query,
194
+ vectorWeight,
195
+ ftsWeight,
196
+ limit,
197
+ ]);
198
+
199
+ return rows.map(
200
+ (
201
+ row: T & {
202
+ similarity: number;
203
+ vector_score: number;
204
+ fts_score: number;
205
+ },
206
+ ) => ({
207
+ id: (row as unknown as { id: number }).id,
208
+ similarity: parseFloat(String(row.similarity)),
209
+ vectorScore: parseFloat(String(row.vector_score)),
210
+ ftsScore: parseFloat(String(row.fts_score)),
211
+ data: row as T,
212
+ }),
213
+ );
214
+ }
215
+
216
+ /**
217
+ * 임베딩 현황 조회
218
+ */
219
+ async getEmbeddingStatus(embeddingColumn: string = "content_embedding"): Promise<{
220
+ total: number;
221
+ withEmbedding: number;
222
+ withoutEmbedding: number;
223
+ }> {
224
+ const result = await this.db(this.tableName)
225
+ .count("* as total")
226
+ .count(`${embeddingColumn} as with_embedding`)
227
+ .first();
228
+
229
+ const total = parseInt(String(result?.total ?? 0), 10);
230
+ const withEmbedding = parseInt(String(result?.with_embedding ?? 0), 10);
231
+
232
+ return {
233
+ total,
234
+ withEmbedding,
235
+ withoutEmbedding: total - withEmbedding,
236
+ };
237
+ }
238
+
239
+ /**
240
+ * 임베딩이 없는 항목 ID 조회
241
+ */
242
+ async getItemsWithoutEmbedding(
243
+ embeddingColumn: string = "content_embedding",
244
+ limit: number = 100,
245
+ ): Promise<number[]> {
246
+ const rows = await this.db(this.tableName)
247
+ .select("id")
248
+ .whereNull(embeddingColumn)
249
+ .orderBy("id")
250
+ .limit(limit);
251
+
252
+ return rows.map((row: { id: number }) => row.id);
253
+ }
254
+
255
+ /**
256
+ * Embedding 인스턴스 반환 (고급 사용)
257
+ */
258
+ getEmbedding(): Embedding {
259
+ return this.embedding;
260
+ }
261
+ }
@@ -1,17 +0,0 @@
1
- import { type EntityNamesRecord } from "../../entity/entity-manager";
2
- import type { TemplateOptions } from "../../types/types";
3
- import { Template } from "../template";
4
- export declare class Template__view_enums_buttonset extends Template {
5
- constructor();
6
- getTargetAndPath(names: EntityNamesRecord, componentId: string): {
7
- target: string;
8
- path: string;
9
- };
10
- render({ entityId, enumId }: TemplateOptions["view_enums_buttonset"]): {
11
- body: string;
12
- importKeys: never[];
13
- target: string;
14
- path: string;
15
- };
16
- }
17
- //# sourceMappingURL=view_enums_buttonset.template.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"view_enums_buttonset.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/view_enums_buttonset.template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,qBAAa,8BAA+B,SAAQ,QAAQ;;IAK1D,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM;;;;IAO9D,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC,sBAAsB,CAAC;;;;;;CAiBrE"}
@@ -1,31 +0,0 @@
1
- import { EntityManager } from "../../entity/entity-manager.js";
2
- import { Template } from "../template.js";
3
- export class Template__view_enums_buttonset extends Template {
4
- constructor(){
5
- super("view_enums_buttonset");
6
- }
7
- getTargetAndPath(names, componentId) {
8
- return {
9
- target: "web/src/components",
10
- path: `${names.fs}/${componentId}ButtonSet.tsx`
11
- };
12
- }
13
- render({ entityId, enumId }) {
14
- const names = EntityManager.getNamesFromId(entityId);
15
- return {
16
- ...this.getTargetAndPath(names, enumId),
17
- body: `
18
- /*
19
- view_enums_buttonset
20
- ${JSON.stringify({
21
- key: this.key,
22
- options: entityId
23
- })}
24
- */
25
- `.trim(),
26
- importKeys: []
27
- };
28
- }
29
- }
30
-
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19lbnVtc19idXR0b25zZXQudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX3ZpZXdfZW51bXNfYnV0dG9uc2V0IGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcInZpZXdfZW51bXNfYnV0dG9uc2V0XCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aChuYW1lczogRW50aXR5TmFtZXNSZWNvcmQsIGNvbXBvbmVudElkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBcIndlYi9zcmMvY29tcG9uZW50c1wiLFxuICAgICAgcGF0aDogYCR7bmFtZXMuZnN9LyR7Y29tcG9uZW50SWR9QnV0dG9uU2V0LnRzeGAsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7IGVudGl0eUlkLCBlbnVtSWQgfTogVGVtcGxhdGVPcHRpb25zW1widmlld19lbnVtc19idXR0b25zZXRcIl0pIHtcbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcywgZW51bUlkKSxcbiAgICAgIGJvZHk6IGBcbi8qXG52aWV3X2VudW1zX2J1dHRvbnNldFxuJHtKU09OLnN0cmluZ2lmeSh7XG4gIGtleTogdGhpcy5rZXksXG4gIG9wdGlvbnM6IGVudGl0eUlkLFxufSl9XG4qL1xuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiRW50aXR5TWFuYWdlciIsIlRlbXBsYXRlIiwiVGVtcGxhdGVfX3ZpZXdfZW51bXNfYnV0dG9uc2V0IiwiZ2V0VGFyZ2V0QW5kUGF0aCIsIm5hbWVzIiwiY29tcG9uZW50SWQiLCJ0YXJnZXQiLCJwYXRoIiwiZnMiLCJyZW5kZXIiLCJlbnRpdHlJZCIsImVudW1JZCIsImdldE5hbWVzRnJvbUlkIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJrZXkiLCJvcHRpb25zIiwidHJpbSIsImltcG9ydEtleXMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGFBQWEsUUFBZ0MsaUNBQThCO0FBRXBGLFNBQVNDLFFBQVEsUUFBUSxpQkFBYztBQUV2QyxPQUFPLE1BQU1DLHVDQUF1Q0Q7SUFDbEQsYUFBYztRQUNaLEtBQUssQ0FBQztJQUNSO0lBRUFFLGlCQUFpQkMsS0FBd0IsRUFBRUMsV0FBbUIsRUFBRTtRQUM5RCxPQUFPO1lBQ0xDLFFBQVE7WUFDUkMsTUFBTSxHQUFHSCxNQUFNSSxFQUFFLENBQUMsQ0FBQyxFQUFFSCxZQUFZLGFBQWEsQ0FBQztRQUNqRDtJQUNGO0lBRUFJLE9BQU8sRUFBRUMsUUFBUSxFQUFFQyxNQUFNLEVBQTJDLEVBQUU7UUFDcEUsTUFBTVAsUUFBUUosY0FBY1ksY0FBYyxDQUFDRjtRQUUzQyxPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUNQLGdCQUFnQixDQUFDQyxPQUFPTyxPQUFPO1lBQ3ZDRSxNQUFNLENBQUM7OztBQUdiLEVBQUVDLEtBQUtDLFNBQVMsQ0FBQztnQkFDZkMsS0FBSyxJQUFJLENBQUNBLEdBQUc7Z0JBQ2JDLFNBQVNQO1lBQ1gsR0FBRzs7TUFFRyxDQUFDLENBQUNRLElBQUk7WUFDTkMsWUFBWSxFQUFFO1FBQ2hCO0lBQ0Y7QUFDRiJ9
@@ -1,17 +0,0 @@
1
- import { type EntityNamesRecord } from "../../entity/entity-manager";
2
- import type { TemplateOptions } from "../../types/types";
3
- import { Template } from "../template";
4
- export declare class Template__view_list_columns extends Template {
5
- constructor();
6
- getTargetAndPath(names: EntityNamesRecord): {
7
- target: string;
8
- path: string;
9
- };
10
- render({ entityId, columns, columnImports }: TemplateOptions["view_list_columns"]): {
11
- body: string;
12
- importKeys: never[];
13
- target: string;
14
- path: string;
15
- };
16
- }
17
- //# sourceMappingURL=view_list_columns.template.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"view_list_columns.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/view_list_columns.template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,qBAAa,2BAA4B,SAAQ,QAAQ;;IAKvD,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAQzC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,eAAe,CAAC,mBAAmB,CAAC;;;;;;CAmClF"}
@@ -1,49 +0,0 @@
1
- import { EntityManager } from "../../entity/entity-manager.js";
2
- import { Template } from "../template.js";
3
- export class Template__view_list_columns extends Template {
4
- constructor(){
5
- super("view_list_columns");
6
- }
7
- getTargetAndPath(names) {
8
- return {
9
- target: "web/src/pages/admin",
10
- path: `${names.fsPlural}/_columns.tsx`
11
- };
12
- }
13
- // 컬럼
14
- render({ entityId, columns, columnImports }) {
15
- const names = EntityManager.getNamesFromId(entityId);
16
- return {
17
- ...this.getTargetAndPath(names),
18
- body: `
19
- import React from 'react';
20
- import {
21
- Segment,
22
- Table,
23
- TableRow,
24
- Button,
25
- Label,
26
- } from 'semantic-ui-react';
27
- import { DateTime } from "luxon";
28
- import { TFColumn } from "src/typeframe/iso-types";
29
- import { ${names.capital}SubsetA } from "src/services/${names.fs}/${names.fs}.generated";
30
- ${columnImports}
31
-
32
- const columns: { [key in Exclude<keyof ${names.capital}SubsetA, 'id'>]: TFColumn<${names.capital}SubsetA> } = {${columns.map((col)=>{
33
- return [
34
- `${col.name}: { label: "${col.label}",`,
35
- `tc: ${col.tc}, `,
36
- `collapsing: ${[
37
- "Title",
38
- "Name"
39
- ].includes(col.label) === false}, }`
40
- ].join("\n");
41
- }).join(",\n")}};
42
- export default columns;
43
- `.trim(),
44
- importKeys: []
45
- };
46
- }
47
- }
48
-
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19saXN0X2NvbHVtbnMudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX3ZpZXdfbGlzdF9jb2x1bW5zIGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcInZpZXdfbGlzdF9jb2x1bW5zXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aChuYW1lczogRW50aXR5TmFtZXNSZWNvcmQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBcIndlYi9zcmMvcGFnZXMvYWRtaW5cIixcbiAgICAgIHBhdGg6IGAke25hbWVzLmZzUGx1cmFsfS9fY29sdW1ucy50c3hgLFxuICAgIH07XG4gIH1cblxuICAvLyDsu6zrn7xcbiAgcmVuZGVyKHsgZW50aXR5SWQsIGNvbHVtbnMsIGNvbHVtbkltcG9ydHMgfTogVGVtcGxhdGVPcHRpb25zW1widmlld19saXN0X2NvbHVtbnNcIl0pIHtcbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyksXG4gICAgICBib2R5OiBgXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgU2VnbWVudCxcbiAgVGFibGUsXG4gIFRhYmxlUm93LFxuICBCdXR0b24sXG4gIExhYmVsLFxufSBmcm9tICdzZW1hbnRpYy11aS1yZWFjdCc7XG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gXCJsdXhvblwiO1xuaW1wb3J0IHsgVEZDb2x1bW4gfSBmcm9tIFwic3JjL3R5cGVmcmFtZS9pc28tdHlwZXNcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TdWJzZXRBIH0gZnJvbSBcInNyYy9zZXJ2aWNlcy8ke25hbWVzLmZzfS8ke25hbWVzLmZzfS5nZW5lcmF0ZWRcIjtcbiR7Y29sdW1uSW1wb3J0c31cblxuY29uc3QgY29sdW1uczogeyBba2V5IGluIEV4Y2x1ZGU8a2V5b2YgJHtcbiAgICAgICAgbmFtZXMuY2FwaXRhbFxuICAgICAgfVN1YnNldEEsICdpZCc+XTogVEZDb2x1bW48JHtuYW1lcy5jYXBpdGFsfVN1YnNldEE+IH0gPSB7JHtjb2x1bW5zXG4gICAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBgJHtjb2wubmFtZX06IHsgbGFiZWw6IFwiJHtjb2wubGFiZWx9XCIsYCxcbiAgICAgICAgICAgIGB0YzogJHtjb2wudGN9LCBgLFxuICAgICAgICAgICAgYGNvbGxhcHNpbmc6ICR7W1wiVGl0bGVcIiwgXCJOYW1lXCJdLmluY2x1ZGVzKGNvbC5sYWJlbCkgPT09IGZhbHNlfSwgfWAsXG4gICAgICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihcIixcXG5cIil9fTtcbmV4cG9ydCBkZWZhdWx0IGNvbHVtbnM7XG4gICAgICBgLnRyaW0oKSxcbiAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgIH07XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJFbnRpdHlNYW5hZ2VyIiwiVGVtcGxhdGUiLCJUZW1wbGF0ZV9fdmlld19saXN0X2NvbHVtbnMiLCJnZXRUYXJnZXRBbmRQYXRoIiwibmFtZXMiLCJ0YXJnZXQiLCJwYXRoIiwiZnNQbHVyYWwiLCJyZW5kZXIiLCJlbnRpdHlJZCIsImNvbHVtbnMiLCJjb2x1bW5JbXBvcnRzIiwiZ2V0TmFtZXNGcm9tSWQiLCJib2R5IiwiY2FwaXRhbCIsImZzIiwibWFwIiwiY29sIiwibmFtZSIsImxhYmVsIiwidGMiLCJpbmNsdWRlcyIsImpvaW4iLCJ0cmltIiwiaW1wb3J0S2V5cyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsYUFBYSxRQUFnQyxpQ0FBOEI7QUFFcEYsU0FBU0MsUUFBUSxRQUFRLGlCQUFjO0FBRXZDLE9BQU8sTUFBTUMsb0NBQW9DRDtJQUMvQyxhQUFjO1FBQ1osS0FBSyxDQUFDO0lBQ1I7SUFFQUUsaUJBQWlCQyxLQUF3QixFQUFFO1FBQ3pDLE9BQU87WUFDTEMsUUFBUTtZQUNSQyxNQUFNLEdBQUdGLE1BQU1HLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDeEM7SUFDRjtJQUVBLEtBQUs7SUFDTEMsT0FBTyxFQUFFQyxRQUFRLEVBQUVDLE9BQU8sRUFBRUMsYUFBYSxFQUF3QyxFQUFFO1FBQ2pGLE1BQU1QLFFBQVFKLGNBQWNZLGNBQWMsQ0FBQ0g7UUFFM0MsT0FBTztZQUNMLEdBQUcsSUFBSSxDQUFDTixnQkFBZ0IsQ0FBQ0MsTUFBTTtZQUMvQlMsTUFBTSxDQUFDOzs7Ozs7Ozs7OztTQVdKLEVBQUVULE1BQU1VLE9BQU8sQ0FBQyw2QkFBNkIsRUFBRVYsTUFBTVcsRUFBRSxDQUFDLENBQUMsRUFBRVgsTUFBTVcsRUFBRSxDQUFDO0FBQzdFLEVBQUVKLGNBQWM7O3VDQUV1QixFQUMvQlAsTUFBTVUsT0FBTyxDQUNkLDBCQUEwQixFQUFFVixNQUFNVSxPQUFPLENBQUMsY0FBYyxFQUFFSixRQUN4RE0sR0FBRyxDQUFDLENBQUNDO2dCQUNKLE9BQU87b0JBQ0wsR0FBR0EsSUFBSUMsSUFBSSxDQUFDLFlBQVksRUFBRUQsSUFBSUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdkMsQ0FBQyxJQUFJLEVBQUVGLElBQUlHLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQ2pCLENBQUMsWUFBWSxFQUFFO3dCQUFDO3dCQUFTO3FCQUFPLENBQUNDLFFBQVEsQ0FBQ0osSUFBSUUsS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO2lCQUNwRSxDQUFDRyxJQUFJLENBQUM7WUFDVCxHQUNDQSxJQUFJLENBQUMsT0FBTzs7TUFFZixDQUFDLENBQUNDLElBQUk7WUFDTkMsWUFBWSxFQUFFO1FBQ2hCO0lBQ0Y7QUFDRiJ9
@@ -1,34 +0,0 @@
1
- import { EntityManager, type EntityNamesRecord } from "../../entity/entity-manager";
2
- import type { TemplateOptions } from "../../types/types";
3
- import { Template } from "../template";
4
-
5
- export class Template__view_enums_buttonset extends Template {
6
- constructor() {
7
- super("view_enums_buttonset");
8
- }
9
-
10
- getTargetAndPath(names: EntityNamesRecord, componentId: string) {
11
- return {
12
- target: "web/src/components",
13
- path: `${names.fs}/${componentId}ButtonSet.tsx`,
14
- };
15
- }
16
-
17
- render({ entityId, enumId }: TemplateOptions["view_enums_buttonset"]) {
18
- const names = EntityManager.getNamesFromId(entityId);
19
-
20
- return {
21
- ...this.getTargetAndPath(names, enumId),
22
- body: `
23
- /*
24
- view_enums_buttonset
25
- ${JSON.stringify({
26
- key: this.key,
27
- options: entityId,
28
- })}
29
- */
30
- `.trim(),
31
- importKeys: [],
32
- };
33
- }
34
- }
@@ -1,53 +0,0 @@
1
- import { EntityManager, type EntityNamesRecord } from "../../entity/entity-manager";
2
- import type { TemplateOptions } from "../../types/types";
3
- import { Template } from "../template";
4
-
5
- export class Template__view_list_columns extends Template {
6
- constructor() {
7
- super("view_list_columns");
8
- }
9
-
10
- getTargetAndPath(names: EntityNamesRecord) {
11
- return {
12
- target: "web/src/pages/admin",
13
- path: `${names.fsPlural}/_columns.tsx`,
14
- };
15
- }
16
-
17
- // 컬럼
18
- render({ entityId, columns, columnImports }: TemplateOptions["view_list_columns"]) {
19
- const names = EntityManager.getNamesFromId(entityId);
20
-
21
- return {
22
- ...this.getTargetAndPath(names),
23
- body: `
24
- import React from 'react';
25
- import {
26
- Segment,
27
- Table,
28
- TableRow,
29
- Button,
30
- Label,
31
- } from 'semantic-ui-react';
32
- import { DateTime } from "luxon";
33
- import { TFColumn } from "src/typeframe/iso-types";
34
- import { ${names.capital}SubsetA } from "src/services/${names.fs}/${names.fs}.generated";
35
- ${columnImports}
36
-
37
- const columns: { [key in Exclude<keyof ${
38
- names.capital
39
- }SubsetA, 'id'>]: TFColumn<${names.capital}SubsetA> } = {${columns
40
- .map((col) => {
41
- return [
42
- `${col.name}: { label: "${col.label}",`,
43
- `tc: ${col.tc}, `,
44
- `collapsing: ${["Title", "Name"].includes(col.label) === false}, }`,
45
- ].join("\n");
46
- })
47
- .join(",\n")}};
48
- export default columns;
49
- `.trim(),
50
- importKeys: [],
51
- };
52
- }
53
- }