@hasna/cloud 0.1.18 → 0.1.20

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/dist/cli/index.js CHANGED
@@ -10967,8 +10967,21 @@ function sqliteToPostgres(sql) {
10967
10967
  out = out.replace(/\bAUTOINCREMENT\b/gi, "GENERATED ALWAYS AS IDENTITY");
10968
10968
  out = out.replace(/(?<![I])LIKE/gi, "ILIKE");
10969
10969
  out = out.replace(/\bIFNULL\s*\(/gi, "COALESCE(");
10970
+ out = out.replace(/INSERT\s+OR\s+REPLACE\s+INTO\s+"?(\w+)"?\s*\(([^)]+)\)\s*VALUES/gi, (_match, table, colList) => {
10971
+ const cols = colList.split(",").map((c) => c.trim().replace(/"/g, ""));
10972
+ const pk = cols[0];
10973
+ const updateCols = cols.slice(1);
10974
+ const setClauses = updateCols.map((c) => `"${c}" = EXCLUDED."${c}"`).join(", ");
10975
+ if (updateCols.length > 0) {
10976
+ return `INSERT INTO "${table}" (${colList}) VALUES`;
10977
+ }
10978
+ return `INSERT INTO "${table}" (${colList}) VALUES`;
10979
+ });
10970
10980
  out = out.replace(/INSERT\s+OR\s+REPLACE\s+INTO/gi, "INSERT INTO");
10971
- out = out.replace(/INSERT\s+OR\s+IGNORE\s+INTO/gi, "INSERT INTO");
10981
+ if (/INSERT\s+OR\s+IGNORE\s+INTO/i.test(out)) {
10982
+ out = out.replace(/INSERT\s+OR\s+IGNORE\s+INTO/gi, "INSERT INTO");
10983
+ out = out.replace(/;?\s*$/, " ON CONFLICT DO NOTHING");
10984
+ }
10972
10985
  return out;
10973
10986
  }
10974
10987
 
@@ -11643,6 +11656,59 @@ async function resolvePrimaryKeys(source, target, table, pkOption) {
11643
11656
  }
11644
11657
  return pks;
11645
11658
  }
11659
+ function pgTypeToSqlite(pgType) {
11660
+ const t = pgType.toLowerCase();
11661
+ if (t.includes("int") || t === "bigint" || t === "smallint" || t === "serial" || t === "bigserial")
11662
+ return "INTEGER";
11663
+ if (t.includes("bool"))
11664
+ return "INTEGER";
11665
+ if (t.includes("float") || t.includes("double") || t === "real" || t === "numeric" || t === "decimal")
11666
+ return "REAL";
11667
+ if (t === "bytea")
11668
+ return "BLOB";
11669
+ return "TEXT";
11670
+ }
11671
+ async function ensureTableInSqliteFromPg(target, source, table) {
11672
+ const existing = target.all(`SELECT name FROM sqlite_master WHERE type='table' AND name=?`, table);
11673
+ if (existing.length > 0)
11674
+ return false;
11675
+ const cols = await source.all(`SELECT column_name, data_type, is_nullable, column_default
11676
+ FROM information_schema.columns
11677
+ WHERE table_schema = 'public' AND table_name = '${table}'
11678
+ ORDER BY ordinal_position`);
11679
+ if (cols.length === 0)
11680
+ return false;
11681
+ const pkCols = await source.all(`SELECT kcu.column_name
11682
+ FROM information_schema.table_constraints tc
11683
+ JOIN information_schema.key_column_usage kcu
11684
+ ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
11685
+ WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_schema = 'public' AND tc.table_name = '${table}'
11686
+ ORDER BY kcu.ordinal_position`);
11687
+ const pkSet = new Set(pkCols.map((c) => c.column_name));
11688
+ const skipTypes = new Set(["tsvector", "tsquery", "user-defined"]);
11689
+ const filteredCols = cols.filter((c) => !skipTypes.has(c.data_type));
11690
+ const colDefs = filteredCols.map((c) => {
11691
+ const sqliteType = pgTypeToSqlite(c.data_type);
11692
+ const notNull = c.is_nullable === "NO" && !pkSet.has(c.column_name) ? " NOT NULL" : "";
11693
+ return `"${c.column_name}" ${sqliteType}${notNull}`;
11694
+ });
11695
+ if (pkSet.size > 0) {
11696
+ const pkList = [...pkSet].map((c) => `"${c}"`).join(", ");
11697
+ colDefs.push(`PRIMARY KEY (${pkList})`);
11698
+ }
11699
+ const sql = `CREATE TABLE IF NOT EXISTS "${table}" (${colDefs.join(", ")})`;
11700
+ target.exec(sql);
11701
+ process.stderr.write(` [sync] ${table}: auto-created in SQLite from PG schema
11702
+ `);
11703
+ return true;
11704
+ }
11705
+ async function ensureTablesExist(source, target, tables) {
11706
+ for (const table of tables) {
11707
+ if (!isAsyncAdapter(target) && isAsyncAdapter(source)) {
11708
+ await ensureTableInSqliteFromPg(target, source, table);
11709
+ }
11710
+ }
11711
+ }
11646
11712
  async function filterColumnsForTarget(target, table, sourceColumns) {
11647
11713
  try {
11648
11714
  if (!isAsyncAdapter(target)) {
@@ -11677,6 +11743,7 @@ async function syncTransfer(source, target, options, _direction) {
11677
11743
  } = options;
11678
11744
  const results = [];
11679
11745
  const sqliteTarget = !isAsyncAdapter(target) ? target : null;
11746
+ await ensureTablesExist(source, target, tables);
11680
11747
  if (sqliteTarget) {
11681
11748
  try {
11682
11749
  sqliteTarget.exec("PRAGMA foreign_keys = OFF");
@@ -1 +1 @@
1
- {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../src/dialect.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC;AAEtC;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAGlE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,CAKpD;AAyFD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CA6BlE"}
1
+ {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../src/dialect.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC;AAEtC;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAGlE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,CAKpD;AA8GD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CA6BlE"}
package/dist/index.js CHANGED
@@ -4965,8 +4965,21 @@ function sqliteToPostgres(sql) {
4965
4965
  out = out.replace(/\bAUTOINCREMENT\b/gi, "GENERATED ALWAYS AS IDENTITY");
4966
4966
  out = out.replace(/(?<![I])LIKE/gi, "ILIKE");
4967
4967
  out = out.replace(/\bIFNULL\s*\(/gi, "COALESCE(");
4968
+ out = out.replace(/INSERT\s+OR\s+REPLACE\s+INTO\s+"?(\w+)"?\s*\(([^)]+)\)\s*VALUES/gi, (_match, table, colList) => {
4969
+ const cols = colList.split(",").map((c) => c.trim().replace(/"/g, ""));
4970
+ const pk = cols[0];
4971
+ const updateCols = cols.slice(1);
4972
+ const setClauses = updateCols.map((c) => `"${c}" = EXCLUDED."${c}"`).join(", ");
4973
+ if (updateCols.length > 0) {
4974
+ return `INSERT INTO "${table}" (${colList}) VALUES`;
4975
+ }
4976
+ return `INSERT INTO "${table}" (${colList}) VALUES`;
4977
+ });
4968
4978
  out = out.replace(/INSERT\s+OR\s+REPLACE\s+INTO/gi, "INSERT INTO");
4969
- out = out.replace(/INSERT\s+OR\s+IGNORE\s+INTO/gi, "INSERT INTO");
4979
+ if (/INSERT\s+OR\s+IGNORE\s+INTO/i.test(out)) {
4980
+ out = out.replace(/INSERT\s+OR\s+IGNORE\s+INTO/gi, "INSERT INTO");
4981
+ out = out.replace(/;?\s*$/, " ON CONFLICT DO NOTHING");
4982
+ }
4970
4983
  return out;
4971
4984
  }
4972
4985
  function translateDdl(ddl, dialect) {
@@ -9571,6 +9584,59 @@ async function resolvePrimaryKeys(source, target, table, pkOption) {
9571
9584
  }
9572
9585
  return pks;
9573
9586
  }
9587
+ function pgTypeToSqlite(pgType) {
9588
+ const t = pgType.toLowerCase();
9589
+ if (t.includes("int") || t === "bigint" || t === "smallint" || t === "serial" || t === "bigserial")
9590
+ return "INTEGER";
9591
+ if (t.includes("bool"))
9592
+ return "INTEGER";
9593
+ if (t.includes("float") || t.includes("double") || t === "real" || t === "numeric" || t === "decimal")
9594
+ return "REAL";
9595
+ if (t === "bytea")
9596
+ return "BLOB";
9597
+ return "TEXT";
9598
+ }
9599
+ async function ensureTableInSqliteFromPg(target, source, table) {
9600
+ const existing = target.all(`SELECT name FROM sqlite_master WHERE type='table' AND name=?`, table);
9601
+ if (existing.length > 0)
9602
+ return false;
9603
+ const cols = await source.all(`SELECT column_name, data_type, is_nullable, column_default
9604
+ FROM information_schema.columns
9605
+ WHERE table_schema = 'public' AND table_name = '${table}'
9606
+ ORDER BY ordinal_position`);
9607
+ if (cols.length === 0)
9608
+ return false;
9609
+ const pkCols = await source.all(`SELECT kcu.column_name
9610
+ FROM information_schema.table_constraints tc
9611
+ JOIN information_schema.key_column_usage kcu
9612
+ ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
9613
+ WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_schema = 'public' AND tc.table_name = '${table}'
9614
+ ORDER BY kcu.ordinal_position`);
9615
+ const pkSet = new Set(pkCols.map((c) => c.column_name));
9616
+ const skipTypes = new Set(["tsvector", "tsquery", "user-defined"]);
9617
+ const filteredCols = cols.filter((c) => !skipTypes.has(c.data_type));
9618
+ const colDefs = filteredCols.map((c) => {
9619
+ const sqliteType = pgTypeToSqlite(c.data_type);
9620
+ const notNull = c.is_nullable === "NO" && !pkSet.has(c.column_name) ? " NOT NULL" : "";
9621
+ return `"${c.column_name}" ${sqliteType}${notNull}`;
9622
+ });
9623
+ if (pkSet.size > 0) {
9624
+ const pkList = [...pkSet].map((c) => `"${c}"`).join(", ");
9625
+ colDefs.push(`PRIMARY KEY (${pkList})`);
9626
+ }
9627
+ const sql = `CREATE TABLE IF NOT EXISTS "${table}" (${colDefs.join(", ")})`;
9628
+ target.exec(sql);
9629
+ process.stderr.write(` [sync] ${table}: auto-created in SQLite from PG schema
9630
+ `);
9631
+ return true;
9632
+ }
9633
+ async function ensureTablesExist(source, target, tables) {
9634
+ for (const table of tables) {
9635
+ if (!isAsyncAdapter(target) && isAsyncAdapter(source)) {
9636
+ await ensureTableInSqliteFromPg(target, source, table);
9637
+ }
9638
+ }
9639
+ }
9574
9640
  async function filterColumnsForTarget(target, table, sourceColumns) {
9575
9641
  try {
9576
9642
  if (!isAsyncAdapter(target)) {
@@ -9605,6 +9671,7 @@ async function syncTransfer(source, target, options, _direction) {
9605
9671
  } = options;
9606
9672
  const results = [];
9607
9673
  const sqliteTarget = !isAsyncAdapter(target) ? target : null;
9674
+ await ensureTablesExist(source, target, tables);
9608
9675
  if (sqliteTarget) {
9609
9676
  try {
9610
9677
  sqliteTarget.exec("PRAGMA foreign_keys = OFF");
package/dist/mcp/index.js CHANGED
@@ -24398,8 +24398,21 @@ function sqliteToPostgres(sql) {
24398
24398
  out = out.replace(/\bAUTOINCREMENT\b/gi, "GENERATED ALWAYS AS IDENTITY");
24399
24399
  out = out.replace(/(?<![I])LIKE/gi, "ILIKE");
24400
24400
  out = out.replace(/\bIFNULL\s*\(/gi, "COALESCE(");
24401
+ out = out.replace(/INSERT\s+OR\s+REPLACE\s+INTO\s+"?(\w+)"?\s*\(([^)]+)\)\s*VALUES/gi, (_match, table, colList) => {
24402
+ const cols = colList.split(",").map((c) => c.trim().replace(/"/g, ""));
24403
+ const pk = cols[0];
24404
+ const updateCols = cols.slice(1);
24405
+ const setClauses = updateCols.map((c) => `"${c}" = EXCLUDED."${c}"`).join(", ");
24406
+ if (updateCols.length > 0) {
24407
+ return `INSERT INTO "${table}" (${colList}) VALUES`;
24408
+ }
24409
+ return `INSERT INTO "${table}" (${colList}) VALUES`;
24410
+ });
24401
24411
  out = out.replace(/INSERT\s+OR\s+REPLACE\s+INTO/gi, "INSERT INTO");
24402
- out = out.replace(/INSERT\s+OR\s+IGNORE\s+INTO/gi, "INSERT INTO");
24412
+ if (/INSERT\s+OR\s+IGNORE\s+INTO/i.test(out)) {
24413
+ out = out.replace(/INSERT\s+OR\s+IGNORE\s+INTO/gi, "INSERT INTO");
24414
+ out = out.replace(/;?\s*$/, " ON CONFLICT DO NOTHING");
24415
+ }
24403
24416
  return out;
24404
24417
  }
24405
24418
 
@@ -24786,6 +24799,59 @@ async function resolvePrimaryKeys(source, target, table, pkOption) {
24786
24799
  }
24787
24800
  return pks;
24788
24801
  }
24802
+ function pgTypeToSqlite(pgType) {
24803
+ const t = pgType.toLowerCase();
24804
+ if (t.includes("int") || t === "bigint" || t === "smallint" || t === "serial" || t === "bigserial")
24805
+ return "INTEGER";
24806
+ if (t.includes("bool"))
24807
+ return "INTEGER";
24808
+ if (t.includes("float") || t.includes("double") || t === "real" || t === "numeric" || t === "decimal")
24809
+ return "REAL";
24810
+ if (t === "bytea")
24811
+ return "BLOB";
24812
+ return "TEXT";
24813
+ }
24814
+ async function ensureTableInSqliteFromPg(target, source, table) {
24815
+ const existing = target.all(`SELECT name FROM sqlite_master WHERE type='table' AND name=?`, table);
24816
+ if (existing.length > 0)
24817
+ return false;
24818
+ const cols = await source.all(`SELECT column_name, data_type, is_nullable, column_default
24819
+ FROM information_schema.columns
24820
+ WHERE table_schema = 'public' AND table_name = '${table}'
24821
+ ORDER BY ordinal_position`);
24822
+ if (cols.length === 0)
24823
+ return false;
24824
+ const pkCols = await source.all(`SELECT kcu.column_name
24825
+ FROM information_schema.table_constraints tc
24826
+ JOIN information_schema.key_column_usage kcu
24827
+ ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
24828
+ WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_schema = 'public' AND tc.table_name = '${table}'
24829
+ ORDER BY kcu.ordinal_position`);
24830
+ const pkSet = new Set(pkCols.map((c) => c.column_name));
24831
+ const skipTypes = new Set(["tsvector", "tsquery", "user-defined"]);
24832
+ const filteredCols = cols.filter((c) => !skipTypes.has(c.data_type));
24833
+ const colDefs = filteredCols.map((c) => {
24834
+ const sqliteType = pgTypeToSqlite(c.data_type);
24835
+ const notNull = c.is_nullable === "NO" && !pkSet.has(c.column_name) ? " NOT NULL" : "";
24836
+ return `"${c.column_name}" ${sqliteType}${notNull}`;
24837
+ });
24838
+ if (pkSet.size > 0) {
24839
+ const pkList = [...pkSet].map((c) => `"${c}"`).join(", ");
24840
+ colDefs.push(`PRIMARY KEY (${pkList})`);
24841
+ }
24842
+ const sql = `CREATE TABLE IF NOT EXISTS "${table}" (${colDefs.join(", ")})`;
24843
+ target.exec(sql);
24844
+ process.stderr.write(` [sync] ${table}: auto-created in SQLite from PG schema
24845
+ `);
24846
+ return true;
24847
+ }
24848
+ async function ensureTablesExist(source, target, tables) {
24849
+ for (const table of tables) {
24850
+ if (!isAsyncAdapter(target) && isAsyncAdapter(source)) {
24851
+ await ensureTableInSqliteFromPg(target, source, table);
24852
+ }
24853
+ }
24854
+ }
24789
24855
  async function filterColumnsForTarget(target, table, sourceColumns) {
24790
24856
  try {
24791
24857
  if (!isAsyncAdapter(target)) {
@@ -24820,6 +24886,7 @@ async function syncTransfer(source, target, options, _direction) {
24820
24886
  } = options;
24821
24887
  const results = [];
24822
24888
  const sqliteTarget = !isAsyncAdapter(target) ? target : null;
24889
+ await ensureTablesExist(source, target, tables);
24823
24890
  if (sqliteTarget) {
24824
24891
  try {
24825
24892
  sqliteTarget.exec("PRAGMA foreign_keys = OFF");
@@ -8946,8 +8946,21 @@ function sqliteToPostgres(sql) {
8946
8946
  out = out.replace(/\bAUTOINCREMENT\b/gi, "GENERATED ALWAYS AS IDENTITY");
8947
8947
  out = out.replace(/(?<![I])LIKE/gi, "ILIKE");
8948
8948
  out = out.replace(/\bIFNULL\s*\(/gi, "COALESCE(");
8949
+ out = out.replace(/INSERT\s+OR\s+REPLACE\s+INTO\s+"?(\w+)"?\s*\(([^)]+)\)\s*VALUES/gi, (_match, table, colList) => {
8950
+ const cols = colList.split(",").map((c) => c.trim().replace(/"/g, ""));
8951
+ const pk = cols[0];
8952
+ const updateCols = cols.slice(1);
8953
+ const setClauses = updateCols.map((c) => `"${c}" = EXCLUDED."${c}"`).join(", ");
8954
+ if (updateCols.length > 0) {
8955
+ return `INSERT INTO "${table}" (${colList}) VALUES`;
8956
+ }
8957
+ return `INSERT INTO "${table}" (${colList}) VALUES`;
8958
+ });
8949
8959
  out = out.replace(/INSERT\s+OR\s+REPLACE\s+INTO/gi, "INSERT INTO");
8950
- out = out.replace(/INSERT\s+OR\s+IGNORE\s+INTO/gi, "INSERT INTO");
8960
+ if (/INSERT\s+OR\s+IGNORE\s+INTO/i.test(out)) {
8961
+ out = out.replace(/INSERT\s+OR\s+IGNORE\s+INTO/gi, "INSERT INTO");
8962
+ out = out.replace(/;?\s*$/, " ON CONFLICT DO NOTHING");
8963
+ }
8951
8964
  return out;
8952
8965
  }
8953
8966
 
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMnD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC1B,sBAAsB;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kCAAkC;IAClC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB;AAMD;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB;AAqoBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,EAAE,CAKxD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKxE"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMnD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC1B,sBAAsB;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kCAAkC;IAClC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB;AAMD;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB;AAwuBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,EAAE,CAKxD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKxE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/cloud",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "description": "Shared cloud infrastructure — database adapter (SQLite + PostgreSQL), sync engine, feedback system, unified dotfile config",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",