edgedb-js
edgedb-js copied to clipboard
Add Deno compilation target for query builder
This PR adds support for a --target deno
via the query builder cli.
The cli itself still requires the use of npx
due to the syntax
folder not being compatible with deno as of yet.
TODO:
-
[x] resolve conflicts
-
[x] link repro project (due to the changes to the Deno compiler the use of an import map is required in the interim until a new release is cut for https://deno.land/x/edgedb)
-
add compiling deno version number
-
add missing deno adapter fn readdir
-
refactor estimateCompilationTarget and getProjectRoot
-
add deno compatible compilation to query builder
Reproduction with code generation for deno https://github.com/seanaye/fresh-edgedb-starter
Reproduction with code generation for deno seanaye/fresh-edgedb-starter
Could you share the deno-npx
code? I wanna run your repro but that one is missing. :q @seanaye
Whoops sorry, yea I'll put it on GitHub and update example
@hyp3rflow updated the deno-npx
in deno.json
@seanaye Now it works! thanks :)
I've done some works on my forked branch to run compilation without npx. Could you apply commits or review this? 😊 @seanaye
https://github.com/hyp3rflow/edgedb-js/commits/deno-qb
You can simply compile codes for deno like this: deno run -A --unstable ../edgedb-js/edgedb-deno/_src/reflection/cli.ts --target deno
This is much better, thanks @hyp3rflow
Haven't tested with conflicts resolved, will try tonight
Good! In addition, I found that my change has some type error due to the wrong or missing Buffer
shim.
So I pushed one more commit and It seems to be passed with deno check
, but I think there will be more clever solution to resolve Buffer
shim issue. :q https://github.com/hyp3rflow/edgedb-js/commit/6db93c0a489a98dd75be7894b7f892b63a443373
@hyp3rflow I have merged in your changes and upstream changes. I am unable to generate with edgedb 2.0. When trying to connect to instance I receive A client connection error occurred; reconnecting because of "waitUntilAvailable=30000". ClientConnectionClosedError: network error: ConnectionRefused: Connection refused (os error 61)
Have you been able to resolve this?
@seanaye I guess it is related with https://github.com/edgedb/edgedb-js/issues/376. I'm also suffering that issue but sadly I couldn't resolve it.
https://github.com/edgedb/edgedb-js/issues/376#issuecomment-1173840632 will resolve the error you received, but it makes another error error: Uncaught (in promise) ClientConnectionFailedError: unexpected message type 115 ("s")
. :q
@hyp3rflow In MacOS I do not get that error, I think the connection succeeds but instead I get
error: Uncaught (in promise) Error: ref name: std::assert_single already registered
throw new Error(`ref name: ${name} already registered`);
^
at CodeBuilder.registerRef (file:///Users/seanaye/dev/edge2/edgedb-deno/_src/reflection/builders.ts:547:13)
at generateFuncopTypes (file:///Users/seanaye/dev/edge2/edgedb-deno/_src/reflection/generators/generateFunctionTypes.ts:134:10)
at generateFunctionTypes (file:///Users/seanaye/dev/edge2/edgedb-deno/_src/reflection/generators/generateFunctionTypes.ts:37:3)
at generateQB (file:///Users/seanaye/dev/edge2/edgedb-deno/_src/reflection/generate.ts:123:5)
at async run (file:///Users/seanaye/dev/edge2/edgedb-deno/_src/reflection/cli.ts:304:3)
@seanaye Okay I forgot pulling the branch so now I get the same error :)
@seanaye I found that you resolved merge conflict wrong.
As you can see reflection/generators/generateFunctionTypes.ts
in this commit, the code.registerRef
is reordered but in our branch code.registerRef
is duplicated after conflict resolved. https://github.com/edgedb/edgedb-js/commit/50869e81cb17f9873ed549a09dd67ca2ae55c83a
I've re-formatted files and fixed conflict issue! here you can see the PR: https://github.com/seanaye/edgedb-js/pull/3
Whoops, I'll fix that
@hyp3rflow I added the root project detection, but in doing so I noticed that if the generation script is inside the deno.json
file then the cwd is already identified as the root of the repo. This is because if the script is run with deno task codegen
then the cwd
of the deno context is the project root. The deno cli also correctly identifies root deno.json
when your shell is in a subdir.
@colinhacks Can you tell us about your schedule for review this PR? We are waiting for this 🥺
Deno support has officially landed in [email protected]
@seanaye @hyp3rflow
Basic usage guidelines:
Generation
$ deno run -A --unstable --reload https://deno.land/x/edgedb/generate.ts
This command supports all same flags as the npx
equivalent:
- Connection flags like
-I
,--dsn
- Specify output dir with
--output-dir
- Specify target with
--target
Import map
The generated code contains imports from "edgedb"
. You'll need to define an import map so Deno knows how to resolve this.
deno.json
// deno.json
{
// ...
"importMap": "./import_map.json"
}
import_map.json
{
"imports": {
"edgedb": "https://deno.land/x/edgedb/mod.ts",
"edgedb/": "https://deno.land/x/edgedb/"
}
}
Usage
Nothing special here, most of the examples in the query builder docs will work as-is. Here's a minimal script you can try out.
test.ts
import {createClient} from 'edgedb';
import e from './dbschema/edgeql-js/index.ts';
const client = createClient();
const query = e.select({
num: e.int64(35),
msg: e.str('Hello world'),
});
const result = await query.run(client);
console.log(JSON.stringify(result, null, 2));
Deno.exit();
$ deno run -A --unstable test.ts