sonamu 0.7.10 → 0.7.12
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/dist/api/config.d.ts +10 -3
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +2 -1
- package/dist/api/sonamu.d.ts +4 -0
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +36 -2
- package/dist/bin/cli.js +121 -117
- package/dist/database/base-model.d.ts +10 -50
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +19 -84
- package/dist/database/base-model.types.d.ts +4 -4
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/base-model.types.js +1 -1
- package/dist/database/db.d.ts +1 -0
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +24 -13
- package/dist/database/puri-subset.test-d.js +1 -1
- package/dist/database/puri-subset.types.d.ts +1 -0
- package/dist/database/puri-subset.types.d.ts.map +1 -1
- package/dist/database/puri-subset.types.js +2 -2
- package/dist/database/puri.d.ts +96 -1
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +214 -2
- package/dist/database/puri.types.d.ts +60 -5
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +2 -3
- package/dist/database/puri.types.test-d.js +1 -1
- package/dist/database/upsert-builder.d.ts +3 -1
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +19 -4
- package/dist/entity/entity-manager.d.ts +5 -4
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +8 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +33 -2
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +53 -22
- package/dist/naite/messaging-types.d.ts.map +1 -1
- package/dist/naite/messaging-types.js +1 -1
- package/dist/naite/naite-reporter.d.ts +7 -4
- package/dist/naite/naite-reporter.d.ts.map +1 -1
- package/dist/naite/naite-reporter.js +45 -21
- package/dist/naite/naite.js +2 -2
- package/dist/stream/sse.d.ts +2 -6
- package/dist/stream/sse.d.ts.map +1 -1
- package/dist/stream/sse.js +9 -3
- package/dist/syncer/api-parser.js +5 -1
- package/dist/syncer/file-patterns.d.ts +1 -1
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +6 -5
- package/dist/syncer/module-loader.d.ts +5 -0
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +17 -1
- package/dist/syncer/syncer.d.ts +3 -0
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +12 -2
- package/dist/tasks/decorator.d.ts +26 -0
- package/dist/tasks/decorator.d.ts.map +1 -0
- package/dist/tasks/decorator.js +28 -0
- package/dist/tasks/step-wrapper.d.ts +18 -0
- package/dist/tasks/step-wrapper.d.ts.map +1 -0
- package/dist/tasks/step-wrapper.js +38 -0
- package/dist/tasks/workflow-manager.d.ts +40 -0
- package/dist/tasks/workflow-manager.d.ts.map +1 -0
- package/dist/tasks/workflow-manager.js +193 -0
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +7 -3
- package/dist/template/implementations/model.template.js +2 -2
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +4 -2
- package/dist/types/types.d.ts +28 -11
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +18 -2
- package/dist/utils/console-util.js +2 -2
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +10 -2
- package/dist/utils/model.d.ts +9 -2
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +16 -1
- package/dist/utils/type-utils.d.ts.map +1 -1
- package/dist/utils/type-utils.js +3 -1
- package/dist/vector/embedding.d.ts +2 -5
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +3 -7
- package/dist/vector/types.d.ts.map +1 -1
- package/dist/vector/types.js +1 -1
- package/package.json +4 -2
- package/src/api/config.ts +15 -8
- package/src/api/sonamu.ts +43 -2
- package/src/bin/cli.ts +58 -54
- package/src/database/base-model.ts +21 -128
- package/src/database/base-model.types.ts +3 -4
- package/src/database/db.ts +28 -18
- package/src/database/puri-subset.test-d.ts +1 -0
- package/src/database/puri-subset.types.ts +2 -0
- package/src/database/puri.ts +292 -1
- package/src/database/puri.types.test-d.ts +1 -1
- package/src/database/puri.types.ts +81 -7
- package/src/database/upsert-builder.ts +27 -9
- package/src/entity/entity-manager.ts +9 -0
- package/src/index.ts +1 -1
- package/src/migration/code-generation.ts +40 -1
- package/src/migration/postgresql-schema-reader.ts +53 -22
- package/src/naite/messaging-types.ts +43 -44
- package/src/naite/naite-reporter.ts +51 -20
- package/src/naite/naite.ts +1 -1
- package/src/shared/app.shared.ts.txt +13 -0
- package/src/shared/web.shared.ts.txt +13 -0
- package/src/stream/sse.ts +15 -3
- package/src/syncer/api-parser.ts +4 -0
- package/src/syncer/file-patterns.ts +11 -9
- package/src/syncer/module-loader.ts +35 -0
- package/src/syncer/syncer.ts +14 -0
- package/src/tasks/decorator.ts +71 -0
- package/src/tasks/step-wrapper.ts +84 -0
- package/src/tasks/workflow-manager.ts +330 -0
- package/src/template/implementations/generated.template.ts +19 -6
- package/src/template/implementations/model.template.ts +1 -1
- package/src/template/zod-converter.ts +3 -0
- package/src/types/types.ts +23 -4
- package/src/utils/console-util.ts +1 -1
- package/src/utils/formatter.ts +8 -1
- package/src/utils/model.ts +26 -2
- package/src/utils/type-utils.ts +2 -0
- package/src/vector/embedding.ts +2 -8
- package/src/vector/types.ts +1 -2
- package/dist/vector/vector-search.d.ts +0 -47
- package/dist/vector/vector-search.d.ts.map +0 -1
- package/dist/vector/vector-search.js +0 -176
- package/src/vector/vector-search.ts +0 -261
|
@@ -3,7 +3,7 @@ import type { EmbeddingProvider, EmbeddingResult, ProgressCallback, VectorConfig
|
|
|
3
3
|
* 임베딩 클라이언트
|
|
4
4
|
* Voyage AI와 OpenAI 임베딩을 SDK 방식으로 통합 지원
|
|
5
5
|
*/
|
|
6
|
-
export declare class
|
|
6
|
+
export declare class EmbeddingClass {
|
|
7
7
|
private config;
|
|
8
8
|
constructor(config?: Partial<VectorConfig>);
|
|
9
9
|
/**
|
|
@@ -34,13 +34,10 @@ export declare class Embedding {
|
|
|
34
34
|
* OpenAI 임베딩
|
|
35
35
|
*/
|
|
36
36
|
private embedOpenAI;
|
|
37
|
-
/**
|
|
38
|
-
* 벡터를 PostgreSQL vector 타입 문자열로 변환
|
|
39
|
-
*/
|
|
40
|
-
static toVectorString(embedding: number[]): string;
|
|
41
37
|
/**
|
|
42
38
|
* 임베딩 provider의 차원 수 반환
|
|
43
39
|
*/
|
|
44
40
|
getDimensions(provider: EmbeddingProvider): number;
|
|
45
41
|
}
|
|
42
|
+
export declare const Embedding: EmbeddingClass;
|
|
46
43
|
//# sourceMappingURL=embedding.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/vector/embedding.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,qBAAa,
|
|
1
|
+
{"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/vector/embedding.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM;IAU9C;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;;OAMG;IACG,KAAK,CACT,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,GAAE,eAA4B,EACvC,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,eAAe,EAAE,CAAC;IA0B7B;;OAEG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,GAAE,eAA4B,GACtC,OAAO,CAAC,eAAe,CAAC;IAK3B;;OAEG;YACW,WAAW;IAuBzB;;OAEG;YACW,WAAW;IAiBzB;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM;CAGnD;AACD,eAAO,MAAM,SAAS,gBAAuB,CAAC"}
|
package/dist/vector/embedding.js
CHANGED
|
@@ -6,7 +6,7 @@ import { DEFAULT_VECTOR_CONFIG } from "./config.js";
|
|
|
6
6
|
/**
|
|
7
7
|
* 임베딩 클라이언트
|
|
8
8
|
* Voyage AI와 OpenAI 임베딩을 SDK 방식으로 통합 지원
|
|
9
|
-
*/ export class
|
|
9
|
+
*/ export class EmbeddingClass {
|
|
10
10
|
config;
|
|
11
11
|
constructor(config = {}){
|
|
12
12
|
this.config = {
|
|
@@ -118,15 +118,11 @@ import { DEFAULT_VECTOR_CONFIG } from "./config.js";
|
|
|
118
118
|
}));
|
|
119
119
|
}
|
|
120
120
|
/**
|
|
121
|
-
* 벡터를 PostgreSQL vector 타입 문자열로 변환
|
|
122
|
-
*/ static toVectorString(embedding) {
|
|
123
|
-
return `[${embedding.join(",")}]`;
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
121
|
* 임베딩 provider의 차원 수 반환
|
|
127
122
|
*/ getDimensions(provider) {
|
|
128
123
|
return provider === "voyage" ? this.config.voyage.dimensions : this.config.openai.dimensions;
|
|
129
124
|
}
|
|
130
125
|
}
|
|
126
|
+
export const Embedding = new EmbeddingClass();
|
|
131
127
|
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZWN0b3IvZW1iZWRkaW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZU9wZW5BSSwgdHlwZSBPcGVuQUlQcm92aWRlciB9IGZyb20gXCJAYWktc2RrL29wZW5haVwiO1xuaW1wb3J0IHsgdHlwZSBFbWJlZGRpbmdNb2RlbCwgZW1iZWRNYW55IH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyBWb3lhZ2VBSUNsaWVudCB9IGZyb20gXCJ2b3lhZ2VhaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERFRkFVTFRfVkVDVE9SX0NPTkZJRyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHR5cGUge1xuICBFbWJlZGRpbmdQcm92aWRlcixcbiAgRW1iZWRkaW5nUmVzdWx0LFxuICBQcm9ncmVzc0NhbGxiYWNrLFxuICBWZWN0b3JDb25maWcsXG4gIFZlY3RvcklucHV0VHlwZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiDsnoTrsqDrlKkg7YG065287J207Ja47Yq4XG4gKiBWb3lhZ2UgQUnsmYAgT3BlbkFJIOyehOuyoOuUqeydhCBTREsg67Cp7Iud7Jy866GcIO2Gte2VqSDsp4Dsm5BcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkZGluZyB7XG4gIHByaXZhdGUgY29uZmlnOiBWZWN0b3JDb25maWc7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQYXJ0aWFsPFZlY3RvckNvbmZpZz4gPSB7fSkge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgdm95YWdlOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy52b3lhZ2UsIC4uLmNvbmZpZy52b3lhZ2UgfSxcbiAgICAgIG9wZW5haTogeyAuLi5ERUZBVUxUX1ZFQ1RPUl9DT05GSUcub3BlbmFpLCAuLi5jb25maWcub3BlbmFpIH0sXG4gICAgICBjaHVua2luZzogeyAuLi5ERUZBVUxUX1ZFQ1RPUl9DT05GSUcuY2h1bmtpbmcsIC4uLmNvbmZpZy5jaHVua2luZyB9LFxuICAgICAgc2VhcmNoOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5zZWFyY2gsIC4uLmNvbmZpZy5zZWFyY2ggfSxcbiAgICAgIHBndmVjdG9yOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5wZ3ZlY3RvciwgLi4uY29uZmlnLnBndmVjdG9yIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWb3lhZ2UgQUkg7YG065287J207Ja47Yq4IOy0iOq4sO2ZlFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRWb3lhZ2VDbGllbnQoKTogVm95YWdlQUlDbGllbnQge1xuICAgIGNvbnN0IGFwaUtleSA9IFNvbmFtdS5zZWNyZXRzPy52b3lhZ2VfYXBpX2tleSA/PyBwcm9jZXNzLmVudi5WT1lBR0VfQVBJX0tFWTtcbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVk9ZQUdFX0FQSV9LRVnqsIAg7ISk7KCV65CY7KeAIOyViuyVmOyKteuLiOuLpC4g7ZmY6rK967OA7IiY66W8IO2ZleyduO2VmOyEuOyalC5cIik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVm95YWdlQUlDbGllbnQoeyBhcGlLZXkgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbkFJIHByb3ZpZGVyIOyDneyEsVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRPcGVuQUlQcm92aWRlcigpOiBPcGVuQUlQcm92aWRlciB7XG4gICAgY29uc3QgYXBpS2V5ID0gU29uYW11LnNlY3JldHM/Lm9wZW5haV9hcGlfa2V5ID8/IHByb2Nlc3MuZW52Lk9QRU5BSV9BUElfS0VZO1xuICAgIGlmICghYXBpS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPUEVOQUlfQVBJX0tFWeqwgCDshKTsoJXrkJjsp4Ag7JWK7JWY7Iq164uI64ukLiDtmZjqsr3rs4DsiJjrpbwg7ZmV7J247ZWY7IS47JqULlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZU9wZW5BSSh7IGFwaUtleSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthY3siqTtirgg7J6E67Kg65SpIOyDneyEsVxuICAgKiBAcGFyYW0gdGV4dHMgLSDsnoTrsqDrlKntlaAg7YWN7Iqk7Yq4IOuwsOyXtCAoYmF0Y2hTaXpl7J207IOBIOyLnCDsnpDrj5kg67aE7ZWgKVxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSAndm95YWdlJyB8ICdvcGVuYWknXG4gICAqIEBwYXJhbSBpbnB1dFR5cGUgLSAnZG9jdW1lbnQnIHwgJ3F1ZXJ5JyAoVm95YWdlIEFJ66eMIO2VtOuLuSlcbiAgICogQHBhcmFtIG9uUHJvZ3Jlc3MgLSDsp4TtlonrpaAg7L2c67CxXG4gICAqL1xuICBhc3luYyBlbWJlZChcbiAgICB0ZXh0czogc3RyaW5nW10sXG4gICAgcHJvdmlkZXI6IEVtYmVkZGluZ1Byb3ZpZGVyLFxuICAgIGlucHV0VHlwZTogVmVjdG9ySW5wdXRUeXBlID0gXCJkb2N1bWVudFwiLFxuICAgIG9uUHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrLFxuICApOiBQcm9taXNlPEVtYmVkZGluZ1Jlc3VsdFtdPiB7XG4gICAgY29uc3QgbWF4QmF0Y2hTaXplID1cbiAgICAgIHByb3ZpZGVyID09PSBcInZveWFnZVwiID8gdGhpcy5jb25maWcudm95YWdlLmJhdGNoU2l6ZSA6IHRoaXMuY29uZmlnLm9wZW5haS5iYXRjaFNpemU7XG5cbiAgICAvLyBiYXRjaFNpemXsnbTtlZjrqbQg67CU66GcIO2YuOy2nFxuICAgIGlmICh0ZXh0cy5sZW5ndGggPD0gbWF4QmF0Y2hTaXplKSB7XG4gICAgICByZXR1cm4gcHJvdmlkZXIgPT09IFwidm95YWdlXCJcbiAgICAgICAgPyBhd2FpdCB0aGlzLmVtYmVkVm95YWdlKHRleHRzLCBpbnB1dFR5cGUpXG4gICAgICAgIDogYXdhaXQgdGhpcy5lbWJlZE9wZW5BSSh0ZXh0cyk7XG4gICAgfVxuXG4gICAgLy8gYmF0Y2hTaXpl7J207IOB7J2066m0IOyekOuPmeycvOuhnCDrgpjriKDshJwg7LKY66asXG4gICAgY29uc3QgYmF0Y2hlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IE1hdGguY2VpbCh0ZXh0cy5sZW5ndGggLyBtYXhCYXRjaFNpemUpIH0sIChfLCBpKSA9PlxuICAgICAgdGV4dHMuc2xpY2UoaSAqIG1heEJhdGNoU2l6ZSwgKGkgKyAxKSAqIG1heEJhdGNoU2l6ZSksXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGJhdGNoZXMubWFwKChiYXRjaCkgPT5cbiAgICAgICAgcHJvdmlkZXIgPT09IFwidm95YWdlXCIgPyB0aGlzLmVtYmVkVm95YWdlKGJhdGNoLCBpbnB1dFR5cGUpIDogdGhpcy5lbWJlZE9wZW5BSShiYXRjaCksXG4gICAgICApLFxuICAgICk7XG5cbiAgICBvblByb2dyZXNzPy4odGV4dHMubGVuZ3RoLCB0ZXh0cy5sZW5ndGgpO1xuICAgIHJldHVybiByZXN1bHRzLmZsYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDri6jsnbwg7YWN7Iqk7Yq4IOyehOuyoOuUqSAo7Y647J2YIOuplOyEnOuTnClcbiAgICovXG4gIGFzeW5jIGVtYmVkT25lKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIsXG4gICAgaW5wdXRUeXBlOiBWZWN0b3JJbnB1dFR5cGUgPSBcImRvY3VtZW50XCIsXG4gICk6IFByb21pc2U8RW1iZWRkaW5nUmVzdWx0PiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuZW1iZWQoW3RleHRdLCBwcm92aWRlciwgaW5wdXRUeXBlKTtcbiAgICByZXR1cm4gcmVzdWx0c1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWb3lhZ2UgQUkg7J6E67Kg65SpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVtYmVkVm95YWdlKFxuICAgIHRleHRzOiBzdHJpbmdbXSxcbiAgICBpbnB1dFR5cGU6IFZlY3RvcklucHV0VHlwZSxcbiAgKTogUHJvbWlzZTxFbWJlZGRpbmdSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuZ2V0Vm95YWdlQ2xpZW50KCk7XG4gICAgY29uc3Qgdm95YWdlQ29uZmlnID0gdGhpcy5jb25maWcudm95YWdlO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZW1iZWQoe1xuICAgICAgaW5wdXQ6IHRleHRzLFxuICAgICAgbW9kZWw6IHZveWFnZUNvbmZpZy5tb2RlbCxcbiAgICAgIGlucHV0VHlwZTogaW5wdXRUeXBlLFxuICAgIH0pO1xuICAgIGlmICghcmVzcG9uc2UuZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVm95YWdlIEFQSTog7J2R64u1IOuNsOydtO2EsOqwgCDsl4bsirXri4jri6QuXCIpO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZS5kYXRhLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIGVtYmVkZGluZzogaXRlbS5lbWJlZGRpbmcgPz8gW10sXG4gICAgICBtb2RlbDogdm95YWdlQ29uZmlnLm1vZGVsLFxuICAgICAgdG9rZW5Db3VudDogcmVzcG9uc2UudXNhZ2U/LnRvdGFsVG9rZW5zID8/IDAsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5BSSDsnoTrsqDrlKlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW1iZWRPcGVuQUkodGV4dHM6IHN0cmluZ1tdKTogUHJvbWlzZTxFbWJlZGRpbmdSZXN1bHRbXT4ge1xuICAgIGNvbnN0IG9wZW5haSA9IHRoaXMuZ2V0T3BlbkFJUHJvdmlkZXIoKTtcbiAgICBjb25zdCBvcGVuYWlDb25maWcgPSB0aGlzLmNvbmZpZy5vcGVuYWk7XG4gICAgY29uc3QgbW9kZWwgPSBvcGVuYWkuZW1iZWRkaW5nTW9kZWwob3BlbmFpQ29uZmlnLm1vZGVsKTtcblxuICAgIGNvbnN0IHsgZW1iZWRkaW5ncywgdXNhZ2UgfSA9IGF3YWl0IGVtYmVkTWFueSh7XG4gICAgICBtb2RlbDogbW9kZWwgYXMgRW1iZWRkaW5nTW9kZWwsXG4gICAgICB2YWx1ZXM6IHRleHRzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVtYmVkZGluZ3MubWFwKChlbWJlZGRpbmcpID0+ICh7XG4gICAgICBlbWJlZGRpbmcsXG4gICAgICBtb2RlbDogb3BlbmFpQ29uZmlnLm1vZGVsLFxuICAgICAgdG9rZW5Db3VudDogdXNhZ2U/LnRva2VucyA/PyAwLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrsqHthLDrpbwgUG9zdGdyZVNRTCB2ZWN0b3Ig7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZhcbiAgICovXG4gIHN0YXRpYyB0b1ZlY3RvclN0cmluZyhlbWJlZGRpbmc6IG51bWJlcltdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske2VtYmVkZGluZy5qb2luKFwiLFwiKX1dYDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsnoTrsqDrlKkgcHJvdmlkZXLsnZgg7LCo7JuQIOyImCDrsJjtmZhcbiAgICovXG4gIGdldERpbWVuc2lvbnMocHJvdmlkZXI6IEVtYmVkZGluZ1Byb3ZpZGVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcHJvdmlkZXIgPT09IFwidm95YWdlXCIgPyB0aGlzLmNvbmZpZy52b3lhZ2UuZGltZW5zaW9ucyA6IHRoaXMuY29uZmlnLm9wZW5haS5kaW1lbnNpb25zO1xuICB9XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlT3BlbkFJIiwiZW1iZWRNYW55IiwiVm95YWdlQUlDbGllbnQiLCJTb25hbXUiLCJERUZBVUxUX1ZFQ1RPUl9DT05GSUciLCJFbWJlZGRpbmciLCJjb25maWciLCJ2b3lhZ2UiLCJvcGVuYWkiLCJjaHVua2luZyIsInNlYXJjaCIsInBndmVjdG9yIiwiZ2V0Vm95YWdlQ2xpZW50IiwiYXBpS2V5Iiwic2VjcmV0cyIsInZveWFnZV9hcGlfa2V5IiwicHJvY2VzcyIsImVudiIsIlZPWUFHRV9BUElfS0VZIiwiRXJyb3IiLCJnZXRPcGVuQUlQcm92aWRlciIsIm9wZW5haV9hcGlfa2V5IiwiT1BFTkFJX0FQSV9LRVkiLCJlbWJlZCIsInRleHRzIiwicHJvdmlkZXIiLCJpbnB1dFR5cGUiLCJvblByb2dyZXNzIiwibWF4QmF0Y2hTaXplIiwiYmF0Y2hTaXplIiwibGVuZ3RoIiwiZW1iZWRWb3lhZ2UiLCJlbWJlZE9wZW5BSSIsImJhdGNoZXMiLCJBcnJheSIsImZyb20iLCJNYXRoIiwiY2VpbCIsIl8iLCJpIiwic2xpY2UiLCJyZXN1bHRzIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsImJhdGNoIiwiZmxhdCIsImVtYmVkT25lIiwidGV4dCIsImNsaWVudCIsInZveWFnZUNvbmZpZyIsInJlc3BvbnNlIiwiaW5wdXQiLCJtb2RlbCIsImRhdGEiLCJpdGVtIiwiZW1iZWRkaW5nIiwidG9rZW5Db3VudCIsInVzYWdlIiwidG90YWxUb2tlbnMiLCJvcGVuYWlDb25maWciLCJlbWJlZGRpbmdNb2RlbCIsImVtYmVkZGluZ3MiLCJ2YWx1ZXMiLCJ0b2tlbnMiLCJ0b1ZlY3RvclN0cmluZyIsImpvaW4iLCJnZXREaW1lbnNpb25zIiwiZGltZW5zaW9ucyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsWUFBWSxRQUE2QixpQkFBaUI7QUFDbkUsU0FBOEJDLFNBQVMsUUFBUSxLQUFLO0FBQ3BELFNBQVNDLGNBQWMsUUFBUSxXQUFXO0FBQzFDLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MscUJBQXFCLFFBQVEsY0FBVztBQVNqRDs7O0NBR0MsR0FDRCxPQUFPLE1BQU1DO0lBQ0hDLE9BQXFCO0lBRTdCLFlBQVlBLFNBQWdDLENBQUMsQ0FBQyxDQUFFO1FBQzlDLElBQUksQ0FBQ0EsTUFBTSxHQUFHO1lBQ1pDLFFBQVE7Z0JBQUUsR0FBR0gsc0JBQXNCRyxNQUFNO2dCQUFFLEdBQUdELE9BQU9DLE1BQU07WUFBQztZQUM1REMsUUFBUTtnQkFBRSxHQUFHSixzQkFBc0JJLE1BQU07Z0JBQUUsR0FBR0YsT0FBT0UsTUFBTTtZQUFDO1lBQzVEQyxVQUFVO2dCQUFFLEdBQUdMLHNCQUFzQkssUUFB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
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZWN0b3IvZW1iZWRkaW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZU9wZW5BSSwgdHlwZSBPcGVuQUlQcm92aWRlciB9IGZyb20gXCJAYWktc2RrL29wZW5haVwiO1xuaW1wb3J0IHsgdHlwZSBFbWJlZGRpbmdNb2RlbCwgZW1iZWRNYW55IH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyBWb3lhZ2VBSUNsaWVudCB9IGZyb20gXCJ2b3lhZ2VhaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERFRkFVTFRfVkVDVE9SX0NPTkZJRyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHR5cGUge1xuICBFbWJlZGRpbmdQcm92aWRlcixcbiAgRW1iZWRkaW5nUmVzdWx0LFxuICBQcm9ncmVzc0NhbGxiYWNrLFxuICBWZWN0b3JDb25maWcsXG4gIFZlY3RvcklucHV0VHlwZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiDsnoTrsqDrlKkg7YG065287J207Ja47Yq4XG4gKiBWb3lhZ2UgQUnsmYAgT3BlbkFJIOyehOuyoOuUqeydhCBTREsg67Cp7Iud7Jy866GcIO2Gte2VqSDsp4Dsm5BcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkZGluZ0NsYXNzIHtcbiAgcHJpdmF0ZSBjb25maWc6IFZlY3RvckNvbmZpZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFBhcnRpYWw8VmVjdG9yQ29uZmlnPiA9IHt9KSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICB2b3lhZ2U6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnZveWFnZSwgLi4uY29uZmlnLnZveWFnZSB9LFxuICAgICAgb3BlbmFpOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5vcGVuYWksIC4uLmNvbmZpZy5vcGVuYWkgfSxcbiAgICAgIGNodW5raW5nOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5jaHVua2luZywgLi4uY29uZmlnLmNodW5raW5nIH0sXG4gICAgICBzZWFyY2g6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnNlYXJjaCwgLi4uY29uZmlnLnNlYXJjaCB9LFxuICAgICAgcGd2ZWN0b3I6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnBndmVjdG9yLCAuLi5jb25maWcucGd2ZWN0b3IgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZveWFnZSBBSSDtgbTrnbzsnbTslrjtirgg7LSI6riw7ZmUXG4gICAqL1xuICBwcml2YXRlIGdldFZveWFnZUNsaWVudCgpOiBWb3lhZ2VBSUNsaWVudCB7XG4gICAgY29uc3QgYXBpS2V5ID0gU29uYW11LnNlY3JldHM/LnZveWFnZV9hcGlfa2V5ID8/IHByb2Nlc3MuZW52LlZPWUFHRV9BUElfS0VZO1xuICAgIGlmICghYXBpS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWT1lBR0VfQVBJX0tFWeqwgCDshKTsoJXrkJjsp4Ag7JWK7JWY7Iq164uI64ukLiDtmZjqsr3rs4DsiJjrpbwg7ZmV7J247ZWY7IS47JqULlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBWb3lhZ2VBSUNsaWVudCh7IGFwaUtleSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuQUkgcHJvdmlkZXIg7IOd7ISxXG4gICAqL1xuICBwcml2YXRlIGdldE9wZW5BSVByb3ZpZGVyKCk6IE9wZW5BSVByb3ZpZGVyIHtcbiAgICBjb25zdCBhcGlLZXkgPSBTb25hbXUuc2VjcmV0cz8ub3BlbmFpX2FwaV9rZXkgPz8gcHJvY2Vzcy5lbnYuT1BFTkFJX0FQSV9LRVk7XG4gICAgaWYgKCFhcGlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk9QRU5BSV9BUElfS0VZ6rCAIOyEpOygleuQmOyngCDslYrslZjsirXri4jri6QuIO2ZmOqyveuzgOyImOulvCDtmZXsnbjtlZjshLjsmpQuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlT3BlbkFJKHsgYXBpS2V5IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIO2FjeyKpO2KuCDsnoTrsqDrlKkg7IOd7ISxXG4gICAqIEBwYXJhbSB0ZXh0cyAtIOyehOuyoOuUqe2VoCDthY3siqTtirgg67Cw7Je0IChiYXRjaFNpemXsnbTsg4Eg7IucIOyekOuPmSDrtoTtlaApXG4gICAqIEBwYXJhbSBwcm92aWRlciAtICd2b3lhZ2UnIHwgJ29wZW5haSdcbiAgICogQHBhcmFtIGlucHV0VHlwZSAtICdkb2N1bWVudCcgfCAncXVlcnknIChWb3lhZ2UgQUnrp4wg7ZW064u5KVxuICAgKiBAcGFyYW0gb25Qcm9ncmVzcyAtIOynhO2WieuloCDsvZzrsLFcbiAgICovXG4gIGFzeW5jIGVtYmVkKFxuICAgIHRleHRzOiBzdHJpbmdbXSxcbiAgICBwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIsXG4gICAgaW5wdXRUeXBlOiBWZWN0b3JJbnB1dFR5cGUgPSBcImRvY3VtZW50XCIsXG4gICAgb25Qcm9ncmVzcz86IFByb2dyZXNzQ2FsbGJhY2ssXG4gICk6IFByb21pc2U8RW1iZWRkaW5nUmVzdWx0W10+IHtcbiAgICBjb25zdCBtYXhCYXRjaFNpemUgPVxuICAgICAgcHJvdmlkZXIgPT09IFwidm95YWdlXCIgPyB0aGlzLmNvbmZpZy52b3lhZ2UuYmF0Y2hTaXplIDogdGhpcy5jb25maWcub3BlbmFpLmJhdGNoU2l6ZTtcblxuICAgIC8vIGJhdGNoU2l6ZeydtO2VmOuptCDrsJTroZwg7Zi47LacXG4gICAgaWYgKHRleHRzLmxlbmd0aCA8PSBtYXhCYXRjaFNpemUpIHtcbiAgICAgIHJldHVybiBwcm92aWRlciA9PT0gXCJ2b3lhZ2VcIlxuICAgICAgICA/IGF3YWl0IHRoaXMuZW1iZWRWb3lhZ2UodGV4dHMsIGlucHV0VHlwZSlcbiAgICAgICAgOiBhd2FpdCB0aGlzLmVtYmVkT3BlbkFJKHRleHRzKTtcbiAgICB9XG5cbiAgICAvLyBiYXRjaFNpemXsnbTsg4HsnbTrqbQg7J6Q64+Z7Jy866GcIOuCmOuIoOyEnCDsspjrpqxcbiAgICBjb25zdCBiYXRjaGVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogTWF0aC5jZWlsKHRleHRzLmxlbmd0aCAvIG1heEJhdGNoU2l6ZSkgfSwgKF8sIGkpID0+XG4gICAgICB0ZXh0cy5zbGljZShpICogbWF4QmF0Y2hTaXplLCAoaSArIDEpICogbWF4QmF0Y2hTaXplKSxcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYmF0Y2hlcy5tYXAoKGJhdGNoKSA9PlxuICAgICAgICBwcm92aWRlciA9PT0gXCJ2b3lhZ2VcIiA/IHRoaXMuZW1iZWRWb3lhZ2UoYmF0Y2gsIGlucHV0VHlwZSkgOiB0aGlzLmVtYmVkT3BlbkFJKGJhdGNoKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIG9uUHJvZ3Jlc3M/Lih0ZXh0cy5sZW5ndGgsIHRleHRzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHJlc3VsdHMuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOuLqOydvCDthY3siqTtirgg7J6E67Kg65SpICjtjrjsnZgg66mU7ISc65OcKVxuICAgKi9cbiAgYXN5bmMgZW1iZWRPbmUoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHByb3ZpZGVyOiBFbWJlZGRpbmdQcm92aWRlcixcbiAgICBpbnB1dFR5cGU6IFZlY3RvcklucHV0VHlwZSA9IFwiZG9jdW1lbnRcIixcbiAgKTogUHJvbWlzZTxFbWJlZGRpbmdSZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5lbWJlZChbdGV4dF0sIHByb3ZpZGVyLCBpbnB1dFR5cGUpO1xuICAgIHJldHVybiByZXN1bHRzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFZveWFnZSBBSSDsnoTrsqDrlKlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW1iZWRWb3lhZ2UoXG4gICAgdGV4dHM6IHN0cmluZ1tdLFxuICAgIGlucHV0VHlwZTogVmVjdG9ySW5wdXRUeXBlLFxuICApOiBQcm9taXNlPEVtYmVkZGluZ1Jlc3VsdFtdPiB7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy5nZXRWb3lhZ2VDbGllbnQoKTtcbiAgICBjb25zdCB2b3lhZ2VDb25maWcgPSB0aGlzLmNvbmZpZy52b3lhZ2U7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5lbWJlZCh7XG4gICAgICBpbnB1dDogdGV4dHMsXG4gICAgICBtb2RlbDogdm95YWdlQ29uZmlnLm1vZGVsLFxuICAgICAgaW5wdXRUeXBlOiBpbnB1dFR5cGUsXG4gICAgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5kYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWb3lhZ2UgQVBJOiDsnZHri7Ug642w7J207YSw6rCAIOyXhuyKteuLiOuLpC5cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEubWFwKChpdGVtKSA9PiAoe1xuICAgICAgZW1iZWRkaW5nOiBpdGVtLmVtYmVkZGluZyA/PyBbXSxcbiAgICAgIG1vZGVsOiB2b3lhZ2VDb25maWcubW9kZWwsXG4gICAgICB0b2tlbkNvdW50OiByZXNwb25zZS51c2FnZT8udG90YWxUb2tlbnMgPz8gMCxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbkFJIOyehOuyoOuUqVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbWJlZE9wZW5BSSh0ZXh0czogc3RyaW5nW10pOiBQcm9taXNlPEVtYmVkZGluZ1Jlc3VsdFtdPiB7XG4gICAgY29uc3Qgb3BlbmFpID0gdGhpcy5nZXRPcGVuQUlQcm92aWRlcigpO1xuICAgIGNvbnN0IG9wZW5haUNvbmZpZyA9IHRoaXMuY29uZmlnLm9wZW5haTtcbiAgICBjb25zdCBtb2RlbCA9IG9wZW5haS5lbWJlZGRpbmdNb2RlbChvcGVuYWlDb25maWcubW9kZWwpO1xuXG4gICAgY29uc3QgeyBlbWJlZGRpbmdzLCB1c2FnZSB9ID0gYXdhaXQgZW1iZWRNYW55KHtcbiAgICAgIG1vZGVsOiBtb2RlbCBhcyBFbWJlZGRpbmdNb2RlbCxcbiAgICAgIHZhbHVlczogdGV4dHMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW1iZWRkaW5ncy5tYXAoKGVtYmVkZGluZykgPT4gKHtcbiAgICAgIGVtYmVkZGluZyxcbiAgICAgIG1vZGVsOiBvcGVuYWlDb25maWcubW9kZWwsXG4gICAgICB0b2tlbkNvdW50OiB1c2FnZT8udG9rZW5zID8/IDAsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyehOuyoOuUqSBwcm92aWRlcuydmCDssKjsm5Ag7IiYIOuwmO2ZmFxuICAgKi9cbiAgZ2V0RGltZW5zaW9ucyhwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBwcm92aWRlciA9PT0gXCJ2b3lhZ2VcIiA/IHRoaXMuY29uZmlnLnZveWFnZS5kaW1lbnNpb25zIDogdGhpcy5jb25maWcub3BlbmFpLmRpbWVuc2lvbnM7XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBFbWJlZGRpbmcgPSBuZXcgRW1iZWRkaW5nQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJjcmVhdGVPcGVuQUkiLCJlbWJlZE1hbnkiLCJWb3lhZ2VBSUNsaWVudCIsIlNvbmFtdSIsIkRFRkFVTFRfVkVDVE9SX0NPTkZJRyIsIkVtYmVkZGluZ0NsYXNzIiwiY29uZmlnIiwidm95YWdlIiwib3BlbmFpIiwiY2h1bmtpbmciLCJzZWFyY2giLCJwZ3ZlY3RvciIsImdldFZveWFnZUNsaWVudCIsImFwaUtleSIsInNlY3JldHMiLCJ2b3lhZ2VfYXBpX2tleSIsInByb2Nlc3MiLCJlbnYiLCJWT1lBR0VfQVBJX0tFWSIsIkVycm9yIiwiZ2V0T3BlbkFJUHJvdmlkZXIiLCJvcGVuYWlfYXBpX2tleSIsIk9QRU5BSV9BUElfS0VZIiwiZW1iZWQiLCJ0ZXh0cyIsInByb3ZpZGVyIiwiaW5wdXRUeXBlIiwib25Qcm9ncmVzcyIsIm1heEJhdGNoU2l6ZSIsImJhdGNoU2l6ZSIsImxlbmd0aCIsImVtYmVkVm95YWdlIiwiZW1iZWRPcGVuQUkiLCJiYXRjaGVzIiwiQXJyYXkiLCJmcm9tIiwiTWF0aCIsImNlaWwiLCJfIiwiaSIsInNsaWNlIiwicmVzdWx0cyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJiYXRjaCIsImZsYXQiLCJlbWJlZE9uZSIsInRleHQiLCJjbGllbnQiLCJ2b3lhZ2VDb25maWciLCJyZXNwb25zZSIsImlucHV0IiwibW9kZWwiLCJkYXRhIiwiaXRlbSIsImVtYmVkZGluZyIsInRva2VuQ291bnQiLCJ1c2FnZSIsInRvdGFsVG9rZW5zIiwib3BlbmFpQ29uZmlnIiwiZW1iZWRkaW5nTW9kZWwiLCJlbWJlZGRpbmdzIiwidmFsdWVzIiwidG9rZW5zIiwiZ2V0RGltZW5zaW9ucyIsImRpbWVuc2lvbnMiLCJFbWJlZGRpbmciXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFlBQVksUUFBNkIsaUJBQWlCO0FBQ25FLFNBQThCQyxTQUFTLFFBQVEsS0FBSztBQUNwRCxTQUFTQyxjQUFjLFFBQVEsV0FBVztBQUMxQyxTQUFTQyxNQUFNLFFBQVEsbUJBQWdCO0FBQ3ZDLFNBQVNDLHFCQUFxQixRQUFRLGNBQVc7QUFTakQ7OztDQUdDLEdBQ0QsT0FBTyxNQUFNQztJQUNIQyxPQUFxQjtJQUU3QixZQUFZQSxTQUFnQyxDQUFDLENBQUMsQ0FBRTtRQUM5QyxJQUFJLENBQUNBLE1BQU0sR0FBRztZQUNaQyxRQUFRO2dCQUFFLEdBQUdILHNCQUFzQkcsTUFBTTtnQkFBRSxHQUFHRCxPQUFPQyxNQUFNO1lBQUM7WUFDNURDLFFBQVE7Z0JBQUUsR0FBR0osc0JBQXNCSSxNQUFNO2dCQUFFLEdBQUdGLE9BQU9FLE1BQU07WUFBQztZQUM1REMsVUFBVTtnQkFBRSxHQUFHTCxzQkFBc0JLLFFBQVE7Z0JBQUUsR0FBR0gsT0FBT0csUUFBUTtZQUFDO1lBQ2xFQyxRQUFRO2dCQUFFLEdBQUdOLHNCQUFzQk0sTUFBTTtnQkFBRSxHQUFHSixPQUFPSSxNQUFNO1lBQUM7WUFDNURDLFVBQVU7Z0JBQUUsR0FBR1Asc0JBQXNCTyxRQUFRO2dC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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/vector/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc;AACd,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEpD,qCAAqC;AACrC,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,CAAC;AAEnD,aAAa;AACb,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,YAAY;AACZ,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAe;AACf,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7D,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,CAAC;CACT;AAED,iCAAiC;AACjC,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/vector/types.ts"],"names":[],"mappings":"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"}
|
package/dist/vector/types.js
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
* pgvector 통합을 위한 타입 정의
|
|
3
3
|
*/ /** 임베딩 제공자 */ /** 진행률 콜백 */ export { };
|
|
4
4
|
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZWN0b3IvdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwZ3ZlY3RvciDthrXtlansnYQg7JyE7ZWcIO2DgOyehSDsoJXsnZhcbiAqL1xuXG4vKiog7J6E67Kg65SpIOygnOqzteyekCAqL1xuZXhwb3J0IHR5cGUgRW1iZWRkaW5nUHJvdmlkZXIgPSBcInZveWFnZVwiIHwgXCJvcGVuYWlcIjtcblxuLyoqIOyeheugpSDtg4DsnoUgKFZveWFnZSBBSSDsoITsmqkgLSDruYTrjIDsua0g7J6E67Kg65SpKSAqL1xuZXhwb3J0IHR5cGUgVmVjdG9ySW5wdXRUeXBlID0gXCJkb2N1bWVudFwiIHwgXCJxdWVyeVwiO1xuXG4vKiog7J6E67Kg65SpIOqysOqzvCAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmdSZXN1bHQge1xuICBlbWJlZGRpbmc6IG51bWJlcltdO1xuICBtb2RlbDogc3RyaW5nO1xuICB0b2tlbkNvdW50OiBudW1iZXI7XG59XG5cbi8qKiDssq3tgawg7KCV67O0ICovXG5leHBvcnQgaW50ZXJmYWNlIENodW5rIHtcbiAgaW5kZXg6IG51bWJlcjtcbiAgdGV4dDogc3RyaW5nO1xuICBzdGFydE9mZnNldDogbnVtYmVyO1xuICBlbmRPZmZzZXQ6IG51bWJlcjtcbn1cblxuLyoqIOuyoe2EsCDqsoDsg4kg6rKw6rO8ICovXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvclNlYXJjaFJlc3VsdDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZWN0b3IvdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwZ3ZlY3RvciDthrXtlansnYQg7JyE7ZWcIO2DgOyehSDsoJXsnZhcbiAqL1xuXG4vKiog7J6E67Kg65SpIOygnOqzteyekCAqL1xuZXhwb3J0IHR5cGUgRW1iZWRkaW5nUHJvdmlkZXIgPSBcInZveWFnZVwiIHwgXCJvcGVuYWlcIjtcblxuLyoqIOyeheugpSDtg4DsnoUgKFZveWFnZSBBSSDsoITsmqkgLSDruYTrjIDsua0g7J6E67Kg65SpKSAqL1xuZXhwb3J0IHR5cGUgVmVjdG9ySW5wdXRUeXBlID0gXCJkb2N1bWVudFwiIHwgXCJxdWVyeVwiO1xuXG4vKiog7J6E67Kg65SpIOqysOqzvCAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmdSZXN1bHQge1xuICBlbWJlZGRpbmc6IG51bWJlcltdO1xuICBtb2RlbDogc3RyaW5nO1xuICB0b2tlbkNvdW50OiBudW1iZXI7XG59XG5cbi8qKiDssq3tgawg7KCV67O0ICovXG5leHBvcnQgaW50ZXJmYWNlIENodW5rIHtcbiAgaW5kZXg6IG51bWJlcjtcbiAgdGV4dDogc3RyaW5nO1xuICBzdGFydE9mZnNldDogbnVtYmVyO1xuICBlbmRPZmZzZXQ6IG51bWJlcjtcbn1cblxuLyoqIOuyoe2EsCDqsoDsg4kg6rKw6rO8ICovXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvclNlYXJjaFJlc3VsdDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgc2ltaWxhcml0eTogbnVtYmVyO1xuICBkYXRhOiBUO1xufVxuXG4vKiog7ZWY7J2067iM66as65OcIOqygOyDiSDqsrDqs7wgKFZlY3RvciArIEZUUykgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHlicmlkU2VhcmNoUmVzdWx0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gZXh0ZW5kcyBWZWN0b3JTZWFyY2hSZXN1bHQ8VD4ge1xuICB2ZWN0b3JTY29yZT86IG51bWJlcjtcbiAgZnRzU2NvcmU/OiBudW1iZXI7XG59XG5cbi8qKiDrsqTsuZjrp4jtgawg6rKw6rO8ICovXG5leHBvcnQgaW50ZXJmYWNlIEJlbmNobWFya1Jlc3VsdCB7XG4gIHByb3ZpZGVyOiBFbWJlZGRpbmdQcm92aWRlcjtcbiAgZW1iZWRUaW1lOiBudW1iZXI7XG4gIHNlYXJjaFRpbWU6IG51bWJlcjtcbiAgcmVzdWx0czogVmVjdG9yU2VhcmNoUmVzdWx0W107XG59XG5cbi8qKiBWb3lhZ2UgQUkg7ISk7KCVICovXG5leHBvcnQgaW50ZXJmYWNlIFZveWFnZUNvbmZpZyB7XG4gIGFwaUtleTogc3RyaW5nO1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIGRpbWVuc2lvbnM6IG51bWJlcjtcbiAgbWF4VG9rZW5zOiBudW1iZXI7XG4gIGJhdGNoU2l6ZTogbnVtYmVyO1xufVxuXG4vKiogT3BlbkFJIOyEpOyglSAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlDb25maWcge1xuICBhcGlLZXk6IHN0cmluZztcbiAgYmFzZVVybDogc3RyaW5nO1xuICBtb2RlbDogc3RyaW5nO1xuICBkaW1lbnNpb25zOiBudW1iZXI7XG4gIG1heFRva2VuczogbnVtYmVyO1xuICBiYXRjaFNpemU6IG51bWJlcjtcbn1cblxuLyoqIOyyre2CuSDshKTsoJUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2h1bmtpbmdDb25maWcge1xuICBjaHVua1NpemU6IG51bWJlcjtcbiAgY2h1bmtPdmVybGFwOiBudW1iZXI7XG4gIG1pbkNodW5rU2l6ZTogbnVtYmVyO1xuICBza2lwVGhyZXNob2xkOiBudW1iZXI7XG4gIHNlcGFyYXRvcnM6IHN0cmluZ1tdO1xufVxuXG4vKiog6rKA7IOJIOyEpOyglSAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hDb25maWcge1xuICBkZWZhdWx0TGltaXQ6IG51bWJlcjtcbiAgc2ltaWxhcml0eVRocmVzaG9sZDogbnVtYmVyO1xuICB2ZWN0b3JXZWlnaHQ6IG51bWJlcjtcbiAgZnRzV2VpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBwZ3ZlY3RvciDshKTsoJUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGd2ZWN0b3JDb25maWcge1xuICBpdGVyYXRpdmVTY2FuOiBib29sZWFuO1xuICBlZlNlYXJjaDogbnVtYmVyO1xufVxuXG4vKiog7KCE7LK0IOuyoe2EsCDshKTsoJUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yQ29uZmlnIHtcbiAgdm95YWdlOiBWb3lhZ2VDb25maWc7XG4gIG9wZW5haTogT3BlbkFJQ29uZmlnO1xuICBjaHVua2luZzogQ2h1bmtpbmdDb25maWc7XG4gIHNlYXJjaDogU2VhcmNoQ29uZmlnO1xuICBwZ3ZlY3RvcjogUGd2ZWN0b3JDb25maWc7XG59XG5cbi8qKiDrsqHthLAg6rKA7IOJIOyYteyFmCAqL1xuZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTZWFyY2hPcHRpb25zIHtcbiAgZW1iZWRkaW5nQ29sdW1uPzogc3RyaW5nO1xuICBsaW1pdD86IG51bWJlcjtcbiAgdGhyZXNob2xkPzogbnVtYmVyO1xuICB3aGVyZT86IHN0cmluZztcbn1cblxuLyoqIO2VmOydtOu4jOumrOuTnCDqsoDsg4kg7Ji17IWYICovXG5leHBvcnQgaW50ZXJmYWNlIEh5YnJpZFNlYXJjaE9wdGlvbnMgZXh0ZW5kcyBWZWN0b3JTZWFyY2hPcHRpb25zIHtcbiAgdmVjdG9yV2VpZ2h0PzogbnVtYmVyO1xuICBmdHNXZWlnaHQ/OiBudW1iZXI7XG4gIGZ0c0NvbHVtbj86IHN0cmluZztcbn1cblxuLyoqIOyehOuyoOuUqSDsoIDsnqUg7ZWt66qpICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGluZ0l0ZW0ge1xuICBpZDogbnVtYmVyO1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKiDsp4TtlonrpaAg7L2c67CxICovXG5leHBvcnQgdHlwZSBQcm9ncmVzc0NhbGxiYWNrID0gKHByb2Nlc3NlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSA9PiB2b2lkO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztDQUVDLEdBRUQsWUFBWSxHQW1IWixXQUFXLEdBQ1gsV0FBMEUifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sonamu",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.12",
|
|
4
4
|
"description": "Sonamu — TypeScript Fullstack API Framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -76,8 +76,10 @@
|
|
|
76
76
|
"tsicli": "^1.0.5",
|
|
77
77
|
"vitest": "^4.0.10",
|
|
78
78
|
"zod": "^4.1.12",
|
|
79
|
-
"
|
|
79
|
+
"node-cron": "^4.2.1",
|
|
80
80
|
"@sonamu-kit/hmr-hook": "^0.4.1",
|
|
81
|
+
"@sonamu-kit/ts-loader": "^2.1.3",
|
|
82
|
+
"@sonamu-kit/tasks": "^0.0.1",
|
|
81
83
|
"@sonamu-kit/hmr-runner": "^0.1.1"
|
|
82
84
|
},
|
|
83
85
|
"devDependencies": {
|
package/src/api/config.ts
CHANGED
|
@@ -9,7 +9,9 @@ import type { QsPluginOptions } from "fastify-qs";
|
|
|
9
9
|
import type { SsePluginOptions } from "fastify-sse-v2/lib/types";
|
|
10
10
|
import type { Knex } from "knex";
|
|
11
11
|
import type { Driver } from "../file-storage/driver";
|
|
12
|
-
import type {
|
|
12
|
+
import type { WorkflowOptions } from "../tasks/workflow-manager";
|
|
13
|
+
import type { Executable, SonamuFastifyConfig } from "../types/types";
|
|
14
|
+
import type { AuthContext, Context } from "./context";
|
|
13
15
|
|
|
14
16
|
export type DatabaseConfig = Omit<Knex.Config, "connection"> & {
|
|
15
17
|
connection?: Knex.PgConnectionConfig;
|
|
@@ -50,6 +52,7 @@ export type SonamuConfig = {
|
|
|
50
52
|
};
|
|
51
53
|
|
|
52
54
|
server: SonamuServerOptions;
|
|
55
|
+
tasks?: SonamuTaskOptions;
|
|
53
56
|
};
|
|
54
57
|
|
|
55
58
|
export type SonamuServerOptions = {
|
|
@@ -90,14 +93,18 @@ export type SonamuServerOptions = {
|
|
|
90
93
|
};
|
|
91
94
|
};
|
|
92
95
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
96
|
+
export type SonamuTaskOptions = {
|
|
97
|
+
// worker를 사용할지 여부, 기본적으로 daemon 모드에서만 사용됨.
|
|
98
|
+
enableWorker?: boolean;
|
|
99
|
+
workerOptions?: WorkflowOptions;
|
|
100
|
+
contextProvider: (
|
|
101
|
+
defaultContext: Pick<Context, "reply" | "request" | "headers" | "createSSE" | "naiteStore"> &
|
|
102
|
+
AuthContext,
|
|
103
|
+
) => Context | Promise<Context>;
|
|
104
|
+
};
|
|
99
105
|
|
|
100
|
-
|
|
106
|
+
// NOTE(Haze, 251209): config에는 T, Promise<T>, () => T, () => Promise<T>가 모두 올 수 있어야 함.
|
|
107
|
+
export function defineConfig(config: Executable<SonamuConfig>): Promise<SonamuConfig> {
|
|
101
108
|
if (typeof config === "function") {
|
|
102
109
|
return Promise.resolve(config());
|
|
103
110
|
}
|
package/src/api/sonamu.ts
CHANGED
|
@@ -3,15 +3,18 @@ import { AsyncLocalStorage } from "async_hooks";
|
|
|
3
3
|
import type { FSWatcher } from "chokidar";
|
|
4
4
|
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
|
|
5
5
|
import type { IncomingMessage, Server, ServerResponse } from "http";
|
|
6
|
+
import os from "os";
|
|
6
7
|
import path from "path";
|
|
7
8
|
import type { ZodObject } from "zod";
|
|
9
|
+
import { createMockSSEFactory, DB, isDaemonServer } from "..";
|
|
8
10
|
import type { SonamuDBConfig } from "../database/db";
|
|
9
11
|
import type { Driver } from "../file-storage/driver";
|
|
10
12
|
import { Naite } from "../naite/naite";
|
|
11
13
|
import type { Syncer } from "../syncer/syncer";
|
|
14
|
+
import type { WorkflowManager } from "../tasks/workflow-manager";
|
|
12
15
|
import type { SonamuFastifyConfig } from "../types/types";
|
|
13
16
|
import type { AbsolutePath } from "../utils/path-utils";
|
|
14
|
-
import type { SonamuConfig, SonamuServerOptions } from "./config";
|
|
17
|
+
import type { SonamuConfig, SonamuServerOptions, SonamuTaskOptions } from "./config";
|
|
15
18
|
import type { AuthContext, Context, UploadContext } from "./context";
|
|
16
19
|
import type { ExtendedApi } from "./decorators";
|
|
17
20
|
|
|
@@ -42,7 +45,7 @@ class SonamuClass {
|
|
|
42
45
|
request: null,
|
|
43
46
|
reply: null,
|
|
44
47
|
headers: {},
|
|
45
|
-
createSSE: () =>
|
|
48
|
+
createSSE: (schema: ZodObject) => createMockSSEFactory(schema),
|
|
46
49
|
// biome-ignore lint/suspicious/noExplicitAny: 테스팅 환경에서 컨텍스트가 주입되지 않은 경우 빈 컨텍스트 리턴
|
|
47
50
|
naiteStore: new Map<string, any>(),
|
|
48
51
|
} as unknown as Context;
|
|
@@ -122,6 +125,15 @@ class SonamuClass {
|
|
|
122
125
|
return this._storage;
|
|
123
126
|
}
|
|
124
127
|
|
|
128
|
+
private _workflows: WorkflowManager | null = null;
|
|
129
|
+
get workflows(): WorkflowManager {
|
|
130
|
+
if (this._workflows === null) {
|
|
131
|
+
throw new Error("Sonamu has not been initialized");
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return this._workflows;
|
|
135
|
+
}
|
|
136
|
+
|
|
125
137
|
// HMR 처리
|
|
126
138
|
public watcher: FSWatcher | null = null;
|
|
127
139
|
private pendingFiles: string[] = [];
|
|
@@ -192,6 +204,9 @@ class SonamuClass {
|
|
|
192
204
|
return;
|
|
193
205
|
}
|
|
194
206
|
|
|
207
|
+
// Task 등록
|
|
208
|
+
await this.initializeWorkflows(this.config.tasks);
|
|
209
|
+
|
|
195
210
|
// Syncer
|
|
196
211
|
const { Syncer } = await import("../syncer/syncer");
|
|
197
212
|
this.syncer = new Syncer();
|
|
@@ -200,6 +215,7 @@ class SonamuClass {
|
|
|
200
215
|
await this.syncer.autoloadTypes();
|
|
201
216
|
await this.syncer.autoloadModels();
|
|
202
217
|
await this.syncer.autoloadApis();
|
|
218
|
+
await this.syncer.autoloadWorkflows();
|
|
203
219
|
|
|
204
220
|
const { TemplateManager } = await import("../template");
|
|
205
221
|
await TemplateManager.autoload();
|
|
@@ -563,12 +579,36 @@ class SonamuClass {
|
|
|
563
579
|
}
|
|
564
580
|
}
|
|
565
581
|
|
|
582
|
+
private async initializeWorkflows(options: SonamuTaskOptions | undefined) {
|
|
583
|
+
const { WorkflowManager } = await import("../tasks/workflow-manager");
|
|
584
|
+
// NOTE: @sonamu-kit/tasks 안에선 knex config를 수정하기 때문에 connection이 아닌 config 째로 보냅니다.
|
|
585
|
+
this._workflows = await WorkflowManager.create(DB.getDBConfig("w"), true);
|
|
586
|
+
if (!options) {
|
|
587
|
+
return;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
const enableWorker = options.enableWorker ?? isDaemonServer();
|
|
591
|
+
const defaultWorkerOptions = {
|
|
592
|
+
concurrency: os.cpus().length - 1,
|
|
593
|
+
usePubSub: true,
|
|
594
|
+
listenDelay: 500,
|
|
595
|
+
};
|
|
596
|
+
|
|
597
|
+
if (enableWorker) {
|
|
598
|
+
await this.workflows.setupWorker({
|
|
599
|
+
...defaultWorkerOptions,
|
|
600
|
+
...options.workerOptions,
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
|
|
566
605
|
private async boot(server: FastifyInstance, options: SonamuServerOptions) {
|
|
567
606
|
const port = options.listen?.port ?? 3000;
|
|
568
607
|
const host = options.listen?.host ?? "localhost";
|
|
569
608
|
|
|
570
609
|
server.addHook("onClose", async () => {
|
|
571
610
|
await options.lifecycle?.onShutdown?.(server);
|
|
611
|
+
await this.workflows.destroy();
|
|
572
612
|
await this.destroy();
|
|
573
613
|
});
|
|
574
614
|
|
|
@@ -640,6 +680,7 @@ class SonamuClass {
|
|
|
640
680
|
async destroy(): Promise<void> {
|
|
641
681
|
const { BaseModel } = await import("../database/base-model");
|
|
642
682
|
await BaseModel.destroy();
|
|
683
|
+
await this._workflows?.destroy();
|
|
643
684
|
await this.watcher?.close();
|
|
644
685
|
this.storage?.destroy();
|
|
645
686
|
}
|
package/src/bin/cli.ts
CHANGED
|
@@ -27,61 +27,65 @@ async function bootstrap() {
|
|
|
27
27
|
await Sonamu.init(false, false);
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
30
|
+
try {
|
|
31
|
+
await tsicli(process.argv, {
|
|
32
|
+
types: {
|
|
33
|
+
"#entityId": {
|
|
34
|
+
type: "autocomplete",
|
|
35
|
+
name: "#entityId",
|
|
36
|
+
message: "Please input #entityId",
|
|
37
|
+
choices: EntityManager.getAllParentIds().map((entityId) => ({
|
|
38
|
+
title: entityId,
|
|
39
|
+
value: entityId,
|
|
40
|
+
})),
|
|
41
|
+
},
|
|
42
|
+
"#recordIds": "number[]",
|
|
43
|
+
"#name": "string",
|
|
40
44
|
},
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
45
|
+
args: [
|
|
46
|
+
["fixture", "init"],
|
|
47
|
+
["fixture", "import", "#entityId", "#recordIds"],
|
|
48
|
+
["fixture", "sync"],
|
|
49
|
+
["migrate", "run"],
|
|
50
|
+
["migrate", "check"],
|
|
51
|
+
["migrate", "rollback"],
|
|
52
|
+
["migrate", "reset"],
|
|
53
|
+
["migrate", "clear"],
|
|
54
|
+
["migrate", "status"],
|
|
55
|
+
["stub", "practice", "#name"],
|
|
56
|
+
["stub", "entity", "#name"],
|
|
57
|
+
["scaffold", "model", "#entityId"],
|
|
58
|
+
["scaffold", "model_test", "#entityId"],
|
|
59
|
+
["scaffold", "view_list", "#entityId"],
|
|
60
|
+
["scaffold", "view_form", "#entityId"],
|
|
61
|
+
["ui"],
|
|
62
|
+
["sync"],
|
|
63
|
+
["dev"],
|
|
64
|
+
["build"],
|
|
65
|
+
["start"],
|
|
66
|
+
],
|
|
67
|
+
runners: {
|
|
68
|
+
migrate_status,
|
|
69
|
+
migrate_run,
|
|
70
|
+
fixture_init,
|
|
71
|
+
fixture_import,
|
|
72
|
+
fixture_sync,
|
|
73
|
+
stub_practice,
|
|
74
|
+
stub_entity,
|
|
75
|
+
scaffold_model,
|
|
76
|
+
scaffold_model_test,
|
|
77
|
+
ui,
|
|
78
|
+
// scaffold_view_list,
|
|
79
|
+
// scaffold_view_form,
|
|
80
|
+
sync,
|
|
81
|
+
dev,
|
|
82
|
+
build,
|
|
83
|
+
start,
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
} finally {
|
|
87
|
+
await Sonamu.destroy();
|
|
88
|
+
}
|
|
85
89
|
}
|
|
86
90
|
|
|
87
91
|
bootstrap().finally(async () => {
|
|
@@ -2,24 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
import type { Knex } from "knex";
|
|
4
4
|
import { group, isObject, omit, set } from "radashi";
|
|
5
|
+
import type { ListResult } from "..";
|
|
5
6
|
import { Sonamu } from "../api";
|
|
6
|
-
import {
|
|
7
|
-
import type { DatabaseSchemaExtend } from "../types/types";
|
|
7
|
+
import type { DatabaseSchemaExtend, SonamuQueryMode } from "../types/types";
|
|
8
8
|
import { getJoinTables, getTableNamesFromWhere } from "../utils/sql-parser";
|
|
9
9
|
import { chunk } from "../utils/utils";
|
|
10
|
-
import type {
|
|
11
|
-
EmbeddingItem,
|
|
12
|
-
EmbeddingProvider,
|
|
13
|
-
HybridSearchOptions,
|
|
14
|
-
HybridSearchResult,
|
|
15
|
-
ProgressCallback,
|
|
16
|
-
VectorSearchOptions,
|
|
17
|
-
VectorSearchResult,
|
|
18
|
-
} from "../vector/types";
|
|
19
|
-
import { VectorSearch } from "../vector/vector-search";
|
|
20
10
|
import type {
|
|
21
11
|
EnhancerMap,
|
|
22
|
-
ExecuteSubsetQueryResult,
|
|
23
12
|
ResolveSubsetIntersection,
|
|
24
13
|
UnionExtractedTTables,
|
|
25
14
|
} from "./base-model.types";
|
|
@@ -69,118 +58,7 @@ export class BaseModelClass<
|
|
|
69
58
|
return new PuriWrapper(db, new UpsertBuilder());
|
|
70
59
|
}
|
|
71
60
|
|
|
72
|
-
// VectorSearch 인스턴스 캐시
|
|
73
|
-
private _vectorSearch: VectorSearch<any> | null = null;
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* 벡터 검색 인스턴스 반환
|
|
77
|
-
* - 기본 provider: voyage
|
|
78
|
-
* - 기본 dimensions: 1024 (DEFAULT_VECTOR_CONFIG 사용)
|
|
79
|
-
*/
|
|
80
|
-
getVector<T = Record<string, unknown>>(): VectorSearch<T> {
|
|
81
|
-
if (this._vectorSearch) {
|
|
82
|
-
return this._vectorSearch as VectorSearch<T>;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const entity = EntityManager.get(this.modelName);
|
|
86
|
-
|
|
87
|
-
this._vectorSearch = new VectorSearch<T>(this.getDB("w"), entity.table);
|
|
88
|
-
|
|
89
|
-
return this._vectorSearch as VectorSearch<T>;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* 벡터 검색 (코사인 유사도)
|
|
94
|
-
* @param query - 검색어
|
|
95
|
-
* @param options - 검색 옵션
|
|
96
|
-
*/
|
|
97
|
-
async vectorSearch<T = Record<string, unknown>>(
|
|
98
|
-
query: string,
|
|
99
|
-
options: VectorSearchOptions & { provider?: EmbeddingProvider } = {},
|
|
100
|
-
): Promise<VectorSearchResult<T>[]> {
|
|
101
|
-
const entity = EntityManager.get(this.modelName);
|
|
102
|
-
const vectorProp = entity.getVectorColumn();
|
|
103
|
-
if (!vectorProp) {
|
|
104
|
-
throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const vs = new VectorSearch<T>(this.getDB("w"), entity.table);
|
|
108
|
-
return vs.search(query, options.provider ?? "voyage", {
|
|
109
|
-
...options,
|
|
110
|
-
embeddingColumn: options.embeddingColumn ?? vectorProp.name,
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* 하이브리드 검색 (Vector + FTS)
|
|
116
|
-
* @param query - 검색어
|
|
117
|
-
* @param options - 검색 옵션
|
|
118
|
-
*/
|
|
119
|
-
async hybridSearch<T = Record<string, unknown>>(
|
|
120
|
-
query: string,
|
|
121
|
-
options: HybridSearchOptions & { provider?: EmbeddingProvider } = {},
|
|
122
|
-
): Promise<HybridSearchResult<T>[]> {
|
|
123
|
-
const entity = EntityManager.get(this.modelName);
|
|
124
|
-
const vectorProp = entity.getVectorColumn();
|
|
125
|
-
if (!vectorProp) {
|
|
126
|
-
throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const vs = new VectorSearch<T>(this.getDB("w"), entity.table);
|
|
130
|
-
return vs.hybridSearch(query, options.provider ?? "voyage", {
|
|
131
|
-
...options,
|
|
132
|
-
embeddingColumn: options.embeddingColumn ?? vectorProp.name,
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* 단일 레코드에 임베딩 저장
|
|
138
|
-
* @param id - 레코드 ID
|
|
139
|
-
* @param text - 임베딩할 텍스트
|
|
140
|
-
* @param options - provider, embeddingColumn 옵션
|
|
141
|
-
*/
|
|
142
|
-
async saveEmbedding(
|
|
143
|
-
id: number,
|
|
144
|
-
text: string,
|
|
145
|
-
options: { provider?: EmbeddingProvider; embeddingColumn?: string } = {},
|
|
146
|
-
): Promise<void> {
|
|
147
|
-
const entity = EntityManager.get(this.modelName);
|
|
148
|
-
const vectorProp = entity.getVectorColumn(options.embeddingColumn);
|
|
149
|
-
if (!vectorProp) {
|
|
150
|
-
throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
const { provider = "voyage" } = options;
|
|
154
|
-
const vs = this.getVector();
|
|
155
|
-
return vs.saveEmbedding(id, text, provider, vectorProp.name);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* 여러 레코드에 임베딩 일괄 저장
|
|
160
|
-
* @param items - { id, text } 배열
|
|
161
|
-
* @param options - provider, embeddingColumn, onProgress 옵션
|
|
162
|
-
*/
|
|
163
|
-
async saveEmbeddingsBatch(
|
|
164
|
-
items: EmbeddingItem[],
|
|
165
|
-
options: {
|
|
166
|
-
provider?: EmbeddingProvider;
|
|
167
|
-
embeddingColumn?: string;
|
|
168
|
-
onProgress?: ProgressCallback;
|
|
169
|
-
} = {},
|
|
170
|
-
): Promise<void> {
|
|
171
|
-
const entity = EntityManager.get(this.modelName);
|
|
172
|
-
const vectorProp = entity.getVectorColumn(options.embeddingColumn);
|
|
173
|
-
if (!vectorProp) {
|
|
174
|
-
throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
const { provider = "voyage", onProgress } = options;
|
|
178
|
-
const vs = this.getVector();
|
|
179
|
-
return vs.saveEmbeddingsBatch(items, provider, vectorProp.name, onProgress);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
61
|
async destroy() {
|
|
183
|
-
this._vectorSearch = null;
|
|
184
62
|
return DB.destroy();
|
|
185
63
|
}
|
|
186
64
|
|
|
@@ -275,6 +153,11 @@ export class BaseModelClass<
|
|
|
275
153
|
async executeSubsetQuery<
|
|
276
154
|
T extends TSubsetKey,
|
|
277
155
|
TComputedResults extends InferAllSubsets<TSubsetQueries, TLoaderQueries>,
|
|
156
|
+
LP extends {
|
|
157
|
+
num?: number;
|
|
158
|
+
page?: number;
|
|
159
|
+
queryMode?: SonamuQueryMode;
|
|
160
|
+
},
|
|
278
161
|
>(
|
|
279
162
|
params: {
|
|
280
163
|
subset: T;
|
|
@@ -282,12 +165,12 @@ export class BaseModelClass<
|
|
|
282
165
|
params: {
|
|
283
166
|
num: number;
|
|
284
167
|
page: number;
|
|
285
|
-
queryMode?:
|
|
168
|
+
queryMode?: SonamuQueryMode;
|
|
286
169
|
};
|
|
287
170
|
debug?: boolean;
|
|
288
171
|
optimizeCountQuery?: boolean;
|
|
289
172
|
} & EnhancerParam<TSubsetKey, TComputedResults, TSubsetMapping>,
|
|
290
|
-
): Promise<
|
|
173
|
+
): Promise<ListResult<LP, TSubsetMapping[T]>> {
|
|
291
174
|
const { subset, qb, params: queryParams, debug = false, optimizeCountQuery = false } = params;
|
|
292
175
|
|
|
293
176
|
if (!this.loaderQueries) {
|
|
@@ -296,9 +179,13 @@ export class BaseModelClass<
|
|
|
296
179
|
|
|
297
180
|
const { num, page } = queryParams;
|
|
298
181
|
|
|
299
|
-
// COUNT 쿼리 실행
|
|
182
|
+
// COUNT 쿼리 실행 (queryMode: list일 때는 0 리턴)
|
|
300
183
|
const total = await this.executeCountQuery(qb, queryParams, debug, optimizeCountQuery);
|
|
301
184
|
|
|
185
|
+
if (queryParams?.queryMode === "count") {
|
|
186
|
+
return { total } as ListResult<LP, TSubsetMapping[T]>;
|
|
187
|
+
}
|
|
188
|
+
|
|
302
189
|
// LIST 쿼리 실행
|
|
303
190
|
const computedRows = await this.executeListQuery(subset, qb, queryParams, num, page, debug);
|
|
304
191
|
|
|
@@ -308,7 +195,13 @@ export class BaseModelClass<
|
|
|
308
195
|
computedRows.map((row) => enhancer?.(row) ?? row),
|
|
309
196
|
)) as TSubsetMapping[T][];
|
|
310
197
|
|
|
311
|
-
|
|
198
|
+
if (queryParams.queryMode === "list") {
|
|
199
|
+
// 리스트만 리턴
|
|
200
|
+
return { rows } as ListResult<LP, TSubsetMapping[T]>;
|
|
201
|
+
} else {
|
|
202
|
+
// 둘다 리턴
|
|
203
|
+
return { rows, total } as ListResult<LP, TSubsetMapping[T]>;
|
|
204
|
+
}
|
|
312
205
|
}
|
|
313
206
|
|
|
314
207
|
/**
|