Skip to content

Commit 7c217c2

Browse files
committed
basic setup
1 parent 8561699 commit 7c217c2

File tree

11 files changed

+1189
-43
lines changed

11 files changed

+1189
-43
lines changed

build.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// this will inline wasm bytes and wrap with wasm_exec.js
2+
3+
import { readFile, writeFile } from 'node:fs/promises'
4+
5+
const buf = await readFile('./go/sqldef.wasm')
6+
7+
await writeFile('index.js', `import './go/wasm_exec.js'
8+
const buf = new Uint8Array([${[...buf].join(',')}])
9+
const go = new Go()
10+
11+
export default async (t,s1,s2) => {
12+
const inst = await WebAssembly.instantiate(buf, go.importObject)
13+
go.run(inst.instance)
14+
const sqlDefModule = createSqlDefModule()
15+
const {error, result} = sqlDefModule.diff(t, s1, s2)
16+
if (error) {
17+
throw new Error(error)
18+
}
19+
return result
20+
}
21+
`)

src/go.mod renamed to go/go.mod

File renamed without changes.

src/go.sum renamed to go/go.sum

File renamed without changes.

go/sqldef-wasm.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
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+
}

go/sqldef.wasm

2.03 MB
Binary file not shown.

0 commit comments

Comments
 (0)