nibula 1.2.4 → 1.2.6
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/.eleventy.js +81 -81
- package/.eleventyignore +3 -3
- package/.github/workflows/publish.yml +37 -0
- package/CHANGELOG.md +179 -148
- package/LICENSE +169 -169
- package/NOTICE +4 -4
- package/README.md +120 -123
- package/bin/create.js +507 -507
- package/bin/nibula.js +317 -305
- package/docs/Assistant CLI.md +65 -65
- package/docs/Backend.md +295 -295
- package/docs/Components.md +84 -84
- package/docs/Creating pages.md +64 -64
- package/docs/Deploy.md +189 -189
- package/docs/Head and SEO.md +138 -138
- package/docs/Javascript.md +50 -50
- package/docs/Styling with SCSS.md +141 -141
- package/nginx.conf +75 -75
- package/package.json +1 -1
- package/src/backend/.htaccess +6 -6
- package/src/backend/_core/composer.json +5 -5
- package/src/backend/_core/composer.lock +492 -492
- package/src/backend/_core/index.js +267 -267
- package/src/backend/_core/index.php +147 -147
- package/src/backend/_core/init.js +52 -52
- package/src/backend/_core/init.php +33 -33
- package/src/backend/_core/modules/RateLimiter.js +58 -58
- package/src/backend/_core/modules/RateLimiter.php +30 -30
- package/src/backend/_core/modules/Response.js +59 -59
- package/src/backend/_core/modules/Response.php +48 -48
- package/src/backend/api/protected/example-protected.js +23 -23
- package/src/backend/api/protected/example-protected.php +16 -16
- package/src/backend/api/public/example-public.js +24 -24
- package/src/backend/api/public/example-public.php +16 -16
- package/src/backend/backend-node.service.example +30 -30
- package/src/backend/database/Database.js +46 -46
- package/src/backend/database/Database.php +23 -23
- package/src/backend/example.config.js +37 -37
- package/src/backend/example.config.php +27 -27
- package/src/backend/package.json +18 -18
- package/src/backend/web.config +16 -16
- package/src/frontend/.htaccess +51 -51
- package/src/frontend/404.njk +17 -17
- package/src/frontend/assets/brand/favicon.svg +54 -54
- package/src/frontend/assets/brand/logo.svg +54 -54
- package/src/frontend/components/global/footer.njk +25 -25
- package/src/frontend/components/global/header.njk +6 -6
- package/src/frontend/components/welcome.njk +114 -114
- package/src/frontend/data/site.json +48 -48
- package/src/frontend/index.njk +8 -8
- package/src/frontend/js/modules/exampleModule.js +2 -2
- package/src/frontend/js/pages/404.js +6 -6
- package/src/frontend/js/pages/homepage.js +6 -6
- package/src/frontend/layouts/base.njk +132 -132
- package/src/frontend/layouts/page-components.njk +13 -13
- package/src/frontend/llms.njk +17 -17
- package/src/frontend/robots.njk +7 -7
- package/src/frontend/scss/modules/_animations.scss +24 -24
- package/src/frontend/scss/modules/_footer.scss +27 -27
- package/src/frontend/scss/modules/_global.scss +47 -47
- package/src/frontend/scss/modules/_header.scss +27 -27
- package/src/frontend/scss/modules/_mobile.scss +29 -29
- package/src/frontend/scss/modules/_root.scss +34 -34
- package/src/frontend/scss/modules/_typography.scss +14 -14
- package/src/frontend/scss/modules/frameworks/_bootstrap.scss +109 -109
- package/src/frontend/scss/modules/frameworks/_bulma.scss +108 -108
- package/src/frontend/scss/modules/frameworks/_foundation.scss +138 -139
- package/src/frontend/scss/modules/frameworks/_uikit.scss +109 -109
- package/src/frontend/scss/pages/404.scss +27 -27
- package/src/frontend/scss/pages/homepage.scss +22 -22
- package/src/frontend/sitemap.njk +17 -17
- package/src/frontend/ts/modules/exampleModule.ts +2 -2
- package/src/frontend/ts/pages/404.ts +6 -6
- package/src/frontend/ts/pages/homepage.ts +6 -6
- package/src/frontend/web.config +55 -55
- package/tools/config/messages.json +3 -1
- package/tools/res/templates/template.js +6 -6
- package/tools/res/templates/template.njk +8 -8
- package/tools/res/templates/template.scss +22 -22
- package/tools/res/templates/template.ts +6 -6
- package/tsconfig.json +24 -24
package/.eleventy.js
CHANGED
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
const esbuild = require("esbuild");
|
|
2
|
-
const glob = require("glob");
|
|
3
|
-
const Image = require("@11ty/eleventy-img");
|
|
4
|
-
const fs = require("fs");
|
|
5
|
-
const path = require("path");
|
|
6
|
-
|
|
7
|
-
const OUTPUT_DIR = "out";
|
|
8
|
-
|
|
9
|
-
module.exports = function (eleventyConfig) {
|
|
10
|
-
|
|
11
|
-
function copyRecursiveSync(src, dest) {
|
|
12
|
-
if (!fs.existsSync(src)) return;
|
|
13
|
-
if (src.includes('.git')) return;
|
|
14
|
-
const stat = fs.statSync(src);
|
|
15
|
-
if (stat.isDirectory()) {
|
|
16
|
-
fs.mkdirSync(dest, { recursive: true });
|
|
17
|
-
for (const child of fs.readdirSync(src)) {
|
|
18
|
-
copyRecursiveSync(path.join(src, child), path.join(dest, child));
|
|
19
|
-
}
|
|
20
|
-
} else {
|
|
21
|
-
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
22
|
-
fs.copyFileSync(src, dest);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
eleventyConfig.on("eleventy.before", () => {
|
|
27
|
-
copyRecursiveSync("src/backend", `${OUTPUT_DIR}/backend`);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
eleventyConfig.addPassthroughCopy("src/frontend/.htaccess");
|
|
31
|
-
eleventyConfig.addPassthroughCopy("src/frontend/web.config");
|
|
32
|
-
eleventyConfig.addPassthroughCopy("src/frontend/assets");
|
|
33
|
-
eleventyConfig.addPassthroughCopy("src/frontend/robots.txt");
|
|
34
|
-
|
|
35
|
-
eleventyConfig.addPassthroughCopy({
|
|
36
|
-
"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js": "js/bootstrap.bundle.min.js",
|
|
37
|
-
"node_modules/bootstrap-icons/font/fonts": "css/fonts",
|
|
38
|
-
|
|
39
|
-
// Foundation
|
|
40
|
-
// "node_modules/foundation-sites/dist/js/foundation.min.js": "js/foundation.min.js",
|
|
41
|
-
|
|
42
|
-
// UIkit
|
|
43
|
-
// "node_modules/uikit/dist/js/uikit.min.js": "js/uikit.min.js",
|
|
44
|
-
// "node_modules/uikit/dist/js/uikit-icons.min.js": "js/uikit-icons.min.js",
|
|
45
|
-
|
|
46
|
-
// Bulma — CSS only, no JS passthrough needed
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
eleventyConfig.addShortcode("image", async function (src, alt) {
|
|
50
|
-
let metadata = await Image(src, {
|
|
51
|
-
widths: [320, 480, 720, 1280, 1920, 2048, 2560, 3840, 4096, 7680],
|
|
52
|
-
formats: ["webp", "jpeg"],
|
|
53
|
-
outputDir: `${OUTPUT_DIR}/assets/images/`,
|
|
54
|
-
urlPath: "/assets/images/",
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
return Image.generateHTML(metadata, {
|
|
58
|
-
alt,
|
|
59
|
-
sizes: "(max-width: 768px) 100vw, 50vw",
|
|
60
|
-
loading: "lazy",
|
|
61
|
-
decoding: "async",
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
eleventyConfig.addWatchTarget("./src/frontend/scss");
|
|
66
|
-
eleventyConfig.addWatchTarget("./src/frontend/routes");
|
|
67
|
-
eleventyConfig.addWatchTarget("./src/frontend/data");
|
|
68
|
-
|
|
69
|
-
eleventyConfig.setServerOptions({
|
|
70
|
-
watch: [`${OUTPUT_DIR}/js/**/*.js`]
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
return {
|
|
74
|
-
dir: {
|
|
75
|
-
input: "src/frontend",
|
|
76
|
-
output: OUTPUT_DIR,
|
|
77
|
-
includes: "components",
|
|
78
|
-
layouts: "layouts",
|
|
79
|
-
data: "data",
|
|
80
|
-
},
|
|
81
|
-
};
|
|
1
|
+
const esbuild = require("esbuild");
|
|
2
|
+
const glob = require("glob");
|
|
3
|
+
const Image = require("@11ty/eleventy-img");
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
|
|
7
|
+
const OUTPUT_DIR = "out";
|
|
8
|
+
|
|
9
|
+
module.exports = function (eleventyConfig) {
|
|
10
|
+
|
|
11
|
+
function copyRecursiveSync(src, dest) {
|
|
12
|
+
if (!fs.existsSync(src)) return;
|
|
13
|
+
if (src.includes('.git')) return;
|
|
14
|
+
const stat = fs.statSync(src);
|
|
15
|
+
if (stat.isDirectory()) {
|
|
16
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
17
|
+
for (const child of fs.readdirSync(src)) {
|
|
18
|
+
copyRecursiveSync(path.join(src, child), path.join(dest, child));
|
|
19
|
+
}
|
|
20
|
+
} else {
|
|
21
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
22
|
+
fs.copyFileSync(src, dest);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
eleventyConfig.on("eleventy.before", () => {
|
|
27
|
+
copyRecursiveSync("src/backend", `${OUTPUT_DIR}/backend`);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
eleventyConfig.addPassthroughCopy("src/frontend/.htaccess");
|
|
31
|
+
eleventyConfig.addPassthroughCopy("src/frontend/web.config");
|
|
32
|
+
eleventyConfig.addPassthroughCopy("src/frontend/assets");
|
|
33
|
+
eleventyConfig.addPassthroughCopy("src/frontend/robots.txt");
|
|
34
|
+
|
|
35
|
+
eleventyConfig.addPassthroughCopy({
|
|
36
|
+
"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js": "js/bootstrap.bundle.min.js",
|
|
37
|
+
"node_modules/bootstrap-icons/font/fonts": "css/fonts",
|
|
38
|
+
|
|
39
|
+
// Foundation
|
|
40
|
+
// "node_modules/foundation-sites/dist/js/foundation.min.js": "js/foundation.min.js",
|
|
41
|
+
|
|
42
|
+
// UIkit
|
|
43
|
+
// "node_modules/uikit/dist/js/uikit.min.js": "js/uikit.min.js",
|
|
44
|
+
// "node_modules/uikit/dist/js/uikit-icons.min.js": "js/uikit-icons.min.js",
|
|
45
|
+
|
|
46
|
+
// Bulma — CSS only, no JS passthrough needed
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
eleventyConfig.addShortcode("image", async function (src, alt) {
|
|
50
|
+
let metadata = await Image(src, {
|
|
51
|
+
widths: [320, 480, 720, 1280, 1920, 2048, 2560, 3840, 4096, 7680],
|
|
52
|
+
formats: ["webp", "jpeg"],
|
|
53
|
+
outputDir: `${OUTPUT_DIR}/assets/images/`,
|
|
54
|
+
urlPath: "/assets/images/",
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
return Image.generateHTML(metadata, {
|
|
58
|
+
alt,
|
|
59
|
+
sizes: "(max-width: 768px) 100vw, 50vw",
|
|
60
|
+
loading: "lazy",
|
|
61
|
+
decoding: "async",
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
eleventyConfig.addWatchTarget("./src/frontend/scss");
|
|
66
|
+
eleventyConfig.addWatchTarget("./src/frontend/routes");
|
|
67
|
+
eleventyConfig.addWatchTarget("./src/frontend/data");
|
|
68
|
+
|
|
69
|
+
eleventyConfig.setServerOptions({
|
|
70
|
+
watch: [`${OUTPUT_DIR}/js/**/*.js`]
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
dir: {
|
|
75
|
+
input: "src/frontend",
|
|
76
|
+
output: OUTPUT_DIR,
|
|
77
|
+
includes: "components",
|
|
78
|
+
layouts: "layouts",
|
|
79
|
+
data: "data",
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
82
|
};
|
package/.eleventyignore
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
src/frontend/assets/**
|
|
2
|
-
src/frontend/js/**
|
|
3
|
-
src/frontend/scss/**
|
|
1
|
+
src/frontend/assets/**
|
|
2
|
+
src/frontend/js/**
|
|
3
|
+
src/frontend/scss/**
|
|
4
4
|
src/backend/**
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
name: Publish to npm
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
id-token: write
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
publish:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
|
|
18
|
+
- uses: actions/setup-node@v4
|
|
19
|
+
with:
|
|
20
|
+
node-version: 22
|
|
21
|
+
registry-url: https://registry.npmjs.org
|
|
22
|
+
|
|
23
|
+
- name: Check that package.json matches the tag
|
|
24
|
+
if: github.event_name == 'release'
|
|
25
|
+
run: |
|
|
26
|
+
TAG="${GITHUB_REF_NAME#v}"
|
|
27
|
+
PKG=$(node -p "require('./package.json').version")
|
|
28
|
+
if [ "$TAG" != "$PKG" ]; then
|
|
29
|
+
echo "Tag $TAG does not match package.json version $PKG"
|
|
30
|
+
exit 1
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
- run: npm install -g npm@latest
|
|
34
|
+
|
|
35
|
+
- run: npm ci
|
|
36
|
+
|
|
37
|
+
- run: npm publish --provenance --access public
|
package/CHANGELOG.md
CHANGED
|
@@ -1,148 +1,179 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to Nibula are documented here.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
-
|
|
8
|
-
## [1.2.
|
|
9
|
-
|
|
10
|
-
###
|
|
11
|
-
-
|
|
12
|
-
`
|
|
13
|
-
`
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
## [1.2.
|
|
22
|
-
|
|
23
|
-
###
|
|
24
|
-
- `
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
## [1.
|
|
60
|
-
|
|
61
|
-
###
|
|
62
|
-
- **
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
- **`
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
in `
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
- `
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
###
|
|
83
|
-
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
###
|
|
146
|
-
-
|
|
147
|
-
|
|
148
|
-
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Nibula are documented here.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [1.2.6] - 2026-08-01
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- The scaffolder created the routes folder as `src/frontend/_routes` instead of
|
|
12
|
+
`src/frontend/routes`. The CLI writes and looks for page templates in
|
|
13
|
+
`routes`, so on a freshly created project every page ended up outside the
|
|
14
|
+
folder Eleventy and the assistant expect.
|
|
15
|
+
|
|
16
|
+
### Notes
|
|
17
|
+
- Projects created with 1.2.5 have an empty `src/frontend/_routes` folder that
|
|
18
|
+
can be deleted. Pages created before this fix should be moved to
|
|
19
|
+
`src/frontend/routes`.
|
|
20
|
+
|
|
21
|
+
## [1.2.5] - 2026-08-01
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- `nib new` now refuses to run from inside an existing Nibula project. Creating
|
|
25
|
+
a project inside another one produced a broken setup, since the outer build
|
|
26
|
+
would pick up the inner project's files. The error message reports the path of
|
|
27
|
+
the project that was detected, so it's clear which one triggered the check.
|
|
28
|
+
- A GitHub Actions workflow that publishes the package to npm whenever a release
|
|
29
|
+
is created, using npm's trusted publishing. The workflow verifies that the git
|
|
30
|
+
tag matches the version in `package.json` before publishing, and attaches a
|
|
31
|
+
provenance attestation to the published package.
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
- Rewrote the README: added a section on when Nibula is *not* the right tool,
|
|
35
|
+
clarified that Composer is only needed with the PHP backend, and moved the
|
|
36
|
+
editor extensions from the required to the recommended prerequisites.
|
|
37
|
+
|
|
38
|
+
## [1.2.4] - 2026-07-31
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
- Internal refactor of `tools/`: the logic is now split across `lib/`, `cli/`
|
|
42
|
+
and `config/`, with values and messages extracted into `settings.json` and
|
|
43
|
+
`messages.json`. No behaviour changes — pages, `site.json` and
|
|
44
|
+
`page-components.njk` are written exactly as before.
|
|
45
|
+
- The CLI now uses a uniform palette: colour is limited to the title box, and
|
|
46
|
+
the menu numbers are dimmed instead of each carrying its own colour.
|
|
47
|
+
|
|
48
|
+
### Fixed
|
|
49
|
+
- The last line of the menu never closed the `dim` colour code, which stayed
|
|
50
|
+
active on the following line.
|
|
51
|
+
|
|
52
|
+
## [1.2.3] - 2026-07-29
|
|
53
|
+
|
|
54
|
+
### Fixed
|
|
55
|
+
- `updateOutputPath` no longer strips custom flags from `build:css` and `serve:css`: the output path is now replaced in place instead of regenerating the whole script
|
|
56
|
+
- Missing `--load-path=node_modules` in the regenerated Sass scripts, which broke Bootstrap SCSS imports
|
|
57
|
+
- Malformed `outDir` in `tsconfig.json` when the output path is absolute (`./c:/...`)
|
|
58
|
+
|
|
59
|
+
## [1.2.2] - 2026-07-23
|
|
60
|
+
|
|
61
|
+
### Added
|
|
62
|
+
- **Full favicon set**: `favicon.svg`, `favicon-32.png` and `apple-touch-icon.png`
|
|
63
|
+
(180×180, opaque) in `assets/brand/`. iOS home-screen icons no longer fall back
|
|
64
|
+
to a screenshot of the page.
|
|
65
|
+
|
|
66
|
+
### Changed
|
|
67
|
+
- **`data_bs_theme` renamed to `theme`** in `site.json`. It still drives
|
|
68
|
+
`data-bs-theme` on the `<html>` tag; the shorter name keeps the config readable
|
|
69
|
+
and independent from the framework naming.
|
|
70
|
+
- **`theme_color` is now a single value** instead of a `light`/`dark` pair. The
|
|
71
|
+
theme is fixed per build, so two per-scheme colors could contradict the
|
|
72
|
+
rendered page.
|
|
73
|
+
- **Favicon paths are hardcoded in `base.njk`.** The `favicon` key was removed
|
|
74
|
+
from `site.json`: it only ever covered one of the three tags, which was more
|
|
75
|
+
confusing than helpful. Replace the files in `assets/brand/` instead.
|
|
76
|
+
- `_routes/` renamed to `routes/` — it holds entry points, not internals.
|
|
77
|
+
|
|
78
|
+
### Removed
|
|
79
|
+
- **`mdFile` shortcode** and the `markdown-it` dependency.
|
|
80
|
+
- **`github-markdown-css`** and its two passthrough copies.
|
|
81
|
+
|
|
82
|
+
### Migration
|
|
83
|
+
- In `site.json`: rename `data_bs_theme` to `theme`, flatten `theme_color` to a
|
|
84
|
+
single string, drop `favicon`.
|
|
85
|
+
- Place `favicon.svg`, `favicon-32.png` and `apple-touch-icon.png` in
|
|
86
|
+
`src/frontend/assets/brand/`.
|
|
87
|
+
- If you used `{% mdFile %}`, render the Markdown ahead of time or add
|
|
88
|
+
`markdown-it` back to your own project.
|
|
89
|
+
|
|
90
|
+
## [1.1.3] - 2026-07-22
|
|
91
|
+
|
|
92
|
+
### Changed
|
|
93
|
+
- **The update check no longer runs on every command.** Previously every
|
|
94
|
+
invocation of `nib` (and the `nbl` / `nibula` aliases) contacted the npm
|
|
95
|
+
registry before doing anything, adding up to 2.5s of latency to `nib run`,
|
|
96
|
+
`nib build`, `nib cli` and `nib clean`. The check now runs only for `nib new`
|
|
97
|
+
and `nib update`; all other commands work entirely offline.
|
|
98
|
+
- **`nib new` now completes the update automatically.** When a newer version is
|
|
99
|
+
available and you accept the prompt, Nibula installs it and immediately
|
|
100
|
+
re-runs the scaffolding with the new version, instead of asking you to type
|
|
101
|
+
`nib new <project-name>` a second time.
|
|
102
|
+
- **New projects are scaffolded at version `0.0.0`** instead of `1.0.0`, so a
|
|
103
|
+
freshly created site no longer claims a stable public release. Bump it
|
|
104
|
+
yourself as the project grows, and reach `1.0.0` when you go to production.
|
|
105
|
+
- **Framework SCSS imports are now short and readable.** The framework modules
|
|
106
|
+
in `src/frontend/scss/modules/frameworks/` used a five-level relative path
|
|
107
|
+
back to `node_modules`; they now import directly by package name, e.g.
|
|
108
|
+
`@import "bootstrap/scss/card";`. This matches what the styling docs already
|
|
109
|
+
showed, and makes commenting modules out far less error-prone.
|
|
110
|
+
- `nib help` no longer appends an "a newer version is available" line, since it
|
|
111
|
+
no longer performs the check.
|
|
112
|
+
|
|
113
|
+
### Added
|
|
114
|
+
- Internal `--skip-update-check` flag on `nib new`, set automatically when the
|
|
115
|
+
command is re-run after a self-update. It prevents a loop if the registry is
|
|
116
|
+
slow to propagate the new version.
|
|
117
|
+
- `--load-path=node_modules` on the repository's own `build:css` and `serve:css`
|
|
118
|
+
scripts, so the short framework imports resolve. Generated projects already
|
|
119
|
+
carried this flag.
|
|
120
|
+
|
|
121
|
+
### Fixed
|
|
122
|
+
- Repaired the ASCII header boxes and the commented-out example import inside
|
|
123
|
+
`_bootstrap.scss`, `_bulma.scss` and `_foundation.scss`, where an earlier
|
|
124
|
+
find-and-replace had injected the `node_modules` path into comment text and
|
|
125
|
+
broken the alignment.
|
|
126
|
+
- `src/frontend/data` is no longer copied to the output folder. It holds the
|
|
127
|
+
Eleventy global data file, which is consumed at build time to render meta
|
|
128
|
+
tags and page config — publishing it produced a dead file in `out/` and
|
|
129
|
+
exposed the full page map, including `noindex` entries. It remains a watch
|
|
130
|
+
target, so edits still trigger a rebuild.
|
|
131
|
+
|
|
132
|
+
### Notes
|
|
133
|
+
- If the updated installation can't be located after `npm install -g` (an
|
|
134
|
+
unusual `npm root -g` setup, for example), Nibula reports the problem and
|
|
135
|
+
asks you to re-run the command, rather than scaffolding silently with the
|
|
136
|
+
old templates.
|
|
137
|
+
- Existing projects are unaffected by the version change: it applies only to
|
|
138
|
+
newly created ones.
|
|
139
|
+
- Short SCSS imports rely on Sass's `--load-path`, which is passed by the npm
|
|
140
|
+
scripts. Compiling the stylesheets with a different tool (a VS Code Sass
|
|
141
|
+
extension, for instance) will need the same load path configured.
|
|
142
|
+
|
|
143
|
+
## [1.1.0] - 2026-07-21
|
|
144
|
+
|
|
145
|
+
### Added
|
|
146
|
+
- **Node.js backend** as an alternative to PHP, living side by side in
|
|
147
|
+
`src/backend/`: `_core/index.js` front controller (which is also the HTTP
|
|
148
|
+
server), `Response` and `RateLimiter` modules, a `mysql2` pool singleton
|
|
149
|
+
`Database.js`, `example.config.js`, and a `package.json` for the backend's
|
|
150
|
+
own dependencies. Same REST API as PHP: routing, `X-Api-Key` auth, CORS and
|
|
151
|
+
file-based rate limiting are identical.
|
|
152
|
+
- **Backend choice at scaffold time**: `nib new` now asks whether to use Node.js
|
|
153
|
+
or PHP, in addition to language and CSS framework.
|
|
154
|
+
- `backend/backend-node.service.example` — a ready-to-adapt **systemd** unit for
|
|
155
|
+
keeping the Node backend running on a server.
|
|
156
|
+
- `config.js` is generated from `example.config.js` at scaffold time (mirroring
|
|
157
|
+
the existing `config.php` generation).
|
|
158
|
+
- Deployment docs now cover running the Node backend with **`screen`** (quick /
|
|
159
|
+
small setups) and **systemd** (production), plus environment variables.
|
|
160
|
+
|
|
161
|
+
### Changed
|
|
162
|
+
- **Composer is now required only when the PHP backend is chosen.** If you pick
|
|
163
|
+
Node, `composer install` is skipped entirely and the backend's npm
|
|
164
|
+
dependencies (`mysql2`) are installed instead.
|
|
165
|
+
- `.htaccess`, `web.config` and `nginx.conf` now cover **both** backends. On
|
|
166
|
+
nginx, `/api` goes to Node and automatically falls back to the PHP front
|
|
167
|
+
controller when Node is unreachable. On Apache/IIS the active backend is
|
|
168
|
+
selected by configuration (documented), since per-directory configs can't
|
|
169
|
+
health-check an upstream.
|
|
170
|
+
- `.gitignore` now also ignores `src/backend/config.js`,
|
|
171
|
+
`src/backend/node_modules/` and `src/backend/cache/`.
|
|
172
|
+
- Documentation (`README.md`, `docs/Backend.md`, `docs/Deploy.md`) updated:
|
|
173
|
+
backend examples now use JavaScript/Node as the reference, with the equivalent
|
|
174
|
+
PHP shown alongside and a note that PHP behaves identically.
|
|
175
|
+
|
|
176
|
+
### Notes
|
|
177
|
+
- Both backends are always scaffolded, so you can switch later without
|
|
178
|
+
re-creating the project. The PHP front controller only serves `.php` endpoint
|
|
179
|
+
files and the Node one only `.js`, so they coexist without conflict.
|