Skip to content

Commit

Permalink
add a browser test, and also make a few changes that get us closer to…
Browse files Browse the repository at this point in the history
… using Node ESM (eclipse-langium/langium#905)
  • Loading branch information
trusktr committed May 27, 2023
1 parent b77ed4b commit d7f9930
Show file tree
Hide file tree
Showing 19 changed files with 105 additions and 40 deletions.
4 changes: 4 additions & 0 deletions .prettierignore
Expand Up @@ -2,5 +2,9 @@ node_modules/
out/
package-lock.json

# Ignore code generated into our project by langium based on our grammar.
generated/
syntaxes/

# Ignore examples for now because they have syntax errors we're testing, prettier can't parse them.
examples/
3 changes: 0 additions & 3 deletions bin/cli

This file was deleted.

3 changes: 3 additions & 0 deletions bin/cli.js
@@ -0,0 +1,3 @@
#!/usr/bin/env node

require('../out/cli/index.js').default()
3 changes: 3 additions & 0 deletions examples/st.d.ts
@@ -0,0 +1,3 @@
type i32 = number;
type f32 = number;
type f64 = number;
24 changes: 24 additions & 0 deletions examples/tsconfig.json
@@ -0,0 +1,24 @@
{
"compilerOptions": {
// Compiler setup
"target": "ES6",
"module": "esnext",
"lib": ["ESNext"],
"sourceMap": true,
"outDir": "out",
"moduleResolution": "node",
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,

// Type checking
"strict": true,
"noUnusedLocals": true,
"noImplicitReturns": true,
"noImplicitOverride": true,

"importsNotUsedAsValues": "error"
},
"include": ["./**/*.ts"],
"exclude": ["out", "node_modules"]
}
16 changes: 11 additions & 5 deletions package.json
Expand Up @@ -41,7 +41,7 @@
"src"
],
"bin": {
"bytescript-cli": "./bin/cli"
"bs": "./bin/cli.js"
},
"main": "./out/extension.js",
"scripts": {
Expand All @@ -53,9 +53,11 @@
"langium:watch": "langium generate --watch",
"format:all": "prettier --write .",
"wat2wasm": "wat2wasm generated/poc1.wat -o generated/poc1.wasm",
"test": "npm run test:compile && npm run test:node && echo 'Tests passed!'",
"test:compile": "./bin/cli compile examples/basic/poc1.ts && npm run wat2wasm",
"test:node": "node tests/node/test.mjs"
"wtr": "web-test-runner tests/browser/*.ts --node-resolve",
"test": "npm run lint && npm run test:compile && npm run test:node && npm run test:browser && echo 'Tests passed!'",
"test:compile": "./bin/cli.js compile examples/basic/poc1.ts && npm run wat2wasm",
"test:node": "node tests/node/test.mjs",
"test:browser": "npm run wtr"
},
"dependencies": {
"chalk": "^4.1.2",
Expand All @@ -64,13 +66,17 @@
"langium": "~1.0.0",
"vscode-languageclient": "^8.0.2",
"vscode-languageserver": "^8.0.2",
"vscode-uri": "^3.0.2"
"vscode-uri": "^3.0.2",
"wdeasync": "^0.1.118"
},
"devDependencies": {
"@open-wc/testing": "^3.1.8",
"@types/node": "^14.17.3",
"@types/vscode": "^1.56.0",
"@typescript-eslint/eslint-plugin": "^5.28.0",
"@typescript-eslint/parser": "^5.28.0",
"@web/dev-server-esbuild": "^0.4.1",
"@web/test-runner": "^0.16.1",
"binaryen": "^113.0.0",
"eslint": "^8.17.0",
"langium-cli": "~1.0.0",
Expand Down
4 changes: 3 additions & 1 deletion src/cli/cli-util.ts
Expand Up @@ -2,7 +2,9 @@ import chalk from 'chalk'
import path from 'path'
import fs from 'fs'
import type {AstNode, LangiumDocument, LangiumServices} from 'langium'
import {URI} from 'vscode-uri'
import * as vscodeUri from 'vscode-uri'

const {URI} = vscodeUri

export async function extractDocument(fileName: string, services: LangiumServices): Promise<LangiumDocument> {
const extensions = services.LanguageMetaData.fileExtensions
Expand Down
12 changes: 6 additions & 6 deletions src/cli/generator.ts
Expand Up @@ -7,12 +7,12 @@ import {
isExportedFunctionDeclaration,
isOriginalFunctionDeclaration,
isReturnStatement,
} from '../language-server/generated/ast'
import {extractDestinationAndName} from './cli-util'
import {isBinaryExpressionSum} from '../language-server/types/types'
import {getType} from '../language-server/types/types'
import {isI32NumberType} from '../language-server/types/descriptions'
import {isBinaryExpressionProduct} from '../language-server/types/types'
} from '../language-server/generated/ast.js'
import {extractDestinationAndName} from './cli-util.js'
import {isBinaryExpressionSum} from '../language-server/types/types.js'
import {getType} from '../language-server/types/types.js'
import {isI32NumberType} from '../language-server/types/descriptions.js'
import {isBinaryExpressionProduct} from '../language-server/types/types.js'

export function generateWasm(topLevel: TopLevel, filePath: string, destination: string | undefined): string {
const data = extractDestinationAndName(filePath, destination)
Expand Down
23 changes: 12 additions & 11 deletions src/cli/index.ts
@@ -1,17 +1,20 @@
import chalk from 'chalk'
import {green} from 'chalk'
import {Command} from 'commander'
import type {TopLevel} from '../language-server/generated/ast'
import {ByteScriptLanguageMetaData} from '../language-server/generated/module'
import {createByteScriptServices} from '../language-server/bytescript-module'
import {extractAstNode} from './cli-util'
import {generateWasm} from './generator'
import {NodeFileSystem} from 'langium/node'
import type {TopLevel} from '../language-server/generated/ast.js'
import {ByteScriptLanguageMetaData} from '../language-server/generated/module.js'
import {createByteScriptServices} from '../language-server/bytescript-module.js'
import {extractAstNode} from './cli-util.js'
import {generateWasm} from './generator.js'
import {NodeFileSystem} from 'langium/node.js'

// eslint-disable-next-line @typescript-eslint/no-var-requires
const pkg = require('../../package.json')

export async function generate(fileName: string, opts: GenerateOptions): Promise<void> {
const services = createByteScriptServices(NodeFileSystem).ByteScript
const ast = await extractAstNode<TopLevel>(fileName, services)
const generatedFilePath = generateWasm(ast, fileName, opts.destination)
console.log(chalk.green(`Build successful: ${generatedFilePath}`))
console.log(green(`Build successful: ${generatedFilePath}`))
}

export type GenerateOptions = {
Expand All @@ -21,9 +24,7 @@ export type GenerateOptions = {
export default function (): void {
const program = new Command()

program
// eslint-disable-next-line @typescript-eslint/no-var-requires
.version(require('../../package.json').version)
program.version(pkg.version)

const fileExtensions = ByteScriptLanguageMetaData.fileExtensions.join(', ')
program
Expand Down
2 changes: 1 addition & 1 deletion src/extension.ts
@@ -1,6 +1,6 @@
import * as vscode from 'vscode'
import * as path from 'path'
import {LanguageClient, LanguageClientOptions, ServerOptions, TransportKind} from 'vscode-languageclient/node'
import {LanguageClient, LanguageClientOptions, ServerOptions, TransportKind} from 'vscode-languageclient/node.js'

let client: LanguageClient

Expand Down
6 changes: 3 additions & 3 deletions src/language-server/bytescript-module.ts
Expand Up @@ -8,9 +8,9 @@ import {
Module,
PartialLangiumServices,
} from 'langium'
import {ByteScriptGeneratedModule, ByteScriptGeneratedSharedModule} from './generated/module'
import {ByteScriptValidator, registerValidationChecks} from './bytescript-validator'
import {ByteScriptScopeProvider} from './bytescript-scope'
import {ByteScriptGeneratedModule, ByteScriptGeneratedSharedModule} from './generated/module.js'
import {ByteScriptValidator, registerValidationChecks} from './bytescript-validator.js'
import {ByteScriptScopeProvider} from './bytescript-scope.js'

/**
* Declaration of custom services - add your own service classes here.
Expand Down
6 changes: 6 additions & 0 deletions src/language-server/bytescript-scope.ts
@@ -0,0 +1,6 @@
import {DefaultScopeProvider} from 'langium'

export class ByteScriptScopeProvider extends DefaultScopeProvider {
// TODO we'll need to fill this in to provide scope for some cases, but the
// DefaultScopeProvider is currently good enough for the initial PoC.
}
8 changes: 4 additions & 4 deletions src/language-server/bytescript-validator.ts
Expand Up @@ -14,16 +14,16 @@ import {
Block,
ArrowReturnExpression,
TypeDeclaration,
} from './generated/ast'
import type {ByteScriptServices} from './bytescript-module'
} from './generated/ast.js'
import type {ByteScriptServices} from './bytescript-module.js'
import {
getType,
isAssignable,
isBinaryExpressionAssignment,
isBinaryExpressionProduct,
isBinaryExpressionSum,
} from './types/types'
import {TypeInferenceError, isTypeInferenceError, TypeDescription, typeToString} from './types/descriptions'
} from './types/types.js'
import {TypeInferenceError, isTypeInferenceError, TypeDescription, typeToString} from './types/descriptions.js'

/**
* Register custom validation checks.
Expand Down
6 changes: 3 additions & 3 deletions src/language-server/main.ts
@@ -1,7 +1,7 @@
import {startLanguageServer} from 'langium'
import {NodeFileSystem} from 'langium/node'
import {createConnection, ProposedFeatures} from 'vscode-languageserver/node'
import {createByteScriptServices} from './bytescript-module'
import {NodeFileSystem} from 'langium/node.js'
import {createConnection, ProposedFeatures} from 'vscode-languageserver/node.js'
import {createByteScriptServices} from './bytescript-module.js'

// Create a connection to the client
const connection = createConnection(ProposedFeatures.all)
Expand Down
2 changes: 1 addition & 1 deletion src/language-server/types/descriptions.ts
@@ -1,5 +1,5 @@
import type {AstNode} from 'langium'
import type {Identifier, NumberLiteral, TypeExpression} from '../generated/ast'
import type {Identifier, NumberLiteral, TypeExpression} from '../generated/ast.js'

export type TypeDescription = NumberType | FunctionType | TypeInferenceError

Expand Down
4 changes: 2 additions & 2 deletions src/language-server/types/types.ts
Expand Up @@ -13,7 +13,7 @@ import {
isIdentifier,
isBinaryExpression,
isParameter,
} from '../generated/ast'
} from '../generated/ast.js'
import {
createTypeInferenceError,
createF64NumberType,
Expand All @@ -22,7 +22,7 @@ import {
createLiteralNumberType,
FunctionTypeParameter,
TypeDescription,
} from './descriptions'
} from './descriptions.js'

const types = new Map<AstNode, TypeDescription>()

Expand Down
12 changes: 12 additions & 0 deletions tests/browser/test.ts
@@ -0,0 +1,12 @@
import {expect} from '@open-wc/testing'

describe('poc1', () => {
it('add sums up 2 numbers', async () => {
const wasmModule = await WebAssembly.instantiateStreaming(await fetch('/generated/poc1.wasm'))

const {add} = wasmModule.instance.exports as {add(a: number, b: number): number}

expect(add(1, 1)).to.equal(2)
expect(add(3, 12)).to.equal(15)
})
})
2 changes: 2 additions & 0 deletions tests/node/test.mjs
Expand Up @@ -8,3 +8,5 @@ const {add} = wasmModule.instance.exports
const sum = add(5, 6)

console.assert(sum === 11, 'expected 5+6 = 11')

console.log('Node test passed!')
5 changes: 5 additions & 0 deletions web-test-runner.config.mjs
@@ -0,0 +1,5 @@
import {esbuildPlugin} from '@web/dev-server-esbuild'

export default {
plugins: [esbuildPlugin({ts: true})],
}

0 comments on commit d7f9930

Please sign in to comment.