@liquidmetal-ai/drizzle 0.18.0 → 0.20.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/CHANGELOG.md +12 -0
- package/dist/appify/build.d.ts +14 -1
- package/dist/appify/build.d.ts.map +1 -1
- package/dist/appify/build.js +70 -1
- package/dist/appify/build.test.js +192 -0
- package/dist/appify/validate.d.ts +2 -1
- package/dist/appify/validate.d.ts.map +1 -1
- package/dist/appify/validate.js +33 -0
- package/dist/codestore.d.ts +4 -3
- package/dist/codestore.d.ts.map +1 -1
- package/dist/codestore.js +13 -2
- package/dist/codestore.test.js +28 -0
- package/dist/liquidmetal/v1alpha1/catalog_pb.d.ts +189 -1
- package/dist/liquidmetal/v1alpha1/catalog_pb.d.ts.map +1 -1
- package/dist/liquidmetal/v1alpha1/catalog_pb.js +36 -2
- package/dist/liquidmetal/v1alpha1/search_agent_pb.d.ts +90 -1
- package/dist/liquidmetal/v1alpha1/search_agent_pb.d.ts.map +1 -1
- package/dist/liquidmetal/v1alpha1/search_agent_pb.js +44 -2
- package/dist/sql-migrations.d.ts +109 -0
- package/dist/sql-migrations.d.ts.map +1 -0
- package/dist/sql-migrations.js +185 -0
- package/dist/sql-migrations.test.d.ts +2 -0
- package/dist/sql-migrations.test.d.ts.map +1 -0
- package/dist/sql-migrations.test.js +260 -0
- package/dist/strict-client.d.ts +37 -0
- package/dist/strict-client.d.ts.map +1 -0
- package/dist/strict-client.js +10 -0
- package/package.json +4 -3
- package/src/appify/build.test.ts +217 -0
- package/src/appify/build.ts +75 -2
- package/src/appify/validate.ts +37 -0
- package/src/codestore.test.ts +35 -0
- package/src/codestore.ts +16 -3
- package/src/liquidmetal/v1alpha1/catalog_pb.ts +225 -2
- package/src/liquidmetal/v1alpha1/search_agent_pb.ts +106 -3
- package/src/sql-migrations.test.ts +317 -0
- package/src/sql-migrations.ts +307 -0
- package/src/strict-client.ts +46 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/.turbo/turbo-build.log +0 -22
- package/.turbo/turbo-lint.log +0 -4
- package/.turbo/turbo-test.log +0 -277
package/CHANGELOG.md
CHANGED
package/dist/appify/build.d.ts
CHANGED
|
@@ -41,8 +41,9 @@ export declare class Application {
|
|
|
41
41
|
dataLake: DataLake[];
|
|
42
42
|
labels: Record<string, string>;
|
|
43
43
|
mcpService: McpService[];
|
|
44
|
+
site: Site[];
|
|
44
45
|
constructor(name: TokenString, obj: ConfigObject);
|
|
45
|
-
handlers(): (Service | Observer | Actor | Task)[];
|
|
46
|
+
handlers(): (Service | Observer | Actor | Task | McpService | Site)[];
|
|
46
47
|
}
|
|
47
48
|
export declare class Service {
|
|
48
49
|
obj: ConfigObject;
|
|
@@ -79,6 +80,18 @@ export declare class McpService {
|
|
|
79
80
|
labels: Record<string, string>;
|
|
80
81
|
constructor(name: TokenString, obj: ConfigObject);
|
|
81
82
|
}
|
|
83
|
+
export declare class Site {
|
|
84
|
+
obj: ConfigObject;
|
|
85
|
+
name: TokenString;
|
|
86
|
+
buildOutput?: TokenString;
|
|
87
|
+
buildCommand?: TokenString;
|
|
88
|
+
spa?: TokenBoolean;
|
|
89
|
+
visibility?: TokenString;
|
|
90
|
+
domains: Domain[];
|
|
91
|
+
routes: Route[];
|
|
92
|
+
env: Env[];
|
|
93
|
+
constructor(name: TokenString, obj: ConfigObject);
|
|
94
|
+
}
|
|
82
95
|
export declare class Task {
|
|
83
96
|
obj: ConfigObject;
|
|
84
97
|
name: TokenString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/appify/build.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,cAAc,EACd,SAAS,EAGT,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC;AACpD,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC;AACpD,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC;AAgBtD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AACD,eAAO,MAAM,mBAAmB,EAAE,YAKxB,CAAC;AAEX,qBAAa,WAAW;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;gBAEA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY;CAO/C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,CAAC,CAqB7E;AAyID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,CAAC,WAAW,GAAG,SAAS,EAAE,WAAW,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/appify/build.ts"],"names":[],"mappings":"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"}
|
package/dist/appify/build.js
CHANGED
|
@@ -236,6 +236,9 @@ export function buildApplication(node) {
|
|
|
236
236
|
case 'datalake':
|
|
237
237
|
buildStanza(buildDataLake, child, app.dataLake, errors);
|
|
238
238
|
break;
|
|
239
|
+
case 'site':
|
|
240
|
+
buildStanza(buildSite, child, app.site, errors);
|
|
241
|
+
break;
|
|
239
242
|
default:
|
|
240
243
|
errors.push({ message: 'unexpected stanza', ...child });
|
|
241
244
|
}
|
|
@@ -645,6 +648,56 @@ function buildDataLake(stanza) {
|
|
|
645
648
|
}
|
|
646
649
|
return [dataLake, errors];
|
|
647
650
|
}
|
|
651
|
+
function buildSite(stanza) {
|
|
652
|
+
const errors = [];
|
|
653
|
+
const [name, nameErrors] = buildName1(stanza);
|
|
654
|
+
errors.push(...nameErrors);
|
|
655
|
+
const site = new Site(name, stanza);
|
|
656
|
+
const children = stanza.block ? stanza.block.children : [];
|
|
657
|
+
for (const child of children) {
|
|
658
|
+
switch (child.type) {
|
|
659
|
+
case 'stanza':
|
|
660
|
+
switch (child.name) {
|
|
661
|
+
case 'route':
|
|
662
|
+
buildStanza(buildRoute, child, site.routes, errors);
|
|
663
|
+
break;
|
|
664
|
+
case 'domain':
|
|
665
|
+
buildStanza(buildDomain, child, site.domains, errors);
|
|
666
|
+
break;
|
|
667
|
+
case 'env':
|
|
668
|
+
buildStanza(buildEnv, child, site.env, errors);
|
|
669
|
+
break;
|
|
670
|
+
default:
|
|
671
|
+
errors.push({ message: 'unexpected stanza', ...child });
|
|
672
|
+
}
|
|
673
|
+
break;
|
|
674
|
+
case 'assignment':
|
|
675
|
+
switch (child.key.value) {
|
|
676
|
+
case 'build_output':
|
|
677
|
+
buildAssignment(site, 'buildOutput', 'string', child, errors);
|
|
678
|
+
break;
|
|
679
|
+
case 'build_command':
|
|
680
|
+
buildAssignment(site, 'buildCommand', 'string', child, errors);
|
|
681
|
+
break;
|
|
682
|
+
case 'spa':
|
|
683
|
+
buildAssignment(site, 'spa', 'boolean', child, errors);
|
|
684
|
+
break;
|
|
685
|
+
case 'visibility':
|
|
686
|
+
buildAssignment(site, 'visibility', 'string', child, errors);
|
|
687
|
+
break;
|
|
688
|
+
default:
|
|
689
|
+
errors.push({ message: 'unexpected assignment', ...child });
|
|
690
|
+
}
|
|
691
|
+
break;
|
|
692
|
+
case 'comment':
|
|
693
|
+
case 'newline':
|
|
694
|
+
break;
|
|
695
|
+
default:
|
|
696
|
+
errors.push({ message: 'unexpected node', ...child });
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
return [site, errors];
|
|
700
|
+
}
|
|
648
701
|
function buildObserver(stanza) {
|
|
649
702
|
const errors = [];
|
|
650
703
|
const [name, nameErrors] = buildName1(stanza);
|
|
@@ -958,13 +1011,14 @@ export class Application {
|
|
|
958
1011
|
dataLake = [];
|
|
959
1012
|
labels = {};
|
|
960
1013
|
mcpService = [];
|
|
1014
|
+
site = [];
|
|
961
1015
|
constructor(name, obj) {
|
|
962
1016
|
this.name = name;
|
|
963
1017
|
this.obj = obj;
|
|
964
1018
|
}
|
|
965
1019
|
// Return all objects that require code handlers.
|
|
966
1020
|
handlers() {
|
|
967
|
-
return [...this.service, ...this.observer, ...this.actor, ...this.task, ...this.mcpService];
|
|
1021
|
+
return [...this.service, ...this.observer, ...this.actor, ...this.task, ...this.mcpService, ...this.site];
|
|
968
1022
|
}
|
|
969
1023
|
}
|
|
970
1024
|
export class Service {
|
|
@@ -1011,6 +1065,21 @@ export class McpService {
|
|
|
1011
1065
|
this.obj = obj;
|
|
1012
1066
|
}
|
|
1013
1067
|
}
|
|
1068
|
+
export class Site {
|
|
1069
|
+
obj;
|
|
1070
|
+
name;
|
|
1071
|
+
buildOutput;
|
|
1072
|
+
buildCommand;
|
|
1073
|
+
spa;
|
|
1074
|
+
visibility;
|
|
1075
|
+
domains = [];
|
|
1076
|
+
routes = [];
|
|
1077
|
+
env = [];
|
|
1078
|
+
constructor(name, obj) {
|
|
1079
|
+
this.name = name;
|
|
1080
|
+
this.obj = obj;
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1014
1083
|
export class Task {
|
|
1015
1084
|
obj;
|
|
1016
1085
|
name;
|
|
@@ -795,3 +795,195 @@ application "my-app" {
|
|
|
795
795
|
expect(errors.length).toBe(1);
|
|
796
796
|
expect(errors[0].message).toContain('compaction must be either "enabled" or "disabled"');
|
|
797
797
|
});
|
|
798
|
+
test('site basic parsing', () => {
|
|
799
|
+
const CONFIG = `
|
|
800
|
+
application "my-app" {
|
|
801
|
+
site "dashboard" {
|
|
802
|
+
build_output = "dist"
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
`;
|
|
806
|
+
const tokenizer = new Tokenizer(CONFIG);
|
|
807
|
+
const parser = new Parser(tokenizer);
|
|
808
|
+
const ast = parser.parse();
|
|
809
|
+
expect(parser.errors).toEqual([]);
|
|
810
|
+
const [apps, errors] = buildManifest(ast);
|
|
811
|
+
expect(errors).toEqual([]);
|
|
812
|
+
expect(apps.length).toBe(1);
|
|
813
|
+
expect(apps[0].site.length).toBe(1);
|
|
814
|
+
const site = apps[0].site[0];
|
|
815
|
+
expect(valueOf(site.name)).toBe('dashboard');
|
|
816
|
+
expect(valueOf(site.buildOutput)).toBe('dist');
|
|
817
|
+
expect(site.buildCommand).toBeUndefined();
|
|
818
|
+
expect(site.spa).toBeUndefined();
|
|
819
|
+
expect(site.visibility).toBeUndefined();
|
|
820
|
+
});
|
|
821
|
+
test('site with all attributes', () => {
|
|
822
|
+
const CONFIG = `
|
|
823
|
+
application "my-app" {
|
|
824
|
+
site "dashboard" {
|
|
825
|
+
build_output = "dist"
|
|
826
|
+
build_command = "npm run build"
|
|
827
|
+
spa = true
|
|
828
|
+
visibility = "public"
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
`;
|
|
832
|
+
const tokenizer = new Tokenizer(CONFIG);
|
|
833
|
+
const parser = new Parser(tokenizer);
|
|
834
|
+
const ast = parser.parse();
|
|
835
|
+
expect(parser.errors).toEqual([]);
|
|
836
|
+
const [apps, errors] = buildManifest(ast);
|
|
837
|
+
expect(errors).toEqual([]);
|
|
838
|
+
const site = apps[0].site[0];
|
|
839
|
+
expect(valueOf(site.name)).toBe('dashboard');
|
|
840
|
+
expect(valueOf(site.buildOutput)).toBe('dist');
|
|
841
|
+
expect(valueOf(site.buildCommand)).toBe('npm run build');
|
|
842
|
+
expect(valueOf(site.spa)).toBe(true);
|
|
843
|
+
expect(valueOf(site.visibility)).toBe('public');
|
|
844
|
+
});
|
|
845
|
+
test('site with domain and route', () => {
|
|
846
|
+
const CONFIG = `
|
|
847
|
+
application "my-app" {
|
|
848
|
+
site "dashboard" {
|
|
849
|
+
build_output = "dist"
|
|
850
|
+
|
|
851
|
+
domain {
|
|
852
|
+
cname = "mysite"
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
route {
|
|
856
|
+
zone = "example.com"
|
|
857
|
+
domain = "example.com"
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
`;
|
|
862
|
+
const tokenizer = new Tokenizer(CONFIG);
|
|
863
|
+
const parser = new Parser(tokenizer);
|
|
864
|
+
const ast = parser.parse();
|
|
865
|
+
expect(parser.errors).toEqual([]);
|
|
866
|
+
const [apps, errors] = buildManifest(ast);
|
|
867
|
+
expect(errors).toEqual([]);
|
|
868
|
+
const site = apps[0].site[0];
|
|
869
|
+
expect(site.domains.length).toBe(1);
|
|
870
|
+
expect(valueOf(site.domains[0].cname)).toBe('mysite');
|
|
871
|
+
expect(site.routes.length).toBe(1);
|
|
872
|
+
expect(valueOf(site.routes[0].zone)).toBe('example.com');
|
|
873
|
+
});
|
|
874
|
+
test('site with env', () => {
|
|
875
|
+
const CONFIG = `
|
|
876
|
+
application "my-app" {
|
|
877
|
+
site "dashboard" {
|
|
878
|
+
build_output = "dist"
|
|
879
|
+
env "API_URL" {
|
|
880
|
+
default = "https://api.example.com"
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
`;
|
|
885
|
+
const tokenizer = new Tokenizer(CONFIG);
|
|
886
|
+
const parser = new Parser(tokenizer);
|
|
887
|
+
const ast = parser.parse();
|
|
888
|
+
expect(parser.errors).toEqual([]);
|
|
889
|
+
const [apps, errors] = buildManifest(ast);
|
|
890
|
+
expect(errors).toEqual([]);
|
|
891
|
+
const site = apps[0].site[0];
|
|
892
|
+
expect(site.env.length).toBe(1);
|
|
893
|
+
expect(valueOf(site.env[0].name)).toBe('API_URL');
|
|
894
|
+
});
|
|
895
|
+
test('site rejects binding stanza', () => {
|
|
896
|
+
const CONFIG = `
|
|
897
|
+
application "my-app" {
|
|
898
|
+
site "dashboard" {
|
|
899
|
+
build_output = "dist"
|
|
900
|
+
binding {
|
|
901
|
+
FOO = "bar"
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
`;
|
|
906
|
+
const tokenizer = new Tokenizer(CONFIG);
|
|
907
|
+
const parser = new Parser(tokenizer);
|
|
908
|
+
const ast = parser.parse();
|
|
909
|
+
expect(parser.errors).toEqual([]);
|
|
910
|
+
const [, errors] = buildManifest(ast);
|
|
911
|
+
expect(errors.length).toBe(1);
|
|
912
|
+
expect(errors[0].message).toContain('unexpected stanza');
|
|
913
|
+
});
|
|
914
|
+
test('multiple sites', () => {
|
|
915
|
+
const CONFIG = `
|
|
916
|
+
application "my-app" {
|
|
917
|
+
site "dashboard" {
|
|
918
|
+
build_output = "dashboard/dist"
|
|
919
|
+
}
|
|
920
|
+
site "marketing" {
|
|
921
|
+
build_output = "marketing/dist"
|
|
922
|
+
spa = true
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
`;
|
|
926
|
+
const tokenizer = new Tokenizer(CONFIG);
|
|
927
|
+
const parser = new Parser(tokenizer);
|
|
928
|
+
const ast = parser.parse();
|
|
929
|
+
expect(parser.errors).toEqual([]);
|
|
930
|
+
const [apps, errors] = buildManifest(ast);
|
|
931
|
+
expect(errors).toEqual([]);
|
|
932
|
+
expect(apps[0].site.length).toBe(2);
|
|
933
|
+
expect(valueOf(apps[0].site[0].name)).toBe('dashboard');
|
|
934
|
+
expect(valueOf(apps[0].site[1].name)).toBe('marketing');
|
|
935
|
+
});
|
|
936
|
+
test('site included in handlers', () => {
|
|
937
|
+
const CONFIG = `
|
|
938
|
+
application "my-app" {
|
|
939
|
+
service "api" {}
|
|
940
|
+
site "dashboard" {
|
|
941
|
+
build_output = "dist"
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
`;
|
|
945
|
+
const tokenizer = new Tokenizer(CONFIG);
|
|
946
|
+
const parser = new Parser(tokenizer);
|
|
947
|
+
const ast = parser.parse();
|
|
948
|
+
expect(parser.errors).toEqual([]);
|
|
949
|
+
const [apps, errors] = buildManifest(ast);
|
|
950
|
+
expect(errors).toEqual([]);
|
|
951
|
+
const handlers = apps[0].handlers();
|
|
952
|
+
expect(handlers.length).toBe(2);
|
|
953
|
+
expect(handlers.some(h => valueOf(h.name) === 'dashboard')).toBe(true);
|
|
954
|
+
expect(handlers.some(h => valueOf(h.name) === 'api')).toBe(true);
|
|
955
|
+
});
|
|
956
|
+
test('site with unexpected assignment', () => {
|
|
957
|
+
const CONFIG = `
|
|
958
|
+
application "my-app" {
|
|
959
|
+
site "dashboard" {
|
|
960
|
+
build_output = "dist"
|
|
961
|
+
invalid_field = "oops"
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
`;
|
|
965
|
+
const tokenizer = new Tokenizer(CONFIG);
|
|
966
|
+
const parser = new Parser(tokenizer);
|
|
967
|
+
const ast = parser.parse();
|
|
968
|
+
expect(parser.errors).toEqual([]);
|
|
969
|
+
const [, errors] = buildManifest(ast);
|
|
970
|
+
expect(errors.length).toBe(1);
|
|
971
|
+
expect(errors[0].message).toContain('unexpected assignment');
|
|
972
|
+
});
|
|
973
|
+
test('site with duplicate build_output', () => {
|
|
974
|
+
const CONFIG = `
|
|
975
|
+
application "my-app" {
|
|
976
|
+
site "dashboard" {
|
|
977
|
+
build_output = "dist"
|
|
978
|
+
build_output = "build"
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
`;
|
|
982
|
+
const tokenizer = new Tokenizer(CONFIG);
|
|
983
|
+
const parser = new Parser(tokenizer);
|
|
984
|
+
const ast = parser.parse();
|
|
985
|
+
expect(parser.errors).toEqual([]);
|
|
986
|
+
const [, errors] = buildManifest(ast);
|
|
987
|
+
expect(errors.length).toBe(1);
|
|
988
|
+
expect(errors[0].message).toContain('duplicate');
|
|
989
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Actor, Application, Binding, Bucket, ConfigObject, DataLake, Domain, Env, Observer, Queue, Service, SqlDatabase, Task, VectorIndex } from './build.js';
|
|
1
|
+
import { Actor, Application, Binding, Bucket, ConfigObject, DataLake, Domain, Env, Observer, Queue, Service, Site, SqlDatabase, Task, VectorIndex } from './build.js';
|
|
2
2
|
export type ValidationError = ConfigObject & {
|
|
3
3
|
message: string;
|
|
4
4
|
severity: 'info' | 'error' | 'warning';
|
|
@@ -18,6 +18,7 @@ export type Validator = {
|
|
|
18
18
|
onSqlDatabase?: On<SqlDatabase>;
|
|
19
19
|
onVectorIndex?: On<VectorIndex>;
|
|
20
20
|
onDataLake?: On<DataLake>;
|
|
21
|
+
onSite?: On<Site>;
|
|
21
22
|
};
|
|
22
23
|
export declare function validate(apps: Application[], validators: Validator[]): Promise<ValidationError[]>;
|
|
23
24
|
export declare const VALIDATORS: Validator[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/appify/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,WAAW,EACX,OAAO,EACP,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,GAAG,EACH,QAAQ,EACR,KAAK,EACL,OAAO,EACP,WAAW,EACX,IAAI,EAIJ,WAAW,EAEZ,MAAM,YAAY,CAAC;AAOpB,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;AAE7E,MAAM,MAAM,SAAS,GAAG;IACtB,aAAa,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACxB,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACpB,UAAU,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAClB,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IACtB,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACpB,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAChB,SAAS,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IACtB,aAAa,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;IAChC,aAAa,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/appify/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,WAAW,EACX,OAAO,EACP,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,GAAG,EACH,QAAQ,EACR,KAAK,EACL,OAAO,EACP,IAAI,EACJ,WAAW,EACX,IAAI,EAIJ,WAAW,EAEZ,MAAM,YAAY,CAAC;AAOpB,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;AAE7E,MAAM,MAAM,SAAS,GAAG;IACtB,aAAa,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACxB,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACpB,UAAU,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAClB,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IACtB,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACpB,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAChB,SAAS,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IACtB,aAAa,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;IAChC,aAAa,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;CACnB,CAAC;AAcF,wBAAsB,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAmBvG;AAoiBD,eAAO,MAAM,UAAU,EAAE,SAAS,EAejC,CAAC"}
|
package/dist/appify/validate.js
CHANGED
|
@@ -20,6 +20,7 @@ export async function validate(apps, validators) {
|
|
|
20
20
|
await validateVectorIndexes(app, validator, errors);
|
|
21
21
|
await validateSqlDatabases(app, validator, errors);
|
|
22
22
|
await validateDataLakes(app, validator, errors);
|
|
23
|
+
await validateSites(app, validator, errors);
|
|
23
24
|
}
|
|
24
25
|
}
|
|
25
26
|
return errors;
|
|
@@ -79,6 +80,13 @@ async function validateDataLakes(app, validator, errors) {
|
|
|
79
80
|
await validateHelper(validator.onDataLake, app, dataLake, errors);
|
|
80
81
|
}
|
|
81
82
|
}
|
|
83
|
+
async function validateSites(app, validator, errors) {
|
|
84
|
+
for (const site of app.site) {
|
|
85
|
+
await validateHelper(validator.onSite, app, site, errors);
|
|
86
|
+
await validateDomains(app, site, validator, errors);
|
|
87
|
+
await validateEnvs(app, site, validator, errors);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
82
90
|
async function validateEnvs(app, obj, validator, errors) {
|
|
83
91
|
for (const env of obj.env) {
|
|
84
92
|
await validateHelper(validator.onEnv, app, env, errors);
|
|
@@ -324,6 +332,7 @@ const visibilityValidator = {
|
|
|
324
332
|
onTask: visibilityValidatorFn,
|
|
325
333
|
onQueue: visibilityValidatorFn,
|
|
326
334
|
onBucket: visibilityValidatorFn,
|
|
335
|
+
// Sites are always public — visibility is validated by siteValidator
|
|
327
336
|
};
|
|
328
337
|
async function nameValidatorFn(_app, obj) {
|
|
329
338
|
const errors = [];
|
|
@@ -357,6 +366,7 @@ const nameValidator = {
|
|
|
357
366
|
onSqlDatabase: nameValidatorFn,
|
|
358
367
|
onVectorIndex: nameValidatorFn,
|
|
359
368
|
onDataLake: nameValidatorFn,
|
|
369
|
+
onSite: nameValidatorFn,
|
|
360
370
|
};
|
|
361
371
|
const vectorIndexValidator = {
|
|
362
372
|
onVectorIndex: async (app, vectorIndex) => {
|
|
@@ -415,6 +425,7 @@ const duplicateModuleValidator = {
|
|
|
415
425
|
...app.sqlDatabase,
|
|
416
426
|
...app.vectorIndex,
|
|
417
427
|
...app.dataLake,
|
|
428
|
+
...app.site,
|
|
418
429
|
]) {
|
|
419
430
|
const name = valueOf(module.name);
|
|
420
431
|
if (seen.has(name)) {
|
|
@@ -483,6 +494,27 @@ const paidVisibilityValidator = {
|
|
|
483
494
|
onQueue: paidVisibilityValidatorFn,
|
|
484
495
|
onBucket: paidVisibilityValidatorFn,
|
|
485
496
|
};
|
|
497
|
+
const siteValidator = {
|
|
498
|
+
onSite: async (_app, site) => {
|
|
499
|
+
const errors = [];
|
|
500
|
+
if (site.buildOutput === undefined) {
|
|
501
|
+
errors.push({
|
|
502
|
+
message: 'site must have a build_output attribute',
|
|
503
|
+
severity: 'error',
|
|
504
|
+
...site.obj,
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
// Sites are always public. Other visibility values (protected, paid, etc.) are not supported.
|
|
508
|
+
if (site.visibility && valueOf(site.visibility) !== 'public') {
|
|
509
|
+
errors.push({
|
|
510
|
+
message: 'sites only support public visibility',
|
|
511
|
+
severity: 'error',
|
|
512
|
+
...site.visibility,
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
return errors;
|
|
516
|
+
},
|
|
517
|
+
};
|
|
486
518
|
export const VALIDATORS = [
|
|
487
519
|
bindingNameValidator,
|
|
488
520
|
bindingValueValidator,
|
|
@@ -497,4 +529,5 @@ export const VALIDATORS = [
|
|
|
497
529
|
locationHintValidator,
|
|
498
530
|
paymentsValidator,
|
|
499
531
|
paidVisibilityValidator,
|
|
532
|
+
siteValidator,
|
|
500
533
|
];
|
package/dist/codestore.d.ts
CHANGED
|
@@ -66,9 +66,10 @@ export declare abstract class BundleBase implements ReadableBundle {
|
|
|
66
66
|
*/
|
|
67
67
|
export declare function archive(bundle: ReadableBundle): Promise<ArrayBufferLike>;
|
|
68
68
|
/**
|
|
69
|
-
* Extracts files from a ZIP archive into a
|
|
69
|
+
* Extracts files from a ZIP archive into a bundle, removing any
|
|
70
|
+
* pre-existing files that are not present in the archive.
|
|
70
71
|
* @param zipBuffer The ZIP file contents as an ArrayBuffer
|
|
71
|
-
* @param bundle The target bundle to
|
|
72
|
+
* @param bundle The target bundle to extract into
|
|
72
73
|
*/
|
|
73
|
-
export declare function unarchive(zipBuffer: ArrayBufferLike, bundle:
|
|
74
|
+
export declare function unarchive(zipBuffer: ArrayBufferLike, bundle: Bundle): Promise<void>;
|
|
74
75
|
//# sourceMappingURL=codestore.d.ts.map
|
package/dist/codestore.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codestore.d.ts","sourceRoot":"","sources":["../src/codestore.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG,cAAc,GAAG,cAAc,CAAC;AAErD;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;;GAIG;AACH,8BAAsB,UAAW,YAAW,cAAc;IACxD,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAEtC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBhC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC;IAW/C,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAO9B;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAY9E;AAED
|
|
1
|
+
{"version":3,"file":"codestore.d.ts","sourceRoot":"","sources":["../src/codestore.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG,cAAc,GAAG,cAAc,CAAC;AAErD;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;;GAIG;AACH,8BAAsB,UAAW,YAAW,cAAc;IACxD,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAEtC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBhC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC;IAW/C,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAO9B;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAY9E;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBzF"}
|
package/dist/codestore.js
CHANGED
|
@@ -57,20 +57,31 @@ export async function archive(bundle) {
|
|
|
57
57
|
return zipped.buffer;
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
60
|
-
* Extracts files from a ZIP archive into a
|
|
60
|
+
* Extracts files from a ZIP archive into a bundle, removing any
|
|
61
|
+
* pre-existing files that are not present in the archive.
|
|
61
62
|
* @param zipBuffer The ZIP file contents as an ArrayBuffer
|
|
62
|
-
* @param bundle The target bundle to
|
|
63
|
+
* @param bundle The target bundle to extract into
|
|
63
64
|
*/
|
|
64
65
|
export async function unarchive(zipBuffer, bundle) {
|
|
65
66
|
// Convert ArrayBuffer to Uint8Array for fflate
|
|
66
67
|
const zipData = new Uint8Array(zipBuffer);
|
|
67
68
|
// Use unzipSync to directly get the unzipped data
|
|
68
69
|
const unzipped = unzipSync(zipData);
|
|
70
|
+
// Collect the set of filenames being written
|
|
71
|
+
const newFiles = new Set();
|
|
69
72
|
// Process each file in the unzipped data
|
|
70
73
|
await Promise.all(Object.entries(unzipped).map(async ([filename, content]) => {
|
|
71
74
|
// Skip directories (if any)
|
|
72
75
|
if (filename.endsWith('/'))
|
|
73
76
|
return;
|
|
77
|
+
newFiles.add(filename);
|
|
74
78
|
await bundle.write(filename, Buffer.from(content));
|
|
75
79
|
}));
|
|
80
|
+
// Clean up stale files that exist in the bundle but not in the archive
|
|
81
|
+
const existingFiles = await bundle.list();
|
|
82
|
+
await Promise.all(existingFiles.map(async (filename) => {
|
|
83
|
+
if (!newFiles.has(filename)) {
|
|
84
|
+
await bundle.delete(filename);
|
|
85
|
+
}
|
|
86
|
+
}));
|
|
76
87
|
}
|
package/dist/codestore.test.js
CHANGED
|
@@ -82,3 +82,31 @@ test('hash bundle', async () => {
|
|
|
82
82
|
const hash = await bundle.hash();
|
|
83
83
|
expect(hash).toBe('936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af');
|
|
84
84
|
});
|
|
85
|
+
test('unarchive cleans up stale files', async () => {
|
|
86
|
+
// Simulate a bundle that already has files from a previous upload
|
|
87
|
+
const bundle = new MemoryBundle();
|
|
88
|
+
await bundle.write('old-file.txt', Buffer.from('stale'));
|
|
89
|
+
await bundle.write('kept-file.txt', Buffer.from('original'));
|
|
90
|
+
// Create an archive with only new content (kept-file.txt updated, old-file.txt removed)
|
|
91
|
+
const source = new MemoryBundle();
|
|
92
|
+
await source.write('kept-file.txt', Buffer.from('updated'));
|
|
93
|
+
await source.write('new-file.txt', Buffer.from('fresh'));
|
|
94
|
+
const archiveBuffer = await archive(source);
|
|
95
|
+
// Unarchive into the existing bundle
|
|
96
|
+
await unarchive(archiveBuffer, bundle);
|
|
97
|
+
// old-file.txt should be deleted
|
|
98
|
+
const files = await bundle.list();
|
|
99
|
+
expect(files).toEqual(['kept-file.txt', 'new-file.txt']);
|
|
100
|
+
expect((await bundle.read('kept-file.txt')).toString()).toBe('updated');
|
|
101
|
+
expect((await bundle.read('new-file.txt')).toString()).toBe('fresh');
|
|
102
|
+
await expect(bundle.read('old-file.txt')).rejects.toThrowError('File not found: old-file.txt');
|
|
103
|
+
});
|
|
104
|
+
test('unarchive into empty bundle works', async () => {
|
|
105
|
+
const source = new MemoryBundle();
|
|
106
|
+
await source.write('file.txt', Buffer.from('content'));
|
|
107
|
+
const archiveBuffer = await archive(source);
|
|
108
|
+
const bundle = new MemoryBundle();
|
|
109
|
+
await unarchive(archiveBuffer, bundle);
|
|
110
|
+
expect(await bundle.list()).toEqual(['file.txt']);
|
|
111
|
+
expect((await bundle.read('file.txt')).toString()).toBe('content');
|
|
112
|
+
});
|