Skip to content

Commit

Permalink
feat(openapi-3.1-adapter): add support for browser build fragments
Browse files Browse the repository at this point in the history
Refs #35
  • Loading branch information
char0n committed Aug 14, 2020
1 parent 137c4e6 commit 800f658
Show file tree
Hide file tree
Showing 23 changed files with 52,634 additions and 97 deletions.
7 changes: 6 additions & 1 deletion apidom/.commitlintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@
[
"camel-case",
"kebab-case",
"upper-case"
"upper-case",
"lower-case",
"pascal-case",
"sentence-case",
"snake-case",
"start-case"
]
],
"subject-case": [
Expand Down
37 changes: 36 additions & 1 deletion apidom/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions apidom/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
"eslint-plugin-import": "=2.20.2",
"eslint-plugin-mocha": "=7.0.0",
"eslint-plugin-prettier": "=3.1.3",
"file-loader": "=6.0.0",
"husky": "=4.2.5",
"lerna": "=3.20.2",
"link-parent-bin": "=1.0.2",
Expand All @@ -67,6 +68,7 @@
"regenerator-runtime": "=0.13.5",
"rimraf": "=3.0.2",
"terser-webpack-plugin": "=3.0.2",
"tree-sitter-cli": "=0.16.9",
"typescript": "=3.9.3",
"webpack": "=4.43.0",
"webpack-cli": "=3.3.11"
Expand Down
1 change: 0 additions & 1 deletion apidom/packages/apidom-ns-openapi3-1/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
"main": "lib/namespace.js",
"module": "es/namespace.js",
"jsnext:main": "es/namespace.js",
"browser": "dist/apidom-ns-openapi3-1.browser.js",
"unpkg": "dist/apidom-ns-openapi3-1.browser.min.js",
"types": "types/namespace.d.ts",
"scripts": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
/es
/lib
/types
/tree-sitter-json.wasm
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@ const { nonMinimizeTrait, minimizeTrait } = require('./traits.config');

const browser = {
mode: 'production',
entry: ['./src/polyfills.ts', './src/adapter.ts'],
entry: ['./src/polyfills.ts', './src/adapter-browser.ts'],
target: 'web',
node: {
fs: 'empty',
},
performance: {
maxEntrypointSize: 712000,
maxAssetSize: 712000,
Expand All @@ -15,13 +18,18 @@ const browser = {
path: path.resolve('./dist'),
filename: 'apidom-parser-adapter-openapi3-1.browser.js',
libraryTarget: 'umd',
library: 'apidom',
library: 'apidomParserAdapterOpenApi3_1',
},
resolve: {
extensions: ['.ts', '.mjs', '.js', '.json'],
},
module: {
rules: [
{
test: /\.wasm$/,
loader: 'file-loader',
type: 'javascript/auto',
},
{
test: /\.(ts|js)?$/,
exclude: /node_modules/,
Expand All @@ -40,19 +48,27 @@ const browser = {

const browserMin = {
mode: 'production',
entry: ['./src/polyfills.ts', './src/adapter.ts'],
entry: ['./src/polyfills.ts', './src/adapter-browser.ts'],
target: 'web',
node: {
fs: 'empty',
},
output: {
path: path.resolve('./dist'),
filename: 'apidom-parser-adapter-openapi3-1.browser.min.js',
libraryTarget: 'umd',
library: 'apidom',
library: 'apidomParserAdapterOpenApi3_1',
},
resolve: {
extensions: ['.ts', '.mjs', '.js', '.json'],
},
module: {
rules: [
{
test: /\.wasm$/,
loader: 'file-loader',
type: 'javascript/auto',
},
{
test: /\.(ts|js)?$/,
exclude: /node_modules/,
Expand Down

This file was deleted.

21 changes: 12 additions & 9 deletions apidom/packages/apidom-parser-adapter-openapi3-1/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,17 @@
"name": "apidom-parser-adapter-openapi3-1",
"version": "0.1.0",
"description": "OpenAPI 3.1 adapter for ApiDOM parser",
"main": "lib/adapter.js",
"module": "es/adapter.js",
"jsnext:main": "es/adapter.js",
"browser": "dist/apidom-parser-adapter-openapi3-1.browser.js",
"main": "lib/adapter-node.js",
"module": "es/adapter-browser.js",
"jsnext:main": "es/adapter-browser.js",
"browser": "es/adapter-browser.js",
"unpkg": "dist/apidom-parser-apdater-openapi3-1.browser.min.js",
"scripts": {
"build": "npm run build:es && npm run build:commonjs && npm run build:umd",
"build": "npm run build:es && npm run build:commonjs && npm run build:umd:browser",
"build:es": "cross-env BABEL_ENV=es babel src --out-dir es --extensions '.ts' --root-mode 'upward'",
"build:commonjs": "cross-env BABEL_ENV=commonjs babel src --out-dir lib --extensions '.ts' --root-mode 'upward'",
"build:umd": "npm run build:umd:node && npm run build:umd:browser",
"build:umd:node": "cross-env BABEL_ENV=node webpack --config config/webpack/node.config.js --progress",
"build:umd:browser": "cross-env BABEL_ENV=browser webpack --config config/webpack/browser.config.js --progress",
"build:umd:browser": "npm run build:wasm && cross-env BABEL_ENV=browser webpack --config config/webpack/browser.config.js --progress",
"build:wasm": "tree-sitter build-wasm ../../node_modules/tree-sitter-json",
"lint": "eslint ./",
"lint:fix": "eslint ./ --fix",
"clean": "rimraf ./es ./lib ./dist",
Expand All @@ -33,6 +32,10 @@
"ramda-adjunct": "=2.26.0",
"stampit": "=4.3.1",
"tree-sitter": "=0.16.1",
"tree-sitter-json": "=0.16.0"
"tree-sitter-json": "=0.16.0",
"web-tree-sitter": "=0.16.4"
},
"devDependencies": {
"tree-sitter-cli": "=0.16.9"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export { default as parse } from './parser/index-browser';

export const mediaTypes = ['application/vnd.oai.openapi', 'application/vnd.oai.openapi+json'];

export const detect = (source: string): boolean =>
!!source.match(/(["']?)openapi\1\s*:\s*(["']?)3\.\d+\.\d+\2/g);
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export { default as parse } from './parser';
export { default as parse } from './parser/index-node';

export const mediaTypes = ['application/vnd.oai.openapi', 'application/vnd.oai.openapi+json'];

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { tail } from 'ramda';
import { isString } from 'ramda-adjunct';
// @ts-ignore
import treeSitterWasm from 'web-tree-sitter/tree-sitter.wasm';

// patch fetch() to let emscripten load the WASM file
const realFetch = window.fetch;
window.fetch = (...args) => {
// @ts-ignore
if (isString(args[0]) && args[0].endsWith('/tree-sitter.wasm')) {
// @ts-ignore
return realFetch.apply(window, [treeSitterWasm, tail(args)]);
}
return realFetch.apply(window, args);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import './index-browser-patch';

import Parser from 'web-tree-sitter';
import * as apiDOM from 'apidom';

import parse from '.';
// @ts-ignore
import treeSitterJson from '../../tree-sitter-json.wasm';

const parserP = (async () => {
await Parser.init();
const JsonLanguage = await Parser.Language.load(treeSitterJson);
const parser = new Parser();
parser.setLanguage(JsonLanguage);
return parser;
})();

const parseBrowser = async (
source: string,
options: Record<string, unknown> = {},
): Promise<apiDOM.ParseResultElement> => {
const parser = await parserP;
// @ts-ignore
return parse(source, { ...options, parser });
};

export default parseBrowser;
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import Parser from 'tree-sitter';
// @ts-ignore
import JSONLanguage from 'tree-sitter-json';
import * as apiDOM from 'apidom';

import parse from '.';

const parseNode = async (
source: string,
options: Record<string, unknown> = {},
): Promise<apiDOM.ParseResultElement> => {
const parser = new Parser();
parser.setLanguage(JSONLanguage);

// @ts-ignore
return parse(source, { ...options, parser });
};

export default parseNode;
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import Parser from 'tree-sitter';
// @ts-ignore
import JSONLanguage from 'tree-sitter-json';
import $RefParser from '@apidevtools/json-schema-ref-parser';
import * as apiDOM from 'apidom';
import { createNamespace, ParseResultElement } from 'apidom';
import { Error, JsonArray, JsonDocument, JsonObject, JsonProperty } from 'apidom-ast';
import openapi3_1 from 'apidom-ns-openapi3-1';
import { transform } from './cst';
Expand All @@ -11,18 +8,16 @@ import { visit } from './visitors';

const parse = async (
source: string,
{ sourceMap = false, specObj = specification } = {},
): Promise<apiDOM.ParseResultElement> => {
{ sourceMap = false, specObj = specification, parser = null } = {},
): Promise<ParseResultElement> => {
const resolvedSpecObj = await $RefParser.dereference(specObj);
const namespace = apiDOM.createNamespace(openapi3_1);
const namespace = createNamespace(openapi3_1);
// @ts-ignore
const parseResultElement = new namespace.elements.ParseResult();
// @ts-ignore
const documentVisitor = resolvedSpecObj.visitors.document.$visitor();

const parser = new Parser();
parser.setLanguage(JSONLanguage);

// @ts-ignore
const cst = parser.parse(source);
const ast = transform(cst);

Expand Down
1 change: 0 additions & 1 deletion apidom/packages/apidom-parser/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
"main": "lib/parser.js",
"module": "es/parser.js",
"jsnext:main": "es/parser.js",
"browser": "dist/apidom-parser.browser.js",
"unpkg": "dist/apidom-parser.browser.min.js",
"types": "types/parser.d.ts",
"scripts": {
Expand Down
Loading

0 comments on commit 800f658

Please sign in to comment.