@styleflow.app/flowpress-deploy 1.0.0-beta.2 → 1.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +5 -0
  3. package/containers/cms/Dockerfile +35 -0
  4. package/containers/cms/Dockerfile.dockerignore +20 -0
  5. package/containers/cms/healthz.php +17 -0
  6. package/containers/cms/install-languages.sh +16 -0
  7. package/containers/cms/mpm.conf +10 -0
  8. package/containers/cms/php.ini +16 -0
  9. package/containers/cms/sanitize.php +37 -0
  10. package/containers/cms/smtp.php +13 -0
  11. package/containers/cms/vhost.conf +58 -0
  12. package/containers/cms/wp-cli.yml +1 -0
  13. package/containers/php-runtime/Dockerfile +21 -0
  14. package/containers/web-ssr/Dockerfile +25 -0
  15. package/containers/web-ssr/Dockerfile.dockerignore +10 -0
  16. package/containers/web-static/Caddyfile +40 -0
  17. package/containers/web-static/Dockerfile +15 -0
  18. package/containers/web-static/Dockerfile.dockerignore +7 -0
  19. package/dist/ops/bootstrap.d.ts +21 -0
  20. package/dist/ops/bootstrap.d.ts.map +1 -0
  21. package/dist/ops/bootstrap.js +106 -0
  22. package/dist/ops/bootstrap.js.map +1 -0
  23. package/dist/ops/build.d.ts +30 -0
  24. package/dist/ops/build.d.ts.map +1 -0
  25. package/dist/ops/build.js +99 -0
  26. package/dist/ops/build.js.map +1 -0
  27. package/dist/ops/cli.d.ts +3 -0
  28. package/dist/ops/cli.d.ts.map +1 -0
  29. package/dist/ops/cli.js +137 -0
  30. package/dist/ops/cli.js.map +1 -0
  31. package/dist/ops/config.d.ts +54 -0
  32. package/dist/ops/config.d.ts.map +1 -0
  33. package/dist/ops/config.js +163 -0
  34. package/dist/ops/config.js.map +1 -0
  35. package/dist/ops/coolify.d.ts +2 -0
  36. package/dist/ops/coolify.d.ts.map +1 -0
  37. package/dist/ops/coolify.js +44 -0
  38. package/dist/ops/coolify.js.map +1 -0
  39. package/dist/ops/data.d.ts +27 -0
  40. package/dist/ops/data.d.ts.map +1 -0
  41. package/dist/ops/data.js +145 -0
  42. package/dist/ops/data.js.map +1 -0
  43. package/dist/ops/deploy.d.ts +18 -0
  44. package/dist/ops/deploy.d.ts.map +1 -0
  45. package/dist/ops/deploy.js +92 -0
  46. package/dist/ops/deploy.js.map +1 -0
  47. package/dist/ops/editorial.d.ts +23 -0
  48. package/dist/ops/editorial.d.ts.map +1 -0
  49. package/dist/ops/editorial.js +79 -0
  50. package/dist/ops/editorial.js.map +1 -0
  51. package/dist/ops/environment.d.ts +29 -0
  52. package/dist/ops/environment.d.ts.map +1 -0
  53. package/dist/ops/environment.js +159 -0
  54. package/dist/ops/environment.js.map +1 -0
  55. package/dist/ops/health.d.ts +25 -0
  56. package/dist/ops/health.d.ts.map +1 -0
  57. package/dist/ops/health.js +22 -0
  58. package/dist/ops/health.js.map +1 -0
  59. package/dist/ops/monitor.d.ts +23 -0
  60. package/dist/ops/monitor.d.ts.map +1 -0
  61. package/dist/ops/monitor.js +142 -0
  62. package/dist/ops/monitor.js.map +1 -0
  63. package/dist/ops/process.d.ts +9 -0
  64. package/dist/ops/process.d.ts.map +1 -0
  65. package/dist/ops/process.js +48 -0
  66. package/dist/ops/process.js.map +1 -0
  67. package/dist/ops/provision.d.ts +38 -0
  68. package/dist/ops/provision.d.ts.map +1 -0
  69. package/dist/ops/provision.js +251 -0
  70. package/dist/ops/provision.js.map +1 -0
  71. package/dist/ops/release.d.ts +26 -0
  72. package/dist/ops/release.d.ts.map +1 -0
  73. package/dist/ops/release.js +79 -0
  74. package/dist/ops/release.js.map +1 -0
  75. package/dist/ops/s3.d.ts +8 -0
  76. package/dist/ops/s3.d.ts.map +1 -0
  77. package/dist/ops/s3.js +38 -0
  78. package/dist/ops/s3.js.map +1 -0
  79. package/dist/ops/static-config.d.ts +14 -0
  80. package/dist/ops/static-config.d.ts.map +1 -0
  81. package/dist/ops/static-config.js +96 -0
  82. package/dist/ops/static-config.js.map +1 -0
  83. package/flowpress-deploy.php +2 -2
  84. package/includes/automatic-build.php +22 -5
  85. package/package.json +26 -6
  86. package/schema/deployment.schema.json +45 -0
@@ -55,16 +55,33 @@ function flowpress_deploy_taxonomy_affects_public_build(string $taxonomy): bool
55
55
  return $object && (bool) apply_filters('flowpress_deploy_taxonomy_affects_public_build', $object->public, $taxonomy);
56
56
  }
57
57
 
58
- add_action('set_object_terms', static function (int $id, $terms, $tt_ids, string $taxonomy): void {
59
- if (flowpress_deploy_taxonomy_affects_public_build($taxonomy)) flowpress_deploy_schedule_public_build();
60
- }, 40, 4);
58
+ /** Term-only changes bypass save_post, including a public-to-private transition. */
59
+ add_action('set_object_terms', static function (int $id, $terms, $tt_ids, string $taxonomy, bool $append, $old_tt_ids): void {
60
+ $post = get_post($id);
61
+ if (! $post instanceof WP_Post || $post->post_status !== 'publish'
62
+ || ! (get_post_type_object($post->post_type)->public ?? false)) return;
63
+ $current = array_map('intval', (array) $tt_ids);
64
+ $previous = array_map('intval', (array) $old_tt_ids);
65
+ sort($current); sort($previous);
66
+ if (! $append && $current === $previous) return;
67
+ // Hidden visibility/recipient taxonomies also affect public artifacts.
68
+ // A global descriptor avoids placing private titles or URLs in the queue.
69
+ flowpress_enqueue_build_change('global', 0, '/', 'update', true);
70
+ flowpress_deploy_schedule_public_build();
71
+ }, 40, 6);
61
72
  foreach (['created_term', 'edited_term', 'pre_delete_term'] as $hook) {
62
73
  $callback = $hook === 'pre_delete_term'
63
74
  ? static function (int $id, string $taxonomy): void {
64
- if (flowpress_deploy_taxonomy_affects_public_build($taxonomy)) flowpress_deploy_schedule_public_build();
75
+ if (flowpress_deploy_taxonomy_affects_public_build($taxonomy)) {
76
+ flowpress_enqueue_build_change('global', 0, '/', 'update', true);
77
+ flowpress_deploy_schedule_public_build();
78
+ }
65
79
  }
66
80
  : static function (int $id, int $tt_id, string $taxonomy): void {
67
- if (flowpress_deploy_taxonomy_affects_public_build($taxonomy)) flowpress_deploy_schedule_public_build();
81
+ if (flowpress_deploy_taxonomy_affects_public_build($taxonomy)) {
82
+ flowpress_enqueue_build_change('global', 0, '/', 'update', true);
83
+ flowpress_deploy_schedule_public_build();
84
+ }
68
85
  };
69
86
  add_action($hook, $callback, 40, $hook === 'pre_delete_term' ? 2 : 3);
70
87
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@styleflow.app/flowpress-deploy",
3
- "version": "1.0.0-beta.2",
3
+ "version": "1.0.0-beta.4",
4
4
  "description": "Safe full and partial deployment primitives for FlowPress.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -28,6 +28,14 @@
28
28
  "./worker-assets": {
29
29
  "import": "./dist/worker-assets.js",
30
30
  "types": "./dist/worker-assets.d.ts"
31
+ },
32
+ "./ops/environment": {
33
+ "import": "./dist/ops/environment.js",
34
+ "types": "./dist/ops/environment.d.ts"
35
+ },
36
+ "./ops": {
37
+ "import": "./dist/ops/config.js",
38
+ "types": "./dist/ops/config.d.ts"
31
39
  }
32
40
  },
33
41
  "files": [
@@ -37,15 +45,19 @@
37
45
  "flowpress-deploy.php",
38
46
  "composer.json",
39
47
  "README.md",
40
- "CHANGELOG.md"
48
+ "CHANGELOG.md",
49
+ "containers",
50
+ "schema"
41
51
  ],
42
52
  "scripts": {
43
53
  "build": "tsc -b",
44
54
  "typecheck": "tsc -b --pretty false",
45
- "test": "vitest run && node --test tests/*-regressions.mjs && php tests/php/queue-provider-test.php",
46
- "release:check": "npm run typecheck && npm test && npm pack --dry-run",
55
+ "test": "vitest run tests/deploy.test.ts && node --test tests/*-regressions.mjs && php tests/php/queue-provider-test.php && node --test tests/ops-*.test.mjs",
56
+ "release:check": "npm run typecheck && npm test && npm run test:ops:database && npm pack --dry-run",
47
57
  "release:publish:next": "npm publish --access public --tag next",
48
- "prepublishOnly": "npm run typecheck && npm test"
58
+ "prepublishOnly": "npm run typecheck && npm test",
59
+ "test:ops": "node --test tests/ops-*.test.mjs",
60
+ "test:ops:database": "node tests/ops-database-integration.mjs"
49
61
  },
50
62
  "devDependencies": {
51
63
  "@types/node": "^22.19.3",
@@ -55,5 +67,13 @@
55
67
  "engines": {
56
68
  "node": ">=22.0.0"
57
69
  },
58
- "packageManager": "npm@10.9.3"
70
+ "packageManager": "npm@10.9.3",
71
+ "dependencies": {
72
+ "dotenv": "17.4.2",
73
+ "dotenv-expand": "12.0.3",
74
+ "yaml": "2.9.1"
75
+ },
76
+ "bin": {
77
+ "flowpress-ops": "./dist/ops/cli.js"
78
+ }
59
79
  }
@@ -0,0 +1,45 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "FlowPress deployment manifest",
4
+ "type": "object",
5
+ "required": ["schemaVersion", "platform", "profile", "database", "media", "environments"],
6
+ "properties": {
7
+ "schemaVersion": { "const": 1 },
8
+ "platform": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
9
+ "profile": { "enum": ["backend", "static", "headless-static", "headless-ssr"] },
10
+ "database": { "const": "shared" },
11
+ "media": { "enum": ["local", "s3"] },
12
+ "registryProject": { "type": "string" },
13
+ "sources": {
14
+ "type": "object",
15
+ "additionalProperties": {
16
+ "type": "object",
17
+ "required": ["ssh", "user", "path"],
18
+ "properties": { "ssh": { "type": "string" }, "user": { "type": "string" }, "path": { "type": "string", "pattern": "^/" } },
19
+ "additionalProperties": false
20
+ }
21
+ },
22
+ "environments": {
23
+ "type": "object",
24
+ "propertyNames": { "enum": ["local", "staging", "production", "preview"] },
25
+ "additionalProperties": {
26
+ "type": "object",
27
+ "required": ["publish"],
28
+ "properties": {
29
+ "publish": { "type": "array", "uniqueItems": true, "items": { "enum": ["cms", "web-static", "web-ssr"] } },
30
+ "profile": { "enum": ["backend", "static", "headless-static", "headless-ssr"] },
31
+ "frontendUrl": { "type": "string", "format": "uri" },
32
+ "backendUrl": { "type": "string", "format": "uri" },
33
+ "graphqlUrl": { "type": "string", "format": "uri" },
34
+ "mediaUrl": { "type": "string", "format": "uri" },
35
+ "backend": { "enum": ["local", "staging", "production"] },
36
+ "aliases": { "type": "array", "items": { "type": "string", "format": "uri" } },
37
+ "mode": { "const": "on-demand" },
38
+ "mail": { "enum": ["disabled", "capture", "smtp"] }
39
+ },
40
+ "additionalProperties": false
41
+ }
42
+ }
43
+ },
44
+ "additionalProperties": false
45
+ }