Skip to content

Commit c1f7c0a

Browse files
committed
snapshot
1 parent ad2b13b commit c1f7c0a

8 files changed

Lines changed: 2264 additions & 1 deletion

File tree

scripts/config.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { LIB, SOURCE } from './lib/constants.ts';
1+
import { join } from 'node:path';
2+
import { LIB, SNAPSHOTS, SOURCE } from './lib/constants.ts';
23
import { fmt } from './lib/fmt.ts';
34

45
export const test: import('./lib/test.ts').Config = {
@@ -89,5 +90,9 @@ export const task: import('./task.ts').Config = {
8990
},
9091
},
9192
},
93+
snap: {
94+
description: `Process route trees from ${fmt.relativePath(join(SNAPSHOTS, 'routes.ts'))} and print the result trees (${fmt.glob('**/*.json')}) and compiled snippets (${fmt.glob('**/*.js')}) in ${fmt.relativePath(SNAPSHOTS)}.`,
95+
args: {},
96+
},
9297
},
9398
};

scripts/lib/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ export const NODE_MODULES = join(ROOT, 'node_modules');
88
export const LIB = join(NODE_MODULES, pkg.name);
99
export const BENCH = join(ROOT, 'bench');
1010
export const TESTS = join(ROOT, 'tests');
11+
export const SNAPSHOTS = join(ROOT, 'snapshots');

scripts/src/snap.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { join } from 'node:path';
2+
import { mkdirSync, writeFileSync } from 'node:fs';
3+
4+
import { format } from 'oxfmt';
5+
import oxfmtrc from '../../.oxfmtrc.jsonc';
6+
7+
import { router_init, router_set } from '@mapl/pattern-router';
8+
import { router_compile_to_code } from '@mapl/pattern-router/jit';
9+
10+
import { SNAPSHOTS } from '../lib/constants.ts';
11+
12+
import { routesList } from '../../snapshots/routes.ts';
13+
14+
const writeFormatted = async (pathFromSnap: string, content: string) => {
15+
pathFromSnap = join(SNAPSHOTS, pathFromSnap);
16+
writeFileSync(pathFromSnap, (await format(pathFromSnap, content, oxfmtrc)).code);
17+
};
18+
19+
{
20+
//
21+
// MAIN
22+
//
23+
try {
24+
mkdirSync(SNAPSHOTS);
25+
} catch {}
26+
27+
const promises = [];
28+
for (const [name, routeList] of Object.entries(routesList)) {
29+
const router = router_init<string>();
30+
for (let i = 0; i < routeList.length; i++) {
31+
const [method, path, id] = routeList[i];
32+
router_set(router, method, path, `return "${id}"`);
33+
}
34+
35+
promises.push(
36+
writeFormatted(
37+
name + '.js',
38+
`(m,p)=>{${router_compile_to_code(router, 'r', 'p', 'm')}return ''}`,
39+
),
40+
writeFormatted(name + '.json', JSON.stringify(router)),
41+
);
42+
}
43+
await Promise.all(promises);
44+
}

snapshots/complex api.js

Lines changed: 283 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,283 @@
1+
(m, p) => {
2+
if (m === 'POST') {
3+
if (p === '/auth/register') {
4+
return 'POST /auth/register';
5+
} else if (p === '/auth/login') {
6+
return 'POST /auth/login';
7+
} else if (p === '/auth/logout') {
8+
return 'POST /auth/logout';
9+
} else if (p === '/auth/refresh') {
10+
return 'POST /auth/refresh';
11+
} else if (p === '/auth/password/forgot') {
12+
return 'POST /auth/password/forgot';
13+
} else if (p === '/auth/password/reset') {
14+
return 'POST /auth/password/reset';
15+
} else if (p === '/auth/sso') {
16+
return 'POST /auth/sso';
17+
} else if (p === '/user') {
18+
return 'POST /user';
19+
} else if (p === '/user/me') {
20+
return 'POST /user/me';
21+
} else if (p === '/user/notifications/read-all') {
22+
return 'POST /user/notifications/read-all';
23+
} else if (p === '/org') {
24+
return 'POST /org';
25+
} else if (p === '/files/upload') {
26+
return 'POST /files/upload';
27+
} else if (p === '/search/filters') {
28+
return 'POST /search/filters';
29+
} else if (p === '/tags') {
30+
return 'POST /tags';
31+
} else if (p === '/admin/impersonate') {
32+
return 'POST /admin/impersonate';
33+
}
34+
{
35+
let r =
36+
/^\/(?:\x6frg\/(?<org>[^/]+)\/(?:\x72oles(?:()$|\/(?<role>[^/]+)()$)|\x6dembers(?:()$|\/(?<member>[^/]+)()$)|\x64omains(?:()$|\/(?<domain>[^/]+)()$)|\x70rojects(?:()$|\/(?<project>[^/]+)\/(?:\x74asks(?:()$|\/(?:\x61ttachments()$|\x74(?:\x61gs()$|\x69me\x2dentries(?:()$|\/(?<entry>[^/]+)()$))))|\x6dembers()$))|\x74asks\/(?<task>[^/]+)\/(?:\x73tatus()$|\x61(?:\x74tachments()$|\x73sign()$)|\x63omments()$|\x74(?:\x61gs()$|\x69me\x2dentries(?:()$|\/(?<entry>[^/]+)\/stop()$)))|\x62illing\/(?:\x69nvoices\/(?<invoice>[^/]+)()$|\x73ubscription(?:()$|\/cancel()$)|\x70ayment\x2dmethods()$)|\x61pi\x2dkeys()$|\x77ebhooks()$)|\x75ser(?:\/notifications\/(?<notification>[^/]+)\/read()$|\/(?<user>[^/]+)(?:()$|\/invites(?:()$|\/(?<invite>[^/]+)\/(?:\x72esend()$|\x61ccept()$)))))$/.exec(
37+
p,
38+
);
39+
if (r !== null) {
40+
if (r[2] === '') {
41+
return 'POST /org/:org/roles';
42+
} else if (r[4] === '') {
43+
return 'POST /org/:org/roles/:role';
44+
} else if (r[5] === '') {
45+
return 'POST /org/:org/members';
46+
} else if (r[7] === '') {
47+
return 'POST /org/:org/members/:member';
48+
} else if (r[8] === '') {
49+
return 'POST /org/:org/domains';
50+
} else if (r[10] === '') {
51+
return 'POST /org/:org/domains/:domain';
52+
} else if (r[11] === '') {
53+
return 'POST /org/:org/projects';
54+
} else if (r[13] === '') {
55+
return 'POST /org/:org/projects/:project/tasks';
56+
} else if (r[14] === '') {
57+
return 'POST /org/:org/projects/:project/tasks/attachments';
58+
} else if (r[15] === '') {
59+
return 'POST /org/:org/projects/:project/tasks/tags';
60+
} else if (r[16] === '') {
61+
return 'POST /org/:org/projects/:project/tasks/time-entries';
62+
} else if (r[18] === '') {
63+
return 'POST /org/:org/projects/:project/tasks/time-entries/:entry';
64+
} else if (r[19] === '') {
65+
return 'POST /org/:org/projects/:project/members';
66+
} else if (r[21] === '') {
67+
return 'POST /org/:org/tasks/:task/status';
68+
} else if (r[22] === '') {
69+
return 'POST /org/:org/tasks/:task/attachments';
70+
} else if (r[23] === '') {
71+
return 'POST /org/:org/tasks/:task/assign';
72+
} else if (r[24] === '') {
73+
return 'POST /org/:org/tasks/:task/comments';
74+
} else if (r[25] === '') {
75+
return 'POST /org/:org/tasks/:task/tags';
76+
} else if (r[26] === '') {
77+
return 'POST /org/:org/tasks/:task/time-entries';
78+
} else if (r[28] === '') {
79+
return 'POST /org/:org/tasks/:task/time-entries/:entry/stop';
80+
} else if (r[30] === '') {
81+
return 'POST /org/:org/billing/invoices/:invoice';
82+
} else if (r[31] === '') {
83+
return 'POST /org/:org/billing/subscription';
84+
} else if (r[32] === '') {
85+
return 'POST /org/:org/billing/subscription/cancel';
86+
} else if (r[33] === '') {
87+
return 'POST /org/:org/billing/payment-methods';
88+
} else if (r[34] === '') {
89+
return 'POST /org/:org/api-keys';
90+
} else if (r[35] === '') {
91+
return 'POST /org/:org/webhooks';
92+
} else if (r[37] === '') {
93+
return 'POST /user/notifications/:notification/read';
94+
} else if (r[39] === '') {
95+
return 'POST /user/:user';
96+
} else if (r[40] === '') {
97+
return 'POST /user/:user/invites';
98+
} else if (r[42] === '') {
99+
return 'POST /user/:user/invites/:invite/resend';
100+
} else if (r[43] === '') {
101+
return 'POST /user/:user/invites/:invite/accept';
102+
}
103+
}
104+
}
105+
} else if (m === 'GET') {
106+
if (p === '/auth/sso/providers') {
107+
return 'GET /auth/sso/providers';
108+
} else if (p === '/user/me') {
109+
return 'GET /user/me';
110+
} else if (p === '/user/me/preferences') {
111+
return 'GET /user/me/preferences';
112+
} else if (p === '/user/me/sessions') {
113+
return 'GET /user/me/sessions';
114+
} else if (p === '/user/notifications') {
115+
return 'GET /user/notifications';
116+
} else if (p === '/search') {
117+
return 'GET /search';
118+
} else if (p === '/search/filters') {
119+
return 'GET /search/filters';
120+
} else if (p === '/tags') {
121+
return 'GET /tags';
122+
} else if (p === '/status') {
123+
return 'GET /status';
124+
} else if (p === '/admin/reports/time') {
125+
return 'GET /admin/reports/time';
126+
} else if (p === '/admin/users') {
127+
return 'GET /admin/users';
128+
} else if (p === '/admin/projects') {
129+
return 'GET /admin/projects';
130+
} else if (p === '/admin/audit-logs') {
131+
return 'GET /admin/audit-logs';
132+
} else if (p === '/admin/stats') {
133+
return 'GET /admin/stats';
134+
}
135+
{
136+
let r =
137+
/^\/(?:\x6frg\/(?<org>[^/]+)(?:()$|\/(?:\x72oles()$|\x6dembers()$|\x64omains()$|\x70rojects\/(?<project>[^/]+)(?:()$|\/(?:\x61ctivity()$|\x6dembers()$|\x74asks(?:()$|\/(?:\x61ttachments()$|\x74ime\x2dentries()$))))|\x74asks(?:()$|\/(?<task>[^/]+)(?:()$|\/(?:\x74ime\x2dentries()$|\x63omments()$|\x61ttachments()$)))|\x62illing\/(?:\x73ubscription()$|\x70(?:\x61yment\x2dmethods()$|\x6cans()$)|\x69nvoices(?:()$|\/(?<invoice>[^/]+)()$))|\x61pi\x2dkeys()$|\x77ebhooks(?:()$|\/(?<hook>[^/]+)\/deliveries(?:()$|\/(?<delivery>[^/]+)()$))))|\x75ser\/(?<user>[^/]+)(?:()$|\/(?:\x69nvites\/(?<invite>[^/]+)()$|\x6eotifications()$))|\x66iles\/(?<file>.+)()$|\x61dmin\/reports\/(?:\x75sers\/(?<user>[^/]+)\/activity()$|\x70rojects\/(?<project>[^/]+)\/summary()$))$/.exec(
138+
p,
139+
);
140+
if (r !== null) {
141+
if (r[2] === '') {
142+
return 'GET /org/:org';
143+
} else if (r[3] === '') {
144+
return 'GET /org/:org/roles';
145+
} else if (r[4] === '') {
146+
return 'GET /org/:org/members';
147+
} else if (r[5] === '') {
148+
return 'GET /org/:org/domains';
149+
} else if (r[7] === '') {
150+
return 'GET /org/:org/projects/:project';
151+
} else if (r[8] === '') {
152+
return 'GET /org/:org/projects/:project/activity';
153+
} else if (r[9] === '') {
154+
return 'GET /org/:org/projects/:project/members';
155+
} else if (r[10] === '') {
156+
return 'GET /org/:org/projects/:project/tasks';
157+
} else if (r[11] === '') {
158+
return 'GET /org/:org/projects/:project/tasks/attachments';
159+
} else if (r[12] === '') {
160+
return 'GET /org/:org/projects/:project/tasks/time-entries';
161+
} else if (r[13] === '') {
162+
return 'GET /org/:org/tasks';
163+
} else if (r[15] === '') {
164+
return 'GET /org/:org/tasks/:task';
165+
} else if (r[16] === '') {
166+
return 'GET /org/:org/tasks/:task/time-entries';
167+
} else if (r[17] === '') {
168+
return 'GET /org/:org/tasks/:task/comments';
169+
} else if (r[18] === '') {
170+
return 'GET /org/:org/tasks/:task/attachments';
171+
} else if (r[19] === '') {
172+
return 'GET /org/:org/billing/subscription';
173+
} else if (r[20] === '') {
174+
return 'GET /org/:org/billing/payment-methods';
175+
} else if (r[21] === '') {
176+
return 'GET /org/:org/billing/plans';
177+
} else if (r[22] === '') {
178+
return 'GET /org/:org/billing/invoices';
179+
} else if (r[24] === '') {
180+
return 'GET /org/:org/billing/invoices/:invoice';
181+
} else if (r[25] === '') {
182+
return 'GET /org/:org/api-keys';
183+
} else if (r[26] === '') {
184+
return 'GET /org/:org/webhooks';
185+
} else if (r[28] === '') {
186+
return 'GET /org/:org/webhooks/:hook/deliveries';
187+
} else if (r[30] === '') {
188+
return 'GET /org/:org/webhooks/:hook/deliveries/:delivery';
189+
} else if (r[32] === '') {
190+
return 'GET /user/:user';
191+
} else if (r[34] === '') {
192+
return 'GET /user/:user/invites/:invite';
193+
} else if (r[35] === '') {
194+
return 'GET /user/:user/notifications';
195+
} else if (r[37] === '') {
196+
return 'GET /files/:file+';
197+
} else if (r[39] === '') {
198+
return 'GET /admin/reports/users/:user/activity';
199+
} else if (r[41] === '') {
200+
return 'GET /admin/reports/projects/:project/summary';
201+
}
202+
}
203+
}
204+
} else if (m === 'PATCH') {
205+
if (p === '/user/me/preferences') {
206+
return 'PATCH /user/me/preferences';
207+
}
208+
{
209+
let r =
210+
/^\/(?:\x73earch\/filters\/(?<filter>[^/]+)()$|\x6frg\/(?<org>[^/]+)(?:()$|\/(?:\x74asks\/(?<task>[^/]+)()$|\x70rojects\/(?<project>[^/]+)()$|\x77ebhooks\/(?<hook>[^/]+)()$))|\x74ags\/(?<tag>[^/]+)()$)$/.exec(
211+
p,
212+
);
213+
if (r !== null) {
214+
if (r[2] === '') {
215+
return 'PATCH /search/filters/:filter';
216+
} else if (r[4] === '') {
217+
return 'PATCH /org/:org';
218+
} else if (r[6] === '') {
219+
return 'PATCH /org/:org/tasks/:task';
220+
} else if (r[8] === '') {
221+
return 'PATCH /org/:org/projects/:project';
222+
} else if (r[10] === '') {
223+
return 'PATCH /org/:org/webhooks/:hook';
224+
} else if (r[12] === '') {
225+
return 'PATCH /tags/:tag';
226+
}
227+
}
228+
}
229+
} else if (m === 'DELETE') {
230+
{
231+
let r =
232+
/^\/(?:\x6frg\/(?<org>[^/]+)(?:()$|\/(?:\x74asks\/(?<task>[^/]+)(?:()$|\/(?:\x66ields\/(?<field>[^/]+)()$|\x74ags()$))|\x70rojects\/(?<project>[^/]+)(?:()$|\/tasks\/(?:\x66ields\/(?<field>[^/]+)()$|\x74ags()$))|\x62illing\/payment\x2dmethods\/(?<method>[^/]+)()$|\x61pi\x2dkeys\/(?<key>[^/]+)()$|\x77ebhooks\/(?<hook>[^/]+)()$))|\x75ser\/me\/sessions\/(?<session>[^/]+)()$|\x66iles\/(?<file>.+)()$|\x73earch\/filters\/(?<filter>[^/]+)()$|\x74ags\/(?<tag>[^/]+)()$)$/.exec(
233+
p,
234+
);
235+
if (r !== null) {
236+
if (r[2] === '') {
237+
return 'DELETE /org/:org';
238+
} else if (r[4] === '') {
239+
return 'DELETE /org/:org/tasks/:task';
240+
} else if (r[6] === '') {
241+
return 'DELETE /org/:org/tasks/:task/fields/:field';
242+
} else if (r[7] === '') {
243+
return 'DELETE /org/:org/tasks/:task/tags';
244+
} else if (r[9] === '') {
245+
return 'DELETE /org/:org/projects/:project';
246+
} else if (r[11] === '') {
247+
return 'DELETE /org/:org/projects/:project/tasks/fields/:field';
248+
} else if (r[12] === '') {
249+
return 'DELETE /org/:org/projects/:project/tasks/tags';
250+
} else if (r[14] === '') {
251+
return 'DELETE /org/:org/billing/payment-methods/:method';
252+
} else if (r[16] === '') {
253+
return 'DELETE /org/:org/api-keys/:key';
254+
} else if (r[18] === '') {
255+
return 'DELETE /org/:org/webhooks/:hook';
256+
} else if (r[20] === '') {
257+
return 'DELETE /user/me/sessions/:session';
258+
} else if (r[22] === '') {
259+
return 'DELETE /files/:file+';
260+
} else if (r[24] === '') {
261+
return 'DELETE /search/filters/:filter';
262+
} else if (r[26] === '') {
263+
return 'DELETE /tags/:tag';
264+
}
265+
}
266+
}
267+
} else if (m === 'PUT') {
268+
{
269+
let r =
270+
/^\/org\/(?<org>[^/]+)\/(?:\x74asks\/(?<task>[^/]+)\/fields\/(?<field>[^/]+)()$|\x70rojects\/(?<project>[^/]+)\/tasks\/fields\/(?<field>[^/]+)()$)$/.exec(
271+
p,
272+
);
273+
if (r !== null) {
274+
if (r[4] === '') {
275+
return 'PUT /org/:org/tasks/:task/fields/:field';
276+
} else if (r[7] === '') {
277+
return 'PUT /org/:org/projects/:project/tasks/fields/:field';
278+
}
279+
}
280+
}
281+
}
282+
return '';
283+
};

0 commit comments

Comments
 (0)