1+ package main
2+
3+ import (
4+ "strings"
5+ "syscall/js"
6+
7+ "github.com/sqldef/sqldef/database"
8+ "github.com/sqldef/sqldef/parser"
9+ "github.com/sqldef/sqldef/schema"
10+ )
11+
12+ // diff takes SQL DDL statements and generates the difference
13+ func diff (mode string , desiredDDLs string , currentDDLs string ) (string , error ) {
14+ generatorMode := schema .GeneratorModeMysql
15+ sqlParser := database.GenericParser {}
16+
17+ if mode == "postgres" {
18+ generatorMode = schema .GeneratorModePostgres
19+ sqlParser = database .NewParser (parser .ParserModePostgres )
20+ }
21+
22+ if mode == "sqlite3" {
23+ generatorMode = schema .GeneratorModeSQLite3
24+ sqlParser = database .NewParser (parser .ParserModeSQLite3 )
25+ }
26+
27+ if mode == "mssql" {
28+ generatorMode = schema .GeneratorModeMssql
29+ sqlParser = database .NewParser (parser .ParserModeMssql )
30+ }
31+
32+ ddls , err := schema .GenerateIdempotentDDLs (generatorMode , sqlParser , desiredDDLs , currentDDLs , database.GeneratorConfig {}, "" )
33+ out := strings .Join (ddls , ";\n " )
34+
35+ if err != nil {
36+ return "" , err
37+ } else {
38+ return out , nil
39+ }
40+ }
41+
42+ // diffWrapper creates a JS-compatible function for the diff operation
43+ func diffWrapper () js.Func {
44+ return js .FuncOf (func (this js.Value , args []js.Value ) interface {} {
45+ if len (args ) != 3 {
46+ return map [string ]interface {}{
47+ "error" : "Invalid number of arguments. Expected 3: mode, desiredDDLs, currentDDLs" ,
48+ }
49+ }
50+
51+ mode := args [0 ].String ()
52+ desiredDDLs := args [1 ].String ()
53+ currentDDLs := args [2 ].String ()
54+
55+ result , err := diff (mode , desiredDDLs , currentDDLs )
56+ if err != nil {
57+ return map [string ]interface {}{
58+ "error" : err .Error (),
59+ }
60+ }
61+
62+ return map [string ]interface {}{
63+ "result" : result ,
64+ }
65+ })
66+ }
67+
68+ // createSqlDefModule creates an object with all exported functions
69+ func createSqlDefModule () map [string ]interface {} {
70+ return map [string ]interface {}{
71+ "diff" : diffWrapper (),
72+ }
73+ }
74+
75+ // registerModuleFactory registers a function that returns the module
76+ func registerModuleFactory () js.Func {
77+ moduleFactory := js .FuncOf (func (this js.Value , args []js.Value ) interface {} {
78+ return createSqlDefModule ()
79+ })
80+
81+ js .Global ().Set ("createSqlDefModule" , moduleFactory )
82+ return moduleFactory
83+ }
84+
85+ func main () {
86+ moduleFactory := registerModuleFactory ()
87+ <- make (chan bool )
88+ moduleFactory .Release ()
89+ }
0 commit comments