mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-24 13:54:57 +00:00
Add stub modules for auth, routing, github, lua, and other missing features
Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com>
This commit is contained in:
@@ -35,9 +35,12 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.39.2",
|
||||
"@tanstack/react-query": "^5.90.16",
|
||||
"@testing-library/react": "^16.3.1",
|
||||
"@types/node": "^25.0.3",
|
||||
"@types/react": "^19.2.7",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"@vitejs/plugin-react-swc": "^4.2.2",
|
||||
"eslint": "^9.39.2",
|
||||
"eslint-plugin-react": "^7.37.5",
|
||||
"eslint-plugin-react-hooks": "^5.2.0",
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Auth provider component (stub)
|
||||
*/
|
||||
|
||||
import type { ReactNode } from 'react'
|
||||
|
||||
export interface AuthProviderProps {
|
||||
children: ReactNode
|
||||
}
|
||||
|
||||
export function AuthProviderComponent({ children }: AuthProviderProps) {
|
||||
// TODO: Implement auth provider
|
||||
return children
|
||||
}
|
||||
|
||||
// Alias for compatibility
|
||||
export const AuthProvider = AuthProviderComponent
|
||||
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* useAuth hook (stub)
|
||||
*/
|
||||
|
||||
export interface AuthUser {
|
||||
id: string
|
||||
username: string
|
||||
email: string
|
||||
role: string
|
||||
level: number
|
||||
}
|
||||
|
||||
export interface AuthState {
|
||||
user: AuthUser | null
|
||||
isLoading: boolean
|
||||
isAuthenticated: boolean
|
||||
}
|
||||
|
||||
export function useAuth(): AuthState {
|
||||
// TODO: Implement useAuth hook
|
||||
return {
|
||||
user: null,
|
||||
isLoading: false,
|
||||
isAuthenticated: false,
|
||||
}
|
||||
}
|
||||
12
frontends/nextjs/src/app/levels/levels-data.ts
Normal file
12
frontends/nextjs/src/app/levels/levels-data.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* Levels data (stub)
|
||||
*/
|
||||
|
||||
export const levelsData = {
|
||||
public: 1,
|
||||
user: 2,
|
||||
moderator: 3,
|
||||
admin: 4,
|
||||
god: 5,
|
||||
supergod: 6,
|
||||
}
|
||||
8
frontends/nextjs/src/hooks/use-mobile.ts
Normal file
8
frontends/nextjs/src/hooks/use-mobile.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* useMobile hook (stub)
|
||||
*/
|
||||
|
||||
export function useMobile(): boolean {
|
||||
// TODO: Implement mobile detection
|
||||
return false
|
||||
}
|
||||
12
frontends/nextjs/src/hooks/useAutoRefresh.ts
Normal file
12
frontends/nextjs/src/hooks/useAutoRefresh.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* useAutoRefresh hook (stub)
|
||||
*/
|
||||
|
||||
export interface AutoRefreshOptions {
|
||||
interval?: number
|
||||
enabled?: boolean
|
||||
}
|
||||
|
||||
export function useAutoRefresh(callback: () => void, options?: AutoRefreshOptions): void {
|
||||
// TODO: Implement auto refresh
|
||||
}
|
||||
8
frontends/nextjs/src/lib/api/read-json.ts
Normal file
8
frontends/nextjs/src/lib/api/read-json.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* Read JSON from request (stub)
|
||||
*/
|
||||
|
||||
export async function readJson<T = unknown>(request: Request): Promise<T> {
|
||||
// TODO: Implement JSON reading with validation
|
||||
return await request.json() as T
|
||||
}
|
||||
15
frontends/nextjs/src/lib/auth/api/fetch-session.ts
Normal file
15
frontends/nextjs/src/lib/auth/api/fetch-session.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
/**
|
||||
* Fetch current session (stub)
|
||||
*/
|
||||
|
||||
export interface Session {
|
||||
id: string
|
||||
userId: string
|
||||
token: string
|
||||
expiresAt: number
|
||||
}
|
||||
|
||||
export async function fetchSession(): Promise<Session | null> {
|
||||
// TODO: Implement session fetching
|
||||
return null
|
||||
}
|
||||
19
frontends/nextjs/src/lib/auth/api/login.ts
Normal file
19
frontends/nextjs/src/lib/auth/api/login.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
/**
|
||||
* Login API (stub)
|
||||
*/
|
||||
|
||||
export interface LoginCredentials {
|
||||
username: string
|
||||
password: string
|
||||
}
|
||||
|
||||
export interface LoginResponse {
|
||||
success: boolean
|
||||
token?: string
|
||||
error?: string
|
||||
}
|
||||
|
||||
export async function login(credentials: LoginCredentials): Promise<LoginResponse> {
|
||||
// TODO: Implement login
|
||||
return { success: false, error: 'Not implemented' }
|
||||
}
|
||||
7
frontends/nextjs/src/lib/auth/api/logout.ts
Normal file
7
frontends/nextjs/src/lib/auth/api/logout.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
/**
|
||||
* Logout API (stub)
|
||||
*/
|
||||
|
||||
export async function logout(): Promise<void> {
|
||||
// TODO: Implement logout
|
||||
}
|
||||
20
frontends/nextjs/src/lib/auth/api/register.ts
Normal file
20
frontends/nextjs/src/lib/auth/api/register.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
/**
|
||||
* Register API (stub)
|
||||
*/
|
||||
|
||||
export interface RegisterData {
|
||||
username: string
|
||||
email: string
|
||||
password: string
|
||||
}
|
||||
|
||||
export interface RegisterResponse {
|
||||
success: boolean
|
||||
userId?: string
|
||||
error?: string
|
||||
}
|
||||
|
||||
export async function register(data: RegisterData): Promise<RegisterResponse> {
|
||||
// TODO: Implement registration
|
||||
return { success: false, error: 'Not implemented' }
|
||||
}
|
||||
18
frontends/nextjs/src/lib/compiler/index.ts
Normal file
18
frontends/nextjs/src/lib/compiler/index.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Compiler utilities (stub)
|
||||
*/
|
||||
|
||||
export interface CompileOptions {
|
||||
minify?: boolean
|
||||
sourceMaps?: boolean
|
||||
}
|
||||
|
||||
export interface CompileResult {
|
||||
code: string
|
||||
map?: string
|
||||
}
|
||||
|
||||
export async function compile(source: string, options?: CompileOptions): Promise<CompileResult> {
|
||||
// TODO: Implement compilation
|
||||
return { code: source }
|
||||
}
|
||||
12
frontends/nextjs/src/lib/github/create-github-client.ts
Normal file
12
frontends/nextjs/src/lib/github/create-github-client.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* Create GitHub client (stub)
|
||||
*/
|
||||
|
||||
export interface GitHubClient {
|
||||
// Add methods as needed
|
||||
}
|
||||
|
||||
export function createGitHubClient(token?: string): GitHubClient {
|
||||
// TODO: Implement GitHub client creation
|
||||
return {}
|
||||
}
|
||||
28
frontends/nextjs/src/lib/github/fetch-workflow-run-logs.ts
Normal file
28
frontends/nextjs/src/lib/github/fetch-workflow-run-logs.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
* Fetch workflow run logs (stub)
|
||||
*/
|
||||
|
||||
export interface WorkflowJob {
|
||||
id: number
|
||||
name: string
|
||||
status: string
|
||||
conclusion?: string
|
||||
}
|
||||
|
||||
export interface WorkflowRunLogs {
|
||||
logs: string
|
||||
runId: number
|
||||
jobs?: WorkflowJob[]
|
||||
logsText?: string
|
||||
truncated?: boolean
|
||||
}
|
||||
|
||||
export async function fetchWorkflowRunLogs(
|
||||
owner: string,
|
||||
repo: string,
|
||||
runId: number,
|
||||
options?: { tailLines?: number; failedOnly?: boolean }
|
||||
): Promise<WorkflowRunLogs | null> {
|
||||
// TODO: Implement log fetching
|
||||
return null
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* Parse workflow run logs options (stub)
|
||||
*/
|
||||
|
||||
export interface WorkflowRunLogsOptions {
|
||||
tailLines?: number
|
||||
failedOnly?: boolean
|
||||
runName?: string
|
||||
includeLogs?: boolean
|
||||
jobLimit?: number
|
||||
}
|
||||
|
||||
export function parseWorkflowRunLogsOptions(search: string): WorkflowRunLogsOptions {
|
||||
// TODO: Implement option parsing
|
||||
const params = new URLSearchParams(search)
|
||||
return {
|
||||
tailLines: params.get('tailLines') ? parseInt(params.get('tailLines')!) : undefined,
|
||||
failedOnly: params.get('failedOnly') === 'true',
|
||||
runName: params.get('runName') || undefined,
|
||||
includeLogs: params.get('includeLogs') === 'true',
|
||||
jobLimit: params.get('jobLimit') ? parseInt(params.get('jobLimit')!) : undefined,
|
||||
}
|
||||
}
|
||||
14
frontends/nextjs/src/lib/github/resolve-github-repo.ts
Normal file
14
frontends/nextjs/src/lib/github/resolve-github-repo.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* Resolve GitHub repository (stub)
|
||||
*/
|
||||
|
||||
export interface GitHubRepo {
|
||||
owner: string
|
||||
repo: string
|
||||
}
|
||||
|
||||
export function resolveGitHubRepo(identifier: string): GitHubRepo {
|
||||
// TODO: Implement repo resolution
|
||||
const [owner, repo] = identifier.split('/')
|
||||
return { owner: owner || '', repo: repo || '' }
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
/**
|
||||
* List workflow runs (stub)
|
||||
*/
|
||||
|
||||
export interface WorkflowRun {
|
||||
id: number
|
||||
name: string
|
||||
status: string
|
||||
conclusion?: string
|
||||
createdAt: string
|
||||
}
|
||||
|
||||
export async function listWorkflowRuns(
|
||||
owner: string,
|
||||
repo: string,
|
||||
search?: string,
|
||||
workflowId?: string
|
||||
): Promise<WorkflowRun[]> {
|
||||
// TODO: Implement workflow runs listing
|
||||
return []
|
||||
}
|
||||
14
frontends/nextjs/src/lib/lua/ui/generate-component-tree.ts
Normal file
14
frontends/nextjs/src/lib/lua/ui/generate-component-tree.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* Generate component tree from Lua (stub)
|
||||
*/
|
||||
|
||||
export interface ComponentTree {
|
||||
type: string
|
||||
props?: Record<string, unknown>
|
||||
children?: ComponentTree[]
|
||||
}
|
||||
|
||||
export function generateComponentTree(luaScript: string): ComponentTree {
|
||||
// TODO: Implement Lua component tree generation
|
||||
return { type: 'div' }
|
||||
}
|
||||
9
frontends/nextjs/src/lib/lua/ui/types/lua-ui-package.ts
Normal file
9
frontends/nextjs/src/lib/lua/ui/types/lua-ui-package.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Lua UI types (stub)
|
||||
*/
|
||||
|
||||
export interface LuaUIPackage {
|
||||
id: string
|
||||
name: string
|
||||
components: unknown[]
|
||||
}
|
||||
14
frontends/nextjs/src/lib/packages/json/load-json-package.ts
Normal file
14
frontends/nextjs/src/lib/packages/json/load-json-package.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* Load JSON package (stub)
|
||||
*/
|
||||
|
||||
export interface JSONPackage {
|
||||
id: string
|
||||
components: unknown[]
|
||||
metadata: unknown
|
||||
}
|
||||
|
||||
export async function loadJSONPackage(packageId: string): Promise<JSONPackage | null> {
|
||||
// TODO: Implement JSON package loading
|
||||
return null
|
||||
}
|
||||
@@ -30,3 +30,16 @@ export {
|
||||
getPackageScripts,
|
||||
getPackagesByCategory,
|
||||
} from './functions'
|
||||
|
||||
// Package glue singleton (stub)
|
||||
export const packageGlue = {
|
||||
getPackage,
|
||||
getPackageComponents,
|
||||
getPackageScripts,
|
||||
getPackagesByCategory,
|
||||
checkDependencies,
|
||||
}
|
||||
|
||||
export function getPackageGlue() {
|
||||
return packageGlue
|
||||
}
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Validate package route (stub)
|
||||
*/
|
||||
|
||||
export interface RouteValidationResult {
|
||||
valid: boolean
|
||||
error?: string
|
||||
}
|
||||
|
||||
export async function validatePackageRoute(
|
||||
tenant: string,
|
||||
packageId: string,
|
||||
userId?: string
|
||||
): Promise<RouteValidationResult> {
|
||||
// TODO: Implement route validation
|
||||
return { valid: true }
|
||||
}
|
||||
|
||||
export async function canBePrimaryPackage(packageId: string): Promise<boolean> {
|
||||
// TODO: Implement primary package check
|
||||
return true
|
||||
}
|
||||
|
||||
export async function loadPackageMetadata(packageId: string): Promise<unknown> {
|
||||
// TODO: Implement package metadata loading
|
||||
return null
|
||||
}
|
||||
13
frontends/nextjs/src/lib/routing/index.ts
Normal file
13
frontends/nextjs/src/lib/routing/index.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
/**
|
||||
* Routing utilities (stub)
|
||||
*/
|
||||
|
||||
export function parseRoute(path: string): Record<string, string> {
|
||||
// TODO: Implement route parsing
|
||||
return {}
|
||||
}
|
||||
|
||||
export function buildRoute(template: string, params: Record<string, string>): string {
|
||||
// TODO: Implement route building
|
||||
return template
|
||||
}
|
||||
32
frontends/nextjs/src/lib/routing/route-parser.ts
Normal file
32
frontends/nextjs/src/lib/routing/route-parser.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
* Route parser (stub)
|
||||
*/
|
||||
|
||||
export interface ParsedRoute {
|
||||
tenant?: string
|
||||
package?: string
|
||||
path?: string
|
||||
params: Record<string, string>
|
||||
}
|
||||
|
||||
export const RESERVED_PATHS = ['api', 'admin', 'auth', '_next', 'static']
|
||||
|
||||
export function parseRoute(url: string): ParsedRoute {
|
||||
// TODO: Implement route parsing
|
||||
return { params: {} }
|
||||
}
|
||||
|
||||
export function getPrefixedEntity(entity: string, prefix?: string): string {
|
||||
// TODO: Implement entity prefixing
|
||||
return prefix ? `${prefix}_${entity}` : entity
|
||||
}
|
||||
|
||||
export function getTableName(entity: string, tenantId?: string): string {
|
||||
// TODO: Implement table name resolution
|
||||
return entity.toLowerCase()
|
||||
}
|
||||
|
||||
export function isReservedPath(path: string): boolean {
|
||||
// TODO: Implement reserved path checking
|
||||
return RESERVED_PATHS.includes(path.split('/')[1] || path)
|
||||
}
|
||||
50
frontends/nextjs/src/lib/schema/schema-registry.ts
Normal file
50
frontends/nextjs/src/lib/schema/schema-registry.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
/**
|
||||
* Schema registry (stub)
|
||||
*/
|
||||
|
||||
import type { ModelSchema } from '../types/schema-types'
|
||||
|
||||
export class SchemaRegistry {
|
||||
private schemas: Map<string, ModelSchema> = new Map()
|
||||
|
||||
register(schema: ModelSchema): void {
|
||||
this.schemas.set(schema.name, schema)
|
||||
}
|
||||
|
||||
get(name: string): ModelSchema | undefined {
|
||||
return this.schemas.get(name)
|
||||
}
|
||||
|
||||
getAll(): ModelSchema[] {
|
||||
return Array.from(this.schemas.values())
|
||||
}
|
||||
}
|
||||
|
||||
export const schemaRegistry = new SchemaRegistry()
|
||||
|
||||
export async function loadSchemaRegistry(): Promise<SchemaRegistry> {
|
||||
// TODO: Implement schema registry loading
|
||||
return schemaRegistry
|
||||
}
|
||||
|
||||
export async function saveSchemaRegistry(registry: SchemaRegistry): Promise<void> {
|
||||
// TODO: Implement schema registry saving
|
||||
}
|
||||
|
||||
export async function getPendingMigrations(): Promise<unknown[]> {
|
||||
// TODO: Implement pending migrations retrieval
|
||||
return []
|
||||
}
|
||||
|
||||
export async function generatePrismaFragment(schema: ModelSchema): Promise<string> {
|
||||
// TODO: Implement Prisma fragment generation
|
||||
return ''
|
||||
}
|
||||
|
||||
export async function approveMigration(migrationId: string): Promise<void> {
|
||||
// TODO: Implement migration approval
|
||||
}
|
||||
|
||||
export async function rejectMigration(migrationId: string): Promise<void> {
|
||||
// TODO: Implement migration rejection
|
||||
}
|
||||
10
frontends/nextjs/src/lib/ui-pages/load-page-from-db.ts
Normal file
10
frontends/nextjs/src/lib/ui-pages/load-page-from-db.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
/**
|
||||
* Load UI page from database (stub)
|
||||
*/
|
||||
|
||||
import type { PageConfig } from '../types/level-types'
|
||||
|
||||
export async function loadPageFromDb(path: string, tenantId?: string): Promise<PageConfig | null> {
|
||||
// TODO: Implement page loading from database
|
||||
return null
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
/**
|
||||
* Load UI page from Lua packages (stub)
|
||||
*/
|
||||
|
||||
import type { PageConfig } from '../types/level-types'
|
||||
|
||||
export async function loadPageFromLuaPackages(path: string): Promise<PageConfig | null> {
|
||||
// TODO: Implement page loading from Lua packages
|
||||
return null
|
||||
}
|
||||
12
packages/admin_dialog/seed/metadata.json
Normal file
12
packages/admin_dialog/seed/metadata.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"packageId": "'$pkg'",
|
||||
"name": "'$(echo $pkg | sed 's/_/ /g' | awk '{for(i=1;i<=NF;i++)sub(/./,toupper(substr($i,1,1)),$i)}1')'",
|
||||
"version": "0.1.0",
|
||||
"description": "Package '$pkg'",
|
||||
"author": "MetaBuilder Team",
|
||||
"category": "ui",
|
||||
"exports": {
|
||||
"components": []
|
||||
},
|
||||
"dependencies": []
|
||||
}
|
||||
12
packages/dashboard/seed/metadata.json
Normal file
12
packages/dashboard/seed/metadata.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"packageId": "'$pkg'",
|
||||
"name": "'$(echo $pkg | sed 's/_/ /g' | awk '{for(i=1;i<=NF;i++)sub(/./,toupper(substr($i,1,1)),$i)}1')'",
|
||||
"version": "0.1.0",
|
||||
"description": "Package '$pkg'",
|
||||
"author": "MetaBuilder Team",
|
||||
"category": "ui",
|
||||
"exports": {
|
||||
"components": []
|
||||
},
|
||||
"dependencies": []
|
||||
}
|
||||
12
packages/data_table/seed/metadata.json
Normal file
12
packages/data_table/seed/metadata.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"packageId": "'$pkg'",
|
||||
"name": "'$(echo $pkg | sed 's/_/ /g' | awk '{for(i=1;i<=NF;i++)sub(/./,toupper(substr($i,1,1)),$i)}1')'",
|
||||
"version": "0.1.0",
|
||||
"description": "Package '$pkg'",
|
||||
"author": "MetaBuilder Team",
|
||||
"category": "ui",
|
||||
"exports": {
|
||||
"components": []
|
||||
},
|
||||
"dependencies": []
|
||||
}
|
||||
12
packages/form_builder/seed/metadata.json
Normal file
12
packages/form_builder/seed/metadata.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"packageId": "'$pkg'",
|
||||
"name": "'$(echo $pkg | sed 's/_/ /g' | awk '{for(i=1;i<=NF;i++)sub(/./,toupper(substr($i,1,1)),$i)}1')'",
|
||||
"version": "0.1.0",
|
||||
"description": "Package '$pkg'",
|
||||
"author": "MetaBuilder Team",
|
||||
"category": "ui",
|
||||
"exports": {
|
||||
"components": []
|
||||
},
|
||||
"dependencies": []
|
||||
}
|
||||
12
packages/nav_menu/seed/metadata.json
Normal file
12
packages/nav_menu/seed/metadata.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"packageId": "'$pkg'",
|
||||
"name": "'$(echo $pkg | sed 's/_/ /g' | awk '{for(i=1;i<=NF;i++)sub(/./,toupper(substr($i,1,1)),$i)}1')'",
|
||||
"version": "0.1.0",
|
||||
"description": "Package '$pkg'",
|
||||
"author": "MetaBuilder Team",
|
||||
"category": "ui",
|
||||
"exports": {
|
||||
"components": []
|
||||
},
|
||||
"dependencies": []
|
||||
}
|
||||
12
packages/notification_center/seed/metadata.json
Normal file
12
packages/notification_center/seed/metadata.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"packageId": "'$pkg'",
|
||||
"name": "'$(echo $pkg | sed 's/_/ /g' | awk '{for(i=1;i<=NF;i++)sub(/./,toupper(substr($i,1,1)),$i)}1')'",
|
||||
"version": "0.1.0",
|
||||
"description": "Package '$pkg'",
|
||||
"author": "MetaBuilder Team",
|
||||
"category": "ui",
|
||||
"exports": {
|
||||
"components": []
|
||||
},
|
||||
"dependencies": []
|
||||
}
|
||||
12
packages/ui_dialogs/seed/metadata.json
Normal file
12
packages/ui_dialogs/seed/metadata.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"packageId": "'$pkg'",
|
||||
"name": "'$(echo $pkg | sed 's/_/ /g' | awk '{for(i=1;i<=NF;i++)sub(/./,toupper(substr($i,1,1)),$i)}1')'",
|
||||
"version": "0.1.0",
|
||||
"description": "Package '$pkg'",
|
||||
"author": "MetaBuilder Team",
|
||||
"category": "ui",
|
||||
"exports": {
|
||||
"components": []
|
||||
},
|
||||
"dependencies": []
|
||||
}
|
||||
12
packages/ui_permissions/seed/metadata.json
Normal file
12
packages/ui_permissions/seed/metadata.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"packageId": "'$pkg'",
|
||||
"name": "'$(echo $pkg | sed 's/_/ /g' | awk '{for(i=1;i<=NF;i++)sub(/./,toupper(substr($i,1,1)),$i)}1')'",
|
||||
"version": "0.1.0",
|
||||
"description": "Package '$pkg'",
|
||||
"author": "MetaBuilder Team",
|
||||
"category": "ui",
|
||||
"exports": {
|
||||
"components": []
|
||||
},
|
||||
"dependencies": []
|
||||
}
|
||||
Reference in New Issue
Block a user