UNPKG

@sanity/tsdoc

Version:

Generate API reference docs from TypeScript projects and store in a Sanity-friendly JSON format. Render a static frontend, or as React components.

1 lines 19.3 kB
{"version":3,"file":"store.mjs","sources":["../../src/store/constants.ts","../../src/store/queries.ts","../../src/store/TSDocStore.ts","../../src/store/TSDocMemoryStore.ts"],"sourcesContent":["/** @internal */\nexport const API_MEMBER_TYPES = [\n 'api.class',\n 'api.enum',\n 'api.function',\n 'api.interface',\n 'api.namespace',\n 'api.typeAlias',\n 'api.variable',\n]\n","import groq from 'groq'\n\n/** @internal */\nexport const API_EXPORTS_QUERY = groq`\n*[\n _type == 'api.export'\n && package->scope == $packageScope\n && package->name == $packageName\n && release->version == $releaseVersion\n]{\n name,\n path,\n package->{name,scope},\n release->{version},\n 'isLatest': release->_id == package->latestRelease._ref,\n 'members': *[_type in $memberTypes && references(^._id) && !(\"@hidden\" in coalesce(comment.customBlocks[].tag, [])) && !coalesce(isOverloading, false)] | order(name asc) {\n '_key': _id,\n _type,\n comment{deprecated},\n export->{name,path},\n members[]{\n _key,\n _type,\n export->{name,path},\n name,\n package->{name,scope},\n release->{version},\n releaseTag,\n isReactComponentType,\n slug,\n },\n name,\n slug,\n package->{name,scope},\n release->{version},\n releaseTag,\n isReactComponentType,\n isReactHook,\n isOverloading,\n }\n} | order(name)\n`\n\n/** @internal */\nconst API_TOKEN_MEMBER_PROJECTION = groq`\n...,\nexport->{name, path},\npackage->{name, scope},\nrelease->{version}\n`\n\n/** @internal */\nconst API_CLASS_PROJECTION = groq`\n_id,\n_type,\n_updatedAt,\ncomment,\nexport->{name,path},\nmembers[]{\n _type == 'api.constructor' => {\n _key,\n _type,\n comment,\n parameters[]{\n _key,\n _type,\n name,\n releaseTag,\n type[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n }\n },\n releaseTag\n },\n _type == 'api.method' => {\n _key,\n _type,\n comment,\n name,\n isOptional,\n isStatic,\n parameters[]{\n _key,\n _type,\n name,\n releaseTag,\n type[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n }\n },\n releaseTag,\n returnType[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n },\n typeParameters\n },\n _type == 'api.property' => {\n _key,\n _type,\n comment,\n name,\n isEventProperty,\n isOptional,\n isStatic,\n releaseTag,\n type[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n }\n }\n},\nname,\npackage->{scope,name},\nrelease->{version},\nreleaseTag,\ntypeParameters\n`\n\n// TODO\nconst API_ENUM_PROJECTION = groq`\n...,\nexport->{name,path},\npackage->{scope,name},\nrelease->{version}\n`\n\n/** @internal */\nconst API_INTERFACE_PROJECTION = groq`\n_id,\n_type,\n_updatedAt,\ncomment,\nexport->{name,path},\nextends,\nmembers[]{\n _type == 'api.callSignature' => {\n _key,\n _type,\n comment,\n parameters[]{\n _key,\n _type,\n name,\n releaseTag,\n type[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n }\n },\n releaseTag,\n returnType[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n },\n typeParameters\n },\n\n _type == 'api.methodSignature' => {\n _key,\n _type,\n comment,\n isOptional,\n name,\n parameters[]{\n _key,\n _type,\n name,\n releaseTag,\n type[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n }\n },\n releaseTag,\n returnType[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n },\n typeParameters\n },\n\n _type == 'api.indexSignature' => {\n _key,\n _type,\n comment,\n releaseTag,\n parameters[]{\n _key,\n _type,\n name,\n releaseTag,\n type[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n }\n },\n returnType[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n }\n },\n\n _type == 'api.propertySignature' => {\n _key,\n _type,\n comment,\n isOptional,\n name,\n releaseTag,\n comment,\n type[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n }\n }\n},\nname,\npackage->{scope,name},\n'referrers': *[references(^._id)] {\n _type,\n name,\n export->{path},\n package->{scope,name},\n release->{version}\n},\nrelease->{version},\nreleaseTag,\nslug,\ntypeParameters\n`\n\n/** @internal */\nconst API_FUNCTION_PROJECTION = groq`\n_id,\n_type,\n_updatedAt,\ncomment,\nexport->{name,path},\nisReactComponentType,\nname,\npackage->{scope,name},\nparameters[]{\n _key,\n _type,\n name,\n releaseTag,\n comment,\n type[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n }\n},\npropsType->{\n _type == 'api.interface' => {\n ${API_INTERFACE_PROJECTION}\n }\n},\n'referrers': *[references(^._id)] {\n _type,\n name,\n export->{path},\n package->{scope,name},\n release->{version}\n},\nrelease->{version},\nreleaseTag,\nreturnType[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n},\ntypeParameters\n`\n\n/** @internal */\nconst API_NAMESPACE_PROJECTION = groq`\n_id,\n_type,\n_updatedAt,\ncomment,\nexport->{name,path},\nmembers[]{\n ...\n},\nname,\npackage->{scope,name},\nrelease->{version},\nreleaseTag\n`\n\n/** @internal */\nconst API_TYPE_ALIAS_PROJECTION = groq`\n_id,\n_type,\n_updatedAt,\ncomment,\nexport->{name,path},\nname,\npackage->{scope,name},\nrelease->{version},\nreleaseTag,\ntype[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n},\ntypeParameters\n`\n\n/** @internal */\nconst API_VARIABLE_PROJECTION = groq`\n_id,\n_type,\ncomment,\nexport->{name,path},\nisReactComponentType,\nname,\nparameters[]{\n _key,\n _type,\n name,\n releaseTag,\n comment,\n type[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n }\n},\npackage->{scope,name},\npropsType->,\nrelease->{version},\nreleaseTag,\n'referrers': *[references(^._id)] {\n _type,\n name,\n export->{path},\n package->{scope,name},\n release->{version}\n},\ntype[]{\n ...,\n member->{${API_TOKEN_MEMBER_PROJECTION}}\n}\n`\n\n/** @internal */\nexport const API_MEMBER_PROJECTION = groq`\n_type == 'api.class' => {\n ${API_CLASS_PROJECTION}\n},\n\n_type == 'api.enum' => {\n ${API_ENUM_PROJECTION}\n},\n\n_type == 'api.function' => {\n ${API_FUNCTION_PROJECTION}\n},\n\n_type == 'api.interface' => {\n ${API_INTERFACE_PROJECTION}\n},\n\n_type == 'api.namespace' => {\n ${API_NAMESPACE_PROJECTION}\n},\n\n_type == 'api.typeAlias' => {\n ${API_TYPE_ALIAS_PROJECTION}\n},\n\n_type == 'api.variable' => {\n ${API_VARIABLE_PROJECTION}\n}\n`\n\n/** @internal */\nexport const API_MEMBER_QUERY = groq`\n*[\n _type in $memberTypes\n && export->path == $exportPath\n && package->scope == $packageScope\n && package->name == $packageName\n && release->version == $releaseVersion\n && slug.current == $memberSlug\n && !(\"@hidden\" in coalesce(comment.customBlocks[].tag, []))\n]{\n ${API_MEMBER_PROJECTION},\n \"members\": members[!(\"@hidden\" in coalesce(comment.customBlocks[].tag, []))],\n 'versions': *[\n _type == 'api.release'\n && package->scope == $packageScope\n && package->name == $packageName\n ]{version}.version\n}\n`\n\n/** @internal */\n\nconst NON_HIDDEN_MEMBER_TYPES_ARRAY = groq`*[\n _type in $memberTypes\n && name == ^.name\n && package->scope == $packageScope\n && package->name == $packageName\n && !(\"@hidden\" in coalesce(comment.customBlocks[].tag, []))\n]`\n\n/** @internal */\nexport const API_SYMBOL_SEARCH_QUERY = groq`\n*[\n _type == 'api.symbol'\n && name match $query\n && package->scope == $packageScope\n && package->name == $packageName\n && count(${NON_HIDDEN_MEMBER_TYPES_ARRAY}) > 0\n]{\n _id,\n _type,\n name,\n package->{name,scope}\n}[0...10]{\n ...,\n 'members': ${NON_HIDDEN_MEMBER_TYPES_ARRAY}{\n slug,\n 'exportPath': export->path,\n 'releaseVersion': release->version\n }\n} | order(lower(name) asc)\n`\n\n/** @internal */\nexport const API_PACKAGES_QUERY = groq`\n*[_type == 'api.package']{\n _id,\n name,\n scope,\n latestRelease->{version},\n releases[]->{version}\n}\n`\n\n/** @internal */\nexport const API_PACKAGE_QUERY = groq`\n*[\n _type == 'api.package'\n && scope == $packageScope\n && name == $packageName\n][0]\n`\n\n/** @internal */\nexport const API_SYMBOL_QUERY = groq`\n*[\n _type == 'api.symbol'\n && package->scope == $packageScope\n && package->name == $packageName\n]{\n _type,\n name,\n package->{name,scope},\n 'members': *[\n _type in $memberTypes\n ]{${API_MEMBER_PROJECTION}}\n}[0]\n`\n","/* eslint-disable no-console */\nimport {APIPackage} from '@sanity/tsdoc'\n\nimport {API_MEMBER_TYPES} from './constants'\nimport {\n API_EXPORTS_QUERY,\n API_MEMBER_QUERY,\n API_PACKAGE_QUERY,\n API_PACKAGES_QUERY,\n API_SYMBOL_QUERY,\n API_SYMBOL_SEARCH_QUERY,\n} from './queries'\nimport {\n TSDocAPIMember,\n TSDocAPISymbol,\n TSDocAppParams,\n TSDocExportData,\n TSDocStore,\n TSDocStoreCache,\n TSDocSymbolSearchResult,\n} from './types'\n\n/** @beta */\nexport interface TSDocStoreOptions {\n debug?: boolean\n query: (q: string, params: Record<string, unknown>) => Promise<any>\n initialState?: TSDocStoreCache\n}\n\n/**\n * A function for creating a TSDocStore instance.\n *\n * @beta\n *\n * @example\n * ```tsx\n * const tsdocStore = createTSDocStore({\n * debug: true,\n * query: async (q, params) => tsDocClient.fetch(q, params),\n * initialState: {\n * exports: {},\n * member: {},\n * package: {},\n * packages: [],\n * symbol: {},\n * },\n * });\n * ```\n *\n * @example\n * ```tsx\n * const tsdocStore = createTSDocStore({\n * debug: true,\n * query: async (q, params) => tsDocClient.fetch(q, params),\n * });\n * ```\n */\nexport function createTSDocStore(options: TSDocStoreOptions): TSDocStore {\n const {debug, query, initialState} = options\n\n const cache: TSDocStoreCache = initialState || {\n exports: {},\n member: {},\n package: {},\n packages: [],\n symbol: {},\n }\n\n return {\n exports: {\n get: async (params: {\n packageScope: string | null\n packageName: string\n releaseVersion: string\n }): Promise<TSDocExportData[] | undefined> => {\n if (debug) console.log('exports.get', params)\n\n const key = JSON.stringify(params)\n\n if (cache.exports[key]) {\n if (debug) console.log('exports.get read from cache')\n\n return cache.exports[key]\n }\n\n const result = await query(API_EXPORTS_QUERY, {\n ...params,\n memberTypes: API_MEMBER_TYPES,\n })\n\n cache.exports[key] = result\n\n return result\n },\n },\n\n member: {\n get: async (params: TSDocAppParams): Promise<TSDocAPIMember[] | null | undefined> => {\n if (debug) console.log('member.get', params)\n\n const key = JSON.stringify(params)\n\n if (cache.member[key]) {\n if (debug) console.log('member.get read from cache')\n\n return cache.member[key]\n }\n\n const result = await query(API_MEMBER_QUERY, {\n ...params,\n memberTypes: API_MEMBER_TYPES,\n })\n\n cache.member[key] = result\n\n return result\n },\n },\n\n package: {\n get: async (params: TSDocAppParams): Promise<APIPackage | null | undefined> => {\n if (debug) console.log('package.get', params)\n\n const key = JSON.stringify(params)\n\n if (cache.package[key]) {\n if (debug) console.log('package.get read from cache')\n\n return cache.package[key]\n }\n\n const result = await query(API_PACKAGE_QUERY, {\n ...params,\n memberTypes: API_MEMBER_TYPES,\n })\n\n cache.package[key] = result\n\n return result\n },\n },\n\n packages: {\n get: async (): Promise<APIPackage[] | null | undefined> => {\n if (debug) console.log('packages.get')\n\n if (cache.packages.length) {\n if (debug) console.log('packages.get read from cache')\n\n return cache.packages\n }\n\n const result = await query(API_PACKAGES_QUERY, {})\n\n cache.packages = result\n\n return result\n },\n },\n\n symbol: {\n get: async (params: {\n name: string\n packageName: string\n packageScope: string | null\n }): Promise<TSDocAPISymbol | null | undefined> => {\n if (debug) console.log('symbol.get', params)\n\n const key = JSON.stringify(params)\n\n if (cache.symbol[key]) {\n if (debug) console.log('symbol.get read from cache')\n\n return cache.symbol[key]\n }\n\n const result = await query(API_SYMBOL_QUERY, {\n ...params,\n memberTypes: API_MEMBER_TYPES,\n })\n\n cache.symbol[key] = result\n\n return result\n },\n search: (params: {\n query: string\n packageName: string\n packageScope: string | null\n }): Promise<TSDocSymbolSearchResult[]> => {\n if (debug) console.log('symbol.search', params)\n\n return query(API_SYMBOL_SEARCH_QUERY, {\n ...params,\n memberTypes: API_MEMBER_TYPES,\n query: `*${params.query}*`,\n })\n },\n },\n }\n}\n","/* eslint-disable no-console */\n\nimport {APIDocument} from '@sanity/tsdoc'\nimport {evaluate, parse} from 'groq-js'\n\nimport {createTSDocStore} from './TSDocStore'\nimport {TSDocStore} from './types'\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\n\nconst DEBUG = false\n\n/** @beta */\nexport function createTSDocMemoryStore({docs}: {docs: APIDocument[]}): TSDocStore {\n const query = async (q: string, params: Record<string, unknown>) => {\n await delay(0)\n\n const tree = parse(q)\n\n const queryId = String(Math.random())\n\n if (DEBUG) console.time(`query:${queryId}`)\n\n const value = await evaluate(tree, {\n dataset: docs,\n params,\n })\n\n if (DEBUG) console.timeEnd(`query:${queryId}`)\n\n return await value.get()\n }\n\n return createTSDocStore({debug: DEBUG, query})\n}\n"],"names":[],"mappings":"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"}