@varde-flyt/vfac 0.17.0 → 0.18.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/README.md +6 -0
- package/dist/vfac.mjs +30 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -253,6 +253,12 @@ file that turns the setting off. A released connection is torn down by its
|
|
|
253
253
|
provider afterwards, and the providing resource can only be deleted once that
|
|
254
254
|
teardown is done.
|
|
255
255
|
|
|
256
|
+
**Two resources connected to each other hold each other**: each is the other's
|
|
257
|
+
provider, so both deletes are refused. Break the loop at one link — set one of
|
|
258
|
+
the two connections to `state: disconnected` and apply, wait until its teardown
|
|
259
|
+
is done, delete the resource nothing holds any more, and delete the other once
|
|
260
|
+
that deletion has finished.
|
|
261
|
+
|
|
256
262
|
**A manifest never moves a connection in one apply**: pointing an existing
|
|
257
263
|
connection at a different resource is refused rather than performed, because a
|
|
258
264
|
file you re-apply on every push must not be able to silently move a running
|
package/dist/vfac.mjs
CHANGED
|
@@ -14216,7 +14216,7 @@ function exampleResourceKey(name) {
|
|
|
14216
14216
|
const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^[^a-z]+/, "").replace(/-+$/, "").slice(0, 63);
|
|
14217
14217
|
return RESOURCE_KEY_PATTERN.test(slug) ? slug : "";
|
|
14218
14218
|
}
|
|
14219
|
-
var DEPLOYMENT_EXAMPLE_GUARANTEE = "Product-owned configuration is complete and E2E-proven; tenant-specific secrets and Resource/provider selections are supplied by the tenant.";
|
|
14219
|
+
var DEPLOYMENT_EXAMPLE_GUARANTEE = "Product-owned configuration is complete and E2E-proven; tenant-specific secrets, tenant-specific values and Resource/provider selections are supplied by the tenant.";
|
|
14220
14220
|
|
|
14221
14221
|
// ../product-configuration/dist/configuration-requirements.js
|
|
14222
14222
|
function configurationRequirements(configuration) {
|
|
@@ -15077,6 +15077,7 @@ function isBlockedHost(hostname) {
|
|
|
15077
15077
|
}
|
|
15078
15078
|
|
|
15079
15079
|
// ../product-contracts/dist/deployment-example.schema.js
|
|
15080
|
+
var MAX_TENANT_INPUTS = 8;
|
|
15080
15081
|
var DeploymentExampleSchema = external_exports.object({
|
|
15081
15082
|
/** The heading a customer reads above the example. */
|
|
15082
15083
|
title: external_exports.string().min(3).max(80),
|
|
@@ -15105,12 +15106,29 @@ var DeploymentExampleSchema = external_exports.object({
|
|
|
15105
15106
|
* created and again only to set a new one — and never written into a
|
|
15106
15107
|
* manifest. A secret resent on an unchanged re-apply is written again.
|
|
15107
15108
|
*/
|
|
15108
|
-
secretInputs: external_exports.array(external_exports.string().regex(CONFIGURATION_PROPERTY_NAME_REGEX)).max(MAX_CONFIGURATION_CHILDREN).optional()
|
|
15109
|
-
|
|
15109
|
+
secretInputs: external_exports.array(external_exports.string().regex(CONFIGURATION_PROPERTY_NAME_REGEX)).max(MAX_CONFIGURATION_CHILDREN).optional(),
|
|
15110
|
+
/**
|
|
15111
|
+
* The ordinary — NOT secret — settings the tenant answers, BY NAME.
|
|
15112
|
+
*
|
|
15113
|
+
* A value only the tenant can know and nothing may default: the address of
|
|
15114
|
+
* the person who administers the Resource first. The example carries NO
|
|
15115
|
+
* value for one — the document a reader copies carries it present and
|
|
15116
|
+
* empty, and the tenant types it — so an example applied unchanged is
|
|
15117
|
+
* refused for that setting by name rather than deployed with a placeholder.
|
|
15118
|
+
* Unlike a secret, the value belongs in the manifest.
|
|
15119
|
+
*
|
|
15120
|
+
* Each must be a setting every deployment must answer, with no default, that
|
|
15121
|
+
* no other rule reads: whether the example is complete cannot depend on a
|
|
15122
|
+
* value the publisher never gave.
|
|
15123
|
+
*/
|
|
15124
|
+
tenantInputs: external_exports.array(external_exports.string().regex(CONFIGURATION_PROPERTY_NAME_REGEX)).max(MAX_TENANT_INPUTS).optional()
|
|
15125
|
+
}).strict().describe("The recommended deployment for this release. Required for a NEW release; optional in the schema because releases published before the field existed are immutable. " + DEPLOYMENT_EXAMPLE_GUARANTEE + " Secret settings are named in secretInputs and never given a value here; so are the ordinary settings the tenant answers, named in tenantInputs.");
|
|
15110
15126
|
var SECRET_INPUT_SEGMENT = CONFIGURATION_PROPERTY_NAME_REGEX.source.slice(1, -1);
|
|
15111
|
-
var
|
|
15112
|
-
message:
|
|
15127
|
+
var settingInputV2Schema = (what) => external_exports.string().regex(new RegExp(`^(?:${SECRET_INPUT_SEGMENT}|(?:/${SECRET_INPUT_SEGMENT}){2,${MAX_CONFIGURATION_DEPTH}})$`)).refine((raw) => secretPathOf(raw) !== null, {
|
|
15128
|
+
message: `A ${what} is a root setting name, or a configuration path such as "/group/setting" with no list index.`
|
|
15113
15129
|
});
|
|
15130
|
+
var SecretInputV2Schema = settingInputV2Schema("secret input");
|
|
15131
|
+
var TenantInputV2Schema = settingInputV2Schema("tenant input");
|
|
15114
15132
|
var DeploymentExampleV2Schema = DeploymentExampleSchema.extend({
|
|
15115
15133
|
/**
|
|
15116
15134
|
* The secret settings a deployment of this example supplies, BY CANONICAL
|
|
@@ -15120,7 +15138,12 @@ var DeploymentExampleV2Schema = DeploymentExampleSchema.extend({
|
|
|
15120
15138
|
* here, so a reader knows every `--secret` flag the create needs before
|
|
15121
15139
|
* running it. The values are the tenant's and never written into a manifest.
|
|
15122
15140
|
*/
|
|
15123
|
-
secretInputs: external_exports.array(SecretInputV2Schema).max(MAX_CONFIGURATION_CHILDREN).optional()
|
|
15141
|
+
secretInputs: external_exports.array(SecretInputV2Schema).max(MAX_CONFIGURATION_CHILDREN).optional(),
|
|
15142
|
+
/**
|
|
15143
|
+
* The ordinary settings the tenant answers, BY CANONICAL PATH —
|
|
15144
|
+
* `/administrator/email`. See the v1 field; only the spelling differs.
|
|
15145
|
+
*/
|
|
15146
|
+
tenantInputs: external_exports.array(TenantInputV2Schema).max(MAX_TENANT_INPUTS).optional()
|
|
15124
15147
|
});
|
|
15125
15148
|
|
|
15126
15149
|
// ../product-contracts/dist/portfolio.js
|
|
@@ -19165,7 +19188,7 @@ function renderOperation(operationId, data) {
|
|
|
19165
19188
|
const cause2 = failure["cause"];
|
|
19166
19189
|
const named = reportedSettings[0];
|
|
19167
19190
|
lines.push(
|
|
19168
|
-
|
|
19191
|
+
named !== void 0 ? ` Correct \`${named}\` in your manifest, then \`vfac apply\` it${data["type"] === "PRODUCT_INSTANCE_UPGRADE" ? ` and ${again}` : ""}. Repeating it unchanged fails the same way.` : retryable ? ` Another attempt can succeed: ${again}.` : cause2 === "unknown" ? ` The platform could not classify this, so there is nothing here to correct. Read the whole record with \`vfac get operation ${operationId} --output json\`, and quote that id if you ask for help. Repeating it unchanged fails the same way.` : ` Repeating this unchanged fails again \u2014 fix what the lines above name, then ${again}${changeIt}.`
|
|
19169
19192
|
);
|
|
19170
19193
|
}
|
|
19171
19194
|
}
|