Skip to content

Commit

Permalink
add integration
Browse files Browse the repository at this point in the history
  • Loading branch information
ysangkok committed Oct 16, 2012
1 parent 3db6ed5 commit 56cc965
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 21,083 deletions.
54 changes: 22 additions & 32 deletions convert.ts
@@ -1,6 +1,11 @@
///<reference path='typescript.ts' />
///<reference path='node.d.ts' />

module TSIFaceJSONSchema {

var sys = require("sys");
var assert = require("assert");

class StringSourceText implements TypeScript.ISourceText {
private str: string;
constructor(src) {
Expand Down Expand Up @@ -41,8 +46,11 @@ class JSONSchema {
};
}

function getJSONSchemas(typeScriptSrc) {
export function extractSchemas(typeScriptSrc) { // argument is string or node.js module object
var src = typeScriptSrc;
if (typeof src.filename !== "undefined") {
src = require("fs").readFileSync(src.filename.split(".")[0] + ".ts", "utf-8");
}

var jsonschemas = [];

Expand Down Expand Up @@ -75,35 +83,17 @@ function getJSONSchemas(typeScriptSrc) {
return jsonschemas.map(function(v){return v.toObject();});
}

// demo code

var src = "interface duck { color: string; weight: number; age?: number; }\ninterface car { numberDoors: number; }";
var jsonSchemaObjects = getJSONSchemas(src);

console.log(jsonSchemaObjects.map(function(v){return JSON.stringify(v);}));

// VALIDATE SCHEMAS

var JSVenv = require("JSV").JSV.createEnvironment();

var obj1 = '{"color": "brown", "weight": 3.2, "age": 6.4}'; // this is a valid duck
var obj2 = '{"color": "brown", "weight": 3.2, "age": "four"}';
var obj3 = '{"numberDoors": "four"}';
var obj4 = '{"numberDoors": 3}'; // this is a valid car
export function typeCheck(JSVenv, args, schemas, ifaces) {
var i = 0;
ifaces.forEach(function(v) {
if (!v) { i++; return; }
var candidate_schemas = schemas.filter(function(w){ return w.description === v; });
if (candidate_schemas.length === 0) throw new Error("unknown interface " + v);
var schema = candidate_schemas[0];
var res = JSVenv.validate(args[i], schema);
assert.ok(res.errors.length === 0, "Runtime typecheck failed on argument number " + (i+1) + ": Value: " + sys.inspect(args[i]) + ", Schema: " + JSON.stringify(schema) + ", Error reports (length " + res.errors.length + "): " + sys.inspect(res.errors));
i++;
});
}

[jsonSchemaObjects[0],jsonSchemaObjects[1]].forEach(function testSchema(schema) {
console.log(
[obj1, obj2, obj3, obj4].map(function objIsValid(obj) {
var report = JSVenv.validate(JSON.parse(obj), schema);

if (report.errors.length === 0) {
return true; // valid
} else {
return false; // invalid
}
})
);
});
// outputs:
// [true, false, false, false]
// [false, false, false, true]
}
30 changes: 30 additions & 0 deletions example.ts
@@ -0,0 +1,30 @@
///<reference path='node.d.ts' />

var ijjp = require("./ifacejsonjsproxy")
var typeCheck = ijjp.typeCheck;
var schemas = ijjp.extractSchemas(module);

var JSVenv = require("JSV").JSV.createEnvironment();

enum Color {
BLACK,
RED
}

interface PhysicalObject { color : Color; intact : bool; weight : number; }

class Car implements PhysicalObject {
public intact = true;
constructor(public color : Color, public weight : number) {};
}

function scratch(aCar : Car) {
typeCheck(JSVenv, arguments, schemas, ["PhysicalObject"]);
console.log("Scratching the car!");
aCar.intact = false;
}

scratch(new Car(Color.BLACK, 4.2));
eval("scratch(new Car(Color.BLACK, 'four'));");
eval("scratch(69);");
eval("scratch({ intact: 42, color: Color.RED });");
21 changes: 21 additions & 0 deletions ifacejsonjsproxy.js
@@ -0,0 +1,21 @@
var fs = require('fs');
var path = require('path');

var tsTempFile = null;
['TMPDIR', 'TMP', 'TEMP'].forEach(function(td) {
    if (!tsTempFile && process.env[td])
        tsTempFile = process.env[td];
});
tsTempFile = path.join((tsTempFile || "/tmp"), "ifacejson-jsproxy-tmp-" + Date.now() + ".js");

var contents = [
    "(function() {",
    fs.readFileSync(path.join(__dirname, "ifacejson.js"), "utf8"),
    "module.exports = TSIFaceJSONSchema;",
    "}).call({});"
].join("");
fs.writeFileSync(tsTempFile, contents, "utf-8");

module.exports = require(tsTempFile);

fs.unlinkSync(tsTempFile);

0 comments on commit 56cc965

Please sign in to comment.