@liquidmetal-ai/drizzle 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/.changeset/README.md +4 -0
  2. package/.changeset/config.json +11 -0
  3. package/.changeset/odd-plums-dress.md +7 -0
  4. package/.turbo/turbo-build.log +6 -0
  5. package/dist/appify/build.d.ts +130 -0
  6. package/dist/appify/build.d.ts.map +1 -0
  7. package/dist/appify/build.js +703 -0
  8. package/dist/appify/build.test.d.ts +2 -0
  9. package/dist/appify/build.test.d.ts.map +1 -0
  10. package/dist/appify/build.test.js +111 -0
  11. package/dist/appify/index.d.ts +8 -0
  12. package/dist/appify/index.d.ts.map +1 -0
  13. package/dist/appify/index.js +28 -0
  14. package/dist/appify/index.test.d.ts +2 -0
  15. package/dist/appify/index.test.d.ts.map +1 -0
  16. package/dist/appify/index.test.js +40 -0
  17. package/dist/appify/parse.d.ts +151 -0
  18. package/dist/appify/parse.d.ts.map +1 -0
  19. package/dist/appify/parse.js +579 -0
  20. package/dist/appify/parse.test.d.ts +2 -0
  21. package/dist/appify/parse.test.d.ts.map +1 -0
  22. package/dist/appify/parse.test.js +319 -0
  23. package/dist/appify/validate.d.ts +22 -0
  24. package/dist/appify/validate.d.ts.map +1 -0
  25. package/dist/appify/validate.js +346 -0
  26. package/dist/appify/validate.test.d.ts +2 -0
  27. package/dist/appify/validate.test.d.ts.map +1 -0
  28. package/dist/appify/validate.test.js +327 -0
  29. package/dist/codestore.d.ts +34 -0
  30. package/dist/codestore.d.ts.map +1 -0
  31. package/dist/codestore.js +54 -0
  32. package/dist/codestore.test.d.ts +2 -0
  33. package/dist/codestore.test.d.ts.map +1 -0
  34. package/dist/codestore.test.js +84 -0
  35. package/dist/liquidmetal/v1alpha1/catalog_connect.d.ts +147 -0
  36. package/dist/liquidmetal/v1alpha1/catalog_connect.d.ts.map +1 -0
  37. package/dist/liquidmetal/v1alpha1/catalog_connect.js +150 -0
  38. package/dist/liquidmetal/v1alpha1/catalog_pb.d.ts +965 -0
  39. package/dist/liquidmetal/v1alpha1/catalog_pb.d.ts.map +1 -0
  40. package/dist/liquidmetal/v1alpha1/catalog_pb.js +1486 -0
  41. package/dist/liquidmetal/v1alpha1/rainbow_auth_connect.d.ts +49 -0
  42. package/dist/liquidmetal/v1alpha1/rainbow_auth_connect.d.ts.map +1 -0
  43. package/dist/liquidmetal/v1alpha1/rainbow_auth_connect.js +52 -0
  44. package/dist/liquidmetal/v1alpha1/rainbow_auth_pb.d.ts +271 -0
  45. package/dist/liquidmetal/v1alpha1/rainbow_auth_pb.d.ts.map +1 -0
  46. package/dist/liquidmetal/v1alpha1/rainbow_auth_pb.js +381 -0
  47. package/dist/liquidmetal/v1alpha1/raindrop_pb.d.ts +38 -0
  48. package/dist/liquidmetal/v1alpha1/raindrop_pb.d.ts.map +1 -0
  49. package/dist/liquidmetal/v1alpha1/raindrop_pb.js +52 -0
  50. package/dist/unsafe/codestore.d.ts +10 -0
  51. package/dist/unsafe/codestore.d.ts.map +1 -0
  52. package/dist/unsafe/codestore.js +23 -0
  53. package/dist/unsafe/codestore.test.d.ts +2 -0
  54. package/dist/unsafe/codestore.test.d.ts.map +1 -0
  55. package/dist/unsafe/codestore.test.js +27 -0
  56. package/eslint.config.mjs +4 -0
  57. package/package.json +45 -0
  58. package/src/appify/build.test.ts +116 -0
  59. package/src/appify/build.ts +783 -0
  60. package/src/appify/index.test.ts +43 -0
  61. package/src/appify/index.ts +33 -0
  62. package/src/appify/parse.test.ts +337 -0
  63. package/src/appify/parse.ts +744 -0
  64. package/src/appify/validate.test.ts +341 -0
  65. package/src/appify/validate.ts +435 -0
  66. package/src/codestore.test.ts +98 -0
  67. package/src/codestore.ts +93 -0
  68. package/src/liquidmetal/v1alpha1/catalog_connect.ts +153 -0
  69. package/src/liquidmetal/v1alpha1/catalog_pb.ts +1827 -0
  70. package/src/liquidmetal/v1alpha1/rainbow_auth_connect.ts +55 -0
  71. package/src/liquidmetal/v1alpha1/rainbow_auth_pb.ts +476 -0
  72. package/src/liquidmetal/v1alpha1/raindrop_pb.ts +63 -0
  73. package/src/unsafe/codestore.test.ts +34 -0
  74. package/src/unsafe/codestore.ts +29 -0
  75. package/tsconfig.json +31 -0
  76. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,341 @@
1
+ import { expect, test } from 'vitest';
2
+ import { buildManifest } from './build.js';
3
+ import { Parser, Tokenizer } from './parse.js';
4
+ import { validate, VALIDATORS } from './validate.js';
5
+
6
+ test('validate nothing', async () => {
7
+ const manifest = `
8
+ application "my-app" {
9
+ service "my-service" {}
10
+ actor "my-actor" {}
11
+ observer "my-observer" {}
12
+ bucket "my-bucket" {}
13
+ queue "my-queue" {}
14
+ }
15
+ `;
16
+ const tokenizer = new Tokenizer(manifest);
17
+ const parser = new Parser(tokenizer);
18
+ const parsedManifest = parser.parse();
19
+ const [builtApps] = buildManifest(parsedManifest);
20
+ const validateErrors = await validate(builtApps, VALIDATORS);
21
+ expect(validateErrors).toEqual([]);
22
+ });
23
+
24
+ test('validate bad binds', async () => {
25
+ const manifest = `
26
+ application "my-app" {
27
+ service "my-service" {
28
+ binding {
29
+ bad_bind = "my-missing-service"
30
+ }
31
+ }
32
+ `;
33
+ const tokenizer = new Tokenizer(manifest);
34
+ const parser = new Parser(tokenizer);
35
+ const parsedManifest = parser.parse();
36
+ const [builtApps] = buildManifest(parsedManifest);
37
+ const validateErrors = await validate(builtApps, VALIDATORS);
38
+ expect(validateErrors).toMatchObject([
39
+ {
40
+ message: 'binding names should be UPPER_SNAKE_CASE',
41
+ line: 5,
42
+ column: 7,
43
+ start: 69,
44
+ end: 77,
45
+ severity: 'warning',
46
+ },
47
+ {
48
+ message: 'binding "my-missing-service" not found',
49
+ line: 5,
50
+ column: 18,
51
+ start: 80,
52
+ end: 100,
53
+ severity: 'error',
54
+ },
55
+ ]);
56
+ });
57
+
58
+ test('domainValidator', async () => {
59
+ const manifest = `
60
+ application "my-app" {
61
+ service "my-service" {
62
+ domain {
63
+ fqdn = "not-valid.com_foo"
64
+ }
65
+ }
66
+ }
67
+ `;
68
+ const tokenizer = new Tokenizer(manifest);
69
+ const parser = new Parser(tokenizer);
70
+ const parsedManifest = parser.parse();
71
+ const [builtApps] = buildManifest(parsedManifest);
72
+ const validateErrors = await validate(builtApps, VALIDATORS);
73
+ expect(validateErrors).toMatchObject([
74
+ {
75
+ message: 'domain "not-valid.com_foo" is an invalid domain name',
76
+ line: 5,
77
+ column: 14,
78
+ start: 75,
79
+ end: 94,
80
+ severity: 'warning',
81
+ },
82
+ ]);
83
+ });
84
+
85
+ test('visibilityValidator', async () => {
86
+ const manifest = `
87
+ application "my-app" {
88
+ service "my-service" {
89
+ visibility = 'not-a-visibility'
90
+ }
91
+ }
92
+ `;
93
+ const tokenizer = new Tokenizer(manifest);
94
+ const parser = new Parser(tokenizer);
95
+ const parsedManifest = parser.parse();
96
+ const [builtApps] = buildManifest(parsedManifest);
97
+ const validateErrors = await validate(builtApps, VALIDATORS);
98
+ expect(validateErrors).toMatchObject([
99
+ {
100
+ message: 'visibility must be one of none, public, private, protected, application, suite, tenant',
101
+ line: 4,
102
+ column: 18,
103
+ start: 66,
104
+ end: 84,
105
+ severity: 'error',
106
+ },
107
+ ]);
108
+ });
109
+
110
+ test('nameValidator', async () => {
111
+ const manifest = `
112
+ application "MyApp" {
113
+ service "my-service" {}
114
+ }
115
+ `;
116
+ const tokenizer = new Tokenizer(manifest);
117
+ const parser = new Parser(tokenizer);
118
+ const parsedManifest = parser.parse();
119
+ const [builtApps] = buildManifest(parsedManifest);
120
+ const validateErrors = await validate(builtApps, VALIDATORS);
121
+ expect(validateErrors).toMatchObject([
122
+ {
123
+ message: 'name must be lowercase and dash-separated',
124
+ line: 2,
125
+ column: 13,
126
+ start: 13,
127
+ end: 20,
128
+ severity: 'error',
129
+ },
130
+ ]);
131
+ });
132
+
133
+ test('duplicateModuleValidator', async () => {
134
+ const manifest = `
135
+ application "my-app" {
136
+ service "my-service" {}
137
+
138
+ service "my-service" {}
139
+ }
140
+ `;
141
+ const tokenizer = new Tokenizer(manifest);
142
+ const parser = new Parser(tokenizer);
143
+ const parsedManifest = parser.parse();
144
+ const [builtApps] = buildManifest(parsedManifest);
145
+ const validateErrors = await validate(builtApps, VALIDATORS);
146
+ expect(validateErrors).toMatchObject([
147
+ {
148
+ message: 'module my-service has already been defined',
149
+ line: 5,
150
+ column: 11,
151
+ start: 61,
152
+ end: 73,
153
+ severity: 'error',
154
+ },
155
+ ]);
156
+ });
157
+
158
+ test('validate env var format', async () => {
159
+ const manifest = `
160
+ application "my-app" {
161
+ service "my-service" {
162
+ env "MY_ENV_VAR" {}
163
+ }
164
+ }
165
+ `;
166
+ const tokenizer = new Tokenizer(manifest);
167
+ const parser = new Parser(tokenizer);
168
+ const parsedManifest = parser.parse();
169
+ const [builtApps] = buildManifest(parsedManifest);
170
+ const validateErrors = await validate(builtApps, VALIDATORS);
171
+ expect(validateErrors).toEqual([]);
172
+ });
173
+
174
+ test('validate vector missing parameters', async () => {
175
+ const manifest = `
176
+ application "my-app" {
177
+ service "my-service" {}
178
+ vector_index "my-index" {
179
+ }
180
+ }
181
+ `;
182
+ const tokenizer = new Tokenizer(manifest);
183
+ const parser = new Parser(tokenizer);
184
+ const parsedManifest = parser.parse();
185
+ const [builtApps] = buildManifest(parsedManifest);
186
+ const validateErrors = await validate(builtApps, VALIDATORS);
187
+ expect(validateErrors).toMatchObject([
188
+ {
189
+ message: 'vector index must have a dimension',
190
+ },
191
+ {
192
+ message: 'vector index metric must be either cosine or euclidean',
193
+ },
194
+ ]);
195
+ });
196
+
197
+ test('validate vector index parameters', async () => {
198
+ const manifest = `
199
+ application "my-app" {
200
+ service "my-service" {}
201
+ vector_index "my-index" {
202
+ dimension = 128.9
203
+ metric = "cosine"
204
+ }
205
+ }
206
+ `;
207
+ const tokenizer = new Tokenizer(manifest);
208
+ const parser = new Parser(tokenizer);
209
+ const parsedManifest = parser.parse();
210
+ const [builtApps] = buildManifest(parsedManifest);
211
+ const validateErrors = await validate(builtApps, VALIDATORS);
212
+ expect(validateErrors).toMatchObject([
213
+ {
214
+ message: 'vector index dimension must be an integer',
215
+ },
216
+ ]);
217
+ });
218
+
219
+ test('observer source validator', async () => {
220
+ let manifest = `
221
+ application "my-app" {
222
+ observer "my-observer" {
223
+ source {
224
+ service = "my-service"
225
+ }
226
+ }
227
+ }
228
+ `;
229
+ let tokenizer = new Tokenizer(manifest);
230
+ let parser = new Parser(tokenizer);
231
+ let parsedManifest = parser.parse();
232
+ let [builtApps] = buildManifest(parsedManifest);
233
+ let validateErrors = await validate(builtApps, VALIDATORS);
234
+ expect(validateErrors).toMatchObject([
235
+ {
236
+ message: 'observer source must have either a bucket or a queue',
237
+ },
238
+ ]);
239
+
240
+ manifest = `
241
+ application "my-app" {
242
+ observer "my-observer" {
243
+ source {
244
+ bucket = "my-bucket"
245
+ queue = "my-queue"
246
+ }
247
+ }
248
+ }
249
+ `;
250
+ tokenizer = new Tokenizer(manifest);
251
+ parser = new Parser(tokenizer);
252
+ parsedManifest = parser.parse();
253
+ [builtApps] = buildManifest(parsedManifest);
254
+ validateErrors = await validate(builtApps, VALIDATORS);
255
+ expect(validateErrors).toMatchObject([
256
+ {
257
+ message: 'observer source can only have one of bucket or queue',
258
+ },
259
+ {
260
+ message: 'bucket "my-bucket" not found',
261
+ },
262
+ {
263
+ message: 'queue "my-queue" not found',
264
+ },
265
+ ]);
266
+
267
+ manifest = `
268
+ application "my-app" {
269
+ observer "my-observer" {
270
+ source {
271
+ bucket = "my-bucket"
272
+ }
273
+ }
274
+ }
275
+ `;
276
+ tokenizer = new Tokenizer(manifest);
277
+ parser = new Parser(tokenizer);
278
+ parsedManifest = parser.parse();
279
+ [builtApps] = buildManifest(parsedManifest);
280
+ validateErrors = await validate(builtApps, VALIDATORS);
281
+ expect(validateErrors).toMatchObject([
282
+ {
283
+ message: 'bucket "my-bucket" not found',
284
+ },
285
+ ]);
286
+
287
+ manifest = `
288
+ application "my-app" {
289
+ observer "my-observer" {
290
+ source {
291
+ bucket = "my-bucket"
292
+ }
293
+ source {
294
+ bucket = "my-bucket"
295
+ }
296
+ }
297
+ }
298
+ `;
299
+ tokenizer = new Tokenizer(manifest);
300
+ parser = new Parser(tokenizer);
301
+ parsedManifest = parser.parse();
302
+ [builtApps] = buildManifest(parsedManifest);
303
+ validateErrors = await validate(builtApps, VALIDATORS);
304
+ expect(validateErrors).toMatchObject([
305
+ {
306
+ message: 'bucket "my-bucket" not found',
307
+ },
308
+ {
309
+ message: 'bucket "my-bucket" not found',
310
+ },
311
+ {
312
+ message: 'source my-bucket is duplicated',
313
+ },
314
+ ]);
315
+
316
+ manifest = `
317
+ application "my-app" {
318
+ queue "my-queue" {}
319
+ observer "my-observer" {
320
+ source {
321
+ queue = "my-queue"
322
+ rule {
323
+ actions = ['PutObject']
324
+ prefix = ''
325
+ suffix = ''
326
+ }
327
+ }
328
+ }
329
+ }
330
+ `;
331
+ tokenizer = new Tokenizer(manifest);
332
+ parser = new Parser(tokenizer);
333
+ parsedManifest = parser.parse();
334
+ [builtApps] = buildManifest(parsedManifest);
335
+ validateErrors = await validate(builtApps, VALIDATORS);
336
+ expect(validateErrors).toMatchObject([
337
+ {
338
+ message: 'queue sources do not have bucket notification rules',
339
+ },
340
+ ]);
341
+ });