@hey-api/codegen-core 0.1.0 → 0.2.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/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +338 -468
- package/dist/index.d.ts +338 -468
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var h=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var h__default=/*#__PURE__*/_interopDefault(h);var I=({file:l,modulePath:e,symbol:t,symbolFile:r})=>{let i=[],s=[],n={aliases:{},from:e};if(t.meta?.importKind&&(t.meta.importKind==="default"?(n.defaultBinding=t.placeholder,t.meta.kind==="type"&&(n.typeDefaultBinding=true)):t.meta.importKind==="namespace"&&(n.namespaceBinding=t.placeholder,t.meta.kind==="type"&&(n.typeNamespaceBinding=true))),t.meta?.importKind==="named"||!i.length&&!n.defaultBinding&&!n.namespaceBinding){let o=t.placeholder,d=l.resolvedNames.get(t.id);if(d){let m=r.resolvedNames.get(t.id);m?m!==d&&(o=m,n.aliases[o]=d):t.name&&d!==t.name&&(o=t.name,n.aliases[o]=t.placeholder);}i.push(o),t.meta?.kind==="type"&&s.push(o);}for(let o of s)i.includes(o)||i.push(o);return n.names=i,n.typeNames=s,n},g=(l,e)=>{l.aliases={...l.aliases,...e.aliases},e.defaultBinding!==void 0&&(l.defaultBinding=e.defaultBinding),l.names=[...new Set([...l.names??[],...e.names??[]])],e.namespaceBinding!==void 0&&(l.namespaceBinding=e.namespaceBinding),e.typeDefaultBinding!==void 0&&(l.typeDefaultBinding=e.typeDefaultBinding),l.typeNames=[...new Set([...l.typeNames??[],...e.typeNames??[]])],e.typeNamespaceBinding!==void 0&&(l.typeNamespaceBinding=e.typeNamespaceBinding);};var a=class{map=new Map;reverse=new Map;delete(e){let t=this.map.get(e);return t!==void 0&&this.reverse.delete(t),this.map.delete(e)}deleteValue(e){let t=this.reverse.get(e);return t!==void 0&&this.map.delete(t),this.reverse.delete(e)}entries(){return this.map.entries()}get(e){return this.map.get(e)}getKey(e){return this.reverse.get(e)}hasKey(e){return this.map.has(e)}hasValue(e){return this.reverse.has(e)}keys(){return this.map.keys()}set(e,t){let r=this.map.get(e);r!==void 0&&r!==t&&this.reverse.delete(r);let i=this.reverse.get(t);return i!==void 0&&i!==e&&this.map.delete(i),this.map.set(e,t),this.reverse.set(t,e),this}get size(){return this.map.size}values(){return this.map.values()}[Symbol.iterator](){return this.map[Symbol.iterator]()}};var p=class{_id=0;referenceOrder=new Set;registerOrder=new Set;selectorToId=new Map;values=new Map;get(e){let t=this.idOrSelector(e);if(t.id!==void 0)return this.values.get(t.id);let r=t.selector!==void 0?JSON.stringify(t.selector):void 0;if(r){let i=this.selectorToId.get(r);if(i!==void 0)return this.values.get(i)}}get id(){return this._id++}idOrSelector(e){return typeof e=="number"?{id:e}:{selector:e}}reference(e){let t=this.idOrSelector(e);return this.register(t)}*referenced(){for(let e of this.referenceOrder.values())yield this.values.get(e);}register(e){if(e.id!==void 0){let n=this.values.get(e.id);if(!n)throw new Error(`File with ID ${e.id} not found. To register a new file, leave the ID undefined.`);return n}let t=Object.keys(e).some(n=>!["id","selector"].includes(n)),r,i=e.selector!==void 0?JSON.stringify(e.selector):void 0;if(i){let n=this.selectorToId.get(i);if(n!==void 0){if(r=this.values.get(n),!r)throw new Error(`File with ID ${n} not found. The selector ${i} matched an ID, but there was no result. This is likely an issue with the application logic.`);if(!t)return r}}let s=r?.id!==void 0?r.id:this.id;return r={...r,...e,id:s,resolvedNames:r?.resolvedNames??new a,symbols:r?.symbols??{body:[],exports:[],imports:[]}},this.values.set(s,r),t?this.registerOrder.add(s):this.referenceOrder.add(s),i&&this.selectorToId.set(i,s),r}*registered(){for(let e of this.registerOrder.values())yield this.values.get(e);}};var f=l=>`_heyapi_${l}_`,b=l=>l.slice(8,-1),S=()=>new RegExp(f("\\d+"),"g"),v=(l,e)=>l.replace(S(),t=>{let r=Number.parseInt(b(t),10);return e(r)||t});var u=class{_id=0;nodes=new Map;registerOrder=new Set;selectorToId=new Map;values=new Map;get(e){let t=this.idOrSelector(e);if(t.id!==void 0)return this.values.get(t.id);let r=t.selector!==void 0?JSON.stringify(t.selector):void 0;if(r){let i=this.selectorToId.get(r);if(i!==void 0)return this.values.get(i)}}getValue(e){return this.nodes.get(e)}hasValue(e){return this.nodes.has(e)}get id(){return this._id++}idOrSelector(e){return typeof e=="number"?{id:e}:{selector:e}}reference(e){let t=this.idOrSelector(e);return this.register(t)}register(e){if(e.id!==void 0){let o=this.values.get(e.id);if(!o)throw new Error(`Symbol with ID ${e.id} not found. To register a new symbol, leave the ID undefined.`);return o}let t=Object.keys(e).some(o=>!["id","selector"].includes(o)),r,i=e.selector!==void 0?JSON.stringify(e.selector):void 0;if(i){let o=this.selectorToId.get(i);if(o!==void 0){if(r=this.values.get(o),!r)throw new Error(`Symbol with ID ${o} not found. The selector ${i} matched an ID, but there was no result. This is likely an issue with the application logic.`);if(!t)return r}}let s=r?.id!==void 0?r.id:this.id,n=r?.exportFrom?[...r.exportFrom]:[];return e.exportFrom&&n.push(...e.exportFrom),r={...r,...e,exportFrom:n,id:s,placeholder:r?.placeholder??e.placeholder??f(String(s))},this.values.set(s,r),t&&this.registerOrder.add(s),i&&this.selectorToId.set(i,s),r}*registered(){for(let e of this.registerOrder.values())yield this.values.get(e);}setValue(e,t){return this.nodes.set(e,t)}};var y="@",c=class{symbolIdToFileIds=new Map;defaultFileName;files=new p;fileName;renderers={};root;symbols=new u;constructor({defaultFileName:e,fileName:t,renderers:r,root:i}){this.defaultFileName=e??"main",this.fileName=typeof t=="string"?()=>t:t,this.renderers=r,this.root=i;}getRenderer(e){return e.extension?this.renderers[e.extension]:void 0}prepareFiles(){for(let t of this.symbols.registered()){let r=this.symbolToFileSelector(t),i=this.files.reference(r);i.symbols.body.push(t.id);let s=this.symbolIdToFileIds.get(t.id)??new Set;s.add(i.id),this.symbolIdToFileIds.set(t.id,s);for(let n of t.exportFrom){let o=[n],d=this.files.reference(o);d.id!==i.id&&d.symbols.exports.push(t.id);}}for(let t of this.files.referenced()){if(!t.selector)continue;if(t.selector[0]===y){let s=t.selector[1];if(!s){this.files.register({external:true,selector:t.selector});continue}let n=h__default.default.extname(s);if(!n){this.files.register({external:true,path:s,selector:t.selector});continue}this.files.register({extension:n,external:true,path:s,selector:t.selector});continue}let r=t.selector.slice(0,-1),i=t.selector[t.selector.length-1];i=this.fileName?.(i)||i,this.files.register({extension:".ts",name:i,path:h__default.default.resolve(this.root,...r,`${i}.ts`),selector:t.selector});}}render(e){this.prepareFiles();let t=new Map;for(let r of this.files.registered()){if(r.external||!r.path)continue;let i=this.getRenderer(r);i&&t.set(r.id,{content:i.renderSymbols(r,this,e),path:r.path});}for(let[r,i]of t.entries()){let s=this.files.get(r),o=this.getRenderer(s).renderFile(i.content,s,this,e);o?t.set(s.id,{...i,content:o}):t.delete(s.id);}return Array.from(t.values())}symbolIdToFiles(e){let t=this.symbolIdToFileIds.get(e);return Array.from(t??[]).map(r=>this.files.get(r))}symbolToFileSelector(e){if(e.external)return [y,e.external];let t=e.getFilePath?.(e);return t?t.split("/"):[this.defaultFileName]}};exports.Project=c;exports.createBinding=I;exports.mergeBindings=g;exports.renderIds=v;//# sourceMappingURL=index.cjs.map
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bimap/bimap.ts","../src/renderers/renderer.ts","../src/files/file.ts","../src/project/project.ts"],"names":["BiMap","key","value","wrapId","symbolId","unwrapId","wrappedId","createPlaceholderRegExp","replaceWrappedIds","source","replacerFn","match","CodegenFile","_CodegenFile","path","project","meta","filePath","exp","imp","field","existing","typeName","id","symbol","inserted","values","name","target","file","relativePath","selector","updated","CodegenProject","fileOrPath","renderer","_meta","existingFile","fileId","ids","results","index","header","content","symbols","f"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ICodegenBiMap } from './types';\n\nexport class BiMap<Key, Value> implements ICodegenBiMap<Key, Value> {\n private map = new Map<Key, Value>();\n private reverse = new Map<Value, Key>();\n\n delete(key: Key): boolean {\n const value = this.map.get(key);\n if (value !== undefined) {\n this.reverse.delete(value);\n }\n return this.map.delete(key);\n }\n\n deleteValue(value: Value): boolean {\n const key = this.reverse.get(value);\n if (key !== undefined) {\n this.map.delete(key);\n }\n return this.reverse.delete(value);\n }\n\n entries(): IterableIterator<[Key, Value]> {\n return this.map.entries();\n }\n\n get(key: Key): Value | undefined {\n return this.map.get(key);\n }\n\n getKey(value: Value): Key | undefined {\n return this.reverse.get(value);\n }\n\n hasKey(key: Key): boolean {\n return this.map.has(key);\n }\n\n hasValue(value: Value): boolean {\n return this.reverse.has(value);\n }\n\n keys(): IterableIterator<Key> {\n return this.map.keys();\n }\n\n set(key: Key, value: Value): this {\n this.map.set(key, value);\n this.reverse.set(value, key);\n return this;\n }\n\n get size(): number {\n return this.map.size;\n }\n\n values(): IterableIterator<Value> {\n return this.map.values();\n }\n\n [Symbol.iterator](): IterableIterator<[Key, Value]> {\n return this.map[Symbol.iterator]();\n }\n}\n","/**\n * Wraps an ID in namespace to avoid collisions when replacing it.\n *\n * @param symbolId Stringified symbol ID to use.\n * @returns The wrapped placeholder ID.\n */\nexport const wrapId = (symbolId: string): string => `_heyapi_${symbolId}_`;\n\n/**\n * Unwraps an ID from namespace.\n *\n * @param wrappedId The wrapped placeholder ID.\n * @returns Stringified ID to use.\n */\nconst unwrapId = (wrappedId: string): string =>\n wrappedId.slice('_heyapi_'.length, -1);\n\n/**\n * Returns a RegExp instance to match ID placeholders.\n *\n * @returns RegExp instance to match ID placeholders.\n */\nconst createPlaceholderRegExp = (): RegExp => new RegExp(wrapId('\\\\d+'), 'g');\n\n/**\n *\n * @param source The source string to replace.\n * @param replacerFn Accepts a symbol ID, returns resolved symbol name.\n * @returns The replaced source string.\n */\nexport const replaceWrappedIds = (\n source: string,\n replacerFn: (symbolId: number) => string | undefined,\n): string =>\n source.replace(createPlaceholderRegExp(), (match) => {\n const symbolId = Number.parseInt(unwrapId(match), 10);\n return replacerFn(symbolId) || match;\n });\n","import path from 'node:path';\n\nimport { BiMap } from '../bimap/bimap';\nimport type { ICodegenBiMap } from '../bimap/types';\nimport type { ICodegenImport } from '../imports/types';\nimport type { ICodegenProject } from '../project/types';\nimport { wrapId } from '../renderers/renderer';\nimport type {\n ICodegenSymbolIn,\n ICodegenSymbolOut,\n ICodegenSymbolSelector,\n} from '../symbols/types';\nimport type { ICodegenFile } from './types';\n\nexport class CodegenFile implements ICodegenFile {\n private cache: {\n exports?: ReadonlyArray<ICodegenImport>;\n imports?: ReadonlyArray<ICodegenImport>;\n symbols?: ReadonlyArray<ICodegenSymbolOut>;\n } = {};\n\n private renderSymbols: Array<number> = [];\n\n private state: {\n exports: Map<string, ICodegenImport>;\n imports: Map<string, ICodegenImport>;\n symbols: Map<number, ICodegenSymbolOut>;\n } = {\n exports: new Map(),\n imports: new Map(),\n symbols: new Map(),\n };\n\n id: number;\n resolvedNames: ICodegenBiMap<number, string> = new BiMap();\n\n constructor(\n public path: string,\n public project: ICodegenProject,\n public meta: ICodegenFile['meta'] = {},\n ) {\n let filePath = CodegenFile.pathToFilePath(path);\n if (meta.path) {\n if (typeof meta.path === 'function') {\n filePath = meta.path(filePath);\n } else {\n filePath = meta.path.replace('{{path}}', filePath);\n }\n }\n this.id = project.incrementFileId();\n this.path = filePath;\n }\n\n addExport(exp: ICodegenImport): void {\n return this.addImportExport(exp, 'exports');\n }\n\n addImport(imp: ICodegenImport): void {\n return this.addImportExport(imp, 'imports');\n }\n\n private addImportExport(\n value: ICodegenImport,\n field: 'exports' | 'imports',\n ): void {\n const key = this.getImportExportKey(value);\n const existing = this.state[field].get(key);\n // cast type names to names to allow for cleaner API,\n // otherwise users would have to define the same values twice\n if (!value.names) value.names = [];\n for (const typeName of value.typeNames ?? []) {\n if (!value.names.includes(typeName)) {\n value.names = [...value.names, typeName];\n }\n }\n if (existing) {\n this.mergeImportExportValues(existing, value);\n this.state[field].set(key, existing);\n } else {\n this.state[field].set(key, { ...value }); // clone to avoid mutation\n }\n this.cache[field] = undefined; // invalidate cache\n }\n\n private addRenderSymbol(id: number): void {\n this.renderSymbols.push(id);\n this.cache.symbols = undefined; // invalidate cache\n }\n\n addSymbol(symbol: ICodegenSymbolIn): ICodegenSymbolOut {\n const id = this.project.incrementSymbolId();\n const inserted: ICodegenSymbolOut = {\n ...symbol, // clone to avoid mutation\n file: this,\n id,\n placeholder: wrapId(String(id)),\n update: (values) => this.updateSymbol(id, values),\n };\n if (inserted.value === undefined) {\n // register symbols without value as headless\n inserted.headless = true;\n } else if (!inserted.headless) {\n delete inserted.headless;\n }\n this.state.symbols.set(id, inserted);\n this.project.registerSymbol(inserted, this);\n if (!inserted.headless) {\n this.addRenderSymbol(id);\n }\n return inserted;\n }\n\n ensureSymbol(\n symbol: Partial<ICodegenSymbolIn> &\n Pick<Required<ICodegenSymbolIn>, 'selector'>,\n ): ICodegenSymbolOut {\n return (\n this.selectSymbolFirst(symbol.selector) ||\n this.addSymbol({ name: '', ...symbol })\n );\n }\n\n get exports(): ReadonlyArray<ICodegenImport> {\n if (!this.cache.exports) {\n this.cache.exports = Array.from(this.state.exports.values());\n }\n return this.cache.exports;\n }\n\n getAllSymbols(): ReadonlyArray<Pick<ICodegenSymbolOut, 'name'>> {\n return [\n ...this.symbols,\n ...this.imports.flatMap((imp) =>\n (imp.names ?? []).map((name) => ({\n name: imp.aliases?.[name] ?? name,\n })),\n ),\n ...this.exports.flatMap((imp) =>\n (imp.names ?? []).map((name) => ({\n name: imp.aliases?.[name] ?? name,\n })),\n ),\n ];\n }\n\n private getImportExportKey(value: ICodegenImport): string {\n if (typeof value.from === 'string') {\n return value.from;\n }\n return value.from.path;\n }\n\n getSymbolById(id: number): ICodegenSymbolOut | undefined {\n return this.state.symbols.get(id);\n }\n\n hasContent(): boolean {\n return this.state.exports.size > 0 || this.symbols.length > 0;\n }\n\n hasSymbol(id: number): boolean {\n return this.state.symbols.has(id);\n }\n\n get imports(): ReadonlyArray<ICodegenImport> {\n if (!this.cache.imports) {\n this.cache.imports = Array.from(this.state.imports.values());\n }\n return this.cache.imports;\n }\n\n private mergeImportExportValues(\n target: ICodegenImport,\n source: ICodegenImport,\n ): void {\n target.aliases = { ...target.aliases, ...source.aliases };\n if (source.defaultImport !== undefined) {\n target.defaultImport = source.defaultImport;\n }\n target.names = [\n ...new Set([...(target.names ?? []), ...(source.names ?? [])]),\n ];\n if (source.namespaceImport !== undefined) {\n target.namespaceImport = source.namespaceImport;\n }\n if (source.typeDefaultImport !== undefined) {\n target.typeDefaultImport = source.typeDefaultImport;\n }\n target.typeNames = [\n ...new Set([...(target.typeNames ?? []), ...(source.typeNames ?? [])]),\n ];\n if (source.typeNamespaceImport !== undefined) {\n target.typeNamespaceImport = source.typeNamespaceImport;\n }\n }\n\n static pathToFilePath(source: string): string {\n if (source.includes('/')) {\n return source.split('/').filter(Boolean).join(path.sep);\n }\n if (source.includes('\\\\')) {\n return source.split('\\\\').filter(Boolean).join(path.sep);\n }\n return source.split(path.sep).filter(Boolean).join(path.sep);\n }\n\n relativePathFromFile(file: Pick<ICodegenFile, 'path'>): string {\n let relativePath = path.posix.relative(\n path.posix.dirname(file.path),\n this.path,\n );\n if (!relativePath.startsWith('.')) {\n relativePath = `./${relativePath}`;\n }\n return relativePath;\n }\n\n relativePathToFile(file: Pick<ICodegenFile, 'path'>): string {\n let relativePath = path.posix.relative(\n path.posix.dirname(\n this.path.split(path.sep).join('/'), // normalize to posix\n ),\n file.path.split(path.sep).join('/'), // normalize to posix\n );\n if (!relativePath.startsWith('.') && relativePath !== '') {\n relativePath = `./${relativePath}`;\n }\n return relativePath;\n }\n\n selectSymbolAll(\n selector: ICodegenSymbolSelector,\n ): ReadonlyArray<ICodegenSymbolOut> {\n return this.project.selectSymbolAll(selector, this);\n }\n\n selectSymbolFirst(\n selector: ICodegenSymbolSelector,\n ): ICodegenSymbolOut | undefined {\n return this.project.selectSymbolFirst(selector, this);\n }\n\n selectSymbolFirstOrThrow(\n selector: ICodegenSymbolSelector,\n ): ICodegenSymbolOut {\n return this.project.selectSymbolFirstOrThrow(selector, this);\n }\n\n selectSymbolLast(\n selector: ICodegenSymbolSelector,\n ): ICodegenSymbolOut | undefined {\n return this.project.selectSymbolLast(selector, this);\n }\n\n get symbols(): ReadonlyArray<ICodegenSymbolOut> {\n if (!this.cache.symbols) {\n this.cache.symbols = this.renderSymbols.map(\n (id) => this.getSymbolById(id)!,\n );\n }\n return this.cache.symbols;\n }\n\n updateSymbol(\n id: number,\n symbol: Partial<ICodegenSymbolOut>,\n ): ICodegenSymbolOut {\n const existing = this.getSymbolById(id);\n if (!existing) {\n throw new Error(`symbol with id ${id} not found`);\n }\n const updated: ICodegenSymbolOut = { ...existing, ...symbol, id };\n // symbols with value can't be headless, clear redundant flag otherwise\n if (!updated.headless || updated.value) {\n delete updated.headless;\n }\n this.state.symbols.set(updated.id, updated);\n if (existing.headless && !updated.headless) {\n this.addRenderSymbol(id);\n }\n return updated;\n }\n}\n","import { CodegenFile } from '../files/file';\nimport type { ICodegenFile } from '../files/types';\nimport type { ICodegenImport } from '../imports/types';\nimport type { ICodegenMeta } from '../meta/types';\nimport type { ICodegenOutput } from '../output/types';\nimport { replaceWrappedIds } from '../renderers/renderer';\nimport type { ICodegenRenderer } from '../renderers/types';\nimport type {\n ICodegenSymbolIn,\n ICodegenSymbolOut,\n ICodegenSymbolSelector,\n} from '../symbols/types';\nimport type { ICodegenProject } from './types';\n\nexport class CodegenProject implements ICodegenProject {\n private fileId: number = 0;\n private fileIdToFile: Map<number, ICodegenFile> = new Map();\n private fileOrder: Array<ICodegenFile> = [];\n private filePathToFileId: Map<string, number> = new Map();\n private renderers: Map<string, ICodegenRenderer> = new Map();\n private selectorToSymbolIds: Map<string, Array<number>> = new Map();\n private symbolId: number = 0;\n private symbolIdToFileId: Map<number, number> = new Map();\n\n addExport(fileOrPath: ICodegenFile | string, imp: ICodegenImport): void {\n const file = this.ensureFile(fileOrPath);\n file.addExport(imp);\n }\n\n addImport(fileOrPath: ICodegenFile | string, imp: ICodegenImport): void {\n const file = this.ensureFile(fileOrPath);\n file.addImport(imp);\n }\n\n addSymbol(\n fileOrPath: ICodegenFile | string,\n symbol: ICodegenSymbolIn,\n ): ICodegenSymbolOut {\n const file = this.ensureFile(fileOrPath);\n return file.addSymbol(symbol);\n }\n\n createFile(\n path: string,\n meta: Omit<ICodegenFile['meta'], 'renderer'> & {\n /**\n * Renderer to use to render this file.\n */\n renderer?: ICodegenRenderer;\n } = {},\n ): ICodegenFile {\n const { renderer, ..._meta } = meta;\n if (renderer) {\n this.ensureRenderer(renderer);\n }\n\n const existing = this.getFileByPath(path);\n if (existing) {\n // Whoever is creating the file will override the renderer\n if (renderer?.id && renderer.id !== existing.meta.renderer) {\n existing.meta.renderer = renderer.id;\n }\n return existing;\n }\n\n const file = new CodegenFile(path, this, {\n ..._meta,\n renderer: renderer?.id,\n });\n this.fileOrder.push(file);\n this.filePathToFileId.set(path, file.id);\n this.fileIdToFile.set(file.id, file);\n return file;\n }\n\n ensureFile(fileOrPath: ICodegenFile | string): ICodegenFile {\n if (typeof fileOrPath !== 'string') {\n return fileOrPath;\n }\n const existingFile = this.getFileByPath(fileOrPath);\n if (existingFile) {\n return existingFile;\n }\n return this.createFile(fileOrPath);\n }\n\n private ensureRenderer(renderer: ICodegenRenderer): ICodegenRenderer {\n if (!this.renderers.has(renderer.id)) {\n this.renderers.set(renderer.id, renderer);\n }\n return this.renderers.get(renderer.id)!;\n }\n\n get files(): ReadonlyArray<ICodegenFile> {\n return [...this.fileOrder];\n }\n\n getAllSymbols(): ReadonlyArray<Pick<ICodegenSymbolOut, 'name'>> {\n return this.fileOrder.flatMap((file) => file.getAllSymbols());\n }\n\n getFileByPath(path: string): ICodegenFile | undefined {\n const fileId = this.filePathToFileId.get(path);\n return fileId !== undefined ? this.fileIdToFile.get(fileId) : undefined;\n }\n\n getFileBySymbolId(id: number): ICodegenFile | undefined {\n const fileId = this.symbolIdToFileId.get(id);\n return fileId !== undefined ? this.fileIdToFile.get(fileId) : undefined;\n }\n\n private getFileRenderer(file: ICodegenFile): ICodegenRenderer | undefined {\n return file.meta.renderer\n ? this.renderers.get(file.meta.renderer)\n : undefined;\n }\n\n getSymbolById(id: number): ICodegenSymbolOut | undefined {\n const file = this.getFileBySymbolId(id);\n return file?.getSymbolById(id);\n }\n\n incrementFileId(): number {\n return this.fileId++;\n }\n\n incrementSymbolId(): number {\n return this.symbolId++;\n }\n\n registerSymbol(symbol: ICodegenSymbolOut, file: ICodegenFile): void {\n this.symbolIdToFileId.set(symbol.id, file.id);\n if (symbol.selector) {\n const selector = JSON.stringify(symbol.selector);\n const ids = this.selectorToSymbolIds.get(selector) ?? [];\n ids.push(symbol.id);\n this.selectorToSymbolIds.set(selector, ids);\n }\n }\n\n render(meta?: ICodegenMeta): ReadonlyArray<ICodegenOutput> {\n const results: Array<ICodegenOutput> = [];\n this.fileOrder.forEach((file, index) => {\n const renderer = this.getFileRenderer(file);\n if (!renderer) return;\n results[index] = {\n content: renderer.renderSymbols(file, meta),\n meta: file.meta,\n path: `${file.path}${file.meta.extension ?? ''}`,\n };\n });\n this.fileOrder.forEach((file, index) => {\n const renderer = this.getFileRenderer(file);\n if (!renderer || !results[index]) return;\n const header = renderer.renderHeader(file, meta);\n const content = replaceWrappedIds(results[index].content, (symbolId) =>\n renderer.replacerFn({ file, symbolId }),\n );\n results[index].content = `${header}${content}`;\n });\n return results.filter(Boolean);\n }\n\n selectSymbolAll(\n selector: ICodegenSymbolSelector,\n file?: ICodegenFile,\n ): ReadonlyArray<ICodegenSymbolOut> {\n const ids = this.selectorToSymbolIds.get(JSON.stringify(selector)) ?? [];\n const symbols: Array<ICodegenSymbolOut> = [];\n for (const id of ids) {\n const f = this.getFileBySymbolId(id);\n if (!f || (file && file !== f)) continue;\n const symbol = f.getSymbolById(id);\n if (!symbol) continue;\n symbols.push(symbol);\n }\n return symbols;\n }\n\n selectSymbolFirst(\n selector: ICodegenSymbolSelector,\n file?: ICodegenFile,\n ): ICodegenSymbolOut | undefined {\n const symbols = this.selectSymbolAll(selector, file);\n return symbols[0];\n }\n\n selectSymbolFirstOrThrow(\n selector: ICodegenSymbolSelector,\n file?: ICodegenFile,\n ): ICodegenSymbolOut {\n const symbol = this.selectSymbolFirst(selector, file);\n if (!symbol)\n throw new Error(\n `symbol for selector not found: ${JSON.stringify(selector)}`,\n );\n return symbol;\n }\n\n selectSymbolLast(\n selector: ICodegenSymbolSelector,\n file?: ICodegenFile,\n ): ICodegenSymbolOut | undefined {\n const symbols = this.selectSymbolAll(selector, file);\n return symbols[symbols.length - 1];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/bindings/utils.ts","../src/bimap/bimap.ts","../src/files/registry.ts","../src/renderer/utils.ts","../src/symbols/registry.ts","../src/project/project.ts"],"names":["createBinding","file","modulePath","symbol","symbolFile","names","typeNames","binding","name","fileResolvedName","symbolFileResolvedName","typeName","mergeBindings","target","source","BiMap","key","value","oldValue","oldKey","FileRegistry","fileIdOrSelector","selector","id","symbolIdOrSelector","result","hasOtherKeys","wrapId","symbolId","unwrapId","wrappedId","createPlaceholderRegExp","renderIds","replacerFn","match","SymbolRegistry","exportFrom","externalSourceSymbol","Project","defaultFileName","fileName","renderers","root","symbolIdToFileIds","exportSelector","exportFile","filePath","extension","path","dirs","meta","files","renderer","fileId","content","fileIds"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { IFileOut } from '../files/types';\nimport type { ISymbolOut } from '../symbols/types';\nimport type { IBinding } from './types';\n\nexport const createBinding = ({\n file,\n modulePath,\n symbol,\n symbolFile,\n}: {\n file: IFileOut;\n modulePath: string;\n symbol: ISymbolOut;\n symbolFile: IFileOut;\n}): IBinding => {\n const names: Array<string> = [];\n const typeNames: Array<string> = [];\n const binding: IBinding & Pick<Required<IBinding>, 'aliases' | 'from'> = {\n aliases: {},\n from: modulePath,\n };\n if (symbol.meta?.importKind) {\n if (symbol.meta.importKind === 'default') {\n binding.defaultBinding = symbol.placeholder;\n if (symbol.meta.kind === 'type') {\n binding.typeDefaultBinding = true;\n }\n } else if (symbol.meta.importKind === 'namespace') {\n binding.namespaceBinding = symbol.placeholder;\n if (symbol.meta.kind === 'type') {\n binding.typeNamespaceBinding = true;\n }\n }\n }\n // default to named binding\n if (\n symbol.meta?.importKind === 'named' ||\n (!names.length && !binding.defaultBinding && !binding.namespaceBinding)\n ) {\n let name = symbol.placeholder;\n const fileResolvedName = file.resolvedNames.get(symbol.id);\n if (fileResolvedName) {\n const symbolFileResolvedName = symbolFile.resolvedNames.get(symbol.id);\n if (symbolFileResolvedName) {\n if (symbolFileResolvedName !== fileResolvedName) {\n name = symbolFileResolvedName;\n binding.aliases[name] = fileResolvedName;\n }\n } else if (symbol.name && fileResolvedName !== symbol.name) {\n name = symbol.name;\n binding.aliases[name] = symbol.placeholder;\n }\n }\n names.push(name);\n if (symbol.meta?.kind === 'type') {\n typeNames.push(name);\n }\n }\n // cast type names to names to allow for cleaner API,\n // otherwise users would have to define the same values twice\n for (const typeName of typeNames) {\n if (!names.includes(typeName)) {\n names.push(typeName);\n }\n }\n binding.names = names;\n binding.typeNames = typeNames;\n return binding;\n};\n\nexport const mergeBindings = (target: IBinding, source: IBinding): void => {\n target.aliases = { ...target.aliases, ...source.aliases };\n if (source.defaultBinding !== undefined) {\n target.defaultBinding = source.defaultBinding;\n }\n target.names = [\n ...new Set([...(target.names ?? []), ...(source.names ?? [])]),\n ];\n if (source.namespaceBinding !== undefined) {\n target.namespaceBinding = source.namespaceBinding;\n }\n if (source.typeDefaultBinding !== undefined) {\n target.typeDefaultBinding = source.typeDefaultBinding;\n }\n target.typeNames = [\n ...new Set([...(target.typeNames ?? []), ...(source.typeNames ?? [])]),\n ];\n if (source.typeNamespaceBinding !== undefined) {\n target.typeNamespaceBinding = source.typeNamespaceBinding;\n }\n};\n","import type { IBiMap } from './types';\n\nexport class BiMap<Key, Value> implements IBiMap<Key, Value> {\n private map = new Map<Key, Value>();\n private reverse = new Map<Value, Key>();\n\n delete(key: Key): boolean {\n const value = this.map.get(key);\n if (value !== undefined) {\n this.reverse.delete(value);\n }\n return this.map.delete(key);\n }\n\n deleteValue(value: Value): boolean {\n const key = this.reverse.get(value);\n if (key !== undefined) {\n this.map.delete(key);\n }\n return this.reverse.delete(value);\n }\n\n entries(): IterableIterator<[Key, Value]> {\n return this.map.entries();\n }\n\n get(key: Key): Value | undefined {\n return this.map.get(key);\n }\n\n getKey(value: Value): Key | undefined {\n return this.reverse.get(value);\n }\n\n hasKey(key: Key): boolean {\n return this.map.has(key);\n }\n\n hasValue(value: Value): boolean {\n return this.reverse.has(value);\n }\n\n keys(): IterableIterator<Key> {\n return this.map.keys();\n }\n\n set(key: Key, value: Value): this {\n const oldValue = this.map.get(key);\n if (oldValue !== undefined && oldValue !== value) {\n this.reverse.delete(oldValue);\n }\n const oldKey = this.reverse.get(value);\n if (oldKey !== undefined && oldKey !== key) {\n this.map.delete(oldKey);\n }\n this.map.set(key, value);\n this.reverse.set(value, key);\n return this;\n }\n\n get size(): number {\n return this.map.size;\n }\n\n values(): IterableIterator<Value> {\n return this.map.values();\n }\n\n [Symbol.iterator](): IterableIterator<[Key, Value]> {\n return this.map[Symbol.iterator]();\n }\n}\n","import { BiMap } from '../bimap/bimap';\nimport type { ISelector } from '../selectors/types';\nimport type { IFileIn, IFileOut, IFileRegistry } from './types';\n\nexport class FileRegistry implements IFileRegistry {\n private _id: number = 0;\n private referenceOrder: Set<number> = new Set();\n private registerOrder: Set<number> = new Set();\n private selectorToId: Map<string, number> = new Map();\n private values: Map<number, IFileOut> = new Map();\n\n get(fileIdOrSelector: number | ISelector): IFileOut | undefined {\n const symbol = this.idOrSelector(fileIdOrSelector);\n\n if (symbol.id !== undefined) {\n return this.values.get(symbol.id);\n }\n\n const selector =\n symbol.selector !== undefined\n ? JSON.stringify(symbol.selector)\n : undefined;\n\n if (selector) {\n const id = this.selectorToId.get(selector);\n if (id !== undefined) {\n return this.values.get(id);\n }\n }\n\n return;\n }\n\n get id(): number {\n return this._id++;\n }\n\n private idOrSelector(\n symbolIdOrSelector: number | ISelector,\n ): Pick<IFileIn, 'id' | 'selector'> {\n return typeof symbolIdOrSelector === 'number'\n ? { id: symbolIdOrSelector }\n : { selector: symbolIdOrSelector };\n }\n\n reference(fileIdOrSelector: number | ISelector): IFileOut {\n const file = this.idOrSelector(fileIdOrSelector);\n return this.register(file);\n }\n\n *referenced(): IterableIterator<IFileOut> {\n for (const id of this.referenceOrder.values()) {\n yield this.values.get(id)!;\n }\n }\n\n register(file: IFileIn): IFileOut {\n if (file.id !== undefined) {\n const result = this.values.get(file.id);\n if (!result) {\n throw new Error(\n `File with ID ${file.id} not found. To register a new file, leave the ID undefined.`,\n );\n }\n return result;\n }\n\n const hasOtherKeys = Object.keys(file).some(\n (key) => !['id', 'selector'].includes(key),\n );\n\n let result: IFileOut | undefined;\n\n const selector =\n file.selector !== undefined ? JSON.stringify(file.selector) : undefined;\n if (selector) {\n const id = this.selectorToId.get(selector);\n if (id !== undefined) {\n result = this.values.get(id);\n if (!result) {\n throw new Error(\n `File with ID ${id} not found. The selector ${selector} matched an ID, but there was no result. This is likely an issue with the application logic.`,\n );\n }\n if (!hasOtherKeys) {\n return result;\n }\n }\n }\n\n const id = result?.id !== undefined ? result.id : this.id;\n result = {\n ...result,\n ...file, // clone to avoid mutation\n id,\n resolvedNames: result?.resolvedNames ?? new BiMap(),\n symbols: result?.symbols ?? {\n body: [],\n exports: [],\n imports: [],\n },\n };\n this.values.set(id, result);\n\n if (hasOtherKeys) {\n this.registerOrder.add(id);\n } else {\n this.referenceOrder.add(id);\n }\n\n if (selector) {\n this.selectorToId.set(selector, id);\n }\n\n return result;\n }\n\n *registered(): IterableIterator<IFileOut> {\n for (const id of this.registerOrder.values()) {\n yield this.values.get(id)!;\n }\n }\n}\n","/**\n * Wraps an ID in namespace to avoid collisions when replacing it.\n *\n * @param symbolId Stringified symbol ID to use.\n * @returns The wrapped placeholder ID.\n */\nexport const wrapId = (symbolId: string): string => `_heyapi_${symbolId}_`;\n\n/**\n * Unwraps an ID from namespace.\n *\n * @param wrappedId The wrapped placeholder ID.\n * @returns Stringified ID to use.\n */\nconst unwrapId = (wrappedId: string): string =>\n wrappedId.slice('_heyapi_'.length, -1);\n\n/**\n * Returns a RegExp instance to match ID placeholders.\n *\n * @returns RegExp instance to match ID placeholders.\n */\nconst createPlaceholderRegExp = (): RegExp => new RegExp(wrapId('\\\\d+'), 'g');\n\n/**\n *\n * @param source The source string to replace.\n * @param replacerFn Accepts a symbol ID, returns resolved symbol name.\n * @returns The replaced source string.\n */\nexport const renderIds = (\n source: string,\n replacerFn: (symbolId: number) => string | undefined,\n): string =>\n source.replace(createPlaceholderRegExp(), (match) => {\n const symbolId = Number.parseInt(unwrapId(match), 10);\n return replacerFn(symbolId) || match;\n });\n","import { wrapId } from '../renderer/utils';\nimport type { ISelector } from '../selectors/types';\nimport type { ISymbolIn, ISymbolOut, ISymbolRegistry } from './types';\n\nexport class SymbolRegistry implements ISymbolRegistry {\n private _id: number = 0;\n private nodes: Map<number, unknown> = new Map();\n private registerOrder: Set<number> = new Set();\n private selectorToId: Map<string, number> = new Map();\n private values: Map<number, ISymbolOut> = new Map();\n\n get(symbolIdOrSelector: number | ISelector): ISymbolOut | undefined {\n const symbol = this.idOrSelector(symbolIdOrSelector);\n\n if (symbol.id !== undefined) {\n return this.values.get(symbol.id);\n }\n\n const selector =\n symbol.selector !== undefined\n ? JSON.stringify(symbol.selector)\n : undefined;\n\n if (selector) {\n const id = this.selectorToId.get(selector);\n if (id !== undefined) {\n return this.values.get(id);\n }\n }\n\n return;\n }\n\n getValue(symbolId: number): unknown {\n return this.nodes.get(symbolId);\n }\n\n hasValue(symbolId: number): boolean {\n return this.nodes.has(symbolId);\n }\n\n get id(): number {\n return this._id++;\n }\n\n private idOrSelector(\n symbolIdOrSelector: number | ISelector,\n ): Pick<ISymbolIn, 'id' | 'selector'> {\n return typeof symbolIdOrSelector === 'number'\n ? { id: symbolIdOrSelector }\n : { selector: symbolIdOrSelector };\n }\n\n reference(symbolIdOrSelector: number | ISelector): ISymbolOut {\n const symbol = this.idOrSelector(symbolIdOrSelector);\n return this.register(symbol);\n }\n\n register(symbol: ISymbolIn): ISymbolOut {\n if (symbol.id !== undefined) {\n const result = this.values.get(symbol.id);\n if (!result) {\n throw new Error(\n `Symbol with ID ${symbol.id} not found. To register a new symbol, leave the ID undefined.`,\n );\n }\n return result;\n }\n\n const hasOtherKeys = Object.keys(symbol).some(\n (key) => !['id', 'selector'].includes(key),\n );\n\n let result: ISymbolOut | undefined;\n\n const selector =\n symbol.selector !== undefined\n ? JSON.stringify(symbol.selector)\n : undefined;\n if (selector) {\n const id = this.selectorToId.get(selector);\n if (id !== undefined) {\n result = this.values.get(id);\n if (!result) {\n throw new Error(\n `Symbol with ID ${id} not found. The selector ${selector} matched an ID, but there was no result. This is likely an issue with the application logic.`,\n );\n }\n if (!hasOtherKeys) {\n return result;\n }\n }\n }\n\n const id = result?.id !== undefined ? result.id : this.id;\n const exportFrom: Array<string> = result?.exportFrom\n ? [...result.exportFrom]\n : [];\n if (symbol.exportFrom) {\n exportFrom.push(...symbol.exportFrom);\n }\n result = {\n ...result,\n ...symbol, // clone to avoid mutation\n exportFrom,\n id,\n placeholder:\n result?.placeholder ?? symbol.placeholder ?? wrapId(String(id)),\n };\n this.values.set(id, result);\n\n if (hasOtherKeys) {\n this.registerOrder.add(id);\n }\n\n if (selector) {\n this.selectorToId.set(selector, id);\n }\n\n return result;\n }\n\n *registered(): IterableIterator<ISymbolOut> {\n for (const id of this.registerOrder.values()) {\n yield this.values.get(id)!;\n }\n }\n\n setValue(symbolId: number, value: unknown): Map<number, unknown> {\n return this.nodes.set(symbolId, value);\n }\n}\n","import path from 'node:path';\n\nimport type { IProjectRenderMeta } from '../extensions/types';\nimport { FileRegistry } from '../files/registry';\nimport type { IFileOut } from '../files/types';\nimport type { IOutput } from '../output/types';\nimport type { IRenderer } from '../renderer/types';\nimport type { ISelector } from '../selectors/types';\nimport { SymbolRegistry } from '../symbols/registry';\nimport type { ISymbolOut } from '../symbols/types';\nimport type { IProject } from './types';\n\nconst externalSourceSymbol = '@';\n\nexport class Project implements IProject {\n private symbolIdToFileIds: Map<number, Set<number>> = new Map();\n\n readonly defaultFileName: string;\n readonly files = new FileRegistry();\n readonly fileName?: (name: string) => string;\n readonly renderers: Record<string, IRenderer> = {};\n readonly root: string;\n readonly symbols = new SymbolRegistry();\n\n constructor({\n defaultFileName,\n fileName,\n renderers,\n root,\n }: Pick<IProject, 'defaultFileName' | 'fileName' | 'renderers' | 'root'>) {\n this.defaultFileName = defaultFileName ?? 'main';\n this.fileName = typeof fileName === 'string' ? () => fileName : fileName;\n this.renderers = renderers;\n this.root = root;\n }\n\n private getRenderer(file: IFileOut): IRenderer | undefined {\n return file.extension ? this.renderers[file.extension] : undefined;\n }\n\n private prepareFiles(): void {\n // TODO: infer extension from symbols\n const extension = '.ts';\n for (const symbol of this.symbols.registered()) {\n const selector = this.symbolToFileSelector(symbol);\n const file = this.files.reference(selector);\n file.symbols.body.push(symbol.id);\n // update symbol->files map\n const symbolIdToFileIds =\n this.symbolIdToFileIds.get(symbol.id) ?? new Set();\n symbolIdToFileIds.add(file.id);\n this.symbolIdToFileIds.set(symbol.id, symbolIdToFileIds);\n // update re-exports\n for (const exportFrom of symbol.exportFrom) {\n const exportSelector = [exportFrom];\n const exportFile = this.files.reference(exportSelector);\n if (exportFile.id !== file.id) {\n exportFile.symbols.exports.push(symbol.id);\n }\n }\n }\n for (const file of this.files.referenced()) {\n if (!file.selector) continue;\n if (file.selector[0] === externalSourceSymbol) {\n const filePath = file.selector[1];\n if (!filePath) {\n this.files.register({\n external: true,\n selector: file.selector,\n });\n continue;\n }\n const extension = path.extname(filePath);\n if (!extension) {\n this.files.register({\n external: true,\n path: filePath,\n selector: file.selector,\n });\n continue;\n }\n this.files.register({\n extension,\n external: true,\n path: filePath,\n selector: file.selector,\n });\n continue;\n }\n const dirs = file.selector.slice(0, -1);\n let name = file.selector[file.selector.length - 1]!;\n name = this.fileName?.(name) || name;\n this.files.register({\n extension,\n name,\n path: path.resolve(this.root, ...dirs, `${name}${extension}`),\n selector: file.selector,\n });\n }\n\n // TODO: track symbol dependencies and inject imports into files\n // based on symbol references so the render step can just render\n }\n\n render(meta?: IProjectRenderMeta): ReadonlyArray<IOutput> {\n this.prepareFiles();\n const files: Map<number, IOutput> = new Map();\n for (const file of this.files.registered()) {\n if (file.external || !file.path) continue;\n const renderer = this.getRenderer(file);\n if (!renderer) continue;\n files.set(file.id, {\n content: renderer.renderSymbols(file, this, meta),\n path: file.path,\n });\n }\n for (const [fileId, value] of files.entries()) {\n const file = this.files.get(fileId)!;\n const renderer = this.getRenderer(file)!;\n const content = renderer.renderFile(value.content, file, this, meta);\n if (content) {\n files.set(file.id, { ...value, content });\n } else {\n files.delete(file.id);\n }\n }\n return Array.from(files.values());\n }\n\n symbolIdToFiles(symbolId: number): ReadonlyArray<IFileOut> {\n const fileIds = this.symbolIdToFileIds.get(symbolId);\n return Array.from(fileIds ?? []).map((fileId) => this.files.get(fileId)!);\n }\n\n private symbolToFileSelector(symbol: ISymbolOut): ISelector {\n if (symbol.external) {\n return [externalSourceSymbol, symbol.external];\n }\n const filePath = symbol.getFilePath?.(symbol);\n if (filePath) {\n return filePath.split('/');\n }\n return [this.defaultFileName];\n }\n}\n"]}
|