@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,111 @@
1
+ import { expect, test } from 'vitest';
2
+ import { buildManifest } from './build.js';
3
+ import { Parser, Tokenizer } from './parse.js';
4
+ const CONFIG = `
5
+ application "my-app" {
6
+ env "ACCOUNT_ID" {}
7
+
8
+ service "my-service" {
9
+ route {
10
+ zone = "testymctestface.com"
11
+ pattern = "testymctestface.com/*"
12
+ }
13
+
14
+ domain {
15
+ fqdn = "testy.testymctestface.com"
16
+ }
17
+
18
+ binding {
19
+ // This is a binding of foo to "bar".
20
+ FOO = "bar" // this is a comment
21
+ }
22
+
23
+ // comment
24
+ env "API_KEY" {
25
+ secret = true
26
+ }
27
+
28
+ env "API_URL" {
29
+ // Empty but has a comment.
30
+ }
31
+ env "API_PATH" {}
32
+ }
33
+
34
+ bucket "my-bucket" {
35
+ visibility = 'public'
36
+ }
37
+
38
+ observer "my-observer" {
39
+ env "API_KEY" {}
40
+ source {
41
+ bucket = "my-bucket"
42
+ rule {
43
+ actions = ['PutObject', 'DeleteObject']
44
+ prefix = "/stuff"
45
+ suffix = ".csv"
46
+ }
47
+ }
48
+ }
49
+
50
+ actor "my-actor" {
51
+ env "API_KEY" {}
52
+ binding {
53
+ FOO = "bar"
54
+ }
55
+ visibility = 'protected'
56
+ }
57
+
58
+ queue "my-queue" {
59
+ visibility = 'application'
60
+ }
61
+
62
+ sql_database "my-database" {
63
+ schema = "my-schema.sql"
64
+ }
65
+
66
+ vector_index "my-index" {
67
+ dimension = 768
68
+ metric = 'cosine'
69
+ }
70
+ }
71
+ `;
72
+ test('manifest with no errors', () => {
73
+ const tokenizer = new Tokenizer(CONFIG);
74
+ const parser = new Parser(tokenizer);
75
+ const ast = parser.parse();
76
+ expect(parser.errors).toEqual([]);
77
+ const [, errors] = buildManifest(ast);
78
+ expect(errors).toEqual([]);
79
+ });
80
+ test('observer with double assignment', () => {
81
+ const CONFIG = `
82
+ application "foo" {
83
+ observer "my-observer" {
84
+ source {
85
+ bucket = "my-bucket"
86
+ bucket = "my-bucket"
87
+ rule {
88
+ actions = [
89
+ 'PutObject',
90
+ 'DeleteObject'
91
+ ]
92
+ }
93
+ }
94
+ }
95
+ }
96
+ `;
97
+ const tokenizer = new Tokenizer(CONFIG);
98
+ const parser = new Parser(tokenizer);
99
+ const ast = parser.parse();
100
+ expect(parser.errors).toEqual([]);
101
+ const [, errors] = buildManifest(ast);
102
+ expect(errors).toMatchObject([
103
+ {
104
+ message: 'duplicate bucket assignment "my-bucket"',
105
+ column: 7,
106
+ end: 100,
107
+ start: 94,
108
+ line: 6,
109
+ },
110
+ ]);
111
+ });
@@ -0,0 +1,8 @@
1
+ import { Application, ConfigError } from '@liquidmetal-ai/drizzle/appify/build';
2
+ export declare class ManifestError extends Error {
3
+ errors: ConfigError[];
4
+ constructor(errors: ConfigError[]);
5
+ }
6
+ export declare function manifestFromString(manifestString: string): Promise<[Application[], ConfigError[]]>;
7
+ export declare function mustManifestFromString(manifestString: string): Promise<Application[]>;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/appify/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAI/F,qBAAa,aAAc,SAAQ,KAAK;IACtC,MAAM,EAAE,WAAW,EAAE,CAAC;gBAEV,MAAM,EAAE,WAAW,EAAE;CAKlC;AAED,wBAAsB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CASxG;AAGD,wBAAsB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAM3F"}
@@ -0,0 +1,28 @@
1
+ import { buildManifest } from '@liquidmetal-ai/drizzle/appify/build';
2
+ import { Parser, Tokenizer } from '@liquidmetal-ai/drizzle/appify/parse';
3
+ import { validate, VALIDATORS } from '@liquidmetal-ai/drizzle/appify/validate';
4
+ export class ManifestError extends Error {
5
+ errors;
6
+ constructor(errors) {
7
+ const message = errors.map((e) => `${e.line}:${e.column} - ${e.message}`).join('\n');
8
+ super(message);
9
+ this.errors = errors;
10
+ }
11
+ }
12
+ export async function manifestFromString(manifestString) {
13
+ const tokenizer = new Tokenizer(manifestString);
14
+ const parser = new Parser(tokenizer);
15
+ const ast = parser.parse();
16
+ const parseErrors = parser.errors;
17
+ const [apps, buildErrors] = buildManifest(ast);
18
+ const validationErrors = await validate(apps, VALIDATORS);
19
+ return [apps, [...parseErrors, ...buildErrors, ...validationErrors]];
20
+ }
21
+ // MUST load without errors, but ignores warnings.
22
+ export async function mustManifestFromString(manifestString) {
23
+ const [apps, errors] = await manifestFromString(manifestString);
24
+ if (errors.length > 0 && !errors.every((e) => 'severity' in e && e.severity === 'warning')) {
25
+ throw new ManifestError(errors);
26
+ }
27
+ return apps;
28
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/appify/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import { expect, test } from 'vitest';
2
+ import { valueOf } from './build.js';
3
+ import { ManifestError, mustManifestFromString } from './index.js';
4
+ test('mustManifestFromString no errors', async () => {
5
+ const manifest = `
6
+ application "app" {
7
+ service "svc" {}
8
+ }
9
+ `;
10
+ const apps = await mustManifestFromString(manifest);
11
+ expect(apps).toHaveLength(1);
12
+ expect(valueOf(apps[0].name)).toBe('app');
13
+ expect(apps[0].service).toHaveLength(1);
14
+ expect(valueOf(apps[0].service[0].name)).toBe('svc');
15
+ });
16
+ test('mustManifestFromString with errors', async () => {
17
+ const manifest = `
18
+ application "app" {
19
+ service "my-svc" {}
20
+ service "my-svc" {}
21
+ }
22
+ `;
23
+ expect(mustManifestFromString(manifest)).rejects.toThrowError(ManifestError);
24
+ });
25
+ test('mustManifestFromString with warnings', async () => {
26
+ const manifest = `
27
+ application "app" {
28
+ service "svc" {
29
+ domain {
30
+ fqdn = "bad_domain_name"
31
+ }
32
+ }
33
+ }
34
+ `;
35
+ const apps = await mustManifestFromString(manifest);
36
+ expect(apps).toHaveLength(1);
37
+ expect(valueOf(apps[0].name)).toBe('app');
38
+ expect(apps[0].service).toHaveLength(1);
39
+ expect(valueOf(apps[0].service[0].name)).toBe('svc');
40
+ });
@@ -0,0 +1,151 @@
1
+ type TokenBase = {
2
+ value: string;
3
+ start: number;
4
+ end: number;
5
+ line: number;
6
+ column: number;
7
+ };
8
+ export type TokenNumber = TokenBase & {
9
+ type: 'number';
10
+ };
11
+ export type TokenOperator = TokenBase & {
12
+ type: 'operator';
13
+ };
14
+ export type TokenParenthesis = TokenBase & {
15
+ type: 'parenthesis';
16
+ };
17
+ export type TokenWhitespace = TokenBase & {
18
+ type: 'whitespace';
19
+ };
20
+ export type TokenBoolean = TokenBase & {
21
+ type: 'boolean';
22
+ };
23
+ export type TokenString = TokenBase & {
24
+ type: 'string';
25
+ };
26
+ export type TokenIdentifier = TokenBase & {
27
+ type: 'identifier';
28
+ };
29
+ export type TokenComment = TokenBase & {
30
+ type: 'comment';
31
+ };
32
+ export type TokenNewline = TokenBase & {
33
+ type: 'newline';
34
+ };
35
+ export type TokenUnknown = TokenBase & {
36
+ type: 'unknown';
37
+ };
38
+ export type TokenCurly = TokenBase & {
39
+ type: 'curly';
40
+ };
41
+ export type TokenBracket = TokenBase & {
42
+ type: 'bracket';
43
+ };
44
+ export type TokenComma = TokenBase & {
45
+ type: 'comma';
46
+ };
47
+ export type TokenEnd = TokenBase & {
48
+ type: 'end';
49
+ };
50
+ type Token = TokenNumber | TokenOperator | TokenParenthesis | TokenWhitespace | TokenBoolean | TokenString | TokenIdentifier | TokenComment | TokenNewline | TokenUnknown | TokenCurly | TokenBracket | TokenEnd | TokenComma;
51
+ type TokenType = Token['type'];
52
+ export declare class Tokenizer {
53
+ private input;
54
+ cursor: number;
55
+ line: number;
56
+ column: number;
57
+ constructor(input: string);
58
+ next(ignore?: TokenType[]): Token;
59
+ peek(ignore?: TokenType[]): Token;
60
+ eof(): boolean;
61
+ }
62
+ export type NodeType = Node['type'] | TokenType;
63
+ export type Node = StanzaNode | AssignmentNode | BlockNode | ExpressionNode | EmptyNode | ArrayNode | ObjectNode | Token;
64
+ type BaseNode = {
65
+ line: number;
66
+ column: number;
67
+ start: number;
68
+ end: number;
69
+ };
70
+ export type StanzaNode = BaseNode & {
71
+ type: 'stanza';
72
+ name: string;
73
+ args: (TokenString | TokenNumber | TokenBoolean)[];
74
+ block: BlockNode | null;
75
+ };
76
+ export type BlockNode = BaseNode & {
77
+ type: 'block';
78
+ children: (Node | TokenNewline | TokenComment)[];
79
+ };
80
+ export type AssignmentNode = BaseNode & {
81
+ type: 'assignment';
82
+ operator: TokenOperator;
83
+ key: Extract<Token, {
84
+ type: 'identifier';
85
+ }>;
86
+ value: ExpressionNode | Extract<Token, {
87
+ type: 'string' | 'number' | 'boolean';
88
+ }> | ArrayNode | ObjectNode;
89
+ };
90
+ export type ArrayNode = BaseNode & {
91
+ type: 'array';
92
+ elements: (ExpressionNode | Extract<Token, {
93
+ type: 'string' | 'number' | 'boolean';
94
+ }> | ArrayNode | ObjectNode)[];
95
+ };
96
+ export type ObjectNode = BaseNode & {
97
+ type: 'object';
98
+ properties: AssignmentNode[];
99
+ };
100
+ export type ExpressionNode = BaseNode & {
101
+ type: 'expression';
102
+ operator: TokenOperator;
103
+ left: Extract<Token, {
104
+ type: 'string' | 'number' | 'boolean';
105
+ }>;
106
+ right: ExpressionNode | Extract<Token, {
107
+ type: 'string' | 'number' | 'boolean';
108
+ }>;
109
+ };
110
+ export type EmptyNode = BaseNode & {
111
+ type: 'empty';
112
+ };
113
+ type ParserError = {
114
+ expected?: NodeType[];
115
+ received?: NodeType;
116
+ message: string;
117
+ line: number;
118
+ column: number;
119
+ start: number;
120
+ end: number;
121
+ };
122
+ export declare class Parser {
123
+ private tokenizer;
124
+ errors: ParserError[];
125
+ constructor(tokenizer: Tokenizer);
126
+ parse(root?: BlockNode): BlockNode;
127
+ parseIdentifier(): Node;
128
+ parseStanza(token: TokenIdentifier): Node;
129
+ parseAssignment(token: Token): AssignmentNode;
130
+ parseExpression(ignore?: TokenType[]): TokenNumber | TokenString | TokenBoolean | ArrayNode | ObjectNode | ExpressionNode;
131
+ parseArray(): ArrayNode;
132
+ parseObject(): ObjectNode;
133
+ expect<T extends TokenType>(type: T, value?: string): Extract<Token, {
134
+ type: T;
135
+ }>;
136
+ }
137
+ type TranslationError = {
138
+ message: string;
139
+ line: number;
140
+ column: number;
141
+ };
142
+ export declare class JSONTranslator {
143
+ errors: TranslationError[];
144
+ constructor();
145
+ translate(ast: BlockNode): any;
146
+ translateRoot(node: BlockNode): any;
147
+ translateStanza(node: StanzaNode): any;
148
+ }
149
+ export declare function fmt(ast: Node | Token | null, indent?: number, sibling?: Node | Token): string;
150
+ export {};
151
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/appify/parse.ts"],"names":[],"mappings":"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"}