{"version":3,"file":"utils.mjs","sources":["../../src/generators/utils.ts"],"sourcesContent":["import path from 'node:path';\nimport assert from 'node:assert';\nimport * as ts from 'typescript';\nimport fse from 'fs-extra';\nimport chalk from 'chalk';\n\nconst { factory } = ts;\n\nconst MODULE_DECLARATION = '@strapi/strapi';\nconst PUBLIC_NAMESPACE = 'Public';\n\n/**\n * Aggregate the given TypeScript nodes into a single string\n */\nexport const emitDefinitions = (definitions: ts.Node[]): string => {\n  const nodeArray = factory.createNodeArray(definitions);\n\n  const sourceFile = ts.createSourceFile(\n    'placeholder.ts',\n    '',\n    ts.ScriptTarget.ESNext,\n    true,\n    ts.ScriptKind.TS\n  );\n\n  const printer = ts.createPrinter({ omitTrailingSemicolon: true });\n\n  return printer.printList(ts.ListFormat.MultiLine, nodeArray, sourceFile);\n};\n\n/**\n * Save the given string representation of TS nodes in a file\n * If the given directory doesn't exist, it'll be created automatically\n *\n * @return The path of the created file\n */\nexport const saveDefinitionToFileSystem = async (\n  dir: string,\n  file: string,\n  content: string\n): Promise<string> => {\n  const filepath = path.join(dir, file);\n\n  fse.ensureDirSync(dir);\n  await fse.writeFile(filepath, content);\n\n  return filepath;\n};\n\n/**\n * Format the given definitions.\n * Uses the existing config if one is defined in the project.\n */\nexport const format = async (content: string): Promise<string> => {\n  // eslint-disable-next-line node/no-unsupported-features/es-syntax\n  const prettier = await import('prettier'); // ESM-only\n\n  const configFile = await prettier.resolveConfigFile();\n  const config: any = configFile\n    ? await prettier.resolveConfig(configFile)\n    : // Default config\n      {\n        singleQuote: true,\n        useTabs: false,\n        tabWidth: 2,\n      };\n\n  Object.assign(config, { parser: 'typescript' });\n\n  return prettier.format(content, config);\n};\n\n/**\n * Generate the extension block for a shared component from strapi/strapi\n */\nexport const generateSharedExtensionDefinition = (\n  registry: string,\n  definitions: Array<{ uid: string; definition: ts.InterfaceDeclaration }>\n): ts.ModuleDeclaration => {\n  const properties = definitions.map(({ uid, definition }) =>\n    factory.createPropertySignature(\n      undefined,\n      factory.createStringLiteral(uid, true),\n      undefined,\n      factory.createTypeReferenceNode(\n        factory.createIdentifier(definition.name.escapedText as string)\n      )\n    )\n  );\n\n  return factory.createModuleDeclaration(\n    [factory.createModifier(ts.SyntaxKind.DeclareKeyword)],\n    factory.createStringLiteral(MODULE_DECLARATION, true),\n    factory.createModuleBlock([\n      factory.createModuleDeclaration(\n        [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n        factory.createIdentifier(PUBLIC_NAMESPACE),\n        factory.createModuleBlock(\n          properties.length > 0\n            ? [\n                factory.createInterfaceDeclaration(\n                  [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n                  factory.createIdentifier(registry),\n                  undefined,\n                  undefined,\n                  properties\n                ),\n              ]\n            : []\n        ),\n        ts.NodeFlags.Namespace\n      ),\n    ]),\n    ts.NodeFlags.ExportContext\n  );\n};\n\ninterface CreateLoggerOptions {\n  silent?: boolean;\n  debug?: boolean;\n}\n\nexport const createLogger = (options: CreateLoggerOptions = {}) => {\n  const { silent = false, debug = false } = options;\n\n  const state = { errors: 0, warning: 0 };\n\n  return {\n    get warnings() {\n      return state.warning;\n    },\n\n    get errors() {\n      return state.errors;\n    },\n\n    debug(...args: any[]) {\n      if (silent || !debug) {\n        return;\n      }\n\n      console.log(chalk.cyan(`[DEBUG]\\t[${new Date().toISOString()}] (Typegen)`), ...args);\n    },\n\n    info(...args: any[]) {\n      if (silent) {\n        return;\n      }\n\n      console.info(chalk.blue(`[INFO]\\t[${new Date().toISOString()}] (Typegen)`), ...args);\n    },\n\n    warn(...args: any[]) {\n      state.warning += 1;\n\n      if (silent) {\n        return;\n      }\n\n      console.warn(chalk.yellow(`[WARN]\\t[${new Date().toISOString()}] (Typegen)`), ...args);\n    },\n\n    error(...args: any[]) {\n      state.errors += 1;\n\n      if (silent) {\n        return;\n      }\n\n      console.error(chalk.red(`[ERROR]\\t[${new Date().toISOString()}] (Typegen)`), ...args);\n    },\n  };\n};\n\nexport const timer = () => {\n  const state: { start: number | null; end: number | null } = {\n    start: null,\n    end: null,\n  };\n\n  return {\n    start() {\n      assert(state.start === null, 'The timer has already been started');\n      assert(state.end === null, 'The timer has already been ended');\n\n      state.start = Date.now();\n\n      return this;\n    },\n\n    end() {\n      assert(state.start !== null, 'The timer needs to be started before ending it');\n      assert(state.end === null, 'The timer has already been ended');\n\n      state.end = Date.now();\n\n      return this;\n    },\n\n    get duration() {\n      assert(state.start !== null, 'The timer has not been started');\n\n      return (((state.end ?? Date.now) as any) - (state.start as number)) / 1000;\n    },\n  };\n};\n\nexport type Logger = ReturnType<typeof createLogger>;\n\n/**\n * Options passed to each artifact generator (content-types, components).\n */\nexport interface GeneratorOptions {\n  strapi: any;\n  logger: Logger;\n  pwd?: string;\n}\n"],"names":["factory","ts","MODULE_DECLARATION","PUBLIC_NAMESPACE","emitDefinitions","definitions","nodeArray","createNodeArray","sourceFile","createSourceFile","ScriptTarget","ESNext","ScriptKind","TS","printer","createPrinter","omitTrailingSemicolon","printList","ListFormat","MultiLine","saveDefinitionToFileSystem","dir","file","content","filepath","path","join","fse","ensureDirSync","writeFile","format","prettier","configFile","resolveConfigFile","config","resolveConfig","singleQuote","useTabs","tabWidth","Object","assign","parser","generateSharedExtensionDefinition","registry","properties","map","uid","definition","createPropertySignature","undefined","createStringLiteral","createTypeReferenceNode","createIdentifier","name","escapedText","createModuleDeclaration","createModifier","SyntaxKind","DeclareKeyword","createModuleBlock","ExportKeyword","length","createInterfaceDeclaration","NodeFlags","Namespace","ExportContext","createLogger","options","silent","debug","state","errors","warning","warnings","args","console","log","chalk","cyan","Date","toISOString","info","blue","warn","yellow","error","red","timer","start","end","assert","now","duration"],"mappings":";;;;;;AAMA,MAAM,EAAEA,OAAO,EAAE,GAAGC,EAAAA;AAEpB,MAAMC,kBAAAA,GAAqB,gBAAA;AAC3B,MAAMC,gBAAAA,GAAmB,QAAA;AAEzB;;IAGO,MAAMC,eAAAA,GAAkB,CAACC,WAAAA,GAAAA;IAC9B,MAAMC,SAAAA,GAAYN,OAAAA,CAAQO,eAAe,CAACF,WAAAA,CAAAA;AAE1C,IAAA,MAAMG,UAAAA,GAAaP,EAAAA,CAAGQ,gBAAgB,CACpC,kBACA,EAAA,EACAR,EAAAA,CAAGS,YAAY,CAACC,MAAM,EACtB,IAAA,EACAV,EAAAA,CAAGW,UAAU,CAACC,EAAE,CAAA;IAGlB,MAAMC,OAAAA,GAAUb,EAAAA,CAAGc,aAAa,CAAC;QAAEC,qBAAAA,EAAuB;AAAK,KAAA,CAAA;IAE/D,OAAOF,OAAAA,CAAQG,SAAS,CAAChB,EAAAA,CAAGiB,UAAU,CAACC,SAAS,EAAEb,SAAAA,EAAWE,UAAAA,CAAAA;AAC/D;AAEA;;;;;AAKC,IACM,MAAMY,0BAAAA,GAA6B,OACxCC,KACAC,IAAAA,EACAC,OAAAA,GAAAA;AAEA,IAAA,MAAMC,QAAAA,GAAWC,IAAAA,CAAKC,IAAI,CAACL,GAAAA,EAAKC,IAAAA,CAAAA;AAEhCK,IAAAA,GAAAA,CAAIC,aAAa,CAACP,GAAAA,CAAAA;IAClB,MAAMM,GAAAA,CAAIE,SAAS,CAACL,QAAAA,EAAUD,OAAAA,CAAAA;IAE9B,OAAOC,QAAAA;AACT;AAEA;;;IAIO,MAAMM,MAAAA,GAAS,OAAOP,OAAAA,GAAAA;;AAE3B,IAAA,MAAMQ,QAAAA,GAAW,MAAM,OAAO;IAE9B,MAAMC,UAAAA,GAAa,MAAMD,QAAAA,CAASE,iBAAiB,EAAA;AACnD,IAAA,MAAMC,SAAcF,UAAAA,GAChB,MAAMD,QAAAA,CAASI,aAAa,CAACH,UAAAA,CAAAA,GAE7B;QACEI,WAAAA,EAAa,IAAA;QACbC,OAAAA,EAAS,KAAA;QACTC,QAAAA,EAAU;AACZ,KAAA;IAEJC,MAAAA,CAAOC,MAAM,CAACN,MAAAA,EAAQ;QAAEO,MAAAA,EAAQ;AAAa,KAAA,CAAA;IAE7C,OAAOV,QAAAA,CAASD,MAAM,CAACP,OAAAA,EAASW,MAAAA,CAAAA;AAClC;AAEA;;AAEC,IACM,MAAMQ,iCAAAA,GAAoC,CAC/CC,QAAAA,EACAtC,WAAAA,GAAAA;AAEA,IAAA,MAAMuC,UAAAA,GAAavC,WAAAA,CAAYwC,GAAG,CAAC,CAAC,EAAEC,GAAG,EAAEC,UAAU,EAAE,GACrD/C,OAAAA,CAAQgD,uBAAuB,CAC7BC,SAAAA,EACAjD,OAAAA,CAAQkD,mBAAmB,CAACJ,GAAAA,EAAK,IAAA,CAAA,EACjCG,SAAAA,EACAjD,OAAAA,CAAQmD,uBAAuB,CAC7BnD,OAAAA,CAAQoD,gBAAgB,CAACL,UAAAA,CAAWM,IAAI,CAACC,WAAW,CAAA,CAAA,CAAA,CAAA;IAK1D,OAAOtD,OAAAA,CAAQuD,uBAAuB,CACpC;AAACvD,QAAAA,OAAAA,CAAQwD,cAAc,CAACvD,EAAAA,CAAGwD,UAAU,CAACC,cAAc;AAAE,KAAA,EACtD1D,QAAQkD,mBAAmB,CAAChD,oBAAoB,IAAA,CAAA,EAChDF,OAAAA,CAAQ2D,iBAAiB,CAAC;AACxB3D,QAAAA,OAAAA,CAAQuD,uBAAuB,CAC7B;AAACvD,YAAAA,OAAAA,CAAQwD,cAAc,CAACvD,EAAAA,CAAGwD,UAAU,CAACG,aAAa;SAAE,EACrD5D,OAAAA,CAAQoD,gBAAgB,CAACjD,gBAAAA,CAAAA,EACzBH,OAAAA,CAAQ2D,iBAAiB,CACvBf,UAAAA,CAAWiB,MAAM,GAAG,CAAA,GAChB;AACE7D,YAAAA,OAAAA,CAAQ8D,0BAA0B,CAChC;AAAC9D,gBAAAA,OAAAA,CAAQwD,cAAc,CAACvD,EAAAA,CAAGwD,UAAU,CAACG,aAAa;AAAE,aAAA,EACrD5D,OAAAA,CAAQoD,gBAAgB,CAACT,QAAAA,CAAAA,EACzBM,WACAA,SAAAA,EACAL,UAAAA;AAEH,SAAA,GACD,EAAE,CAAA,EAER3C,EAAAA,CAAG8D,SAAS,CAACC,SAAS;KAEzB,CAAA,EACD/D,EAAAA,CAAG8D,SAAS,CAACE,aAAa,CAAA;AAE9B;AAOO,MAAMC,YAAAA,GAAe,CAACC,OAAAA,GAA+B,EAAE,GAAA;AAC5D,IAAA,MAAM,EAAEC,MAAAA,GAAS,KAAK,EAAEC,KAAAA,GAAQ,KAAK,EAAE,GAAGF,OAAAA;AAE1C,IAAA,MAAMG,KAAAA,GAAQ;QAAEC,MAAAA,EAAQ,CAAA;QAAGC,OAAAA,EAAS;AAAE,KAAA;IAEtC,OAAO;AACL,QAAA,IAAIC,QAAAA,CAAAA,GAAW;AACb,YAAA,OAAOH,MAAME,OAAO;AACtB,QAAA,CAAA;AAEA,QAAA,IAAID,MAAAA,CAAAA,GAAS;AACX,YAAA,OAAOD,MAAMC,MAAM;AACrB,QAAA,CAAA;AAEAF,QAAAA,KAAAA,CAAAA,CAAM,GAAGK,IAAW,EAAA;YAClB,IAAIN,MAAAA,IAAU,CAACC,KAAAA,EAAO;AACpB,gBAAA;AACF,YAAA;AAEAM,YAAAA,OAAAA,CAAQC,GAAG,CAACC,KAAAA,CAAMC,IAAI,CAAC,CAAC,UAAU,EAAE,IAAIC,IAAAA,EAAAA,CAAOC,WAAW,EAAA,CAAG,WAAW,CAAC,CAAA,EAAA,GAAMN,IAAAA,CAAAA;AACjF,QAAA,CAAA;AAEAO,QAAAA,IAAAA,CAAAA,CAAK,GAAGP,IAAW,EAAA;AACjB,YAAA,IAAIN,MAAAA,EAAQ;AACV,gBAAA;AACF,YAAA;AAEAO,YAAAA,OAAAA,CAAQM,IAAI,CAACJ,KAAAA,CAAMK,IAAI,CAAC,CAAC,SAAS,EAAE,IAAIH,IAAAA,EAAAA,CAAOC,WAAW,EAAA,CAAG,WAAW,CAAC,CAAA,EAAA,GAAMN,IAAAA,CAAAA;AACjF,QAAA,CAAA;AAEAS,QAAAA,IAAAA,CAAAA,CAAK,GAAGT,IAAW,EAAA;AACjBJ,YAAAA,KAAAA,CAAME,OAAO,IAAI,CAAA;AAEjB,YAAA,IAAIJ,MAAAA,EAAQ;AACV,gBAAA;AACF,YAAA;AAEAO,YAAAA,OAAAA,CAAQQ,IAAI,CAACN,KAAAA,CAAMO,MAAM,CAAC,CAAC,SAAS,EAAE,IAAIL,IAAAA,EAAAA,CAAOC,WAAW,EAAA,CAAG,WAAW,CAAC,CAAA,EAAA,GAAMN,IAAAA,CAAAA;AACnF,QAAA,CAAA;AAEAW,QAAAA,KAAAA,CAAAA,CAAM,GAAGX,IAAW,EAAA;AAClBJ,YAAAA,KAAAA,CAAMC,MAAM,IAAI,CAAA;AAEhB,YAAA,IAAIH,MAAAA,EAAQ;AACV,gBAAA;AACF,YAAA;AAEAO,YAAAA,OAAAA,CAAQU,KAAK,CAACR,KAAAA,CAAMS,GAAG,CAAC,CAAC,UAAU,EAAE,IAAIP,IAAAA,EAAAA,CAAOC,WAAW,EAAA,CAAG,WAAW,CAAC,CAAA,EAAA,GAAMN,IAAAA,CAAAA;AAClF,QAAA;AACF,KAAA;AACF;MAEaa,KAAAA,GAAQ,IAAA;AACnB,IAAA,MAAMjB,KAAAA,GAAsD;QAC1DkB,KAAAA,EAAO,IAAA;QACPC,GAAAA,EAAK;AACP,KAAA;IAEA,OAAO;AACLD,QAAAA,KAAAA,CAAAA,GAAAA;YACEE,MAAAA,CAAOpB,KAAAA,CAAMkB,KAAK,KAAK,IAAA,EAAM,oCAAA,CAAA;YAC7BE,MAAAA,CAAOpB,KAAAA,CAAMmB,GAAG,KAAK,IAAA,EAAM,kCAAA,CAAA;YAE3BnB,KAAAA,CAAMkB,KAAK,GAAGT,IAAAA,CAAKY,GAAG,EAAA;AAEtB,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAF,QAAAA,GAAAA,CAAAA,GAAAA;YACEC,MAAAA,CAAOpB,KAAAA,CAAMkB,KAAK,KAAK,IAAA,EAAM,gDAAA,CAAA;YAC7BE,MAAAA,CAAOpB,KAAAA,CAAMmB,GAAG,KAAK,IAAA,EAAM,kCAAA,CAAA;YAE3BnB,KAAAA,CAAMmB,GAAG,GAAGV,IAAAA,CAAKY,GAAG,EAAA;AAEpB,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEA,QAAA,IAAIC,QAAAA,CAAAA,GAAW;YACbF,MAAAA,CAAOpB,KAAAA,CAAMkB,KAAK,KAAK,IAAA,EAAM,gCAAA,CAAA;AAE7B,YAAA,OAAO,CAAC,CAAElB,MAAMmB,GAAG,IAAIV,IAAAA,CAAKY,GAAG,IAAarB,KAAAA,CAAMkB,KAAK,IAAe,IAAA;AACxE,QAAA;AACF,KAAA;AACF;;;;"}