@looker/sdk-codegen 21.5.0 → 21.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/lib/codeGenerators.js.map +1 -1
- package/lib/declarationInfo.d.ts +2 -2
- package/lib/declarationInfo.js +3 -2
- package/lib/declarationInfo.js.map +1 -1
- package/lib/esm/codeGenerators.js.map +1 -1
- package/lib/esm/declarationInfo.js +3 -2
- package/lib/esm/declarationInfo.js.map +1 -1
- package/lib/esm/exampleInfo.js +1 -0
- package/lib/esm/exampleInfo.js.map +1 -1
- package/lib/esm/sdkModels.js +10 -16
- package/lib/esm/sdkModels.js.map +1 -1
- package/lib/esm/specConverter.js +1 -1
- package/lib/esm/specConverter.js.map +1 -1
- package/lib/exampleInfo.d.ts +3 -1
- package/lib/exampleInfo.js +5 -1
- package/lib/exampleInfo.js.map +1 -1
- package/lib/sdkModels.d.ts +4 -4
- package/lib/sdkModels.js +10 -16
- package/lib/sdkModels.js.map +1 -1
- package/lib/specConverter.js +1 -1
- package/lib/specConverter.js.map +1 -1
- package/lib/testUtils/testUtils.js.map +1 -1
- package/package.json +3 -3
package/lib/esm/specConverter.js
CHANGED
|
@@ -17,7 +17,7 @@ var warn = warning => {
|
|
|
17
17
|
|
|
18
18
|
var appJson = 'application/json';
|
|
19
19
|
export var include31 = ver => {
|
|
20
|
-
return ver.status && ver.version && ver.swagger_url && ver.status !== 'internal_test' && ver.status !== 'deprecated' && ver.status !== 'legacy' || (ver.version || '')
|
|
20
|
+
return ver.status && ver.version && ver.swagger_url && ver.status !== 'internal_test' && ver.status !== 'deprecated' && ver.status !== 'legacy' || /\b3.1\b/.test(ver.version || '');
|
|
21
21
|
};
|
|
22
22
|
export var getSpecsFromVersions = function () {
|
|
23
23
|
var _ref = _asyncToGenerator(function* (versions) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/specConverter.ts"],"names":["isEmpty","ApiModel","warn","warning","Error","appJson","include31","ver","status","version","swagger_url","getSpecsFromVersions","versions","fetcher","undefined","include","items","uniqueId","v","specKey","max","length","frag","substr","supported_versions","spec","key","isDefault","specURL","api","defaultMimeFormats","produces","consumes","swapXLookerTags","swaps","pattern","replacement","forEach","swap","replace","openApiStyle","collectionFormat","styles","csv","pipes","ssv","findOpenApiParam","endpoint","verb","name","result","paths","parameters","find","p","fixConversionObjects","swagger","fixes","Object","entries","op","httpMethod","method","operation","params","param","in","required","fix","operationId","requestBody","push","format","style","newParam","JSON","stringify","isSwagger","isOpenApi","openapi","fixConversion","openApiSpec","swaggerSpec","parse","swapRef","ref","structName","parts","split","convertParam","schema","type","explode","convertResponses","responses","formats","code","response","description","content","convertOp","moveKeys","moveKey","value","body","values","xdep","deprecated","convertPathsAndBodies","requestBodies","path","entry","ep","convertDefs","defs","_","struct","properties","prop","$ref","upgradeSpecObject","cleanup","schemas","definitions","info","tags","servers","url","schemes","host","basePath","components","upgradeSpec","getLookerSpecs","sdk","serverUrl","versionUrl","ok","get","getSpecLinks","prefix","looker_release_version","deriveSpec","current_version","specs","filter","map","loadSpecs","links","json","fromJson"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport isEmpty from 'lodash/isEmpty'\nimport type { APIMethods } from '@looker/sdk-rtl'\nimport type { ArgValues, IApiModel, KeyedCollection } from './sdkModels'\nimport { ApiModel } from './sdkModels'\n\nconst warn = (warning: string) => {\n throw new Error(warning)\n}\n\nconst appJson = 'application/json'\n\n/** This declaration is duplicated DIRECTLY from @looker/sdk API 4.0 models to detach dependency */\nexport interface IApiVersion {\n /**\n * Current Looker release version number (read-only)\n */\n looker_release_version?: string\n current_version?: IApiVersionElement\n /**\n * Array of versions supported by this Looker instance (read-only)\n */\n supported_versions?: IApiVersionElement[]\n /**\n * API server base url (read-only)\n */\n api_server_url?: string\n /**\n * Web server base url (read-only)\n */\n web_server_url?: string\n}\n\n/** This declaration is duplicated DIRECTLY from @looker/sdk API 4.0 models to detach dependency */\nexport interface IApiVersionElement {\n /**\n * Version number as it appears in '/api/xxx/' urls (read-only)\n */\n version?: string | null\n /**\n * Full version number including minor version (read-only)\n */\n full_version?: string | null\n /**\n * Status of this version (read-only)\n */\n status?: string | null\n /**\n * Url for swagger.json for this version (read-only)\n */\n swagger_url?: string | null\n}\n\n/**\n * Describes the mime types supported by an operation\n */\nexport interface MimeFormats {\n /**\n * Output types produced by an operation\n */\n produces: string[]\n /**\n * Input types accepted by an operation\n */\n consumes: string[]\n}\n\n/** codegen specification item */\nexport interface SpecItem {\n /** Key for specification in collection. Duplicated for atomic passing */\n key: string\n /** API version status */\n status: string // 'current' | 'deprecated' | 'experimental' | 'stable'\n /** API version of spec */\n version: string\n /** true if this is the default spec */\n isDefault: boolean\n /** Compiled version of spec */\n api?: ApiModel\n /** URL for retrieving spec */\n specURL?: string\n /** string content of spec */\n specContent?: string\n}\n\n/** Keyed collection of specification items */\nexport type SpecList = KeyedCollection<SpecItem>\n\n/**\n * Looker specification version item from versions payload\n */\nexport interface ISpecItem {\n /** Abbreviated version of the API */\n version: string\n /** Semantic version of the API */\n full_version: string\n /** Usually legacy, stable, experimental, current */\n status: string\n /** Link to the swagger specification */\n swagger_url: string\n}\n\n/**\n * Callback for fetching and compiling specification to ApiModel\n */\nexport type SpecFetcher = (spec: SpecItem) => Promise<ApiModel | undefined>\nexport type IncludeVersion = (version: IApiVersionElement) => boolean\n\n/**\n * Should this specification version be included?\n * @param ver to check\n */\nexport const include31 = (ver: IApiVersionElement) => {\n return (\n (ver.status &&\n ver.version &&\n ver.swagger_url &&\n ver.status !== 'internal_test' &&\n ver.status !== 'deprecated' &&\n ver.status !== 'legacy') ||\n (ver.version || '') >= '3.1' // unfortunately, need to hard-code this for API Explorer's spec selector\n )\n}\n\n/**\n * Return all public API specifications from an ApiVersion payload\n * @param versions payload from a Looker server\n * @param fetcher fetches and compiles spec to ApiModel\n * @param include test for specification version inclusion\n */\nexport const getSpecsFromVersions = async (\n versions: IApiVersion,\n fetcher: SpecFetcher | undefined = undefined,\n include: IncludeVersion = include31\n): Promise<SpecList> => {\n const items = {}\n\n /**\n * Create a unique spec key for this version\n * @param v version to identify\n */\n const uniqueId = (v: IApiVersionElement) => {\n let specKey = v.version || 'api'\n const max = v.status?.length || 0\n let frag = 1\n while (items[specKey]) {\n if (frag <= max) {\n // More than one spec for this version\n specKey = `${v.version}${v.status?.substr(0, frag)}`\n } else {\n specKey = `${v.version}${v.status}${frag}`\n }\n frag++\n }\n return specKey\n }\n\n if (versions.supported_versions) {\n for (const v of versions.supported_versions) {\n // Tell TypeScript these are all defined because IApiVersion definition is lax\n if (v.status && v.version && v.swagger_url) {\n if (include(v)) {\n const spec: SpecItem = {\n key: uniqueId(v),\n status: v.status,\n version: v.version,\n isDefault: v.status === 'current',\n specURL: v.swagger_url,\n }\n if (fetcher) {\n spec.api = await fetcher(spec)\n }\n items[spec.key] = spec\n }\n }\n }\n }\n return items\n}\n\n/**\n * Payload returned by the Looker /versions endpoint\n */\nexport interface ILookerVersions {\n /** This Looker version */\n looker_release_version: string\n /** The current/default API version */\n current_version: ISpecItem\n /** All API versions */\n supported_versions: ISpecItem[]\n /** API server url */\n api_server_url: string\n /** Web server url */\n web_server_url: string\n}\n\n// TODO this work was duplicated in API Explorer. Need to merge and use one version.\n\n/**\n * Api Specification with on-demand determination of values\n */\nexport interface IApiSpecLink {\n /** Name of the specification */\n name: string\n /** API version */\n version: string\n /** API version status */\n status: string\n /** Location of the specification */\n url: string\n /** Parsed content. Will be loaded on demand but is assigned to an empty object by default. */\n api: IApiModel\n}\n\n// TODO this work was duplicated in API Explorer. Need to merge and use one version.\nexport type SpecLinks = IApiSpecLink[]\n\n/**\n * Defaults the mime formats for producing and consuming\n */\nexport const defaultMimeFormats: MimeFormats = {\n produces: [appJson],\n consumes: [appJson],\n}\n/**\n * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#style-values\n */\ntype OpenApiParameterStyle =\n | 'matrix'\n | 'label'\n | 'form'\n | 'simple'\n | 'spaceDelimited'\n | 'pipeDelimited'\n | 'deepObject'\n | undefined\n\n/**\n * Replaces x-looker-nullable with nullable for parameters and properties in a string\n * @param {string} spec\n * @returns {Promise<string>} name of the file written\n */\nexport const swapXLookerTags = (spec: string) => {\n const swaps = [\n { pattern: /x-looker-nullable/gi, replacement: 'nullable' },\n { pattern: /x-looker-values/gi, replacement: 'enum' },\n { pattern: /x-looker-deprecated/gi, replacement: 'deprecated' },\n ]\n swaps.forEach((swap) => {\n spec = spec.replace(swap.pattern, swap.replacement)\n })\n return spec\n}\n\n/**\n * Convert OpenAPI 2 collectionFormat to OpenApi 3 style\n *\n * See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md#style-values for\n * conversion guidelines\n *\n * @param collectionFormat string\n * @returns the converted style, or undefined\n */\nexport const openApiStyle = (\n collectionFormat: string\n): OpenApiParameterStyle => {\n if (!collectionFormat) return undefined\n const styles: { [key: string]: OpenApiParameterStyle } = {\n csv: 'simple',\n pipes: 'pipeDelimited',\n ssv: 'spaceDelimited',\n }\n if (collectionFormat in styles) {\n return styles[collectionFormat]\n }\n return undefined\n}\n\n/**\n * Utility function to find the named parameter for an OpenAPI endpoint\n * @param api JSON structure of OpenAPI spec\n * @param endpoint url pattern for endpoint\n * @param verb HTTP method to locate\n * @param name name of parameter to find\n * @returns the matched parameter, or undefined\n */\nconst findOpenApiParam = (\n api: any,\n endpoint: string,\n verb: string,\n name: string\n) => {\n const result = api.paths[endpoint][verb].parameters.find(\n (p: { name: string }) => p.name === name\n )\n if (!result) {\n warn(`Missing parameter: ${endpoint} ${verb} parameter ${name}`)\n }\n return result\n}\n\n/**\n * Results of the spec conversion\n */\nexport interface IConversionResults {\n /**\n * JSON.stringify of the spec\n */\n spec: string\n /**\n * List of fixes to the spec\n */\n fixes: string[]\n}\n\nexport const fixConversionObjects = (api: any, swagger: any) => {\n const paths = swagger.paths\n const fixes: string[] = []\n Object.entries(paths).forEach(([endpoint, op]) => {\n Object.entries(op as any).forEach(([httpMethod, method]) => {\n const operation = method as any\n const params = operation.parameters\n if (params) {\n Object.entries(params).forEach(([, p]) => {\n const param = p as any\n if (param.name === 'body' && param.in === 'body') {\n // Set `required` in requestBody\n if ('required' in param) {\n // explicitly setting required value\n const required = param.required\n const fix = `${endpoint}::${operation.operationId} setting requestBody.required to ${required}`\n const requestBody = api.paths[endpoint][httpMethod].requestBody\n if (!requestBody) {\n warn(\n `Failed to find \"requestBody\" in OAS for swagger \"body param\" fix: ${fix}`\n )\n } else {\n if (requestBody.required !== required) {\n fixes.push(fix)\n }\n requestBody.required = required\n }\n }\n }\n\n if (param.collectionFormat) {\n // Set style from collectionFormat if it's not set\n const format = param.collectionFormat\n const style = openApiStyle(format)\n if (style === undefined) {\n warn(\n `OAS style conversion failed: collectionFormat '${param.collectionFormat}' is unknown`\n )\n } else {\n const fix = `${endpoint}::${operation.operationId} ${param.name} '${format}' -> '${style}'`\n const newParam = findOpenApiParam(\n api,\n endpoint,\n httpMethod,\n param.name\n )\n if (newParam && newParam.style !== style) {\n newParam.style = style\n fixes.push(fix)\n }\n }\n }\n })\n }\n })\n })\n\n return { fixes, spec: JSON.stringify(api) }\n}\n\n/**\n * Returns true if this spec is a swagger specification\n * @param spec to check\n */\nexport const isSwagger = (spec: any) => spec.swagger !== undefined\n\n/**\n * Returns true spec is an OpenAPI specification\n * @param spec to check\n */\nexport const isOpenApi = (spec: any) => spec.openapi !== undefined\n\n/**\n * This is a post-fix operation for the OpenAPI converter which currently misses this type of conversion\n *\n * - Converts missing swagger collectionFormat values to OpenAPI styles\n * - Flags OAS.requestBody as required or optional\n *\n * @param openApiSpec converted OpenAPI spec\n * @param swaggerSpec original swagger spec that may contain missed conversions\n * @returns modified openApiSpec and fix log in IConversionResults\n */\nexport const fixConversion = (\n openApiSpec: string,\n swaggerSpec: string\n): IConversionResults => {\n return fixConversionObjects(JSON.parse(openApiSpec), JSON.parse(swaggerSpec))\n}\n\n/**\n * Convert a swagger structure ref to an OpenAPI structure ref\n *\n * TODO update this to the typescript that understands replaceAll\n * @param ref string reference to convert\n */\nexport const swapRef = (ref: string) =>\n ref.replace(/#\\/definitions\\//g, '#/components/schemas/')\n\n/**\n * Get the name of the structure from the reference string\n * @param ref to partse\n */\nexport const structName = (ref: string) => {\n if (!ref) return undefined\n const parts = ref.split('/')\n return parts[parts.length - 1]\n}\n\n/**\n * Moves type, format, items to schema\n * Converts collectionFormat to style\n * @param param to convert\n */\nexport const convertParam = (param: any) => {\n const schema: any = { type: param.type }\n const result = { ...param }\n delete result.type\n if (param.format) {\n schema.format = param.format\n delete result.format\n }\n if (param.collectionFormat) {\n result.style = openApiStyle(param.collectionFormat)\n delete result.collectionFormat\n }\n if (param.items) {\n schema.items = param.items\n result.explode = false\n delete result.items\n }\n result.schema = schema\n return result\n}\n\n/**\n * Convert responses for the right response formats\n * @param responses response to convert\n * @param formats mime formats\n */\nexport const convertResponses = (\n responses: ArgValues,\n formats = defaultMimeFormats\n) => {\n Object.entries(responses).forEach(([code, response]) => {\n responses[code] = {\n description: response.description,\n }\n if (response.schema) {\n const content = {}\n formats.produces.forEach(\n (format) => (content[format] = { schema: response.schema })\n )\n responses[code].content = content\n }\n })\n return responses\n}\n\n/**\n * Convert an operation\n * Assign schemas in params, create request bodies, update $refs\n * @param op operation to convert\n * @param formats mime format consumer and producer\n * @param moveKeys true to move keys for reference OAS comparison\n */\nexport const convertOp = (\n op: ArgValues,\n formats = defaultMimeFormats,\n moveKeys = false\n) => {\n // If keys need to be shuffled for file comparison reasons, uncomment this function\n const moveKey = (key: string, value?: any) => {\n if (!moveKeys || !(key in op)) return value\n if (!value) value = op[key]\n if (value) {\n delete op[key]\n op[key] = value\n }\n return value\n }\n\n let { produces, consumes } = formats\n const body = {}\n if (op.produces) {\n produces = op.produces\n delete op.produces\n }\n if (op.consumes) {\n consumes = op.consumes\n delete op.consumes\n }\n if (op.parameters) {\n // Copy parameters before rebuilding\n const params = { ...op.parameters }\n op.parameters = []\n Object.values(params).forEach((p: any) => {\n if (p.in === 'body') {\n // const struct = structName(p.schema?.$ref)\n op.requestBody = {}\n // if (struct) {\n // op.requestBody.$ref = `#/components/requestBodies/${struct}`\n // }\n if (p.schema) {\n op.requestBody.content = { [consumes[0]]: { schema: p.schema } }\n }\n op.requestBody.description = p.description\n if ('required' in p) op.requestBody.required = p.required\n // if (struct) {\n // body[struct] = { ...op.requestBody }\n // body[struct].$ref = `#/components/schema/${struct}`\n // }\n } else {\n op.parameters.push(convertParam(p))\n }\n })\n if (op.parameters.length === 0) delete op.parameters\n }\n moveKey('responses', convertResponses(op.responses, { produces, consumes }))\n moveKey('deprecated')\n const xdep = 'x-looker-deprecated'\n if (xdep in op) {\n op.deprecated = op[xdep]\n delete op[xdep]\n }\n moveKey('x-looker-status')\n moveKey('x-looker-activity-type')\n moveKey('x-looker-rate-limited')\n return { op, body }\n}\n\n/**\n * Assign schemas and request bodies\n * @param paths to process\n * @param formats mime response types\n */\nexport const convertPathsAndBodies = (\n paths: ArgValues,\n formats = defaultMimeFormats\n) => {\n const result = { paths: {}, requestBodies: {} }\n Object.entries(paths).forEach(([path, entry]) => {\n result.paths[path] = {}\n // Hack to accommodate linting limitations\n const endpoint: ArgValues = entry\n Object.entries(endpoint).forEach(([verb, op]) => {\n const ep = convertOp(op, formats)\n result.paths[path][verb] = ep.op\n Object.entries(ep.body as ArgValues).forEach(([name, body]) => {\n result.requestBodies[name] = body\n })\n })\n })\n return result\n}\n\n/**\n * Convert structure definitions\n * @param defs to convert\n */\nexport const convertDefs = (defs: ArgValues): ArgValues => {\n Object.entries(defs).forEach(([_, struct]) => {\n Object.entries(struct.properties as ArgValues).forEach(([name, prop]) => {\n if (prop.$ref) {\n // Evidently OAS only wants the ref for the property type\n struct.properties[name] = { $ref: prop.$ref }\n }\n })\n })\n return defs\n}\n\n/**\n * On-demand conversion of swagger to openAPI specification\n * @param spec to possibly convert\n * @returns OpenAPI version of the specification or throws error if not Swagger or OpenAPI\n */\nexport const upgradeSpecObject = (spec: any) => {\n if (isOpenApi(spec)) {\n return JSON.parse(swapXLookerTags(JSON.stringify(spec)))\n }\n if (!isSwagger(spec)) {\n throw new Error('Input is not a Swagger or OpenAPI specification')\n }\n const cleanup = swapRef(swapXLookerTags(JSON.stringify(spec)))\n spec = JSON.parse(cleanup)\n const consumes = spec.consumes || [appJson]\n const produces = spec.produces || [appJson]\n const formats = { produces, consumes }\n const { paths, requestBodies } = convertPathsAndBodies(spec.paths, formats)\n // TODO create a requestBodies entry for every struct used > 1x?\n // TODO reassign op.requestBody for all requestBodies entries?\n const schemas = convertDefs(spec.definitions)\n const api = {\n openapi: '3.0.0',\n info: spec.info,\n tags: spec.tags,\n paths,\n servers: [{ url: `${spec.schemes[0]}://${spec.host}${spec.basePath}` }],\n components: {\n requestBodies,\n schemas: schemas,\n },\n }\n // const result = fixConversionObjects(api, spec)\n return api\n}\n\n/**\n * Upgrade a spec to OpenAPI if it's not already an OpenAPI spec\n * @param spec to upgrade\n */\nexport const upgradeSpec = (spec: string | Record<string, unknown>) => {\n if (typeof spec === 'string') spec = JSON.parse(spec)\n return JSON.stringify(upgradeSpecObject(spec))\n}\n\n/**\n * Fetches specs via /versions payload from the API server url\n * @param sdk APIMethods implementation that supports authenticating a request\n * @param serverUrl base url of the /versions server. Typically something like https://my.looker.com:19999 or https://my.looker.com\n */\nexport const getLookerSpecs = async (sdk: APIMethods, serverUrl: string) => {\n const versionUrl = `${serverUrl}/versions`\n const versions = await sdk.ok(sdk.get<ILookerVersions, Error>(versionUrl))\n return versions\n}\n\n// TODO this work was duplicated in API Explorer. Need to merge and use one version.\n/**\n * Convert a Looker versions payload into API specification links\n * @param versions\n * @param include lambda that returns true to include a spec item in the list\n */\nexport const getSpecLinks = (\n versions: ILookerVersions,\n include = (spec: ISpecItem) => spec.version > '2.99'\n) => {\n const prefix = `Release ${versions.looker_release_version} API `\n const deriveSpec = (spec: ISpecItem): IApiSpecLink => {\n const status =\n spec.swagger_url === versions.current_version.swagger_url\n ? 'current'\n : spec.status\n return {\n name: `${prefix}${spec.version}`,\n version: spec.version,\n status,\n url: spec.swagger_url,\n api: {} as IApiModel,\n }\n }\n const specs = versions.supported_versions\n .filter((v) => include(v))\n .map((v) => deriveSpec(v))\n return specs\n}\n\n/**\n * Fetch and parse API specifications from the established links\n * @param sdk APIMethods implementation that supports authenticating a request\n * @param links list of specifications to load\n */\nexport const loadSpecs = async (sdk: APIMethods, links: SpecLinks) => {\n for (const spec of links) {\n if (isEmpty(spec.api)) {\n // Not parsed yet\n const content = await sdk.ok<string, Error>(sdk.get(spec.url))\n const json = typeof content === 'string' ? JSON.parse(content) : content\n spec.api = ApiModel.fromJson(upgradeSpecObject(json))\n }\n }\n return links\n}\n"],"file":"specConverter.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/specConverter.ts"],"names":["isEmpty","ApiModel","warn","warning","Error","appJson","include31","ver","status","version","swagger_url","test","getSpecsFromVersions","versions","fetcher","undefined","include","items","uniqueId","v","specKey","max","length","frag","substr","supported_versions","spec","key","isDefault","specURL","api","defaultMimeFormats","produces","consumes","swapXLookerTags","swaps","pattern","replacement","forEach","swap","replace","openApiStyle","collectionFormat","styles","csv","pipes","ssv","findOpenApiParam","endpoint","verb","name","result","paths","parameters","find","p","fixConversionObjects","swagger","fixes","Object","entries","op","httpMethod","method","operation","params","param","in","required","fix","operationId","requestBody","push","format","style","newParam","JSON","stringify","isSwagger","isOpenApi","openapi","fixConversion","openApiSpec","swaggerSpec","parse","swapRef","ref","structName","parts","split","convertParam","schema","type","explode","convertResponses","responses","formats","code","response","description","content","convertOp","moveKeys","moveKey","value","body","values","xdep","deprecated","convertPathsAndBodies","requestBodies","path","entry","ep","convertDefs","defs","_","struct","properties","prop","$ref","upgradeSpecObject","cleanup","schemas","definitions","info","tags","servers","url","schemes","host","basePath","components","upgradeSpec","getLookerSpecs","sdk","serverUrl","versionUrl","ok","get","getSpecLinks","prefix","looker_release_version","deriveSpec","current_version","specs","filter","map","loadSpecs","links","json","fromJson"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport isEmpty from 'lodash/isEmpty'\nimport type { APIMethods } from '@looker/sdk-rtl'\nimport type { ArgValues, IApiModel, KeyedCollection } from './sdkModels'\nimport { ApiModel } from './sdkModels'\n\nconst warn = (warning: string) => {\n throw new Error(warning)\n}\n\nconst appJson = 'application/json'\n\n/** This declaration is duplicated DIRECTLY from @looker/sdk API 4.0 models to detach dependency */\nexport interface IApiVersion {\n /**\n * Current Looker release version number (read-only)\n */\n looker_release_version?: string\n current_version?: IApiVersionElement\n /**\n * Array of versions supported by this Looker instance (read-only)\n */\n supported_versions?: IApiVersionElement[]\n /**\n * API server base url (read-only)\n */\n api_server_url?: string\n /**\n * Web server base url (read-only)\n */\n web_server_url?: string\n}\n\n/** This declaration is duplicated DIRECTLY from @looker/sdk API 4.0 models to detach dependency */\nexport interface IApiVersionElement {\n /**\n * Version number as it appears in '/api/xxx/' urls (read-only)\n */\n version?: string | null\n /**\n * Full version number including minor version (read-only)\n */\n full_version?: string | null\n /**\n * Status of this version (read-only)\n */\n status?: string | null\n /**\n * Url for swagger.json for this version (read-only)\n */\n swagger_url?: string | null\n}\n\n/**\n * Describes the mime types supported by an operation\n */\nexport interface MimeFormats {\n /**\n * Output types produced by an operation\n */\n produces: string[]\n /**\n * Input types accepted by an operation\n */\n consumes: string[]\n}\n\n/** codegen specification item */\nexport interface SpecItem {\n /** Key for specification in collection. Duplicated for atomic passing */\n key: string\n /** API version status */\n status: string // 'current' | 'deprecated' | 'experimental' | 'stable'\n /** API version of spec */\n version: string\n /** true if this is the default spec */\n isDefault: boolean\n /** Compiled version of spec */\n api?: ApiModel\n /** URL for retrieving spec */\n specURL?: string\n /** string content of spec */\n specContent?: string\n}\n\n/** Keyed collection of specification items */\nexport type SpecList = KeyedCollection<SpecItem>\n\n/**\n * Looker specification version item from versions payload\n */\nexport interface ISpecItem {\n /** Abbreviated version of the API */\n version: string\n /** Semantic version of the API */\n full_version: string\n /** Usually legacy, stable, experimental, current */\n status: string\n /** Link to the swagger specification */\n swagger_url: string\n}\n\n/**\n * Callback for fetching and compiling specification to ApiModel\n */\nexport type SpecFetcher = (spec: SpecItem) => Promise<ApiModel | undefined>\nexport type IncludeVersion = (version: IApiVersionElement) => boolean\n\n/**\n * Should this specification version be included?\n * @param ver to check\n */\nexport const include31 = (ver: IApiVersionElement) => {\n return (\n (ver.status &&\n ver.version &&\n ver.swagger_url &&\n ver.status !== 'internal_test' &&\n ver.status !== 'deprecated' &&\n ver.status !== 'legacy') ||\n /\\b3.1\\b/.test(ver.version || '') // unfortunately, need to hard-code this for API Explorer's spec selector\n )\n}\n\n/**\n * Return all public API specifications from an ApiVersion payload\n * @param versions payload from a Looker server\n * @param fetcher fetches and compiles spec to ApiModel\n * @param include test for specification version inclusion\n */\nexport const getSpecsFromVersions = async (\n versions: IApiVersion,\n fetcher: SpecFetcher | undefined = undefined,\n include: IncludeVersion = include31\n): Promise<SpecList> => {\n const items = {}\n\n /**\n * Create a unique spec key for this version\n * @param v version to identify\n */\n const uniqueId = (v: IApiVersionElement) => {\n let specKey = v.version || 'api'\n const max = v.status?.length || 0\n let frag = 1\n while (items[specKey]) {\n if (frag <= max) {\n // More than one spec for this version\n specKey = `${v.version}${v.status?.substr(0, frag)}`\n } else {\n specKey = `${v.version}${v.status}${frag}`\n }\n frag++\n }\n return specKey\n }\n\n if (versions.supported_versions) {\n for (const v of versions.supported_versions) {\n // Tell TypeScript these are all defined because IApiVersion definition is lax\n if (v.status && v.version && v.swagger_url) {\n if (include(v)) {\n const spec: SpecItem = {\n key: uniqueId(v),\n status: v.status,\n version: v.version,\n isDefault: v.status === 'current',\n specURL: v.swagger_url,\n }\n if (fetcher) {\n spec.api = await fetcher(spec)\n }\n items[spec.key] = spec\n }\n }\n }\n }\n return items\n}\n\n/**\n * Payload returned by the Looker /versions endpoint\n */\nexport interface ILookerVersions {\n /** This Looker version */\n looker_release_version: string\n /** The current/default API version */\n current_version: ISpecItem\n /** All API versions */\n supported_versions: ISpecItem[]\n /** API server url */\n api_server_url: string\n /** Web server url */\n web_server_url: string\n}\n\n// TODO this work was duplicated in API Explorer. Need to merge and use one version.\n\n/**\n * Api Specification with on-demand determination of values\n */\nexport interface IApiSpecLink {\n /** Name of the specification */\n name: string\n /** API version */\n version: string\n /** API version status */\n status: string\n /** Location of the specification */\n url: string\n /** Parsed content. Will be loaded on demand but is assigned to an empty object by default. */\n api: IApiModel\n}\n\n// TODO this work was duplicated in API Explorer. Need to merge and use one version.\nexport type SpecLinks = IApiSpecLink[]\n\n/**\n * Defaults the mime formats for producing and consuming\n */\nexport const defaultMimeFormats: MimeFormats = {\n produces: [appJson],\n consumes: [appJson],\n}\n/**\n * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#style-values\n */\ntype OpenApiParameterStyle =\n | 'matrix'\n | 'label'\n | 'form'\n | 'simple'\n | 'spaceDelimited'\n | 'pipeDelimited'\n | 'deepObject'\n | undefined\n\n/**\n * Replaces x-looker-nullable with nullable for parameters and properties in a string\n * @param {string} spec\n * @returns {Promise<string>} name of the file written\n */\nexport const swapXLookerTags = (spec: string) => {\n const swaps = [\n { pattern: /x-looker-nullable/gi, replacement: 'nullable' },\n { pattern: /x-looker-values/gi, replacement: 'enum' },\n { pattern: /x-looker-deprecated/gi, replacement: 'deprecated' },\n ]\n swaps.forEach((swap) => {\n spec = spec.replace(swap.pattern, swap.replacement)\n })\n return spec\n}\n\n/**\n * Convert OpenAPI 2 collectionFormat to OpenApi 3 style\n *\n * See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md#style-values for\n * conversion guidelines\n *\n * @param collectionFormat string\n * @returns the converted style, or undefined\n */\nexport const openApiStyle = (\n collectionFormat: string\n): OpenApiParameterStyle => {\n if (!collectionFormat) return undefined\n const styles: { [key: string]: OpenApiParameterStyle } = {\n csv: 'simple',\n pipes: 'pipeDelimited',\n ssv: 'spaceDelimited',\n }\n if (collectionFormat in styles) {\n return styles[collectionFormat]\n }\n return undefined\n}\n\n/**\n * Utility function to find the named parameter for an OpenAPI endpoint\n * @param api JSON structure of OpenAPI spec\n * @param endpoint url pattern for endpoint\n * @param verb HTTP method to locate\n * @param name name of parameter to find\n * @returns the matched parameter, or undefined\n */\nconst findOpenApiParam = (\n api: any,\n endpoint: string,\n verb: string,\n name: string\n) => {\n const result = api.paths[endpoint][verb].parameters.find(\n (p: { name: string }) => p.name === name\n )\n if (!result) {\n warn(`Missing parameter: ${endpoint} ${verb} parameter ${name}`)\n }\n return result\n}\n\n/**\n * Results of the spec conversion\n */\nexport interface IConversionResults {\n /**\n * JSON.stringify of the spec\n */\n spec: string\n /**\n * List of fixes to the spec\n */\n fixes: string[]\n}\n\nexport const fixConversionObjects = (api: any, swagger: any) => {\n const paths = swagger.paths\n const fixes: string[] = []\n Object.entries(paths).forEach(([endpoint, op]) => {\n Object.entries(op as any).forEach(([httpMethod, method]) => {\n const operation = method as any\n const params = operation.parameters\n if (params) {\n Object.entries(params).forEach(([, p]) => {\n const param = p as any\n if (param.name === 'body' && param.in === 'body') {\n // Set `required` in requestBody\n if ('required' in param) {\n // explicitly setting required value\n const required = param.required\n const fix = `${endpoint}::${operation.operationId} setting requestBody.required to ${required}`\n const requestBody = api.paths[endpoint][httpMethod].requestBody\n if (!requestBody) {\n warn(\n `Failed to find \"requestBody\" in OAS for swagger \"body param\" fix: ${fix}`\n )\n } else {\n if (requestBody.required !== required) {\n fixes.push(fix)\n }\n requestBody.required = required\n }\n }\n }\n\n if (param.collectionFormat) {\n // Set style from collectionFormat if it's not set\n const format = param.collectionFormat\n const style = openApiStyle(format)\n if (style === undefined) {\n warn(\n `OAS style conversion failed: collectionFormat '${param.collectionFormat}' is unknown`\n )\n } else {\n const fix = `${endpoint}::${operation.operationId} ${param.name} '${format}' -> '${style}'`\n const newParam = findOpenApiParam(\n api,\n endpoint,\n httpMethod,\n param.name\n )\n if (newParam && newParam.style !== style) {\n newParam.style = style\n fixes.push(fix)\n }\n }\n }\n })\n }\n })\n })\n\n return { fixes, spec: JSON.stringify(api) }\n}\n\n/**\n * Returns true if this spec is a swagger specification\n * @param spec to check\n */\nexport const isSwagger = (spec: any) => spec.swagger !== undefined\n\n/**\n * Returns true spec is an OpenAPI specification\n * @param spec to check\n */\nexport const isOpenApi = (spec: any) => spec.openapi !== undefined\n\n/**\n * This is a post-fix operation for the OpenAPI converter which currently misses this type of conversion\n *\n * - Converts missing swagger collectionFormat values to OpenAPI styles\n * - Flags OAS.requestBody as required or optional\n *\n * @param openApiSpec converted OpenAPI spec\n * @param swaggerSpec original swagger spec that may contain missed conversions\n * @returns modified openApiSpec and fix log in IConversionResults\n */\nexport const fixConversion = (\n openApiSpec: string,\n swaggerSpec: string\n): IConversionResults => {\n return fixConversionObjects(JSON.parse(openApiSpec), JSON.parse(swaggerSpec))\n}\n\n/**\n * Convert a swagger structure ref to an OpenAPI structure ref\n *\n * TODO update this to the typescript that understands replaceAll\n * @param ref string reference to convert\n */\nexport const swapRef = (ref: string) =>\n ref.replace(/#\\/definitions\\//g, '#/components/schemas/')\n\n/**\n * Get the name of the structure from the reference string\n * @param ref to partse\n */\nexport const structName = (ref: string) => {\n if (!ref) return undefined\n const parts = ref.split('/')\n return parts[parts.length - 1]\n}\n\n/**\n * Moves type, format, items to schema\n * Converts collectionFormat to style\n * @param param to convert\n */\nexport const convertParam = (param: any) => {\n const schema: any = { type: param.type }\n const result = { ...param }\n delete result.type\n if (param.format) {\n schema.format = param.format\n delete result.format\n }\n if (param.collectionFormat) {\n result.style = openApiStyle(param.collectionFormat)\n delete result.collectionFormat\n }\n if (param.items) {\n schema.items = param.items\n result.explode = false\n delete result.items\n }\n result.schema = schema\n return result\n}\n\n/**\n * Convert responses for the right response formats\n * @param responses response to convert\n * @param formats mime formats\n */\nexport const convertResponses = (\n responses: ArgValues,\n formats = defaultMimeFormats\n) => {\n Object.entries(responses).forEach(([code, response]) => {\n responses[code] = {\n description: response.description,\n }\n if (response.schema) {\n const content = {}\n formats.produces.forEach(\n (format) => (content[format] = { schema: response.schema })\n )\n responses[code].content = content\n }\n })\n return responses\n}\n\n/**\n * Convert an operation\n * Assign schemas in params, create request bodies, update $refs\n * @param op operation to convert\n * @param formats mime format consumer and producer\n * @param moveKeys true to move keys for reference OAS comparison\n */\nexport const convertOp = (\n op: ArgValues,\n formats = defaultMimeFormats,\n moveKeys = false\n) => {\n // If keys need to be shuffled for file comparison reasons, uncomment this function\n const moveKey = (key: string, value?: any) => {\n if (!moveKeys || !(key in op)) return value\n if (!value) value = op[key]\n if (value) {\n delete op[key]\n op[key] = value\n }\n return value\n }\n\n let { produces, consumes } = formats\n const body = {}\n if (op.produces) {\n produces = op.produces\n delete op.produces\n }\n if (op.consumes) {\n consumes = op.consumes\n delete op.consumes\n }\n if (op.parameters) {\n // Copy parameters before rebuilding\n const params = { ...op.parameters }\n op.parameters = []\n Object.values(params).forEach((p: any) => {\n if (p.in === 'body') {\n // const struct = structName(p.schema?.$ref)\n op.requestBody = {}\n // if (struct) {\n // op.requestBody.$ref = `#/components/requestBodies/${struct}`\n // }\n if (p.schema) {\n op.requestBody.content = { [consumes[0]]: { schema: p.schema } }\n }\n op.requestBody.description = p.description\n if ('required' in p) op.requestBody.required = p.required\n // if (struct) {\n // body[struct] = { ...op.requestBody }\n // body[struct].$ref = `#/components/schema/${struct}`\n // }\n } else {\n op.parameters.push(convertParam(p))\n }\n })\n if (op.parameters.length === 0) delete op.parameters\n }\n moveKey('responses', convertResponses(op.responses, { produces, consumes }))\n moveKey('deprecated')\n const xdep = 'x-looker-deprecated'\n if (xdep in op) {\n op.deprecated = op[xdep]\n delete op[xdep]\n }\n moveKey('x-looker-status')\n moveKey('x-looker-activity-type')\n moveKey('x-looker-rate-limited')\n return { op, body }\n}\n\n/**\n * Assign schemas and request bodies\n * @param paths to process\n * @param formats mime response types\n */\nexport const convertPathsAndBodies = (\n paths: ArgValues,\n formats = defaultMimeFormats\n) => {\n const result = { paths: {}, requestBodies: {} }\n Object.entries(paths).forEach(([path, entry]) => {\n result.paths[path] = {}\n // Hack to accommodate linting limitations\n const endpoint: ArgValues = entry\n Object.entries(endpoint).forEach(([verb, op]) => {\n const ep = convertOp(op, formats)\n result.paths[path][verb] = ep.op\n Object.entries(ep.body as ArgValues).forEach(([name, body]) => {\n result.requestBodies[name] = body\n })\n })\n })\n return result\n}\n\n/**\n * Convert structure definitions\n * @param defs to convert\n */\nexport const convertDefs = (defs: ArgValues): ArgValues => {\n Object.entries(defs).forEach(([_, struct]) => {\n Object.entries(struct.properties as ArgValues).forEach(([name, prop]) => {\n if (prop.$ref) {\n // Evidently OAS only wants the ref for the property type\n struct.properties[name] = { $ref: prop.$ref }\n }\n })\n })\n return defs\n}\n\n/**\n * On-demand conversion of swagger to openAPI specification\n * @param spec to possibly convert\n * @returns OpenAPI version of the specification or throws error if not Swagger or OpenAPI\n */\nexport const upgradeSpecObject = (spec: any) => {\n if (isOpenApi(spec)) {\n return JSON.parse(swapXLookerTags(JSON.stringify(spec)))\n }\n if (!isSwagger(spec)) {\n throw new Error('Input is not a Swagger or OpenAPI specification')\n }\n const cleanup = swapRef(swapXLookerTags(JSON.stringify(spec)))\n spec = JSON.parse(cleanup)\n const consumes = spec.consumes || [appJson]\n const produces = spec.produces || [appJson]\n const formats = { produces, consumes }\n const { paths, requestBodies } = convertPathsAndBodies(spec.paths, formats)\n // TODO create a requestBodies entry for every struct used > 1x?\n // TODO reassign op.requestBody for all requestBodies entries?\n const schemas = convertDefs(spec.definitions)\n const api = {\n openapi: '3.0.0',\n info: spec.info,\n tags: spec.tags,\n paths,\n servers: [{ url: `${spec.schemes[0]}://${spec.host}${spec.basePath}` }],\n components: {\n requestBodies,\n schemas: schemas,\n },\n }\n // const result = fixConversionObjects(api, spec)\n return api\n}\n\n/**\n * Upgrade a spec to OpenAPI if it's not already an OpenAPI spec\n * @param spec to upgrade\n */\nexport const upgradeSpec = (spec: string | Record<string, unknown>) => {\n if (typeof spec === 'string') spec = JSON.parse(spec)\n return JSON.stringify(upgradeSpecObject(spec))\n}\n\n/**\n * Fetches specs via /versions payload from the API server url\n * @param sdk APIMethods implementation that supports authenticating a request\n * @param serverUrl base url of the /versions server. Typically something like https://my.looker.com:19999 or https://my.looker.com\n */\nexport const getLookerSpecs = async (sdk: APIMethods, serverUrl: string) => {\n const versionUrl = `${serverUrl}/versions`\n const versions = await sdk.ok(sdk.get<ILookerVersions, Error>(versionUrl))\n return versions\n}\n\n// TODO this work was duplicated in API Explorer. Need to merge and use one version.\n/**\n * Convert a Looker versions payload into API specification links\n * @param versions\n * @param include lambda that returns true to include a spec item in the list\n */\nexport const getSpecLinks = (\n versions: ILookerVersions,\n include = (spec: ISpecItem) => spec.version > '2.99'\n) => {\n const prefix = `Release ${versions.looker_release_version} API `\n const deriveSpec = (spec: ISpecItem): IApiSpecLink => {\n const status =\n spec.swagger_url === versions.current_version.swagger_url\n ? 'current'\n : spec.status\n return {\n name: `${prefix}${spec.version}`,\n version: spec.version,\n status,\n url: spec.swagger_url,\n api: {} as IApiModel,\n }\n }\n const specs = versions.supported_versions\n .filter((v) => include(v))\n .map((v) => deriveSpec(v))\n return specs\n}\n\n/**\n * Fetch and parse API specifications from the established links\n * @param sdk APIMethods implementation that supports authenticating a request\n * @param links list of specifications to load\n */\nexport const loadSpecs = async (sdk: APIMethods, links: SpecLinks) => {\n for (const spec of links) {\n if (isEmpty(spec.api)) {\n // Not parsed yet\n const content = await sdk.ok<string, Error>(sdk.get(spec.url))\n const json = typeof content === 'string' ? JSON.parse(content) : content\n spec.api = ApiModel.fromJson(upgradeSpecObject(json))\n }\n }\n return links\n}\n"],"file":"specConverter.js"}
|
package/lib/exampleInfo.d.ts
CHANGED
|
@@ -37,7 +37,9 @@ export interface IExampleMine extends IMine {
|
|
|
37
37
|
summaries: Summaries;
|
|
38
38
|
nuggets: Nuggets;
|
|
39
39
|
}
|
|
40
|
-
export declare
|
|
40
|
+
export declare type SourceLink = (remote: string, hash: string, fileName: string, line: number) => string;
|
|
41
|
+
export declare const permaLink: SourceLink;
|
|
42
|
+
export declare const codeSearchLink: SourceLink;
|
|
41
43
|
export declare const ideLink: (parentPath: string, fileName: string, line: number) => string;
|
|
42
44
|
export declare const summarize: (lode: IExampleMine, call: IFileCall) => string;
|
|
43
45
|
export declare const exampleLink: (lode: IExampleMine, call: IFileCall) => IExampleLink;
|
package/lib/exampleInfo.js
CHANGED
|
@@ -3,12 +3,16 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.findExamples = exports.findExampleLanguages = exports.getLanguageExtensions = exports.extensionToLanguage = exports.exampleLink = exports.summarize = exports.ideLink = exports.permaLink = void 0;
|
|
6
|
+
exports.findExamples = exports.findExampleLanguages = exports.getLanguageExtensions = exports.extensionToLanguage = exports.exampleLink = exports.summarize = exports.ideLink = exports.codeSearchLink = exports.permaLink = void 0;
|
|
7
7
|
|
|
8
8
|
var permaLink = (remote, hash, fileName, line) => "".concat(remote, "/blob/").concat(hash, "/").concat(fileName, "#L").concat(line);
|
|
9
9
|
|
|
10
10
|
exports.permaLink = permaLink;
|
|
11
11
|
|
|
12
|
+
var codeSearchLink = (remote, hash, fileName, line) => "".concat(remote, "/").concat(fileName, "?l=").concat(line, "&rcl=").concat(hash);
|
|
13
|
+
|
|
14
|
+
exports.codeSearchLink = codeSearchLink;
|
|
15
|
+
|
|
12
16
|
var ideLink = (parentPath, fileName, line) => {
|
|
13
17
|
var vscode = 'vscode://';
|
|
14
18
|
return "".concat(vscode).concat(parentPath, "/").concat(fileName, ":L:").concat(line);
|
package/lib/exampleInfo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/exampleInfo.ts"],"names":["permaLink","remote","hash","fileName","line","ideLink","parentPath","vscode","summarize","lode","call","sourceFile","summaries","summary","exampleLink","link","remoteOrigin","commitHash","permalink","description","tooltip","lineNumber","toString","extensionToLanguage","getLanguageExtensions","language","toLowerCase","findExampleLanguages","methodName","all","nuggets","result","Set","keys","Object","forEach","key","calls","add","Array","from","findExamples","operationId","exts","links","length","ext","push","sort","a","b","localeCompare"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { KeyedCollection } from './sdkModels'\n\nexport interface ISDKCall {\n /** SDK variable name for the call found */\n sdk: string\n\n /** Name of the method/operationId */\n operationId: string\n\n /** Source code line number */\n line: number\n\n /** Source code column number where method name was found */\n column: number\n}\n\nexport interface IExampleLink {\n /** Either summary from .md documentation or the name of the source file */\n description: string\n /** permalink to file and line number */\n permalink: string\n /** text to show on hover */\n tooltip: string\n /** line number text */\n lineNumber: string\n}\n\nexport type SDKCalls = ISDKCall[]\n\nexport interface ISummary {\n /** relative file name */\n sourceFile: string\n /** summary extracted from md, rst, or other doc file */\n summary: string\n}\n\nexport type Summaries = KeyedCollection<ISummary>\n\nexport interface IFileCall {\n /** relative file name */\n sourceFile: string\n /** line number for source code call */\n line: number\n /** Optional column number for source code call. Maybe we don't need this datum */\n column?: number\n}\n\n/**\n { \"me\": {\n \".ts\": {\n [\n {\n \"hash\": \"TODO\",\n \"sourceFile\": \"foo.ts\",\n \"line\": 1,\n \"column\": 5,\n }\n ]\n }\n }\n}\n */\n\nexport type FileCalls = IFileCall[]\n\nexport type LanguageCalls = KeyedCollection<FileCalls>\n\nexport interface INugget {\n operationId: string\n calls: LanguageCalls\n}\n\nexport type Nuggets = KeyedCollection<INugget>\n\nexport interface IMine {\n commitHash: string\n remoteOrigin: string\n}\n\n/** All mined example data */\nexport interface IExampleMine extends IMine {\n summaries: Summaries\n nuggets: Nuggets\n}\n\n/**\n * Create a permalink for a github file with line number\n * @param remote https url for repository\n * @param hash commit hash\n * @param fileName name of file\n * @param line line number in file\n */\nexport const permaLink = (\n // https://github.com/looker-open-source/sdk-codegen/blob/bfca52d2c8ba85018f76548158fd1dd90aa1f64a/examples/typescript/customConfigReader.ts#L53\n remote: string,\n hash: string,\n fileName: string,\n line: number\n) => `${remote}/blob/${hash}/${fileName}#L${line}`\n\n/**\n * Create an IDE file link with line number\n * @param parentPath to fully qualify the source file\n * @param fileName full name of file\n * @param line line number in file\n */\nexport const ideLink = (\n // https://plugins.jetbrains.com/plugin/6027-remote-call\n // https://github.com/microsoft/vscode/issues/4883#issuecomment-270141535\n // pattern:\n parentPath: string,\n fileName: string,\n line: number\n) => {\n // const idea = 'http//localhost:8091'\n const vscode = 'vscode://'\n\n return `${vscode}${parentPath}/${fileName}:L:${line}`\n}\n\n/**\n * Gets the summary for an example file, or defaults to the file and line number\n * @param lode all mined example data\n * @param call specific call to summarize\n */\nexport const summarize = (lode: IExampleMine, call: IFileCall): string => {\n if (call.sourceFile in lode.summaries) {\n return lode.summaries[call.sourceFile].summary\n }\n // Default to file name if no summary is found\n return call.sourceFile\n}\n\n/**\n * Provides permalink and description for an example file call\n * @param lode all mined example data\n * @param call specific all to link\n */\nexport const exampleLink = (\n lode: IExampleMine,\n call: IFileCall\n): IExampleLink => {\n const link = permaLink(\n lode.remoteOrigin,\n lode.commitHash,\n call.sourceFile,\n call.line\n )\n\n return {\n permalink: link,\n description: summarize(lode, call),\n tooltip: `${call.sourceFile} line ${call.line}`,\n lineNumber: call.line.toString(),\n }\n}\n\n// TODO create one data set for extensionToLanguage and getLanguageExtensions\n/** map file extension to language name */\nexport const extensionToLanguage = {\n '.py': 'Python',\n '.ts': 'TypeScript',\n '.tsx': 'TypeScript',\n '.cs': 'C#',\n '.kt': 'Kotlin',\n '.swift': 'Swift',\n '.rb': 'Ruby',\n '.dart': 'Dart',\n '.go': 'Go',\n '.md': 'Markdown',\n '.java': 'Java',\n}\n\n/**\n * Return the recognized file extensions for the requested language\n * @param language\n */\nexport const getLanguageExtensions = (language: string): string[] => {\n switch (language.toLowerCase()) {\n case 'ts':\n case 'typescript':\n return ['.ts', 'tsx']\n case 'csharp':\n case 'c#':\n return ['.cs']\n case 'ruby':\n return ['.rb']\n case 'python':\n return ['.py']\n case 'swift':\n return ['.swift']\n case 'kotlin':\n return ['.kt']\n case 'dart':\n return ['.dart']\n case 'go':\n return ['.go']\n case 'java':\n return ['.java']\n default:\n return []\n }\n}\n\nexport const findExampleLanguages = (\n lode: IExampleMine,\n methodName: string\n) => {\n const all = lode.nuggets[methodName]\n if (!all) return []\n const result = new Set<string>()\n const keys = Object.keys(extensionToLanguage)\n keys.forEach((key) => {\n if (all.calls[key]) result.add(extensionToLanguage[key])\n })\n return Array.from(result)\n}\n\n/**\n * Searches for examples containing operationId usages in the given language\n * @param lode All example data\n * @param language Language example should be in\n * @param operationId Method's operationId to search for\n */\nexport const findExamples = (\n lode: IExampleMine,\n language: string,\n operationId: string\n): IExampleLink[] => {\n const all = lode.nuggets[operationId]\n const exts = getLanguageExtensions(language)\n const links: IExampleLink[] = []\n\n if (all && exts.length > 0) {\n exts.forEach((ext) => {\n const calls = all.calls[ext]\n if (calls) {\n calls.forEach((call: IFileCall) => {\n const link = exampleLink(lode, call)\n if (link) {\n links.push(exampleLink(lode, call))\n }\n })\n }\n })\n }\n return links.sort((a, b) => a.permalink.localeCompare(b.permalink))\n}\n"],"file":"exampleInfo.js"}
|
|
1
|
+
{"version":3,"sources":["../src/exampleInfo.ts"],"names":["permaLink","remote","hash","fileName","line","codeSearchLink","ideLink","parentPath","vscode","summarize","lode","call","sourceFile","summaries","summary","exampleLink","link","remoteOrigin","commitHash","permalink","description","tooltip","lineNumber","toString","extensionToLanguage","getLanguageExtensions","language","toLowerCase","findExampleLanguages","methodName","all","nuggets","result","Set","keys","Object","forEach","key","calls","add","Array","from","findExamples","operationId","exts","links","length","ext","push","sort","a","b","localeCompare"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { KeyedCollection } from './sdkModels'\n\nexport interface ISDKCall {\n /** SDK variable name for the call found */\n sdk: string\n\n /** Name of the method/operationId */\n operationId: string\n\n /** Source code line number */\n line: number\n\n /** Source code column number where method name was found */\n column: number\n}\n\nexport interface IExampleLink {\n /** Either summary from .md documentation or the name of the source file */\n description: string\n /** permalink to file and line number */\n permalink: string\n /** text to show on hover */\n tooltip: string\n /** line number text */\n lineNumber: string\n}\n\nexport type SDKCalls = ISDKCall[]\n\nexport interface ISummary {\n /** relative file name */\n sourceFile: string\n /** summary extracted from md, rst, or other doc file */\n summary: string\n}\n\nexport type Summaries = KeyedCollection<ISummary>\n\nexport interface IFileCall {\n /** relative file name */\n sourceFile: string\n /** line number for source code call */\n line: number\n /** Optional column number for source code call. Maybe we don't need this datum */\n column?: number\n}\n\n/**\n { \"me\": {\n \".ts\": {\n [\n {\n \"hash\": \"TODO\",\n \"sourceFile\": \"foo.ts\",\n \"line\": 1,\n \"column\": 5,\n }\n ]\n }\n }\n}\n */\n\nexport type FileCalls = IFileCall[]\n\nexport type LanguageCalls = KeyedCollection<FileCalls>\n\nexport interface INugget {\n operationId: string\n calls: LanguageCalls\n}\n\nexport type Nuggets = KeyedCollection<INugget>\n\nexport interface IMine {\n commitHash: string\n remoteOrigin: string\n}\n\n/** All mined example data */\nexport interface IExampleMine extends IMine {\n summaries: Summaries\n nuggets: Nuggets\n}\n\n/** function type for formatting source code links */\nexport type SourceLink = (\n remote: string,\n hash: string,\n fileName: string,\n line: number\n) => string\n\n/**\n * Create a permalink for a github file with line number\n * @param remote https url for repository\n * @param hash commit hash\n * @param fileName name of file\n * @param line line number in file\n */\nexport const permaLink: SourceLink = (\n // https://github.com/looker-open-source/sdk-codegen/blob/bfca52d2c8ba85018f76548158fd1dd90aa1f64a/examples/typescript/customConfigReader.ts#L53\n remote: string,\n hash: string,\n fileName: string,\n line: number\n) => `${remote}/blob/${hash}/${fileName}#L${line}`\n\n/**\n * Create a permalink for a code search with commit hash and line number\n * @param remote https url for repository\n * @param hash commit hash\n * @param fileName name of file\n * @param line line number in file\n */\nexport const codeSearchLink: SourceLink = (\n remote: string,\n hash: string,\n fileName: string,\n line: number\n) => `${remote}/${fileName}?l=${line}&rcl=${hash}`\n\n/**\n * Create an IDE file link with line number\n * @param parentPath to fully qualify the source file\n * @param fileName full name of file\n * @param line line number in file\n */\nexport const ideLink = (\n // https://plugins.jetbrains.com/plugin/6027-remote-call\n // https://github.com/microsoft/vscode/issues/4883#issuecomment-270141535\n // pattern:\n parentPath: string,\n fileName: string,\n line: number\n) => {\n // const idea = 'http//localhost:8091'\n const vscode = 'vscode://'\n\n return `${vscode}${parentPath}/${fileName}:L:${line}`\n}\n\n/**\n * Gets the summary for an example file, or defaults to the file and line number\n * @param lode all mined example data\n * @param call specific call to summarize\n */\nexport const summarize = (lode: IExampleMine, call: IFileCall): string => {\n if (call.sourceFile in lode.summaries) {\n return lode.summaries[call.sourceFile].summary\n }\n // Default to file name if no summary is found\n return call.sourceFile\n}\n\n/**\n * Provides permalink and description for an example file call\n * @param lode all mined example data\n * @param call specific all to link\n */\nexport const exampleLink = (\n lode: IExampleMine,\n call: IFileCall\n): IExampleLink => {\n const link = permaLink(\n lode.remoteOrigin,\n lode.commitHash,\n call.sourceFile,\n call.line\n )\n\n return {\n permalink: link,\n description: summarize(lode, call),\n tooltip: `${call.sourceFile} line ${call.line}`,\n lineNumber: call.line.toString(),\n }\n}\n\n// TODO create one data set for extensionToLanguage and getLanguageExtensions\n/** map file extension to language name */\nexport const extensionToLanguage = {\n '.py': 'Python',\n '.ts': 'TypeScript',\n '.tsx': 'TypeScript',\n '.cs': 'C#',\n '.kt': 'Kotlin',\n '.swift': 'Swift',\n '.rb': 'Ruby',\n '.dart': 'Dart',\n '.go': 'Go',\n '.md': 'Markdown',\n '.java': 'Java',\n}\n\n/**\n * Return the recognized file extensions for the requested language\n * @param language\n */\nexport const getLanguageExtensions = (language: string): string[] => {\n switch (language.toLowerCase()) {\n case 'ts':\n case 'typescript':\n return ['.ts', 'tsx']\n case 'csharp':\n case 'c#':\n return ['.cs']\n case 'ruby':\n return ['.rb']\n case 'python':\n return ['.py']\n case 'swift':\n return ['.swift']\n case 'kotlin':\n return ['.kt']\n case 'dart':\n return ['.dart']\n case 'go':\n return ['.go']\n case 'java':\n return ['.java']\n default:\n return []\n }\n}\n\nexport const findExampleLanguages = (\n lode: IExampleMine,\n methodName: string\n) => {\n const all = lode.nuggets[methodName]\n if (!all) return []\n const result = new Set<string>()\n const keys = Object.keys(extensionToLanguage)\n keys.forEach((key) => {\n if (all.calls[key]) result.add(extensionToLanguage[key])\n })\n return Array.from(result)\n}\n\n/**\n * Searches for examples containing operationId usages in the given language\n * @param lode All example data\n * @param language Language example should be in\n * @param operationId Method's operationId to search for\n */\nexport const findExamples = (\n lode: IExampleMine,\n language: string,\n operationId: string\n): IExampleLink[] => {\n const all = lode.nuggets[operationId]\n const exts = getLanguageExtensions(language)\n const links: IExampleLink[] = []\n\n if (all && exts.length > 0) {\n exts.forEach((ext) => {\n const calls = all.calls[ext]\n if (calls) {\n calls.forEach((call: IFileCall) => {\n const link = exampleLink(lode, call)\n if (link) {\n links.push(exampleLink(lode, call))\n }\n })\n }\n })\n }\n return links.sort((a, b) => a.permalink.localeCompare(b.permalink))\n}\n"],"file":"exampleInfo.js"}
|
package/lib/sdkModels.d.ts
CHANGED
|
@@ -397,7 +397,6 @@ export interface IApiModel extends IModel {
|
|
|
397
397
|
}
|
|
398
398
|
export declare class ApiModel implements ISymbolTable, IApiModel {
|
|
399
399
|
readonly spec: OAS.OpenAPIObject;
|
|
400
|
-
private requestTypes;
|
|
401
400
|
private enumTypes;
|
|
402
401
|
private refs;
|
|
403
402
|
methods: MethodList;
|
|
@@ -417,13 +416,14 @@ export declare class ApiModel implements ISymbolTable, IApiModel {
|
|
|
417
416
|
jsonPath(path: string | string[], item?: any, splitter?: string): any;
|
|
418
417
|
private schemaHasEnums;
|
|
419
418
|
resolveType(schema: string | OAS.SchemaObject | OAS.ReferenceObject, style?: string, typeName?: string, methodName?: string): IType;
|
|
420
|
-
|
|
419
|
+
private requestTypeName;
|
|
420
|
+
makeRequestType(method: IMethod): RequestType;
|
|
421
421
|
registerEnum(type: IType, methodName?: string): IType;
|
|
422
422
|
private _getRequestType;
|
|
423
423
|
getRequestType(method: IMethod): IType | undefined;
|
|
424
424
|
getEnumList(): TypeList;
|
|
425
|
-
makeWriteableType(
|
|
426
|
-
mayGetWriteableType(type: IType):
|
|
425
|
+
makeWriteableType(type: IType): WriteType;
|
|
426
|
+
mayGetWriteableType(type: IType): WriteType | undefined;
|
|
427
427
|
loadDynamicTypes(): void;
|
|
428
428
|
sortList<T>(list: KeyedCollection<T>): KeyedCollection<T>;
|
|
429
429
|
sortLists(): void;
|
package/lib/sdkModels.js
CHANGED
|
@@ -1371,8 +1371,6 @@ class ApiModel {
|
|
|
1371
1371
|
constructor(spec) {
|
|
1372
1372
|
this.spec = spec;
|
|
1373
1373
|
|
|
1374
|
-
_defineProperty(this, "requestTypes", {});
|
|
1375
|
-
|
|
1376
1374
|
_defineProperty(this, "enumTypes", {});
|
|
1377
1375
|
|
|
1378
1376
|
_defineProperty(this, "refs", {});
|
|
@@ -1603,11 +1601,14 @@ class ApiModel {
|
|
|
1603
1601
|
throw new Error("Schema ".concat(typeof schema === 'string' ? schema : JSON.stringify(schema), " must have a ref or a type"));
|
|
1604
1602
|
}
|
|
1605
1603
|
|
|
1606
|
-
|
|
1607
|
-
|
|
1604
|
+
requestTypeName(method) {
|
|
1605
|
+
return "".concat(strRequest).concat(camelCase('_' + method.name));
|
|
1606
|
+
}
|
|
1607
|
+
|
|
1608
|
+
makeRequestType(method) {
|
|
1609
|
+
var name = this.requestTypeName(method);
|
|
1608
1610
|
var request = new RequestType(this, name, method.allParams, "Dynamically generated request type for ".concat(method.name));
|
|
1609
1611
|
this.types[name] = request;
|
|
1610
|
-
this.requestTypes[hash] = request;
|
|
1611
1612
|
method.addType(this, request);
|
|
1612
1613
|
return request;
|
|
1613
1614
|
}
|
|
@@ -1640,11 +1641,8 @@ class ApiModel {
|
|
|
1640
1641
|
|
|
1641
1642
|
_getRequestType(method) {
|
|
1642
1643
|
if (method.optionalParams.length <= 1) return undefined;
|
|
1643
|
-
var
|
|
1644
|
-
|
|
1645
|
-
var hash = (0, _blueimpMd.default)(paramHash);
|
|
1646
|
-
var result = this.requestTypes[hash];
|
|
1647
|
-
if (!result) result = this.makeRequestType(hash, method);
|
|
1644
|
+
var result = this.types[this.requestTypeName(method)];
|
|
1645
|
+
if (!result) result = this.makeRequestType(method);
|
|
1648
1646
|
return result;
|
|
1649
1647
|
}
|
|
1650
1648
|
|
|
@@ -1659,10 +1657,9 @@ class ApiModel {
|
|
|
1659
1657
|
return this.enumTypes;
|
|
1660
1658
|
}
|
|
1661
1659
|
|
|
1662
|
-
makeWriteableType(
|
|
1660
|
+
makeWriteableType(type) {
|
|
1663
1661
|
var writer = new WriteType(this, type);
|
|
1664
1662
|
this.types[writer.name] = writer;
|
|
1665
|
-
this.requestTypes[hash] = writer;
|
|
1666
1663
|
return writer;
|
|
1667
1664
|
}
|
|
1668
1665
|
|
|
@@ -1692,10 +1689,7 @@ class ApiModel {
|
|
|
1692
1689
|
}
|
|
1693
1690
|
|
|
1694
1691
|
if (writes.length === props.length && JSON.stringify(writes) === JSON.stringify(props)) return undefined;
|
|
1695
|
-
var
|
|
1696
|
-
var result = this.requestTypes[hash];
|
|
1697
|
-
if (result) return result;
|
|
1698
|
-
result = this.makeWriteableType(hash, type);
|
|
1692
|
+
var result = this.makeWriteableType(type);
|
|
1699
1693
|
type.types.add(result.name);
|
|
1700
1694
|
type.customTypes.add(result.name);
|
|
1701
1695
|
result.parentTypes.add(type.name);
|