Skip to content

Commit b0bb5b4

Browse files
committedMar 25, 2025
[#509] Updates from the Drupal integration.
1 parent 155be1f commit b0bb5b4

File tree

5 files changed

+88
-46
lines changed

5 files changed

+88
-46
lines changed
 

‎components-sdc/.storybook/main.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import dependencies from './ct-dependencies'; // eslint-disable-line import/no-unresolved
2+
import path from 'path'
3+
4+
const componentPath = path.resolve(__dirname, '../components');
25

36
const config = {
47
stories: [
@@ -36,7 +39,7 @@ const config = {
3639
name: 'sdc-js-wrapper',
3740
transform: (code, id) => {
3841
// Only process js files in the component directory that are not stories.
39-
if (id.indexOf('/components/') >= 0 && id.endsWith('.js') && !id.endsWith('stories.js') && !id.endsWith('stories.data.js')) {
42+
if (id.indexOf(componentPath) >= 0 && id.endsWith('.js') && !id.endsWith('stories.js') && !id.endsWith('stories.data.js')) {
4043
return {
4144
code: `document.addEventListener('DOMContentLoaded', () => {\n${code}\n});`,
4245
map: null

‎components-sdc/build.js

+78-35
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@ const config = {
3636
styles_layout: false,
3737
styles_variables: false,
3838
styles_stories: false,
39+
styles_theme: false,
3940
js_drupal: false,
4041
js_storybook: false,
41-
sdc: false,
42+
sdc_base: false,
43+
sdc_components: false,
4244
assets: false,
4345
constants: false,
4446
base: false,
@@ -56,13 +58,13 @@ if (['cli', 'lintex'].indexOf(flags[0]) >= 0) {
5658
config.build = buildWatchFlagCount === 0 || flags.indexOf('build') >= 0
5759
config.watch = flags.indexOf('watch') >= 0
5860
config.combine = true
59-
config.styles = true
6061
config.styles_storybook = true
6162
config.styles_editor = true
6263
config.styles_variables = true
6364
config.styles_stories = true
64-
config.js_drupal = true
65-
config.js_storybook = true
65+
config.styles_theme = true
66+
config.sdc_base = true
67+
config.sdc_components = true
6668
config.assets = true
6769
config.constants = true
6870
} else {
@@ -107,6 +109,7 @@ const STYLE_VARIABLE_FILE_OUT = `${DIR_OUT}/${STYLE_NAME}.variables.css`
107109
const STYLE_ADMIN_FILE_OUT = `${DIR_OUT}/${STYLE_NAME}.admin.css`
108110
const STYLE_LAYOUT_FILE_OUT = `${DIR_OUT}/${STYLE_NAME}.layout.css`
109111
const STYLE_STORIES_FILE_OUT = `${DIR_OUT}/${STYLE_NAME}.stories.css`
112+
const STYLE_THEME_FILE_OUT = `${DIR_OUT}/${STYLE_NAME}.theme.css`
110113

111114
const DIR_CT_ASSETS = `/themes/${DRUPAL_THEME_FOLDER}/${THEME_NAME}/dist/assets/`
112115
const DIR_SB_ASSETS = `/assets/`
@@ -129,6 +132,12 @@ const CONSTANTS_BACKGROUND_UTIL = `${COMPONENT_DIR}/00-base/background/backgroun
129132
const CONSTANTS_ICON_UTIL = `${COMPONENT_DIR}/00-base/icon/icon.utils.js`
130133
const CONSTANTS_LOGO_UTIL = `${COMPONENT_DIR}/02-molecules/logo/logo.utils.js`
131134

135+
const SPLIT_CSS_HEADER = '/**\n * This file was automatically generated. Please run `npm run dist` to update.\n */\n\n';
136+
const SPLIT_CSS_BASE_FILE = `${DIR_OUT}/${STYLE_NAME}.base.css`;
137+
const SPLIT_JS_BASE_FILE = `${DIR_OUT}/${SCRIPT_NAME}.drupal.base.js`
138+
const SPLIT_JS_BASE_STORYBOOK_FILE = `${DIR_OUT}/${SCRIPT_NAME}.base.js`
139+
const SPLIT_JS_BASE = `${COMPONENT_DIR}/00-base/**/!(*.stories|*.test|*.data|*.stories.data|*.utils).js`
140+
132141
if (config.build) {
133142
build()
134143
}
@@ -336,17 +345,34 @@ async function build() {
336345
buildStylesLayout()
337346
buildStylesVariables()
338347
buildStylesStories()
348+
buildStylesTheme()
349+
buildStylesSdcBase()
350+
await buildStylesSdcComponents()
351+
buildStylesSdcCopyBack()
339352
buildJavascript()
353+
buildJavascriptSdcBase()
340354
buildAssetsDirectory()
341355
await buildConstants()
342-
await splitCssBuild()
343356
} catch (error) {
344357
errorReporter(error);
345358
}
346359

347360
console.log(`Time taken: ${time(true)}`)
348361
}
349362

363+
function buildStylesTheme() {
364+
if (config.styles_theme) {
365+
const themecss = [
366+
VAR_CT_ASSETS_DIRECTORY,
367+
getImportsFromGlob(STYLE_THEME_FILE_IN, PATH),
368+
].join('\n')
369+
370+
const compiled = sass.compileString(themecss, { loadPaths: [COMPONENT_DIR, PATH] })
371+
fs.writeFileSync(STYLE_THEME_FILE_OUT, sortCssLines(compiled.css), 'utf-8')
372+
successReporter(`Saved: Component styles (theme) ${time()}`)
373+
}
374+
}
375+
350376
function watch() {
351377
console.log(`Watching: ${path.relative(PATH, DIR_COMPONENTS_IN)}/`)
352378
const supportedExtensions = ['scss', 'js', 'twig']
@@ -385,35 +411,33 @@ function lintExclusions() {
385411
})
386412
}
387413

388-
async function splitCssBuild() {
389-
if (config.sdc) {
390-
// ------------------------------------------------------------------------- SPLIT CSS
391-
// Output back into components directory.
392-
const SPLIT_CSS_HEADER = '/**\n * This file was automatically generated. Please run `npm run dist` to update.\n */\n\n';
393-
394-
// Generate the base.css file.
414+
function buildStylesSdcBase() {
415+
if (config.sdc_base) {
395416
const baseCss = [
396417
VAR_CT_ASSETS_DIRECTORY,
397418
`@import '00-base/variables';`,
398-
getImportsFromGlob(`00-base/**/!(*.stories|variables|_variables.*).scss`, DIR_COMPONENTS_IN),
419+
getImportsFromGlob(`00-base/**/!(*.stories|variables|_variables.*).scss`, COMPONENT_DIR),
399420
].join('\n');
400-
const baseResult = sass.compileString(baseCss, { loadPaths: [DIR_COMPONENTS_IN] });
401-
const compiledImportAtTop = sortCssLines(baseResult.css)
402-
fs.writeFileSync(`${DIR_OUT}/civictheme.base.css`, SPLIT_CSS_HEADER + compiledImportAtTop);
403-
successReporter(`Saved: Split styles (base) ${time()}`)
421+
const compiled = sass.compileString(baseCss, { loadPaths: [COMPONENT_DIR] });
422+
fs.writeFileSync(SPLIT_CSS_BASE_FILE, SPLIT_CSS_HEADER + sortCssLines(compiled.css));
423+
successReporter(`Saved: SDC styles (base) ${time()}`)
424+
}
425+
}
404426

405-
// Generate the individual component css files.
427+
async function buildStylesSdcComponents() {
428+
if (config.sdc_components) {
429+
// TODO - we need to also output the style to the components out folder.
406430
const fileList = [
407-
...globSync(`01-atoms/**/*.scss`, { cwd: DIR_COMPONENTS_IN }),
408-
...globSync(`02-molecules/**/*.scss`, { cwd: DIR_COMPONENTS_IN }),
409-
...globSync(`03-organisms/**/*.scss`, { cwd: DIR_COMPONENTS_IN }),
410-
...globSync(`04-templates/**/*.scss`, { cwd: DIR_COMPONENTS_IN })
431+
...globSync(`01-atoms/**/*.scss`, { cwd: COMPONENT_DIR }),
432+
...globSync(`02-molecules/**/*.scss`, { cwd: COMPONENT_DIR }),
433+
...globSync(`03-organisms/**/*.scss`, { cwd: COMPONENT_DIR }),
434+
...globSync(`04-templates/**/*.scss`, { cwd: COMPONENT_DIR })
411435
];
412436

413437
const componentDependencies = [
414438
VAR_CT_ASSETS_DIRECTORY,
415439
`@import '00-base/variables';`,
416-
getImportsFromGlob(`00-base/mixins/**/*.scss`, DIR_COMPONENTS_IN)
440+
getImportsFromGlob(`00-base/mixins/**/*.scss`, COMPONENT_DIR)
417441
].join('\n')
418442

419443
await Promise.all(fileList.map(async filePath => {
@@ -425,42 +449,61 @@ async function splitCssBuild() {
425449
const styleData = `${componentDependencies}\n@import '${filePath}';`;
426450

427451
// Compile SCSS asynchronously.
428-
const result = await sass.compileStringAsync(styleData, { loadPaths: [DIR_COMPONENTS_IN] });
452+
const result = await sass.compileStringAsync(styleData, { loadPaths: [COMPONENT_DIR] });
429453

430454
// Write to directory.
431-
fs.writeFileSync(`${DIR_COMPONENTS_IN}/${styleDir}/${styleName}.css`, SPLIT_CSS_HEADER + result.css);
455+
fs.writeFileSync(`${COMPONENT_DIR}/${styleDir}/${styleName}.css`, SPLIT_CSS_HEADER + result.css);
432456
}));
433-
successReporter(`Saved: Split styles (components) ${time()}`)
457+
successReporter(`Saved: SDC styles (components) ${time()}`)
458+
}
459+
}
460+
461+
function buildStylesSdcCopyBack() {
462+
if (config.sdc_components && !config.base) {
463+
// Copy back the css files to the components directory.
464+
const originFileList = [
465+
...globSync(`01-atoms/**/*.scss`, { cwd: DIR_COMPONENTS_IN }),
466+
...globSync(`02-molecules/**/*.scss`, { cwd: DIR_COMPONENTS_IN }),
467+
...globSync(`03-organisms/**/*.scss`, { cwd: DIR_COMPONENTS_IN }),
468+
...globSync(`04-templates/**/*.scss`, { cwd: DIR_COMPONENTS_IN })
469+
].map(i => {
470+
const cssFileName = `${i.substring(0, i.lastIndexOf('.'))}.css`
471+
return {
472+
from: `${COMPONENT_DIR}/${cssFileName}`,
473+
to: `${DIR_COMPONENTS_IN}/${cssFileName}`
474+
}
475+
}).forEach(file => fs.copyFileSync(file.from, file.to))
476+
}
477+
successReporter(`Saved: Copied SDC files to components ${time()}`)
478+
}
434479

435-
// ------------------------------------------------------------------------- SPLIT JS
436-
// Create Base JS
437-
// Load libraries and assets
480+
function buildJavascriptSdcBase() {
481+
if (config.sdc_base) {
438482
const libJs = [
439483
...JS_LIB_IMPORTS,
440484
...globSync(JS_ASSET_IMPORTS)
441485
].map(filename => stripJS(fs.readFileSync(filename, 'utf-8'))).join('\n')
442486

443487
// Load base components after DOM is ready
444-
const SPLIT_JS_BASE = `${DIR_COMPONENTS_IN}/00-base/**/!(*.stories|*.test|*.data|*.stories.data|*.utils).js`
445488
const baseComponentJs = globSync(SPLIT_JS_BASE).map(filename => stripJS(fs.readFileSync(filename, 'utf-8'))).join('\n')
446489

447490
// Write drupal js base
448491
const newDrupalBaseJs = [
449492
JS_LINT_EXCLUSION_HEADER,
450493
libJs,
451-
`Drupal.behaviors.civictheme_base = {attach: function (context, settings) {\n${baseComponentJs}\n}};`
494+
`Drupal.behaviors.${THEME_NAME} = {attach: function (context, settings) {\n${baseComponentJs}\n}};`
452495
].join('\n')
453-
fs.writeFileSync(`${DIR_OUT}/civictheme.drupal.base.js`, newDrupalBaseJs, 'utf-8')
454-
successReporter(`Saved: Compiled split javascript base (drupal) ${time()}`)
496+
fs.writeFileSync(SPLIT_JS_BASE_FILE, newDrupalBaseJs, 'utf-8')
497+
successReporter(`Saved: SDC javascript base (drupal) ${time()}`)
455498

456499
// Write vanilla js base
457500
const newBaseJs = [
458501
JS_LINT_EXCLUSION_HEADER,
459502
libJs,
460503
`document.addEventListener('DOMContentLoaded', () => {\n${baseComponentJs}\n});`
461504
].join('\n')
462-
fs.writeFileSync(`${DIR_OUT}/civictheme.base.js`, newBaseJs, 'utf-8')
463-
successReporter(`Saved: Compiled split javascript base (storybook) ${time()}`)
505+
fs.writeFileSync(SPLIT_JS_BASE_STORYBOOK_FILE, newBaseJs, 'utf-8')
506+
successReporter(`Saved: SDC javascript base (storybook) ${time()}`)
464507
}
465508
}
466509

‎components-sdc/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"ia32"
1818
],
1919
"scripts": {
20-
"dist": "node build.js base build styles_storybook styles_variables styles_stories assets constants sdc",
20+
"dist": "node build.js base build styles_storybook styles_variables styles_stories assets constants sdc_base sdc_components",
2121
"storybook": "storybook dev -p 6006"
2222
},
2323
"devDependencies": {

‎components-sdc/vite.config.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { defineConfig } from 'vite';
2-
import { join, resolve } from 'path';
2+
import { resolve } from 'path';
33
import twig from 'vite-plugin-twig-drupal';
44

55
export default defineConfig(({ mode }) => ({
66
plugins: [
7-
// This plugin allow watching files in the ./dist folder.
87
twig({
98
namespaces: {
10-
civictheme: './components',
9+
civictheme: resolve(import.meta.dirname, './components'),
1110
},
1211
}),
12+
// This plugin allow watching files in the ./dist folder.
1313
{
1414
name: 'watch-dist',
1515
configureServer: (server) => {
@@ -18,7 +18,7 @@ export default defineConfig(({ mode }) => ({
1818
ignored: [
1919
'**/.git/**',
2020
'**/node_modules/**',
21-
'**/.logs/**'
21+
'**/.logs/**',
2222
]
2323
}
2424
}

‎vite.config.js

+1-5
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,7 @@ export default defineConfig(({ mode }) => ({
66
plugins: [
77
twig({
88
namespaces: {
9-
'base': resolve(import.meta.dirname, './components/00-base'),
10-
'atoms': resolve(import.meta.dirname, './components/01-atoms'),
11-
'molecules': resolve(import.meta.dirname, './components/02-molecules'),
12-
'organisms': resolve(import.meta.dirname, './components/03-organisms'),
13-
'templates': resolve(import.meta.dirname, './components/04-templates'),
9+
civictheme: resolve(import.meta.dirname, './components'),
1410
},
1511
}),
1612
// This plugin allow watching files in the ./dist folder.

0 commit comments

Comments
 (0)
Please sign in to comment.