Sync up master and Ember CLI branches again (#11746)

We are getting closer to parity now. These changes should not affect
master but help keep things in sync.
This commit is contained in:
Robin Ward 2021-01-18 16:12:45 -05:00 committed by GitHub
parent b547b8415d
commit 7374eeb447
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 329 additions and 10 deletions

View File

@ -147,7 +147,7 @@
{{#if model.isBanner}} {{#if model.isBanner}}
{{d-button action=(action "removeBanner") icon="thumbtack" label="topic.feature.remove_banner" class="btn-primary"}} {{d-button action=(action "removeBanner") icon="thumbtack" label="topic.feature.remove_banner" class="btn-primary"}}
{{else}} {{else}}
{{d-button action=(action "makeBanner") icon="thumbtack" label="topic.feature.make_banner" class="btn-primary"}} {{d-button action=(action "makeBanner") icon="thumbtack" label="topic.feature.make_banner" class="btn-primary make-banner"}}
{{/if}} {{/if}}
</p> </p>
</div> </div>

View File

@ -19,14 +19,16 @@
<hr> <hr>
{{#each model.extras.categories as |category|}} <div class="all-tag-lists">
{{tag-list tags=category.tags sortProperties=sortProperties categoryId=category.id}} {{#each model.extras.categories as |category|}}
{{/each}} {{tag-list tags=category.tags sortProperties=sortProperties categoryId=category.id}}
{{/each}}
{{#each model.extras.tag_groups as |tagGroup|}} {{#each model.extras.tag_groups as |tagGroup|}}
{{tag-list tags=tagGroup.tags sortProperties=sortProperties tagGroupName=tagGroup.name}} {{tag-list tags=tagGroup.tags sortProperties=sortProperties tagGroupName=tagGroup.name}}
{{/each}} {{/each}}
{{#if model}} {{#if model}}
{{tag-list tags=model sortProperties=sortProperties titleKey=otherTagsTitleKey}} {{tag-list tags=model sortProperties=sortProperties titleKey=otherTagsTitleKey}}
{{/if}} {{/if}}
</div>

View File

@ -0,0 +1,48 @@
"use strict";
const EmberApp = require("ember-cli/lib/broccoli/ember-app");
const resolve = require("path").resolve;
const mergeTrees = require("broccoli-merge-trees");
const concat = require("broccoli-concat");
const babel = require("broccoli-babel-transpiler");
const path = require("path");
const funnel = require("broccoli-funnel");
function prettyTextEngine(vendorJs, engine) {
let engineTree = babel(`../pretty-text/engines/${engine}`, {
plugins: ["@babel/plugin-transform-modules-amd"],
moduleIds: true,
getModuleId(name) {
return `pretty-text/engines/${engine}/${path.basename(name)}`;
},
});
let markdownIt = funnel(vendorJs, { files: ["markdown-it.js"] });
return concat(mergeTrees([engineTree, markdownIt]), {
outputFile: `assets/${engine}.js`,
});
}
module.exports = function (defaults) {
let discourseRoot = resolve("../../../..");
let vendorJs = discourseRoot + "/vendor/assets/javascripts/";
let app = new EmberApp(defaults, { autoRun: false });
// WARNING: We should only import scripts here if they are not in NPM.
// For example: our very specific version of bootstrap-modal.
app.import(vendorJs + "bootbox.js");
app.import(vendorJs + "bootstrap-modal.js");
app.import(vendorJs + "jquery.ui.widget.js");
app.import(vendorJs + "jquery.fileupload.js");
app.import(vendorJs + "jquery.autoellipsis-1.0.10.js");
return mergeTrees([
app.toTree(),
concat(app.options.adminTree, {
outputFile: `assets/admin.js`,
}),
prettyTextEngine(vendorJs, "discourse-markdown"),
]);
};

View File

@ -0,0 +1,59 @@
{
"name": "discourse",
"version": "0.0.0",
"private": true,
"description": "Small description for discourse-frontend goes here",
"repository": "",
"license": "MIT",
"author": "",
"directories": {
"doc": "doc",
"test": "tests"
},
"scripts": {
"build": "ember build",
"start": "ember serve",
"test": "ember test"
},
"devDependencies": {
"@ember/optional-features": "^1.1.0",
"@glimmer/component": "^1.0.0",
"@popperjs/core": "^2.4.4",
"admin": "^1.0.0",
"broccoli-asset-rev": "^3.0.0",
"discourse-common": "^1.0.0",
"discourse-hbr": "^1.0.0",
"discourse-widget-hbs": "^1.0.0",
"ember-auto-import": "^1.5.3",
"ember-buffered-proxy": "^2.0.0-beta.0",
"ember-cli": "~3.15.2",
"ember-cli-app-version": "^3.2.0",
"ember-cli-babel": "^7.13.0",
"ember-cli-dependency-checker": "^3.2.0",
"ember-cli-htmlbars": "^4.2.0",
"ember-cli-inject-live-reload": "^2.0.1",
"ember-cli-sri": "^2.1.1",
"ember-cli-uglify": "^3.0.0",
"ember-export-application-global": "^2.0.1",
"ember-load-initializers": "^2.1.1",
"ember-maybe-import-regenerator": "^0.1.6",
"ember-qunit": "^4.6.0",
"ember-source": "~3.15.0",
"loader.js": "^4.7.0",
"message-bus-client": "^3.3.0",
"mousetrap": "^1.6.5",
"mousetrap-global-bind": "^1.1.0",
"pretender": "^3.4.3",
"pretty-text": "^1.0.0",
"qunit-dom": "^0.9.2",
"select-kit": "^1.0.0",
"sinon": "^9.2.0",
"virtual-dom": "^2.1.1"
},
"engines": {
"node": "8.* || >= 10.*"
},
"ember": {
"edition": "default"
}
}

View File

@ -0,0 +1,190 @@
(function () {
// TODO: These are needed to load plugins because @ember has its own loader.
// We should find a nicer way to do this.
const EMBER_MODULES = {
"@ember/array": {
default: Ember.Array,
A: Ember.A,
isArray: Ember.isArray,
},
"@ember/array/proxy": {
default: Ember.ArrayProxy,
},
"@ember/component": {
default: Ember.Component,
},
"@ember/controller": {
default: Ember.Controller,
inject: Ember.inject.controller,
},
"@ember/debug": {
warn: Ember.warn,
},
"@ember/object": {
action: Ember._action,
default: Ember.Object,
get: Ember.get,
getProperties: Ember.getProperties,
set: Ember.set,
setProperties: Ember.setProperties,
computed: Ember.computed,
defineProperty: Ember.defineProperty,
},
"@ember/object/computed": {
alias: Ember.computed.alias,
and: Ember.computed.and,
bool: Ember.computed.bool,
collect: Ember.computed.collect,
deprecatingAlias: Ember.computed.deprecatingAlias,
empty: Ember.computed.empty,
equal: Ember.computed.equal,
filter: Ember.computed.filter,
filterBy: Ember.computed.filterBy,
gt: Ember.computed.gt,
gte: Ember.computed.gte,
intersect: Ember.computed.intersect,
lt: Ember.computed.lt,
lte: Ember.computed.lte,
map: Ember.computed.map,
mapBy: Ember.computed.mapBy,
match: Ember.computed.match,
max: Ember.computed.max,
min: Ember.computed.min,
none: Ember.computed.none,
not: Ember.computed.not,
notEmpty: Ember.computed.notEmpty,
oneWay: Ember.computed.oneWay,
or: Ember.computed.or,
readOnly: Ember.computed.readOnly,
reads: Ember.computed.reads,
setDiff: Ember.computed.setDiff,
sort: Ember.computed.sort,
sum: Ember.computed.sum,
union: Ember.computed.union,
uniq: Ember.computed.uniq,
uniqBy: Ember.computed.uniqBy,
},
"@ember/object/mixin": { default: Ember.Mixin },
"@ember/object/proxy": { default: Ember.ObjectProxy },
"@ember/object/promise-proxy-mixin": { default: Ember.PromiseProxyMixin },
"@ember/object/evented": {
default: Ember.Evented,
on: Ember.on,
},
"@ember/routing/route": { default: Ember.Route },
"@ember/routing/router": { default: Ember.Router },
"@ember/runloop": {
bind: Ember.run.bind,
cancel: Ember.run.cancel,
debounce: Ember.testing ? Ember.run : Ember.run.debounce,
later: Ember.run.later,
next: Ember.run.next,
once: Ember.run.once,
run: Ember.run,
schedule: Ember.run.schedule,
scheduleOnce: Ember.run.scheduleOnce,
throttle: Ember.run.throttle,
},
"@ember/service": {
default: Ember.Service,
inject: Ember.inject.service,
},
"@ember/template": {
htmlSafe: Ember.String.htmlSafe,
},
"@ember/utils": {
isBlank: Ember.isBlank,
isEmpty: Ember.isEmpty,
isNone: Ember.isNone,
isPresent: Ember.isPresent,
},
};
Object.keys(EMBER_MODULES).forEach((mod) => {
define(mod, () => EMBER_MODULES[mod]);
});
// TODO: Remove this and have resolver find the templates
const prefix = "discourse/templates/";
const adminPrefix = "admin/templates/";
let len = prefix.length;
Object.keys(requirejs.entries).forEach(function (key) {
if (key.indexOf(prefix) === 0) {
Ember.TEMPLATES[key.substr(len)] = require(key).default;
} else if (key.indexOf(adminPrefix) === 0) {
Ember.TEMPLATES[key] = require(key).default;
}
});
// TODO: Eliminate this global
window.virtualDom = require("virtual-dom");
let head = document.getElementsByTagName("head")[0];
function loadScript(src) {
return new Promise((resolve, reject) => {
let script = document.createElement("script");
script.onload = () => resolve();
script.src = src;
head.appendChild(script);
});
}
let isTesting = require("discourse-common/config/environment").isTesting;
let element = document.querySelector(
`meta[name="discourse/config/environment"]`
);
const config = JSON.parse(
decodeURIComponent(element.getAttribute("content"))
);
fetch("/bootstrap.json")
.then((res) => res.json())
.then((data) => {
config.bootstrap = data.bootstrap;
// We know better, we packaged this.
config.bootstrap.setup_data.markdown_it_url =
"/assets/discourse-markdown.js";
let locale = data.bootstrap.locale_script;
(data.bootstrap.stylesheets || []).forEach((s) => {
let link = document.createElement("link");
link.setAttribute("rel", "stylesheet");
link.setAttribute("type", "text/css");
link.setAttribute("href", s.href);
if (s.media) {
link.setAttribute("media", s.media);
}
if (s.target) {
link.setAttribute("data-target", s.target);
}
if (s.theme_id) {
link.setAttribute("data-theme-id", s.theme_id);
}
head.append(link);
});
let pluginJs = data.bootstrap.plugin_js;
if (isTesting()) {
// pluginJs = pluginJs.concat(data.bootstrap.plugin_test_js);
}
pluginJs.forEach((src) => {
let script = document.createElement("script");
script.setAttribute("src", src);
head.append(script);
});
loadScript(locale).then(() => {
define("I18n", ["exports"], function (exports) {
return I18n;
});
window.__widget_helpers = require("discourse-widget-hbs/helpers").default;
let extras = (data.bootstrap.extra_locales || []).map(loadScript);
return Promise.all(extras).then(() => {
const event = new CustomEvent("discourse-booted", { detail: config });
document.dispatchEvent(event);
});
});
});
})();

View File

@ -0,0 +1,20 @@
module.exports = {
test_page: "tests/index.html?hidepassed",
disable_watching: true,
launch_in_ci: ["Chrome"],
launch_in_dev: ["Chrome"],
browser_args: {
Chrome: {
ci: [
// --no-sandbox is needed when running Chrome inside a container
process.env.CI ? "--no-sandbox" : null,
"--headless",
"--disable-dev-shm-usage",
"--disable-software-rasterizer",
"--mute-audio",
"--remote-debugging-port=0",
"--window-size=1440,900",
].filter(Boolean),
},
},
};