diff --git a/README.md b/README.md index c93e8e5..7a0780a 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,19 @@ Create an `intrig.config.json` file in your project root: ``` You can set the generator to either "react" or "next" depending on your target framework. +Install the matching binding plugin (e.g. `@intrig/react-binding`) so Intrig can discover it in `node_modules`. +Each plugin's `package.json` must declare the plugin type: + +```json +{ + "intrig": { + "plugin": { + "type": "generator", + "for": "react" + } + } +} +``` ### CLI Commands diff --git a/app/intrig/src/app/cli/cli.module.ts b/app/intrig/src/app/cli/cli.module.ts index f47773f..243d590 100644 --- a/app/intrig/src/app/cli/cli.module.ts +++ b/app/intrig/src/app/cli/cli.module.ts @@ -8,15 +8,18 @@ import {SourcesCommand} from "./commands/sources.command"; import {CommonModule} from "common"; import {DiscoveryModule} from "../discovery/discovery.module"; import {HttpModule} from "@nestjs/axios"; -import {NextCliModule, NextCliService} from "next-binding"; import {GENERATORS} from "./tokens"; import {SearchCommand} from "./commands/search.command"; -import {ReactCliModule, ReactCliService} from "react-binding"; +import {loadInstalledPlugins} from "../plugins/plugin-loader"; import {PrebuildCommand} from "./commands/prebuild.command"; import {PostbuildCommand} from "./commands/postbuild.command"; +const PLUGINS = loadInstalledPlugins(); +const cliModules = PLUGINS.map(p => p.plugin.cliModule); +const cliServices = PLUGINS.map(p => p.plugin.cliService); + @Module({ - imports: [CommonModule, DiscoveryModule, HttpModule, NextCliModule, ReactCliModule], + imports: [CommonModule, DiscoveryModule, HttpModule, ...cliModules], providers: [ ProcessManagerService, ...DeamonCommand.registerWithSubCommands(), @@ -28,12 +31,11 @@ import {PostbuildCommand} from "./commands/postbuild.command"; HttpModule, PrebuildCommand, PostbuildCommand, + ...cliServices, { provide: GENERATORS, - inject: [NextCliService, ReactCliService], - useFactory(nextCliService: NextCliService, reactCliService: ReactCliService) { - return [nextCliService, reactCliService] - } + inject: cliServices, + useFactory: (...services: any[]) => services } ], }) diff --git a/app/intrig/src/app/deamon/deamon.module.ts b/app/intrig/src/app/deamon/deamon.module.ts index 4cad250..ff23b9a 100644 --- a/app/intrig/src/app/deamon/deamon.module.ts +++ b/app/intrig/src/app/deamon/deamon.module.ts @@ -1,6 +1,6 @@ import { Module } from '@nestjs/common'; import { SourcesController } from './controllers/sources.controller'; -import { CommonModule } from 'common'; +import { CommonModule } from '@intrig/common'; import { IntrigConfigService } from './services/intrig-config.service'; import { OpenapiService } from './services/openapi.service'; import { OperationsController } from './controllers/operations.controller'; diff --git a/app/intrig/src/app/deamon/generator/generator.module.ts b/app/intrig/src/app/deamon/generator/generator.module.ts index fd3b0f3..e85be43 100644 --- a/app/intrig/src/app/deamon/generator/generator.module.ts +++ b/app/intrig/src/app/deamon/generator/generator.module.ts @@ -1,32 +1,33 @@ import {DynamicModule, Module} from '@nestjs/common'; import {IntrigConfigService} from "../services/intrig-config.service"; -import {ReactBindingService} from "react-binding"; -import {IntrigNextBindingService} from "next-binding"; -import {GeneratorBinding} from "common"; +import {GeneratorBinding} from "@intrig/common"; +import {loadInstalledPlugins, LoadedPlugin} from "../../plugins/plugin-loader"; @Module({}) export class GeneratorModule { - static register(): DynamicModule { + static register(plugins: LoadedPlugin[] = loadInstalledPlugins()): DynamicModule { + const bindingModules = plugins.map(p => p.plugin.bindingModule); + const bindingServices = plugins.map(p => p.plugin.bindingService); return { module: GeneratorModule, - imports: [], + imports: [...bindingModules], providers: [ IntrigConfigService, - ReactBindingService, - IntrigNextBindingService, + ...bindingServices, { provide: GeneratorBinding, - inject: [IntrigConfigService, ReactBindingService, IntrigNextBindingService], - useFactory: (configService: IntrigConfigService, reactBinding: ReactBindingService, nextBinding: IntrigNextBindingService): GeneratorBinding => { - try { - switch (configService.get().generator) { - case "react": - return reactBinding; - case "next": - return nextBinding; - } - } catch (e) { /* empty */ } - return reactBinding; + inject: [IntrigConfigService, ...bindingServices], + useFactory: (configService: IntrigConfigService, ...bindings: GeneratorBinding[]): GeneratorBinding => { + const generator = configService.get().generator; + const matches = plugins.filter(p => p.config?.type === 'generator' && (p.plugin.name === generator || p.config?.for === generator)); + if (matches.length > 1) { + throw new Error(`Generator plugin conflict for "${generator}"`); + } + if (matches.length === 0) { + throw new Error(`Generator binding not found for "${generator}"`); + } + const idx = plugins.indexOf(matches[0]); + return bindings[idx]; } } ], diff --git a/app/intrig/src/app/deamon/services/data-search.service.ts b/app/intrig/src/app/deamon/services/data-search.service.ts index 730d32e..be6e1a8 100644 --- a/app/intrig/src/app/deamon/services/data-search.service.ts +++ b/app/intrig/src/app/deamon/services/data-search.service.ts @@ -1,5 +1,6 @@ import { Injectable, Logger } from '@nestjs/common'; -import {GeneratorBinding, Page, ResourceDescriptor, RestData} from "common"; +import {GeneratorBinding} from "@intrig/common"; +import {Page, ResourceDescriptor, RestData} from "common"; import {SearchService} from "./search.service"; @Injectable() diff --git a/app/intrig/src/app/deamon/services/operations.service.ts b/app/intrig/src/app/deamon/services/operations.service.ts index c8c8ae1..a215dbe 100644 --- a/app/intrig/src/app/deamon/services/operations.service.ts +++ b/app/intrig/src/app/deamon/services/operations.service.ts @@ -1,6 +1,7 @@ import {Injectable, Logger} from '@nestjs/common'; +import {GeneratorBinding} from "@intrig/common"; import { - GeneratorBinding, IntrigSourceConfig, + IntrigSourceConfig, PackageManagerService, ResourceDescriptor, RestData, Schema, SyncEventContext, diff --git a/app/intrig/src/app/deamon/services/search.service.ts b/app/intrig/src/app/deamon/services/search.service.ts index d68fa49..258baba 100644 --- a/app/intrig/src/app/deamon/services/search.service.ts +++ b/app/intrig/src/app/deamon/services/search.service.ts @@ -1,6 +1,6 @@ import {Injectable, OnModuleInit} from '@nestjs/common'; import MiniSearch from 'minisearch'; -import {isRestDescriptor, isSchemaDescriptor, ResourceDescriptor, RestData, Schema} from 'common'; +import {isRestDescriptor, isSchemaDescriptor, ResourceDescriptor, RestData, Schema} from '@intrig/common'; import {IntrigConfigService} from "./intrig-config.service"; import {IntrigOpenapiService} from "openapi-source"; import {SourceStats} from "../models/source-stats"; diff --git a/app/intrig/src/app/plugins/plugin-loader.ts b/app/intrig/src/app/plugins/plugin-loader.ts new file mode 100644 index 0000000..d3d27b6 --- /dev/null +++ b/app/intrig/src/app/plugins/plugin-loader.ts @@ -0,0 +1,61 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { createRequire } from 'module'; +import { Logger } from '@nestjs/common'; +import { IntrigPlugin } from '@intrig/common'; + +export interface LoadedPlugin { + plugin: IntrigPlugin; + config: any; +} + +const require = createRequire(import.meta.url); + +export function loadInstalledPlugins(rootDir = process.cwd()): LoadedPlugin[] { + const logger = new Logger('PluginLoader'); + const nodeModules = path.join(rootDir, 'node_modules'); + if (!fs.existsSync(nodeModules)) { + logger.warn(`node_modules directory not found`); + return []; + } + + const packages: string[] = []; + for (const entry of fs.readdirSync(nodeModules, { withFileTypes: true })) { + const entryPath = path.join(nodeModules, entry.name); + if (!entry.isDirectory()) continue; + if (entry.name.startsWith('@')) { + for (const sub of fs.readdirSync(entryPath, { withFileTypes: true })) { + if (sub.isDirectory()) { + packages.push(`${entry.name}/${sub.name}`); + } + } + } else { + packages.push(entry.name); + } + } + + const plugins: LoadedPlugin[] = []; + + for (const pkgName of packages) { + try { + const pkgJsonPath = path.join(nodeModules, pkgName, 'package.json'); + if (!fs.existsSync(pkgJsonPath)) continue; + const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8')); + const pluginCfg = pkgJson.intrig?.plugin; + if (!pluginCfg) continue; + + // eslint-disable-next-line @typescript-eslint/no-var-requires + const mod = require(path.join(nodeModules, pkgName)); + const plugin = (mod.default ?? mod.plugin) as IntrigPlugin | undefined; + if (plugin) { + plugins.push({ plugin, config: pluginCfg }); + } else { + logger.warn(`No plugin export found in ${pkgName}`); + } + } catch (e) { + logger.error(`Failed to load plugin ${pkgName}`, e as any); + } + } + + return plugins; +} diff --git a/app/intrig/tsconfig.app.json b/app/intrig/tsconfig.app.json index e51c79d..349fa90 100644 --- a/app/intrig/tsconfig.app.json +++ b/app/intrig/tsconfig.app.json @@ -28,7 +28,7 @@ "path": "../../lib/next-binding/tsconfig.lib.json" }, { - "path": "../../lib/common/tsconfig.lib.json" + "path": "../../lib/common-bindings/tsconfig.lib.json" } ] } diff --git a/app/intrig/tsconfig.json b/app/intrig/tsconfig.json index 2df6c3b..1641c2c 100644 --- a/app/intrig/tsconfig.json +++ b/app/intrig/tsconfig.json @@ -13,7 +13,7 @@ "path": "../../lib/next-binding" }, { - "path": "../../lib/common" + "path": "../../lib/common-bindings" }, { "path": "./tsconfig.app.json" diff --git a/lib/common/package.json b/lib/common-bindings/package.json similarity index 85% rename from lib/common/package.json rename to lib/common-bindings/package.json index d59c196..21d4d57 100644 --- a/lib/common/package.json +++ b/lib/common-bindings/package.json @@ -1,7 +1,7 @@ { - "name": "common", + "name": "@intrig/common", "version": "0.0.1", - "private": true, + "type": "module", "main": "./src/index.ts", "types": "./src/index.ts", "exports": { diff --git a/lib/common-bindings/project.json b/lib/common-bindings/project.json new file mode 100644 index 0000000..8f69cfc --- /dev/null +++ b/lib/common-bindings/project.json @@ -0,0 +1,14 @@ +{ + "name": "common-bindings", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "lib/common-bindings/src", + "projectType": "library", + "tags": [], + "targets": { + "nx-release-publish": { + "executor": "@nx/js:release-publish", + "options": {"packageRoot": "dist/lib/common-bindings"}, + "dependsOn": ["^build"] + } + } +} diff --git a/lib/common/src/index.ts b/lib/common-bindings/src/index.ts similarity index 78% rename from lib/common/src/index.ts rename to lib/common-bindings/src/index.ts index 060c7cd..c637139 100644 --- a/lib/common/src/index.ts +++ b/lib/common-bindings/src/index.ts @@ -1,3 +1,6 @@ +export * from './lib/generator-binding'; +export * from './lib/plugin.interface'; + // Common export * from './lib/common.module'; export * from './lib/spec-management.service'; @@ -5,9 +8,8 @@ export * from './lib/source-management.service'; export * from './lib/package-manager.service'; // Interfaces -export * from './lib/interfaces/generator.interface'; -export * from './lib/interfaces/generator-cli.interface' -export * from './lib/interfaces/page.interface' +export * from './lib/interfaces/generator-cli.interface'; +export * from './lib/interfaces/page.interface'; // Models export * from './lib/model/content-types'; @@ -29,4 +31,4 @@ export * from './lib/template/md-literal'; // Utils export * from './lib/util/change-case'; -export type { Differences } from './lib/util/openapi3-diff' \ No newline at end of file +export type { Differences } from './lib/util/openapi3-diff'; diff --git a/lib/common/src/lib/common.module.ts b/lib/common-bindings/src/lib/common.module.ts similarity index 100% rename from lib/common/src/lib/common.module.ts rename to lib/common-bindings/src/lib/common.module.ts diff --git a/lib/common-bindings/src/lib/generator-binding.ts b/lib/common-bindings/src/lib/generator-binding.ts new file mode 100644 index 0000000..78ad276 --- /dev/null +++ b/lib/common-bindings/src/lib/generator-binding.ts @@ -0,0 +1,9 @@ +export abstract class GeneratorBinding { + abstract generateGlobal(...args: any[]): Promise; + abstract generateSource(...args: any[]): Promise; + abstract getLibName(): string; + abstract postBuild(): Promise; + abstract getSchemaDocumentation(...args: any[]): Promise; + abstract getEndpointDocumentation(...args: any[]): Promise; + getRestOptions(): any { return {}; } +} diff --git a/lib/common/src/lib/interfaces/generator-cli.interface.ts b/lib/common-bindings/src/lib/interfaces/generator-cli.interface.ts similarity index 100% rename from lib/common/src/lib/interfaces/generator-cli.interface.ts rename to lib/common-bindings/src/lib/interfaces/generator-cli.interface.ts diff --git a/lib/common/src/lib/interfaces/page.interface.ts b/lib/common-bindings/src/lib/interfaces/page.interface.ts similarity index 100% rename from lib/common/src/lib/interfaces/page.interface.ts rename to lib/common-bindings/src/lib/interfaces/page.interface.ts diff --git a/lib/common/src/lib/model/common.ts b/lib/common-bindings/src/lib/model/common.ts similarity index 100% rename from lib/common/src/lib/model/common.ts rename to lib/common-bindings/src/lib/model/common.ts diff --git a/lib/common/src/lib/model/content-types.ts b/lib/common-bindings/src/lib/model/content-types.ts similarity index 100% rename from lib/common/src/lib/model/content-types.ts rename to lib/common-bindings/src/lib/model/content-types.ts diff --git a/lib/common/src/lib/model/event-context.ts b/lib/common-bindings/src/lib/model/event-context.ts similarity index 100% rename from lib/common/src/lib/model/event-context.ts rename to lib/common-bindings/src/lib/model/event-context.ts diff --git a/lib/common/src/lib/model/generate-event.ts b/lib/common-bindings/src/lib/model/generate-event.ts similarity index 100% rename from lib/common/src/lib/model/generate-event.ts rename to lib/common-bindings/src/lib/model/generate-event.ts diff --git a/lib/common/src/lib/model/intrig-config.ts b/lib/common-bindings/src/lib/model/intrig-config.ts similarity index 100% rename from lib/common/src/lib/model/intrig-config.ts rename to lib/common-bindings/src/lib/model/intrig-config.ts diff --git a/lib/common/src/lib/model/intrig-source-config.ts b/lib/common-bindings/src/lib/model/intrig-source-config.ts similarity index 100% rename from lib/common/src/lib/model/intrig-source-config.ts rename to lib/common-bindings/src/lib/model/intrig-source-config.ts diff --git a/lib/common/src/lib/model/resource-descriptor.ts b/lib/common-bindings/src/lib/model/resource-descriptor.ts similarity index 100% rename from lib/common/src/lib/model/resource-descriptor.ts rename to lib/common-bindings/src/lib/model/resource-descriptor.ts diff --git a/lib/common/src/lib/model/rest-resource-data.ts b/lib/common-bindings/src/lib/model/rest-resource-data.ts similarity index 100% rename from lib/common/src/lib/model/rest-resource-data.ts rename to lib/common-bindings/src/lib/model/rest-resource-data.ts diff --git a/lib/common/src/lib/model/schema.ts b/lib/common-bindings/src/lib/model/schema.ts similarity index 100% rename from lib/common/src/lib/model/schema.ts rename to lib/common-bindings/src/lib/model/schema.ts diff --git a/lib/common/src/lib/model/sync-event.ts b/lib/common-bindings/src/lib/model/sync-event.ts similarity index 100% rename from lib/common/src/lib/model/sync-event.ts rename to lib/common-bindings/src/lib/model/sync-event.ts diff --git a/lib/common/src/lib/package-manager.service.ts b/lib/common-bindings/src/lib/package-manager.service.ts similarity index 100% rename from lib/common/src/lib/package-manager.service.ts rename to lib/common-bindings/src/lib/package-manager.service.ts diff --git a/lib/common-bindings/src/lib/plugin.interface.ts b/lib/common-bindings/src/lib/plugin.interface.ts new file mode 100644 index 0000000..b39b838 --- /dev/null +++ b/lib/common-bindings/src/lib/plugin.interface.ts @@ -0,0 +1,7 @@ +export interface IntrigPlugin { + name: string; + bindingModule: any; + bindingService: any; + cliModule: any; + cliService: any; +} diff --git a/lib/common/src/lib/source-management.service.ts b/lib/common-bindings/src/lib/source-management.service.ts similarity index 100% rename from lib/common/src/lib/source-management.service.ts rename to lib/common-bindings/src/lib/source-management.service.ts diff --git a/lib/common/src/lib/spec-management.service.ts b/lib/common-bindings/src/lib/spec-management.service.ts similarity index 100% rename from lib/common/src/lib/spec-management.service.ts rename to lib/common-bindings/src/lib/spec-management.service.ts diff --git a/lib/common/src/lib/template/json-literal.ts b/lib/common-bindings/src/lib/template/json-literal.ts similarity index 100% rename from lib/common/src/lib/template/json-literal.ts rename to lib/common-bindings/src/lib/template/json-literal.ts diff --git a/lib/common/src/lib/template/md-literal.ts b/lib/common-bindings/src/lib/template/md-literal.ts similarity index 100% rename from lib/common/src/lib/template/md-literal.ts rename to lib/common-bindings/src/lib/template/md-literal.ts diff --git a/lib/common/src/lib/template/template-util.ts b/lib/common-bindings/src/lib/template/template-util.ts similarity index 100% rename from lib/common/src/lib/template/template-util.ts rename to lib/common-bindings/src/lib/template/template-util.ts diff --git a/lib/common/src/lib/template/ts-literal.ts b/lib/common-bindings/src/lib/template/ts-literal.ts similarity index 100% rename from lib/common/src/lib/template/ts-literal.ts rename to lib/common-bindings/src/lib/template/ts-literal.ts diff --git a/lib/common/src/lib/util/change-case.ts b/lib/common-bindings/src/lib/util/change-case.ts similarity index 100% rename from lib/common/src/lib/util/change-case.ts rename to lib/common-bindings/src/lib/util/change-case.ts diff --git a/lib/common/src/lib/util/openapi3-diff.spec.ts b/lib/common-bindings/src/lib/util/openapi3-diff.spec.ts similarity index 100% rename from lib/common/src/lib/util/openapi3-diff.spec.ts rename to lib/common-bindings/src/lib/util/openapi3-diff.spec.ts diff --git a/lib/common/src/lib/util/openapi3-diff.ts b/lib/common-bindings/src/lib/util/openapi3-diff.ts similarity index 100% rename from lib/common/src/lib/util/openapi3-diff.ts rename to lib/common-bindings/src/lib/util/openapi3-diff.ts diff --git a/lib/common/tsconfig.json b/lib/common-bindings/tsconfig.json similarity index 100% rename from lib/common/tsconfig.json rename to lib/common-bindings/tsconfig.json diff --git a/lib/common/tsconfig.lib.json b/lib/common-bindings/tsconfig.lib.json similarity index 100% rename from lib/common/tsconfig.lib.json rename to lib/common-bindings/tsconfig.lib.json diff --git a/lib/common/README.md b/lib/common/README.md deleted file mode 100644 index bd2c68a..0000000 --- a/lib/common/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# common - -This library was generated with [Nx](https://nx.dev). diff --git a/lib/common/project.json b/lib/common/project.json deleted file mode 100644 index 1401626..0000000 --- a/lib/common/project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "common", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "lib/common/src", - "projectType": "library", - "tags": [], - "// targets": "to see all targets run: nx show project common --web", - "targets": {} -} diff --git a/lib/common/src/lib/interfaces/generator.interface.ts b/lib/common/src/lib/interfaces/generator.interface.ts deleted file mode 100644 index 1f05170..0000000 --- a/lib/common/src/lib/interfaces/generator.interface.ts +++ /dev/null @@ -1,17 +0,0 @@ -import {ResourceDescriptor} from "../model/resource-descriptor"; -import {IIntrigSourceConfig, IntrigSourceConfig} from "../model/intrig-source-config"; -import {SchemaDocumentation} from "../model/schema"; -import {RestDocumentation} from "../model/rest-resource-data"; -import {RestOptions} from "../model/intrig-config"; - -export abstract class GeneratorBinding { - abstract generateGlobal(apisToSync: IntrigSourceConfig[]): Promise; - abstract generateSource(descriptors: ResourceDescriptor[], source: IIntrigSourceConfig): Promise; - abstract getLibName(): string - abstract postBuild(): Promise - abstract getSchemaDocumentation(result: ResourceDescriptor): Promise - abstract getEndpointDocumentation(result: ResourceDescriptor, schemas: ResourceDescriptor[]): Promise - getRestOptions(): RestOptions { - return {} - } -} \ No newline at end of file diff --git a/lib/next-binding/package.json b/lib/next-binding/package.json index 9f6428b..090ee03 100644 --- a/lib/next-binding/package.json +++ b/lib/next-binding/package.json @@ -1,7 +1,7 @@ { - "name": "next-binding", + "name": "@intrig/next-binding", "version": "0.0.1", - "private": true, + "main": "./src/index.ts", "types": "./src/index.ts", "exports": { @@ -12,5 +12,13 @@ }, "./package.json": "./package.json" }, - "dependencies": {} + "dependencies": { + "@intrig/common": "*" + }, + "intrig": { + "plugin": { + "type": "generator", + "for": "next" + } + } } diff --git a/lib/next-binding/project.json b/lib/next-binding/project.json index aca220b..9bcbe1d 100644 --- a/lib/next-binding/project.json +++ b/lib/next-binding/project.json @@ -4,6 +4,11 @@ "sourceRoot": "lib/next-binding/src", "projectType": "library", "tags": [], - "// targets": "to see all targets run: nx show project next-binding --web", - "targets": {} + "targets": { + "nx-release-publish": { + "executor": "@nx/js:release-publish", + "options": {"packageRoot": "dist/lib/next-binding"}, + "dependsOn": ["^build"] + } + } } diff --git a/lib/next-binding/src/index.ts b/lib/next-binding/src/index.ts index 4b902e8..157e3a9 100644 --- a/lib/next-binding/src/index.ts +++ b/lib/next-binding/src/index.ts @@ -2,3 +2,18 @@ export * from './lib/next-binding.module'; export * from './lib/next-binding.service'; export * from './lib/cli/next-cli.module' export * from './lib/cli/next-cli.service' + +import {IntrigPlugin} from '@intrig/common'; +import {NextBindingModule} from './lib/next-binding.module'; +import {IntrigNextBindingService} from './lib/next-binding.service'; +import {NextCliModule} from './lib/cli/next-cli.module'; +import {NextCliService} from './lib/cli/next-cli.service'; + +export const plugin: IntrigPlugin = { + name: 'next', + bindingModule: NextBindingModule, + bindingService: IntrigNextBindingService, + cliModule: NextCliModule, + cliService: NextCliService, +}; +export default plugin; diff --git a/lib/next-binding/src/lib/next-binding.service.ts b/lib/next-binding/src/lib/next-binding.service.ts index 9315ada..f735a87 100644 --- a/lib/next-binding/src/lib/next-binding.service.ts +++ b/lib/next-binding/src/lib/next-binding.service.ts @@ -1,6 +1,6 @@ import {Injectable} from '@nestjs/common'; +import {GeneratorBinding} from "@intrig/common"; import { - GeneratorBinding, IIntrigSourceConfig, isRestDescriptor, isSchemaDescriptor, RelatedType, ResourceDescriptor, RestData, RestDocumentation, RestOptions, Schema, SchemaDocumentation, diff --git a/lib/next-binding/src/lib/templates/docs/react-hook.ts b/lib/next-binding/src/lib/templates/docs/react-hook.ts index df37892..25e0b0c 100644 --- a/lib/next-binding/src/lib/templates/docs/react-hook.ts +++ b/lib/next-binding/src/lib/templates/docs/react-hook.ts @@ -1,4 +1,4 @@ -import {camelCase, mdLiteral, pascalCase, ResourceDescriptor, RestData} from 'common' +import {camelCase, mdLiteral, pascalCase, ResourceDescriptor, RestData} from '@intrig/common' export function reactHookDocs(descriptor: ResourceDescriptor) { const md = mdLiteral('react-hook.md') diff --git a/lib/next-binding/src/lib/templates/intrigMiddleware.template.ts b/lib/next-binding/src/lib/templates/intrigMiddleware.template.ts index 06412f8..1ab31f7 100644 --- a/lib/next-binding/src/lib/templates/intrigMiddleware.template.ts +++ b/lib/next-binding/src/lib/templates/intrigMiddleware.template.ts @@ -1,4 +1,4 @@ -import { typescript } from 'common'; +import { typescript } from '@intrig/common'; import * as path from 'path' export function intrigMiddlewareTemplate(_path: string) { diff --git a/lib/next-binding/src/lib/templates/source/controller/method/clientIndex.template.ts b/lib/next-binding/src/lib/templates/source/controller/method/clientIndex.template.ts index d3d9652..3e7f813 100644 --- a/lib/next-binding/src/lib/templates/source/controller/method/clientIndex.template.ts +++ b/lib/next-binding/src/lib/templates/source/controller/method/clientIndex.template.ts @@ -1,7 +1,7 @@ import { camelCase, ResourceDescriptor, RestData, typescript -} from 'common'; +} from '@intrig/common'; import * as path from 'path' import * as _ from "lodash"; diff --git a/lib/next-binding/src/lib/templates/source/controller/method/download.template.ts b/lib/next-binding/src/lib/templates/source/controller/method/download.template.ts index 102ad58..818d9f2 100644 --- a/lib/next-binding/src/lib/templates/source/controller/method/download.template.ts +++ b/lib/next-binding/src/lib/templates/source/controller/method/download.template.ts @@ -4,7 +4,7 @@ import { pascalCase, ResourceDescriptor, RestData, typescript -} from 'common'; +} from '@intrig/common'; import path from 'path'; export function downloadHookTemplate( diff --git a/lib/next-binding/src/lib/templates/source/controller/method/requestHook.template.ts b/lib/next-binding/src/lib/templates/source/controller/method/requestHook.template.ts index 3ae290e..12b4fab 100644 --- a/lib/next-binding/src/lib/templates/source/controller/method/requestHook.template.ts +++ b/lib/next-binding/src/lib/templates/source/controller/method/requestHook.template.ts @@ -4,7 +4,7 @@ import { pascalCase, ResourceDescriptor, RestData, typescript, Variable -} from 'common'; +} from '@intrig/common'; import path from 'path'; function extractHookShapeAndOptionsShape(response: string | undefined, requestBody: string | undefined, imports: Set) { diff --git a/lib/next-binding/src/lib/templates/source/controller/method/requestMethod.template.ts b/lib/next-binding/src/lib/templates/source/controller/method/requestMethod.template.ts index 79c956e..04bf941 100644 --- a/lib/next-binding/src/lib/templates/source/controller/method/requestMethod.template.ts +++ b/lib/next-binding/src/lib/templates/source/controller/method/requestMethod.template.ts @@ -4,7 +4,7 @@ import { pascalCase, ResourceDescriptor, RestData, typescript, Variable -} from 'common'; +} from '@intrig/common'; import path from 'path'; function extractParamDeconstruction(variables: Variable[] | undefined, requestBody: string | undefined) { diff --git a/lib/next-binding/src/lib/templates/source/controller/method/requestRouteTemplate.ts b/lib/next-binding/src/lib/templates/source/controller/method/requestRouteTemplate.ts index 2e2d2b0..ae802f6 100644 --- a/lib/next-binding/src/lib/templates/source/controller/method/requestRouteTemplate.ts +++ b/lib/next-binding/src/lib/templates/source/controller/method/requestRouteTemplate.ts @@ -4,7 +4,7 @@ import { pascalCase, ResourceDescriptor, RestData, typescript -} from 'common'; +} from '@intrig/common'; import * as path from "path"; export async function requestRouteTemplate(requestUrl: string, paths: ResourceDescriptor[], _path: string) { diff --git a/lib/next-binding/src/lib/templates/source/controller/method/serverIndex.template.ts b/lib/next-binding/src/lib/templates/source/controller/method/serverIndex.template.ts index a7e72b8..8ef1519 100644 --- a/lib/next-binding/src/lib/templates/source/controller/method/serverIndex.template.ts +++ b/lib/next-binding/src/lib/templates/source/controller/method/serverIndex.template.ts @@ -1,7 +1,7 @@ import { camelCase, ResourceDescriptor, RestData, typescript -} from 'common'; +} from '@intrig/common'; import * as path from 'path' import * as _ from "lodash"; diff --git a/lib/next-binding/src/lib/templates/source/type/typeTemplate.ts b/lib/next-binding/src/lib/templates/source/type/typeTemplate.ts index 5b91590..0ec3197 100644 --- a/lib/next-binding/src/lib/templates/source/type/typeTemplate.ts +++ b/lib/next-binding/src/lib/templates/source/type/typeTemplate.ts @@ -1,5 +1,5 @@ import { OpenAPIV3_1 } from 'openapi-types'; -import { jsonLiteral, typescript } from 'common'; +import { jsonLiteral, typescript } from '@intrig/common'; import * as path from 'path' export interface TypeTemplateParams { diff --git a/lib/next-binding/tsconfig.json b/lib/next-binding/tsconfig.json index bf5e6ba..7ce0fe1 100644 --- a/lib/next-binding/tsconfig.json +++ b/lib/next-binding/tsconfig.json @@ -3,11 +3,7 @@ "files": [], "include": [], "references": [ - { - "path": "../common" - }, - { - "path": "./tsconfig.lib.json" - } + {"path": "../common-bindings"}, + {"path": "./tsconfig.lib.json"} ] } diff --git a/lib/next-binding/tsconfig.lib.json b/lib/next-binding/tsconfig.lib.json index 1d16ec5..ff316d6 100644 --- a/lib/next-binding/tsconfig.lib.json +++ b/lib/next-binding/tsconfig.lib.json @@ -16,8 +16,6 @@ }, "include": ["src/**/*.ts"], "references": [ - { - "path": "../common/tsconfig.lib.json" - } + {"path": "../common-bindings/tsconfig.lib.json"} ] } diff --git a/lib/openapi-source/src/lib/openapi.service.ts b/lib/openapi-source/src/lib/openapi.service.ts index 0255997..4609dcf 100644 --- a/lib/openapi-source/src/lib/openapi.service.ts +++ b/lib/openapi-source/src/lib/openapi.service.ts @@ -1,5 +1,5 @@ import {Injectable, Logger} from '@nestjs/common'; -import type {IIntrigSourceConfig, RestOptions} from 'common' +import type {IIntrigSourceConfig, RestOptions} from '@intrig/common' import * as crypto from 'crypto'; import { camelCase, @@ -10,7 +10,7 @@ import { SpecManagementService, SyncEventContext, WithStatus -} from 'common' +} from '@intrig/common' import {lastValueFrom} from "rxjs"; import {HttpService} from "@nestjs/axios"; import {load as yamlLoad} from "js-yaml"; diff --git a/lib/openapi-source/src/lib/util/normalize.ts b/lib/openapi-source/src/lib/util/normalize.ts index 268f722..a496798 100644 --- a/lib/openapi-source/src/lib/util/normalize.ts +++ b/lib/openapi-source/src/lib/util/normalize.ts @@ -1,6 +1,6 @@ import {OpenAPIV3, OpenAPIV3_1} from "openapi-types"; import {produce} from 'immer' -import {pascalCase, camelCase} from 'common' +import {pascalCase, camelCase} from '@intrig/common' import ReferenceObject = OpenAPIV3.ReferenceObject; import ExampleObject = OpenAPIV3_1.ExampleObject; import {deref, isRef} from "./ref-management"; diff --git a/lib/openapi-source/tsconfig.json b/lib/openapi-source/tsconfig.json index bf5e6ba..7ce0fe1 100644 --- a/lib/openapi-source/tsconfig.json +++ b/lib/openapi-source/tsconfig.json @@ -3,11 +3,7 @@ "files": [], "include": [], "references": [ - { - "path": "../common" - }, - { - "path": "./tsconfig.lib.json" - } + {"path": "../common-bindings"}, + {"path": "./tsconfig.lib.json"} ] } diff --git a/lib/openapi-source/tsconfig.lib.json b/lib/openapi-source/tsconfig.lib.json index 1d16ec5..ff316d6 100644 --- a/lib/openapi-source/tsconfig.lib.json +++ b/lib/openapi-source/tsconfig.lib.json @@ -16,8 +16,6 @@ }, "include": ["src/**/*.ts"], "references": [ - { - "path": "../common/tsconfig.lib.json" - } + {"path": "../common-bindings/tsconfig.lib.json"} ] } diff --git a/lib/react-binding/package.json b/lib/react-binding/package.json index d9cbf03..92b1897 100644 --- a/lib/react-binding/package.json +++ b/lib/react-binding/package.json @@ -1,7 +1,7 @@ { - "name": "react-binding", + "name": "@intrig/react-binding", "version": "0.0.1", - "private": true, + "main": "./src/index.ts", "types": "./src/index.ts", "exports": { @@ -12,5 +12,13 @@ }, "./package.json": "./package.json" }, - "dependencies": {} + "dependencies": { + "@intrig/common": "*" + }, + "intrig": { + "plugin": { + "type": "generator", + "for": "react" + } + } } diff --git a/lib/react-binding/project.json b/lib/react-binding/project.json index 0c8cc27..3d7cfb6 100644 --- a/lib/react-binding/project.json +++ b/lib/react-binding/project.json @@ -4,6 +4,11 @@ "sourceRoot": "lib/react-binding/src", "projectType": "library", "tags": [], - "// targets": "to see all targets run: nx show project react-binding --web", - "targets": {} + "targets": { + "nx-release-publish": { + "executor": "@nx/js:release-publish", + "options": {"packageRoot": "dist/lib/react-binding"}, + "dependsOn": ["^build"] + } + } } diff --git a/lib/react-binding/src/index.ts b/lib/react-binding/src/index.ts index e0e8c44..9615814 100644 --- a/lib/react-binding/src/index.ts +++ b/lib/react-binding/src/index.ts @@ -2,3 +2,18 @@ export * from './lib/react-binding.service'; export * from './lib/react-binding.module'; export * from './lib/cli/react-cli.module' export * from './lib/cli/react-cli.service' + +import {IntrigPlugin} from '@intrig/common'; +import {ReactBindingModule} from './lib/react-binding.module'; +import {ReactBindingService} from './lib/react-binding.service'; +import {ReactCliModule} from './lib/cli/react-cli.module'; +import {ReactCliService} from './lib/cli/react-cli.service'; + +export const plugin: IntrigPlugin = { + name: 'react', + bindingModule: ReactBindingModule, + bindingService: ReactBindingService, + cliModule: ReactCliModule, + cliService: ReactCliService, +}; +export default plugin; diff --git a/lib/react-binding/src/lib/react-binding.service.ts b/lib/react-binding/src/lib/react-binding.service.ts index 2f3e813..7e475f4 100644 --- a/lib/react-binding/src/lib/react-binding.service.ts +++ b/lib/react-binding/src/lib/react-binding.service.ts @@ -1,6 +1,6 @@ import {Injectable, Logger} from '@nestjs/common'; +import {GeneratorBinding} from "@intrig/common"; import { - GeneratorBinding, IIntrigSourceConfig, IntrigSourceConfig, isRestDescriptor, isSchemaDescriptor, RelatedType, ResourceDescriptor, diff --git a/lib/react-binding/src/lib/templates/docs/async-hook.ts b/lib/react-binding/src/lib/templates/docs/async-hook.ts index 5460960..48271e9 100644 --- a/lib/react-binding/src/lib/templates/docs/async-hook.ts +++ b/lib/react-binding/src/lib/templates/docs/async-hook.ts @@ -1,4 +1,4 @@ -import {camelCase, mdLiteral, pascalCase, ResourceDescriptor, RestData} from 'common' +import {camelCase, mdLiteral, pascalCase, ResourceDescriptor, RestData} from '@intrig/common' export function asyncFunctionHookDocs(descriptor: ResourceDescriptor) { const md = mdLiteral('async-hook.md') diff --git a/lib/react-binding/src/lib/templates/docs/react-hook.ts b/lib/react-binding/src/lib/templates/docs/react-hook.ts index 56b66be..c0adb86 100644 --- a/lib/react-binding/src/lib/templates/docs/react-hook.ts +++ b/lib/react-binding/src/lib/templates/docs/react-hook.ts @@ -1,4 +1,4 @@ -import {camelCase, mdLiteral, pascalCase, ResourceDescriptor, RestData} from 'common' +import {camelCase, mdLiteral, pascalCase, ResourceDescriptor, RestData} from '@intrig/common' export function reactHookDocs(descriptor: ResourceDescriptor) { const md = mdLiteral('react-hook.md') diff --git a/lib/react-binding/src/lib/templates/intrigMiddleware.template.ts b/lib/react-binding/src/lib/templates/intrigMiddleware.template.ts index 46b0dde..a2af239 100644 --- a/lib/react-binding/src/lib/templates/intrigMiddleware.template.ts +++ b/lib/react-binding/src/lib/templates/intrigMiddleware.template.ts @@ -1,4 +1,4 @@ -import { typescript } from 'common'; +import { typescript } from '@intrig/common'; import * as path from 'path' export function intrigMiddlewareTemplate(_path: string) { diff --git a/lib/react-binding/src/lib/templates/source/controller/method/asyncFunctionHook.template.ts b/lib/react-binding/src/lib/templates/source/controller/method/asyncFunctionHook.template.ts index 7ce4d1c..98443ea 100644 --- a/lib/react-binding/src/lib/templates/source/controller/method/asyncFunctionHook.template.ts +++ b/lib/react-binding/src/lib/templates/source/controller/method/asyncFunctionHook.template.ts @@ -4,7 +4,7 @@ import { pascalCase, ResourceDescriptor, RestData, typescript, Variable -} from 'common'; +} from '@intrig/common'; import * as path from 'path'; function extractAsyncHookShape(response: string | undefined, requestBody: string | undefined, imports: Set) { diff --git a/lib/react-binding/src/lib/templates/source/controller/method/clientIndex.template.ts b/lib/react-binding/src/lib/templates/source/controller/method/clientIndex.template.ts index 96a6bca..5ce7b74 100644 --- a/lib/react-binding/src/lib/templates/source/controller/method/clientIndex.template.ts +++ b/lib/react-binding/src/lib/templates/source/controller/method/clientIndex.template.ts @@ -4,7 +4,7 @@ import { pascalCase, ResourceDescriptor, RestData, typescript -} from 'common'; +} from '@intrig/common'; import * as path from 'path' export async function clientIndexTemplate(descriptors: ResourceDescriptor[], _path: string) { diff --git a/lib/react-binding/src/lib/templates/source/controller/method/download.template.ts b/lib/react-binding/src/lib/templates/source/controller/method/download.template.ts index 6303cc3..f534421 100644 --- a/lib/react-binding/src/lib/templates/source/controller/method/download.template.ts +++ b/lib/react-binding/src/lib/templates/source/controller/method/download.template.ts @@ -4,7 +4,7 @@ import { pascalCase, ResourceDescriptor, RestData, typescript, Variable -} from 'common'; +} from '@intrig/common'; import * as path from 'path'; function extractHookShapeAndOptionsShape(response: string | undefined, requestBody: string | undefined, imports: Set) { diff --git a/lib/react-binding/src/lib/templates/source/controller/method/requestHook.template.ts b/lib/react-binding/src/lib/templates/source/controller/method/requestHook.template.ts index 4897aab..7973c8b 100644 --- a/lib/react-binding/src/lib/templates/source/controller/method/requestHook.template.ts +++ b/lib/react-binding/src/lib/templates/source/controller/method/requestHook.template.ts @@ -4,7 +4,7 @@ import { pascalCase, ResourceDescriptor, RestData, typescript, Variable -} from 'common'; +} from '@intrig/common'; import * as path from 'path'; function extractHookShapeAndOptionsShape(response: string | undefined, requestBody: string | undefined, imports: Set) { diff --git a/lib/react-binding/src/lib/templates/source/type/typeTemplate.ts b/lib/react-binding/src/lib/templates/source/type/typeTemplate.ts index b5cbf5f..e558d1c 100644 --- a/lib/react-binding/src/lib/templates/source/type/typeTemplate.ts +++ b/lib/react-binding/src/lib/templates/source/type/typeTemplate.ts @@ -1,5 +1,5 @@ import { OpenAPIV3_1 } from 'openapi-types'; -import { jsonLiteral, typescript } from 'common'; +import { jsonLiteral, typescript } from '@intrig/common'; import * as path from 'path' export interface SchemaConversionResult { diff --git a/lib/react-binding/tsconfig.json b/lib/react-binding/tsconfig.json index bf5e6ba..7ce0fe1 100644 --- a/lib/react-binding/tsconfig.json +++ b/lib/react-binding/tsconfig.json @@ -3,11 +3,7 @@ "files": [], "include": [], "references": [ - { - "path": "../common" - }, - { - "path": "./tsconfig.lib.json" - } + {"path": "../common-bindings"}, + {"path": "./tsconfig.lib.json"} ] } diff --git a/lib/react-binding/tsconfig.lib.json b/lib/react-binding/tsconfig.lib.json index 1d16ec5..ff316d6 100644 --- a/lib/react-binding/tsconfig.lib.json +++ b/lib/react-binding/tsconfig.lib.json @@ -16,8 +16,6 @@ }, "include": ["src/**/*.ts"], "references": [ - { - "path": "../common/tsconfig.lib.json" - } + {"path": "../common-bindings/tsconfig.lib.json"} ] } diff --git a/nx.json b/nx.json index b1ecf64..d07c671 100644 --- a/nx.json +++ b/nx.json @@ -39,7 +39,7 @@ "lib/next-binding/*", "lib/openapi-source/*", "lib/shared/*", - "lib/common/*" + "lib/common-bindings/*" ] }, { @@ -75,7 +75,7 @@ "lib/next-binding/*", "lib/openapi-source/*", "lib/shared/*", - "lib/common/*" + "lib/common-bindings/*" ], "options": { "typecheck": { diff --git a/tsconfig.base.json b/tsconfig.base.json index 441a59b..4de7289 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -22,6 +22,10 @@ "esModuleInterop": true, "allowSyntheticDefaultImports": true, "resolveJsonModule": true, - "declaration": true + "declaration": true, + "paths": { + "@intrig/common": ["lib/common-bindings/src/index.ts"], + "@intrig/common/*": ["lib/common-bindings/src/*"] + } } } diff --git a/tsconfig.json b/tsconfig.json index 5af5657..faab1ee 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,12 +12,10 @@ { "path": "./lib/next-binding" }, + {"path": "./lib/common-bindings"}, { "path": "./lib/openapi-source" }, - { - "path": "./lib/common" - }, { "path": "./lib/react-client" },