@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.
Files changed (42) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/appify/build.d.ts +14 -1
  3. package/dist/appify/build.d.ts.map +1 -1
  4. package/dist/appify/build.js +70 -1
  5. package/dist/appify/build.test.js +192 -0
  6. package/dist/appify/validate.d.ts +2 -1
  7. package/dist/appify/validate.d.ts.map +1 -1
  8. package/dist/appify/validate.js +33 -0
  9. package/dist/codestore.d.ts +4 -3
  10. package/dist/codestore.d.ts.map +1 -1
  11. package/dist/codestore.js +13 -2
  12. package/dist/codestore.test.js +28 -0
  13. package/dist/liquidmetal/v1alpha1/catalog_pb.d.ts +189 -1
  14. package/dist/liquidmetal/v1alpha1/catalog_pb.d.ts.map +1 -1
  15. package/dist/liquidmetal/v1alpha1/catalog_pb.js +36 -2
  16. package/dist/liquidmetal/v1alpha1/search_agent_pb.d.ts +90 -1
  17. package/dist/liquidmetal/v1alpha1/search_agent_pb.d.ts.map +1 -1
  18. package/dist/liquidmetal/v1alpha1/search_agent_pb.js +44 -2
  19. package/dist/sql-migrations.d.ts +109 -0
  20. package/dist/sql-migrations.d.ts.map +1 -0
  21. package/dist/sql-migrations.js +185 -0
  22. package/dist/sql-migrations.test.d.ts +2 -0
  23. package/dist/sql-migrations.test.d.ts.map +1 -0
  24. package/dist/sql-migrations.test.js +260 -0
  25. package/dist/strict-client.d.ts +37 -0
  26. package/dist/strict-client.d.ts.map +1 -0
  27. package/dist/strict-client.js +10 -0
  28. package/package.json +4 -3
  29. package/src/appify/build.test.ts +217 -0
  30. package/src/appify/build.ts +75 -2
  31. package/src/appify/validate.ts +37 -0
  32. package/src/codestore.test.ts +35 -0
  33. package/src/codestore.ts +16 -3
  34. package/src/liquidmetal/v1alpha1/catalog_pb.ts +225 -2
  35. package/src/liquidmetal/v1alpha1/search_agent_pb.ts +106 -3
  36. package/src/sql-migrations.test.ts +317 -0
  37. package/src/sql-migrations.ts +307 -0
  38. package/src/strict-client.ts +46 -0
  39. package/tsconfig.tsbuildinfo +1 -1
  40. package/.turbo/turbo-build.log +0 -22
  41. package/.turbo/turbo-lint.log +0 -4
  42. package/.turbo/turbo-test.log +0 -277
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @liquidmetal-ai/drizzle
2
2
 
3
+ ## 0.20.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Add SQL export/dump capability
8
+
9
+ ## 0.19.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 54c1cde: v0.19.0 bump
14
+
3
15
  ## 0.18.0
4
16
 
5
17
  ### Minor Changes
@@ -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":"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"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/appify/build.ts"],"names":[],"mappings":"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"}
@@ -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;CAC3B,CAAC;AAcF,wBAAsB,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAkBvG;AAmgBD,eAAO,MAAM,UAAU,EAAE,SAAS,EAcjC,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"}
@@ -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
  ];
@@ -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 writable bundle
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 write the extracted files to
72
+ * @param bundle The target bundle to extract into
72
73
  */
73
- export declare function unarchive(zipBuffer: ArrayBufferLike, bundle: WritableBundle): Promise<void>;
74
+ export declare function unarchive(zipBuffer: ArrayBufferLike, bundle: Bundle): Promise<void>;
74
75
  //# sourceMappingURL=codestore.d.ts.map
@@ -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;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAajG"}
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 writable bundle
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 write the extracted files 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
  }
@@ -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
+ });