diff --git a/demo/index.html b/demo/index.html
index c189d992..ccd41077 100644
--- a/demo/index.html
+++ b/demo/index.html
@@ -9,12 +9,12 @@
-
+
diff --git a/demo/swagger.yml b/demo/swagger.yml
deleted file mode 100644
index 7af5f3d8..00000000
--- a/demo/swagger.yml
+++ /dev/null
@@ -1,877 +0,0 @@
----
- swagger: "2.0"
- info:
- description: "This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters."
- version: "1.0.0"
- title: "Swagger Petstore"
- termsOfService: "http://swagger.io/terms/"
- contact:
- email: "apiteam@swagger.io"
- x-logo:
- url: "https://rebilly.github.io/ReDoc/petstore-logo.png"
- license:
- name: "Apache 2.0"
- url: "http://www.apache.org/licenses/LICENSE-2.0.html"
- host: "petstore.swagger.io"
- basePath: "/v2"
- tags:
- -
- name: "Pagination"
- x-traitTag: true
- description: |-
- Sometimes you just can't get enough. For this reason, we've provided a convenient way to access more data in
- any request for sequential data. Simply call the url in the next_url parameter and we'll respond with the next
- set of data.
-
- ```json
- {
- ...
- "pagination": {
- "next_url": "https://api.instagram.com/v1/tags/puppy/media/recent?access_token=fb2e77d.47a0479900504cb3ab4a1f626d174d2d&max_id=13872296",
- "next_max_id": "13872296"
- }
- }
- ```
-
- On views where pagination is present, we also support the `count` parameter.
- Simply set this to the number of items you'd like to receive. Note that the default values
- should be fine for most applications - but if you decide to increase this number there is a maximum value
- defined on each endpoint.
- externalDocs:
- description: "Find out more"
- url: "http://swagger.io"
- -
- name: "JSONP"
- x-traitTag: true
- description: |-
- If you're writing an AJAX application, and you'd like to wrap our response with a callback,
- all you have to do is specify a callback parameter with any API call:
-
- ```
- https://api.instagram.com/v1/tags/coffee/media/recent?access_token=fb2e77d.47a0479900504cb3ab4a1f626d174d2d&callback=callbackFunction
- ```
- Would respond with:
-
- ```js
- callbackFunction({
- ...
- });
- ```
-
- > Example of markdown blockquote
- externalDocs:
- description: "Find out more"
- url: "http://swagger.io"
- -
- name: "pet"
- description: "Everything about your Pets"
- externalDocs:
- description: "Find out more"
- url: "http://swagger.io"
- -
- name: "store"
- description: "Access to Petstore orders"
- -
- name: "user"
- description: "Operations about user"
- externalDocs:
- description: "Find out more about our store"
- url: "http://swagger.io"
- schemes:
- - "http"
- paths:
- /pet:
- post:
- tags:
- - "pet"
- summary: "Add a new pet to the store"
- description: ""
- operationId: "addPet"
- consumes:
- - "application/json"
- - "application/xml"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- in: "body"
- name: "body"
- description: "Pet object that needs to be added to the store"
- required: true
- schema:
- $ref: "#/definitions/Pet"
- responses:
- 405:
- description: "Invalid input"
- security:
- -
- petstore_auth:
- - "write:pets"
- - "read:pets"
- x-code-samples:
- -
- lang: PHP
- source: |-
- $form = new \PetStore\Entities\Pet();
- $form->setPetType("Dog");
- $form->setName("Rex");
- // set other fields
-
- try {
- $pet = $client->pets()->create($form);
- } catch (UnprocessableEntityException $e) {
- var_dump($e->getErrors());
- }
- -
- lang: C#
- source: |-
- PetStore.v1.Pet pet = new PetStore.v1.Pet();
- pet.setApiKey("your api key");
- pet.petType = PetStore.v1.Pet.TYPE_DOG;
- pet.name = "Rex";
- // set other fields
-
- PetStoreResponse response = pet.create();
- if (response.statusCode == HttpStatusCode.Created)
- {
- // Successfully created
- }
- else
- {
- // Something wrong -- check response for errors
- Console.WriteLine(response.getRawResponse());
- }
- put:
- tags:
- - "pet"
- summary: "Update an existing pet"
- description: ""
- operationId: "updatePet"
- consumes:
- - "application/json"
- - "application/xml"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- in: "body"
- name: "body"
- description: "Pet object that needs to be added to the store"
- required: true
- schema:
- $ref: "#/definitions/Pet"
- responses:
- 400:
- description: "Invalid ID supplied"
- 404:
- description: "Pet not found"
- 405:
- description: "Validation exception"
- x-code-samples:
- -
- lang: PHP
- source: |-
- $form = new \PetStore\Entities\Pet();
- $form->setPetId(1);
- $form->setPetType("Dog");
- $form->setName("Rex");
- // set other fields
-
- try {
- $pet = $client->pets()->update($form);
- } catch (UnprocessableEntityException $e) {
- var_dump($e->getErrors());
- }
- security:
- -
- petstore_auth:
- - "write:pets"
- - "read:pets"
- /pet/findByStatus:
- get:
- tags:
- - "pet"
- - "Pagination"
- - "JSONP"
- summary: "Finds Pets by status"
- description: "Multiple status values can be provided with comma seperated strings"
- operationId: "findPetsByStatus"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- name: "status"
- in: "query"
- description: "Status values that need to be considered for filter"
- required: true
- type: "array"
- items:
- type: "string"
- enum:
- - "available"
- - "pending"
- - "sold"
- default: "available"
- collectionFormat: "csv"
- responses:
- 200:
- description: "successful operation"
- schema:
- type: "array"
- items:
- $ref: "#/definitions/Pet"
- 400:
- description: "Invalid status value"
- security:
- -
- petstore_auth:
- - "write:pets"
- - "read:pets"
- /pet/findByTags:
- get:
- tags:
- - "pet"
- - "Pagination"
- - "JSONP"
- summary: "Finds Pets by tags"
- description: "Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing."
- operationId: "findPetsByTags"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- name: "tags"
- in: "query"
- description: "Tags to filter by"
- required: true
- type: "array"
- items:
- type: "string"
- collectionFormat: "csv"
- responses:
- 200:
- description: "successful operation"
- schema:
- type: "array"
- items:
- $ref: "#/definitions/Pet"
- 400:
- description: "Invalid tag value"
- security:
- -
- petstore_auth:
- - "write:pets"
- - "read:pets"
- /pet/{petId}:
- get:
- tags:
- - "pet"
- - "JSONP"
- summary: "Find pet by ID"
- description: "Returns a single pet"
- operationId: "getPetById"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- name: "petId"
- in: "path"
- description: "ID of pet to return"
- required: true
- type: "integer"
- format: "int64"
- responses:
- 200:
- description: "successful operation"
- schema:
- $ref: "#/definitions/Pet"
- 400:
- description: "Invalid ID supplied"
- 404:
- description: "Pet not found"
- security:
- -
- api_key: []
- post:
- tags:
- - "pet"
- summary: "Updates a pet in the store with form data"
- description: ""
- operationId: "updatePetWithForm"
- consumes:
- - "application/x-www-form-urlencoded"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- name: "petId"
- in: "path"
- description: "ID of pet that needs to be updated"
- required: true
- type: "integer"
- format: "int64"
- -
- name: "name"
- in: "formData"
- description: "Updated name of the pet"
- required: false
- type: "string"
- -
- name: "status"
- in: "formData"
- description: "Updated status of the pet"
- required: false
- type: "string"
- responses:
- 405:
- description: "Invalid input"
- security:
- -
- petstore_auth:
- - "write:pets"
- - "read:pets"
- delete:
- tags:
- - "pet"
- summary: "Deletes a pet"
- description: ""
- operationId: "deletePet"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- name: "api_key"
- in: "header"
- required: false
- type: "string"
- -
- name: "petId"
- in: "path"
- description: "Pet id to delete"
- required: true
- type: "integer"
- format: "int64"
- responses:
- 400:
- description: "Invalid pet value"
- security:
- -
- petstore_auth:
- - "write:pets"
- - "read:pets"
- /pet/{petId}/uploadImage:
- post:
- tags:
- - "pet"
- summary: "uploads an image"
- description: ""
- operationId: "uploadFile"
- consumes:
- - "multipart/form-data"
- produces:
- - "application/json"
- parameters:
- -
- name: "petId"
- in: "path"
- description: "ID of pet to update"
- required: true
- type: "integer"
- format: "int64"
- -
- name: "additionalMetadata"
- in: "formData"
- description: "Additional data to pass to server"
- required: false
- type: "string"
- -
- name: "file"
- in: "formData"
- description: "file to upload"
- required: false
- type: "file"
- responses:
- 200:
- description: "successful operation"
- schema:
- $ref: "#/definitions/ApiResponse"
- security:
- -
- petstore_auth:
- - "write:pets"
- - "read:pets"
- /store/inventory:
- get:
- tags:
- - "store"
- - "JSONP"
- summary: "Returns pet inventories by status"
- description: "Returns a map of status codes to quantities"
- operationId: "getInventory"
- produces:
- - "application/json"
- parameters: []
- responses:
- 200:
- description: "successful operation"
- schema:
- type: "object"
- additionalProperties:
- type: "integer"
- format: "int32"
- security:
- -
- api_key: []
- /store/order:
- post:
- tags:
- - "store"
- summary: "Place an order for a pet"
- description: ""
- operationId: "placeOrder"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- in: "body"
- name: "body"
- description: "order placed for purchasing the pet"
- required: true
- schema:
- $ref: "#/definitions/Order"
- responses:
- 200:
- description: "successful operation"
- schema:
- $ref: "#/definitions/Order"
- 400:
- description: "Invalid Order"
- /store/order/{orderId}:
- get:
- tags:
- - "store"
- - "JSONP"
- summary: "Find purchase order by ID"
- description: "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions"
- operationId: "getOrderById"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- name: "orderId"
- in: "path"
- description: "ID of pet that needs to be fetched"
- required: true
- type: "integer"
- maximum: 5
- minimum: 1
- format: "int64"
- responses:
- 200:
- description: "successful operation"
- schema:
- $ref: "#/definitions/Order"
- 400:
- description: "Invalid ID supplied"
- 404:
- description: "Order not found"
- delete:
- tags:
- - "store"
- summary: "Delete purchase order by ID"
- description: "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors"
- operationId: "deleteOrder"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- name: "orderId"
- in: "path"
- description: "ID of the order that needs to be deleted"
- required: true
- type: "string"
- minimum: 1
- responses:
- 400:
- description: "Invalid ID supplied"
- 404:
- description: "Order not found"
- /user:
- post:
- tags:
- - "user"
- summary: "Create user"
- description: "This can only be done by the logged in user."
- operationId: "createUser"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- in: "body"
- name: "body"
- description: "Created user object"
- required: true
- schema:
- $ref: "#/definitions/User"
- responses:
- default:
- description: "successful operation"
- /user/createWithArray:
- post:
- tags:
- - "user"
- summary: "Creates list of users with given input array"
- description: ""
- operationId: "createUsersWithArrayInput"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- in: "body"
- name: "body"
- description: "List of user object"
- required: true
- schema:
- type: "array"
- items:
- $ref: "#/definitions/User"
- responses:
- default:
- description: "successful operation"
- /user/createWithList:
- post:
- tags:
- - "user"
- summary: "Creates list of users with given input array"
- description: ""
- operationId: "createUsersWithListInput"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- in: "body"
- name: "body"
- description: "List of user object"
- required: true
- schema:
- type: "array"
- items:
- $ref: "#/definitions/User"
- responses:
- default:
- description: "successful operation"
- /user/login:
- get:
- tags:
- - "user"
- summary: "Logs user into the system"
- description: ""
- operationId: "loginUser"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- name: "username"
- in: "query"
- description: "The user name for login"
- required: true
- type: "string"
- -
- name: "password"
- in: "query"
- description: "The password for login in clear text"
- required: true
- type: "string"
- responses:
- 200:
- description: "successful operation"
- schema:
- type: "string"
- headers:
- X-Rate-Limit:
- type: "integer"
- format: "int32"
- description: "calls per hour allowed by the user"
- X-Expires-After:
- type: "string"
- format: "date-time"
- description: "date in UTC when toekn expires"
- 400:
- description: "Invalid username/password supplied"
- /user/logout:
- get:
- tags:
- - "user"
- summary: "Logs out current logged in user session"
- description: ""
- operationId: "logoutUser"
- produces:
- - "application/xml"
- - "application/json"
- parameters: []
- responses:
- default:
- description: "successful operation"
- /user/{username}:
- get:
- tags:
- - "user"
- - "JSONP"
- summary: "Get user by user name"
- description: ""
- operationId: "getUserByName"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- name: "username"
- in: "path"
- description: "The name that needs to be fetched. Use user1 for testing. "
- required: true
- type: "string"
- responses:
- 200:
- description: "successful operation"
- schema:
- $ref: "#/definitions/User"
- 400:
- description: "Invalid username supplied"
- 404:
- description: "User not found"
- put:
- tags:
- - "user"
- summary: "Updated user"
- description: "This can only be done by the logged in user."
- operationId: "updateUser"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- name: "username"
- in: "path"
- description: "name that need to be deleted"
- required: true
- type: "string"
- -
- in: "body"
- name: "body"
- description: "Updated user object"
- required: true
- schema:
- $ref: "#/definitions/User"
- responses:
- 400:
- description: "Invalid user supplied"
- 404:
- description: "User not found"
- delete:
- tags:
- - "user"
- summary: "Delete user"
- description: "This can only be done by the logged in user."
- operationId: "deleteUser"
- produces:
- - "application/xml"
- - "application/json"
- parameters:
- -
- name: "username"
- in: "path"
- description: "The name that needs to be deleted"
- required: true
- type: "string"
- responses:
- 400:
- description: "Invalid username supplied"
- 404:
- description: "User not found"
- securityDefinitions:
- petstore_auth:
- type: "oauth2"
- authorizationUrl: "http://petstore.swagger.io/api/oauth/dialog"
- flow: "implicit"
- scopes:
- write:pets: "modify pets in your account"
- read:pets: "read your pets"
- api_key:
- type: "apiKey"
- name: "api_key"
- in: "header"
- definitions:
- Order:
- type: "object"
- properties:
- id:
- type: "integer"
- format: "int64"
- petId:
- type: "integer"
- format: "int64"
- quantity:
- type: "integer"
- format: "int32"
- shipDate:
- type: "string"
- format: "date-time"
- status:
- type: "string"
- description: "Order Status"
- enum:
- - "placed"
- - "approved"
- - "delivered"
- complete:
- type: "boolean"
- default: false
- xml:
- name: "Order"
- User:
- type: "object"
- properties:
- id:
- type: "integer"
- format: "int64"
- username:
- type: "string"
- firstName:
- type: "string"
- lastName:
- type: "string"
- email:
- type: "string"
- password:
- type: "string"
- phone:
- type: "string"
- userStatus:
- type: "integer"
- format: "int32"
- description: "User Status"
- xml:
- name: "User"
- Category:
- type: "object"
- properties:
- id:
- type: "integer"
- format: "int64"
- name:
- type: "string"
- xml:
- name: "Category"
- Tag:
- type: "object"
- properties:
- id:
- type: "integer"
- format: "int64"
- name:
- type: "string"
- xml:
- name: "Tag"
- Pet:
- type: "object"
- required:
- - "name"
- - "photoUrls"
- - "petType"
- discriminator: "petType"
- properties:
- petType:
- type: "string"
- id:
- type: "integer"
- format: "int64"
- category:
- $ref: "#/definitions/Category"
- name:
- type: "string"
- example: "doggie"
- photoUrls:
- type: "array"
- xml:
- name: "photoUrl"
- wrapped: true
- items:
- type: "string"
- tags:
- type: "array"
- xml:
- name: "tag"
- wrapped: true
- items:
- $ref: "#/definitions/Tag"
- status:
- type: "string"
- description: "pet status in the store"
- enum:
- - "available"
- - "pending"
- - "sold"
- xml:
- name: "Pet"
- Cat:
- description: "A representation of a cat"
- allOf:
- -
- $ref: "#/definitions/Pet"
- -
- type: "object"
- properties:
- huntingSkill:
- type: "string"
- description: "The measured skill for hunting"
- default: "lazy"
- enum:
- - "clueless"
- - "lazy"
- - "adventurous"
- - "aggressive"
- required:
- - "huntingSkill"
- Dog:
- description: "A representation of a dog"
- allOf:
- -
- $ref: "#/definitions/Pet"
- -
- type: "object"
- properties:
- packSize:
- type: "integer"
- format: "int32"
- description: "the size of the pack the dog is from"
- default: 0
- minimum: 0
- required:
- - "packSize"
- ApiResponse:
- type: "object"
- properties:
- code:
- type: "integer"
- format: "int32"
- type:
- type: "string"
- message:
- type: "string"
- externalDocs:
- description: "Find out more about Swagger"
- url: "http://swagger.io"
diff --git a/lib/components/ApiInfo/api-info.html b/lib/components/ApiInfo/api-info.html
index 05765f17..8083a884 100644
--- a/lib/components/ApiInfo/api-info.html
+++ b/lib/components/ApiInfo/api-info.html
@@ -14,4 +14,8 @@
{{data.license.name}}
+
+ Download OpenAPI (fka Swagger) specification:
+ Download
+
diff --git a/lib/components/ApiInfo/api-info.js b/lib/components/ApiInfo/api-info.js
index d179dae9..8fd9391c 100644
--- a/lib/components/ApiInfo/api-info.js
+++ b/lib/components/ApiInfo/api-info.js
@@ -1,18 +1,22 @@
'use strict';
-import {RedocComponent, BaseComponent} from '../base';
+import {SchemaManager, RedocComponent, BaseComponent} from '../base';
+import OptionsManager from '../../options';
@RedocComponent({
selector: 'api-info',
styleUrls: ['./lib/components/ApiInfo/api-info.css'],
templateUrl: './lib/components/ApiInfo/api-info.html'
})
+@Reflect.metadata('parameters', [[SchemaManager], [OptionsManager]])
export default class ApiInfo extends BaseComponent {
- constructor(schemaMgr) {
+ constructor(schemaMgr, optionsMgr) {
super(schemaMgr);
+ this.optionsMgr = optionsMgr;
}
prepareModel() {
this.data = this.componentSchema.info;
+ this.specUrl = this.optionsMgr.options.specUrl;
}
}
diff --git a/lib/components/ApiInfo/api-info.scss b/lib/components/ApiInfo/api-info.scss
index b0853443..b7e81ba2 100644
--- a/lib/components/ApiInfo/api-info.scss
+++ b/lib/components/ApiInfo/api-info.scss
@@ -7,3 +7,11 @@
:host > div {
width: 60%;
}
+
+a.openapi-button {
+ padding: 3px 8px 4px 8px;
+ color: $primary-color;
+ border: 1px solid $primary-color;
+ margin-left: 0.5em;
+ font-weight: normal;
+}
diff --git a/lib/components/ApiInfo/api-info.spec.js b/lib/components/ApiInfo/api-info.spec.js
index 4b16d6f7..ae5e8b83 100644
--- a/lib/components/ApiInfo/api-info.spec.js
+++ b/lib/components/ApiInfo/api-info.spec.js
@@ -13,7 +13,9 @@ import {
import ApiInfo from 'lib/components/ApiInfo/api-info';
import SchemaManager from 'lib/utils/SchemaManager';
+import OptionsManager from 'lib/options';
+let optsMgr = new OptionsManager();
describe('Redoc components', () => {
describe('ApiInfo Component', () => {
@@ -21,7 +23,8 @@ describe('Redoc components', () => {
let component;
let fixture;
beforeEachProviders(() => [
- provide(SchemaManager, {useValue: new SchemaManager()})
+ provide(SchemaManager, {useValue: new SchemaManager()}),
+ provide(OptionsManager, {useValue: optsMgr})
]);
beforeEach(injectAsync([TestComponentBuilder, SchemaManager], (tcb, schemaMgr) => {
builder = tcb;
diff --git a/lib/components/Redoc/redoc.js b/lib/components/Redoc/redoc.js
index 4faa1353..e1bceb4b 100644
--- a/lib/components/Redoc/redoc.js
+++ b/lib/components/Redoc/redoc.js
@@ -57,9 +57,10 @@ export default class Redoc extends BaseComponent {
}, 400);
}
- static init(schemaUrl, options) {
+ static init(specUrl, options) {
var optionsMgr = new OptionsManager();
optionsMgr.options = options;
+ optionsMgr.options.specUrl = optionsMgr.options.specUrl || specUrl;
var providers = [
provide(OptionsManager, {useValue: optionsMgr})
];
@@ -68,7 +69,7 @@ export default class Redoc extends BaseComponent {
Redoc.dispose();
}
Redoc.showLoadingAnimation();
- return SchemaManager.instance().load(schemaUrl)
+ return SchemaManager.instance().load(specUrl)
.then(() => {
if (!_modeLocked && !optionsMgr.options.debugMode) {
enableProdMode();
diff --git a/lib/options.js b/lib/options.js
index 689310a5..d708b86c 100644
--- a/lib/options.js
+++ b/lib/options.js
@@ -10,7 +10,7 @@ var defaults = {
debugMode: global.redocDebugMode
};
-var OPTION_NAMES = new Set(['scrollYOffset', 'disableLazySchemas']);
+var OPTION_NAMES = new Set(['scrollYOffset', 'disableLazySchemas', 'specUrl']);
@Reflect.metadata('parameters', [[BrowserDomAdapter]])
export default class OptionsManager {
diff --git a/package.json b/package.json
index 61645824..bb5939d4 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "redoc",
"description": "Swagger-generated API Reference Documentation",
- "version": "0.7.9",
+ "version": "0.7.10",
"repository": {
"type": "git",
"url": "git://github.com/Rebilly/ReDoc"
diff --git a/tests/e2e/index.html b/tests/e2e/index.html
index 599429c5..2b360322 100644
--- a/tests/e2e/index.html
+++ b/tests/e2e/index.html
@@ -14,7 +14,7 @@