@subql/node 6.4.1-0 → 6.4.4-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -1
- package/dist/.tsbuildinfo +1 -0
- package/dist/app.module.d.ts +2 -0
- package/dist/app.module.js +42 -0
- package/dist/app.module.js.map +1 -0
- package/dist/blockchain.service.d.ts +31 -0
- package/dist/blockchain.service.js +146 -0
- package/dist/blockchain.service.js.map +1 -0
- package/dist/configure/NodeConfig.d.ts +19 -0
- package/dist/configure/NodeConfig.js +28 -0
- package/dist/configure/NodeConfig.js.map +1 -0
- package/dist/configure/SubqueryProject.d.ts +13 -0
- package/dist/configure/SubqueryProject.js +29 -0
- package/dist/configure/SubqueryProject.js.map +1 -0
- package/dist/configure/configure.module.d.ts +11 -0
- package/dist/configure/configure.module.js +63 -0
- package/dist/configure/configure.module.js.map +1 -0
- package/dist/indexer/api.service.d.ts +36 -0
- package/dist/indexer/api.service.js +315 -0
- package/dist/indexer/api.service.js.map +1 -0
- package/dist/indexer/apiPromise.connection.d.ts +24 -0
- package/dist/indexer/apiPromise.connection.js +106 -0
- package/dist/indexer/apiPromise.connection.js.map +1 -0
- package/dist/indexer/dictionary/index.d.ts +2 -0
- package/dist/indexer/dictionary/index.js +21 -0
- package/dist/indexer/dictionary/index.js.map +1 -0
- package/dist/indexer/dictionary/substrateDictionary.service.d.ts +13 -0
- package/dist/indexer/dictionary/substrateDictionary.service.js +93 -0
- package/dist/indexer/dictionary/substrateDictionary.service.js.map +1 -0
- package/dist/indexer/dictionary/types.d.ts +10 -0
- package/dist/indexer/dictionary/types.js +5 -0
- package/dist/indexer/dictionary/types.js.map +1 -0
- package/dist/indexer/dictionary/v1/index.d.ts +1 -0
- package/dist/indexer/dictionary/v1/index.js +20 -0
- package/dist/indexer/dictionary/v1/index.js.map +1 -0
- package/dist/indexer/dictionary/v1/substrateDictionaryV1.d.ts +19 -0
- package/dist/indexer/dictionary/v1/substrateDictionaryV1.js +223 -0
- package/dist/indexer/dictionary/v1/substrateDictionaryV1.js.map +1 -0
- package/dist/indexer/dictionary/v2/index.d.ts +2 -0
- package/dist/indexer/dictionary/v2/index.js +21 -0
- package/dist/indexer/dictionary/v2/index.js.map +1 -0
- package/dist/indexer/dictionary/v2/substrateDictionaryV2.d.ts +20 -0
- package/dist/indexer/dictionary/v2/substrateDictionaryV2.js +46 -0
- package/dist/indexer/dictionary/v2/substrateDictionaryV2.js.map +1 -0
- package/dist/indexer/dictionary/v2/types.d.ts +5 -0
- package/dist/indexer/dictionary/v2/types.js +5 -0
- package/dist/indexer/dictionary/v2/types.js.map +1 -0
- package/dist/indexer/fetch.module.d.ts +2 -0
- package/dist/indexer/fetch.module.js +94 -0
- package/dist/indexer/fetch.module.js.map +1 -0
- package/dist/indexer/indexer.manager.d.ts +27 -0
- package/dist/indexer/indexer.manager.js +153 -0
- package/dist/indexer/indexer.manager.js.map +1 -0
- package/dist/indexer/runtime/base-runtime.service.d.ts +24 -0
- package/dist/indexer/runtime/base-runtime.service.js +136 -0
- package/dist/indexer/runtime/base-runtime.service.js.map +1 -0
- package/dist/indexer/runtime/runtimeService.d.ts +15 -0
- package/dist/indexer/runtime/runtimeService.js +94 -0
- package/dist/indexer/runtime/runtimeService.js.map +1 -0
- package/dist/indexer/runtime/workerRuntimeService.d.ts +9 -0
- package/dist/indexer/runtime/workerRuntimeService.js +43 -0
- package/dist/indexer/runtime/workerRuntimeService.js.map +1 -0
- package/dist/indexer/types.d.ts +20 -0
- package/dist/indexer/types.js +13 -0
- package/dist/indexer/types.js.map +1 -0
- package/dist/indexer/worker/worker-fetch.module.d.ts +5 -0
- package/dist/indexer/worker/worker-fetch.module.js +60 -0
- package/dist/indexer/worker/worker-fetch.module.js.map +1 -0
- package/dist/indexer/worker/worker.d.ts +9 -0
- package/dist/indexer/worker/worker.js +48 -0
- package/dist/indexer/worker/worker.js.map +1 -0
- package/dist/indexer/worker/worker.module.d.ts +2 -0
- package/dist/indexer/worker/worker.module.js +33 -0
- package/dist/indexer/worker/worker.module.js.map +1 -0
- package/dist/indexer/worker/worker.service.d.ts +26 -0
- package/dist/indexer/worker/worker.service.js +71 -0
- package/dist/indexer/worker/worker.service.js.map +1 -0
- package/dist/indexer/x-provider/cachedProvider.d.ts +2 -0
- package/dist/indexer/x-provider/cachedProvider.js +40 -0
- package/dist/indexer/x-provider/cachedProvider.js.map +1 -0
- package/dist/indexer/x-provider/http.d.ts +75 -0
- package/dist/indexer/x-provider/http.js +198 -0
- package/dist/indexer/x-provider/http.js.map +1 -0
- package/dist/init.d.ts +1 -0
- package/dist/init.js +41 -0
- package/dist/init.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +19 -0
- package/dist/main.js.map +1 -0
- package/dist/subcommands/forceClean.init.d.ts +1 -0
- package/dist/subcommands/forceClean.init.js +10 -0
- package/dist/subcommands/forceClean.init.js.map +1 -0
- package/dist/subcommands/forceClean.module.d.ts +2 -0
- package/dist/subcommands/forceClean.module.js +28 -0
- package/dist/subcommands/forceClean.module.js.map +1 -0
- package/dist/subcommands/reindex.init.d.ts +3 -0
- package/dist/subcommands/reindex.init.js +33 -0
- package/dist/subcommands/reindex.init.js.map +1 -0
- package/dist/subcommands/reindex.module.d.ts +2 -0
- package/dist/subcommands/reindex.module.js +69 -0
- package/dist/subcommands/reindex.module.js.map +1 -0
- package/dist/subcommands/testing.init.d.ts +1 -0
- package/dist/subcommands/testing.init.js +21 -0
- package/dist/subcommands/testing.init.js.map +1 -0
- package/dist/subcommands/testing.module.d.ts +2 -0
- package/dist/subcommands/testing.module.js +65 -0
- package/dist/subcommands/testing.module.js.map +1 -0
- package/dist/subcommands/testing.service.d.ts +14 -0
- package/dist/subcommands/testing.service.js +60 -0
- package/dist/subcommands/testing.service.js.map +1 -0
- package/dist/utils/project.d.ts +9 -0
- package/dist/utils/project.js +116 -0
- package/dist/utils/project.js.map +1 -0
- package/dist/utils/substrate.d.ts +41 -0
- package/dist/utils/substrate.js +348 -0
- package/dist/utils/substrate.js.map +1 -0
- package/dist/utils/test.utils.d.ts +2 -0
- package/dist/utils/test.utils.js +70 -0
- package/dist/utils/test.utils.js.map +1 -0
- package/dist/yargs.d.ts +276 -0
- package/dist/yargs.js +27 -0
- package/dist/yargs.js.map +1 -0
- package/package.json +5 -5
package/dist/init.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: GPL-3.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.bootstrap = bootstrap;
|
|
6
|
+
const core_1 = require("@nestjs/core");
|
|
7
|
+
const common_1 = require("@subql/common");
|
|
8
|
+
const node_core_1 = require("@subql/node-core");
|
|
9
|
+
const app_module_1 = require("./app.module");
|
|
10
|
+
const yargs_1 = require("./yargs");
|
|
11
|
+
const pjson = require('../package.json');
|
|
12
|
+
const { argv } = yargs_1.yargsOptions;
|
|
13
|
+
const logger = (0, node_core_1.getLogger)('subql-node');
|
|
14
|
+
(0, common_1.notifyUpdates)(pjson, logger);
|
|
15
|
+
async function bootstrap() {
|
|
16
|
+
const port = await (0, node_core_1.getValidPort)(argv.port);
|
|
17
|
+
try {
|
|
18
|
+
const app = await core_1.NestFactory.create(app_module_1.AppModule, {
|
|
19
|
+
logger: new node_core_1.NestLogger(!!argv.debug),
|
|
20
|
+
});
|
|
21
|
+
await app.init();
|
|
22
|
+
const projectService = app.get('IProjectService');
|
|
23
|
+
const fetchService = app.get(node_core_1.FetchService);
|
|
24
|
+
const runtimeService = app.get('RuntimeService');
|
|
25
|
+
const dictionaryService = app.get(node_core_1.DictionaryService);
|
|
26
|
+
const blockchainService = app.get('IBlockchainService');
|
|
27
|
+
// Initialise async services, we do this here rather than in factories, so we can capture one off events
|
|
28
|
+
await projectService.init();
|
|
29
|
+
const startHeight = projectService.startHeight;
|
|
30
|
+
const { blockHeight: finalizedHeight } = await blockchainService.getFinalizedHeader();
|
|
31
|
+
await runtimeService.init(startHeight, finalizedHeight, dictionaryService);
|
|
32
|
+
await fetchService.init(startHeight);
|
|
33
|
+
app.enableShutdownHooks();
|
|
34
|
+
await app.listen(port);
|
|
35
|
+
logger.info(`Node started on port: ${port}`);
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
(0, node_core_1.exitWithError)(new Error(`Node failed to start`, { cause: e }), logger);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AA2BnC,8BAiCC;AA1DD,uCAA2C;AAC3C,0CAA8C;AAC9C,gDAS0B;AAC1B,6CAAyC;AAGzC,mCAAuC;AAEvC,MAAM,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEzC,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;AAE9B,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,YAAY,CAAC,CAAC;AAEvC,IAAA,sBAAa,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAEtB,KAAK,UAAU,SAAS;IAC7B,MAAM,IAAI,GAAG,MAAM,IAAA,wBAAY,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,EAAE;YAC9C,MAAM,EAAE,IAAI,sBAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;SACrC,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,cAAc,GAAmB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,wBAAY,CAAC,CAAC;QAC3C,MAAM,cAAc,GAAmB,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACjE,MAAM,iBAAiB,GACrB,GAAG,CAAC,GAAG,CAAC,6BAAiB,CAAC,CAAC;QAC7B,MAAM,iBAAiB,GAAuB,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAE5E,wGAAwG;QACxG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAE5B,MAAM,WAAW,GAAG,cAAc,CAAC,WAAW,CAAC;QAC/C,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,GACpC,MAAM,iBAAiB,CAAC,kBAAkB,EAAE,CAAC;QAC/C,MAAM,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAC;QAC3E,MAAM,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAErC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAE1B,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvB,MAAM,CAAC,IAAI,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAA,yBAAa,EAAC,IAAI,KAAK,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;AACH,CAAC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { NestFactory } from '@nestjs/core';\nimport { notifyUpdates } from '@subql/common';\nimport {\n exitWithError,\n getLogger,\n getValidPort,\n IBlockchainService,\n NestLogger,\n ProjectService,\n FetchService,\n DictionaryService,\n} from '@subql/node-core';\nimport { AppModule } from './app.module';\nimport { SubstrateDictionaryService } from './indexer/dictionary';\nimport { RuntimeService } from './indexer/runtime/runtimeService';\nimport { yargsOptions } from './yargs';\n\nconst pjson = require('../package.json');\n\nconst { argv } = yargsOptions;\n\nconst logger = getLogger('subql-node');\n\nnotifyUpdates(pjson, logger);\n\nexport async function bootstrap(): Promise<void> {\n const port = await getValidPort(argv.port);\n\n try {\n const app = await NestFactory.create(AppModule, {\n logger: new NestLogger(!!argv.debug),\n });\n await app.init();\n\n const projectService: ProjectService = app.get('IProjectService');\n const fetchService = app.get(FetchService);\n const runtimeService: RuntimeService = app.get('RuntimeService');\n const dictionaryService: SubstrateDictionaryService =\n app.get(DictionaryService);\n const blockchainService: IBlockchainService = app.get('IBlockchainService');\n\n // Initialise async services, we do this here rather than in factories, so we can capture one off events\n await projectService.init();\n\n const startHeight = projectService.startHeight;\n const { blockHeight: finalizedHeight } =\n await blockchainService.getFinalizedHeader();\n await runtimeService.init(startHeight, finalizedHeight, dictionaryService);\n await fetchService.init(startHeight);\n\n app.enableShutdownHooks();\n\n await app.listen(port);\n\n logger.info(`Node started on port: ${port}`);\n } catch (e) {\n exitWithError(new Error(`Node failed to start`, { cause: e }), logger);\n }\n}\n"]}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: GPL-3.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
const logger_1 = require("@subql/node-core/logger");
|
|
6
|
+
const yargs_1 = require("./yargs");
|
|
7
|
+
const { argv } = yargs_1.yargsOptions;
|
|
8
|
+
// initLogger is imported from true path, to make sure getLogger (or other logger values that relies on logger) isn't initialised
|
|
9
|
+
(0, logger_1.initLogger)(argv.debug, argv.outputFmt, argv.logLevel);
|
|
10
|
+
const { setProfiler } = require('@subql/node-core');
|
|
11
|
+
setProfiler(argv.profiler);
|
|
12
|
+
// Check for no subcommand
|
|
13
|
+
if (!argv._[0]) {
|
|
14
|
+
// Lazy import, to allow logger to be initialised before bootstrap()
|
|
15
|
+
// As bootstrap runs services that requires logger
|
|
16
|
+
const { bootstrap } = require('./init');
|
|
17
|
+
void bootstrap();
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,oDAAqD;AACrD,mCAAuC;AAEvC,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;AAE9B,iIAAiI;AACjI,IAAA,mBAAU,EACR,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,SAA+B,EACpC,IAAI,CAAC,QAA8B,CACpC,CAAC;AAEF,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;AACpD,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAE3B,0BAA0B;AAC1B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACf,oEAAoE;IACpE,kDAAkD;IAClD,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,KAAK,SAAS,EAAE,CAAC;AACnB,CAAC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { initLogger } from '@subql/node-core/logger';\nimport { yargsOptions } from './yargs';\n\nconst { argv } = yargsOptions;\n\n// initLogger is imported from true path, to make sure getLogger (or other logger values that relies on logger) isn't initialised\ninitLogger(\n argv.debug,\n argv.outputFmt as 'json' | 'colored',\n argv.logLevel as string | undefined,\n);\n\nconst { setProfiler } = require('@subql/node-core');\nsetProfiler(argv.profiler);\n\n// Check for no subcommand\nif (!argv._[0]) {\n // Lazy import, to allow logger to be initialised before bootstrap()\n // As bootstrap runs services that requires logger\n const { bootstrap } = require('./init');\n void bootstrap();\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const forceCleanInit: () => Promise<void>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: GPL-3.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.forceCleanInit = void 0;
|
|
6
|
+
const node_core_1 = require("@subql/node-core");
|
|
7
|
+
const forceClean_module_1 = require("./forceClean.module");
|
|
8
|
+
const forceCleanInit = () => (0, node_core_1.forceClean)(forceClean_module_1.ForceCleanModule);
|
|
9
|
+
exports.forceCleanInit = forceCleanInit;
|
|
10
|
+
//# sourceMappingURL=forceClean.init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forceClean.init.js","sourceRoot":"","sources":["../../src/subcommands/forceClean.init.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAEnC,gDAA8C;AAC9C,2DAAuD;AAEhD,MAAM,cAAc,GAAG,GAAkB,EAAE,CAAC,IAAA,sBAAU,EAAC,oCAAgB,CAAC,CAAC;AAAnE,QAAA,cAAc,kBAAqD","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { forceClean } from '@subql/node-core';\nimport { ForceCleanModule } from './forceClean.module';\n\nexport const forceCleanInit = (): Promise<void> => forceClean(ForceCleanModule);\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: GPL-3.0
|
|
4
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
5
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
6
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
7
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
8
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.ForceCleanModule = void 0;
|
|
12
|
+
const common_1 = require("@nestjs/common");
|
|
13
|
+
const node_core_1 = require("@subql/node-core");
|
|
14
|
+
const configure_module_1 = require("../configure/configure.module");
|
|
15
|
+
let ForceCleanModule = class ForceCleanModule {
|
|
16
|
+
};
|
|
17
|
+
exports.ForceCleanModule = ForceCleanModule;
|
|
18
|
+
exports.ForceCleanModule = ForceCleanModule = __decorate([
|
|
19
|
+
(0, common_1.Module)({
|
|
20
|
+
imports: [
|
|
21
|
+
node_core_1.DbModule.forRoot(),
|
|
22
|
+
configure_module_1.ConfigureModule.register(),
|
|
23
|
+
node_core_1.ForceCleanFeatureModule,
|
|
24
|
+
],
|
|
25
|
+
controllers: [],
|
|
26
|
+
})
|
|
27
|
+
], ForceCleanModule);
|
|
28
|
+
//# sourceMappingURL=forceClean.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forceClean.module.js","sourceRoot":"","sources":["../../src/subcommands/forceClean.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,gDAAqE;AACrE,oEAAgE;AAUzD,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAAG,CAAA;AAAnB,4CAAgB;2BAAhB,gBAAgB;IAR5B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAe,CAAC,QAAQ,EAAE;YAC1B,mCAAuB;SACxB;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,gBAAgB,CAAG","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { DbModule, ForceCleanFeatureModule } from '@subql/node-core';\nimport { ConfigureModule } from '../configure/configure.module';\n\n@Module({\n imports: [\n DbModule.forRoot(),\n ConfigureModule.register(),\n ForceCleanFeatureModule,\n ],\n controllers: [],\n})\nexport class ForceCleanModule {}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: GPL-3.0
|
|
4
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
5
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
6
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
7
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
8
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.reindexInit = exports.ReindexModule = void 0;
|
|
12
|
+
const common_1 = require("@nestjs/common");
|
|
13
|
+
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
14
|
+
const node_core_1 = require("@subql/node-core");
|
|
15
|
+
const configure_module_1 = require("../configure/configure.module");
|
|
16
|
+
const reindex_module_1 = require("./reindex.module");
|
|
17
|
+
let ReindexModule = class ReindexModule {
|
|
18
|
+
};
|
|
19
|
+
exports.ReindexModule = ReindexModule;
|
|
20
|
+
exports.ReindexModule = ReindexModule = __decorate([
|
|
21
|
+
(0, common_1.Module)({
|
|
22
|
+
imports: [
|
|
23
|
+
node_core_1.DbModule.forRoot(),
|
|
24
|
+
configure_module_1.ConfigureModule.register(),
|
|
25
|
+
reindex_module_1.ReindexFeatureModule,
|
|
26
|
+
event_emitter_1.EventEmitterModule.forRoot(),
|
|
27
|
+
],
|
|
28
|
+
controllers: [],
|
|
29
|
+
})
|
|
30
|
+
], ReindexModule);
|
|
31
|
+
const reindexInit = (targetHeight) => (0, node_core_1.reindexInit)(ReindexModule, targetHeight);
|
|
32
|
+
exports.reindexInit = reindexInit;
|
|
33
|
+
//# sourceMappingURL=reindex.init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reindex.init.js","sourceRoot":"","sources":["../../src/subcommands/reindex.init.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAA2D;AAC3D,gDAA4E;AAC5E,oEAAgE;AAChE,qDAAwD;AAWjD,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IATzB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAe,CAAC,QAAQ,EAAE;YAC1B,qCAAoB;YACpB,kCAAkB,CAAC,OAAO,EAAE;SAC7B;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,aAAa,CAAG;AAEtB,MAAM,WAAW,GAAG,CAAC,YAAoB,EAAiB,EAAE,CACjE,IAAA,uBAAe,EAAC,aAAa,EAAE,YAAY,CAAC,CAAC;AADlC,QAAA,WAAW,eACuB","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitterModule } from '@nestjs/event-emitter';\nimport { reindexInit as baseReindexInit, DbModule } from '@subql/node-core';\nimport { ConfigureModule } from '../configure/configure.module';\nimport { ReindexFeatureModule } from './reindex.module';\n\n@Module({\n imports: [\n DbModule.forRoot(),\n ConfigureModule.register(),\n ReindexFeatureModule,\n EventEmitterModule.forRoot(),\n ],\n controllers: [],\n})\nexport class ReindexModule {}\n\nexport const reindexInit = (targetHeight: number): Promise<void> =>\n baseReindexInit(ReindexModule, targetHeight);\n"]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: GPL-3.0
|
|
4
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
5
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
6
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
7
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
8
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.ReindexFeatureModule = void 0;
|
|
12
|
+
const common_1 = require("@nestjs/common");
|
|
13
|
+
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
14
|
+
const node_core_1 = require("@subql/node-core");
|
|
15
|
+
const x_sequelize_1 = require("@subql/x-sequelize");
|
|
16
|
+
const blockchain_service_1 = require("../blockchain.service");
|
|
17
|
+
const api_service_1 = require("../indexer/api.service");
|
|
18
|
+
const runtimeService_1 = require("../indexer/runtime/runtimeService");
|
|
19
|
+
let ReindexFeatureModule = class ReindexFeatureModule {
|
|
20
|
+
};
|
|
21
|
+
exports.ReindexFeatureModule = ReindexFeatureModule;
|
|
22
|
+
exports.ReindexFeatureModule = ReindexFeatureModule = __decorate([
|
|
23
|
+
(0, common_1.Module)({
|
|
24
|
+
providers: [
|
|
25
|
+
{
|
|
26
|
+
provide: 'IStoreModelProvider',
|
|
27
|
+
useFactory: node_core_1.storeModelFactory,
|
|
28
|
+
inject: [node_core_1.NodeConfig, event_emitter_1.EventEmitter2, x_sequelize_1.Sequelize],
|
|
29
|
+
},
|
|
30
|
+
node_core_1.StoreService,
|
|
31
|
+
node_core_1.ReindexService,
|
|
32
|
+
node_core_1.PoiService,
|
|
33
|
+
node_core_1.ForceCleanService,
|
|
34
|
+
{
|
|
35
|
+
provide: 'UnfinalizedBlocksService',
|
|
36
|
+
useClass: node_core_1.UnfinalizedBlocksService,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
provide: 'DynamicDsService',
|
|
40
|
+
useClass: node_core_1.DynamicDsService,
|
|
41
|
+
},
|
|
42
|
+
node_core_1.DsProcessorService,
|
|
43
|
+
node_core_1.ConnectionPoolStateManager,
|
|
44
|
+
node_core_1.ConnectionPoolService,
|
|
45
|
+
{
|
|
46
|
+
// Used to work with DI for unfinalizedBlocksService but not used with reindex
|
|
47
|
+
provide: 'APIService',
|
|
48
|
+
useFactory: api_service_1.ApiService.init,
|
|
49
|
+
inject: [
|
|
50
|
+
'ISubqueryProject',
|
|
51
|
+
node_core_1.ConnectionPoolService,
|
|
52
|
+
event_emitter_1.EventEmitter2,
|
|
53
|
+
node_core_1.NodeConfig,
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
provide: 'RuntimeService',
|
|
58
|
+
useClass: runtimeService_1.RuntimeService,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
provide: 'IBlockchainService',
|
|
62
|
+
useClass: blockchain_service_1.BlockchainService,
|
|
63
|
+
},
|
|
64
|
+
node_core_1.MultiChainRewindService,
|
|
65
|
+
],
|
|
66
|
+
controllers: [],
|
|
67
|
+
})
|
|
68
|
+
], ReindexFeatureModule);
|
|
69
|
+
//# sourceMappingURL=reindex.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reindex.module.js","sourceRoot":"","sources":["../../src/subcommands/reindex.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAAsD;AACtD,gDAa0B;AAC1B,oDAA+C;AAC/C,8DAA0D;AAE1D,wDAAoD;AACpD,sEAAmE;AA+C5D,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAAG,CAAA;AAAvB,oDAAoB;+BAApB,oBAAoB;IA7ChC,IAAA,eAAM,EAAC;QACN,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,qBAAqB;gBAC9B,UAAU,EAAE,6BAAiB;gBAC7B,MAAM,EAAE,CAAC,sBAAU,EAAE,6BAAa,EAAE,uBAAS,CAAC;aAC/C;YACD,wBAAY;YACZ,0BAAc;YACd,sBAAU;YACV,6BAAiB;YACjB;gBACE,OAAO,EAAE,0BAA0B;gBACnC,QAAQ,EAAE,oCAAwB;aACnC;YACD;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,QAAQ,EAAE,4BAAgB;aAC3B;YACD,8BAAkB;YAClB,sCAA0B;YAC1B,iCAAqB;YACrB;gBACE,8EAA8E;gBAC9E,OAAO,EAAE,YAAY;gBACrB,UAAU,EAAE,wBAAU,CAAC,IAAI;gBAC3B,MAAM,EAAE;oBACN,kBAAkB;oBAClB,iCAAqB;oBACrB,6BAAa;oBACb,sBAAU;iBACX;aACF;YACD;gBACE,OAAO,EAAE,gBAAgB;gBACzB,QAAQ,EAAE,+BAAc;aACzB;YACD;gBACE,OAAO,EAAE,oBAAoB;gBAC7B,QAAQ,EAAE,sCAAiB;aAC5B;YACD,mCAAuB;SACxB;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,oBAAoB,CAAG","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ForceCleanService,\n ReindexService,\n StoreService,\n PoiService,\n ConnectionPoolService,\n NodeConfig,\n ConnectionPoolStateManager,\n storeModelFactory,\n DsProcessorService,\n UnfinalizedBlocksService,\n DynamicDsService,\n MultiChainRewindService,\n} from '@subql/node-core';\nimport { Sequelize } from '@subql/x-sequelize';\nimport { BlockchainService } from '../blockchain.service';\n\nimport { ApiService } from '../indexer/api.service';\nimport { RuntimeService } from '../indexer/runtime/runtimeService';\n\n@Module({\n providers: [\n {\n provide: 'IStoreModelProvider',\n useFactory: storeModelFactory,\n inject: [NodeConfig, EventEmitter2, Sequelize],\n },\n StoreService,\n ReindexService,\n PoiService,\n ForceCleanService,\n {\n provide: 'UnfinalizedBlocksService',\n useClass: UnfinalizedBlocksService,\n },\n {\n provide: 'DynamicDsService',\n useClass: DynamicDsService,\n },\n DsProcessorService,\n ConnectionPoolStateManager,\n ConnectionPoolService,\n {\n // Used to work with DI for unfinalizedBlocksService but not used with reindex\n provide: 'APIService',\n useFactory: ApiService.init,\n inject: [\n 'ISubqueryProject',\n ConnectionPoolService,\n EventEmitter2,\n NodeConfig,\n ],\n },\n {\n provide: 'RuntimeService',\n useClass: RuntimeService,\n },\n {\n provide: 'IBlockchainService',\n useClass: BlockchainService,\n },\n MultiChainRewindService,\n ],\n controllers: [],\n})\nexport class ReindexFeatureModule {}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function testingInit(): Promise<void>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: GPL-3.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.testingInit = testingInit;
|
|
6
|
+
const node_core_1 = require("@subql/node-core");
|
|
7
|
+
const configure_module_1 = require("../configure/configure.module");
|
|
8
|
+
const testing_service_1 = require("./testing.service");
|
|
9
|
+
const logger = (0, node_core_1.getLogger)('Testing');
|
|
10
|
+
async function testingInit() {
|
|
11
|
+
try {
|
|
12
|
+
const { nodeConfig, project } = await configure_module_1.ConfigureModule.getInstance();
|
|
13
|
+
const testingService = new testing_service_1.TestingService(nodeConfig, project);
|
|
14
|
+
await testingService.run();
|
|
15
|
+
}
|
|
16
|
+
catch (e) {
|
|
17
|
+
(0, node_core_1.exitWithError)(new Error('Testing failed', { cause: e }), logger);
|
|
18
|
+
}
|
|
19
|
+
process.exit(0);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=testing.init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.init.js","sourceRoot":"","sources":["../../src/subcommands/testing.init.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAOnC,kCAUC;AAfD,gDAA4D;AAC5D,oEAAgE;AAChE,uDAAmD;AAEnD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,SAAS,CAAC,CAAC;AAC7B,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,kCAAe,CAAC,WAAW,EAAE,CAAC;QAEpE,MAAM,cAAc,GAAG,IAAI,gCAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,cAAc,CAAC,GAAG,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAA,yBAAa,EAAC,IAAI,KAAK,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { exitWithError, getLogger } from '@subql/node-core';\nimport { ConfigureModule } from '../configure/configure.module';\nimport { TestingService } from './testing.service';\n\nconst logger = getLogger('Testing');\nexport async function testingInit(): Promise<void> {\n try {\n const { nodeConfig, project } = await ConfigureModule.getInstance();\n\n const testingService = new TestingService(nodeConfig, project);\n await testingService.run();\n } catch (e) {\n exitWithError(new Error('Testing failed', { cause: e }), logger);\n }\n process.exit(0);\n}\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: GPL-3.0
|
|
4
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
5
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
6
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
7
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
8
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.TestingFeatureModule = void 0;
|
|
12
|
+
const common_1 = require("@nestjs/common");
|
|
13
|
+
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
14
|
+
const node_core_1 = require("@subql/node-core");
|
|
15
|
+
const blockchain_service_1 = require("../blockchain.service");
|
|
16
|
+
const api_service_1 = require("../indexer/api.service");
|
|
17
|
+
const indexer_manager_1 = require("../indexer/indexer.manager");
|
|
18
|
+
const runtimeService_1 = require("../indexer/runtime/runtimeService");
|
|
19
|
+
let TestingFeatureModule = class TestingFeatureModule {
|
|
20
|
+
};
|
|
21
|
+
exports.TestingFeatureModule = TestingFeatureModule;
|
|
22
|
+
exports.TestingFeatureModule = TestingFeatureModule = __decorate([
|
|
23
|
+
(0, common_1.Module)({
|
|
24
|
+
imports: [node_core_1.TestingCoreModule],
|
|
25
|
+
providers: [
|
|
26
|
+
{
|
|
27
|
+
provide: 'IProjectService',
|
|
28
|
+
useClass: node_core_1.ProjectService,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
provide: 'APIService',
|
|
32
|
+
useFactory: api_service_1.ApiService.init,
|
|
33
|
+
inject: [
|
|
34
|
+
'ISubqueryProject',
|
|
35
|
+
node_core_1.ConnectionPoolService,
|
|
36
|
+
event_emitter_1.EventEmitter2,
|
|
37
|
+
node_core_1.NodeConfig,
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
provide: 'IUnfinalizedBlocksService',
|
|
42
|
+
useClass: node_core_1.UnfinalizedBlocksService,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
provide: 'RuntimeService',
|
|
46
|
+
useClass: runtimeService_1.RuntimeService,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
provide: 'IBlockchainService',
|
|
50
|
+
useClass: blockchain_service_1.BlockchainService,
|
|
51
|
+
},
|
|
52
|
+
node_core_1.TestRunner,
|
|
53
|
+
{
|
|
54
|
+
provide: 'IIndexerManager',
|
|
55
|
+
useClass: indexer_manager_1.IndexerManager,
|
|
56
|
+
},
|
|
57
|
+
node_core_1.DsProcessorService,
|
|
58
|
+
node_core_1.DynamicDsService,
|
|
59
|
+
node_core_1.MultiChainRewindService,
|
|
60
|
+
],
|
|
61
|
+
controllers: [],
|
|
62
|
+
exports: [node_core_1.TestRunner],
|
|
63
|
+
})
|
|
64
|
+
], TestingFeatureModule);
|
|
65
|
+
//# sourceMappingURL=testing.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.module.js","sourceRoot":"","sources":["../../src/subcommands/testing.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAAsD;AACtD,gDAU0B;AAC1B,8DAA0D;AAC1D,wDAAoD;AACpD,gEAA4D;AAC5D,sEAAmE;AA2C5D,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAAG,CAAA;AAAvB,oDAAoB;+BAApB,oBAAoB;IAzChC,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,6BAAiB,CAAC;QAC5B,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,iBAAiB;gBAC1B,QAAQ,EAAE,0BAAc;aACzB;YACD;gBACE,OAAO,EAAE,YAAY;gBACrB,UAAU,EAAE,wBAAU,CAAC,IAAI;gBAC3B,MAAM,EAAE;oBACN,kBAAkB;oBAClB,iCAAqB;oBACrB,6BAAa;oBACb,sBAAU;iBACX;aACF;YACD;gBACE,OAAO,EAAE,2BAA2B;gBACpC,QAAQ,EAAE,oCAAwB;aACnC;YACD;gBACE,OAAO,EAAE,gBAAgB;gBACzB,QAAQ,EAAE,+BAAc;aACzB;YACD;gBACE,OAAO,EAAE,oBAAoB;gBAC7B,QAAQ,EAAE,sCAAiB;aAC5B;YACD,sBAAU;YACV;gBACE,OAAO,EAAE,iBAAiB;gBAC1B,QAAQ,EAAE,gCAAc;aACzB;YACD,8BAAkB;YAClB,4BAAgB;YAChB,mCAAuB;SACxB;QACD,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,CAAC,sBAAU,CAAC;KACtB,CAAC;GACW,oBAAoB,CAAG","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ConnectionPoolService,\n TestRunner,\n NodeConfig,\n ProjectService,\n TestingCoreModule,\n DsProcessorService,\n DynamicDsService,\n UnfinalizedBlocksService,\n MultiChainRewindService,\n} from '@subql/node-core';\nimport { BlockchainService } from '../blockchain.service';\nimport { ApiService } from '../indexer/api.service';\nimport { IndexerManager } from '../indexer/indexer.manager';\nimport { RuntimeService } from '../indexer/runtime/runtimeService';\n\n@Module({\n imports: [TestingCoreModule],\n providers: [\n {\n provide: 'IProjectService',\n useClass: ProjectService,\n },\n {\n provide: 'APIService',\n useFactory: ApiService.init,\n inject: [\n 'ISubqueryProject',\n ConnectionPoolService,\n EventEmitter2,\n NodeConfig,\n ],\n },\n {\n provide: 'IUnfinalizedBlocksService',\n useClass: UnfinalizedBlocksService,\n },\n {\n provide: 'RuntimeService',\n useClass: RuntimeService,\n },\n {\n provide: 'IBlockchainService',\n useClass: BlockchainService,\n },\n TestRunner,\n {\n provide: 'IIndexerManager',\n useClass: IndexerManager,\n },\n DsProcessorService,\n DynamicDsService,\n MultiChainRewindService,\n ],\n controllers: [],\n exports: [TestRunner],\n})\nexport class TestingFeatureModule {}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ApiPromise } from '@polkadot/api';
|
|
2
|
+
import { NodeConfig, TestingService as BaseTestingService, TestRunner } from '@subql/node-core';
|
|
3
|
+
import { SubstrateDatasource } from '@subql/types';
|
|
4
|
+
import { SubqueryProject } from '../configure/SubqueryProject';
|
|
5
|
+
import { ApiAt, BlockContent, LightBlockContent } from '../indexer/types';
|
|
6
|
+
export declare class TestingModule {
|
|
7
|
+
}
|
|
8
|
+
export declare class TestingService extends BaseTestingService<ApiPromise, ApiAt, BlockContent | LightBlockContent, SubstrateDatasource> {
|
|
9
|
+
constructor(nodeConfig: NodeConfig, project: SubqueryProject);
|
|
10
|
+
getTestRunner(): Promise<[
|
|
11
|
+
close: () => Promise<void>,
|
|
12
|
+
runner: TestRunner<ApiPromise, ApiAt, BlockContent, SubstrateDatasource>
|
|
13
|
+
]>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: GPL-3.0
|
|
4
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
5
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
6
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
7
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
8
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
9
|
+
};
|
|
10
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
11
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
12
|
+
};
|
|
13
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
14
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.TestingService = exports.TestingModule = void 0;
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const core_1 = require("@nestjs/core");
|
|
20
|
+
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
21
|
+
const schedule_1 = require("@nestjs/schedule");
|
|
22
|
+
const node_core_1 = require("@subql/node-core");
|
|
23
|
+
const configure_module_1 = require("../configure/configure.module");
|
|
24
|
+
const testing_module_1 = require("./testing.module");
|
|
25
|
+
let TestingModule = class TestingModule {
|
|
26
|
+
};
|
|
27
|
+
exports.TestingModule = TestingModule;
|
|
28
|
+
exports.TestingModule = TestingModule = __decorate([
|
|
29
|
+
(0, common_1.Module)({
|
|
30
|
+
imports: [
|
|
31
|
+
node_core_1.DbModule.forRoot(),
|
|
32
|
+
configure_module_1.ConfigureModule.register(),
|
|
33
|
+
event_emitter_1.EventEmitterModule.forRoot(),
|
|
34
|
+
schedule_1.ScheduleModule.forRoot(),
|
|
35
|
+
testing_module_1.TestingFeatureModule,
|
|
36
|
+
],
|
|
37
|
+
controllers: [],
|
|
38
|
+
})
|
|
39
|
+
], TestingModule);
|
|
40
|
+
let TestingService = class TestingService extends node_core_1.TestingService {
|
|
41
|
+
constructor(nodeConfig, project) {
|
|
42
|
+
super(nodeConfig, project);
|
|
43
|
+
}
|
|
44
|
+
async getTestRunner() {
|
|
45
|
+
const testContext = await core_1.NestFactory.createApplicationContext(TestingModule, {
|
|
46
|
+
logger: new node_core_1.NestLogger(!!this.nodeConfig.debug),
|
|
47
|
+
});
|
|
48
|
+
await testContext.init();
|
|
49
|
+
const projectService = testContext.get('IProjectService');
|
|
50
|
+
await projectService.init();
|
|
51
|
+
return [testContext.close.bind(testContext), testContext.get(node_core_1.TestRunner)];
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
exports.TestingService = TestingService;
|
|
55
|
+
exports.TestingService = TestingService = __decorate([
|
|
56
|
+
(0, common_1.Injectable)(),
|
|
57
|
+
__param(1, (0, common_1.Inject)('ISubqueryProject')),
|
|
58
|
+
__metadata("design:paramtypes", [node_core_1.NodeConfig, Object])
|
|
59
|
+
], TestingService);
|
|
60
|
+
//# sourceMappingURL=testing.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.service.js","sourceRoot":"","sources":["../../src/subcommands/testing.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAA4D;AAC5D,uCAA2C;AAC3C,yDAA2D;AAC3D,+CAAkD;AAElD,gDAO0B;AAE1B,oEAAgE;AAGhE,qDAAwD;AAYjD,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IAVzB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAe,CAAC,QAAQ,EAAE;YAC1B,kCAAkB,CAAC,OAAO,EAAE;YAC5B,yBAAc,CAAC,OAAO,EAAE;YACxB,qCAAoB;SACrB;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,aAAa,CAAG;AAGtB,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,0BAKnC;IACC,YACE,UAAsB,EACM,OAAwB;QAEpD,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,aAAa;QAMjB,MAAM,WAAW,GAAG,MAAM,kBAAW,CAAC,wBAAwB,CAC5D,aAAa,EACb;YACE,MAAM,EAAE,IAAI,sBAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;SAChD,CACF,CAAC;QAEF,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QAEzB,MAAM,cAAc,GAAmB,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAE1E,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAE5B,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,sBAAU,CAAC,CAAC,CAAC;IAC5E,CAAC;CACF,CAAA;AAlCY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IASR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCADf,sBAAU;GAPb,cAAc,CAkC1B","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable, Module } from '@nestjs/common';\nimport { NestFactory } from '@nestjs/core';\nimport { EventEmitterModule } from '@nestjs/event-emitter';\nimport { ScheduleModule } from '@nestjs/schedule';\nimport { ApiPromise } from '@polkadot/api';\nimport {\n NodeConfig,\n TestingService as BaseTestingService,\n NestLogger,\n TestRunner,\n ProjectService,\n DbModule,\n} from '@subql/node-core';\nimport { SubstrateDatasource } from '@subql/types';\nimport { ConfigureModule } from '../configure/configure.module';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { ApiAt, BlockContent, LightBlockContent } from '../indexer/types';\nimport { TestingFeatureModule } from './testing.module';\n\n@Module({\n imports: [\n DbModule.forRoot(),\n ConfigureModule.register(),\n EventEmitterModule.forRoot(),\n ScheduleModule.forRoot(),\n TestingFeatureModule,\n ],\n controllers: [],\n})\nexport class TestingModule {}\n\n@Injectable()\nexport class TestingService extends BaseTestingService<\n ApiPromise,\n ApiAt,\n BlockContent | LightBlockContent,\n SubstrateDatasource\n> {\n constructor(\n nodeConfig: NodeConfig,\n @Inject('ISubqueryProject') project: SubqueryProject,\n ) {\n super(nodeConfig, project);\n }\n\n async getTestRunner(): Promise<\n [\n close: () => Promise<void>,\n runner: TestRunner<ApiPromise, ApiAt, BlockContent, SubstrateDatasource>,\n ]\n > {\n const testContext = await NestFactory.createApplicationContext(\n TestingModule,\n {\n logger: new NestLogger(!!this.nodeConfig.debug),\n },\n );\n\n await testContext.init();\n\n const projectService: ProjectService = testContext.get('IProjectService');\n\n await projectService.init();\n\n return [testContext.close.bind(testContext), testContext.get(TestRunner)];\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ChainTypes, SubstrateRuntimeHandler, SubstrateCustomHandler, SubstrateHandler } from '@subql/common-substrate';
|
|
2
|
+
import { Reader } from '@subql/types-core';
|
|
3
|
+
import { SubqueryProject } from '../configure/SubqueryProject';
|
|
4
|
+
export declare function isBaseHandler(handler: SubstrateHandler): handler is SubstrateRuntimeHandler;
|
|
5
|
+
export declare function isCustomHandler(handler: SubstrateHandler): handler is SubstrateCustomHandler;
|
|
6
|
+
export declare function getChainTypes(reader: Reader, root: string, file: string): Promise<ChainTypes>;
|
|
7
|
+
export declare function loadChainTypes(file: string, projectRoot: string): unknown;
|
|
8
|
+
export declare function loadChainTypesFromJs(filePath: string, requireRoot?: string): unknown;
|
|
9
|
+
export declare function isOnlyEventHandlers(project: SubqueryProject): boolean;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: GPL-3.0
|
|
4
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
|
+
};
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.isBaseHandler = isBaseHandler;
|
|
9
|
+
exports.isCustomHandler = isCustomHandler;
|
|
10
|
+
exports.getChainTypes = getChainTypes;
|
|
11
|
+
exports.loadChainTypes = loadChainTypes;
|
|
12
|
+
exports.loadChainTypesFromJs = loadChainTypesFromJs;
|
|
13
|
+
exports.isOnlyEventHandlers = isOnlyEventHandlers;
|
|
14
|
+
const fs_1 = __importDefault(require("fs"));
|
|
15
|
+
const path_1 = __importDefault(require("path"));
|
|
16
|
+
const common_1 = require("@subql/common");
|
|
17
|
+
const common_substrate_1 = require("@subql/common-substrate");
|
|
18
|
+
const node_core_1 = require("@subql/node-core");
|
|
19
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
20
|
+
const vm2_1 = require("vm2");
|
|
21
|
+
function isBaseHandler(handler) {
|
|
22
|
+
return Object.values(common_substrate_1.SubstrateHandlerKind).includes(handler.kind);
|
|
23
|
+
}
|
|
24
|
+
function isCustomHandler(handler) {
|
|
25
|
+
return !isBaseHandler(handler);
|
|
26
|
+
}
|
|
27
|
+
async function getChainTypes(reader, root, file) {
|
|
28
|
+
// If the project is load from local, we will direct load them
|
|
29
|
+
let raw;
|
|
30
|
+
if (reader instanceof common_1.LocalReader) {
|
|
31
|
+
raw = loadChainTypes(file, root);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// If it is stored in ipfs or other resources, we will use the corresponding reader to read the file
|
|
35
|
+
// Because ipfs not provide extension of the file, it is difficult to determine its format
|
|
36
|
+
// We will use yaml.load to try to load the script and parse them to supported chain types
|
|
37
|
+
// if it failed, we will give it another attempt, and assume the script written in js
|
|
38
|
+
// we will download it to a temp folder, and load them within sandbox
|
|
39
|
+
const res = await reader.getFile(file);
|
|
40
|
+
try {
|
|
41
|
+
raw = js_yaml_1.default.load(res);
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
const chainTypesPath = await (0, node_core_1.saveFile)(reader, root, file, res);
|
|
45
|
+
raw = loadChainTypesFromJs(chainTypesPath); //root not required, as it been packed in single js
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return (0, common_substrate_1.parseChainTypes)(raw);
|
|
49
|
+
}
|
|
50
|
+
function loadChainTypes(file, projectRoot) {
|
|
51
|
+
const { ext } = path_1.default.parse(file);
|
|
52
|
+
const filePath = path_1.default.resolve(projectRoot, file);
|
|
53
|
+
if (fs_1.default.existsSync(filePath)) {
|
|
54
|
+
if (ext === '.js' || ext === '.cjs') {
|
|
55
|
+
//load can be self contained js file, or js depend on node_module which will require project root
|
|
56
|
+
return loadChainTypesFromJs(filePath, projectRoot);
|
|
57
|
+
}
|
|
58
|
+
else if (ext === '.yaml' || ext === '.yml' || ext === '.json') {
|
|
59
|
+
return (0, common_1.loadFromJsonOrYaml)(filePath);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
throw new Error(`Extension ${ext} not supported`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
throw new Error(`Load from file ${file} not exist`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function loadChainTypesFromJs(filePath, requireRoot) {
|
|
70
|
+
const { base, ext } = path_1.default.parse(filePath);
|
|
71
|
+
const root = requireRoot ?? path_1.default.dirname(filePath);
|
|
72
|
+
const vm = new vm2_1.NodeVM({
|
|
73
|
+
console: 'redirect',
|
|
74
|
+
wasm: false,
|
|
75
|
+
sandbox: {},
|
|
76
|
+
require: {
|
|
77
|
+
context: 'sandbox',
|
|
78
|
+
external: true,
|
|
79
|
+
builtin: node_core_1.SANDBOX_DEFAULT_BUILTINS,
|
|
80
|
+
root: root,
|
|
81
|
+
resolve: (moduleName) => {
|
|
82
|
+
return require.resolve(moduleName, { paths: [root] });
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
wrapper: 'commonjs',
|
|
86
|
+
sourceExtensions: ['js', 'cjs'],
|
|
87
|
+
});
|
|
88
|
+
let rawContent;
|
|
89
|
+
try {
|
|
90
|
+
const script = new vm2_1.VMScript(`module.exports = require('${filePath}').default;`, path_1.default.join(root, 'sandbox')).compile();
|
|
91
|
+
rawContent = vm.run(script);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
throw new Error(`\n NodeVM error: ${err}`);
|
|
95
|
+
}
|
|
96
|
+
if (rawContent === undefined) {
|
|
97
|
+
throw new Error(`There was no default export found from required ${base} file`);
|
|
98
|
+
}
|
|
99
|
+
return rawContent;
|
|
100
|
+
}
|
|
101
|
+
function dsContainsNonEventHandlers(ds) {
|
|
102
|
+
if ((0, common_substrate_1.isRuntimeDs)(ds)) {
|
|
103
|
+
return !!ds.mapping.handlers.find((handler) => handler.kind !== common_substrate_1.SubstrateHandlerKind.Event);
|
|
104
|
+
}
|
|
105
|
+
else if ((0, common_substrate_1.isCustomDs)(ds)) {
|
|
106
|
+
// TODO this can be improved upon in the future.
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
function isOnlyEventHandlers(project) {
|
|
112
|
+
const hasNonEventHandler = !!project.dataSources.find((ds) => dsContainsNonEventHandlers(ds));
|
|
113
|
+
const hasNonEventTemplate = !!project.templates.find((ds) => dsContainsNonEventHandlers(ds));
|
|
114
|
+
return !hasNonEventHandler && !hasNonEventTemplate;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport fs from 'fs';\nimport path from 'path';\nimport { LocalReader, loadFromJsonOrYaml } from '@subql/common';\nimport {\n ChainTypes,\n parseChainTypes,\n SubstrateRuntimeHandler,\n SubstrateCustomHandler,\n SubstrateHandler,\n SubstrateHandlerKind,\n isRuntimeDs,\n isCustomDs,\n} from '@subql/common-substrate';\nimport { SANDBOX_DEFAULT_BUILTINS, saveFile } from '@subql/node-core';\nimport { Reader } from '@subql/types-core';\nimport yaml from 'js-yaml';\nimport { NodeVM, VMScript } from 'vm2';\nimport {\n SubqueryProject,\n SubstrateProjectDs,\n} from '../configure/SubqueryProject';\n\nexport function isBaseHandler(\n handler: SubstrateHandler,\n): handler is SubstrateRuntimeHandler {\n return Object.values<string>(SubstrateHandlerKind).includes(handler.kind);\n}\n\nexport function isCustomHandler(\n handler: SubstrateHandler,\n): handler is SubstrateCustomHandler {\n return !isBaseHandler(handler);\n}\n\nexport async function getChainTypes(\n reader: Reader,\n root: string,\n file: string,\n): Promise<ChainTypes> {\n // If the project is load from local, we will direct load them\n let raw: unknown;\n if (reader instanceof LocalReader) {\n raw = loadChainTypes(file, root);\n } else {\n // If it is stored in ipfs or other resources, we will use the corresponding reader to read the file\n // Because ipfs not provide extension of the file, it is difficult to determine its format\n // We will use yaml.load to try to load the script and parse them to supported chain types\n // if it failed, we will give it another attempt, and assume the script written in js\n // we will download it to a temp folder, and load them within sandbox\n const res = await reader.getFile(file);\n try {\n raw = yaml.load(res);\n } catch (e) {\n const chainTypesPath = await saveFile(reader, root, file, res);\n raw = loadChainTypesFromJs(chainTypesPath); //root not required, as it been packed in single js\n }\n }\n return parseChainTypes(raw);\n}\n\nexport function loadChainTypes(file: string, projectRoot: string): unknown {\n const { ext } = path.parse(file);\n const filePath = path.resolve(projectRoot, file);\n if (fs.existsSync(filePath)) {\n if (ext === '.js' || ext === '.cjs') {\n //load can be self contained js file, or js depend on node_module which will require project root\n return loadChainTypesFromJs(filePath, projectRoot);\n } else if (ext === '.yaml' || ext === '.yml' || ext === '.json') {\n return loadFromJsonOrYaml(filePath);\n } else {\n throw new Error(`Extension ${ext} not supported`);\n }\n } else {\n throw new Error(`Load from file ${file} not exist`);\n }\n}\n\nexport function loadChainTypesFromJs(\n filePath: string,\n requireRoot?: string,\n): unknown {\n const { base, ext } = path.parse(filePath);\n const root = requireRoot ?? path.dirname(filePath);\n const vm = new NodeVM({\n console: 'redirect',\n wasm: false,\n sandbox: {},\n require: {\n context: 'sandbox',\n external: true,\n builtin: SANDBOX_DEFAULT_BUILTINS,\n root: root,\n resolve: (moduleName: string) => {\n return require.resolve(moduleName, { paths: [root] });\n },\n },\n wrapper: 'commonjs',\n sourceExtensions: ['js', 'cjs'],\n });\n let rawContent: unknown;\n try {\n const script = new VMScript(\n `module.exports = require('${filePath}').default;`,\n path.join(root, 'sandbox'),\n ).compile();\n rawContent = vm.run(script) as unknown;\n } catch (err) {\n throw new Error(`\\n NodeVM error: ${err}`);\n }\n if (rawContent === undefined) {\n throw new Error(\n `There was no default export found from required ${base} file`,\n );\n }\n return rawContent;\n}\n\nfunction dsContainsNonEventHandlers(ds: SubstrateProjectDs): boolean {\n if (isRuntimeDs(ds)) {\n return !!ds.mapping.handlers.find(\n (handler) => handler.kind !== SubstrateHandlerKind.Event,\n );\n } else if (isCustomDs(ds)) {\n // TODO this can be improved upon in the future.\n return true;\n }\n return true;\n}\n\nexport function isOnlyEventHandlers(project: SubqueryProject): boolean {\n const hasNonEventHandler = !!project.dataSources.find((ds) =>\n dsContainsNonEventHandlers(ds),\n );\n const hasNonEventTemplate = !!project.templates.find((ds) =>\n dsContainsNonEventHandlers(ds as SubstrateProjectDs),\n );\n\n return !hasNonEventHandler && !hasNonEventTemplate;\n}\n"]}
|