'+L[0]+""}else{r+=L[0]}N=A.lR.lastIndex;L=A.lR.exec(K)}return r+K.substr(N)}function z(){if(A.sL&&!e[A.sL]){return l(w)}var r=A.sL?d(A.sL,w):g(w);if(A.r>0){v+=r.keyword_count;B+=r.r}return''+r.value+""}function J(){return A.sL!==undefined?z():G()}function I(L,r){var K=L.cN?'':"";if(L.rB){x+=K;w=""}else{if(L.eB){x+=l(r)+K;w=""}else{x+=K;w=r}}A=Object.create(L,{parent:{value:A}});B+=L.r}function C(K,r){w+=K;if(r===undefined){x+=J();return 0}var L=o(r,A);if(L){x+=J();I(L,r);return L.rB?0:r.length}var M=s(A,r);if(M){if(!(M.rE||M.eE)){w+=r}x+=J();do{if(A.cN){x+=""}A=A.parent}while(A!=M.parent);if(M.eE){x+=l(r)}w="";if(M.starts){I(M.starts,"")}return M.rE?0:r.length}if(t(r,A)){throw"Illegal"}w+=r;return r.length||1}var F=e[D];f(F);var A=F;var w="";var B=0;var v=0;var x="";try{var u,q,p=0;while(true){A.t.lastIndex=p;u=A.t.exec(E);if(!u){break}q=C(E.substr(p,u.index-p),u[0]);p=u.index+q}C(E.substr(p));return{r:B,keyword_count:v,value:x,language:D}}catch(H){if(H=="Illegal"){return{r:0,keyword_count:0,value:l(E)}}else{throw H}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g,"
")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagName("pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"",rE:true,sL:"css"}},{cN:"tag",b:"
--------------------------------------------------------------------------------
/src/Jlapp/Swaggervel/SwaggervelServiceProvider.php:
--------------------------------------------------------------------------------
1 | publishes([
21 | __DIR__.'/../../config/swaggervel.php' => config_path('swaggervel.php'),
22 | ]);
23 |
24 | $this->publishes([
25 | __DIR__.'/../../../public' => public_path('vendor/swaggervel'),
26 | ], 'public');
27 |
28 |
29 | $this->loadViewsFrom(__DIR__.'/../../views', 'swaggervel');
30 |
31 | $this->publishes([
32 | __DIR__.'/../../views' => base_path('resources/views/vendor/swaggervel'),
33 | ]);
34 | }
35 | /**
36 | * Register the service provider.
37 | *
38 | * @return void
39 | */
40 | public function register()
41 | {
42 | $this->mergeConfigFrom(
43 | __DIR__.'/../../config/swaggervel.php', 'swaggervel'
44 | );
45 |
46 | require_once __DIR__ .'/routes.php';
47 | }
48 |
49 | }
50 |
--------------------------------------------------------------------------------
/src/Jlapp/Swaggervel/routes.php:
--------------------------------------------------------------------------------
1 | 'application/json'
16 | ));
17 | });
18 |
19 | Route::get(Config::get('swaggervel.api-docs-route'), function() {
20 | if (Config::get('swaggervel.generateAlways')) {
21 | $appDir = base_path()."/".Config::get('swaggervel.app-dir');
22 | $docDir = Config::get('swaggervel.doc-dir');
23 |
24 | if (!File::exists($docDir) || is_writable($docDir)) {
25 | // delete all existing documentation
26 | if (File::exists($docDir)) {
27 | File::deleteDirectory($docDir);
28 | }
29 |
30 | File::makeDirectory($docDir);
31 |
32 | $defaultBasePath = Config::get('swaggervel.default-base-path');
33 | $defaultApiVersion = Config::get('swaggervel.default-api-version');
34 | $defaultSwaggerVersion = Config::get('swaggervel.default-swagger-version');
35 | $excludeDirs = Config::get('swaggervel.excludes');
36 |
37 | $swagger = \Swagger\scan($appDir, [
38 | 'exclude' => $excludeDirs
39 | ]);
40 |
41 | $filename = $docDir . '/api-docs.json';
42 | file_put_contents($filename, $swagger);
43 | }
44 | }
45 |
46 | if (Config::get('swaggervel.behind-reverse-proxy')) {
47 | $proxy = Request::server('REMOTE_ADDR');
48 | Request::setTrustedProxies(array($proxy));
49 | }
50 |
51 | Blade::setEscapedContentTags('{{{', '}}}');
52 | Blade::setContentTags('{{', '}}');
53 |
54 | //need the / at the end to avoid CORS errors on Homestead systems.
55 | $response = response()->view('swaggervel::index', array(
56 | 'secure' => Request::secure(),
57 | 'urlToDocs' => url(Config::get('swaggervel.doc-route')),
58 | 'requestHeaders' => Config::get('swaggervel.requestHeaders'),
59 | 'clientId' => Request::input("client_id"),
60 | 'clientSecret' => Request::input("client_secret"),
61 | 'realm' => Request::input("realm"),
62 | 'appName' => Request::input("appName"),
63 | )
64 | );
65 |
66 | //need the / at the end to avoid CORS errors on Homestead systems.
67 | /*$response = Response::make(
68 | View::make('swaggervel::index', array(
69 | 'secure' => Request::secure(),
70 | 'urlToDocs' => url(Config::get('swaggervel.doc-route')),
71 | 'requestHeaders' => Config::get('swaggervel.requestHeaders') )
72 | ),
73 | 200
74 | );*/
75 |
76 | if (Config::has('swaggervel.viewHeaders')) {
77 | foreach (Config::get('swaggervel.viewHeaders') as $key => $value) {
78 | $response->header($key, $value);
79 | }
80 | }
81 |
82 | return $response;
83 | });
84 |
--------------------------------------------------------------------------------
/src/config/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slampenny/Swaggervel/e026d72cacec8b2db8b2510179d73042f5e87bb9/src/config/.gitkeep
--------------------------------------------------------------------------------
/src/config/local/swaggervel.php:
--------------------------------------------------------------------------------
1 | storage_path() . '/docs',
16 |
17 | /*
18 | |--------------------------------------------------------------------------
19 | | Relative path to access parsed swagger annotations.
20 | |--------------------------------------------------------------------------
21 | */
22 | 'doc-route' => 'docs',
23 |
24 | /*
25 | |--------------------------------------------------------------------------
26 | | Relative path to access swagger ui.
27 | |--------------------------------------------------------------------------
28 | */
29 | 'api-docs-route' => 'api/docs',
30 |
31 | /*
32 | |--------------------------------------------------------------------------
33 | | Absolute path to directory containing the swagger annotations are stored.
34 | |--------------------------------------------------------------------------
35 | */
36 | "app-dir" => "app",
37 |
38 | /*
39 | |--------------------------------------------------------------------------
40 | | Absolute path to directories that you would like to exclude from swagger generation
41 | |--------------------------------------------------------------------------
42 | */
43 | "excludes" => array(
44 | storage_path(),
45 | base_path()."/tests",
46 | base_path()."/resources/views",
47 | base_path()."/config",
48 | base_path()."/vendor"
49 | ),
50 |
51 | /*
52 | |--------------------------------------------------------------------------
53 | | Turn this off to remove swagger generation on production
54 | |--------------------------------------------------------------------------
55 | */
56 | "generateAlways" => true,
57 |
58 | "api-key" => "auth_token",
59 |
60 | /*
61 | |--------------------------------------------------------------------------
62 | | Edit to set the api's version number
63 | |--------------------------------------------------------------------------
64 | */
65 | "default-api-version" => "v1",
66 |
67 | /*
68 | |--------------------------------------------------------------------------
69 | | Edit to set the swagger version number
70 | |--------------------------------------------------------------------------
71 | */
72 | "default-swagger-version" => "2.0",
73 |
74 | /*
75 | |--------------------------------------------------------------------------
76 | | Edit to set the api's base path
77 | |--------------------------------------------------------------------------
78 | */
79 | "default-base-path" => "",
80 |
81 | /*
82 | |--------------------------------------------------------------------------
83 | | Edit to trust the proxy's ip address - needed for AWS Load Balancer
84 | |--------------------------------------------------------------------------
85 | */
86 | "behind-reverse-proxy" => false,
87 | /*
88 | |--------------------------------------------------------------------------
89 | | Uncomment to add response headers when swagger is generated
90 | |--------------------------------------------------------------------------
91 | */
92 | /*"viewHeaders" => array(
93 | 'Content-Type' => 'text/plain'
94 | ),*/
95 |
96 | /*
97 | |--------------------------------------------------------------------------
98 | | Uncomment to add request headers when swagger performs requests
99 | |--------------------------------------------------------------------------
100 | */
101 | /*"requestHeaders" => array(
102 | 'TestMe' => 'testValue'
103 | ),*/
104 | );
105 |
--------------------------------------------------------------------------------
/src/views/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slampenny/Swaggervel/e026d72cacec8b2db8b2510179d73042f5e87bb9/src/views/.gitkeep
--------------------------------------------------------------------------------
/src/views/index.blade.php:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 | Swagger UI
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
130 |
131 |
132 |
133 |
143 |
144 |
145 |
OAuth2 settings
146 |
147 |
148 |
149 |
150 |
151 |
152 | Configure OAuth2 Client with id="" and redirect url=""
153 |
154 |
155 |
156 |
157 |
158 |
159 |
--------------------------------------------------------------------------------
/tests/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/slampenny/Swaggervel/e026d72cacec8b2db8b2510179d73042f5e87bb9/tests/.gitkeep
--------------------------------------------------------------------------------