@baseplate-dev/project-builder-server 0.5.3 → 0.6.1
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/CHANGELOG.md +69 -0
- package/dist/actions/__tests__/action-test-utils.d.ts +24 -0
- package/dist/actions/__tests__/action-test-utils.d.ts.map +1 -0
- package/dist/actions/__tests__/action-test-utils.js +33 -0
- package/dist/actions/__tests__/action-test-utils.js.map +1 -0
- package/dist/actions/definition/commit-draft.action.d.ts +16 -0
- package/dist/actions/definition/commit-draft.action.d.ts.map +1 -0
- package/dist/actions/definition/commit-draft.action.js +65 -0
- package/dist/actions/definition/commit-draft.action.js.map +1 -0
- package/dist/actions/definition/discard-draft.action.d.ts +7 -0
- package/dist/actions/definition/discard-draft.action.d.ts.map +1 -0
- package/dist/actions/definition/discard-draft.action.js +30 -0
- package/dist/actions/definition/discard-draft.action.js.map +1 -0
- package/dist/actions/definition/draft-session.d.ts +41 -0
- package/dist/actions/definition/draft-session.d.ts.map +1 -0
- package/dist/actions/definition/draft-session.js +117 -0
- package/dist/actions/definition/draft-session.js.map +1 -0
- package/dist/actions/definition/get-entity-schema.action.d.ts +10 -0
- package/dist/actions/definition/get-entity-schema.action.d.ts.map +1 -0
- package/dist/actions/definition/get-entity-schema.action.js +48 -0
- package/dist/actions/definition/get-entity-schema.action.js.map +1 -0
- package/dist/actions/definition/get-entity.action.d.ts +8 -0
- package/dist/actions/definition/get-entity.action.d.ts.map +1 -0
- package/dist/actions/definition/get-entity.action.js +37 -0
- package/dist/actions/definition/get-entity.action.js.map +1 -0
- package/dist/actions/definition/index.d.ts +11 -0
- package/dist/actions/definition/index.d.ts.map +1 -0
- package/dist/actions/definition/index.js +11 -0
- package/dist/actions/definition/index.js.map +1 -0
- package/dist/actions/definition/list-entities.action.d.ts +13 -0
- package/dist/actions/definition/list-entities.action.d.ts.map +1 -0
- package/dist/actions/definition/list-entities.action.js +43 -0
- package/dist/actions/definition/list-entities.action.js.map +1 -0
- package/dist/actions/definition/list-entity-types.action.d.ts +10 -0
- package/dist/actions/definition/list-entity-types.action.d.ts.map +1 -0
- package/dist/actions/definition/list-entity-types.action.js +42 -0
- package/dist/actions/definition/list-entity-types.action.js.map +1 -0
- package/dist/actions/definition/load-entity-service-context.d.ts +14 -0
- package/dist/actions/definition/load-entity-service-context.d.ts.map +1 -0
- package/dist/actions/definition/load-entity-service-context.js +18 -0
- package/dist/actions/definition/load-entity-service-context.js.map +1 -0
- package/dist/actions/definition/show-draft.action.d.ts +18 -0
- package/dist/actions/definition/show-draft.action.d.ts.map +1 -0
- package/dist/actions/definition/show-draft.action.js +117 -0
- package/dist/actions/definition/show-draft.action.js.map +1 -0
- package/dist/actions/definition/stage-create-entity.action.d.ts +19 -0
- package/dist/actions/definition/stage-create-entity.action.d.ts.map +1 -0
- package/dist/actions/definition/stage-create-entity.action.js +60 -0
- package/dist/actions/definition/stage-create-entity.action.js.map +1 -0
- package/dist/actions/definition/stage-delete-entity.action.d.ts +18 -0
- package/dist/actions/definition/stage-delete-entity.action.d.ts.map +1 -0
- package/dist/actions/definition/stage-delete-entity.action.js +55 -0
- package/dist/actions/definition/stage-delete-entity.action.js.map +1 -0
- package/dist/actions/definition/stage-update-entity.action.d.ts +19 -0
- package/dist/actions/definition/stage-update-entity.action.d.ts.map +1 -0
- package/dist/actions/definition/stage-update-entity.action.js +59 -0
- package/dist/actions/definition/stage-update-entity.action.js.map +1 -0
- package/dist/actions/definition/validate-draft.d.ts +17 -0
- package/dist/actions/definition/validate-draft.d.ts.map +1 -0
- package/dist/actions/definition/validate-draft.js +25 -0
- package/dist/actions/definition/validate-draft.js.map +1 -0
- package/dist/actions/index.d.ts +4 -0
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +4 -0
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/registry.d.ts +169 -92
- package/dist/actions/registry.d.ts.map +1 -1
- package/dist/actions/registry.js +17 -1
- package/dist/actions/registry.js.map +1 -1
- package/dist/actions/snapshot/snapshot-add.action.d.ts +0 -1
- package/dist/actions/snapshot/snapshot-add.action.d.ts.map +1 -1
- package/dist/actions/snapshot/snapshot-add.action.js +3 -7
- package/dist/actions/snapshot/snapshot-add.action.js.map +1 -1
- package/dist/actions/snapshot/snapshot-remove.action.d.ts +0 -1
- package/dist/actions/snapshot/snapshot-remove.action.d.ts.map +1 -1
- package/dist/actions/snapshot/snapshot-remove.action.js +3 -7
- package/dist/actions/snapshot/snapshot-remove.action.js.map +1 -1
- package/dist/actions/snapshot/snapshot-save.action.d.ts +2 -2
- package/dist/actions/snapshot/snapshot-save.action.d.ts.map +1 -1
- package/dist/actions/snapshot/snapshot-save.action.js +23 -11
- package/dist/actions/snapshot/snapshot-save.action.js.map +1 -1
- package/dist/actions/snapshot/snapshot-show.action.d.ts +5 -2
- package/dist/actions/snapshot/snapshot-show.action.d.ts.map +1 -1
- package/dist/actions/snapshot/snapshot-show.action.js +17 -19
- package/dist/actions/snapshot/snapshot-show.action.js.map +1 -1
- package/dist/actions/sync/sync-all-projects.action.d.ts.map +1 -1
- package/dist/actions/sync/sync-all-projects.action.js +3 -2
- package/dist/actions/sync/sync-all-projects.action.js.map +1 -1
- package/dist/actions/sync/sync-file.action.js +1 -1
- package/dist/actions/sync/sync-file.action.js.map +1 -1
- package/dist/actions/sync/sync-project.action.d.ts +1 -1
- package/dist/actions/sync/sync-project.action.d.ts.map +1 -1
- package/dist/actions/sync/sync-project.action.js +20 -6
- package/dist/actions/sync/sync-project.action.js.map +1 -1
- package/dist/actions/template-extractor/delete-template-by-name.action.d.ts +13 -0
- package/dist/actions/template-extractor/delete-template-by-name.action.d.ts.map +1 -0
- package/dist/actions/template-extractor/delete-template-by-name.action.js +46 -0
- package/dist/actions/template-extractor/delete-template-by-name.action.js.map +1 -0
- package/dist/actions/template-extractor/index.d.ts +1 -0
- package/dist/actions/template-extractor/index.d.ts.map +1 -1
- package/dist/actions/template-extractor/index.js +1 -0
- package/dist/actions/template-extractor/index.js.map +1 -1
- package/dist/actions/test-project/index.d.ts +2 -0
- package/dist/actions/test-project/index.d.ts.map +1 -0
- package/dist/actions/test-project/index.js +2 -0
- package/dist/actions/test-project/index.js.map +1 -0
- package/dist/actions/test-project/test-project-init.action.d.ts +17 -0
- package/dist/actions/test-project/test-project-init.action.d.ts.map +1 -0
- package/dist/actions/test-project/test-project-init.action.js +97 -0
- package/dist/actions/test-project/test-project-init.action.js.map +1 -0
- package/dist/actions/types.d.ts +2 -0
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/actions/types.js.map +1 -1
- package/dist/actions/utils/generation-manifest.d.ts +12 -0
- package/dist/actions/utils/generation-manifest.d.ts.map +1 -0
- package/dist/actions/utils/generation-manifest.js +142 -0
- package/dist/actions/utils/generation-manifest.js.map +1 -0
- package/dist/actions/utils/index.d.ts +1 -1
- package/dist/actions/utils/index.d.ts.map +1 -1
- package/dist/actions/utils/index.js +1 -1
- package/dist/actions/utils/index.js.map +1 -1
- package/dist/actions/utils/project-discovery.d.ts +23 -9
- package/dist/actions/utils/project-discovery.d.ts.map +1 -1
- package/dist/actions/utils/project-discovery.js +57 -31
- package/dist/actions/utils/project-discovery.js.map +1 -1
- package/dist/actions/utils/projects.d.ts.map +1 -1
- package/dist/actions/utils/projects.js +2 -1
- package/dist/actions/utils/projects.js.map +1 -1
- package/dist/compiler/backend/{authorizers.d.ts → authorizer-compiler.d.ts} +22 -2
- package/dist/compiler/backend/authorizer-compiler.d.ts.map +1 -0
- package/dist/compiler/backend/authorizer-compiler.js +165 -0
- package/dist/compiler/backend/authorizer-compiler.js.map +1 -0
- package/dist/compiler/backend/feature.d.ts.map +1 -1
- package/dist/compiler/backend/feature.js +3 -1
- package/dist/compiler/backend/feature.js.map +1 -1
- package/dist/compiler/backend/graphql.d.ts.map +1 -1
- package/dist/compiler/backend/graphql.js +115 -49
- package/dist/compiler/backend/graphql.js.map +1 -1
- package/dist/compiler/backend/models.d.ts.map +1 -1
- package/dist/compiler/backend/models.js +13 -13
- package/dist/compiler/backend/models.js.map +1 -1
- package/dist/compiler/backend/query-filter-compiler.d.ts +40 -0
- package/dist/compiler/backend/query-filter-compiler.d.ts.map +1 -0
- package/dist/compiler/backend/query-filter-compiler.js +168 -0
- package/dist/compiler/backend/query-filter-compiler.js.map +1 -0
- package/dist/compiler/backend/services.d.ts.map +1 -1
- package/dist/compiler/backend/services.js +24 -1
- package/dist/compiler/backend/services.js.map +1 -1
- package/dist/compiler/index.d.ts +1 -0
- package/dist/compiler/index.d.ts.map +1 -1
- package/dist/compiler/index.js.map +1 -1
- package/dist/compiler/root/root-package-compiler.js +6 -6
- package/dist/compiler/root/root-package-compiler.js.map +1 -1
- package/dist/compiler/web/admin/crud/index.js +1 -1
- package/dist/compiler/web/admin/crud/index.js.map +1 -1
- package/dist/compiler/web/admin/index.js +1 -1
- package/dist/compiler/web/admin/index.js.map +1 -1
- package/dist/compiler/web/admin/sections.d.ts.map +1 -1
- package/dist/compiler/web/admin/sections.js +2 -2
- package/dist/compiler/web/admin/sections.js.map +1 -1
- package/dist/compiler/web/web-compiler.d.ts.map +1 -1
- package/dist/compiler/web/web-compiler.js +4 -4
- package/dist/compiler/web/web-compiler.js.map +1 -1
- package/dist/core-modules/admin-crud-column-compiler.js +1 -1
- package/dist/core-modules/admin-crud-column-compiler.js.map +1 -1
- package/dist/core-modules/admin-crud-input-compiler.d.ts.map +1 -1
- package/dist/core-modules/admin-crud-input-compiler.js +13 -3
- package/dist/core-modules/admin-crud-input-compiler.js.map +1 -1
- package/dist/dev-server/api/router.d.ts +8 -7
- package/dist/dev-server/api/router.d.ts.map +1 -1
- package/dist/dev-server/mcp/stdio.d.ts +2 -2
- package/dist/dev-server/mcp/stdio.d.ts.map +1 -1
- package/dist/dev-server/mcp/stdio.js +2 -2
- package/dist/dev-server/mcp/stdio.js.map +1 -1
- package/dist/diff/diff-project.d.ts.map +1 -1
- package/dist/diff/diff-project.js +4 -4
- package/dist/diff/diff-project.js.map +1 -1
- package/dist/diff/snapshot/apply-diff-to-generator-output.d.ts.map +1 -1
- package/dist/diff/snapshot/apply-diff-to-generator-output.js +17 -2
- package/dist/diff/snapshot/apply-diff-to-generator-output.js.map +1 -1
- package/dist/diff/snapshot/create-snapshot-for-project.d.ts +12 -6
- package/dist/diff/snapshot/create-snapshot-for-project.d.ts.map +1 -1
- package/dist/diff/snapshot/create-snapshot-for-project.js +58 -26
- package/dist/diff/snapshot/create-snapshot-for-project.js.map +1 -1
- package/dist/diff/snapshot/index.d.ts +4 -1
- package/dist/diff/snapshot/index.d.ts.map +1 -1
- package/dist/diff/snapshot/index.js +4 -0
- package/dist/diff/snapshot/index.js.map +1 -1
- package/dist/diff/snapshot/save-snapshot.d.ts +11 -3
- package/dist/diff/snapshot/save-snapshot.d.ts.map +1 -1
- package/dist/diff/snapshot/save-snapshot.js +29 -10
- package/dist/diff/snapshot/save-snapshot.js.map +1 -1
- package/dist/diff/snapshot/snapshot-management.d.ts +7 -6
- package/dist/diff/snapshot/snapshot-management.d.ts.map +1 -1
- package/dist/diff/snapshot/snapshot-management.js +18 -22
- package/dist/diff/snapshot/snapshot-management.js.map +1 -1
- package/dist/diff/snapshot/snapshot-manifest.d.ts +1 -1
- package/dist/diff/snapshot/snapshot-manifest.d.ts.map +1 -1
- package/dist/diff/snapshot/snapshot-manifest.js +7 -7
- package/dist/diff/snapshot/snapshot-manifest.js.map +1 -1
- package/dist/diff/snapshot/snapshot-types.d.ts +22 -8
- package/dist/diff/snapshot/snapshot-types.d.ts.map +1 -1
- package/dist/diff/snapshot/snapshot-types.js +6 -2
- package/dist/diff/snapshot/snapshot-types.js.map +1 -1
- package/dist/diff/snapshot/snapshot-utils.d.ts +14 -5
- package/dist/diff/snapshot/snapshot-utils.d.ts.map +1 -1
- package/dist/diff/snapshot/snapshot-utils.js +25 -8
- package/dist/diff/snapshot/snapshot-utils.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/plugins/node-plugin-store.d.ts +1 -1
- package/dist/plugins/node-plugin-store.d.ts.map +1 -1
- package/dist/plugins/node-plugin-store.js +2 -2
- package/dist/plugins/node-plugin-store.js.map +1 -1
- package/dist/project-definition/load-project-definition.d.ts +2 -2
- package/dist/project-definition/load-project-definition.d.ts.map +1 -1
- package/dist/project-definition/load-project-definition.js +3 -3
- package/dist/project-definition/load-project-definition.js.map +1 -1
- package/dist/sync/generate-for-directory.d.ts +3 -2
- package/dist/sync/generate-for-directory.d.ts.map +1 -1
- package/dist/sync/generate-for-directory.js +24 -11
- package/dist/sync/generate-for-directory.js.map +1 -1
- package/dist/sync/sync-project.d.ts +3 -3
- package/dist/sync/sync-project.d.ts.map +1 -1
- package/dist/sync/sync-project.js +9 -3
- package/dist/sync/sync-project.js.map +1 -1
- package/dist/templates/create/create-generator.d.ts.map +1 -1
- package/dist/templates/create/create-generator.js +3 -3
- package/dist/templates/create/create-generator.js.map +1 -1
- package/dist/user-config/user-config-schema.d.ts +12 -0
- package/dist/user-config/user-config-schema.d.ts.map +1 -1
- package/dist/user-config/user-config-schema.js +29 -0
- package/dist/user-config/user-config-schema.js.map +1 -1
- package/package.json +17 -14
- package/dist/actions/utils/is-example-project.d.ts +0 -7
- package/dist/actions/utils/is-example-project.d.ts.map +0 -1
- package/dist/actions/utils/is-example-project.js +0 -22
- package/dist/actions/utils/is-example-project.js.map +0 -1
- package/dist/compiler/backend/authorizers.d.ts.map +0 -1
- package/dist/compiler/backend/authorizers.js +0 -75
- package/dist/compiler/backend/authorizers.js.map +0 -1
- package/dist/project-definition/get-single-app-directory-for-project.d.ts +0 -11
- package/dist/project-definition/get-single-app-directory-for-project.d.ts.map +0 -1
- package/dist/project-definition/get-single-app-directory-for-project.js +0 -19
- package/dist/project-definition/get-single-app-directory-for-project.js.map +0 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { getLatestMigrationVersion } from '@baseplate-dev/project-builder-lib';
|
|
2
|
+
import { stringifyPrettyStable } from '@baseplate-dev/utils';
|
|
3
|
+
import { dirExists } from '@baseplate-dev/utils/node';
|
|
4
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { createServiceAction } from '../types.js';
|
|
8
|
+
const projectTypeSchema = z
|
|
9
|
+
.enum(['example', 'test'])
|
|
10
|
+
.describe('The type of project to initialize.');
|
|
11
|
+
const initProjectInputSchema = z.object({
|
|
12
|
+
projectDirectory: z
|
|
13
|
+
.string()
|
|
14
|
+
.describe('Absolute path to the project directory (e.g. examples/<name>/ or tests/<name>/).'),
|
|
15
|
+
projectName: z
|
|
16
|
+
.string()
|
|
17
|
+
.describe('The name of the project (used as the project name).'),
|
|
18
|
+
type: projectTypeSchema,
|
|
19
|
+
});
|
|
20
|
+
const initProjectOutputSchema = z.object({
|
|
21
|
+
success: z.boolean().describe('Whether the initialization was successful.'),
|
|
22
|
+
message: z.string().describe('Result message.'),
|
|
23
|
+
definitionPath: z
|
|
24
|
+
.string()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe('Path to the created project definition.'),
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* Service action to initialize a new example or test project with a default project definition.
|
|
30
|
+
*/
|
|
31
|
+
export const initProjectAction = createServiceAction({
|
|
32
|
+
name: 'init-project',
|
|
33
|
+
title: 'Initialize Project',
|
|
34
|
+
description: 'Create a new example or test project with an initial project definition',
|
|
35
|
+
inputSchema: initProjectInputSchema,
|
|
36
|
+
outputSchema: initProjectOutputSchema,
|
|
37
|
+
handler: async (input, context) => {
|
|
38
|
+
const { projectDirectory, projectName, type } = input;
|
|
39
|
+
const { logger } = context;
|
|
40
|
+
try {
|
|
41
|
+
if (await dirExists(projectDirectory)) {
|
|
42
|
+
return {
|
|
43
|
+
success: false,
|
|
44
|
+
message: `Project already exists at ${projectDirectory}.`,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// Test projects: project-definition.json at root
|
|
48
|
+
// Example projects: baseplate/project-definition.json
|
|
49
|
+
const definitionDir = type === 'test'
|
|
50
|
+
? projectDirectory
|
|
51
|
+
: path.join(projectDirectory, 'baseplate');
|
|
52
|
+
await mkdir(definitionDir, { recursive: true });
|
|
53
|
+
const definitionPath = path.join(definitionDir, 'project-definition.json');
|
|
54
|
+
const initialDefinition = {
|
|
55
|
+
settings: {
|
|
56
|
+
general: {
|
|
57
|
+
name: projectName,
|
|
58
|
+
packageScope: '',
|
|
59
|
+
portOffset: 3000,
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
features: [],
|
|
63
|
+
apps: [],
|
|
64
|
+
libraries: [],
|
|
65
|
+
models: [],
|
|
66
|
+
isInitialized: false,
|
|
67
|
+
schemaVersion: getLatestMigrationVersion(),
|
|
68
|
+
};
|
|
69
|
+
await writeFile(definitionPath, stringifyPrettyStable(initialDefinition));
|
|
70
|
+
logger.info(`Created ${type} project at ${projectDirectory}`);
|
|
71
|
+
return {
|
|
72
|
+
success: true,
|
|
73
|
+
message: `${type === 'test' ? 'Test' : 'Example'} project '${projectName}' initialized at ${projectDirectory}`,
|
|
74
|
+
definitionPath,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
logger.error(`Failed to initialize project: ${String(error)}`);
|
|
79
|
+
return {
|
|
80
|
+
success: false,
|
|
81
|
+
message: `Failed to initialize project: ${error instanceof Error ? error.message : String(error)}`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
writeCliOutput: (output) => {
|
|
86
|
+
if (output.success) {
|
|
87
|
+
console.info(`✓ ${output.message}`);
|
|
88
|
+
if (output.definitionPath) {
|
|
89
|
+
console.info(` Next: Configure the project definition, then run 'baseplate-dev sync <project-name>'`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
console.error(`✗ ${output.message}`);
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=test-project-init.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-project-init.action.js","sourceRoot":"","sources":["../../../src/actions/test-project/test-project-init.action.ts"],"names":[],"mappings":"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"}
|
package/dist/actions/types.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ export interface ServiceActionContext {
|
|
|
18
18
|
logger: Logger;
|
|
19
19
|
/** The version of @baseplate-dev/project-builder-cli. */
|
|
20
20
|
cliVersion: string;
|
|
21
|
+
/** Session ID for draft management. */
|
|
22
|
+
sessionId: string;
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
25
|
* A service action is a function that can be called by a client via CLI, MCP, or TRPC.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/actions/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,WAAW,EACZ,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAElF;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,qDAAqD;IACrD,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,+CAA+C;IAC/C,UAAU,EAAE,mBAAmB,CAAC;IAChC,oDAAoD;IACpD,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/actions/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,WAAW,EACZ,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAElF;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,qDAAqD;IACrD,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,+CAA+C;IAC/C,UAAU,EAAE,mBAAmB,CAAC;IAChC,oDAAoD;IACpD,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAC5B,UAAU,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,EACxC,WAAW,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO;IAEzC,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,WAAW,EAAE,UAAU,CAAC;IACxB,+CAA+C;IAC/C,YAAY,EAAE,WAAW,CAAC;IAC1B,yCAAyC;IACzC,OAAO,EAAE,CACP,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAC3B,OAAO,EAAE,oBAAoB,KAC1B,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1D;;;OAGG;IACH,cAAc,CAAC,EAAE,CACf,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KACxB,IAAI,CAAC;CACX;AAGD,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,SAAS,CAAC,CAAC,OAAO,EAC5B,WAAW,SAAS,CAAC,CAAC,OAAO,EAE7B,MAAM,EAAE,aAAa,CAAC,UAAU,EAAE,WAAW,CAAC,GAC7C,aAAa,CAAC,UAAU,EAAE,WAAW,CAAC,CAExC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/actions/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/actions/types.ts"],"names":[],"mappings":"AAgEA;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAIjC,MAA8C;IAE9C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates and writes a generation manifest for the given directory.
|
|
3
|
+
* Call this after generating a test project to enable staleness detection.
|
|
4
|
+
* The manifest is stored at `<outputDir>/baseplate/generation-manifest.json`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function writeGenerationManifest(outputDir: string): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Checks staleness and throws an error if the directory has been modified.
|
|
9
|
+
* Used to warn before overwriting a test project that has unsaved changes.
|
|
10
|
+
*/
|
|
11
|
+
export declare function assertNotStale(outputDir: string): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=generation-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation-manifest.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/generation-manifest.ts"],"names":[],"mappings":"AAgEA;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAuED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BrE"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import pLimit from 'p-limit';
|
|
5
|
+
const MANIFEST_FILENAME = 'generation-manifest.json';
|
|
6
|
+
const FILE_HASH_CONCURRENCY = 20;
|
|
7
|
+
/** Directory and file names to skip when collecting files for the manifest. */
|
|
8
|
+
const IGNORED_ENTRIES = new Set([
|
|
9
|
+
'node_modules',
|
|
10
|
+
'dist',
|
|
11
|
+
'.turbo',
|
|
12
|
+
'baseplate',
|
|
13
|
+
'build',
|
|
14
|
+
MANIFEST_FILENAME,
|
|
15
|
+
]);
|
|
16
|
+
/**
|
|
17
|
+
* Returns the path to the generation manifest file inside the baseplate directory.
|
|
18
|
+
*/
|
|
19
|
+
function getManifestPath(outputDir) {
|
|
20
|
+
return path.join(outputDir, 'baseplate', MANIFEST_FILENAME);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Computes SHA-256 hash of a file's contents.
|
|
24
|
+
*/
|
|
25
|
+
async function hashFile(filePath) {
|
|
26
|
+
const content = await readFile(filePath);
|
|
27
|
+
return createHash('sha256').update(content).digest('hex');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Recursively collects all files in a directory, returning paths relative to the root.
|
|
31
|
+
* Skips entries listed in IGNORED_ENTRIES (e.g. node_modules, dist, .turbo).
|
|
32
|
+
*/
|
|
33
|
+
async function collectFiles(dir, rootDir) {
|
|
34
|
+
const files = [];
|
|
35
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
36
|
+
for (const entry of entries) {
|
|
37
|
+
const fullPath = path.join(dir, entry.name);
|
|
38
|
+
const relativePath = path.relative(rootDir, fullPath);
|
|
39
|
+
if (IGNORED_ENTRIES.has(entry.name)) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (entry.isDirectory()) {
|
|
43
|
+
files.push(...(await collectFiles(fullPath, rootDir)));
|
|
44
|
+
}
|
|
45
|
+
else if (entry.isFile()) {
|
|
46
|
+
files.push(relativePath);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return files;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Creates and writes a generation manifest for the given directory.
|
|
53
|
+
* Call this after generating a test project to enable staleness detection.
|
|
54
|
+
* The manifest is stored at `<outputDir>/baseplate/generation-manifest.json`.
|
|
55
|
+
*/
|
|
56
|
+
export async function writeGenerationManifest(outputDir) {
|
|
57
|
+
const files = await collectFiles(outputDir, outputDir);
|
|
58
|
+
const fileHashes = {};
|
|
59
|
+
const limit = pLimit(FILE_HASH_CONCURRENCY);
|
|
60
|
+
await Promise.all(files.map((file) => limit(async () => {
|
|
61
|
+
fileHashes[file] = await hashFile(path.join(outputDir, file));
|
|
62
|
+
})));
|
|
63
|
+
const manifest = {
|
|
64
|
+
generatedAt: new Date().toISOString(),
|
|
65
|
+
files: fileHashes,
|
|
66
|
+
};
|
|
67
|
+
await writeFile(getManifestPath(outputDir), JSON.stringify(manifest, null, 2));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Checks if any files in the output directory have been modified since the
|
|
71
|
+
* generation manifest was written. Returns details about which files changed.
|
|
72
|
+
*
|
|
73
|
+
* If no manifest exists, returns not stale (assumes a fresh or manual directory).
|
|
74
|
+
*/
|
|
75
|
+
async function checkStaleness(outputDir) {
|
|
76
|
+
const manifestPath = getManifestPath(outputDir);
|
|
77
|
+
let manifest;
|
|
78
|
+
try {
|
|
79
|
+
const content = await readFile(manifestPath, 'utf-8');
|
|
80
|
+
manifest = JSON.parse(content);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
|
|
84
|
+
// No manifest means we can't check — treat as not stale
|
|
85
|
+
return {
|
|
86
|
+
isStale: false,
|
|
87
|
+
modifiedFiles: [],
|
|
88
|
+
newFiles: [],
|
|
89
|
+
deletedFiles: [],
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
const currentFiles = await collectFiles(outputDir, outputDir);
|
|
95
|
+
const modifiedFiles = [];
|
|
96
|
+
const newFiles = [];
|
|
97
|
+
const limit = pLimit(FILE_HASH_CONCURRENCY);
|
|
98
|
+
// Check for modified and new files
|
|
99
|
+
await Promise.all(currentFiles.map((file) => limit(async () => {
|
|
100
|
+
const currentHash = await hashFile(path.join(outputDir, file));
|
|
101
|
+
if (!(file in manifest.files)) {
|
|
102
|
+
newFiles.push(file);
|
|
103
|
+
}
|
|
104
|
+
else if (currentHash !== manifest.files[file]) {
|
|
105
|
+
modifiedFiles.push(file);
|
|
106
|
+
}
|
|
107
|
+
})));
|
|
108
|
+
// Check for deleted files (in manifest but no longer on disk)
|
|
109
|
+
const currentFileSet = new Set(currentFiles);
|
|
110
|
+
const deletedFiles = Object.keys(manifest.files).filter((file) => !currentFileSet.has(file));
|
|
111
|
+
return {
|
|
112
|
+
isStale: modifiedFiles.length > 0 ||
|
|
113
|
+
newFiles.length > 0 ||
|
|
114
|
+
deletedFiles.length > 0,
|
|
115
|
+
modifiedFiles,
|
|
116
|
+
newFiles,
|
|
117
|
+
deletedFiles,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Checks staleness and throws an error if the directory has been modified.
|
|
122
|
+
* Used to warn before overwriting a test project that has unsaved changes.
|
|
123
|
+
*/
|
|
124
|
+
export async function assertNotStale(outputDir) {
|
|
125
|
+
const result = await checkStaleness(outputDir);
|
|
126
|
+
if (!result.isStale) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const lines = [`Files in ${outputDir} have been modified since generation:`];
|
|
130
|
+
for (const file of result.modifiedFiles) {
|
|
131
|
+
lines.push(` - ${file} (modified)`);
|
|
132
|
+
}
|
|
133
|
+
for (const file of result.newFiles) {
|
|
134
|
+
lines.push(` - ${file} (new)`);
|
|
135
|
+
}
|
|
136
|
+
for (const file of result.deletedFiles) {
|
|
137
|
+
lines.push(` - ${file} (deleted)`);
|
|
138
|
+
}
|
|
139
|
+
lines.push('', `Run 'baseplate-dev snapshot save <name>' to save changes first, or`, `re-generate with 'baseplate-dev sync <name> --overwrite'.`);
|
|
140
|
+
throw new Error(lines.join('\n'));
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=generation-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation-manifest.js","sourceRoot":"","sources":["../../../src/actions/utils/generation-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actions/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actions/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC"}
|
|
@@ -1,22 +1,36 @@
|
|
|
1
|
-
import type { ProjectInfo } from '@baseplate-dev/project-builder-lib';
|
|
1
|
+
import type { ProjectInfo, ProjectType } from '@baseplate-dev/project-builder-lib';
|
|
2
2
|
import type { Logger } from '@baseplate-dev/sync';
|
|
3
3
|
/**
|
|
4
4
|
* Checks if a directory contains a valid Baseplate project.
|
|
5
|
-
* @param
|
|
5
|
+
* @param baseplateDirectory - The baseplate directory containing project-definition.json.
|
|
6
6
|
* @returns True if the directory contains a valid Baseplate project.
|
|
7
7
|
*/
|
|
8
|
-
export declare function isBaseplateProject(
|
|
8
|
+
export declare function isBaseplateProject(baseplateDirectory: string): Promise<boolean>;
|
|
9
9
|
/**
|
|
10
10
|
* Loads project information from a directory containing a Baseplate project.
|
|
11
|
-
* @param
|
|
11
|
+
* @param outputDirectory - The directory where the project output lives.
|
|
12
|
+
* @param baseplateDirectory - The baseplate directory containing project-definition.json and snapshots.
|
|
13
|
+
* @param type - The project type (user, example, or test).
|
|
12
14
|
* @returns ProjectInfo for the project.
|
|
13
|
-
* @throws Error if directory doesn't contain a valid
|
|
15
|
+
* @throws Error if the baseplate directory doesn't contain a valid project definition.
|
|
14
16
|
*/
|
|
15
|
-
export declare function loadProjectFromDirectory(
|
|
17
|
+
export declare function loadProjectFromDirectory(outputDirectory: string, baseplateDirectory: string, type: ProjectType): Promise<ProjectInfo>;
|
|
16
18
|
/**
|
|
17
|
-
*
|
|
18
|
-
|
|
19
|
+
* Options for discovering projects across different directory types.
|
|
20
|
+
*/
|
|
21
|
+
export interface DiscoverProjectsOptions {
|
|
22
|
+
/** User project directories (baseplateDir = dir/baseplate, outputDir = dir) */
|
|
23
|
+
projectDirectories?: string[];
|
|
24
|
+
/** Example project directories (baseplateDir = dir/baseplate, outputDir = dir) */
|
|
25
|
+
exampleDirectories?: string[];
|
|
26
|
+
/** Test project directories (baseplateDir = dir, outputDir = dir/.output) */
|
|
27
|
+
testProjectDirectories?: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Discovers Baseplate projects from structured directory inputs.
|
|
31
|
+
* @param options - Directories grouped by project type.
|
|
32
|
+
* @param logger - Logger instance for warnings.
|
|
19
33
|
* @returns Array of ProjectInfo for discovered projects.
|
|
20
34
|
*/
|
|
21
|
-
export declare function discoverProjects(
|
|
35
|
+
export declare function discoverProjects(options: DiscoverProjectsOptions, logger: Logger): Promise<ProjectInfo[]>;
|
|
22
36
|
//# sourceMappingURL=project-discovery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-discovery.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/project-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EACZ,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"project-discovery.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/project-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EACX,WAAW,EACZ,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AASlD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,eAAe,EAAE,MAAM,EACvB,kBAAkB,EAAE,MAAM,EAC1B,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,WAAW,CAAC,CAkCtB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,6EAA6E;IAC7E,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;CACnC;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,EAChC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,EAAE,CAAC,CAsExB"}
|
|
@@ -2,25 +2,26 @@ import { enhanceErrorWithContext } from '@baseplate-dev/utils';
|
|
|
2
2
|
import { fileExists } from '@baseplate-dev/utils/node';
|
|
3
3
|
import { readFile } from 'node:fs/promises';
|
|
4
4
|
import path from 'node:path';
|
|
5
|
-
import { isExampleProject } from './is-example-project.js';
|
|
6
5
|
import { generateProjectId } from './project-id.js';
|
|
7
6
|
/**
|
|
8
7
|
* Checks if a directory contains a valid Baseplate project.
|
|
9
|
-
* @param
|
|
8
|
+
* @param baseplateDirectory - The baseplate directory containing project-definition.json.
|
|
10
9
|
* @returns True if the directory contains a valid Baseplate project.
|
|
11
10
|
*/
|
|
12
|
-
export async function isBaseplateProject(
|
|
13
|
-
const projectDefPath = path.join(
|
|
11
|
+
export async function isBaseplateProject(baseplateDirectory) {
|
|
12
|
+
const projectDefPath = path.join(baseplateDirectory, 'project-definition.json');
|
|
14
13
|
return await fileExists(projectDefPath);
|
|
15
14
|
}
|
|
16
15
|
/**
|
|
17
16
|
* Loads project information from a directory containing a Baseplate project.
|
|
18
|
-
* @param
|
|
17
|
+
* @param outputDirectory - The directory where the project output lives.
|
|
18
|
+
* @param baseplateDirectory - The baseplate directory containing project-definition.json and snapshots.
|
|
19
|
+
* @param type - The project type (user, example, or test).
|
|
19
20
|
* @returns ProjectInfo for the project.
|
|
20
|
-
* @throws Error if directory doesn't contain a valid
|
|
21
|
+
* @throws Error if the baseplate directory doesn't contain a valid project definition.
|
|
21
22
|
*/
|
|
22
|
-
export async function loadProjectFromDirectory(
|
|
23
|
-
const projectDefPath = path.join(
|
|
23
|
+
export async function loadProjectFromDirectory(outputDirectory, baseplateDirectory, type) {
|
|
24
|
+
const projectDefPath = path.join(baseplateDirectory, 'project-definition.json');
|
|
24
25
|
if (!(await fileExists(projectDefPath))) {
|
|
25
26
|
throw new Error(`No project definition found at ${projectDefPath}`);
|
|
26
27
|
}
|
|
@@ -31,12 +32,12 @@ export async function loadProjectFromDirectory(directory) {
|
|
|
31
32
|
if (!name || typeof name !== 'string') {
|
|
32
33
|
throw new Error('Project definition must have a valid name in settings.general.name');
|
|
33
34
|
}
|
|
34
|
-
const isInternalExample = await isExampleProject(directory);
|
|
35
35
|
return {
|
|
36
|
-
id: generateProjectId(
|
|
37
|
-
name,
|
|
38
|
-
directory,
|
|
39
|
-
|
|
36
|
+
id: generateProjectId(outputDirectory),
|
|
37
|
+
name: type === 'test' ? `test:${name}` : name,
|
|
38
|
+
directory: outputDirectory,
|
|
39
|
+
type,
|
|
40
|
+
baseplateDirectory,
|
|
40
41
|
};
|
|
41
42
|
}
|
|
42
43
|
catch (error) {
|
|
@@ -44,31 +45,56 @@ export async function loadProjectFromDirectory(directory) {
|
|
|
44
45
|
}
|
|
45
46
|
}
|
|
46
47
|
/**
|
|
47
|
-
* Discovers Baseplate projects from
|
|
48
|
-
* @param
|
|
48
|
+
* Discovers Baseplate projects from structured directory inputs.
|
|
49
|
+
* @param options - Directories grouped by project type.
|
|
50
|
+
* @param logger - Logger instance for warnings.
|
|
49
51
|
* @returns Array of ProjectInfo for discovered projects.
|
|
50
52
|
*/
|
|
51
|
-
export async function discoverProjects(
|
|
53
|
+
export async function discoverProjects(options, logger) {
|
|
52
54
|
const projects = [];
|
|
53
55
|
const seenNames = new Set();
|
|
54
56
|
const conflicts = [];
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
57
|
+
const directoryGroups = [
|
|
58
|
+
{
|
|
59
|
+
directories: options.projectDirectories ?? [],
|
|
60
|
+
type: 'user',
|
|
61
|
+
resolveOutputDir: (dir) => dir,
|
|
62
|
+
resolveBaseplateDir: (dir) => path.join(dir, 'baseplate'),
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
directories: options.exampleDirectories ?? [],
|
|
66
|
+
type: 'example',
|
|
67
|
+
resolveOutputDir: (dir) => dir,
|
|
68
|
+
resolveBaseplateDir: (dir) => path.join(dir, 'baseplate'),
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
directories: options.testProjectDirectories ?? [],
|
|
72
|
+
type: 'test',
|
|
73
|
+
resolveOutputDir: (dir) => path.join(dir, '.output'),
|
|
74
|
+
resolveBaseplateDir: (dir) => dir,
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
for (const group of directoryGroups) {
|
|
78
|
+
for (const directory of group.directories) {
|
|
79
|
+
try {
|
|
80
|
+
const resolvedDir = path.resolve(directory);
|
|
81
|
+
const baseplateDir = group.resolveBaseplateDir(resolvedDir);
|
|
82
|
+
if (await isBaseplateProject(baseplateDir)) {
|
|
83
|
+
const outputDir = group.resolveOutputDir(resolvedDir);
|
|
84
|
+
const project = await loadProjectFromDirectory(outputDir, baseplateDir, group.type);
|
|
85
|
+
// Check for name conflicts
|
|
86
|
+
if (seenNames.has(project.name)) {
|
|
87
|
+
conflicts.push(project.name);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
seenNames.add(project.name);
|
|
91
|
+
projects.push(project);
|
|
92
|
+
}
|
|
67
93
|
}
|
|
68
94
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
95
|
+
catch (error) {
|
|
96
|
+
logger.warn(`Warning: Could not load project from ${directory}: ${error instanceof Error ? error.message : String(error)}`);
|
|
97
|
+
}
|
|
72
98
|
}
|
|
73
99
|
}
|
|
74
100
|
// Handle name conflicts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-discovery.js","sourceRoot":"","sources":["../../../src/actions/utils/project-discovery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"project-discovery.js","sourceRoot":"","sources":["../../../src/actions/utils/project-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEtE;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,WAAW,EAAE,EACvB,eAAe,EAAE,MAAM,GACtB,WAAW,
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEtE;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,WAAW,EAAE,EACvB,eAAe,EAAE,MAAM,GACtB,WAAW,CAgBb"}
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
export function getProjectByNameOrId(projects, projectNameOrId) {
|
|
8
8
|
const project = projects.find((project) => project.name === projectNameOrId ||
|
|
9
9
|
project.id === projectNameOrId ||
|
|
10
|
-
project.directory === projectNameOrId
|
|
10
|
+
project.directory === projectNameOrId ||
|
|
11
|
+
(project.type === 'test' && project.name === `test:${projectNameOrId}`));
|
|
11
12
|
if (!project) {
|
|
12
13
|
throw new Error(`Project "${projectNameOrId}" not found. Available projects: ${projects.map((p) => p.name).join(', ')}`);
|
|
13
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../src/actions/utils/projects.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAuB,EACvB,eAAuB;IAEvB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAC3B,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,IAAI,KAAK,eAAe;QAChC,OAAO,CAAC,EAAE,KAAK,eAAe;QAC9B,OAAO,CAAC,SAAS,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../src/actions/utils/projects.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAuB,EACvB,eAAuB;IAEvB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAC3B,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,IAAI,KAAK,eAAe;QAChC,OAAO,CAAC,EAAE,KAAK,eAAe;QAC9B,OAAO,CAAC,SAAS,KAAK,eAAe;QACrC,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,eAAe,EAAE,CAAC,CAC1E,CAAC;IAEF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,YAAY,eAAe,oCAAoC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxG,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,6 +1,24 @@
|
|
|
1
1
|
import type { AuthorizerExpressionNode } from '@baseplate-dev/project-builder-lib';
|
|
2
2
|
import type { GeneratorBundle } from '@baseplate-dev/sync';
|
|
3
3
|
import type { BackendAppEntryBuilder } from '../app-entry-builder.js';
|
|
4
|
+
/**
|
|
5
|
+
* Resolved information about a relation for nested authorizer code generation.
|
|
6
|
+
*/
|
|
7
|
+
interface ResolvedNestedRelation {
|
|
8
|
+
/** The local FK field name (e.g., 'todoListId') */
|
|
9
|
+
localFkFieldName: string;
|
|
10
|
+
/** The foreign model name (e.g., 'TodoList') */
|
|
11
|
+
foreignModelName: string;
|
|
12
|
+
/** The foreign authorizer variable name (e.g., 'todoListAuthorizer') */
|
|
13
|
+
foreignAuthorizerVar: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Context for generating authorizer expression code with relation resolution.
|
|
17
|
+
*/
|
|
18
|
+
interface AuthorizerExpressionCodeContext {
|
|
19
|
+
/** Map of relation name → resolved nested relation info */
|
|
20
|
+
resolvedRelations: Map<string, ResolvedNestedRelation>;
|
|
21
|
+
}
|
|
4
22
|
/**
|
|
5
23
|
* Generate TypeScript code from an authorizer expression AST node.
|
|
6
24
|
*
|
|
@@ -9,12 +27,14 @@ import type { BackendAppEntryBuilder } from '../app-entry-builder.js';
|
|
|
9
27
|
* - `userId` (auth field) becomes `ctx.auth.userId`
|
|
10
28
|
* - `hasRole('admin')` becomes `ctx.auth.hasRole('admin')`
|
|
11
29
|
* - `hasSomeRole(['a', 'b'])` becomes `ctx.auth.hasSomeRole(['a', 'b'])`
|
|
30
|
+
* - `hasRole(model.relation, 'role')` becomes `await foreignAuthorizer.hasRoleById(ctx, model.fkField, 'role')`
|
|
12
31
|
* - `A || B` becomes `(A) || (B)`
|
|
13
32
|
*/
|
|
14
|
-
export declare function generateAuthorizerExpressionCode(node: AuthorizerExpressionNode): string;
|
|
33
|
+
export declare function generateAuthorizerExpressionCode(node: AuthorizerExpressionNode, codeContext?: AuthorizerExpressionCodeContext): string;
|
|
15
34
|
/**
|
|
16
35
|
* Build model authorizer generators for all models in a feature
|
|
17
36
|
* that have non-empty authorizer roles.
|
|
18
37
|
*/
|
|
19
38
|
export declare function buildAuthorizersForFeature(appBuilder: BackendAppEntryBuilder, featureId: string): GeneratorBundle[];
|
|
20
|
-
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=authorizer-compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorizer-compiler.d.ts","sourceRoot":"","sources":["../../../src/compiler/backend/authorizer-compiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EAGzB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAS3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE;;GAEG;AACH,UAAU,sBAAsB;IAC9B,mDAAmD;IACnD,gBAAgB,EAAE,MAAM,CAAC;IACzB,gDAAgD;IAChD,gBAAgB,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,UAAU,+BAA+B;IACvC,2DAA2D;IAC3D,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CACxD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,wBAAwB,EAC9B,WAAW,CAAC,EAAE,+BAA+B,GAC5C,MAAM,CAoCR;AA4FD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,sBAAsB,EAClC,SAAS,EAAE,MAAM,GAChB,eAAe,EAAE,CA+EnB"}
|