skuba 14.0.0-hacky-hack-lang-json-20260109054110 → 14.0.0-hacky-hack-lang-json-20260109075700

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -52,13 +52,20 @@ const patchRootConfig = async ({
52
52
  };
53
53
  }
54
54
  try {
55
+ const treeSitterCliDir = import_path.default.dirname(
56
+ require.resolve("tree-sitter-cli/package.json")
57
+ );
58
+ const treeSitterExec = (0, import_exec.createExec)({
59
+ cwd: treeSitterCliDir
60
+ });
61
+ await treeSitterExec("node", "run", "install");
55
62
  const astGrepJsonDir = import_path.default.dirname(
56
63
  require.resolve("@ast-grep/lang-json/package.json")
57
64
  );
58
- const exec = (0, import_exec.createExec)({
65
+ const astGrepExec = (0, import_exec.createExec)({
59
66
  cwd: astGrepJsonDir
60
67
  });
61
- await exec("npm", "run", "postinstall");
68
+ await astGrepExec("node", "run", "postinstall");
62
69
  } catch (err) {
63
70
  import_logging.log.warn(
64
71
  "Failed to run @ast-grep/lang-json postinstall step, AST parsing may fail"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/cli/lint/internalLints/upgrade/patches/13.1.1/patchRootTsconfig.ts"],
4
- "sourcesContent": ["import path from 'path';\nimport { inspect } from 'util';\n\nimport json from '@ast-grep/lang-json';\nimport { parseAsync, registerDynamicLanguage } from '@ast-grep/napi';\nimport fs from 'fs-extra';\n\nimport { createExec } from '../../../../../../utils/exec.js';\nimport { log } from '../../../../../../utils/logging.js';\nimport type { PatchFunction, PatchReturnType } from '../../index.js';\n\nexport const patchRootConfig: PatchFunction = async ({\n mode,\n}): Promise<PatchReturnType> => {\n let tsconfigFile: string;\n try {\n tsconfigFile = await fs.promises.readFile('tsconfig.json', 'utf8');\n } catch {\n return {\n result: 'skip',\n reason: 'no root tsconfig.json found',\n };\n }\n\n // @ast-grep/json requires a postinstall step to build the native bindings\n // which may not have run in alpine due to pnpm not trusting scripts by default\n try {\n const astGrepJsonDir = path.dirname(\n require.resolve('@ast-grep/lang-json/package.json'),\n );\n const exec = createExec({\n cwd: astGrepJsonDir,\n });\n await exec('npm', 'run', 'postinstall');\n } catch (err) {\n log.warn(\n 'Failed to run @ast-grep/lang-json postinstall step, AST parsing may fail',\n );\n log.subtle(inspect(err));\n }\n\n registerDynamicLanguage({ json });\n const tsconfig = await parseAsync('json', tsconfigFile);\n const ast = tsconfig.root();\n\n const compilerOptionsObj = ast.find({\n rule: {\n pattern: {\n context: '{\"compilerOptions\":}',\n selector: 'pair',\n },\n },\n });\n\n if (!compilerOptionsObj) {\n const startingBracket = ast.find({ rule: { pattern: '{' } });\n\n if (!startingBracket) {\n return {\n result: 'skip',\n reason: 'Unable to parse tsconfig.json',\n };\n }\n\n const edit = startingBracket.replace(\n `{\n \"compilerOptions\": {\n \"rootDir\": \".\"\n },`,\n );\n\n const newSource = ast.commitEdits([edit]);\n\n if (mode === 'lint') {\n return {\n result: 'apply',\n };\n }\n\n await fs.promises.writeFile('tsconfig.json', newSource, 'utf8');\n\n return {\n result: 'apply',\n };\n }\n\n const rootDirOption = compilerOptionsObj.find({\n rule: { pattern: '\"rootDir\"' },\n });\n\n if (rootDirOption) {\n return {\n result: 'skip',\n reason: 'rootDir already set in tsconfig.json',\n };\n }\n\n const compilerOptionsStart = compilerOptionsObj.find({\n rule: { pattern: '{' },\n });\n\n if (!compilerOptionsStart) {\n return {\n result: 'skip',\n reason: 'Unable to parse tsconfig.json compilerOptions',\n };\n }\n\n const edit = compilerOptionsStart.replace(`{\n \"rootDir\": \".\",`);\n\n const newSource = ast.commitEdits([edit]);\n\n if (mode === 'lint') {\n return {\n result: 'apply',\n };\n }\n\n await fs.promises.writeFile('tsconfig.json', newSource, 'utf8');\n\n return {\n result: 'apply',\n };\n};\n\nexport const tryPatchRootTsConfig: PatchFunction = async (config) => {\n try {\n return await patchRootConfig(config);\n } catch (err) {\n log.warn('Failed to patch root `tsconfig.json`');\n log.subtle(inspect(err));\n return { result: 'skip', reason: 'due to an error' };\n }\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AACjB,kBAAwB;AAExB,uBAAiB;AACjB,kBAAoD;AACpD,sBAAe;AAEf,kBAA2B;AAC3B,qBAAoB;AAGb,MAAM,kBAAiC,OAAO;AAAA,EACnD;AACF,MAAgC;AAC9B,MAAI;AACJ,MAAI;AACF,mBAAe,MAAM,gBAAAA,QAAG,SAAS,SAAS,iBAAiB,MAAM;AAAA,EACnE,QAAQ;AACN,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAIA,MAAI;AACF,UAAM,iBAAiB,YAAAC,QAAK;AAAA,MAC1B,gBAAgB,kCAAkC;AAAA,IACpD;AACA,UAAM,WAAO,wBAAW;AAAA,MACtB,KAAK;AAAA,IACP,CAAC;AACD,UAAM,KAAK,OAAO,OAAO,aAAa;AAAA,EACxC,SAAS,KAAK;AACZ,uBAAI;AAAA,MACF;AAAA,IACF;AACA,uBAAI,WAAO,qBAAQ,GAAG,CAAC;AAAA,EACzB;AAEA,2CAAwB,EAAE,uBAAAC,QAAK,CAAC;AAChC,QAAM,WAAW,UAAM,wBAAW,QAAQ,YAAY;AACtD,QAAM,MAAM,SAAS,KAAK;AAE1B,QAAM,qBAAqB,IAAI,KAAK;AAAA,IAClC,MAAM;AAAA,MACJ,SAAS;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,CAAC,oBAAoB;AACvB,UAAM,kBAAkB,IAAI,KAAK,EAAE,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC;AAE3D,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAMC,QAAO,gBAAgB;AAAA,MAC3B;AAAA;AAAA;AAAA;AAAA,IAIF;AAEA,UAAMC,aAAY,IAAI,YAAY,CAACD,KAAI,CAAC;AAExC,QAAI,SAAS,QAAQ;AACnB,aAAO;AAAA,QACL,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,gBAAAH,QAAG,SAAS,UAAU,iBAAiBI,YAAW,MAAM;AAE9D,WAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,gBAAgB,mBAAmB,KAAK;AAAA,IAC5C,MAAM,EAAE,SAAS,YAAY;AAAA,EAC/B,CAAC;AAED,MAAI,eAAe;AACjB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,uBAAuB,mBAAmB,KAAK;AAAA,IACnD,MAAM,EAAE,SAAS,IAAI;AAAA,EACvB,CAAC;AAED,MAAI,CAAC,sBAAsB;AACzB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,OAAO,qBAAqB,QAAQ;AAAA,oBACxB;AAElB,QAAM,YAAY,IAAI,YAAY,CAAC,IAAI,CAAC;AAExC,MAAI,SAAS,QAAQ;AACnB,WAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,gBAAAJ,QAAG,SAAS,UAAU,iBAAiB,WAAW,MAAM;AAE9D,SAAO;AAAA,IACL,QAAQ;AAAA,EACV;AACF;AAEO,MAAM,uBAAsC,OAAO,WAAW;AACnE,MAAI;AACF,WAAO,MAAM,gBAAgB,MAAM;AAAA,EACrC,SAAS,KAAK;AACZ,uBAAI,KAAK,sCAAsC;AAC/C,uBAAI,WAAO,qBAAQ,GAAG,CAAC;AACvB,WAAO,EAAE,QAAQ,QAAQ,QAAQ,kBAAkB;AAAA,EACrD;AACF;",
4
+ "sourcesContent": ["import path from 'path';\nimport { inspect } from 'util';\n\nimport json from '@ast-grep/lang-json';\nimport { parseAsync, registerDynamicLanguage } from '@ast-grep/napi';\nimport fs from 'fs-extra';\n\nimport { createExec } from '../../../../../../utils/exec.js';\nimport { log } from '../../../../../../utils/logging.js';\nimport type { PatchFunction, PatchReturnType } from '../../index.js';\n\nexport const patchRootConfig: PatchFunction = async ({\n mode,\n}): Promise<PatchReturnType> => {\n let tsconfigFile: string;\n try {\n tsconfigFile = await fs.promises.readFile('tsconfig.json', 'utf8');\n } catch {\n return {\n result: 'skip',\n reason: 'no root tsconfig.json found',\n };\n }\n\n // @ast-grep/json requires a postinstall step to build the native bindings\n // which may not have run in alpine due to pnpm not trusting scripts by default\n try {\n const treeSitterCliDir = path.dirname(\n require.resolve('tree-sitter-cli/package.json'),\n );\n const treeSitterExec = createExec({\n cwd: treeSitterCliDir,\n });\n await treeSitterExec('node', 'run', 'install');\n\n const astGrepJsonDir = path.dirname(\n require.resolve('@ast-grep/lang-json/package.json'),\n );\n const astGrepExec = createExec({\n cwd: astGrepJsonDir,\n });\n await astGrepExec('node', 'run', 'postinstall');\n } catch (err) {\n log.warn(\n 'Failed to run @ast-grep/lang-json postinstall step, AST parsing may fail',\n );\n log.subtle(inspect(err));\n }\n\n registerDynamicLanguage({ json });\n const tsconfig = await parseAsync('json', tsconfigFile);\n const ast = tsconfig.root();\n\n const compilerOptionsObj = ast.find({\n rule: {\n pattern: {\n context: '{\"compilerOptions\":}',\n selector: 'pair',\n },\n },\n });\n\n if (!compilerOptionsObj) {\n const startingBracket = ast.find({ rule: { pattern: '{' } });\n\n if (!startingBracket) {\n return {\n result: 'skip',\n reason: 'Unable to parse tsconfig.json',\n };\n }\n\n const edit = startingBracket.replace(\n `{\n \"compilerOptions\": {\n \"rootDir\": \".\"\n },`,\n );\n\n const newSource = ast.commitEdits([edit]);\n\n if (mode === 'lint') {\n return {\n result: 'apply',\n };\n }\n\n await fs.promises.writeFile('tsconfig.json', newSource, 'utf8');\n\n return {\n result: 'apply',\n };\n }\n\n const rootDirOption = compilerOptionsObj.find({\n rule: { pattern: '\"rootDir\"' },\n });\n\n if (rootDirOption) {\n return {\n result: 'skip',\n reason: 'rootDir already set in tsconfig.json',\n };\n }\n\n const compilerOptionsStart = compilerOptionsObj.find({\n rule: { pattern: '{' },\n });\n\n if (!compilerOptionsStart) {\n return {\n result: 'skip',\n reason: 'Unable to parse tsconfig.json compilerOptions',\n };\n }\n\n const edit = compilerOptionsStart.replace(`{\n \"rootDir\": \".\",`);\n\n const newSource = ast.commitEdits([edit]);\n\n if (mode === 'lint') {\n return {\n result: 'apply',\n };\n }\n\n await fs.promises.writeFile('tsconfig.json', newSource, 'utf8');\n\n return {\n result: 'apply',\n };\n};\n\nexport const tryPatchRootTsConfig: PatchFunction = async (config) => {\n try {\n return await patchRootConfig(config);\n } catch (err) {\n log.warn('Failed to patch root `tsconfig.json`');\n log.subtle(inspect(err));\n return { result: 'skip', reason: 'due to an error' };\n }\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["fs", "path", "json", "edit", "newSource"]
7
7
  }
@@ -1,9 +1,9 @@
1
- import readPkgUp, { type NormalizedPackageJson } from 'read-pkg-up';
1
+ import readPkgUp from 'read-pkg-up';
2
2
  import * as z from 'zod/v4';
3
3
  export type ProjectType = z.infer<typeof projectTypeSchema>;
4
4
  export declare const projectTypeSchema: z.ZodUnion<readonly [z.ZodLiteral<"application">, z.ZodLiteral<"package">]>;
5
5
  export declare const PROJECT_TYPES: readonly ["application", "package"];
6
- export declare const getSkubaManifest: () => Promise<NormalizedPackageJson>;
6
+ export declare const getSkubaManifest: () => Promise<readPkgUp.NormalizedReadResult>;
7
7
  export declare const getConsumerManifest: (cwd?: string) => Promise<readPkgUp.ReadResult | undefined>;
8
8
  export declare const getManifestProperties: <T extends string, V = unknown>(prop: T) => Promise<{
9
9
  value: V | undefined;
@@ -55,7 +55,7 @@ const getSkubaManifest = async () => {
55
55
  if (result === void 0) {
56
56
  throw Error("skuba could not find its own manifest");
57
57
  }
58
- return skubaManifest = result.packageJson;
58
+ return result;
59
59
  };
60
60
  const getConsumerManifest = (cwd) => (0, import_read_pkg_up.default)({ cwd, normalize: false });
61
61
  const getManifestProperties = async (prop) => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/manifest.ts"],
4
- "sourcesContent": ["import readPkgUp, { type NormalizedPackageJson } from 'read-pkg-up';\nimport * as z from 'zod/v4';\n\nimport { hasProp } from './validation.js';\n\nexport type ProjectType = z.infer<typeof projectTypeSchema>;\n\nexport const projectTypeSchema = z.union([\n z.literal('application'),\n z.literal('package'),\n]);\n\nexport const PROJECT_TYPES = ['application', 'package'] as const;\n\nconst DEFAULT_ENTRY_POINT = 'src/app.ts';\n\nlet skubaManifest: NormalizedPackageJson | undefined;\n\nexport const getSkubaManifest = async (): Promise<NormalizedPackageJson> => {\n if (skubaManifest !== undefined) {\n return skubaManifest;\n }\n\n const result = await readPkgUp({ cwd: __dirname });\n\n if (result === undefined) {\n throw Error('skuba could not find its own manifest');\n }\n\n return (skubaManifest = result.packageJson);\n};\n\nexport const getConsumerManifest = (cwd?: string) =>\n readPkgUp({ cwd, normalize: false });\n\nexport const getManifestProperties = async <T extends string, V = unknown>(\n prop: T,\n): Promise<\n | {\n value: V | undefined;\n type: string | undefined;\n path: string;\n }\n | undefined\n> => {\n const manifest = await getConsumerManifest();\n\n if (!manifest) {\n return undefined;\n }\n\n const value = hasProp<T, V>(manifest.packageJson.skuba, prop)\n ? manifest.packageJson.skuba[prop]\n : undefined;\n\n const type =\n typeof manifest.packageJson.type === 'string'\n ? manifest.packageJson.type\n : undefined;\n\n return {\n value,\n type,\n path: manifest.path,\n };\n};\n\nexport const getStringPropFromConsumerManifest = async <T extends string>(\n prop: T,\n): Promise<string | undefined> => {\n const manifest = await getManifestProperties(prop);\n\n return typeof manifest?.value === 'string' ? manifest.value : undefined;\n};\n\nexport const getEntryPointFromManifest = async (): Promise<string> => {\n const entryPoint = await getStringPropFromConsumerManifest('entryPoint');\n\n return entryPoint ?? DEFAULT_ENTRY_POINT;\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAsD;AACtD,QAAmB;AAEnB,wBAAwB;AAIjB,MAAM,oBAAoB,EAAE,MAAM;AAAA,EACvC,EAAE,QAAQ,aAAa;AAAA,EACvB,EAAE,QAAQ,SAAS;AACrB,CAAC;AAEM,MAAM,gBAAgB,CAAC,eAAe,SAAS;AAEtD,MAAM,sBAAsB;AAE5B,IAAI;AAEG,MAAM,mBAAmB,YAA4C;AAC1E,MAAI,kBAAkB,QAAW;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,UAAM,mBAAAA,SAAU,EAAE,KAAK,UAAU,CAAC;AAEjD,MAAI,WAAW,QAAW;AACxB,UAAM,MAAM,uCAAuC;AAAA,EACrD;AAEA,SAAQ,gBAAgB,OAAO;AACjC;AAEO,MAAM,sBAAsB,CAAC,YAClC,mBAAAA,SAAU,EAAE,KAAK,WAAW,MAAM,CAAC;AAE9B,MAAM,wBAAwB,OACnC,SAQG;AACH,QAAM,WAAW,MAAM,oBAAoB;AAE3C,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,YAAQ,2BAAc,SAAS,YAAY,OAAO,IAAI,IACxD,SAAS,YAAY,MAAM,IAAI,IAC/B;AAEJ,QAAM,OACJ,OAAO,SAAS,YAAY,SAAS,WACjC,SAAS,YAAY,OACrB;AAEN,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,SAAS;AAAA,EACjB;AACF;AAEO,MAAM,oCAAoC,OAC/C,SACgC;AAChC,QAAM,WAAW,MAAM,sBAAsB,IAAI;AAEjD,SAAO,OAAO,UAAU,UAAU,WAAW,SAAS,QAAQ;AAChE;AAEO,MAAM,4BAA4B,YAA6B;AACpE,QAAM,aAAa,MAAM,kCAAkC,YAAY;AAEvE,SAAO,cAAc;AACvB;",
4
+ "sourcesContent": ["import readPkgUp from 'read-pkg-up';\nimport * as z from 'zod/v4';\n\nimport { hasProp } from './validation.js';\n\nexport type ProjectType = z.infer<typeof projectTypeSchema>;\n\nexport const projectTypeSchema = z.union([\n z.literal('application'),\n z.literal('package'),\n]);\n\nexport const PROJECT_TYPES = ['application', 'package'] as const;\n\nconst DEFAULT_ENTRY_POINT = 'src/app.ts';\n\nlet skubaManifest: readPkgUp.NormalizedReadResult | undefined;\n\nexport const getSkubaManifest =\n async (): Promise<readPkgUp.NormalizedReadResult> => {\n if (skubaManifest !== undefined) {\n return skubaManifest;\n }\n\n const result = await readPkgUp({ cwd: __dirname });\n\n if (result === undefined) {\n throw Error('skuba could not find its own manifest');\n }\n\n return result;\n };\n\nexport const getConsumerManifest = (cwd?: string) =>\n readPkgUp({ cwd, normalize: false });\n\nexport const getManifestProperties = async <T extends string, V = unknown>(\n prop: T,\n): Promise<\n | {\n value: V | undefined;\n type: string | undefined;\n path: string;\n }\n | undefined\n> => {\n const manifest = await getConsumerManifest();\n\n if (!manifest) {\n return undefined;\n }\n\n const value = hasProp<T, V>(manifest.packageJson.skuba, prop)\n ? manifest.packageJson.skuba[prop]\n : undefined;\n\n const type =\n typeof manifest.packageJson.type === 'string'\n ? manifest.packageJson.type\n : undefined;\n\n return {\n value,\n type,\n path: manifest.path,\n };\n};\n\nexport const getStringPropFromConsumerManifest = async <T extends string>(\n prop: T,\n): Promise<string | undefined> => {\n const manifest = await getManifestProperties(prop);\n\n return typeof manifest?.value === 'string' ? manifest.value : undefined;\n};\n\nexport const getEntryPointFromManifest = async (): Promise<string> => {\n const entryPoint = await getStringPropFromConsumerManifest('entryPoint');\n\n return entryPoint ?? DEFAULT_ENTRY_POINT;\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAsB;AACtB,QAAmB;AAEnB,wBAAwB;AAIjB,MAAM,oBAAoB,EAAE,MAAM;AAAA,EACvC,EAAE,QAAQ,aAAa;AAAA,EACvB,EAAE,QAAQ,SAAS;AACrB,CAAC;AAEM,MAAM,gBAAgB,CAAC,eAAe,SAAS;AAEtD,MAAM,sBAAsB;AAE5B,IAAI;AAEG,MAAM,mBACX,YAAqD;AACnD,MAAI,kBAAkB,QAAW;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,UAAM,mBAAAA,SAAU,EAAE,KAAK,UAAU,CAAC;AAEjD,MAAI,WAAW,QAAW;AACxB,UAAM,MAAM,uCAAuC;AAAA,EACrD;AAEA,SAAO;AACT;AAEK,MAAM,sBAAsB,CAAC,YAClC,mBAAAA,SAAU,EAAE,KAAK,WAAW,MAAM,CAAC;AAE9B,MAAM,wBAAwB,OACnC,SAQG;AACH,QAAM,WAAW,MAAM,oBAAoB;AAE3C,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,YAAQ,2BAAc,SAAS,YAAY,OAAO,IAAI,IACxD,SAAS,YAAY,MAAM,IAAI,IAC/B;AAEJ,QAAM,OACJ,OAAO,SAAS,YAAY,SAAS,WACjC,SAAS,YAAY,OACrB;AAEN,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,SAAS;AAAA,EACjB;AACF;AAEO,MAAM,oCAAoC,OAC/C,SACgC;AAChC,QAAM,WAAW,MAAM,sBAAsB,IAAI;AAEjD,SAAO,OAAO,UAAU,UAAU,WAAW,SAAS,QAAQ;AAChE;AAEO,MAAM,4BAA4B,YAA6B;AACpE,QAAM,aAAa,MAAM,kCAAkC,YAAY;AAEvE,SAAO,cAAc;AACvB;",
6
6
  "names": ["readPkgUp"]
7
7
  }
@@ -88,7 +88,9 @@ const latestSkubaVersion = async () => {
88
88
  }
89
89
  };
90
90
  const getSkubaVersion = async () => {
91
- const { version } = await (0, import_manifest.getSkubaManifest)();
91
+ const {
92
+ packageJson: { version }
93
+ } = await (0, import_manifest.getSkubaManifest)();
92
94
  return version;
93
95
  };
94
96
  const getSkubaVersionInfo = async () => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/version.ts"],
4
- "sourcesContent": ["import npmFetch from 'npm-registry-fetch';\nimport * as z from 'zod/v4';\n\nimport { getSkubaManifest } from './manifest.js';\nimport { withTimeout } from './wait.js';\n\nconst NpmVersions = z.record(\n z.string(),\n z.object({\n name: z.string(),\n version: z.string(),\n deprecated: z.string().optional(),\n }),\n);\n\nexport type NpmVersions = z.infer<typeof NpmVersions>;\n\nconst PackageResponse = z.object({\n 'dist-tags': z.record(z.string(), z.string()).optional(),\n versions: NpmVersions,\n});\n\nconst getNpmPackage = async (packageName: string) => {\n try {\n const response = await npmFetch.json(packageName, {\n headers: {\n Accept:\n 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*',\n },\n });\n\n const parsedResponse = PackageResponse.safeParse(response);\n if (!parsedResponse.success) {\n throw new Error(\n `Failed to parse package response from npm for package ${packageName}`,\n );\n }\n\n return parsedResponse.data;\n } catch (error) {\n if (\n error instanceof Error &&\n 'statusCode' in error &&\n error.statusCode === 404\n ) {\n return null;\n }\n throw error;\n }\n};\n\nexport const getNpmVersions = async (\n packageName: string,\n): Promise<NpmVersions | null> => {\n const response = await getNpmPackage(packageName);\n return response?.versions ?? null;\n};\n\nexport const getLatestNpmVersion = async (\n packageName: string,\n): Promise<string | null> => {\n const response = await getNpmPackage(packageName);\n return response?.['dist-tags']?.latest ?? null;\n};\n\nconst latestSkubaVersion = async (): Promise<string | null> => {\n try {\n const result = await withTimeout(getLatestNpmVersion('skuba'), { s: 2 });\n\n return result.ok ? result.value : null;\n } catch {\n return null;\n }\n};\n\nexport const getSkubaVersion = async (): Promise<string> => {\n const { version } = await getSkubaManifest();\n\n return version;\n};\n\ntype SkubaVersionInfo =\n | {\n isStale: true;\n\n local: string;\n latest: string;\n }\n | {\n isStale: false;\n\n local: string;\n latest: string | null;\n };\n\nexport const getSkubaVersionInfo = async (): Promise<SkubaVersionInfo> => {\n const [local, latest] = await Promise.all([\n getSkubaVersion(),\n latestSkubaVersion(),\n ]);\n\n if (latest === null) {\n // Assume we're up to date if we can't reach the npm registry\n return {\n isStale: false,\n local,\n latest,\n };\n }\n\n return {\n isStale: latest !== local,\n local,\n latest,\n };\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAqB;AACrB,QAAmB;AAEnB,sBAAiC;AACjC,kBAA4B;AAE5B,MAAM,cAAc,EAAE;AAAA,EACpB,EAAE,OAAO;AAAA,EACT,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,OAAO;AAAA,IACf,SAAS,EAAE,OAAO;AAAA,IAClB,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,CAAC;AACH;AAIA,MAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACvD,UAAU;AACZ,CAAC;AAED,MAAM,gBAAgB,OAAO,gBAAwB;AACnD,MAAI;AACF,UAAM,WAAW,MAAM,0BAAAA,QAAS,KAAK,aAAa;AAAA,MAChD,SAAS;AAAA,QACP,QACE;AAAA,MACJ;AAAA,IACF,CAAC;AAED,UAAM,iBAAiB,gBAAgB,UAAU,QAAQ;AACzD,QAAI,CAAC,eAAe,SAAS;AAC3B,YAAM,IAAI;AAAA,QACR,yDAAyD,WAAW;AAAA,MACtE;AAAA,IACF;AAEA,WAAO,eAAe;AAAA,EACxB,SAAS,OAAO;AACd,QACE,iBAAiB,SACjB,gBAAgB,SAChB,MAAM,eAAe,KACrB;AACA,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAEO,MAAM,iBAAiB,OAC5B,gBACgC;AAChC,QAAM,WAAW,MAAM,cAAc,WAAW;AAChD,SAAO,UAAU,YAAY;AAC/B;AAEO,MAAM,sBAAsB,OACjC,gBAC2B;AAC3B,QAAM,WAAW,MAAM,cAAc,WAAW;AAChD,SAAO,WAAW,WAAW,GAAG,UAAU;AAC5C;AAEA,MAAM,qBAAqB,YAAoC;AAC7D,MAAI;AACF,UAAM,SAAS,UAAM,yBAAY,oBAAoB,OAAO,GAAG,EAAE,GAAG,EAAE,CAAC;AAEvE,WAAO,OAAO,KAAK,OAAO,QAAQ;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,MAAM,kBAAkB,YAA6B;AAC1D,QAAM,EAAE,QAAQ,IAAI,UAAM,kCAAiB;AAE3C,SAAO;AACT;AAgBO,MAAM,sBAAsB,YAAuC;AACxE,QAAM,CAAC,OAAO,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,IACxC,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,EACrB,CAAC;AAED,MAAI,WAAW,MAAM;AAEnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,WAAW;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import npmFetch from 'npm-registry-fetch';\nimport * as z from 'zod/v4';\n\nimport { getSkubaManifest } from './manifest.js';\nimport { withTimeout } from './wait.js';\n\nconst NpmVersions = z.record(\n z.string(),\n z.object({\n name: z.string(),\n version: z.string(),\n deprecated: z.string().optional(),\n }),\n);\n\nexport type NpmVersions = z.infer<typeof NpmVersions>;\n\nconst PackageResponse = z.object({\n 'dist-tags': z.record(z.string(), z.string()).optional(),\n versions: NpmVersions,\n});\n\nconst getNpmPackage = async (packageName: string) => {\n try {\n const response = await npmFetch.json(packageName, {\n headers: {\n Accept:\n 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*',\n },\n });\n\n const parsedResponse = PackageResponse.safeParse(response);\n if (!parsedResponse.success) {\n throw new Error(\n `Failed to parse package response from npm for package ${packageName}`,\n );\n }\n\n return parsedResponse.data;\n } catch (error) {\n if (\n error instanceof Error &&\n 'statusCode' in error &&\n error.statusCode === 404\n ) {\n return null;\n }\n throw error;\n }\n};\n\nexport const getNpmVersions = async (\n packageName: string,\n): Promise<NpmVersions | null> => {\n const response = await getNpmPackage(packageName);\n return response?.versions ?? null;\n};\n\nexport const getLatestNpmVersion = async (\n packageName: string,\n): Promise<string | null> => {\n const response = await getNpmPackage(packageName);\n return response?.['dist-tags']?.latest ?? null;\n};\n\nconst latestSkubaVersion = async (): Promise<string | null> => {\n try {\n const result = await withTimeout(getLatestNpmVersion('skuba'), { s: 2 });\n\n return result.ok ? result.value : null;\n } catch {\n return null;\n }\n};\n\nexport const getSkubaVersion = async (): Promise<string> => {\n const {\n packageJson: { version },\n } = await getSkubaManifest();\n\n return version;\n};\n\ntype SkubaVersionInfo =\n | {\n isStale: true;\n\n local: string;\n latest: string;\n }\n | {\n isStale: false;\n\n local: string;\n latest: string | null;\n };\n\nexport const getSkubaVersionInfo = async (): Promise<SkubaVersionInfo> => {\n const [local, latest] = await Promise.all([\n getSkubaVersion(),\n latestSkubaVersion(),\n ]);\n\n if (latest === null) {\n // Assume we're up to date if we can't reach the npm registry\n return {\n isStale: false,\n local,\n latest,\n };\n }\n\n return {\n isStale: latest !== local,\n local,\n latest,\n };\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAqB;AACrB,QAAmB;AAEnB,sBAAiC;AACjC,kBAA4B;AAE5B,MAAM,cAAc,EAAE;AAAA,EACpB,EAAE,OAAO;AAAA,EACT,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,OAAO;AAAA,IACf,SAAS,EAAE,OAAO;AAAA,IAClB,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,CAAC;AACH;AAIA,MAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACvD,UAAU;AACZ,CAAC;AAED,MAAM,gBAAgB,OAAO,gBAAwB;AACnD,MAAI;AACF,UAAM,WAAW,MAAM,0BAAAA,QAAS,KAAK,aAAa;AAAA,MAChD,SAAS;AAAA,QACP,QACE;AAAA,MACJ;AAAA,IACF,CAAC;AAED,UAAM,iBAAiB,gBAAgB,UAAU,QAAQ;AACzD,QAAI,CAAC,eAAe,SAAS;AAC3B,YAAM,IAAI;AAAA,QACR,yDAAyD,WAAW;AAAA,MACtE;AAAA,IACF;AAEA,WAAO,eAAe;AAAA,EACxB,SAAS,OAAO;AACd,QACE,iBAAiB,SACjB,gBAAgB,SAChB,MAAM,eAAe,KACrB;AACA,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAEO,MAAM,iBAAiB,OAC5B,gBACgC;AAChC,QAAM,WAAW,MAAM,cAAc,WAAW;AAChD,SAAO,UAAU,YAAY;AAC/B;AAEO,MAAM,sBAAsB,OACjC,gBAC2B;AAC3B,QAAM,WAAW,MAAM,cAAc,WAAW;AAChD,SAAO,WAAW,WAAW,GAAG,UAAU;AAC5C;AAEA,MAAM,qBAAqB,YAAoC;AAC7D,MAAI;AACF,UAAM,SAAS,UAAM,yBAAY,oBAAoB,OAAO,GAAG,EAAE,GAAG,EAAE,CAAC;AAEvE,WAAO,OAAO,KAAK,OAAO,QAAQ;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,MAAM,kBAAkB,YAA6B;AAC1D,QAAM;AAAA,IACJ,aAAa,EAAE,QAAQ;AAAA,EACzB,IAAI,UAAM,kCAAiB;AAE3B,SAAO;AACT;AAgBO,MAAM,sBAAsB,YAAuC;AACxE,QAAM,CAAC,OAAO,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,IACxC,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,EACrB,CAAC;AAED,MAAI,WAAW,MAAM;AAEnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,WAAW;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AACF;",
6
6
  "names": ["npmFetch"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skuba",
3
- "version": "14.0.0-hacky-hack-lang-json-20260109054110",
3
+ "version": "14.0.0-hacky-hack-lang-json-20260109075700",
4
4
  "private": false,
5
5
  "description": "SEEK development toolkit for backend applications and packages",
6
6
  "homepage": "https://github.com/seek-oss/skuba#readme",
@@ -103,8 +103,8 @@
103
103
  "tsx": "^4.21.0",
104
104
  "typescript": "~5.9.0",
105
105
  "zod": "^4.0.0",
106
- "@skuba-lib/api": "^2.0.0-hacky-hack-lang-json-20260109054110",
107
- "eslint-config-skuba": "8.0.0-hacky-hack-lang-json-20260109054110"
106
+ "@skuba-lib/api": "^2.0.0-hacky-hack-lang-json-20260109075700",
107
+ "eslint-config-skuba": "8.0.0-hacky-hack-lang-json-20260109075700"
108
108
  },
109
109
  "devDependencies": {
110
110
  "@changesets/cli": "2.29.8",
@@ -19,11 +19,11 @@
19
19
  "test:watch": "skuba test --watch"
20
20
  },
21
21
  "dependencies": {
22
- "skuba-dive": "4.0.0-hacky-hack-lang-json-20260109054110"
22
+ "skuba-dive": "4.0.0-hacky-hack-lang-json-20260109075700"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/node": "^22.13.10",
26
- "skuba": "14.0.0-hacky-hack-lang-json-20260109054110"
26
+ "skuba": "14.0.0-hacky-hack-lang-json-20260109075700"
27
27
  },
28
28
  "packageManager": "pnpm@10.27.0",
29
29
  "engines": {
@@ -24,7 +24,7 @@
24
24
  "@aws-sdk/client-sns": "^3.363.0",
25
25
  "@seek/aws-codedeploy-hooks": "^2.0.0",
26
26
  "@seek/logger": "^11.1.0",
27
- "skuba-dive": "4.0.0-hacky-hack-lang-json-20260109054110",
27
+ "skuba-dive": "4.0.0-hacky-hack-lang-json-20260109075700",
28
28
  "zod": "^4.0.0"
29
29
  },
30
30
  "devDependencies": {
@@ -42,7 +42,7 @@
42
42
  "datadog-lambda-js": "^12.0.0",
43
43
  "dd-trace": "^5.0.0",
44
44
  "pino-pretty": "^13.0.0",
45
- "skuba": "14.0.0-hacky-hack-lang-json-20260109054110"
45
+ "skuba": "14.0.0-hacky-hack-lang-json-20260109075700"
46
46
  },
47
47
  "packageManager": "pnpm@10.27.0",
48
48
  "engines": {