@holo-js/cli 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/bin/holo.mjs +192 -35
  2. package/dist/{broadcast-CSSARTSA.mjs → broadcast-RT5KVZWP.mjs} +5 -5
  3. package/dist/{cache-4G6QGIZO.mjs → cache-NHCCHT44.mjs} +5 -5
  4. package/dist/{cache-migrations-NATT5WPQ.mjs → cache-migrations-R2RL2RVD.mjs} +15 -16
  5. package/dist/{chunk-EUIVXVJL.mjs → chunk-57SJ566R.mjs} +1 -1
  6. package/dist/chunk-5BLEC66P.mjs +284 -0
  7. package/dist/{chunk-JX2ZH6XY.mjs → chunk-5EU32E7X.mjs} +3 -3
  8. package/dist/{chunk-Q5F6C2D4.mjs → chunk-BAFQ2GOA.mjs} +1 -1
  9. package/dist/{chunk-CUL4RJTG.mjs → chunk-F4MT6GBK.mjs} +1 -1
  10. package/dist/{chunk-3OTCSFDG.mjs → chunk-MXKNQACM.mjs} +544 -82
  11. package/dist/{chunk-QYLSMF7V.mjs → chunk-OZUDZEAW.mjs} +142 -28
  12. package/dist/{chunk-66FHW725.mjs → chunk-R6BWRY3E.mjs} +28 -2
  13. package/dist/{chunk-ZLRO7HXY.mjs → chunk-SCCPDJGO.mjs} +156 -15
  14. package/dist/{chunk-VT5IDQG6.mjs → chunk-UZTDQKIY.mjs} +61 -44
  15. package/dist/{chunk-MZXN2YMI.mjs → chunk-VCEO6N5T.mjs} +3542 -2517
  16. package/dist/{config-LS5USBRB.mjs → config-5JSC6KJG.mjs} +3 -3
  17. package/dist/{dev-LZ3O2E3U.mjs → dev-OSLYSBTL.mjs} +7 -7
  18. package/dist/{discovery-GBLAUTXS.mjs → discovery-JLT2EOGH.mjs} +3 -3
  19. package/dist/{generators-DSN4GWJI.mjs → generators-ZIWACCBE.mjs} +134 -16
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.mjs +189 -32
  22. package/dist/media-migrations-UBAL2YVV.mjs +117 -0
  23. package/dist/{queue-FV35LLPR.mjs → queue-I66EISVS.mjs} +14 -14
  24. package/dist/{queue-migrations-SSIYKK5S.mjs → queue-migrations-UIAMAB6E.mjs} +24 -20
  25. package/dist/{runtime-EFZ5H5IL.mjs → runtime-MMQGO4PP.mjs} +9 -7
  26. package/dist/{runtime-OOSJ5JBY.mjs → runtime-ZKD6URAV.mjs} +1 -1
  27. package/dist/{scaffold-7OTDH4UR.mjs → scaffold-ISDVICNQ.mjs} +18 -5
  28. package/dist/{security-ATKDC26E.mjs → security-OZXTMYXF.mjs} +10 -7
  29. package/package.json +13 -12
  30. package/dist/broadcast-YSIJCL3R.mjs +0 -85
  31. package/dist/cache-OWQY4E7W.mjs +0 -67
  32. package/dist/cache-migrations-RVEA6CEU.mjs +0 -155
  33. package/dist/chunk-BWW5TDFI.mjs +0 -4
  34. package/dist/chunk-D4GG556Y.mjs +0 -23
  35. package/dist/chunk-DMH2B4UQ.mjs +0 -343
  36. package/dist/chunk-ET7UXHHQ.mjs +0 -166
  37. package/dist/chunk-G5ADO27Q.mjs +0 -463
  38. package/dist/chunk-GSQ3HTRO.mjs +0 -165
  39. package/dist/chunk-H7TJ4FB3.mjs +0 -848
  40. package/dist/chunk-ICJR7TS4.mjs +0 -66
  41. package/dist/chunk-M7J3YTHR.mjs +0 -26
  42. package/dist/chunk-QFUSWV3J.mjs +0 -3237
  43. package/dist/chunk-S7P7EBM3.mjs +0 -787
  44. package/dist/chunk-SRWJU3A5.mjs +0 -11
  45. package/dist/chunk-URK7C3VQ.mjs +0 -538
  46. package/dist/chunk-XUYKPU5Q.mjs +0 -272
  47. package/dist/config-DMWBMMGD.mjs +0 -26
  48. package/dist/dev-KQFT7RHR.mjs +0 -43
  49. package/dist/discovery-R733D2PO.mjs +0 -29
  50. package/dist/generators-WX45BI4U.mjs +0 -426
  51. package/dist/queue-6OG7VJ34.mjs +0 -626
  52. package/dist/queue-migrations-NK2EYX3J.mjs +0 -163
  53. package/dist/runtime-4BV3JODY.mjs +0 -56
  54. package/dist/runtime-ANBO7VQM.mjs +0 -33
  55. package/dist/scaffold-DRKBGS2K.mjs +0 -120
  56. package/dist/security-R7VH6W5H.mjs +0 -69
@@ -1,163 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- getRegistryMigrationSlug,
4
- hasRegisteredCreateTableMigration,
5
- hasRegisteredMigrationSlug,
6
- nextMigrationTemplate
7
- } from "./chunk-ICJR7TS4.mjs";
8
- import {
9
- writeLine
10
- } from "./chunk-SRWJU3A5.mjs";
11
- import "./chunk-M7J3YTHR.mjs";
12
- import {
13
- runProjectPrepare
14
- } from "./chunk-DMH2B4UQ.mjs";
15
- import "./chunk-D4GG556Y.mjs";
16
- import "./chunk-BWW5TDFI.mjs";
17
- import {
18
- prepareProjectDiscovery
19
- } from "./chunk-VT5IDQG6.mjs";
20
- import "./chunk-QFUSWV3J.mjs";
21
- import {
22
- ensureProjectConfig
23
- } from "./chunk-ET7UXHHQ.mjs";
24
- import {
25
- loadGeneratedProjectRegistry
26
- } from "./chunk-3OTCSFDG.mjs";
27
- import {
28
- makeProjectRelativePath,
29
- resolveDefaultArtifactPath,
30
- writeTextFile
31
- } from "./chunk-66FHW725.mjs";
32
-
33
- // src/queue-migrations.ts
34
- import { resolve } from "path";
35
- import { loadConfigDirectory } from "@holo-js/config";
36
- import { normalizeMigrationSlug } from "@holo-js/db";
37
- var DEFAULT_DATABASE_QUEUE_TABLE = "jobs";
38
- var DEFAULT_FAILED_JOBS_TABLE = "failed_jobs";
39
- async function loadQueueConfig(projectRoot) {
40
- return (await loadConfigDirectory(projectRoot)).queue;
41
- }
42
- function normalizeQueueMigrationName(tableName) {
43
- return normalizeMigrationSlug(`create_${tableName.replaceAll(".", "_")}_table`);
44
- }
45
- function renderQueueTableMigration(tableName) {
46
- return [
47
- "import { defineMigration, type MigrationContext } from '@holo-js/db'",
48
- "",
49
- "export default defineMigration({",
50
- " async up({ schema }: MigrationContext) {",
51
- ` await schema.createTable('${tableName}', (table) => {`,
52
- " table.string('id').primaryKey()",
53
- " table.string('job')",
54
- " table.string('connection')",
55
- " table.string('queue')",
56
- " table.text('payload')",
57
- " table.integer('attempts').default(0)",
58
- " table.integer('max_attempts').default(1)",
59
- " table.bigInteger('available_at')",
60
- " table.bigInteger('reserved_at').nullable()",
61
- " table.string('reservation_id').nullable()",
62
- " table.bigInteger('created_at')",
63
- ` table.index(['queue', 'available_at'], '${tableName.replaceAll(".", "_")}_queue_available_at_index')`,
64
- ` table.index(['queue', 'reserved_at'], '${tableName.replaceAll(".", "_")}_queue_reserved_at_index')`,
65
- ` table.index(['reservation_id'], '${tableName.replaceAll(".", "_")}_reservation_id_index')`,
66
- " })",
67
- " },",
68
- " async down({ schema }: MigrationContext) {",
69
- ` await schema.dropTable('${tableName}')`,
70
- " },",
71
- "})",
72
- ""
73
- ].join("\n");
74
- }
75
- function renderFailedJobsTableMigration(tableName) {
76
- return [
77
- "import { defineMigration, type MigrationContext } from '@holo-js/db'",
78
- "",
79
- "export default defineMigration({",
80
- " async up({ schema }: MigrationContext) {",
81
- ` await schema.createTable('${tableName}', (table) => {`,
82
- " table.string('id').primaryKey()",
83
- " table.string('job_id')",
84
- " table.string('job')",
85
- " table.string('connection')",
86
- " table.string('queue')",
87
- " table.text('payload')",
88
- " table.text('exception')",
89
- " table.bigInteger('failed_at')",
90
- ` table.index(['job_id'], '${tableName.replaceAll(".", "_")}_job_id_index')`,
91
- ` table.index(['failed_at'], '${tableName.replaceAll(".", "_")}_failed_at_index')`,
92
- " })",
93
- " },",
94
- " async down({ schema }: MigrationContext) {",
95
- ` await schema.dropTable('${tableName}')`,
96
- " },",
97
- "})",
98
- ""
99
- ].join("\n");
100
- }
101
- function resolveDatabaseQueueTables(queueConfig) {
102
- const configured = Object.values(queueConfig.connections).filter((connection) => connection.driver === "database").map((connection) => connection.table);
103
- return Object.freeze(configured.length > 0 ? [...new Set(configured)] : [DEFAULT_DATABASE_QUEUE_TABLE]);
104
- }
105
- async function runQueueTableCommand(io, projectRoot) {
106
- const project = await ensureProjectConfig(projectRoot);
107
- const registry = await loadGeneratedProjectRegistry(projectRoot) ?? await prepareProjectDiscovery(projectRoot, project.config);
108
- const queueConfig = await loadQueueConfig(projectRoot);
109
- const migrationsDir = resolve(projectRoot, project.config.paths.migrations);
110
- const createdFiles = [];
111
- for (const tableName of resolveDatabaseQueueTables(queueConfig)) {
112
- const migrationName = normalizeQueueMigrationName(tableName);
113
- if (hasRegisteredMigrationSlug(registry, migrationName) || hasRegisteredCreateTableMigration(registry, tableName)) {
114
- throw new Error(`A migration for table "${tableName}" already exists.`);
115
- }
116
- }
117
- for (const tableName of resolveDatabaseQueueTables(queueConfig)) {
118
- const migrationTemplate = await nextMigrationTemplate(normalizeQueueMigrationName(tableName), migrationsDir);
119
- const migrationFilePath = resolveDefaultArtifactPath(projectRoot, project.config.paths.migrations, migrationTemplate.fileName);
120
- await writeTextFile(migrationFilePath, renderQueueTableMigration(tableName));
121
- createdFiles.push(migrationFilePath);
122
- }
123
- await runProjectPrepare(projectRoot);
124
- for (const filePath of createdFiles) {
125
- writeLine(io.stdout, `Created migration: ${makeProjectRelativePath(projectRoot, filePath)}`);
126
- }
127
- }
128
- async function runQueueFailedTableCommand(io, projectRoot) {
129
- const project = await ensureProjectConfig(projectRoot);
130
- const registry = await loadGeneratedProjectRegistry(projectRoot) ?? await prepareProjectDiscovery(projectRoot, project.config);
131
- const queueConfig = await loadQueueConfig(projectRoot);
132
- const tableName = queueConfig.failed === false ? DEFAULT_FAILED_JOBS_TABLE : queueConfig.failed.table;
133
- const migrationName = normalizeQueueMigrationName(tableName);
134
- if (hasRegisteredMigrationSlug(registry, migrationName) || hasRegisteredCreateTableMigration(registry, tableName)) {
135
- throw new Error(`A migration for table "${tableName}" already exists.`);
136
- }
137
- const migrationTemplate = await nextMigrationTemplate(
138
- migrationName,
139
- resolve(projectRoot, project.config.paths.migrations)
140
- );
141
- const migrationFilePath = resolveDefaultArtifactPath(projectRoot, project.config.paths.migrations, migrationTemplate.fileName);
142
- await writeTextFile(migrationFilePath, renderFailedJobsTableMigration(tableName));
143
- await runProjectPrepare(projectRoot);
144
- writeLine(io.stdout, `Created migration: ${makeProjectRelativePath(projectRoot, migrationFilePath)}`);
145
- }
146
- var queueMigrationInternals = {
147
- getRegistryMigrationSlug,
148
- hasRegisteredMigrationSlug,
149
- hasRegisteredCreateTableMigration,
150
- nextMigrationTemplate
151
- };
152
- export {
153
- DEFAULT_DATABASE_QUEUE_TABLE,
154
- DEFAULT_FAILED_JOBS_TABLE,
155
- loadQueueConfig,
156
- normalizeQueueMigrationName,
157
- queueMigrationInternals,
158
- renderFailedJobsTableMigration,
159
- renderQueueTableMigration,
160
- resolveDatabaseQueueTables,
161
- runQueueFailedTableCommand,
162
- runQueueTableCommand
163
- };
@@ -1,56 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- RUNTIME_MIGRATION_NAME_PATTERN,
4
- cacheProjectConfig,
5
- cleanupRuntimeDependencyLink,
6
- compileFreshDropIdentifierPath,
7
- createEnvRuntimeConfig,
8
- createRuntimeInvocation,
9
- dropAllTablesForFresh,
10
- ensureRuntimeDependencyLink,
11
- filterDefinedRuntimeConnectionInput,
12
- getRuntimeEnvironment,
13
- getRuntimeFailureMessage,
14
- inferRuntimeMigrationName,
15
- initializeProjectRuntime,
16
- isDefined,
17
- mergeRuntimeDatabaseConfig,
18
- nodeRuntimeScript,
19
- normalizeRuntimeConnectionInput,
20
- normalizeRuntimeMigration,
21
- parseBooleanEnv,
22
- resolveConfigModuleUrl,
23
- resolvePackageRootFromSpecifier,
24
- withRuntimeEnvironment
25
- } from "./chunk-QYLSMF7V.mjs";
26
- import "./chunk-M7J3YTHR.mjs";
27
- import "./chunk-BWW5TDFI.mjs";
28
- import "./chunk-VT5IDQG6.mjs";
29
- import "./chunk-QFUSWV3J.mjs";
30
- import "./chunk-ET7UXHHQ.mjs";
31
- import "./chunk-3OTCSFDG.mjs";
32
- import "./chunk-66FHW725.mjs";
33
- export {
34
- RUNTIME_MIGRATION_NAME_PATTERN,
35
- cacheProjectConfig,
36
- cleanupRuntimeDependencyLink,
37
- compileFreshDropIdentifierPath,
38
- createEnvRuntimeConfig,
39
- createRuntimeInvocation,
40
- dropAllTablesForFresh,
41
- ensureRuntimeDependencyLink,
42
- filterDefinedRuntimeConnectionInput,
43
- getRuntimeEnvironment,
44
- getRuntimeFailureMessage,
45
- inferRuntimeMigrationName,
46
- initializeProjectRuntime,
47
- isDefined,
48
- mergeRuntimeDatabaseConfig,
49
- nodeRuntimeScript,
50
- normalizeRuntimeConnectionInput,
51
- normalizeRuntimeMigration,
52
- parseBooleanEnv,
53
- resolveConfigModuleUrl,
54
- resolvePackageRootFromSpecifier,
55
- withRuntimeEnvironment
56
- };
@@ -1,33 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- bundleProjectModule,
4
- findProjectRoot,
5
- importProjectModule,
6
- isModulePackage,
7
- loadAuthorizationDiscoveryModule,
8
- loadBroadcastDiscoveryModule,
9
- loadEventsDiscoveryModule,
10
- loadQueueDiscoveryModule,
11
- readTextFile,
12
- resetProjectModuleBundlerForTesting,
13
- resolveFirstExistingPath,
14
- resolveProjectPackageImportSpecifier,
15
- setProjectModuleBundlerForTesting,
16
- writeTextFile
17
- } from "./chunk-66FHW725.mjs";
18
- export {
19
- bundleProjectModule,
20
- findProjectRoot,
21
- importProjectModule,
22
- isModulePackage,
23
- loadAuthorizationDiscoveryModule,
24
- loadBroadcastDiscoveryModule,
25
- loadEventsDiscoveryModule,
26
- loadQueueDiscoveryModule,
27
- readTextFile,
28
- resetProjectModuleBundlerForTesting,
29
- resolveFirstExistingPath,
30
- resolveProjectPackageImportSpecifier,
31
- setProjectModuleBundlerForTesting,
32
- writeTextFile
33
- };
@@ -1,120 +0,0 @@
1
- import {
2
- authFeaturesRequireConfigUpdate,
3
- detectAuthInstallFeaturesFromConfig,
4
- hasLoadedConfigFile,
5
- inferConnectionDriver,
6
- inferDatabaseDriverFromUrl,
7
- injectBroadcastAuthEndpoint,
8
- installAuthIntoProject,
9
- installAuthorizationIntoProject,
10
- installBroadcastIntoProject,
11
- installCacheIntoProject,
12
- installEventsIntoProject,
13
- installMailIntoProject,
14
- installNotificationsIntoProject,
15
- installQueueIntoProject,
16
- installSecurityIntoProject,
17
- normalizeScaffoldEnvSegments,
18
- renderAuthConfig,
19
- renderAuthEnvFiles,
20
- renderAuthMigration,
21
- renderAuthUserModel,
22
- renderCacheConfig,
23
- renderCacheEnvFiles,
24
- renderEnvFileContents,
25
- renderFrameworkFiles,
26
- renderFrameworkRunner,
27
- renderMailConfig,
28
- renderMediaConfig,
29
- renderNotificationsConfig,
30
- renderNotificationsMigration,
31
- renderQueueConfig,
32
- renderQueueEnvFiles,
33
- renderRedisConfig,
34
- renderScaffoldAppConfig,
35
- renderScaffoldDatabaseConfig,
36
- renderScaffoldEnvFiles,
37
- renderScaffoldGitignore,
38
- renderScaffoldPackageJson,
39
- renderScaffoldTsconfig,
40
- renderSecurityConfig,
41
- renderSessionConfig,
42
- renderStorageConfig,
43
- resolveBroadcastConfigTargetPath,
44
- resolveDefaultDatabaseUrl,
45
- resolvePackageManagerVersion,
46
- scaffoldProject,
47
- syncManagedDriverDependencies,
48
- upsertAuthPackageDependencies,
49
- upsertCachePackageDependencies,
50
- upsertEventsPackageDependency,
51
- upsertMailPackageDependency,
52
- upsertNotificationsPackageDependency,
53
- upsertSecurityPackageDependency
54
- } from "./chunk-MZXN2YMI.mjs";
55
- import "./chunk-GSQ3HTRO.mjs";
56
- import "./chunk-H7TJ4FB3.mjs";
57
- import {
58
- isSupportedCacheInstallerDriver,
59
- isSupportedQueueInstallerDriver,
60
- normalizeScaffoldOptionalPackages,
61
- sanitizePackageName
62
- } from "./chunk-G5ADO27Q.mjs";
63
- export {
64
- authFeaturesRequireConfigUpdate,
65
- detectAuthInstallFeaturesFromConfig,
66
- hasLoadedConfigFile,
67
- inferConnectionDriver,
68
- inferDatabaseDriverFromUrl,
69
- injectBroadcastAuthEndpoint,
70
- installAuthIntoProject,
71
- installAuthorizationIntoProject,
72
- installBroadcastIntoProject,
73
- installCacheIntoProject,
74
- installEventsIntoProject,
75
- installMailIntoProject,
76
- installNotificationsIntoProject,
77
- installQueueIntoProject,
78
- installSecurityIntoProject,
79
- isSupportedCacheInstallerDriver,
80
- isSupportedQueueInstallerDriver,
81
- normalizeScaffoldEnvSegments,
82
- normalizeScaffoldOptionalPackages,
83
- renderAuthConfig,
84
- renderAuthEnvFiles,
85
- renderAuthMigration,
86
- renderAuthUserModel,
87
- renderCacheConfig,
88
- renderCacheEnvFiles,
89
- renderEnvFileContents,
90
- renderFrameworkFiles,
91
- renderFrameworkRunner,
92
- renderMailConfig,
93
- renderMediaConfig,
94
- renderNotificationsConfig,
95
- renderNotificationsMigration,
96
- renderQueueConfig,
97
- renderQueueEnvFiles,
98
- renderRedisConfig,
99
- renderScaffoldAppConfig,
100
- renderScaffoldDatabaseConfig,
101
- renderScaffoldEnvFiles,
102
- renderScaffoldGitignore,
103
- renderScaffoldPackageJson,
104
- renderScaffoldTsconfig,
105
- renderSecurityConfig,
106
- renderSessionConfig,
107
- renderStorageConfig,
108
- resolveBroadcastConfigTargetPath,
109
- resolveDefaultDatabaseUrl,
110
- resolvePackageManagerVersion,
111
- sanitizePackageName,
112
- scaffoldProject,
113
- syncManagedDriverDependencies,
114
- upsertAuthPackageDependencies,
115
- upsertCachePackageDependencies,
116
- upsertEventsPackageDependency,
117
- upsertMailPackageDependency,
118
- upsertNotificationsPackageDependency,
119
- upsertSecurityPackageDependency
120
- };
@@ -1,69 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- writeLine
4
- } from "./chunk-SRWJU3A5.mjs";
5
- import "./chunk-BWW5TDFI.mjs";
6
- import "./chunk-VT5IDQG6.mjs";
7
- import "./chunk-QFUSWV3J.mjs";
8
- import "./chunk-ET7UXHHQ.mjs";
9
- import "./chunk-3OTCSFDG.mjs";
10
- import {
11
- resolveProjectPackageImportSpecifier
12
- } from "./chunk-66FHW725.mjs";
13
-
14
- // src/security.ts
15
- import { loadConfigDirectory } from "@holo-js/config";
16
- async function loadSecurityCliModule(projectRoot) {
17
- const specifier = resolveProjectPackageImportSpecifier(projectRoot, "@holo-js/security");
18
- try {
19
- return await import(specifier);
20
- } catch (error) {
21
- const details = error instanceof Error ? error.message : String(error);
22
- throw new Error(
23
- `Unable to load @holo-js/security from ${projectRoot}. Install it with "holo install security". ${details}`
24
- );
25
- }
26
- }
27
- async function runRateLimitClearCommand(io, projectRoot, options, dependencies = {}) {
28
- const loadSecurityModule = dependencies.loadSecurityModule ?? loadSecurityCliModule;
29
- const loadConfig = dependencies.loadConfig ?? (async (root) => {
30
- const loaded = await loadConfigDirectory(root, {
31
- preferCache: false,
32
- processEnv: process.env
33
- });
34
- return { security: loaded.security };
35
- });
36
- const loadRedisAdapter = dependencies.loadRedisAdapter ?? (async (root) => {
37
- return await import(resolveProjectPackageImportSpecifier(root, "@holo-js/security/drivers/redis-adapter"));
38
- });
39
- const { security: securityConfig } = await loadConfig(projectRoot);
40
- const securityModule = await loadSecurityModule(projectRoot);
41
- const driver = securityConfig.rateLimit.driver;
42
- if (driver === "memory") {
43
- throw new Error("[security] The memory rate-limit driver is process-local and cannot be cleared meaningfully from the CLI.");
44
- }
45
- let redisAdapter;
46
- if (driver === "redis") {
47
- const { createSecurityRedisAdapter } = await loadRedisAdapter(projectRoot);
48
- redisAdapter = createSecurityRedisAdapter(securityConfig.rateLimit.redis);
49
- }
50
- try {
51
- await redisAdapter?.connect();
52
- const rateLimitStoreOptions = redisAdapter ? { projectRoot, redisAdapter } : { projectRoot };
53
- const rateLimitStore = securityModule.createRateLimitStoreFromConfig(securityConfig, rateLimitStoreOptions);
54
- securityModule.configureSecurityRuntime({
55
- config: securityConfig,
56
- rateLimitStore
57
- });
58
- const cleared = await securityModule.clearRateLimit(options);
59
- const count = typeof cleared === "boolean" ? cleared ? 1 : 0 : cleared;
60
- writeLine(io.stdout, `[security] Cleared ${count} rate-limit bucket(s).`);
61
- } finally {
62
- await redisAdapter?.close();
63
- securityModule.resetSecurityRuntime();
64
- }
65
- }
66
- export {
67
- loadSecurityCliModule,
68
- runRateLimitClearCommand
69
- };