[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F2Z1Y8YY7GH3TVF8NPKT9J":3,"skill-same:01M6F2Z1Y8YY7GH3TVF8NPKT9J":64},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":46,"ownerHtmlUrl":47,"ownerBlogUrl":6,"ownerDescription":48,"updatedAt":49,"install":50,"resources":63},"01M6F2Z1Y8YY7GH3TVF8NPKT9J","angular-di",null,"Implement dependency injection in Angular v20+ using inject(), injection tokens, and provider configuration. Use for service architecture, providing dependencies at different levels, creating injectable tokens, and managing singleton vs scoped services. Triggers on service creation, configuring providers, using injection tokens, or understanding DI hierarchy.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fanalogjs\u002Fangular-skills\u002Fangular-di\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"angular di","angular","provider","triggers","creation","service","dependency injection","tokens","dependencies","configuration","implement","dependency","use","injection","Providers","services","architecture","2026-11-10 10:12:30",false,"---\nname: angular-di\ndescription: Implement dependency injection in Angular v20+ using inject(), injection tokens, and provider configuration. Use for service architecture, providing dependencies at different levels, creating injectable tokens, and managing singleton vs scoped services. Triggers on service creation, configuring providers, using injection tokens, or understanding DI hierarchy.\n---\n\n# Angular Dependency Injection\n\nConfigure and use dependency injection in Angular v20+ with `inject()` and providers.\n\n## Basic Injection\n\n### Using inject()\n\nPrefer `inject()` over constructor injection:\n\n```typescript\nimport { Component, inject } from '@angular\u002Fcore';\nimport { HttpClient } from '@angular\u002Fcommon\u002Fhttp';\nimport { User } from '.\u002Fuser.service';\n\n@Component({\n  selector: 'app-user-list',\n  template: `...`,\n})\nexport class UserList {\n  \u002F\u002F Inject dependencies\n  private http = inject(HttpClient);\n  private userService = inject(User);\n  \n  \u002F\u002F Can use immediately\n  users = this.userService.getUsers();\n}\n```\n\n### Injectable Services\n\n```typescript\nimport { Injectable, inject, signal } from '@angular\u002Fcore';\nimport { HttpClient } from '@angular\u002Fcommon\u002Fhttp';\n\n@Injectable({\n  providedIn: 'root', \u002F\u002F Singleton at root level\n})\nexport class User {\n  private http = inject(HttpClient);\n  \n  private users = signal\u003CUser[]>([]);\n  readonly users$ = this.users.asReadonly();\n  \n  async loadUsers() {\n    const users = await firstValueFrom(\n      this.http.get\u003CUser[]>('\u002Fapi\u002Fusers')\n    );\n    this.users.set(users);\n  }\n}\n```\n\n## Provider Scopes\n\n### Root Level (Singleton)\n\n```typescript\n\u002F\u002F Recommended: providedIn\n@Injectable({\n  providedIn: 'root',\n})\nexport class Auth {}\n\n\u002F\u002F Alternative: in app.config.ts\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    Auth,\n  ],\n};\n```\n\n### Component Level (Instance per Component)\n\n```typescript\n@Component({\n  selector: 'app-editor',\n  providers: [EditorState], \u002F\u002F New instance for each component\n  template: `...`,\n})\nexport class Editor {\n  private editorState = inject(EditorState);\n}\n```\n\n### Route Level\n\n```typescript\nexport const routes: Routes = [\n  {\n    path: 'admin',\n    providers: [Admin], \u002F\u002F Shared within this route tree\n    children: [\n      { path: '', component: AdminDashboard },\n      { path: 'users', component: AdminUsers },\n    ],\n  },\n];\n```\n\n## Injection Tokens\n\n### Creating Tokens\n\n```typescript\nimport { InjectionToken } from '@angular\u002Fcore';\n\n\u002F\u002F Simple value token\nexport const API_URL = new InjectionToken\u003Cstring>('API_URL');\n\n\u002F\u002F Object token\nexport interface AppConfig {\n  apiUrl: string;\n  features: {\n    darkMode: boolean;\n    analytics: boolean;\n  };\n}\n\nexport const APP_CONFIG = new InjectionToken\u003CAppConfig>('APP_CONFIG');\n\n\u002F\u002F Token with factory (self-providing)\nexport const WINDOW = new InjectionToken\u003CWindow>('Window', {\n  providedIn: 'root',\n  factory: () => window,\n});\n\nexport const LOCAL_STORAGE = new InjectionToken\u003CStorage>('LocalStorage', {\n  providedIn: 'root',\n  factory: () => localStorage,\n});\n```\n\n### Providing Token Values\n\n```typescript\n\u002F\u002F app.config.ts\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    { provide: API_URL, useValue: 'https:\u002F\u002Fapi.example.com' },\n    {\n      provide: APP_CONFIG,\n      useValue: {\n        apiUrl: 'https:\u002F\u002Fapi.example.com',\n        features: { darkMode: true, analytics: true },\n      },\n    },\n  ],\n};\n```\n\n### Injecting Tokens\n\n```typescript\n@Injectable({ providedIn: 'root' })\nexport class Api {\n  private apiUrl = inject(API_URL);\n  private config = inject(APP_CONFIG);\n  private window = inject(WINDOW);\n  \n  getBaseUrl(): string {\n    return this.apiUrl;\n  }\n}\n```\n\n## Provider Types\n\n### useClass\n\n```typescript\n\u002F\u002F Provide implementation\n{ provide: Logger, useClass: ConsoleLogger }\n\n\u002F\u002F Conditional implementation\n{\n  provide: Logger,\n  useClass: environment.production\n    ? ProductionLogger\n    : ConsoleLogger,\n}\n```\n\n### useValue\n\n```typescript\n\u002F\u002F Static values\n{ provide: API_URL, useValue: 'https:\u002F\u002Fapi.example.com' }\n\n\u002F\u002F Configuration objects\n{ provide: APP_CONFIG, useValue: { theme: 'dark', language: 'en' } }\n```\n\n### useFactory\n\n```typescript\n\u002F\u002F Factory with dependencies\n{\n  provide: User,\n  useFactory: (http: HttpClient, config: AppConfig) => {\n    return new User(http, config.apiUrl);\n  },\n  deps: [HttpClient, APP_CONFIG],\n}\n\n\u002F\u002F Async factory (not recommended - use provideAppInitializer)\n{\n  provide: CONFIG,\n  useFactory: () => fetch('\u002Fconfig.json').then(r => r.json()),\n}\n```\n\n### useExisting\n\n```typescript\n\u002F\u002F Alias to existing provider\n{ provide: AbstractLogger, useExisting: ConsoleLogger }\n\n\u002F\u002F Multiple tokens pointing to same instance\nproviders: [\n  ConsoleLogger,\n  { provide: Logger, useExisting: ConsoleLogger },\n  { provide: ErrorLogger, useExisting: ConsoleLogger },\n]\n```\n\n## Injection Options\n\n### Optional Injection\n\n```typescript\n@Component({...})\nexport class My {\n  \u002F\u002F Returns null if not provided\n  private analytics = inject(Analytics, { optional: true });\n  \n  trackEvent(name: string) {\n    this.analytics?.track(name);\n  }\n}\n```\n\n### Self, SkipSelf, Host\n\n```typescript\n@Component({\n  providers: [Local],\n})\nexport class Parent {\n  \u002F\u002F Only look in this component's injector\n  private local = inject(Local, { self: true });\n}\n\n@Component({...})\nexport class Child {\n  \u002F\u002F Skip this component, look in parent\n  private parentService = inject(ParentSvc, { skipSelf: true });\n\n  \u002F\u002F Only look up to host component\n  private hostService = inject(Host, { host: true });\n}\n```\n\n## Multi Providers\n\nCollect multiple values for same token:\n\n```typescript\n\u002F\u002F Token for multiple validators\nexport const VALIDATORS = new InjectionToken\u003CValidator[]>('Validators');\n\n\u002F\u002F Provide multiple values\nproviders: [\n  { provide: VALIDATORS, useClass: RequiredValidator, multi: true },\n  { provide: VALIDATORS, useClass: EmailValidator, multi: true },\n  { provide: VALIDATORS, useClass: MinLengthValidator, multi: true },\n]\n\n\u002F\u002F Inject as array\n@Injectable()\nexport class Validation {\n  private validators = inject(VALIDATORS); \u002F\u002F Validator[]\n  \n  validate(value: string): ValidationError[] {\n    return this.validators\n      .map(v => v.validate(value))\n      .filter(Boolean);\n  }\n}\n```\n\n### HTTP Interceptors (Multi Provider)\n\n```typescript\n\u002F\u002F Interceptors use multi providers internally\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    provideHttpClient(\n      withInterceptors([\n        authInterceptor,\n        loggingInterceptor,\n        errorInterceptor,\n      ])\n    ),\n  ],\n};\n```\n\n## App Initializers\n\nRun async code before app starts using `provideAppInitializer`:\n\n```typescript\nimport { provideAppInitializer, inject } from '@angular\u002Fcore';\n\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    Config,\n    provideAppInitializer(() => {\n      const configService = inject(Config);\n      return configService.loadConfig();\n    }),\n  ],\n};\n```\n\n### Multiple Initializers\n\n```typescript\nproviders: [\n  provideAppInitializer(() => {\n    const config = inject(Config);\n    return config.load();\n  }),\n  provideAppInitializer(() => {\n    const auth = inject(Auth);\n    return auth.checkSession();\n  }),\n]\n```\n\n## Environment Injector\n\nCreate injectors programmatically:\n\n```typescript\nimport { createEnvironmentInjector, EnvironmentInjector, inject } from '@angular\u002Fcore';\n\n@Injectable({ providedIn: 'root' })\nexport class Plugin {\n  private parentInjector = inject(EnvironmentInjector);\n  \n  loadPlugin(providers: Provider[]): EnvironmentInjector {\n    return createEnvironmentInjector(providers, this.parentInjector);\n  }\n}\n```\n\n## runInInjectionContext\n\nRun code with injection context:\n\n```typescript\nimport { runInInjectionContext, EnvironmentInjector, inject } from '@angular\u002Fcore';\n\n@Injectable({ providedIn: 'root' })\nexport class Utility {\n  private injector = inject(EnvironmentInjector);\n  \n  executeWithDI\u003CT>(fn: () => T): T {\n    return runInInjectionContext(this.injector, fn);\n  }\n}\n\n\u002F\u002F Usage\nutilityService.executeWithDI(() => {\n  const http = inject(HttpClient);\n  \u002F\u002F Use http...\n});\n```\n\nFor advanced patterns, see [references\u002Fdi-patterns.md](references\u002Fdi-patterns.md).\n\n","# Angular Dependency Injection\n\nConfigure and use dependency injection in Angular v20+ with `inject()` and providers.\n\n## Basic Injection\n\n### Using inject()\n\nPrefer `inject()` over constructor injection:\n\n```typescript\nimport { Component, inject } from '@angular\u002Fcore';\nimport { HttpClient } from '@angular\u002Fcommon\u002Fhttp';\nimport { User } from '.\u002Fuser.service';\n\n@Component({\n  selector: 'app-user-list',\n  template: `...`,\n})\nexport class UserList {\n  \u002F\u002F Inject dependencies\n  private http = inject(HttpClient);\n  private userService = inject(User);\n  \n  \u002F\u002F Can use immediately\n  users = this.userService.getUsers();\n}\n```\n\n### Injectable Services\n\n```typescript\nimport { Injectable, inject, signal } from '@angular\u002Fcore';\nimport { HttpClient } from '@angular\u002Fcommon\u002Fhttp';\n\n@Injectable({\n  providedIn: 'root', \u002F\u002F Singleton at root level\n})\nexport class User {\n  private http = inject(HttpClient);\n  \n  private users = signal\u003CUser[]>([]);\n  readonly users$ = this.users.asReadonly();\n  \n  async loadUsers() {\n    const users = await firstValueFrom(\n      this.http.get\u003CUser[]>('\u002Fapi\u002Fusers')\n    );\n    this.users.set(users);\n  }\n}\n```\n\n## Provider Scopes\n\n### Root Level (Singleton)\n\n```typescript\n\u002F\u002F Recommended: providedIn\n@Injectable({\n  providedIn: 'root',\n})\nexport class Auth {}\n\n\u002F\u002F Alternative: in app.config.ts\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    Auth,\n  ],\n};\n```\n\n### Component Level (Instance per Component)\n\n```typescript\n@Component({\n  selector: 'app-editor',\n  providers: [EditorState], \u002F\u002F New instance for each component\n  template: `...`,\n})\nexport class Editor {\n  private editorState = inject(EditorState);\n}\n```\n\n### Route Level\n\n```typescript\nexport const routes: Routes = [\n  {\n    path: 'admin',\n    providers: [Admin], \u002F\u002F Shared within this route tree\n    children: [\n      { path: '', component: AdminDashboard },\n      { path: 'users', component: AdminUsers },\n    ],\n  },\n];\n```\n\n## Injection Tokens\n\n### Creating Tokens\n\n```typescript\nimport { InjectionToken } from '@angular\u002Fcore';\n\n\u002F\u002F Simple value token\nexport const API_URL = new InjectionToken\u003Cstring>('API_URL');\n\n\u002F\u002F Object token\nexport interface AppConfig {\n  apiUrl: string;\n  features: {\n    darkMode: boolean;\n    analytics: boolean;\n  };\n}\n\nexport const APP_CONFIG = new InjectionToken\u003CAppConfig>('APP_CONFIG');\n\n\u002F\u002F Token with factory (self-providing)\nexport const WINDOW = new InjectionToken\u003CWindow>('Window', {\n  providedIn: 'root',\n  factory: () => window,\n});\n\nexport const LOCAL_STORAGE = new InjectionToken\u003CStorage>('LocalStorage', {\n  providedIn: 'root',\n  factory: () => localStorage,\n});\n```\n\n### Providing Token Values\n\n```typescript\n\u002F\u002F app.config.ts\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    { provide: API_URL, useValue: 'https:\u002F\u002Fapi.example.com' },\n    {\n      provide: APP_CONFIG,\n      useValue: {\n        apiUrl: 'https:\u002F\u002Fapi.example.com',\n        features: { darkMode: true, analytics: true },\n      },\n    },\n  ],\n};\n```\n\n### Injecting Tokens\n\n```typescript\n@Injectable({ providedIn: 'root' })\nexport class Api {\n  private apiUrl = inject(API_URL);\n  private config = inject(APP_CONFIG);\n  private window = inject(WINDOW);\n  \n  getBaseUrl(): string {\n    return this.apiUrl;\n  }\n}\n```\n\n## Provider Types\n\n### useClass\n\n```typescript\n\u002F\u002F Provide implementation\n{ provide: Logger, useClass: ConsoleLogger }\n\n\u002F\u002F Conditional implementation\n{\n  provide: Logger,\n  useClass: environment.production\n    ? ProductionLogger\n    : ConsoleLogger,\n}\n```\n\n### useValue\n\n```typescript\n\u002F\u002F Static values\n{ provide: API_URL, useValue: 'https:\u002F\u002Fapi.example.com' }\n\n\u002F\u002F Configuration objects\n{ provide: APP_CONFIG, useValue: { theme: 'dark', language: 'en' } }\n```\n\n### useFactory\n\n```typescript\n\u002F\u002F Factory with dependencies\n{\n  provide: User,\n  useFactory: (http: HttpClient, config: AppConfig) => {\n    return new User(http, config.apiUrl);\n  },\n  deps: [HttpClient, APP_CONFIG],\n}\n\n\u002F\u002F Async factory (not recommended - use provideAppInitializer)\n{\n  provide: CONFIG,\n  useFactory: () => fetch('\u002Fconfig.json').then(r => r.json()),\n}\n```\n\n### useExisting\n\n```typescript\n\u002F\u002F Alias to existing provider\n{ provide: AbstractLogger, useExisting: ConsoleLogger }\n\n\u002F\u002F Multiple tokens pointing to same instance\nproviders: [\n  ConsoleLogger,\n  { provide: Logger, useExisting: ConsoleLogger },\n  { provide: ErrorLogger, useExisting: ConsoleLogger },\n]\n```\n\n## Injection Options\n\n### Optional Injection\n\n```typescript\n@Component({...})\nexport class My {\n  \u002F\u002F Returns null if not provided\n  private analytics = inject(Analytics, { optional: true });\n  \n  trackEvent(name: string) {\n    this.analytics?.track(name);\n  }\n}\n```\n\n### Self, SkipSelf, Host\n\n```typescript\n@Component({\n  providers: [Local],\n})\nexport class Parent {\n  \u002F\u002F Only look in this component's injector\n  private local = inject(Local, { self: true });\n}\n\n@Component({...})\nexport class Child {\n  \u002F\u002F Skip this component, look in parent\n  private parentService = inject(ParentSvc, { skipSelf: true });\n\n  \u002F\u002F Only look up to host component\n  private hostService = inject(Host, { host: true });\n}\n```\n\n## Multi Providers\n\nCollect multiple values for same token:\n\n```typescript\n\u002F\u002F Token for multiple validators\nexport const VALIDATORS = new InjectionToken\u003CValidator[]>('Validators');\n\n\u002F\u002F Provide multiple values\nproviders: [\n  { provide: VALIDATORS, useClass: RequiredValidator, multi: true },\n  { provide: VALIDATORS, useClass: EmailValidator, multi: true },\n  { provide: VALIDATORS, useClass: MinLengthValidator, multi: true },\n]\n\n\u002F\u002F Inject as array\n@Injectable()\nexport class Validation {\n  private validators = inject(VALIDATORS); \u002F\u002F Validator[]\n  \n  validate(value: string): ValidationError[] {\n    return this.validators\n      .map(v => v.validate(value))\n      .filter(Boolean);\n  }\n}\n```\n\n### HTTP Interceptors (Multi Provider)\n\n```typescript\n\u002F\u002F Interceptors use multi providers internally\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    provideHttpClient(\n      withInterceptors([\n        authInterceptor,\n        loggingInterceptor,\n        errorInterceptor,\n      ])\n    ),\n  ],\n};\n```\n\n## App Initializers\n\nRun async code before app starts using `provideAppInitializer`:\n\n```typescript\nimport { provideAppInitializer, inject } from '@angular\u002Fcore';\n\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    Config,\n    provideAppInitializer(() => {\n      const configService = inject(Config);\n      return configService.loadConfig();\n    }),\n  ],\n};\n```\n\n### Multiple Initializers\n\n```typescript\nproviders: [\n  provideAppInitializer(() => {\n    const config = inject(Config);\n    return config.load();\n  }),\n  provideAppInitializer(() => {\n    const auth = inject(Auth);\n    return auth.checkSession();\n  }),\n]\n```\n\n## Environment Injector\n\nCreate injectors programmatically:\n\n```typescript\nimport { createEnvironmentInjector, EnvironmentInjector, inject } from '@angular\u002Fcore';\n\n@Injectable({ providedIn: 'root' })\nexport class Plugin {\n  private parentInjector = inject(EnvironmentInjector);\n  \n  loadPlugin(providers: Provider[]): EnvironmentInjector {\n    return createEnvironmentInjector(providers, this.parentInjector);\n  }\n}\n```\n\n## runInInjectionContext\n\nRun code with injection context:\n\n```typescript\nimport { runInInjectionContext, EnvironmentInjector, inject } from '@angular\u002Fcore';\n\n@Injectable({ providedIn: 'root' })\nexport class Utility {\n  private injector = inject(EnvironmentInjector);\n  \n  executeWithDI\u003CT>(fn: () => T): T {\n    return runInInjectionContext(this.injector, fn);\n  }\n}\n\n\u002F\u002F Usage\nutilityService.executeWithDI(() => {\n  const http = inject(HttpClient);\n  \u002F\u002F Use http...\n});\n```\n\nFor advanced patterns, see [references\u002Fdi-patterns.md](references\u002Fdi-patterns.md).\n\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fanalogjs\u002Fangular-skills\u002Fangular-di",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill angular-di",{"tool":56,"command":57},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill angular-di",{"tool":59,"command":60},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill angular-di","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fanalogjs\u002Fangular-skills\u002Fangular-di\u002FSKILL.md",true,[],[65,79,89,98,104,111],{"skillNo":66,"name":67,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":75,"publishedAt":36},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[70],{"categoryNo":71,"categoryName":72,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[76,77,78],"model","model hierarchy","model hierarchy skill",{"skillNo":80,"name":81,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":85,"publishedAt":36},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[84],{"categoryNo":71,"categoryName":72,"taxonomyType":73,"taxonomyTypeDesc":74},[86,87,88],"MCP","zoom","zoom mcp",{"skillNo":90,"name":91,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":36},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[95,96,97,87],"sdk","zoom apps sdk","apps",{"skillNo":99,"name":100,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":36},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[100],{"skillNo":105,"name":106,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":110,"publishedAt":36},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[109],{"categoryNo":71,"categoryName":72,"taxonomyType":73,"taxonomyTypeDesc":74},[106],{"skillNo":112,"name":113,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":36},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[113]]