@lensjs/adonis 1.0.12 → 1.1.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/build/configure.js +16 -2
- package/build/providers/lens_service_provider.js +2 -1
- package/build/src/adapter.d.ts +2 -1
- package/build/src/adapter.js +79 -5
- package/build/src/define_config.d.ts +1 -0
- package/build/src/middlewares/lens_middleware.d.ts +12 -0
- package/build/src/middlewares/lens_middleware.js +10 -0
- package/build/src/utils/index.d.ts +1 -0
- package/build/src/utils/index.js +10 -0
- package/build/stubs/config/lens.stub +1 -0
- package/package.json +2 -2
package/build/configure.js
CHANGED
|
@@ -15,12 +15,13 @@ import { stubsRoot } from './stubs/main.js';
|
|
|
15
15
|
const registerEnvValidation = async (codemods) => {
|
|
16
16
|
try {
|
|
17
17
|
await codemods.defineEnvValidations({
|
|
18
|
-
leadingComment: '
|
|
18
|
+
leadingComment: 'LensJs variables',
|
|
19
19
|
variables: {
|
|
20
20
|
LENS_BASE_PATH: 'Env.schema.string.optional()',
|
|
21
21
|
LENS_ENABLED: 'Env.schema.boolean.optional()',
|
|
22
22
|
LENS_ENABLE_QUERY_WATCHER: 'Env.schema.boolean.optional()',
|
|
23
23
|
LENS_ENABLE_REQUEST_WATCHER: 'Env.schema.boolean.optional()',
|
|
24
|
+
LENS_ENABLE_CACHE_WATCHER: 'Env.schema.boolean.optional()',
|
|
24
25
|
},
|
|
25
26
|
});
|
|
26
27
|
}
|
|
@@ -28,11 +29,24 @@ const registerEnvValidation = async (codemods) => {
|
|
|
28
29
|
console.error(error);
|
|
29
30
|
}
|
|
30
31
|
};
|
|
32
|
+
const registerMiddleware = async (codemods) => {
|
|
33
|
+
try {
|
|
34
|
+
codemods.registerMiddleware('router', [
|
|
35
|
+
{
|
|
36
|
+
path: '@lens/adonis/lens_middleware',
|
|
37
|
+
},
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error(error);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
31
44
|
export async function configure(command) {
|
|
32
45
|
const codemods = await command.createCodemods();
|
|
33
46
|
await registerEnvValidation(codemods);
|
|
47
|
+
await registerMiddleware(codemods);
|
|
34
48
|
await codemods.makeUsingStub(stubsRoot, 'config/lens.stub', {});
|
|
35
49
|
await codemods.updateRcFile((rcFile) => {
|
|
36
|
-
rcFile.addProvider('@
|
|
50
|
+
rcFile.addProvider('@lens/adonis/lens_provider');
|
|
37
51
|
});
|
|
38
52
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { configProvider } from '@adonisjs/core';
|
|
2
2
|
import { RuntimeException } from '@poppinss/utils';
|
|
3
|
-
import { Lens, lensUtils, RequestWatcher, QueryWatcher } from '@lensjs/core';
|
|
3
|
+
import { Lens, lensUtils, RequestWatcher, QueryWatcher, CacheWatcher } from '@lensjs/core';
|
|
4
4
|
import AdonisAdapter from '../src/adapter.js';
|
|
5
5
|
export default class LensServiceProvider {
|
|
6
6
|
app;
|
|
@@ -20,6 +20,7 @@ export default class LensServiceProvider {
|
|
|
20
20
|
const watchersMap = {
|
|
21
21
|
requests: new RequestWatcher(),
|
|
22
22
|
queries: new QueryWatcher(),
|
|
23
|
+
cache: new CacheWatcher(),
|
|
23
24
|
};
|
|
24
25
|
const allowedWatchers = Object.keys(config.watchers)
|
|
25
26
|
.filter((watcher) => config.watchers[watcher])
|
package/build/src/adapter.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RouteDefinition, LensAdapter, RequestWatcher, QueryWatcher } from '@lensjs/core';
|
|
1
|
+
import { RouteDefinition, LensAdapter, RequestWatcher, QueryWatcher, CacheWatcher } from '@lensjs/core';
|
|
2
2
|
import type { ApplicationService, EmitterService, HttpRouterService } from '@adonisjs/core/types';
|
|
3
3
|
import { LensConfig } from './define_config.js';
|
|
4
4
|
export default class AdonisAdapter extends LensAdapter {
|
|
@@ -16,6 +16,7 @@ export default class AdonisAdapter extends LensAdapter {
|
|
|
16
16
|
registerRoutes(routes: RouteDefinition[]): void;
|
|
17
17
|
protected watchRequests(requestWatcher: RequestWatcher): void;
|
|
18
18
|
protected watchQueries(queryWatcher: QueryWatcher): Promise<void>;
|
|
19
|
+
protected watchCache(watcher: CacheWatcher): Promise<void>;
|
|
19
20
|
serveUI(uiPath: string, spaRoute: string, _dataToInject: Record<string, any>): void;
|
|
20
21
|
private matchStaticFiles;
|
|
21
22
|
private getUserFromContext;
|
package/build/src/adapter.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { LensAdapter, WatcherTypeEnum, lensUtils, } from '@lensjs/core';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
import { shouldIgnoreLogging } from './utils/index.js';
|
|
3
|
+
import { assertCacheBindingRegistered, shouldIgnoreLogging } from './utils/index.js';
|
|
4
4
|
import string from '@adonisjs/core/helpers/string';
|
|
5
|
-
import {
|
|
5
|
+
import { HttpContext } from '@adonisjs/core/http';
|
|
6
|
+
import { nowISO } from '@lensjs/date';
|
|
7
|
+
import emitter from '@adonisjs/core/services/emitter';
|
|
6
8
|
export default class AdonisAdapter extends LensAdapter {
|
|
7
9
|
app;
|
|
8
10
|
router;
|
|
@@ -28,6 +30,9 @@ export default class AdonisAdapter extends LensAdapter {
|
|
|
28
30
|
this.queryWatcher = watcher;
|
|
29
31
|
await this.watchQueries(watcher);
|
|
30
32
|
break;
|
|
33
|
+
case WatcherTypeEnum.CACHE:
|
|
34
|
+
this.watchCache(watcher);
|
|
35
|
+
break;
|
|
31
36
|
}
|
|
32
37
|
}
|
|
33
38
|
});
|
|
@@ -54,7 +59,7 @@ export default class AdonisAdapter extends LensAdapter {
|
|
|
54
59
|
if (self.shouldIgnorePath(event.ctx.request.url(false)))
|
|
55
60
|
return;
|
|
56
61
|
const request = event.ctx.request;
|
|
57
|
-
const requestId = lensUtils.generateRandomUuid();
|
|
62
|
+
const requestId = event.ctx.request.lensEntry?.requestId ?? lensUtils.generateRandomUuid();
|
|
58
63
|
const logPayload = {
|
|
59
64
|
request: {
|
|
60
65
|
id: requestId,
|
|
@@ -82,20 +87,89 @@ export default class AdonisAdapter extends LensAdapter {
|
|
|
82
87
|
if (shouldIgnoreLogging(self.app))
|
|
83
88
|
return;
|
|
84
89
|
// @ts-ignore
|
|
85
|
-
|
|
90
|
+
emitter.on('db:query', async function (query) {
|
|
91
|
+
const requestId = HttpContext.get()?.request.lensEntry?.requestId;
|
|
86
92
|
const duration = query.duration ? string.prettyHrTime(query.duration) : '0 ms';
|
|
87
93
|
const payload = {
|
|
88
94
|
query: lensUtils.formatSqlQuery(lensUtils.interpolateQuery(query.sql, query.bindings), self.config.watchers.queries.provider),
|
|
89
95
|
duration,
|
|
90
|
-
createdAt:
|
|
96
|
+
createdAt: nowISO(),
|
|
91
97
|
type: self.config.watchers.queries.provider,
|
|
92
98
|
};
|
|
93
99
|
await queryWatcher.log({
|
|
94
100
|
data: payload,
|
|
101
|
+
requestId,
|
|
95
102
|
});
|
|
96
103
|
});
|
|
97
104
|
});
|
|
98
105
|
}
|
|
106
|
+
async watchCache(watcher) {
|
|
107
|
+
if (!this.config.watchers.cache)
|
|
108
|
+
return;
|
|
109
|
+
assertCacheBindingRegistered(this.app);
|
|
110
|
+
// Clear
|
|
111
|
+
// @ts-expect-error
|
|
112
|
+
this.emitter.on('cache:cleared', async (event) => {
|
|
113
|
+
await watcher.log({
|
|
114
|
+
action: 'clear',
|
|
115
|
+
data: {
|
|
116
|
+
key: event.key,
|
|
117
|
+
},
|
|
118
|
+
createdAt: nowISO(),
|
|
119
|
+
requestId: HttpContext.get()?.request.lensEntry?.requestId,
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
// Write
|
|
123
|
+
// @ts-expect-error
|
|
124
|
+
this.emitter.on('cache:written', async (event) => {
|
|
125
|
+
await watcher.log({
|
|
126
|
+
action: 'write',
|
|
127
|
+
data: {
|
|
128
|
+
key: event.key,
|
|
129
|
+
value: event.value,
|
|
130
|
+
},
|
|
131
|
+
createdAt: nowISO(),
|
|
132
|
+
requestId: HttpContext.get()?.request.lensEntry?.requestId,
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
// Hit
|
|
136
|
+
// @ts-expect-error
|
|
137
|
+
this.emitter.on('cache:hit', async (event) => {
|
|
138
|
+
await watcher.log({
|
|
139
|
+
action: 'hit',
|
|
140
|
+
data: {
|
|
141
|
+
key: event.key,
|
|
142
|
+
value: event.value,
|
|
143
|
+
},
|
|
144
|
+
createdAt: nowISO(),
|
|
145
|
+
requestId: HttpContext.get()?.request.lensEntry?.requestId,
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
// Miss
|
|
149
|
+
// @ts-expect-error
|
|
150
|
+
this.emitter.on('cache:miss', async (event) => {
|
|
151
|
+
await watcher.log({
|
|
152
|
+
action: 'miss',
|
|
153
|
+
data: {
|
|
154
|
+
key: event.key,
|
|
155
|
+
},
|
|
156
|
+
createdAt: nowISO(),
|
|
157
|
+
requestId: HttpContext.get()?.request.lensEntry?.requestId,
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
// Delete
|
|
161
|
+
// @ts-expect-error
|
|
162
|
+
this.emitter.on('cache:deleted', async (event) => {
|
|
163
|
+
await watcher.log({
|
|
164
|
+
action: 'delete',
|
|
165
|
+
data: {
|
|
166
|
+
key: event.key,
|
|
167
|
+
},
|
|
168
|
+
createdAt: nowISO(),
|
|
169
|
+
requestId: HttpContext.get()?.request.lensEntry?.requestId,
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
}
|
|
99
173
|
serveUI(uiPath, spaRoute, _dataToInject) {
|
|
100
174
|
this.app.booted(async () => {
|
|
101
175
|
this.router.get(`/${spaRoute}/favicon.ico`, (ctx) => {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { HttpContext } from '@adonisjs/core/http';
|
|
2
|
+
import type { NextFn } from '@adonisjs/core/types/http';
|
|
3
|
+
declare module '@adonisjs/core/http' {
|
|
4
|
+
interface Request {
|
|
5
|
+
lensEntry?: {
|
|
6
|
+
requestId: string;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export default class LensMiddleware {
|
|
11
|
+
handle(ctx: HttpContext, next: NextFn): Promise<any>;
|
|
12
|
+
}
|
|
@@ -3,6 +3,7 @@ import { HttpContext } from '@adonisjs/core/http';
|
|
|
3
3
|
import { LensConfig } from '../define_config.js';
|
|
4
4
|
export declare const runningInConsole: (app: ApplicationService) => boolean;
|
|
5
5
|
export declare const getRunningCommand: () => string;
|
|
6
|
+
export declare const assertCacheBindingRegistered: (app: ApplicationService) => void;
|
|
6
7
|
export declare function allowedCommands(): boolean;
|
|
7
8
|
export declare const shouldIgnoreLogging: (app: ApplicationService) => boolean;
|
|
8
9
|
export declare const resolveConfigFromContext: (ctx: HttpContext) => Promise<LensConfig>;
|
package/build/src/utils/index.js
CHANGED
|
@@ -20,6 +20,16 @@ before creating a new Ignitor instance in:
|
|
|
20
20
|
}
|
|
21
21
|
return cmd;
|
|
22
22
|
};
|
|
23
|
+
export const assertCacheBindingRegistered = (app) => {
|
|
24
|
+
if (!app.container.hasBinding('cache.manager')) {
|
|
25
|
+
const message = `
|
|
26
|
+
${chalk.red.bold('✖ Cache binding not registered')}
|
|
27
|
+
|
|
28
|
+
Make sure to install @adonisjs/cache package to use cache watcher.
|
|
29
|
+
`;
|
|
30
|
+
throw new Error(message);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
23
33
|
export function allowedCommands() {
|
|
24
34
|
const command = getRunningCommand();
|
|
25
35
|
return ['queue:listen', 'schedule:work'].includes(command ?? 'WRONG');
|
|
@@ -12,6 +12,7 @@ const lensConfig = defineConfig({
|
|
|
12
12
|
onlyPaths: [],
|
|
13
13
|
watchers: {
|
|
14
14
|
requests: env.get('LENS_ENABLE_REQUEST_WATCHER', true),
|
|
15
|
+
cache: env.get('LENS_ENABLE_CACHE_WATCHER', false),
|
|
15
16
|
queries: {
|
|
16
17
|
enabled: env.get('LENS_ENABLE_QUERY_WATCHER', true),
|
|
17
18
|
provider: 'sqlite', // Change to your database provider
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lensjs/adonis",
|
|
3
3
|
"description": "AdonisJs adapter for lens package",
|
|
4
|
-
"version": "1.0
|
|
4
|
+
"version": "1.1.0",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=20.6.0"
|
|
7
7
|
},
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"dependencies": {
|
|
48
48
|
"@poppinss/utils": "^6.10.1",
|
|
49
49
|
"chalk": "^5.6.0",
|
|
50
|
-
"@lensjs/core": "
|
|
50
|
+
"@lensjs/core": "2.0.0",
|
|
51
51
|
"@lensjs/date": "1.0.12"
|
|
52
52
|
},
|
|
53
53
|
"publishConfig": {
|