skuba 16.0.5 → 16.0.6

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.
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  - Write in [TypeScript]
13
13
  - Enforce coding standards with [ESLint] and [Prettier]
14
- - Test with [Jest]
14
+ - Test with [Vitest]
15
15
  - Deploy with [Gantry] or the [AWS CDK]
16
16
 
17
17
  [aws cdk]: https://docs.aws.amazon.com/cdk/latest/guide/work-with-cdk-typescript.html
@@ -52,7 +52,7 @@ If you're new here, jump ahead to the [CLI] section to [create a new project] or
52
52
  [create a new project]: ./docs/cli/init.md
53
53
  [development]: ./docs/development-api
54
54
  [eslint]: https://eslint.org/
55
- [jest]: https://jestjs.io
55
+ [vitest]: https://vitest.dev/
56
56
  [prettier]: https://prettier.io/
57
57
  [runtime]: ./docs/runtime-api
58
58
  [templates]: ./docs/templates
@@ -8,18 +8,18 @@ const DEV_DEPENDENCIES = [
8
8
  "tslint-config-seek",
9
9
  "tslint",
10
10
  // bundled
11
- "@types/jest",
11
+ "@vitest/coverage-istanbul",
12
+ "@vitest/coverage-v8",
13
+ "@vitest/ui",
12
14
  "concurrently",
13
15
  "eslint-config-skuba",
14
16
  "eslint",
15
- "jest",
16
17
  "prettier",
17
18
  "semantic-release",
18
- "ts-jest",
19
- "ts-node",
20
19
  "tsconfig-seek",
21
20
  "tsx",
22
- "typescript"
21
+ "typescript",
22
+ "vitest"
23
23
  ];
24
24
  export const skubaDeps = ({ dependencies, devDependencies }) => {
25
25
  DEV_DEPENDENCIES.forEach((dep) => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/configure/dependencies/skubaDeps.ts"],
4
- "sourcesContent": ["import type { DependencySet } from '../types.js';\n\nconst DEV_DEPENDENCIES = [\n // replaced\n '@seek/seek-module-toolkit',\n 'eslint-config-seek',\n 'nodemon',\n 'ts-node-dev',\n 'tslint-config-seek',\n 'tslint',\n\n // bundled\n '@types/jest',\n 'concurrently',\n 'eslint-config-skuba',\n 'eslint',\n 'jest',\n 'prettier',\n 'semantic-release',\n 'ts-jest',\n 'ts-node',\n 'tsconfig-seek',\n 'tsx',\n 'typescript',\n] as const;\n\nexport const skubaDeps = ({ dependencies, devDependencies }: DependencySet) => {\n DEV_DEPENDENCIES.forEach((dep) => {\n delete dependencies[dep];\n delete devDependencies[dep];\n });\n\n return [];\n};\n"],
4
+ "sourcesContent": ["import type { DependencySet } from '../types.js';\n\nconst DEV_DEPENDENCIES = [\n // replaced\n '@seek/seek-module-toolkit',\n 'eslint-config-seek',\n 'nodemon',\n 'ts-node-dev',\n 'tslint-config-seek',\n 'tslint',\n\n // bundled\n '@vitest/coverage-istanbul',\n '@vitest/coverage-v8',\n '@vitest/ui',\n 'concurrently',\n 'eslint-config-skuba',\n 'eslint',\n 'prettier',\n 'semantic-release',\n 'tsconfig-seek',\n 'tsx',\n 'typescript',\n 'vitest',\n] as const;\n\nexport const skubaDeps = ({ dependencies, devDependencies }: DependencySet) => {\n DEV_DEPENDENCIES.forEach((dep) => {\n delete dependencies[dep];\n delete devDependencies[dep];\n });\n\n return [];\n};\n"],
5
5
  "mappings": ";AAEA,MAAM,mBAAmB;AAAA;AAAA,EAEvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,aAAM,YAAY,CAAC,EAAE,cAAc,gBAAgB,MAAqB;AAC7E,mBAAiB,QAAQ,CAAC,QAAQ;AAChC,WAAO,aAAa,GAAG;AACvB,WAAO,gBAAgB,GAAG;AAAA,EAC5B,CAAC;AAED,SAAO,CAAC;AACV;",
6
6
  "names": []
7
7
  }
@@ -1,13 +1,8 @@
1
1
  "use strict";
2
2
  import { tryPatchRenovateConfig } from "../../../patchRenovateConfig.js";
3
- import { tryAddEmptyExports } from "./addEmptyExports.js";
4
3
  import { tryPatchDockerfile } from "./patchDockerfile.js";
5
4
  import { tryPatchServerListener } from "./patchServerListener.js";
6
5
  export const patches = [
7
- {
8
- apply: tryAddEmptyExports,
9
- description: "Add empty exports to Jest files for compliance with TypeScript isolated modules"
10
- },
11
6
  {
12
7
  apply: tryPatchRenovateConfig,
13
8
  description: "Update Renovate config to support private SEEK packages"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/cli/lint/internalLints/upgrade/patches/7.3.1/index.ts"],
4
- "sourcesContent": ["import { tryPatchRenovateConfig } from '../../../patchRenovateConfig.js';\nimport type { Patches } from '../../index.js';\n\nimport { tryAddEmptyExports } from './addEmptyExports.js';\nimport { tryPatchDockerfile } from './patchDockerfile.js';\nimport { tryPatchServerListener } from './patchServerListener.js';\n\nexport const patches: Patches = [\n {\n apply: tryAddEmptyExports,\n description:\n 'Add empty exports to Jest files for compliance with TypeScript isolated modules',\n },\n {\n apply: tryPatchRenovateConfig,\n description: 'Update Renovate config to support private SEEK packages',\n },\n {\n apply: tryPatchDockerfile,\n description: 'Upgrade Node.js Distroless Docker image to -debian12 variant',\n },\n {\n apply: tryPatchServerListener,\n description: 'Add keepAliveTimeout to server listener',\n },\n];\n"],
5
- "mappings": ";AAAA,SAAS,8BAA8B;AAGvC,SAAS,0BAA0B;AACnC,SAAS,0BAA0B;AACnC,SAAS,8BAA8B;AAEhC,aAAM,UAAmB;AAAA,EAC9B;AAAA,IACE,OAAO;AAAA,IACP,aACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AACF;",
4
+ "sourcesContent": ["import { tryPatchRenovateConfig } from '../../../patchRenovateConfig.js';\nimport type { Patches } from '../../index.js';\n\nimport { tryPatchDockerfile } from './patchDockerfile.js';\nimport { tryPatchServerListener } from './patchServerListener.js';\n\nexport const patches: Patches = [\n {\n apply: tryPatchRenovateConfig,\n description: 'Update Renovate config to support private SEEK packages',\n },\n {\n apply: tryPatchDockerfile,\n description: 'Upgrade Node.js Distroless Docker image to -debian12 variant',\n },\n {\n apply: tryPatchServerListener,\n description: 'Add keepAliveTimeout to server listener',\n },\n];\n"],
5
+ "mappings": ";AAAA,SAAS,8BAA8B;AAGvC,SAAS,0BAA0B;AACnC,SAAS,8BAA8B;AAEhC,aAAM,UAAmB;AAAA,EAC9B;AAAA,IACE,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AACF;",
6
6
  "names": []
7
7
  }
@@ -244,11 +244,56 @@ const migrateServerlessLambdas = async (serverlessFiles, containsDatadogLambdaIm
244
244
  registerAstGrepLanguages();
245
245
  return (await Promise.all(
246
246
  serverlessFiles.map(async ({ file, contents }) => {
247
+ const astRoot = (await parseAsync("yaml", contents)).root();
248
+ const edits = [];
249
+ const datadogSettings = astRoot.find({
250
+ rule: {
251
+ kind: "block_node",
252
+ inside: {
253
+ kind: "block_mapping_pair",
254
+ regex: "^datadog:"
255
+ }
256
+ }
257
+ });
258
+ if (datadogSettings) {
259
+ const addLayers = datadogSettings.find({
260
+ rule: {
261
+ kind: "block_mapping_pair",
262
+ regex: "^addLayers:"
263
+ }
264
+ });
265
+ const addLayersDisabled = addLayers?.text().includes("false");
266
+ if (addLayersDisabled) {
267
+ const redirectHandlers = datadogSettings.find({
268
+ rule: {
269
+ kind: "block_node",
270
+ inside: {
271
+ kind: "block_mapping_pair",
272
+ regex: "^redirectHandlers:"
273
+ }
274
+ }
275
+ });
276
+ if (!redirectHandlers) {
277
+ const indent = datadogSettings.range().start.column;
278
+ edits.push({
279
+ startPos: datadogSettings.range().end.index,
280
+ endPos: datadogSettings.range().end.index,
281
+ insertedText: `
282
+ ${" ".repeat(indent)}redirectHandlers: false${!containsDatadogLambdaImport ? " # TODO: Wrap your handler with the `datadog` function wrapper from `datadog-lambda-js` or the `withLambdaExtension` function wrapper from `seek-datadog-custom-metrics/lambda`. Alternatively, remove this setting and enable addLayers: true" : ""}
283
+ `
284
+ });
285
+ }
286
+ }
287
+ }
247
288
  if (!contents.includes("esbuild")) {
248
- return null;
289
+ if (edits.length === 0) {
290
+ return null;
291
+ }
292
+ return {
293
+ contents: astRoot.commitEdits(edits),
294
+ file
295
+ };
249
296
  }
250
- const edits = [];
251
- const astRoot = (await parseAsync("yaml", contents)).root();
252
297
  const esbuildAst = astRoot.find({
253
298
  rule: {
254
299
  kind: "block_node",
@@ -348,45 +393,6 @@ ${" ".repeat(indent + 2)}- main
348
393
  } else {
349
394
  edits.push(mainFields.replace("mainFields:\n - module\n - main\n"));
350
395
  }
351
- const datadogSettings = astRoot.find({
352
- rule: {
353
- kind: "block_node",
354
- inside: {
355
- kind: "block_mapping_pair",
356
- regex: "^datadog:"
357
- }
358
- }
359
- });
360
- if (datadogSettings) {
361
- const addLayers = datadogSettings.find({
362
- rule: {
363
- kind: "block_mapping_pair",
364
- regex: "^addLayers:"
365
- }
366
- });
367
- const addLayersDisabled = addLayers?.text().includes("false");
368
- if (addLayersDisabled && containsDatadogLambdaImport) {
369
- const redirectHandlers = datadogSettings.find({
370
- rule: {
371
- kind: "block_node",
372
- inside: {
373
- kind: "block_mapping_pair",
374
- regex: "^redirectHandlers:"
375
- }
376
- }
377
- });
378
- if (!redirectHandlers) {
379
- const indent = datadogSettings.range().start.column;
380
- edits.push({
381
- startPos: datadogSettings.range().end.index,
382
- endPos: datadogSettings.range().end.index,
383
- insertedText: `
384
- ${" ".repeat(indent)}redirectHandlers: false
385
- `
386
- });
387
- }
388
- }
389
- }
390
396
  if (edits.length === 0) {
391
397
  return null;
392
398
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/migrate/esm/migrateLambdas.ts"],
4
- "sourcesContent": ["import { inspect } from 'util';\n\nimport { type Edit, parseAsync } from '@ast-grep/napi';\nimport fg from 'fast-glob';\nimport fs from 'fs-extra';\n\nimport { log } from '../../../utils/logging.js';\nimport { getCustomConditions } from '../../build/tsc.js';\nimport { registerAstGrepLanguages } from '../../lint/internalLints/registerAstGrepLanguages.js';\nimport type { PatchFunction } from '../../lint/internalLints/upgrade/index.js';\n\nconst migrateCdkLambdas = async (\n tsFiles: Array<{ file: string; contents: string }>,\n containsDatadogLambdaImport: boolean,\n) =>\n (\n await Promise.all(\n tsFiles.map(async ({ file, contents }) => {\n if (!contents.includes('NodejsFunction')) {\n return null;\n }\n\n const edits: Edit[] = [];\n\n const astRoot = (await parseAsync('TypeScript', contents)).root();\n\n const workerAst = astRoot.find({\n rule: {\n kind: 'new_expression',\n regex: '^new (aws_lambda_nodejs.NodejsFunction|NodejsFunction)',\n },\n });\n\n if (!workerAst) {\n return null;\n }\n\n const bundlingObject = workerAst.find({\n rule: {\n kind: 'object',\n inside: {\n kind: 'pair',\n regex: '^bundling',\n },\n },\n });\n\n if (!bundlingObject) {\n return null;\n }\n\n const format = bundlingObject.find({\n rule: {\n kind: 'pair',\n regex: '^format',\n },\n });\n\n const containsAwsLambdaNodeJsImport = astRoot.find({\n rule: {\n kind: 'import_specifier',\n regex: 'aws_lambda_nodejs',\n },\n });\n\n if (!format) {\n edits.push({\n startPos: bundlingObject.range().end.index - 1,\n endPos: bundlingObject.range().end.index - 1,\n insertedText: `\\nformat: ${containsAwsLambdaNodeJsImport ? 'aws_lambda_nodejs.' : ''}OutputFormat.ESM,\\n`,\n });\n if (!containsAwsLambdaNodeJsImport) {\n const lastImport = astRoot.find({\n rule: {\n kind: 'import_statement',\n inside: {\n kind: 'program',\n },\n nthChild: {\n ofRule: {\n kind: 'import_statement',\n },\n position: 1,\n reverse: true,\n },\n },\n });\n\n const insertPos = lastImport\n ? lastImport.range().end.index\n : astRoot.range().start.index;\n\n edits.push({\n startPos: insertPos,\n endPos: insertPos,\n insertedText:\n \"import { OutputFormat } from 'aws-cdk-lib/aws-lambda-nodejs';\\n\",\n });\n }\n } else {\n edits.push(format.replace(format.text().replace('CJS', 'ESM')));\n }\n\n const mainFields = bundlingObject.find({\n rule: {\n kind: 'pair',\n regex: '^mainFields',\n },\n });\n\n if (!mainFields) {\n edits.push({\n startPos: bundlingObject.range().end.index - 1,\n endPos: bundlingObject.range().end.index - 1,\n insertedText: \"\\nmainFields: ['module', 'main'],\\n\",\n });\n } else {\n edits.push(mainFields.replace(\"mainFields: ['module', 'main']\"));\n }\n\n const nodeModules = bundlingObject.find({\n rule: {\n kind: 'pair',\n regex: '^nodeModules',\n },\n });\n\n if (!nodeModules) {\n edits.push({\n startPos: bundlingObject.range().end.index - 1,\n endPos: bundlingObject.range().end.index - 1,\n insertedText: \"\\nnodeModules: ['pino'],\\n\",\n });\n } else {\n const nodeModulesArray = nodeModules.find({\n rule: {\n kind: 'array',\n },\n });\n\n if (nodeModulesArray && !nodeModules.text().includes('pino')) {\n edits.push({\n startPos: nodeModulesArray.range().end.index - 1,\n endPos: nodeModulesArray.range().end.index - 1,\n insertedText: `${nodeModules.text().includes('[') ? ',' : ''} 'pino'`,\n });\n }\n }\n\n const esbuildArgs = bundlingObject.find({\n rule: {\n kind: 'pair',\n regex: '^esbuildArgs',\n },\n });\n\n if (!esbuildArgs) {\n const customCondition = getCustomConditions();\n edits.push({\n startPos: bundlingObject.range().end.index - 1,\n endPos: bundlingObject.range().end.index - 1,\n insertedText: `\\nesbuildArgs: {\\n '--conditions': '${customCondition.join(',')},module',\\n},\\n`,\n });\n } else {\n const conditions = esbuildArgs.find({\n rule: {\n kind: 'pair',\n regex: \"^'--conditions'\",\n },\n });\n\n if (!conditions) {\n const customCondition = getCustomConditions();\n edits.push({\n startPos: esbuildArgs.range().end.index - 1,\n endPos: esbuildArgs.range().end.index - 1,\n insertedText: `\\n'--conditions': '${customCondition.join(',')},module',\\n`,\n });\n } else {\n const conditionsValue = conditions.field('value');\n if (conditionsValue && !conditionsValue.text().includes('module')) {\n edits.push({\n startPos: conditionsValue.range().end.index - 1,\n endPos: conditionsValue.range().end.index - 1,\n insertedText: ',module',\n });\n }\n }\n\n const datadogSettings = astRoot.find({\n rule: {\n kind: 'object',\n inside: {\n kind: 'arguments',\n inside: {\n kind: 'new_expression',\n regex: '^new DatadogLambda',\n },\n },\n },\n });\n\n const nodeLayerVersion = datadogSettings?.find({\n rule: {\n kind: 'pair',\n regex: '^nodeLayerVersion',\n },\n });\n\n const redirectHandler = datadogSettings?.find({\n rule: {\n kind: 'pair',\n regex: '^redirectHandler',\n },\n });\n\n if (datadogSettings && !nodeLayerVersion && !redirectHandler) {\n if (containsDatadogLambdaImport) {\n edits.push({\n startPos: datadogSettings.range().end.index - 1,\n endPos: datadogSettings.range().end.index - 1,\n insertedText: '\\nredirectHandler: false,\\n',\n });\n } else {\n const extensionVersion = datadogSettings.find({\n rule: {\n kind: 'lexical_declaration',\n regex: '^const DATADOG_EXTENSION_LAYER_VERSION ',\n },\n });\n\n const lastImport = astRoot.find({\n rule: {\n kind: 'import_statement',\n inside: {\n kind: 'program',\n },\n nthChild: {\n ofRule: {\n kind: 'import_statement',\n },\n position: 1,\n reverse: true,\n },\n },\n });\n\n const insertPos =\n extensionVersion?.range().end.index ??\n lastImport?.range().end.index ??\n astRoot.range().start.index;\n\n edits.push({\n startPos: insertPos,\n endPos: insertPos,\n insertedText: 'const DATADOG_NODE_LAYER_VERSION = 126;\\n',\n });\n\n edits.push({\n startPos: datadogSettings.range().end.index - 1,\n endPos: datadogSettings.range().end.index - 1,\n insertedText:\n '\\nnodeLayerVersion: DATADOG_NODE_LAYER_VERSION,\\n',\n });\n }\n }\n }\n\n if (!edits.length) {\n return null;\n }\n\n return {\n file,\n contents: astRoot.commitEdits(edits),\n };\n }),\n )\n ).filter((file) => file !== null);\n\nconst migrateServerlessLambdas = async (\n serverlessFiles: Array<{ file: string; contents: string }>,\n containsDatadogLambdaImport: boolean,\n) => {\n registerAstGrepLanguages();\n return (\n await Promise.all(\n serverlessFiles.map(async ({ file, contents }) => {\n if (!contents.includes('esbuild')) {\n return null;\n }\n\n const edits: Edit[] = [];\n\n const astRoot = (await parseAsync('yaml', contents)).root();\n\n const esbuildAst = astRoot.find({\n rule: {\n kind: 'block_node',\n inside: {\n kind: 'block_mapping_pair',\n regex: '^esbuild:',\n },\n },\n });\n\n if (!esbuildAst) {\n return null;\n }\n\n const conditions = esbuildAst.find({\n rule: {\n kind: 'block_node',\n inside: {\n kind: 'block_mapping_pair',\n regex: '^conditions:',\n },\n },\n });\n\n if (conditions) {\n const indent = conditions.range().start.column;\n edits.push({\n startPos: conditions.range().end.index,\n endPos: conditions.range().end.index,\n insertedText: `\\n${' '.repeat(indent)}- module`,\n });\n } else {\n const indent = esbuildAst.range().start.column;\n edits.push({\n startPos: esbuildAst.range().end.index,\n endPos: esbuildAst.range().end.index,\n insertedText: `\\n${' '.repeat(indent)}conditions:\\n${' '.repeat(\n indent + 2,\n )}- module\\n`,\n });\n }\n\n const external = esbuildAst.find({\n rule: {\n kind: 'block_node',\n inside: {\n kind: 'block_mapping_pair',\n regex: '^external:',\n },\n },\n });\n\n if (external) {\n const indent = external.range().start.column;\n if (!external.text().includes('pino')) {\n edits.push({\n startPos: external.range().start.index,\n endPos: external.range().start.index,\n insertedText: `- pino\\n${' '.repeat(indent)}`,\n });\n }\n } else {\n const indent = esbuildAst.range().start.column;\n edits.push({\n startPos: esbuildAst.range().end.index,\n endPos: esbuildAst.range().end.index,\n insertedText: `\\n${' '.repeat(indent)}external:\\n${' '.repeat(\n indent + 2,\n )}- pino\\n`,\n });\n }\n\n const mainFields = esbuildAst.find({\n rule: {\n kind: 'block_node',\n inside: {\n kind: 'block_mapping_pair',\n regex: '^mainFields:',\n },\n },\n });\n\n if (!mainFields) {\n const indent = esbuildAst.range().start.column;\n edits.push({\n startPos: esbuildAst.range().end.index,\n endPos: esbuildAst.range().end.index,\n insertedText: `\\n${' '.repeat(indent)}mainFields:\\n${' '.repeat(\n indent + 2,\n )}- module\\n${' '.repeat(indent + 2)}- main\\n`,\n });\n } else {\n edits.push(mainFields.replace('mainFields:\\n - module\\n - main\\n'));\n }\n\n const datadogSettings = astRoot.find({\n rule: {\n kind: 'block_node',\n inside: {\n kind: 'block_mapping_pair',\n regex: '^datadog:',\n },\n },\n });\n\n if (datadogSettings) {\n const addLayers = datadogSettings.find({\n rule: {\n kind: 'block_mapping_pair',\n regex: '^addLayers:',\n },\n });\n\n const addLayersDisabled = addLayers?.text().includes('false');\n\n if (addLayersDisabled && containsDatadogLambdaImport) {\n const redirectHandlers = datadogSettings.find({\n rule: {\n kind: 'block_node',\n inside: {\n kind: 'block_mapping_pair',\n regex: '^redirectHandlers:',\n },\n },\n });\n\n if (!redirectHandlers) {\n const indent = datadogSettings.range().start.column;\n edits.push({\n startPos: datadogSettings.range().end.index,\n endPos: datadogSettings.range().end.index,\n insertedText: `\\n${' '.repeat(indent)}redirectHandlers: false\\n`,\n });\n }\n }\n }\n\n if (edits.length === 0) {\n return null;\n }\n\n return {\n file,\n contents: astRoot.commitEdits(edits),\n };\n }),\n )\n ).filter((file) => file !== null);\n};\n\nexport const migrateLambdas: PatchFunction = async ({ mode }) => {\n const [tsFilePaths, serverlessFilePaths] = await Promise.all([\n fg(['**/*.ts'], {\n ignore: ['**/.git', '**/node_modules'],\n }),\n fg(['**/serverless*.{yml,yaml}'], {\n ignore: ['**/.git', '**/node_modules'],\n }),\n ]);\n\n const [tsFiles, serverlessFiles] = await Promise.all([\n Promise.all(\n tsFilePaths.map(async (file) => {\n const contents = await fs.promises.readFile(file, 'utf8');\n\n return {\n file,\n contents,\n };\n }),\n ),\n Promise.all(\n serverlessFilePaths.map(async (file) => {\n const contents = await fs.promises.readFile(file, 'utf8');\n\n return {\n file,\n contents,\n };\n }),\n ),\n ]);\n\n const containsDatadogLambdaImport = tsFiles.some(\n ({ contents }) =>\n contents.includes('datadog-lambda-js') ||\n contents.includes('withLambdaExtension'),\n );\n\n const [patchedTsFiles, patchedServerlessFiles] = await Promise.all([\n migrateCdkLambdas(tsFiles, containsDatadogLambdaImport),\n migrateServerlessLambdas(serverlessFiles, containsDatadogLambdaImport),\n ]);\n\n if (!patchedTsFiles.length && !patchedServerlessFiles.length) {\n return {\n result: 'skip',\n reason: 'no lambdas to migrate',\n };\n }\n\n if (mode === 'lint') {\n return {\n result: 'apply',\n };\n }\n\n await Promise.all(\n [...patchedTsFiles, ...patchedServerlessFiles].map(\n async ({ file, contents }) => {\n await fs.promises.writeFile(file, contents, 'utf8');\n },\n ),\n );\n\n return {\n result: 'apply',\n };\n};\n\nexport const tryMigrateLambdas: PatchFunction = async (opts) => {\n try {\n return await migrateLambdas(opts);\n } catch (err) {\n // Don't fail the entire lint/format if this fails since it's a non-critical part of the upgrade\n // and can be retried later by the user\n log.warn('Failed to migrate lambdas, skipping');\n log.subtle(inspect(err));\n return { result: 'skip', reason: 'due to an error' };\n }\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { inspect } from 'util';\n\nimport { type Edit, parseAsync } from '@ast-grep/napi';\nimport fg from 'fast-glob';\nimport fs from 'fs-extra';\n\nimport { log } from '../../../utils/logging.js';\nimport { getCustomConditions } from '../../build/tsc.js';\nimport { registerAstGrepLanguages } from '../../lint/internalLints/registerAstGrepLanguages.js';\nimport type { PatchFunction } from '../../lint/internalLints/upgrade/index.js';\n\nconst migrateCdkLambdas = async (\n tsFiles: Array<{ file: string; contents: string }>,\n containsDatadogLambdaImport: boolean,\n) =>\n (\n await Promise.all(\n tsFiles.map(async ({ file, contents }) => {\n if (!contents.includes('NodejsFunction')) {\n return null;\n }\n\n const edits: Edit[] = [];\n\n const astRoot = (await parseAsync('TypeScript', contents)).root();\n\n const workerAst = astRoot.find({\n rule: {\n kind: 'new_expression',\n regex: '^new (aws_lambda_nodejs.NodejsFunction|NodejsFunction)',\n },\n });\n\n if (!workerAst) {\n return null;\n }\n\n const bundlingObject = workerAst.find({\n rule: {\n kind: 'object',\n inside: {\n kind: 'pair',\n regex: '^bundling',\n },\n },\n });\n\n if (!bundlingObject) {\n return null;\n }\n\n const format = bundlingObject.find({\n rule: {\n kind: 'pair',\n regex: '^format',\n },\n });\n\n const containsAwsLambdaNodeJsImport = astRoot.find({\n rule: {\n kind: 'import_specifier',\n regex: 'aws_lambda_nodejs',\n },\n });\n\n if (!format) {\n edits.push({\n startPos: bundlingObject.range().end.index - 1,\n endPos: bundlingObject.range().end.index - 1,\n insertedText: `\\nformat: ${containsAwsLambdaNodeJsImport ? 'aws_lambda_nodejs.' : ''}OutputFormat.ESM,\\n`,\n });\n if (!containsAwsLambdaNodeJsImport) {\n const lastImport = astRoot.find({\n rule: {\n kind: 'import_statement',\n inside: {\n kind: 'program',\n },\n nthChild: {\n ofRule: {\n kind: 'import_statement',\n },\n position: 1,\n reverse: true,\n },\n },\n });\n\n const insertPos = lastImport\n ? lastImport.range().end.index\n : astRoot.range().start.index;\n\n edits.push({\n startPos: insertPos,\n endPos: insertPos,\n insertedText:\n \"import { OutputFormat } from 'aws-cdk-lib/aws-lambda-nodejs';\\n\",\n });\n }\n } else {\n edits.push(format.replace(format.text().replace('CJS', 'ESM')));\n }\n\n const mainFields = bundlingObject.find({\n rule: {\n kind: 'pair',\n regex: '^mainFields',\n },\n });\n\n if (!mainFields) {\n edits.push({\n startPos: bundlingObject.range().end.index - 1,\n endPos: bundlingObject.range().end.index - 1,\n insertedText: \"\\nmainFields: ['module', 'main'],\\n\",\n });\n } else {\n edits.push(mainFields.replace(\"mainFields: ['module', 'main']\"));\n }\n\n const nodeModules = bundlingObject.find({\n rule: {\n kind: 'pair',\n regex: '^nodeModules',\n },\n });\n\n if (!nodeModules) {\n edits.push({\n startPos: bundlingObject.range().end.index - 1,\n endPos: bundlingObject.range().end.index - 1,\n insertedText: \"\\nnodeModules: ['pino'],\\n\",\n });\n } else {\n const nodeModulesArray = nodeModules.find({\n rule: {\n kind: 'array',\n },\n });\n\n if (nodeModulesArray && !nodeModules.text().includes('pino')) {\n edits.push({\n startPos: nodeModulesArray.range().end.index - 1,\n endPos: nodeModulesArray.range().end.index - 1,\n insertedText: `${nodeModules.text().includes('[') ? ',' : ''} 'pino'`,\n });\n }\n }\n\n const esbuildArgs = bundlingObject.find({\n rule: {\n kind: 'pair',\n regex: '^esbuildArgs',\n },\n });\n\n if (!esbuildArgs) {\n const customCondition = getCustomConditions();\n edits.push({\n startPos: bundlingObject.range().end.index - 1,\n endPos: bundlingObject.range().end.index - 1,\n insertedText: `\\nesbuildArgs: {\\n '--conditions': '${customCondition.join(',')},module',\\n},\\n`,\n });\n } else {\n const conditions = esbuildArgs.find({\n rule: {\n kind: 'pair',\n regex: \"^'--conditions'\",\n },\n });\n\n if (!conditions) {\n const customCondition = getCustomConditions();\n edits.push({\n startPos: esbuildArgs.range().end.index - 1,\n endPos: esbuildArgs.range().end.index - 1,\n insertedText: `\\n'--conditions': '${customCondition.join(',')},module',\\n`,\n });\n } else {\n const conditionsValue = conditions.field('value');\n if (conditionsValue && !conditionsValue.text().includes('module')) {\n edits.push({\n startPos: conditionsValue.range().end.index - 1,\n endPos: conditionsValue.range().end.index - 1,\n insertedText: ',module',\n });\n }\n }\n\n const datadogSettings = astRoot.find({\n rule: {\n kind: 'object',\n inside: {\n kind: 'arguments',\n inside: {\n kind: 'new_expression',\n regex: '^new DatadogLambda',\n },\n },\n },\n });\n\n const nodeLayerVersion = datadogSettings?.find({\n rule: {\n kind: 'pair',\n regex: '^nodeLayerVersion',\n },\n });\n\n const redirectHandler = datadogSettings?.find({\n rule: {\n kind: 'pair',\n regex: '^redirectHandler',\n },\n });\n\n if (datadogSettings && !nodeLayerVersion && !redirectHandler) {\n if (containsDatadogLambdaImport) {\n edits.push({\n startPos: datadogSettings.range().end.index - 1,\n endPos: datadogSettings.range().end.index - 1,\n insertedText: '\\nredirectHandler: false,\\n',\n });\n } else {\n const extensionVersion = datadogSettings.find({\n rule: {\n kind: 'lexical_declaration',\n regex: '^const DATADOG_EXTENSION_LAYER_VERSION ',\n },\n });\n\n const lastImport = astRoot.find({\n rule: {\n kind: 'import_statement',\n inside: {\n kind: 'program',\n },\n nthChild: {\n ofRule: {\n kind: 'import_statement',\n },\n position: 1,\n reverse: true,\n },\n },\n });\n\n const insertPos =\n extensionVersion?.range().end.index ??\n lastImport?.range().end.index ??\n astRoot.range().start.index;\n\n edits.push({\n startPos: insertPos,\n endPos: insertPos,\n insertedText: 'const DATADOG_NODE_LAYER_VERSION = 126;\\n',\n });\n\n edits.push({\n startPos: datadogSettings.range().end.index - 1,\n endPos: datadogSettings.range().end.index - 1,\n insertedText:\n '\\nnodeLayerVersion: DATADOG_NODE_LAYER_VERSION,\\n',\n });\n }\n }\n }\n\n if (!edits.length) {\n return null;\n }\n\n return {\n file,\n contents: astRoot.commitEdits(edits),\n };\n }),\n )\n ).filter((file) => file !== null);\n\nconst migrateServerlessLambdas = async (\n serverlessFiles: Array<{ file: string; contents: string }>,\n containsDatadogLambdaImport: boolean,\n) => {\n registerAstGrepLanguages();\n return (\n await Promise.all(\n serverlessFiles.map(async ({ file, contents }) => {\n const astRoot = (await parseAsync('yaml', contents)).root();\n\n const edits: Edit[] = [];\n const datadogSettings = astRoot.find({\n rule: {\n kind: 'block_node',\n inside: {\n kind: 'block_mapping_pair',\n regex: '^datadog:',\n },\n },\n });\n\n if (datadogSettings) {\n const addLayers = datadogSettings.find({\n rule: {\n kind: 'block_mapping_pair',\n regex: '^addLayers:',\n },\n });\n\n const addLayersDisabled = addLayers?.text().includes('false');\n\n if (addLayersDisabled) {\n const redirectHandlers = datadogSettings.find({\n rule: {\n kind: 'block_node',\n inside: {\n kind: 'block_mapping_pair',\n regex: '^redirectHandlers:',\n },\n },\n });\n\n if (!redirectHandlers) {\n const indent = datadogSettings.range().start.column;\n edits.push({\n startPos: datadogSettings.range().end.index,\n endPos: datadogSettings.range().end.index,\n insertedText: `\\n${' '.repeat(indent)}redirectHandlers: false${!containsDatadogLambdaImport ? ' # TODO: Wrap your handler with the `datadog` function wrapper from `datadog-lambda-js` or the `withLambdaExtension` function wrapper from `seek-datadog-custom-metrics/lambda`. Alternatively, remove this setting and enable addLayers: true' : ''}\\n`,\n });\n }\n }\n }\n\n if (!contents.includes('esbuild')) {\n if (edits.length === 0) {\n return null;\n }\n return {\n contents: astRoot.commitEdits(edits),\n file,\n };\n }\n\n const esbuildAst = astRoot.find({\n rule: {\n kind: 'block_node',\n inside: {\n kind: 'block_mapping_pair',\n regex: '^esbuild:',\n },\n },\n });\n\n if (!esbuildAst) {\n return null;\n }\n\n const conditions = esbuildAst.find({\n rule: {\n kind: 'block_node',\n inside: {\n kind: 'block_mapping_pair',\n regex: '^conditions:',\n },\n },\n });\n\n if (conditions) {\n const indent = conditions.range().start.column;\n edits.push({\n startPos: conditions.range().end.index,\n endPos: conditions.range().end.index,\n insertedText: `\\n${' '.repeat(indent)}- module`,\n });\n } else {\n const indent = esbuildAst.range().start.column;\n edits.push({\n startPos: esbuildAst.range().end.index,\n endPos: esbuildAst.range().end.index,\n insertedText: `\\n${' '.repeat(indent)}conditions:\\n${' '.repeat(\n indent + 2,\n )}- module\\n`,\n });\n }\n\n const external = esbuildAst.find({\n rule: {\n kind: 'block_node',\n inside: {\n kind: 'block_mapping_pair',\n regex: '^external:',\n },\n },\n });\n\n if (external) {\n const indent = external.range().start.column;\n if (!external.text().includes('pino')) {\n edits.push({\n startPos: external.range().start.index,\n endPos: external.range().start.index,\n insertedText: `- pino\\n${' '.repeat(indent)}`,\n });\n }\n } else {\n const indent = esbuildAst.range().start.column;\n edits.push({\n startPos: esbuildAst.range().end.index,\n endPos: esbuildAst.range().end.index,\n insertedText: `\\n${' '.repeat(indent)}external:\\n${' '.repeat(\n indent + 2,\n )}- pino\\n`,\n });\n }\n\n const mainFields = esbuildAst.find({\n rule: {\n kind: 'block_node',\n inside: {\n kind: 'block_mapping_pair',\n regex: '^mainFields:',\n },\n },\n });\n\n if (!mainFields) {\n const indent = esbuildAst.range().start.column;\n edits.push({\n startPos: esbuildAst.range().end.index,\n endPos: esbuildAst.range().end.index,\n insertedText: `\\n${' '.repeat(indent)}mainFields:\\n${' '.repeat(\n indent + 2,\n )}- module\\n${' '.repeat(indent + 2)}- main\\n`,\n });\n } else {\n edits.push(mainFields.replace('mainFields:\\n - module\\n - main\\n'));\n }\n\n if (edits.length === 0) {\n return null;\n }\n\n return {\n file,\n contents: astRoot.commitEdits(edits),\n };\n }),\n )\n ).filter((file) => file !== null);\n};\n\nexport const migrateLambdas: PatchFunction = async ({ mode }) => {\n const [tsFilePaths, serverlessFilePaths] = await Promise.all([\n fg(['**/*.ts'], {\n ignore: ['**/.git', '**/node_modules'],\n }),\n fg(['**/serverless*.{yml,yaml}'], {\n ignore: ['**/.git', '**/node_modules'],\n }),\n ]);\n\n const [tsFiles, serverlessFiles] = await Promise.all([\n Promise.all(\n tsFilePaths.map(async (file) => {\n const contents = await fs.promises.readFile(file, 'utf8');\n\n return {\n file,\n contents,\n };\n }),\n ),\n Promise.all(\n serverlessFilePaths.map(async (file) => {\n const contents = await fs.promises.readFile(file, 'utf8');\n\n return {\n file,\n contents,\n };\n }),\n ),\n ]);\n\n const containsDatadogLambdaImport = tsFiles.some(\n ({ contents }) =>\n contents.includes('datadog-lambda-js') ||\n contents.includes('withLambdaExtension'),\n );\n\n const [patchedTsFiles, patchedServerlessFiles] = await Promise.all([\n migrateCdkLambdas(tsFiles, containsDatadogLambdaImport),\n migrateServerlessLambdas(serverlessFiles, containsDatadogLambdaImport),\n ]);\n\n if (!patchedTsFiles.length && !patchedServerlessFiles.length) {\n return {\n result: 'skip',\n reason: 'no lambdas to migrate',\n };\n }\n\n if (mode === 'lint') {\n return {\n result: 'apply',\n };\n }\n\n await Promise.all(\n [...patchedTsFiles, ...patchedServerlessFiles].map(\n async ({ file, contents }) => {\n await fs.promises.writeFile(file, contents, 'utf8');\n },\n ),\n );\n\n return {\n result: 'apply',\n };\n};\n\nexport const tryMigrateLambdas: PatchFunction = async (opts) => {\n try {\n return await migrateLambdas(opts);\n } catch (err) {\n // Don't fail the entire lint/format if this fails since it's a non-critical part of the upgrade\n // and can be retried later by the user\n log.warn('Failed to migrate lambdas, skipping');\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": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skuba",
3
- "version": "16.0.5",
3
+ "version": "16.0.6",
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",
@@ -107,8 +107,8 @@
107
107
  "vitest": "^4.1.4",
108
108
  "zod": "^4.3.5",
109
109
  "@skuba-lib/api": "^2.1.2",
110
- "pnpm-plugin-skuba": "3.0.0",
111
- "eslint-config-skuba": "9.0.0"
110
+ "eslint-config-skuba": "9.0.0",
111
+ "pnpm-plugin-skuba": "3.0.0"
112
112
  },
113
113
  "devDependencies": {
114
114
  "@changesets/cli": "2.31.0",
@@ -29,7 +29,7 @@ or serve as a starting point for a backend project if the other built-in templat
29
29
  It's a barebones Node.js application that comprises:
30
30
 
31
31
  - A [src/app.ts](src/app.ts) that can be run locally to greet the user
32
- - A [src/app.test.ts](src/app.test.ts) that demonstrates rudimentary Jest usage
32
+ - A [src/app.test.ts](src/app.test.ts) that demonstrates rudimentary Vitest usage
33
33
 
34
34
  ## Development
35
35
 
@@ -47,7 +47,7 @@ This defaults to an invocation with an empty object `{}`.
47
47
  ### Test
48
48
 
49
49
  ```shell
50
- # Run Jest tests locally
50
+ # Run Vitest tests locally
51
51
  pnpm test
52
52
 
53
53
  # Authenticate to dev account
@@ -1,23 +0,0 @@
1
- import ts from 'typescript';
2
- type Props = ts.NodeArray<ts.ObjectLiteralElementLike>;
3
- type Transformer<T> = (context: ts.TransformationContext | null, props: T) => T;
4
- /**
5
- * Create a transformer to filter out unspecified props from an object literal.
6
- */
7
- export declare const createPropFilter: (names: string[]) => Transformer<Props>;
8
- export declare const createPropAppender: (appendingProps: Props) => Transformer<Props>;
9
- /**
10
- * Read out `export default` or `module.exports` props from a source file.
11
- *
12
- * The props can then be used when transforming another source file.
13
- */
14
- export declare const readModuleExports: (inputFile: string) => Promise<Props | undefined>;
15
- /**
16
- * Mutate imports and exports in a source file:
17
- *
18
- * - Convert `const x = require('')` into `import x from ''`
19
- * - Convert `module.exports =` into `export default`
20
- * - Run a transformer over the exported props
21
- */
22
- export declare const transformModuleImportsAndExports: (inputFile: string, transformProps: Transformer<Props>) => Promise<string>;
23
- export {};
@@ -1,163 +0,0 @@
1
- "use strict";
2
- import ts from "typescript";
3
- import { formatPrettier } from "./prettier.js";
4
- const BLANK_LINE_PLACEHOLDER = " __BLANK_LINE_PLACEHOLDER__";
5
- const BLANK_LINE_REGEXP = new RegExp(`//${BLANK_LINE_PLACEHOLDER}`, "g");
6
- const withLeadingBlankLinePlaceholder = (node) => ts.addSyntheticLeadingComment(
7
- node,
8
- ts.SyntaxKind.SingleLineCommentTrivia,
9
- BLANK_LINE_PLACEHOLDER,
10
- true
11
- );
12
- const createExportDefaultObjectLiteralExpression = (factory, props, callExpression) => factory.createExportAssignment(
13
- void 0,
14
- void 0,
15
- callExpression === void 0 ? factory.createObjectLiteralExpression(props, true) : factory.createCallExpression(callExpression, void 0, [
16
- factory.createObjectLiteralExpression(props, true)
17
- ])
18
- );
19
- const createImportFromExpression = (factory, moduleName, importNames) => {
20
- const importClause = typeof importNames === "string" ? factory.createImportClause(
21
- false,
22
- factory.createIdentifier(importNames),
23
- void 0
24
- ) : factory.createImportClause(
25
- false,
26
- void 0,
27
- factory.createNamedImports(
28
- importNames.map(
29
- (importName) => factory.createImportSpecifier(
30
- false,
31
- void 0,
32
- factory.createIdentifier(importName)
33
- )
34
- )
35
- )
36
- );
37
- return factory.createImportDeclaration(
38
- void 0,
39
- importClause,
40
- factory.createStringLiteral(moduleName)
41
- );
42
- };
43
- const getPropName = (prop) => ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) ? prop.name.escapedText.toString() : void 0;
44
- const expressionAsDefaultExport = (context, transformProps, expression) => withLeadingBlankLinePlaceholder(
45
- (() => {
46
- if (ts.isObjectLiteralExpression(expression)) {
47
- const props = transformProps(context, expression.properties);
48
- return createExportDefaultObjectLiteralExpression(
49
- context.factory,
50
- props
51
- );
52
- }
53
- if (ts.isCallExpression(expression) && expression.arguments.length === 1 && expression.arguments[0]) {
54
- const [firstArgument] = expression.arguments;
55
- if (ts.isObjectLiteralExpression(firstArgument)) {
56
- const props = transformProps(context, firstArgument.properties);
57
- return createExportDefaultObjectLiteralExpression(
58
- context.factory,
59
- props,
60
- expression.expression
61
- );
62
- }
63
- }
64
- return context.factory.createExportAssignment(
65
- void 0,
66
- void 0,
67
- expression
68
- );
69
- })()
70
- );
71
- const requireImportsTransformer = (context) => (rootNode) => ts.visitEachChild(
72
- rootNode,
73
- (node) => {
74
- let declaration, moduleName;
75
- if (ts.isVariableStatement(node) && node.declarationList.declarations.length === 1 && node.declarationList.declarations[0] && ts.isVariableDeclaration(
76
- declaration = node.declarationList.declarations[0]
77
- ) && declaration.initializer && ts.isCallExpression(declaration.initializer) && declaration.initializer.arguments.length === 1 && declaration.initializer.arguments[0] && ts.isStringLiteral(
78
- moduleName = declaration.initializer.arguments[0]
79
- ) && ts.isIdentifier(declaration.initializer.expression) && declaration.initializer.expression.text === "require") {
80
- if (ts.isIdentifier(declaration.name)) {
81
- return createImportFromExpression(
82
- context.factory,
83
- moduleName.text,
84
- declaration.name.text
85
- );
86
- }
87
- if (ts.isObjectBindingPattern(declaration.name)) {
88
- return createImportFromExpression(
89
- context.factory,
90
- moduleName.text,
91
- declaration.name.elements.flatMap(
92
- (element) => ts.isIdentifier(element.name) ? [element.name.text] : []
93
- )
94
- );
95
- }
96
- }
97
- return node;
98
- },
99
- context
100
- );
101
- const createModuleExportsTransformer = (transformProps) => (context) => (rootNode) => ts.visitEachChild(
102
- rootNode,
103
- (node) => {
104
- if (ts.isExpressionStatement(node) && ts.isBinaryExpression(node.expression) && ts.isPropertyAccessExpression(node.expression.left) && ts.isIdentifier(node.expression.left.expression) && node.expression.left.expression.escapedText.toString() === "module" && node.expression.left.name.text === "exports" && node.expression.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
105
- return expressionAsDefaultExport(
106
- context,
107
- transformProps,
108
- node.expression.right
109
- ) ?? node;
110
- }
111
- if (ts.isExportAssignment(node)) {
112
- return expressionAsDefaultExport(
113
- context,
114
- transformProps,
115
- node.expression
116
- ) ?? node;
117
- }
118
- return node;
119
- },
120
- context
121
- );
122
- export const createPropFilter = (names) => (context, props) => {
123
- const nameSet = new Set(names);
124
- const factory = context?.factory ?? ts.factory;
125
- return factory.createNodeArray(
126
- props.filter((prop) => nameSet.has(getPropName(prop)))
127
- );
128
- };
129
- export const createPropAppender = (appendingProps) => (context, props) => {
130
- const nameSet = new Set(
131
- props.map(getPropName).filter((prop) => typeof prop === "string")
132
- );
133
- const factory = context?.factory ?? ts.factory;
134
- return factory.createNodeArray([
135
- ...props,
136
- ...appendingProps.filter((prop) => !nameSet.has(getPropName(prop)))
137
- ]);
138
- };
139
- export const readModuleExports = async (inputFile) => {
140
- let result;
141
- await transformModuleImportsAndExports(
142
- inputFile,
143
- (_, props) => result = props
144
- );
145
- return result;
146
- };
147
- export const transformModuleImportsAndExports = async (inputFile, transformProps) => {
148
- const sourceFile = ts.createSourceFile("", inputFile, ts.ScriptTarget.Latest);
149
- const moduleExportsTransformer = createModuleExportsTransformer(transformProps);
150
- const result = ts.transform(sourceFile, [
151
- requireImportsTransformer,
152
- moduleExportsTransformer
153
- ]);
154
- const [transformedFile] = result.transformed;
155
- if (!transformedFile) {
156
- throw new Error(
157
- `Could not get transformed result for ${JSON.stringify(result)}`
158
- );
159
- }
160
- const text = ts.createPrinter().printNode(ts.EmitHint.SourceFile, transformedFile, sourceFile).replace(BLANK_LINE_REGEXP, "");
161
- return formatPrettier(text, { parser: "typescript" });
162
- };
163
- //# sourceMappingURL=typescript.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/cli/configure/processing/typescript.ts"],
4
- "sourcesContent": ["import ts from 'typescript';\n\nimport { formatPrettier } from './prettier.js';\n\ntype Props = ts.NodeArray<ts.ObjectLiteralElementLike>;\n\ntype Transformer<T> = (context: ts.TransformationContext | null, props: T) => T;\n\nconst BLANK_LINE_PLACEHOLDER = ' __BLANK_LINE_PLACEHOLDER__';\nconst BLANK_LINE_REGEXP = new RegExp(`//${BLANK_LINE_PLACEHOLDER}`, 'g');\n\n/**\n * Append a placeholder comment to the start of a node.\n *\n * Blank lines can be annotated and preserved through the TypeScript printer\n * when this is paired with a dodgy `String.prototype.replace` post-processor.\n */\nconst withLeadingBlankLinePlaceholder = <T extends ts.Node>(node: T) =>\n ts.addSyntheticLeadingComment(\n node,\n ts.SyntaxKind.SingleLineCommentTrivia,\n BLANK_LINE_PLACEHOLDER,\n true,\n );\n\n/**\n * Create the following expression:\n *\n * ```javascript\n * export default {};\n * ```\n */\nconst createExportDefaultObjectLiteralExpression = (\n factory: ts.NodeFactory,\n props: Props,\n callExpression?: ts.Expression,\n): ts.ExportAssignment =>\n factory.createExportAssignment(\n undefined,\n undefined,\n callExpression === undefined\n ? factory.createObjectLiteralExpression(props, true)\n : factory.createCallExpression(callExpression, undefined, [\n factory.createObjectLiteralExpression(props, true),\n ]),\n );\n\nconst createImportFromExpression = (\n factory: ts.NodeFactory,\n moduleName: string,\n importNames: string | string[],\n) => {\n const importClause =\n typeof importNames === 'string'\n ? factory.createImportClause(\n false,\n factory.createIdentifier(importNames),\n undefined,\n )\n : factory.createImportClause(\n false,\n undefined,\n factory.createNamedImports(\n importNames.map((importName) =>\n factory.createImportSpecifier(\n false,\n undefined,\n factory.createIdentifier(importName),\n ),\n ),\n ),\n );\n\n return factory.createImportDeclaration(\n undefined,\n importClause,\n factory.createStringLiteral(moduleName),\n );\n};\n\nconst getPropName = (prop: ts.ObjectLiteralElementLike) =>\n ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)\n ? prop.name.escapedText.toString()\n : undefined;\n\nconst expressionAsDefaultExport = (\n context: ts.TransformationContext,\n transformProps: Transformer<Props>,\n expression: ts.Expression,\n): ts.ExportAssignment | null =>\n withLeadingBlankLinePlaceholder(\n (() => {\n // {}\n if (ts.isObjectLiteralExpression(expression)) {\n const props = transformProps(context, expression.properties);\n\n return createExportDefaultObjectLiteralExpression(\n context.factory,\n props,\n );\n }\n\n // fn({})\n if (\n ts.isCallExpression(expression) &&\n expression.arguments.length === 1 &&\n expression.arguments[0]\n ) {\n const [firstArgument] = expression.arguments;\n\n if (ts.isObjectLiteralExpression(firstArgument)) {\n const props = transformProps(context, firstArgument.properties);\n\n return createExportDefaultObjectLiteralExpression(\n context.factory,\n props,\n expression.expression,\n );\n }\n }\n\n // Anything else\n return context.factory.createExportAssignment(\n undefined,\n undefined,\n expression,\n );\n })(),\n );\n\n/**\n * Mutate `const x = require('')` into `import x from ''`:\n *\n * ```javascript\n * const x = require('');\n *\n * const { x } = require('');\n * ```\n *\n * There's no recursion needed here as we expect the import statement to be a\n * top-level node and therefore an immediate child of the source file.\n */\nconst requireImportsTransformer: ts.TransformerFactory<ts.Node> =\n (context) => (rootNode) =>\n ts.visitEachChild(\n rootNode,\n (node) => {\n let declaration, moduleName;\n\n if (\n ts.isVariableStatement(node) &&\n node.declarationList.declarations.length === 1 &&\n node.declarationList.declarations[0] &&\n ts.isVariableDeclaration(\n (declaration = node.declarationList.declarations[0]),\n ) &&\n declaration.initializer &&\n ts.isCallExpression(declaration.initializer) &&\n declaration.initializer.arguments.length === 1 &&\n declaration.initializer.arguments[0] &&\n ts.isStringLiteral(\n (moduleName = declaration.initializer.arguments[0]),\n ) &&\n ts.isIdentifier(declaration.initializer.expression) &&\n declaration.initializer.expression.text === 'require'\n ) {\n // const x\n if (ts.isIdentifier(declaration.name)) {\n return createImportFromExpression(\n context.factory,\n moduleName.text,\n declaration.name.text,\n );\n }\n\n // const { x }\n if (ts.isObjectBindingPattern(declaration.name)) {\n return createImportFromExpression(\n context.factory,\n moduleName.text,\n declaration.name.elements.flatMap((element) =>\n ts.isIdentifier(element.name) ? [element.name.text] : [],\n ),\n );\n }\n }\n\n return node;\n },\n context,\n );\n\n/**\n * Create a transformer to mutate `module.exports` and `export default`:\n *\n * ```javascript\n * export default {};\n *\n * module.exports = {};\n * ```\n *\n * If the export is a call expression with a single argument, it will try to\n * transform the props of that argument.\n *\n * ```javascript\n * module.exports = fn({});\n * ```\n *\n * There's no recursion needed here as we expect the export statement to be a\n * top-level node and therefore an immediate child of the source file.\n */\nconst createModuleExportsTransformer =\n (transformProps: Transformer<Props>): ts.TransformerFactory<ts.Node> =>\n (context) =>\n (rootNode) =>\n ts.visitEachChild(\n rootNode,\n (node) => {\n // module.exports =\n if (\n ts.isExpressionStatement(node) &&\n ts.isBinaryExpression(node.expression) &&\n ts.isPropertyAccessExpression(node.expression.left) &&\n ts.isIdentifier(node.expression.left.expression) &&\n node.expression.left.expression.escapedText.toString() === 'module' &&\n node.expression.left.name.text === 'exports' &&\n node.expression.operatorToken.kind === ts.SyntaxKind.EqualsToken\n ) {\n return (\n expressionAsDefaultExport(\n context,\n transformProps,\n node.expression.right,\n ) ?? node\n );\n }\n\n // export default\n if (ts.isExportAssignment(node)) {\n return (\n expressionAsDefaultExport(\n context,\n transformProps,\n node.expression,\n ) ?? node\n );\n }\n\n return node;\n },\n context,\n );\n\n/**\n * Create a transformer to filter out unspecified props from an object literal.\n */\nexport const createPropFilter =\n (names: string[]): Transformer<Props> =>\n (context, props) => {\n const nameSet = new Set<unknown>(names);\n\n const factory = context?.factory ?? ts.factory;\n\n return factory.createNodeArray(\n props.filter((prop) => nameSet.has(getPropName(prop))),\n );\n };\n\nexport const createPropAppender =\n (appendingProps: Props): Transformer<Props> =>\n (context, props) => {\n const nameSet = new Set<unknown>(\n props.map(getPropName).filter((prop) => typeof prop === 'string'),\n );\n\n const factory = context?.factory ?? ts.factory;\n\n return factory.createNodeArray([\n ...props,\n ...appendingProps.filter((prop) => !nameSet.has(getPropName(prop))),\n ]);\n };\n\n/**\n * Read out `export default` or `module.exports` props from a source file.\n *\n * The props can then be used when transforming another source file.\n */\nexport const readModuleExports = async (\n inputFile: string,\n): Promise<Props | undefined> => {\n let result: Props | undefined;\n\n await transformModuleImportsAndExports(\n inputFile,\n (_, props) => (result = props),\n );\n\n return result;\n};\n\n/**\n * Mutate imports and exports in a source file:\n *\n * - Convert `const x = require('')` into `import x from ''`\n * - Convert `module.exports =` into `export default`\n * - Run a transformer over the exported props\n */\nexport const transformModuleImportsAndExports = async (\n inputFile: string,\n transformProps: Transformer<Props>,\n): Promise<string> => {\n const sourceFile = ts.createSourceFile('', inputFile, ts.ScriptTarget.Latest);\n\n const moduleExportsTransformer =\n createModuleExportsTransformer(transformProps);\n\n const result = ts.transform(sourceFile, [\n requireImportsTransformer,\n moduleExportsTransformer,\n ]);\n\n const [transformedFile] = result.transformed;\n\n if (!transformedFile) {\n throw new Error(\n `Could not get transformed result for ${JSON.stringify(result)}`,\n );\n }\n\n const text = ts\n .createPrinter()\n .printNode(ts.EmitHint.SourceFile, transformedFile, sourceFile)\n .replace(BLANK_LINE_REGEXP, '');\n\n return formatPrettier(text, { parser: 'typescript' });\n};\n"],
5
- "mappings": "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",
6
- "names": []
7
- }