@salesforce/b2c-tooling-sdk 0.3.0 → 0.4.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.
- package/README.md +180 -13
- package/data/scaffolds/cartridge/files/.project.ejs +17 -0
- package/data/scaffolds/cartridge/files/cartridge/cartridge.properties.ejs +4 -0
- package/data/scaffolds/cartridge/files/cartridge/controllers/Example.js.ejs +19 -0
- package/data/scaffolds/cartridge/files/cartridge/models/example.js.ejs +14 -0
- package/data/scaffolds/cartridge/files/cartridge/scripts/helpers/exampleHelpers.js.ejs +18 -0
- package/data/scaffolds/cartridge/files/cartridge/static/default/css/example.css +6 -0
- package/data/scaffolds/cartridge/files/cartridge/templates/default/example/show.isml.ejs +11 -0
- package/data/scaffolds/cartridge/scaffold.json +88 -0
- package/data/scaffolds/controller/files/controller.js.ejs +134 -0
- package/data/scaffolds/controller/files/template.isml.ejs +22 -0
- package/data/scaffolds/controller/scaffold.json +64 -0
- package/data/scaffolds/custom-api/files/api.json.ejs +11 -0
- package/data/scaffolds/custom-api/files/schema.yaml.ejs +188 -0
- package/data/scaffolds/custom-api/files/script.js.ejs +95 -0
- package/data/scaffolds/custom-api/scaffold.json +65 -0
- package/data/scaffolds/hook/files/hook.js.ejs +99 -0
- package/data/scaffolds/hook/files/hooks-entry.json.ejs +6 -0
- package/data/scaffolds/hook/scaffold.json +60 -0
- package/data/scaffolds/job-step/files/step-chunk.js.ejs +136 -0
- package/data/scaffolds/job-step/files/step-task.js.ejs +47 -0
- package/data/scaffolds/job-step/files/steptypes-entry.json.ejs +41 -0
- package/data/scaffolds/job-step/scaffold.json +64 -0
- package/data/scaffolds/page-designer-component/files/component.isml.ejs +23 -0
- package/data/scaffolds/page-designer-component/files/component.js.ejs +35 -0
- package/data/scaffolds/page-designer-component/files/component.json.ejs +50 -0
- package/data/scaffolds/page-designer-component/scaffold.json +66 -0
- package/data/scaffolds/service/files/service-http.js.ejs +245 -0
- package/data/scaffolds/service/files/service-sftp.js.ejs +371 -0
- package/data/scaffolds/service/files/service-soap.js.ejs +230 -0
- package/data/scaffolds/service/scaffold.json +83 -0
- package/data/script-api/dw.extensions.payments.SalesforcePaymentsMgr.md +48 -0
- package/data/script-api/dw.system.Request.md +5 -0
- package/data/script-api/dw.web.Cookie.md +108 -31
- package/data/script-api/index.json +2 -2
- package/data/script-api/index.md +1 -1
- package/dist/cjs/auth/oauth-implicit.d.ts +1 -0
- package/dist/cjs/auth/oauth-implicit.js +8 -3
- package/dist/cjs/auth/oauth-implicit.js.map +1 -1
- package/dist/cjs/auth/oauth.d.ts +1 -0
- package/dist/cjs/auth/oauth.js +8 -3
- package/dist/cjs/auth/oauth.js.map +1 -1
- package/dist/cjs/auth/types.d.ts +5 -0
- package/dist/cjs/auth/types.js.map +1 -1
- package/dist/cjs/cli/am-command.d.ts +74 -0
- package/dist/cjs/cli/am-command.js +189 -0
- package/dist/cjs/cli/am-command.js.map +1 -0
- package/dist/cjs/cli/base-command.d.ts +38 -0
- package/dist/cjs/cli/base-command.js +142 -0
- package/dist/cjs/cli/base-command.js.map +1 -1
- package/dist/cjs/cli/config.d.ts +9 -0
- package/dist/cjs/cli/config.js +19 -2
- package/dist/cjs/cli/config.js.map +1 -1
- package/dist/cjs/cli/index.d.ts +1 -0
- package/dist/cjs/cli/index.js +1 -0
- package/dist/cjs/cli/index.js.map +1 -1
- package/dist/cjs/cli/instance-command.d.ts +1 -0
- package/dist/cjs/cli/oauth-command.d.ts +21 -1
- package/dist/cjs/cli/oauth-command.js +52 -7
- package/dist/cjs/cli/oauth-command.js.map +1 -1
- package/dist/cjs/cli/ods-command.d.ts +5 -1
- package/dist/cjs/cli/ods-command.js +10 -4
- package/dist/cjs/cli/ods-command.js.map +1 -1
- package/dist/cjs/cli/webdav-command.d.ts +1 -0
- package/dist/cjs/clients/am-api.d.ts +491 -0
- package/dist/cjs/clients/am-api.js +944 -0
- package/dist/cjs/clients/am-api.js.map +1 -0
- package/dist/cjs/clients/am-apiclients-api.generated.d.ts +803 -0
- package/dist/cjs/clients/am-apiclients-api.generated.js +6 -0
- package/dist/cjs/clients/am-apiclients-api.generated.js.map +1 -0
- package/dist/cjs/clients/am-roles-api.generated.d.ts +298 -0
- package/dist/cjs/clients/am-roles-api.generated.js +6 -0
- package/dist/cjs/clients/am-roles-api.generated.js.map +1 -0
- package/dist/cjs/clients/am-users-api.generated.d.ts +891 -0
- package/dist/cjs/clients/am-users-api.generated.js +6 -0
- package/dist/cjs/clients/am-users-api.generated.js.map +1 -0
- package/dist/cjs/clients/index.d.ts +4 -2
- package/dist/cjs/clients/index.js +2 -1
- package/dist/cjs/clients/index.js.map +1 -1
- package/dist/cjs/clients/middleware-registry.d.ts +1 -1
- package/dist/cjs/clients/middleware-registry.js.map +1 -1
- package/dist/cjs/clients/middleware.d.ts +49 -2
- package/dist/cjs/clients/middleware.js +214 -2
- package/dist/cjs/clients/middleware.js.map +1 -1
- package/dist/cjs/clients/mrt.js +5 -1
- package/dist/cjs/clients/mrt.js.map +1 -1
- package/dist/cjs/config/dw-json.d.ts +104 -33
- package/dist/cjs/config/dw-json.js +167 -2
- package/dist/cjs/config/dw-json.js.map +1 -1
- package/dist/cjs/config/index.d.ts +6 -4
- package/dist/cjs/config/index.js +6 -2
- package/dist/cjs/config/index.js.map +1 -1
- package/dist/cjs/config/instance-manager.d.ts +97 -0
- package/dist/cjs/config/instance-manager.js +166 -0
- package/dist/cjs/config/instance-manager.js.map +1 -0
- package/dist/cjs/config/mapping.d.ts +63 -5
- package/dist/cjs/config/mapping.js +165 -20
- package/dist/cjs/config/mapping.js.map +1 -1
- package/dist/cjs/config/sources/dw-json-source.d.ts +17 -1
- package/dist/cjs/config/sources/dw-json-source.js +70 -3
- package/dist/cjs/config/sources/dw-json-source.js.map +1 -1
- package/dist/cjs/config/sources/package-json-source.js +6 -3
- package/dist/cjs/config/sources/package-json-source.js.map +1 -1
- package/dist/cjs/config/types.d.ts +72 -0
- package/dist/cjs/defaults.d.ts +6 -0
- package/dist/cjs/defaults.js +6 -0
- package/dist/cjs/defaults.js.map +1 -1
- package/dist/cjs/i18n/index.js +3 -0
- package/dist/cjs/i18n/index.js.map +1 -1
- package/dist/cjs/index.d.ts +8 -4
- package/dist/cjs/index.js +9 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/logging/logger.js +13 -1
- package/dist/cjs/logging/logger.js.map +1 -1
- package/dist/cjs/operations/content/asset-query.d.ts +22 -0
- package/dist/cjs/operations/content/asset-query.js +77 -0
- package/dist/cjs/operations/content/asset-query.js.map +1 -0
- package/dist/cjs/operations/content/export.d.ts +57 -0
- package/dist/cjs/operations/content/export.js +224 -0
- package/dist/cjs/operations/content/export.js.map +1 -0
- package/dist/cjs/operations/content/index.d.ts +43 -0
- package/dist/cjs/operations/content/index.js +48 -0
- package/dist/cjs/operations/content/index.js.map +1 -0
- package/dist/cjs/operations/content/library.d.ts +137 -0
- package/dist/cjs/operations/content/library.js +392 -0
- package/dist/cjs/operations/content/library.js.map +1 -0
- package/dist/cjs/operations/content/types.d.ts +144 -0
- package/dist/cjs/operations/content/types.js +7 -0
- package/dist/cjs/operations/content/types.js.map +1 -0
- package/dist/cjs/operations/mrt/b2c-config.js +19 -4
- package/dist/cjs/operations/mrt/b2c-config.js.map +1 -1
- package/dist/cjs/operations/mrt/index.d.ts +2 -0
- package/dist/cjs/operations/mrt/index.js +2 -0
- package/dist/cjs/operations/mrt/index.js.map +1 -1
- package/dist/cjs/operations/mrt/tail-logs.d.ts +130 -0
- package/dist/cjs/operations/mrt/tail-logs.js +223 -0
- package/dist/cjs/operations/mrt/tail-logs.js.map +1 -0
- package/dist/cjs/operations/ods/index.d.ts +2 -0
- package/dist/cjs/operations/ods/index.js +1 -0
- package/dist/cjs/operations/ods/index.js.map +1 -1
- package/dist/cjs/operations/ods/wait-for-sandbox.d.ts +64 -0
- package/dist/cjs/operations/ods/wait-for-sandbox.js +114 -0
- package/dist/cjs/operations/ods/wait-for-sandbox.js.map +1 -0
- package/dist/cjs/operations/orgs/index.d.ts +74 -0
- package/dist/cjs/operations/orgs/index.js +33 -0
- package/dist/cjs/operations/orgs/index.js.map +1 -0
- package/dist/cjs/operations/roles/index.d.ts +43 -0
- package/dist/cjs/operations/roles/index.js +48 -0
- package/dist/cjs/operations/roles/index.js.map +1 -0
- package/dist/cjs/operations/users/index.d.ts +143 -0
- package/dist/cjs/operations/users/index.js +141 -0
- package/dist/cjs/operations/users/index.js.map +1 -0
- package/dist/cjs/scaffold/engine.d.ts +68 -0
- package/dist/cjs/scaffold/engine.js +149 -0
- package/dist/cjs/scaffold/engine.js.map +1 -0
- package/dist/cjs/scaffold/executor.d.ts +36 -0
- package/dist/cjs/scaffold/executor.js +285 -0
- package/dist/cjs/scaffold/executor.js.map +1 -0
- package/dist/cjs/scaffold/index.d.ts +74 -0
- package/dist/cjs/scaffold/index.js +23 -0
- package/dist/cjs/scaffold/index.js.map +1 -0
- package/dist/cjs/scaffold/merge.d.ts +56 -0
- package/dist/cjs/scaffold/merge.js +183 -0
- package/dist/cjs/scaffold/merge.js.map +1 -0
- package/dist/cjs/scaffold/parameter-resolver.d.ts +86 -0
- package/dist/cjs/scaffold/parameter-resolver.js +179 -0
- package/dist/cjs/scaffold/parameter-resolver.js.map +1 -0
- package/dist/cjs/scaffold/registry.d.ts +45 -0
- package/dist/cjs/scaffold/registry.js +219 -0
- package/dist/cjs/scaffold/registry.js.map +1 -0
- package/dist/cjs/scaffold/sources.d.ts +45 -0
- package/dist/cjs/scaffold/sources.js +113 -0
- package/dist/cjs/scaffold/sources.js.map +1 -0
- package/dist/cjs/scaffold/types.d.ts +280 -0
- package/dist/cjs/scaffold/types.js +14 -0
- package/dist/cjs/scaffold/types.js.map +1 -0
- package/dist/cjs/scaffold/validation.d.ts +81 -0
- package/dist/cjs/scaffold/validation.js +250 -0
- package/dist/cjs/scaffold/validation.js.map +1 -0
- package/dist/cjs/scaffold/validators.d.ts +33 -0
- package/dist/cjs/scaffold/validators.js +334 -0
- package/dist/cjs/scaffold/validators.js.map +1 -0
- package/dist/cjs/telemetry/index.d.ts +26 -0
- package/dist/cjs/telemetry/index.js +32 -0
- package/dist/cjs/telemetry/index.js.map +1 -0
- package/dist/cjs/telemetry/telemetry.d.ts +90 -0
- package/dist/cjs/telemetry/telemetry.js +283 -0
- package/dist/cjs/telemetry/telemetry.js.map +1 -0
- package/dist/cjs/telemetry/types.d.ts +62 -0
- package/dist/cjs/telemetry/types.js +7 -0
- package/dist/cjs/telemetry/types.js.map +1 -0
- package/dist/esm/auth/oauth-implicit.d.ts +1 -0
- package/dist/esm/auth/oauth-implicit.js +8 -3
- package/dist/esm/auth/oauth-implicit.js.map +1 -1
- package/dist/esm/auth/oauth.d.ts +1 -0
- package/dist/esm/auth/oauth.js +8 -3
- package/dist/esm/auth/oauth.js.map +1 -1
- package/dist/esm/auth/types.d.ts +5 -0
- package/dist/esm/auth/types.js.map +1 -1
- package/dist/esm/cli/am-command.d.ts +74 -0
- package/dist/esm/cli/am-command.js +196 -0
- package/dist/esm/cli/am-command.js.map +1 -0
- package/dist/esm/cli/base-command.d.ts +38 -0
- package/dist/esm/cli/base-command.js +142 -0
- package/dist/esm/cli/base-command.js.map +1 -1
- package/dist/esm/cli/config.d.ts +9 -0
- package/dist/esm/cli/config.js +19 -2
- package/dist/esm/cli/config.js.map +1 -1
- package/dist/esm/cli/index.d.ts +1 -0
- package/dist/esm/cli/index.js +1 -0
- package/dist/esm/cli/index.js.map +1 -1
- package/dist/esm/cli/instance-command.d.ts +1 -0
- package/dist/esm/cli/oauth-command.d.ts +21 -1
- package/dist/esm/cli/oauth-command.js +52 -7
- package/dist/esm/cli/oauth-command.js.map +1 -1
- package/dist/esm/cli/ods-command.d.ts +5 -1
- package/dist/esm/cli/ods-command.js +10 -4
- package/dist/esm/cli/ods-command.js.map +1 -1
- package/dist/esm/cli/webdav-command.d.ts +1 -0
- package/dist/esm/clients/am-api.d.ts +491 -0
- package/dist/esm/clients/am-api.js +944 -0
- package/dist/esm/clients/am-api.js.map +1 -0
- package/dist/esm/clients/am-apiclients-api.generated.d.ts +803 -0
- package/dist/esm/clients/am-apiclients-api.generated.js +6 -0
- package/dist/esm/clients/am-apiclients-api.generated.js.map +1 -0
- package/dist/esm/clients/am-roles-api.generated.d.ts +298 -0
- package/dist/esm/clients/am-roles-api.generated.js +6 -0
- package/dist/esm/clients/am-roles-api.generated.js.map +1 -0
- package/dist/esm/clients/am-users-api.generated.d.ts +891 -0
- package/dist/esm/clients/am-users-api.generated.js +6 -0
- package/dist/esm/clients/am-users-api.generated.js.map +1 -0
- package/dist/esm/clients/index.d.ts +4 -2
- package/dist/esm/clients/index.js +2 -1
- package/dist/esm/clients/index.js.map +1 -1
- package/dist/esm/clients/middleware-registry.d.ts +1 -1
- package/dist/esm/clients/middleware-registry.js.map +1 -1
- package/dist/esm/clients/middleware.d.ts +49 -2
- package/dist/esm/clients/middleware.js +214 -2
- package/dist/esm/clients/middleware.js.map +1 -1
- package/dist/esm/clients/mrt.js +5 -1
- package/dist/esm/clients/mrt.js.map +1 -1
- package/dist/esm/config/dw-json.d.ts +104 -33
- package/dist/esm/config/dw-json.js +167 -2
- package/dist/esm/config/dw-json.js.map +1 -1
- package/dist/esm/config/index.d.ts +6 -4
- package/dist/esm/config/index.js +6 -2
- package/dist/esm/config/index.js.map +1 -1
- package/dist/esm/config/instance-manager.d.ts +97 -0
- package/dist/esm/config/instance-manager.js +166 -0
- package/dist/esm/config/instance-manager.js.map +1 -0
- package/dist/esm/config/mapping.d.ts +63 -5
- package/dist/esm/config/mapping.js +165 -20
- package/dist/esm/config/mapping.js.map +1 -1
- package/dist/esm/config/sources/dw-json-source.d.ts +17 -1
- package/dist/esm/config/sources/dw-json-source.js +70 -3
- package/dist/esm/config/sources/dw-json-source.js.map +1 -1
- package/dist/esm/config/sources/package-json-source.js +6 -3
- package/dist/esm/config/sources/package-json-source.js.map +1 -1
- package/dist/esm/config/types.d.ts +72 -0
- package/dist/esm/defaults.d.ts +6 -0
- package/dist/esm/defaults.js +6 -0
- package/dist/esm/defaults.js.map +1 -1
- package/dist/esm/i18n/index.js +3 -0
- package/dist/esm/i18n/index.js.map +1 -1
- package/dist/esm/index.d.ts +8 -4
- package/dist/esm/index.js +9 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/logging/logger.js +13 -1
- package/dist/esm/logging/logger.js.map +1 -1
- package/dist/esm/operations/content/asset-query.d.ts +22 -0
- package/dist/esm/operations/content/asset-query.js +77 -0
- package/dist/esm/operations/content/asset-query.js.map +1 -0
- package/dist/esm/operations/content/export.d.ts +57 -0
- package/dist/esm/operations/content/export.js +224 -0
- package/dist/esm/operations/content/export.js.map +1 -0
- package/dist/esm/operations/content/index.d.ts +43 -0
- package/dist/esm/operations/content/index.js +48 -0
- package/dist/esm/operations/content/index.js.map +1 -0
- package/dist/esm/operations/content/library.d.ts +137 -0
- package/dist/esm/operations/content/library.js +392 -0
- package/dist/esm/operations/content/library.js.map +1 -0
- package/dist/esm/operations/content/types.d.ts +144 -0
- package/dist/esm/operations/content/types.js +7 -0
- package/dist/esm/operations/content/types.js.map +1 -0
- package/dist/esm/operations/mrt/b2c-config.js +19 -4
- package/dist/esm/operations/mrt/b2c-config.js.map +1 -1
- package/dist/esm/operations/mrt/index.d.ts +2 -0
- package/dist/esm/operations/mrt/index.js +2 -0
- package/dist/esm/operations/mrt/index.js.map +1 -1
- package/dist/esm/operations/mrt/tail-logs.d.ts +130 -0
- package/dist/esm/operations/mrt/tail-logs.js +223 -0
- package/dist/esm/operations/mrt/tail-logs.js.map +1 -0
- package/dist/esm/operations/ods/index.d.ts +2 -0
- package/dist/esm/operations/ods/index.js +1 -0
- package/dist/esm/operations/ods/index.js.map +1 -1
- package/dist/esm/operations/ods/wait-for-sandbox.d.ts +64 -0
- package/dist/esm/operations/ods/wait-for-sandbox.js +114 -0
- package/dist/esm/operations/ods/wait-for-sandbox.js.map +1 -0
- package/dist/esm/operations/orgs/index.d.ts +74 -0
- package/dist/esm/operations/orgs/index.js +33 -0
- package/dist/esm/operations/orgs/index.js.map +1 -0
- package/dist/esm/operations/roles/index.d.ts +43 -0
- package/dist/esm/operations/roles/index.js +48 -0
- package/dist/esm/operations/roles/index.js.map +1 -0
- package/dist/esm/operations/users/index.d.ts +143 -0
- package/dist/esm/operations/users/index.js +141 -0
- package/dist/esm/operations/users/index.js.map +1 -0
- package/dist/esm/scaffold/engine.d.ts +68 -0
- package/dist/esm/scaffold/engine.js +149 -0
- package/dist/esm/scaffold/engine.js.map +1 -0
- package/dist/esm/scaffold/executor.d.ts +36 -0
- package/dist/esm/scaffold/executor.js +285 -0
- package/dist/esm/scaffold/executor.js.map +1 -0
- package/dist/esm/scaffold/index.d.ts +74 -0
- package/dist/esm/scaffold/index.js +23 -0
- package/dist/esm/scaffold/index.js.map +1 -0
- package/dist/esm/scaffold/merge.d.ts +56 -0
- package/dist/esm/scaffold/merge.js +183 -0
- package/dist/esm/scaffold/merge.js.map +1 -0
- package/dist/esm/scaffold/parameter-resolver.d.ts +86 -0
- package/dist/esm/scaffold/parameter-resolver.js +179 -0
- package/dist/esm/scaffold/parameter-resolver.js.map +1 -0
- package/dist/esm/scaffold/registry.d.ts +45 -0
- package/dist/esm/scaffold/registry.js +219 -0
- package/dist/esm/scaffold/registry.js.map +1 -0
- package/dist/esm/scaffold/sources.d.ts +45 -0
- package/dist/esm/scaffold/sources.js +113 -0
- package/dist/esm/scaffold/sources.js.map +1 -0
- package/dist/esm/scaffold/types.d.ts +280 -0
- package/dist/esm/scaffold/types.js +14 -0
- package/dist/esm/scaffold/types.js.map +1 -0
- package/dist/esm/scaffold/validation.d.ts +81 -0
- package/dist/esm/scaffold/validation.js +250 -0
- package/dist/esm/scaffold/validation.js.map +1 -0
- package/dist/esm/scaffold/validators.d.ts +33 -0
- package/dist/esm/scaffold/validators.js +334 -0
- package/dist/esm/scaffold/validators.js.map +1 -0
- package/dist/esm/telemetry/index.d.ts +26 -0
- package/dist/esm/telemetry/index.js +32 -0
- package/dist/esm/telemetry/index.js.map +1 -0
- package/dist/esm/telemetry/telemetry.d.ts +90 -0
- package/dist/esm/telemetry/telemetry.js +283 -0
- package/dist/esm/telemetry/telemetry.js.map +1 -0
- package/dist/esm/telemetry/types.d.ts +62 -0
- package/dist/esm/telemetry/types.js +7 -0
- package/dist/esm/telemetry/types.js.map +1 -0
- package/package.json +86 -17
- package/specs/am-apiclients-api-v1.yaml +965 -0
- package/specs/am-roles-api-v1.yaml +316 -0
- package/specs/am-users-api-v1.yaml +1102 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025, Salesforce, Inc.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2
|
|
4
|
+
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs/promises';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import os from 'node:os';
|
|
9
|
+
import { glob } from 'glob';
|
|
10
|
+
import { SCAFFOLDS_DATA_DIR } from './types.js';
|
|
11
|
+
import { validateScaffoldManifest } from './validators.js';
|
|
12
|
+
import { getLogger } from '../logging/logger.js';
|
|
13
|
+
/**
|
|
14
|
+
* Load a scaffold manifest from a directory
|
|
15
|
+
* @param scaffoldDir - Path to the scaffold directory
|
|
16
|
+
* @param source - Source type for this scaffold
|
|
17
|
+
* @returns Scaffold object or null if invalid
|
|
18
|
+
*/
|
|
19
|
+
async function loadScaffold(scaffoldDir, source) {
|
|
20
|
+
const manifestPath = path.join(scaffoldDir, 'scaffold.json');
|
|
21
|
+
try {
|
|
22
|
+
const manifestContent = await fs.readFile(manifestPath, 'utf-8');
|
|
23
|
+
const manifest = JSON.parse(manifestContent);
|
|
24
|
+
// Validate manifest
|
|
25
|
+
const errors = validateScaffoldManifest(manifest);
|
|
26
|
+
if (errors.length > 0) {
|
|
27
|
+
const logger = getLogger();
|
|
28
|
+
logger.warn({ manifestPath, errors }, 'Invalid scaffold manifest');
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const filesPath = path.join(scaffoldDir, 'files');
|
|
32
|
+
// Check if files directory exists
|
|
33
|
+
try {
|
|
34
|
+
await fs.access(filesPath);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
const logger = getLogger();
|
|
38
|
+
logger.warn({ scaffoldDir }, 'Scaffold has no files/ directory');
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
id: manifest.name,
|
|
43
|
+
manifest,
|
|
44
|
+
path: scaffoldDir,
|
|
45
|
+
filesPath,
|
|
46
|
+
source,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Manifest doesn't exist or is invalid JSON
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Discover scaffolds from a directory
|
|
56
|
+
* @param baseDir - Base directory to search
|
|
57
|
+
* @param source - Source type for scaffolds found here
|
|
58
|
+
* @returns Array of discovered scaffolds
|
|
59
|
+
*/
|
|
60
|
+
async function discoverScaffoldsFromDir(baseDir, source) {
|
|
61
|
+
const scaffolds = [];
|
|
62
|
+
try {
|
|
63
|
+
await fs.access(baseDir);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Directory doesn't exist
|
|
67
|
+
return scaffolds;
|
|
68
|
+
}
|
|
69
|
+
// Find all scaffold.json files
|
|
70
|
+
const manifestPaths = await glob('*/scaffold.json', {
|
|
71
|
+
cwd: baseDir,
|
|
72
|
+
absolute: false,
|
|
73
|
+
});
|
|
74
|
+
for (const manifestPath of manifestPaths) {
|
|
75
|
+
const scaffoldDir = path.join(baseDir, path.dirname(manifestPath));
|
|
76
|
+
const scaffold = await loadScaffold(scaffoldDir, source);
|
|
77
|
+
if (scaffold) {
|
|
78
|
+
scaffolds.push(scaffold);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return scaffolds;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Filter scaffolds based on discovery options
|
|
85
|
+
*/
|
|
86
|
+
function filterScaffolds(scaffolds, options) {
|
|
87
|
+
let filtered = scaffolds;
|
|
88
|
+
// Filter by category
|
|
89
|
+
if (options.category) {
|
|
90
|
+
filtered = filtered.filter((s) => s.manifest.category === options.category);
|
|
91
|
+
}
|
|
92
|
+
// Filter by source
|
|
93
|
+
if (options.sources && options.sources.length > 0) {
|
|
94
|
+
filtered = filtered.filter((s) => options.sources.includes(s.source));
|
|
95
|
+
}
|
|
96
|
+
// Filter by search query
|
|
97
|
+
if (options.query) {
|
|
98
|
+
const query = options.query.toLowerCase();
|
|
99
|
+
filtered = filtered.filter((s) => {
|
|
100
|
+
const searchText = [s.manifest.name, s.manifest.displayName, s.manifest.description].join(' ').toLowerCase();
|
|
101
|
+
return searchText.includes(query);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return filtered;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Scaffold registry for discovering and managing scaffolds
|
|
108
|
+
*/
|
|
109
|
+
export class ScaffoldRegistry {
|
|
110
|
+
providers = [];
|
|
111
|
+
transformers = [];
|
|
112
|
+
scaffoldCache = new Map();
|
|
113
|
+
/**
|
|
114
|
+
* Add scaffold providers
|
|
115
|
+
*/
|
|
116
|
+
addProviders(providers) {
|
|
117
|
+
this.providers.push(...providers);
|
|
118
|
+
this.clearCache();
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Add scaffold transformers
|
|
122
|
+
*/
|
|
123
|
+
addTransformers(transformers) {
|
|
124
|
+
this.transformers.push(...transformers);
|
|
125
|
+
this.clearCache();
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Clear the scaffold cache
|
|
129
|
+
*/
|
|
130
|
+
clearCache() {
|
|
131
|
+
this.scaffoldCache.clear();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get all scaffolds from all sources
|
|
135
|
+
* @param options - Discovery options
|
|
136
|
+
* @returns Array of scaffolds (deduplicated by name, later sources override earlier)
|
|
137
|
+
*/
|
|
138
|
+
async getScaffolds(options = {}) {
|
|
139
|
+
const cacheKey = JSON.stringify(options);
|
|
140
|
+
if (this.scaffoldCache.has(cacheKey)) {
|
|
141
|
+
return this.scaffoldCache.get(cacheKey);
|
|
142
|
+
}
|
|
143
|
+
// Collect scaffolds from all sources in priority order
|
|
144
|
+
const allScaffolds = [];
|
|
145
|
+
// 1. Run 'before' providers
|
|
146
|
+
const beforeProviders = this.providers.filter((p) => p.priority === 'before');
|
|
147
|
+
for (const provider of beforeProviders) {
|
|
148
|
+
const providerScaffolds = await provider.getScaffolds(options);
|
|
149
|
+
allScaffolds.push(...providerScaffolds);
|
|
150
|
+
}
|
|
151
|
+
// 2. Built-in scaffolds (lowest priority for built-ins)
|
|
152
|
+
const builtInScaffolds = await discoverScaffoldsFromDir(SCAFFOLDS_DATA_DIR, 'built-in');
|
|
153
|
+
allScaffolds.push(...builtInScaffolds);
|
|
154
|
+
// 3. User scaffolds (~/.b2c/scaffolds/)
|
|
155
|
+
const userScaffoldsDir = path.join(os.homedir(), '.b2c', 'scaffolds');
|
|
156
|
+
const userScaffolds = await discoverScaffoldsFromDir(userScaffoldsDir, 'user');
|
|
157
|
+
allScaffolds.push(...userScaffolds);
|
|
158
|
+
// 4. Project scaffolds (.b2c/scaffolds/) - highest priority
|
|
159
|
+
if (options.projectRoot) {
|
|
160
|
+
const projectScaffoldsDir = path.join(options.projectRoot, '.b2c', 'scaffolds');
|
|
161
|
+
const projectScaffolds = await discoverScaffoldsFromDir(projectScaffoldsDir, 'project');
|
|
162
|
+
allScaffolds.push(...projectScaffolds);
|
|
163
|
+
}
|
|
164
|
+
// 5. Run 'after' providers
|
|
165
|
+
const afterProviders = this.providers.filter((p) => p.priority === 'after');
|
|
166
|
+
for (const provider of afterProviders) {
|
|
167
|
+
const providerScaffolds = await provider.getScaffolds(options);
|
|
168
|
+
allScaffolds.push(...providerScaffolds);
|
|
169
|
+
}
|
|
170
|
+
// Deduplicate by ID (later sources override earlier)
|
|
171
|
+
const scaffoldMap = new Map();
|
|
172
|
+
for (const scaffold of allScaffolds) {
|
|
173
|
+
scaffoldMap.set(scaffold.id, scaffold);
|
|
174
|
+
}
|
|
175
|
+
let scaffolds = Array.from(scaffoldMap.values());
|
|
176
|
+
// Apply transformers
|
|
177
|
+
for (const transformer of this.transformers) {
|
|
178
|
+
scaffolds = await Promise.all(scaffolds.map((s) => transformer.transform(s, {
|
|
179
|
+
outputDir: process.cwd(),
|
|
180
|
+
variables: {},
|
|
181
|
+
dryRun: false,
|
|
182
|
+
force: false,
|
|
183
|
+
interactive: false,
|
|
184
|
+
})));
|
|
185
|
+
}
|
|
186
|
+
// Apply filters
|
|
187
|
+
scaffolds = filterScaffolds(scaffolds, options);
|
|
188
|
+
// Sort by name
|
|
189
|
+
scaffolds.sort((a, b) => a.id.localeCompare(b.id));
|
|
190
|
+
this.scaffoldCache.set(cacheKey, scaffolds);
|
|
191
|
+
return scaffolds;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get a specific scaffold by ID
|
|
195
|
+
* @param id - Scaffold ID
|
|
196
|
+
* @param options - Discovery options
|
|
197
|
+
* @returns Scaffold or null if not found
|
|
198
|
+
*/
|
|
199
|
+
async getScaffold(id, options = {}) {
|
|
200
|
+
const scaffolds = await this.getScaffolds(options);
|
|
201
|
+
return scaffolds.find((s) => s.id === id) || null;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Search scaffolds by query
|
|
205
|
+
* @param query - Search query
|
|
206
|
+
* @param options - Additional discovery options
|
|
207
|
+
* @returns Matching scaffolds
|
|
208
|
+
*/
|
|
209
|
+
async searchScaffolds(query, options = {}) {
|
|
210
|
+
return this.getScaffolds({ ...options, query });
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Create a new scaffold registry instance
|
|
215
|
+
*/
|
|
216
|
+
export function createScaffoldRegistry() {
|
|
217
|
+
return new ScaffoldRegistry();
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/scaffold/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { B2CInstance } from '../instance/index.js';
|
|
2
|
+
import type { ScaffoldChoice, DynamicParameterSource, SourceResult } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Common B2C Commerce hook extension points.
|
|
5
|
+
*/
|
|
6
|
+
export declare const HOOK_POINTS: ScaffoldChoice[];
|
|
7
|
+
/**
|
|
8
|
+
* Resolve a local (non-remote) parameter source.
|
|
9
|
+
* Does not require authentication.
|
|
10
|
+
*
|
|
11
|
+
* @param source - The source type to resolve
|
|
12
|
+
* @param projectRoot - Project root directory for cartridge discovery
|
|
13
|
+
* @returns Resolved choices and optional path mapping
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveLocalSource(source: DynamicParameterSource, projectRoot: string): SourceResult;
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a remote parameter source.
|
|
18
|
+
* Requires authenticated B2CInstance (follows SDK operation pattern).
|
|
19
|
+
*
|
|
20
|
+
* @param source - The source type
|
|
21
|
+
* @param instance - Authenticated B2C instance
|
|
22
|
+
* @returns Promise resolving to choices array
|
|
23
|
+
* @throws Error if API call fails
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveRemoteSource(source: DynamicParameterSource, instance: B2CInstance): Promise<ScaffoldChoice[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a source requires remote API access.
|
|
28
|
+
*
|
|
29
|
+
* @param source - The source type to check
|
|
30
|
+
* @returns True if the source requires remote access
|
|
31
|
+
*/
|
|
32
|
+
export declare function isRemoteSource(source: DynamicParameterSource): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Validate a value against a dynamic source (local only).
|
|
35
|
+
* Used for non-interactive validation of provided values.
|
|
36
|
+
*
|
|
37
|
+
* @param source - The source type
|
|
38
|
+
* @param value - The value to validate
|
|
39
|
+
* @param projectRoot - Project root for local sources
|
|
40
|
+
* @returns Object with valid status and available choices if invalid
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateAgainstSource(source: DynamicParameterSource, value: string, projectRoot: string): {
|
|
43
|
+
valid: boolean;
|
|
44
|
+
availableChoices?: string[];
|
|
45
|
+
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025, Salesforce, Inc.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2
|
|
4
|
+
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { findCartridges } from '../operations/code/cartridges.js';
|
|
7
|
+
/**
|
|
8
|
+
* Common B2C Commerce hook extension points.
|
|
9
|
+
*/
|
|
10
|
+
export const HOOK_POINTS = [
|
|
11
|
+
{ value: 'dw.order.calculate', label: 'Order Calculate' },
|
|
12
|
+
{ value: 'dw.order.calculateShipping', label: 'Calculate Shipping' },
|
|
13
|
+
{ value: 'dw.order.createOrder', label: 'Create Order' },
|
|
14
|
+
{ value: 'dw.order.afterPOST', label: 'OCAPI Order afterPOST' },
|
|
15
|
+
{ value: 'dw.order.beforePOST', label: 'OCAPI Order beforePOST' },
|
|
16
|
+
{ value: 'dw.ocapi.shop.basket.afterPOST', label: 'OCAPI Basket afterPOST' },
|
|
17
|
+
{ value: 'dw.ocapi.shop.basket.modifyGETResponse', label: 'OCAPI Basket modifyGET' },
|
|
18
|
+
{ value: 'dw.ocapi.shop.order.afterPOST', label: 'OCAPI Shop Order afterPOST' },
|
|
19
|
+
{ value: 'dw.ocapi.shop.order.beforePOST', label: 'OCAPI Shop Order beforePOST' },
|
|
20
|
+
{ value: 'dw.ocapi.data.order.afterPATCH', label: 'OCAPI Data Order afterPATCH' },
|
|
21
|
+
{ value: 'dw.customer.registration', label: 'Customer Registration' },
|
|
22
|
+
{ value: 'dw.customer.afterCreate', label: 'Customer afterCreate' },
|
|
23
|
+
{ value: 'app.payment.processor', label: 'Payment Processor' },
|
|
24
|
+
{ value: 'app.payment.form.processor', label: 'Payment Form Processor' },
|
|
25
|
+
{ value: 'dw.system.request.onSession', label: 'On Session' },
|
|
26
|
+
{ value: 'dw.extensions.csv.onFileProcess', label: 'CSV File Process' },
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Resolve a local (non-remote) parameter source.
|
|
30
|
+
* Does not require authentication.
|
|
31
|
+
*
|
|
32
|
+
* @param source - The source type to resolve
|
|
33
|
+
* @param projectRoot - Project root directory for cartridge discovery
|
|
34
|
+
* @returns Resolved choices and optional path mapping
|
|
35
|
+
*/
|
|
36
|
+
export function resolveLocalSource(source, projectRoot) {
|
|
37
|
+
switch (source) {
|
|
38
|
+
case 'cartridges': {
|
|
39
|
+
const cartridges = findCartridges(projectRoot);
|
|
40
|
+
const pathMap = new Map(cartridges.map((c) => [c.name, c.src]));
|
|
41
|
+
return {
|
|
42
|
+
choices: cartridges.map((c) => ({ value: c.name, label: c.name })),
|
|
43
|
+
pathMap,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
case 'hook-points': {
|
|
47
|
+
return { choices: HOOK_POINTS };
|
|
48
|
+
}
|
|
49
|
+
default: {
|
|
50
|
+
return { choices: [] };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resolve a remote parameter source.
|
|
56
|
+
* Requires authenticated B2CInstance (follows SDK operation pattern).
|
|
57
|
+
*
|
|
58
|
+
* @param source - The source type
|
|
59
|
+
* @param instance - Authenticated B2C instance
|
|
60
|
+
* @returns Promise resolving to choices array
|
|
61
|
+
* @throws Error if API call fails
|
|
62
|
+
*/
|
|
63
|
+
export async function resolveRemoteSource(source, instance) {
|
|
64
|
+
switch (source) {
|
|
65
|
+
case 'sites': {
|
|
66
|
+
const { data, error } = await instance.ocapi.GET('/sites', {
|
|
67
|
+
params: { query: { select: '(**)' } },
|
|
68
|
+
});
|
|
69
|
+
if (error) {
|
|
70
|
+
throw new Error('Failed to fetch sites from B2C instance');
|
|
71
|
+
}
|
|
72
|
+
const sites = data;
|
|
73
|
+
return (sites.data ?? []).map((s) => ({
|
|
74
|
+
value: s.id ?? '',
|
|
75
|
+
label: s.display_name?.default || s.id || '',
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
default: {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Check if a source requires remote API access.
|
|
85
|
+
*
|
|
86
|
+
* @param source - The source type to check
|
|
87
|
+
* @returns True if the source requires remote access
|
|
88
|
+
*/
|
|
89
|
+
export function isRemoteSource(source) {
|
|
90
|
+
return source === 'sites';
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Validate a value against a dynamic source (local only).
|
|
94
|
+
* Used for non-interactive validation of provided values.
|
|
95
|
+
*
|
|
96
|
+
* @param source - The source type
|
|
97
|
+
* @param value - The value to validate
|
|
98
|
+
* @param projectRoot - Project root for local sources
|
|
99
|
+
* @returns Object with valid status and available choices if invalid
|
|
100
|
+
*/
|
|
101
|
+
export function validateAgainstSource(source, value, projectRoot) {
|
|
102
|
+
if (source === 'cartridges') {
|
|
103
|
+
const { choices } = resolveLocalSource(source, projectRoot);
|
|
104
|
+
const valid = choices.some((c) => c.value === value);
|
|
105
|
+
return {
|
|
106
|
+
valid,
|
|
107
|
+
availableChoices: valid ? undefined : choices.map((c) => c.value),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// For hook-points and other sources, no validation (allow any value)
|
|
111
|
+
return { valid: true };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../../src/scaffold/sources.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path to the built-in scaffolds data directory
|
|
3
|
+
*/
|
|
4
|
+
export declare const SCAFFOLDS_DATA_DIR: string;
|
|
5
|
+
/**
|
|
6
|
+
* Scaffold category. Built-in scaffolds use 'cartridge', but custom scaffolds
|
|
7
|
+
* can define their own categories.
|
|
8
|
+
*/
|
|
9
|
+
export type ScaffoldCategory = string;
|
|
10
|
+
/**
|
|
11
|
+
* Parameter types supported by scaffold parameters
|
|
12
|
+
*/
|
|
13
|
+
export type ScaffoldParameterType = 'string' | 'boolean' | 'choice' | 'multi-choice';
|
|
14
|
+
/**
|
|
15
|
+
* Dynamic sources for populating parameter choices at runtime.
|
|
16
|
+
*
|
|
17
|
+
* - `cartridges`: Discovers cartridges in project via .project files
|
|
18
|
+
* - `hook-points`: Static list of common hook extension points
|
|
19
|
+
* - `sites`: Remote - fetches sites from connected B2C instance
|
|
20
|
+
*/
|
|
21
|
+
export type DynamicParameterSource = 'cartridges' | 'hook-points' | 'sites';
|
|
22
|
+
/**
|
|
23
|
+
* Overwrite behavior for generated files
|
|
24
|
+
*/
|
|
25
|
+
export type OverwriteBehavior = 'never' | 'always' | 'prompt' | 'merge';
|
|
26
|
+
/**
|
|
27
|
+
* Choice option for choice/multi-choice parameters
|
|
28
|
+
*/
|
|
29
|
+
export interface ScaffoldChoice {
|
|
30
|
+
/** The value to use when this choice is selected */
|
|
31
|
+
value: string;
|
|
32
|
+
/** Human-readable label for this choice */
|
|
33
|
+
label: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parameter definition for scaffold prompts and flags
|
|
37
|
+
*/
|
|
38
|
+
export interface ScaffoldParameter {
|
|
39
|
+
/** Parameter name (camelCase), used in templates as variable name */
|
|
40
|
+
name: string;
|
|
41
|
+
/** Prompt message shown in interactive mode */
|
|
42
|
+
prompt: string;
|
|
43
|
+
/** Type of the parameter */
|
|
44
|
+
type: ScaffoldParameterType;
|
|
45
|
+
/** Whether this parameter is required */
|
|
46
|
+
required: boolean;
|
|
47
|
+
/** Default value if not provided */
|
|
48
|
+
default?: string | boolean | string[];
|
|
49
|
+
/** Regex pattern for validation (string types only) */
|
|
50
|
+
pattern?: string;
|
|
51
|
+
/** Error message shown when validation fails */
|
|
52
|
+
validationMessage?: string;
|
|
53
|
+
/** Available choices for choice/multi-choice types */
|
|
54
|
+
choices?: ScaffoldChoice[];
|
|
55
|
+
/** CLI flag name override (e.g., "--name"). If not set, uses --{paramName} */
|
|
56
|
+
flag?: string;
|
|
57
|
+
/** Conditional expression: only prompt if condition is met (e.g., "otherParam=value") */
|
|
58
|
+
when?: string;
|
|
59
|
+
/** Dynamic source for populating choices at runtime */
|
|
60
|
+
source?: DynamicParameterSource;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* File mapping from template to destination
|
|
64
|
+
*/
|
|
65
|
+
export interface FileMapping {
|
|
66
|
+
/** Template file path relative to the scaffold's files/ directory */
|
|
67
|
+
template: string;
|
|
68
|
+
/** Destination path (supports {{variable}} substitution) */
|
|
69
|
+
destination: string;
|
|
70
|
+
/** Conditional expression: only generate if truthy */
|
|
71
|
+
condition?: string;
|
|
72
|
+
/** Overwrite behavior for existing files */
|
|
73
|
+
overwrite?: OverwriteBehavior;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* File modification definition for modifying existing files
|
|
77
|
+
*/
|
|
78
|
+
export interface FileModification {
|
|
79
|
+
/** Target file path (supports {{variable}} substitution) */
|
|
80
|
+
target: string;
|
|
81
|
+
/** Type of modification */
|
|
82
|
+
type: 'json-merge' | 'insert-after' | 'insert-before' | 'append' | 'prepend';
|
|
83
|
+
/** Content to insert/merge (for text modifications) */
|
|
84
|
+
content?: string;
|
|
85
|
+
/** Template file for the content */
|
|
86
|
+
contentTemplate?: string;
|
|
87
|
+
/** Marker string to find (for insert-after/insert-before) */
|
|
88
|
+
marker?: string;
|
|
89
|
+
/** JSON path for json-merge operations (e.g., "scripts") */
|
|
90
|
+
jsonPath?: string;
|
|
91
|
+
/** Conditional expression */
|
|
92
|
+
condition?: string;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Scaffold manifest (scaffold.json)
|
|
96
|
+
*/
|
|
97
|
+
export interface ScaffoldManifest {
|
|
98
|
+
/** Unique identifier (kebab-case) */
|
|
99
|
+
name: string;
|
|
100
|
+
/** Human-readable display name */
|
|
101
|
+
displayName: string;
|
|
102
|
+
/** Description of what this scaffold creates */
|
|
103
|
+
description: string;
|
|
104
|
+
/** Category for filtering and organization */
|
|
105
|
+
category: ScaffoldCategory;
|
|
106
|
+
/** Parameters for user input (prompts/flags) */
|
|
107
|
+
parameters: ScaffoldParameter[];
|
|
108
|
+
/** File mappings (optional - defaults to all files in files/ directory) */
|
|
109
|
+
files?: FileMapping[];
|
|
110
|
+
/** Modifications to existing files (optional) */
|
|
111
|
+
modifications?: FileModification[];
|
|
112
|
+
/** Instructions to show after generation */
|
|
113
|
+
postInstructions?: string;
|
|
114
|
+
/** Default output directory relative to cwd (created if needed) */
|
|
115
|
+
defaultOutputDir?: string;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Resolved scaffold with full paths and source information
|
|
119
|
+
*/
|
|
120
|
+
export interface Scaffold {
|
|
121
|
+
/** Unique identifier */
|
|
122
|
+
id: string;
|
|
123
|
+
/** The manifest definition */
|
|
124
|
+
manifest: ScaffoldManifest;
|
|
125
|
+
/** Full path to the scaffold directory */
|
|
126
|
+
path: string;
|
|
127
|
+
/** Full path to the files/ directory within the scaffold */
|
|
128
|
+
filesPath: string;
|
|
129
|
+
/** Source of this scaffold */
|
|
130
|
+
source: ScaffoldSource;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Source/origin of a scaffold
|
|
134
|
+
*/
|
|
135
|
+
export type ScaffoldSource = 'built-in' | 'user' | 'project' | 'plugin';
|
|
136
|
+
/**
|
|
137
|
+
* Priority ordering for scaffold providers
|
|
138
|
+
*/
|
|
139
|
+
export type ScaffoldProviderPriority = 'before' | 'after';
|
|
140
|
+
/**
|
|
141
|
+
* Options for scaffold discovery
|
|
142
|
+
*/
|
|
143
|
+
export interface ScaffoldDiscoveryOptions {
|
|
144
|
+
/** Filter by category */
|
|
145
|
+
category?: ScaffoldCategory;
|
|
146
|
+
/** Search query for name/description */
|
|
147
|
+
query?: string;
|
|
148
|
+
/** Include only scaffolds from specific sources */
|
|
149
|
+
sources?: ScaffoldSource[];
|
|
150
|
+
/** Project root directory (for project-local scaffolds) */
|
|
151
|
+
projectRoot?: string;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Scaffold provider interface for extensibility
|
|
155
|
+
*/
|
|
156
|
+
export interface ScaffoldProvider {
|
|
157
|
+
/** Provider name for identification */
|
|
158
|
+
readonly name: string;
|
|
159
|
+
/** Priority: 'before' runs before built-in, 'after' runs after */
|
|
160
|
+
readonly priority: ScaffoldProviderPriority;
|
|
161
|
+
/** Get scaffolds from this provider */
|
|
162
|
+
getScaffolds(options: ScaffoldDiscoveryOptions): Promise<Scaffold[]>;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Scaffold transformer interface for modifying scaffolds
|
|
166
|
+
*/
|
|
167
|
+
export interface ScaffoldTransformer {
|
|
168
|
+
/** Transformer name for identification */
|
|
169
|
+
readonly name: string;
|
|
170
|
+
/** Transform a scaffold definition */
|
|
171
|
+
transform(scaffold: Scaffold, context: ScaffoldContext): Promise<Scaffold>;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Context passed during scaffold operations
|
|
175
|
+
*/
|
|
176
|
+
export interface ScaffoldContext {
|
|
177
|
+
/** Output directory for generated files */
|
|
178
|
+
outputDir: string;
|
|
179
|
+
/** Resolved parameter values */
|
|
180
|
+
variables: Record<string, string | boolean | string[]>;
|
|
181
|
+
/** Whether running in dry-run mode */
|
|
182
|
+
dryRun: boolean;
|
|
183
|
+
/** Whether to force overwrite existing files */
|
|
184
|
+
force: boolean;
|
|
185
|
+
/** Whether running in interactive mode */
|
|
186
|
+
interactive: boolean;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Options for scaffold generation
|
|
190
|
+
*/
|
|
191
|
+
export interface ScaffoldGenerateOptions {
|
|
192
|
+
/** Output directory (defaults to cwd) */
|
|
193
|
+
outputDir?: string;
|
|
194
|
+
/** Pre-supplied variable values (from flags/env) */
|
|
195
|
+
variables?: Record<string, string | boolean | string[]>;
|
|
196
|
+
/** Preview without writing files */
|
|
197
|
+
dryRun?: boolean;
|
|
198
|
+
/** Skip prompts and overwrite existing files */
|
|
199
|
+
force?: boolean;
|
|
200
|
+
/** Enable interactive prompts (defaults to true if TTY) */
|
|
201
|
+
interactive?: boolean;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Result of a file generation operation
|
|
205
|
+
*/
|
|
206
|
+
export interface GeneratedFile {
|
|
207
|
+
/** Relative path from output directory */
|
|
208
|
+
path: string;
|
|
209
|
+
/** Absolute path to the file */
|
|
210
|
+
absolutePath: string;
|
|
211
|
+
/** Action taken */
|
|
212
|
+
action: 'created' | 'skipped' | 'overwritten' | 'merged';
|
|
213
|
+
/** Reason for skip (if action is 'skipped') */
|
|
214
|
+
skipReason?: string;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Result of scaffold generation
|
|
218
|
+
*/
|
|
219
|
+
export interface ScaffoldGenerateResult {
|
|
220
|
+
/** The scaffold that was used */
|
|
221
|
+
scaffold: Scaffold;
|
|
222
|
+
/** Files that were generated */
|
|
223
|
+
files: GeneratedFile[];
|
|
224
|
+
/** Post-generation instructions */
|
|
225
|
+
postInstructions?: string;
|
|
226
|
+
/** Whether this was a dry run */
|
|
227
|
+
dryRun: boolean;
|
|
228
|
+
/** Output directory */
|
|
229
|
+
outputDir: string;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Validation error for scaffold parameters
|
|
233
|
+
*/
|
|
234
|
+
export interface ParameterValidationError {
|
|
235
|
+
/** Parameter name */
|
|
236
|
+
parameter: string;
|
|
237
|
+
/** Error message */
|
|
238
|
+
message: string;
|
|
239
|
+
/** The invalid value */
|
|
240
|
+
value?: unknown;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Result of parameter validation
|
|
244
|
+
*/
|
|
245
|
+
export interface ParameterValidationResult {
|
|
246
|
+
/** Whether validation passed */
|
|
247
|
+
valid: boolean;
|
|
248
|
+
/** Validation errors (if any) */
|
|
249
|
+
errors: ParameterValidationError[];
|
|
250
|
+
/** Resolved parameter values */
|
|
251
|
+
values: Record<string, string | boolean | string[]>;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Template rendering helpers available in EJS templates
|
|
255
|
+
*/
|
|
256
|
+
export interface TemplateHelpers {
|
|
257
|
+
/** Convert to kebab-case */
|
|
258
|
+
kebabCase: (str: string) => string;
|
|
259
|
+
/** Convert to camelCase */
|
|
260
|
+
camelCase: (str: string) => string;
|
|
261
|
+
/** Convert to PascalCase */
|
|
262
|
+
pascalCase: (str: string) => string;
|
|
263
|
+
/** Convert to snake_case */
|
|
264
|
+
snakeCase: (str: string) => string;
|
|
265
|
+
/** Current year */
|
|
266
|
+
year: number;
|
|
267
|
+
/** Current date (YYYY-MM-DD) */
|
|
268
|
+
date: string;
|
|
269
|
+
/** Generate a UUID v4 */
|
|
270
|
+
uuid: () => string;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Result of resolving a dynamic parameter source.
|
|
274
|
+
*/
|
|
275
|
+
export interface SourceResult {
|
|
276
|
+
/** Available choices */
|
|
277
|
+
choices: ScaffoldChoice[];
|
|
278
|
+
/** For cartridges: map of name to absolute path */
|
|
279
|
+
pathMap?: Map<string, string>;
|
|
280
|
+
}
|