@cartanova/qgrid-cli 0.1.1 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js +9 -0
- package/bundle/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorateMetadata.js +6 -0
- package/bundle/dist/_virtual/_rolldown/runtime.js +15 -0
- package/bundle/dist/application/qgrid/oauth.js +140 -0
- package/bundle/dist/application/qgrid/pool.js +100 -0
- package/bundle/dist/application/qgrid/qgrid.frame.js +280 -0
- package/bundle/dist/application/qgrid/qgrid.types.js +79 -0
- package/bundle/dist/application/qgrid/worker.js +183 -0
- package/bundle/dist/application/queries.generated.js +31 -0
- package/bundle/dist/application/request-log/request-log.model.js +113 -0
- package/bundle/dist/application/request-log/request-log.types.js +13 -0
- package/bundle/dist/application/sonamu.generated.js +99 -0
- package/bundle/dist/application/sonamu.generated.sso.js +34 -0
- package/bundle/dist/application/token/token.model.js +157 -0
- package/bundle/dist/application/token/token.types.js +22 -0
- package/bundle/dist/i18n/en.js +63 -0
- package/bundle/dist/i18n/ko.js +62 -0
- package/bundle/dist/i18n/sd.generated.js +272 -0
- package/bundle/dist/index.js +11 -0
- package/bundle/dist/migrations/20260410171405_create__request_logs.js +26 -0
- package/bundle/dist/migrations/20260410171406_create__tokens.js +24 -0
- package/bundle/dist/migrations/20260411120624_alter_tokens_alter2.js +16 -0
- package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +155 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.2/node_modules/@vitest/expect/dist/index.js +1484 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js +887 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/chunk-artifact.js +2746 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/index.js +8 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/utils.js +8 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.2/node_modules/@vitest/snapshot/dist/index.js +662 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.2/node_modules/@vitest/spy/dist/index.js +386 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +82 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/constants.js +48 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/diff.js +1307 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/display.js +558 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/error.js +33 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/helpers.js +226 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/offset.js +27 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/serialize.js +77 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/source-map.js +374 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/timers.js +37 -0
- package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +2886 -0
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +10 -0
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +109 -0
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +10 -0
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +10 -0
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +10 -0
- package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +1127 -0
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +21 -0
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +432 -0
- package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +506 -0
- package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +86 -0
- package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.9.2_@emnapi_runtime@1.9.2_@types_node@25.0.7_esbuild@0.27.4_jiti@2.6.1_sass@1.98.0_tsx@4.21.0/node_modules/vite/dist/node/module-runner.js +426 -0
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +6 -0
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +41 -0
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +19 -0
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +202 -0
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/index.DOa3dzoN.js +16 -0
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +59 -0
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/test.p_J6dB8a.js +2910 -0
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +44 -0
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/index.js +28 -0
- package/bundle/dist/sonamu.config.js +196 -0
- package/bundle/dist/testing/fixture.js +8 -0
- package/bundle/dist/testing/global.js +9 -0
- package/bundle/dist/testing/setup-mocks.js +17 -0
- package/bundle/dist/utils/subset-loaders.js +12 -0
- package/bundle/src/application/request-log/request-log.entity.json +75 -0
- package/bundle/src/application/token/token.entity.json +37 -0
- package/bundle/src/migrations/20260410171405_create__request_logs.ts +23 -0
- package/bundle/src/migrations/20260410171406_create__tokens.ts +21 -0
- package/bundle/src/migrations/20260411120624_alter_tokens_alter2.ts +15 -0
- package/bundle/web-dist/client/assets/index-DlPchHBY.js +116 -0
- package/bundle/web-dist/client/assets/index-vZsvyuFn.css +1 -0
- package/bundle/web-dist/client/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
- package/bundle/web-dist/client/assets/routes-CagDz23B.js +1 -0
- package/bundle/web-dist/client/assets/sd.generated-BrQoQXvv.js +47 -0
- package/bundle/web-dist/client/assets/services.generated-BspO2L0j.js +1 -0
- package/bundle/web-dist/client/assets/show-aXUGa0gm.js +29 -0
- package/bundle/web-dist/client/assets/tokens-DRkXtZ3Q.js +1 -0
- package/bundle/web-dist/client/assets/vendor-react-DH4kUfK2.js +9 -0
- package/bundle/web-dist/client/assets/vendor-tanstack-CUxlo6YN.js +1 -0
- package/bundle/web-dist/client/index.html +18 -0
- package/bundle/web-dist/server/assets/react-dom-CGIzOSuj.js +335 -0
- package/bundle/web-dist/server/assets/routes-ClzReRep.js +490 -0
- package/bundle/web-dist/server/assets/sd.generated-BnonqqKr.js +21694 -0
- package/bundle/web-dist/server/assets/services.generated-D5ABD5fr.js +836 -0
- package/bundle/web-dist/server/assets/show-C9pcdSxc.js +23364 -0
- package/bundle/web-dist/server/assets/tokens-JH6FsnWZ.js +860 -0
- package/bundle/web-dist/server/entry-server.generated.js +44646 -0
- package/dist/cli.js +38 -89
- package/package.json +40 -12
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { getSafeTimers } from "../../../../../@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/timers.js";
|
|
2
|
+
//#region ../../node_modules/.pnpm/vitest@4.1.2_@opentelemetry+api@1.9.0_@types+node@25.0.7_vite@8.0.3_@emnapi+core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js
|
|
3
|
+
const NAME_WORKER_STATE = "__vitest_worker__";
|
|
4
|
+
function getWorkerState() {
|
|
5
|
+
const workerState = globalThis[NAME_WORKER_STATE];
|
|
6
|
+
if (!workerState) throw new Error("Vitest failed to access its internal state.\n\nOne of the following is possible:\n- \"vitest\" is imported directly without running \"vitest\" command\n- \"vitest\" is imported inside \"globalSetup\" (to fix this, use \"setupFiles\" instead, because \"globalSetup\" runs in a different context)\n- \"vitest\" is imported inside Vite / Vitest config file\n- Otherwise, it might be a Vitest bug. Please report it to https://github.com/vitest-dev/vitest/issues\n");
|
|
7
|
+
return workerState;
|
|
8
|
+
}
|
|
9
|
+
function isChildProcess() {
|
|
10
|
+
return typeof process !== "undefined" && !!process.send;
|
|
11
|
+
}
|
|
12
|
+
function resetModules(modules, resetMocks = false) {
|
|
13
|
+
const skipPaths = [
|
|
14
|
+
/\/vitest\/dist\//,
|
|
15
|
+
/vitest-virtual-\w+\/dist/,
|
|
16
|
+
/@vitest\/dist/,
|
|
17
|
+
...!resetMocks ? [/^mock:/] : []
|
|
18
|
+
];
|
|
19
|
+
modules.idToModuleMap.forEach((node, path) => {
|
|
20
|
+
if (skipPaths.some((re) => re.test(path))) return;
|
|
21
|
+
node.promise = void 0;
|
|
22
|
+
node.exports = void 0;
|
|
23
|
+
node.evaluated = false;
|
|
24
|
+
node.importers.clear();
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function waitNextTick() {
|
|
28
|
+
const { setTimeout } = getSafeTimers();
|
|
29
|
+
return new Promise((resolve) => setTimeout(resolve, 0));
|
|
30
|
+
}
|
|
31
|
+
async function waitForImportsToResolve() {
|
|
32
|
+
await waitNextTick();
|
|
33
|
+
const state = getWorkerState();
|
|
34
|
+
const promises = [];
|
|
35
|
+
const resolvingCount = state.resolvingModules.size;
|
|
36
|
+
for (const [_, mod] of state.evaluatedModules.idToModuleMap) if (mod.promise && !mod.evaluated) promises.push(mod.promise);
|
|
37
|
+
if (!promises.length && !resolvingCount) return;
|
|
38
|
+
await Promise.allSettled(promises);
|
|
39
|
+
await waitForImportsToResolve();
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { getWorkerState, isChildProcess, resetModules, waitForImportsToResolve };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuQlg1Rmc4QzQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ZpdGVzdEA0LjEuMl9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjBfQHR5cGVzK25vZGVAMjUuMC43X3ZpdGVAOC4wLjNfQGVtbmFwaStjb3JlQDEuOS4yX19iYjMxMDg3Mjc4Zjk3YTM5YjMxYjkyMDEwYmVhYjk4MC9ub2RlX21vZHVsZXMvdml0ZXN0L2Rpc3QvY2h1bmtzL3V0aWxzLkJYNUZnOEM0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFNhZmVUaW1lcnMgfSBmcm9tICdAdml0ZXN0L3V0aWxzL3RpbWVycyc7XG5cbmNvbnN0IE5BTUVfV09SS0VSX1NUQVRFID0gXCJfX3ZpdGVzdF93b3JrZXJfX1wiO1xuY2xhc3MgRW52aXJvbm1lbnRUZWFyZG93bkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRuYW1lID0gXCJFbnZpcm9ubWVudFRlYXJkb3duRXJyb3JcIjtcbn1cbmZ1bmN0aW9uIGdldFdvcmtlclN0YXRlKCkge1xuXHQvLyBAdHMtZXhwZWN0LWVycm9yIHVudHlwZWQgZ2xvYmFsXG5cdGNvbnN0IHdvcmtlclN0YXRlID0gZ2xvYmFsVGhpc1tOQU1FX1dPUktFUl9TVEFURV07XG5cdGlmICghd29ya2VyU3RhdGUpIHRocm93IG5ldyBFcnJvcihcIlZpdGVzdCBmYWlsZWQgdG8gYWNjZXNzIGl0cyBpbnRlcm5hbCBzdGF0ZS5cXG5cXG5PbmUgb2YgdGhlIGZvbGxvd2luZyBpcyBwb3NzaWJsZTpcXG4tIFxcXCJ2aXRlc3RcXFwiIGlzIGltcG9ydGVkIGRpcmVjdGx5IHdpdGhvdXQgcnVubmluZyBcXFwidml0ZXN0XFxcIiBjb21tYW5kXFxuLSBcXFwidml0ZXN0XFxcIiBpcyBpbXBvcnRlZCBpbnNpZGUgXFxcImdsb2JhbFNldHVwXFxcIiAodG8gZml4IHRoaXMsIHVzZSBcXFwic2V0dXBGaWxlc1xcXCIgaW5zdGVhZCwgYmVjYXVzZSBcXFwiZ2xvYmFsU2V0dXBcXFwiIHJ1bnMgaW4gYSBkaWZmZXJlbnQgY29udGV4dClcXG4tIFxcXCJ2aXRlc3RcXFwiIGlzIGltcG9ydGVkIGluc2lkZSBWaXRlIC8gVml0ZXN0IGNvbmZpZyBmaWxlXFxuLSBPdGhlcndpc2UsIGl0IG1pZ2h0IGJlIGEgVml0ZXN0IGJ1Zy4gUGxlYXNlIHJlcG9ydCBpdCB0byBodHRwczovL2dpdGh1Yi5jb20vdml0ZXN0LWRldi92aXRlc3QvaXNzdWVzXFxuXCIpO1xuXHRyZXR1cm4gd29ya2VyU3RhdGU7XG59XG5mdW5jdGlvbiBnZXRTYWZlV29ya2VyU3RhdGUoKSB7XG5cdC8vIEB0cy1leHBlY3QtZXJyb3IgdW50eXBlZCBnbG9iYWxcblx0cmV0dXJuIGdsb2JhbFRoaXNbTkFNRV9XT1JLRVJfU1RBVEVdO1xufVxuZnVuY3Rpb24gcHJvdmlkZVdvcmtlclN0YXRlKGNvbnRleHQsIHN0YXRlKSB7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0LCBOQU1FX1dPUktFUl9TVEFURSwge1xuXHRcdHZhbHVlOiBzdGF0ZSxcblx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0d3JpdGFibGU6IHRydWUsXG5cdFx0ZW51bWVyYWJsZTogZmFsc2Vcblx0fSk7XG5cdHJldHVybiBzdGF0ZTtcbn1cbmZ1bmN0aW9uIGlzQ2hpbGRQcm9jZXNzKCkge1xuXHRyZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgISFwcm9jZXNzLnNlbmQ7XG59XG5mdW5jdGlvbiByZXNldE1vZHVsZXMobW9kdWxlcywgcmVzZXRNb2NrcyA9IGZhbHNlKSB7XG5cdGNvbnN0IHNraXBQYXRocyA9IFtcblx0XHQvXFwvdml0ZXN0XFwvZGlzdFxcLy8sXG5cdFx0L3ZpdGVzdC12aXJ0dWFsLVxcdytcXC9kaXN0Lyxcblx0XHQvQHZpdGVzdFxcL2Rpc3QvLFxuXHRcdC4uLiFyZXNldE1vY2tzID8gWy9ebW9jazovXSA6IFtdXG5cdF07XG5cdG1vZHVsZXMuaWRUb01vZHVsZU1hcC5mb3JFYWNoKChub2RlLCBwYXRoKSA9PiB7XG5cdFx0aWYgKHNraXBQYXRocy5zb21lKChyZSkgPT4gcmUudGVzdChwYXRoKSkpIHJldHVybjtcblx0XHRub2RlLnByb21pc2UgPSB2b2lkIDA7XG5cdFx0bm9kZS5leHBvcnRzID0gdm9pZCAwO1xuXHRcdG5vZGUuZXZhbHVhdGVkID0gZmFsc2U7XG5cdFx0bm9kZS5pbXBvcnRlcnMuY2xlYXIoKTtcblx0fSk7XG59XG5mdW5jdGlvbiB3YWl0TmV4dFRpY2soKSB7XG5cdGNvbnN0IHsgc2V0VGltZW91dCB9ID0gZ2V0U2FmZVRpbWVycygpO1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xufVxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckltcG9ydHNUb1Jlc29sdmUoKSB7XG5cdGF3YWl0IHdhaXROZXh0VGljaygpO1xuXHRjb25zdCBzdGF0ZSA9IGdldFdvcmtlclN0YXRlKCk7XG5cdGNvbnN0IHByb21pc2VzID0gW107XG5cdGNvbnN0IHJlc29sdmluZ0NvdW50ID0gc3RhdGUucmVzb2x2aW5nTW9kdWxlcy5zaXplO1xuXHRmb3IgKGNvbnN0IFtfLCBtb2RdIG9mIHN0YXRlLmV2YWx1YXRlZE1vZHVsZXMuaWRUb01vZHVsZU1hcCkgaWYgKG1vZC5wcm9taXNlICYmICFtb2QuZXZhbHVhdGVkKSBwcm9taXNlcy5wdXNoKG1vZC5wcm9taXNlKTtcblx0aWYgKCFwcm9taXNlcy5sZW5ndGggJiYgIXJlc29sdmluZ0NvdW50KSByZXR1cm47XG5cdGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcyk7XG5cdGF3YWl0IHdhaXRGb3JJbXBvcnRzVG9SZXNvbHZlKCk7XG59XG5cbmV4cG9ydCB7IEVudmlyb25tZW50VGVhcmRvd25FcnJvciBhcyBFLCBnZXRTYWZlV29ya2VyU3RhdGUgYXMgYSwgZ2V0V29ya2VyU3RhdGUgYXMgZywgaXNDaGlsZFByb2Nlc3MgYXMgaSwgcHJvdmlkZVdvcmtlclN0YXRlIGFzIHAsIHJlc2V0TW9kdWxlcyBhcyByLCB3YWl0Rm9ySW1wb3J0c1RvUmVzb2x2ZSBhcyB3IH07XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzBdLCJtYXBwaW5ncyI6Ijs7QUFFQSxNQUFNLG9CQUFvQjtBQUkxQixTQUFTLGlCQUFpQjtDQUV6QixNQUFNLGNBQWMsV0FBVztBQUMvQixLQUFJLENBQUMsWUFBYSxPQUFNLElBQUksTUFBTSw4Y0FBOGM7QUFDaGYsUUFBTzs7QUFlUixTQUFTLGlCQUFpQjtBQUN6QixRQUFPLE9BQU8sWUFBWSxlQUFlLENBQUMsQ0FBQyxRQUFROztBQUVwRCxTQUFTLGFBQWEsU0FBUyxhQUFhLE9BQU87Q0FDbEQsTUFBTSxZQUFZO0VBQ2pCO0VBQ0E7RUFDQTtFQUNBLEdBQUcsQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLEVBQUU7RUFDaEM7QUFDRCxTQUFRLGNBQWMsU0FBUyxNQUFNLFNBQVM7QUFDN0MsTUFBSSxVQUFVLE1BQU0sT0FBTyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUU7QUFDM0MsT0FBSyxVQUFVLEtBQUs7QUFDcEIsT0FBSyxVQUFVLEtBQUs7QUFDcEIsT0FBSyxZQUFZO0FBQ2pCLE9BQUssVUFBVSxPQUFPO0dBQ3JCOztBQUVILFNBQVMsZUFBZTtDQUN2QixNQUFNLEVBQUUsZUFBZSxlQUFlO0FBQ3RDLFFBQU8sSUFBSSxTQUFTLFlBQVksV0FBVyxTQUFTLEVBQUUsQ0FBQzs7QUFFeEQsZUFBZSwwQkFBMEI7QUFDeEMsT0FBTSxjQUFjO0NBQ3BCLE1BQU0sUUFBUSxnQkFBZ0I7Q0FDOUIsTUFBTSxXQUFXLEVBQUU7Q0FDbkIsTUFBTSxpQkFBaUIsTUFBTSxpQkFBaUI7QUFDOUMsTUFBSyxNQUFNLENBQUMsR0FBRyxRQUFRLE1BQU0saUJBQWlCLGNBQWUsS0FBSSxJQUFJLFdBQVcsQ0FBQyxJQUFJLFVBQVcsVUFBUyxLQUFLLElBQUksUUFBUTtBQUMxSCxLQUFJLENBQUMsU0FBUyxVQUFVLENBQUMsZUFBZ0I7QUFDekMsT0FBTSxRQUFRLFdBQVcsU0FBUztBQUNsQyxPQUFNLHlCQUF5QiJ9
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import "../../../../@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/helpers.js";
|
|
2
|
+
import "../../../../@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/error.js";
|
|
3
|
+
import "../../../../@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/timers.js";
|
|
4
|
+
import "../../../../@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/source-map.js";
|
|
5
|
+
import "../../../../pathe@2.0.3/node_modules/pathe/dist/index.js";
|
|
6
|
+
import "../../../../@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/chunk-artifact.js";
|
|
7
|
+
import "../../../../@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/index.js";
|
|
8
|
+
import "../../../../@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/utils.js";
|
|
9
|
+
import "./chunks/utils.BX5Fg8C4.js";
|
|
10
|
+
import "./chunks/benchmark.CX_oY03V.js";
|
|
11
|
+
import "../../../../@vitest_spy@4.1.2/node_modules/@vitest/spy/dist/index.js";
|
|
12
|
+
import "../../../../chai@6.2.2/node_modules/chai/index.js";
|
|
13
|
+
import "../../../../@vitest_expect@4.1.2/node_modules/@vitest/expect/dist/index.js";
|
|
14
|
+
import "../../../../@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/offset.js";
|
|
15
|
+
import "../../../../@vitest_snapshot@4.1.2/node_modules/@vitest/snapshot/dist/index.js";
|
|
16
|
+
import "./chunks/_commonjsHelpers.D26ty3Ew.js";
|
|
17
|
+
import "./chunks/index.Chj8NDwU.js";
|
|
18
|
+
import "./chunks/rpc.MzXet3jl.js";
|
|
19
|
+
import "./chunks/test.p_J6dB8a.js";
|
|
20
|
+
import "../../../../vite@8.0.3_@emnapi_core@1.9.2_@emnapi_runtime@1.9.2_@types_node@25.0.7_esbuild@0.27.4_jiti@2.6.1_sass@1.98.0_tsx@4.21.0/node_modules/vite/dist/node/module-runner.js";
|
|
21
|
+
import "./chunks/evaluatedModules.Dg1zASAC.js";
|
|
22
|
+
import { require_dist } from "../../../../expect-type@1.3.0/node_modules/expect-type/dist/index.js";
|
|
23
|
+
import "./chunks/index.DOa3dzoN.js";
|
|
24
|
+
require_dist();
|
|
25
|
+
//#endregion
|
|
26
|
+
export {};
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ZpdGVzdEA0LjEuMl9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjBfQHR5cGVzK25vZGVAMjUuMC43X3ZpdGVAOC4wLjNfQGVtbmFwaStjb3JlQDEuOS4yX19iYjMxMDg3Mjc4Zjk3YTM5YjMxYjkyMDEwYmVhYjk4MC9ub2RlX21vZHVsZXMvdml0ZXN0L2Rpc3QvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgTiBhcyBCZW5jaG1hcmtSdW5uZXIsIFQgYXMgVGVzdFJ1bm5lciwgYSBhcyBhc3NlcnQsIGMgYXMgY3JlYXRlRXhwZWN0LCBnIGFzIGV4cGVjdCwgaSBhcyBpbmplY3QsIHMgYXMgc2hvdWxkLCB2IGFzIHZpLCBiIGFzIHZpdGVzdCB9IGZyb20gJy4vY2h1bmtzL3Rlc3QucF9KNmRCOGEuanMnO1xuZXhwb3J0IHsgYiBhcyBiZW5jaCB9IGZyb20gJy4vY2h1bmtzL2JlbmNobWFyay5DWF9vWTAzVi5qcyc7XG5leHBvcnQgeyBWIGFzIEV2YWx1YXRlZE1vZHVsZXMgfSBmcm9tICcuL2NodW5rcy9ldmFsdWF0ZWRNb2R1bGVzLkRnMXpBU0FDLmpzJztcbmV4cG9ydCB7IGEgYXMgYXNzZXJ0VHlwZSB9IGZyb20gJy4vY2h1bmtzL2luZGV4LkRPYTNkem9OLmpzJztcbmV4cG9ydCB7IGV4cGVjdFR5cGVPZiB9IGZyb20gJ2V4cGVjdC10eXBlJztcbmV4cG9ydCB7IGFmdGVyQWxsLCBhZnRlckVhY2gsIGFyb3VuZEFsbCwgYXJvdW5kRWFjaCwgYmVmb3JlQWxsLCBiZWZvcmVFYWNoLCBkZXNjcmliZSwgaXQsIG9uVGVzdEZhaWxlZCwgb25UZXN0RmluaXNoZWQsIHJlY29yZEFydGlmYWN0LCBzdWl0ZSwgdGVzdCB9IGZyb20gJ0B2aXRlc3QvcnVubmVyJztcbmV4cG9ydCB7IGNoYWkgfSBmcm9tICdAdml0ZXN0L2V4cGVjdCc7XG5pbXBvcnQgJ0B2aXRlc3QvdXRpbHMvaGVscGVycyc7XG5pbXBvcnQgJ0B2aXRlc3QvdXRpbHMvdGltZXJzJztcbmltcG9ydCAnLi9jaHVua3MvdXRpbHMuQlg1Rmc4QzQuanMnO1xuaW1wb3J0ICdAdml0ZXN0L3J1bm5lci91dGlscyc7XG5pbXBvcnQgJ0B2aXRlc3QvdXRpbHMvZXJyb3InO1xuaW1wb3J0ICdwYXRoZSc7XG5pbXBvcnQgJ0B2aXRlc3Qvc25hcHNob3QnO1xuaW1wb3J0ICdAdml0ZXN0L3NweSc7XG5pbXBvcnQgJ0B2aXRlc3QvdXRpbHMvb2Zmc2V0JztcbmltcG9ydCAnQHZpdGVzdC91dGlscy9zb3VyY2UtbWFwJztcbmltcG9ydCAnLi9jaHVua3MvX2NvbW1vbmpzSGVscGVycy5EMjZ0eTNFdy5qcyc7XG5pbXBvcnQgJy4vY2h1bmtzL3JwYy5NelhldDNqbC5qcyc7XG5pbXBvcnQgJy4vY2h1bmtzL2luZGV4LkNoajhORHdVLmpzJztcbmltcG9ydCAndml0ZS9tb2R1bGUtcnVubmVyJztcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMF0sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import "./_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { CachePresets, defineConfig } from "sonamu";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { getConsoleSink } from "@logtape/logtape";
|
|
5
|
+
import { getPrettyFormatter } from "@logtape/pretty";
|
|
6
|
+
import dotenv from "dotenv";
|
|
7
|
+
import { drivers, store } from "sonamu/cache";
|
|
8
|
+
import { drivers as drivers$1 } from "sonamu/storage";
|
|
9
|
+
//#region src/sonamu.config.ts
|
|
10
|
+
dotenv.config({ path: path.join(import.meta.dirname, "../.env") });
|
|
11
|
+
const host = process.env.HOST ?? "localhost";
|
|
12
|
+
const port = Number(process.env.PORT ?? 44900);
|
|
13
|
+
var sonamu_config_default = defineConfig({
|
|
14
|
+
projectName: process.env.PROJECT_NAME ?? "SonamuProject",
|
|
15
|
+
database: {
|
|
16
|
+
name: process.env.QGRID_DB_NAME ?? "qgrid",
|
|
17
|
+
defaultOptions: { connection: {
|
|
18
|
+
host: process.env.QGRID_DB_HOST ?? "localhost",
|
|
19
|
+
port: Number(process.env.QGRID_DB_PORT ?? 44901),
|
|
20
|
+
user: process.env.QGRID_DB_USER ?? "postgres",
|
|
21
|
+
password: process.env.QGRID_DB_PASSWORD ?? "postgres"
|
|
22
|
+
} },
|
|
23
|
+
environments: {
|
|
24
|
+
production: { connection: {
|
|
25
|
+
host: process.env.DEV0_DB_HOST,
|
|
26
|
+
port: Number(process.env.DEV0_DB_PORT),
|
|
27
|
+
database: process.env.DATABASE_NAME,
|
|
28
|
+
user: process.env.DEV0_DB_USER,
|
|
29
|
+
password: process.env.DEV0_DB_PASSWORD
|
|
30
|
+
} },
|
|
31
|
+
fixture: { connection: {
|
|
32
|
+
host: process.env.DEV0_DB_HOST,
|
|
33
|
+
port: Number(process.env.DEV0_DB_PORT),
|
|
34
|
+
database: process.env.DATABASE_NAME,
|
|
35
|
+
user: process.env.DEV0_DB_USER,
|
|
36
|
+
password: process.env.DEV0_DB_PASSWORD
|
|
37
|
+
} }
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
api: {
|
|
41
|
+
dir: "api",
|
|
42
|
+
timezone: "Asia/Seoul",
|
|
43
|
+
route: { prefix: "/api" }
|
|
44
|
+
},
|
|
45
|
+
i18n: {
|
|
46
|
+
defaultLocale: "ko",
|
|
47
|
+
supportedLocales: ["ko", "en"]
|
|
48
|
+
},
|
|
49
|
+
sync: { targets: ["web"] },
|
|
50
|
+
slackConfirm: process.env.SLACK_BOT_TOKEN && process.env.SLACK_CHANNEL_ID ? {
|
|
51
|
+
targets: ["development_master", "production_master"],
|
|
52
|
+
botToken: process.env.SLACK_BOT_TOKEN ?? "",
|
|
53
|
+
channelId: process.env.SLACK_CHANNEL_ID ?? ""
|
|
54
|
+
} : void 0,
|
|
55
|
+
test: {
|
|
56
|
+
parallel: true,
|
|
57
|
+
maxWorkers: 4,
|
|
58
|
+
devRunner: { enabled: true }
|
|
59
|
+
},
|
|
60
|
+
logging: {
|
|
61
|
+
sinks: { console: getConsoleSink({ formatter: getPrettyFormatter({
|
|
62
|
+
timestamp: "time",
|
|
63
|
+
categoryWidth: 20,
|
|
64
|
+
categoryTruncate: "middle"
|
|
65
|
+
}) }) },
|
|
66
|
+
loggers: [{
|
|
67
|
+
category: ["sonamu"],
|
|
68
|
+
sinks: ["console"],
|
|
69
|
+
lowestLevel: process.env.NODE_ENV === "test" ? "warning" : "debug"
|
|
70
|
+
}]
|
|
71
|
+
},
|
|
72
|
+
server: {
|
|
73
|
+
listen: {
|
|
74
|
+
port,
|
|
75
|
+
host
|
|
76
|
+
},
|
|
77
|
+
plugins: {
|
|
78
|
+
formbody: true,
|
|
79
|
+
qs: true,
|
|
80
|
+
multipart: { limits: { fileSize: 1024 * 1024 * 30 } },
|
|
81
|
+
static: {
|
|
82
|
+
root: path.join(import.meta.dirname, "/../", "public"),
|
|
83
|
+
prefix: "/api/public"
|
|
84
|
+
},
|
|
85
|
+
custom: (server) => {
|
|
86
|
+
server.get("/callback", async (request, reply) => {
|
|
87
|
+
const { code, state } = request.query;
|
|
88
|
+
if (!code || !state) return reply.redirect("/?oauth=error&reason=missing_params");
|
|
89
|
+
try {
|
|
90
|
+
const { QgridFrame } = await import("./application/qgrid/qgrid.frame.js");
|
|
91
|
+
await QgridFrame.handleOAuthCallback(code, state, reply);
|
|
92
|
+
} catch (e) {
|
|
93
|
+
return reply.redirect(`/?oauth=error&reason=${encodeURIComponent(e.message)}`);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
apiConfig: {
|
|
99
|
+
contextProvider: (defaultContext, request) => {
|
|
100
|
+
return {
|
|
101
|
+
...defaultContext,
|
|
102
|
+
ip: request.ip,
|
|
103
|
+
body: request.body
|
|
104
|
+
};
|
|
105
|
+
},
|
|
106
|
+
guardHandler: (_guard, _request, _api) => {
|
|
107
|
+
if (_guard === "user") console.log("user guard");
|
|
108
|
+
console.log("NOTHING YET");
|
|
109
|
+
},
|
|
110
|
+
cacheControlHandler: (req) => {
|
|
111
|
+
switch (req.type) {
|
|
112
|
+
case "assets":
|
|
113
|
+
if (req.path.match(/-[a-f0-9]+\./)) return CachePresets.immutable;
|
|
114
|
+
return CachePresets.longLived;
|
|
115
|
+
case "api":
|
|
116
|
+
if (req.method === "GET") {
|
|
117
|
+
if (req.path.startsWith("/api/static-data")) return CachePresets.shortLived;
|
|
118
|
+
if (req.path.startsWith("/api/terms")) return CachePresets.mediumLived;
|
|
119
|
+
}
|
|
120
|
+
return CachePresets.noCache;
|
|
121
|
+
case "ssr": return CachePresets.ssr;
|
|
122
|
+
case "csr": return CachePresets.shortLived;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
storage: { drivers: {
|
|
127
|
+
fs: drivers$1.fs({
|
|
128
|
+
location: path.join(import.meta.dirname, "/../public/uploaded"),
|
|
129
|
+
visibility: "public",
|
|
130
|
+
urlBuilder: {
|
|
131
|
+
async generateURL(key) {
|
|
132
|
+
return `/api/public/uploaded/${key}`;
|
|
133
|
+
},
|
|
134
|
+
async generateSignedURL(key) {
|
|
135
|
+
return `/api/public/uploaded/${key}`;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}),
|
|
139
|
+
s3: drivers$1.s3({
|
|
140
|
+
credentials: {
|
|
141
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID ?? "",
|
|
142
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY ?? ""
|
|
143
|
+
},
|
|
144
|
+
region: process.env.S3_REGION ?? "ap-northeast-2",
|
|
145
|
+
bucket: process.env.S3_BUCKET ?? "sonamu_default_bucket",
|
|
146
|
+
visibility: "private"
|
|
147
|
+
})
|
|
148
|
+
} },
|
|
149
|
+
cache: {
|
|
150
|
+
default: "main",
|
|
151
|
+
stores: { main: store().useL1Layer(drivers.memory({ maxSize: "50mb" })) },
|
|
152
|
+
ttl: "5m",
|
|
153
|
+
prefix: ""
|
|
154
|
+
},
|
|
155
|
+
lifecycle: {
|
|
156
|
+
onStart: async () => {
|
|
157
|
+
try {
|
|
158
|
+
const { TokenModel } = await import("./application/token/token.model.js");
|
|
159
|
+
const knex = TokenModel.getDB("w");
|
|
160
|
+
const migrationsDir = path.join(import.meta.dirname, "../src/migrations");
|
|
161
|
+
const [batch, log] = await knex.migrate.latest({ directory: migrationsDir });
|
|
162
|
+
if (log.length > 0) {
|
|
163
|
+
console.log(`✓ Migration: ${log.length} applied (batch ${batch})`);
|
|
164
|
+
log.forEach((name) => console.log(` ✓ ${name}`));
|
|
165
|
+
}
|
|
166
|
+
} catch (e) {
|
|
167
|
+
console.warn(`⚠ Migration skipped: ${e.message}`);
|
|
168
|
+
}
|
|
169
|
+
const { initPool } = await import("./application/qgrid/pool.js");
|
|
170
|
+
try {
|
|
171
|
+
const { TokenModel } = await import("./application/token/token.model.js");
|
|
172
|
+
const pool = initPool((await TokenModel.findActive("A")).map((e) => e.token));
|
|
173
|
+
console.log(`🌲 Server listening on http://${host}:${port} (${pool.workers.size} tokens loaded)`);
|
|
174
|
+
} catch (e) {
|
|
175
|
+
console.warn(`⚠ Pool init failed: ${e.message}`);
|
|
176
|
+
initPool([]);
|
|
177
|
+
console.log(`🌲 Server listening on http://${host}:${port} (no tokens)`);
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
onShutdown: () => {
|
|
181
|
+
console.log("graceful shutdown");
|
|
182
|
+
},
|
|
183
|
+
onError: (error, _request, reply) => {
|
|
184
|
+
console.error(error);
|
|
185
|
+
reply.status(500).send({
|
|
186
|
+
name: error.name,
|
|
187
|
+
message: error.message
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
//#endregion
|
|
194
|
+
export { sonamu_config_default as default };
|
|
195
|
+
|
|
196
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImRyaXZlcnMiLCJjYWNoZURyaXZlcnMiXSwic291cmNlcyI6WyIuLi9zcmMvc29uYW11LmNvbmZpZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBnZXRDb25zb2xlU2luayB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCB7IENhY2hlUHJlc2V0cywgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInNvbmFtdVwiO1xuaW1wb3J0IHsgZHJpdmVycyBhcyBjYWNoZURyaXZlcnMsIHN0b3JlIH0gZnJvbSBcInNvbmFtdS9jYWNoZVwiO1xuaW1wb3J0IHsgZHJpdmVycyB9IGZyb20gXCJzb25hbXUvc3RvcmFnZVwiO1xuXG5kb3RlbnYuY29uZmlnKHsgcGF0aDogcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi4vLmVudlwiKSB9KTtcblxuY29uc3QgaG9zdCA9IHByb2Nlc3MuZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIjtcbmNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCA/PyA0NDkwMCk7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHByb2plY3ROYW1lOiBwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUgPz8gXCJTb25hbXVQcm9qZWN0XCIsXG4gIGRhdGFiYXNlOiB7XG4gICAgbmFtZTogcHJvY2Vzcy5lbnYuUUdSSURfREJfTkFNRSA/PyBcInFncmlkXCIsXG4gICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgaG9zdDogcHJvY2Vzcy5lbnYuUUdSSURfREJfSE9TVCA/PyBcImxvY2FsaG9zdFwiLFxuICAgICAgICBwb3J0OiBOdW1iZXIocHJvY2Vzcy5lbnYuUUdSSURfREJfUE9SVCA/PyA0NDkwMSksXG4gICAgICAgIHVzZXI6IHByb2Nlc3MuZW52LlFHUklEX0RCX1VTRVIgPz8gXCJwb3N0Z3Jlc1wiLFxuICAgICAgICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuUUdSSURfREJfUEFTU1dPUkQgPz8gXCJwb3N0Z3Jlc1wiLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGVudmlyb25tZW50czoge1xuICAgICAgcHJvZHVjdGlvbjoge1xuICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgaG9zdDogcHJvY2Vzcy5lbnYuREVWMF9EQl9IT1NULFxuICAgICAgICAgIHBvcnQ6IE51bWJlcihwcm9jZXNzLmVudi5ERVYwX0RCX1BPUlQpLFxuICAgICAgICAgIGRhdGFiYXNlOiBwcm9jZXNzLmVudi5EQVRBQkFTRV9OQU1FLFxuICAgICAgICAgIHVzZXI6IHByb2Nlc3MuZW52LkRFVjBfREJfVVNFUixcbiAgICAgICAgICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuREVWMF9EQl9QQVNTV09SRCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmaXh0dXJlOiB7XG4gICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICBob3N0OiBwcm9jZXNzLmVudi5ERVYwX0RCX0hPU1QsXG4gICAgICAgICAgcG9ydDogTnVtYmVyKHByb2Nlc3MuZW52LkRFVjBfREJfUE9SVCksXG4gICAgICAgICAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LkRBVEFCQVNFX05BTUUsXG4gICAgICAgICAgdXNlcjogcHJvY2Vzcy5lbnYuREVWMF9EQl9VU0VSLFxuICAgICAgICAgIHBhc3N3b3JkOiBwcm9jZXNzLmVudi5ERVYwX0RCX1BBU1NXT1JELFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBhcGk6IHtcbiAgICBkaXI6IFwiYXBpXCIsXG4gICAgdGltZXpvbmU6IFwiQXNpYS9TZW91bFwiLFxuICAgIHJvdXRlOiB7XG4gICAgICBwcmVmaXg6IFwiL2FwaVwiLFxuICAgIH0sXG4gIH0sXG4gIGkxOG46IHtcbiAgICBkZWZhdWx0TG9jYWxlOiBcImtvXCIsXG4gICAgc3VwcG9ydGVkTG9jYWxlczogW1wia29cIiwgXCJlblwiXSxcbiAgfSxcbiAgc3luYzoge1xuICAgIHRhcmdldHM6IFtcIndlYlwiXSxcbiAgfSxcbiAgc2xhY2tDb25maXJtOlxuICAgIHByb2Nlc3MuZW52LlNMQUNLX0JPVF9UT0tFTiAmJiBwcm9jZXNzLmVudi5TTEFDS19DSEFOTkVMX0lEXG4gICAgICA/IHtcbiAgICAgICAgICB0YXJnZXRzOiBbXCJkZXZlbG9wbWVudF9tYXN0ZXJcIiwgXCJwcm9kdWN0aW9uX21hc3RlclwiXSxcbiAgICAgICAgICBib3RUb2tlbjogcHJvY2Vzcy5lbnYuU0xBQ0tfQk9UX1RPS0VOID8/IFwiXCIsXG4gICAgICAgICAgY2hhbm5lbElkOiBwcm9jZXNzLmVudi5TTEFDS19DSEFOTkVMX0lEID8/IFwiXCIsXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkLFxuICB0ZXN0OiB7XG4gICAgcGFyYWxsZWw6IHRydWUsXG4gICAgbWF4V29ya2VyczogNCxcbiAgICBkZXZSdW5uZXI6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICB9LFxuICBsb2dnaW5nOiB7XG4gICAgc2lua3M6IHtcbiAgICAgIGNvbnNvbGU6IGdldENvbnNvbGVTaW5rKHtcbiAgICAgICAgZm9ybWF0dGVyOiBnZXRQcmV0dHlGb3JtYXR0ZXIoe1xuICAgICAgICAgIHRpbWVzdGFtcDogXCJ0aW1lXCIsXG4gICAgICAgICAgY2F0ZWdvcnlXaWR0aDogMjAsXG4gICAgICAgICAgY2F0ZWdvcnlUcnVuY2F0ZTogXCJtaWRkbGVcIixcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICB9LFxuICAgIGxvZ2dlcnM6IFtcbiAgICAgIHtcbiAgICAgICAgY2F0ZWdvcnk6IFtcInNvbmFtdVwiXSxcbiAgICAgICAgc2lua3M6IFtcImNvbnNvbGVcIl0sXG4gICAgICAgIGxvd2VzdExldmVsOiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIgPyBcIndhcm5pbmdcIiA6IFwiZGVidWdcIixcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgc2VydmVyOiB7XG4gICAgbGlzdGVuOiB7IHBvcnQsIGhvc3QgfSxcbiAgICBwbHVnaW5zOiB7XG4gICAgICBmb3JtYm9keTogdHJ1ZSxcbiAgICAgIHFzOiB0cnVlLFxuICAgICAgbXVsdGlwYXJ0OiB7IGxpbWl0czogeyBmaWxlU2l6ZTogMTAyNCAqIDEwMjQgKiAzMCB9IH0sXG4gICAgICBzdGF0aWM6IHtcbiAgICAgICAgcm9vdDogcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLy4uL1wiLCBcInB1YmxpY1wiKSxcbiAgICAgICAgcHJlZml4OiBcIi9hcGkvcHVibGljXCIsXG4gICAgICB9LFxuICAgICAgY3VzdG9tOiAoc2VydmVyKSA9PiB7XG4gICAgICAgIC8vIE9BdXRoIOy9nOuwsSDigJQgQW50aHJvcGlj7J20IC9jYWxsYmFja+ycvOuhnCDrpqzri6TsnbTroIntirhcbiAgICAgICAgc2VydmVyLmdldChcIi9jYWxsYmFja1wiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGNvZGUsIHN0YXRlIH0gPSByZXF1ZXN0LnF1ZXJ5IGFzIHsgY29kZT86IHN0cmluZzsgc3RhdGU/OiBzdHJpbmcgfTtcbiAgICAgICAgICBpZiAoIWNvZGUgfHwgIXN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1taXNzaW5nX3BhcmFtc1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRnJhbWXsnZggb2F1dGhDYWxsYmFja+ycvOuhnCDsnITsnoRcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBRZ3JpZEZyYW1lIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lXCIpO1xuICAgICAgICAgICAgYXdhaXQgUWdyaWRGcmFtZS5oYW5kbGVPQXV0aENhbGxiYWNrKGNvZGUsIHN0YXRlLCByZXBseSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFxuICAgICAgICAgICAgICBgLz9vYXV0aD1lcnJvciZyZWFzb249JHtlbmNvZGVVUklDb21wb25lbnQoKGUgYXMgRXJyb3IpLm1lc3NhZ2UpfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0sXG4gICAgYXBpQ29uZmlnOiB7XG4gICAgICBjb250ZXh0UHJvdmlkZXI6IChkZWZhdWx0Q29udGV4dCwgcmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlZmF1bHRDb250ZXh0LFxuICAgICAgICAgIGlwOiByZXF1ZXN0LmlwLFxuICAgICAgICAgIGJvZHk6IHJlcXVlc3QuYm9keSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBndWFyZEhhbmRsZXI6IChfZ3VhcmQsIF9yZXF1ZXN0LCBfYXBpKSA9PiB7XG4gICAgICAgIGlmIChfZ3VhcmQgPT09IFwidXNlclwiKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ1c2VyIGd1YXJkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTk9USElORyBZRVRcIik7XG4gICAgICB9LFxuICAgICAgY2FjaGVDb250cm9sSGFuZGxlcjogKHJlcSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHJlcS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImFzc2V0c1wiOlxuICAgICAgICAgICAgLy8gSGFzaCDtj6ztlajrkJwg7YyM7J28OiDsmIHqtawg7LqQ7IucXG4gICAgICAgICAgICBpZiAocmVxLnBhdGgubWF0Y2goLy1bYS1mMC05XStcXC4vKSkge1xuICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubG9uZ0xpdmVkO1xuXG4gICAgICAgICAgY2FzZSBcImFwaVwiOlxuICAgICAgICAgICAgLy8gR0VUIOyalOyyreunjCDsupDsi7Eg6rOg66CkXG4gICAgICAgICAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgICAgICAvLyDtirnsoJUg6rK966Gc64qUIOynp+ydgCDsupDsi5xcbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3N0YXRpYy1kYXRhXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zaG9ydExpdmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS90ZXJtc1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubWVkaXVtTGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOq4sOuzuDog7LqQ7IucIOyXhuydjFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuXG4gICAgICAgICAgY2FzZSBcInNzclwiOlxuICAgICAgICAgICAgLy8gU1NSIO2OmOydtOyngDogMTDstIgg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNzcjtcblxuICAgICAgICAgIGNhc2UgXCJjc3JcIjpcbiAgICAgICAgICAgIC8vIENTUiBmYWxsYmFjayAoaW5kZXguaHRtbCk6IDHrtoQg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBzdG9yYWdlOiB7XG4gICAgICBkcml2ZXJzOiB7XG4gICAgICAgIGZzOiBkcml2ZXJzLmZzKHtcbiAgICAgICAgICBsb2NhdGlvbjogcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLy4uL3B1YmxpYy91cGxvYWRlZFwiKSxcbiAgICAgICAgICB2aXNpYmlsaXR5OiBcInB1YmxpY1wiLFxuICAgICAgICAgIHVybEJ1aWxkZXI6IHtcbiAgICAgICAgICAgIGFzeW5jIGdlbmVyYXRlVVJMKGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gYC9hcGkvcHVibGljL3VwbG9hZGVkLyR7a2V5fWA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgZ2VuZXJhdGVTaWduZWRVUkwoa2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiBgL2FwaS9wdWJsaWMvdXBsb2FkZWQvJHtrZXl9YDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICAgIHMzOiBkcml2ZXJzLnMzKHtcbiAgICAgICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICAgICAgYWNjZXNzS2V5SWQ6IHByb2Nlc3MuZW52LkFXU19BQ0NFU1NfS0VZX0lEID8/IFwiXCIsXG4gICAgICAgICAgICBzZWNyZXRBY2Nlc3NLZXk6IHByb2Nlc3MuZW52LkFXU19TRUNSRVRfQUNDRVNTX0tFWSA/PyBcIlwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVnaW9uOiBwcm9jZXNzLmVudi5TM19SRUdJT04gPz8gXCJhcC1ub3J0aGVhc3QtMlwiLFxuICAgICAgICAgIGJ1Y2tldDogcHJvY2Vzcy5lbnYuUzNfQlVDS0VUID8/IFwic29uYW11X2RlZmF1bHRfYnVja2V0XCIsXG4gICAgICAgICAgdmlzaWJpbGl0eTogXCJwcml2YXRlXCIsXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNhY2hlOiB7XG4gICAgICBkZWZhdWx0OiBcIm1haW5cIixcbiAgICAgIHN0b3Jlczoge1xuICAgICAgICBtYWluOiBzdG9yZSgpLnVzZUwxTGF5ZXIoY2FjaGVEcml2ZXJzLm1lbW9yeSh7IG1heFNpemU6IFwiNTBtYlwiIH0pKSxcbiAgICAgIH0sXG4gICAgICB0dGw6IFwiNW1cIixcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICB9LFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25TdGFydDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBEQiDrp4jsnbTqt7jroIjsnbTshZgg7J6Q64+ZIOyLpO2WiSAo7YWM7J2067iUIOyXhuycvOuptCDsg53shLEpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBUb2tlbk1vZGVsIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCIpO1xuICAgICAgICAgIGNvbnN0IGtuZXggPSBUb2tlbk1vZGVsLmdldERCKFwid1wiKTtcbiAgICAgICAgICBjb25zdCBtaWdyYXRpb25zRGlyID0gcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi4vc3JjL21pZ3JhdGlvbnNcIik7XG4gICAgICAgICAgY29uc3QgW2JhdGNoLCBsb2ddID0gYXdhaXQga25leC5taWdyYXRlLmxhdGVzdCh7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IG1pZ3JhdGlvbnNEaXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGxvZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhg4pyTIE1pZ3JhdGlvbjogJHtsb2cubGVuZ3RofSBhcHBsaWVkIChiYXRjaCAke2JhdGNofSlgKTtcbiAgICAgICAgICAgIGxvZy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IGNvbnNvbGUubG9nKGAgIOKckyAke25hbWV9YCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUud2Fybihg4pqgIE1pZ3JhdGlvbiBza2lwcGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUG9vbCDstIjquLDtmZRcbiAgICAgICAgY29uc3QgeyBpbml0UG9vbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9wb29sXCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgVG9rZW5Nb2RlbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi5tb2RlbFwiKTtcbiAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kQWN0aXZlKFwiQVwiKTtcbiAgICAgICAgICBjb25zdCB0b2tlbnMgPSBlbnRyaWVzLm1hcCgoZSkgPT4gZS50b2tlbik7XG4gICAgICAgICAgY29uc3QgcG9vbCA9IGluaXRQb29sKHRva2Vucyk7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBg8J+MsiBTZXJ2ZXIgbGlzdGVuaW5nIG9uIGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH0gKCR7cG9vbC53b3JrZXJzLnNpemV9IHRva2VucyBsb2FkZWQpYCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGDimqAgUG9vbCBpbml0IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgICBpbml0UG9vbChbXSk7XG4gICAgICAgICAgY29uc29sZS5sb2coYPCfjLIgU2VydmVyIGxpc3RlbmluZyBvbiBodHRwOi8vJHtob3N0fToke3BvcnR9IChubyB0b2tlbnMpYCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvblNodXRkb3duOiAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZ3JhY2VmdWwgc2h1dGRvd25cIik7XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKGVycm9yLCBfcmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIHJlcGx5LnN0YXR1cyg1MDApLnNlbmQoe1xuICAgICAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBU0EsT0FBTyxPQUFPLEVBQUUsTUFBTSxLQUFLLEtBQUssT0FBTyxLQUFLLFNBQVMsVUFBVSxFQUFFLENBQUM7QUFFbEUsTUFBTSxPQUFPLFFBQVEsSUFBSSxRQUFRO0FBQ2pDLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBSSxRQUFRLE1BQU07QUFFOUMsSUFBQSx3QkFBZSxhQUFhO0NBQzFCLGFBQWEsUUFBUSxJQUFJLGdCQUFnQjtDQUN6QyxVQUFVO0VBQ1IsTUFBTSxRQUFRLElBQUksaUJBQWlCO0VBQ25DLGdCQUFnQixFQUNkLFlBQVk7R0FDVixNQUFNLFFBQVEsSUFBSSxpQkFBaUI7R0FDbkMsTUFBTSxPQUFPLFFBQVEsSUFBSSxpQkFBaUIsTUFBTTtHQUNoRCxNQUFNLFFBQVEsSUFBSSxpQkFBaUI7R0FDbkMsVUFBVSxRQUFRLElBQUkscUJBQXFCO0dBQzVDLEVBQ0Y7RUFDRCxjQUFjO0dBQ1osWUFBWSxFQUNWLFlBQVk7SUFDVixNQUFNLFFBQVEsSUFBSTtJQUNsQixNQUFNLE9BQU8sUUFBUSxJQUFJLGFBQWE7SUFDdEMsVUFBVSxRQUFRLElBQUk7SUFDdEIsTUFBTSxRQUFRLElBQUk7SUFDbEIsVUFBVSxRQUFRLElBQUk7SUFDdkIsRUFDRjtHQUNELFNBQVMsRUFDUCxZQUFZO0lBQ1YsTUFBTSxRQUFRLElBQUk7SUFDbEIsTUFBTSxPQUFPLFFBQVEsSUFBSSxhQUFhO0lBQ3RDLFVBQVUsUUFBUSxJQUFJO0lBQ3RCLE1BQU0sUUFBUSxJQUFJO0lBQ2xCLFVBQVUsUUFBUSxJQUFJO0lBQ3ZCLEVBQ0Y7R0FDRjtFQUNGO0NBQ0QsS0FBSztFQUNILEtBQUs7RUFDTCxVQUFVO0VBQ1YsT0FBTyxFQUNMLFFBQVEsUUFDVDtFQUNGO0NBQ0QsTUFBTTtFQUNKLGVBQWU7RUFDZixrQkFBa0IsQ0FBQyxNQUFNLEtBQUs7RUFDL0I7Q0FDRCxNQUFNLEVBQ0osU0FBUyxDQUFDLE1BQU0sRUFDakI7Q0FDRCxjQUNFLFFBQVEsSUFBSSxtQkFBbUIsUUFBUSxJQUFJLG1CQUN2QztFQUNFLFNBQVMsQ0FBQyxzQkFBc0Isb0JBQW9CO0VBQ3BELFVBQVUsUUFBUSxJQUFJLG1CQUFtQjtFQUN6QyxXQUFXLFFBQVEsSUFBSSxvQkFBb0I7RUFDNUMsR0FDRDtDQUNOLE1BQU07RUFDSixVQUFVO0VBQ1YsWUFBWTtFQUNaLFdBQVcsRUFBRSxTQUFTLE1BQU07RUFDN0I7Q0FDRCxTQUFTO0VBQ1AsT0FBTyxFQUNMLFNBQVMsZUFBZSxFQUN0QixXQUFXLG1CQUFtQjtHQUM1QixXQUFXO0dBQ1gsZUFBZTtHQUNmLGtCQUFrQjtHQUNuQixDQUFDLEVBQ0gsQ0FBQyxFQUNIO0VBQ0QsU0FBUyxDQUNQO0dBQ0UsVUFBVSxDQUFDLFNBQVM7R0FDcEIsT0FBTyxDQUFDLFVBQVU7R0FDbEIsYUFBYSxRQUFRLElBQUksYUFBYSxTQUFTLFlBQVk7R0FDNUQsQ0FDRjtFQUNGO0NBQ0QsUUFBUTtFQUNOLFFBQVE7R0FBRTtHQUFNO0dBQU07RUFDdEIsU0FBUztHQUNQLFVBQVU7R0FDVixJQUFJO0dBQ0osV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLE9BQU8sT0FBTyxJQUFJLEVBQUU7R0FDckQsUUFBUTtJQUNOLE1BQU0sS0FBSyxLQUFLLE9BQU8sS0FBSyxTQUFTLFFBQVEsU0FBUztJQUN0RCxRQUFRO0lBQ1Q7R0FDRCxTQUFTLFdBQVc7QUFFbEIsV0FBTyxJQUFJLGFBQWEsT0FBTyxTQUFTLFVBQVU7S0FDaEQsTUFBTSxFQUFFLE1BQU0sVUFBVSxRQUFRO0FBQ2hDLFNBQUksQ0FBQyxRQUFRLENBQUMsTUFDWixRQUFPLE1BQU0sU0FBUyxzQ0FBc0M7QUFHOUQsU0FBSTtNQUNGLE1BQU0sRUFBRSxlQUFlLE1BQU0sT0FBTztBQUNwQyxZQUFNLFdBQVcsb0JBQW9CLE1BQU0sT0FBTyxNQUFNO2NBQ2pELEdBQUc7QUFDVixhQUFPLE1BQU0sU0FDWCx3QkFBd0IsbUJBQW9CLEVBQVksUUFBUSxHQUNqRTs7TUFFSDs7R0FFTDtFQUNELFdBQVc7R0FDVCxrQkFBa0IsZ0JBQWdCLFlBQVk7QUFDNUMsV0FBTztLQUNMLEdBQUc7S0FDSCxJQUFJLFFBQVE7S0FDWixNQUFNLFFBQVE7S0FDZjs7R0FFSCxlQUFlLFFBQVEsVUFBVSxTQUFTO0FBQ3hDLFFBQUksV0FBVyxPQUNiLFNBQVEsSUFBSSxhQUFhO0FBRTNCLFlBQVEsSUFBSSxjQUFjOztHQUU1QixzQkFBc0IsUUFBUTtBQUM1QixZQUFRLElBQUksTUFBWjtLQUNFLEtBQUs7QUFFSCxVQUFJLElBQUksS0FBSyxNQUFNLGVBQWUsQ0FDaEMsUUFBTyxhQUFhO0FBRXRCLGFBQU8sYUFBYTtLQUV0QixLQUFLO0FBRUgsVUFBSSxJQUFJLFdBQVcsT0FBTztBQUV4QixXQUFJLElBQUksS0FBSyxXQUFXLG1CQUFtQixDQUN6QyxRQUFPLGFBQWE7QUFFdEIsV0FBSSxJQUFJLEtBQUssV0FBVyxhQUFhLENBQ25DLFFBQU8sYUFBYTs7QUFJeEIsYUFBTyxhQUFhO0tBRXRCLEtBQUssTUFFSCxRQUFPLGFBQWE7S0FFdEIsS0FBSyxNQUVILFFBQU8sYUFBYTs7O0dBRzNCO0VBQ0QsU0FBUyxFQUNQLFNBQVM7R0FDUCxJQUFJQSxVQUFRLEdBQUc7SUFDYixVQUFVLEtBQUssS0FBSyxPQUFPLEtBQUssU0FBUyxzQkFBc0I7SUFDL0QsWUFBWTtJQUNaLFlBQVk7S0FDVixNQUFNLFlBQVksS0FBSztBQUNyQixhQUFPLHdCQUF3Qjs7S0FFakMsTUFBTSxrQkFBa0IsS0FBSztBQUMzQixhQUFPLHdCQUF3Qjs7S0FFbEM7SUFDRixDQUFDO0dBQ0YsSUFBSUEsVUFBUSxHQUFHO0lBQ2IsYUFBYTtLQUNYLGFBQWEsUUFBUSxJQUFJLHFCQUFxQjtLQUM5QyxpQkFBaUIsUUFBUSxJQUFJLHlCQUF5QjtLQUN2RDtJQUNELFFBQVEsUUFBUSxJQUFJLGFBQWE7SUFDakMsUUFBUSxRQUFRLElBQUksYUFBYTtJQUNqQyxZQUFZO0lBQ2IsQ0FBQztHQUNILEVBQ0Y7RUFDRCxPQUFPO0dBQ0wsU0FBUztHQUNULFFBQVEsRUFDTixNQUFNLE9BQU8sQ0FBQyxXQUFXQyxRQUFhLE9BQU8sRUFBRSxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQ25FO0dBQ0QsS0FBSztHQUNMLFFBQVE7R0FDVDtFQUNELFdBQVc7R0FDVCxTQUFTLFlBQVk7QUFFbkIsUUFBSTtLQUNGLE1BQU0sRUFBRSxlQUFlLE1BQU0sT0FBTztLQUNwQyxNQUFNLE9BQU8sV0FBVyxNQUFNLElBQUk7S0FDbEMsTUFBTSxnQkFBZ0IsS0FBSyxLQUFLLE9BQU8sS0FBSyxTQUFTLG9CQUFvQjtLQUN6RSxNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLE9BQU8sRUFDN0MsV0FBVyxlQUNaLENBQUM7QUFDRixTQUFJLElBQUksU0FBUyxHQUFHO0FBQ2xCLGNBQVEsSUFBSSxnQkFBZ0IsSUFBSSxPQUFPLGtCQUFrQixNQUFNLEdBQUc7QUFDbEUsVUFBSSxTQUFTLFNBQWlCLFFBQVEsSUFBSSxPQUFPLE9BQU8sQ0FBQzs7YUFFcEQsR0FBRztBQUNWLGFBQVEsS0FBSyx3QkFBeUIsRUFBWSxVQUFVOztJQUk5RCxNQUFNLEVBQUUsYUFBYSxNQUFNLE9BQU87QUFDbEMsUUFBSTtLQUNGLE1BQU0sRUFBRSxlQUFlLE1BQU0sT0FBTztLQUdwQyxNQUFNLE9BQU8sVUFGRyxNQUFNLFdBQVcsV0FBVyxJQUFJLEVBQ3pCLEtBQUssTUFBTSxFQUFFLE1BQU0sQ0FDYjtBQUM3QixhQUFRLElBQ04saUNBQWlDLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxRQUFRLEtBQUssaUJBQ3JFO2FBQ00sR0FBRztBQUNWLGFBQVEsS0FBSyx1QkFBd0IsRUFBWSxVQUFVO0FBQzNELGNBQVMsRUFBRSxDQUFDO0FBQ1osYUFBUSxJQUFJLGlDQUFpQyxLQUFLLEdBQUcsS0FBSyxjQUFjOzs7R0FHNUUsa0JBQWtCO0FBQ2hCLFlBQVEsSUFBSSxvQkFBb0I7O0dBRWxDLFVBQVUsT0FBTyxVQUFVLFVBQVU7QUFDbkMsWUFBUSxNQUFNLE1BQU07QUFDcEIsVUFBTSxPQUFPLElBQUksQ0FBQyxLQUFLO0tBQ3JCLE1BQU0sTUFBTTtLQUNaLFNBQVMsTUFBTTtLQUNoQixDQUFDOztHQUVMO0VBQ0Y7Q0FDRixDQUFDIn0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { createFixtureLoader } from "sonamu/test";
|
|
3
|
+
//#region src/testing/fixture.ts
|
|
4
|
+
const loadFixtures = createFixtureLoader({ fixture01: async () => {} });
|
|
5
|
+
//#endregion
|
|
6
|
+
export { loadFixtures };
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9maXh0dXJlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUZpeHR1cmVMb2FkZXIgfSBmcm9tIFwic29uYW11L3Rlc3RcIjtcblxuZXhwb3J0IGNvbnN0IGxvYWRGaXh0dXJlcyA9IGNyZWF0ZUZpeHR1cmVMb2FkZXIoe1xuICAvLyBEZWZpbmUgeW91ciBmaXh0dXJlcy4uLlxuICBmaXh0dXJlMDE6IGFzeW5jICgpID0+IHt9LFxufSk7XG4iXSwibWFwcGluZ3MiOiI7OztBQUVBLE1BQWEsZUFBZSxvQkFBb0IsRUFFOUMsV0FBVyxZQUFZLElBQ3hCLENBQUMifQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import dotenv from "dotenv";
|
|
3
|
+
import { setup } from "sonamu/test";
|
|
4
|
+
//#region src/testing/global.ts
|
|
5
|
+
dotenv.config();
|
|
6
|
+
//#endregion
|
|
7
|
+
export { setup };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2dsb2JhbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcblxuZG90ZW52LmNvbmZpZygpO1xuXG4vLyBzb25hbXUuY29uZmlnLnRz7J2YIHRlc3Qg7ISk7KCV7J2EIOq4sOuwmOycvOuhnCDrs5HroKwg7YWM7Iqk7Yq4IO2ZmOqyveydhCDqtazshLHtlanri4jri6QuXG5leHBvcnQgeyBzZXR1cCB9IGZyb20gXCJzb25hbXUvdGVzdFwiO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBRUEsT0FBTyxRQUFRIn0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { vi } from "../node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/test.p_J6dB8a.js";
|
|
3
|
+
import "../node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/index.js";
|
|
4
|
+
//#region src/testing/setup-mocks.ts
|
|
5
|
+
vi.mock("fs/promises", async (importOriginal) => {
|
|
6
|
+
const actual = await importOriginal();
|
|
7
|
+
return {
|
|
8
|
+
...actual,
|
|
9
|
+
access: vi.fn((path, mode) => {
|
|
10
|
+
return actual.access(path, mode);
|
|
11
|
+
})
|
|
12
|
+
};
|
|
13
|
+
});
|
|
14
|
+
//#endregion
|
|
15
|
+
export {};
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtbW9ja3MuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3Rpbmcvc2V0dXAtbW9ja3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQYXRoTGlrZSB9IGZyb20gXCJmc1wiO1xuXG4vLyBpbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IHZpIH0gZnJvbSBcInZpdGVzdFwiO1xuXG4vLyBHbG9iYWxNb2NrOiBmcy9wcm9taXNlcyAo7IKs7JqpIOyYiOyLnCAtIO2VhOyalOyLnCDtmZzshLHtmZQpXG52aS5tb2NrKFwiZnMvcHJvbWlzZXNcIiwgYXN5bmMgKGltcG9ydE9yaWdpbmFsKSA9PiB7XG4gIGNvbnN0IGFjdHVhbCA9IChhd2FpdCBpbXBvcnRPcmlnaW5hbCgpKSBhcyB0eXBlb2YgaW1wb3J0KFwiZnMvcHJvbWlzZXNcIik7XG4gIHJldHVybiB7XG4gICAgLi4uYWN0dWFsLFxuICAgIGFjY2VzczogdmkuZm4oKHBhdGg6IFBhdGhMaWtlLCBtb2RlPzogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBjb25zdCB2ZnMgPSBOYWl0ZS5nZXQoXCJtb2NrOmZzL3Byb21pc2VzOnZpcnR1YWxGaWxlU3lzdGVtXCIpLnJlc3VsdCgpO1xuICAgICAgLy8gaWYgKHZmcy5zb21lKCh2KSA9PiB2ID09PSBwYXRoKSkge1xuICAgICAgLy8gICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAvLyB9XG5cbiAgICAgIHJldHVybiBhY3R1YWwuYWNjZXNzKHBhdGgsIG1vZGUpO1xuICAgIH0pLFxuICAgIC8vIG1rZGlyOiB2aS5mbihcbiAgICAvLyAgIGFzeW5jIChcbiAgICAvLyAgICAgcGF0aDogUGF0aExpa2UsXG4gICAgLy8gICAgIG9wdGlvbnM/OiBNYWtlRGlyZWN0b3J5T3B0aW9ucyB8IE1vZGUgfCBudWxsLFxuICAgIC8vICAgKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAvLyAgICAgLy8gTmFpdGUudChcImZzOm1rZGlyXCIsIHsgcGF0aCwgb3B0aW9ucyB9KTtcbiAgICAvLyAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcIm9iamVjdFwiICYmIG9wdGlvbnM/LnJlY3Vyc2l2ZSkge1xuICAgIC8vICAgICAgIHJldHVybiB0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiA/IHBhdGggOiBwYXRoLnRvU3RyaW5nKCk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAvLyAgIH0sXG4gICAgLy8gKSxcbiAgICAvLyB3cml0ZUZpbGU6IHZpLmZuKChwYXRoOiBQYXRoTGlrZSB8IEZpbGVIYW5kbGUsIGRhdGE6IHN0cmluZyB8IEJ1ZmZlciB8IFVpbnQ4QXJyYXkpID0+IHtcbiAgICAvLyAgIGNvbnN0IGZpbGVQYXRoID0gdHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIgPyBwYXRoIDogcGF0aC50b1N0cmluZygpO1xuXG4gICAgLy8gICAvLyBOYWl0ZS50KGBmcy9wcm9taXNlczp3cml0ZUZpbGVgLCB7IHBhdGg6IGZpbGVQYXRoLCBkYXRhIH0pO1xuICAgIC8vIH0pLFxuICAgIC8vIHJtOiB2aS5mbihhc3luYyAocGF0aDogUGF0aExpa2UsIG9wdGlvbnM/OiBSbU9wdGlvbnMpID0+IHtcbiAgICAvLyAgIGNvbnN0IGZpbGVQYXRoID0gdHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIgPyBwYXRoIDogcGF0aC50b1N0cmluZygpO1xuXG4gICAgLy8gICAvLyBOYWl0ZS50KGBmcy9wcm9taXNlczpybWAsIHsgcGF0aDogZmlsZVBhdGgsIG9wdGlvbnMgfSk7XG4gICAgLy8gICAvLyDsi6TsoJwg7IKt7KCc7ZWY7KeAIOyViuqzoCDquLDroZ3rp4wg7ZWoXG4gICAgLy8gICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgLy8gfSksXG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQU1BLEdBQUcsS0FBSyxlQUFlLE9BQU8sbUJBQW1CO0NBQy9DLE1BQU0sU0FBVSxNQUFNLGdCQUFnQjtBQUN0QyxRQUFPO0VBQ0wsR0FBRztFQUNILFFBQVEsR0FBRyxJQUFJLE1BQWdCLFNBQWtCO0FBTS9DLFVBQU8sT0FBTyxPQUFPLE1BQU0sS0FBSztJQUNoQztFQXlCSDtFQUNEIn0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
//#region src/utils/subset-loaders.ts
|
|
3
|
+
function getSubsetLoaders(subsets, subsetQueries) {
|
|
4
|
+
return subsets.reduce((acc, subset) => {
|
|
5
|
+
acc[subset] = subsetQueries[subset]?.loaders ?? [];
|
|
6
|
+
return acc;
|
|
7
|
+
}, {});
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { getSubsetLoaders };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2V0LWxvYWRlcnMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3N1YnNldC1sb2FkZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3Vic2V0UXVlcnkgfSBmcm9tIFwic29uYW11XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWJzZXRMb2FkZXJzKHN1YnNldHM6IHN0cmluZ1tdLCBzdWJzZXRRdWVyaWVzOiBSZWNvcmQ8c3RyaW5nLCBTdWJzZXRRdWVyeT4pIHtcbiAgcmV0dXJuIHN1YnNldHMucmVkdWNlKFxuICAgIChhY2MsIHN1YnNldCkgPT4ge1xuICAgICAgYWNjW3N1YnNldF0gPSBzdWJzZXRRdWVyaWVzW3N1YnNldF0/LmxvYWRlcnMgPz8gW107XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sXG4gICAge30gYXMgUmVjb3JkPHN0cmluZywgU3Vic2V0UXVlcnlbXCJsb2FkZXJzXCJdPixcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFFQSxTQUFnQixpQkFBaUIsU0FBbUIsZUFBNEM7QUFDOUYsUUFBTyxRQUFRLFFBQ1osS0FBSyxXQUFXO0FBQ2YsTUFBSSxVQUFVLGNBQWMsU0FBUyxXQUFXLEVBQUU7QUFDbEQsU0FBTztJQUVULEVBQUUsQ0FDSCJ9
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "RequestLog",
|
|
3
|
+
"table": "request_logs",
|
|
4
|
+
"title": "RequestLog",
|
|
5
|
+
"cone": {
|
|
6
|
+
"note": "RequestLog 엔티티. 테스트 데이터 생성 시 각 필드는 실제 데이터와 유사한 형식으로 생성됩니다."
|
|
7
|
+
},
|
|
8
|
+
"props": [
|
|
9
|
+
{
|
|
10
|
+
"name": "id",
|
|
11
|
+
"type": "integer",
|
|
12
|
+
"desc": "ID",
|
|
13
|
+
"cone": {
|
|
14
|
+
"note": "정수 형식으로 생성됩니다.",
|
|
15
|
+
"fixtureGenerator": "faker.number.int({ \"min\": 1, \"max\": 1000 })"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "created_at",
|
|
20
|
+
"type": "date",
|
|
21
|
+
"desc": "등록일시",
|
|
22
|
+
"dbDefault": "CURRENT_TIMESTAMP",
|
|
23
|
+
"cone": { "note": "날짜 형식으로 생성됩니다.", "fixtureGenerator": "faker.date.past()" }
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"name": "token_name",
|
|
27
|
+
"toFilter": true,
|
|
28
|
+
"desc": "토큰 이름",
|
|
29
|
+
"type": "string",
|
|
30
|
+
"length": 100
|
|
31
|
+
},
|
|
32
|
+
{ "name": "query", "type": "string", "desc": "prompt 전문" },
|
|
33
|
+
{ "name": "response", "desc": "llm 응답 전문", "type": "string" },
|
|
34
|
+
{ "name": "input_tokens", "type": "integer", "desc": "입력 토큰" },
|
|
35
|
+
{ "name": "output_tokens", "type": "integer", "desc": "출력 토큰" },
|
|
36
|
+
{ "name": "cache_read_tokens", "type": "integer", "desc": "캐시 읽기 토큰" },
|
|
37
|
+
{ "name": "cache_creation_tokens", "type": "integer", "desc": "캐시 생성 토큰" },
|
|
38
|
+
{ "name": "duration_ms", "type": "integer", "desc": "응답 소요시간(ms)" }
|
|
39
|
+
],
|
|
40
|
+
"indexes": [],
|
|
41
|
+
"subsets": {
|
|
42
|
+
"A": {
|
|
43
|
+
"fields": [
|
|
44
|
+
"id",
|
|
45
|
+
"created_at",
|
|
46
|
+
"token_name",
|
|
47
|
+
"query",
|
|
48
|
+
"response",
|
|
49
|
+
"input_tokens",
|
|
50
|
+
"output_tokens",
|
|
51
|
+
"cache_read_tokens",
|
|
52
|
+
"cache_creation_tokens",
|
|
53
|
+
"duration_ms"
|
|
54
|
+
],
|
|
55
|
+
"cone": { "note": "전체 필드 서브셋" }
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"enums": {
|
|
59
|
+
"RequestLogOrderBy": {
|
|
60
|
+
"values": { "id-desc": "ID최신순" },
|
|
61
|
+
"cone": { "note": "가능한 값: id-desc", "values": { "id-desc": { "note": "ID최신순" } } }
|
|
62
|
+
},
|
|
63
|
+
"RequestLogSearchField": {
|
|
64
|
+
"values": { "id": "ID", "token_name": "토큰이름", "query": "쿼리" },
|
|
65
|
+
"cone": {
|
|
66
|
+
"note": "가능한 값: id, token_name, query",
|
|
67
|
+
"values": {
|
|
68
|
+
"id": { "note": "ID" },
|
|
69
|
+
"token_name": { "note": "토큰이름" },
|
|
70
|
+
"query": { "note": "쿼리" }
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "Token",
|
|
3
|
+
"table": "tokens",
|
|
4
|
+
"title": "Token",
|
|
5
|
+
"props": [
|
|
6
|
+
{ "name": "id", "type": "integer", "desc": "ID" },
|
|
7
|
+
{ "name": "created_at", "type": "date", "desc": "등록일시", "dbDefault": "CURRENT_TIMESTAMP" },
|
|
8
|
+
{ "name": "token", "toFilter": true, "desc": "access_token", "type": "string" },
|
|
9
|
+
{ "name": "name", "desc": "토큰 이름", "type": "string" },
|
|
10
|
+
{ "name": "refresh_token", "type": "string", "nullable": true, "desc": "refresh_token" },
|
|
11
|
+
{
|
|
12
|
+
"name": "expires_at",
|
|
13
|
+
"type": "bigInteger",
|
|
14
|
+
"nullable": true,
|
|
15
|
+
"desc": "만료 시각 (epoch ms)"
|
|
16
|
+
},
|
|
17
|
+
{ "name": "account_uuid", "type": "string", "nullable": true, "desc": "Anthropic 계정 UUID" },
|
|
18
|
+
{ "name": "active", "type": "boolean", "desc": "활성 여부", "dbDefault": "true" }
|
|
19
|
+
],
|
|
20
|
+
"indexes": [],
|
|
21
|
+
"subsets": {
|
|
22
|
+
"A": [
|
|
23
|
+
"id",
|
|
24
|
+
"created_at",
|
|
25
|
+
"token",
|
|
26
|
+
"name",
|
|
27
|
+
"refresh_token",
|
|
28
|
+
"expires_at",
|
|
29
|
+
"account_uuid",
|
|
30
|
+
"active"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
"enums": {
|
|
34
|
+
"TokenOrderBy": { "id-desc": "ID최신순" },
|
|
35
|
+
"TokenSearchField": { "id": "ID", "name": "이름" }
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Knex } from "knex";
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
await knex.schema.createTable("request_logs", (table) => {
|
|
5
|
+
table.increments().primary();
|
|
6
|
+
table
|
|
7
|
+
.timestamp("created_at", { useTz: true, precision: 3 })
|
|
8
|
+
.notNullable()
|
|
9
|
+
.defaultTo(knex.raw("CURRENT_TIMESTAMP"));
|
|
10
|
+
table.string("token_name", 100).notNullable();
|
|
11
|
+
table.text("query").notNullable();
|
|
12
|
+
table.text("response").notNullable();
|
|
13
|
+
table.integer("input_tokens").notNullable();
|
|
14
|
+
table.integer("output_tokens").notNullable();
|
|
15
|
+
table.integer("cache_read_tokens").notNullable();
|
|
16
|
+
table.integer("cache_creation_tokens").notNullable();
|
|
17
|
+
table.integer("duration_ms").notNullable();
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export async function down(knex: Knex): Promise<void> {
|
|
22
|
+
return knex.schema.dropTable("request_logs");
|
|
23
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Knex } from "knex";
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
await knex.schema.createTable("tokens", (table) => {
|
|
5
|
+
table.increments().primary();
|
|
6
|
+
table
|
|
7
|
+
.timestamp("created_at", { useTz: true, precision: 3 })
|
|
8
|
+
.notNullable()
|
|
9
|
+
.defaultTo(knex.raw("CURRENT_TIMESTAMP"));
|
|
10
|
+
table.text("token").notNullable();
|
|
11
|
+
table.text("name").nullable();
|
|
12
|
+
table.text("refresh_token").nullable();
|
|
13
|
+
table.bigInteger("expires_at").nullable();
|
|
14
|
+
table.text("account_uuid").nullable();
|
|
15
|
+
table.boolean("active").notNullable().defaultTo(knex.raw("true"));
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function down(knex: Knex): Promise<void> {
|
|
20
|
+
return knex.schema.dropTable("tokens");
|
|
21
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Knex } from "knex";
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
await knex.schema.alterTable("tokens", (table) => {
|
|
5
|
+
// alter column
|
|
6
|
+
table.text("name").notNullable().alter();
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export async function down(knex: Knex): Promise<void> {
|
|
11
|
+
await knex.schema.alterTable("tokens", (table) => {
|
|
12
|
+
// rollback - alter column
|
|
13
|
+
table.text("name").nullable().alter();
|
|
14
|
+
});
|
|
15
|
+
}
|