@grafana/create-plugin 6.2.0-canary.2233.19133609453.0 → 6.2.0-canary.2283.19173715977.0

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.
Files changed (60) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/CONTRIBUTING.md +3 -0
  3. package/dist/bin/run.js +1 -3
  4. package/dist/commands/update.command.js +1 -1
  5. package/dist/{codemods → migrations}/context.js +2 -3
  6. package/dist/{codemods/migrations → migrations}/manager.js +7 -8
  7. package/dist/{codemods/migrations → migrations}/migrations.js +6 -3
  8. package/dist/{codemods/migrations → migrations}/scripts/003-update-eslint-deprecation-rule.js +1 -1
  9. package/dist/{codemods/migrations → migrations}/scripts/004-eslint9-flat-config.js +1 -2
  10. package/dist/migrations/scripts/005-react-18-3.js +20 -0
  11. package/dist/{codemods → migrations}/utils.js +22 -5
  12. package/dist/utils/utils.config.js +1 -16
  13. package/package.json +2 -2
  14. package/src/bin/run.ts +1 -2
  15. package/src/commands/index.ts +0 -1
  16. package/src/commands/update.command.ts +1 -1
  17. package/src/{codemods → migrations}/context.test.ts +10 -10
  18. package/src/{codemods → migrations}/context.ts +2 -4
  19. package/src/{codemods/migrations → migrations}/manager.test.ts +10 -15
  20. package/src/{codemods/migrations → migrations}/manager.ts +9 -10
  21. package/src/{codemods/migrations → migrations}/migrations.ts +8 -3
  22. package/src/{codemods/migrations → migrations}/scripts/001-update-grafana-compose-extend.test.ts +1 -1
  23. package/src/{codemods/migrations → migrations}/scripts/001-update-grafana-compose-extend.ts +1 -1
  24. package/src/{codemods/migrations → migrations}/scripts/002-update-is-compatible-workflow.test.ts +1 -1
  25. package/src/{codemods/migrations → migrations}/scripts/002-update-is-compatible-workflow.ts +1 -1
  26. package/src/{codemods/migrations → migrations}/scripts/003-update-eslint-deprecation-rule.test.ts +1 -1
  27. package/src/{codemods/migrations → migrations}/scripts/003-update-eslint-deprecation-rule.ts +2 -2
  28. package/src/{codemods/migrations → migrations}/scripts/004-eslint9-flat-config.test.ts +1 -1
  29. package/src/{codemods/migrations → migrations}/scripts/004-eslint9-flat-config.ts +2 -3
  30. package/src/migrations/scripts/005-react-18-3.test.ts +147 -0
  31. package/src/migrations/scripts/005-react-18-3.ts +19 -0
  32. package/src/{codemods/migrations → migrations}/scripts/example-migration.test.ts +1 -1
  33. package/src/{codemods/migrations → migrations}/scripts/example-migration.ts +1 -1
  34. package/src/{codemods/migrations → migrations}/utils.test.ts +4 -4
  35. package/src/{codemods → migrations}/utils.ts +33 -37
  36. package/src/utils/utils.config.ts +1 -28
  37. package/templates/common/_package.json +5 -3
  38. package/templates/github/workflows/cp-update.yml +8 -13
  39. package/dist/codemods/additions/additions.js +0 -11
  40. package/dist/codemods/additions/manager.js +0 -115
  41. package/dist/codemods/additions/scripts/example-addition.js +0 -61
  42. package/dist/codemods/additions/utils.js +0 -10
  43. package/dist/codemods/migrations/utils.js +0 -10
  44. package/dist/commands/add.command.js +0 -86
  45. package/src/codemods/additions/additions.ts +0 -23
  46. package/src/codemods/additions/manager.ts +0 -145
  47. package/src/codemods/additions/scripts/example-addition.test.ts +0 -111
  48. package/src/codemods/additions/scripts/example-addition.ts +0 -79
  49. package/src/codemods/additions/utils.ts +0 -12
  50. package/src/codemods/migrations/utils.ts +0 -12
  51. package/src/codemods/types.ts +0 -21
  52. package/src/commands/add.command.ts +0 -97
  53. /package/dist/{codemods/migrations → migrations}/scripts/001-update-grafana-compose-extend.js +0 -0
  54. /package/dist/{codemods/migrations → migrations}/scripts/002-update-is-compatible-workflow.js +0 -0
  55. /package/dist/{codemods/migrations → migrations}/scripts/example-migration.js +0 -0
  56. /package/src/{codemods/migrations → migrations}/fixtures/foo/bar.ts +0 -0
  57. /package/src/{codemods/migrations → migrations}/fixtures/foo/baz.ts +0 -0
  58. /package/src/{codemods/migrations → migrations}/fixtures/migrations.ts +0 -0
  59. /package/src/{codemods/migrations → migrations}/migrations.test.ts +0 -0
  60. /package/src/{codemods → migrations}/test-utils.ts +0 -0
@@ -1,61 +0,0 @@
1
- import { addDependenciesToPackageJson } from '../../utils.js';
2
-
3
- const flags = [
4
- {
5
- name: "feature-name",
6
- description: "Name of the feature to add",
7
- required: false
8
- },
9
- {
10
- name: "enabled",
11
- description: "Whether the feature should be enabled by default",
12
- required: false
13
- }
14
- ];
15
- function parseFlags(argv) {
16
- return {
17
- featureName: argv["feature-name"] || "myFeature",
18
- enabled: argv.enabled === "true" || argv.enabled === true
19
- };
20
- }
21
- function migrate(context, options = { featureName: "myFeature", enabled: true }) {
22
- const { featureName, enabled } = options;
23
- const rawPkgJson = context.getFile("./package.json") ?? "{}";
24
- const packageJson = JSON.parse(rawPkgJson);
25
- if (packageJson.scripts && !packageJson.scripts["example-script"]) {
26
- packageJson.scripts["example-script"] = `echo "Running ${featureName}"`;
27
- context.updateFile("./package.json", JSON.stringify(packageJson, null, 2));
28
- }
29
- addDependenciesToPackageJson(context, {}, { "example-dev-dep": "^1.0.0" });
30
- if (!context.doesFileExist("./src/config.json")) {
31
- const config = {
32
- features: {
33
- [featureName]: {
34
- enabled,
35
- description: "Example feature configuration"
36
- }
37
- }
38
- };
39
- context.addFile("./src/config.json", JSON.stringify(config, null, 2));
40
- }
41
- if (!context.doesFileExist(`./src/features/${featureName}.ts`)) {
42
- const featureCode = `export const ${featureName} = {
43
- name: '${featureName}',
44
- enabled: ${enabled},
45
- init() {
46
- console.log('${featureName} initialized');
47
- },
48
- };
49
- `;
50
- context.addFile(`./src/features/${featureName}.ts`, featureCode);
51
- }
52
- if (context.doesFileExist("./src/deprecated.ts")) {
53
- context.deleteFile("./src/deprecated.ts");
54
- }
55
- if (context.doesFileExist("./src/old-config.json")) {
56
- context.renameFile("./src/old-config.json", "./src/new-config.json");
57
- }
58
- return context;
59
- }
60
-
61
- export { migrate as default, flags, parseFlags };
@@ -1,10 +0,0 @@
1
- import { debug } from '../../utils/utils.cli.js';
2
- import { printChanges as printChanges$1 } from '../utils.js';
3
-
4
- const additionsDebug = debug.extend("additions");
5
- function printChanges(context, key, addition) {
6
- additionsDebug("printChanges for addition: %s", key);
7
- printChanges$1(context, key, addition);
8
- }
9
-
10
- export { additionsDebug, printChanges };
@@ -1,10 +0,0 @@
1
- import { debug } from '../../utils/utils.cli.js';
2
- import { printChanges as printChanges$1 } from '../utils.js';
3
-
4
- const migrationsDebug = debug.extend("migrations");
5
- function printChanges(context, key, migration) {
6
- migrationsDebug("printChanges for migration: %s", key);
7
- printChanges$1(context, key, migration);
8
- }
9
-
10
- export { migrationsDebug, printChanges };
@@ -1,86 +0,0 @@
1
- import { runAdditionByName, getAvailableAdditions, getAdditionFlags } from '../codemods/additions/manager.js';
2
- import { isGitDirectory, isGitDirectoryClean } from '../utils/utils.git.js';
3
- import { isPluginDirectory } from '../utils/utils.plugin.js';
4
- import { output } from '../utils/utils.console.js';
5
-
6
- const add = async (argv) => {
7
- const subCommand = argv._[1];
8
- if (!subCommand) {
9
- await showAdditionsHelp();
10
- process.exit(1);
11
- }
12
- await performPreAddChecks(argv);
13
- try {
14
- await runAdditionByName(subCommand, argv);
15
- } catch (error) {
16
- if (error instanceof Error) {
17
- output.error({
18
- title: "Addition failed",
19
- body: [error.message]
20
- });
21
- }
22
- process.exit(1);
23
- }
24
- };
25
- async function showAdditionsHelp() {
26
- const availableAdditions = getAvailableAdditions();
27
- const additionsList = await Promise.all(
28
- Object.values(availableAdditions).map(async (addition) => {
29
- let info = `${addition.name} - ${addition.description}`;
30
- const flags = await getAdditionFlags(addition);
31
- if (flags.length > 0) {
32
- const flagDocs = flags.map((flag) => {
33
- const req = flag.required ? " (required)" : " (optional)";
34
- return ` --${flag.name}: ${flag.description}${req}`;
35
- });
36
- info += "\n" + flagDocs.join("\n");
37
- }
38
- return info;
39
- })
40
- );
41
- output.error({
42
- title: "No addition specified",
43
- body: [
44
- "Usage: npx @grafana/create-plugin add <addition-name> [options]",
45
- "",
46
- "Available additions:",
47
- ...output.bulletList(additionsList)
48
- ]
49
- });
50
- }
51
- async function performPreAddChecks(argv) {
52
- if (!await isGitDirectory() && !argv.force) {
53
- output.error({
54
- title: "You are not inside a git directory",
55
- body: [
56
- `In order to proceed please run ${output.formatCode("git init")} in the root of your project and commit your changes.`,
57
- `(This check is necessary to make sure that the changes are easy to revert and don't interfere with any changes you currently have.`,
58
- `In case you want to proceed as is please use the ${output.formatCode("--force")} flag.)`
59
- ]
60
- });
61
- process.exit(1);
62
- }
63
- if (!await isGitDirectoryClean() && !argv.force) {
64
- output.error({
65
- title: "Please clean your repository working tree before adding features.",
66
- body: [
67
- "Commit your changes or stash them.",
68
- `(This check is necessary to make sure that the changes are easy to revert and don't mess with any changes you currently have.`,
69
- `In case you want to proceed as is please use the ${output.formatCode("--force")} flag.)`
70
- ]
71
- });
72
- process.exit(1);
73
- }
74
- if (!isPluginDirectory() && !argv.force) {
75
- output.error({
76
- title: "Are you inside a plugin directory?",
77
- body: [
78
- `We couldn't find a "src/plugin.json" file under your current directory.`,
79
- `(Please make sure to run this command from the root of your plugin folder. In case you want to proceed as is please use the ${output.formatCode("--force")} flag.)`
80
- ]
81
- });
82
- process.exit(1);
83
- }
84
- }
85
-
86
- export { add };
@@ -1,23 +0,0 @@
1
- export type AdditionMeta<TFeatureName extends string = string> = {
2
- name: string;
3
- description: string;
4
- scriptPath: string;
5
- featureName: TFeatureName;
6
- };
7
-
8
- const additions = {
9
- i18n: {
10
- name: 'i18n',
11
- description: 'Add internationalization (i18n) support to your plugin',
12
- scriptPath: './scripts/add-i18n.js',
13
- featureName: 'i18nEnabled',
14
- },
15
- };
16
-
17
- export default { additions };
18
-
19
- // extract feature names for type-safe FeatureFlags in utils.config.ts
20
- type AdditionValues = (typeof additions)[keyof typeof additions];
21
- export type AdditionFeatureName = AdditionValues['featureName'];
22
-
23
- export type TypedAdditionMeta = AdditionMeta<AdditionFeatureName>;
@@ -1,145 +0,0 @@
1
- import type { AdditionModule, FlagDefinition } from '../types.js';
2
- import { additionsDebug, printChanges } from './utils.js';
3
- import defaultAdditions, { AdditionMeta } from './additions.js';
4
- import { flushChanges, formatFiles, installNPMDependencies } from '../utils.js';
5
- import { getConfig, isFeatureEnabled, setFeatureFlag } from '../../utils/utils.config.js';
6
-
7
- import { Context } from '../context.js';
8
- import { output } from '../../utils/utils.console.js';
9
-
10
- export type AdditionOptions = Record<string, any>;
11
-
12
- export function getAvailableAdditions(
13
- additions: Record<string, AdditionMeta> = defaultAdditions.additions
14
- ): Record<string, AdditionMeta> {
15
- return additions;
16
- }
17
-
18
- export function getAdditionByName(
19
- name: string,
20
- additions: Record<string, AdditionMeta> = defaultAdditions.additions
21
- ): AdditionMeta | undefined {
22
- return additions[name];
23
- }
24
-
25
- async function loadAdditionModule(addition: AdditionMeta): Promise<AdditionModule | null> {
26
- try {
27
- const module = (await import(addition.scriptPath)) as AdditionModule;
28
- return module;
29
- } catch (error) {
30
- additionsDebug('Failed to load addition module for "%s" from %s: %O', addition.name, addition.scriptPath, error);
31
- return null;
32
- }
33
- }
34
-
35
- export async function getAdditionFlags(addition: AdditionMeta): Promise<FlagDefinition[]> {
36
- const module = await loadAdditionModule(addition);
37
- return module?.flags || [];
38
- }
39
-
40
- export async function parseAdditionFlags(addition: AdditionMeta, argv: any): Promise<AdditionOptions> {
41
- const module = await loadAdditionModule(addition);
42
- if (module?.parseFlags) {
43
- return module.parseFlags(argv);
44
- }
45
- return {};
46
- }
47
-
48
- async function validateAdditionOptions(addition: AdditionMeta, options: AdditionOptions): Promise<void> {
49
- const flags = await getAdditionFlags(addition);
50
-
51
- if (!flags || flags.length === 0) {
52
- return;
53
- }
54
-
55
- const missingFlags: string[] = [];
56
-
57
- for (const flag of flags) {
58
- if (flag.required) {
59
- const value = options[flag.name];
60
- if (value === undefined || value === null || (Array.isArray(value) && value.length === 0)) {
61
- missingFlags.push(flag.name);
62
- }
63
- }
64
- }
65
-
66
- if (missingFlags.length > 0) {
67
- const flagDocs = flags.filter((f) => missingFlags.includes(f.name)).map((f) => ` --${f.name}: ${f.description}`);
68
-
69
- throw new Error(
70
- `Missing required flag${missingFlags.length > 1 ? 's' : ''}:\n\n` +
71
- flagDocs.join('\n') +
72
- `\n\nExample: npx @grafana/create-plugin add ${addition.name} --${missingFlags[0]}=value`
73
- );
74
- }
75
- }
76
-
77
- export async function runAdditionByName(additionName: string, argv: any): Promise<void> {
78
- const addition = getAdditionByName(additionName);
79
- if (!addition) {
80
- const availableAdditions = getAvailableAdditions();
81
- const additionsList = Object.keys(availableAdditions);
82
- throw new Error(`Unknown addition: ${additionName}\n\nAvailable additions: ${additionsList.join(', ')}`);
83
- }
84
-
85
- const options = await parseAdditionFlags(addition, argv);
86
- await validateAdditionOptions(addition, options);
87
- await runAddition(addition, options);
88
- }
89
-
90
- export async function runAddition(addition: AdditionMeta, additionOptions: AdditionOptions = {}): Promise<void> {
91
- const basePath = process.cwd();
92
-
93
- // Check if the feature is already enabled
94
- const config = getConfig();
95
- if (isFeatureEnabled(config.features, addition.featureName)) {
96
- output.log({
97
- title: `Addition '${addition.name}' is already enabled`,
98
- body: [`The feature flag '${addition.featureName}' is already set to true in .cprc.json.`, 'No changes needed.'],
99
- });
100
- return;
101
- }
102
-
103
- output.log({
104
- title: `Running addition: ${addition.name}`,
105
- body: [addition.description],
106
- });
107
-
108
- try {
109
- const context = new Context(basePath);
110
- const updatedContext = await executeAddition(addition, context, additionOptions);
111
-
112
- additionsDebug(`context for "${addition.name} (${addition.scriptPath})":`);
113
- additionsDebug('%O', updatedContext.listChanges());
114
-
115
- await formatFiles(updatedContext);
116
- flushChanges(updatedContext);
117
- printChanges(updatedContext, addition.name, addition);
118
-
119
- installNPMDependencies(updatedContext);
120
-
121
- await setFeatureFlag(addition.featureName, true);
122
- additionsDebug(`Set feature flag '${addition.featureName}' to true in .cprc.json`);
123
-
124
- output.success({
125
- title: `Successfully added ${addition.name} to your plugin.`,
126
- });
127
- } catch (error) {
128
- if (error instanceof Error) {
129
- throw new Error(`Error running addition "${addition.name} (${addition.scriptPath})": ${error.message}`);
130
- }
131
- throw error;
132
- }
133
- }
134
-
135
- export async function executeAddition(
136
- addition: AdditionMeta,
137
- context: Context,
138
- options: AdditionOptions = {}
139
- ): Promise<Context> {
140
- const module = await loadAdditionModule(addition);
141
- if (!module) {
142
- throw new Error(`Failed to load addition module for ${addition.name}`);
143
- }
144
- return module.default(context, options);
145
- }
@@ -1,111 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
-
3
- import { Context } from '../../context.js';
4
- import migrate from './example-addition.js';
5
-
6
- describe('example-addition', () => {
7
- it('should be idempotent', async () => {
8
- const context = new Context('/virtual');
9
-
10
- // Set up a minimal project structure
11
- context.addFile('package.json', JSON.stringify({ scripts: {}, dependencies: {}, devDependencies: {} }));
12
- context.addFile('src/index.ts', 'export const foo = "bar";');
13
-
14
- const migrateWithOptions = (ctx: Context) => migrate(ctx, { featureName: 'testFeature', enabled: true });
15
- await expect(migrateWithOptions).toBeIdempotent(context);
16
- });
17
-
18
- it('should add example script to package.json', () => {
19
- const context = new Context('/virtual');
20
-
21
- context.addFile('package.json', JSON.stringify({ scripts: {}, dependencies: {}, devDependencies: {} }));
22
-
23
- const result = migrate(context, { featureName: 'testFeature', enabled: true });
24
-
25
- const packageJson = JSON.parse(result.getFile('package.json') || '{}');
26
- expect(packageJson.scripts['example-script']).toBe('echo "Running testFeature"');
27
- });
28
-
29
- it('should add dev dependency', () => {
30
- const context = new Context('/virtual');
31
-
32
- context.addFile('package.json', JSON.stringify({ scripts: {}, dependencies: {}, devDependencies: {} }));
33
-
34
- const result = migrate(context, { featureName: 'myFeature', enabled: false });
35
-
36
- const packageJson = JSON.parse(result.getFile('package.json') || '{}');
37
- expect(packageJson.devDependencies['example-dev-dep']).toBe('^1.0.0');
38
- });
39
-
40
- it('should create config file with feature settings', () => {
41
- const context = new Context('/virtual');
42
-
43
- context.addFile('package.json', JSON.stringify({ scripts: {}, dependencies: {}, devDependencies: {} }));
44
-
45
- const result = migrate(context, { featureName: 'coolFeature', enabled: true });
46
-
47
- expect(result.doesFileExist('src/config.json')).toBe(true);
48
- const config = JSON.parse(result.getFile('src/config.json') || '{}');
49
- expect(config.features.coolFeature).toEqual({
50
- enabled: true,
51
- description: 'Example feature configuration',
52
- });
53
- });
54
-
55
- it('should create feature TypeScript file', () => {
56
- const context = new Context('/virtual');
57
-
58
- context.addFile('package.json', JSON.stringify({ scripts: {}, dependencies: {}, devDependencies: {} }));
59
-
60
- const result = migrate(context, { featureName: 'myFeature', enabled: false });
61
-
62
- expect(result.doesFileExist('src/features/myFeature.ts')).toBe(true);
63
- const featureCode = result.getFile('src/features/myFeature.ts');
64
- expect(featureCode).toContain('export const myFeature');
65
- expect(featureCode).toContain('enabled: false');
66
- expect(featureCode).toContain('myFeature initialized');
67
- });
68
-
69
- it('should delete deprecated file if it exists', () => {
70
- const context = new Context('/virtual');
71
-
72
- context.addFile('package.json', JSON.stringify({ scripts: {}, dependencies: {}, devDependencies: {} }));
73
- context.addFile('src/deprecated.ts', 'export const old = true;');
74
-
75
- const result = migrate(context, { featureName: 'testFeature', enabled: true });
76
-
77
- expect(result.doesFileExist('src/deprecated.ts')).toBe(false);
78
- });
79
-
80
- it('should rename old-config.json if it exists', () => {
81
- const context = new Context('/virtual');
82
-
83
- context.addFile('package.json', JSON.stringify({ scripts: {}, dependencies: {}, devDependencies: {} }));
84
- context.addFile('src/old-config.json', JSON.stringify({ old: true }));
85
-
86
- const result = migrate(context, { featureName: 'testFeature', enabled: true });
87
-
88
- expect(result.doesFileExist('src/old-config.json')).toBe(false);
89
- expect(result.doesFileExist('src/new-config.json')).toBe(true);
90
- const newConfig = JSON.parse(result.getFile('src/new-config.json') || '{}');
91
- expect(newConfig.old).toBe(true);
92
- });
93
-
94
- it('should not add script if it already exists', () => {
95
- const context = new Context('/virtual');
96
-
97
- context.addFile(
98
- 'package.json',
99
- JSON.stringify({
100
- scripts: { 'example-script': 'existing command' },
101
- dependencies: {},
102
- devDependencies: {},
103
- })
104
- );
105
-
106
- const result = migrate(context, { featureName: 'testFeature', enabled: true });
107
-
108
- const packageJson = JSON.parse(result.getFile('package.json') || '{}');
109
- expect(packageJson.scripts['example-script']).toBe('existing command');
110
- });
111
- });
@@ -1,79 +0,0 @@
1
- import type { Context } from '../../context.js';
2
- import type { FlagDefinition } from '../../types.js';
3
- import { addDependenciesToPackageJson } from '../../utils.js';
4
-
5
- export type ExampleOptions = {
6
- featureName: string;
7
- enabled: boolean;
8
- };
9
-
10
- export const flags: FlagDefinition[] = [
11
- {
12
- name: 'feature-name',
13
- description: 'Name of the feature to add',
14
- required: false,
15
- },
16
- {
17
- name: 'enabled',
18
- description: 'Whether the feature should be enabled by default',
19
- required: false,
20
- },
21
- ];
22
-
23
- export function parseFlags(argv: any): ExampleOptions {
24
- return {
25
- featureName: argv['feature-name'] || 'myFeature',
26
- enabled: argv.enabled === 'true' || argv.enabled === true,
27
- };
28
- }
29
-
30
- export default function migrate(
31
- context: Context,
32
- options: ExampleOptions = { featureName: 'myFeature', enabled: true }
33
- ): Context {
34
- const { featureName, enabled } = options;
35
-
36
- const rawPkgJson = context.getFile('./package.json') ?? '{}';
37
- const packageJson = JSON.parse(rawPkgJson);
38
-
39
- if (packageJson.scripts && !packageJson.scripts['example-script']) {
40
- packageJson.scripts['example-script'] = `echo "Running ${featureName}"`;
41
- context.updateFile('./package.json', JSON.stringify(packageJson, null, 2));
42
- }
43
-
44
- addDependenciesToPackageJson(context, {}, { 'example-dev-dep': '^1.0.0' });
45
-
46
- if (!context.doesFileExist('./src/config.json')) {
47
- const config = {
48
- features: {
49
- [featureName]: {
50
- enabled,
51
- description: 'Example feature configuration',
52
- },
53
- },
54
- };
55
- context.addFile('./src/config.json', JSON.stringify(config, null, 2));
56
- }
57
-
58
- if (!context.doesFileExist(`./src/features/${featureName}.ts`)) {
59
- const featureCode = `export const ${featureName} = {
60
- name: '${featureName}',
61
- enabled: ${enabled},
62
- init() {
63
- console.log('${featureName} initialized');
64
- },
65
- };
66
- `;
67
- context.addFile(`./src/features/${featureName}.ts`, featureCode);
68
- }
69
-
70
- if (context.doesFileExist('./src/deprecated.ts')) {
71
- context.deleteFile('./src/deprecated.ts');
72
- }
73
-
74
- if (context.doesFileExist('./src/old-config.json')) {
75
- context.renameFile('./src/old-config.json', './src/new-config.json');
76
- }
77
-
78
- return context;
79
- }
@@ -1,12 +0,0 @@
1
- import type { AdditionMeta } from './additions.js';
2
- import type { Context } from '../context.js';
3
- import { debug } from '../../utils/utils.cli.js';
4
- import { printChanges as sharedPrintChanges } from '../utils.js';
5
-
6
- export const additionsDebug = debug.extend('additions');
7
-
8
- // addition-specific wrapper for printChanges.
9
- export function printChanges(context: Context, key: string, addition: AdditionMeta) {
10
- additionsDebug('printChanges for addition: %s', key);
11
- sharedPrintChanges(context, key, addition);
12
- }
@@ -1,12 +0,0 @@
1
- import type { Context } from '../context.js';
2
- import type { MigrationMeta } from './migrations.js';
3
- import { debug } from '../../utils/utils.cli.js';
4
- import { printChanges as sharedPrintChanges } from '../utils.js';
5
-
6
- export const migrationsDebug = debug.extend('migrations');
7
-
8
- // migration-specific wrapper for printChanges
9
- export function printChanges(context: Context, key: string, migration: MigrationMeta) {
10
- migrationsDebug('printChanges for migration: %s', key);
11
- sharedPrintChanges(context, key, migration);
12
- }
@@ -1,21 +0,0 @@
1
- import type { Context } from './context.js';
2
-
3
- export interface CodemodModule {
4
- default: (context: Context) => Context | Promise<Context>;
5
- }
6
-
7
- export interface FlagDefinition {
8
- name: string;
9
- description: string;
10
- required: boolean;
11
- }
12
-
13
- export interface AdditionModule<TOptions = any> extends CodemodModule {
14
- default: (context: Context, options?: TOptions) => Context | Promise<Context>;
15
- flags?: FlagDefinition[];
16
- parseFlags?: (argv: any) => TOptions;
17
- }
18
-
19
- export interface MigrationModule extends CodemodModule {
20
- default: (context: Context) => Context | Promise<Context>;
21
- }
@@ -1,97 +0,0 @@
1
- import { getAdditionFlags, getAvailableAdditions, runAdditionByName } from '../codemods/additions/manager.js';
2
- import { isGitDirectory, isGitDirectoryClean } from '../utils/utils.git.js';
3
-
4
- import { isPluginDirectory } from '../utils/utils.plugin.js';
5
- import minimist from 'minimist';
6
- import { output } from '../utils/utils.console.js';
7
-
8
- export const add = async (argv: minimist.ParsedArgs) => {
9
- const subCommand = argv._[1];
10
-
11
- if (!subCommand) {
12
- await showAdditionsHelp();
13
- process.exit(1);
14
- }
15
-
16
- await performPreAddChecks(argv);
17
-
18
- try {
19
- await runAdditionByName(subCommand, argv);
20
- } catch (error) {
21
- if (error instanceof Error) {
22
- output.error({
23
- title: 'Addition failed',
24
- body: [error.message],
25
- });
26
- }
27
- process.exit(1);
28
- }
29
- };
30
-
31
- async function showAdditionsHelp() {
32
- const availableAdditions = getAvailableAdditions();
33
- const additionsList = await Promise.all(
34
- Object.values(availableAdditions).map(async (addition) => {
35
- let info = `${addition.name} - ${addition.description}`;
36
- const flags = await getAdditionFlags(addition);
37
- if (flags.length > 0) {
38
- const flagDocs = flags.map((flag) => {
39
- const req = flag.required ? ' (required)' : ' (optional)';
40
- return ` --${flag.name}: ${flag.description}${req}`;
41
- });
42
- info += '\n' + flagDocs.join('\n');
43
- }
44
- return info;
45
- })
46
- );
47
-
48
- output.error({
49
- title: 'No addition specified',
50
- body: [
51
- 'Usage: npx @grafana/create-plugin add <addition-name> [options]',
52
- '',
53
- 'Available additions:',
54
- ...output.bulletList(additionsList),
55
- ],
56
- });
57
- }
58
-
59
- async function performPreAddChecks(argv: minimist.ParsedArgs) {
60
- if (!(await isGitDirectory()) && !argv.force) {
61
- output.error({
62
- title: 'You are not inside a git directory',
63
- body: [
64
- `In order to proceed please run ${output.formatCode('git init')} in the root of your project and commit your changes.`,
65
- `(This check is necessary to make sure that the changes are easy to revert and don't interfere with any changes you currently have.`,
66
- `In case you want to proceed as is please use the ${output.formatCode('--force')} flag.)`,
67
- ],
68
- });
69
-
70
- process.exit(1);
71
- }
72
-
73
- if (!(await isGitDirectoryClean()) && !argv.force) {
74
- output.error({
75
- title: 'Please clean your repository working tree before adding features.',
76
- body: [
77
- 'Commit your changes or stash them.',
78
- `(This check is necessary to make sure that the changes are easy to revert and don't mess with any changes you currently have.`,
79
- `In case you want to proceed as is please use the ${output.formatCode('--force')} flag.)`,
80
- ],
81
- });
82
-
83
- process.exit(1);
84
- }
85
-
86
- if (!isPluginDirectory() && !argv.force) {
87
- output.error({
88
- title: 'Are you inside a plugin directory?',
89
- body: [
90
- `We couldn't find a "src/plugin.json" file under your current directory.`,
91
- `(Please make sure to run this command from the root of your plugin folder. In case you want to proceed as is please use the ${output.formatCode('--force')} flag.)`,
92
- ],
93
- });
94
-
95
- process.exit(1);
96
- }
97
- }